This is what ended up working for me:
// App_Plugins/TipTapOfficePaste/umbraco-package.json
{
"$schema": "../../umbraco-package-schema.json",
"name": "TipTap Office Paste",
"version": "0.1.0",
"extensions": [
{
"type": "bundle",
"alias": "TipTap.OfficePaste.Bundle",
"name": "Office Paste Bundle",
"js": "/App_Plugins/TipTapOfficePaste/dist/manifest.js"
}
]
}
// App_Plugins/TipTapOfficePaste/client/src/manifests.ts
import type { ManifestTiptapExtension, ManifestTiptapToolbarExtensionButtonKind } from '@umbraco-cms/backoffice/tiptap';
export const manifests: Array<ManifestTiptapExtension | ManifestTiptapToolbarExtensionButtonKind> = [
{
type: 'tiptapExtension',
alias: 'My.Tiptap.Highlight',
name: 'My Highlight Tiptap Extension',
api: () => import('./highlight.tiptap-api.ts'),
meta: {
icon: 'icon-brush',
label: 'Highlight',
group: '#tiptap_extGroup_formatting',
},
},
{
type: 'tiptapToolbarExtension',
kind: 'button',
alias: 'My.Tiptap.Toolbar.Highlight',
name: 'My Highlight Tiptap Toolbar Extension',
api: () => import('./highlight.tiptap-toolbar-api.ts'),
forExtensions: ['My.Tiptap.Highlight'],
meta: {
alias: 'highlight',
icon: 'icon-brush',
label: 'Highlight',
},
},
]
// App_Plugins/TipTapOfficePaste/client/vite.config.ts
import { defineConfig } from "vite";
export default defineConfig({
build: {
lib: {
entry: {
"manifest": "src/manifests.ts",
},
formats: ["es"],
},
outDir: "../dist",
emptyOutDir: true,
sourcemap: true,
rollupOptions: {
external: [/^@umbraco/],
},
},
base: "/App_Plugins/TipTapOfficePaste/dist/",
});
// App_Plugins/TipTapOfficePaste/client/tsconfig.json
{
"compilerOptions": {
"target": "ES2022",
"experimentalDecorators": true,
"useDefineForClassFields": false,
"module": "ESNext",
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"types": ["vite/client"],
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"verbatimModuleSyntax": true,
"moduleDetection": "force",
"noEmit": true,
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"erasableSyntaxOnly": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src"],
"types": [
"@umbraco-cms/backoffice/extension-types"
]
}
// App_Plugins/TipTapOfficePaste/client/package.json
{
"name": "client",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview",
"watch": "vite build --watch"
},
"dependencies": {
"@tiptap/extension-highlight": "^3.13.0",
"lit": "^3.3.1"
},
"devDependencies": {
"@umbraco-cms/backoffice": "^17.0.2",
"typescript": "~5.9.3",
"vite": "^7.2.4"
}
}