@notectl/core 1.0.5 → 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.
- package/README.md +78 -55
- package/custom-elements.json +344 -0
- package/dist/chunks/{AttrRegistry-DTsHyDVA.mjs → AttrRegistry-D-przlzb.mjs} +4 -4
- package/dist/chunks/{AttrRegistry-DTsHyDVA.mjs.map → AttrRegistry-D-przlzb.mjs.map} +1 -1
- package/dist/chunks/ColorNames-iaWsSZx1.mjs +35 -0
- package/dist/chunks/ColorNames-iaWsSZx1.mjs.map +1 -0
- package/dist/chunks/ColorValidation-Dyy4Bye8.mjs +140 -0
- package/dist/chunks/ColorValidation-Dyy4Bye8.mjs.map +1 -0
- package/dist/chunks/{Commands-DLP85Mp5.mjs → Commands-CSpSwGXv.mjs} +13 -13
- package/dist/chunks/{Commands-DLP85Mp5.mjs.map → Commands-CSpSwGXv.mjs.map} +1 -1
- package/dist/chunks/ToolbarKeyboardNav-B32OMv8r.mjs +46 -0
- package/dist/chunks/ToolbarKeyboardNav-B32OMv8r.mjs.map +1 -0
- package/dist/chunks/{ToolbarPlugin-D5VqeBPT.mjs → ToolbarPlugin-DY2xaJiu.mjs} +63 -93
- package/dist/chunks/ToolbarPlugin-DY2xaJiu.mjs.map +1 -0
- package/dist/chunks/index-BAk1EG1x.mjs +541 -0
- package/dist/chunks/index-BAk1EG1x.mjs.map +1 -0
- package/dist/chunks/index-BRYzYOYC.mjs +63 -0
- package/dist/chunks/index-BRYzYOYC.mjs.map +1 -0
- package/dist/chunks/index-BSFLNveF.mjs +953 -0
- package/dist/chunks/index-BSFLNveF.mjs.map +1 -0
- package/dist/chunks/index-BYgspns5.mjs +209 -0
- package/dist/chunks/index-BYgspns5.mjs.map +1 -0
- package/dist/chunks/index-B_3qDrUN.mjs +64 -0
- package/dist/chunks/index-B_3qDrUN.mjs.map +1 -0
- package/dist/chunks/index-Bsp4LC5t.mjs +130 -0
- package/dist/chunks/index-Bsp4LC5t.mjs.map +1 -0
- package/dist/chunks/index-C-YWHOcC.mjs +100 -0
- package/dist/chunks/index-C-YWHOcC.mjs.map +1 -0
- package/dist/chunks/index-C2GQoHot.mjs +92 -0
- package/dist/chunks/index-C2GQoHot.mjs.map +1 -0
- package/dist/chunks/index-CT3HGdQt.mjs +39 -0
- package/dist/chunks/index-CT3HGdQt.mjs.map +1 -0
- package/dist/chunks/index-Ct0ivLhO.mjs +407 -0
- package/dist/chunks/index-Ct0ivLhO.mjs.map +1 -0
- package/dist/chunks/index-CxiWyUho.mjs +191 -0
- package/dist/chunks/index-CxiWyUho.mjs.map +1 -0
- package/dist/chunks/index-D3CQWJiw.mjs +200 -0
- package/dist/chunks/index-D3CQWJiw.mjs.map +1 -0
- package/dist/chunks/index-DC1EK22F.mjs +41 -0
- package/dist/chunks/index-DC1EK22F.mjs.map +1 -0
- package/dist/chunks/index-Dh76rR13.mjs +196 -0
- package/dist/chunks/index-Dh76rR13.mjs.map +1 -0
- package/dist/chunks/index-o6hDR07y.mjs +41 -0
- package/dist/chunks/index-o6hDR07y.mjs.map +1 -0
- package/dist/chunks/index-uTnc9y7M.mjs +62 -0
- package/dist/chunks/index-uTnc9y7M.mjs.map +1 -0
- package/dist/chunks/resolvePluginLocale-B4w1OkPy.mjs +34 -0
- package/dist/chunks/resolvePluginLocale-B4w1OkPy.mjs.map +1 -0
- package/dist/editor/EditorDOM.d.ts.map +1 -1
- package/dist/editor/NotectlEditor.d.ts +15 -1
- package/dist/editor/NotectlEditor.d.ts.map +1 -1
- package/dist/editor/PaperLayoutController.d.ts +27 -0
- package/dist/editor/PaperLayoutController.d.ts.map +1 -0
- package/dist/editor/PaperSize.d.ts +35 -0
- package/dist/editor/PaperSize.d.ts.map +1 -0
- package/dist/editor/styles/color-picker.d.ts +1 -1
- package/dist/editor/styles/color-picker.d.ts.map +1 -1
- package/dist/editor/styles/paper.d.ts +3 -0
- package/dist/editor/styles/paper.d.ts.map +1 -0
- package/dist/editor/styles/table.d.ts +1 -1
- package/dist/editor/styles/table.d.ts.map +1 -1
- package/dist/editor/styles/toolbar.d.ts +1 -1
- package/dist/editor/styles/toolbar.d.ts.map +1 -1
- package/dist/editor/styles.d.ts.map +1 -1
- package/dist/i18n/Locale.d.ts +17 -0
- package/dist/i18n/Locale.d.ts.map +1 -0
- package/dist/i18n/LocaleService.d.ts +8 -0
- package/dist/i18n/LocaleService.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +4 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/resolvePluginLocale.d.ts +3 -0
- package/dist/i18n/resolvePluginLocale.d.ts.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/input/ClipboardHandler.d.ts.map +1 -1
- package/dist/input/InputHandler.d.ts.map +1 -1
- package/dist/input/KeyboardHandler.d.ts.map +1 -1
- package/dist/input/PasteHandler.d.ts.map +1 -1
- package/dist/notectl-core.mjs +1145 -837
- package/dist/notectl-core.mjs.map +1 -1
- package/dist/notectl-core.umd.js +2368 -1826
- package/dist/notectl-core.umd.js.map +1 -1
- package/dist/plugins/PluginManager.d.ts +8 -1
- package/dist/plugins/PluginManager.d.ts.map +1 -1
- package/dist/plugins/alignment/AlignmentLocale.d.ts +19 -0
- package/dist/plugins/alignment/AlignmentLocale.d.ts.map +1 -0
- package/dist/plugins/alignment/AlignmentPlugin.d.ts +4 -0
- package/dist/plugins/alignment/AlignmentPlugin.d.ts.map +1 -1
- package/dist/plugins/alignment.mjs +3 -89
- package/dist/plugins/alignment.mjs.map +1 -1
- package/dist/plugins/blockquote/BlockquoteLocale.d.ts +17 -0
- package/dist/plugins/blockquote/BlockquoteLocale.d.ts.map +1 -0
- package/dist/plugins/blockquote/BlockquotePlugin.d.ts +3 -0
- package/dist/plugins/blockquote/BlockquotePlugin.d.ts.map +1 -1
- package/dist/plugins/blockquote.mjs +2 -55
- package/dist/plugins/blockquote.mjs.map +1 -1
- package/dist/plugins/code-block/CodeBlockCommands.d.ts +5 -0
- package/dist/plugins/code-block/CodeBlockCommands.d.ts.map +1 -0
- package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts +10 -0
- package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts.map +1 -0
- package/dist/plugins/code-block/CodeBlockLocale.d.ts +17 -0
- package/dist/plugins/code-block/CodeBlockLocale.d.ts.map +1 -0
- package/dist/plugins/code-block/CodeBlockNodeView.d.ts +1 -1
- package/dist/plugins/code-block/CodeBlockNodeView.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockPlugin.d.ts +4 -111
- package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockService.d.ts +5 -0
- package/dist/plugins/code-block/CodeBlockService.d.ts.map +1 -0
- package/dist/plugins/code-block/CodeBlockTypes.d.ts +71 -0
- package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -0
- package/dist/plugins/code-block.mjs +3 -3
- package/dist/plugins/font/FontLocale.d.ts +15 -0
- package/dist/plugins/font/FontLocale.d.ts.map +1 -0
- package/dist/plugins/font/FontPlugin.d.ts +3 -0
- package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
- package/dist/plugins/font-size/FontSizeLocale.d.ts +17 -0
- package/dist/plugins/font-size/FontSizeLocale.d.ts.map +1 -0
- package/dist/plugins/font-size/FontSizeOperations.d.ts +22 -0
- package/dist/plugins/font-size/FontSizeOperations.d.ts.map +1 -0
- package/dist/plugins/font-size/FontSizePlugin.d.ts +4 -10
- package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -1
- package/dist/plugins/font-size/FontSizePopup.d.ts +11 -0
- package/dist/plugins/font-size/FontSizePopup.d.ts.map +1 -0
- package/dist/plugins/font-size.mjs +2 -217
- package/dist/plugins/font-size.mjs.map +1 -1
- package/dist/plugins/font.mjs +2 -183
- package/dist/plugins/font.mjs.map +1 -1
- package/dist/plugins/hard-break.mjs +1 -1
- package/dist/plugins/heading/HeadingLocale.d.ts +26 -0
- package/dist/plugins/heading/HeadingLocale.d.ts.map +1 -0
- package/dist/plugins/heading/HeadingPlugin.d.ts +4 -0
- package/dist/plugins/heading/HeadingPlugin.d.ts.map +1 -1
- package/dist/plugins/heading.mjs +1 -184
- package/dist/plugins/heading.mjs.map +1 -1
- package/dist/plugins/highlight/HighlightLocale.d.ts +17 -0
- package/dist/plugins/highlight/HighlightLocale.d.ts.map +1 -0
- package/dist/plugins/highlight/HighlightPlugin.d.ts +3 -5
- package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
- package/dist/plugins/highlight.mjs +2 -123
- package/dist/plugins/highlight.mjs.map +1 -1
- package/dist/plugins/horizontal-rule/HorizontalRuleLocale.d.ts +15 -0
- package/dist/plugins/horizontal-rule/HorizontalRuleLocale.d.ts.map +1 -0
- package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts +4 -0
- package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
- package/dist/plugins/horizontal-rule.mjs +2 -56
- package/dist/plugins/horizontal-rule.mjs.map +1 -1
- package/dist/plugins/image/ImageLocale.d.ts +25 -0
- package/dist/plugins/image/ImageLocale.d.ts.map +1 -0
- package/dist/plugins/image/ImageNodeView.d.ts.map +1 -1
- package/dist/plugins/image/ImagePlugin.d.ts +1 -0
- package/dist/plugins/image/ImagePlugin.d.ts.map +1 -1
- package/dist/plugins/image/ImageUpload.d.ts +3 -0
- package/dist/plugins/image/ImageUpload.d.ts.map +1 -1
- package/dist/plugins/image.mjs +4 -378
- package/dist/plugins/image.mjs.map +1 -1
- package/dist/plugins/link/LinkLocale.d.ts +23 -0
- package/dist/plugins/link/LinkLocale.d.ts.map +1 -0
- package/dist/plugins/link/LinkPlugin.d.ts +3 -0
- package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
- package/dist/plugins/link.mjs +2 -124
- package/dist/plugins/link.mjs.map +1 -1
- package/dist/plugins/list/ListLocale.d.ts +18 -0
- package/dist/plugins/list/ListLocale.d.ts.map +1 -0
- package/dist/plugins/list/ListPlugin.d.ts +4 -0
- package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
- package/dist/plugins/list.mjs +2 -190
- package/dist/plugins/list.mjs.map +1 -1
- package/dist/plugins/print/PrintContentPreparer.d.ts +12 -0
- package/dist/plugins/print/PrintContentPreparer.d.ts.map +1 -0
- package/dist/plugins/print/PrintLocale.d.ts +16 -0
- package/dist/plugins/print/PrintLocale.d.ts.map +1 -0
- package/dist/plugins/print/PrintPlugin.d.ts +13 -0
- package/dist/plugins/print/PrintPlugin.d.ts.map +1 -0
- package/dist/plugins/print/PrintServiceImpl.d.ts +7 -0
- package/dist/plugins/print/PrintServiceImpl.d.ts.map +1 -0
- package/dist/plugins/print/PrintStyleCollector.d.ts +17 -0
- package/dist/plugins/print/PrintStyleCollector.d.ts.map +1 -0
- package/dist/plugins/print/PrintTypes.d.ts +61 -0
- package/dist/plugins/print/PrintTypes.d.ts.map +1 -0
- package/dist/plugins/shared/ColorMarkOperations.d.ts +28 -0
- package/dist/plugins/shared/ColorMarkOperations.d.ts.map +1 -0
- package/dist/plugins/shared/ColorNames.d.ts +22 -0
- package/dist/plugins/shared/ColorNames.d.ts.map +1 -0
- package/dist/plugins/shared/ColorPickerPopup.d.ts +31 -0
- package/dist/plugins/shared/ColorPickerPopup.d.ts.map +1 -0
- package/dist/plugins/shared/ColorValidation.d.ts +14 -0
- package/dist/plugins/shared/ColorValidation.d.ts.map +1 -0
- package/dist/plugins/strikethrough/StrikethroughLocale.d.ts +17 -0
- package/dist/plugins/strikethrough/StrikethroughLocale.d.ts.map +1 -0
- package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts +3 -0
- package/dist/plugins/strikethrough/StrikethroughPlugin.d.ts.map +1 -1
- package/dist/plugins/strikethrough.mjs +2 -32
- package/dist/plugins/strikethrough.mjs.map +1 -1
- package/dist/plugins/super-sub/SuperSubLocale.d.ts +19 -0
- package/dist/plugins/super-sub/SuperSubLocale.d.ts.map +1 -0
- package/dist/plugins/super-sub/SuperSubPlugin.d.ts +3 -0
- package/dist/plugins/super-sub/SuperSubPlugin.d.ts.map +1 -1
- package/dist/plugins/super-sub.mjs +2 -78
- package/dist/plugins/super-sub.mjs.map +1 -1
- package/dist/plugins/table/TableBorderColor.d.ts +24 -0
- package/dist/plugins/table/TableBorderColor.d.ts.map +1 -0
- package/dist/plugins/table/TableCommands.d.ts +9 -8
- package/dist/plugins/table/TableCommands.d.ts.map +1 -1
- package/dist/plugins/table/TableContextMenu.d.ts +14 -0
- package/dist/plugins/table/TableContextMenu.d.ts.map +1 -0
- package/dist/plugins/table/TableControls.d.ts +3 -1
- package/dist/plugins/table/TableControls.d.ts.map +1 -1
- package/dist/plugins/table/TableControlsDOM.d.ts +13 -1
- package/dist/plugins/table/TableControlsDOM.d.ts.map +1 -1
- package/dist/plugins/table/TableLocale.d.ts +48 -0
- package/dist/plugins/table/TableLocale.d.ts.map +1 -0
- package/dist/plugins/table/TableNavigation.d.ts +2 -1
- package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
- package/dist/plugins/table/TableNodeViews.d.ts +3 -1
- package/dist/plugins/table/TableNodeViews.d.ts.map +1 -1
- package/dist/plugins/table/TablePlugin.d.ts +7 -1
- package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
- package/dist/plugins/table/index.d.ts +3 -0
- package/dist/plugins/table/index.d.ts.map +1 -1
- package/dist/plugins/table.mjs +18 -660
- package/dist/plugins/table.mjs.map +1 -1
- package/dist/plugins/text-color/TextColorLocale.d.ts +17 -0
- package/dist/plugins/text-color/TextColorLocale.d.ts.map +1 -0
- package/dist/plugins/text-color/TextColorPlugin.d.ts +3 -5
- package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
- package/dist/plugins/text-color.mjs +2 -123
- package/dist/plugins/text-color.mjs.map +1 -1
- package/dist/plugins/text-formatting/TextFormattingLocale.d.ts +18 -0
- package/dist/plugins/text-formatting/TextFormattingLocale.d.ts.map +1 -0
- package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts +4 -0
- package/dist/plugins/text-formatting/TextFormattingPlugin.d.ts.map +1 -1
- package/dist/plugins/text-formatting.mjs +2 -49
- package/dist/plugins/text-formatting.mjs.map +1 -1
- package/dist/plugins/toolbar/ToolbarLocale.d.ts +14 -0
- package/dist/plugins/toolbar/ToolbarLocale.d.ts.map +1 -0
- package/dist/plugins/toolbar/ToolbarPlugin.d.ts +1 -0
- package/dist/plugins/toolbar/ToolbarPlugin.d.ts.map +1 -1
- package/dist/plugins/toolbar.mjs +1 -1
- package/dist/state/EditorState.d.ts +4 -1
- package/dist/state/EditorState.d.ts.map +1 -1
- package/dist/view/EditorView.d.ts.map +1 -1
- package/dist/view/Reconciler.d.ts.map +1 -1
- package/package.json +3 -2
- package/dist/chunks/Plugin-B9OZ6Y4c.mjs +0 -15
- package/dist/chunks/Plugin-B9OZ6Y4c.mjs.map +0 -1
- package/dist/chunks/ToolbarPlugin-D5VqeBPT.mjs.map +0 -1
- package/dist/chunks/color-picker-Csf0wx5a.mjs +0 -5
- package/dist/chunks/color-picker-Csf0wx5a.mjs.map +0 -1
- package/dist/chunks/index-CPPb-Jah.mjs +0 -569
- package/dist/chunks/index-CPPb-Jah.mjs.map +0 -1
|
@@ -1,37 +1,18 @@
|
|
|
1
|
-
import { S as t } from "./
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
|
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
|
|
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
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}),
|
|
61
|
-
o4.preventDefault(), o4.stopPropagation(), e3.onSelect(t4,
|
|
62
|
-
}),
|
|
63
|
-
e3.onSelect(t4,
|
|
64
|
-
}), o3.appendChild(
|
|
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
|
|
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 =
|
|
132
|
-
|
|
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 =
|
|
138
|
-
|
|
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 =
|
|
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),
|
|
152
|
-
if (!
|
|
153
|
-
const s2 =
|
|
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] = (
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
|
148
|
+
const o2 = this.getActiveElement(), i2 = e2.indexOf(o2);
|
|
179
149
|
switch (t2.key) {
|
|
180
150
|
case "ArrowDown": {
|
|
181
151
|
t2.preventDefault();
|
|
182
|
-
const
|
|
183
|
-
e2[
|
|
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
|
|
189
|
-
e2[
|
|
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(),
|
|
164
|
+
t2.preventDefault(), o2 && o2.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, cancelable: true }));
|
|
195
165
|
}
|
|
196
166
|
}
|
|
197
167
|
}
|
|
198
|
-
class
|
|
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 =
|
|
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",
|
|
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
|
|
227
|
-
class
|
|
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
|
|
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", "
|
|
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 =
|
|
274
|
-
this.focusedIndex = e2 >= 0 ? e2 : 0,
|
|
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
|
-
|
|
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
|
|
292
|
-
if (0 !==
|
|
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 =
|
|
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 =
|
|
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
|
|
308
|
-
|
|
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
|
|
314
|
-
|
|
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
|
|
324
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
396
|
-
|
|
363
|
+
b as T,
|
|
364
|
+
m as a,
|
|
365
|
+
c as b,
|
|
366
|
+
a as c
|
|
397
367
|
};
|
|
398
|
-
//# sourceMappingURL=ToolbarPlugin-
|
|
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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"}
|