@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.
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/DoxivaEditor.d.ts +20 -0
- package/dist/DoxivaEditor.d.ts.map +1 -0
- package/dist/DoxivaEditor.js +448 -0
- package/dist/DoxivaEditor.js.map +1 -0
- package/dist/Editor.d.ts +21 -0
- package/dist/Editor.d.ts.map +1 -0
- package/dist/Editor.js +49 -0
- package/dist/Editor.js.map +1 -0
- package/dist/HeaderFooterPopover.d.ts +49 -0
- package/dist/HeaderFooterPopover.d.ts.map +1 -0
- package/dist/HeaderFooterPopover.js +139 -0
- package/dist/HeaderFooterPopover.js.map +1 -0
- package/dist/ImagePopover.d.ts +23 -0
- package/dist/ImagePopover.d.ts.map +1 -0
- package/dist/ImagePopover.js +59 -0
- package/dist/ImagePopover.js.map +1 -0
- package/dist/LinkPopover.d.ts +25 -0
- package/dist/LinkPopover.d.ts.map +1 -0
- package/dist/LinkPopover.js +67 -0
- package/dist/LinkPopover.js.map +1 -0
- package/dist/PageSettingsPopover.d.ts +33 -0
- package/dist/PageSettingsPopover.d.ts.map +1 -0
- package/dist/PageSettingsPopover.js +48 -0
- package/dist/PageSettingsPopover.js.map +1 -0
- package/dist/TablePicker.d.ts +27 -0
- package/dist/TablePicker.d.ts.map +1 -0
- package/dist/TablePicker.js +38 -0
- package/dist/TablePicker.js.map +1 -0
- package/dist/Toolbar.d.ts +103 -0
- package/dist/Toolbar.d.ts.map +1 -0
- package/dist/Toolbar.js +161 -0
- package/dist/Toolbar.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/toolbar-builders/alignment.d.ts +4 -0
- package/dist/toolbar-builders/alignment.d.ts.map +1 -0
- package/dist/toolbar-builders/alignment.js +56 -0
- package/dist/toolbar-builders/alignment.js.map +1 -0
- package/dist/toolbar-builders/blocks.d.ts +4 -0
- package/dist/toolbar-builders/blocks.d.ts.map +1 -0
- package/dist/toolbar-builders/blocks.js +39 -0
- package/dist/toolbar-builders/blocks.js.map +1 -0
- package/dist/toolbar-builders/font-size.d.ts +4 -0
- package/dist/toolbar-builders/font-size.d.ts.map +1 -0
- package/dist/toolbar-builders/font-size.js +41 -0
- package/dist/toolbar-builders/font-size.js.map +1 -0
- package/dist/toolbar-builders/headings.d.ts +4 -0
- package/dist/toolbar-builders/headings.d.ts.map +1 -0
- package/dist/toolbar-builders/headings.js +18 -0
- package/dist/toolbar-builders/headings.js.map +1 -0
- package/dist/toolbar-builders/history.d.ts +3 -0
- package/dist/toolbar-builders/history.d.ts.map +1 -0
- package/dist/toolbar-builders/history.js +13 -0
- package/dist/toolbar-builders/history.js.map +1 -0
- package/dist/toolbar-builders/images.d.ts +4 -0
- package/dist/toolbar-builders/images.d.ts.map +1 -0
- package/dist/toolbar-builders/images.js +8 -0
- package/dist/toolbar-builders/images.js.map +1 -0
- package/dist/toolbar-builders/line-height.d.ts +4 -0
- package/dist/toolbar-builders/line-height.d.ts.map +1 -0
- package/dist/toolbar-builders/line-height.js +46 -0
- package/dist/toolbar-builders/line-height.js.map +1 -0
- package/dist/toolbar-builders/links.d.ts +4 -0
- package/dist/toolbar-builders/links.d.ts.map +1 -0
- package/dist/toolbar-builders/links.js +19 -0
- package/dist/toolbar-builders/links.js.map +1 -0
- package/dist/toolbar-builders/lists.d.ts +4 -0
- package/dist/toolbar-builders/lists.d.ts.map +1 -0
- package/dist/toolbar-builders/lists.js +38 -0
- package/dist/toolbar-builders/lists.js.map +1 -0
- package/dist/toolbar-builders/marks.d.ts +4 -0
- package/dist/toolbar-builders/marks.d.ts.map +1 -0
- package/dist/toolbar-builders/marks.js +41 -0
- package/dist/toolbar-builders/marks.js.map +1 -0
- package/dist/toolbar-builders/system.d.ts +12 -0
- package/dist/toolbar-builders/system.d.ts.map +1 -0
- package/dist/toolbar-builders/system.js +28 -0
- package/dist/toolbar-builders/system.js.map +1 -0
- package/dist/toolbar-builders/tables.d.ts +4 -0
- package/dist/toolbar-builders/tables.d.ts.map +1 -0
- package/dist/toolbar-builders/tables.js +235 -0
- package/dist/toolbar-builders/tables.js.map +1 -0
- package/dist/toolbar-builders/typography.d.ts +4 -0
- package/dist/toolbar-builders/typography.d.ts.map +1 -0
- package/dist/toolbar-builders/typography.js +123 -0
- package/dist/toolbar-builders/typography.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +28 -0
- package/dist/types.js.map +1 -0
- package/dist/useDoxivaEditor.d.ts +10 -0
- package/dist/useDoxivaEditor.d.ts.map +1 -0
- package/dist/useDoxivaEditor.js +30 -0
- package/dist/useDoxivaEditor.js.map +1 -0
- 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":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,WAAW,EACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,OAAO,CAAA;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAe9C;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAA;IACnD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;QACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;KACvB,CAAA;CACF;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnF,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,CAAA;IACjD,QAAQ,CAAC,KAAK,EAAE,CACd,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,EACnC,KAAK,EAAE,MAAM,KACV,OAAO,CAAA;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1G,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,CAAA;IACjD,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IACnG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,KAAK,OAAO,CAAA;CACtF;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAA;CACpD;AAED,wFAAwF;AACxF,MAAM,MAAM,WAAW,GACnB,aAAa,GACb;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAC9B,aAAa,GACb,cAAc,GACd,cAAc,CAAA;AAElB,eAAO,MAAM,iBAAiB,EAAE,WAAmC,CAAA;AAEnE,eAAO,MAAM,kBAAkB,EAAE,aAAa,CAAC,MAAM,CAAkE,CAAA;AAEvH;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AAEjD,wBAAgB,qBAAqB,CACnC,MAAM,GAAE,MAAsB,EAC9B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,WAAW,EAAE,CAgBf;AAED,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC;IAC3C,KAAK,EAAE,WAAW,CAAA;IAClB,QAAQ,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAA;IACnC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB,CAAC,CAAA;AAEF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAA;CAC/D;AAmMD,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,GAAG,CAAC,OAAO,CAiFxD"}
|
package/dist/Toolbar.js
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|