@notectl/core 1.0.8 → 1.0.9

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.
Files changed (106) hide show
  1. package/dist/chunks/ToolbarPlugin-DFkl1uYO.mjs +818 -0
  2. package/dist/chunks/ToolbarPlugin-DFkl1uYO.mjs.map +1 -0
  3. package/dist/chunks/{index-CxiWyUho.mjs → index-BCvuDpVr.mjs} +2 -2
  4. package/dist/chunks/{index-CxiWyUho.mjs.map → index-BCvuDpVr.mjs.map} +1 -1
  5. package/dist/chunks/{index-C2GQoHot.mjs → index-BFsYGsBR.mjs} +2 -2
  6. package/dist/chunks/{index-C2GQoHot.mjs.map → index-BFsYGsBR.mjs.map} +1 -1
  7. package/dist/chunks/{index-B_3qDrUN.mjs → index-BIL37LSL.mjs} +23 -14
  8. package/dist/chunks/index-BIL37LSL.mjs.map +1 -0
  9. package/dist/chunks/{index-Ct0ivLhO.mjs → index-BL56fbXt.mjs} +214 -219
  10. package/dist/chunks/{index-Ct0ivLhO.mjs.map → index-BL56fbXt.mjs.map} +1 -1
  11. package/dist/chunks/{index-BYgspns5.mjs → index-BQ8iIYLn.mjs} +2 -2
  12. package/dist/chunks/{index-BYgspns5.mjs.map → index-BQ8iIYLn.mjs.map} +1 -1
  13. package/dist/chunks/index-BTJfyJlJ.mjs +187 -0
  14. package/dist/chunks/index-BTJfyJlJ.mjs.map +1 -0
  15. package/dist/chunks/{index-D3CQWJiw.mjs → index-DA8TG2S8.mjs} +39 -19
  16. package/dist/chunks/index-DA8TG2S8.mjs.map +1 -0
  17. package/dist/chunks/{index-C-YWHOcC.mjs → index-DAFCISBN.mjs} +21 -21
  18. package/dist/chunks/{index-C-YWHOcC.mjs.map → index-DAFCISBN.mjs.map} +1 -1
  19. package/dist/chunks/{index-BAk1EG1x.mjs → index-DGrRWMlW.mjs} +2 -2
  20. package/dist/chunks/{index-BAk1EG1x.mjs.map → index-DGrRWMlW.mjs.map} +1 -1
  21. package/dist/chunks/{index-CT3HGdQt.mjs → index-DfO_fKw6.mjs} +6 -6
  22. package/dist/chunks/{index-CT3HGdQt.mjs.map → index-DfO_fKw6.mjs.map} +1 -1
  23. package/dist/chunks/resolvePluginLocale-B4w1OkPy.mjs.map +1 -1
  24. package/dist/editor/DocumentSerializer.d.ts.map +1 -1
  25. package/dist/editor/NotectlEditor.d.ts +27 -5
  26. package/dist/editor/NotectlEditor.d.ts.map +1 -1
  27. package/dist/editor/styles/list.d.ts +2 -0
  28. package/dist/editor/styles/list.d.ts.map +1 -1
  29. package/dist/editor/styles/toolbar.d.ts +1 -1
  30. package/dist/editor/styles/toolbar.d.ts.map +1 -1
  31. package/dist/index.d.ts +6 -3
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/input/ClipboardHandler.d.ts +2 -0
  34. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  35. package/dist/input/InputHandler.d.ts +2 -0
  36. package/dist/input/InputHandler.d.ts.map +1 -1
  37. package/dist/input/KeyboardHandler.d.ts +2 -0
  38. package/dist/input/KeyboardHandler.d.ts.map +1 -1
  39. package/dist/input/LegacyHTMLNormalizer.d.ts +18 -0
  40. package/dist/input/LegacyHTMLNormalizer.d.ts.map +1 -0
  41. package/dist/input/PasteHandler.d.ts +4 -0
  42. package/dist/input/PasteHandler.d.ts.map +1 -1
  43. package/dist/model/HTMLParser.d.ts +13 -0
  44. package/dist/model/HTMLParser.d.ts.map +1 -1
  45. package/dist/model/SchemaRegistry.d.ts +2 -2
  46. package/dist/model/SchemaRegistry.d.ts.map +1 -1
  47. package/dist/notectl-core.mjs +546 -394
  48. package/dist/notectl-core.mjs.map +1 -1
  49. package/dist/notectl-core.umd.js +1772 -1161
  50. package/dist/notectl-core.umd.js.map +1 -1
  51. package/dist/plugins/Plugin.d.ts +17 -2
  52. package/dist/plugins/Plugin.d.ts.map +1 -1
  53. package/dist/plugins/PluginManager.d.ts +17 -1
  54. package/dist/plugins/PluginManager.d.ts.map +1 -1
  55. package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -1
  56. package/dist/plugins/alignment.mjs +1 -1
  57. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  58. package/dist/plugins/code-block.mjs +1 -1
  59. package/dist/plugins/font-size.mjs +1 -1
  60. package/dist/plugins/font.mjs +1 -1
  61. package/dist/plugins/heading/HeadingBlockTypePicker.d.ts +14 -0
  62. package/dist/plugins/heading/HeadingBlockTypePicker.d.ts.map +1 -0
  63. package/dist/plugins/heading/HeadingCommands.d.ts +5 -0
  64. package/dist/plugins/heading/HeadingCommands.d.ts.map +1 -0
  65. package/dist/plugins/heading/HeadingInputRules.d.ts +5 -0
  66. package/dist/plugins/heading/HeadingInputRules.d.ts.map +1 -0
  67. package/dist/plugins/heading/HeadingKeyboardHandlers.d.ts +5 -0
  68. package/dist/plugins/heading/HeadingKeyboardHandlers.d.ts.map +1 -0
  69. package/dist/plugins/heading/HeadingPlugin.d.ts +1 -41
  70. package/dist/plugins/heading/HeadingPlugin.d.ts.map +1 -1
  71. package/dist/plugins/heading.mjs +1 -1
  72. package/dist/plugins/image/ImagePlugin.d.ts.map +1 -1
  73. package/dist/plugins/image.mjs +1 -1
  74. package/dist/plugins/list/ListPlugin.d.ts +9 -0
  75. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  76. package/dist/plugins/list.mjs +1 -1
  77. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -1
  78. package/dist/plugins/strikethrough.mjs +1 -1
  79. package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -1
  80. package/dist/plugins/super-sub.mjs +1 -1
  81. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -1
  82. package/dist/plugins/text-formatting.mjs +1 -1
  83. package/dist/plugins/toolbar/ToolbarLocale.d.ts +1 -0
  84. package/dist/plugins/toolbar/ToolbarLocale.d.ts.map +1 -1
  85. package/dist/plugins/toolbar/ToolbarOverflowBehavior.d.ts +23 -0
  86. package/dist/plugins/toolbar/ToolbarOverflowBehavior.d.ts.map +1 -0
  87. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts +56 -0
  88. package/dist/plugins/toolbar/ToolbarOverflowController.d.ts.map +1 -0
  89. package/dist/plugins/toolbar/ToolbarPlugin.d.ts +17 -0
  90. package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -1
  91. package/dist/plugins/toolbar.mjs +1 -1
  92. package/dist/state/ReadonlyGuard.d.ts +6 -0
  93. package/dist/state/ReadonlyGuard.d.ts.map +1 -0
  94. package/dist/state/Transaction.d.ts +4 -0
  95. package/dist/state/Transaction.d.ts.map +1 -1
  96. package/dist/view/EditorView.d.ts +2 -0
  97. package/dist/view/EditorView.d.ts.map +1 -1
  98. package/package.json +1 -1
  99. package/dist/chunks/ToolbarPlugin-DY2xaJiu.mjs +0 -368
  100. package/dist/chunks/ToolbarPlugin-DY2xaJiu.mjs.map +0 -1
  101. package/dist/chunks/index-B_3qDrUN.mjs.map +0 -1
  102. package/dist/chunks/index-D3CQWJiw.mjs.map +0 -1
  103. package/dist/chunks/index-Dh76rR13.mjs +0 -196
  104. package/dist/chunks/index-Dh76rR13.mjs.map +0 -1
  105. package/dist/input/SourceNormalizer.d.ts +0 -7
  106. package/dist/input/SourceNormalizer.d.ts.map +0 -1
@@ -110,6 +110,7 @@ export interface TransactionMetadata {
110
110
  readonly origin: TransactionOrigin;
111
111
  readonly timestamp: number;
112
112
  readonly historyDirection?: 'undo' | 'redo';
113
+ readonly readonlyAllowed?: boolean;
113
114
  }
114
115
  export interface Transaction {
115
116
  readonly steps: readonly Step[];
@@ -130,6 +131,7 @@ export declare class TransactionBuilder {
130
131
  private readonly selectionBefore;
131
132
  private readonly origin;
132
133
  private workingDoc;
134
+ private _readonlyAllowed;
133
135
  constructor(currentSelection: EditorSelection, currentStoredMarks: readonly Mark[] | null, origin?: TransactionOrigin, doc?: Document);
134
136
  /** Adds an insert-text step. Updates workingDoc if available. */
135
137
  insertText(blockId: BlockId, offset: number, text: string, marks: readonly Mark[], segments?: readonly TextSegment[]): this;
@@ -167,6 +169,8 @@ export declare class TransactionBuilder {
167
169
  removeInlineNode(blockId: BlockId, offset: number): this;
168
170
  /** Sets attributes on an InlineNode at the given offset. */
169
171
  setInlineNodeAttr(blockId: BlockId, offset: number, attrs: Readonly<Record<string, string | number | boolean>>): this;
172
+ /** Marks this transaction as allowed in readonly mode. */
173
+ readonlyAllowed(): this;
170
174
  /** Sets the selection for the resulting state. */
171
175
  setSelection(selection: EditorSelection): this;
172
176
  /** Sets a NodeSelection for the resulting state. */
@@ -1 +1 @@
1
- {"version":3,"file":"Transaction.d.ts","sourceRoot":"","sources":["../../src/state/Transaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Transaction.d.ts","sourceRoot":"","sources":["../../src/state/Transaction.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ export interface EditorViewOptions {
10
10
  maxHistoryDepth?: number;
11
11
  onStateChange?: StateChangeCallback;
12
12
  getDecorations?: (state: EditorState, tr?: Transaction) => DecorationSet;
13
+ isReadOnly?: () => boolean;
13
14
  }
14
15
  export declare class EditorView {
15
16
  private state;
@@ -30,6 +31,7 @@ export declare class EditorView {
30
31
  private readonly nodeViews;
31
32
  private decorations;
32
33
  private readonly getDecorations?;
34
+ private readonly isReadOnly;
33
35
  constructor(contentElement: HTMLElement, options: EditorViewOptions);
34
36
  /** Returns the current editor state. */
35
37
  getState(): EditorState;
@@ -1 +1 @@
1
- {"version":3,"file":"EditorView.d.ts","sourceRoot":"","sources":["../../src/view/EditorView.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAM7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAUjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAK3D,MAAM,MAAM,mBAAmB,GAAG,CACjC,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,EACrB,EAAE,EAAE,WAAW,KACX,IAAI,CAAC;AAEV,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,WAAW,CAAC;IACnB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,WAAW,KAAK,aAAa,CAAC;CACzE;AAED,qBAAa,UAAU;IACtB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6B;IAClE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAa;IACnD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0B;IAC1D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,yBAAyB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA0D;gBAE9E,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB;IA4DnE,wCAAwC;IACxC,QAAQ,IAAI,WAAW;IAIvB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAkCnB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAK/B,qBAAqB;IACrB,IAAI,IAAI,IAAI;IAQZ,qBAAqB;IACrB,IAAI,IAAI,IAAI;IAQZ,yCAAyC;IACzC,aAAa,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAQxD,wEAAwE;IACxE,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAuBzC,mDAAmD;IACnD,OAAO,CAAC,oBAAoB;IAuB5B,2EAA2E;IAC3E,OAAO,CAAC,WAAW;IAqDnB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IA4C/B,sDAAsD;IACtD,OAAO,CAAC,cAAc;IAYtB,iFAAiF;IACjF,OAAO,CAAC,UAAU;IAQlB,mEAAmE;IACnE,OAAO,CAAC,MAAM;IAyBd,yDAAyD;IACzD,OAAO,CAAC,oBAAoB;IA8B5B,0DAA0D;IAC1D,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,gBAAgB;IAkBxB,kDAAkD;IAClD,OAAO,IAAI,IAAI;CAef"}
1
+ {"version":3,"file":"EditorView.d.ts","sourceRoot":"","sources":["../../src/view/EditorView.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAM7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAUjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAK3D,MAAM,MAAM,mBAAmB,GAAG,CACjC,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,WAAW,EACrB,EAAE,EAAE,WAAW,KACX,IAAI,CAAC;AAEV,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,WAAW,CAAC;IACnB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,WAAW,KAAK,aAAa,CAAC;IACzE,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;CAC3B;AAED,qBAAa,UAAU;IACtB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6B;IAClE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAa;IACnD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0B;IAC1D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,yBAAyB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA0D;IAC1F,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;gBAE/B,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB;IAiEnE,wCAAwC;IACxC,QAAQ,IAAI,WAAW;IAIvB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAkCnB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAK/B,qBAAqB;IACrB,IAAI,IAAI,IAAI;IAOZ,qBAAqB;IACrB,IAAI,IAAI,IAAI;IAOZ,yCAAyC;IACzC,aAAa,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAQxD,wEAAwE;IACxE,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAuBzC,mDAAmD;IACnD,OAAO,CAAC,oBAAoB;IAuB5B,2EAA2E;IAC3E,OAAO,CAAC,WAAW;IAqDnB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IA4C/B,sDAAsD;IACtD,OAAO,CAAC,cAAc;IAYtB,iFAAiF;IACjF,OAAO,CAAC,UAAU;IAQlB,mEAAmE;IACnE,OAAO,CAAC,MAAM;IA0Bd,yDAAyD;IACzD,OAAO,CAAC,oBAAoB;IA8B5B,0DAA0D;IAC1D,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,gBAAgB;IAkBxB,kDAAkD;IAClD,OAAO,IAAI,IAAI;CAef"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@notectl/core",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "A modern and accessable rich text editor shipped as a single Web Component. Immutable state, transaction-based architecture, and a plugin system that powers every feature.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,368 +0,0 @@
1
- import { S as t, r as e } from "./resolvePluginLocale-B4w1OkPy.mjs";
2
- import { f as n, n as o, a as i, b as r, c as s, d as l } from "./ToolbarKeyboardNav-B32OMv8r.mjs";
3
- const a = { formattingOptionsAria: "Formatting options" }, c = { en: a, de: { formattingOptionsAria: "Formatierungsoptionen" }, es: { formattingOptionsAria: "Opciones de formato" }, fr: { formattingOptionsAria: "Options de mise en forme" }, zh: { formattingOptionsAria: "格式选项" }, ru: { formattingOptionsAria: "Параметры форматирования" }, ar: { formattingOptionsAria: "خيارات التنسيق" }, hi: { formattingOptionsAria: "फ़ॉर्मेटिंग विकल्प" } };
4
- function d(t2, e2, n2) {
5
- const o2 = t2.querySelectorAll(".notectl-grid-picker__cell");
6
- for (const t3 of o2) {
7
- const o3 = Number(t3.getAttribute("data-row")), i2 = Number(t3.getAttribute("data-col"));
8
- t3.classList.toggle("notectl-grid-picker__cell--highlighted", o3 <= e2 && i2 <= n2);
9
- }
10
- }
11
- function p() {
12
- const t2 = document.createElement("span");
13
- return t2.className = "notectl-toolbar-separator", t2.setAttribute("role", "separator"), t2;
14
- }
15
- class u {
16
- activePopup = null;
17
- activePopupButton = null;
18
- closePopupHandler = null;
19
- getActiveElement;
20
- constructor(t2) {
21
- this.getActiveElement = t2;
22
- }
23
- isOpen() {
24
- return null !== this.activePopup;
25
- }
26
- toggle(t2, e2, n2) {
27
- if (this.activePopup) return void this.close();
28
- const o2 = document.createElement("div");
29
- switch (o2.className = "notectl-toolbar-popup", e2.popupType) {
30
- case "gridPicker":
31
- !(function(t3, e3, n3) {
32
- t3.className += " notectl-grid-picker";
33
- const o3 = document.createElement("div");
34
- o3.className = "notectl-grid-picker__grid", o3.setAttribute("role", "grid"), o3.style.display = "grid", o3.style.gridTemplateColumns = `repeat(${e3.maxCols}, 1fr)`, o3.style.gap = "2px", o3.style.padding = "8px";
35
- const i2 = document.createElement("div");
36
- i2.className = "notectl-grid-picker__label", i2.textContent = "1 x 1", i2.style.textAlign = "center", i2.style.padding = "4px", i2.style.fontSize = "12px", i2.setAttribute("aria-live", "polite");
37
- for (let t4 = 1; t4 <= e3.maxRows; t4++) for (let r2 = 1; r2 <= e3.maxCols; r2++) {
38
- const s2 = document.createElement("div");
39
- s2.className = "notectl-grid-picker__cell", s2.setAttribute("role", "gridcell"), s2.setAttribute("tabindex", "-1"), s2.setAttribute("aria-label", `${t4} x ${r2}`), s2.style.width = "20px", s2.style.height = "20px", s2.style.border = "1px solid #ccc", s2.style.cursor = "pointer", s2.setAttribute("data-row", String(t4)), s2.setAttribute("data-col", String(r2)), s2.addEventListener("mouseenter", () => {
40
- d(o3, t4, r2), i2.textContent = `${t4} x ${r2}`;
41
- }), s2.addEventListener("mousedown", (o4) => {
42
- o4.preventDefault(), o4.stopPropagation(), e3.onSelect(t4, r2), n3();
43
- }), s2.addEventListener("click", () => {
44
- e3.onSelect(t4, r2), n3();
45
- }), o3.appendChild(s2);
46
- }
47
- t3.appendChild(o3), t3.appendChild(i2);
48
- })(o2, e2.popupConfig, () => this.close());
49
- break;
50
- case "dropdown":
51
- !(function(t3, e3, n3, o3) {
52
- t3.classList.add("notectl-dropdown"), t3.setAttribute("role", "menu");
53
- for (const i2 of e3.items) {
54
- const e4 = document.createElement("button");
55
- if (e4.type = "button", e4.className = "notectl-dropdown__item", e4.setAttribute("role", "menuitem"), e4.setAttribute("tabindex", "-1"), i2.icon) {
56
- const t4 = document.createElement("span");
57
- t4.className = "notectl-dropdown__item-icon", t4.innerHTML = i2.icon, e4.appendChild(t4);
58
- }
59
- const r2 = document.createElement("span");
60
- r2.className = "notectl-dropdown__item-label", r2.textContent = i2.label, e4.appendChild(r2), e4.addEventListener("mousedown", (t4) => {
61
- t4.preventDefault(), t4.stopPropagation(), n3(i2.command), o3();
62
- }), e4.addEventListener("click", () => {
63
- n3(i2.command), o3();
64
- }), t3.appendChild(e4);
65
- }
66
- })(o2, e2.popupConfig, (t3) => n2.executeCommand(t3), () => this.close());
67
- break;
68
- case "custom":
69
- e2.renderPopup(o2, n2, () => this.close());
70
- }
71
- this.positionAndAppend(o2, t2), this.activePopup = o2, this.activePopupButton = t2, t2.classList.add("notectl-toolbar-btn--popup-open"), t2.setAttribute("aria-expanded", "true"), this.focusFirstItem(o2), o2.addEventListener("keydown", (t3) => this.handlePopupKeydown(t3)), this.closePopupHandler = (e3) => {
72
- const n3 = e3.target;
73
- n3 instanceof Node && !o2.contains(n3) && n3 !== t2 && this.close();
74
- }, setTimeout(() => {
75
- this.closePopupHandler && document.addEventListener("mousedown", this.closePopupHandler);
76
- }, 0);
77
- }
78
- close() {
79
- this.activePopupButton && (this.activePopupButton.classList.remove("notectl-toolbar-btn--popup-open"), this.activePopupButton.setAttribute("aria-expanded", "false"), this.activePopupButton = null), this.activePopup && (this.activePopup.remove(), this.activePopup = null), this.closePopupHandler && (document.removeEventListener("mousedown", this.closePopupHandler), this.closePopupHandler = null);
80
- }
81
- closeAndRestoreFocus() {
82
- const t2 = this.activePopupButton;
83
- this.close(), t2?.focus();
84
- }
85
- destroy() {
86
- this.close();
87
- }
88
- positionAndAppend(t2, e2) {
89
- const n2 = e2.getBoundingClientRect();
90
- t2.style.position = "fixed", t2.style.top = `${n2.bottom + 2}px`, t2.style.left = `${n2.left}px`, t2.style.zIndex = "10000";
91
- const o2 = e2.getRootNode();
92
- o2 instanceof ShadowRoot ? o2.appendChild(t2) : document.body.appendChild(t2);
93
- }
94
- focusFirstItem(t2) {
95
- requestAnimationFrame(() => {
96
- const e2 = t2.querySelector('[role="menuitem"]') ?? t2.querySelector(".notectl-grid-picker__cell") ?? t2.querySelector("button");
97
- e2?.focus();
98
- });
99
- }
100
- handlePopupKeydown(t2) {
101
- if (!this.activePopup) return;
102
- if ("Escape" === t2.key) return t2.preventDefault(), t2.stopPropagation(), void this.closeAndRestoreFocus();
103
- if ("Tab" === t2.key) return t2.preventDefault(), void this.closeAndRestoreFocus();
104
- const e2 = this.activePopup.querySelectorAll('[role="menuitem"]');
105
- e2.length > 0 ? this.handleDropdownKeydown(t2, e2) : null !== this.activePopup.querySelector(".notectl-grid-picker__cell") ? this.handleGridKeydown(t2) : this.handleCustomPopupKeydown(t2);
106
- }
107
- handleDropdownKeydown(t2, e2) {
108
- const o2 = Array.from(e2), i2 = o2.indexOf(this.getActiveElement());
109
- switch (t2.key) {
110
- case "ArrowDown": {
111
- t2.preventDefault();
112
- const e3 = n(o2, i2, 1);
113
- o2[e3]?.focus();
114
- break;
115
- }
116
- case "ArrowUp": {
117
- t2.preventDefault();
118
- const e3 = n(o2, i2, -1);
119
- o2[e3]?.focus();
120
- break;
121
- }
122
- case "Enter":
123
- case " ": {
124
- t2.preventDefault();
125
- const e3 = o2[i2];
126
- e3 && e3.click();
127
- break;
128
- }
129
- }
130
- }
131
- handleGridKeydown(t2) {
132
- const e2 = this.getActiveElement(), n2 = Number(e2?.getAttribute("data-row") ?? 1), i2 = Number(e2?.getAttribute("data-col") ?? 1), r2 = this.activePopup?.querySelector(".notectl-grid-picker__grid") ?? null;
133
- if (!r2) return;
134
- const s2 = r2.querySelector(".notectl-grid-picker__cell:last-child"), l2 = Number(s2?.getAttribute("data-col") ?? 1), a2 = Number(s2?.getAttribute("data-row") ?? 1);
135
- if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(t2.key)) {
136
- t2.preventDefault();
137
- const [e3, s3] = o(n2, i2, a2, l2, t2.key), c2 = r2.querySelector(`.notectl-grid-picker__cell[data-row="${e3}"][data-col="${s3}"]`);
138
- c2?.focus(), d(r2, e3, s3);
139
- const p2 = this.activePopup?.querySelector(".notectl-grid-picker__label") ?? null;
140
- p2 && (p2.textContent = `${e3} x ${s3}`);
141
- }
142
- "Enter" !== t2.key && " " !== t2.key || (t2.preventDefault(), e2?.click());
143
- }
144
- handleCustomPopupKeydown(t2) {
145
- if (!this.activePopup) return;
146
- const e2 = Array.from(this.activePopup.querySelectorAll("button"));
147
- if (0 === e2.length) return;
148
- const o2 = this.getActiveElement(), i2 = e2.indexOf(o2);
149
- switch (t2.key) {
150
- case "ArrowDown": {
151
- t2.preventDefault();
152
- const o3 = n(e2, i2, 1);
153
- e2[o3]?.focus();
154
- break;
155
- }
156
- case "ArrowUp": {
157
- t2.preventDefault();
158
- const o3 = n(e2, i2, -1);
159
- e2[o3]?.focus();
160
- break;
161
- }
162
- case "Enter":
163
- case " ":
164
- t2.preventDefault(), o2 && o2.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, cancelable: true }));
165
- }
166
- }
167
- }
168
- class h {
169
- element;
170
- timer = null;
171
- target = null;
172
- isPopupActive;
173
- static TOOLTIP_ID = "notectl-toolbar-tooltip";
174
- constructor(t2) {
175
- this.isPopupActive = t2, this.element = document.createElement("div"), this.element.className = "notectl-toolbar-tooltip", this.element.id = h.TOOLTIP_ID, this.element.setAttribute("role", "tooltip"), this.element.style.display = "none";
176
- }
177
- show(t2) {
178
- if (this.hide(), this.isPopupActive() || t2.disabled) return;
179
- const e2 = t2.getAttribute("data-tooltip");
180
- e2 && (this.target = t2, this.timer = setTimeout(() => {
181
- if (this.isPopupActive()) return;
182
- this.element.textContent = e2, this.element.style.display = "";
183
- const n2 = t2.getRootNode();
184
- n2 instanceof ShadowRoot && !this.element.parentNode ? n2.appendChild(this.element) : n2 instanceof ShadowRoot || this.element.parentNode || document.body.appendChild(this.element), t2.setAttribute("aria-describedby", h.TOOLTIP_ID);
185
- const o2 = t2.getBoundingClientRect();
186
- this.element.style.position = "fixed", this.element.style.top = `${o2.bottom + 6}px`, this.element.style.left = `${o2.left + o2.width / 2}px`, this.element.style.transform = "translateX(-50%)";
187
- }, 500));
188
- }
189
- hide() {
190
- this.timer && (clearTimeout(this.timer), this.timer = null), this.target && (this.target.removeAttribute("aria-describedby"), this.target = null), this.element.style.display = "none";
191
- }
192
- destroy() {
193
- this.hide(), this.element.remove();
194
- }
195
- }
196
- const m = new t("toolbar");
197
- class b {
198
- id = "toolbar";
199
- name = "Toolbar";
200
- priority = 10;
201
- context = null;
202
- toolbarElement = null;
203
- buttons = [];
204
- hiddenItems = /* @__PURE__ */ new Set();
205
- layoutConfig;
206
- focusedIndex = 0;
207
- tooltip = null;
208
- popupController = null;
209
- locale;
210
- constructor(t2) {
211
- this.layoutConfig = t2 ?? null;
212
- }
213
- init(t2) {
214
- this.locale = e(c, t2), t2.registerStyleSheet("\n/* Toolbar */\n.notectl-plugin-container--top {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n border-bottom: 1px solid var(--notectl-border);\n background: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n min-height: 40px;\n}\n\n.notectl-toolbar {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 2px;\n padding: 4px 8px;\n}\n\n.notectl-toolbar-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid transparent;\n border-radius: 4px;\n background: transparent;\n cursor: pointer;\n color: var(--notectl-fg);\n font-size: 14px;\n line-height: 1;\n padding: 0;\n transition: background 0.1s, border-color 0.1s;\n}\n\n.notectl-toolbar-btn:hover {\n background: var(--notectl-hover-bg);\n border-color: var(--notectl-border);\n}\n\n.notectl-toolbar-btn--active {\n background: var(--notectl-active-bg);\n border-color: var(--notectl-primary-muted);\n color: var(--notectl-primary-fg);\n}\n\n.notectl-toolbar-btn:focus-visible {\n box-shadow: 0 0 0 2px var(--notectl-focus-ring);\n outline: none;\n}\n\n.notectl-toolbar-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.notectl-toolbar-btn:disabled:hover {\n background: transparent;\n border-color: transparent;\n}\n\n.notectl-toolbar-btn__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n.notectl-toolbar-btn__icon svg {\n display: block;\n width: 18px;\n height: 18px;\n fill: currentColor;\n}\n\n/* Tooltip (rendered as fixed-position element in shadow root) */\n.notectl-toolbar-tooltip {\n position: fixed;\n padding: 4px 8px;\n border-radius: 4px;\n background: var(--notectl-tooltip-bg);\n color: var(--notectl-tooltip-fg);\n font-size: 11px;\n font-weight: 500;\n white-space: nowrap;\n pointer-events: none;\n z-index: 10001;\n line-height: 1.4;\n letter-spacing: 0.01em;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.notectl-toolbar-separator {\n display: inline-block;\n width: 1px;\n height: 20px;\n background: var(--notectl-border);\n margin: 0 4px;\n vertical-align: middle;\n}\n\n/* Toolbar Popups */\n.notectl-toolbar-popup {\n background: var(--notectl-surface-overlay);\n border: 1px solid var(--notectl-border);\n border-radius: 6px;\n box-shadow: 0 4px 12px var(--notectl-shadow);\n overflow: hidden;\n}\n\n/* Grid Picker */\n.notectl-grid-picker__cell:focus-visible {\n outline: 2px solid var(--notectl-focus-ring);\n outline-offset: -1px;\n}\n\n.notectl-grid-picker__cell--highlighted {\n background: var(--notectl-primary-muted);\n border-color: var(--notectl-primary);\n}\n\n/* Dropdown */\n.notectl-dropdown {\n min-width: 160px;\n padding: 4px 0;\n}\n\n.notectl-dropdown__item {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 8px 12px;\n text-align: left;\n border: none;\n background: none;\n cursor: pointer;\n font-size: 14px;\n color: var(--notectl-fg);\n line-height: 1.4;\n font-family: inherit;\n white-space: nowrap;\n}\n\n.notectl-dropdown__item:hover,\n.notectl-dropdown__item:focus-visible {\n background: var(--notectl-hover-bg);\n}\n\n.notectl-dropdown__item:focus-visible {\n outline: none;\n}\n\n.notectl-dropdown__item-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n font-weight: 600;\n color: var(--notectl-fg-muted);\n flex-shrink: 0;\n}\n\n.notectl-dropdown__item-label {\n flex: 1;\n}\n"), this.context = t2, this.popupController = new u(() => this.getActiveElement()), this.tooltip = new h(() => this.popupController?.isOpen() ?? false), t2.registerService(m, { refresh: () => this.updateButtonStates(t2.getState()), closePopup: () => this.popupController?.close() }), this.createToolbarElement();
215
- }
216
- onReady() {
217
- this.renderItems();
218
- }
219
- destroy() {
220
- this.popupController?.destroy(), this.popupController = null, this.tooltip?.destroy(), this.tooltip = null, this.toolbarElement && (this.toolbarElement.remove(), this.toolbarElement = null), this.buttons = [], this.context = null;
221
- }
222
- onStateChange(t2, e2, n2) {
223
- this.updateButtonStates(e2);
224
- }
225
- onConfigure(t2) {
226
- for (const [e2, n2] of Object.entries(t2)) false === n2 ? this.hiddenItems.add(e2) : this.hiddenItems.delete(e2);
227
- this.renderItems();
228
- }
229
- createToolbarElement() {
230
- if (!this.context) return;
231
- this.toolbarElement && this.toolbarElement.remove(), this.buttons = [];
232
- const t2 = this.context.getPluginContainer("top");
233
- this.toolbarElement = document.createElement("div"), this.toolbarElement.setAttribute("role", "toolbar"), this.toolbarElement.setAttribute("aria-label", this.locale.formattingOptionsAria), this.toolbarElement.setAttribute("data-notectl-no-print", ""), this.toolbarElement.className = "notectl-toolbar", this.toolbarElement.addEventListener("keydown", (t3) => this.handleToolbarKeydown(t3)), t2.appendChild(this.toolbarElement);
234
- }
235
- renderItems() {
236
- if (this.context && this.toolbarElement) {
237
- for (const t2 of this.buttons) t2.element.remove();
238
- this.buttons = [];
239
- for (const t2 of this.toolbarElement.querySelectorAll(".notectl-toolbar-separator")) t2.remove();
240
- this.layoutConfig ? this.renderItemsByLayout() : this.renderItemsByPriority(), this.buttons.length > 0 && !this.toolbarElement.parentElement && this.context.getPluginContainer("top").appendChild(this.toolbarElement), this.initRovingTabindex(), this.updateButtonStates(this.context.getState());
241
- }
242
- }
243
- initRovingTabindex() {
244
- const t2 = this.buttons.map((t3) => t3.element), e2 = i(t2);
245
- this.focusedIndex = e2 >= 0 ? e2 : 0, r(t2, this.focusedIndex);
246
- }
247
- setRovingFocus(t2) {
248
- if (t2 < 0 || t2 >= this.buttons.length) return;
249
- this.focusedIndex = t2;
250
- const e2 = this.buttons.map((t3) => t3.element);
251
- r(e2, t2), e2[t2]?.focus();
252
- }
253
- getActiveElement() {
254
- const t2 = this.toolbarElement?.getRootNode();
255
- return t2 instanceof ShadowRoot ? t2.activeElement : document.activeElement;
256
- }
257
- syncFocusedIndex() {
258
- const t2 = this.getActiveElement(), e2 = this.buttons.findIndex((e3) => e3.element === t2);
259
- e2 >= 0 && (this.focusedIndex = e2);
260
- }
261
- handleToolbarKeydown(t2) {
262
- const e2 = this.buttons.map((t3) => t3.element);
263
- if (0 !== e2.length) switch (this.syncFocusedIndex(), t2.key) {
264
- case "ArrowRight": {
265
- t2.preventDefault();
266
- const n2 = l(e2, this.focusedIndex, 1);
267
- this.setRovingFocus(n2);
268
- break;
269
- }
270
- case "ArrowLeft": {
271
- t2.preventDefault();
272
- const n2 = l(e2, this.focusedIndex, -1);
273
- this.setRovingFocus(n2);
274
- break;
275
- }
276
- case "Home": {
277
- t2.preventDefault();
278
- const n2 = i(e2);
279
- n2 >= 0 && this.setRovingFocus(n2);
280
- break;
281
- }
282
- case "End": {
283
- t2.preventDefault();
284
- const n2 = s(e2);
285
- n2 >= 0 && this.setRovingFocus(n2);
286
- break;
287
- }
288
- case "Enter":
289
- case " ": {
290
- t2.preventDefault();
291
- const e3 = this.buttons[this.focusedIndex];
292
- e3 && this.activateButton(e3.element, e3.item);
293
- break;
294
- }
295
- }
296
- }
297
- activateButton(t2, e2) {
298
- this.tooltip?.hide(), e2.popupType && this.context ? this.popupController?.toggle(t2, e2, this.context) : this.context?.executeCommand(e2.command);
299
- }
300
- renderItemsByLayout() {
301
- if (!this.context || !this.toolbarElement || !this.layoutConfig) return;
302
- const t2 = this.context.getSchemaRegistry();
303
- let e2 = true;
304
- for (const n2 of this.layoutConfig.groups) {
305
- const o2 = [];
306
- for (const e3 of n2) {
307
- const n3 = t2.getToolbarItemsByPlugin(e3).filter((t3) => !this.hiddenItems.has(t3.id));
308
- n3.sort((t3, e4) => (t3.priority ?? 100) - (e4.priority ?? 100)), o2.push(...n3);
309
- }
310
- if (0 !== o2.length) {
311
- e2 || this.toolbarElement.appendChild(p()), e2 = false;
312
- for (const t3 of o2) {
313
- const e3 = this.createButton(t3);
314
- this.toolbarElement.appendChild(e3.element), this.buttons.push(e3);
315
- }
316
- }
317
- }
318
- 0 === this.buttons.length && this.toolbarElement.remove();
319
- }
320
- renderItemsByPriority() {
321
- if (!this.context || !this.toolbarElement) return;
322
- const t2 = this.context.getSchemaRegistry().getToolbarItems().filter((t3) => !this.hiddenItems.has(t3.id));
323
- if (0 === t2.length) return void this.toolbarElement.remove();
324
- const e2 = [...t2].sort((t3, e3) => (t3.priority ?? 100) - (e3.priority ?? 100));
325
- if (e2.some((t3) => t3.separatorAfter)) for (let t3 = 0; t3 < e2.length; t3++) {
326
- const n2 = e2[t3];
327
- if (!n2) continue;
328
- const o2 = this.createButton(n2);
329
- this.toolbarElement.appendChild(o2.element), this.buttons.push(o2), n2.separatorAfter && t3 < e2.length - 1 && this.toolbarElement.appendChild(p());
330
- }
331
- else {
332
- const t3 = /* @__PURE__ */ new Map();
333
- for (const n3 of e2) {
334
- const e3 = t3.get(n3.group) ?? [];
335
- e3.push(n3), t3.set(n3.group, e3);
336
- }
337
- let n2 = true;
338
- for (const [, e3] of t3) {
339
- n2 || this.toolbarElement.appendChild(p()), n2 = false;
340
- for (const t4 of e3) {
341
- const e4 = this.createButton(t4);
342
- this.toolbarElement.appendChild(e4.element), this.buttons.push(e4);
343
- }
344
- }
345
- }
346
- }
347
- createButton(t2) {
348
- const e2 = document.createElement("button");
349
- e2.type = "button", e2.className = `notectl-toolbar-btn notectl-toolbar-btn--${t2.id}`, e2.setAttribute("aria-pressed", "false"), e2.setAttribute("aria-label", t2.label), e2.setAttribute("data-toolbar-item", t2.id), e2.setAttribute("data-tooltip", t2.tooltip ?? t2.label), t2.popupType && (e2.setAttribute("aria-haspopup", "true"), e2.setAttribute("aria-expanded", "false"));
350
- const n2 = document.createElement("span");
351
- return n2.className = "notectl-toolbar-btn__icon", n2.innerHTML = t2.icon, e2.appendChild(n2), e2.addEventListener("mousedown", (n3) => {
352
- n3.preventDefault(), this.activateButton(e2, t2);
353
- }), e2.addEventListener("mouseenter", () => this.tooltip?.show(e2)), e2.addEventListener("mouseleave", () => this.tooltip?.hide()), e2.addEventListener("focus", () => this.tooltip?.show(e2)), e2.addEventListener("blur", () => this.tooltip?.hide()), { element: e2, item: t2 };
354
- }
355
- updateButtonStates(t2) {
356
- for (const e2 of this.buttons) {
357
- const n2 = e2.item.isActive?.(t2) ?? false, o2 = e2.item.isEnabled?.(t2) ?? true;
358
- e2.element.setAttribute("aria-pressed", String(n2)), e2.element.classList.toggle("notectl-toolbar-btn--active", n2), e2.element.disabled = !o2, o2 ? e2.element.removeAttribute("aria-disabled") : e2.element.setAttribute("aria-disabled", "true");
359
- }
360
- }
361
- }
362
- export {
363
- b as T,
364
- m as a,
365
- c as b,
366
- a as c
367
- };
368
- //# sourceMappingURL=ToolbarPlugin-DY2xaJiu.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ToolbarPlugin-DY2xaJiu.mjs","sources":["../../src/editor/styles/toolbar.ts","../../src/plugins/toolbar/ToolbarLocale.ts","../../src/plugins/toolbar/ToolbarRenderers.ts","../../src/plugins/toolbar/ToolbarPopupController.ts","../../src/plugins/toolbar/ToolbarTooltip.ts","../../src/plugins/toolbar/ToolbarPlugin.ts"],"sourcesContent":["/** Toolbar styles — buttons, separators, tooltips, popups, dropdowns. */\nexport const TOOLBAR_CSS = `\n/* Toolbar */\n.notectl-plugin-container--top {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tborder-bottom: 1px solid var(--notectl-border);\n\tbackground: var(--notectl-toolbar-bg, var(--notectl-surface-raised));\n\tmin-height: 40px;\n}\n\n.notectl-toolbar {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tgap: 2px;\n\tpadding: 4px 8px;\n}\n\n.notectl-toolbar-btn {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px;\n\tbackground: transparent;\n\tcursor: pointer;\n\tcolor: var(--notectl-fg);\n\tfont-size: 14px;\n\tline-height: 1;\n\tpadding: 0;\n\ttransition: background 0.1s, border-color 0.1s;\n}\n\n.notectl-toolbar-btn:hover {\n\tbackground: var(--notectl-hover-bg);\n\tborder-color: var(--notectl-border);\n}\n\n.notectl-toolbar-btn--active {\n\tbackground: var(--notectl-active-bg);\n\tborder-color: var(--notectl-primary-muted);\n\tcolor: var(--notectl-primary-fg);\n}\n\n.notectl-toolbar-btn:focus-visible {\n\tbox-shadow: 0 0 0 2px var(--notectl-focus-ring);\n\toutline: none;\n}\n\n.notectl-toolbar-btn:disabled {\n\topacity: 0.4;\n\tcursor: not-allowed;\n}\n\n.notectl-toolbar-btn:disabled:hover {\n\tbackground: transparent;\n\tborder-color: transparent;\n}\n\n.notectl-toolbar-btn__icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpointer-events: none;\n}\n\n.notectl-toolbar-btn__icon svg {\n\tdisplay: block;\n\twidth: 18px;\n\theight: 18px;\n\tfill: currentColor;\n}\n\n/* Tooltip (rendered as fixed-position element in shadow root) */\n.notectl-toolbar-tooltip {\n\tposition: fixed;\n\tpadding: 4px 8px;\n\tborder-radius: 4px;\n\tbackground: var(--notectl-tooltip-bg);\n\tcolor: var(--notectl-tooltip-fg);\n\tfont-size: 11px;\n\tfont-weight: 500;\n\twhite-space: nowrap;\n\tpointer-events: none;\n\tz-index: 10001;\n\tline-height: 1.4;\n\tletter-spacing: 0.01em;\n\tfont-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.notectl-toolbar-separator {\n\tdisplay: inline-block;\n\twidth: 1px;\n\theight: 20px;\n\tbackground: var(--notectl-border);\n\tmargin: 0 4px;\n\tvertical-align: middle;\n}\n\n/* Toolbar Popups */\n.notectl-toolbar-popup {\n\tbackground: var(--notectl-surface-overlay);\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 6px;\n\tbox-shadow: 0 4px 12px var(--notectl-shadow);\n\toverflow: hidden;\n}\n\n/* Grid Picker */\n.notectl-grid-picker__cell:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: -1px;\n}\n\n.notectl-grid-picker__cell--highlighted {\n\tbackground: var(--notectl-primary-muted);\n\tborder-color: var(--notectl-primary);\n}\n\n/* Dropdown */\n.notectl-dropdown {\n\tmin-width: 160px;\n\tpadding: 4px 0;\n}\n\n.notectl-dropdown__item {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n\tpadding: 8px 12px;\n\ttext-align: left;\n\tborder: none;\n\tbackground: none;\n\tcursor: pointer;\n\tfont-size: 14px;\n\tcolor: var(--notectl-fg);\n\tline-height: 1.4;\n\tfont-family: inherit;\n\twhite-space: nowrap;\n}\n\n.notectl-dropdown__item:hover,\n.notectl-dropdown__item:focus-visible {\n\tbackground: var(--notectl-hover-bg);\n}\n\n.notectl-dropdown__item:focus-visible {\n\toutline: none;\n}\n\n.notectl-dropdown__item-icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 28px;\n\tfont-weight: 600;\n\tcolor: var(--notectl-fg-muted);\n\tflex-shrink: 0;\n}\n\n.notectl-dropdown__item-label {\n\tflex: 1;\n}\n`;\n","/** Locale interface and default English locale for the ToolbarPlugin. */\n\n// --- Locale Interface ---\n\nexport interface ToolbarLocale {\n\treadonly formattingOptionsAria: string;\n}\n\n// --- Default English Locale ---\n\nexport const TOOLBAR_LOCALE_EN: ToolbarLocale = {\n\tformattingOptionsAria: 'Formatting options',\n};\n\n// --- German Locale ---\n\nexport const TOOLBAR_LOCALE_DE: ToolbarLocale = {\n\tformattingOptionsAria: 'Formatierungsoptionen',\n};\n\n// --- Spanish Locale ---\n\nexport const TOOLBAR_LOCALE_ES: ToolbarLocale = {\n\tformattingOptionsAria: 'Opciones de formato',\n};\n\n// --- French Locale ---\n\nexport const TOOLBAR_LOCALE_FR: ToolbarLocale = {\n\tformattingOptionsAria: 'Options de mise en forme',\n};\n\n// --- Chinese (Simplified) Locale ---\n\nexport const TOOLBAR_LOCALE_ZH: ToolbarLocale = {\n\tformattingOptionsAria: '格式选项',\n};\n\n// --- Russian Locale ---\n\nexport const TOOLBAR_LOCALE_RU: ToolbarLocale = {\n\tformattingOptionsAria: 'Параметры форматирования',\n};\n\n// --- Arabic Locale ---\n\nexport const TOOLBAR_LOCALE_AR: ToolbarLocale = {\n\tformattingOptionsAria: 'خيارات التنسيق',\n};\n\n// --- Hindi Locale ---\n\nexport const TOOLBAR_LOCALE_HI: ToolbarLocale = {\n\tformattingOptionsAria: 'फ़ॉर्मेटिंग विकल्प',\n};\n\n// --- Locale Map ---\n\nexport const TOOLBAR_LOCALES: Record<string, ToolbarLocale> = {\n\ten: TOOLBAR_LOCALE_EN,\n\tde: TOOLBAR_LOCALE_DE,\n\tes: TOOLBAR_LOCALE_ES,\n\tfr: TOOLBAR_LOCALE_FR,\n\tzh: TOOLBAR_LOCALE_ZH,\n\tru: TOOLBAR_LOCALE_RU,\n\tar: TOOLBAR_LOCALE_AR,\n\thi: TOOLBAR_LOCALE_HI,\n};\n","/**\n * ToolbarRenderers: pure rendering functions for toolbar popup content.\n * Grid pickers, dropdown menus, and separator elements.\n */\n\nimport type { DropdownConfig, GridPickerConfig } from './ToolbarItem.js';\n\nconst HIGHLIGHTED_CLASS = 'notectl-grid-picker__cell--highlighted';\n\n/**\n * Renders a grid picker into the given container.\n * Calls `onClose` after a cell is selected so the popup can be dismissed.\n */\nexport function renderGridPicker(\n\tcontainer: HTMLElement,\n\tconfig: GridPickerConfig,\n\tonClose: () => void,\n): void {\n\tcontainer.className += ' notectl-grid-picker';\n\n\tconst grid: HTMLDivElement = document.createElement('div');\n\tgrid.className = 'notectl-grid-picker__grid';\n\tgrid.setAttribute('role', 'grid');\n\tgrid.style.display = 'grid';\n\tgrid.style.gridTemplateColumns = `repeat(${config.maxCols}, 1fr)`;\n\tgrid.style.gap = '2px';\n\tgrid.style.padding = '8px';\n\n\tconst label: HTMLDivElement = document.createElement('div');\n\tlabel.className = 'notectl-grid-picker__label';\n\tlabel.textContent = '1 x 1';\n\tlabel.style.textAlign = 'center';\n\tlabel.style.padding = '4px';\n\tlabel.style.fontSize = '12px';\n\tlabel.setAttribute('aria-live', 'polite');\n\n\tfor (let r = 1; r <= config.maxRows; r++) {\n\t\tfor (let c = 1; c <= config.maxCols; c++) {\n\t\t\tconst cell: HTMLDivElement = document.createElement('div');\n\t\t\tcell.className = 'notectl-grid-picker__cell';\n\t\t\tcell.setAttribute('role', 'gridcell');\n\t\t\tcell.setAttribute('tabindex', '-1');\n\t\t\tcell.setAttribute('aria-label', `${r} x ${c}`);\n\t\t\tcell.style.width = '20px';\n\t\t\tcell.style.height = '20px';\n\t\t\tcell.style.border = '1px solid #ccc';\n\t\t\tcell.style.cursor = 'pointer';\n\t\t\tcell.setAttribute('data-row', String(r));\n\t\t\tcell.setAttribute('data-col', String(c));\n\n\t\t\tcell.addEventListener('mouseenter', () => {\n\t\t\t\thighlightCells(grid, r, c);\n\t\t\t\tlabel.textContent = `${r} x ${c}`;\n\t\t\t});\n\n\t\t\tcell.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tconfig.onSelect(r, c);\n\t\t\t\tonClose();\n\t\t\t});\n\n\t\t\tcell.addEventListener('click', () => {\n\t\t\t\tconfig.onSelect(r, c);\n\t\t\t\tonClose();\n\t\t\t});\n\n\t\t\tgrid.appendChild(cell);\n\t\t}\n\t}\n\n\tcontainer.appendChild(grid);\n\tcontainer.appendChild(label);\n}\n\n/**\n * Highlights grid cells up to the given row/col and updates the label.\n * Used by both mouse hover and keyboard navigation.\n */\nexport function highlightCells(grid: HTMLElement, targetRow: number, targetCol: number): void {\n\tconst cells: NodeListOf<Element> = grid.querySelectorAll('.notectl-grid-picker__cell');\n\tfor (const cell of cells) {\n\t\tconst r: number = Number(cell.getAttribute('data-row'));\n\t\tconst c: number = Number(cell.getAttribute('data-col'));\n\t\tcell.classList.toggle(HIGHLIGHTED_CLASS, r <= targetRow && c <= targetCol);\n\t}\n}\n\n/**\n * Renders a dropdown menu into the given container.\n * Calls `onClose` after an item is activated so the popup can be dismissed.\n */\nexport function renderDropdown(\n\tcontainer: HTMLElement,\n\tconfig: DropdownConfig,\n\texecuteCommand: (command: string) => void,\n\tonClose: () => void,\n): void {\n\tcontainer.classList.add('notectl-dropdown');\n\tcontainer.setAttribute('role', 'menu');\n\n\tfor (const item of config.items) {\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.className = 'notectl-dropdown__item';\n\t\tbtn.setAttribute('role', 'menuitem');\n\t\tbtn.setAttribute('tabindex', '-1');\n\n\t\tif (item.icon) {\n\t\t\tconst iconSpan: HTMLSpanElement = document.createElement('span');\n\t\t\ticonSpan.className = 'notectl-dropdown__item-icon';\n\t\t\ticonSpan.innerHTML = item.icon;\n\t\t\tbtn.appendChild(iconSpan);\n\t\t}\n\n\t\tconst labelSpan: HTMLSpanElement = document.createElement('span');\n\t\tlabelSpan.className = 'notectl-dropdown__item-label';\n\t\tlabelSpan.textContent = item.label;\n\t\tbtn.appendChild(labelSpan);\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\texecuteCommand(item.command);\n\t\t\tonClose();\n\t\t});\n\n\t\tbtn.addEventListener('click', () => {\n\t\t\texecuteCommand(item.command);\n\t\t\tonClose();\n\t\t});\n\n\t\tcontainer.appendChild(btn);\n\t}\n}\n\n/** Creates a toolbar group separator element. */\nexport function createSeparator(): HTMLSpanElement {\n\tconst sep: HTMLSpanElement = document.createElement('span');\n\tsep.className = 'notectl-toolbar-separator';\n\tsep.setAttribute('role', 'separator');\n\treturn sep;\n}\n","/**\n * ToolbarPopupController: manages popup lifecycle, positioning, keyboard\n * navigation, and auto-close for toolbar popups (grid pickers, dropdowns,\n * and custom popups).\n */\n\nimport type { PluginContext } from '../Plugin.js';\nimport type { ToolbarItem } from './ToolbarItem.js';\nimport { findNextDropdownItem, navigateGrid } from './ToolbarKeyboardNav.js';\nimport { highlightCells, renderDropdown, renderGridPicker } from './ToolbarRenderers.js';\n\nexport class ToolbarPopupController {\n\tprivate activePopup: HTMLElement | null = null;\n\tprivate activePopupButton: HTMLButtonElement | null = null;\n\tprivate closePopupHandler: ((e: MouseEvent) => void) | null = null;\n\tprivate readonly getActiveElement: () => Element | null;\n\n\tconstructor(getActiveElement: () => Element | null) {\n\t\tthis.getActiveElement = getActiveElement;\n\t}\n\n\t/** Whether a popup is currently open. */\n\tisOpen(): boolean {\n\t\treturn this.activePopup !== null;\n\t}\n\n\t/** Toggles a popup for the given toolbar button. */\n\ttoggle(button: HTMLButtonElement, item: ToolbarItem, context: PluginContext): void {\n\t\tif (this.activePopup) {\n\t\t\tthis.close();\n\t\t\treturn;\n\t\t}\n\n\t\tconst popup: HTMLDivElement = document.createElement('div');\n\t\tpopup.className = 'notectl-toolbar-popup';\n\n\t\tswitch (item.popupType) {\n\t\t\tcase 'gridPicker':\n\t\t\t\trenderGridPicker(popup, item.popupConfig, () => this.close());\n\t\t\t\tbreak;\n\t\t\tcase 'dropdown':\n\t\t\t\trenderDropdown(\n\t\t\t\t\tpopup,\n\t\t\t\t\titem.popupConfig,\n\t\t\t\t\t(cmd: string) => context.executeCommand(cmd),\n\t\t\t\t\t() => this.close(),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'custom':\n\t\t\t\titem.renderPopup(popup, context, () => this.close());\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.positionAndAppend(popup, button);\n\n\t\tthis.activePopup = popup;\n\t\tthis.activePopupButton = button;\n\t\tbutton.classList.add('notectl-toolbar-btn--popup-open');\n\t\tbutton.setAttribute('aria-expanded', 'true');\n\n\t\tthis.focusFirstItem(popup);\n\n\t\tpopup.addEventListener('keydown', (e: KeyboardEvent) => this.handlePopupKeydown(e));\n\n\t\tthis.closePopupHandler = (e: MouseEvent) => {\n\t\t\tconst target: EventTarget | null = e.target;\n\t\t\tif (target instanceof Node && !popup.contains(target) && target !== button) {\n\t\t\t\tthis.close();\n\t\t\t}\n\t\t};\n\t\tsetTimeout(() => {\n\t\t\tif (this.closePopupHandler) {\n\t\t\t\tdocument.addEventListener('mousedown', this.closePopupHandler);\n\t\t\t}\n\t\t}, 0);\n\t}\n\n\t/** Closes the active popup and cleans up event listeners. */\n\tclose(): void {\n\t\tif (this.activePopupButton) {\n\t\t\tthis.activePopupButton.classList.remove('notectl-toolbar-btn--popup-open');\n\t\t\tthis.activePopupButton.setAttribute('aria-expanded', 'false');\n\t\t\tthis.activePopupButton = null;\n\t\t}\n\t\tif (this.activePopup) {\n\t\t\tthis.activePopup.remove();\n\t\t\tthis.activePopup = null;\n\t\t}\n\t\tif (this.closePopupHandler) {\n\t\t\tdocument.removeEventListener('mousedown', this.closePopupHandler);\n\t\t\tthis.closePopupHandler = null;\n\t\t}\n\t}\n\n\t/** Closes popup and restores focus to the trigger button. */\n\tcloseAndRestoreFocus(): void {\n\t\tconst triggerBtn: HTMLButtonElement | null = this.activePopupButton;\n\t\tthis.close();\n\t\ttriggerBtn?.focus();\n\t}\n\n\tdestroy(): void {\n\t\tthis.close();\n\t}\n\n\t// --- Positioning ---\n\n\tprivate positionAndAppend(popup: HTMLElement, button: HTMLButtonElement): void {\n\t\tconst rect: DOMRect = button.getBoundingClientRect();\n\t\tpopup.style.position = 'fixed';\n\t\tpopup.style.top = `${rect.bottom + 2}px`;\n\t\tpopup.style.left = `${rect.left}px`;\n\t\tpopup.style.zIndex = '10000';\n\n\t\tconst root: Node = button.getRootNode();\n\t\tif (root instanceof ShadowRoot) {\n\t\t\troot.appendChild(popup);\n\t\t} else {\n\t\t\tdocument.body.appendChild(popup);\n\t\t}\n\t}\n\n\t// --- Focus ---\n\n\tprivate focusFirstItem(popup: HTMLElement): void {\n\t\trequestAnimationFrame(() => {\n\t\t\tconst firstItem: HTMLElement | null =\n\t\t\t\tpopup.querySelector('[role=\"menuitem\"]') ??\n\t\t\t\tpopup.querySelector('.notectl-grid-picker__cell') ??\n\t\t\t\tpopup.querySelector('button');\n\t\t\tfirstItem?.focus();\n\t\t});\n\t}\n\n\t// --- Keyboard Navigation ---\n\n\tprivate handlePopupKeydown(e: KeyboardEvent): void {\n\t\tif (!this.activePopup) return;\n\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.closeAndRestoreFocus();\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === 'Tab') {\n\t\t\te.preventDefault();\n\t\t\tthis.closeAndRestoreFocus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst menuItems: NodeListOf<Element> = this.activePopup.querySelectorAll('[role=\"menuitem\"]');\n\t\tif (menuItems.length > 0) {\n\t\t\tthis.handleDropdownKeydown(e, menuItems);\n\t\t\treturn;\n\t\t}\n\n\t\tconst hasGrid: boolean = this.activePopup.querySelector('.notectl-grid-picker__cell') !== null;\n\t\tif (hasGrid) {\n\t\t\tthis.handleGridKeydown(e);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.handleCustomPopupKeydown(e);\n\t}\n\n\tprivate handleDropdownKeydown(e: KeyboardEvent, items: NodeListOf<Element>): void {\n\t\tconst itemArr: HTMLElement[] = Array.from(items) as HTMLElement[];\n\t\tconst current: number = itemArr.indexOf(this.getActiveElement() as HTMLElement);\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextDropdownItem(itemArr, current, 1);\n\t\t\t\titemArr[next]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextDropdownItem(itemArr, current, -1);\n\t\t\t\titemArr[prev]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst focused: HTMLElement | undefined = itemArr[current];\n\t\t\t\tif (focused) focused.click();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate handleGridKeydown(e: KeyboardEvent): void {\n\t\tconst focused: HTMLElement = this.getActiveElement() as HTMLElement;\n\t\tconst row: number = Number(focused?.getAttribute('data-row') ?? 1);\n\t\tconst col: number = Number(focused?.getAttribute('data-col') ?? 1);\n\n\t\tconst grid: Element | null =\n\t\t\tthis.activePopup?.querySelector('.notectl-grid-picker__grid') ?? null;\n\t\tif (!grid) return;\n\n\t\tconst lastCell: Element | null = grid.querySelector('.notectl-grid-picker__cell:last-child');\n\t\tconst maxCols: number = Number(lastCell?.getAttribute('data-col') ?? 1);\n\t\tconst maxRows: number = Number(lastCell?.getAttribute('data-row') ?? 1);\n\n\t\tif (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\tconst [newRow, newCol]: [number, number] = navigateGrid(\n\t\t\t\trow,\n\t\t\t\tcol,\n\t\t\t\tmaxRows,\n\t\t\t\tmaxCols,\n\t\t\t\te.key as 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight',\n\t\t\t);\n\t\t\tconst target: HTMLElement | null = grid.querySelector(\n\t\t\t\t`.notectl-grid-picker__cell[data-row=\"${newRow}\"][data-col=\"${newCol}\"]`,\n\t\t\t);\n\t\t\ttarget?.focus();\n\n\t\t\thighlightCells(grid as HTMLElement, newRow, newCol);\n\t\t\tconst label: Element | null =\n\t\t\t\tthis.activePopup?.querySelector('.notectl-grid-picker__label') ?? null;\n\t\t\tif (label) label.textContent = `${newRow} x ${newCol}`;\n\t\t}\n\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault();\n\t\t\tfocused?.click();\n\t\t}\n\t}\n\n\tprivate handleCustomPopupKeydown(e: KeyboardEvent): void {\n\t\tif (!this.activePopup) return;\n\t\tconst buttons: HTMLButtonElement[] = Array.from(this.activePopup.querySelectorAll('button'));\n\t\tif (buttons.length === 0) return;\n\t\tconst active: HTMLElement = this.getActiveElement() as HTMLElement;\n\t\tconst currentIdx: number = buttons.indexOf(active as HTMLButtonElement);\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowDown': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextDropdownItem(buttons, currentIdx, 1);\n\t\t\t\tbuttons[next]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowUp': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextDropdownItem(buttons, currentIdx, -1);\n\t\t\t\tbuttons[prev]?.focus();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tif (active) {\n\t\t\t\t\tactive.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true }));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * ToolbarTooltip: manages the tooltip lifecycle for toolbar buttons.\n * Shows a tooltip after a short delay when hovering or focusing a button,\n * hides it when the cursor leaves or focus moves away.\n */\n\nconst TOOLTIP_DELAY_MS = 500;\n\nexport class ToolbarTooltip {\n\tprivate readonly element: HTMLElement;\n\tprivate timer: ReturnType<typeof setTimeout> | null = null;\n\tprivate target: HTMLButtonElement | null = null;\n\tprivate readonly isPopupActive: () => boolean;\n\n\tstatic readonly TOOLTIP_ID = 'notectl-toolbar-tooltip';\n\n\tconstructor(isPopupActive: () => boolean) {\n\t\tthis.isPopupActive = isPopupActive;\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'notectl-toolbar-tooltip';\n\t\tthis.element.id = ToolbarTooltip.TOOLTIP_ID;\n\t\tthis.element.setAttribute('role', 'tooltip');\n\t\tthis.element.style.display = 'none';\n\t}\n\n\tshow(button: HTMLButtonElement): void {\n\t\tthis.hide();\n\n\t\tif (this.isPopupActive() || button.disabled) return;\n\n\t\tconst text: string | null = button.getAttribute('data-tooltip');\n\t\tif (!text) return;\n\n\t\tthis.target = button;\n\n\t\tthis.timer = setTimeout(() => {\n\t\t\tif (this.isPopupActive()) return;\n\n\t\t\tthis.element.textContent = text;\n\t\t\tthis.element.style.display = '';\n\n\t\t\tconst root: Node = button.getRootNode();\n\t\t\tif (root instanceof ShadowRoot && !this.element.parentNode) {\n\t\t\t\troot.appendChild(this.element);\n\t\t\t} else if (!(root instanceof ShadowRoot) && !this.element.parentNode) {\n\t\t\t\tdocument.body.appendChild(this.element);\n\t\t\t}\n\n\t\t\tbutton.setAttribute('aria-describedby', ToolbarTooltip.TOOLTIP_ID);\n\n\t\t\tconst rect: DOMRect = button.getBoundingClientRect();\n\t\t\tthis.element.style.position = 'fixed';\n\t\t\tthis.element.style.top = `${rect.bottom + 6}px`;\n\t\t\tthis.element.style.left = `${rect.left + rect.width / 2}px`;\n\t\t\tthis.element.style.transform = 'translateX(-50%)';\n\t\t}, TOOLTIP_DELAY_MS);\n\t}\n\n\thide(): void {\n\t\tif (this.timer) {\n\t\t\tclearTimeout(this.timer);\n\t\t\tthis.timer = null;\n\t\t}\n\t\tif (this.target) {\n\t\t\tthis.target.removeAttribute('aria-describedby');\n\t\t\tthis.target = null;\n\t\t}\n\t\tthis.element.style.display = 'none';\n\t}\n\n\tdestroy(): void {\n\t\tthis.hide();\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * Toolbar plugin: renders toolbar items registered by other plugins.\n * Acts as a pure rendering engine — has no knowledge of specific features.\n * Supports buttons, dropdowns, grid pickers, and custom popups.\n * Implements WAI-ARIA Toolbar pattern with roving tabindex.\n */\n\nimport { TOOLBAR_CSS } from '../../editor/styles/toolbar.js';\nimport { resolvePluginLocale } from '../../i18n/resolvePluginLocale.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { Transaction } from '../../state/Transaction.js';\nimport { ServiceKey } from '../Plugin.js';\nimport type { Plugin, PluginConfig, PluginContext } from '../Plugin.js';\nimport type { ToolbarItem } from './ToolbarItem.js';\nimport {\n\tapplyRovingTabindex,\n\tfindFirstEnabled,\n\tfindLastEnabled,\n\tfindNextEnabled,\n} from './ToolbarKeyboardNav.js';\nimport { TOOLBAR_LOCALES, type ToolbarLocale } from './ToolbarLocale.js';\nimport { ToolbarPopupController } from './ToolbarPopupController.js';\nimport { createSeparator } from './ToolbarRenderers.js';\nimport { ToolbarTooltip } from './ToolbarTooltip.js';\n\n// --- Layout Config ---\n\nexport interface ToolbarLayoutConfig {\n\treadonly groups: ReadonlyArray<ReadonlyArray<string>>;\n}\n\n// --- Typed Service API ---\n\nexport interface ToolbarServiceAPI {\n\t/** Re-reads isActive/isEnabled from state and updates all buttons. */\n\trefresh(): void;\n\t/** Closes the currently open popup, if any. */\n\tclosePopup(): void;\n}\n\nexport const ToolbarServiceKey = new ServiceKey<ToolbarServiceAPI>('toolbar');\n\n// --- Plugin ---\n\ninterface ToolbarButton {\n\telement: HTMLButtonElement;\n\titem: ToolbarItem;\n}\n\nexport class ToolbarPlugin implements Plugin {\n\treadonly id = 'toolbar';\n\treadonly name = 'Toolbar';\n\treadonly priority = 10;\n\n\tprivate context: PluginContext | null = null;\n\tprivate toolbarElement: HTMLElement | null = null;\n\tprivate buttons: ToolbarButton[] = [];\n\tprivate readonly hiddenItems = new Set<string>();\n\tprivate readonly layoutConfig: ToolbarLayoutConfig | null;\n\tprivate focusedIndex = 0;\n\tprivate tooltip: ToolbarTooltip | null = null;\n\tprivate popupController: ToolbarPopupController | null = null;\n\tprivate locale!: ToolbarLocale;\n\n\tconstructor(layoutConfig?: ToolbarLayoutConfig) {\n\t\tthis.layoutConfig = layoutConfig ?? null;\n\t}\n\n\tinit(context: PluginContext): void {\n\t\tthis.locale = resolvePluginLocale(TOOLBAR_LOCALES, context);\n\t\tcontext.registerStyleSheet(TOOLBAR_CSS);\n\t\tthis.context = context;\n\n\t\tthis.popupController = new ToolbarPopupController(() => this.getActiveElement());\n\t\tthis.tooltip = new ToolbarTooltip(() => this.popupController?.isOpen() ?? false);\n\n\t\tcontext.registerService(ToolbarServiceKey, {\n\t\t\trefresh: () => this.updateButtonStates(context.getState()),\n\t\t\tclosePopup: () => this.popupController?.close(),\n\t\t});\n\n\t\tthis.createToolbarElement();\n\t}\n\n\tonReady(): void {\n\t\tthis.renderItems();\n\t}\n\n\tdestroy(): void {\n\t\tthis.popupController?.destroy();\n\t\tthis.popupController = null;\n\t\tthis.tooltip?.destroy();\n\t\tthis.tooltip = null;\n\t\tif (this.toolbarElement) {\n\t\t\tthis.toolbarElement.remove();\n\t\t\tthis.toolbarElement = null;\n\t\t}\n\t\tthis.buttons = [];\n\t\tthis.context = null;\n\t}\n\n\tonStateChange(_oldState: EditorState, newState: EditorState, _tr: Transaction): void {\n\t\tthis.updateButtonStates(newState);\n\t}\n\n\tonConfigure(config: PluginConfig): void {\n\t\tfor (const [key, value] of Object.entries(config)) {\n\t\t\tif (value === false) {\n\t\t\t\tthis.hiddenItems.add(key);\n\t\t\t} else {\n\t\t\t\tthis.hiddenItems.delete(key);\n\t\t\t}\n\t\t}\n\t\tthis.renderItems();\n\t}\n\n\t// --- Toolbar ---\n\n\tprivate createToolbarElement(): void {\n\t\tif (!this.context) return;\n\n\t\tif (this.toolbarElement) {\n\t\t\tthis.toolbarElement.remove();\n\t\t}\n\t\tthis.buttons = [];\n\n\t\tconst container: HTMLElement = this.context.getPluginContainer('top');\n\t\tthis.toolbarElement = document.createElement('div');\n\t\tthis.toolbarElement.setAttribute('role', 'toolbar');\n\t\tthis.toolbarElement.setAttribute('aria-label', this.locale.formattingOptionsAria);\n\t\tthis.toolbarElement.setAttribute('data-notectl-no-print', '');\n\t\tthis.toolbarElement.className = 'notectl-toolbar';\n\n\t\tthis.toolbarElement.addEventListener('keydown', (e) => this.handleToolbarKeydown(e));\n\n\t\tcontainer.appendChild(this.toolbarElement);\n\t}\n\n\tprivate renderItems(): void {\n\t\tif (!this.context || !this.toolbarElement) return;\n\n\t\tfor (const btn of this.buttons) {\n\t\t\tbtn.element.remove();\n\t\t}\n\t\tthis.buttons = [];\n\n\t\tfor (const sep of this.toolbarElement.querySelectorAll('.notectl-toolbar-separator')) {\n\t\t\tsep.remove();\n\t\t}\n\n\t\tif (this.layoutConfig) {\n\t\t\tthis.renderItemsByLayout();\n\t\t} else {\n\t\t\tthis.renderItemsByPriority();\n\t\t}\n\n\t\tif (this.buttons.length > 0 && !this.toolbarElement.parentElement) {\n\t\t\tconst container: HTMLElement = this.context.getPluginContainer('top');\n\t\t\tcontainer.appendChild(this.toolbarElement);\n\t\t}\n\n\t\tthis.initRovingTabindex();\n\t\tthis.updateButtonStates(this.context.getState());\n\t}\n\n\t// --- Roving Tabindex ---\n\n\tprivate initRovingTabindex(): void {\n\t\tconst elements: HTMLButtonElement[] = this.buttons.map((b) => b.element);\n\t\tconst first: number = findFirstEnabled(elements);\n\t\tthis.focusedIndex = first >= 0 ? first : 0;\n\t\tapplyRovingTabindex(elements, this.focusedIndex);\n\t}\n\n\tprivate setRovingFocus(index: number): void {\n\t\tif (index < 0 || index >= this.buttons.length) return;\n\t\tthis.focusedIndex = index;\n\t\tconst elements: HTMLButtonElement[] = this.buttons.map((b) => b.element);\n\t\tapplyRovingTabindex(elements, index);\n\t\telements[index]?.focus();\n\t}\n\n\t/** Returns the active element, respecting shadow DOM boundaries. */\n\tprivate getActiveElement(): Element | null {\n\t\tconst root: Node | undefined = this.toolbarElement?.getRootNode();\n\t\tif (root instanceof ShadowRoot) {\n\t\t\treturn root.activeElement;\n\t\t}\n\t\treturn document.activeElement;\n\t}\n\n\tprivate syncFocusedIndex(): void {\n\t\tconst active: Element | null = this.getActiveElement();\n\t\tconst idx: number = this.buttons.findIndex((b) => b.element === active);\n\t\tif (idx >= 0) {\n\t\t\tthis.focusedIndex = idx;\n\t\t}\n\t}\n\n\t// --- Toolbar Keyboard ---\n\n\tprivate handleToolbarKeydown(e: KeyboardEvent): void {\n\t\tconst elements: HTMLButtonElement[] = this.buttons.map((b) => b.element);\n\t\tif (elements.length === 0) return;\n\n\t\tthis.syncFocusedIndex();\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowRight': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst next: number = findNextEnabled(elements, this.focusedIndex, 1);\n\t\t\t\tthis.setRovingFocus(next);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'ArrowLeft': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst prev: number = findNextEnabled(elements, this.focusedIndex, -1);\n\t\t\t\tthis.setRovingFocus(prev);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Home': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst first: number = findFirstEnabled(elements);\n\t\t\t\tif (first >= 0) this.setRovingFocus(first);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'End': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst last: number = findLastEnabled(elements);\n\t\t\t\tif (last >= 0) this.setRovingFocus(last);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst btn: ToolbarButton | undefined = this.buttons[this.focusedIndex];\n\t\t\t\tif (btn) this.activateButton(btn.element, btn.item);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Activates a toolbar button (shared between mouse click and keyboard). */\n\tprivate activateButton(btn: HTMLButtonElement, item: ToolbarItem): void {\n\t\tthis.tooltip?.hide();\n\t\tif (item.popupType && this.context) {\n\t\t\tthis.popupController?.toggle(btn, item, this.context);\n\t\t} else {\n\t\t\tthis.context?.executeCommand(item.command);\n\t\t}\n\t}\n\n\t// --- Layout Rendering ---\n\n\tprivate renderItemsByLayout(): void {\n\t\tif (!this.context || !this.toolbarElement || !this.layoutConfig) return;\n\n\t\tconst registry = this.context.getSchemaRegistry();\n\t\tlet firstGroup = true;\n\n\t\tfor (const groupPluginIds of this.layoutConfig.groups) {\n\t\t\tconst groupItems: ToolbarItem[] = [];\n\t\t\tfor (const pId of groupPluginIds) {\n\t\t\t\tconst items: ToolbarItem[] = registry\n\t\t\t\t\t.getToolbarItemsByPlugin(pId)\n\t\t\t\t\t.filter((item) => !this.hiddenItems.has(item.id));\n\t\t\t\titems.sort((a, b) => (a.priority ?? 100) - (b.priority ?? 100));\n\t\t\t\tgroupItems.push(...items);\n\t\t\t}\n\n\t\t\tif (groupItems.length === 0) continue;\n\n\t\t\tif (!firstGroup) {\n\t\t\t\tthis.toolbarElement.appendChild(createSeparator());\n\t\t\t}\n\t\t\tfirstGroup = false;\n\n\t\t\tfor (const item of groupItems) {\n\t\t\t\tconst btn: ToolbarButton = this.createButton(item);\n\t\t\t\tthis.toolbarElement.appendChild(btn.element);\n\t\t\t\tthis.buttons.push(btn);\n\t\t\t}\n\t\t}\n\n\t\tif (this.buttons.length === 0) {\n\t\t\tthis.toolbarElement.remove();\n\t\t}\n\t}\n\n\tprivate renderItemsByPriority(): void {\n\t\tif (!this.context || !this.toolbarElement) return;\n\n\t\tconst registry = this.context.getSchemaRegistry();\n\t\tconst items: ToolbarItem[] = registry\n\t\t\t.getToolbarItems()\n\t\t\t.filter((item) => !this.hiddenItems.has(item.id));\n\t\tif (items.length === 0) {\n\t\t\tthis.toolbarElement.remove();\n\t\t\treturn;\n\t\t}\n\n\t\tconst sorted: ToolbarItem[] = [...items].sort(\n\t\t\t(a, b) => (a.priority ?? 100) - (b.priority ?? 100),\n\t\t);\n\n\t\tconst hasSeparatorAfter: boolean = sorted.some((item) => item.separatorAfter);\n\n\t\tif (hasSeparatorAfter) {\n\t\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\t\tconst item: ToolbarItem | undefined = sorted[i];\n\t\t\t\tif (!item) continue;\n\t\t\t\tconst btn: ToolbarButton = this.createButton(item);\n\t\t\t\tthis.toolbarElement.appendChild(btn.element);\n\t\t\t\tthis.buttons.push(btn);\n\n\t\t\t\tif (item.separatorAfter && i < sorted.length - 1) {\n\t\t\t\t\tthis.toolbarElement.appendChild(createSeparator());\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst groups = new Map<string, ToolbarItem[]>();\n\t\t\tfor (const item of sorted) {\n\t\t\t\tconst list: ToolbarItem[] = groups.get(item.group) ?? [];\n\t\t\t\tlist.push(item);\n\t\t\t\tgroups.set(item.group, list);\n\t\t\t}\n\n\t\t\tlet firstGroup = true;\n\t\t\tfor (const [, groupItems] of groups) {\n\t\t\t\tif (!firstGroup) {\n\t\t\t\t\tthis.toolbarElement.appendChild(createSeparator());\n\t\t\t\t}\n\t\t\t\tfirstGroup = false;\n\n\t\t\t\tfor (const item of groupItems) {\n\t\t\t\t\tconst btn: ToolbarButton = this.createButton(item);\n\t\t\t\t\tthis.toolbarElement.appendChild(btn.element);\n\t\t\t\t\tthis.buttons.push(btn);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// --- Button Creation ---\n\n\tprivate createButton(item: ToolbarItem): ToolbarButton {\n\t\tconst btn: HTMLButtonElement = document.createElement('button');\n\t\tbtn.type = 'button';\n\t\tbtn.className = `notectl-toolbar-btn notectl-toolbar-btn--${item.id}`;\n\t\tbtn.setAttribute('aria-pressed', 'false');\n\t\tbtn.setAttribute('aria-label', item.label);\n\t\tbtn.setAttribute('data-toolbar-item', item.id);\n\t\tbtn.setAttribute('data-tooltip', item.tooltip ?? item.label);\n\n\t\tif (item.popupType) {\n\t\t\tbtn.setAttribute('aria-haspopup', 'true');\n\t\t\tbtn.setAttribute('aria-expanded', 'false');\n\t\t}\n\n\t\tconst span: HTMLSpanElement = document.createElement('span');\n\t\tspan.className = 'notectl-toolbar-btn__icon';\n\t\tspan.innerHTML = item.icon;\n\t\tbtn.appendChild(span);\n\n\t\tbtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\tthis.activateButton(btn, item);\n\t\t});\n\n\t\tbtn.addEventListener('mouseenter', () => this.tooltip?.show(btn));\n\t\tbtn.addEventListener('mouseleave', () => this.tooltip?.hide());\n\t\tbtn.addEventListener('focus', () => this.tooltip?.show(btn));\n\t\tbtn.addEventListener('blur', () => this.tooltip?.hide());\n\n\t\treturn { element: btn, item };\n\t}\n\n\t// --- Button State Updates ---\n\n\tprivate updateButtonStates(state: EditorState): void {\n\t\tfor (const btn of this.buttons) {\n\t\t\tconst active: boolean = btn.item.isActive?.(state) ?? false;\n\t\t\tconst enabled: boolean = btn.item.isEnabled?.(state) ?? true;\n\t\t\tbtn.element.setAttribute('aria-pressed', String(active));\n\t\t\tbtn.element.classList.toggle('notectl-toolbar-btn--active', active);\n\t\t\tbtn.element.disabled = !enabled;\n\t\t\tif (!enabled) {\n\t\t\t\tbtn.element.setAttribute('aria-disabled', 'true');\n\t\t\t} else {\n\t\t\t\tbtn.element.removeAttribute('aria-disabled');\n\t\t\t}\n\t\t}\n\t}\n}\n"],"names":["TOOLBAR_LOCALE_EN","formattingOptionsAria","TOOLBAR_LOCALES","en","de","es","fr","zh","ru","ar","hi","highlightCells","grid","targetRow","targetCol","cells","querySelectorAll","cell","r","Number","getAttribute","c","classList","toggle","createSeparator","sep","document","createElement","className","setAttribute","ToolbarPopupController","activePopup","activePopupButton","closePopupHandler","getActiveElement","this","isOpen","button","item","context","close","popup","popupType","container","config","onClose","style","display","gridTemplateColumns","maxCols","gap","padding","label","textContent","textAlign","fontSize","maxRows","width","height","border","cursor","String","addEventListener","e","preventDefault","stopPropagation","onSelect","appendChild","popupConfig","executeCommand","add","items","btn","type","icon","iconSpan","innerHTML","labelSpan","command","cmd","renderPopup","positionAndAppend","focusFirstItem","handlePopupKeydown","target","Node","contains","setTimeout","remove","removeEventListener","closeAndRestoreFocus","triggerBtn","focus","destroy","rect","getBoundingClientRect","position","top","bottom","left","zIndex","root","getRootNode","ShadowRoot","body","requestAnimationFrame","firstItem","querySelector","key","menuItems","length","handleDropdownKeydown","handleGridKeydown","handleCustomPopupKeydown","itemArr","Array","from","current","indexOf","next","findNextDropdownItem","prev","focused","click","row","col","lastCell","includes","newRow","newCol","navigateGrid","buttons","active","currentIdx","dispatchEvent","MouseEvent","bubbles","cancelable","ToolbarTooltip","element","timer","isPopupActive","static","id","TOOLTIP_ID","hide","disabled","text","parentNode","transform","clearTimeout","removeAttribute","ToolbarServiceKey","ServiceKey","ToolbarPlugin","name","priority","toolbarElement","hiddenItems","Set","layoutConfig","focusedIndex","tooltip","popupController","locale","resolvePluginLocale","registerStyleSheet","registerService","refresh","updateButtonStates","getState","closePopup","createToolbarElement","onReady","renderItems","_oldState","newState","_tr","value","Object","entries","delete","getPluginContainer","handleToolbarKeydown","renderItemsByLayout","renderItemsByPriority","parentElement","initRovingTabindex","elements","map","b","first","findFirstEnabled","applyRovingTabindex","index","activeElement","syncFocusedIndex","idx","findIndex","findNextEnabled","setRovingFocus","last","findLastEnabled","activateButton","registry","getSchemaRegistry","firstGroup","groupPluginIds","groups","groupItems","pId","getToolbarItemsByPlugin","filter","has","sort","a","push","createButton","getToolbarItems","sorted","some","separatorAfter","i","Map","list","get","group","set","span","show","state","isActive","enabled","isEnabled"],"mappings":"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"}