@doxi/react 0.11.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.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/DoxivaEditor.d.ts +20 -0
  4. package/dist/DoxivaEditor.d.ts.map +1 -0
  5. package/dist/DoxivaEditor.js +448 -0
  6. package/dist/DoxivaEditor.js.map +1 -0
  7. package/dist/Editor.d.ts +21 -0
  8. package/dist/Editor.d.ts.map +1 -0
  9. package/dist/Editor.js +49 -0
  10. package/dist/Editor.js.map +1 -0
  11. package/dist/HeaderFooterPopover.d.ts +49 -0
  12. package/dist/HeaderFooterPopover.d.ts.map +1 -0
  13. package/dist/HeaderFooterPopover.js +139 -0
  14. package/dist/HeaderFooterPopover.js.map +1 -0
  15. package/dist/ImagePopover.d.ts +23 -0
  16. package/dist/ImagePopover.d.ts.map +1 -0
  17. package/dist/ImagePopover.js +59 -0
  18. package/dist/ImagePopover.js.map +1 -0
  19. package/dist/LinkPopover.d.ts +25 -0
  20. package/dist/LinkPopover.d.ts.map +1 -0
  21. package/dist/LinkPopover.js +67 -0
  22. package/dist/LinkPopover.js.map +1 -0
  23. package/dist/PageSettingsPopover.d.ts +33 -0
  24. package/dist/PageSettingsPopover.d.ts.map +1 -0
  25. package/dist/PageSettingsPopover.js +48 -0
  26. package/dist/PageSettingsPopover.js.map +1 -0
  27. package/dist/TablePicker.d.ts +27 -0
  28. package/dist/TablePicker.d.ts.map +1 -0
  29. package/dist/TablePicker.js +38 -0
  30. package/dist/TablePicker.js.map +1 -0
  31. package/dist/Toolbar.d.ts +103 -0
  32. package/dist/Toolbar.d.ts.map +1 -0
  33. package/dist/Toolbar.js +161 -0
  34. package/dist/Toolbar.js.map +1 -0
  35. package/dist/index.d.ts +14 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +14 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/toolbar-builders/alignment.d.ts +4 -0
  40. package/dist/toolbar-builders/alignment.d.ts.map +1 -0
  41. package/dist/toolbar-builders/alignment.js +56 -0
  42. package/dist/toolbar-builders/alignment.js.map +1 -0
  43. package/dist/toolbar-builders/blocks.d.ts +4 -0
  44. package/dist/toolbar-builders/blocks.d.ts.map +1 -0
  45. package/dist/toolbar-builders/blocks.js +39 -0
  46. package/dist/toolbar-builders/blocks.js.map +1 -0
  47. package/dist/toolbar-builders/font-size.d.ts +4 -0
  48. package/dist/toolbar-builders/font-size.d.ts.map +1 -0
  49. package/dist/toolbar-builders/font-size.js +41 -0
  50. package/dist/toolbar-builders/font-size.js.map +1 -0
  51. package/dist/toolbar-builders/headings.d.ts +4 -0
  52. package/dist/toolbar-builders/headings.d.ts.map +1 -0
  53. package/dist/toolbar-builders/headings.js +18 -0
  54. package/dist/toolbar-builders/headings.js.map +1 -0
  55. package/dist/toolbar-builders/history.d.ts +3 -0
  56. package/dist/toolbar-builders/history.d.ts.map +1 -0
  57. package/dist/toolbar-builders/history.js +13 -0
  58. package/dist/toolbar-builders/history.js.map +1 -0
  59. package/dist/toolbar-builders/images.d.ts +4 -0
  60. package/dist/toolbar-builders/images.d.ts.map +1 -0
  61. package/dist/toolbar-builders/images.js +8 -0
  62. package/dist/toolbar-builders/images.js.map +1 -0
  63. package/dist/toolbar-builders/line-height.d.ts +4 -0
  64. package/dist/toolbar-builders/line-height.d.ts.map +1 -0
  65. package/dist/toolbar-builders/line-height.js +46 -0
  66. package/dist/toolbar-builders/line-height.js.map +1 -0
  67. package/dist/toolbar-builders/links.d.ts +4 -0
  68. package/dist/toolbar-builders/links.d.ts.map +1 -0
  69. package/dist/toolbar-builders/links.js +19 -0
  70. package/dist/toolbar-builders/links.js.map +1 -0
  71. package/dist/toolbar-builders/lists.d.ts +4 -0
  72. package/dist/toolbar-builders/lists.d.ts.map +1 -0
  73. package/dist/toolbar-builders/lists.js +38 -0
  74. package/dist/toolbar-builders/lists.js.map +1 -0
  75. package/dist/toolbar-builders/marks.d.ts +4 -0
  76. package/dist/toolbar-builders/marks.d.ts.map +1 -0
  77. package/dist/toolbar-builders/marks.js +41 -0
  78. package/dist/toolbar-builders/marks.js.map +1 -0
  79. package/dist/toolbar-builders/system.d.ts +12 -0
  80. package/dist/toolbar-builders/system.d.ts.map +1 -0
  81. package/dist/toolbar-builders/system.js +28 -0
  82. package/dist/toolbar-builders/system.js.map +1 -0
  83. package/dist/toolbar-builders/tables.d.ts +4 -0
  84. package/dist/toolbar-builders/tables.d.ts.map +1 -0
  85. package/dist/toolbar-builders/tables.js +235 -0
  86. package/dist/toolbar-builders/tables.js.map +1 -0
  87. package/dist/toolbar-builders/typography.d.ts +4 -0
  88. package/dist/toolbar-builders/typography.d.ts.map +1 -0
  89. package/dist/toolbar-builders/typography.js +123 -0
  90. package/dist/toolbar-builders/typography.js.map +1 -0
  91. package/dist/types.d.ts +85 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +28 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/useDoxivaEditor.d.ts +10 -0
  96. package/dist/useDoxivaEditor.d.ts.map +1 -0
  97. package/dist/useDoxivaEditor.js +30 -0
  98. package/dist/useDoxivaEditor.js.map +1 -0
  99. package/package.json +48 -0
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { insertTable } from '@doxi/core';
3
+ import { useState } from 'react';
4
+ const MAX_ROWS = 8;
5
+ const MAX_COLS = 8;
6
+ /**
7
+ * Insert-table popover content. Rendered by the {@link Toolbar} when its
8
+ * `table` popover is open. Props supplied by the toolbar:
9
+ * - `state` — current editor state (read schema, run the command).
10
+ * - `dispatch` — apply a transaction.
11
+ * - `close` — close the popover after committing.
12
+ *
13
+ * UX:
14
+ * - 8×8 grid of hoverable cells. Hover highlights the top-left
15
+ * (r+1) × (c+1) rectangle. Click commits an insertTable command at
16
+ * that size and closes the popover.
17
+ * - Label below the grid mirrors the current hover size, or
18
+ * "Insert table" when nothing is hovered.
19
+ * - `onMouseDown` is stopped from propagating so the toolbar's
20
+ * click-outside-to-close handler doesn't close the popover on
21
+ * a grid click before our `onClick` fires.
22
+ * - Escape close is handled by the Toolbar's popover container (its
23
+ * own keydown listener at the window level), mirroring LinkPopover.
24
+ */
25
+ export function TablePicker(props) {
26
+ const [hover, setHover] = useState(null);
27
+ const { state, dispatch, close } = props;
28
+ const pick = (r, c) => {
29
+ insertTable(state.schema, r + 1, c + 1)(state, dispatch);
30
+ close();
31
+ };
32
+ const label = hover ? `${hover.r + 1} × ${hover.c + 1}` : 'Insert table';
33
+ return (_jsxs("div", { className: "dx-toolbar-popover dx-table-picker", role: "dialog", "aria-label": "Insert table", onMouseDown: (e) => e.stopPropagation(), onMouseLeave: () => setHover(null), children: [_jsx("div", { className: "dx-table-picker-grid", children: Array.from({ length: MAX_ROWS }, (_, r) => Array.from({ length: MAX_COLS }, (_, c) => {
34
+ const on = hover !== null && r <= hover.r && c <= hover.c;
35
+ return (_jsx("button", { type: "button", className: 'dx-table-picker-cell' + (on ? ' is-on' : ''), "data-testid": `table-picker-cell-${r}-${c}`, "aria-label": `${r + 1} × ${c + 1}`, onMouseEnter: () => setHover({ r, c }), onMouseDown: (e) => e.preventDefault(), onClick: () => pick(r, c) }, `${r}-${c}`));
36
+ })) }), _jsx("div", { className: "dx-table-picker-label", children: label })] }));
37
+ }
38
+ //# sourceMappingURL=TablePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TablePicker.js","sourceRoot":"","sources":["../src/TablePicker.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAsC,MAAM,YAAY,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAY,MAAM,OAAO,CAAA;AAE1C,MAAM,QAAQ,GAAG,CAAC,CAAA;AAClB,MAAM,QAAQ,GAAG,CAAC,CAAA;AAElB;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,WAAW,CAAC,KAI3B;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAkC,IAAI,CAAC,CAAA;IACzE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;IAExC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAQ,EAAE;QAC1C,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QACxD,KAAK,EAAE,CAAA;IACT,CAAC,CAAA;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAA;IAExE,OAAO,CACL,eACE,SAAS,EAAC,oCAAoC,EAC9C,IAAI,EAAC,QAAQ,gBACF,cAAc,EACzB,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EACvC,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,aAElC,cAAK,SAAS,EAAC,sBAAsB,YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACzC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACxC,MAAM,EAAE,GAAG,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAA;oBACzD,OAAO,CACL,iBAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,sBAAsB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,iBAC3C,qBAAqB,CAAC,IAAI,CAAC,EAAE,gBAC9B,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACjC,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACtC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,EACtC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAPpB,GAAG,CAAC,IAAI,CAAC,EAAE,CAQhB,CACH,CAAA;gBACH,CAAC,CAAC,CACH,GACG,EACN,cAAK,SAAS,EAAC,uBAAuB,YAAE,KAAK,GAAO,IAChD,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,103 @@
1
+ import { type Command, type EditorState, type Schema, type Transaction } from '@doxi/core';
2
+ import { type ComponentType } from 'react';
3
+ import type { EditorHandle } from './types.js';
4
+ /**
5
+ * A single toolbar action.
6
+ * - `label` — visible text OR (when `icon` is set) screen-reader-only label.
7
+ * - `icon` — inline SVG markup (`<path .../>` etc.) rendered inside a 16×16 viewBox.
8
+ * - `isActive(state)` — drives the button's aria-pressed attribute. Use for
9
+ * toggle-style actions (Bold, alignment, line-height presets).
10
+ * - `command(state, dispatch)` — any @doxi/core Command.
11
+ */
12
+ export interface ToolbarAction {
13
+ readonly id: string;
14
+ readonly label: string;
15
+ readonly icon?: string;
16
+ readonly isActive?: (state: EditorState) => boolean;
17
+ readonly command: Command;
18
+ }
19
+ export interface ToolbarHistoryHandle {
20
+ readonly commands: {
21
+ readonly undo: Command;
22
+ readonly redo: Command;
23
+ };
24
+ }
25
+ /**
26
+ * A select-style toolbar control (e.g. font-size dropdown).
27
+ * - `getValue(state)` — returns the option value that should appear as
28
+ * selected. Return `''` when the value is mixed across the selection or
29
+ * unset.
30
+ * - `apply(state, dispatch, value)` — called when the user picks a value.
31
+ */
32
+ export interface ToolbarSelect {
33
+ readonly type: 'select';
34
+ readonly id: string;
35
+ readonly label: string;
36
+ readonly options: ReadonlyArray<{
37
+ readonly value: string;
38
+ readonly label: string;
39
+ }>;
40
+ readonly getValue: (state: EditorState) => string;
41
+ readonly apply: (state: EditorState, dispatch: (tr: Transaction) => void, value: string) => boolean;
42
+ }
43
+ /**
44
+ * A grid of color (or other discrete-value) swatches. Used for the color
45
+ * mark picker. Renders as a button whose click opens a floating panel
46
+ * containing the swatches.
47
+ */
48
+ export interface ToolbarPalette {
49
+ readonly type: 'palette';
50
+ readonly id: string;
51
+ readonly label: string;
52
+ /** Icon SVG path data (rendered inside a 24×24 viewBox). */
53
+ readonly icon: string;
54
+ /** Swatches displayed in the popover. */
55
+ readonly swatches: ReadonlyArray<{
56
+ readonly value: string;
57
+ readonly label: string;
58
+ readonly css: string;
59
+ }>;
60
+ /** Optional "default / clear" affordance, rendered above the swatches. */
61
+ readonly clearLabel?: string;
62
+ readonly getValue: (state: EditorState) => string;
63
+ readonly apply: (state: EditorState, dispatch: (tr: Transaction) => void, value: string) => boolean;
64
+ readonly clear?: (state: EditorState, dispatch: (tr: Transaction) => void) => boolean;
65
+ }
66
+ /**
67
+ * A toolbar control that opens an arbitrary popover keyed by `id`. Unlike
68
+ * palette, the popover content is rendered by a host-supplied React
69
+ * component looked up via `props.popovers[id]`. Used for the link editor.
70
+ */
71
+ export interface ToolbarPopover {
72
+ readonly type: 'popover';
73
+ readonly id: string;
74
+ readonly label: string;
75
+ readonly icon: string;
76
+ readonly isActive?: (state: EditorState) => boolean;
77
+ }
78
+ /** Toolbar items: an action, a separator divider, a select, a palette, or a popover. */
79
+ export type ToolbarItem = ToolbarAction | {
80
+ readonly type: 'separator';
81
+ } | ToolbarSelect | ToolbarPalette | ToolbarPopover;
82
+ export declare const TOOLBAR_SEPARATOR: ToolbarItem;
83
+ export declare const DEFAULT_FONT_SIZES: ReadonlyArray<number>;
84
+ /**
85
+ * Sentinel returned from a ToolbarSelect.getValue when the dropdown should
86
+ * display blank (e.g. selection has mixed values). The render code injects
87
+ * a hidden <option> with this value so the browser shows no label.
88
+ */
89
+ export declare const TOOLBAR_BLANK_VALUE = "__dx_blank__";
90
+ export declare function defaultToolbarActions(schema?: Schema, history?: ToolbarHistoryHandle): ToolbarItem[];
91
+ export type PopoverComponent = ComponentType<{
92
+ state: EditorState;
93
+ dispatch: (tr: Transaction) => void;
94
+ close: () => void;
95
+ }>;
96
+ export interface ToolbarProps {
97
+ readonly editor: EditorHandle;
98
+ readonly actions?: ReadonlyArray<ToolbarItem>;
99
+ readonly className?: string;
100
+ readonly popovers?: Readonly<Record<string, PopoverComponent>>;
101
+ }
102
+ export declare function Toolbar(props: ToolbarProps): JSX.Element;
103
+ //# sourceMappingURL=Toolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../src/Toolbar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { defaultSchema, } from '@doxi/core';
3
+ import { useEffect, useRef, useState } from 'react';
4
+ import { buildHistory } from './toolbar-builders/history.js';
5
+ import { buildHeadings } from './toolbar-builders/headings.js';
6
+ import { buildFontSize } from './toolbar-builders/font-size.js';
7
+ import { buildLists } from './toolbar-builders/lists.js';
8
+ import { buildMarks } from './toolbar-builders/marks.js';
9
+ import { buildAlignment } from './toolbar-builders/alignment.js';
10
+ import { buildBlocks } from './toolbar-builders/blocks.js';
11
+ import { buildLineHeight } from './toolbar-builders/line-height.js';
12
+ import { buildTypography } from './toolbar-builders/typography.js';
13
+ import { buildLinks } from './toolbar-builders/links.js';
14
+ import { buildTables } from './toolbar-builders/tables.js';
15
+ import { buildImages } from './toolbar-builders/images.js';
16
+ import { buildSystem } from './toolbar-builders/system.js';
17
+ export const TOOLBAR_SEPARATOR = { type: 'separator' };
18
+ export const DEFAULT_FONT_SIZES = [8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 48, 60, 72];
19
+ /**
20
+ * Sentinel returned from a ToolbarSelect.getValue when the dropdown should
21
+ * display blank (e.g. selection has mixed values). The render code injects
22
+ * a hidden <option> with this value so the browser shows no label.
23
+ */
24
+ export const TOOLBAR_BLANK_VALUE = '__dx_blank__';
25
+ export function defaultToolbarActions(schema = defaultSchema, history) {
26
+ return [
27
+ ...buildHistory(history),
28
+ ...buildHeadings(schema),
29
+ ...buildLists(schema),
30
+ ...buildFontSize(schema),
31
+ ...buildTypography(schema),
32
+ ...buildMarks(schema),
33
+ ...buildLinks(schema),
34
+ ...buildAlignment(schema),
35
+ ...buildBlocks(schema),
36
+ ...buildImages(schema),
37
+ ...buildTables(schema),
38
+ ...buildLineHeight(schema),
39
+ ...buildSystem(schema),
40
+ ];
41
+ }
42
+ function isSeparator(item) {
43
+ return item.type === 'separator';
44
+ }
45
+ function isSelect(item) {
46
+ return item.type === 'select';
47
+ }
48
+ function isPalette(item) {
49
+ return item.type === 'palette';
50
+ }
51
+ function isPopover(item) {
52
+ return item.type === 'popover';
53
+ }
54
+ function ToolbarPaletteButton(props) {
55
+ const { palette, state, dispatch, current } = props;
56
+ const [open, setOpen] = useState(false);
57
+ const wrapperRef = useRef(null);
58
+ const triggerRef = useRef(null);
59
+ useEffect(() => {
60
+ if (!open)
61
+ return;
62
+ function onDocMouseDown(e) {
63
+ const el = wrapperRef.current;
64
+ if (!el)
65
+ return;
66
+ if (e.target instanceof Node && el.contains(e.target))
67
+ return;
68
+ setOpen(false);
69
+ }
70
+ function onKeyDown(e) {
71
+ if (e.key === 'Escape')
72
+ setOpen(false);
73
+ }
74
+ window.addEventListener('mousedown', onDocMouseDown);
75
+ window.addEventListener('keydown', onKeyDown);
76
+ // Return focus to the trigger when the popover closes (Escape, click
77
+ // outside, swatch chosen). Without this, focus is lost into the
78
+ // document body and keyboard users have to Shift+Tab back.
79
+ return () => {
80
+ window.removeEventListener('mousedown', onDocMouseDown);
81
+ window.removeEventListener('keydown', onKeyDown);
82
+ triggerRef.current?.focus();
83
+ };
84
+ }, [open]);
85
+ return (_jsxs("span", { ref: wrapperRef, className: "dx-toolbar-palette-wrap", style: { position: 'relative', display: 'inline-flex' }, children: [_jsx("button", { ref: triggerRef, type: "button", className: "dx-toolbar-btn dx-toolbar-btn-icon dx-toolbar-palette-btn", "data-testid": `btn-${palette.id}`, "aria-label": palette.label, title: palette.label, "aria-haspopup": "dialog", "aria-expanded": open, onMouseDown: (e) => e.preventDefault(), onClick: () => setOpen((o) => !o), children: _jsx("svg", { viewBox: "0 0 24 24", width: "18", height: "18", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: palette.icon } }) }), open && (_jsxs("div", { className: "dx-toolbar-popover dx-toolbar-palette", role: "dialog", "aria-label": palette.label, onMouseDown: (e) => e.stopPropagation(), children: [palette.clearLabel && (_jsx("button", { type: "button", className: "dx-toolbar-palette-clear", "data-testid": `btn-${palette.id}-clear`, onMouseDown: (e) => e.preventDefault(), onClick: () => {
86
+ if (palette.clear)
87
+ palette.clear(state, dispatch);
88
+ else
89
+ palette.apply(state, dispatch, '');
90
+ setOpen(false);
91
+ }, children: palette.clearLabel })), _jsx("div", { className: "dx-toolbar-palette-grid", children: palette.swatches.map((s) => (_jsx("button", { type: "button", className: "dx-toolbar-swatch", "data-testid": `swatch-${palette.id}-${s.value || 'default'}`, "aria-label": s.label, title: s.label, "aria-pressed": s.value === current, style: { background: s.css }, onMouseDown: (e) => e.preventDefault(), onClick: () => {
92
+ palette.apply(state, dispatch, s.value);
93
+ setOpen(false);
94
+ } }, s.value))) })] }))] }));
95
+ }
96
+ function ToolbarPopoverButton(props) {
97
+ const { popover, state, dispatch, Component } = props;
98
+ const [open, setOpen] = useState(false);
99
+ const wrapperRef = useRef(null);
100
+ const triggerRef = useRef(null);
101
+ useEffect(() => {
102
+ if (!open)
103
+ return;
104
+ function onDocMouseDown(e) {
105
+ const el = wrapperRef.current;
106
+ if (!el)
107
+ return;
108
+ if (e.target instanceof Node && el.contains(e.target))
109
+ return;
110
+ setOpen(false);
111
+ }
112
+ function onKeyDown(e) {
113
+ if (e.key === 'Escape')
114
+ setOpen(false);
115
+ }
116
+ window.addEventListener('mousedown', onDocMouseDown);
117
+ window.addEventListener('keydown', onKeyDown);
118
+ // Restore focus to the trigger when the popover closes — supports
119
+ // keyboard users navigating with Tab + Escape.
120
+ return () => {
121
+ window.removeEventListener('mousedown', onDocMouseDown);
122
+ window.removeEventListener('keydown', onKeyDown);
123
+ triggerRef.current?.focus();
124
+ };
125
+ }, [open]);
126
+ const pressed = popover.isActive ? popover.isActive(state) : undefined;
127
+ return (_jsxs("span", { ref: wrapperRef, className: "dx-toolbar-popover-wrap", style: { position: 'relative', display: 'inline-flex' }, children: [_jsx("button", { ref: triggerRef, type: "button", className: "dx-toolbar-btn dx-toolbar-btn-icon dx-toolbar-popover-btn", "data-testid": `btn-${popover.id}`, "aria-label": popover.label, title: popover.label, "aria-haspopup": "dialog", "aria-expanded": open, ...(pressed !== undefined ? { 'aria-pressed': pressed } : {}), onMouseDown: (e) => e.preventDefault(), onClick: () => setOpen((o) => !o), children: _jsx("svg", { viewBox: "0 0 24 24", width: "18", height: "18", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: popover.icon } }) }), open && (_jsx(Component, { state: state, dispatch: dispatch, close: () => setOpen(false) }))] }));
128
+ }
129
+ export function Toolbar(props) {
130
+ const items = props.actions ?? defaultToolbarActions(props.editor.schema);
131
+ const state = props.editor.state;
132
+ const dispatch = (tr) => props.editor.dispatch(tr);
133
+ const className = props.className ?? 'dx-toolbar';
134
+ return (_jsx("div", { className: className, "data-testid": "toolbar", role: "toolbar", "aria-label": "Editor toolbar", children: items.map((item, i) => {
135
+ if (isSeparator(item)) {
136
+ return _jsx("span", { className: "dx-toolbar-sep", "aria-hidden": "true" }, `sep-${i}`);
137
+ }
138
+ if (isSelect(item)) {
139
+ const sel = item;
140
+ const value = sel.getValue(state);
141
+ const hasMatch = sel.options.some((opt) => opt.value === value);
142
+ return (_jsxs("select", { className: "dx-toolbar-select", "data-testid": `select-${sel.id}`, "aria-label": sel.label, title: sel.label, value: value, onMouseDown: (e) => e.stopPropagation(), onChange: (e) => sel.apply(state, dispatch, e.target.value), children: [!hasMatch && (_jsx("option", { value: value, hidden: true, "aria-hidden": "true" }, "__blank")), sel.options.map((opt) => (_jsx("option", { value: opt.value, children: opt.label }, opt.value)))] }, sel.id));
143
+ }
144
+ if (isPalette(item)) {
145
+ const pal = item;
146
+ const current = pal.getValue(state);
147
+ return _jsx(ToolbarPaletteButton, { palette: pal, state: state, dispatch: dispatch, current: current }, pal.id);
148
+ }
149
+ if (isPopover(item)) {
150
+ const pop = item;
151
+ const Component = props.popovers?.[pop.id];
152
+ if (!Component)
153
+ return null;
154
+ return _jsx(ToolbarPopoverButton, { popover: pop, state: state, dispatch: dispatch, Component: Component }, pop.id);
155
+ }
156
+ const action = item;
157
+ const pressed = action.isActive ? action.isActive(state) : undefined;
158
+ return (_jsx("button", { type: "button", className: action.icon ? 'dx-toolbar-btn dx-toolbar-btn-icon' : 'dx-toolbar-btn', "data-testid": `btn-${action.id}`, "aria-pressed": pressed, "aria-label": action.label, title: action.label, onMouseDown: (e) => e.preventDefault(), onClick: () => action.command(state, dispatch), children: action.icon ? (_jsx("svg", { viewBox: "0 0 24 24", width: "18", height: "18", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: action.icon } })) : (_jsx("span", { className: "dx-toolbar-btn-text", children: action.label })) }, action.id));
159
+ }) }));
160
+ }
161
+ //# sourceMappingURL=Toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../src/Toolbar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { Editor, type EditorProps } from './Editor.js';
2
+ export { useDoxivaEditor, type UseDoxivaEditorOptions } from './useDoxivaEditor.js';
3
+ export { DEFAULT_FEATURES, type EditorHandle, type Theme, type FeatureFlags, type PageSizePreset, type DoxivaEditorProps, } from './types.js';
4
+ export { Toolbar, defaultToolbarActions, TOOLBAR_SEPARATOR, DEFAULT_FONT_SIZES, TOOLBAR_BLANK_VALUE, type ToolbarAction, type ToolbarItem, type ToolbarProps, type ToolbarHistoryHandle, type ToolbarSelect, type ToolbarPalette, type ToolbarPopover, type PopoverComponent, } from './Toolbar.js';
5
+ export { LinkPopover } from './LinkPopover.js';
6
+ export { TablePicker } from './TablePicker.js';
7
+ export { ImagePopover } from './ImagePopover.js';
8
+ export { HeaderFooterPopover, DEFAULT_PAGE_CHROME, type HeaderFooterPopoverProps, type PageChromeState, } from './HeaderFooterPopover.js';
9
+ export { PageSettingsPopover, DEFAULT_PAGE_SETTINGS, pageConfigFromSettings, type PageSettingsPopoverProps, type PageSettings, type PageSizeId, type Orientation, type MarginPreset, } from './PageSettingsPopover.js';
10
+ export { DoxivaEditor, type DoxivaEditorHandle } from './DoxivaEditor.js';
11
+ export { buildLinks } from './toolbar-builders/links.js';
12
+ export { buildTables } from './toolbar-builders/tables.js';
13
+ export { buildImages } from './toolbar-builders/images.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EACL,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,KAAK,EACV,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,OAAO,EACP,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,GACrB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export { Editor } from './Editor.js';
2
+ export { useDoxivaEditor } from './useDoxivaEditor.js';
3
+ export { DEFAULT_FEATURES, } from './types.js';
4
+ export { Toolbar, defaultToolbarActions, TOOLBAR_SEPARATOR, DEFAULT_FONT_SIZES, TOOLBAR_BLANK_VALUE, } from './Toolbar.js';
5
+ export { LinkPopover } from './LinkPopover.js';
6
+ export { TablePicker } from './TablePicker.js';
7
+ export { ImagePopover } from './ImagePopover.js';
8
+ export { HeaderFooterPopover, DEFAULT_PAGE_CHROME, } from './HeaderFooterPopover.js';
9
+ export { PageSettingsPopover, DEFAULT_PAGE_SETTINGS, pageConfigFromSettings, } from './PageSettingsPopover.js';
10
+ export { DoxivaEditor } from './DoxivaEditor.js';
11
+ export { buildLinks } from './toolbar-builders/links.js';
12
+ export { buildTables } from './toolbar-builders/tables.js';
13
+ export { buildImages } from './toolbar-builders/images.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,eAAe,EAA+B,MAAM,sBAAsB,CAAA;AACnF,OAAO,EACL,gBAAgB,GAMjB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,OAAO,EACP,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,GASpB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GAGpB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GAMvB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,YAAY,EAA2B,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { type Schema } from '@doxi/core';
2
+ import type { ToolbarItem } from '../Toolbar.js';
3
+ export declare function buildAlignment(_schema: Schema): ToolbarItem[];
4
+ //# sourceMappingURL=alignment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alignment.d.ts","sourceRoot":"","sources":["../../src/toolbar-builders/alignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,MAAM,EAAE,MAAM,YAAY,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAqBhD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAmC7D"}
@@ -0,0 +1,56 @@
1
+ import { setAlignment } from '@doxi/core';
2
+ import { TOOLBAR_SEPARATOR } from '../Toolbar.js';
3
+ const ICON_LEFT = '<path d="M3 5h14" /><path d="M3 10h10" /><path d="M3 15h14" /><path d="M3 20h10" />';
4
+ const ICON_CENTER = '<path d="M3 5h18" /><path d="M6 10h12" /><path d="M3 15h18" /><path d="M6 20h12" />';
5
+ const ICON_RIGHT = '<path d="M21 5H7" /><path d="M21 10H11" /><path d="M21 15H7" /><path d="M21 20H11" />';
6
+ const ICON_JUSTIFY = '<path d="M3 5h18" /><path d="M3 10h18" /><path d="M3 15h18" /><path d="M3 20h18" />';
7
+ function blockAttr(attr) {
8
+ return (s) => {
9
+ let offset = 0;
10
+ for (let i = 0; i < s.doc.content.childCount; i++) {
11
+ const child = s.doc.content.child(i);
12
+ const end = offset + child.nodeSize;
13
+ if (s.selection.from >= offset && s.selection.from <= end)
14
+ return child.attrs[attr];
15
+ offset = end;
16
+ }
17
+ return null;
18
+ };
19
+ }
20
+ export function buildAlignment(_schema) {
21
+ return [
22
+ {
23
+ id: 'align-left',
24
+ label: 'Align left',
25
+ icon: ICON_LEFT,
26
+ isActive: (s) => {
27
+ const v = blockAttr('align')(s);
28
+ return v === 'left' || v === null;
29
+ },
30
+ command: setAlignment(null),
31
+ },
32
+ {
33
+ id: 'align-center',
34
+ label: 'Align center',
35
+ icon: ICON_CENTER,
36
+ isActive: (s) => blockAttr('align')(s) === 'center',
37
+ command: setAlignment('center'),
38
+ },
39
+ {
40
+ id: 'align-right',
41
+ label: 'Align right',
42
+ icon: ICON_RIGHT,
43
+ isActive: (s) => blockAttr('align')(s) === 'right',
44
+ command: setAlignment('right'),
45
+ },
46
+ {
47
+ id: 'align-justify',
48
+ label: 'Justify',
49
+ icon: ICON_JUSTIFY,
50
+ isActive: (s) => blockAttr('align')(s) === 'justify',
51
+ command: setAlignment('justify'),
52
+ },
53
+ TOOLBAR_SEPARATOR,
54
+ ];
55
+ }
56
+ //# sourceMappingURL=alignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alignment.js","sourceRoot":"","sources":["../../src/toolbar-builders/alignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAiC,MAAM,YAAY,CAAA;AAExE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEjD,MAAM,SAAS,GAAG,qFAAqF,CAAA;AACvG,MAAM,WAAW,GAAG,qFAAqF,CAAA;AACzG,MAAM,UAAU,GAAG,uFAAuF,CAAA;AAC1G,MAAM,YAAY,GAAG,qFAAqF,CAAA;AAE1G,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,CAAC,CAAc,EAAW,EAAE;QACjC,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAmE,CAAA;YACtG,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAA;YACnC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG;gBAAE,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACnF,MAAM,GAAG,GAAG,CAAA;QACd,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO;QACL;YACE,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC/B,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI,CAAA;YACnC,CAAC;YACD,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC;SAC5B;QACD;YACE,EAAE,EAAE,cAAc;YAClB,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;YACnD,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC;SAChC;QACD;YACE,EAAE,EAAE,aAAa;YACjB,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO;YAClD,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;SAC/B;QACD;YACE,EAAE,EAAE,eAAe;YACnB,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;YACpD,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC;SACjC;QACD,iBAAiB;KAClB,CAAA;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type Schema } from '@doxi/core';
2
+ import type { ToolbarItem } from '../Toolbar.js';
3
+ export declare function buildBlocks(schema: Schema): ToolbarItem[];
4
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/toolbar-builders/blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,MAAM,EACZ,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAWhD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAsBzD"}
@@ -0,0 +1,39 @@
1
+ import { insertHr, resolve, wrapInBlockquote, } from '@doxi/core';
2
+ // Curly opening quote — a recognisable block-quote glyph rendered inside the
3
+ // shared 24×24 viewBox used by the rest of the toolbar.
4
+ const ICON_QUOTE = '<path d="M7 7h4v4H7z" /><path d="M9 11v3a3 3 0 0 1-3 3" />' +
5
+ '<path d="M15 7h4v4h-4z" /><path d="M17 11v3a3 3 0 0 1-3 3" />';
6
+ // Two horizontal lines suggesting a divider.
7
+ const ICON_HR = '<path d="M4 9h16" /><path d="M4 15h16" />';
8
+ export function buildBlocks(schema) {
9
+ const items = [];
10
+ const blockquote = schema.nodes.blockquote;
11
+ const hr = schema.nodes.hr;
12
+ if (blockquote) {
13
+ items.push({
14
+ id: 'blockquote',
15
+ label: 'Block quote',
16
+ icon: ICON_QUOTE,
17
+ isActive: (s) => insideBlockquote(s, blockquote),
18
+ command: wrapInBlockquote(blockquote),
19
+ });
20
+ }
21
+ if (hr) {
22
+ items.push({
23
+ id: 'hr',
24
+ label: 'Horizontal rule',
25
+ icon: ICON_HR,
26
+ command: insertHr(hr),
27
+ });
28
+ }
29
+ return items;
30
+ }
31
+ function insideBlockquote(state, bqType) {
32
+ const rp = resolve(state.doc, state.selection.from);
33
+ for (let d = rp.depth; d >= 1; d--) {
34
+ if (rp.node(d).type === bqType)
35
+ return true;
36
+ }
37
+ return false;
38
+ }
39
+ //# sourceMappingURL=blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/toolbar-builders/blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,OAAO,EACP,gBAAgB,GAIjB,MAAM,YAAY,CAAA;AAGnB,6EAA6E;AAC7E,wDAAwD;AACxD,MAAM,UAAU,GACd,4DAA4D;IAC5D,+DAA+D,CAAA;AACjE,6CAA6C;AAC7C,MAAM,OAAO,GACX,2CAA2C,CAAA;AAE7C,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAA;IAC1C,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;IAC1B,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,UAAU,CAAC;YAChD,OAAO,EAAE,gBAAgB,CAAC,UAAU,CAAC;SACtC,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,EAAE,EAAE,CAAC;QACP,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;SACtB,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAkB,EAAE,MAAgB;IAC5D,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACnD,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;IAC7C,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type Schema } from '@doxi/core';
2
+ import type { ToolbarItem } from '../Toolbar.js';
3
+ export declare function buildFontSize(schema: Schema): ToolbarItem[];
4
+ //# sourceMappingURL=font-size.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font-size.d.ts","sourceRoot":"","sources":["../../src/toolbar-builders/font-size.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,KAAK,MAAM,EAAE,MAAM,YAAY,CAAA;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAgC3D"}
@@ -0,0 +1,41 @@
1
+ import { clearMark, probeMarkAttr, setMark } from '@doxi/core';
2
+ import { DEFAULT_FONT_SIZES, TOOLBAR_BLANK_VALUE, TOOLBAR_SEPARATOR } from '../Toolbar.js';
3
+ export function buildFontSize(schema) {
4
+ const fontSize = schema.marks.font_size;
5
+ if (!fontSize)
6
+ return [];
7
+ const defaultPx = fontSize.create().attrs.px ?? 16;
8
+ const options = DEFAULT_FONT_SIZES.map((n) => ({ value: String(n), label: String(n) }));
9
+ return [
10
+ {
11
+ type: 'select',
12
+ id: 'font-size',
13
+ label: 'Font size',
14
+ options,
15
+ getValue: (s) => {
16
+ const r = probeMarkAttr(s, fontSize, 'px');
17
+ if (r.state === 'uniform' && typeof r.value === 'number')
18
+ return String(r.value);
19
+ // For unset (selection has no font_size mark anywhere) show the
20
+ // effective default size — that's what the text is actually
21
+ // rendered at.
22
+ if (r.state === 'unset')
23
+ return String(defaultPx);
24
+ // 'mixed' or 'collapsed' — return a sentinel that intentionally
25
+ // matches no real option. The Toolbar renderer injects a hidden
26
+ // phantom <option> for it so the dropdown displays blank.
27
+ return TOOLBAR_BLANK_VALUE;
28
+ },
29
+ apply: (s, dispatch, value) => {
30
+ const n = Number(value);
31
+ if (!Number.isFinite(n) || n <= 0)
32
+ return false;
33
+ if (n === defaultPx)
34
+ return clearMark(fontSize)(s, dispatch) || true;
35
+ return setMark(fontSize, { px: n })(s, dispatch);
36
+ },
37
+ },
38
+ TOOLBAR_SEPARATOR,
39
+ ];
40
+ }
41
+ //# sourceMappingURL=font-size.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font-size.js","sourceRoot":"","sources":["../../src/toolbar-builders/font-size.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAe,MAAM,YAAY,CAAA;AAE3E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAE1F,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAA;IACvC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAA;IACxB,MAAM,SAAS,GAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAyB,IAAI,EAAE,CAAA;IAC1E,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACvF,OAAO;QACL;YACE,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,WAAW;YAClB,OAAO;YACP,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;gBAC1C,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;oBAAE,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBAChF,gEAAgE;gBAChE,4DAA4D;gBAC5D,eAAe;gBACf,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;oBAAE,OAAO,MAAM,CAAC,SAAS,CAAC,CAAA;gBACjD,gEAAgE;gBAChE,gEAAgE;gBAChE,0DAA0D;gBAC1D,OAAO,mBAAmB,CAAA;YAC5B,CAAC;YACD,KAAK,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;gBAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;gBACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,OAAO,KAAK,CAAA;gBAC/C,IAAI,CAAC,KAAK,SAAS;oBAAE,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAA;gBACpE,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;YAClD,CAAC;SACF;QACD,iBAAiB;KAClB,CAAA;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type Schema } from '@doxi/core';
2
+ import type { ToolbarItem } from '../Toolbar.js';
3
+ export declare function buildHeadings(schema: Schema): ToolbarItem[];
4
+ //# sourceMappingURL=headings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headings.d.ts","sourceRoot":"","sources":["../../src/toolbar-builders/headings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAiB3D"}
@@ -0,0 +1,18 @@
1
+ import { setBlockType } from '@doxi/core';
2
+ import { TOOLBAR_SEPARATOR } from '../Toolbar.js';
3
+ export function buildHeadings(schema) {
4
+ const items = [];
5
+ const paragraph = schema.nodes.paragraph;
6
+ const heading = schema.nodes.heading;
7
+ if (!paragraph && !heading)
8
+ return items;
9
+ if (paragraph) {
10
+ items.push({ id: 'body', label: 'Body', command: setBlockType(paragraph) });
11
+ }
12
+ if (heading) {
13
+ items.push({ id: 'h1', label: 'H1', command: setBlockType(heading, { level: 1 }) }, { id: 'h2', label: 'H2', command: setBlockType(heading, { level: 2 }) }, { id: 'h3', label: 'H3', command: setBlockType(heading, { level: 3 }) });
14
+ }
15
+ items.push(TOOLBAR_SEPARATOR);
16
+ return items;
17
+ }
18
+ //# sourceMappingURL=headings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headings.js","sourceRoot":"","sources":["../../src/toolbar-builders/headings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,YAAY,CAAA;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEjD,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAA;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAA;IACpC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAA;IACxC,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IAC7E,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CACR,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EACvE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EACvE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CACxE,CAAA;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC7B,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolbarHistoryHandle, ToolbarItem } from '../Toolbar.js';
2
+ export declare function buildHistory(history?: ToolbarHistoryHandle): ToolbarItem[];
3
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/toolbar-builders/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMtE,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,WAAW,EAAE,CAO1E"}