bridgerte 0.9.7 → 0.9.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +864 -864
- package/dist/bridge.cjs.map +1 -1
- package/dist/bridge.js.map +1 -1
- package/dist/dom.cjs +1 -1
- package/dist/dom.js +2 -2
- package/dist/index-B5xR6zve.cjs +4 -0
- package/dist/index-B5xR6zve.cjs.map +1 -0
- package/dist/index-CuNKUHed.js.map +1 -1
- package/dist/index-DF8OhKI4.cjs.map +1 -1
- package/dist/index-DH5duOs3.js +346 -0
- package/dist/index-DH5duOs3.js.map +1 -0
- package/dist/{index-DyCMSFrm.js → index-DNqqQycS.js} +1740 -1658
- package/dist/index-DNqqQycS.js.map +1 -0
- package/dist/index-D_3O19qd.cjs +36 -0
- package/dist/index-D_3O19qd.cjs.map +1 -0
- package/dist/index-GaS65GL0.cjs.map +1 -1
- package/dist/index-sbZNOcCB.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +2 -2
- package/dist/native-spec.cjs.map +1 -1
- package/dist/native-spec.js.map +1 -1
- package/dist/webview.cjs +1 -1
- package/dist/webview.js +1 -1
- package/package.json +1 -1
- package/dist/index-B_g23O7q.cjs +0 -4
- package/dist/index-B_g23O7q.cjs.map +0 -1
- package/dist/index-CHsEVyX1.cjs +0 -36
- package/dist/index-CHsEVyX1.cjs.map +0 -1
- package/dist/index-DyCMSFrm.js.map +0 -1
- package/dist/index-H9C49w_w.js +0 -289
- package/dist/index-H9C49w_w.js.map +0 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";const J=require("./native-spec.cjs"),m=require("./index-B5xR6zve.cjs"),Q={toolbarGroup:`
|
|
2
|
+
<svg
|
|
3
|
+
aria-hidden="true"
|
|
4
|
+
class="lucide lucide-ellipsis"
|
|
5
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
6
|
+
width="18"
|
|
7
|
+
height="18"
|
|
8
|
+
viewBox="0 0 24 24"
|
|
9
|
+
fill="none"
|
|
10
|
+
stroke="currentColor"
|
|
11
|
+
stroke-width="2"
|
|
12
|
+
stroke-linecap="round"
|
|
13
|
+
stroke-linejoin="round"
|
|
14
|
+
>
|
|
15
|
+
<circle cx="12" cy="12" r="1" />
|
|
16
|
+
<circle cx="19" cy="12" r="1" />
|
|
17
|
+
<circle cx="5" cy="12" r="1" />
|
|
18
|
+
</svg>
|
|
19
|
+
`,chevronDown:`
|
|
20
|
+
<svg
|
|
21
|
+
aria-hidden="true"
|
|
22
|
+
class="lucide lucide-chevron-down"
|
|
23
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
24
|
+
width="12"
|
|
25
|
+
height="12"
|
|
26
|
+
viewBox="0 0 24 24"
|
|
27
|
+
fill="none"
|
|
28
|
+
stroke="currentColor"
|
|
29
|
+
stroke-width="2"
|
|
30
|
+
stroke-linecap="round"
|
|
31
|
+
stroke-linejoin="round"
|
|
32
|
+
>
|
|
33
|
+
<path d="m6 9 6 6 6-6" />
|
|
34
|
+
</svg>
|
|
35
|
+
`},ot=t=>Array.from(t.querySelectorAll(".bridgerte__toolbar-group-menu-item")).filter(o=>!o.disabled),Z=(t,o)=>{const u=ot(t)[o];u&&u.focus()},dt=(t,o,l,u,c)=>{var d,b;const r=ot(o),a=document.activeElement instanceof HTMLButtonElement?r.indexOf(document.activeElement):-1,p=w=>{var i;if(r.length===0)return;const v=((a>=0?a:0)+w+r.length)%r.length;(i=r[v])==null||i.focus()};switch(t.key){case"ArrowDown":t.preventDefault(),p(1);break;case"ArrowUp":t.preventDefault(),p(-1);break;case"Home":t.preventDefault(),(d=r[0])==null||d.focus();break;case"End":t.preventDefault(),(b=r.at(-1))==null||b.focus();break;case"Enter":case" ":document.activeElement instanceof HTMLButtonElement&&(t.preventDefault(),u(document.activeElement),c(),l.focus());break;case"Escape":t.preventDefault(),l.focus(),c();break}},_="button[data-bridgerte-toolbar-group-id]",bt="button[data-bridgerte-toolbar-item-id]",pt=[bt,".bridgerte__toolbar-group-menu-item"].join(","),mt=(t,o)=>{const l=t.map(u=>m.getMenuStateForItem(u,o));return{active:l.some(u=>u.active),disabled:l.length>0&&l.every(u=>u.disabled)}},ft=(t,o,l,u,c)=>{const r=m.getMenuStateForItem(o,l),a=document.createElement("button"),p=u[o.icon]??m.defaultMenuIcons[o.icon];a.type="button",a.className="bridgerte__toolbar-button",a.disabled=r.disabled,a.dataset.active=String(r.active),a.dataset.bridgerteToolbarItemId=o.id,a.setAttribute("aria-label",o.label),a.setAttribute("aria-pressed",String(r.active)),c&&(a.dataset.tooltip=o.label),m.appendMenuIcon(a,p,o.label),t.append(a)},gt=(t,o,l,u,c)=>{const r=document.createElement("button"),a=mt(o.items,l),p=o.icon?u[o.icon]??m.defaultMenuIcons[o.icon]:Q.toolbarGroup,d=document.createElement("span");r.type="button",r.className="bridgerte__toolbar-button bridgerte__toolbar-group-button",r.disabled=a.disabled,r.dataset.active=String(a.active),r.dataset.bridgerteToolbarGroupId=o.key,r.dataset.open="false",r.setAttribute("aria-label",o.title),r.setAttribute("aria-haspopup","menu"),r.setAttribute("aria-expanded","false"),r.setAttribute("aria-pressed",String(a.active)),c&&(r.dataset.tooltip=o.title),m.appendMenuIcon(r,p,o.title),d.className="bridgerte__toolbar-group-indicator",d.setAttribute("aria-hidden","true"),d.innerHTML=Q.chevronDown,r.append(d),t.append(r)},ht=(t,o,l,u,c)=>{t.textContent="",o.forEach(r=>{if(r.type==="separator"){const p=document.createElement("span");p.className="bridgerte__toolbar-separator",p.dataset.separatorId=r.key,p.setAttribute("aria-hidden","true"),t.append(p);return}if(r.type==="button"){ft(t,r.item,l,u,c);return}const a=document.createElement("div");a.className="bridgerte__toolbar-group",a.dataset.group=r.key,a.setAttribute("aria-label",r.title),t.append(a),gt(a,r,l,u,c)})},H=(t,o,l,u)=>{if(t.textContent="",!o){t.dataset.visible="false";return}o.items.forEach(c=>{const r=m.getMenuStateForItem(c,l),a=document.createElement("button"),p=u[c.icon]??m.defaultMenuIcons[c.icon],d=document.createElement("span");a.type="button",a.className="bridgerte__menu-item bridgerte__toolbar-group-menu-item",a.disabled=r.disabled,a.dataset.active=String(r.active),a.dataset.bridgerteToolbarItemId=c.id,a.setAttribute("role","menuitem"),a.setAttribute("aria-label",c.label),a.setAttribute("aria-pressed",String(r.active)),m.appendMenuIcon(a,p,c.label),d.className="bridgerte__toolbar-group-menu-label",d.textContent=c.label,a.append(d),t.append(a)}),t.dataset.visible="true",t.style.minWidth=`${o.button.offsetWidth}px`},N=(t,o)=>{t.querySelectorAll(_).forEach(l=>{const u=(o==null?void 0:o.groupKey)===l.dataset.bridgerteToolbarGroupId;l.dataset.open=String(u),l.setAttribute("aria-expanded",String(u))})},tt=(t,o)=>t.find(l=>l.type==="group"&&l.key===o),vt=8,Tt=6,k=8,Et=()=>{var t;return typeof window<"u"&&((t=window.matchMedia)==null?void 0:t.call(window,"(hover: hover) and (pointer: fine)").matches)===!0},S=t=>{const o=t instanceof Element?t.closest(pt):null;return o instanceof HTMLButtonElement?o:null},B=t=>{const o=t instanceof Element?t.closest(_):null;return o instanceof HTMLButtonElement?o:null};function yt(t,o){const l=o.placement??"top",u=m.resolveMenuSchemaForDom(o.menuSchema??J.defaultMenuSchema,{menuLabels:o.menuLabels,payloadPanelConfig:o.payloadPanelConfig}),c=J.resolveToolbarMenu(o.toolbarConfig,u),r=c.flatMap(e=>e.type==="button"?[e.item]:e.type==="group"?e.items:[]),a=o.icons??{},p=Et(),d=document.createElement("div"),b=document.createElement("div"),w=t.closest(".bridgerte")??t;let T=!1,v=o.editor.getCommandStates(),i=null,f=null,E=null,g=null,C=null,y=null;const nt=m.bindTouchPressedState(t,{targetSelector:["button[data-bridgerte-toolbar-item-id]","button[data-bridgerte-toolbar-group-id]"].join(",")}),rt=m.bindTouchPressedState(b,{targetSelector:".bridgerte__toolbar-group-menu-item"}),X=()=>{w.append(d),w.append(b)},M=()=>{f==null||f.setOpen(!1),f==null||f.destroy(),f=null},Y=()=>{i&&(M(),f=m.createFloatingLayer(i.button,b,{placement:l==="bottom"?"top-start":"bottom-start",offset:Tt,strategy:"fixed"}),f.setOpen(!0))},h=()=>{M(),i=null,H(b,i,v,a),N(t,i)},K=e=>{if(!T&&(v=e,i&&M(),ht(t,c,e,a,p),X(),i)){const n=Array.from(t.querySelectorAll(_)).find(D=>D.dataset.bridgerteToolbarGroupId===(i==null?void 0:i.groupKey)),s=tt(c,i.groupKey);i=n&&s?{groupKey:i.groupKey,button:n,items:s.items}:null,H(b,i,v,a),N(t,i),i&&Y()}},at=()=>{T||K(o.editor.getCommandStates())},L=()=>{d.dataset.visible="false",d.textContent=""},st=e=>{const n=e.dataset.tooltip;if(!p||!n)return;const s=e.getBoundingClientRect();d.textContent=n,d.dataset.visible="true",d.style.left=`${s.left+s.width/2}px`,d.style.top=`${s.top-vt}px`},R=e=>{const n=S(e.target);n&&st(n)},F=e=>{const n=e.relatedTarget,s=S(e.target);s&&n instanceof Node&&s.contains(n)||L()},G=e=>{if(!(e instanceof HTMLButtonElement)||e.disabled)return;const n=r.find(s=>s.id===e.dataset.bridgerteToolbarItemId);if(n){if(n.payloadPanel){const s=e.getBoundingClientRect();o.editor.requestPayloadPanel({menuId:n.id,command:n.command,panel:n.payloadPanel,currentValues:m.getPayloadPanelCurrentValues(n,o.editor.getCommandStates()),anchorRect:{x:s.left,y:s.top,width:s.width,height:s.height}});return}o.editor.executeCommand(n.command)}},lt=e=>{window.setTimeout(()=>{y===e&&(y=null)},0)},A=(e,n=!1)=>{const s=tt(c,e.dataset.bridgerteToolbarGroupId);if(!(!s||e.disabled)){if((i==null?void 0:i.groupKey)===s.key){if(n){Z(b,0);return}h();return}i={groupKey:s.key,button:e,items:s.items},L(),H(b,i,v,a),N(t,i),Y(),n&&Z(b,0)}},x=e=>{const n=B(e.target);if(n){if(e.preventDefault(),e.stopPropagation(),C===n){C=null;return}A(n);return}const s=S(e.target);if(s){if(e.preventDefault(),e.stopPropagation(),y===s.dataset.bridgerteToolbarItemId){y=null;return}G(s),h()}},I=e=>{B(e.target)&&e.preventDefault()},q=e=>{if(I(e),e.pointerType!=="touch"||e.button!==0)return;const n=S(e.target),s=n==null?void 0:n.dataset.bridgerteToolbarItemId;!n||!s||n.disabled||(g={button:n,itemId:s,startX:e.clientX,startY:e.clientY})},P=()=>{g=null},O=e=>{if(!g||e.pointerType!=="touch")return;const n=Math.abs(e.clientX-g.startX),s=Math.abs(e.clientY-g.startY);(n>k||s>k)&&P()},j=e=>{if(!g||e.pointerType!=="touch")return;const n=g;g=null,G(n.button),h(),y=n.itemId,lt(n.itemId)},U=e=>{const n=B(e.target),s=e.touches[0];!n||!s||(e.preventDefault(),E={button:n,startX:s.clientX,startY:s.clientY})},$=()=>{E=null},V=e=>{if(!E)return;const n=E,s=e.changedTouches[0],D=e.target instanceof Element?e.target.closest(_):null;if(E=null,!s||D!==n.button)return;const ut=Math.abs(s.clientX-n.startX),ct=Math.abs(s.clientY-n.startY);ut>k||ct>k||(e.preventDefault(),e.stopPropagation(),C=n.button,A(n.button))},W=e=>{const n=e.target;n instanceof Node&&(t.contains(n)||b.contains(n))||h()},z=e=>{if(i&&b.contains(document.activeElement)){dt(e,b,i.button,G,h);return}const n=B(e.target);if(n&&(e.key==="Enter"||e.key===" "||e.key==="ArrowDown")){e.preventDefault(),e.stopPropagation(),A(n,!0);return}e.key==="Escape"&&h()};t.classList.add("bridgerte__toolbar"),d.className="bridgerte__toolbar-tooltip",d.dataset.visible="false",b.className="bridgerte__floating-menu bridgerte__toolbar-group-menu",b.dataset.visible="false",b.setAttribute("role","menu"),t.dataset.placement=l,t.setAttribute("role","toolbar"),t.setAttribute("aria-label",l==="bottom"?"BridgeRTE tabbar":"BridgeRTE toolbar"),t.addEventListener("pointerdown",q),t.addEventListener("mousedown",I),document.addEventListener("pointermove",O),document.addEventListener("pointerup",j),document.addEventListener("pointercancel",P),t.addEventListener("touchstart",U,{passive:!1}),t.addEventListener("touchend",V),t.addEventListener("touchcancel",$),t.addEventListener("click",x),b.addEventListener("click",x),document.addEventListener("click",W),document.addEventListener("keydown",z),p&&(t.addEventListener("mouseover",R),t.addEventListener("mouseout",F)),t.addEventListener("focusout",L),X();const it=o.editor.subscribeCommandStateChange(K);return{update:at,destroy(){T||(T=!0,it(),h(),t.removeEventListener("pointerdown",q),t.removeEventListener("mousedown",I),document.removeEventListener("pointermove",O),document.removeEventListener("pointerup",j),document.removeEventListener("pointercancel",P),t.removeEventListener("touchstart",U),t.removeEventListener("touchend",V),t.removeEventListener("touchcancel",$),t.removeEventListener("click",x),b.removeEventListener("click",x),document.removeEventListener("click",W),document.removeEventListener("keydown",z),p&&(t.removeEventListener("mouseover",R),t.removeEventListener("mouseout",F)),nt(),rt(),t.removeEventListener("focusout",L),d.remove(),b.remove(),t.classList.remove("bridgerte__toolbar"),delete t.dataset.placement,t.textContent="",t.removeAttribute("role"),t.removeAttribute("aria-label"))}}}const wt=/[\u200B-\u200D\uFEFF]/g,Lt=["img","video","audio","iframe","table","pre","code","hr","figure","canvas","svg","math",'[data-type="mention"]'].join(","),et=t=>(t==null?void 0:t.replace(wt,"").trim())??"",xt=t=>{if(!et(t))return!1;const o=document.createElement("template");return o.innerHTML=t,!!(et(o.content.textContent)||o.content.querySelector(Lt))};exports.createRichTextToolbar=yt;exports.hasMeaningfulHtmlContent=xt;
|
|
36
|
+
//# sourceMappingURL=index-D_3O19qd.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-D_3O19qd.cjs","sources":["../../dom/src/menuIcon/uiIcons.ts","../../dom/src/richTextToolbar/groupMenuKeyboard.ts","../../dom/src/richTextToolbar/render.ts","../../dom/src/richTextToolbar/index.ts","../../dom/src/htmlContent/index.ts"],"sourcesContent":["/**\n * DOM UI chrome icon 表。\n *\n * 这里放 toolbar 收纳入口、下拉箭头这类控件自身图标。它们不属于 `MenuItem.icon`\n * 跨端 schema,也不应该进入 `defaultMenuIcons` 的 schema 对齐检查。\n */\nexport const defaultMenuUiIcons = {\n toolbarGroup: `\n <svg\n aria-hidden=\"true\"\n class=\"lucide lucide-ellipsis\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n </svg>\n `,\n chevronDown: `\n <svg\n aria-hidden=\"true\"\n class=\"lucide lucide-chevron-down\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n `\n} as const;\n","export const getEnabledGroupMenuButtons = (menuElement: HTMLElement) => (\n Array.from(\n menuElement.querySelectorAll<HTMLButtonElement>('.bridgerte__toolbar-group-menu-item')\n ).filter((button) => !button.disabled)\n);\n\nexport const focusToolbarGroupMenuItem = (menuElement: HTMLElement, index: number) => {\n const buttons = getEnabledGroupMenuButtons(menuElement);\n const nextButton = buttons[index];\n\n if (nextButton) nextButton.focus();\n};\n\nexport const handleToolbarGroupMenuKeyDown = (\n event: KeyboardEvent,\n menuElement: HTMLElement,\n returnButton: HTMLButtonElement,\n executeToolbarButton: (button: HTMLButtonElement) => void,\n closeGroupMenu: () => void\n) => {\n const buttons = getEnabledGroupMenuButtons(menuElement);\n const activeIndex = document.activeElement instanceof HTMLButtonElement\n ? buttons.indexOf(document.activeElement)\n : -1;\n const focusByOffset = (offset: number) => {\n if (buttons.length === 0) return;\n\n const baseIndex = activeIndex >= 0 ? activeIndex : 0;\n const nextIndex = (baseIndex + offset + buttons.length) % buttons.length;\n\n buttons[nextIndex]?.focus();\n };\n\n /*\n * ARIA menu 语义要求支持 roving focus。这里不改 toolbar 的横向键盘模型,\n * 只在已打开的纵向收纳菜单内处理上下方向、首尾跳转和执行/关闭。\n */\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n focusByOffset(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n focusByOffset(-1);\n break;\n case 'Home':\n event.preventDefault();\n buttons[0]?.focus();\n break;\n case 'End':\n event.preventDefault();\n buttons.at(-1)?.focus();\n break;\n case 'Enter':\n case ' ':\n if (document.activeElement instanceof HTMLButtonElement) {\n event.preventDefault();\n executeToolbarButton(document.activeElement);\n closeGroupMenu();\n returnButton.focus();\n }\n break;\n case 'Escape':\n event.preventDefault();\n returnButton.focus();\n closeGroupMenu();\n break;\n default:\n break;\n }\n};\n","import type { CommandState } from '@bridgerte/core';\nimport type { MenuItem, ResolvedToolbarItem } from '@bridgerte/native-spec';\nimport {\n appendMenuIcon,\n defaultMenuIcons,\n defaultMenuUiIcons\n} from './icons';\nimport { getMenuStateForItem } from '../menuRuntime';\nimport type {\n RichTextToolbarIcons,\n ToolbarGroupMenuState\n} from './type';\n\nexport const toolbarGroupButtonSelector = 'button[data-bridgerte-toolbar-group-id]';\nexport const toolbarButtonSelector = 'button[data-bridgerte-toolbar-item-id]';\n// 可执行按钮同时覆盖 toolbar 主按钮和 group menu 子项,避免浮层子菜单绕过统一命令入口。\nexport const toolbarExecutableButtonSelector = [\n toolbarButtonSelector,\n '.bridgerte__toolbar-group-menu-item'\n].join(',');\n\nconst getGroupMenuState = (items: MenuItem[], commandStates: CommandState[]) => {\n const itemStates = items.map((item) => getMenuStateForItem(item, commandStates));\n\n return {\n active: itemStates.some((state) => state.active),\n disabled: itemStates.length > 0 && itemStates.every((state) => state.disabled)\n };\n};\n\nconst renderToolbarButton = (\n groupElement: HTMLElement,\n item: MenuItem,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n const state = getMenuStateForItem(item, commandStates);\n const button = document.createElement('button');\n // icon 兜底顺序固定为:业务覆盖 > DOM 默认 SVG > label 文本。\n const iconSvg = icons[item.icon] ?? defaultMenuIcons[item.icon];\n\n button.type = 'button';\n button.className = 'bridgerte__toolbar-button';\n button.disabled = state.disabled;\n button.dataset.active = String(state.active);\n button.dataset.bridgerteToolbarItemId = item.id;\n button.setAttribute('aria-label', item.label);\n button.setAttribute('aria-pressed', String(state.active));\n if (enableTooltip) button.dataset.tooltip = item.label;\n\n appendMenuIcon(button, iconSvg, item.label);\n\n groupElement.append(button);\n};\n\nconst renderToolbarGroupButton = (\n groupElement: HTMLElement,\n toolbarItem: Extract<ResolvedToolbarItem, { type: 'group' }>,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n const button = document.createElement('button');\n const groupState = getGroupMenuState(toolbarItem.items, commandStates);\n const iconSvg = toolbarItem.icon\n ? icons[toolbarItem.icon] ?? defaultMenuIcons[toolbarItem.icon]\n : defaultMenuUiIcons.toolbarGroup;\n const indicator = document.createElement('span');\n\n button.type = 'button';\n button.className = 'bridgerte__toolbar-button bridgerte__toolbar-group-button';\n button.disabled = groupState.disabled;\n button.dataset.active = String(groupState.active);\n button.dataset.bridgerteToolbarGroupId = toolbarItem.key;\n button.dataset.open = 'false';\n button.setAttribute('aria-label', toolbarItem.title);\n button.setAttribute('aria-haspopup', 'menu');\n button.setAttribute('aria-expanded', 'false');\n button.setAttribute('aria-pressed', String(groupState.active));\n if (enableTooltip) button.dataset.tooltip = toolbarItem.title;\n\n appendMenuIcon(button, iconSvg, toolbarItem.title);\n\n indicator.className = 'bridgerte__toolbar-group-indicator';\n indicator.setAttribute('aria-hidden', 'true');\n indicator.innerHTML = defaultMenuUiIcons.chevronDown;\n button.append(indicator);\n groupElement.append(button);\n};\n\n/**\n * 渲染 toolbar 横向主入口。\n *\n * 字符串菜单直接渲染为按钮,`|` 渲染分割线。\n * 只有用户显式声明的 group 配置才生成收纳入口,避免 schema 隐式改变 DOM 结构。\n */\nexport const renderToolbar = (\n toolbarElement: HTMLElement,\n toolbarItems: ResolvedToolbarItem[],\n commandStates: CommandState[],\n icons: RichTextToolbarIcons,\n enableTooltip: boolean\n) => {\n toolbarElement.textContent = '';\n\n toolbarItems.forEach((toolbarItem) => {\n if (toolbarItem.type === 'separator') {\n const separatorElement = document.createElement('span');\n\n separatorElement.className = 'bridgerte__toolbar-separator';\n separatorElement.dataset.separatorId = toolbarItem.key;\n separatorElement.setAttribute('aria-hidden', 'true');\n toolbarElement.append(separatorElement);\n return;\n }\n\n if (toolbarItem.type === 'button') {\n renderToolbarButton(\n toolbarElement,\n toolbarItem.item,\n commandStates,\n icons,\n enableTooltip\n );\n return;\n }\n\n /*\n * 收纳菜单是用户在 toolbarConfig 里显式声明的结构;普通菜单不会自动生成 DOM 包裹,\n * 显示分组完全交给用户用 group 配置或 `|` 控制。\n */\n const groupElement = document.createElement('div');\n\n groupElement.className = 'bridgerte__toolbar-group';\n groupElement.dataset.group = toolbarItem.key;\n groupElement.setAttribute('aria-label', toolbarItem.title);\n toolbarElement.append(groupElement);\n\n renderToolbarGroupButton(\n groupElement,\n toolbarItem,\n commandStates,\n icons,\n enableTooltip\n );\n });\n};\n\n/**\n * 渲染 group button 打开的纵向收纳菜单。\n *\n * 浮层只展示 MenuItem 子项并复用现有 item id,点击执行仍由 index.ts 统一走 EditorAPI。\n */\nexport const renderToolbarGroupMenu = (\n menuElement: HTMLElement,\n groupMenuState: ToolbarGroupMenuState | null,\n commandStates: CommandState[],\n icons: RichTextToolbarIcons\n) => {\n menuElement.textContent = '';\n\n if (!groupMenuState) {\n menuElement.dataset.visible = 'false';\n return;\n }\n\n groupMenuState.items.forEach((item) => {\n const state = getMenuStateForItem(item, commandStates);\n const button = document.createElement('button');\n const iconSvg = icons[item.icon] ?? defaultMenuIcons[item.icon];\n const labelElement = document.createElement('span');\n\n button.type = 'button';\n button.className = 'bridgerte__menu-item bridgerte__toolbar-group-menu-item';\n button.disabled = state.disabled;\n button.dataset.active = String(state.active);\n button.dataset.bridgerteToolbarItemId = item.id;\n button.setAttribute('role', 'menuitem');\n button.setAttribute('aria-label', item.label);\n button.setAttribute('aria-pressed', String(state.active));\n\n appendMenuIcon(button, iconSvg, item.label);\n labelElement.className = 'bridgerte__toolbar-group-menu-label';\n labelElement.textContent = item.label;\n button.append(labelElement);\n menuElement.append(button);\n });\n\n menuElement.dataset.visible = 'true';\n menuElement.style.minWidth = `${groupMenuState.button.offsetWidth}px`;\n};\n\nexport const syncToolbarGroupButtonState = (\n container: HTMLElement,\n groupMenuState: ToolbarGroupMenuState | null\n) => {\n container.querySelectorAll<HTMLButtonElement>(toolbarGroupButtonSelector).forEach((button) => {\n const open = groupMenuState?.groupKey === button.dataset.bridgerteToolbarGroupId;\n\n button.dataset.open = String(open);\n button.setAttribute('aria-expanded', String(open));\n });\n};\n\nexport const findToolbarGroupMenuItem = (\n toolbarItems: ResolvedToolbarItem[],\n groupKey: string | undefined\n) => toolbarItems.find((item): item is Extract<ResolvedToolbarItem, { type: 'group' }> => (\n item.type === 'group' && item.key === groupKey\n));\n","import type { CommandState } from '@bridgerte/core';\nimport {\n defaultMenuSchema,\n resolveToolbarMenu\n} from '@bridgerte/native-spec';\nimport { createFloatingLayer, type RichTextFloatingLayer } from '../floatingLayer';\nimport { bindTouchPressedState } from '../interactionState';\nimport {\n getPayloadPanelCurrentValues,\n resolveMenuSchemaForDom\n} from '../menuRuntime';\nimport {\n focusToolbarGroupMenuItem,\n handleToolbarGroupMenuKeyDown\n} from './groupMenuKeyboard';\nimport {\n findToolbarGroupMenuItem,\n renderToolbar,\n renderToolbarGroupMenu,\n syncToolbarGroupButtonState,\n toolbarExecutableButtonSelector,\n toolbarGroupButtonSelector\n} from './render';\nimport type {\n RichTextToolbarAPI,\n ToolbarGroupMenuState,\n RichTextToolbarOptions\n} from './type';\n\nconst toolbarTooltipOffsetPx = 8;\nconst toolbarGroupMenuOffsetPx = 6;\nconst toolbarTouchMoveTolerancePx = 8;\n\nexport type * from './type';\n\nconst canUseHoverTooltip = () => (\n typeof window !== 'undefined'\n && window.matchMedia?.('(hover: hover) and (pointer: fine)').matches === true\n);\n\nconst getToolbarButtonFromTarget = (target: EventTarget | null) => {\n /*\n * 图标覆盖常用 SVG,H5 pointer 事件可能落在 svg/path 上。\n * 这里用 Element 而不是 HTMLElement,保证触屏兜底和 click 都能向上命中真实按钮。\n */\n const button = target instanceof Element\n ? target.closest<HTMLButtonElement>(toolbarExecutableButtonSelector)\n : null;\n\n return button instanceof HTMLButtonElement ? button : null;\n};\n\nconst getToolbarGroupButtonFromTarget = (target: EventTarget | null) => {\n const button = target instanceof Element\n ? target.closest<HTMLButtonElement>(toolbarGroupButtonSelector)\n : null;\n\n return button instanceof HTMLButtonElement ? button : null;\n};\n\n/**\n * 创建独立菜单实例。\n *\n * toolbar/tabbar 只订阅 EditorAPI 状态并派发命令,不接触编辑器内部 DOM 或 Lexical 实例。\n */\nexport function createRichTextToolbar(\n container: HTMLElement,\n options: RichTextToolbarOptions\n): RichTextToolbarAPI {\n const placement = options.placement ?? 'top';\n const menuSchema = resolveMenuSchemaForDom(options.menuSchema ?? defaultMenuSchema, {\n menuLabels: options.menuLabels,\n payloadPanelConfig: options.payloadPanelConfig\n });\n const toolbarItems = resolveToolbarMenu(options.toolbarConfig, menuSchema);\n /*\n * click 事件只需要能执行命令的菜单项。分割线和 group 容器是渲染结构,\n * 先在这里摊平,后续点击时就不用理解 toolbarConfig 的展示层级。\n */\n const executableMenuItems = toolbarItems.flatMap((toolbarItem) => (\n toolbarItem.type === 'button' ? [toolbarItem.item]\n : toolbarItem.type === 'group' ? toolbarItem.items\n : []\n ));\n const icons = options.icons ?? {};\n /*\n * tooltip 只属于 PC 精细指针体验。H5 上即使没有原生 title,部分浏览器也会把 hover/mouseover\n * 模拟成首触摸状态,导致第一次点像是只唤醒提示;所以触屏端不写 tooltip 数据也不挂监听。\n */\n const enableTooltip = canUseHoverTooltip();\n const tooltipElement = document.createElement('div');\n const groupMenuElement = document.createElement('div');\n const overlayHost = container.closest('.bridgerte') ?? container;\n let destroyed = false;\n let latestCommandStates = options.editor.getCommandStates();\n let groupMenuState: ToolbarGroupMenuState | null = null;\n let groupMenuFloatingLayer: RichTextFloatingLayer | null = null;\n let pendingGroupTouch: {\n button: HTMLButtonElement;\n startX: number;\n startY: number;\n } | null = null;\n let pendingToolbarTouch: {\n button: HTMLButtonElement;\n itemId: string;\n startX: number;\n startY: number;\n } | null = null;\n let suppressNextGroupClickButton: HTMLButtonElement | null = null;\n let suppressNextToolbarClickItemId: string | null = null;\n const clearToolbarPressedState = bindTouchPressedState(container, {\n targetSelector: [\n 'button[data-bridgerte-toolbar-item-id]',\n 'button[data-bridgerte-toolbar-group-id]'\n ].join(',')\n });\n const clearGroupMenuPressedState = bindTouchPressedState(groupMenuElement, {\n targetSelector: '.bridgerte__toolbar-group-menu-item'\n });\n\n const mountToolbarOverlays = () => {\n // 独立 toolbar 可能不在 `.bridgerte` 内,渲染按钮会清空 container,需要把浮层重新挂回去。\n overlayHost.append(tooltipElement);\n overlayHost.append(groupMenuElement);\n };\n\n const closeGroupMenuFloatingLayer = () => {\n groupMenuFloatingLayer?.setOpen(false);\n groupMenuFloatingLayer?.destroy();\n groupMenuFloatingLayer = null;\n };\n\n const openGroupMenuFloatingLayer = () => {\n if (!groupMenuState) return;\n\n closeGroupMenuFloatingLayer();\n /*\n * group menu 和 hoverbar/mention/slash 一样属于轻浮层,必须走 floatingLayer。\n * 这里按 toolbar placement 给出首选方向,真正的翻转、键盘可视区和左右夹紧交给\n * createFloatingLayer 内部的 visualViewport + flip + shift + clamp 统一处理。\n */\n groupMenuFloatingLayer = createFloatingLayer(groupMenuState.button, groupMenuElement, {\n placement: placement === 'bottom' ? 'top-start' : 'bottom-start',\n offset: toolbarGroupMenuOffsetPx,\n strategy: 'fixed'\n });\n groupMenuFloatingLayer.setOpen(true);\n };\n\n const closeGroupMenu = () => {\n closeGroupMenuFloatingLayer();\n groupMenuState = null;\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n };\n\n const renderStates = (states: CommandState[]) => {\n if (destroyed) return;\n\n latestCommandStates = states;\n if (groupMenuState) closeGroupMenuFloatingLayer();\n renderToolbar(container, toolbarItems, states, icons, enableTooltip);\n mountToolbarOverlays();\n if (groupMenuState) {\n const nextButton = Array.from(\n container.querySelectorAll<HTMLButtonElement>(toolbarGroupButtonSelector)\n ).find((button) => button.dataset.bridgerteToolbarGroupId === groupMenuState?.groupKey);\n const nextGroupItem = findToolbarGroupMenuItem(toolbarItems, groupMenuState.groupKey);\n\n groupMenuState = nextButton && nextGroupItem\n ? {\n groupKey: groupMenuState.groupKey,\n button: nextButton,\n items: nextGroupItem.items\n }\n : null;\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n if (groupMenuState) openGroupMenuFloatingLayer();\n }\n };\n\n const update = () => {\n if (destroyed) return;\n\n renderStates(options.editor.getCommandStates());\n };\n\n const hideTooltip = () => {\n tooltipElement.dataset.visible = 'false';\n tooltipElement.textContent = '';\n };\n\n const showTooltip = (button: HTMLButtonElement) => {\n const tooltipText = button.dataset.tooltip;\n\n if (!enableTooltip || !tooltipText) return;\n\n const buttonRect = button.getBoundingClientRect();\n\n tooltipElement.textContent = tooltipText;\n tooltipElement.dataset.visible = 'true';\n tooltipElement.style.left = `${buttonRect.left + buttonRect.width / 2}px`;\n tooltipElement.style.top = `${buttonRect.top - toolbarTooltipOffsetPx}px`;\n };\n\n const handleTooltipTarget = (event: Event) => {\n const button = getToolbarButtonFromTarget(event.target);\n\n if (button) {\n showTooltip(button);\n }\n };\n\n const handleTooltipLeave = (event: MouseEvent) => {\n const relatedTarget = event.relatedTarget;\n const button = getToolbarButtonFromTarget(event.target);\n\n if (\n button\n && relatedTarget instanceof Node\n && button.contains(relatedTarget)\n ) return;\n\n hideTooltip();\n };\n\n const executeToolbarButton = (button: HTMLButtonElement) => {\n if (!(button instanceof HTMLButtonElement) || button.disabled) return;\n\n const menuItem = executableMenuItems.find((item) => (\n item.id === button.dataset.bridgerteToolbarItemId\n ));\n\n if (!menuItem) return;\n\n if (menuItem.payloadPanel) {\n const buttonRect = button.getBoundingClientRect();\n\n /*\n * 带 payloadPanel 的菜单不直接执行基础 command,而是发起参数请求。\n * DOM 内置面板和业务/RN/Flutter 自绘都走同一个 request,避免后续颜色、\n * 字体、链接等参数菜单各自发明一套协议。\n */\n options.editor.requestPayloadPanel({\n menuId: menuItem.id,\n command: menuItem.command,\n panel: menuItem.payloadPanel,\n currentValues: getPayloadPanelCurrentValues(menuItem, options.editor.getCommandStates()),\n anchorRect: {\n x: buttonRect.left,\n y: buttonRect.top,\n width: buttonRect.width,\n height: buttonRect.height\n }\n });\n return;\n }\n\n options.editor.executeCommand(menuItem.command);\n };\n\n const clearSuppressedToolbarClickSoon = (itemId: string) => {\n window.setTimeout(() => {\n if (suppressNextToolbarClickItemId === itemId) {\n suppressNextToolbarClickItemId = null;\n }\n }, 0);\n };\n\n const toggleGroupMenu = (button: HTMLButtonElement, shouldFocusMenu = false) => {\n const groupItem = findToolbarGroupMenuItem(\n toolbarItems,\n button.dataset.bridgerteToolbarGroupId\n );\n\n if (!groupItem || button.disabled) return;\n\n if (groupMenuState?.groupKey === groupItem.key) {\n if (shouldFocusMenu) {\n focusToolbarGroupMenuItem(groupMenuElement, 0);\n return;\n }\n closeGroupMenu();\n return;\n }\n\n groupMenuState = {\n groupKey: groupItem.key,\n button,\n items: groupItem.items\n };\n hideTooltip();\n renderToolbarGroupMenu(groupMenuElement, groupMenuState, latestCommandStates, icons);\n syncToolbarGroupButtonState(container, groupMenuState);\n openGroupMenuFloatingLayer();\n if (shouldFocusMenu) focusToolbarGroupMenuItem(groupMenuElement, 0);\n };\n\n const handleClick = (event: MouseEvent) => {\n const groupButton = getToolbarGroupButtonFromTarget(event.target);\n if (groupButton) {\n event.preventDefault();\n event.stopPropagation();\n if (suppressNextGroupClickButton === groupButton) {\n suppressNextGroupClickButton = null;\n return;\n }\n toggleGroupMenu(groupButton);\n return;\n }\n\n const button = getToolbarButtonFromTarget(event.target);\n if (!button) return;\n\n event.preventDefault();\n event.stopPropagation();\n if (suppressNextToolbarClickItemId === button.dataset.bridgerteToolbarItemId) {\n suppressNextToolbarClickItemId = null;\n return;\n }\n executeToolbarButton(button);\n closeGroupMenu();\n };\n\n const handleGroupButtonPressStart = (event: PointerEvent | MouseEvent) => {\n const groupButton = getToolbarGroupButtonFromTarget(event.target);\n\n if (!groupButton) return;\n\n /*\n * H5 软键盘会在按下 button 时因为 contenteditable blur 而关闭;\n * 这里只保护收纳/更多入口,不影响普通按钮、颜色面板或 toolbar 原生滚动。\n */\n event.preventDefault();\n };\n\n const handleToolbarPointerDown = (event: PointerEvent) => {\n handleGroupButtonPressStart(event);\n\n if (event.pointerType !== 'touch' || event.button !== 0) return;\n\n const button = getToolbarButtonFromTarget(event.target);\n const itemId = button?.dataset.bridgerteToolbarItemId;\n\n if (!button || !itemId || button.disabled) return;\n\n /*\n * 触屏端普通按钮在 pointerup 提交,解决 WebView/H5 不稳定补发 click 时菜单无响应。\n * 不 preventDefault,保留 toolbar 横向滚动和宿主手势;移动超阈值时按滚动处理。\n */\n pendingToolbarTouch = {\n button,\n itemId,\n startX: event.clientX,\n startY: event.clientY\n };\n };\n\n const clearPendingToolbarTouch = () => {\n pendingToolbarTouch = null;\n };\n\n const handleToolbarPointerMove = (event: PointerEvent) => {\n if (!pendingToolbarTouch || event.pointerType !== 'touch') return;\n\n const deltaX = Math.abs(event.clientX - pendingToolbarTouch.startX);\n const deltaY = Math.abs(event.clientY - pendingToolbarTouch.startY);\n\n if (deltaX > toolbarTouchMoveTolerancePx || deltaY > toolbarTouchMoveTolerancePx) {\n clearPendingToolbarTouch();\n }\n };\n\n const handleToolbarPointerUp = (event: PointerEvent) => {\n if (!pendingToolbarTouch || event.pointerType !== 'touch') return;\n\n const toolbarTouch = pendingToolbarTouch;\n\n pendingToolbarTouch = null;\n\n executeToolbarButton(toolbarTouch.button);\n closeGroupMenu();\n suppressNextToolbarClickItemId = toolbarTouch.itemId;\n clearSuppressedToolbarClickSoon(toolbarTouch.itemId);\n };\n\n const handleGroupButtonTouchStart = (event: TouchEvent) => {\n const groupButton = getToolbarGroupButtonFromTarget(event.target);\n const touch = event.touches[0];\n\n if (!groupButton || !touch) return;\n\n /*\n * 部分 H5/WebView 会早于 pointerdown,在 touchstart 阶段因为 button 命中导致\n * contenteditable blur。这里只兜底收纳入口,不拦普通菜单和 payloadPanel 入口。\n */\n event.preventDefault();\n pendingGroupTouch = {\n button: groupButton,\n startX: touch.clientX,\n startY: touch.clientY\n };\n };\n\n const clearPendingGroupTouch = () => {\n pendingGroupTouch = null;\n };\n\n const handleGroupButtonTouchEnd = (event: TouchEvent) => {\n if (!pendingGroupTouch) return;\n\n const groupTouch = pendingGroupTouch;\n const touch = event.changedTouches[0];\n const endTargetButton = event.target instanceof Element\n ? event.target.closest<HTMLButtonElement>(toolbarGroupButtonSelector)\n : null;\n\n pendingGroupTouch = null;\n if (!touch || endTargetButton !== groupTouch.button) return;\n\n const deltaX = Math.abs(touch.clientX - groupTouch.startX);\n const deltaY = Math.abs(touch.clientY - groupTouch.startY);\n\n if (\n deltaX > toolbarTouchMoveTolerancePx\n || deltaY > toolbarTouchMoveTolerancePx\n ) return;\n\n event.preventDefault();\n event.stopPropagation();\n suppressNextGroupClickButton = groupTouch.button;\n toggleGroupMenu(groupTouch.button);\n };\n\n const handleDocumentClick = (event: MouseEvent) => {\n const target = event.target;\n\n if (\n target instanceof Node\n && (container.contains(target) || groupMenuElement.contains(target))\n ) return;\n\n closeGroupMenu();\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (groupMenuState && groupMenuElement.contains(document.activeElement)) {\n handleToolbarGroupMenuKeyDown(\n event,\n groupMenuElement,\n groupMenuState.button,\n executeToolbarButton,\n closeGroupMenu\n );\n return;\n }\n\n const groupButton = getToolbarGroupButtonFromTarget(event.target);\n if (\n groupButton\n && (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown')\n ) {\n /*\n * 指针点击收纳菜单不能抢编辑器焦点;键盘从入口按钮打开时则进入菜单项,\n * 保留 PC 可访问性和方向键 roving focus。\n */\n event.preventDefault();\n event.stopPropagation();\n toggleGroupMenu(groupButton, true);\n return;\n }\n\n if (event.key !== 'Escape') return;\n\n closeGroupMenu();\n };\n\n container.classList.add('bridgerte__toolbar');\n tooltipElement.className = 'bridgerte__toolbar-tooltip';\n tooltipElement.dataset.visible = 'false';\n groupMenuElement.className = 'bridgerte__floating-menu bridgerte__toolbar-group-menu';\n groupMenuElement.dataset.visible = 'false';\n groupMenuElement.setAttribute('role', 'menu');\n container.dataset.placement = placement;\n container.setAttribute('role', 'toolbar');\n container.setAttribute(\n 'aria-label',\n placement === 'bottom' ? 'BridgeRTE tabbar' : 'BridgeRTE toolbar'\n );\n container.addEventListener('pointerdown', handleToolbarPointerDown);\n container.addEventListener('mousedown', handleGroupButtonPressStart);\n document.addEventListener('pointermove', handleToolbarPointerMove);\n document.addEventListener('pointerup', handleToolbarPointerUp);\n document.addEventListener('pointercancel', clearPendingToolbarTouch);\n container.addEventListener('touchstart', handleGroupButtonTouchStart, { passive: false });\n container.addEventListener('touchend', handleGroupButtonTouchEnd);\n container.addEventListener('touchcancel', clearPendingGroupTouch);\n container.addEventListener('click', handleClick);\n groupMenuElement.addEventListener('click', handleClick);\n document.addEventListener('click', handleDocumentClick);\n document.addEventListener('keydown', handleKeyDown);\n if (enableTooltip) {\n container.addEventListener('mouseover', handleTooltipTarget);\n container.addEventListener('mouseout', handleTooltipLeave);\n }\n container.addEventListener('focusout', hideTooltip);\n // 浮层挂在最近的编辑器根容器下,既能继承变量,也不会操作编辑内容 DOM。\n mountToolbarOverlays();\n\n // 独立 toolbar 只订阅 public API 状态,不依赖 DOM 编辑器内部实现。\n const unsubscribe = options.editor.subscribeCommandStateChange(renderStates);\n\n return {\n update,\n destroy() {\n if (destroyed) return;\n\n destroyed = true;\n unsubscribe();\n closeGroupMenu();\n container.removeEventListener('pointerdown', handleToolbarPointerDown);\n container.removeEventListener('mousedown', handleGroupButtonPressStart);\n document.removeEventListener('pointermove', handleToolbarPointerMove);\n document.removeEventListener('pointerup', handleToolbarPointerUp);\n document.removeEventListener('pointercancel', clearPendingToolbarTouch);\n container.removeEventListener('touchstart', handleGroupButtonTouchStart);\n container.removeEventListener('touchend', handleGroupButtonTouchEnd);\n container.removeEventListener('touchcancel', clearPendingGroupTouch);\n container.removeEventListener('click', handleClick);\n groupMenuElement.removeEventListener('click', handleClick);\n document.removeEventListener('click', handleDocumentClick);\n document.removeEventListener('keydown', handleKeyDown);\n if (enableTooltip) {\n container.removeEventListener('mouseover', handleTooltipTarget);\n container.removeEventListener('mouseout', handleTooltipLeave);\n }\n clearToolbarPressedState();\n clearGroupMenuPressedState();\n container.removeEventListener('focusout', hideTooltip);\n tooltipElement.remove();\n groupMenuElement.remove();\n container.classList.remove('bridgerte__toolbar');\n delete container.dataset.placement;\n container.textContent = '';\n container.removeAttribute('role');\n container.removeAttribute('aria-label');\n }\n };\n}\n","const invisibleTextPattern = /[\\u200B-\\u200D\\uFEFF]/g;\n\n/*\n * HTML 片段里这些元素没有 textContent 也应算有效内容。\n * 纯排版容器不放进来,避免 `<p><br></p>`、空列表项这类编辑器占位被误判为非空。\n */\nconst meaningfulHtmlContentSelector = [\n 'img',\n 'video',\n 'audio',\n 'iframe',\n 'table',\n 'pre',\n 'code',\n 'hr',\n 'figure',\n 'canvas',\n 'svg',\n 'math',\n '[data-type=\"mention\"]'\n].join(',');\n\nconst normalizeHtmlText = (text: string | null | undefined): string => (\n text?.replace(invisibleTextPattern, '').trim() ?? ''\n);\n\n/**\n * 判断一段 HTML 片段是否包含可保存的富文本内容。\n *\n * 这个工具会使用浏览器 template 解析 HTML,适合只拿到 HTML 字符串的业务表单;如果已经持有\n * `EditorContent`,优先使用 core 的 `isEditorContentEmpty()`,避免额外 DOM parse。\n */\nexport const hasMeaningfulHtmlContent = (html: string): boolean => {\n if (!normalizeHtmlText(html)) return false;\n\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n return Boolean(\n normalizeHtmlText(template.content.textContent)\n || template.content.querySelector(meaningfulHtmlContentSelector)\n );\n};\n"],"names":["defaultMenuUiIcons","getEnabledGroupMenuButtons","menuElement","button","focusToolbarGroupMenuItem","index","nextButton","handleToolbarGroupMenuKeyDown","event","returnButton","executeToolbarButton","closeGroupMenu","buttons","activeIndex","focusByOffset","offset","nextIndex","_a","_b","toolbarGroupButtonSelector","toolbarButtonSelector","toolbarExecutableButtonSelector","getGroupMenuState","items","commandStates","itemStates","item","getMenuStateForItem","state","renderToolbarButton","groupElement","icons","enableTooltip","iconSvg","defaultMenuIcons","appendMenuIcon","renderToolbarGroupButton","toolbarItem","groupState","indicator","renderToolbar","toolbarElement","toolbarItems","separatorElement","renderToolbarGroupMenu","groupMenuState","labelElement","syncToolbarGroupButtonState","container","open","findToolbarGroupMenuItem","groupKey","toolbarTooltipOffsetPx","toolbarGroupMenuOffsetPx","toolbarTouchMoveTolerancePx","canUseHoverTooltip","getToolbarButtonFromTarget","target","getToolbarGroupButtonFromTarget","createRichTextToolbar","options","placement","menuSchema","resolveMenuSchemaForDom","defaultMenuSchema","resolveToolbarMenu","executableMenuItems","tooltipElement","groupMenuElement","overlayHost","destroyed","latestCommandStates","groupMenuFloatingLayer","pendingGroupTouch","pendingToolbarTouch","suppressNextGroupClickButton","suppressNextToolbarClickItemId","clearToolbarPressedState","bindTouchPressedState","clearGroupMenuPressedState","mountToolbarOverlays","closeGroupMenuFloatingLayer","openGroupMenuFloatingLayer","createFloatingLayer","renderStates","states","nextGroupItem","update","hideTooltip","showTooltip","tooltipText","buttonRect","handleTooltipTarget","handleTooltipLeave","relatedTarget","menuItem","getPayloadPanelCurrentValues","clearSuppressedToolbarClickSoon","itemId","toggleGroupMenu","shouldFocusMenu","groupItem","handleClick","groupButton","handleGroupButtonPressStart","handleToolbarPointerDown","clearPendingToolbarTouch","handleToolbarPointerMove","deltaX","deltaY","handleToolbarPointerUp","toolbarTouch","handleGroupButtonTouchStart","touch","clearPendingGroupTouch","handleGroupButtonTouchEnd","groupTouch","endTargetButton","handleDocumentClick","handleKeyDown","unsubscribe","invisibleTextPattern","meaningfulHtmlContentSelector","normalizeHtmlText","text","hasMeaningfulHtmlContent","html","template"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-GaS65GL0.cjs","sources":["../../core/src/index.ts"],"sourcesContent":["export type * from './type';\nexport { isEditorContentEmpty } from './content';\nexport { resolvePayloadPanelSchema } from './payloadPanel';\n\
|
|
1
|
+
{"version":3,"file":"index-GaS65GL0.cjs","sources":["../../core/src/index.ts"],"sourcesContent":["export type * from './type';\nexport { isEditorContentEmpty } from './content';\nexport { resolvePayloadPanelSchema } from './payloadPanel';\n\n/**\n * 内容结构版本号,用于后续内容协议升级时做兼容判断。\n */\nexport const BRIDGERTE_CONTENT_VERSION = '0.1.0';\n\n/**\n * 默认表格插入能力上限。\n *\n * schema、自绘和 DOM 命令执行共用这组边界;DOM 默认面板可以用更小的首屏网格展示,\n * 但最终提交和 API 执行都不应超过这里声明的库内置上限。\n */\nexport const BRIDGERTE_TABLE_INSERT_MAX_ROWS = 20;\nexport const BRIDGERTE_TABLE_INSERT_MAX_COLS = 20;\n"],"names":["BRIDGERTE_CONTENT_VERSION"],"mappings":"aAOO,MAAMA,EAA4B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-sbZNOcCB.js","sources":["../../core/src/payloadPanel/index.ts"],"sourcesContent":["import type {\
|
|
1
|
+
{"version":3,"file":"index-sbZNOcCB.js","sources":["../../core/src/payloadPanel/index.ts"],"sourcesContent":["import type {\n PayloadPanelConfig,\n PayloadPanelField,\n PayloadPanelFieldConfig,\n PayloadPanelOption,\n PayloadPanelSchema\n} from './type';\n\nexport type * from './type';\n\nconst hasOwnConfigKeys = (config: object | undefined) => (\n config !== undefined && Object.keys(config).length > 0\n);\n\nconst resolveOptionList = (\n options: PayloadPanelOption[],\n config: PayloadPanelFieldConfig\n) => {\n const baseOptions = config.options?.length ? config.options : options;\n const optionByValue = new Map(baseOptions.map((option) => [option.value, option]));\n const includedOptions = config.includeValues?.length\n ? config.includeValues.flatMap((value) => {\n const option = optionByValue.get(value);\n\n return option ? [option] : [];\n })\n : baseOptions;\n const excludeValues = new Set(config.excludeValues ?? []);\n const filteredOptions = includedOptions.filter((option) => !excludeValues.has(option.value));\n const nextOptions = filteredOptions.map((option) => ({\n ...option,\n label: config.optionLabels?.[option.value] ?? option.label,\n value: config.optionValues?.[option.value] ?? option.value\n }));\n\n /*\n * 配置写错时不返回空候选,避免默认 DOM 面板、自绘 request 和原生菜单拿到\n * 无法操作的空列表;业务真要完全隐藏菜单应通过菜单 config 排除入口。\n */\n return nextOptions.length > 0 ? nextOptions : baseOptions;\n};\n\nconst resolveFieldBaseOverride = (\n field: PayloadPanelField,\n config: PayloadPanelFieldConfig\n) => ({\n label: config.label ?? field.label,\n defaultValue: config.defaultValue ?? field.defaultValue,\n placeholder: config.placeholder ?? field.placeholder\n});\n\nconst resolvePayloadPanelField = (\n field: PayloadPanelField,\n config: PayloadPanelFieldConfig | undefined\n): PayloadPanelField => {\n if (!config || !hasOwnConfigKeys(config)) return field;\n\n if (field.type === 'select') {\n return {\n ...field,\n ...resolveFieldBaseOverride(field, config),\n options: resolveOptionList(field.options, config)\n };\n }\n\n if (field.type === 'color') {\n return {\n ...field,\n ...resolveFieldBaseOverride(field, config),\n options: resolveOptionList(field.options ?? [], config)\n };\n }\n\n if (field.type === 'number') {\n return {\n ...field,\n ...resolveFieldBaseOverride(field, config),\n min: config.min ?? field.min,\n max: config.max ?? field.max,\n step: config.step ?? field.step\n };\n }\n\n return {\n ...field,\n ...resolveFieldBaseOverride(field, config)\n };\n};\n\n/**\n * 解析参数面板 schema。\n *\n * 这个纯函数只处理 schema 数据,不理解 DOM、Lexical 或具体命令;toolbar、hoverbar、\n * code block header 和 WebView host request 都应先走这里,保证默认 UI 和业务自绘同源。\n */\nexport const resolvePayloadPanelSchema = (\n panel: PayloadPanelSchema,\n config?: PayloadPanelConfig\n): PayloadPanelSchema => {\n const panelConfig = config?.[panel.id];\n\n if (!panelConfig || !hasOwnConfigKeys(panelConfig)) return panel;\n\n return {\n ...panel,\n title: panelConfig.title ?? panel.title,\n description: panelConfig.description ?? panel.description,\n fields: panel.fields.map((field) => resolvePayloadPanelField(\n field,\n panelConfig.fields?.[field.name]\n ))\n };\n};\n"],"names":["hasOwnConfigKeys","config","resolveOptionList","options","_a","_b","baseOptions","optionByValue","option","includedOptions","value","excludeValues","nextOptions","resolveFieldBaseOverride","field","resolvePayloadPanelField","resolvePayloadPanelSchema","panel","panelConfig"],"mappings":"AAUA,MAAMA,IAAmB,CAACC,MACxBA,MAAW,UAAa,OAAO,KAAKA,CAAM,EAAE,SAAS,GAGjDC,IAAoB,CACxBC,GACAF,MACG;AAPL,MAAAG,GAAAC;AAQE,QAAMC,KAAcF,IAAAH,EAAO,YAAP,QAAAG,EAAgB,SAASH,EAAO,UAAUE,GACxDI,IAAgB,IAAI,IAAID,EAAY,IAAI,CAACE,MAAW,CAACA,EAAO,OAAOA,CAAM,CAAC,CAAC,GAC3EC,KAAkBJ,IAAAJ,EAAO,kBAAP,QAAAI,EAAsB,SAC1CJ,EAAO,cAAc,QAAQ,CAACS,MAAU;AACxC,UAAMF,IAASD,EAAc,IAAIG,CAAK;AAEtC,WAAOF,IAAS,CAACA,CAAM,IAAI,CAAA;AAAA,EAC7B,CAAC,IACCF,GACEK,IAAgB,IAAI,IAAIV,EAAO,iBAAiB,CAAA,CAAE,GAElDW,IADkBH,EAAgB,OAAO,CAACD,MAAW,CAACG,EAAc,IAAIH,EAAO,KAAK,CAAC,EACvD,IAAI,CAACA,MAAA;AAnB3C,QAAAJ,GAAAC;AAmBuD;AAAA,MACnD,GAAGG;AAAA,MACH,SAAOJ,IAAAH,EAAO,iBAAP,gBAAAG,EAAsBI,EAAO,WAAUA,EAAO;AAAA,MACrD,SAAOH,IAAAJ,EAAO,iBAAP,gBAAAI,EAAsBG,EAAO,WAAUA,EAAO;AAAA,IAAA;AAAA,GACrD;AAMF,SAAOI,EAAY,SAAS,IAAIA,IAAcN;AAChD,GAEMO,IAA2B,CAC/BC,GACAb,OACI;AAAA,EACJ,OAAOA,EAAO,SAASa,EAAM;AAAA,EAC7B,cAAcb,EAAO,gBAAgBa,EAAM;AAAA,EAC3C,aAAab,EAAO,eAAea,EAAM;AAC3C,IAEMC,IAA2B,CAC/BD,GACAb,MAEI,CAACA,KAAU,CAACD,EAAiBC,CAAM,IAAUa,IAE7CA,EAAM,SAAS,WACV;AAAA,EACL,GAAGA;AAAA,EACH,GAAGD,EAAyBC,GAAOb,CAAM;AAAA,EACzC,SAASC,EAAkBY,EAAM,SAASb,CAAM;AAAA,IAIhDa,EAAM,SAAS,UACV;AAAA,EACL,GAAGA;AAAA,EACH,GAAGD,EAAyBC,GAAOb,CAAM;AAAA,EACzC,SAASC,EAAkBY,EAAM,WAAW,CAAA,GAAIb,CAAM;AAAA,IAItDa,EAAM,SAAS,WACV;AAAA,EACL,GAAGA;AAAA,EACH,GAAGD,EAAyBC,GAAOb,CAAM;AAAA,EACzC,KAAKA,EAAO,OAAOa,EAAM;AAAA,EACzB,KAAKb,EAAO,OAAOa,EAAM;AAAA,EACzB,MAAMb,EAAO,QAAQa,EAAM;AAAA,IAIxB;AAAA,EACL,GAAGA;AAAA,EACH,GAAGD,EAAyBC,GAAOb,CAAM;AAAA,GAUhCe,IAA4B,CACvCC,GACAhB,MACuB;AACvB,QAAMiB,IAAcjB,KAAA,gBAAAA,EAASgB,EAAM;AAEnC,SAAI,CAACC,KAAe,CAAClB,EAAiBkB,CAAW,IAAUD,IAEpD;AAAA,IACL,GAAGA;AAAA,IACH,OAAOC,EAAY,SAASD,EAAM;AAAA,IAClC,aAAaC,EAAY,eAAeD,EAAM;AAAA,IAC9C,QAAQA,EAAM,OAAO,IAAI,CAACH,MAAA;AAjG9B,UAAAV;AAiGwC,aAAAW;AAAA,QAClCD;AAAA,SACAV,IAAAc,EAAY,WAAZ,gBAAAd,EAAqBU,EAAM;AAAA,MAAI;AAAA,KAChC;AAAA,EAAA;AAEL;"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./index-GaS65GL0.cjs"),a=require("./bridge.cjs"),e=require("./native-spec.cjs"),n=require("./index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./index-GaS65GL0.cjs"),a=require("./bridge.cjs"),e=require("./native-spec.cjs"),n=require("./index-B5xR6zve.cjs"),o=require("./index-D_3O19qd.cjs"),r=require("./core.cjs"),i=require("./index-DF8OhKI4.cjs");exports.BRIDGERTE_CONTENT_VERSION=t.BRIDGERTE_CONTENT_VERSION;exports.BRIDGERTE_TABLE_INSERT_MAX_COLS=t.BRIDGERTE_TABLE_INSERT_MAX_COLS;exports.BRIDGERTE_TABLE_INSERT_MAX_ROWS=t.BRIDGERTE_TABLE_INSERT_MAX_ROWS;exports.BRIDGE_CONTENT_CHANGE_DEBOUNCE_MS=a.BRIDGE_CONTENT_CHANGE_DEBOUNCE_MS;exports.BRIDGE_HEIGHT_CHANGE_THROTTLE_MS=a.BRIDGE_HEIGHT_CHANGE_THROTTLE_MS;exports.defaultBridgeEventTiming=a.defaultBridgeEventTiming;exports.isBridgeMessage=a.isBridgeMessage;exports.codeBlockLanguagePanel=e.codeBlockLanguagePanel;exports.codeBlockLanguagePayloadPanel=e.codeBlockLanguagePayloadPanel;exports.createDisabledCommandStates=e.createDisabledCommandStates;exports.defaultMenuSchema=e.defaultMenuSchema;exports.defaultToolbarConfig=e.defaultToolbarConfig;exports.getCommandStateMatchValue=e.getCommandStateMatchValue;exports.isCommandStateForCommand=e.isCommandStateForCommand;exports.isMenuItemCommandState=e.isMenuItemCommandState;exports.resolveToolbarMenu=e.resolveToolbarMenu;exports.tableHeaderMenuItems=e.tableHeaderMenuItems;exports.createFloatingLayer=n.createFloatingLayer;exports.createRichTextEditor=n.createRichTextEditor;exports.createWebViewBridgeRuntime=n.createWebViewBridgeRuntime;exports.createRichTextToolbar=o.createRichTextToolbar;exports.hasMeaningfulHtmlContent=o.hasMeaningfulHtmlContent;exports.isEditorContentEmpty=r.isEditorContentEmpty;exports.resolvePayloadPanelSchema=i.resolvePayloadPanelSchema;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { B as t, a as o, b as r } from "./index-CuNKUHed.js";
|
|
2
2
|
import { BRIDGE_CONTENT_CHANGE_DEBOUNCE_MS as n, BRIDGE_HEIGHT_CHANGE_THROTTLE_MS as E, defaultBridgeEventTiming as l, isBridgeMessage as s } from "./bridge.js";
|
|
3
3
|
import { codeBlockLanguagePanel as d, codeBlockLanguagePayloadPanel as i, createDisabledCommandStates as _, defaultMenuSchema as c, defaultToolbarConfig as R, getCommandStateMatchValue as B, isCommandStateForCommand as C, isMenuItemCommandState as g, resolveToolbarMenu as S, tableHeaderMenuItems as f } from "./native-spec.js";
|
|
4
|
-
import { c as I, a as M, b as N } from "./index-
|
|
5
|
-
import { c as b, h as p } from "./index-
|
|
4
|
+
import { c as I, a as M, b as N } from "./index-DNqqQycS.js";
|
|
5
|
+
import { c as b, h as p } from "./index-DH5duOs3.js";
|
|
6
6
|
import { isEditorContentEmpty as h } from "./core.js";
|
|
7
7
|
import { r as H } from "./index-sbZNOcCB.js";
|
|
8
8
|
export {
|
package/dist/native-spec.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-spec.cjs","sources":["../../native-spec/src/menuSchema/payloadPanels.ts","../../native-spec/src/menuSchema/tableHeaderMenuItems.ts","../../native-spec/src/menuSchema/defaultMenuSchema.ts","../../native-spec/src/commandState/index.ts","../../native-spec/src/toolbarConfig/index.ts"],"sourcesContent":["import {\n BRIDGERTE_TABLE_INSERT_MAX_COLS,\n BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n type PayloadPanelSchema\n} from '@bridgerte/core';\n\n/**\n * 代码块语言列表给 DOM 代码块顶部控制栏和原生侧自绘使用。\n *\n * 空字符串表示纯文本;默认候选按 Shiki 高频技术文档语言维护。业务如需裁剪语言、\n * 调整顺序或接入更多 Shiki 语言,传入自己的 `codeBlockLanguagePanel` 即可。\n */\nexport const codeBlockLanguagePanel: PayloadPanelSchema = {\n id: 'code-block-language',\n title: '代码语言',\n fields: [\n {\n type: 'select',\n name: 'language',\n label: '语言',\n defaultValue: '',\n options: [\n { label: '纯文本', value: '' },\n { label: 'Bash', value: 'shellscript' },\n { label: 'C', value: 'c' },\n { label: 'C++', value: 'cpp' },\n { label: 'C#', value: 'csharp' },\n { label: 'CSS', value: 'css' },\n { label: 'Dart', value: 'dart' },\n { label: 'Dockerfile', value: 'docker' },\n { label: 'Go', value: 'go' },\n { label: 'HTML', value: 'html' },\n { label: 'Java', value: 'java' },\n { label: 'JavaScript', value: 'javascript' },\n { label: 'JSON', value: 'json' },\n { label: 'Kotlin', value: 'kotlin' },\n { label: 'Markdown', value: 'markdown' },\n { label: 'PHP', value: 'php' },\n { label: 'Python', value: 'python' },\n { label: 'Rust', value: 'rust' },\n { label: 'SQL', value: 'sql' },\n { label: 'Swift', value: 'swift' },\n { label: 'TOML', value: 'toml' },\n { label: 'TSX', value: 'tsx' },\n { label: 'TypeScript', value: 'typescript' },\n { label: 'Vue', value: 'vue' },\n { label: 'XML', value: 'xml' },\n { label: 'YAML', value: 'yaml' }\n ]\n }\n ]\n};\n\n/**\n * 兼容旧导出名。\n *\n * 代码块语言现在由代码块 header 触发,不再代表 toolbar 菜单 payload。\n */\nexport const codeBlockLanguagePayloadPanel = codeBlockLanguagePanel;\n\n/**\n * 颜色菜单使用 color 字段而不是预设色列表。\n *\n * DOM 默认面板可以渲染内置颜色控件,RN/Flutter/WebView 或业务自绘层仍读取同一份 schema。\n */\nexport const textColorPanel: PayloadPanelSchema = {\n id: 'text-color',\n title: '文字颜色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '颜色'\n }\n ]\n};\n\nexport const backgroundColorPanel: PayloadPanelSchema = {\n id: 'background-color',\n title: '背景色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '背景'\n }\n ]\n};\n\nexport const fontSizePanel: PayloadPanelSchema = {\n id: 'font-size',\n title: '字号',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字号',\n defaultValue: '16px',\n options: [\n { label: '小号 14px', value: '14px' },\n { label: '正文 16px', value: '16px' },\n { label: '强调 18px', value: '18px' },\n { label: '标题 20px', value: '20px' },\n { label: '大标题 24px', value: '24px' }\n ]\n }\n ]\n};\n\nexport const fontFamilyPanel: PayloadPanelSchema = {\n id: 'font-family',\n title: '字体',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字体',\n defaultValue: '',\n options: [\n { label: '跟随页面', value: '' },\n { label: '无衬线', value: 'sans-serif' },\n { label: '衬线', value: 'serif' },\n { label: '等宽', value: 'monospace' }\n ]\n }\n ]\n};\n\nexport const lineHeightPanel: PayloadPanelSchema = {\n id: 'line-height',\n title: '行高',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '行高',\n defaultValue: '1.7',\n options: [\n { label: '紧凑 1.4', value: '1.4' },\n { label: '常规 1.7', value: '1.7' },\n { label: '舒展 2', value: '2' }\n ]\n }\n ]\n};\n\n/**\n * 表格插入使用 number 字段收集行列。\n *\n * DOM 默认面板、H5 自绘和 RN/Flutter 原生表单都读取同一份 schema;真正的表格进阶操作\n * 仍放后续表格菜单阶段继续扩展。\n */\nexport const tableInsertPanel: PayloadPanelSchema = {\n id: 'table-insert',\n title: '插入表格',\n fields: [\n {\n type: 'number',\n name: 'rows',\n label: '行数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n step: 1\n },\n {\n type: 'number',\n name: 'cols',\n label: '列数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_COLS,\n step: 1\n }\n ]\n};\n","import type { MenuItem } from './type';\r\n\r\n/*\r\n * 表格 header 和后续表格浮动菜单共用这组操作入口。\r\n * 这些菜单默认不进入 toolbar 排列,但仍放在 native-spec,保证 DOM/RN/Flutter 自绘读取同一份\r\n * command/label/icon 协议。\r\n */\r\nexport const tableHeaderMenuItems: MenuItem[] = [\r\n {\r\n id: 'table-insert-row-after',\r\n command: { type: 'table.insertRow', direction: 'after' },\r\n label: '插入行',\r\n icon: 'rows-plus'\r\n },\r\n {\r\n id: 'table-delete-row',\r\n command: { type: 'table.deleteRow' },\r\n label: '删除行',\r\n icon: 'rows-minus'\r\n },\r\n {\r\n id: 'table-insert-column-after',\r\n command: { type: 'table.insertColumn', direction: 'after' },\r\n label: '插入列',\r\n icon: 'columns-plus'\r\n },\r\n {\r\n id: 'table-delete-column',\r\n command: { type: 'table.deleteColumn' },\r\n label: '删除列',\r\n icon: 'columns-minus'\r\n },\r\n {\r\n id: 'table-delete',\r\n command: { type: 'table.delete' },\r\n label: '删除表格',\r\n icon: 'table-delete'\r\n }\r\n];\r\n","import type { MenuItem } from './type';\r\nimport {\r\n backgroundColorPanel,\r\n fontFamilyPanel,\r\n fontSizePanel,\r\n lineHeightPanel,\r\n tableInsertPanel,\r\n textColorPanel\r\n} from './payloadPanels';\r\nimport { tableHeaderMenuItems } from './tableHeaderMenuItems';\r\n\r\n/**\r\n * 默认菜单 schema 覆盖 wangEditor 常用入口。\r\n *\r\n * RN/Flutter 基于 id、icon、label 和 command 自绘菜单;显示分组和分割线由 toolbarConfig 决定。\n */\r\nexport const defaultMenuSchema: MenuItem[] = [\r\n {\r\n id: 'bold',\r\n command: { type: 'format.bold' },\r\n label: '加粗',\r\n icon: 'bold'\r\n },\r\n {\r\n id: 'italic',\r\n command: { type: 'format.italic' },\r\n label: '斜体',\r\n icon: 'italic'\r\n },\r\n {\r\n id: 'underline',\r\n command: { type: 'format.underline' },\r\n label: '下划线',\r\n icon: 'underline'\r\n },\r\n {\r\n id: 'strike',\r\n command: { type: 'format.strike' },\r\n label: '删除线',\r\n icon: 'strikethrough'\r\n },\r\n {\r\n id: 'inline-code',\r\n command: { type: 'format.inlineCode' },\r\n label: '行内代码',\r\n icon: 'code'\r\n },\r\n {\r\n id: 'superscript',\r\n command: { type: 'format.superscript' },\r\n label: '上标',\r\n icon: 'superscript'\r\n },\r\n {\r\n id: 'subscript',\r\n command: { type: 'format.subscript' },\r\n label: '下标',\r\n icon: 'subscript'\r\n },\r\n {\r\n id: 'clear-style',\r\n command: { type: 'format.clear' },\r\n label: '清除样式',\r\n icon: 'remove-formatting'\r\n },\r\n {\r\n id: 'color',\r\n command: { type: 'format.color', value: '' },\r\n label: '文字颜色',\r\n icon: 'palette',\r\n requiresPayload: true,\r\n payloadPanel: textColorPanel\r\n },\r\n {\r\n id: 'background-color',\r\n command: { type: 'format.backgroundColor', value: '' },\r\n label: '背景色',\r\n icon: 'paint-bucket',\r\n requiresPayload: true,\r\n payloadPanel: backgroundColorPanel\r\n },\r\n {\r\n id: 'font-size',\r\n command: { type: 'format.fontSize', value: '' },\r\n label: '字号',\r\n icon: 'case-sensitive',\r\n requiresPayload: true,\r\n payloadPanel: fontSizePanel\r\n },\r\n {\r\n id: 'font-family',\r\n command: { type: 'format.fontFamily', value: '' },\r\n label: '字体',\r\n icon: 'type',\r\n requiresPayload: true,\r\n payloadPanel: fontFamilyPanel\r\n },\r\n {\r\n id: 'line-height',\r\n command: { type: 'format.lineHeight', value: '' },\r\n label: '行高',\r\n icon: 'wrap-text',\r\n requiresPayload: true,\r\n payloadPanel: lineHeightPanel\r\n },\r\n {\r\n id: 'paragraph',\r\n command: { type: 'block.paragraph' },\r\n label: '正文',\r\n icon: 'pilcrow'\r\n },\r\n {\r\n id: 'heading-1',\r\n command: { type: 'block.heading', level: 1 },\r\n label: '一级标题',\r\n icon: 'heading-1'\r\n },\r\n {\r\n id: 'heading-2',\r\n command: { type: 'block.heading', level: 2 },\r\n label: '二级标题',\r\n icon: 'heading-2'\r\n },\r\n {\r\n id: 'heading-3',\r\n command: { type: 'block.heading', level: 3 },\r\n label: '三级标题',\r\n icon: 'heading-3'\r\n },\r\n {\r\n id: 'heading-4',\r\n command: { type: 'block.heading', level: 4 },\r\n label: '四级标题',\r\n icon: 'heading-4'\r\n },\r\n {\r\n id: 'heading-5',\r\n command: { type: 'block.heading', level: 5 },\r\n label: '五级标题',\r\n icon: 'heading-5'\r\n },\r\n {\r\n id: 'heading-6',\r\n command: { type: 'block.heading', level: 6 },\r\n label: '六级标题',\r\n icon: 'heading-6'\r\n },\r\n {\r\n id: 'quote',\r\n command: { type: 'block.quote' },\r\n label: '引用',\r\n icon: 'quote'\r\n },\r\n {\r\n id: 'divider',\r\n command: { type: 'block.divider' },\r\n label: '分割线',\r\n icon: 'minus'\r\n },\r\n {\r\n id: 'code-block',\r\n command: { type: 'block.code' },\r\n label: '代码块',\r\n icon: 'square-code'\r\n },\r\n {\r\n id: 'ordered-list',\r\n command: { type: 'list.ordered' },\r\n label: '有序列表',\r\n icon: 'list-ordered'\r\n },\r\n {\r\n id: 'unordered-list',\r\n command: { type: 'list.unordered' },\r\n label: '无序列表',\r\n icon: 'list'\r\n },\r\n {\r\n id: 'todo-list',\r\n command: { type: 'list.todo' },\r\n label: '待办列表',\r\n icon: 'list-todo'\r\n },\r\n {\r\n id: 'align-left',\r\n command: { type: 'align', value: 'left' },\r\n label: '左对齐',\r\n icon: 'align-left'\r\n },\r\n {\r\n id: 'align-center',\r\n command: { type: 'align', value: 'center' },\r\n label: '居中',\r\n icon: 'align-center'\r\n },\r\n {\r\n id: 'align-right',\r\n command: { type: 'align', value: 'right' },\r\n label: '右对齐',\r\n icon: 'align-right'\r\n },\r\n {\r\n id: 'align-justify',\r\n command: { type: 'align', value: 'justify' },\r\n label: '两端对齐',\r\n icon: 'align-justify'\r\n },\r\n {\r\n id: 'indent-increase',\r\n command: { type: 'indent.increase' },\r\n label: '增加缩进',\r\n icon: 'indent-increase'\r\n },\r\n {\r\n id: 'indent-decrease',\r\n command: { type: 'indent.decrease' },\r\n label: '减少缩进',\r\n icon: 'indent-decrease'\r\n },\r\n {\r\n id: 'mention',\r\n command: { type: 'mention.insert', item: { id: '', label: '', value: '' } },\r\n label: '@ 提及',\r\n icon: 'at-sign',\r\n requiresPayload: true\r\n },\r\n {\r\n id: 'upload-image',\r\n command: { type: 'media.pickImage' },\r\n label: '上传图片',\r\n icon: 'upload-image'\r\n },\r\n {\r\n id: 'upload-video',\r\n command: { type: 'media.pickVideo' },\r\n label: '上传视频',\r\n icon: 'upload-video'\r\n },\r\n {\r\n id: 'table',\r\n command: { type: 'table.insert', rows: 3, cols: 3 },\r\n label: '表格',\r\n icon: 'table',\r\n requiresPayload: true,\r\n payloadPanel: tableInsertPanel\r\n },\r\n ...tableHeaderMenuItems,\r\n {\r\n id: 'slash-command',\r\n command: { type: 'slash.open' },\r\n label: '/ 命令',\r\n icon: 'list-plus'\r\n },\r\n {\r\n id: 'undo',\r\n command: { type: 'history.undo' },\r\n label: '撤销',\r\n icon: 'undo'\r\n },\r\n {\r\n id: 'redo',\r\n command: { type: 'history.redo' },\r\n label: '重做',\r\n icon: 'redo'\r\n },\r\n {\r\n id: 'clear',\r\n command: { type: 'content.clear' },\r\n label: '清空',\r\n icon: 'trash-2'\r\n },\r\n {\r\n id: 'fullscreen',\r\n command: { type: 'fullscreen.toggle' },\r\n label: '全屏',\r\n icon: 'maximize'\r\n }\r\n];\r\n","import type { CommandState, EditorCommand } from '@bridgerte/core';\r\nimport type { MenuItem } from '../menuSchema';\r\nimport { defaultMenuSchema } from '../menuSchema';\r\n\r\nconst commandStateValueByType: Partial<Record<EditorCommand['type'], (command: EditorCommand) => (\r\n CommandState['value'] | undefined\r\n)>> = {\r\n align: (command) => command.type === 'align' ? command.value : undefined,\r\n 'block.heading': (command) => command.type === 'block.heading' ? command.level : undefined,\r\n 'block.setCodeLanguage': (command) => (\r\n command.type === 'block.setCodeLanguage' ? command.language : undefined\r\n )\r\n};\r\n\r\n/**\r\n * 取出菜单命令用于匹配 `CommandState.value` 的稳定值。\r\n *\r\n * 同类命令存在多个菜单项时使用这个值区分,比如对齐方式和标题级别。\r\n */\r\nexport const getCommandStateMatchValue = (\r\n command: EditorCommand\r\n): CommandState['value'] | undefined => commandStateValueByType[command.type]?.(command);\r\n\r\n/**\r\n * 判断某条命令状态是否对应一个完整命令 payload。\r\n */\r\nexport const isCommandStateForCommand = (\r\n command: EditorCommand,\r\n state: CommandState\r\n): boolean => {\r\n const matchValue = getCommandStateMatchValue(command);\r\n\r\n return state.command === command.type\r\n && (matchValue === undefined || state.value === matchValue);\r\n};\r\n\r\n/**\r\n * 判断某条命令状态是否对应一个菜单项。\r\n *\r\n * 原生 toolbar 可以用它把 `CommandState[]` 映射回具体按钮 active/disabled 状态。\r\n */\r\nexport const isMenuItemCommandState = (item: MenuItem, state: CommandState): boolean => (\r\n isCommandStateForCommand(item.command, state)\r\n);\r\n\r\n/**\r\n * 为给定菜单生成默认禁用状态。\r\n *\r\n * 编辑器未 ready 或无选区时,原生 toolbar 可以先使用这组状态兜底。\r\n */\r\nexport function createDisabledCommandStates(menuSchema = defaultMenuSchema): CommandState[] {\r\n return menuSchema.map((item) => ({\r\n command: item.command.type,\r\n active: false,\r\n disabled: true,\r\n value: getCommandStateMatchValue(item.command)\r\n }));\r\n}\r\n","import type { ToolbarConfig, ToolbarGroupConfig, ToolbarKey } from '@bridgerte/core';\r\nimport type { MenuItem } from '../menuSchema';\r\nimport { defaultMenuSchema } from '../menuSchema';\r\nimport type { ResolvedToolbarItem } from './type';\r\n\r\nexport type * from './type';\r\n\r\n/**\r\n * 默认 DOM toolbar 配置。\r\n *\r\n * 这里只选择已实现或带参数面板的基础按钮;完整菜单全集仍由 `defaultMenuSchema` 维护。\r\n */\r\nexport const defaultToolbarConfig: ToolbarConfig = {\r\n toolbarKeys: [\r\n 'undo',\r\n 'redo',\r\n 'clear',\r\n '|',\r\n 'paragraph',\r\n 'heading-1',\r\n 'heading-2',\r\n 'heading-3',\r\n 'heading-4',\r\n 'heading-5',\r\n 'heading-6',\r\n 'quote',\r\n 'divider',\r\n 'code-block',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'inline-code',\r\n 'superscript',\r\n 'subscript',\r\n 'clear-style',\r\n 'color',\r\n 'background-color',\r\n 'font-size',\r\n 'font-family',\r\n 'line-height',\r\n '|',\r\n 'ordered-list',\n 'unordered-list',\n 'todo-list',\n '|',\n 'upload-image',\n 'upload-video',\n '|',\n 'table',\n '|',\n 'align-left',\r\n 'align-center',\r\n 'align-right',\r\n 'align-justify',\r\n 'indent-increase',\r\n 'indent-decrease',\r\n '|',\r\n 'fullscreen'\r\n ]\r\n};\r\n\r\nconst isToolbarGroupConfig = (key: ToolbarKey): key is ToolbarGroupConfig => (\r\n typeof key === 'object' && Array.isArray(key.menuKeys)\r\n);\r\n\r\nconst createMenuMap = (menuSchema: MenuItem[]) => new Map(\r\n menuSchema.map((item) => [item.id, item])\r\n);\r\n\r\nconst shouldExcludeToolbarKey = (\r\n key: ToolbarKey,\r\n excludeKeys: Set<string>\r\n) => {\r\n if (typeof key === 'string') return key !== '|' && excludeKeys.has(key);\r\n\r\n return excludeKeys.has(key.key) || key.menuKeys.every((menuKey) => excludeKeys.has(menuKey));\r\n};\r\n\r\nconst applyToolbarConfigOverrides = (\r\n baseKeys: ToolbarKey[],\r\n toolbarConfig?: ToolbarConfig\r\n): ToolbarKey[] => {\r\n const excludeKeys = new Set(toolbarConfig?.excludeKeys ?? []);\r\n /*\r\n * 先排除再插入,等价于“在用户最终想保留的默认菜单里加东西”。\r\n * insert index 做夹取,避免业务传入负数或超长下标时破坏默认 toolbar。\r\n */\r\n const filteredKeys = baseKeys.filter((key) => !shouldExcludeToolbarKey(key, excludeKeys));\r\n\r\n if (!toolbarConfig?.insertKeys) return filteredKeys;\r\n\r\n const insertIndex = Math.max(0, Math.min(toolbarConfig.insertKeys.index, filteredKeys.length));\r\n\r\n return [\r\n ...filteredKeys.slice(0, insertIndex),\r\n ...toolbarConfig.insertKeys.keys,\r\n ...filteredKeys.slice(insertIndex)\r\n ];\r\n};\r\n\r\nconst resolveToolbarKey = (\r\n key: ToolbarKey,\r\n menuMap: Map<string, MenuItem>,\r\n excludeKeys: Set<string>,\r\n separatorIndex: number\r\n): ResolvedToolbarItem[] => {\r\n if (key === '|') {\r\n return [{ type: 'separator', key: `separator-${separatorIndex}` }];\r\n }\r\n\r\n if (typeof key === 'string') {\r\n const item = menuMap.get(key);\r\n\r\n // 未知 key 直接忽略;需要 payload 但没有 panel 的菜单暂不渲染,避免按钮点击后无法生成合法命令。\r\n if (!item || (item.requiresPayload && !item.payloadPanel) || excludeKeys.has(item.id)) {\r\n return [];\r\n }\r\n\r\n return [{ type: 'button', item }];\r\n }\r\n\r\n if (isToolbarGroupConfig(key)) {\r\n const items = key.menuKeys\r\n .filter((menuKey) => !excludeKeys.has(menuKey))\r\n .map((menuKey) => menuMap.get(menuKey))\r\n .filter((item): item is MenuItem => (\r\n item !== undefined && (!item.requiresPayload || item.payloadPanel !== undefined)\r\n ));\r\n\r\n return items.length > 0 ? [{\r\n type: 'group',\r\n key: key.key,\r\n title: key.title,\r\n icon: key.icon,\r\n items\r\n }] : [];\r\n }\r\n\r\n return [];\r\n};\r\n\r\nconst shouldKeepResolvedToolbarItem = (\r\n item: ResolvedToolbarItem,\r\n items: ResolvedToolbarItem[]\r\n) => {\r\n if (item.type !== 'separator') return true;\r\n\r\n const previousItem = items[items.length - 1];\r\n\r\n return previousItem !== undefined && previousItem.type !== 'separator';\r\n};\r\n\r\nconst trimTrailingToolbarSeparators = (items: ResolvedToolbarItem[]) => {\r\n while (items.at(-1)?.type === 'separator') {\r\n items.pop();\r\n }\r\n\r\n return items;\r\n};\r\n\r\n/**\r\n * 把 wangEditor 风格的 JSON 配置解析成 DOM/RN/Flutter 都能消费的菜单结构。\r\n *\r\n * 未知 key 和缺少 payloadPanel 的 requiresPayload 菜单会被忽略,避免默认 toolbar 渲染无法处理的按钮。\r\n * 分割线会自动去掉开头、结尾和连续项,避免被跳过的菜单留下空分隔。\r\n */\r\nexport const resolveToolbarMenu = (\r\n toolbarConfig: ToolbarConfig = defaultToolbarConfig,\r\n menuSchema: MenuItem[] = defaultMenuSchema\r\n): ResolvedToolbarItem[] => {\r\n const menuMap = createMenuMap(menuSchema);\r\n const baseKeys = toolbarConfig.toolbarKeys ?? defaultToolbarConfig.toolbarKeys ?? [];\r\n const toolbarKeys = applyToolbarConfigOverrides(baseKeys, toolbarConfig);\r\n const excludeKeys = new Set(toolbarConfig.excludeKeys ?? []);\r\n let separatorIndex = 0;\r\n\r\n const resolvedItems = toolbarKeys.reduce<ResolvedToolbarItem[]>((items, key) => {\r\n const nextItems = resolveToolbarKey(key, menuMap, excludeKeys, separatorIndex);\r\n\r\n if (key === '|') separatorIndex += 1;\r\n\r\n nextItems.forEach((item) => {\r\n if (shouldKeepResolvedToolbarItem(item, items)) {\r\n items.push(item);\r\n }\r\n });\r\n\r\n return items;\r\n }, []);\r\n\r\n return trimTrailingToolbarSeparators(resolvedItems);\r\n};\r\n"],"names":["codeBlockLanguagePanel","codeBlockLanguagePayloadPanel","textColorPanel","backgroundColorPanel","fontSizePanel","fontFamilyPanel","lineHeightPanel","tableInsertPanel","BRIDGERTE_TABLE_INSERT_MAX_ROWS","BRIDGERTE_TABLE_INSERT_MAX_COLS","tableHeaderMenuItems","defaultMenuSchema","commandStateValueByType","command","getCommandStateMatchValue","_a","isCommandStateForCommand","state","matchValue","isMenuItemCommandState","item","createDisabledCommandStates","menuSchema","defaultToolbarConfig","isToolbarGroupConfig","key","createMenuMap","shouldExcludeToolbarKey","excludeKeys","menuKey","applyToolbarConfigOverrides","baseKeys","toolbarConfig","filteredKeys","insertIndex","resolveToolbarKey","menuMap","separatorIndex","items","shouldKeepResolvedToolbarItem","previousItem","trimTrailingToolbarSeparators","resolveToolbarMenu","toolbarKeys","resolvedItems","nextItems"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"native-spec.cjs","sources":["../../native-spec/src/menuSchema/payloadPanels.ts","../../native-spec/src/menuSchema/tableHeaderMenuItems.ts","../../native-spec/src/menuSchema/defaultMenuSchema.ts","../../native-spec/src/commandState/index.ts","../../native-spec/src/toolbarConfig/index.ts"],"sourcesContent":["import {\n BRIDGERTE_TABLE_INSERT_MAX_COLS,\n BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n type PayloadPanelSchema\n} from '@bridgerte/core';\n\n/**\n * 代码块语言列表给 DOM 代码块顶部控制栏和原生侧自绘使用。\n *\n * 空字符串表示纯文本;默认候选按 Shiki 高频技术文档语言维护。业务如需裁剪语言、\n * 调整顺序或接入更多 Shiki 语言,传入自己的 `codeBlockLanguagePanel` 即可。\n */\nexport const codeBlockLanguagePanel: PayloadPanelSchema = {\n id: 'code-block-language',\n title: '代码语言',\n fields: [\n {\n type: 'select',\n name: 'language',\n label: '语言',\n defaultValue: '',\n options: [\n { label: '纯文本', value: '' },\n { label: 'Bash', value: 'shellscript' },\n { label: 'C', value: 'c' },\n { label: 'C++', value: 'cpp' },\n { label: 'C#', value: 'csharp' },\n { label: 'CSS', value: 'css' },\n { label: 'Dart', value: 'dart' },\n { label: 'Dockerfile', value: 'docker' },\n { label: 'Go', value: 'go' },\n { label: 'HTML', value: 'html' },\n { label: 'Java', value: 'java' },\n { label: 'JavaScript', value: 'javascript' },\n { label: 'JSON', value: 'json' },\n { label: 'Kotlin', value: 'kotlin' },\n { label: 'Markdown', value: 'markdown' },\n { label: 'PHP', value: 'php' },\n { label: 'Python', value: 'python' },\n { label: 'Rust', value: 'rust' },\n { label: 'SQL', value: 'sql' },\n { label: 'Swift', value: 'swift' },\n { label: 'TOML', value: 'toml' },\n { label: 'TSX', value: 'tsx' },\n { label: 'TypeScript', value: 'typescript' },\n { label: 'Vue', value: 'vue' },\n { label: 'XML', value: 'xml' },\n { label: 'YAML', value: 'yaml' }\n ]\n }\n ]\n};\n\n/**\n * 兼容旧导出名。\n *\n * 代码块语言现在由代码块 header 触发,不再代表 toolbar 菜单 payload。\n */\nexport const codeBlockLanguagePayloadPanel = codeBlockLanguagePanel;\n\n/**\n * 颜色菜单使用 color 字段而不是预设色列表。\n *\n * DOM 默认面板可以渲染内置颜色控件,RN/Flutter/WebView 或业务自绘层仍读取同一份 schema。\n */\nexport const textColorPanel: PayloadPanelSchema = {\n id: 'text-color',\n title: '文字颜色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '颜色'\n }\n ]\n};\n\nexport const backgroundColorPanel: PayloadPanelSchema = {\n id: 'background-color',\n title: '背景色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '背景'\n }\n ]\n};\n\nexport const fontSizePanel: PayloadPanelSchema = {\n id: 'font-size',\n title: '字号',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字号',\n defaultValue: '16px',\n options: [\n { label: '小号 14px', value: '14px' },\n { label: '正文 16px', value: '16px' },\n { label: '强调 18px', value: '18px' },\n { label: '标题 20px', value: '20px' },\n { label: '大标题 24px', value: '24px' }\n ]\n }\n ]\n};\n\nexport const fontFamilyPanel: PayloadPanelSchema = {\n id: 'font-family',\n title: '字体',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字体',\n defaultValue: '',\n options: [\n { label: '跟随页面', value: '' },\n { label: '无衬线', value: 'sans-serif' },\n { label: '衬线', value: 'serif' },\n { label: '等宽', value: 'monospace' }\n ]\n }\n ]\n};\n\nexport const lineHeightPanel: PayloadPanelSchema = {\n id: 'line-height',\n title: '行高',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '行高',\n defaultValue: '1.7',\n options: [\n { label: '紧凑 1.4', value: '1.4' },\n { label: '常规 1.7', value: '1.7' },\n { label: '舒展 2', value: '2' }\n ]\n }\n ]\n};\n\n/**\n * 表格插入使用 number 字段收集行列。\n *\n * DOM 默认面板、H5 自绘和 RN/Flutter 原生表单都读取同一份 schema;真正的表格进阶操作\n * 仍放后续表格菜单阶段继续扩展。\n */\nexport const tableInsertPanel: PayloadPanelSchema = {\n id: 'table-insert',\n title: '插入表格',\n fields: [\n {\n type: 'number',\n name: 'rows',\n label: '行数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n step: 1\n },\n {\n type: 'number',\n name: 'cols',\n label: '列数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_COLS,\n step: 1\n }\n ]\n};\n","import type { MenuItem } from './type';\n\n/*\n * 表格 header 和后续表格浮动菜单共用这组操作入口。\n * 这些菜单默认不进入 toolbar 排列,但仍放在 native-spec,保证 DOM/RN/Flutter 自绘读取同一份\n * command/label/icon 协议。\n */\nexport const tableHeaderMenuItems: MenuItem[] = [\n {\n id: 'table-insert-row-after',\n command: { type: 'table.insertRow', direction: 'after' },\n label: '插入行',\n icon: 'rows-plus'\n },\n {\n id: 'table-delete-row',\n command: { type: 'table.deleteRow' },\n label: '删除行',\n icon: 'rows-minus'\n },\n {\n id: 'table-insert-column-after',\n command: { type: 'table.insertColumn', direction: 'after' },\n label: '插入列',\n icon: 'columns-plus'\n },\n {\n id: 'table-delete-column',\n command: { type: 'table.deleteColumn' },\n label: '删除列',\n icon: 'columns-minus'\n },\n {\n id: 'table-delete',\n command: { type: 'table.delete' },\n label: '删除表格',\n icon: 'table-delete'\n }\n];\n","import type { MenuItem } from './type';\nimport {\n backgroundColorPanel,\n fontFamilyPanel,\n fontSizePanel,\n lineHeightPanel,\n tableInsertPanel,\n textColorPanel\n} from './payloadPanels';\nimport { tableHeaderMenuItems } from './tableHeaderMenuItems';\n\n/**\n * 默认菜单 schema 覆盖 wangEditor 常用入口。\n *\n * RN/Flutter 基于 id、icon、label 和 command 自绘菜单;显示分组和分割线由 toolbarConfig 决定。\n */\nexport const defaultMenuSchema: MenuItem[] = [\n {\n id: 'bold',\n command: { type: 'format.bold' },\n label: '加粗',\n icon: 'bold'\n },\n {\n id: 'italic',\n command: { type: 'format.italic' },\n label: '斜体',\n icon: 'italic'\n },\n {\n id: 'underline',\n command: { type: 'format.underline' },\n label: '下划线',\n icon: 'underline'\n },\n {\n id: 'strike',\n command: { type: 'format.strike' },\n label: '删除线',\n icon: 'strikethrough'\n },\n {\n id: 'inline-code',\n command: { type: 'format.inlineCode' },\n label: '行内代码',\n icon: 'code'\n },\n {\n id: 'superscript',\n command: { type: 'format.superscript' },\n label: '上标',\n icon: 'superscript'\n },\n {\n id: 'subscript',\n command: { type: 'format.subscript' },\n label: '下标',\n icon: 'subscript'\n },\n {\n id: 'clear-style',\n command: { type: 'format.clear' },\n label: '清除样式',\n icon: 'remove-formatting'\n },\n {\n id: 'color',\n command: { type: 'format.color', value: '' },\n label: '文字颜色',\n icon: 'palette',\n requiresPayload: true,\n payloadPanel: textColorPanel\n },\n {\n id: 'background-color',\n command: { type: 'format.backgroundColor', value: '' },\n label: '背景色',\n icon: 'paint-bucket',\n requiresPayload: true,\n payloadPanel: backgroundColorPanel\n },\n {\n id: 'font-size',\n command: { type: 'format.fontSize', value: '' },\n label: '字号',\n icon: 'case-sensitive',\n requiresPayload: true,\n payloadPanel: fontSizePanel\n },\n {\n id: 'font-family',\n command: { type: 'format.fontFamily', value: '' },\n label: '字体',\n icon: 'type',\n requiresPayload: true,\n payloadPanel: fontFamilyPanel\n },\n {\n id: 'line-height',\n command: { type: 'format.lineHeight', value: '' },\n label: '行高',\n icon: 'wrap-text',\n requiresPayload: true,\n payloadPanel: lineHeightPanel\n },\n {\n id: 'paragraph',\n command: { type: 'block.paragraph' },\n label: '正文',\n icon: 'pilcrow'\n },\n {\n id: 'heading-1',\n command: { type: 'block.heading', level: 1 },\n label: '一级标题',\n icon: 'heading-1'\n },\n {\n id: 'heading-2',\n command: { type: 'block.heading', level: 2 },\n label: '二级标题',\n icon: 'heading-2'\n },\n {\n id: 'heading-3',\n command: { type: 'block.heading', level: 3 },\n label: '三级标题',\n icon: 'heading-3'\n },\n {\n id: 'heading-4',\n command: { type: 'block.heading', level: 4 },\n label: '四级标题',\n icon: 'heading-4'\n },\n {\n id: 'heading-5',\n command: { type: 'block.heading', level: 5 },\n label: '五级标题',\n icon: 'heading-5'\n },\n {\n id: 'heading-6',\n command: { type: 'block.heading', level: 6 },\n label: '六级标题',\n icon: 'heading-6'\n },\n {\n id: 'quote',\n command: { type: 'block.quote' },\n label: '引用',\n icon: 'quote'\n },\n {\n id: 'divider',\n command: { type: 'block.divider' },\n label: '分割线',\n icon: 'minus'\n },\n {\n id: 'code-block',\n command: { type: 'block.code' },\n label: '代码块',\n icon: 'square-code'\n },\n {\n id: 'ordered-list',\n command: { type: 'list.ordered' },\n label: '有序列表',\n icon: 'list-ordered'\n },\n {\n id: 'unordered-list',\n command: { type: 'list.unordered' },\n label: '无序列表',\n icon: 'list'\n },\n {\n id: 'todo-list',\n command: { type: 'list.todo' },\n label: '待办列表',\n icon: 'list-todo'\n },\n {\n id: 'align-left',\n command: { type: 'align', value: 'left' },\n label: '左对齐',\n icon: 'align-left'\n },\n {\n id: 'align-center',\n command: { type: 'align', value: 'center' },\n label: '居中',\n icon: 'align-center'\n },\n {\n id: 'align-right',\n command: { type: 'align', value: 'right' },\n label: '右对齐',\n icon: 'align-right'\n },\n {\n id: 'align-justify',\n command: { type: 'align', value: 'justify' },\n label: '两端对齐',\n icon: 'align-justify'\n },\n {\n id: 'indent-increase',\n command: { type: 'indent.increase' },\n label: '增加缩进',\n icon: 'indent-increase'\n },\n {\n id: 'indent-decrease',\n command: { type: 'indent.decrease' },\n label: '减少缩进',\n icon: 'indent-decrease'\n },\n {\n id: 'mention',\n command: { type: 'mention.insert', item: { id: '', label: '', value: '' } },\n label: '@ 提及',\n icon: 'at-sign',\n requiresPayload: true\n },\n {\n id: 'upload-image',\n command: { type: 'media.pickImage' },\n label: '上传图片',\n icon: 'upload-image'\n },\n {\n id: 'upload-video',\n command: { type: 'media.pickVideo' },\n label: '上传视频',\n icon: 'upload-video'\n },\n {\n id: 'table',\n command: { type: 'table.insert', rows: 3, cols: 3 },\n label: '表格',\n icon: 'table',\n requiresPayload: true,\n payloadPanel: tableInsertPanel\n },\n ...tableHeaderMenuItems,\n {\n id: 'slash-command',\n command: { type: 'slash.open' },\n label: '/ 命令',\n icon: 'list-plus'\n },\n {\n id: 'undo',\n command: { type: 'history.undo' },\n label: '撤销',\n icon: 'undo'\n },\n {\n id: 'redo',\n command: { type: 'history.redo' },\n label: '重做',\n icon: 'redo'\n },\n {\n id: 'clear',\n command: { type: 'content.clear' },\n label: '清空',\n icon: 'trash-2'\n },\n {\n id: 'fullscreen',\n command: { type: 'fullscreen.toggle' },\n label: '全屏',\n icon: 'maximize'\n }\n];\n","import type { CommandState, EditorCommand } from '@bridgerte/core';\nimport type { MenuItem } from '../menuSchema';\nimport { defaultMenuSchema } from '../menuSchema';\n\nconst commandStateValueByType: Partial<Record<EditorCommand['type'], (command: EditorCommand) => (\n CommandState['value'] | undefined\n)>> = {\n align: (command) => command.type === 'align' ? command.value : undefined,\n 'block.heading': (command) => command.type === 'block.heading' ? command.level : undefined,\n 'block.setCodeLanguage': (command) => (\n command.type === 'block.setCodeLanguage' ? command.language : undefined\n )\n};\n\n/**\n * 取出菜单命令用于匹配 `CommandState.value` 的稳定值。\n *\n * 同类命令存在多个菜单项时使用这个值区分,比如对齐方式和标题级别。\n */\nexport const getCommandStateMatchValue = (\n command: EditorCommand\n): CommandState['value'] | undefined => commandStateValueByType[command.type]?.(command);\n\n/**\n * 判断某条命令状态是否对应一个完整命令 payload。\n */\nexport const isCommandStateForCommand = (\n command: EditorCommand,\n state: CommandState\n): boolean => {\n const matchValue = getCommandStateMatchValue(command);\n\n return state.command === command.type\n && (matchValue === undefined || state.value === matchValue);\n};\n\n/**\n * 判断某条命令状态是否对应一个菜单项。\n *\n * 原生 toolbar 可以用它把 `CommandState[]` 映射回具体按钮 active/disabled 状态。\n */\nexport const isMenuItemCommandState = (item: MenuItem, state: CommandState): boolean => (\n isCommandStateForCommand(item.command, state)\n);\n\n/**\n * 为给定菜单生成默认禁用状态。\n *\n * 编辑器未 ready 或无选区时,原生 toolbar 可以先使用这组状态兜底。\n */\nexport function createDisabledCommandStates(menuSchema = defaultMenuSchema): CommandState[] {\n return menuSchema.map((item) => ({\n command: item.command.type,\n active: false,\n disabled: true,\n value: getCommandStateMatchValue(item.command)\n }));\n}\n","import type { ToolbarConfig, ToolbarGroupConfig, ToolbarKey } from '@bridgerte/core';\nimport type { MenuItem } from '../menuSchema';\nimport { defaultMenuSchema } from '../menuSchema';\nimport type { ResolvedToolbarItem } from './type';\n\nexport type * from './type';\n\n/**\n * 默认 DOM toolbar 配置。\n *\n * 这里只选择已实现或带参数面板的基础按钮;完整菜单全集仍由 `defaultMenuSchema` 维护。\n */\nexport const defaultToolbarConfig: ToolbarConfig = {\n toolbarKeys: [\n 'undo',\n 'redo',\n 'clear',\n '|',\n 'paragraph',\n 'heading-1',\n 'heading-2',\n 'heading-3',\n 'heading-4',\n 'heading-5',\n 'heading-6',\n 'quote',\n 'divider',\n 'code-block',\n '|',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'inline-code',\n 'superscript',\n 'subscript',\n 'clear-style',\n 'color',\n 'background-color',\n 'font-size',\n 'font-family',\n 'line-height',\n '|',\n 'ordered-list',\n 'unordered-list',\n 'todo-list',\n '|',\n 'upload-image',\n 'upload-video',\n '|',\n 'table',\n '|',\n 'align-left',\n 'align-center',\n 'align-right',\n 'align-justify',\n 'indent-increase',\n 'indent-decrease',\n '|',\n 'fullscreen'\n ]\n};\n\nconst isToolbarGroupConfig = (key: ToolbarKey): key is ToolbarGroupConfig => (\n typeof key === 'object' && Array.isArray(key.menuKeys)\n);\n\nconst createMenuMap = (menuSchema: MenuItem[]) => new Map(\n menuSchema.map((item) => [item.id, item])\n);\n\nconst shouldExcludeToolbarKey = (\n key: ToolbarKey,\n excludeKeys: Set<string>\n) => {\n if (typeof key === 'string') return key !== '|' && excludeKeys.has(key);\n\n return excludeKeys.has(key.key) || key.menuKeys.every((menuKey) => excludeKeys.has(menuKey));\n};\n\nconst applyToolbarConfigOverrides = (\n baseKeys: ToolbarKey[],\n toolbarConfig?: ToolbarConfig\n): ToolbarKey[] => {\n const excludeKeys = new Set(toolbarConfig?.excludeKeys ?? []);\n /*\n * 先排除再插入,等价于“在用户最终想保留的默认菜单里加东西”。\n * insert index 做夹取,避免业务传入负数或超长下标时破坏默认 toolbar。\n */\n const filteredKeys = baseKeys.filter((key) => !shouldExcludeToolbarKey(key, excludeKeys));\n\n if (!toolbarConfig?.insertKeys) return filteredKeys;\n\n const insertIndex = Math.max(0, Math.min(toolbarConfig.insertKeys.index, filteredKeys.length));\n\n return [\n ...filteredKeys.slice(0, insertIndex),\n ...toolbarConfig.insertKeys.keys,\n ...filteredKeys.slice(insertIndex)\n ];\n};\n\nconst resolveToolbarKey = (\n key: ToolbarKey,\n menuMap: Map<string, MenuItem>,\n excludeKeys: Set<string>,\n separatorIndex: number\n): ResolvedToolbarItem[] => {\n if (key === '|') {\n return [{ type: 'separator', key: `separator-${separatorIndex}` }];\n }\n\n if (typeof key === 'string') {\n const item = menuMap.get(key);\n\n // 未知 key 直接忽略;需要 payload 但没有 panel 的菜单暂不渲染,避免按钮点击后无法生成合法命令。\n if (!item || (item.requiresPayload && !item.payloadPanel) || excludeKeys.has(item.id)) {\n return [];\n }\n\n return [{ type: 'button', item }];\n }\n\n if (isToolbarGroupConfig(key)) {\n const items = key.menuKeys\n .filter((menuKey) => !excludeKeys.has(menuKey))\n .map((menuKey) => menuMap.get(menuKey))\n .filter((item): item is MenuItem => (\n item !== undefined && (!item.requiresPayload || item.payloadPanel !== undefined)\n ));\n\n return items.length > 0 ? [{\n type: 'group',\n key: key.key,\n title: key.title,\n icon: key.icon,\n items\n }] : [];\n }\n\n return [];\n};\n\nconst shouldKeepResolvedToolbarItem = (\n item: ResolvedToolbarItem,\n items: ResolvedToolbarItem[]\n) => {\n if (item.type !== 'separator') return true;\n\n const previousItem = items[items.length - 1];\n\n return previousItem !== undefined && previousItem.type !== 'separator';\n};\n\nconst trimTrailingToolbarSeparators = (items: ResolvedToolbarItem[]) => {\n while (items.at(-1)?.type === 'separator') {\n items.pop();\n }\n\n return items;\n};\n\n/**\n * 把 wangEditor 风格的 JSON 配置解析成 DOM/RN/Flutter 都能消费的菜单结构。\n *\n * 未知 key 和缺少 payloadPanel 的 requiresPayload 菜单会被忽略,避免默认 toolbar 渲染无法处理的按钮。\n * 分割线会自动去掉开头、结尾和连续项,避免被跳过的菜单留下空分隔。\n */\nexport const resolveToolbarMenu = (\n toolbarConfig: ToolbarConfig = defaultToolbarConfig,\n menuSchema: MenuItem[] = defaultMenuSchema\n): ResolvedToolbarItem[] => {\n const menuMap = createMenuMap(menuSchema);\n const baseKeys = toolbarConfig.toolbarKeys ?? defaultToolbarConfig.toolbarKeys ?? [];\n const toolbarKeys = applyToolbarConfigOverrides(baseKeys, toolbarConfig);\n const excludeKeys = new Set(toolbarConfig.excludeKeys ?? []);\n let separatorIndex = 0;\n\n const resolvedItems = toolbarKeys.reduce<ResolvedToolbarItem[]>((items, key) => {\n const nextItems = resolveToolbarKey(key, menuMap, excludeKeys, separatorIndex);\n\n if (key === '|') separatorIndex += 1;\n\n nextItems.forEach((item) => {\n if (shouldKeepResolvedToolbarItem(item, items)) {\n items.push(item);\n }\n });\n\n return items;\n }, []);\n\n return trimTrailingToolbarSeparators(resolvedItems);\n};\n"],"names":["codeBlockLanguagePanel","codeBlockLanguagePayloadPanel","textColorPanel","backgroundColorPanel","fontSizePanel","fontFamilyPanel","lineHeightPanel","tableInsertPanel","BRIDGERTE_TABLE_INSERT_MAX_ROWS","BRIDGERTE_TABLE_INSERT_MAX_COLS","tableHeaderMenuItems","defaultMenuSchema","commandStateValueByType","command","getCommandStateMatchValue","_a","isCommandStateForCommand","state","matchValue","isMenuItemCommandState","item","createDisabledCommandStates","menuSchema","defaultToolbarConfig","isToolbarGroupConfig","key","createMenuMap","shouldExcludeToolbarKey","excludeKeys","menuKey","applyToolbarConfigOverrides","baseKeys","toolbarConfig","filteredKeys","insertIndex","resolveToolbarKey","menuMap","separatorIndex","items","shouldKeepResolvedToolbarItem","previousItem","trimTrailingToolbarSeparators","resolveToolbarMenu","toolbarKeys","resolvedItems","nextItems"],"mappings":"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"}
|
package/dist/native-spec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-spec.js","sources":["../../native-spec/src/menuSchema/payloadPanels.ts","../../native-spec/src/menuSchema/tableHeaderMenuItems.ts","../../native-spec/src/menuSchema/defaultMenuSchema.ts","../../native-spec/src/commandState/index.ts","../../native-spec/src/toolbarConfig/index.ts"],"sourcesContent":["import {\n BRIDGERTE_TABLE_INSERT_MAX_COLS,\n BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n type PayloadPanelSchema\n} from '@bridgerte/core';\n\n/**\n * 代码块语言列表给 DOM 代码块顶部控制栏和原生侧自绘使用。\n *\n * 空字符串表示纯文本;默认候选按 Shiki 高频技术文档语言维护。业务如需裁剪语言、\n * 调整顺序或接入更多 Shiki 语言,传入自己的 `codeBlockLanguagePanel` 即可。\n */\nexport const codeBlockLanguagePanel: PayloadPanelSchema = {\n id: 'code-block-language',\n title: '代码语言',\n fields: [\n {\n type: 'select',\n name: 'language',\n label: '语言',\n defaultValue: '',\n options: [\n { label: '纯文本', value: '' },\n { label: 'Bash', value: 'shellscript' },\n { label: 'C', value: 'c' },\n { label: 'C++', value: 'cpp' },\n { label: 'C#', value: 'csharp' },\n { label: 'CSS', value: 'css' },\n { label: 'Dart', value: 'dart' },\n { label: 'Dockerfile', value: 'docker' },\n { label: 'Go', value: 'go' },\n { label: 'HTML', value: 'html' },\n { label: 'Java', value: 'java' },\n { label: 'JavaScript', value: 'javascript' },\n { label: 'JSON', value: 'json' },\n { label: 'Kotlin', value: 'kotlin' },\n { label: 'Markdown', value: 'markdown' },\n { label: 'PHP', value: 'php' },\n { label: 'Python', value: 'python' },\n { label: 'Rust', value: 'rust' },\n { label: 'SQL', value: 'sql' },\n { label: 'Swift', value: 'swift' },\n { label: 'TOML', value: 'toml' },\n { label: 'TSX', value: 'tsx' },\n { label: 'TypeScript', value: 'typescript' },\n { label: 'Vue', value: 'vue' },\n { label: 'XML', value: 'xml' },\n { label: 'YAML', value: 'yaml' }\n ]\n }\n ]\n};\n\n/**\n * 兼容旧导出名。\n *\n * 代码块语言现在由代码块 header 触发,不再代表 toolbar 菜单 payload。\n */\nexport const codeBlockLanguagePayloadPanel = codeBlockLanguagePanel;\n\n/**\n * 颜色菜单使用 color 字段而不是预设色列表。\n *\n * DOM 默认面板可以渲染内置颜色控件,RN/Flutter/WebView 或业务自绘层仍读取同一份 schema。\n */\nexport const textColorPanel: PayloadPanelSchema = {\n id: 'text-color',\n title: '文字颜色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '颜色'\n }\n ]\n};\n\nexport const backgroundColorPanel: PayloadPanelSchema = {\n id: 'background-color',\n title: '背景色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '背景'\n }\n ]\n};\n\nexport const fontSizePanel: PayloadPanelSchema = {\n id: 'font-size',\n title: '字号',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字号',\n defaultValue: '16px',\n options: [\n { label: '小号 14px', value: '14px' },\n { label: '正文 16px', value: '16px' },\n { label: '强调 18px', value: '18px' },\n { label: '标题 20px', value: '20px' },\n { label: '大标题 24px', value: '24px' }\n ]\n }\n ]\n};\n\nexport const fontFamilyPanel: PayloadPanelSchema = {\n id: 'font-family',\n title: '字体',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字体',\n defaultValue: '',\n options: [\n { label: '跟随页面', value: '' },\n { label: '无衬线', value: 'sans-serif' },\n { label: '衬线', value: 'serif' },\n { label: '等宽', value: 'monospace' }\n ]\n }\n ]\n};\n\nexport const lineHeightPanel: PayloadPanelSchema = {\n id: 'line-height',\n title: '行高',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '行高',\n defaultValue: '1.7',\n options: [\n { label: '紧凑 1.4', value: '1.4' },\n { label: '常规 1.7', value: '1.7' },\n { label: '舒展 2', value: '2' }\n ]\n }\n ]\n};\n\n/**\n * 表格插入使用 number 字段收集行列。\n *\n * DOM 默认面板、H5 自绘和 RN/Flutter 原生表单都读取同一份 schema;真正的表格进阶操作\n * 仍放后续表格菜单阶段继续扩展。\n */\nexport const tableInsertPanel: PayloadPanelSchema = {\n id: 'table-insert',\n title: '插入表格',\n fields: [\n {\n type: 'number',\n name: 'rows',\n label: '行数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n step: 1\n },\n {\n type: 'number',\n name: 'cols',\n label: '列数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_COLS,\n step: 1\n }\n ]\n};\n","import type { MenuItem } from './type';\r\n\r\n/*\r\n * 表格 header 和后续表格浮动菜单共用这组操作入口。\r\n * 这些菜单默认不进入 toolbar 排列,但仍放在 native-spec,保证 DOM/RN/Flutter 自绘读取同一份\r\n * command/label/icon 协议。\r\n */\r\nexport const tableHeaderMenuItems: MenuItem[] = [\r\n {\r\n id: 'table-insert-row-after',\r\n command: { type: 'table.insertRow', direction: 'after' },\r\n label: '插入行',\r\n icon: 'rows-plus'\r\n },\r\n {\r\n id: 'table-delete-row',\r\n command: { type: 'table.deleteRow' },\r\n label: '删除行',\r\n icon: 'rows-minus'\r\n },\r\n {\r\n id: 'table-insert-column-after',\r\n command: { type: 'table.insertColumn', direction: 'after' },\r\n label: '插入列',\r\n icon: 'columns-plus'\r\n },\r\n {\r\n id: 'table-delete-column',\r\n command: { type: 'table.deleteColumn' },\r\n label: '删除列',\r\n icon: 'columns-minus'\r\n },\r\n {\r\n id: 'table-delete',\r\n command: { type: 'table.delete' },\r\n label: '删除表格',\r\n icon: 'table-delete'\r\n }\r\n];\r\n","import type { MenuItem } from './type';\r\nimport {\r\n backgroundColorPanel,\r\n fontFamilyPanel,\r\n fontSizePanel,\r\n lineHeightPanel,\r\n tableInsertPanel,\r\n textColorPanel\r\n} from './payloadPanels';\r\nimport { tableHeaderMenuItems } from './tableHeaderMenuItems';\r\n\r\n/**\r\n * 默认菜单 schema 覆盖 wangEditor 常用入口。\r\n *\r\n * RN/Flutter 基于 id、icon、label 和 command 自绘菜单;显示分组和分割线由 toolbarConfig 决定。\n */\r\nexport const defaultMenuSchema: MenuItem[] = [\r\n {\r\n id: 'bold',\r\n command: { type: 'format.bold' },\r\n label: '加粗',\r\n icon: 'bold'\r\n },\r\n {\r\n id: 'italic',\r\n command: { type: 'format.italic' },\r\n label: '斜体',\r\n icon: 'italic'\r\n },\r\n {\r\n id: 'underline',\r\n command: { type: 'format.underline' },\r\n label: '下划线',\r\n icon: 'underline'\r\n },\r\n {\r\n id: 'strike',\r\n command: { type: 'format.strike' },\r\n label: '删除线',\r\n icon: 'strikethrough'\r\n },\r\n {\r\n id: 'inline-code',\r\n command: { type: 'format.inlineCode' },\r\n label: '行内代码',\r\n icon: 'code'\r\n },\r\n {\r\n id: 'superscript',\r\n command: { type: 'format.superscript' },\r\n label: '上标',\r\n icon: 'superscript'\r\n },\r\n {\r\n id: 'subscript',\r\n command: { type: 'format.subscript' },\r\n label: '下标',\r\n icon: 'subscript'\r\n },\r\n {\r\n id: 'clear-style',\r\n command: { type: 'format.clear' },\r\n label: '清除样式',\r\n icon: 'remove-formatting'\r\n },\r\n {\r\n id: 'color',\r\n command: { type: 'format.color', value: '' },\r\n label: '文字颜色',\r\n icon: 'palette',\r\n requiresPayload: true,\r\n payloadPanel: textColorPanel\r\n },\r\n {\r\n id: 'background-color',\r\n command: { type: 'format.backgroundColor', value: '' },\r\n label: '背景色',\r\n icon: 'paint-bucket',\r\n requiresPayload: true,\r\n payloadPanel: backgroundColorPanel\r\n },\r\n {\r\n id: 'font-size',\r\n command: { type: 'format.fontSize', value: '' },\r\n label: '字号',\r\n icon: 'case-sensitive',\r\n requiresPayload: true,\r\n payloadPanel: fontSizePanel\r\n },\r\n {\r\n id: 'font-family',\r\n command: { type: 'format.fontFamily', value: '' },\r\n label: '字体',\r\n icon: 'type',\r\n requiresPayload: true,\r\n payloadPanel: fontFamilyPanel\r\n },\r\n {\r\n id: 'line-height',\r\n command: { type: 'format.lineHeight', value: '' },\r\n label: '行高',\r\n icon: 'wrap-text',\r\n requiresPayload: true,\r\n payloadPanel: lineHeightPanel\r\n },\r\n {\r\n id: 'paragraph',\r\n command: { type: 'block.paragraph' },\r\n label: '正文',\r\n icon: 'pilcrow'\r\n },\r\n {\r\n id: 'heading-1',\r\n command: { type: 'block.heading', level: 1 },\r\n label: '一级标题',\r\n icon: 'heading-1'\r\n },\r\n {\r\n id: 'heading-2',\r\n command: { type: 'block.heading', level: 2 },\r\n label: '二级标题',\r\n icon: 'heading-2'\r\n },\r\n {\r\n id: 'heading-3',\r\n command: { type: 'block.heading', level: 3 },\r\n label: '三级标题',\r\n icon: 'heading-3'\r\n },\r\n {\r\n id: 'heading-4',\r\n command: { type: 'block.heading', level: 4 },\r\n label: '四级标题',\r\n icon: 'heading-4'\r\n },\r\n {\r\n id: 'heading-5',\r\n command: { type: 'block.heading', level: 5 },\r\n label: '五级标题',\r\n icon: 'heading-5'\r\n },\r\n {\r\n id: 'heading-6',\r\n command: { type: 'block.heading', level: 6 },\r\n label: '六级标题',\r\n icon: 'heading-6'\r\n },\r\n {\r\n id: 'quote',\r\n command: { type: 'block.quote' },\r\n label: '引用',\r\n icon: 'quote'\r\n },\r\n {\r\n id: 'divider',\r\n command: { type: 'block.divider' },\r\n label: '分割线',\r\n icon: 'minus'\r\n },\r\n {\r\n id: 'code-block',\r\n command: { type: 'block.code' },\r\n label: '代码块',\r\n icon: 'square-code'\r\n },\r\n {\r\n id: 'ordered-list',\r\n command: { type: 'list.ordered' },\r\n label: '有序列表',\r\n icon: 'list-ordered'\r\n },\r\n {\r\n id: 'unordered-list',\r\n command: { type: 'list.unordered' },\r\n label: '无序列表',\r\n icon: 'list'\r\n },\r\n {\r\n id: 'todo-list',\r\n command: { type: 'list.todo' },\r\n label: '待办列表',\r\n icon: 'list-todo'\r\n },\r\n {\r\n id: 'align-left',\r\n command: { type: 'align', value: 'left' },\r\n label: '左对齐',\r\n icon: 'align-left'\r\n },\r\n {\r\n id: 'align-center',\r\n command: { type: 'align', value: 'center' },\r\n label: '居中',\r\n icon: 'align-center'\r\n },\r\n {\r\n id: 'align-right',\r\n command: { type: 'align', value: 'right' },\r\n label: '右对齐',\r\n icon: 'align-right'\r\n },\r\n {\r\n id: 'align-justify',\r\n command: { type: 'align', value: 'justify' },\r\n label: '两端对齐',\r\n icon: 'align-justify'\r\n },\r\n {\r\n id: 'indent-increase',\r\n command: { type: 'indent.increase' },\r\n label: '增加缩进',\r\n icon: 'indent-increase'\r\n },\r\n {\r\n id: 'indent-decrease',\r\n command: { type: 'indent.decrease' },\r\n label: '减少缩进',\r\n icon: 'indent-decrease'\r\n },\r\n {\r\n id: 'mention',\r\n command: { type: 'mention.insert', item: { id: '', label: '', value: '' } },\r\n label: '@ 提及',\r\n icon: 'at-sign',\r\n requiresPayload: true\r\n },\r\n {\r\n id: 'upload-image',\r\n command: { type: 'media.pickImage' },\r\n label: '上传图片',\r\n icon: 'upload-image'\r\n },\r\n {\r\n id: 'upload-video',\r\n command: { type: 'media.pickVideo' },\r\n label: '上传视频',\r\n icon: 'upload-video'\r\n },\r\n {\r\n id: 'table',\r\n command: { type: 'table.insert', rows: 3, cols: 3 },\r\n label: '表格',\r\n icon: 'table',\r\n requiresPayload: true,\r\n payloadPanel: tableInsertPanel\r\n },\r\n ...tableHeaderMenuItems,\r\n {\r\n id: 'slash-command',\r\n command: { type: 'slash.open' },\r\n label: '/ 命令',\r\n icon: 'list-plus'\r\n },\r\n {\r\n id: 'undo',\r\n command: { type: 'history.undo' },\r\n label: '撤销',\r\n icon: 'undo'\r\n },\r\n {\r\n id: 'redo',\r\n command: { type: 'history.redo' },\r\n label: '重做',\r\n icon: 'redo'\r\n },\r\n {\r\n id: 'clear',\r\n command: { type: 'content.clear' },\r\n label: '清空',\r\n icon: 'trash-2'\r\n },\r\n {\r\n id: 'fullscreen',\r\n command: { type: 'fullscreen.toggle' },\r\n label: '全屏',\r\n icon: 'maximize'\r\n }\r\n];\r\n","import type { CommandState, EditorCommand } from '@bridgerte/core';\r\nimport type { MenuItem } from '../menuSchema';\r\nimport { defaultMenuSchema } from '../menuSchema';\r\n\r\nconst commandStateValueByType: Partial<Record<EditorCommand['type'], (command: EditorCommand) => (\r\n CommandState['value'] | undefined\r\n)>> = {\r\n align: (command) => command.type === 'align' ? command.value : undefined,\r\n 'block.heading': (command) => command.type === 'block.heading' ? command.level : undefined,\r\n 'block.setCodeLanguage': (command) => (\r\n command.type === 'block.setCodeLanguage' ? command.language : undefined\r\n )\r\n};\r\n\r\n/**\r\n * 取出菜单命令用于匹配 `CommandState.value` 的稳定值。\r\n *\r\n * 同类命令存在多个菜单项时使用这个值区分,比如对齐方式和标题级别。\r\n */\r\nexport const getCommandStateMatchValue = (\r\n command: EditorCommand\r\n): CommandState['value'] | undefined => commandStateValueByType[command.type]?.(command);\r\n\r\n/**\r\n * 判断某条命令状态是否对应一个完整命令 payload。\r\n */\r\nexport const isCommandStateForCommand = (\r\n command: EditorCommand,\r\n state: CommandState\r\n): boolean => {\r\n const matchValue = getCommandStateMatchValue(command);\r\n\r\n return state.command === command.type\r\n && (matchValue === undefined || state.value === matchValue);\r\n};\r\n\r\n/**\r\n * 判断某条命令状态是否对应一个菜单项。\r\n *\r\n * 原生 toolbar 可以用它把 `CommandState[]` 映射回具体按钮 active/disabled 状态。\r\n */\r\nexport const isMenuItemCommandState = (item: MenuItem, state: CommandState): boolean => (\r\n isCommandStateForCommand(item.command, state)\r\n);\r\n\r\n/**\r\n * 为给定菜单生成默认禁用状态。\r\n *\r\n * 编辑器未 ready 或无选区时,原生 toolbar 可以先使用这组状态兜底。\r\n */\r\nexport function createDisabledCommandStates(menuSchema = defaultMenuSchema): CommandState[] {\r\n return menuSchema.map((item) => ({\r\n command: item.command.type,\r\n active: false,\r\n disabled: true,\r\n value: getCommandStateMatchValue(item.command)\r\n }));\r\n}\r\n","import type { ToolbarConfig, ToolbarGroupConfig, ToolbarKey } from '@bridgerte/core';\r\nimport type { MenuItem } from '../menuSchema';\r\nimport { defaultMenuSchema } from '../menuSchema';\r\nimport type { ResolvedToolbarItem } from './type';\r\n\r\nexport type * from './type';\r\n\r\n/**\r\n * 默认 DOM toolbar 配置。\r\n *\r\n * 这里只选择已实现或带参数面板的基础按钮;完整菜单全集仍由 `defaultMenuSchema` 维护。\r\n */\r\nexport const defaultToolbarConfig: ToolbarConfig = {\r\n toolbarKeys: [\r\n 'undo',\r\n 'redo',\r\n 'clear',\r\n '|',\r\n 'paragraph',\r\n 'heading-1',\r\n 'heading-2',\r\n 'heading-3',\r\n 'heading-4',\r\n 'heading-5',\r\n 'heading-6',\r\n 'quote',\r\n 'divider',\r\n 'code-block',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'strike',\r\n 'inline-code',\r\n 'superscript',\r\n 'subscript',\r\n 'clear-style',\r\n 'color',\r\n 'background-color',\r\n 'font-size',\r\n 'font-family',\r\n 'line-height',\r\n '|',\r\n 'ordered-list',\n 'unordered-list',\n 'todo-list',\n '|',\n 'upload-image',\n 'upload-video',\n '|',\n 'table',\n '|',\n 'align-left',\r\n 'align-center',\r\n 'align-right',\r\n 'align-justify',\r\n 'indent-increase',\r\n 'indent-decrease',\r\n '|',\r\n 'fullscreen'\r\n ]\r\n};\r\n\r\nconst isToolbarGroupConfig = (key: ToolbarKey): key is ToolbarGroupConfig => (\r\n typeof key === 'object' && Array.isArray(key.menuKeys)\r\n);\r\n\r\nconst createMenuMap = (menuSchema: MenuItem[]) => new Map(\r\n menuSchema.map((item) => [item.id, item])\r\n);\r\n\r\nconst shouldExcludeToolbarKey = (\r\n key: ToolbarKey,\r\n excludeKeys: Set<string>\r\n) => {\r\n if (typeof key === 'string') return key !== '|' && excludeKeys.has(key);\r\n\r\n return excludeKeys.has(key.key) || key.menuKeys.every((menuKey) => excludeKeys.has(menuKey));\r\n};\r\n\r\nconst applyToolbarConfigOverrides = (\r\n baseKeys: ToolbarKey[],\r\n toolbarConfig?: ToolbarConfig\r\n): ToolbarKey[] => {\r\n const excludeKeys = new Set(toolbarConfig?.excludeKeys ?? []);\r\n /*\r\n * 先排除再插入,等价于“在用户最终想保留的默认菜单里加东西”。\r\n * insert index 做夹取,避免业务传入负数或超长下标时破坏默认 toolbar。\r\n */\r\n const filteredKeys = baseKeys.filter((key) => !shouldExcludeToolbarKey(key, excludeKeys));\r\n\r\n if (!toolbarConfig?.insertKeys) return filteredKeys;\r\n\r\n const insertIndex = Math.max(0, Math.min(toolbarConfig.insertKeys.index, filteredKeys.length));\r\n\r\n return [\r\n ...filteredKeys.slice(0, insertIndex),\r\n ...toolbarConfig.insertKeys.keys,\r\n ...filteredKeys.slice(insertIndex)\r\n ];\r\n};\r\n\r\nconst resolveToolbarKey = (\r\n key: ToolbarKey,\r\n menuMap: Map<string, MenuItem>,\r\n excludeKeys: Set<string>,\r\n separatorIndex: number\r\n): ResolvedToolbarItem[] => {\r\n if (key === '|') {\r\n return [{ type: 'separator', key: `separator-${separatorIndex}` }];\r\n }\r\n\r\n if (typeof key === 'string') {\r\n const item = menuMap.get(key);\r\n\r\n // 未知 key 直接忽略;需要 payload 但没有 panel 的菜单暂不渲染,避免按钮点击后无法生成合法命令。\r\n if (!item || (item.requiresPayload && !item.payloadPanel) || excludeKeys.has(item.id)) {\r\n return [];\r\n }\r\n\r\n return [{ type: 'button', item }];\r\n }\r\n\r\n if (isToolbarGroupConfig(key)) {\r\n const items = key.menuKeys\r\n .filter((menuKey) => !excludeKeys.has(menuKey))\r\n .map((menuKey) => menuMap.get(menuKey))\r\n .filter((item): item is MenuItem => (\r\n item !== undefined && (!item.requiresPayload || item.payloadPanel !== undefined)\r\n ));\r\n\r\n return items.length > 0 ? [{\r\n type: 'group',\r\n key: key.key,\r\n title: key.title,\r\n icon: key.icon,\r\n items\r\n }] : [];\r\n }\r\n\r\n return [];\r\n};\r\n\r\nconst shouldKeepResolvedToolbarItem = (\r\n item: ResolvedToolbarItem,\r\n items: ResolvedToolbarItem[]\r\n) => {\r\n if (item.type !== 'separator') return true;\r\n\r\n const previousItem = items[items.length - 1];\r\n\r\n return previousItem !== undefined && previousItem.type !== 'separator';\r\n};\r\n\r\nconst trimTrailingToolbarSeparators = (items: ResolvedToolbarItem[]) => {\r\n while (items.at(-1)?.type === 'separator') {\r\n items.pop();\r\n }\r\n\r\n return items;\r\n};\r\n\r\n/**\r\n * 把 wangEditor 风格的 JSON 配置解析成 DOM/RN/Flutter 都能消费的菜单结构。\r\n *\r\n * 未知 key 和缺少 payloadPanel 的 requiresPayload 菜单会被忽略,避免默认 toolbar 渲染无法处理的按钮。\r\n * 分割线会自动去掉开头、结尾和连续项,避免被跳过的菜单留下空分隔。\r\n */\r\nexport const resolveToolbarMenu = (\r\n toolbarConfig: ToolbarConfig = defaultToolbarConfig,\r\n menuSchema: MenuItem[] = defaultMenuSchema\r\n): ResolvedToolbarItem[] => {\r\n const menuMap = createMenuMap(menuSchema);\r\n const baseKeys = toolbarConfig.toolbarKeys ?? defaultToolbarConfig.toolbarKeys ?? [];\r\n const toolbarKeys = applyToolbarConfigOverrides(baseKeys, toolbarConfig);\r\n const excludeKeys = new Set(toolbarConfig.excludeKeys ?? []);\r\n let separatorIndex = 0;\r\n\r\n const resolvedItems = toolbarKeys.reduce<ResolvedToolbarItem[]>((items, key) => {\r\n const nextItems = resolveToolbarKey(key, menuMap, excludeKeys, separatorIndex);\r\n\r\n if (key === '|') separatorIndex += 1;\r\n\r\n nextItems.forEach((item) => {\r\n if (shouldKeepResolvedToolbarItem(item, items)) {\r\n items.push(item);\r\n }\r\n });\r\n\r\n return items;\r\n }, []);\r\n\r\n return trimTrailingToolbarSeparators(resolvedItems);\r\n};\r\n"],"names":["codeBlockLanguagePanel","codeBlockLanguagePayloadPanel","textColorPanel","backgroundColorPanel","fontSizePanel","fontFamilyPanel","lineHeightPanel","tableInsertPanel","BRIDGERTE_TABLE_INSERT_MAX_ROWS","BRIDGERTE_TABLE_INSERT_MAX_COLS","tableHeaderMenuItems","defaultMenuSchema","commandStateValueByType","command","getCommandStateMatchValue","_a","isCommandStateForCommand","state","matchValue","isMenuItemCommandState","item","createDisabledCommandStates","menuSchema","defaultToolbarConfig","isToolbarGroupConfig","key","createMenuMap","shouldExcludeToolbarKey","excludeKeys","menuKey","applyToolbarConfigOverrides","baseKeys","toolbarConfig","filteredKeys","insertIndex","resolveToolbarKey","menuMap","separatorIndex","items","shouldKeepResolvedToolbarItem","previousItem","trimTrailingToolbarSeparators","resolveToolbarMenu","toolbarKeys","resolvedItems","nextItems"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"native-spec.js","sources":["../../native-spec/src/menuSchema/payloadPanels.ts","../../native-spec/src/menuSchema/tableHeaderMenuItems.ts","../../native-spec/src/menuSchema/defaultMenuSchema.ts","../../native-spec/src/commandState/index.ts","../../native-spec/src/toolbarConfig/index.ts"],"sourcesContent":["import {\n BRIDGERTE_TABLE_INSERT_MAX_COLS,\n BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n type PayloadPanelSchema\n} from '@bridgerte/core';\n\n/**\n * 代码块语言列表给 DOM 代码块顶部控制栏和原生侧自绘使用。\n *\n * 空字符串表示纯文本;默认候选按 Shiki 高频技术文档语言维护。业务如需裁剪语言、\n * 调整顺序或接入更多 Shiki 语言,传入自己的 `codeBlockLanguagePanel` 即可。\n */\nexport const codeBlockLanguagePanel: PayloadPanelSchema = {\n id: 'code-block-language',\n title: '代码语言',\n fields: [\n {\n type: 'select',\n name: 'language',\n label: '语言',\n defaultValue: '',\n options: [\n { label: '纯文本', value: '' },\n { label: 'Bash', value: 'shellscript' },\n { label: 'C', value: 'c' },\n { label: 'C++', value: 'cpp' },\n { label: 'C#', value: 'csharp' },\n { label: 'CSS', value: 'css' },\n { label: 'Dart', value: 'dart' },\n { label: 'Dockerfile', value: 'docker' },\n { label: 'Go', value: 'go' },\n { label: 'HTML', value: 'html' },\n { label: 'Java', value: 'java' },\n { label: 'JavaScript', value: 'javascript' },\n { label: 'JSON', value: 'json' },\n { label: 'Kotlin', value: 'kotlin' },\n { label: 'Markdown', value: 'markdown' },\n { label: 'PHP', value: 'php' },\n { label: 'Python', value: 'python' },\n { label: 'Rust', value: 'rust' },\n { label: 'SQL', value: 'sql' },\n { label: 'Swift', value: 'swift' },\n { label: 'TOML', value: 'toml' },\n { label: 'TSX', value: 'tsx' },\n { label: 'TypeScript', value: 'typescript' },\n { label: 'Vue', value: 'vue' },\n { label: 'XML', value: 'xml' },\n { label: 'YAML', value: 'yaml' }\n ]\n }\n ]\n};\n\n/**\n * 兼容旧导出名。\n *\n * 代码块语言现在由代码块 header 触发,不再代表 toolbar 菜单 payload。\n */\nexport const codeBlockLanguagePayloadPanel = codeBlockLanguagePanel;\n\n/**\n * 颜色菜单使用 color 字段而不是预设色列表。\n *\n * DOM 默认面板可以渲染内置颜色控件,RN/Flutter/WebView 或业务自绘层仍读取同一份 schema。\n */\nexport const textColorPanel: PayloadPanelSchema = {\n id: 'text-color',\n title: '文字颜色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '颜色'\n }\n ]\n};\n\nexport const backgroundColorPanel: PayloadPanelSchema = {\n id: 'background-color',\n title: '背景色',\n fields: [\n {\n type: 'color',\n name: 'value',\n label: '背景'\n }\n ]\n};\n\nexport const fontSizePanel: PayloadPanelSchema = {\n id: 'font-size',\n title: '字号',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字号',\n defaultValue: '16px',\n options: [\n { label: '小号 14px', value: '14px' },\n { label: '正文 16px', value: '16px' },\n { label: '强调 18px', value: '18px' },\n { label: '标题 20px', value: '20px' },\n { label: '大标题 24px', value: '24px' }\n ]\n }\n ]\n};\n\nexport const fontFamilyPanel: PayloadPanelSchema = {\n id: 'font-family',\n title: '字体',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '字体',\n defaultValue: '',\n options: [\n { label: '跟随页面', value: '' },\n { label: '无衬线', value: 'sans-serif' },\n { label: '衬线', value: 'serif' },\n { label: '等宽', value: 'monospace' }\n ]\n }\n ]\n};\n\nexport const lineHeightPanel: PayloadPanelSchema = {\n id: 'line-height',\n title: '行高',\n fields: [\n {\n type: 'select',\n name: 'value',\n label: '行高',\n defaultValue: '1.7',\n options: [\n { label: '紧凑 1.4', value: '1.4' },\n { label: '常规 1.7', value: '1.7' },\n { label: '舒展 2', value: '2' }\n ]\n }\n ]\n};\n\n/**\n * 表格插入使用 number 字段收集行列。\n *\n * DOM 默认面板、H5 自绘和 RN/Flutter 原生表单都读取同一份 schema;真正的表格进阶操作\n * 仍放后续表格菜单阶段继续扩展。\n */\nexport const tableInsertPanel: PayloadPanelSchema = {\n id: 'table-insert',\n title: '插入表格',\n fields: [\n {\n type: 'number',\n name: 'rows',\n label: '行数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_ROWS,\n step: 1\n },\n {\n type: 'number',\n name: 'cols',\n label: '列数',\n defaultValue: '3',\n min: 1,\n max: BRIDGERTE_TABLE_INSERT_MAX_COLS,\n step: 1\n }\n ]\n};\n","import type { MenuItem } from './type';\n\n/*\n * 表格 header 和后续表格浮动菜单共用这组操作入口。\n * 这些菜单默认不进入 toolbar 排列,但仍放在 native-spec,保证 DOM/RN/Flutter 自绘读取同一份\n * command/label/icon 协议。\n */\nexport const tableHeaderMenuItems: MenuItem[] = [\n {\n id: 'table-insert-row-after',\n command: { type: 'table.insertRow', direction: 'after' },\n label: '插入行',\n icon: 'rows-plus'\n },\n {\n id: 'table-delete-row',\n command: { type: 'table.deleteRow' },\n label: '删除行',\n icon: 'rows-minus'\n },\n {\n id: 'table-insert-column-after',\n command: { type: 'table.insertColumn', direction: 'after' },\n label: '插入列',\n icon: 'columns-plus'\n },\n {\n id: 'table-delete-column',\n command: { type: 'table.deleteColumn' },\n label: '删除列',\n icon: 'columns-minus'\n },\n {\n id: 'table-delete',\n command: { type: 'table.delete' },\n label: '删除表格',\n icon: 'table-delete'\n }\n];\n","import type { MenuItem } from './type';\nimport {\n backgroundColorPanel,\n fontFamilyPanel,\n fontSizePanel,\n lineHeightPanel,\n tableInsertPanel,\n textColorPanel\n} from './payloadPanels';\nimport { tableHeaderMenuItems } from './tableHeaderMenuItems';\n\n/**\n * 默认菜单 schema 覆盖 wangEditor 常用入口。\n *\n * RN/Flutter 基于 id、icon、label 和 command 自绘菜单;显示分组和分割线由 toolbarConfig 决定。\n */\nexport const defaultMenuSchema: MenuItem[] = [\n {\n id: 'bold',\n command: { type: 'format.bold' },\n label: '加粗',\n icon: 'bold'\n },\n {\n id: 'italic',\n command: { type: 'format.italic' },\n label: '斜体',\n icon: 'italic'\n },\n {\n id: 'underline',\n command: { type: 'format.underline' },\n label: '下划线',\n icon: 'underline'\n },\n {\n id: 'strike',\n command: { type: 'format.strike' },\n label: '删除线',\n icon: 'strikethrough'\n },\n {\n id: 'inline-code',\n command: { type: 'format.inlineCode' },\n label: '行内代码',\n icon: 'code'\n },\n {\n id: 'superscript',\n command: { type: 'format.superscript' },\n label: '上标',\n icon: 'superscript'\n },\n {\n id: 'subscript',\n command: { type: 'format.subscript' },\n label: '下标',\n icon: 'subscript'\n },\n {\n id: 'clear-style',\n command: { type: 'format.clear' },\n label: '清除样式',\n icon: 'remove-formatting'\n },\n {\n id: 'color',\n command: { type: 'format.color', value: '' },\n label: '文字颜色',\n icon: 'palette',\n requiresPayload: true,\n payloadPanel: textColorPanel\n },\n {\n id: 'background-color',\n command: { type: 'format.backgroundColor', value: '' },\n label: '背景色',\n icon: 'paint-bucket',\n requiresPayload: true,\n payloadPanel: backgroundColorPanel\n },\n {\n id: 'font-size',\n command: { type: 'format.fontSize', value: '' },\n label: '字号',\n icon: 'case-sensitive',\n requiresPayload: true,\n payloadPanel: fontSizePanel\n },\n {\n id: 'font-family',\n command: { type: 'format.fontFamily', value: '' },\n label: '字体',\n icon: 'type',\n requiresPayload: true,\n payloadPanel: fontFamilyPanel\n },\n {\n id: 'line-height',\n command: { type: 'format.lineHeight', value: '' },\n label: '行高',\n icon: 'wrap-text',\n requiresPayload: true,\n payloadPanel: lineHeightPanel\n },\n {\n id: 'paragraph',\n command: { type: 'block.paragraph' },\n label: '正文',\n icon: 'pilcrow'\n },\n {\n id: 'heading-1',\n command: { type: 'block.heading', level: 1 },\n label: '一级标题',\n icon: 'heading-1'\n },\n {\n id: 'heading-2',\n command: { type: 'block.heading', level: 2 },\n label: '二级标题',\n icon: 'heading-2'\n },\n {\n id: 'heading-3',\n command: { type: 'block.heading', level: 3 },\n label: '三级标题',\n icon: 'heading-3'\n },\n {\n id: 'heading-4',\n command: { type: 'block.heading', level: 4 },\n label: '四级标题',\n icon: 'heading-4'\n },\n {\n id: 'heading-5',\n command: { type: 'block.heading', level: 5 },\n label: '五级标题',\n icon: 'heading-5'\n },\n {\n id: 'heading-6',\n command: { type: 'block.heading', level: 6 },\n label: '六级标题',\n icon: 'heading-6'\n },\n {\n id: 'quote',\n command: { type: 'block.quote' },\n label: '引用',\n icon: 'quote'\n },\n {\n id: 'divider',\n command: { type: 'block.divider' },\n label: '分割线',\n icon: 'minus'\n },\n {\n id: 'code-block',\n command: { type: 'block.code' },\n label: '代码块',\n icon: 'square-code'\n },\n {\n id: 'ordered-list',\n command: { type: 'list.ordered' },\n label: '有序列表',\n icon: 'list-ordered'\n },\n {\n id: 'unordered-list',\n command: { type: 'list.unordered' },\n label: '无序列表',\n icon: 'list'\n },\n {\n id: 'todo-list',\n command: { type: 'list.todo' },\n label: '待办列表',\n icon: 'list-todo'\n },\n {\n id: 'align-left',\n command: { type: 'align', value: 'left' },\n label: '左对齐',\n icon: 'align-left'\n },\n {\n id: 'align-center',\n command: { type: 'align', value: 'center' },\n label: '居中',\n icon: 'align-center'\n },\n {\n id: 'align-right',\n command: { type: 'align', value: 'right' },\n label: '右对齐',\n icon: 'align-right'\n },\n {\n id: 'align-justify',\n command: { type: 'align', value: 'justify' },\n label: '两端对齐',\n icon: 'align-justify'\n },\n {\n id: 'indent-increase',\n command: { type: 'indent.increase' },\n label: '增加缩进',\n icon: 'indent-increase'\n },\n {\n id: 'indent-decrease',\n command: { type: 'indent.decrease' },\n label: '减少缩进',\n icon: 'indent-decrease'\n },\n {\n id: 'mention',\n command: { type: 'mention.insert', item: { id: '', label: '', value: '' } },\n label: '@ 提及',\n icon: 'at-sign',\n requiresPayload: true\n },\n {\n id: 'upload-image',\n command: { type: 'media.pickImage' },\n label: '上传图片',\n icon: 'upload-image'\n },\n {\n id: 'upload-video',\n command: { type: 'media.pickVideo' },\n label: '上传视频',\n icon: 'upload-video'\n },\n {\n id: 'table',\n command: { type: 'table.insert', rows: 3, cols: 3 },\n label: '表格',\n icon: 'table',\n requiresPayload: true,\n payloadPanel: tableInsertPanel\n },\n ...tableHeaderMenuItems,\n {\n id: 'slash-command',\n command: { type: 'slash.open' },\n label: '/ 命令',\n icon: 'list-plus'\n },\n {\n id: 'undo',\n command: { type: 'history.undo' },\n label: '撤销',\n icon: 'undo'\n },\n {\n id: 'redo',\n command: { type: 'history.redo' },\n label: '重做',\n icon: 'redo'\n },\n {\n id: 'clear',\n command: { type: 'content.clear' },\n label: '清空',\n icon: 'trash-2'\n },\n {\n id: 'fullscreen',\n command: { type: 'fullscreen.toggle' },\n label: '全屏',\n icon: 'maximize'\n }\n];\n","import type { CommandState, EditorCommand } from '@bridgerte/core';\nimport type { MenuItem } from '../menuSchema';\nimport { defaultMenuSchema } from '../menuSchema';\n\nconst commandStateValueByType: Partial<Record<EditorCommand['type'], (command: EditorCommand) => (\n CommandState['value'] | undefined\n)>> = {\n align: (command) => command.type === 'align' ? command.value : undefined,\n 'block.heading': (command) => command.type === 'block.heading' ? command.level : undefined,\n 'block.setCodeLanguage': (command) => (\n command.type === 'block.setCodeLanguage' ? command.language : undefined\n )\n};\n\n/**\n * 取出菜单命令用于匹配 `CommandState.value` 的稳定值。\n *\n * 同类命令存在多个菜单项时使用这个值区分,比如对齐方式和标题级别。\n */\nexport const getCommandStateMatchValue = (\n command: EditorCommand\n): CommandState['value'] | undefined => commandStateValueByType[command.type]?.(command);\n\n/**\n * 判断某条命令状态是否对应一个完整命令 payload。\n */\nexport const isCommandStateForCommand = (\n command: EditorCommand,\n state: CommandState\n): boolean => {\n const matchValue = getCommandStateMatchValue(command);\n\n return state.command === command.type\n && (matchValue === undefined || state.value === matchValue);\n};\n\n/**\n * 判断某条命令状态是否对应一个菜单项。\n *\n * 原生 toolbar 可以用它把 `CommandState[]` 映射回具体按钮 active/disabled 状态。\n */\nexport const isMenuItemCommandState = (item: MenuItem, state: CommandState): boolean => (\n isCommandStateForCommand(item.command, state)\n);\n\n/**\n * 为给定菜单生成默认禁用状态。\n *\n * 编辑器未 ready 或无选区时,原生 toolbar 可以先使用这组状态兜底。\n */\nexport function createDisabledCommandStates(menuSchema = defaultMenuSchema): CommandState[] {\n return menuSchema.map((item) => ({\n command: item.command.type,\n active: false,\n disabled: true,\n value: getCommandStateMatchValue(item.command)\n }));\n}\n","import type { ToolbarConfig, ToolbarGroupConfig, ToolbarKey } from '@bridgerte/core';\nimport type { MenuItem } from '../menuSchema';\nimport { defaultMenuSchema } from '../menuSchema';\nimport type { ResolvedToolbarItem } from './type';\n\nexport type * from './type';\n\n/**\n * 默认 DOM toolbar 配置。\n *\n * 这里只选择已实现或带参数面板的基础按钮;完整菜单全集仍由 `defaultMenuSchema` 维护。\n */\nexport const defaultToolbarConfig: ToolbarConfig = {\n toolbarKeys: [\n 'undo',\n 'redo',\n 'clear',\n '|',\n 'paragraph',\n 'heading-1',\n 'heading-2',\n 'heading-3',\n 'heading-4',\n 'heading-5',\n 'heading-6',\n 'quote',\n 'divider',\n 'code-block',\n '|',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'inline-code',\n 'superscript',\n 'subscript',\n 'clear-style',\n 'color',\n 'background-color',\n 'font-size',\n 'font-family',\n 'line-height',\n '|',\n 'ordered-list',\n 'unordered-list',\n 'todo-list',\n '|',\n 'upload-image',\n 'upload-video',\n '|',\n 'table',\n '|',\n 'align-left',\n 'align-center',\n 'align-right',\n 'align-justify',\n 'indent-increase',\n 'indent-decrease',\n '|',\n 'fullscreen'\n ]\n};\n\nconst isToolbarGroupConfig = (key: ToolbarKey): key is ToolbarGroupConfig => (\n typeof key === 'object' && Array.isArray(key.menuKeys)\n);\n\nconst createMenuMap = (menuSchema: MenuItem[]) => new Map(\n menuSchema.map((item) => [item.id, item])\n);\n\nconst shouldExcludeToolbarKey = (\n key: ToolbarKey,\n excludeKeys: Set<string>\n) => {\n if (typeof key === 'string') return key !== '|' && excludeKeys.has(key);\n\n return excludeKeys.has(key.key) || key.menuKeys.every((menuKey) => excludeKeys.has(menuKey));\n};\n\nconst applyToolbarConfigOverrides = (\n baseKeys: ToolbarKey[],\n toolbarConfig?: ToolbarConfig\n): ToolbarKey[] => {\n const excludeKeys = new Set(toolbarConfig?.excludeKeys ?? []);\n /*\n * 先排除再插入,等价于“在用户最终想保留的默认菜单里加东西”。\n * insert index 做夹取,避免业务传入负数或超长下标时破坏默认 toolbar。\n */\n const filteredKeys = baseKeys.filter((key) => !shouldExcludeToolbarKey(key, excludeKeys));\n\n if (!toolbarConfig?.insertKeys) return filteredKeys;\n\n const insertIndex = Math.max(0, Math.min(toolbarConfig.insertKeys.index, filteredKeys.length));\n\n return [\n ...filteredKeys.slice(0, insertIndex),\n ...toolbarConfig.insertKeys.keys,\n ...filteredKeys.slice(insertIndex)\n ];\n};\n\nconst resolveToolbarKey = (\n key: ToolbarKey,\n menuMap: Map<string, MenuItem>,\n excludeKeys: Set<string>,\n separatorIndex: number\n): ResolvedToolbarItem[] => {\n if (key === '|') {\n return [{ type: 'separator', key: `separator-${separatorIndex}` }];\n }\n\n if (typeof key === 'string') {\n const item = menuMap.get(key);\n\n // 未知 key 直接忽略;需要 payload 但没有 panel 的菜单暂不渲染,避免按钮点击后无法生成合法命令。\n if (!item || (item.requiresPayload && !item.payloadPanel) || excludeKeys.has(item.id)) {\n return [];\n }\n\n return [{ type: 'button', item }];\n }\n\n if (isToolbarGroupConfig(key)) {\n const items = key.menuKeys\n .filter((menuKey) => !excludeKeys.has(menuKey))\n .map((menuKey) => menuMap.get(menuKey))\n .filter((item): item is MenuItem => (\n item !== undefined && (!item.requiresPayload || item.payloadPanel !== undefined)\n ));\n\n return items.length > 0 ? [{\n type: 'group',\n key: key.key,\n title: key.title,\n icon: key.icon,\n items\n }] : [];\n }\n\n return [];\n};\n\nconst shouldKeepResolvedToolbarItem = (\n item: ResolvedToolbarItem,\n items: ResolvedToolbarItem[]\n) => {\n if (item.type !== 'separator') return true;\n\n const previousItem = items[items.length - 1];\n\n return previousItem !== undefined && previousItem.type !== 'separator';\n};\n\nconst trimTrailingToolbarSeparators = (items: ResolvedToolbarItem[]) => {\n while (items.at(-1)?.type === 'separator') {\n items.pop();\n }\n\n return items;\n};\n\n/**\n * 把 wangEditor 风格的 JSON 配置解析成 DOM/RN/Flutter 都能消费的菜单结构。\n *\n * 未知 key 和缺少 payloadPanel 的 requiresPayload 菜单会被忽略,避免默认 toolbar 渲染无法处理的按钮。\n * 分割线会自动去掉开头、结尾和连续项,避免被跳过的菜单留下空分隔。\n */\nexport const resolveToolbarMenu = (\n toolbarConfig: ToolbarConfig = defaultToolbarConfig,\n menuSchema: MenuItem[] = defaultMenuSchema\n): ResolvedToolbarItem[] => {\n const menuMap = createMenuMap(menuSchema);\n const baseKeys = toolbarConfig.toolbarKeys ?? defaultToolbarConfig.toolbarKeys ?? [];\n const toolbarKeys = applyToolbarConfigOverrides(baseKeys, toolbarConfig);\n const excludeKeys = new Set(toolbarConfig.excludeKeys ?? []);\n let separatorIndex = 0;\n\n const resolvedItems = toolbarKeys.reduce<ResolvedToolbarItem[]>((items, key) => {\n const nextItems = resolveToolbarKey(key, menuMap, excludeKeys, separatorIndex);\n\n if (key === '|') separatorIndex += 1;\n\n nextItems.forEach((item) => {\n if (shouldKeepResolvedToolbarItem(item, items)) {\n items.push(item);\n }\n });\n\n return items;\n }, []);\n\n return trimTrailingToolbarSeparators(resolvedItems);\n};\n"],"names":["codeBlockLanguagePanel","codeBlockLanguagePayloadPanel","textColorPanel","backgroundColorPanel","fontSizePanel","fontFamilyPanel","lineHeightPanel","tableInsertPanel","BRIDGERTE_TABLE_INSERT_MAX_ROWS","BRIDGERTE_TABLE_INSERT_MAX_COLS","tableHeaderMenuItems","defaultMenuSchema","commandStateValueByType","command","getCommandStateMatchValue","_a","isCommandStateForCommand","state","matchValue","isMenuItemCommandState","item","createDisabledCommandStates","menuSchema","defaultToolbarConfig","isToolbarGroupConfig","key","createMenuMap","shouldExcludeToolbarKey","excludeKeys","menuKey","applyToolbarConfigOverrides","baseKeys","toolbarConfig","filteredKeys","insertIndex","resolveToolbarKey","menuMap","separatorIndex","items","shouldKeepResolvedToolbarItem","previousItem","trimTrailingToolbarSeparators","resolveToolbarMenu","toolbarKeys","resolvedItems","nextItems"],"mappings":"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"}
|
package/dist/webview.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-B5xR6zve.cjs");exports.createWebViewBridgeRuntime=e.createWebViewBridgeRuntime;
|
|
2
2
|
//# sourceMappingURL=webview.cjs.map
|