@notectl/core 1.0.6 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -56
- 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-DFkl1uYO.mjs +818 -0
- package/dist/chunks/ToolbarPlugin-DFkl1uYO.mjs.map +1 -0
- package/dist/chunks/index-BCvuDpVr.mjs +191 -0
- package/dist/chunks/index-BCvuDpVr.mjs.map +1 -0
- package/dist/chunks/index-BFsYGsBR.mjs +92 -0
- package/dist/chunks/index-BFsYGsBR.mjs.map +1 -0
- package/dist/chunks/index-BIL37LSL.mjs +73 -0
- package/dist/chunks/index-BIL37LSL.mjs.map +1 -0
- package/dist/chunks/index-BL56fbXt.mjs +402 -0
- package/dist/chunks/index-BL56fbXt.mjs.map +1 -0
- package/dist/chunks/index-BQ8iIYLn.mjs +209 -0
- package/dist/chunks/index-BQ8iIYLn.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-BTJfyJlJ.mjs +187 -0
- package/dist/chunks/index-BTJfyJlJ.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-DA8TG2S8.mjs +220 -0
- package/dist/chunks/index-DA8TG2S8.mjs.map +1 -0
- package/dist/chunks/index-DAFCISBN.mjs +100 -0
- package/dist/chunks/index-DAFCISBN.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-DGrRWMlW.mjs +541 -0
- package/dist/chunks/index-DGrRWMlW.mjs.map +1 -0
- package/dist/chunks/index-DfO_fKw6.mjs +39 -0
- package/dist/chunks/index-DfO_fKw6.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/DocumentSerializer.d.ts.map +1 -1
- package/dist/editor/NotectlEditor.d.ts +37 -5
- 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/list.d.ts +2 -0
- package/dist/editor/styles/list.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 +48 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/input/ClipboardHandler.d.ts +2 -0
- package/dist/input/ClipboardHandler.d.ts.map +1 -1
- package/dist/input/InputHandler.d.ts +2 -0
- package/dist/input/InputHandler.d.ts.map +1 -1
- package/dist/input/KeyboardHandler.d.ts +2 -0
- package/dist/input/KeyboardHandler.d.ts.map +1 -1
- package/dist/input/LegacyHTMLNormalizer.d.ts +18 -0
- package/dist/input/LegacyHTMLNormalizer.d.ts.map +1 -0
- package/dist/input/PasteHandler.d.ts +4 -0
- package/dist/input/PasteHandler.d.ts.map +1 -1
- package/dist/model/HTMLParser.d.ts +13 -0
- package/dist/model/HTMLParser.d.ts.map +1 -1
- package/dist/model/SchemaRegistry.d.ts +2 -2
- package/dist/model/SchemaRegistry.d.ts.map +1 -1
- package/dist/notectl-core.mjs +2297 -1971
- package/dist/notectl-core.mjs.map +1 -1
- package/dist/notectl-core.umd.js +2894 -1825
- package/dist/notectl-core.umd.js.map +1 -1
- package/dist/plugins/Plugin.d.ts +17 -2
- package/dist/plugins/Plugin.d.ts.map +1 -1
- package/dist/plugins/PluginManager.d.ts +22 -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/CodeBlockLocale.d.ts +17 -0
- package/dist/plugins/code-block/CodeBlockLocale.d.ts.map +1 -0
- package/dist/plugins/code-block/CodeBlockPlugin.d.ts +1 -0
- package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockTypes.d.ts +2 -0
- package/dist/plugins/code-block/CodeBlockTypes.d.ts.map +1 -1
- 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/FontSizePlugin.d.ts +3 -0
- package/dist/plugins/font-size/FontSizePlugin.d.ts.map +1 -1
- package/dist/plugins/font-size/FontSizePopup.d.ts +2 -0
- package/dist/plugins/font-size/FontSizePopup.d.ts.map +1 -1
- package/dist/plugins/font-size.mjs +2 -201
- 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/HeadingBlockTypePicker.d.ts +14 -0
- package/dist/plugins/heading/HeadingBlockTypePicker.d.ts.map +1 -0
- package/dist/plugins/heading/HeadingCommands.d.ts +5 -0
- package/dist/plugins/heading/HeadingCommands.d.ts.map +1 -0
- package/dist/plugins/heading/HeadingInputRules.d.ts +5 -0
- package/dist/plugins/heading/HeadingInputRules.d.ts.map +1 -0
- package/dist/plugins/heading/HeadingKeyboardHandlers.d.ts +5 -0
- package/dist/plugins/heading/HeadingKeyboardHandlers.d.ts.map +1 -0
- 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 -40
- 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/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 +13 -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/PrintLocale.d.ts +16 -0
- package/dist/plugins/print/PrintLocale.d.ts.map +1 -0
- package/dist/plugins/print/PrintPlugin.d.ts +1 -0
- package/dist/plugins/print/PrintPlugin.d.ts.map +1 -1
- package/dist/plugins/print/PrintStyleCollector.d.ts +7 -0
- package/dist/plugins/print/PrintStyleCollector.d.ts.map +1 -1
- package/dist/plugins/print/PrintTypes.d.ts +5 -0
- package/dist/plugins/print/PrintTypes.d.ts.map +1 -1
- 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 +15 -0
- package/dist/plugins/toolbar/ToolbarLocale.d.ts.map +1 -0
- package/dist/plugins/toolbar/ToolbarOverflowBehavior.d.ts +23 -0
- package/dist/plugins/toolbar/ToolbarOverflowBehavior.d.ts.map +1 -0
- package/dist/plugins/toolbar/ToolbarOverflowController.d.ts +56 -0
- package/dist/plugins/toolbar/ToolbarOverflowController.d.ts.map +1 -0
- package/dist/plugins/toolbar/ToolbarPlugin.d.ts +18 -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/state/ReadonlyGuard.d.ts +6 -0
- package/dist/state/ReadonlyGuard.d.ts.map +1 -0
- package/dist/state/Transaction.d.ts +4 -0
- package/dist/state/Transaction.d.ts.map +1 -1
- package/dist/view/EditorView.d.ts +2 -0
- package/dist/view/EditorView.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-sJTiZr-S.mjs +0 -398
- package/dist/chunks/ToolbarPlugin-sJTiZr-S.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-QvKiO9_4.mjs +0 -538
- package/dist/chunks/index-QvKiO9_4.mjs.map +0 -1
- package/dist/input/SourceNormalizer.d.ts +0 -7
- package/dist/input/SourceNormalizer.d.ts.map +0 -1
|
@@ -1,398 +0,0 @@
|
|
|
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.setAttribute("data-notectl-no-print", ""), 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-sJTiZr-S.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarPlugin-sJTiZr-S.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.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","/** 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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"}
|
|
@@ -1,5 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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;"}
|