@notectl/core 1.0.3 → 1.0.5

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 (312) hide show
  1. package/README.md +51 -148
  2. package/dist/chunks/AttrRegistry-DTsHyDVA.mjs +16 -0
  3. package/dist/chunks/AttrRegistry-DTsHyDVA.mjs.map +1 -0
  4. package/dist/chunks/Commands-DLP85Mp5.mjs +461 -0
  5. package/dist/chunks/Commands-DLP85Mp5.mjs.map +1 -0
  6. package/dist/chunks/Document-CI3iCwEP.mjs +177 -0
  7. package/dist/chunks/Document-CI3iCwEP.mjs.map +1 -0
  8. package/dist/chunks/HTMLUtils-0wvCRvJc.mjs +7 -0
  9. package/dist/chunks/HTMLUtils-0wvCRvJc.mjs.map +1 -0
  10. package/dist/chunks/NodeResolver-D68ZLXti.mjs +81 -0
  11. package/dist/chunks/NodeResolver-D68ZLXti.mjs.map +1 -0
  12. package/dist/chunks/NodeSpec-NZVvcCuH.mjs +8 -0
  13. package/dist/chunks/NodeSpec-NZVvcCuH.mjs.map +1 -0
  14. package/dist/chunks/Plugin-B9OZ6Y4c.mjs +15 -0
  15. package/dist/chunks/Plugin-B9OZ6Y4c.mjs.map +1 -0
  16. package/dist/chunks/Selection-D5ZjXoB7.mjs +44 -0
  17. package/dist/chunks/Selection-D5ZjXoB7.mjs.map +1 -0
  18. package/dist/chunks/ToolbarItem-ugDymuXi.mjs +7 -0
  19. package/dist/chunks/ToolbarItem-ugDymuXi.mjs.map +1 -0
  20. package/dist/chunks/ToolbarPlugin-D5VqeBPT.mjs +398 -0
  21. package/dist/chunks/ToolbarPlugin-D5VqeBPT.mjs.map +1 -0
  22. package/dist/chunks/TypeBrands-C09nE2qO.mjs +27 -0
  23. package/dist/chunks/TypeBrands-C09nE2qO.mjs.map +1 -0
  24. package/dist/chunks/color-picker-Csf0wx5a.mjs +5 -0
  25. package/dist/chunks/color-picker-Csf0wx5a.mjs.map +1 -0
  26. package/dist/chunks/index-CPPb-Jah.mjs +569 -0
  27. package/dist/chunks/index-CPPb-Jah.mjs.map +1 -0
  28. package/dist/commands/Commands.d.ts +71 -0
  29. package/dist/commands/Commands.d.ts.map +1 -0
  30. package/dist/commands/PasteCommand.d.ts +9 -0
  31. package/dist/commands/PasteCommand.d.ts.map +1 -0
  32. package/dist/decorations/Decoration.d.ts +76 -0
  33. package/dist/decorations/Decoration.d.ts.map +1 -0
  34. package/dist/decorations/PositionMapping.d.ts +9 -0
  35. package/dist/decorations/PositionMapping.d.ts.map +1 -0
  36. package/dist/editor/Announcer.d.ts +12 -0
  37. package/dist/editor/Announcer.d.ts.map +1 -0
  38. package/dist/editor/DocumentParser.d.ts +5 -0
  39. package/dist/editor/DocumentParser.d.ts.map +1 -0
  40. package/dist/editor/DocumentSerializer.d.ts +5 -0
  41. package/dist/editor/DocumentSerializer.d.ts.map +1 -0
  42. package/dist/editor/EditorDOM.d.ts +18 -0
  43. package/dist/editor/EditorDOM.d.ts.map +1 -0
  44. package/dist/editor/EditorThemeController.d.ts +21 -0
  45. package/dist/editor/EditorThemeController.d.ts.map +1 -0
  46. package/dist/editor/NotectlEditor.d.ts +131 -0
  47. package/dist/editor/NotectlEditor.d.ts.map +1 -0
  48. package/dist/editor/styles/base.d.ts +3 -0
  49. package/dist/editor/styles/base.d.ts.map +1 -0
  50. package/dist/editor/styles/code-block.d.ts +3 -0
  51. package/dist/editor/styles/code-block.d.ts.map +1 -0
  52. package/dist/editor/styles/color-picker.d.ts +3 -0
  53. package/dist/editor/styles/color-picker.d.ts.map +1 -0
  54. package/dist/editor/styles/font-select.d.ts +3 -0
  55. package/dist/editor/styles/font-select.d.ts.map +1 -0
  56. package/dist/editor/styles/font-size-select.d.ts +3 -0
  57. package/dist/editor/styles/font-size-select.d.ts.map +1 -0
  58. package/dist/editor/styles/heading-select.d.ts +3 -0
  59. package/dist/editor/styles/heading-select.d.ts.map +1 -0
  60. package/dist/editor/styles/image.d.ts +3 -0
  61. package/dist/editor/styles/image.d.ts.map +1 -0
  62. package/dist/editor/styles/list.d.ts +3 -0
  63. package/dist/editor/styles/list.d.ts.map +1 -0
  64. package/dist/editor/styles/reduced-motion.d.ts +3 -0
  65. package/dist/editor/styles/reduced-motion.d.ts.map +1 -0
  66. package/dist/editor/styles/table.d.ts +3 -0
  67. package/dist/editor/styles/table.d.ts.map +1 -0
  68. package/dist/editor/styles/toolbar.d.ts +3 -0
  69. package/dist/editor/styles/toolbar.d.ts.map +1 -0
  70. package/dist/editor/styles.d.ts +12 -0
  71. package/dist/editor/styles.d.ts.map +1 -0
  72. package/dist/editor/theme/ThemeEngine.d.ts +6 -0
  73. package/dist/editor/theme/ThemeEngine.d.ts.map +1 -0
  74. package/dist/editor/theme/ThemeTokens.d.ts +73 -0
  75. package/dist/editor/theme/ThemeTokens.d.ts.map +1 -0
  76. package/dist/fonts.d.ts +17 -0
  77. package/dist/fonts.d.ts.map +1 -0
  78. package/dist/fonts.mjs +7 -0
  79. package/dist/fonts.mjs.map +1 -0
  80. package/dist/index.d.ts +81 -2360
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/input/ClipboardHandler.d.ts +29 -0
  83. package/dist/input/ClipboardHandler.d.ts.map +1 -0
  84. package/dist/input/InputHandler.d.ts +32 -0
  85. package/dist/input/InputHandler.d.ts.map +1 -0
  86. package/dist/input/InputRule.d.ts +9 -0
  87. package/dist/input/InputRule.d.ts.map +1 -0
  88. package/dist/input/InternalClipboard.d.ts +23 -0
  89. package/dist/input/InternalClipboard.d.ts.map +1 -0
  90. package/dist/input/KeyboardHandler.d.ts +42 -0
  91. package/dist/input/KeyboardHandler.d.ts.map +1 -0
  92. package/dist/input/Keymap.d.ts +11 -0
  93. package/dist/input/Keymap.d.ts.map +1 -0
  94. package/dist/input/PasteHandler.d.ts +38 -0
  95. package/dist/input/PasteHandler.d.ts.map +1 -0
  96. package/dist/input/SourceNormalizer.d.ts +7 -0
  97. package/dist/input/SourceNormalizer.d.ts.map +1 -0
  98. package/dist/model/AttrRegistry.d.ts +39 -0
  99. package/dist/model/AttrRegistry.d.ts.map +1 -0
  100. package/dist/model/BuiltinSpecs.d.ts +4 -0
  101. package/dist/model/BuiltinSpecs.d.ts.map +1 -0
  102. package/dist/model/ContentModel.d.ts +12 -0
  103. package/dist/model/ContentModel.d.ts.map +1 -0
  104. package/dist/model/ContentSlice.d.ts +17 -0
  105. package/dist/model/ContentSlice.d.ts.map +1 -0
  106. package/dist/model/Document.d.ts +127 -0
  107. package/dist/model/Document.d.ts.map +1 -0
  108. package/dist/model/HTMLParser.d.ts +36 -0
  109. package/dist/model/HTMLParser.d.ts.map +1 -0
  110. package/dist/model/HTMLUtils.d.ts +6 -0
  111. package/dist/model/HTMLUtils.d.ts.map +1 -0
  112. package/dist/model/InlineNodeSpec.d.ts +20 -0
  113. package/dist/model/InlineNodeSpec.d.ts.map +1 -0
  114. package/dist/model/MarkSpec.d.ts +22 -0
  115. package/dist/model/MarkSpec.d.ts.map +1 -0
  116. package/dist/model/NodeResolver.d.ts +36 -0
  117. package/dist/model/NodeResolver.d.ts.map +1 -0
  118. package/dist/model/NodeSpec.d.ts +67 -0
  119. package/dist/model/NodeSpec.d.ts.map +1 -0
  120. package/dist/model/ParseRule.d.ts +11 -0
  121. package/dist/model/ParseRule.d.ts.map +1 -0
  122. package/dist/model/SanitizeConfig.d.ts +9 -0
  123. package/dist/model/SanitizeConfig.d.ts.map +1 -0
  124. package/dist/model/Schema.d.ts +17 -0
  125. package/dist/model/Schema.d.ts.map +1 -0
  126. package/dist/model/SchemaRegistry.d.ts +81 -0
  127. package/dist/model/SchemaRegistry.d.ts.map +1 -0
  128. package/dist/model/Selection.d.ts +52 -0
  129. package/dist/model/Selection.d.ts.map +1 -0
  130. package/dist/model/TypeBrands.d.ts +28 -0
  131. package/dist/model/TypeBrands.d.ts.map +1 -0
  132. package/dist/notectl-core.mjs +2576 -11104
  133. package/dist/notectl-core.mjs.map +1 -1
  134. package/dist/notectl-core.umd.js +6810 -0
  135. package/dist/notectl-core.umd.js.map +1 -0
  136. package/dist/plugins/EventBus.d.ts +13 -0
  137. package/dist/plugins/EventBus.d.ts.map +1 -0
  138. package/dist/plugins/Plugin.d.ts +85 -0
  139. package/dist/plugins/Plugin.d.ts.map +1 -0
  140. package/dist/plugins/PluginManager.d.ts +66 -0
  141. package/dist/plugins/PluginManager.d.ts.map +1 -0
  142. package/dist/plugins/alignment/AlignmentPlugin.d.ts +48 -0
  143. package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -0
  144. package/dist/plugins/alignment/index.d.ts +2 -0
  145. package/dist/plugins/alignment/index.d.ts.map +1 -0
  146. package/dist/plugins/alignment.mjs +92 -0
  147. package/dist/plugins/alignment.mjs.map +1 -0
  148. package/dist/plugins/blockquote/BlockquotePlugin.d.ts +30 -0
  149. package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -0
  150. package/dist/plugins/blockquote/index.d.ts +2 -0
  151. package/dist/plugins/blockquote/index.d.ts.map +1 -0
  152. package/dist/plugins/blockquote.mjs +58 -0
  153. package/dist/plugins/blockquote.mjs.map +1 -0
  154. package/dist/plugins/code-block/CodeBlockNodeView.d.ts +5 -0
  155. package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -0
  156. package/dist/plugins/code-block/CodeBlockPlugin.d.ts +135 -0
  157. package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -0
  158. package/dist/plugins/code-block/index.d.ts +2 -0
  159. package/dist/plugins/code-block/index.d.ts.map +1 -0
  160. package/dist/plugins/code-block.mjs +6 -0
  161. package/dist/plugins/code-block.mjs.map +1 -0
  162. package/dist/plugins/font/FontPlugin.d.ts +85 -0
  163. package/dist/plugins/font/FontPlugin.d.ts.map +1 -0
  164. package/dist/plugins/font/StarterFonts.d.ts +10 -0
  165. package/dist/plugins/font/StarterFonts.d.ts.map +1 -0
  166. package/dist/plugins/font/index.d.ts +2 -0
  167. package/dist/plugins/font/index.d.ts.map +1 -0
  168. package/dist/plugins/font-size/FontSizePlugin.d.ts +65 -0
  169. package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -0
  170. package/dist/plugins/font-size/index.d.ts +2 -0
  171. package/dist/plugins/font-size/index.d.ts.map +1 -0
  172. package/dist/plugins/font-size.mjs +220 -0
  173. package/dist/plugins/font-size.mjs.map +1 -0
  174. package/dist/plugins/font.mjs +186 -0
  175. package/dist/plugins/font.mjs.map +1 -0
  176. package/dist/plugins/hard-break/HardBreakPlugin.d.ts +16 -0
  177. package/dist/plugins/hard-break/HardBreakPlugin.d.ts.map +1 -0
  178. package/dist/plugins/hard-break/index.d.ts +2 -0
  179. package/dist/plugins/hard-break/index.d.ts.map +1 -0
  180. package/dist/plugins/hard-break.mjs +28 -0
  181. package/dist/plugins/hard-break.mjs.map +1 -0
  182. package/dist/plugins/heading/BlockTypePickerEntry.d.ts +20 -0
  183. package/dist/plugins/heading/BlockTypePickerEntry.d.ts.map +1 -0
  184. package/dist/plugins/heading/HeadingPlugin.d.ts +78 -0
  185. package/dist/plugins/heading/HeadingPlugin.d.ts.map +1 -0
  186. package/dist/plugins/heading/index.d.ts +3 -0
  187. package/dist/plugins/heading/index.d.ts.map +1 -0
  188. package/dist/plugins/heading.mjs +188 -0
  189. package/dist/plugins/heading.mjs.map +1 -0
  190. package/dist/plugins/highlight/HighlightPlugin.d.ts +37 -0
  191. package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -0
  192. package/dist/plugins/highlight/index.d.ts +2 -0
  193. package/dist/plugins/highlight/index.d.ts.map +1 -0
  194. package/dist/plugins/highlight.mjs +126 -0
  195. package/dist/plugins/highlight.mjs.map +1 -0
  196. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts +29 -0
  197. package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -0
  198. package/dist/plugins/horizontal-rule/index.d.ts +2 -0
  199. package/dist/plugins/horizontal-rule/index.d.ts.map +1 -0
  200. package/dist/plugins/horizontal-rule.mjs +59 -0
  201. package/dist/plugins/horizontal-rule.mjs.map +1 -0
  202. package/dist/plugins/image/ImageCommands.d.ts +26 -0
  203. package/dist/plugins/image/ImageCommands.d.ts.map +1 -0
  204. package/dist/plugins/image/ImageNodeView.d.ts +6 -0
  205. package/dist/plugins/image/ImageNodeView.d.ts.map +1 -0
  206. package/dist/plugins/image/ImagePlugin.d.ts +43 -0
  207. package/dist/plugins/image/ImagePlugin.d.ts.map +1 -0
  208. package/dist/plugins/image/ImageUpload.d.ts +48 -0
  209. package/dist/plugins/image/ImageUpload.d.ts.map +1 -0
  210. package/dist/plugins/image/index.d.ts +3 -0
  211. package/dist/plugins/image/index.d.ts.map +1 -0
  212. package/dist/plugins/image.mjs +381 -0
  213. package/dist/plugins/image.mjs.map +1 -0
  214. package/dist/plugins/link/LinkPlugin.d.ts +32 -0
  215. package/dist/plugins/link/LinkPlugin.d.ts.map +1 -0
  216. package/dist/plugins/link/index.d.ts +2 -0
  217. package/dist/plugins/link/index.d.ts.map +1 -0
  218. package/dist/plugins/link.mjs +127 -0
  219. package/dist/plugins/link.mjs.map +1 -0
  220. package/dist/plugins/list/ListPlugin.d.ts +51 -0
  221. package/dist/plugins/list/ListPlugin.d.ts.map +1 -0
  222. package/dist/plugins/list/index.d.ts +2 -0
  223. package/dist/plugins/list/index.d.ts.map +1 -0
  224. package/dist/plugins/list.mjs +193 -0
  225. package/dist/plugins/list.mjs.map +1 -0
  226. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts +23 -0
  227. package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -0
  228. package/dist/plugins/strikethrough/index.d.ts +2 -0
  229. package/dist/plugins/strikethrough/index.d.ts.map +1 -0
  230. package/dist/plugins/strikethrough.mjs +35 -0
  231. package/dist/plugins/strikethrough.mjs.map +1 -0
  232. package/dist/plugins/super-sub/SuperSubPlugin.d.ts +44 -0
  233. package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -0
  234. package/dist/plugins/super-sub/index.d.ts +2 -0
  235. package/dist/plugins/super-sub/index.d.ts.map +1 -0
  236. package/dist/plugins/super-sub.mjs +81 -0
  237. package/dist/plugins/super-sub.mjs.map +1 -0
  238. package/dist/plugins/table/TableCommands.d.ts +50 -0
  239. package/dist/plugins/table/TableCommands.d.ts.map +1 -0
  240. package/dist/plugins/table/TableControls.d.ts +10 -0
  241. package/dist/plugins/table/TableControls.d.ts.map +1 -0
  242. package/dist/plugins/table/TableControlsDOM.d.ts +18 -0
  243. package/dist/plugins/table/TableControlsDOM.d.ts.map +1 -0
  244. package/dist/plugins/table/TableControlsLayout.d.ts +34 -0
  245. package/dist/plugins/table/TableControlsLayout.d.ts.map +1 -0
  246. package/dist/plugins/table/TableHelpers.d.ts +39 -0
  247. package/dist/plugins/table/TableHelpers.d.ts.map +1 -0
  248. package/dist/plugins/table/TableNavigation.d.ts +4 -0
  249. package/dist/plugins/table/TableNavigation.d.ts.map +1 -0
  250. package/dist/plugins/table/TableNodeViews.d.ts +18 -0
  251. package/dist/plugins/table/TableNodeViews.d.ts.map +1 -0
  252. package/dist/plugins/table/TablePlugin.d.ts +39 -0
  253. package/dist/plugins/table/TablePlugin.d.ts.map +1 -0
  254. package/dist/plugins/table/TableSelection.d.ts +26 -0
  255. package/dist/plugins/table/TableSelection.d.ts.map +1 -0
  256. package/dist/plugins/table/TableTestUtils.d.ts +45 -0
  257. package/dist/plugins/table/TableTestUtils.d.ts.map +1 -0
  258. package/dist/plugins/table/index.d.ts +4 -0
  259. package/dist/plugins/table/index.d.ts.map +1 -0
  260. package/dist/plugins/table.mjs +663 -0
  261. package/dist/plugins/table.mjs.map +1 -0
  262. package/dist/plugins/text-color/TextColorPlugin.d.ts +37 -0
  263. package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -0
  264. package/dist/plugins/text-color/index.d.ts +2 -0
  265. package/dist/plugins/text-color/index.d.ts.map +1 -0
  266. package/dist/plugins/text-color.mjs +126 -0
  267. package/dist/plugins/text-color.mjs.map +1 -0
  268. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts +34 -0
  269. package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -0
  270. package/dist/plugins/text-formatting/index.d.ts +2 -0
  271. package/dist/plugins/text-formatting/index.d.ts.map +1 -0
  272. package/dist/plugins/text-formatting.mjs +52 -0
  273. package/dist/plugins/text-formatting.mjs.map +1 -0
  274. package/dist/plugins/toolbar/ToolbarItem.d.ts +66 -0
  275. package/dist/plugins/toolbar/ToolbarItem.d.ts.map +1 -0
  276. package/dist/plugins/toolbar/ToolbarKeyboardNav.d.ts +25 -0
  277. package/dist/plugins/toolbar/ToolbarKeyboardNav.d.ts.map +1 -0
  278. package/dist/plugins/toolbar/ToolbarPlugin.d.ts +47 -0
  279. package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -0
  280. package/dist/plugins/toolbar/ToolbarPopupController.d.ts +25 -0
  281. package/dist/plugins/toolbar/ToolbarPopupController.d.ts.map +1 -0
  282. package/dist/plugins/toolbar/ToolbarRenderers.d.ts +19 -0
  283. package/dist/plugins/toolbar/ToolbarRenderers.d.ts.map +1 -0
  284. package/dist/plugins/toolbar/ToolbarTooltip.d.ts +17 -0
  285. package/dist/plugins/toolbar/ToolbarTooltip.d.ts.map +1 -0
  286. package/dist/plugins/toolbar/index.d.ts +4 -0
  287. package/dist/plugins/toolbar/index.d.ts.map +1 -0
  288. package/dist/plugins/toolbar.mjs +8 -0
  289. package/dist/plugins/toolbar.mjs.map +1 -0
  290. package/dist/state/EditorState.d.ts +40 -0
  291. package/dist/state/EditorState.d.ts.map +1 -0
  292. package/dist/state/History.d.ts +38 -0
  293. package/dist/state/History.d.ts.map +1 -0
  294. package/dist/state/StepApplication.d.ts +5 -0
  295. package/dist/state/StepApplication.d.ts.map +1 -0
  296. package/dist/state/Transaction.d.ts +185 -0
  297. package/dist/state/Transaction.d.ts.map +1 -0
  298. package/dist/test/PluginTestUtils.d.ts +127 -0
  299. package/dist/test/PluginTestUtils.d.ts.map +1 -0
  300. package/dist/test/TestUtils.d.ts +153 -0
  301. package/dist/test/TestUtils.d.ts.map +1 -0
  302. package/dist/view/EditorView.d.ts +74 -0
  303. package/dist/view/EditorView.d.ts.map +1 -0
  304. package/dist/view/NodeView.d.ts +18 -0
  305. package/dist/view/NodeView.d.ts.map +1 -0
  306. package/dist/view/Reconciler.d.ts +23 -0
  307. package/dist/view/Reconciler.d.ts.map +1 -0
  308. package/dist/view/SelectionSync.d.ts +8 -0
  309. package/dist/view/SelectionSync.d.ts.map +1 -0
  310. package/package.json +112 -11
  311. package/dist/notectl-core.js +0 -1463
  312. package/dist/notectl-core.js.map +0 -1
@@ -0,0 +1,398 @@
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) {
24
+ const o2 = t2.querySelectorAll(".notectl-grid-picker__cell");
25
+ for (const t3 of o2) {
26
+ const o3 = Number(t3.getAttribute("data-row")), i2 = Number(t3.getAttribute("data-col"));
27
+ t3.classList.toggle("notectl-grid-picker__cell--highlighted", o3 <= e2 && i2 <= n2);
28
+ }
29
+ }
30
+ function s() {
31
+ const t2 = document.createElement("span");
32
+ return t2.className = "notectl-toolbar-separator", t2.setAttribute("role", "separator"), t2;
33
+ }
34
+ class l {
35
+ activePopup = null;
36
+ activePopupButton = null;
37
+ closePopupHandler = null;
38
+ getActiveElement;
39
+ constructor(t2) {
40
+ this.getActiveElement = t2;
41
+ }
42
+ isOpen() {
43
+ return null !== this.activePopup;
44
+ }
45
+ toggle(t2, e2, n2) {
46
+ if (this.activePopup) return void this.close();
47
+ const o2 = document.createElement("div");
48
+ switch (o2.className = "notectl-toolbar-popup", e2.popupType) {
49
+ case "gridPicker":
50
+ !(function(t3, e3, n3) {
51
+ t3.className += " notectl-grid-picker";
52
+ const o3 = document.createElement("div");
53
+ 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
+ const i2 = document.createElement("div");
55
+ 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);
65
+ }
66
+ t3.appendChild(o3), t3.appendChild(i2);
67
+ })(o2, e2.popupConfig, () => this.close());
68
+ break;
69
+ case "dropdown":
70
+ !(function(t3, e3, n3, o3) {
71
+ t3.classList.add("notectl-dropdown"), t3.setAttribute("role", "menu");
72
+ for (const i2 of e3.items) {
73
+ const e4 = document.createElement("button");
74
+ if (e4.type = "button", e4.className = "notectl-dropdown__item", e4.setAttribute("role", "menuitem"), e4.setAttribute("tabindex", "-1"), i2.icon) {
75
+ const t4 = document.createElement("span");
76
+ t4.className = "notectl-dropdown__item-icon", t4.innerHTML = i2.icon, e4.appendChild(t4);
77
+ }
78
+ const r2 = document.createElement("span");
79
+ r2.className = "notectl-dropdown__item-label", r2.textContent = i2.label, e4.appendChild(r2), e4.addEventListener("mousedown", (t4) => {
80
+ t4.preventDefault(), t4.stopPropagation(), n3(i2.command), o3();
81
+ }), e4.addEventListener("click", () => {
82
+ n3(i2.command), o3();
83
+ }), t3.appendChild(e4);
84
+ }
85
+ })(o2, e2.popupConfig, (t3) => n2.executeCommand(t3), () => this.close());
86
+ break;
87
+ case "custom":
88
+ e2.renderPopup(o2, n2, () => this.close());
89
+ }
90
+ 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) => {
91
+ const n3 = e3.target;
92
+ n3 instanceof Node && !o2.contains(n3) && n3 !== t2 && this.close();
93
+ }, setTimeout(() => {
94
+ this.closePopupHandler && document.addEventListener("mousedown", this.closePopupHandler);
95
+ }, 0);
96
+ }
97
+ close() {
98
+ 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);
99
+ }
100
+ closeAndRestoreFocus() {
101
+ const t2 = this.activePopupButton;
102
+ this.close(), t2?.focus();
103
+ }
104
+ destroy() {
105
+ this.close();
106
+ }
107
+ positionAndAppend(t2, e2) {
108
+ const n2 = e2.getBoundingClientRect();
109
+ t2.style.position = "fixed", t2.style.top = `${n2.bottom + 2}px`, t2.style.left = `${n2.left}px`, t2.style.zIndex = "10000";
110
+ const o2 = e2.getRootNode();
111
+ o2 instanceof ShadowRoot ? o2.appendChild(t2) : document.body.appendChild(t2);
112
+ }
113
+ focusFirstItem(t2) {
114
+ requestAnimationFrame(() => {
115
+ const e2 = t2.querySelector('[role="menuitem"]') ?? t2.querySelector(".notectl-grid-picker__cell") ?? t2.querySelector("button");
116
+ e2?.focus();
117
+ });
118
+ }
119
+ handlePopupKeydown(t2) {
120
+ if (!this.activePopup) return;
121
+ if ("Escape" === t2.key) return t2.preventDefault(), t2.stopPropagation(), void this.closeAndRestoreFocus();
122
+ if ("Tab" === t2.key) return t2.preventDefault(), void this.closeAndRestoreFocus();
123
+ const e2 = this.activePopup.querySelectorAll('[role="menuitem"]');
124
+ e2.length > 0 ? this.handleDropdownKeydown(t2, e2) : null !== this.activePopup.querySelector(".notectl-grid-picker__cell") ? this.handleGridKeydown(t2) : this.handleCustomPopupKeydown(t2);
125
+ }
126
+ handleDropdownKeydown(t2, e2) {
127
+ const n2 = Array.from(e2), o2 = n2.indexOf(this.getActiveElement());
128
+ switch (t2.key) {
129
+ case "ArrowDown": {
130
+ t2.preventDefault();
131
+ const e3 = i(n2, o2, 1);
132
+ n2[e3]?.focus();
133
+ break;
134
+ }
135
+ case "ArrowUp": {
136
+ t2.preventDefault();
137
+ const e3 = i(n2, o2, -1);
138
+ n2[e3]?.focus();
139
+ break;
140
+ }
141
+ case "Enter":
142
+ case " ": {
143
+ t2.preventDefault();
144
+ const e3 = n2[o2];
145
+ e3 && e3.click();
146
+ break;
147
+ }
148
+ }
149
+ }
150
+ 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);
154
+ if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(t2.key)) {
155
+ 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}`);
171
+ }
172
+ "Enter" !== t2.key && " " !== t2.key || (t2.preventDefault(), e2?.click());
173
+ }
174
+ handleCustomPopupKeydown(t2) {
175
+ if (!this.activePopup) return;
176
+ const e2 = Array.from(this.activePopup.querySelectorAll("button"));
177
+ if (0 === e2.length) return;
178
+ const n2 = this.getActiveElement(), o2 = e2.indexOf(n2);
179
+ switch (t2.key) {
180
+ case "ArrowDown": {
181
+ t2.preventDefault();
182
+ const n3 = i(e2, o2, 1);
183
+ e2[n3]?.focus();
184
+ break;
185
+ }
186
+ case "ArrowUp": {
187
+ t2.preventDefault();
188
+ const n3 = i(e2, o2, -1);
189
+ e2[n3]?.focus();
190
+ break;
191
+ }
192
+ case "Enter":
193
+ case " ":
194
+ t2.preventDefault(), n2 && n2.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, cancelable: true }));
195
+ }
196
+ }
197
+ }
198
+ class a {
199
+ element;
200
+ timer = null;
201
+ target = null;
202
+ isPopupActive;
203
+ static TOOLTIP_ID = "notectl-toolbar-tooltip";
204
+ 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";
206
+ }
207
+ show(t2) {
208
+ if (this.hide(), this.isPopupActive() || t2.disabled) return;
209
+ const e2 = t2.getAttribute("data-tooltip");
210
+ e2 && (this.target = t2, this.timer = setTimeout(() => {
211
+ if (this.isPopupActive()) return;
212
+ this.element.textContent = e2, this.element.style.display = "";
213
+ 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);
215
+ const o2 = t2.getBoundingClientRect();
216
+ 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
+ }, 500));
218
+ }
219
+ hide() {
220
+ this.timer && (clearTimeout(this.timer), this.timer = null), this.target && (this.target.removeAttribute("aria-describedby"), this.target = null), this.element.style.display = "none";
221
+ }
222
+ destroy() {
223
+ this.hide(), this.element.remove();
224
+ }
225
+ }
226
+ const c = new t("toolbar");
227
+ class d {
228
+ id = "toolbar";
229
+ name = "Toolbar";
230
+ priority = 10;
231
+ context = null;
232
+ toolbarElement = null;
233
+ buttons = [];
234
+ hiddenItems = /* @__PURE__ */ new Set();
235
+ layoutConfig;
236
+ focusedIndex = 0;
237
+ tooltip = null;
238
+ popupController = null;
239
+ constructor(t2) {
240
+ this.layoutConfig = t2 ?? null;
241
+ }
242
+ 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();
244
+ }
245
+ onReady() {
246
+ this.renderItems();
247
+ }
248
+ destroy() {
249
+ 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;
250
+ }
251
+ onStateChange(t2, e2, n2) {
252
+ this.updateButtonStates(e2);
253
+ }
254
+ onConfigure(t2) {
255
+ for (const [e2, n2] of Object.entries(t2)) false === n2 ? this.hiddenItems.add(e2) : this.hiddenItems.delete(e2);
256
+ this.renderItems();
257
+ }
258
+ createToolbarElement() {
259
+ if (!this.context) return;
260
+ this.toolbarElement && this.toolbarElement.remove(), this.buttons = [];
261
+ 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.className = "notectl-toolbar", this.toolbarElement.addEventListener("keydown", (t3) => this.handleToolbarKeydown(t3)), t2.appendChild(this.toolbarElement);
263
+ }
264
+ renderItems() {
265
+ if (this.context && this.toolbarElement) {
266
+ for (const t2 of this.buttons) t2.element.remove();
267
+ this.buttons = [];
268
+ for (const t2 of this.toolbarElement.querySelectorAll(".notectl-toolbar-separator")) t2.remove();
269
+ 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());
270
+ }
271
+ }
272
+ initRovingTabindex() {
273
+ const t2 = this.buttons.map((t3) => t3.element), e2 = n(t2);
274
+ this.focusedIndex = e2 >= 0 ? e2 : 0, o(t2, this.focusedIndex);
275
+ }
276
+ setRovingFocus(t2) {
277
+ if (t2 < 0 || t2 >= this.buttons.length) return;
278
+ this.focusedIndex = t2;
279
+ const e2 = this.buttons.map((t3) => t3.element);
280
+ o(e2, t2), e2[t2]?.focus();
281
+ }
282
+ getActiveElement() {
283
+ const t2 = this.toolbarElement?.getRootNode();
284
+ return t2 instanceof ShadowRoot ? t2.activeElement : document.activeElement;
285
+ }
286
+ syncFocusedIndex() {
287
+ const t2 = this.getActiveElement(), e2 = this.buttons.findIndex((e3) => e3.element === t2);
288
+ e2 >= 0 && (this.focusedIndex = e2);
289
+ }
290
+ handleToolbarKeydown(t2) {
291
+ const o2 = this.buttons.map((t3) => t3.element);
292
+ if (0 !== o2.length) switch (this.syncFocusedIndex(), t2.key) {
293
+ case "ArrowRight": {
294
+ t2.preventDefault();
295
+ const n2 = e(o2, this.focusedIndex, 1);
296
+ this.setRovingFocus(n2);
297
+ break;
298
+ }
299
+ case "ArrowLeft": {
300
+ t2.preventDefault();
301
+ const n2 = e(o2, this.focusedIndex, -1);
302
+ this.setRovingFocus(n2);
303
+ break;
304
+ }
305
+ case "Home": {
306
+ t2.preventDefault();
307
+ const e2 = n(o2);
308
+ e2 >= 0 && this.setRovingFocus(e2);
309
+ break;
310
+ }
311
+ case "End": {
312
+ 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);
318
+ break;
319
+ }
320
+ case "Enter":
321
+ case " ": {
322
+ t2.preventDefault();
323
+ const e2 = this.buttons[this.focusedIndex];
324
+ e2 && this.activateButton(e2.element, e2.item);
325
+ break;
326
+ }
327
+ }
328
+ }
329
+ activateButton(t2, e2) {
330
+ this.tooltip?.hide(), e2.popupType && this.context ? this.popupController?.toggle(t2, e2, this.context) : this.context?.executeCommand(e2.command);
331
+ }
332
+ renderItemsByLayout() {
333
+ if (!this.context || !this.toolbarElement || !this.layoutConfig) return;
334
+ const t2 = this.context.getSchemaRegistry();
335
+ let e2 = true;
336
+ for (const n2 of this.layoutConfig.groups) {
337
+ const o2 = [];
338
+ for (const e3 of n2) {
339
+ const n3 = t2.getToolbarItemsByPlugin(e3).filter((t3) => !this.hiddenItems.has(t3.id));
340
+ n3.sort((t3, e4) => (t3.priority ?? 100) - (e4.priority ?? 100)), o2.push(...n3);
341
+ }
342
+ if (0 !== o2.length) {
343
+ e2 || this.toolbarElement.appendChild(s()), e2 = false;
344
+ for (const t3 of o2) {
345
+ const e3 = this.createButton(t3);
346
+ this.toolbarElement.appendChild(e3.element), this.buttons.push(e3);
347
+ }
348
+ }
349
+ }
350
+ 0 === this.buttons.length && this.toolbarElement.remove();
351
+ }
352
+ renderItemsByPriority() {
353
+ if (!this.context || !this.toolbarElement) return;
354
+ const t2 = this.context.getSchemaRegistry().getToolbarItems().filter((t3) => !this.hiddenItems.has(t3.id));
355
+ if (0 === t2.length) return void this.toolbarElement.remove();
356
+ const e2 = [...t2].sort((t3, e3) => (t3.priority ?? 100) - (e3.priority ?? 100));
357
+ if (e2.some((t3) => t3.separatorAfter)) for (let t3 = 0; t3 < e2.length; t3++) {
358
+ const n2 = e2[t3];
359
+ if (!n2) continue;
360
+ 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());
362
+ }
363
+ else {
364
+ const t3 = /* @__PURE__ */ new Map();
365
+ for (const n3 of e2) {
366
+ const e3 = t3.get(n3.group) ?? [];
367
+ e3.push(n3), t3.set(n3.group, e3);
368
+ }
369
+ let n2 = true;
370
+ for (const [, e3] of t3) {
371
+ n2 || this.toolbarElement.appendChild(s()), n2 = false;
372
+ for (const t4 of e3) {
373
+ const e4 = this.createButton(t4);
374
+ this.toolbarElement.appendChild(e4.element), this.buttons.push(e4);
375
+ }
376
+ }
377
+ }
378
+ }
379
+ createButton(t2) {
380
+ const e2 = document.createElement("button");
381
+ 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"));
382
+ const n2 = document.createElement("span");
383
+ return n2.className = "notectl-toolbar-btn__icon", n2.innerHTML = t2.icon, e2.appendChild(n2), e2.addEventListener("mousedown", (n3) => {
384
+ n3.preventDefault(), this.activateButton(e2, t2);
385
+ }), 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 };
386
+ }
387
+ updateButtonStates(t2) {
388
+ for (const e2 of this.buttons) {
389
+ const n2 = e2.item.isActive?.(t2) ?? false, o2 = e2.item.isEnabled?.(t2) ?? true;
390
+ 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");
391
+ }
392
+ }
393
+ }
394
+ export {
395
+ d as T,
396
+ c as a
397
+ };
398
+ //# sourceMappingURL=ToolbarPlugin-D5VqeBPT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarPlugin-D5VqeBPT.mjs","sources":["../../src/plugins/toolbar/ToolbarKeyboardNav.ts","../../src/plugins/toolbar/ToolbarRenderers.ts","../../src/plugins/toolbar/ToolbarPopupController.ts","../../src/plugins/toolbar/ToolbarTooltip.ts","../../src/plugins/toolbar/ToolbarPlugin.ts","../../src/editor/styles/toolbar.ts"],"sourcesContent":["/**\n * Keyboard navigation helpers for the toolbar (WAI-ARIA Toolbar pattern).\n * Pure functions that operate on arrays of buttons and DOM elements.\n */\n\n/** Returns indices of all enabled buttons. */\nexport function getEnabledIndices(buttons: readonly HTMLButtonElement[]): number[] {\n\tconst result: number[] = [];\n\tfor (let i = 0; i < buttons.length; i++) {\n\t\tif (!buttons[i]?.disabled) {\n\t\t\tresult.push(i);\n\t\t}\n\t}\n\treturn result;\n}\n\n/** Finds the next enabled button index in the given direction (wraps around). */\nexport function findNextEnabled(\n\tbuttons: readonly HTMLButtonElement[],\n\tcurrent: number,\n\tdirection: 1 | -1,\n): number {\n\tconst len = buttons.length;\n\tif (len === 0) return -1;\n\n\tlet index = current;\n\tfor (let i = 0; i < len; i++) {\n\t\tindex = (index + direction + len) % len;\n\t\tif (!buttons[index]?.disabled) {\n\t\t\treturn index;\n\t\t}\n\t}\n\treturn current;\n}\n\n/** Finds the first enabled button index. */\nexport function findFirstEnabled(buttons: readonly HTMLButtonElement[]): number {\n\tfor (let i = 0; i < buttons.length; i++) {\n\t\tif (!buttons[i]?.disabled) return i;\n\t}\n\treturn -1;\n}\n\n/** Finds the last enabled button index. */\nexport function findLastEnabled(buttons: readonly HTMLButtonElement[]): number {\n\tfor (let i = buttons.length - 1; i >= 0; i--) {\n\t\tif (!buttons[i]?.disabled) return i;\n\t}\n\treturn -1;\n}\n\n/**\n * Applies roving tabindex: sets tabindex=\"0\" on the focused button,\n * tabindex=\"-1\" on all others.\n */\nexport function applyRovingTabindex(\n\tbuttons: readonly HTMLButtonElement[],\n\tfocusedIndex: number,\n): void {\n\tfor (let i = 0; i < buttons.length; i++) {\n\t\tconst btn = buttons[i];\n\t\tif (btn) {\n\t\t\tbtn.setAttribute('tabindex', i === focusedIndex ? '0' : '-1');\n\t\t}\n\t}\n}\n\n/** Navigates dropdown items with arrow keys (wraps around). */\nexport function findNextDropdownItem(\n\titems: readonly HTMLElement[],\n\tcurrent: number,\n\tdirection: 1 | -1,\n): number {\n\tconst len = items.length;\n\tif (len === 0) return -1;\n\treturn (current + direction + len) % len;\n}\n\n/**\n * Navigates a grid of cells with arrow keys.\n * Returns the new [row, col] position.\n */\nexport function navigateGrid(\n\trow: number,\n\tcol: number,\n\tmaxRows: number,\n\tmaxCols: number,\n\tkey: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight',\n): [number, number] {\n\tswitch (key) {\n\t\tcase 'ArrowUp':\n\t\t\treturn [row > 1 ? row - 1 : maxRows, col];\n\t\tcase 'ArrowDown':\n\t\t\treturn [row < maxRows ? row + 1 : 1, col];\n\t\tcase 'ArrowLeft':\n\t\t\treturn [row, col > 1 ? col - 1 : maxCols];\n\t\tcase 'ArrowRight':\n\t\t\treturn [row, col < maxCols ? col + 1 : 1];\n\t}\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 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 { 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\n\tconstructor(layoutConfig?: ToolbarLayoutConfig) {\n\t\tthis.layoutConfig = layoutConfig ?? null;\n\t}\n\n\tinit(context: PluginContext): void {\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', 'Formatting options');\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","/** 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/* 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"],"names":["findNextEnabled","buttons","current","direction","len","length","index","i","disabled","findFirstEnabled","applyRovingTabindex","focusedIndex","btn","setAttribute","findNextDropdownItem","items","highlightCells","grid","targetRow","targetCol","cells","querySelectorAll","cell","r","Number","getAttribute","c","classList","toggle","createSeparator","sep","document","createElement","className","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","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","handleDropdownKeydown","handleGridKeydown","handleCustomPopupKeydown","itemArr","Array","from","indexOf","next","prev","focused","click","row","col","lastCell","includes","newRow","newCol","active","currentIdx","dispatchEvent","MouseEvent","bubbles","cancelable","ToolbarTooltip","element","timer","isPopupActive","static","id","TOOLTIP_ID","hide","text","parentNode","transform","clearTimeout","removeAttribute","ToolbarServiceKey","ServiceKey","ToolbarPlugin","name","priority","toolbarElement","hiddenItems","Set","layoutConfig","tooltip","popupController","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","activeElement","syncFocusedIndex","idx","findIndex","setRovingFocus","last","activateButton","registry","getSchemaRegistry","firstGroup","groupPluginIds","groups","groupItems","pId","getToolbarItemsByPlugin","filter","has","sort","a","push","createButton","getToolbarItems","sorted","some","separatorAfter","Map","list","get","group","set","span","show","state","isActive","enabled","isEnabled"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ function n(n2) {
2
+ return n2;
3
+ }
4
+ function r(n2) {
5
+ return n2;
6
+ }
7
+ function t(n2) {
8
+ return n2;
9
+ }
10
+ function u(n2) {
11
+ return n2;
12
+ }
13
+ function c(n2) {
14
+ return n2;
15
+ }
16
+ function e(n2) {
17
+ return n2;
18
+ }
19
+ export {
20
+ n as b,
21
+ c,
22
+ e as i,
23
+ t as m,
24
+ r as n,
25
+ u as p
26
+ };
27
+ //# sourceMappingURL=TypeBrands-C09nE2qO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeBrands-C09nE2qO.mjs","sources":["../../src/model/TypeBrands.ts"],"sourcesContent":["/**\n * Branded (nominal) types for semantic string distinctions.\n * Prevents accidental interchange of structurally identical IDs.\n */\n\ndeclare const __brand: unique symbol;\ntype Brand<T, B extends string> = T & { readonly [__brand]: B };\n\n/** Unique identifier for a block node in the document tree. */\nexport type BlockId = Brand<string, 'BlockId'>;\n\n/** Semantic name for a node type (e.g. 'paragraph', 'heading'). */\nexport type NodeTypeName = Brand<string, 'NodeTypeName'>;\n\n/** Semantic name for a mark type (e.g. 'bold', 'link'). */\nexport type MarkTypeName = Brand<string, 'MarkTypeName'>;\n\n/** Unique identifier for a plugin. */\nexport type PluginId = Brand<string, 'PluginId'>;\n\n/** Registered command name. */\nexport type CommandName = Brand<string, 'CommandName'>;\n\n/** Semantic name for an inline node type (e.g. 'image', 'mention'). */\nexport type InlineTypeName = Brand<string, 'InlineTypeName'>;\n\n// --- Constructor Functions ---\n\nexport function blockId(id: string): BlockId {\n\treturn id as BlockId;\n}\n\nexport function nodeType(name: string): NodeTypeName {\n\treturn name as NodeTypeName;\n}\n\nexport function markType(name: string): MarkTypeName {\n\treturn name as MarkTypeName;\n}\n\nexport function pluginId(id: string): PluginId {\n\treturn id as PluginId;\n}\n\nexport function commandName(name: string): CommandName {\n\treturn name as CommandName;\n}\n\nexport function inlineType(name: string): InlineTypeName {\n\treturn name as InlineTypeName;\n}\n"],"names":["blockId","id","nodeType","name","markType","pluginId","commandName","inlineType"],"mappings":"AA4BO,SAASA,EAAQC,IAAAA;AACvB,SAAOA;AACR;AAEO,SAASC,EAASC,IAAAA;AACxB,SAAOA;AACR;AAEO,SAASC,EAASD;AACxB,SAAOA;AACR;AAEO,SAASE,EAASJ,IAAAA;AACxB,SAAOA;AACR;AAEO,SAASK,EAAYH,IAAAA;AAC3B,SAAOA;AACR;AAEO,SAASI,EAAWJ,IAAAA;AAC1B,SAAOA;AACR;"}
@@ -0,0 +1,5 @@
1
+ const t = "\n/* Color Picker Popup */\n.notectl-color-picker {\n padding: 8px;\n min-width: 240px;\n}\n\n.notectl-color-picker__default {\n display: block;\n width: 100%;\n padding: 6px 12px;\n margin-bottom: 8px;\n border: 1px solid var(--notectl-border);\n border-radius: 4px;\n background: var(--notectl-bg);\n cursor: pointer;\n font-size: 13px;\n color: var(--notectl-fg);\n text-align: center;\n}\n\n.notectl-color-picker__default:hover {\n background: var(--notectl-hover-bg);\n}\n\n.notectl-color-picker__grid {\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 3px;\n}\n\n.notectl-color-picker__swatch {\n width: 22px;\n height: 22px;\n border: 1px solid transparent;\n border-radius: 3px;\n padding: 0;\n cursor: pointer;\n transition: transform 0.1s;\n}\n\n.notectl-color-picker__swatch:hover,\n.notectl-color-picker__swatch:focus-visible {\n transform: scale(1.25);\n z-index: 1;\n}\n\n.notectl-color-picker__swatch:focus-visible {\n outline: 2px solid var(--notectl-focus-ring);\n outline-offset: 1px;\n}\n\n.notectl-color-picker__swatch--active {\n border: 2px solid var(--notectl-primary-fg);\n border-radius: 3px;\n}\n\n.notectl-toolbar-btn--textColor .notectl-toolbar-btn__color-indicator {\n display: block;\n width: 16px;\n height: 3px;\n margin-top: 1px;\n border-radius: 1px;\n}\n";
2
+ export {
3
+ t as C
4
+ };
5
+ //# sourceMappingURL=color-picker-Csf0wx5a.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-picker-Csf0wx5a.mjs","sources":["../../src/editor/styles/color-picker.ts"],"sourcesContent":["/** Color picker popup styles (text-color + highlight plugins). */\nexport const COLOR_PICKER_CSS = `\n/* Color Picker Popup */\n.notectl-color-picker {\n\tpadding: 8px;\n\tmin-width: 240px;\n}\n\n.notectl-color-picker__default {\n\tdisplay: block;\n\twidth: 100%;\n\tpadding: 6px 12px;\n\tmargin-bottom: 8px;\n\tborder: 1px solid var(--notectl-border);\n\tborder-radius: 4px;\n\tbackground: var(--notectl-bg);\n\tcursor: pointer;\n\tfont-size: 13px;\n\tcolor: var(--notectl-fg);\n\ttext-align: center;\n}\n\n.notectl-color-picker__default:hover {\n\tbackground: var(--notectl-hover-bg);\n}\n\n.notectl-color-picker__grid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(10, 1fr);\n\tgap: 3px;\n}\n\n.notectl-color-picker__swatch {\n\twidth: 22px;\n\theight: 22px;\n\tborder: 1px solid transparent;\n\tborder-radius: 3px;\n\tpadding: 0;\n\tcursor: pointer;\n\ttransition: transform 0.1s;\n}\n\n.notectl-color-picker__swatch:hover,\n.notectl-color-picker__swatch:focus-visible {\n\ttransform: scale(1.25);\n\tz-index: 1;\n}\n\n.notectl-color-picker__swatch:focus-visible {\n\toutline: 2px solid var(--notectl-focus-ring);\n\toutline-offset: 1px;\n}\n\n.notectl-color-picker__swatch--active {\n\tborder: 2px solid var(--notectl-primary-fg);\n\tborder-radius: 3px;\n}\n\n.notectl-toolbar-btn--textColor .notectl-toolbar-btn__color-indicator {\n\tdisplay: block;\n\twidth: 16px;\n\theight: 3px;\n\tmargin-top: 1px;\n\tborder-radius: 1px;\n}\n`;\n"],"names":["COLOR_PICKER_CSS"],"mappings":"AACO,MAAMA,IAAmB;"}