oasis-editor 0.0.131 → 0.0.133
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/{OasisEditorApp-Dn2I2b-M.js → OasisEditorApp-DmXn9H33.js} +716 -684
- package/dist/adapters/mountController.d.ts +12 -0
- package/dist/adapters/vue.d.ts +5 -5
- package/dist/app/controllers/EditorCommandRegistry.d.ts +2 -1
- package/dist/app/controllers/tableResize/tableResizeUnits.d.ts +3 -1
- package/dist/assets/{importDocxWorker-DdpdjbOY.js → importDocxWorker-CCwhxVSR.js} +1 -1
- package/dist/core/commands/builtinCommands.d.ts +1 -1
- package/dist/core/editorState/defaultStyles.d.ts +3 -0
- package/dist/core/editorState/documentFactories.d.ts +8 -0
- package/dist/core/editorState/nodeFactories.d.ts +35 -0
- package/dist/core/editorState/stateFactories.d.ts +26 -0
- package/dist/core/editorState.d.ts +4 -66
- package/dist/core/units/parseUnitToPt.d.ts +6 -0
- package/dist/export/docx/xmlUtils.d.ts +2 -0
- package/dist/import/docx/runs/drawingAnchorLayout.d.ts +12 -0
- package/dist/{index-BXo_oqOC.js → index-BOj4-NlJ.js} +2244 -2177
- package/dist/layoutProjection/presetGeometry/families/arrows.d.ts +3 -0
- package/dist/layoutProjection/presetGeometry/families/banners.d.ts +5 -0
- package/dist/layoutProjection/presetGeometry/families/bracesBrackets.d.ts +4 -0
- package/dist/layoutProjection/presetGeometry/families/callouts.d.ts +3 -0
- package/dist/layoutProjection/presetGeometry/families/connectors.d.ts +3 -0
- package/dist/layoutProjection/presetGeometry/families/containers3d.d.ts +11 -0
- package/dist/layoutProjection/presetGeometry/families/decorative.d.ts +9 -0
- package/dist/layoutProjection/presetGeometry/families/flowchart.d.ts +4 -0
- package/dist/layoutProjection/presetGeometry/families/mathSymbols.d.ts +8 -0
- package/dist/layoutProjection/presetGeometry/families/rectVariants.d.ts +5 -0
- package/dist/mountController-D2srsZ5t.js +15 -0
- package/dist/mountController.d.ts +12 -0
- package/dist/oasis-editor.css +1 -1
- package/dist/oasis-editor.js +54 -54
- package/dist/oasis-editor.umd.cjs +4 -4
- package/dist/plugins/internal/essentialsCapabilities.d.ts +2 -1
- package/dist/plugins/internal/essentialsCommandBuilders.d.ts +8 -7
- package/dist/plugins/internal/essentialsCommandGroups/coreFormatting.d.ts +17 -0
- package/dist/plugins/internal/essentialsCommandGroups/documentAndBrowser.d.ts +15 -0
- package/dist/plugins/internal/essentialsCommandGroups/paragraphAndSection.d.ts +13 -0
- package/dist/plugins/internal/essentialsCommandGroups/table.d.ts +11 -0
- package/dist/react.js +14 -15
- package/dist/text/fontMetricsUtil.d.ts +16 -0
- package/dist/text/fonts/opentype/extensionLookup.d.ts +9 -0
- package/dist/ui/EditorImportProgressOverlay.d.ts +7 -0
- package/dist/ui/EditorStatusBar.d.ts +13 -0
- package/dist/ui/OasisEditorEditor.d.ts +3 -117
- package/dist/ui/OasisEditorEditorProps.d.ts +118 -0
- package/dist/ui/app/createEditorEssentialsPlugin.d.ts +2 -41
- package/dist/ui/app/essentials/browser.d.ts +3 -0
- package/dist/ui/app/essentials/document.d.ts +4 -0
- package/dist/ui/app/essentials/formatting.d.ts +9 -0
- package/dist/ui/app/essentials/gate.d.ts +4 -0
- package/dist/ui/app/essentials/history.d.ts +4 -0
- package/dist/ui/app/essentials/image.d.ts +4 -0
- package/dist/ui/app/essentials/link.d.ts +4 -0
- package/dist/ui/app/essentials/paragraph.d.ts +4 -0
- package/dist/ui/app/essentials/section.d.ts +4 -0
- package/dist/ui/app/essentials/selection.d.ts +4 -0
- package/dist/ui/app/essentials/style.d.ts +4 -0
- package/dist/ui/app/essentials/table.d.ts +4 -0
- package/dist/ui/app/essentials/types.d.ts +41 -0
- package/dist/ui/canvas/canvasLineSlotLookup.d.ts +8 -0
- package/dist/ui/canvas/canvasSnapshotLines.d.ts +22 -0
- package/dist/ui/canvas/canvasSnapshotWalkers.d.ts +41 -0
- package/dist/ui/canvas/canvasTheme.d.ts +6 -0
- package/dist/ui/components/Dialogs/ParagraphDialog.d.ts +2 -69
- package/dist/ui/components/Dialogs/paragraph-dialog/ParagraphDialogTypes.d.ts +82 -0
- package/dist/ui/components/Dialogs/paragraph-dialog/useParagraphDialogController.d.ts +66 -0
- package/dist/ui/components/Dialogs/table-properties/TablePropertiesTypes.d.ts +0 -1
- package/dist/ui/components/Toolbar/LineSpacingButton.d.ts +10 -0
- package/dist/ui/components/Toolbar/presets/defaultToolbar/buttonSpecs.d.ts +27 -0
- package/dist/ui/components/Toolbar/presets/defaultToolbar/optionBuilders.d.ts +10 -0
- package/dist/ui/components/Toolbar/presets/defaultToolbar/ribbonPlacements.d.ts +3 -0
- package/dist/ui/components/Toolbar/primitives/DropdownChevron.d.ts +20 -0
- package/dist/ui/utils/customIcons.d.ts +30 -0
- package/dist/utils/parseNumber.d.ts +5 -0
- package/dist/vue.d.ts +5 -5
- package/dist/vue.js +10 -12
- package/package.json +1 -1
- package/dist/layoutProjection/presetGeometry/families.d.ts +0 -37
- package/dist/plugins/internal/essentialsCommandGroups.d.ts +0 -41
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { EditorPageMargins } from '../../core/model.js';
|
|
2
2
|
import { TextCaseMode } from '../../core/commands/text.js';
|
|
3
3
|
import { ToolbarStyleState } from '../../ui/toolbarStyleState.js';
|
|
4
|
+
import { OasisBuiltinCommand } from '../../core/commands/builtinCommands.js';
|
|
4
5
|
|
|
5
6
|
export interface EssentialsFeatureGate {
|
|
6
|
-
isCommandEnabled: (commandName:
|
|
7
|
+
isCommandEnabled: (commandName: OasisBuiltinCommand) => boolean;
|
|
7
8
|
}
|
|
8
9
|
export interface EssentialsStyleCapability {
|
|
9
10
|
state: () => ToolbarStyleState;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { CommandState, OasisCommand } from '../../core/plugin.js';
|
|
2
|
+
import { OasisBuiltinCommand } from '../../core/commands/builtinCommands.js';
|
|
2
3
|
|
|
3
|
-
export type CommandEnabledResolver = (commandName:
|
|
4
|
-
export type CommandBuilder = (name:
|
|
5
|
-
export type ValueCommandBuilder = (name:
|
|
6
|
-
export type ActionCommandBuilder = (name:
|
|
7
|
-
export declare function createCommandBuilder(isCommandEnabled: CommandEnabledResolver): (name:
|
|
8
|
-
export declare function createValueCommandBuilder(isCommandEnabled: CommandEnabledResolver): (name:
|
|
9
|
-
export declare function createActionCommandBuilder(isCommandEnabled: CommandEnabledResolver): (name:
|
|
4
|
+
export type CommandEnabledResolver = (commandName: OasisBuiltinCommand) => boolean;
|
|
5
|
+
export type CommandBuilder = (name: OasisBuiltinCommand, execute: () => boolean, state?: () => Partial<CommandState>) => OasisCommand;
|
|
6
|
+
export type ValueCommandBuilder = (name: OasisBuiltinCommand, execute: (payload?: unknown) => boolean, value: () => unknown) => OasisCommand;
|
|
7
|
+
export type ActionCommandBuilder = (name: OasisBuiltinCommand, execute: (payload?: unknown) => void, state?: () => Partial<CommandState>) => OasisCommand;
|
|
8
|
+
export declare function createCommandBuilder(isCommandEnabled: CommandEnabledResolver): (name: OasisBuiltinCommand, execute: () => boolean, state?: () => Partial<CommandState>) => OasisCommand;
|
|
9
|
+
export declare function createValueCommandBuilder(isCommandEnabled: CommandEnabledResolver): (name: OasisBuiltinCommand, execute: (payload?: unknown) => boolean, value: () => unknown) => OasisCommand;
|
|
10
|
+
export declare function createActionCommandBuilder(isCommandEnabled: CommandEnabledResolver): (name: OasisBuiltinCommand, execute: (payload?: unknown) => void, state?: () => Partial<CommandState>) => OasisCommand;
|
|
10
11
|
export declare function numOrNull(payload: unknown): number | null;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { OasisPlugin } from '../../../core/plugin.js';
|
|
2
|
+
import { ActionCommandBuilder, CommandBuilder, ValueCommandBuilder } from '../essentialsCommandBuilders.js';
|
|
3
|
+
import { EssentialsFeatureGate, EssentialsFormattingCapability, EssentialsHistoryCapability, EssentialsLinkCapability, EssentialsSelectionCapability, EssentialsStyleCapability } from '../essentialsCapabilities.js';
|
|
4
|
+
|
|
5
|
+
interface CoreFormattingGroupDeps {
|
|
6
|
+
gate: EssentialsFeatureGate;
|
|
7
|
+
style: EssentialsStyleCapability;
|
|
8
|
+
selection: EssentialsSelectionCapability;
|
|
9
|
+
history: EssentialsHistoryCapability;
|
|
10
|
+
formatting: EssentialsFormattingCapability;
|
|
11
|
+
link: EssentialsLinkCapability;
|
|
12
|
+
command: CommandBuilder;
|
|
13
|
+
valueCommand: ValueCommandBuilder;
|
|
14
|
+
actionCommand: ActionCommandBuilder;
|
|
15
|
+
}
|
|
16
|
+
export declare function buildCoreFormattingCommands({ gate, style, selection, history, formatting, link, command, valueCommand, actionCommand, }: CoreFormattingGroupDeps): NonNullable<OasisPlugin["commands"]>;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { OasisPlugin } from '../../../core/plugin.js';
|
|
2
|
+
import { ActionCommandBuilder } from '../essentialsCommandBuilders.js';
|
|
3
|
+
import { EssentialsBrowserCapability, EssentialsDocumentCapability, EssentialsFeatureGate, EssentialsImageCapability, EssentialsLinkCapability, EssentialsStyleCapability } from '../essentialsCapabilities.js';
|
|
4
|
+
|
|
5
|
+
interface DocumentAndBrowserGroupDeps {
|
|
6
|
+
gate: EssentialsFeatureGate;
|
|
7
|
+
style: EssentialsStyleCapability;
|
|
8
|
+
document: EssentialsDocumentCapability;
|
|
9
|
+
link: EssentialsLinkCapability;
|
|
10
|
+
image: EssentialsImageCapability;
|
|
11
|
+
browser: EssentialsBrowserCapability;
|
|
12
|
+
actionCommand: ActionCommandBuilder;
|
|
13
|
+
}
|
|
14
|
+
export declare function buildDocumentAndBrowserCommands({ gate, style, document, link, image, browser, actionCommand, }: DocumentAndBrowserGroupDeps): NonNullable<OasisPlugin["commands"]>;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OasisPlugin } from '../../../core/plugin.js';
|
|
2
|
+
import { ActionCommandBuilder, ValueCommandBuilder } from '../essentialsCommandBuilders.js';
|
|
3
|
+
import { EssentialsParagraphCapability, EssentialsSectionCapability, EssentialsStyleCapability } from '../essentialsCapabilities.js';
|
|
4
|
+
|
|
5
|
+
interface ParagraphAndSectionGroupDeps {
|
|
6
|
+
style: EssentialsStyleCapability;
|
|
7
|
+
paragraph: EssentialsParagraphCapability;
|
|
8
|
+
section: EssentialsSectionCapability;
|
|
9
|
+
valueCommand: ValueCommandBuilder;
|
|
10
|
+
actionCommand: ActionCommandBuilder;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildParagraphAndSectionCommands({ style, paragraph, section, valueCommand, actionCommand, }: ParagraphAndSectionGroupDeps): NonNullable<OasisPlugin["commands"]>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { OasisPlugin } from '../../../core/plugin.js';
|
|
2
|
+
import { ActionCommandBuilder } from '../essentialsCommandBuilders.js';
|
|
3
|
+
import { EssentialsFeatureGate, EssentialsTableCapability } from '../essentialsCapabilities.js';
|
|
4
|
+
|
|
5
|
+
interface TableGroupDeps {
|
|
6
|
+
gate: EssentialsFeatureGate;
|
|
7
|
+
table: EssentialsTableCapability;
|
|
8
|
+
actionCommand: ActionCommandBuilder;
|
|
9
|
+
}
|
|
10
|
+
export declare function buildTableCommands({ gate, table, actionCommand, }: TableGroupDeps): NonNullable<OasisPlugin["commands"]>;
|
|
11
|
+
export {};
|
package/dist/react.js
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
const
|
|
4
|
-
var
|
|
5
|
-
const
|
|
6
|
-
return
|
|
7
|
-
|
|
8
|
-
return
|
|
9
|
-
|
|
10
|
-
(l = t.current) == null || l.unmount(), t.current = null;
|
|
1
|
+
import c, { useRef as s, useEffect as u } from "react";
|
|
2
|
+
import { c as l } from "./mountController-D2srsZ5t.js";
|
|
3
|
+
const f = (e) => {
|
|
4
|
+
var n, r;
|
|
5
|
+
const t = s(null);
|
|
6
|
+
return u(() => {
|
|
7
|
+
const o = l();
|
|
8
|
+
return t.current && o.mount(t.current, e, e.onClient), () => {
|
|
9
|
+
o.unmount();
|
|
11
10
|
};
|
|
12
|
-
}, []),
|
|
13
|
-
ref:
|
|
14
|
-
className: (
|
|
15
|
-
style: (
|
|
11
|
+
}, []), c.createElement("div", {
|
|
12
|
+
ref: t,
|
|
13
|
+
className: (n = e.ui) == null ? void 0 : n.class,
|
|
14
|
+
style: (r = e.ui) == null ? void 0 : r.style
|
|
16
15
|
});
|
|
17
16
|
};
|
|
18
17
|
export {
|
|
19
|
-
|
|
18
|
+
f as OasisEditor
|
|
20
19
|
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Os2VerticalMetrics, VerticalMetrics } from './truetype/tableParsers.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The font's natural (single-spacing) line height in px — `ascender −
|
|
5
|
+
* descender + lineGap` scaled to the font size. This is the em box Word lays
|
|
6
|
+
* a line of text into before any line-spacing multiple is applied.
|
|
7
|
+
*/
|
|
8
|
+
export declare function computeNaturalLineHeightPx(verticalMetrics: VerticalMetrics, unitsPerEm: number, fontSizePx: number): number;
|
|
9
|
+
/**
|
|
10
|
+
* Distance from the line-box top to the top of the rendered text in Word's
|
|
11
|
+
* PDF output. Word places the baseline at `usWinAscent`; the parity PDF
|
|
12
|
+
* extractor reports the typographic text top from the font descriptor
|
|
13
|
+
* ascender, so the delta is stable regardless of paragraph line spacing or
|
|
14
|
+
* docGrid snapping.
|
|
15
|
+
*/
|
|
16
|
+
export declare function computeWordTextTopOffsetPx(os2VerticalMetrics: Os2VerticalMetrics | null, unitsPerEm: number, fontSizePx: number): number;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BinaryReader } from '../../truetype/BinaryReader.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Unwraps a GSUB/GPOS "Extension" subtable (format 1) to the real subtable
|
|
5
|
+
* it points to, then delegates to the caller's own `parseSubtable` for that
|
|
6
|
+
* lookup type. GSUB lookupType 7 and GPOS lookupType 9 share this exact
|
|
7
|
+
* indirection layout — only the meaning of `lookupType` differs per table.
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseExtensionLookup<TSubtable>(reader: BinaryReader, offset: number, parseSubtable: (reader: BinaryReader, offset: number, lookupType: number) => TSubtable | null): TSubtable | null;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Accessor, JSX } from 'solid-js';
|
|
2
|
+
import { ImportProgressState } from '../app/controllers/useEditorDocumentIO.js';
|
|
3
|
+
|
|
4
|
+
export interface EditorImportProgressOverlayProps {
|
|
5
|
+
progress?: Accessor<ImportProgressState | null>;
|
|
6
|
+
}
|
|
7
|
+
export declare function EditorImportProgressOverlay(props: EditorImportProgressOverlayProps): JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
|
|
3
|
+
export interface EditorStatusBarProps {
|
|
4
|
+
wordCount: () => number;
|
|
5
|
+
characterCount: () => number;
|
|
6
|
+
currentPage: () => number;
|
|
7
|
+
totalPages: () => number;
|
|
8
|
+
zoomPercent: () => number;
|
|
9
|
+
adjustZoom: (delta: number) => void;
|
|
10
|
+
setZoomPercent: (value: number) => void;
|
|
11
|
+
persistenceStatus?: () => string;
|
|
12
|
+
}
|
|
13
|
+
export declare function EditorStatusBar(props: EditorStatusBarProps): JSX.Element;
|
|
@@ -1,119 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { EditorLayoutDocument, EditorLayoutParagraph, EditorState } from '../core/model.js';
|
|
4
|
-
import { ImportProgressState } from '../app/controllers/useEditorDocumentIO.js';
|
|
5
|
-
import { CaretBox, CommentHighlightBox, InputBox, LayoutOptionsOverlay, RevisionBox, SelectedImageBox, SelectedTextBoxBox, SelectedTableBox, SelectionBox } from './editorUiTypes.js';
|
|
6
|
-
import { ResizeHandleDirection } from './resizeGeometry.js';
|
|
1
|
+
import { JSX } from 'solid-js';
|
|
2
|
+
import { OasisEditorEditorProps } from './OasisEditorEditorProps.js';
|
|
7
3
|
|
|
8
|
-
type
|
|
9
|
-
export interface OasisEditorEditorLayoutProps {
|
|
10
|
-
documentLayout: Accessor<EditorLayoutDocument>;
|
|
11
|
-
measuredBlockHeights?: Accessor<Record<string, number>>;
|
|
12
|
-
measuredParagraphLayouts?: Accessor<Record<string, EditorLayoutParagraph>>;
|
|
13
|
-
viewportHeight?: number | string;
|
|
14
|
-
class?: string;
|
|
15
|
-
style?: JSX.CSSProperties;
|
|
16
|
-
readOnly?: boolean;
|
|
17
|
-
showHorizontalRuler?: boolean;
|
|
18
|
-
zoomPercent?: Accessor<number>;
|
|
19
|
-
setZoomPercent?: (value: number) => void;
|
|
20
|
-
zoomFactor?: Accessor<number>;
|
|
21
|
-
}
|
|
22
|
-
export interface OasisEditorEditorOverlayProps {
|
|
23
|
-
selectionBoxes: Accessor<SelectionBox[]>;
|
|
24
|
-
commentHighlights: Accessor<CommentHighlightBox[]>;
|
|
25
|
-
selectedImageBox: Accessor<SelectedImageBox | null>;
|
|
26
|
-
selectedTextBoxBox: Accessor<SelectedTextBoxBox | null>;
|
|
27
|
-
selectedTableBox: Accessor<SelectedTableBox | null>;
|
|
28
|
-
caretBox: Accessor<CaretBox>;
|
|
29
|
-
inputBox: Accessor<InputBox>;
|
|
30
|
-
hoveredRevision: Accessor<RevisionBox | null>;
|
|
31
|
-
focused: Accessor<boolean>;
|
|
32
|
-
showCaret: Accessor<boolean>;
|
|
33
|
-
importProgress?: Accessor<ImportProgress | null>;
|
|
34
|
-
toolbarHost?: () => ToolbarHost;
|
|
35
|
-
persistenceStatus?: () => string;
|
|
36
|
-
showFloatingTableToolbar?: Accessor<boolean>;
|
|
37
|
-
layoutOptions?: LayoutOptionsOverlay;
|
|
38
|
-
}
|
|
39
|
-
export interface OasisEditorEditorRefProps {
|
|
40
|
-
onViewportRef?: (element: HTMLDivElement) => void;
|
|
41
|
-
onSurfaceRef?: (element: HTMLDivElement) => void;
|
|
42
|
-
onTextareaRef?: (element: HTMLTextAreaElement) => void;
|
|
43
|
-
onImportInputRef?: (element: HTMLInputElement) => void;
|
|
44
|
-
onImageInputRef?: (element: HTMLInputElement) => void;
|
|
45
|
-
}
|
|
46
|
-
export interface OasisEditorEditorSurfaceHandlers {
|
|
47
|
-
onDragOver: (event: DragEvent) => void;
|
|
48
|
-
onDrop: (event: DragEvent) => void;
|
|
49
|
-
onEditorMouseDown: (event: MouseEvent) => void;
|
|
50
|
-
onSurfaceMouseDown: (event: MouseEvent) => void;
|
|
51
|
-
onSurfaceClick?: (event: MouseEvent) => void;
|
|
52
|
-
onSurfaceMouseMove?: (event: MouseEvent) => void;
|
|
53
|
-
onSurfaceDblClick: (event: MouseEvent) => void;
|
|
54
|
-
onParagraphMouseDown: (paragraphId: string, event: MouseEvent & {
|
|
55
|
-
currentTarget: HTMLParagraphElement;
|
|
56
|
-
}) => void;
|
|
57
|
-
onImageMouseDown: (paragraphId: string, paragraphOffset: number, event: MouseEvent & {
|
|
58
|
-
currentTarget: HTMLElement;
|
|
59
|
-
}) => void;
|
|
60
|
-
onImageResizeHandleMouseDown: (paragraphId: string, paragraphOffset: number, direction: ResizeHandleDirection, event: MouseEvent & {
|
|
61
|
-
currentTarget: HTMLElement;
|
|
62
|
-
}) => void;
|
|
63
|
-
onTextBoxResizeHandleMouseDown: (paragraphId: string, paragraphOffset: number, direction: ResizeHandleDirection, event: MouseEvent & {
|
|
64
|
-
currentTarget: HTMLElement;
|
|
65
|
-
}) => void;
|
|
66
|
-
onImageRotateHandleMouseDown: (paragraphId: string, paragraphOffset: number, event: MouseEvent & {
|
|
67
|
-
currentTarget: HTMLElement;
|
|
68
|
-
}) => void;
|
|
69
|
-
onTextBoxRotateHandleMouseDown: (paragraphId: string, paragraphOffset: number, event: MouseEvent & {
|
|
70
|
-
currentTarget: HTMLElement;
|
|
71
|
-
}) => void;
|
|
72
|
-
onTableDragHandleMouseDown: (tableId: string, event: MouseEvent) => void;
|
|
73
|
-
onTableCornerResizeHandleMouseDown: (tableId: string, event: MouseEvent) => void;
|
|
74
|
-
onRevisionMouseEnter: (revisionId: string, event: MouseEvent) => void;
|
|
75
|
-
onRevisionMouseLeave?: (revisionId: string, event: MouseEvent) => void;
|
|
76
|
-
onEditorContextMenu?: (event: MouseEvent) => void;
|
|
77
|
-
}
|
|
78
|
-
export interface OasisEditorEditorInputHandlers {
|
|
79
|
-
onInputBlur: () => void;
|
|
80
|
-
onInputFocus: () => void;
|
|
81
|
-
onCompositionEnd: (event: CompositionEvent & {
|
|
82
|
-
currentTarget: HTMLTextAreaElement;
|
|
83
|
-
}) => void;
|
|
84
|
-
onCompositionStart: () => void;
|
|
85
|
-
onCopy: (event: ClipboardEvent & {
|
|
86
|
-
currentTarget: HTMLTextAreaElement;
|
|
87
|
-
}) => void;
|
|
88
|
-
onCut: (event: ClipboardEvent & {
|
|
89
|
-
currentTarget: HTMLTextAreaElement;
|
|
90
|
-
}) => void;
|
|
91
|
-
onInput: (event: InputEvent & {
|
|
92
|
-
currentTarget: HTMLTextAreaElement;
|
|
93
|
-
}) => void;
|
|
94
|
-
onKeyDown: (event: KeyboardEvent & {
|
|
95
|
-
currentTarget: HTMLTextAreaElement;
|
|
96
|
-
}) => void;
|
|
97
|
-
onPaste: (event: ClipboardEvent & {
|
|
98
|
-
currentTarget: HTMLTextAreaElement;
|
|
99
|
-
}) => void;
|
|
100
|
-
}
|
|
101
|
-
export interface OasisEditorEditorFileHandlers {
|
|
102
|
-
onImportInputChange: (event: Event & {
|
|
103
|
-
currentTarget: HTMLInputElement;
|
|
104
|
-
}) => void;
|
|
105
|
-
onImageInputChange: (event: Event & {
|
|
106
|
-
currentTarget: HTMLInputElement;
|
|
107
|
-
}) => void;
|
|
108
|
-
}
|
|
109
|
-
export interface OasisEditorEditorProps {
|
|
110
|
-
state: Accessor<EditorState>;
|
|
111
|
-
layout: OasisEditorEditorLayoutProps;
|
|
112
|
-
overlays: OasisEditorEditorOverlayProps;
|
|
113
|
-
refs?: OasisEditorEditorRefProps;
|
|
114
|
-
surfaceHandlers: OasisEditorEditorSurfaceHandlers;
|
|
115
|
-
inputHandlers: OasisEditorEditorInputHandlers;
|
|
116
|
-
fileHandlers: OasisEditorEditorFileHandlers;
|
|
117
|
-
}
|
|
4
|
+
export type { OasisEditorEditorFileHandlers, OasisEditorEditorInputHandlers, OasisEditorEditorLayoutProps, OasisEditorEditorOverlayProps, OasisEditorEditorProps, OasisEditorEditorRefProps, OasisEditorEditorSurfaceHandlers, } from './OasisEditorEditorProps.js';
|
|
118
5
|
export declare function OasisEditorEditor(props: OasisEditorEditorProps): JSX.Element;
|
|
119
|
-
export {};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Accessor, JSX } from 'solid-js';
|
|
2
|
+
import { EditorLayoutDocument, EditorLayoutParagraph, EditorState } from '../core/model.js';
|
|
3
|
+
import { ImportProgressState } from '../app/controllers/useEditorDocumentIO.js';
|
|
4
|
+
import { ToolbarHost } from './components/Toolbar/state/createToolbarApi.js';
|
|
5
|
+
import { CaretBox, CommentHighlightBox, InputBox, LayoutOptionsOverlay, RevisionBox, SelectedImageBox, SelectedTextBoxBox, SelectedTableBox, SelectionBox } from './editorUiTypes.js';
|
|
6
|
+
import { ResizeHandleDirection } from './resizeGeometry.js';
|
|
7
|
+
|
|
8
|
+
type ImportProgress = ImportProgressState;
|
|
9
|
+
export interface OasisEditorEditorLayoutProps {
|
|
10
|
+
documentLayout: Accessor<EditorLayoutDocument>;
|
|
11
|
+
measuredBlockHeights?: Accessor<Record<string, number>>;
|
|
12
|
+
measuredParagraphLayouts?: Accessor<Record<string, EditorLayoutParagraph>>;
|
|
13
|
+
viewportHeight?: number | string;
|
|
14
|
+
class?: string;
|
|
15
|
+
style?: JSX.CSSProperties;
|
|
16
|
+
readOnly?: boolean;
|
|
17
|
+
showHorizontalRuler?: boolean;
|
|
18
|
+
zoomPercent?: Accessor<number>;
|
|
19
|
+
setZoomPercent?: (value: number) => void;
|
|
20
|
+
zoomFactor?: Accessor<number>;
|
|
21
|
+
}
|
|
22
|
+
export interface OasisEditorEditorOverlayProps {
|
|
23
|
+
selectionBoxes: Accessor<SelectionBox[]>;
|
|
24
|
+
commentHighlights: Accessor<CommentHighlightBox[]>;
|
|
25
|
+
selectedImageBox: Accessor<SelectedImageBox | null>;
|
|
26
|
+
selectedTextBoxBox: Accessor<SelectedTextBoxBox | null>;
|
|
27
|
+
selectedTableBox: Accessor<SelectedTableBox | null>;
|
|
28
|
+
caretBox: Accessor<CaretBox>;
|
|
29
|
+
inputBox: Accessor<InputBox>;
|
|
30
|
+
hoveredRevision: Accessor<RevisionBox | null>;
|
|
31
|
+
focused: Accessor<boolean>;
|
|
32
|
+
showCaret: Accessor<boolean>;
|
|
33
|
+
importProgress?: Accessor<ImportProgress | null>;
|
|
34
|
+
toolbarHost?: () => ToolbarHost;
|
|
35
|
+
persistenceStatus?: () => string;
|
|
36
|
+
showFloatingTableToolbar?: Accessor<boolean>;
|
|
37
|
+
layoutOptions?: LayoutOptionsOverlay;
|
|
38
|
+
}
|
|
39
|
+
export interface OasisEditorEditorRefProps {
|
|
40
|
+
onViewportRef?: (element: HTMLDivElement) => void;
|
|
41
|
+
onSurfaceRef?: (element: HTMLDivElement) => void;
|
|
42
|
+
onTextareaRef?: (element: HTMLTextAreaElement) => void;
|
|
43
|
+
onImportInputRef?: (element: HTMLInputElement) => void;
|
|
44
|
+
onImageInputRef?: (element: HTMLInputElement) => void;
|
|
45
|
+
}
|
|
46
|
+
export interface OasisEditorEditorSurfaceHandlers {
|
|
47
|
+
onDragOver: (event: DragEvent) => void;
|
|
48
|
+
onDrop: (event: DragEvent) => void;
|
|
49
|
+
onEditorMouseDown: (event: MouseEvent) => void;
|
|
50
|
+
onSurfaceMouseDown: (event: MouseEvent) => void;
|
|
51
|
+
onSurfaceClick?: (event: MouseEvent) => void;
|
|
52
|
+
onSurfaceMouseMove?: (event: MouseEvent) => void;
|
|
53
|
+
onSurfaceDblClick: (event: MouseEvent) => void;
|
|
54
|
+
onParagraphMouseDown: (paragraphId: string, event: MouseEvent & {
|
|
55
|
+
currentTarget: HTMLParagraphElement;
|
|
56
|
+
}) => void;
|
|
57
|
+
onImageMouseDown: (paragraphId: string, paragraphOffset: number, event: MouseEvent & {
|
|
58
|
+
currentTarget: HTMLElement;
|
|
59
|
+
}) => void;
|
|
60
|
+
onImageResizeHandleMouseDown: (paragraphId: string, paragraphOffset: number, direction: ResizeHandleDirection, event: MouseEvent & {
|
|
61
|
+
currentTarget: HTMLElement;
|
|
62
|
+
}) => void;
|
|
63
|
+
onTextBoxResizeHandleMouseDown: (paragraphId: string, paragraphOffset: number, direction: ResizeHandleDirection, event: MouseEvent & {
|
|
64
|
+
currentTarget: HTMLElement;
|
|
65
|
+
}) => void;
|
|
66
|
+
onImageRotateHandleMouseDown: (paragraphId: string, paragraphOffset: number, event: MouseEvent & {
|
|
67
|
+
currentTarget: HTMLElement;
|
|
68
|
+
}) => void;
|
|
69
|
+
onTextBoxRotateHandleMouseDown: (paragraphId: string, paragraphOffset: number, event: MouseEvent & {
|
|
70
|
+
currentTarget: HTMLElement;
|
|
71
|
+
}) => void;
|
|
72
|
+
onTableDragHandleMouseDown: (tableId: string, event: MouseEvent) => void;
|
|
73
|
+
onTableCornerResizeHandleMouseDown: (tableId: string, event: MouseEvent) => void;
|
|
74
|
+
onRevisionMouseEnter: (revisionId: string, event: MouseEvent) => void;
|
|
75
|
+
onRevisionMouseLeave?: (revisionId: string, event: MouseEvent) => void;
|
|
76
|
+
onEditorContextMenu?: (event: MouseEvent) => void;
|
|
77
|
+
}
|
|
78
|
+
export interface OasisEditorEditorInputHandlers {
|
|
79
|
+
onInputBlur: () => void;
|
|
80
|
+
onInputFocus: () => void;
|
|
81
|
+
onCompositionEnd: (event: CompositionEvent & {
|
|
82
|
+
currentTarget: HTMLTextAreaElement;
|
|
83
|
+
}) => void;
|
|
84
|
+
onCompositionStart: () => void;
|
|
85
|
+
onCopy: (event: ClipboardEvent & {
|
|
86
|
+
currentTarget: HTMLTextAreaElement;
|
|
87
|
+
}) => void;
|
|
88
|
+
onCut: (event: ClipboardEvent & {
|
|
89
|
+
currentTarget: HTMLTextAreaElement;
|
|
90
|
+
}) => void;
|
|
91
|
+
onInput: (event: InputEvent & {
|
|
92
|
+
currentTarget: HTMLTextAreaElement;
|
|
93
|
+
}) => void;
|
|
94
|
+
onKeyDown: (event: KeyboardEvent & {
|
|
95
|
+
currentTarget: HTMLTextAreaElement;
|
|
96
|
+
}) => void;
|
|
97
|
+
onPaste: (event: ClipboardEvent & {
|
|
98
|
+
currentTarget: HTMLTextAreaElement;
|
|
99
|
+
}) => void;
|
|
100
|
+
}
|
|
101
|
+
export interface OasisEditorEditorFileHandlers {
|
|
102
|
+
onImportInputChange: (event: Event & {
|
|
103
|
+
currentTarget: HTMLInputElement;
|
|
104
|
+
}) => void;
|
|
105
|
+
onImageInputChange: (event: Event & {
|
|
106
|
+
currentTarget: HTMLInputElement;
|
|
107
|
+
}) => void;
|
|
108
|
+
}
|
|
109
|
+
export interface OasisEditorEditorProps {
|
|
110
|
+
state: Accessor<EditorState>;
|
|
111
|
+
layout: OasisEditorEditorLayoutProps;
|
|
112
|
+
overlays: OasisEditorEditorOverlayProps;
|
|
113
|
+
refs?: OasisEditorEditorRefProps;
|
|
114
|
+
surfaceHandlers: OasisEditorEditorSurfaceHandlers;
|
|
115
|
+
inputHandlers: OasisEditorEditorInputHandlers;
|
|
116
|
+
fileHandlers: OasisEditorEditorFileHandlers;
|
|
117
|
+
}
|
|
118
|
+
export {};
|
|
@@ -1,44 +1,5 @@
|
|
|
1
|
-
import { MergeKey } from '../../core/transactionMergeKeys.js';
|
|
2
|
-
import { EditorState } from '../../core/model.js';
|
|
3
|
-
import { SelectedImageRun } from '../../core/commands/image.js';
|
|
4
|
-
import { createEditorCommandsController } from '../../app/controllers/EditorCommandsController.js';
|
|
5
|
-
import { createEditorHistoryActions } from '../../app/controllers/useEditorHistoryActions.js';
|
|
6
|
-
import { createEditorStyleController } from '../../app/controllers/useEditorStyle.js';
|
|
7
|
-
import { createEditorTableOperations } from '../../app/controllers/useEditorTableOperations.js';
|
|
8
1
|
import { OasisPlugin } from '../../core/plugin.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './essentials/types.js';
|
|
9
3
|
|
|
10
|
-
|
|
11
|
-
state: () => EditorState;
|
|
12
|
-
isReadOnly: () => boolean;
|
|
13
|
-
forcePlainTextPaste: {
|
|
14
|
-
get: () => boolean;
|
|
15
|
-
set: (value: boolean) => void;
|
|
16
|
-
};
|
|
17
|
-
undoStack: () => EditorState[];
|
|
18
|
-
redoStack: () => EditorState[];
|
|
19
|
-
commandsController: ReturnType<typeof createEditorCommandsController>;
|
|
20
|
-
keyboardCommandsController: ReturnType<typeof createEditorCommandsController> & {
|
|
21
|
-
applyBooleanStyleCommand: ReturnType<typeof createEditorStyleController>["applyToolbarBooleanStyleCommand"];
|
|
22
|
-
};
|
|
23
|
-
historyActions: ReturnType<typeof createEditorHistoryActions>;
|
|
24
|
-
styleController: ReturnType<typeof createEditorStyleController>;
|
|
25
|
-
tableOps: ReturnType<typeof createEditorTableOperations>;
|
|
26
|
-
docIO: {
|
|
27
|
-
handleExportDocx: () => Promise<void>;
|
|
28
|
-
handleExportPdf: () => Promise<void>;
|
|
29
|
-
};
|
|
30
|
-
importInputRef: () => HTMLInputElement | undefined;
|
|
31
|
-
imageInputRef: () => HTMLInputElement | undefined;
|
|
32
|
-
selectedImageRun: () => SelectedImageRun | null;
|
|
33
|
-
selectionBoxes: () => Array<unknown>;
|
|
34
|
-
focusInput: () => void;
|
|
35
|
-
applyState: (nextState: EditorState) => void;
|
|
36
|
-
applyTransactionalState: (producer: (current: EditorState) => EditorState, options?: {
|
|
37
|
-
mergeKey?: MergeKey;
|
|
38
|
-
}) => void;
|
|
39
|
-
findReplace: {
|
|
40
|
-
setIsOpen: (open: boolean) => void;
|
|
41
|
-
};
|
|
42
|
-
}
|
|
4
|
+
export type { CreateEditorEssentialsPluginOptions };
|
|
43
5
|
export declare function createEditorEssentialsRuntimePlugin(options: CreateEditorEssentialsPluginOptions): OasisPlugin;
|
|
44
|
-
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { EssentialsDocumentCapability } from '../../../plugins/internal/essentialsCapabilities.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
export declare function buildEssentialsDocument(options: CreateEditorEssentialsPluginOptions): EssentialsDocumentCapability;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { EssentialsFormattingCapability } from '../../../plugins/internal/essentialsCapabilities.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
type EssentialsFormattingImpl = EssentialsFormattingCapability & {
|
|
5
|
+
insertTableOfContents: () => boolean;
|
|
6
|
+
updateTableOfContents: () => boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare function buildEssentialsFormatting(options: CreateEditorEssentialsPluginOptions): EssentialsFormattingImpl;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { EssentialsFeatureGate } from '../../../plugins/internal/essentialsCapabilities.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
export declare function buildEssentialsGate(options: CreateEditorEssentialsPluginOptions): EssentialsFeatureGate;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { EssentialsHistoryCapability } from '../../../plugins/internal/essentialsCapabilities.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
export declare function buildEssentialsHistory(options: CreateEditorEssentialsPluginOptions): EssentialsHistoryCapability;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { EssentialsImageCapability } from '../../../plugins/internal/essentialsCapabilities.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
export declare function buildEssentialsImage(options: CreateEditorEssentialsPluginOptions): EssentialsImageCapability;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { EssentialsLinkCapability } from '../../../plugins/internal/essentialsCapabilities.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
export declare function buildEssentialsLink(options: CreateEditorEssentialsPluginOptions): EssentialsLinkCapability;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { EssentialsParagraphCapability } from '../../../plugins/internal/essentialsCapabilities.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
export declare function buildEssentialsParagraph(options: CreateEditorEssentialsPluginOptions): EssentialsParagraphCapability;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { EssentialsSectionCapability } from '../../../plugins/internal/essentialsCapabilities.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
export declare function buildEssentialsSection(options: CreateEditorEssentialsPluginOptions): EssentialsSectionCapability;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { EssentialsSelectionCapability } from '../../../plugins/internal/essentialsCapabilities.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
export declare function buildEssentialsSelection(options: CreateEditorEssentialsPluginOptions): EssentialsSelectionCapability;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { EssentialsStyleCapability } from '../../../plugins/internal/essentialsCapabilities.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
export declare function buildEssentialsStyle(options: CreateEditorEssentialsPluginOptions): EssentialsStyleCapability;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { EssentialsTableCapability } from '../../../plugins/internal/essentialsCapabilities.js';
|
|
2
|
+
import { CreateEditorEssentialsPluginOptions } from './types.js';
|
|
3
|
+
|
|
4
|
+
export declare function buildEssentialsTable(options: CreateEditorEssentialsPluginOptions): EssentialsTableCapability;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { MergeKey } from '../../../core/transactionMergeKeys.js';
|
|
2
|
+
import { EditorState } from '../../../core/model.js';
|
|
3
|
+
import { SelectedImageRun } from '../../../core/commands/image.js';
|
|
4
|
+
import { createEditorCommandsController } from '../../../app/controllers/EditorCommandsController.js';
|
|
5
|
+
import { createEditorHistoryActions } from '../../../app/controllers/useEditorHistoryActions.js';
|
|
6
|
+
import { createEditorStyleController } from '../../../app/controllers/useEditorStyle.js';
|
|
7
|
+
import { createEditorTableOperations } from '../../../app/controllers/useEditorTableOperations.js';
|
|
8
|
+
|
|
9
|
+
export interface CreateEditorEssentialsPluginOptions {
|
|
10
|
+
state: () => EditorState;
|
|
11
|
+
isReadOnly: () => boolean;
|
|
12
|
+
forcePlainTextPaste: {
|
|
13
|
+
get: () => boolean;
|
|
14
|
+
set: (value: boolean) => void;
|
|
15
|
+
};
|
|
16
|
+
undoStack: () => EditorState[];
|
|
17
|
+
redoStack: () => EditorState[];
|
|
18
|
+
commandsController: ReturnType<typeof createEditorCommandsController>;
|
|
19
|
+
keyboardCommandsController: ReturnType<typeof createEditorCommandsController> & {
|
|
20
|
+
applyBooleanStyleCommand: ReturnType<typeof createEditorStyleController>["applyToolbarBooleanStyleCommand"];
|
|
21
|
+
};
|
|
22
|
+
historyActions: ReturnType<typeof createEditorHistoryActions>;
|
|
23
|
+
styleController: ReturnType<typeof createEditorStyleController>;
|
|
24
|
+
tableOps: ReturnType<typeof createEditorTableOperations>;
|
|
25
|
+
docIO: {
|
|
26
|
+
handleExportDocx: () => Promise<void>;
|
|
27
|
+
handleExportPdf: () => Promise<void>;
|
|
28
|
+
};
|
|
29
|
+
importInputRef: () => HTMLInputElement | undefined;
|
|
30
|
+
imageInputRef: () => HTMLInputElement | undefined;
|
|
31
|
+
selectedImageRun: () => SelectedImageRun | null;
|
|
32
|
+
selectionBoxes: () => Array<unknown>;
|
|
33
|
+
focusInput: () => void;
|
|
34
|
+
applyState: (nextState: EditorState) => void;
|
|
35
|
+
applyTransactionalState: (producer: (current: EditorState) => EditorState, options?: {
|
|
36
|
+
mergeKey?: MergeKey;
|
|
37
|
+
}) => void;
|
|
38
|
+
findReplace: {
|
|
39
|
+
setIsOpen: (open: boolean) => void;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface LineSlot {
|
|
2
|
+
offset: number;
|
|
3
|
+
}
|
|
4
|
+
/** Finds the slot at `offset`, falling back to the first slot at or after it. */
|
|
5
|
+
export declare function findSlotForOffset<TSlot extends LineSlot>(slots: TSlot[], offset: number): TSlot | undefined;
|
|
6
|
+
/** Ensures a fragment's end offset spans at least one character past its start. */
|
|
7
|
+
export declare function resolveInclusiveEndOffset(startOffset: number, endOffset: number): number;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CanvasSnapshotLine } from './canvasSnapshotTypes.js';
|
|
2
|
+
|
|
3
|
+
interface SourceSlot {
|
|
4
|
+
offset: number;
|
|
5
|
+
left: number;
|
|
6
|
+
top: number;
|
|
7
|
+
height: number;
|
|
8
|
+
}
|
|
9
|
+
interface SourceLine {
|
|
10
|
+
startOffset: number;
|
|
11
|
+
endOffset: number;
|
|
12
|
+
top: number;
|
|
13
|
+
height: number;
|
|
14
|
+
slots: SourceSlot[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Projects layout lines/slots into screen-anchored snapshot geometry by adding
|
|
18
|
+
* the given left/top origin offsets. Shared by the paragraph-block and
|
|
19
|
+
* table-cell walkers, which build the identical shape from different origins.
|
|
20
|
+
*/
|
|
21
|
+
export declare function toSnapshotLines(lines: SourceLine[], leftOffset: number, topOffset: number): CanvasSnapshotLine[];
|
|
22
|
+
export {};
|