@notectl/core 1.0.6 → 1.0.8

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 (233) hide show
  1. package/README.md +78 -56
  2. package/custom-elements.json +344 -0
  3. package/dist/chunks/{AttrRegistry-DTsHyDVA.mjs → AttrRegistry-D-przlzb.mjs} +4 -4
  4. package/dist/chunks/{AttrRegistry-DTsHyDVA.mjs.map → AttrRegistry-D-przlzb.mjs.map} +1 -1
  5. package/dist/chunks/ColorNames-iaWsSZx1.mjs +35 -0
  6. package/dist/chunks/ColorNames-iaWsSZx1.mjs.map +1 -0
  7. package/dist/chunks/ColorValidation-Dyy4Bye8.mjs +140 -0
  8. package/dist/chunks/ColorValidation-Dyy4Bye8.mjs.map +1 -0
  9. package/dist/chunks/{Commands-DLP85Mp5.mjs → Commands-CSpSwGXv.mjs} +13 -13
  10. package/dist/chunks/{Commands-DLP85Mp5.mjs.map → Commands-CSpSwGXv.mjs.map} +1 -1
  11. package/dist/chunks/ToolbarKeyboardNav-B32OMv8r.mjs +46 -0
  12. package/dist/chunks/ToolbarKeyboardNav-B32OMv8r.mjs.map +1 -0
  13. package/dist/chunks/{ToolbarPlugin-sJTiZr-S.mjs → ToolbarPlugin-DY2xaJiu.mjs} +63 -93
  14. package/dist/chunks/ToolbarPlugin-DY2xaJiu.mjs.map +1 -0
  15. package/dist/chunks/index-BAk1EG1x.mjs +541 -0
  16. package/dist/chunks/index-BAk1EG1x.mjs.map +1 -0
  17. package/dist/chunks/index-BRYzYOYC.mjs +63 -0
  18. package/dist/chunks/index-BRYzYOYC.mjs.map +1 -0
  19. package/dist/chunks/index-BSFLNveF.mjs +953 -0
  20. package/dist/chunks/index-BSFLNveF.mjs.map +1 -0
  21. package/dist/chunks/index-BYgspns5.mjs +209 -0
  22. package/dist/chunks/index-BYgspns5.mjs.map +1 -0
  23. package/dist/chunks/index-B_3qDrUN.mjs +64 -0
  24. package/dist/chunks/index-B_3qDrUN.mjs.map +1 -0
  25. package/dist/chunks/index-Bsp4LC5t.mjs +130 -0
  26. package/dist/chunks/index-Bsp4LC5t.mjs.map +1 -0
  27. package/dist/chunks/index-C-YWHOcC.mjs +100 -0
  28. package/dist/chunks/index-C-YWHOcC.mjs.map +1 -0
  29. package/dist/chunks/index-C2GQoHot.mjs +92 -0
  30. package/dist/chunks/index-C2GQoHot.mjs.map +1 -0
  31. package/dist/chunks/index-CT3HGdQt.mjs +39 -0
  32. package/dist/chunks/index-CT3HGdQt.mjs.map +1 -0
  33. package/dist/chunks/index-Ct0ivLhO.mjs +407 -0
  34. package/dist/chunks/index-Ct0ivLhO.mjs.map +1 -0
  35. package/dist/chunks/index-CxiWyUho.mjs +191 -0
  36. package/dist/chunks/index-CxiWyUho.mjs.map +1 -0
  37. package/dist/chunks/index-D3CQWJiw.mjs +200 -0
  38. package/dist/chunks/index-D3CQWJiw.mjs.map +1 -0
  39. package/dist/chunks/index-DC1EK22F.mjs +41 -0
  40. package/dist/chunks/index-DC1EK22F.mjs.map +1 -0
  41. package/dist/chunks/index-Dh76rR13.mjs +196 -0
  42. package/dist/chunks/index-Dh76rR13.mjs.map +1 -0
  43. package/dist/chunks/index-o6hDR07y.mjs +41 -0
  44. package/dist/chunks/index-o6hDR07y.mjs.map +1 -0
  45. package/dist/chunks/index-uTnc9y7M.mjs +62 -0
  46. package/dist/chunks/index-uTnc9y7M.mjs.map +1 -0
  47. package/dist/chunks/resolvePluginLocale-B4w1OkPy.mjs +34 -0
  48. package/dist/chunks/resolvePluginLocale-B4w1OkPy.mjs.map +1 -0
  49. package/dist/editor/NotectlEditor.d.ts +10 -0
  50. package/dist/editor/NotectlEditor.d.ts.map +1 -1
  51. package/dist/editor/PaperLayoutController.d.ts +27 -0
  52. package/dist/editor/PaperLayoutController.d.ts.map +1 -0
  53. package/dist/editor/PaperSize.d.ts +35 -0
  54. package/dist/editor/PaperSize.d.ts.map +1 -0
  55. package/dist/editor/styles/color-picker.d.ts +1 -1
  56. package/dist/editor/styles/color-picker.d.ts.map +1 -1
  57. package/dist/editor/styles/paper.d.ts +3 -0
  58. package/dist/editor/styles/paper.d.ts.map +1 -0
  59. package/dist/editor/styles/table.d.ts +1 -1
  60. package/dist/editor/styles/table.d.ts.map +1 -1
  61. package/dist/editor/styles/toolbar.d.ts +1 -1
  62. package/dist/editor/styles/toolbar.d.ts.map +1 -1
  63. package/dist/editor/styles.d.ts.map +1 -1
  64. package/dist/i18n/Locale.d.ts +17 -0
  65. package/dist/i18n/Locale.d.ts.map +1 -0
  66. package/dist/i18n/LocaleService.d.ts +8 -0
  67. package/dist/i18n/LocaleService.d.ts.map +1 -0
  68. package/dist/i18n/index.d.ts +4 -0
  69. package/dist/i18n/index.d.ts.map +1 -0
  70. package/dist/i18n/resolvePluginLocale.d.ts +3 -0
  71. package/dist/i18n/resolvePluginLocale.d.ts.map +1 -0
  72. package/dist/index.d.ts +42 -0
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/input/ClipboardHandler.d.ts.map +1 -1
  75. package/dist/input/InputHandler.d.ts.map +1 -1
  76. package/dist/input/KeyboardHandler.d.ts.map +1 -1
  77. package/dist/input/PasteHandler.d.ts.map +1 -1
  78. package/dist/notectl-core.mjs +2126 -1952
  79. package/dist/notectl-core.mjs.map +1 -1
  80. package/dist/notectl-core.umd.js +2002 -1544
  81. package/dist/notectl-core.umd.js.map +1 -1
  82. package/dist/plugins/PluginManager.d.ts +5 -0
  83. package/dist/plugins/PluginManager.d.ts.map +1 -1
  84. package/dist/plugins/alignment/AlignmentLocale.d.ts +19 -0
  85. package/dist/plugins/alignment/AlignmentLocale.d.ts.map +1 -0
  86. package/dist/plugins/alignment/AlignmentPlugin.d.ts +4 -0
  87. package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -1
  88. package/dist/plugins/alignment.mjs +3 -89
  89. package/dist/plugins/alignment.mjs.map +1 -1
  90. package/dist/plugins/blockquote/BlockquoteLocale.d.ts +17 -0
  91. package/dist/plugins/blockquote/BlockquoteLocale.d.ts.map +1 -0
  92. package/dist/plugins/blockquote/BlockquotePlugin.d.ts +3 -0
  93. package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -1
  94. package/dist/plugins/blockquote.mjs +2 -55
  95. package/dist/plugins/blockquote.mjs.map +1 -1
  96. package/dist/plugins/code-block/CodeBlockLocale.d.ts +17 -0
  97. package/dist/plugins/code-block/CodeBlockLocale.d.ts.map +1 -0
  98. package/dist/plugins/code-block/CodeBlockPlugin.d.ts +1 -0
  99. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
  100. package/dist/plugins/code-block/CodeBlockTypes.d.ts +2 -0
  101. package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -1
  102. package/dist/plugins/code-block.mjs +3 -3
  103. package/dist/plugins/font/FontLocale.d.ts +15 -0
  104. package/dist/plugins/font/FontLocale.d.ts.map +1 -0
  105. package/dist/plugins/font/FontPlugin.d.ts +3 -0
  106. package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
  107. package/dist/plugins/font-size/FontSizeLocale.d.ts +17 -0
  108. package/dist/plugins/font-size/FontSizeLocale.d.ts.map +1 -0
  109. package/dist/plugins/font-size/FontSizePlugin.d.ts +3 -0
  110. package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -1
  111. package/dist/plugins/font-size/FontSizePopup.d.ts +2 -0
  112. package/dist/plugins/font-size/FontSizePopup.d.ts.map +1 -1
  113. package/dist/plugins/font-size.mjs +2 -201
  114. package/dist/plugins/font-size.mjs.map +1 -1
  115. package/dist/plugins/font.mjs +2 -183
  116. package/dist/plugins/font.mjs.map +1 -1
  117. package/dist/plugins/hard-break.mjs +1 -1
  118. package/dist/plugins/heading/HeadingLocale.d.ts +26 -0
  119. package/dist/plugins/heading/HeadingLocale.d.ts.map +1 -0
  120. package/dist/plugins/heading/HeadingPlugin.d.ts +4 -0
  121. package/dist/plugins/heading/HeadingPlugin.d.ts.map +1 -1
  122. package/dist/plugins/heading.mjs +1 -184
  123. package/dist/plugins/heading.mjs.map +1 -1
  124. package/dist/plugins/highlight/HighlightLocale.d.ts +17 -0
  125. package/dist/plugins/highlight/HighlightLocale.d.ts.map +1 -0
  126. package/dist/plugins/highlight/HighlightPlugin.d.ts +3 -5
  127. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
  128. package/dist/plugins/highlight.mjs +2 -123
  129. package/dist/plugins/highlight.mjs.map +1 -1
  130. package/dist/plugins/horizontal-rule/HorizontalRuleLocale.d.ts +15 -0
  131. package/dist/plugins/horizontal-rule/HorizontalRuleLocale.d.ts.map +1 -0
  132. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts +4 -0
  133. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
  134. package/dist/plugins/horizontal-rule.mjs +2 -56
  135. package/dist/plugins/horizontal-rule.mjs.map +1 -1
  136. package/dist/plugins/image/ImageLocale.d.ts +25 -0
  137. package/dist/plugins/image/ImageLocale.d.ts.map +1 -0
  138. package/dist/plugins/image/ImagePlugin.d.ts +1 -0
  139. package/dist/plugins/image/ImagePlugin.d.ts.map +1 -1
  140. package/dist/plugins/image/ImageUpload.d.ts +3 -0
  141. package/dist/plugins/image/ImageUpload.d.ts.map +1 -1
  142. package/dist/plugins/image.mjs +4 -378
  143. package/dist/plugins/image.mjs.map +1 -1
  144. package/dist/plugins/link/LinkLocale.d.ts +23 -0
  145. package/dist/plugins/link/LinkLocale.d.ts.map +1 -0
  146. package/dist/plugins/link/LinkPlugin.d.ts +3 -0
  147. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
  148. package/dist/plugins/link.mjs +2 -124
  149. package/dist/plugins/link.mjs.map +1 -1
  150. package/dist/plugins/list/ListLocale.d.ts +18 -0
  151. package/dist/plugins/list/ListLocale.d.ts.map +1 -0
  152. package/dist/plugins/list/ListPlugin.d.ts +4 -0
  153. package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
  154. package/dist/plugins/list.mjs +2 -190
  155. package/dist/plugins/list.mjs.map +1 -1
  156. package/dist/plugins/print/PrintLocale.d.ts +16 -0
  157. package/dist/plugins/print/PrintLocale.d.ts.map +1 -0
  158. package/dist/plugins/print/PrintPlugin.d.ts +1 -0
  159. package/dist/plugins/print/PrintPlugin.d.ts.map +1 -1
  160. package/dist/plugins/print/PrintStyleCollector.d.ts +7 -0
  161. package/dist/plugins/print/PrintStyleCollector.d.ts.map +1 -1
  162. package/dist/plugins/print/PrintTypes.d.ts +5 -0
  163. package/dist/plugins/print/PrintTypes.d.ts.map +1 -1
  164. package/dist/plugins/shared/ColorMarkOperations.d.ts +28 -0
  165. package/dist/plugins/shared/ColorMarkOperations.d.ts.map +1 -0
  166. package/dist/plugins/shared/ColorNames.d.ts +22 -0
  167. package/dist/plugins/shared/ColorNames.d.ts.map +1 -0
  168. package/dist/plugins/shared/ColorPickerPopup.d.ts +31 -0
  169. package/dist/plugins/shared/ColorPickerPopup.d.ts.map +1 -0
  170. package/dist/plugins/shared/ColorValidation.d.ts +14 -0
  171. package/dist/plugins/shared/ColorValidation.d.ts.map +1 -0
  172. package/dist/plugins/strikethrough/StrikethroughLocale.d.ts +17 -0
  173. package/dist/plugins/strikethrough/StrikethroughLocale.d.ts.map +1 -0
  174. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts +3 -0
  175. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -1
  176. package/dist/plugins/strikethrough.mjs +2 -32
  177. package/dist/plugins/strikethrough.mjs.map +1 -1
  178. package/dist/plugins/super-sub/SuperSubLocale.d.ts +19 -0
  179. package/dist/plugins/super-sub/SuperSubLocale.d.ts.map +1 -0
  180. package/dist/plugins/super-sub/SuperSubPlugin.d.ts +3 -0
  181. package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -1
  182. package/dist/plugins/super-sub.mjs +2 -78
  183. package/dist/plugins/super-sub.mjs.map +1 -1
  184. package/dist/plugins/table/TableBorderColor.d.ts +24 -0
  185. package/dist/plugins/table/TableBorderColor.d.ts.map +1 -0
  186. package/dist/plugins/table/TableCommands.d.ts +9 -8
  187. package/dist/plugins/table/TableCommands.d.ts.map +1 -1
  188. package/dist/plugins/table/TableContextMenu.d.ts +14 -0
  189. package/dist/plugins/table/TableContextMenu.d.ts.map +1 -0
  190. package/dist/plugins/table/TableControls.d.ts +3 -1
  191. package/dist/plugins/table/TableControls.d.ts.map +1 -1
  192. package/dist/plugins/table/TableControlsDOM.d.ts +13 -1
  193. package/dist/plugins/table/TableControlsDOM.d.ts.map +1 -1
  194. package/dist/plugins/table/TableLocale.d.ts +48 -0
  195. package/dist/plugins/table/TableLocale.d.ts.map +1 -0
  196. package/dist/plugins/table/TableNavigation.d.ts +2 -1
  197. package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
  198. package/dist/plugins/table/TableNodeViews.d.ts +3 -1
  199. package/dist/plugins/table/TableNodeViews.d.ts.map +1 -1
  200. package/dist/plugins/table/TablePlugin.d.ts +7 -1
  201. package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
  202. package/dist/plugins/table/index.d.ts +3 -0
  203. package/dist/plugins/table/index.d.ts.map +1 -1
  204. package/dist/plugins/table.mjs +18 -660
  205. package/dist/plugins/table.mjs.map +1 -1
  206. package/dist/plugins/text-color/TextColorLocale.d.ts +17 -0
  207. package/dist/plugins/text-color/TextColorLocale.d.ts.map +1 -0
  208. package/dist/plugins/text-color/TextColorPlugin.d.ts +3 -5
  209. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
  210. package/dist/plugins/text-color.mjs +2 -123
  211. package/dist/plugins/text-color.mjs.map +1 -1
  212. package/dist/plugins/text-formatting/TextFormattingLocale.d.ts +18 -0
  213. package/dist/plugins/text-formatting/TextFormattingLocale.d.ts.map +1 -0
  214. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts +4 -0
  215. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -1
  216. package/dist/plugins/text-formatting.mjs +2 -49
  217. package/dist/plugins/text-formatting.mjs.map +1 -1
  218. package/dist/plugins/toolbar/ToolbarLocale.d.ts +14 -0
  219. package/dist/plugins/toolbar/ToolbarLocale.d.ts.map +1 -0
  220. package/dist/plugins/toolbar/ToolbarPlugin.d.ts +1 -0
  221. package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -1
  222. package/dist/plugins/toolbar.mjs +1 -1
  223. package/dist/state/EditorState.d.ts +4 -1
  224. package/dist/state/EditorState.d.ts.map +1 -1
  225. package/dist/view/EditorView.d.ts.map +1 -1
  226. package/package.json +3 -2
  227. package/dist/chunks/Plugin-B9OZ6Y4c.mjs +0 -15
  228. package/dist/chunks/Plugin-B9OZ6Y4c.mjs.map +0 -1
  229. package/dist/chunks/ToolbarPlugin-sJTiZr-S.mjs.map +0 -1
  230. package/dist/chunks/color-picker-Csf0wx5a.mjs +0 -5
  231. package/dist/chunks/color-picker-Csf0wx5a.mjs.map +0 -1
  232. package/dist/chunks/index-QvKiO9_4.mjs +0 -538
  233. package/dist/chunks/index-QvKiO9_4.mjs.map +0 -1
@@ -1,37 +1,18 @@
1
- import { S as t } from "./Plugin-B9OZ6Y4c.mjs";
2
- function e(t2, e2, n2) {
3
- const o2 = t2.length;
4
- if (0 === o2) return -1;
5
- let i2 = e2;
6
- for (let e3 = 0; e3 < o2; e3++) if (i2 = (i2 + n2 + o2) % o2, !t2[i2]?.disabled) return i2;
7
- return e2;
8
- }
9
- function n(t2) {
10
- for (let e2 = 0; e2 < t2.length; e2++) if (!t2[e2]?.disabled) return e2;
11
- return -1;
12
- }
13
- function o(t2, e2) {
14
- for (let n2 = 0; n2 < t2.length; n2++) {
15
- const o2 = t2[n2];
16
- o2 && o2.setAttribute("tabindex", n2 === e2 ? "0" : "-1");
17
- }
18
- }
19
- function i(t2, e2, n2) {
20
- const o2 = t2.length;
21
- return 0 === o2 ? -1 : (e2 + n2 + o2) % o2;
22
- }
23
- function r(t2, e2, n2) {
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) {
24
5
  const o2 = t2.querySelectorAll(".notectl-grid-picker__cell");
25
6
  for (const t3 of o2) {
26
7
  const o3 = Number(t3.getAttribute("data-row")), i2 = Number(t3.getAttribute("data-col"));
27
8
  t3.classList.toggle("notectl-grid-picker__cell--highlighted", o3 <= e2 && i2 <= n2);
28
9
  }
29
10
  }
30
- function s() {
11
+ function p() {
31
12
  const t2 = document.createElement("span");
32
13
  return t2.className = "notectl-toolbar-separator", t2.setAttribute("role", "separator"), t2;
33
14
  }
34
- class l {
15
+ class u {
35
16
  activePopup = null;
36
17
  activePopupButton = null;
37
18
  closePopupHandler = null;
@@ -53,15 +34,15 @@ class l {
53
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";
54
35
  const i2 = document.createElement("div");
55
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");
56
- for (let t4 = 1; t4 <= e3.maxRows; t4++) for (let s2 = 1; s2 <= e3.maxCols; s2++) {
57
- const l2 = document.createElement("div");
58
- l2.className = "notectl-grid-picker__cell", l2.setAttribute("role", "gridcell"), l2.setAttribute("tabindex", "-1"), l2.setAttribute("aria-label", `${t4} x ${s2}`), l2.style.width = "20px", l2.style.height = "20px", l2.style.border = "1px solid #ccc", l2.style.cursor = "pointer", l2.setAttribute("data-row", String(t4)), l2.setAttribute("data-col", String(s2)), l2.addEventListener("mouseenter", () => {
59
- r(o3, t4, s2), i2.textContent = `${t4} x ${s2}`;
60
- }), l2.addEventListener("mousedown", (o4) => {
61
- o4.preventDefault(), o4.stopPropagation(), e3.onSelect(t4, s2), n3();
62
- }), l2.addEventListener("click", () => {
63
- e3.onSelect(t4, s2), n3();
64
- }), o3.appendChild(l2);
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);
65
46
  }
66
47
  t3.appendChild(o3), t3.appendChild(i2);
67
48
  })(o2, e2.popupConfig, () => this.close());
@@ -124,50 +105,39 @@ class l {
124
105
  e2.length > 0 ? this.handleDropdownKeydown(t2, e2) : null !== this.activePopup.querySelector(".notectl-grid-picker__cell") ? this.handleGridKeydown(t2) : this.handleCustomPopupKeydown(t2);
125
106
  }
126
107
  handleDropdownKeydown(t2, e2) {
127
- const n2 = Array.from(e2), o2 = n2.indexOf(this.getActiveElement());
108
+ const o2 = Array.from(e2), i2 = o2.indexOf(this.getActiveElement());
128
109
  switch (t2.key) {
129
110
  case "ArrowDown": {
130
111
  t2.preventDefault();
131
- const e3 = i(n2, o2, 1);
132
- n2[e3]?.focus();
112
+ const e3 = n(o2, i2, 1);
113
+ o2[e3]?.focus();
133
114
  break;
134
115
  }
135
116
  case "ArrowUp": {
136
117
  t2.preventDefault();
137
- const e3 = i(n2, o2, -1);
138
- n2[e3]?.focus();
118
+ const e3 = n(o2, i2, -1);
119
+ o2[e3]?.focus();
139
120
  break;
140
121
  }
141
122
  case "Enter":
142
123
  case " ": {
143
124
  t2.preventDefault();
144
- const e3 = n2[o2];
125
+ const e3 = o2[i2];
145
126
  e3 && e3.click();
146
127
  break;
147
128
  }
148
129
  }
149
130
  }
150
131
  handleGridKeydown(t2) {
151
- const e2 = this.getActiveElement(), n2 = Number(e2?.getAttribute("data-row") ?? 1), o2 = Number(e2?.getAttribute("data-col") ?? 1), i2 = this.activePopup?.querySelector(".notectl-grid-picker__grid") ?? null;
152
- if (!i2) return;
153
- const s2 = i2.querySelector(".notectl-grid-picker__cell:last-child"), l2 = Number(s2?.getAttribute("data-col") ?? 1), a2 = Number(s2?.getAttribute("data-row") ?? 1);
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);
154
135
  if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(t2.key)) {
155
136
  t2.preventDefault();
156
- const [e3, s3] = (function(t3, e4, n3, o3, i3) {
157
- switch (i3) {
158
- case "ArrowUp":
159
- return [t3 > 1 ? t3 - 1 : n3, e4];
160
- case "ArrowDown":
161
- return [t3 < n3 ? t3 + 1 : 1, e4];
162
- case "ArrowLeft":
163
- return [t3, e4 > 1 ? e4 - 1 : o3];
164
- case "ArrowRight":
165
- return [t3, e4 < o3 ? e4 + 1 : 1];
166
- }
167
- })(n2, o2, a2, l2, t2.key), c2 = i2.querySelector(`.notectl-grid-picker__cell[data-row="${e3}"][data-col="${s3}"]`);
168
- c2?.focus(), r(i2, e3, s3);
169
- const d2 = this.activePopup?.querySelector(".notectl-grid-picker__label") ?? null;
170
- d2 && (d2.textContent = `${e3} x ${s3}`);
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}`);
171
141
  }
172
142
  "Enter" !== t2.key && " " !== t2.key || (t2.preventDefault(), e2?.click());
173
143
  }
@@ -175,34 +145,34 @@ class l {
175
145
  if (!this.activePopup) return;
176
146
  const e2 = Array.from(this.activePopup.querySelectorAll("button"));
177
147
  if (0 === e2.length) return;
178
- const n2 = this.getActiveElement(), o2 = e2.indexOf(n2);
148
+ const o2 = this.getActiveElement(), i2 = e2.indexOf(o2);
179
149
  switch (t2.key) {
180
150
  case "ArrowDown": {
181
151
  t2.preventDefault();
182
- const n3 = i(e2, o2, 1);
183
- e2[n3]?.focus();
152
+ const o3 = n(e2, i2, 1);
153
+ e2[o3]?.focus();
184
154
  break;
185
155
  }
186
156
  case "ArrowUp": {
187
157
  t2.preventDefault();
188
- const n3 = i(e2, o2, -1);
189
- e2[n3]?.focus();
158
+ const o3 = n(e2, i2, -1);
159
+ e2[o3]?.focus();
190
160
  break;
191
161
  }
192
162
  case "Enter":
193
163
  case " ":
194
- t2.preventDefault(), n2 && n2.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, cancelable: true }));
164
+ t2.preventDefault(), o2 && o2.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, cancelable: true }));
195
165
  }
196
166
  }
197
167
  }
198
- class a {
168
+ class h {
199
169
  element;
200
170
  timer = null;
201
171
  target = null;
202
172
  isPopupActive;
203
173
  static TOOLTIP_ID = "notectl-toolbar-tooltip";
204
174
  constructor(t2) {
205
- this.isPopupActive = t2, this.element = document.createElement("div"), this.element.className = "notectl-toolbar-tooltip", this.element.id = a.TOOLTIP_ID, this.element.setAttribute("role", "tooltip"), this.element.style.display = "none";
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";
206
176
  }
207
177
  show(t2) {
208
178
  if (this.hide(), this.isPopupActive() || t2.disabled) return;
@@ -211,7 +181,7 @@ class a {
211
181
  if (this.isPopupActive()) return;
212
182
  this.element.textContent = e2, this.element.style.display = "";
213
183
  const n2 = t2.getRootNode();
214
- 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", a.TOOLTIP_ID);
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);
215
185
  const o2 = t2.getBoundingClientRect();
216
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%)";
217
187
  }, 500));
@@ -223,8 +193,8 @@ class a {
223
193
  this.hide(), this.element.remove();
224
194
  }
225
195
  }
226
- const c = new t("toolbar");
227
- class d {
196
+ const m = new t("toolbar");
197
+ class b {
228
198
  id = "toolbar";
229
199
  name = "Toolbar";
230
200
  priority = 10;
@@ -236,11 +206,12 @@ class d {
236
206
  focusedIndex = 0;
237
207
  tooltip = null;
238
208
  popupController = null;
209
+ locale;
239
210
  constructor(t2) {
240
211
  this.layoutConfig = t2 ?? null;
241
212
  }
242
213
  init(t2) {
243
- 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/* 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 l(() => this.getActiveElement()), this.tooltip = new a(() => this.popupController?.isOpen() ?? false), t2.registerService(c, { refresh: () => this.updateButtonStates(t2.getState()), closePopup: () => this.popupController?.close() }), this.createToolbarElement();
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();
244
215
  }
245
216
  onReady() {
246
217
  this.renderItems();
@@ -259,7 +230,7 @@ class d {
259
230
  if (!this.context) return;
260
231
  this.toolbarElement && this.toolbarElement.remove(), this.buttons = [];
261
232
  const t2 = this.context.getPluginContainer("top");
262
- this.toolbarElement = document.createElement("div"), this.toolbarElement.setAttribute("role", "toolbar"), this.toolbarElement.setAttribute("aria-label", "Formatting options"), this.toolbarElement.setAttribute("data-notectl-no-print", ""), this.toolbarElement.className = "notectl-toolbar", this.toolbarElement.addEventListener("keydown", (t3) => this.handleToolbarKeydown(t3)), t2.appendChild(this.toolbarElement);
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);
263
234
  }
264
235
  renderItems() {
265
236
  if (this.context && this.toolbarElement) {
@@ -270,14 +241,14 @@ class d {
270
241
  }
271
242
  }
272
243
  initRovingTabindex() {
273
- const t2 = this.buttons.map((t3) => t3.element), e2 = n(t2);
274
- this.focusedIndex = e2 >= 0 ? e2 : 0, o(t2, this.focusedIndex);
244
+ const t2 = this.buttons.map((t3) => t3.element), e2 = i(t2);
245
+ this.focusedIndex = e2 >= 0 ? e2 : 0, r(t2, this.focusedIndex);
275
246
  }
276
247
  setRovingFocus(t2) {
277
248
  if (t2 < 0 || t2 >= this.buttons.length) return;
278
249
  this.focusedIndex = t2;
279
250
  const e2 = this.buttons.map((t3) => t3.element);
280
- o(e2, t2), e2[t2]?.focus();
251
+ r(e2, t2), e2[t2]?.focus();
281
252
  }
282
253
  getActiveElement() {
283
254
  const t2 = this.toolbarElement?.getRootNode();
@@ -288,40 +259,37 @@ class d {
288
259
  e2 >= 0 && (this.focusedIndex = e2);
289
260
  }
290
261
  handleToolbarKeydown(t2) {
291
- const o2 = this.buttons.map((t3) => t3.element);
292
- if (0 !== o2.length) switch (this.syncFocusedIndex(), t2.key) {
262
+ const e2 = this.buttons.map((t3) => t3.element);
263
+ if (0 !== e2.length) switch (this.syncFocusedIndex(), t2.key) {
293
264
  case "ArrowRight": {
294
265
  t2.preventDefault();
295
- const n2 = e(o2, this.focusedIndex, 1);
266
+ const n2 = l(e2, this.focusedIndex, 1);
296
267
  this.setRovingFocus(n2);
297
268
  break;
298
269
  }
299
270
  case "ArrowLeft": {
300
271
  t2.preventDefault();
301
- const n2 = e(o2, this.focusedIndex, -1);
272
+ const n2 = l(e2, this.focusedIndex, -1);
302
273
  this.setRovingFocus(n2);
303
274
  break;
304
275
  }
305
276
  case "Home": {
306
277
  t2.preventDefault();
307
- const e2 = n(o2);
308
- e2 >= 0 && this.setRovingFocus(e2);
278
+ const n2 = i(e2);
279
+ n2 >= 0 && this.setRovingFocus(n2);
309
280
  break;
310
281
  }
311
282
  case "End": {
312
283
  t2.preventDefault();
313
- const e2 = (function(t3) {
314
- for (let e3 = t3.length - 1; e3 >= 0; e3--) if (!t3[e3]?.disabled) return e3;
315
- return -1;
316
- })(o2);
317
- e2 >= 0 && this.setRovingFocus(e2);
284
+ const n2 = s(e2);
285
+ n2 >= 0 && this.setRovingFocus(n2);
318
286
  break;
319
287
  }
320
288
  case "Enter":
321
289
  case " ": {
322
290
  t2.preventDefault();
323
- const e2 = this.buttons[this.focusedIndex];
324
- e2 && this.activateButton(e2.element, e2.item);
291
+ const e3 = this.buttons[this.focusedIndex];
292
+ e3 && this.activateButton(e3.element, e3.item);
325
293
  break;
326
294
  }
327
295
  }
@@ -340,7 +308,7 @@ class d {
340
308
  n3.sort((t3, e4) => (t3.priority ?? 100) - (e4.priority ?? 100)), o2.push(...n3);
341
309
  }
342
310
  if (0 !== o2.length) {
343
- e2 || this.toolbarElement.appendChild(s()), e2 = false;
311
+ e2 || this.toolbarElement.appendChild(p()), e2 = false;
344
312
  for (const t3 of o2) {
345
313
  const e3 = this.createButton(t3);
346
314
  this.toolbarElement.appendChild(e3.element), this.buttons.push(e3);
@@ -358,7 +326,7 @@ class d {
358
326
  const n2 = e2[t3];
359
327
  if (!n2) continue;
360
328
  const o2 = this.createButton(n2);
361
- this.toolbarElement.appendChild(o2.element), this.buttons.push(o2), n2.separatorAfter && t3 < e2.length - 1 && this.toolbarElement.appendChild(s());
329
+ this.toolbarElement.appendChild(o2.element), this.buttons.push(o2), n2.separatorAfter && t3 < e2.length - 1 && this.toolbarElement.appendChild(p());
362
330
  }
363
331
  else {
364
332
  const t3 = /* @__PURE__ */ new Map();
@@ -368,7 +336,7 @@ class d {
368
336
  }
369
337
  let n2 = true;
370
338
  for (const [, e3] of t3) {
371
- n2 || this.toolbarElement.appendChild(s()), n2 = false;
339
+ n2 || this.toolbarElement.appendChild(p()), n2 = false;
372
340
  for (const t4 of e3) {
373
341
  const e4 = this.createButton(t4);
374
342
  this.toolbarElement.appendChild(e4.element), this.buttons.push(e4);
@@ -392,7 +360,9 @@ class d {
392
360
  }
393
361
  }
394
362
  export {
395
- d as T,
396
- c as a
363
+ b as T,
364
+ m as a,
365
+ c as b,
366
+ a as c
397
367
  };
398
- //# sourceMappingURL=ToolbarPlugin-sJTiZr-S.mjs.map
368
+ //# sourceMappingURL=ToolbarPlugin-DY2xaJiu.mjs.map
@@ -0,0 +1 @@
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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"}