@notectl/core 1.0.9 → 1.7.0
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/dist/chunks/{AttrRegistry-D-przlzb.mjs → AttrRegistry-I-VdmRnN.mjs} +2 -2
- package/dist/chunks/{AttrRegistry-D-przlzb.mjs.map → AttrRegistry-I-VdmRnN.mjs.map} +1 -1
- package/dist/chunks/CaretNavigation-CAJXoaae.mjs +311 -0
- package/dist/chunks/CaretNavigation-CAJXoaae.mjs.map +1 -0
- package/dist/chunks/ColorNames-BdsHwA2f.mjs +59 -0
- package/dist/chunks/ColorNames-BdsHwA2f.mjs.map +1 -0
- package/dist/chunks/ColorPickerPopup-xL8ZUfpB.mjs +125 -0
- package/dist/chunks/ColorPickerPopup-xL8ZUfpB.mjs.map +1 -0
- package/dist/chunks/Commands-CicwYoTQ.mjs +286 -0
- package/dist/chunks/Commands-CicwYoTQ.mjs.map +1 -0
- package/dist/chunks/{Document-CI3iCwEP.mjs → Document-CuwE73FF.mjs} +35 -22
- package/dist/chunks/{Document-CI3iCwEP.mjs.map → Document-CuwE73FF.mjs.map} +1 -1
- package/dist/chunks/HTMLUtils-DTqQzcKR.mjs +35 -0
- package/dist/chunks/HTMLUtils-DTqQzcKR.mjs.map +1 -0
- package/dist/chunks/MarkCommands-CC37WA7Z.mjs +94 -0
- package/dist/chunks/MarkCommands-CC37WA7Z.mjs.map +1 -0
- package/dist/chunks/NavigationUtils-CyW0Vo8A.mjs +47 -0
- package/dist/chunks/NavigationUtils-CyW0Vo8A.mjs.map +1 -0
- package/dist/chunks/{NodeResolver-D68ZLXti.mjs → NodeResolver-B-wzthAQ.mjs} +2 -2
- package/dist/chunks/{NodeResolver-D68ZLXti.mjs.map → NodeResolver-B-wzthAQ.mjs.map} +1 -1
- package/dist/chunks/Platform-S_xqIqcM.mjs +26 -0
- package/dist/chunks/Platform-S_xqIqcM.mjs.map +1 -0
- package/dist/chunks/Selection-DmFDwiPJ.mjs +52 -0
- package/dist/chunks/Selection-DmFDwiPJ.mjs.map +1 -0
- package/dist/chunks/ToolbarItem-BpZggUGo.mjs +8 -0
- package/dist/chunks/ToolbarItem-BpZggUGo.mjs.map +1 -0
- package/dist/chunks/{ToolbarPlugin-DFkl1uYO.mjs → ToolbarPlugin-B6JETWaw.mjs} +3 -3
- package/dist/chunks/{ToolbarPlugin-DFkl1uYO.mjs.map → ToolbarPlugin-B6JETWaw.mjs.map} +1 -1
- package/dist/chunks/index--z_Txzej.mjs +467 -0
- package/dist/chunks/index--z_Txzej.mjs.map +1 -0
- package/dist/chunks/{index-uTnc9y7M.mjs → index-B-NSeaM4.mjs} +28 -28
- package/dist/chunks/index-B-NSeaM4.mjs.map +1 -0
- package/dist/chunks/{index-BTJfyJlJ.mjs → index-B9GkDVsx.mjs} +104 -104
- package/dist/chunks/index-B9GkDVsx.mjs.map +1 -0
- package/dist/chunks/{index-BRYzYOYC.mjs → index-C0cEs7Jc.mjs} +29 -29
- package/dist/chunks/index-C0cEs7Jc.mjs.map +1 -0
- package/dist/chunks/{index-BFsYGsBR.mjs → index-C9gc3Bws.mjs} +42 -42
- package/dist/chunks/{index-BFsYGsBR.mjs.map → index-C9gc3Bws.mjs.map} +1 -1
- package/dist/chunks/{index-DGrRWMlW.mjs → index-CAV2N-fF.mjs} +105 -105
- package/dist/chunks/index-CAV2N-fF.mjs.map +1 -0
- package/dist/chunks/{index-BQ8iIYLn.mjs → index-CKPrAOr6.mjs} +54 -54
- package/dist/chunks/index-CKPrAOr6.mjs.map +1 -0
- package/dist/chunks/{index-Bsp4LC5t.mjs → index-CNs4QQ8l.mjs} +36 -36
- package/dist/chunks/index-CNs4QQ8l.mjs.map +1 -0
- package/dist/chunks/{index-DC1EK22F.mjs → index-CflvcXSd.mjs} +24 -19
- package/dist/chunks/index-CflvcXSd.mjs.map +1 -0
- package/dist/chunks/{index-o6hDR07y.mjs → index-CoeD4T9-.mjs} +25 -20
- package/dist/chunks/index-CoeD4T9-.mjs.map +1 -0
- package/dist/chunks/{index-DA8TG2S8.mjs → index-D0s0Q8Wc.mjs} +56 -56
- package/dist/chunks/index-D0s0Q8Wc.mjs.map +1 -0
- package/dist/chunks/{index-BIL37LSL.mjs → index-D8tbbW97.mjs} +18 -18
- package/dist/chunks/{index-BIL37LSL.mjs.map → index-D8tbbW97.mjs.map} +1 -1
- package/dist/chunks/{index-DfO_fKw6.mjs → index-DMt3ojrY.mjs} +15 -15
- package/dist/chunks/{index-DfO_fKw6.mjs.map → index-DMt3ojrY.mjs.map} +1 -1
- package/dist/chunks/{index-BCvuDpVr.mjs → index-DfzCof6H.mjs} +31 -31
- package/dist/chunks/index-DfzCof6H.mjs.map +1 -0
- package/dist/chunks/{index-BL56fbXt.mjs → index-DyIwN_67.mjs} +89 -87
- package/dist/chunks/index-DyIwN_67.mjs.map +1 -0
- package/dist/chunks/{index-BSFLNveF.mjs → index-FlTg80Pk.mjs} +352 -341
- package/dist/chunks/index-FlTg80Pk.mjs.map +1 -0
- package/dist/chunks/{index-DAFCISBN.mjs → index-pxbbDHVH.mjs} +8 -8
- package/dist/chunks/{index-DAFCISBN.mjs.map → index-pxbbDHVH.mjs.map} +1 -1
- package/dist/chunks/resolvePluginLocale-B4w1OkPy.mjs.map +1 -1
- package/dist/commands/Commands.d.ts +13 -45
- package/dist/commands/Commands.d.ts.map +1 -1
- package/dist/commands/DeleteCommands.d.ts +15 -0
- package/dist/commands/DeleteCommands.d.ts.map +1 -0
- package/dist/commands/GapCursorCommands.d.ts +24 -0
- package/dist/commands/GapCursorCommands.d.ts.map +1 -0
- package/dist/commands/MarkCommands.d.ts +19 -0
- package/dist/commands/MarkCommands.d.ts.map +1 -0
- package/dist/commands/MovementCommands.d.ts +27 -0
- package/dist/commands/MovementCommands.d.ts.map +1 -0
- package/dist/commands/NodeSelectionCommands.d.ts +24 -0
- package/dist/commands/NodeSelectionCommands.d.ts.map +1 -0
- package/dist/commands/PasteCommand.d.ts.map +1 -1
- package/dist/commands/WordBoundary.d.ts +12 -0
- package/dist/commands/WordBoundary.d.ts.map +1 -0
- package/dist/editor/DocumentSerializer.d.ts.map +1 -1
- package/dist/editor/NotectlEditor.d.ts +7 -1
- package/dist/editor/NotectlEditor.d.ts.map +1 -1
- package/dist/index.d.ts +28 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/input/ClipboardHandler.d.ts.map +1 -1
- package/dist/input/CompositionTracker.d.ts +14 -0
- package/dist/input/CompositionTracker.d.ts.map +1 -0
- package/dist/input/FileHandlerRegistry.d.ts +16 -0
- package/dist/input/FileHandlerRegistry.d.ts.map +1 -0
- package/dist/input/InputHandler.d.ts +6 -4
- package/dist/input/InputHandler.d.ts.map +1 -1
- package/dist/input/InputRuleRegistry.d.ts +9 -0
- package/dist/input/InputRuleRegistry.d.ts.map +1 -0
- package/dist/input/KeyboardHandler.d.ts +20 -5
- package/dist/input/KeyboardHandler.d.ts.map +1 -1
- package/dist/input/Keymap.d.ts +11 -0
- package/dist/input/Keymap.d.ts.map +1 -1
- package/dist/input/KeymapRegistry.d.ts +19 -0
- package/dist/input/KeymapRegistry.d.ts.map +1 -0
- package/dist/input/PasteHandler.d.ts +3 -0
- package/dist/input/PasteHandler.d.ts.map +1 -1
- package/dist/model/Document.d.ts +8 -0
- package/dist/model/Document.d.ts.map +1 -1
- package/dist/model/GraphemeUtils.d.ts +20 -0
- package/dist/model/GraphemeUtils.d.ts.map +1 -0
- package/dist/model/HTMLUtils.d.ts +6 -1
- package/dist/model/HTMLUtils.d.ts.map +1 -1
- package/dist/model/NavigationUtils.d.ts +16 -0
- package/dist/model/NavigationUtils.d.ts.map +1 -0
- package/dist/model/SchemaRegistry.d.ts +0 -39
- package/dist/model/SchemaRegistry.d.ts.map +1 -1
- package/dist/model/Selection.d.ts +14 -3
- package/dist/model/Selection.d.ts.map +1 -1
- package/dist/notectl-core.mjs +2797 -2515
- package/dist/notectl-core.mjs.map +1 -1
- package/dist/notectl-core.umd.js +5869 -4844
- package/dist/notectl-core.umd.js.map +1 -1
- package/dist/plugins/Plugin.d.ts +17 -3
- package/dist/plugins/Plugin.d.ts.map +1 -1
- package/dist/plugins/PluginManager.d.ts +14 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -1
- package/dist/plugins/alignment.mjs +3 -3
- package/dist/plugins/blockquote.mjs +2 -2
- package/dist/plugins/caret-navigation/CaretNavigationPlugin.d.ts +35 -0
- package/dist/plugins/caret-navigation/CaretNavigationPlugin.d.ts.map +1 -0
- package/dist/plugins/caret-navigation/index.d.ts +2 -0
- package/dist/plugins/caret-navigation/index.d.ts.map +1 -0
- package/dist/plugins/caret-navigation.mjs +5 -0
- package/dist/plugins/caret-navigation.mjs.map +1 -0
- package/dist/plugins/code-block/CodeBlockKeyboardHandlers.d.ts.map +1 -1
- package/dist/plugins/code-block/CodeBlockPlugin.d.ts.map +1 -1
- package/dist/plugins/code-block.mjs +3 -3
- package/dist/plugins/font/FontPlugin.d.ts.map +1 -1
- package/dist/plugins/font-size/FontSizeOperations.d.ts.map +1 -1
- package/dist/plugins/font-size.mjs +2 -2
- package/dist/plugins/font.mjs +2 -2
- package/dist/plugins/gap-cursor/GapCursorPlugin.d.ts +15 -0
- package/dist/plugins/gap-cursor/GapCursorPlugin.d.ts.map +1 -0
- package/dist/plugins/gap-cursor/index.d.ts +2 -0
- package/dist/plugins/gap-cursor/index.d.ts.map +1 -0
- package/dist/plugins/gap-cursor.mjs +65 -0
- package/dist/plugins/gap-cursor.mjs.map +1 -0
- package/dist/plugins/hard-break.mjs +1 -1
- package/dist/plugins/heading/BlockTypePickerRegistry.d.ts +9 -0
- package/dist/plugins/heading/BlockTypePickerRegistry.d.ts.map +1 -0
- package/dist/plugins/heading/HeadingInputRules.d.ts.map +1 -1
- package/dist/plugins/heading/HeadingKeyboardHandlers.d.ts.map +1 -1
- package/dist/plugins/heading.mjs +2 -2
- package/dist/plugins/highlight/HighlightPlugin.d.ts.map +1 -1
- package/dist/plugins/highlight.mjs +2 -2
- package/dist/plugins/horizontal-rule/HorizontalRulePlugin.d.ts.map +1 -1
- package/dist/plugins/horizontal-rule.mjs +2 -2
- package/dist/plugins/image/ImageCommands.d.ts.map +1 -1
- package/dist/plugins/image.mjs +3 -3
- package/dist/plugins/link/LinkPlugin.d.ts.map +1 -1
- package/dist/plugins/link.mjs +2 -2
- package/dist/plugins/list/ListPlugin.d.ts.map +1 -1
- package/dist/plugins/list.mjs +2 -2
- package/dist/plugins/print/PrintStyleCollector.d.ts.map +1 -1
- package/dist/plugins/print/PrintTypes.d.ts +5 -1
- package/dist/plugins/print/PrintTypes.d.ts.map +1 -1
- package/dist/plugins/shared/ColorMarkOperations.d.ts.map +1 -1
- package/dist/plugins/shared/ColorValidation.d.ts +7 -0
- package/dist/plugins/shared/ColorValidation.d.ts.map +1 -1
- package/dist/plugins/strikethrough.mjs +2 -2
- package/dist/plugins/super-sub.mjs +2 -2
- package/dist/plugins/table/TableCommands.d.ts.map +1 -1
- package/dist/plugins/table/TableNavigation.d.ts.map +1 -1
- package/dist/plugins/table/TablePlugin.d.ts.map +1 -1
- package/dist/plugins/table.mjs +10 -10
- package/dist/plugins/text-color/TextColorPlugin.d.ts.map +1 -1
- package/dist/plugins/text-color.mjs +2 -2
- package/dist/plugins/text-formatting.mjs +1 -1
- package/dist/plugins/toolbar/ToolbarItem.d.ts.map +1 -1
- package/dist/plugins/toolbar/ToolbarRegistry.d.ts +12 -0
- package/dist/plugins/toolbar/ToolbarRegistry.d.ts.map +1 -0
- package/dist/plugins/toolbar.mjs +2 -2
- package/dist/presets/FullPreset.d.ts +16 -0
- package/dist/presets/FullPreset.d.ts.map +1 -0
- package/dist/presets/MinimalPreset.d.ts +7 -0
- package/dist/presets/MinimalPreset.d.ts.map +1 -0
- package/dist/presets/PresetTypes.d.ts +50 -0
- package/dist/presets/PresetTypes.d.ts.map +1 -0
- package/dist/state/EditorState.d.ts.map +1 -1
- package/dist/state/History.d.ts.map +1 -1
- package/dist/state/SelectionTransactions.d.ts +10 -0
- package/dist/state/SelectionTransactions.d.ts.map +1 -0
- package/dist/test/TestUtils.d.ts +23 -0
- package/dist/test/TestUtils.d.ts.map +1 -1
- package/dist/view/CaretNavigation.d.ts +48 -0
- package/dist/view/CaretNavigation.d.ts.map +1 -0
- package/dist/view/CursorWrapper.d.ts +19 -0
- package/dist/view/CursorWrapper.d.ts.map +1 -0
- package/dist/view/DomPointUtils.d.ts +20 -0
- package/dist/view/DomPointUtils.d.ts.map +1 -0
- package/dist/view/EditorView.d.ts +43 -0
- package/dist/view/EditorView.d.ts.map +1 -1
- package/dist/view/MarkRendering.d.ts +7 -0
- package/dist/view/MarkRendering.d.ts.map +1 -0
- package/dist/view/NodeViewRegistry.d.ts +9 -0
- package/dist/view/NodeViewRegistry.d.ts.map +1 -0
- package/dist/view/Platform.d.ts +29 -0
- package/dist/view/Platform.d.ts.map +1 -0
- package/dist/view/Reconciler.d.ts +4 -0
- package/dist/view/Reconciler.d.ts.map +1 -1
- package/dist/view/SelectionSync.d.ts +2 -0
- package/dist/view/SelectionSync.d.ts.map +1 -1
- package/dist/view/ViewMovementCommands.d.ts +40 -0
- package/dist/view/ViewMovementCommands.d.ts.map +1 -0
- package/package.json +10 -2
- package/dist/chunks/ColorNames-iaWsSZx1.mjs +0 -35
- package/dist/chunks/ColorNames-iaWsSZx1.mjs.map +0 -1
- package/dist/chunks/ColorValidation-Dyy4Bye8.mjs +0 -140
- package/dist/chunks/ColorValidation-Dyy4Bye8.mjs.map +0 -1
- package/dist/chunks/Commands-CSpSwGXv.mjs +0 -461
- package/dist/chunks/Commands-CSpSwGXv.mjs.map +0 -1
- package/dist/chunks/HTMLUtils-0wvCRvJc.mjs +0 -7
- package/dist/chunks/HTMLUtils-0wvCRvJc.mjs.map +0 -1
- package/dist/chunks/Selection-D5ZjXoB7.mjs +0 -44
- package/dist/chunks/Selection-D5ZjXoB7.mjs.map +0 -1
- package/dist/chunks/ToolbarItem-ugDymuXi.mjs +0 -7
- package/dist/chunks/ToolbarItem-ugDymuXi.mjs.map +0 -1
- package/dist/chunks/index-BCvuDpVr.mjs.map +0 -1
- package/dist/chunks/index-BL56fbXt.mjs.map +0 -1
- package/dist/chunks/index-BQ8iIYLn.mjs.map +0 -1
- package/dist/chunks/index-BRYzYOYC.mjs.map +0 -1
- package/dist/chunks/index-BSFLNveF.mjs.map +0 -1
- package/dist/chunks/index-BTJfyJlJ.mjs.map +0 -1
- package/dist/chunks/index-Bsp4LC5t.mjs.map +0 -1
- package/dist/chunks/index-DA8TG2S8.mjs.map +0 -1
- package/dist/chunks/index-DC1EK22F.mjs.map +0 -1
- package/dist/chunks/index-DGrRWMlW.mjs.map +0 -1
- package/dist/chunks/index-o6hDR07y.mjs.map +0 -1
- package/dist/chunks/index-uTnc9y7M.mjs.map +0 -1
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { EditorSelection, Position, Selection } from '../model/Selection.js';
|
|
2
|
+
/** Gets the selection object, preferring shadow root's selection for Shadow DOM. */
|
|
3
|
+
export declare function getSelection(container: HTMLElement): globalThis.Selection | null;
|
|
2
4
|
/** Syncs the editor state selection to the DOM. */
|
|
3
5
|
export declare function syncSelectionToDOM(container: HTMLElement, selection: EditorSelection): void;
|
|
4
6
|
/** Reads the current DOM selection and converts it to a state selection. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionSync.d.ts","sourceRoot":"","sources":["../../src/view/SelectionSync.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"SelectionSync.d.ts","sourceRoot":"","sources":["../../src/view/SelectionSync.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAelF,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,UAAU,CAAC,SAAS,GAAG,IAAI,CAMhF;AAED,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,GAAG,IAAI,CAmC3F;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAgB7E;AAsED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CACjC,SAAS,EAAE,WAAW,EACtB,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GACf,QAAQ,GAAG,IAAI,CAwEjB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { EditorState } from '../state/EditorState.js';
|
|
2
|
+
import { Transaction } from '../state/Transaction.js';
|
|
3
|
+
type Direction = 'forward' | 'backward';
|
|
4
|
+
type Granularity = 'word' | 'lineboundary' | 'line';
|
|
5
|
+
/**
|
|
6
|
+
* Moves the cursor using `Selection.modify('move', direction, granularity)`.
|
|
7
|
+
* Falls back to model-based movement when the API is unavailable.
|
|
8
|
+
*/
|
|
9
|
+
export declare function viewMove(container: HTMLElement, state: EditorState, direction: Direction, granularity: Granularity): Transaction | null;
|
|
10
|
+
/**
|
|
11
|
+
* Extends the selection using `Selection.modify('extend', direction, granularity)`.
|
|
12
|
+
* Falls back to model-based extension when the API is unavailable.
|
|
13
|
+
*/
|
|
14
|
+
export declare function viewExtend(container: HTMLElement, state: EditorState, direction: Direction, granularity: Granularity): Transaction | null;
|
|
15
|
+
/** Moves the cursor one word forward. */
|
|
16
|
+
export declare function moveWordForward(container: HTMLElement, state: EditorState): Transaction | null;
|
|
17
|
+
/** Moves the cursor one word backward. */
|
|
18
|
+
export declare function moveWordBackward(container: HTMLElement, state: EditorState): Transaction | null;
|
|
19
|
+
/** Moves the cursor to the start of the line (visual). */
|
|
20
|
+
export declare function moveToLineStart(container: HTMLElement, state: EditorState): Transaction | null;
|
|
21
|
+
/** Moves the cursor to the end of the line (visual). */
|
|
22
|
+
export declare function moveToLineEnd(container: HTMLElement, state: EditorState): Transaction | null;
|
|
23
|
+
/** Moves the cursor one visual line up. */
|
|
24
|
+
export declare function moveLineUp(container: HTMLElement, state: EditorState): Transaction | null;
|
|
25
|
+
/** Moves the cursor one visual line down. */
|
|
26
|
+
export declare function moveLineDown(container: HTMLElement, state: EditorState): Transaction | null;
|
|
27
|
+
/** Extends the selection one word forward. */
|
|
28
|
+
export declare function extendWordForward(container: HTMLElement, state: EditorState): Transaction | null;
|
|
29
|
+
/** Extends the selection one word backward. */
|
|
30
|
+
export declare function extendWordBackward(container: HTMLElement, state: EditorState): Transaction | null;
|
|
31
|
+
/** Extends the selection to the start of the line. */
|
|
32
|
+
export declare function extendToLineStart(container: HTMLElement, state: EditorState): Transaction | null;
|
|
33
|
+
/** Extends the selection to the end of the line. */
|
|
34
|
+
export declare function extendToLineEnd(container: HTMLElement, state: EditorState): Transaction | null;
|
|
35
|
+
/** Extends the selection one visual line up. */
|
|
36
|
+
export declare function extendLineUp(container: HTMLElement, state: EditorState): Transaction | null;
|
|
37
|
+
/** Extends the selection one visual line down. */
|
|
38
|
+
export declare function extendLineDown(container: HTMLElement, state: EditorState): Transaction | null;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=ViewMovementCommands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewMovementCommands.d.ts","sourceRoot":"","sources":["../../src/view/ViewMovementCommands.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAI3D,KAAK,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AACxC,KAAK,WAAW,GAAG,MAAM,GAAG,cAAc,GAAG,MAAM,CAAC;AAMpD;;;GAGG;AACH,wBAAgB,QAAQ,CACvB,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,GACtB,WAAW,GAAG,IAAI,CAwDpB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACzB,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,GACtB,WAAW,GAAG,IAAI,CA2DpB;AA4HD,yCAAyC;AACzC,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAE9F;AAED,0CAA0C;AAC1C,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAE/F;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAE9F;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAE5F;AAED,2CAA2C;AAC3C,wBAAgB,UAAU,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAEzF;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAE3F;AAED,8CAA8C;AAC9C,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAEhG;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAEjG;AAED,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAEhG;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAE9F;AAED,gDAAgD;AAChD,wBAAgB,YAAY,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAE3F;AAED,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAE7F"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@notectl/core",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "A modern and accessable rich text editor shipped as a single Web Component. Immutable state, transaction-based architecture, and a plugin system that powers every feature.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -89,6 +89,14 @@
|
|
|
89
89
|
"./plugins/hard-break": {
|
|
90
90
|
"types": "./dist/plugins/hard-break/index.d.ts",
|
|
91
91
|
"import": "./dist/plugins/hard-break.mjs"
|
|
92
|
+
},
|
|
93
|
+
"./plugins/gap-cursor": {
|
|
94
|
+
"types": "./dist/plugins/gap-cursor/index.d.ts",
|
|
95
|
+
"import": "./dist/plugins/gap-cursor.mjs"
|
|
96
|
+
},
|
|
97
|
+
"./plugins/caret-navigation": {
|
|
98
|
+
"types": "./dist/plugins/caret-navigation/index.d.ts",
|
|
99
|
+
"import": "./dist/plugins/caret-navigation.mjs"
|
|
92
100
|
}
|
|
93
101
|
},
|
|
94
102
|
"customElements": "custom-elements.json",
|
|
@@ -150,7 +158,7 @@
|
|
|
150
158
|
"devDependencies": {
|
|
151
159
|
"@rollup/plugin-terser": "^0.4.4",
|
|
152
160
|
"@size-limit/preset-small-lib": "^12.0.0",
|
|
153
|
-
"happy-dom": "^20.
|
|
161
|
+
"happy-dom": "^20.7.0",
|
|
154
162
|
"size-limit": "^12.0.0",
|
|
155
163
|
"vite": "^7.3.1",
|
|
156
164
|
"vite-plugin-dts": "^4.5.4",
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
const e = /* @__PURE__ */ new Map([["#000000", "Black"], ["#434343", "Dark Gray 4"], ["#666666", "Dark Gray 3"], ["#999999", "Dark Gray 2"], ["#b7b7b7", "Dark Gray 1"], ["#cccccc", "Light Gray 3"], ["#d9d9d9", "Light Gray 2"], ["#efefef", "Light Gray 1"], ["#f3f3f3", "Near White"], ["#ffffff", "White"], ["#980000", "Dark Red Berry"], ["#ff0000", "Red"], ["#ff9900", "Orange"], ["#ffff00", "Yellow"], ["#00ff00", "Green"], ["#00ffff", "Cyan"], ["#4a86e8", "Cornflower Blue"], ["#0000ff", "Blue"], ["#9900ff", "Purple"], ["#ff00ff", "Magenta"], ["#e6b8af", "Light Red Berry 3"], ["#f4cccc", "Light Red 3"], ["#fce5cd", "Light Orange 3"], ["#fff2cc", "Light Yellow 3"], ["#d9ead3", "Light Green 3"], ["#d0e0e3", "Light Cyan 3"], ["#c9daf8", "Light Cornflower Blue 3"], ["#cfe2f3", "Light Blue 3"], ["#d9d2e9", "Light Purple 3"], ["#ead1dc", "Light Magenta 3"], ["#dd7e6b", "Light Red Berry 2"], ["#ea9999", "Light Red 2"], ["#f9cb9c", "Light Orange 2"], ["#ffe599", "Light Yellow 2"], ["#b6d7a8", "Light Green 2"], ["#a2c4c9", "Light Cyan 2"], ["#a4c2f4", "Light Cornflower Blue 2"], ["#9fc5e8", "Light Blue 2"], ["#b4a7d6", "Light Purple 2"], ["#d5a6bd", "Light Magenta 2"], ["#cc4125", "Light Red Berry 1"], ["#e06666", "Light Red 1"], ["#f6b26b", "Light Orange 1"], ["#ffd966", "Light Yellow 1"], ["#93c47d", "Light Green 1"], ["#76a5af", "Light Cyan 1"], ["#6d9eeb", "Light Cornflower Blue 1"], ["#6fa8dc", "Light Blue 1"], ["#8e7cc3", "Light Purple 1"], ["#c27ba0", "Light Magenta 1"], ["#a61c00", "Dark Red Berry 1"], ["#cc0000", "Dark Red 1"], ["#e69138", "Dark Orange 1"], ["#f1c232", "Dark Yellow 1"], ["#6aa84f", "Dark Green 1"], ["#45818e", "Dark Cyan 1"], ["#3c78d8", "Dark Cornflower Blue 1"], ["#3d85c6", "Dark Blue 1"], ["#674ea7", "Dark Purple 1"], ["#a64d79", "Dark Magenta 1"], ["#85200c", "Dark Red Berry 2"], ["#990000", "Dark Red 2"], ["#b45f06", "Dark Orange 2"], ["#bf9000", "Dark Yellow 2"], ["#38761d", "Dark Green 2"], ["#134f5c", "Dark Cyan 2"], ["#1155cc", "Dark Cornflower Blue 2"], ["#0b5394", "Dark Blue 2"], ["#351c75", "Dark Purple 2"], ["#741b47", "Dark Magenta 2"], ["#fff176", "Bright Yellow"], ["#aed581", "Light Green"], ["#4dd0e1", "Bright Cyan"], ["#64b5f6", "Sky Blue"], ["#ce93d8", "Lavender"], ["#f48fb1", "Pink"], ["#ffab91", "Peach"], ["#ff8a65", "Coral"], ["#e6ee9c", "Lime"], ["#80cbc4", "Teal"], ["#fff9c4", "Pale Yellow"], ["#dcedc8", "Pale Green"], ["#e0f7fa", "Pale Cyan"], ["#e3f2fd", "Pale Blue"], ["#f3e5f5", "Pale Purple"], ["#fce4ec", "Pale Pink"], ["#fff3e0", "Pale Orange"], ["#fbe9e7", "Pale Red"], ["#f9fbe7", "Pale Lime"], ["#e0f2f1", "Pale Teal"], ["#fff59d", "Soft Yellow"], ["#c5e1a5", "Soft Green"], ["#80deea", "Soft Cyan"], ["#90caf9", "Soft Blue"], ["#e1bee7", "Soft Purple"], ["#f8bbd0", "Soft Pink"], ["#ffcc80", "Soft Orange"], ["#a5d6a7", "Mint"], ["#ffee58", "Vivid Yellow"], ["#9ccc65", "Vivid Green"], ["#26c6da", "Vivid Cyan"], ["#42a5f5", "Vivid Blue"], ["#ab47bc", "Vivid Purple"], ["#ec407a", "Vivid Pink"], ["#ffa726", "Vivid Orange"], ["#ff7043", "Red Orange"], ["#d4e157", "Vivid Lime"], ["#66bb6a", "Emerald"], ["#fafafa", "Almost White"], ["#f5f5f5", "Lightest Gray"], ["#eeeeee", "Very Light Gray"], ["#e0e0e0", "Silver"], ["#bdbdbd", "Medium Gray"], ["#e8eaf6", "Lavender Gray"], ["#efebe9", "Warm Gray"], ["#eceff1", "Cool Gray"]]);
|
|
2
|
-
function a(a2) {
|
|
3
|
-
return e.get(a2.toLowerCase()) || (function(e2) {
|
|
4
|
-
const a3 = f(e2), r2 = Number.parseInt(a3.slice(1, 3), 16) / 255, t2 = Number.parseInt(a3.slice(3, 5), 16) / 255, n = Number.parseInt(a3.slice(5, 7), 16) / 255, c = Math.max(r2, t2, n), l = Math.min(r2, t2, n), d = (c + l) / 2, g = c - l;
|
|
5
|
-
if (g < 0.05) return d < 0.15 ? "Black" : d < 0.35 ? "Dark Gray" : d < 0.65 ? "Gray" : d < 0.85 ? "Light Gray" : "Near White";
|
|
6
|
-
let o = 0;
|
|
7
|
-
o = c === r2 ? 60 * ((t2 - n) / g + (t2 < n ? 6 : 0)) : c === t2 ? 60 * ((n - r2) / g + 2) : 60 * ((r2 - t2) / g + 4);
|
|
8
|
-
let h = "Red";
|
|
9
|
-
for (const [e3, a4] of i) if (o < e3) {
|
|
10
|
-
h = a4;
|
|
11
|
-
break;
|
|
12
|
-
}
|
|
13
|
-
return d < 0.25 ? `Very Dark ${h}` : d < 0.4 ? `Dark ${h}` : d > 0.8 ? `Very Light ${h}` : d > 0.65 ? `Light ${h}` : h;
|
|
14
|
-
})(a2);
|
|
15
|
-
}
|
|
16
|
-
function r(e2) {
|
|
17
|
-
const a2 = (function(e3) {
|
|
18
|
-
const a3 = f(e3);
|
|
19
|
-
return 0.2126 * t(Number.parseInt(a3.slice(1, 3), 16) / 255) + 0.7152 * t(Number.parseInt(a3.slice(3, 5), 16) / 255) + 0.0722 * t(Number.parseInt(a3.slice(5, 7), 16) / 255);
|
|
20
|
-
})(e2);
|
|
21
|
-
return a2 > 0.3;
|
|
22
|
-
}
|
|
23
|
-
function f(e2) {
|
|
24
|
-
const a2 = e2.toLowerCase();
|
|
25
|
-
return 4 === a2.length ? `#${a2[1]}${a2[1]}${a2[2]}${a2[2]}${a2[3]}${a2[3]}` : a2;
|
|
26
|
-
}
|
|
27
|
-
function t(e2) {
|
|
28
|
-
return e2 <= 0.03928 ? e2 / 12.92 : ((e2 + 0.055) / 1.055) ** 2.4;
|
|
29
|
-
}
|
|
30
|
-
const i = [[15, "Red"], [45, "Orange"], [65, "Yellow"], [150, "Green"], [190, "Cyan"], [250, "Blue"], [290, "Purple"], [330, "Pink"], [361, "Red"]];
|
|
31
|
-
export {
|
|
32
|
-
a as g,
|
|
33
|
-
r as i
|
|
34
|
-
};
|
|
35
|
-
//# sourceMappingURL=ColorNames-iaWsSZx1.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ColorNames-iaWsSZx1.mjs","sources":["../../src/plugins/shared/ColorNames.ts"],"sourcesContent":["/**\n * Human-readable color name lookup for accessibility.\n *\n * Provides descriptive names for color swatches so screen readers\n * announce \"Red\" instead of \"#ff0000\". Covers all default palette\n * colors with a fallback algorithm for custom hex values.\n */\n\n// ---------------------------------------------------------------------------\n// Static name map — covers every default palette color\n// ---------------------------------------------------------------------------\n\nconst COLOR_NAME_MAP: ReadonlyMap<string, string> = new Map([\n\t// ── TextColor palette (70 colors) ──────────────────────────────────────\n\n\t// Row 1 — Grays\n\t['#000000', 'Black'],\n\t['#434343', 'Dark Gray 4'],\n\t['#666666', 'Dark Gray 3'],\n\t['#999999', 'Dark Gray 2'],\n\t['#b7b7b7', 'Dark Gray 1'],\n\t['#cccccc', 'Light Gray 3'],\n\t['#d9d9d9', 'Light Gray 2'],\n\t['#efefef', 'Light Gray 1'],\n\t['#f3f3f3', 'Near White'],\n\t['#ffffff', 'White'],\n\n\t// Row 2 — Vivid\n\t['#980000', 'Dark Red Berry'],\n\t['#ff0000', 'Red'],\n\t['#ff9900', 'Orange'],\n\t['#ffff00', 'Yellow'],\n\t['#00ff00', 'Green'],\n\t['#00ffff', 'Cyan'],\n\t['#4a86e8', 'Cornflower Blue'],\n\t['#0000ff', 'Blue'],\n\t['#9900ff', 'Purple'],\n\t['#ff00ff', 'Magenta'],\n\n\t// Row 3 — Light 3 (lightest tint)\n\t['#e6b8af', 'Light Red Berry 3'],\n\t['#f4cccc', 'Light Red 3'],\n\t['#fce5cd', 'Light Orange 3'],\n\t['#fff2cc', 'Light Yellow 3'],\n\t['#d9ead3', 'Light Green 3'],\n\t['#d0e0e3', 'Light Cyan 3'],\n\t['#c9daf8', 'Light Cornflower Blue 3'],\n\t['#cfe2f3', 'Light Blue 3'],\n\t['#d9d2e9', 'Light Purple 3'],\n\t['#ead1dc', 'Light Magenta 3'],\n\n\t// Row 4 — Light 2\n\t['#dd7e6b', 'Light Red Berry 2'],\n\t['#ea9999', 'Light Red 2'],\n\t['#f9cb9c', 'Light Orange 2'],\n\t['#ffe599', 'Light Yellow 2'],\n\t['#b6d7a8', 'Light Green 2'],\n\t['#a2c4c9', 'Light Cyan 2'],\n\t['#a4c2f4', 'Light Cornflower Blue 2'],\n\t['#9fc5e8', 'Light Blue 2'],\n\t['#b4a7d6', 'Light Purple 2'],\n\t['#d5a6bd', 'Light Magenta 2'],\n\n\t// Row 5 — Light 1\n\t['#cc4125', 'Light Red Berry 1'],\n\t['#e06666', 'Light Red 1'],\n\t['#f6b26b', 'Light Orange 1'],\n\t['#ffd966', 'Light Yellow 1'],\n\t['#93c47d', 'Light Green 1'],\n\t['#76a5af', 'Light Cyan 1'],\n\t['#6d9eeb', 'Light Cornflower Blue 1'],\n\t['#6fa8dc', 'Light Blue 1'],\n\t['#8e7cc3', 'Light Purple 1'],\n\t['#c27ba0', 'Light Magenta 1'],\n\n\t// Row 6 — Dark 1\n\t['#a61c00', 'Dark Red Berry 1'],\n\t['#cc0000', 'Dark Red 1'],\n\t['#e69138', 'Dark Orange 1'],\n\t['#f1c232', 'Dark Yellow 1'],\n\t['#6aa84f', 'Dark Green 1'],\n\t['#45818e', 'Dark Cyan 1'],\n\t['#3c78d8', 'Dark Cornflower Blue 1'],\n\t['#3d85c6', 'Dark Blue 1'],\n\t['#674ea7', 'Dark Purple 1'],\n\t['#a64d79', 'Dark Magenta 1'],\n\n\t// Row 7 — Dark 2\n\t['#85200c', 'Dark Red Berry 2'],\n\t['#990000', 'Dark Red 2'],\n\t['#b45f06', 'Dark Orange 2'],\n\t['#bf9000', 'Dark Yellow 2'],\n\t['#38761d', 'Dark Green 2'],\n\t['#134f5c', 'Dark Cyan 2'],\n\t['#1155cc', 'Dark Cornflower Blue 2'],\n\t['#0b5394', 'Dark Blue 2'],\n\t['#351c75', 'Dark Purple 2'],\n\t['#741b47', 'Dark Magenta 2'],\n\n\t// ── Highlight palette (50 colors, minus duplicates) ────────────────────\n\n\t// Row 1 — Classic highlighter (bright, vivid)\n\t['#fff176', 'Bright Yellow'],\n\t['#aed581', 'Light Green'],\n\t['#4dd0e1', 'Bright Cyan'],\n\t['#64b5f6', 'Sky Blue'],\n\t['#ce93d8', 'Lavender'],\n\t['#f48fb1', 'Pink'],\n\t['#ffab91', 'Peach'],\n\t['#ff8a65', 'Coral'],\n\t['#e6ee9c', 'Lime'],\n\t['#80cbc4', 'Teal'],\n\n\t// Row 2 — Light pastels\n\t['#fff9c4', 'Pale Yellow'],\n\t['#dcedc8', 'Pale Green'],\n\t['#e0f7fa', 'Pale Cyan'],\n\t['#e3f2fd', 'Pale Blue'],\n\t['#f3e5f5', 'Pale Purple'],\n\t['#fce4ec', 'Pale Pink'],\n\t['#fff3e0', 'Pale Orange'],\n\t['#fbe9e7', 'Pale Red'],\n\t['#f9fbe7', 'Pale Lime'],\n\t['#e0f2f1', 'Pale Teal'],\n\n\t// Row 3 — Medium pastels\n\t['#fff59d', 'Soft Yellow'],\n\t['#c5e1a5', 'Soft Green'],\n\t['#80deea', 'Soft Cyan'],\n\t['#90caf9', 'Soft Blue'],\n\t['#e1bee7', 'Soft Purple'],\n\t['#f8bbd0', 'Soft Pink'],\n\t['#ffcc80', 'Soft Orange'],\n\t// #ffab91 duplicate → Peach (already mapped)\n\t// #e6ee9c duplicate → Lime (already mapped)\n\t['#a5d6a7', 'Mint'],\n\n\t// Row 4 — Bold pastels\n\t['#ffee58', 'Vivid Yellow'],\n\t['#9ccc65', 'Vivid Green'],\n\t['#26c6da', 'Vivid Cyan'],\n\t['#42a5f5', 'Vivid Blue'],\n\t['#ab47bc', 'Vivid Purple'],\n\t['#ec407a', 'Vivid Pink'],\n\t['#ffa726', 'Vivid Orange'],\n\t['#ff7043', 'Red Orange'],\n\t['#d4e157', 'Vivid Lime'],\n\t['#66bb6a', 'Emerald'],\n\n\t// Row 5 — Grays and neutral highlights\n\t// #ffffff duplicate → White (already mapped)\n\t['#fafafa', 'Almost White'],\n\t['#f5f5f5', 'Lightest Gray'],\n\t['#eeeeee', 'Very Light Gray'],\n\t['#e0e0e0', 'Silver'],\n\t['#bdbdbd', 'Medium Gray'],\n\t['#e8eaf6', 'Lavender Gray'],\n\t['#efebe9', 'Warm Gray'],\n\t['#eceff1', 'Cool Gray'],\n\t// #fafafa duplicate → Almost White (already mapped)\n]);\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Returns a human-readable name for a hex color.\n *\n * Checks the static map first, then falls back to a computed\n * description based on hue, saturation, and lightness.\n */\nexport function getColorName(hex: string): string {\n\tconst name: string | undefined = COLOR_NAME_MAP.get(hex.toLowerCase());\n\tif (name) return name;\n\treturn describeColor(hex);\n}\n\n/**\n * Determines whether a color is light enough to need a visible\n * border when rendered on a white background (WCAG 1.4.11).\n *\n * Uses a contrast-ratio threshold of 3:1 against white.\n */\nexport function isLightColor(hex: string): boolean {\n\tconst luminance: number = relativeLuminance(hex);\n\t// Contrast ratio against white: (1.05) / (L + 0.05) < 3\n\t// ⟹ L > 1.05/3 − 0.05 = 0.3\n\tconst LIGHT_THRESHOLD = 0.3;\n\treturn luminance > LIGHT_THRESHOLD;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Expands `#RGB` to `#RRGGBB` and lowercases. */\nfunction normalizeHex(hex: string): string {\n\tconst h: string = hex.toLowerCase();\n\tif (h.length === 4) {\n\t\treturn `#${h[1]}${h[1]}${h[2]}${h[2]}${h[3]}${h[3]}`;\n\t}\n\treturn h;\n}\n\n/** Applies sRGB linearization to a single channel value (0–1). */\nfunction linearize(channel: number): number {\n\treturn channel <= 0.03928 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;\n}\n\n/** Computes WCAG relative luminance from a hex color. */\nfunction relativeLuminance(hex: string): number {\n\tconst normalized: string = normalizeHex(hex);\n\tconst r: number = linearize(Number.parseInt(normalized.slice(1, 3), 16) / 255);\n\tconst g: number = linearize(Number.parseInt(normalized.slice(3, 5), 16) / 255);\n\tconst b: number = linearize(Number.parseInt(normalized.slice(5, 7), 16) / 255);\n\treturn 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/** Hue boundary table: upper bound (degrees) → name. */\nconst HUE_NAMES: readonly (readonly [number, string])[] = [\n\t[15, 'Red'],\n\t[45, 'Orange'],\n\t[65, 'Yellow'],\n\t[150, 'Green'],\n\t[190, 'Cyan'],\n\t[250, 'Blue'],\n\t[290, 'Purple'],\n\t[330, 'Pink'],\n\t[361, 'Red'],\n];\n\n/**\n * Generates a descriptive name from a hex color using HSL analysis.\n * Produces names like \"Dark Blue\", \"Light Green\", or \"Gray\".\n */\nfunction describeColor(hex: string): string {\n\tconst normalized: string = normalizeHex(hex);\n\tconst rRaw: number = Number.parseInt(normalized.slice(1, 3), 16) / 255;\n\tconst gRaw: number = Number.parseInt(normalized.slice(3, 5), 16) / 255;\n\tconst bRaw: number = Number.parseInt(normalized.slice(5, 7), 16) / 255;\n\n\tconst max: number = Math.max(rRaw, gRaw, bRaw);\n\tconst min: number = Math.min(rRaw, gRaw, bRaw);\n\tconst lightness: number = (max + min) / 2;\n\tconst delta: number = max - min;\n\n\t// Achromatic\n\tif (delta < 0.05) {\n\t\tif (lightness < 0.15) return 'Black';\n\t\tif (lightness < 0.35) return 'Dark Gray';\n\t\tif (lightness < 0.65) return 'Gray';\n\t\tif (lightness < 0.85) return 'Light Gray';\n\t\treturn 'Near White';\n\t}\n\n\t// Compute hue in degrees\n\tlet hue = 0;\n\tif (max === rRaw) {\n\t\thue = ((gRaw - bRaw) / delta + (gRaw < bRaw ? 6 : 0)) * 60;\n\t} else if (max === gRaw) {\n\t\thue = ((bRaw - rRaw) / delta + 2) * 60;\n\t} else {\n\t\thue = ((rRaw - gRaw) / delta + 4) * 60;\n\t}\n\n\t// Look up hue name\n\tlet hueName = 'Red';\n\tfor (const [threshold, name] of HUE_NAMES) {\n\t\tif (hue < threshold) {\n\t\t\thueName = name;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Lightness modifier\n\tif (lightness < 0.25) return `Very Dark ${hueName}`;\n\tif (lightness < 0.4) return `Dark ${hueName}`;\n\tif (lightness > 0.8) return `Very Light ${hueName}`;\n\tif (lightness > 0.65) return `Light ${hueName}`;\n\treturn hueName;\n}\n"],"names":["COLOR_NAME_MAP","Map","getColorName","hex","get","toLowerCase","normalized","normalizeHex","rRaw","Number","parseInt","slice","gRaw","bRaw","max","Math","min","lightness","delta","hue","hueName","threshold","name","HUE_NAMES","isLightColor","luminance","linearize","h","length","channel"],"mappings":"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"}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { n as t } from "./ToolbarKeyboardNav-B32OMv8r.mjs";
|
|
2
|
-
import { f as e } from "./Commands-CSpSwGXv.mjs";
|
|
3
|
-
import { i as o } from "./AttrRegistry-D-przlzb.mjs";
|
|
4
|
-
import { e as n, h as r } from "./Document-CI3iCwEP.mjs";
|
|
5
|
-
import { i as s, a as c, s as a } from "./Selection-D5ZjXoB7.mjs";
|
|
6
|
-
import { m as l } from "./TypeBrands-C09nE2qO.mjs";
|
|
7
|
-
import { g as i, i as d } from "./ColorNames-iaWsSZx1.mjs";
|
|
8
|
-
const p = '\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__grid [role="row"] {\n display: contents;\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';
|
|
9
|
-
function u(t2, e2) {
|
|
10
|
-
const r2 = t2.selection;
|
|
11
|
-
if (s(r2)) return null;
|
|
12
|
-
if (c(r2)) {
|
|
13
|
-
if (t2.storedMarks) {
|
|
14
|
-
const n2 = t2.storedMarks.find((t3) => t3.type === e2);
|
|
15
|
-
return n2 && o(n2, e2) ? n2.attrs.color ?? null : null;
|
|
16
|
-
}
|
|
17
|
-
const s2 = t2.getBlock(r2.anchor.blockId);
|
|
18
|
-
if (!s2) return null;
|
|
19
|
-
const c2 = n(s2, r2.anchor.offset).find((t3) => t3.type === e2);
|
|
20
|
-
return c2 && o(c2, e2) ? c2.attrs.color ?? null : null;
|
|
21
|
-
}
|
|
22
|
-
const a2 = t2.getBlock(r2.anchor.blockId);
|
|
23
|
-
if (!a2) return null;
|
|
24
|
-
const l2 = n(a2, r2.anchor.offset).find((t3) => t3.type === e2);
|
|
25
|
-
return l2 && o(l2, e2) ? l2.attrs.color ?? null : null;
|
|
26
|
-
}
|
|
27
|
-
function f(t2, e2) {
|
|
28
|
-
return null !== u(t2, e2);
|
|
29
|
-
}
|
|
30
|
-
function m(t2, o2, r2, i2) {
|
|
31
|
-
const d2 = o2.selection;
|
|
32
|
-
if (s(d2)) return false;
|
|
33
|
-
const p2 = l(r2);
|
|
34
|
-
if (c(d2)) {
|
|
35
|
-
const e2 = o2.getBlock(d2.anchor.blockId);
|
|
36
|
-
if (!e2) return false;
|
|
37
|
-
const s2 = [...(o2.storedMarks ?? n(e2, d2.anchor.offset)).filter((t3) => t3.type !== r2), { type: p2, attrs: { color: i2 } }], c2 = o2.transaction("command").setStoredMarks(s2, o2.storedMarks).setSelection(d2).build();
|
|
38
|
-
return t2.dispatch(c2), true;
|
|
39
|
-
}
|
|
40
|
-
const u2 = a(d2, o2.getBlockOrder()), f2 = o2.transaction("command"), m2 = { type: p2, attrs: { color: i2 } };
|
|
41
|
-
return e(o2, u2, (t3, e2, o3) => {
|
|
42
|
-
f2.removeMark(t3, e2, o3, { type: p2 }), f2.addMark(t3, e2, o3, m2);
|
|
43
|
-
}), f2.setSelection(d2), t2.dispatch(f2.build()), true;
|
|
44
|
-
}
|
|
45
|
-
function k(t2, o2, i2) {
|
|
46
|
-
const d2 = o2.selection;
|
|
47
|
-
if (s(d2)) return false;
|
|
48
|
-
const p2 = l(i2);
|
|
49
|
-
if (c(d2)) {
|
|
50
|
-
const e2 = o2.getBlock(d2.anchor.blockId);
|
|
51
|
-
if (!e2) return false;
|
|
52
|
-
const s2 = o2.storedMarks ?? n(e2, d2.anchor.offset);
|
|
53
|
-
if (!r(s2, p2)) return false;
|
|
54
|
-
const c2 = s2.filter((t3) => t3.type !== i2), a2 = o2.transaction("command").setStoredMarks(c2, o2.storedMarks).setSelection(d2).build();
|
|
55
|
-
return t2.dispatch(a2), true;
|
|
56
|
-
}
|
|
57
|
-
const u2 = a(d2, o2.getBlockOrder()), f2 = o2.transaction("command");
|
|
58
|
-
return e(o2, u2, (t3, e2, o3) => {
|
|
59
|
-
f2.removeMark(t3, e2, o3, { type: p2 });
|
|
60
|
-
}), f2.setSelection(d2), t2.dispatch(f2.build()), true;
|
|
61
|
-
}
|
|
62
|
-
const b = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"]), h = /* @__PURE__ */ new Set(["Home", "End"]);
|
|
63
|
-
function g(e2, o2, n2) {
|
|
64
|
-
e2.classList.add("notectl-color-picker");
|
|
65
|
-
const r2 = u(o2.getState(), n2.markType), s2 = n2.columns || 10, c2 = n2.colors.length, a2 = Math.ceil(c2 / s2), l2 = document.createElement("button");
|
|
66
|
-
l2.type = "button", l2.className = "notectl-color-picker__default", l2.textContent = n2.resetLabel, l2.addEventListener("mousedown", (t2) => {
|
|
67
|
-
t2.preventDefault(), t2.stopPropagation(), o2.executeCommand(n2.resetCommand), n2.onClose();
|
|
68
|
-
}), l2.addEventListener("keydown", (t2) => {
|
|
69
|
-
"Escape" === t2.key && (t2.preventDefault(), n2.onClose());
|
|
70
|
-
}), e2.appendChild(l2);
|
|
71
|
-
const p2 = document.createElement("div");
|
|
72
|
-
p2.className = "notectl-color-picker__grid", p2.setAttribute("role", "grid"), p2.setAttribute("aria-label", `${n2.ariaLabelPrefix} color picker`);
|
|
73
|
-
const f2 = [];
|
|
74
|
-
let k2 = 0;
|
|
75
|
-
for (let t2 = 0; t2 < a2; t2++) {
|
|
76
|
-
const e3 = document.createElement("div");
|
|
77
|
-
e3.setAttribute("role", "row");
|
|
78
|
-
for (let a3 = 0; a3 < s2; a3++) {
|
|
79
|
-
const l3 = t2 * s2 + a3;
|
|
80
|
-
if (l3 >= c2) break;
|
|
81
|
-
const p3 = n2.colors[l3], u2 = i(p3), b2 = !!r2 && r2.toLowerCase() === p3.toLowerCase(), h2 = document.createElement("button");
|
|
82
|
-
h2.type = "button", h2.className = "notectl-color-picker__swatch", h2.setAttribute("role", "gridcell"), h2.setAttribute("aria-label", `${n2.ariaLabelPrefix} ${u2}`), h2.setAttribute("aria-selected", String(b2)), h2.dataset.index = String(l3), h2.style.backgroundColor = p3, h2.title = p3, d(p3) && (h2.style.border = "1px solid #d0d0d0"), b2 && (h2.classList.add("notectl-color-picker__swatch--active"), k2 = l3), h2.addEventListener("mousedown", (t3) => {
|
|
83
|
-
t3.preventDefault(), t3.stopPropagation(), m(o2, o2.getState(), n2.markType, p3), n2.onClose();
|
|
84
|
-
}), f2.push(h2), e3.appendChild(h2);
|
|
85
|
-
}
|
|
86
|
-
p2.appendChild(e3);
|
|
87
|
-
}
|
|
88
|
-
x(f2, k2), p2.addEventListener("keydown", (e3) => {
|
|
89
|
-
if ("Escape" === e3.key) return e3.preventDefault(), void n2.onClose();
|
|
90
|
-
if ("Enter" === e3.key || " " === e3.key) {
|
|
91
|
-
e3.preventDefault();
|
|
92
|
-
const t2 = e3.target.dataset.index;
|
|
93
|
-
if (void 0 !== t2) {
|
|
94
|
-
const e4 = n2.colors[Number(t2)];
|
|
95
|
-
e4 && (m(o2, o2.getState(), n2.markType, e4), n2.onClose());
|
|
96
|
-
}
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
if (b.has(e3.key)) {
|
|
100
|
-
e3.preventDefault();
|
|
101
|
-
const o3 = Math.floor(k2 / s2) + 1, n3 = k2 % s2 + 1, r3 = a2, l3 = s2, [i2, d2] = t(o3, n3, r3, l3, e3.key);
|
|
102
|
-
let p3 = (i2 - 1) * s2 + (d2 - 1);
|
|
103
|
-
return p3 >= c2 && (p3 = c2 - 1), k2 = p3, x(f2, k2), void f2[k2]?.focus();
|
|
104
|
-
}
|
|
105
|
-
if (h.has(e3.key)) {
|
|
106
|
-
e3.preventDefault();
|
|
107
|
-
const t2 = Math.floor(k2 / s2) * s2, o3 = Math.min(t2 + s2 - 1, c2 - 1);
|
|
108
|
-
k2 = "Home" === e3.key ? t2 : o3, x(f2, k2), f2[k2]?.focus();
|
|
109
|
-
}
|
|
110
|
-
}), e2.appendChild(p2);
|
|
111
|
-
}
|
|
112
|
-
function x(t2, e2) {
|
|
113
|
-
for (let o2 = 0; o2 < t2.length; o2++) {
|
|
114
|
-
const n2 = t2[o2];
|
|
115
|
-
n2 && n2.setAttribute("tabindex", o2 === e2 ? "0" : "-1");
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
const v = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
|
|
119
|
-
function y(t2, e2, o2) {
|
|
120
|
-
if (!t2 || 0 === t2.length) return e2;
|
|
121
|
-
const n2 = t2.filter((t3) => {
|
|
122
|
-
return e3 = t3, !v.test(e3);
|
|
123
|
-
var e3;
|
|
124
|
-
});
|
|
125
|
-
if (n2.length > 0) throw new Error(`${o2}: invalid hex color(s): ${n2.join(", ")}. Expected format: #RGB or #RRGGBB.`);
|
|
126
|
-
const r2 = /* @__PURE__ */ new Set(), s2 = [];
|
|
127
|
-
for (const e3 of t2) {
|
|
128
|
-
const t3 = e3.toLowerCase();
|
|
129
|
-
r2.has(t3) || (r2.add(t3), s2.push(t3));
|
|
130
|
-
}
|
|
131
|
-
return s2;
|
|
132
|
-
}
|
|
133
|
-
export {
|
|
134
|
-
p as C,
|
|
135
|
-
k as a,
|
|
136
|
-
g as b,
|
|
137
|
-
f as i,
|
|
138
|
-
y as r
|
|
139
|
-
};
|
|
140
|
-
//# sourceMappingURL=ColorValidation-Dyy4Bye8.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ColorValidation-Dyy4Bye8.mjs","sources":["../../src/editor/styles/color-picker.ts","../../src/plugins/shared/ColorMarkOperations.ts","../../src/plugins/shared/ColorPickerPopup.ts","../../src/plugins/shared/ColorValidation.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__grid [role=\"row\"] {\n\tdisplay: contents;\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","/**\n * Shared color mark operations for color-based mark plugins.\n * All functions are parameterized by mark type name so they work\n * identically for TextColor, Highlight, or any future color mark.\n */\n\nimport { forEachBlockInRange } from '../../commands/Commands.js';\nimport { type MarkAttrRegistry, isMarkOfType } from '../../model/AttrRegistry.js';\nimport { getBlockMarksAtOffset, hasMark } from '../../model/Document.js';\nimport { isCollapsed, isNodeSelection, selectionRange } from '../../model/Selection.js';\nimport { markType } from '../../model/TypeBrands.js';\nimport type { MarkTypeName } from '../../model/TypeBrands.js';\nimport type { EditorState } from '../../state/EditorState.js';\nimport type { PluginContext } from '../Plugin.js';\n\n/** Color mark type names that have `{ color: string }` attrs. */\ntype ColorMarkType = {\n\t[K in keyof MarkAttrRegistry]: MarkAttrRegistry[K] extends { color: string } ? K : never;\n}[keyof MarkAttrRegistry];\n\n/**\n * Returns the active color value for the given mark type at the current\n * selection, or `null` if the mark is not present.\n */\nexport function getActiveColor(state: EditorState, markTypeName: ColorMarkType): string | null {\n\tconst sel = state.selection;\n\tif (isNodeSelection(sel)) return null;\n\n\tif (isCollapsed(sel)) {\n\t\tif (state.storedMarks) {\n\t\t\tconst mark = state.storedMarks.find((m) => m.type === markTypeName);\n\t\t\treturn mark && isMarkOfType(mark, markTypeName) ? (mark.attrs.color ?? null) : null;\n\t\t}\n\t\tconst block = state.getBlock(sel.anchor.blockId);\n\t\tif (!block) return null;\n\t\tconst marks = getBlockMarksAtOffset(block, sel.anchor.offset);\n\t\tconst mark = marks.find((m) => m.type === markTypeName);\n\t\treturn mark && isMarkOfType(mark, markTypeName) ? (mark.attrs.color ?? null) : null;\n\t}\n\n\tconst block = state.getBlock(sel.anchor.blockId);\n\tif (!block) return null;\n\tconst marks = getBlockMarksAtOffset(block, sel.anchor.offset);\n\tconst mark = marks.find((m) => m.type === markTypeName);\n\treturn mark && isMarkOfType(mark, markTypeName) ? (mark.attrs.color ?? null) : null;\n}\n\n/** Returns `true` when the given color mark is active at the current selection. */\nexport function isColorMarkActive(state: EditorState, markTypeName: ColorMarkType): boolean {\n\treturn getActiveColor(state, markTypeName) !== null;\n}\n\n/**\n * Applies the given color to the selection. For collapsed selections,\n * sets stored marks. For range selections, removes then re-adds the mark.\n */\nexport function applyColorMark(\n\tcontext: PluginContext,\n\tstate: EditorState,\n\tmarkTypeName: ColorMarkType,\n\tcolor: string,\n): boolean {\n\tconst sel = state.selection;\n\tif (isNodeSelection(sel)) return false;\n\n\tconst typeName: MarkTypeName = markType(markTypeName);\n\n\tif (isCollapsed(sel)) {\n\t\tconst anchorBlock = state.getBlock(sel.anchor.blockId);\n\t\tif (!anchorBlock) return false;\n\t\tconst currentMarks = state.storedMarks ?? getBlockMarksAtOffset(anchorBlock, sel.anchor.offset);\n\t\tconst withoutMark = currentMarks.filter((m) => m.type !== markTypeName);\n\t\tconst newMarks = [...withoutMark, { type: typeName, attrs: { color } }];\n\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setStoredMarks(newMarks, state.storedMarks)\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\tconst range = selectionRange(sel, state.getBlockOrder());\n\tconst builder = state.transaction('command');\n\tconst mark = { type: typeName, attrs: { color } };\n\n\tforEachBlockInRange(state, range, (blockId, from, to) => {\n\t\tbuilder.removeMark(blockId, from, to, { type: typeName });\n\t\tbuilder.addMark(blockId, from, to, mark);\n\t});\n\n\tbuilder.setSelection(sel);\n\tcontext.dispatch(builder.build());\n\treturn true;\n}\n\n/**\n * Removes the given color mark from the selection.\n * Returns `false` when the mark was not present.\n */\nexport function removeColorMark(\n\tcontext: PluginContext,\n\tstate: EditorState,\n\tmarkTypeName: ColorMarkType,\n): boolean {\n\tconst sel = state.selection;\n\tif (isNodeSelection(sel)) return false;\n\n\tconst typeName: MarkTypeName = markType(markTypeName);\n\n\tif (isCollapsed(sel)) {\n\t\tconst anchorBlock = state.getBlock(sel.anchor.blockId);\n\t\tif (!anchorBlock) return false;\n\t\tconst currentMarks = state.storedMarks ?? getBlockMarksAtOffset(anchorBlock, sel.anchor.offset);\n\t\tif (!hasMark(currentMarks, typeName)) return false;\n\n\t\tconst newMarks = currentMarks.filter((m) => m.type !== markTypeName);\n\t\tconst tr = state\n\t\t\t.transaction('command')\n\t\t\t.setStoredMarks(newMarks, state.storedMarks)\n\t\t\t.setSelection(sel)\n\t\t\t.build();\n\t\tcontext.dispatch(tr);\n\t\treturn true;\n\t}\n\n\tconst range = selectionRange(sel, state.getBlockOrder());\n\tconst builder = state.transaction('command');\n\n\tforEachBlockInRange(state, range, (blockId, from, to) => {\n\t\tbuilder.removeMark(blockId, from, to, { type: typeName });\n\t});\n\n\tbuilder.setSelection(sel);\n\tcontext.dispatch(builder.build());\n\treturn true;\n}\n","/**\n * Shared color picker popup rendering with WAI-ARIA grid keyboard navigation.\n * Used by TextColorPlugin and HighlightPlugin.\n */\n\nimport type { MarkAttrRegistry } from '../../model/AttrRegistry.js';\nimport type { PluginContext } from '../Plugin.js';\nimport { navigateGrid } from '../toolbar/ToolbarKeyboardNav.js';\nimport { applyColorMark, getActiveColor } from './ColorMarkOperations.js';\nimport { getColorName, isLightColor } from './ColorNames.js';\n\n/** Color mark type names that have `{ color: string }` attrs. */\ntype ColorMarkType = {\n\t[K in keyof MarkAttrRegistry]: MarkAttrRegistry[K] extends { color: string } ? K : never;\n}[keyof MarkAttrRegistry];\n\n/** Configuration for `renderColorPickerPopup`. */\nexport interface ColorPickerConfig {\n\treadonly markType: ColorMarkType;\n\treadonly colors: readonly string[];\n\treadonly columns: number;\n\treadonly resetLabel: string;\n\treadonly resetCommand: string;\n\treadonly ariaLabelPrefix: string;\n\treadonly onClose: () => void;\n}\n\nconst GRID_NAV_KEYS = new Set(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight']);\nconst GRID_HOME_END_KEYS = new Set(['Home', 'End']);\nconst LIGHT_COLOR_BORDER = '1px solid #d0d0d0';\nconst COLUMNS = 10;\n\n/**\n * Renders an accessible color picker popup into `container`.\n *\n * Features:\n * - WAI-ARIA `role=\"grid\"` with row/gridcell structure\n * - Arrow key navigation (wraps around, clamps on partial last row)\n * - Enter/Space selects color and closes popup\n * - Escape closes popup\n * - Roving tabindex on swatches\n */\nexport function renderColorPickerPopup(\n\tcontainer: HTMLElement,\n\tcontext: PluginContext,\n\tconfig: ColorPickerConfig,\n): void {\n\tcontainer.classList.add('notectl-color-picker');\n\n\tconst state = context.getState();\n\tconst activeColor: string | null = getActiveColor(state, config.markType);\n\tconst columns: number = config.columns || COLUMNS;\n\tconst totalSwatches: number = config.colors.length;\n\tconst totalRows: number = Math.ceil(totalSwatches / columns);\n\n\t// --- Reset button ---\n\tconst resetBtn: HTMLButtonElement = document.createElement('button');\n\tresetBtn.type = 'button';\n\tresetBtn.className = 'notectl-color-picker__default';\n\tresetBtn.textContent = config.resetLabel;\n\tresetBtn.addEventListener('mousedown', (e: MouseEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tcontext.executeCommand(config.resetCommand);\n\t\tconfig.onClose();\n\t});\n\tresetBtn.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tconfig.onClose();\n\t\t}\n\t});\n\tcontainer.appendChild(resetBtn);\n\n\t// --- Color grid ---\n\tconst grid: HTMLDivElement = document.createElement('div');\n\tgrid.className = 'notectl-color-picker__grid';\n\tgrid.setAttribute('role', 'grid');\n\tgrid.setAttribute('aria-label', `${config.ariaLabelPrefix} color picker`);\n\n\tconst swatches: HTMLButtonElement[] = [];\n\tlet focusedIndex = 0;\n\n\t// Build rows for ARIA structure\n\tfor (let rowIdx = 0; rowIdx < totalRows; rowIdx++) {\n\t\tconst row: HTMLDivElement = document.createElement('div');\n\t\trow.setAttribute('role', 'row');\n\n\t\tfor (let colIdx = 0; colIdx < columns; colIdx++) {\n\t\t\tconst swatchIdx: number = rowIdx * columns + colIdx;\n\t\t\tif (swatchIdx >= totalSwatches) break;\n\n\t\t\tconst color: string = config.colors[swatchIdx] as string;\n\t\t\tconst colorName: string = getColorName(color);\n\t\t\tconst isActive: boolean = !!activeColor && activeColor.toLowerCase() === color.toLowerCase();\n\n\t\t\tconst swatch: HTMLButtonElement = document.createElement('button');\n\t\t\tswatch.type = 'button';\n\t\t\tswatch.className = 'notectl-color-picker__swatch';\n\t\t\tswatch.setAttribute('role', 'gridcell');\n\t\t\tswatch.setAttribute('aria-label', `${config.ariaLabelPrefix} ${colorName}`);\n\t\t\tswatch.setAttribute('aria-selected', String(isActive));\n\t\t\tswatch.dataset.index = String(swatchIdx);\n\t\t\tswatch.style.backgroundColor = color;\n\t\t\tswatch.title = color;\n\n\t\t\tif (isLightColor(color)) {\n\t\t\t\tswatch.style.border = LIGHT_COLOR_BORDER;\n\t\t\t}\n\n\t\t\tif (isActive) {\n\t\t\t\tswatch.classList.add('notectl-color-picker__swatch--active');\n\t\t\t\tfocusedIndex = swatchIdx;\n\t\t\t}\n\n\t\t\t// Mouse handler\n\t\t\tswatch.addEventListener('mousedown', (e: MouseEvent) => {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tapplyColorMark(context, context.getState(), config.markType, color);\n\t\t\t\tconfig.onClose();\n\t\t\t});\n\n\t\t\tswatches.push(swatch);\n\t\t\trow.appendChild(swatch);\n\t\t}\n\n\t\tgrid.appendChild(row);\n\t}\n\n\t// Apply initial roving tabindex\n\tapplySwatchTabindex(swatches, focusedIndex);\n\n\t// --- Keyboard navigation (delegated on the grid) ---\n\tgrid.addEventListener('keydown', (e: KeyboardEvent) => {\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tconfig.onClose();\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault();\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tconst idx: string | undefined = target.dataset.index;\n\t\t\tif (idx !== undefined) {\n\t\t\t\tconst color: string | undefined = config.colors[Number(idx)];\n\t\t\t\tif (color) {\n\t\t\t\t\tapplyColorMark(context, context.getState(), config.markType, color);\n\t\t\t\t\tconfig.onClose();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (GRID_NAV_KEYS.has(e.key)) {\n\t\t\te.preventDefault();\n\t\t\tconst currentRow: number = Math.floor(focusedIndex / columns) + 1;\n\t\t\tconst currentCol: number = (focusedIndex % columns) + 1;\n\n\t\t\tconst maxRows: number = totalRows;\n\t\t\tconst maxCols: number = columns;\n\n\t\t\tconst [newRow, newCol] = navigateGrid(\n\t\t\t\tcurrentRow,\n\t\t\t\tcurrentCol,\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\n\t\t\t// Convert back to 0-based index and clamp to valid range\n\t\t\tlet newIdx: number = (newRow - 1) * columns + (newCol - 1);\n\t\t\tif (newIdx >= totalSwatches) {\n\t\t\t\tnewIdx = totalSwatches - 1;\n\t\t\t}\n\n\t\t\tfocusedIndex = newIdx;\n\t\t\tapplySwatchTabindex(swatches, focusedIndex);\n\t\t\tswatches[focusedIndex]?.focus();\n\t\t\treturn;\n\t\t}\n\n\t\t// Home/End — jump to first/last swatch in current row\n\t\tif (GRID_HOME_END_KEYS.has(e.key)) {\n\t\t\te.preventDefault();\n\t\t\tconst currentRow: number = Math.floor(focusedIndex / columns);\n\t\t\tconst rowStart: number = currentRow * columns;\n\t\t\tconst rowEnd: number = Math.min(rowStart + columns - 1, totalSwatches - 1);\n\n\t\t\tfocusedIndex = e.key === 'Home' ? rowStart : rowEnd;\n\t\t\tapplySwatchTabindex(swatches, focusedIndex);\n\t\t\tswatches[focusedIndex]?.focus();\n\t\t}\n\t});\n\n\tcontainer.appendChild(grid);\n}\n\n/** Sets `tabindex=\"0\"` on the focused swatch, `-1` on all others. */\nfunction applySwatchTabindex(swatches: readonly HTMLButtonElement[], focusedIndex: number): void {\n\tfor (let i = 0; i < swatches.length; i++) {\n\t\tconst swatch = swatches[i];\n\t\tif (swatch) {\n\t\t\tswatch.setAttribute('tabindex', i === focusedIndex ? '0' : '-1');\n\t\t}\n\t}\n}\n","/**\n * Shared color validation and normalization utilities\n * for color-based mark plugins (TextColor, Highlight).\n */\n\nconst HEX_COLOR_PATTERN: RegExp = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\n/** Returns `true` when the value is a valid `#RGB` or `#RRGGBB` hex color. */\nexport function isValidHexColor(value: string): boolean {\n\treturn HEX_COLOR_PATTERN.test(value);\n}\n\n/**\n * Validates, deduplicates, and normalizes a user-supplied color list.\n * Returns `fallbackPalette` when no custom colors are provided.\n *\n * @throws {Error} if any value is not a valid hex color code.\n */\nexport function resolveColors(\n\tcolors: readonly string[] | undefined,\n\tfallbackPalette: readonly string[],\n\tpluginName: string,\n): readonly string[] {\n\tif (!colors || colors.length === 0) return fallbackPalette;\n\n\tconst invalid: string[] = colors.filter((c) => !isValidHexColor(c));\n\tif (invalid.length > 0) {\n\t\tthrow new Error(\n\t\t\t`${pluginName}: invalid hex color(s): ${invalid.join(', ')}. Expected format: #RGB or #RRGGBB.`,\n\t\t);\n\t}\n\n\tconst seen: Set<string> = new Set();\n\tconst unique: string[] = [];\n\tfor (const color of colors) {\n\t\tconst normalized: string = color.toLowerCase();\n\t\tif (!seen.has(normalized)) {\n\t\t\tseen.add(normalized);\n\t\t\tunique.push(normalized);\n\t\t}\n\t}\n\treturn unique;\n}\n"],"names":["COLOR_PICKER_CSS","getActiveColor","state","markTypeName","sel","selection","isNodeSelection","isCollapsed","storedMarks","mark","find","m","type","isMarkOfType","attrs","color","block","getBlock","anchor","blockId","getBlockMarksAtOffset","offset","isColorMarkActive","applyColorMark","context","typeName","markType","anchorBlock","newMarks","filter","tr","transaction","setStoredMarks","setSelection","build","dispatch","range","selectionRange","getBlockOrder","builder","forEachBlockInRange","from","to","removeMark","addMark","removeColorMark","currentMarks","hasMark","GRID_NAV_KEYS","Set","GRID_HOME_END_KEYS","renderColorPickerPopup","container","config","classList","add","activeColor","getState","columns","totalSwatches","colors","length","totalRows","Math","ceil","resetBtn","document","createElement","className","textContent","resetLabel","addEventListener","e","preventDefault","stopPropagation","executeCommand","resetCommand","onClose","key","appendChild","grid","setAttribute","ariaLabelPrefix","swatches","focusedIndex","rowIdx","row","colIdx","swatchIdx","colorName","getColorName","isActive","toLowerCase","swatch","String","dataset","index","style","backgroundColor","title","isLightColor","border","push","applySwatchTabindex","idx","target","Number","has","currentRow","floor","currentCol","maxRows","maxCols","newRow","newCol","navigateGrid","newIdx","focus","rowStart","rowEnd","min","i","HEX_COLOR_PATTERN","resolveColors","fallbackPalette","pluginName","invalid","c","value","test","Error","join","seen","unique","normalized"],"mappings":";;;;;;;AACO,MAAMA,IAAmB;ACuBzB,SAASC,EAAeC,IAAoBC,IAAAA;AAClD,QAAMC,KAAMF,GAAMG;AAClB,MAAIC,EAAgBF,IAAM,QAAO;AAEjC,MAAIG,EAAYH,EAAAA,GAAM;AACrB,QAAIF,GAAMM,aAAa;AACtB,YAAMC,KAAOP,GAAMM,YAAYE,KAAMC,CAAAA,OAAMA,GAAEC,SAAST,EAAAA;AACtD,aAAOM,MAAQI,EAAaJ,IAAMN,MAAiBM,GAAKK,MAAMC,SAAS,OAAQ;AAAA,IAChF;AACA,UAAMC,KAAQd,GAAMe,SAASb,GAAIc,OAAOC;AACxC,QAAA,CAAKH,GAAO,QAAO;AACnB,UACMP,KADQW,EAAsBJ,IAAOZ,GAAIc,OAAOG,MAAAA,EACnCX,KAAMC,CAAAA,OAAMA,GAAEC,SAAST;AAC1C,WAAOM,MAAQI,EAAaJ,IAAMN,EAAAA,IAAiBM,GAAKK,MAAMC,SAAS,OAAQ;AAAA,EAChF;AAEA,QAAMC,KAAQd,GAAMe,SAASb,GAAIc,OAAOC,OAAAA;AACxC,MAAA,CAAKH,GAAO,QAAO;AACnB,QACMP,KADQW,EAAsBJ,IAAOZ,GAAIc,OAAOG,MAAAA,EACnCX,KAAMC,CAAAA,OAAMA,GAAEC,SAAST;AAC1C,SAAOM,MAAQI,EAAaJ,IAAMN,EAAAA,IAAiBM,GAAKK,MAAMC,SAAS,OAAQ;AAChF;AAGO,SAASO,EAAkBpB,IAAoBC,IAAAA;AACrD,SAA+C,SAAxCF,EAAeC,IAAOC,EAAAA;AAC9B;AAMO,SAASoB,EACfC,IACAtB,IACAC,IACAY,IAAAA;AAEA,QAAMX,KAAMF,GAAMG;AAClB,MAAIC,EAAgBF,EAAAA,EAAM,QAAA;AAE1B,QAAMqB,KAAyBC,EAASvB;AAExC,MAAII,EAAYH,KAAM;AACrB,UAAMuB,KAAczB,GAAMe,SAASb,GAAIc,OAAOC,OAAAA;AAC9C,QAAA,CAAKQ,GAAa,QAAA;AAClB,UAEMC,KAAW,CAAA,IAFI1B,GAAMM,eAAeY,EAAsBO,IAAavB,GAAIc,OAAOG,MAAAA,GACvDQ,OAAQlB,CAAAA,OAAMA,GAAEC,SAAST,KACxB,EAAES,MAAMa,IAAUX,OAAO,EAAEC,OAAAA,GAAAA,EAAAA,CAAAA,GAEvDe,KAAK5B,GACT6B,YAAY,WACZC,eAAeJ,IAAU1B,GAAMM,WAAAA,EAC/ByB,aAAa7B,EAAAA,EACb8B;AAEF,WADAV,GAAQW,SAASL,EAAAA,GAAAA;AAAAA,EAElB;AAEA,QAAMM,KAAQC,EAAejC,IAAKF,GAAMoC,cAAAA,CAAAA,GAClCC,KAAUrC,GAAM6B,YAAY,SAAA,GAC5BtB,KAAO,EAAEG,MAAMa,IAAUX,OAAO,EAAEC;AASxC,SAPAyB,EAAoBtC,IAAOkC,IAAO,CAACjB,IAASsB,IAAMC,OAAAA;AACjDH,IAAAA,GAAQI,WAAWxB,IAASsB,IAAMC,IAAI,EAAE9B,MAAMa,OAC9Cc,GAAQK,QAAQzB,IAASsB,IAAMC,IAAIjC,EAAAA;AAAAA,EAAAA,CAAAA,GAGpC8B,GAAQN,aAAa7B,EAAAA,GACrBoB,GAAQW,SAASI,GAAQL,MAAAA,CAAAA,GAAAA;AAE1B;AAMO,SAASW,EACfrB,IACAtB,IACAC,IAAAA;AAEA,QAAMC,KAAMF,GAAMG;AAClB,MAAIC,EAAgBF,IAAM,QAAA;AAE1B,QAAMqB,KAAyBC,EAASvB,EAAAA;AAExC,MAAII,EAAYH,EAAAA,GAAM;AACrB,UAAMuB,KAAczB,GAAMe,SAASb,GAAIc,OAAOC,OAAAA;AAC9C,QAAA,CAAKQ,GAAa,QAAA;AAClB,UAAMmB,KAAe5C,GAAMM,eAAeY,EAAsBO,IAAavB,GAAIc,OAAOG,MAAAA;AACxF,QAAA,CAAK0B,EAAQD,IAAcrB,IAAW,QAAA;AAEtC,UAAMG,KAAWkB,GAAajB,OAAQlB,CAAAA,OAAMA,GAAEC,SAAST,EAAAA,GACjD2B,KAAK5B,GACT6B,YAAY,WACZC,eAAeJ,IAAU1B,GAAMM,WAAAA,EAC/ByB,aAAa7B,IACb8B,MAAAA;AAEF,WADAV,GAAQW,SAASL,EAAAA,GAAAA;AAAAA,EAElB;AAEA,QAAMM,KAAQC,EAAejC,IAAKF,GAAMoC,kBAClCC,KAAUrC,GAAM6B,YAAY,SAAA;AAQlC,SANAS,EAAoBtC,IAAOkC,IAAO,CAACjB,IAASsB,IAAMC,OAAAA;AACjDH,IAAAA,GAAQI,WAAWxB,IAASsB,IAAMC,IAAI,EAAE9B,MAAMa;MAG/Cc,GAAQN,aAAa7B,EAAAA,GACrBoB,GAAQW,SAASI,GAAQL;AAE1B;AC9GA,MAAMc,wBAAoBC,IAAI,CAAC,WAAW,aAAa,aAAa,YAAA,CAAA,GAC9DC,IAAqB,oBAAID,IAAI,CAAC,QAAQ,KAAA,CAAA;AAcrC,SAASE,EACfC,IACA5B,IACA6B,IAAAA;AAEAD,EAAAA,GAAUE,UAAUC,IAAI,sBAAA;AAExB,QACMC,KAA6BvD,EADrBuB,GAAQiC,SAAAA,GACmCJ,GAAO3B,QAAAA,GAC1DgC,KAAkBL,GAAOK,WArBhB,IAsBTC,KAAwBN,GAAOO,OAAOC,QACtCC,KAAoBC,KAAKC,KAAKL,KAAgBD,EAAAA,GAG9CO,KAA8BC,SAASC,cAAc,QAAA;AAC3DF,EAAAA,GAASrD,OAAO,UAChBqD,GAASG,YAAY,iCACrBH,GAASI,cAAchB,GAAOiB,YAC9BL,GAASM,iBAAiB,aAAcC,CAAAA;AACvCA,IAAAA,GAAEC,eAAAA,GACFD,GAAEE,gBAAAA,GACFlD,GAAQmD,eAAetB,GAAOuB,YAAAA,GAC9BvB,GAAOwB;MAERZ,GAASM,iBAAiB,WAAYC,CAAAA,OAAAA;AACvB,iBAAVA,GAAEM,QACLN,GAAEC,eAAAA,GACFpB,GAAOwB,QAAAA;AAAAA,EAAAA,CAAAA,GAGTzB,GAAU2B,YAAYd,EAAAA;AAGtB,QAAMe,KAAuBd,SAASC,cAAc;AACpDa,EAAAA,GAAKZ,YAAY,8BACjBY,GAAKC,aAAa,QAAQ,SAC1BD,GAAKC,aAAa,cAAc,GAAG5B,GAAO6B,eAAAA,eAAAA;AAE1C,QAAMC,KAAgC,CAAA;AACtC,MAAIC,KAAe;AAGnB,WAASC,KAAS,GAAGA,KAASvB,IAAWuB,MAAU;AAClD,UAAMC,KAAsBpB,SAASC,cAAc,KAAA;AACnDmB,IAAAA,GAAIL,aAAa,QAAQ,KAAA;AAEzB,aAASM,KAAS,GAAGA,KAAS7B,IAAS6B,MAAU;AAChD,YAAMC,KAAoBH,KAAS3B,KAAU6B;AAC7C,UAAIC,MAAa7B,GAAe;AAEhC,YAAM5C,KAAgBsC,GAAOO,OAAO4B,EAAAA,GAC9BC,KAAoBC,EAAa3E,KACjC4E,KAAAA,CAAAA,CAAsBnC,MAAeA,GAAYoC,YAAAA,MAAkB7E,GAAM6E,YAAAA,GAEzEC,KAA4B3B,SAASC,cAAc,QAAA;AACzD0B,MAAAA,GAAOjF,OAAO,UACdiF,GAAOzB,YAAY,gCACnByB,GAAOZ,aAAa,QAAQ,aAC5BY,GAAOZ,aAAa,cAAc,GAAG5B,GAAO6B,eAAAA,IAAmBO,OAC/DI,GAAOZ,aAAa,iBAAiBa,OAAOH,EAAAA,CAAAA,GAC5CE,GAAOE,QAAQC,QAAQF,OAAON,EAAAA,GAC9BK,GAAOI,MAAMC,kBAAkBnF,IAC/B8E,GAAOM,QAAQpF,IAEXqF,EAAarF,QAChB8E,GAAOI,MAAMI,SA9EU,sBAiFpBV,OACHE,GAAOvC,UAAUC,IAAI,sCAAA,GACrB6B,KAAeI,KAIhBK,GAAOtB,iBAAiB,aAAcC,CAAAA,OAAAA;AACrCA,QAAAA,GAAEC,eAAAA,GACFD,GAAEE,gBAAAA,GACFnD,EAAeC,IAASA,GAAQiC,SAAAA,GAAYJ,GAAO3B,UAAUX,EAAAA,GAC7DsC,GAAOwB,QAAAA;AAAAA,MAAAA,CAAAA,GAGRM,GAASmB,KAAKT,EAAAA,GACdP,GAAIP,YAAYc;IACjB;AAEAb,IAAAA,GAAKD,YAAYO,EAAAA;AAAAA,EAClB;AAGAiB,IAAoBpB,IAAUC,EAAAA,GAG9BJ,GAAKT,iBAAiB,WAAYC,CAAAA,OAAAA;AACjC,QAAc,aAAVA,GAAEM,IAGL,QAFAN,GAAEC,eAAAA,GAAAA,KACFpB,GAAOwB,QAAAA;AAIR,QAAc,YAAVL,GAAEM,OAA6B,QAAVN,GAAEM,KAAa;AACvCN,MAAAA,GAAEC,eAAAA;AACF,YACM+B,KADShC,GAAEiC,OACsBV,QAAQC;AAC/C,UAAA,WAAIQ,IAAmB;AACtB,cAAMzF,KAA4BsC,GAAOO,OAAO8C,OAAOF;AACnDzF,QAAAA,OACHQ,EAAeC,IAASA,GAAQiC,SAAAA,GAAYJ,GAAO3B,UAAUX,EAAAA,GAC7DsC,GAAOwB;MAET;AACA;AAAA,IACD;AAEA,QAAI7B,EAAc2D,IAAInC,GAAEM,GAAAA,GAAM;AAC7BN,MAAAA,GAAEC,eAAAA;AACF,YAAMmC,KAAqB7C,KAAK8C,MAAMzB,KAAe1B,EAAAA,IAAW,GAC1DoD,KAAsB1B,KAAe1B,KAAW,GAEhDqD,KAAkBjD,IAClBkD,KAAkBtD,IAAAA,CAEjBuD,IAAQC,EAAAA,IAAUC,EACxBP,IACAE,IACAC,IACAC,IACAxC,GAAEM,GAAAA;AAIH,UAAIsC,MAAkBH,KAAS,KAAKvD,MAAWwD,KAAS;AAQxD,aAPIE,MAAUzD,OACbyD,KAASzD,KAAgB,IAG1ByB,KAAegC,IACfb,EAAoBpB,IAAUC,EAAAA,GAAAA,KAC9BD,GAASC,EAAAA,GAAeiC,MAAAA;AAAAA,IAEzB;AAGA,QAAInE,EAAmByD,IAAInC,GAAEM,GAAAA,GAAM;AAClCN,MAAAA,GAAEC,eAAAA;AACF,YACM6C,KADqBvD,KAAK8C,MAAMzB,KAAe1B,EAAAA,IACfA,IAChC6D,KAAiBxD,KAAKyD,IAAIF,KAAW5D,KAAU,GAAGC,KAAgB,CAAA;AAExEyB,MAAAA,KAAyB,WAAVZ,GAAEM,MAAiBwC,KAAWC,IAC7ChB,EAAoBpB,IAAUC,EAAAA,GAC9BD,GAASC,KAAeiC,MAAAA;AAAAA,IACzB;AAAA,EAAA,CAAA,GAGDjE,GAAU2B,YAAYC,EAAAA;AACvB;AAGA,SAASuB,EAAoBpB,IAAwCC,IAAAA;AACpE,WAASqC,KAAI,GAAGA,KAAItC,GAAStB,QAAQ4D,MAAK;AACzC,UAAM5B,KAASV,GAASsC,EAAAA;AACpB5B,IAAAA,MACHA,GAAOZ,aAAa,YAAYwC,OAAMrC,KAAe,MAAM,IAAA;AAAA,EAE7D;AACD;AC1MA,MAAMsC,IAA4B;AAa3B,SAASC,EACf/D,IACAgE,IACAC,IAAAA;AAEA,MAAA,CAAKjE,MAA4B,MAAlBA,GAAOC,OAAc,QAAO+D;AAE3C,QAAME,KAAoBlE,GAAO/B,OAAQkG,CAAAA;AAAM,WAjBhBC,KAiBiCD,KAhBzDL,EAAkBO,KAAKD;AADxB,QAAyBA;AAAAA,EAAAA,CAAAA;AAkB/B,MAAIF,GAAQjE,SAAS,EACpB,OAAM,IAAIqE,MACT,GAAGL,EAAAA,2BAAqCC,GAAQK,KAAK;AAIvD,QAAMC,yBAAwBnF,OACxBoF,KAAmB,CAAA;AACzB,aAAWtH,MAAS6C,IAAQ;AAC3B,UAAM0E,KAAqBvH,GAAM6E,YAAAA;AAC5BwC,IAAAA,GAAKzB,IAAI2B,EAAAA,MACbF,GAAK7E,IAAI+E,EAAAA,GACTD,GAAO/B,KAAKgC,EAAAA;AAAAA,EAEd;AACA,SAAOD;AACR;"}
|