@mocanvas/mocanvas 4.0.2 → 4.1.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/ARCHITECTURE.md +8 -2
- package/MIGRATION.md +46 -22
- package/README.md +27 -2
- package/UI.md +24 -2
- package/dist/{chunk-TWCVRVK2.js → chunk-3F2HKY37.js} +3 -3
- package/dist/{chunk-TWCVRVK2.js.map → chunk-3F2HKY37.js.map} +1 -1
- package/dist/{chunk-DMCI6V5Y.js → chunk-HRUFJLK5.js} +3 -3
- package/dist/{chunk-DMCI6V5Y.js.map → chunk-HRUFJLK5.js.map} +1 -1
- package/dist/{chunk-OCYJAMXT.js → chunk-S7FPGQAA.js} +22 -3
- package/dist/chunk-S7FPGQAA.js.map +1 -0
- package/dist/{chunk-QDUQZXE4.js → chunk-YMUR46N6.js} +456 -19
- package/dist/chunk-YMUR46N6.js.map +1 -0
- package/dist/{export-VQGOVONC.js → export-UA6X35ZW.js} +4 -4
- package/dist/{export-VQGOVONC.js.map → export-UA6X35ZW.js.map} +1 -1
- package/dist/index.d.ts +279 -35
- package/dist/index.js +404 -410
- package/dist/index.js.map +1 -1
- package/dist/{ui-4C5V5GYT.css → mocanvas.css} +73 -241
- package/dist/mocanvas.css.map +1 -0
- package/dist/panel-shortcuts-4GIFCQQR.js +4 -0
- package/dist/{panel-shortcuts-R2PDTDUN.js.map → panel-shortcuts-4GIFCQQR.js.map} +1 -1
- package/dist/urlContent-WYYVQYYN.js +4 -0
- package/dist/{urlContent-GC44EU52.js.map → urlContent-WYYVQYYN.js.map} +1 -1
- package/package.json +8 -4
- package/dist/chunk-OCYJAMXT.js.map +0 -1
- package/dist/chunk-QDUQZXE4.js.map +0 -1
- package/dist/panel-shortcuts-R2PDTDUN.js +0 -4
- package/dist/urlContent-GC44EU52.js +0 -4
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/ui-dialogs.tsx","../src/ui/icons.tsx","../src/ui/ui-icon.tsx","../src/ui/ui-button.tsx","../src/ui/overlays.tsx","../src/ui/ui-floating.tsx","../src/ui/ui-dropdown-menu.tsx","../src/ui/ui-kbd.tsx","../src/ui/ui-actions.ts","../src/ui/ui-events.tsx","../src/ui/ui-translation.tsx","../src/ui/ui-menu.tsx","../src/ui/panel-shortcuts.tsx"],"names":["jsx","jsxs","Fragment","useRef","useState","useCallback","useEffect","useLayoutEffect","FOCUSABLE","EditorPortal","createContext","useContext","useMemo","useEditor","useValue","useTools","useActions"],"mappings":"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","file":"chunk-QDUQZXE4.js","sourcesContent":["import { EditorPortal } from \"@mocanvas/editor\"\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from \"react\"\n\n/**\n * Modal dialogs, and the stack that owns them.\n *\n * Opening a dialog is a *data* operation — `addDialog({ component })` — rather\n * than rendering one in place, because the code that opens a dialog is almost\n * always a menu item that unmounts on the same click.\n */\n\n/** What a dialog component is rendered with. */\nexport interface TLUiDialogProps {\n /** Close this dialog. Also called when the backdrop or Escape closes it. */\n onClose(): void\n}\n\n/** One entry on the dialog stack. */\nexport interface TLUiDialog {\n id: string\n /** Rendered inside the modal frame. */\n component: ComponentType<TLUiDialogProps>\n /** Called after the dialog is removed, however it was closed. */\n onClose?(): void\n /** Let a click on the backdrop close it. Defaults to `true`. */\n preventBackdropClose?: boolean\n}\n\nexport interface TLUiDialogsContextType {\n addDialog(dialog: Omit<TLUiDialog, \"id\"> & { id?: string }): string\n removeDialog(id: string): void\n clearDialogs(): void\n dialogs: TLUiDialog[]\n}\n\nconst DialogsContext = createContext<TLUiDialogsContextType | null>(null)\n\nconst NOOP: TLUiDialogsContextType = { addDialog: () => \"\", removeDialog: () => {}, clearDialogs: () => {}, dialogs: [] }\n\nexport interface TLUiDialogsProviderProps {\n children?: ReactNode\n}\n\nlet nextDialogId = 0\n\n/** Holds the dialog stack. Render {@link DefaultDialogs} inside it. */\nexport function TldrawUiDialogsProvider({ children }: TLUiDialogsProviderProps) {\n const [dialogs, setDialogs] = useState<TLUiDialog[]>([])\n\n const removeDialog = useCallback((id: string) => {\n setDialogs((current) => {\n current.find((dialog) => dialog.id === id)?.onClose?.()\n return current.filter((dialog) => dialog.id !== id)\n })\n }, [])\n\n const addDialog = useCallback((dialog: Omit<TLUiDialog, \"id\"> & { id?: string }) => {\n const id = dialog.id ?? `dialog:${nextDialogId++}`\n setDialogs((current) => [...current.filter((d) => d.id !== id), { ...dialog, id }])\n return id\n }, [])\n\n const clearDialogs = useCallback(() => {\n setDialogs((current) => {\n for (const dialog of current) dialog.onClose?.()\n return []\n })\n }, [])\n\n const value = useMemo<TLUiDialogsContextType>(\n () => ({ addDialog, removeDialog, clearDialogs, dialogs }),\n [addDialog, removeDialog, clearDialogs, dialogs],\n )\n return <DialogsContext.Provider value={value}>{children}</DialogsContext.Provider>\n}\n\n/** The dialog stack. Inert outside a provider. */\nexport function useDialogs(): TLUiDialogsContextType {\n return useContext(DialogsContext) ?? NOOP\n}\n\n/** Everything inside a dialog that the keyboard can reach. */\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])'\n\n/**\n * The modal frame: backdrop, focus trap, Escape.\n *\n * The trap is the part a dialog cannot do without. Without it, Tab walks out\n * of the dialog and onto the canvas behind it, which is both wrong and\n * invisible — the focus ring is under the backdrop.\n */\nfunction DialogFrame({ dialog, onClose }: { dialog: TLUiDialog; onClose: () => void }) {\n const ref = useRef<HTMLDivElement>(null)\n const returnFocusTo = useRef<Element | null>(null)\n\n useEffect(() => {\n returnFocusTo.current = ref.current?.ownerDocument.activeElement ?? null\n const first = ref.current?.querySelector<HTMLElement>(FOCUSABLE)\n ;(first ?? ref.current)?.focus()\n return () => {\n const previous = returnFocusTo.current\n if (previous instanceof HTMLElement) previous.focus()\n }\n }, [])\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.stopPropagation()\n onClose()\n return\n }\n if (event.key !== \"Tab\") return\n const items = Array.from(ref.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? [])\n if (items.length === 0) return\n const first = items[0]!\n const last = items[items.length - 1]!\n const active = ref.current?.ownerDocument.activeElement\n if (event.shiftKey && active === first) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && active === last) {\n event.preventDefault()\n first.focus()\n }\n }\n\n const Component = dialog.component\n return (\n <div\n className=\"mocanvas-dialog-backdrop\"\n onPointerDown={(event) => {\n if (event.target === event.currentTarget && !dialog.preventBackdropClose) onClose()\n }}\n >\n <div ref={ref} className=\"mocanvas-dialog mocanvas-panel\" role=\"dialog\" aria-modal=\"true\" tabIndex={-1} onKeyDown={onKeyDown}>\n <Component onClose={onClose} />\n </div>\n </div>\n )\n}\n\n/** Renders the dialog stack into the editor's container. */\nexport function DefaultDialogs() {\n const { dialogs, removeDialog } = useDialogs()\n if (dialogs.length === 0) return null\n return (\n <EditorPortal>\n {dialogs.map((dialog) => (\n <DialogFrame key={dialog.id} dialog={dialog} onClose={() => removeDialog(dialog.id)} />\n ))}\n </EditorPortal>\n )\n}\n\n// ---------------------------------------------------------------------------\n// The pieces a dialog is built from\n// ---------------------------------------------------------------------------\n\nexport interface TLUiDialogHeaderProps {\n className?: string\n children?: ReactNode\n}\n\n/** A dialog's title bar. */\nexport function TldrawUiDialogHeader({ className, children }: TLUiDialogHeaderProps) {\n return <div className={className ? `mocanvas-dialog-header ${className}` : \"mocanvas-dialog-header\"}>{children}</div>\n}\n\nexport interface TLUiDialogTitleProps {\n className?: string\n children?: ReactNode\n}\n\n/**\n * A dialog's title. Rendered as an `<h2>` so the dialog has a heading in the\n * document outline, not just a bold line.\n */\nexport function TldrawUiDialogTitle({ className, children }: TLUiDialogTitleProps) {\n return <h2 className={className ? `mocanvas-dialog-title ${className}` : \"mocanvas-dialog-title\"}>{children}</h2>\n}\n\n/** The dialog's close affordance. Reads `onClose` from the enclosing dialog. */\nexport function TldrawUiDialogCloseButton() {\n const { dialogs, removeDialog } = useDialogs()\n const top = dialogs[dialogs.length - 1]\n return (\n <button\n type=\"button\"\n className=\"mocanvas-btn mocanvas-dialog-close\"\n aria-label=\"Close\"\n onClick={() => {\n if (top) removeDialog(top.id)\n }}\n >\n ×\n </button>\n )\n}\n\nexport interface TLUiDialogBodyProps {\n className?: string\n style?: React.CSSProperties\n children?: ReactNode\n}\n\n/** A dialog's scrollable middle. */\nexport function TldrawUiDialogBody({ className, style, children }: TLUiDialogBodyProps) {\n return (\n <div className={className ? `mocanvas-dialog-body ${className}` : \"mocanvas-dialog-body\"} style={style}>\n {children}\n </div>\n )\n}\n\nexport interface TLUiDialogFooterProps {\n className?: string\n children?: ReactNode\n}\n\n/** A dialog's button row. */\nexport function TldrawUiDialogFooter({ className, children }: TLUiDialogFooterProps) {\n return <div className={className ? `mocanvas-dialog-footer ${className}` : \"mocanvas-dialog-footer\"}>{children}</div>\n}\n\nexport interface ExampleDialogProps extends TLUiDialogProps {\n title?: string\n body?: ReactNode\n confirmLabel?: string\n cancelLabel?: string\n displayDontShowAgain?: boolean\n onCancel?(): void\n onContinue?(): void\n}\n\n/**\n * A confirm/cancel dialog, complete.\n *\n * Exists so an app that only needs \"are you sure?\" does not have to assemble\n * one out of the five pieces above — and so the pieces have a worked example\n * to copy when it needs something else.\n */\nexport function ExampleDialog({\n title = \"Title\",\n body = \"Description\",\n confirmLabel = \"Continue\",\n cancelLabel = \"Cancel\",\n displayDontShowAgain = false,\n onCancel,\n onContinue,\n onClose,\n}: ExampleDialogProps) {\n const [dontShowAgain, setDontShowAgain] = useState(false)\n return (\n <>\n <TldrawUiDialogHeader>\n <TldrawUiDialogTitle>{title}</TldrawUiDialogTitle>\n <TldrawUiDialogCloseButton />\n </TldrawUiDialogHeader>\n <TldrawUiDialogBody>{body}</TldrawUiDialogBody>\n <TldrawUiDialogFooter>\n {displayDontShowAgain ? (\n <label className=\"mocanvas-dialog-checkbox\">\n <input type=\"checkbox\" checked={dontShowAgain} onChange={(event) => setDontShowAgain(event.target.checked)} />\n Don’t show again\n </label>\n ) : null}\n <button\n type=\"button\"\n className=\"mocanvas-btn mocanvas-btn--wide\"\n onClick={() => {\n onCancel?.()\n onClose()\n }}\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n className=\"mocanvas-btn mocanvas-btn--wide\"\n onClick={() => {\n onContinue?.()\n onClose()\n }}\n >\n {confirmLabel}\n </button>\n </TldrawUiDialogFooter>\n </>\n )\n}\n","/**\n * The default UI icon set: original artwork drawn on a 24×24 grid with a\n * 1.75px stroke, round caps and joins, painted with `currentColor` so buttons\n * control their own colour.\n *\n * Grid rules, enforced by `icons.test.tsx` where they are checkable statically\n * and by the gallery pass otherwise:\n *\n * - the artwork lives on a 24×24 viewBox; ink (stroke included) stays inside it\n * - ink is optically centred on (12, 12) and spans about 17.75 units at its\n * widest, so no icon reads heavier than its neighbour in the same row\n * - stroke is 1.75 with round caps and joins; only texture marks (hatching,\n * dotted rules, the mono rails) deviate, and they say so at the call site\n * - deliberate asymmetry is allowed only when it carries meaning, e.g. the\n * vertical-align icons sit high or low on purpose\n *\n * Geo icons are generated from the same geometry the canvas draws, so a toolbar\n * button matches the shape it creates.\n */\nimport { GEO_SHAPE_KINDS, type GeoShapeKind } from \"@mocanvas/editor\"\nimport type { ReactElement } from \"react\"\nimport { getGeoGeometry } from \"../shapes/geo-helpers\"\nimport { pathWordsToSvgD } from \"../shapes/svg-path\"\n\n/** Side of the drawing grid. */\nexport const ICON_GRID = 24\n/** Longest side of the box a geo outline is fitted into, centred in the grid. */\nexport const GEO_BOX = 16\n\nconst solid = { fill: \"currentColor\", stroke: \"none\" } as const\n\n// ---------------------------------------------------------------------------\n// Tools\n// ---------------------------------------------------------------------------\n\nconst TOOL_ICONS = {\n select: <path d=\"M6.65 4.05v13.95l3.54-3.35 2.41 5.3 2.33-1.02-2.42-5.21 4.84-.19z\" />,\n hand: (\n <path d=\"M8.35 14.6V9.5a1.3 1.3 0 0 1 2.6 0V5.3a1.3 1.3 0 0 1 2.6 0v.5a1.3 1.3 0 0 1 2.6 0v1.9a1.3 1.3 0 0 1 2.6 0v6.75c0 3.15-2.55 5.7-5.7 5.7h-.6c-1.9 0-3.68-.96-4.72-2.55l-1.75-2.65a1.3 1.3 0 0 1 2.17-1.42z\" />\n ),\n draw: (\n <>\n <path d=\"M4.4 19.6l1.05-3.8L15.5 5.75a2 2 0 0 1 2.83 2.83L8.2 18.55z\" />\n <path d=\"M13.55 7.7l2.83 2.83\" />\n </>\n ),\n eraser: (\n <>\n <g transform=\"translate(12 10.5) rotate(-45)\">\n <rect x=\"-5.75\" y=\"-3.5\" width=\"11.5\" height=\"7\" rx=\"1.6\" />\n <path d=\"M0 -3.5V3.5\" />\n </g>\n <path d=\"M7 19.4h10.5\" />\n </>\n ),\n text: (\n <>\n <path d=\"M5 6.25V4.5h14v1.75\" />\n <path d=\"M12 4.5v15\" />\n <path d=\"M8.75 19.5h6.5\" />\n </>\n ),\n note: (\n <>\n <path d=\"M4.5 5.75A1.75 1.75 0 0 1 6.25 4h11.5a1.75 1.75 0 0 1 1.75 1.75v8L13.5 20H6.25A1.75 1.75 0 0 1 4.5 18.25z\" />\n <path d=\"M19.5 13.75h-4.25a1.75 1.75 0 0 0-1.75 1.75V20\" />\n </>\n ),\n frame: (\n <>\n <path d=\"M8 4.5v15M16 4.5v15\" />\n <path d=\"M4.5 8h15M4.5 16h15\" />\n </>\n ),\n arrow: (\n <>\n <path d=\"M5.15 18.85L18.85 5.15\" />\n <path d=\"M12 5.15h6.85V12\" />\n </>\n ),\n line: (\n <>\n <path d=\"M7.6 16.4L16.4 7.6\" />\n <circle cx=\"5.85\" cy=\"18.15\" r=\"1.85\" />\n <circle cx=\"18.15\" cy=\"5.85\" r=\"1.85\" />\n </>\n ),\n image: (\n <>\n <rect x=\"3.9\" y=\"5.25\" width=\"16.2\" height=\"13.5\" rx=\"2.25\" />\n <circle cx=\"8.9\" cy=\"10\" r=\"1.55\" />\n <path d=\"M4 16.2l4.75-4.2 3.75 3.25 3-2.5 4.6 4.05\" />\n </>\n ),\n} as const\n\n// ---------------------------------------------------------------------------\n// View, history and object actions\n// ---------------------------------------------------------------------------\n\nconst ACTION_ICONS = {\n \"zoom-in\": (\n <>\n <circle cx=\"10.75\" cy=\"10.75\" r=\"6.25\" />\n <path d=\"M15.4 15.4l5.1 5.1\" />\n <path d=\"M8 10.75h5.5M10.75 8v5.5\" />\n </>\n ),\n \"zoom-out\": (\n <>\n <circle cx=\"10.75\" cy=\"10.75\" r=\"6.25\" />\n <path d=\"M15.4 15.4l5.1 5.1\" />\n <path d=\"M8 10.75h5.5\" />\n </>\n ),\n \"zoom-fit\": (\n <path d=\"M4 9V5.5A1.5 1.5 0 0 1 5.5 4H9M15 4h3.5A1.5 1.5 0 0 1 20 5.5V9M20 15v3.5a1.5 1.5 0 0 1-1.5 1.5H15M9 20H5.5A1.5 1.5 0 0 1 4 18.5V15\" />\n ),\n undo: (\n <>\n <path d=\"M4.25 8.75h10.25a5.25 5.25 0 0 1 0 10.5H10\" />\n <path d=\"M8.25 4.75L4.25 8.75l4 4\" />\n </>\n ),\n redo: (\n <>\n <path d=\"M19.75 8.75H9.5a5.25 5.25 0 0 0 0 10.5H14\" />\n <path d=\"M15.75 4.75l4 4-4 4\" />\n </>\n ),\n lock: (\n <>\n <rect x=\"4.75\" y=\"10.5\" width=\"14.5\" height=\"9.5\" rx=\"2.25\" />\n <path d=\"M8.25 10.5V7.75a3.75 3.75 0 0 1 7.5 0v2.75\" />\n </>\n ),\n unlock: (\n <>\n <rect x=\"4.75\" y=\"10.5\" width=\"14.5\" height=\"9.5\" rx=\"2.25\" />\n <path d=\"M8.25 10.5V7.75a3.75 3.75 0 0 1 7.15-1.5\" />\n </>\n ),\n duplicate: (\n <>\n <rect x=\"8.5\" y=\"8.5\" width=\"11.5\" height=\"11.5\" rx=\"2.25\" />\n <path d=\"M15.5 4H6.25A2.25 2.25 0 0 0 4 6.25V15.5\" />\n </>\n ),\n trash: (\n <>\n <path d=\"M4.5 7h15\" />\n <path d=\"M9.5 7V5.75A1.5 1.5 0 0 1 11 4.25h2a1.5 1.5 0 0 1 1.5 1.5V7\" />\n <path d=\"M6.75 7l.75 11.5A1.5 1.5 0 0 0 9 20h6a1.5 1.5 0 0 0 1.5-1.5L17.25 7\" />\n <path d=\"M10.25 10.5v6M13.75 10.5v6\" />\n </>\n ),\n group: (\n <>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" strokeDasharray=\"3 3\" />\n <rect x=\"7\" y=\"7\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n <rect x=\"12.5\" y=\"12.5\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n </>\n ),\n ungroup: (\n <>\n <path d=\"M4 8V5.25A1.25 1.25 0 0 1 5.25 4H8M16 4h2.75A1.25 1.25 0 0 1 20 5.25V8M20 16v2.75A1.25 1.25 0 0 1 18.75 20H16M8 20H5.25A1.25 1.25 0 0 1 4 18.75V16\" />\n <rect x=\"7\" y=\"7\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n <rect x=\"12.5\" y=\"12.5\" width=\"4.5\" height=\"4.5\" rx=\"1\" />\n </>\n ),\n \"bring-forward\": (\n <>\n <rect x=\"4.75\" y=\"11.25\" width=\"14.5\" height=\"8.75\" rx=\"2.25\" />\n <path d=\"M12 9V4M8.75 7.25L12 4l3.25 3.25\" />\n </>\n ),\n \"send-backward\": (\n <>\n <rect x=\"4.75\" y=\"4\" width=\"14.5\" height=\"8.75\" rx=\"2.25\" />\n <path d=\"M12 15v5M8.75 16.75L12 20l3.25-3.25\" />\n </>\n ),\n \"chevron-down\": <path d=\"M6.75 9.75L12 15l5.25-5.25\" />,\n \"chevron-up\": <path d=\"M6.75 14.25L12 9l5.25 5.25\" />,\n check: <path d=\"M5 12.5l4.9 4.9L19 6.75\" />,\n close: <path d=\"M6.5 6.5l11 11M17.5 6.5l-11 11\" />,\n mixed: <circle cx=\"12\" cy=\"12\" r=\"7.25\" strokeDasharray=\"2.6 2.8\" />,\n} as const\n\n// ---------------------------------------------------------------------------\n// Style properties\n// ---------------------------------------------------------------------------\n\nconst FILL_BOX = { x: 4.25, y: 4.25, width: 15.5, height: 15.5, rx: 3 } as const\n\nconst STYLE_ICONS = {\n \"fill-none\": <rect {...FILL_BOX} />,\n \"fill-semi\": (\n <>\n <rect {...FILL_BOX} fill=\"currentColor\" fillOpacity={0.22} />\n </>\n ),\n \"fill-solid\": <rect {...FILL_BOX} fill=\"currentColor\" />,\n // Hatching is texture, not outline: a lighter stroke keeps the block's weight\n // level with the other three fill icons.\n \"fill-pattern\": (\n <>\n <rect {...FILL_BOX} />\n <path d=\"M6.2 12.6l6.4-6.4M6.2 17.1l10.9-10.9M9.4 18.3l8.9-8.9M14.6 18.4l3.7-3.7\" strokeWidth={1.25} />\n </>\n ),\n \"dash-draw\": <path d=\"M4 14.9c1.6-3.4 3.2-4.9 4.9-4.4 1.7.4 2.4 4 4.2 4.4 1.9.4 3.9-1.9 6.9-5.9\" />,\n \"dash-solid\": <path d=\"M4.25 12h15.5\" />,\n \"dash-dashed\": <path d=\"M4.5 12h15\" strokeDasharray=\"3.1 2.8\" />,\n // Round caps on a zero-length dash draw the dots; the wider stroke is the dot.\n \"dash-dotted\": <path d=\"M5 12h14\" strokeDasharray=\"0.01 4.35\" strokeWidth={2.6} />,\n \"size-s\": <circle cx=\"12\" cy=\"12\" r=\"2\" {...solid} />,\n \"size-m\": <circle cx=\"12\" cy=\"12\" r=\"3.4\" {...solid} />,\n \"size-l\": <circle cx=\"12\" cy=\"12\" r=\"4.9\" {...solid} />,\n \"size-xl\": <circle cx=\"12\" cy=\"12\" r=\"6.6\" {...solid} />,\n \"align-left\": <path d=\"M4.5 6.5h15M4.5 12h7.5M4.5 17.5h11.5\" />,\n \"align-center\": <path d=\"M4.5 6.5h15M8.25 12h7.5M6.25 17.5h11.5\" />,\n \"align-right\": <path d=\"M4.5 6.5h15M12 12h7.5M8 17.5h11.5\" />,\n \"valign-top\": (\n <>\n <path d=\"M4.5 4.5h15\" />\n <rect x=\"7.5\" y=\"7.75\" width=\"9\" height=\"6.25\" rx=\"1.5\" />\n </>\n ),\n \"valign-middle\": (\n <>\n <path d=\"M4.5 12h15\" />\n <rect x=\"7.5\" y=\"8.9\" width=\"9\" height=\"6.25\" rx=\"1.5\" />\n </>\n ),\n \"valign-bottom\": (\n <>\n <path d=\"M4.5 19.5h15\" />\n <rect x=\"7.5\" y=\"10\" width=\"9\" height=\"6.25\" rx=\"1.5\" />\n </>\n ),\n // A single-storey script \"a\": the other three fonts share the capital-A\n // silhouette, so the handwriting option needs a different letter to stay\n // legible at 20px.\n \"font-draw\": (\n <>\n <circle cx=\"10.6\" cy=\"12.6\" r=\"4.4\" />\n <path d=\"M15 6.3v8.9c0 1.5 1 2.5 2.5 2.5\" />\n </>\n ),\n \"font-sans\": (\n <>\n <path d=\"M5.5 19L12 5l6.5 14\" />\n <path d=\"M8 14.5h8\" />\n </>\n ),\n \"font-serif\": (\n <>\n <path d=\"M6.75 19L12 5l5.25 14\" />\n <path d=\"M8.7 14.5h6.6\" />\n <path d=\"M4.9 19h3.6M15.5 19h3.6\" />\n </>\n ),\n \"font-mono\": (\n <>\n <path d=\"M8 19l4-13 4 13\" />\n <path d=\"M9.6 14.9h4.8\" />\n {/* The rails are a frame, not a letter stroke: keep them lighter. */}\n <path d=\"M4.75 5.75v12.5M19.25 5.75v12.5\" strokeWidth={1.4} />\n </>\n ),\n} as const\n\n// ---------------------------------------------------------------------------\n// Geo kinds, derived from the canvas geometry\n// ---------------------------------------------------------------------------\n\n/**\n * Box each geo outline is fitted into. Square by default; kinds whose name\n * implies a proportion get one, so that e.g. \"oval\" does not draw the same\n * circle as \"ellipse\". The longest side is always `GEO_BOX`, which keeps every\n * geo icon at the same optical weight as the rest of the set.\n */\nconst GEO_ICON_BOX: Partial<Record<GeoShapeKind, readonly [number, number]>> = {\n rectangle: [GEO_BOX, 12],\n oval: [GEO_BOX, 10.5],\n \"arrow-left\": [GEO_BOX, 13],\n \"arrow-right\": [GEO_BOX, 13],\n \"arrow-up\": [13, GEO_BOX],\n \"arrow-down\": [13, GEO_BOX],\n}\n\n/** The box a geo icon's outline is fitted into, in grid units. */\nexport function getGeoIconBox(kind: GeoShapeKind): readonly [number, number] {\n return GEO_ICON_BOX[kind] ?? [GEO_BOX, GEO_BOX]\n}\n\n/** `d` attribute for each geo kind, fitted to its icon box. */\nexport const GEO_ICON_PATHS: Record<GeoShapeKind, string> = Object.fromEntries(\n GEO_SHAPE_KINDS.map((kind) => {\n const [w, h] = getGeoIconBox(kind)\n return [kind, pathWordsToSvgD(getGeoGeometry(kind, w, h, false).toPathWords())]\n }),\n) as Record<GeoShapeKind, string>\n\ntype GeoIconName = `geo-${GeoShapeKind}`\n\nconst GEO_ICONS = Object.fromEntries(\n GEO_SHAPE_KINDS.map((kind) => {\n const [w, h] = getGeoIconBox(kind)\n return [\n `geo-${kind}`,\n <g transform={`translate(${(ICON_GRID - w) / 2} ${(ICON_GRID - h) / 2})`}>\n <path d={GEO_ICON_PATHS[kind]} />\n </g>,\n ]\n }),\n) as Record<GeoIconName, ReactElement>\n\n/** Every icon in the set, keyed by name. */\nexport const ICONS = { ...TOOL_ICONS, ...ACTION_ICONS, ...STYLE_ICONS, ...GEO_ICONS }\n\nexport type IconName = keyof typeof ICONS\n\n/** All icon names, sorted — handy for tests and galleries. */\nexport const ICON_NAMES = Object.keys(ICONS).sort() as IconName[]\n\nexport interface IconProps {\n name: IconName\n /** Rendered size in px; the artwork is scaled from the 24×24 grid. */\n size?: number\n className?: string\n}\n\n/** Renders one icon from the set. Decorative by default: label the button instead. */\nexport function Icon({ name, size = 20, className }: IconProps) {\n return (\n <svg\n className={className ? `mocanvas-icon ${className}` : \"mocanvas-icon\"}\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.75}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {ICONS[name]}\n </svg>\n )\n}\n","import type { CSSProperties } from \"react\"\nimport { Icon, ICONS, type IconName } from \"./icons\"\n\n/**\n * The icon element the UI primitives use.\n *\n * Distinct from {@link Icon}, which takes a name the set is known to have.\n * This one takes an arbitrary string, because a `TLUiActionItem.icon` comes\n * from an app's override and may name artwork mocanvas does not ship: an\n * unknown name falls back to the label's initial rather than rendering an\n * empty box, so a custom item is still a legible button.\n */\nexport interface TLUiIconProps {\n /** Icon name, or an image URL when it contains a `/` or `.`. */\n icon: string\n /** Read out when the icon is the button's only content. */\n label?: string\n /** Draw at the smaller size used inside dense rows. */\n small?: boolean\n /** Mirror horizontally, for a direction icon in a right-to-left locale. */\n invertIcon?: boolean\n className?: string\n style?: CSSProperties\n color?: string\n}\n\n/** Whether `icon` looks like a URL rather than a name in the built-in set. */\nfunction isUrl(icon: string): boolean {\n return icon.includes(\"/\") || icon.includes(\".\")\n}\n\n/**\n * An icon, from the built-in set, from a URL, or as a fallback initial.\n *\n * `aria-hidden` unless it was given a label: an icon inside a labelled button\n * is decoration, and announcing it would make a screen reader say the name\n * twice.\n */\nexport function TldrawUiIcon({ icon, label, small, invertIcon, className, style, color }: TLUiIconProps) {\n const classes = [\"mocanvas-icon\", small ? \"mocanvas-icon--small\" : null, className].filter(Boolean).join(\" \")\n const transform = invertIcon ? \"scaleX(-1)\" : undefined\n const size = small ? 16 : 20\n\n if (Object.prototype.hasOwnProperty.call(ICONS, icon)) {\n return (\n <span className={classes} style={{ ...style, color, transform, display: \"inline-flex\" }} {...(label ? { role: \"img\", \"aria-label\": label } : { \"aria-hidden\": true })}>\n <Icon name={icon as IconName} size={size} />\n </span>\n )\n }\n\n if (isUrl(icon)) {\n return (\n <img\n className={classes}\n src={icon}\n alt={label ?? \"\"}\n width={size}\n height={size}\n style={{ ...style, transform }}\n {...(label ? {} : { \"aria-hidden\": true })}\n />\n )\n }\n\n return (\n <span\n className={`${classes} mocanvas-icon--fallback`}\n style={{ ...style, color, transform, width: size, height: size, display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\", fontWeight: 600 }}\n {...(label ? { role: \"img\", \"aria-label\": label } : { \"aria-hidden\": true })}\n >\n {(label ?? icon).slice(0, 1).toUpperCase()}\n </span>\n )\n}\n","import type { CSSProperties, MouseEvent, PointerEvent, ReactNode, Ref } from \"react\"\nimport { TldrawUiIcon } from \"./ui-icon\"\n\n/**\n * The button every piece of chrome is made of, and the three things that go\n * inside it.\n *\n * Split into four components rather than one with an `icon` and a `label`\n * prop, because the arrangement varies: a toolbar button is icon-only, a menu\n * item is icon-then-label, a checkbox item is label-then-check. Composing\n * covers all three without a prop that means \"which layout\".\n */\n\n/** How a button reads: its size, its emphasis, and whether it is a menu row. */\nexport type TLUiButtonType = \"normal\" | \"primary\" | \"danger\" | \"low\" | \"icon\" | \"menu\" | \"tool\" | \"help\"\n\nexport interface TLUiButtonProps {\n type?: TLUiButtonType\n /** Rendered as `aria-pressed`: a two-state button, not a link. */\n isChecked?: boolean\n /** Marks the active item in a set. Rendered as `aria-current`. */\n isActive?: boolean\n disabled?: boolean\n /** Accessible name. Required when the button's content is an icon alone. */\n title?: string\n /** Explicit accessible name, when it differs from the visible label. */\n \"aria-label\"?: string\n className?: string\n style?: CSSProperties\n id?: string\n tabIndex?: number\n role?: string\n ref?: Ref<HTMLButtonElement>\n onClick?(event: MouseEvent<HTMLButtonElement>): void\n onPointerDown?(event: PointerEvent<HTMLButtonElement>): void\n onPointerUp?(event: PointerEvent<HTMLButtonElement>): void\n onKeyDown?(event: React.KeyboardEvent<HTMLButtonElement>): void\n onFocus?(event: React.FocusEvent<HTMLButtonElement>): void\n onBlur?(event: React.FocusEvent<HTMLButtonElement>): void\n children?: ReactNode\n}\n\n/**\n * A button.\n *\n * `type=\"submit\"` is never what chrome wants — a button inside a form that\n * defaults to submitting is a bug waiting for someone to press Enter — so this\n * always renders `type=\"button\"`.\n */\nexport function TldrawUiButton({\n type = \"normal\",\n isChecked,\n isActive,\n disabled,\n title,\n className,\n style,\n id,\n tabIndex,\n role,\n ref,\n onClick,\n onPointerDown,\n onPointerUp,\n onKeyDown,\n onFocus,\n onBlur,\n children,\n ...rest\n}: TLUiButtonProps) {\n const label = rest[\"aria-label\"] ?? title\n return (\n <button\n ref={ref}\n type=\"button\"\n id={id}\n role={role}\n tabIndex={tabIndex}\n className={[\"mocanvas-btn\", `mocanvas-btn--${type}`, className].filter(Boolean).join(\" \")}\n style={style}\n disabled={disabled}\n {...(label ? { \"aria-label\": label, \"data-tooltip\": title ?? label } : {})}\n {...(isChecked === undefined ? {} : { \"aria-pressed\": isChecked })}\n {...(isActive ? { \"aria-current\": true as const } : {})}\n onClick={onClick}\n onPointerDown={onPointerDown}\n onPointerUp={onPointerUp}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n onBlur={onBlur}\n >\n {children}\n </button>\n )\n}\n\nexport interface TLUiButtonIconProps {\n icon: string\n small?: boolean\n invertIcon?: boolean\n className?: string\n}\n\n/** The icon slot inside a {@link TldrawUiButton}. Decorative: never labelled. */\nexport function TldrawUiButtonIcon({ icon, small, invertIcon, className }: TLUiButtonIconProps) {\n return <TldrawUiIcon icon={icon} {...(small ? { small } : {})} {...(invertIcon ? { invertIcon } : {})} className={[\"mocanvas-btn-icon\", className].filter(Boolean).join(\" \")} />\n}\n\nexport interface TLUiButtonLabelProps {\n className?: string\n children?: ReactNode\n}\n\n/** The text slot inside a {@link TldrawUiButton}. */\nexport function TldrawUiButtonLabel({ className, children }: TLUiButtonLabelProps) {\n return <span className={[\"mocanvas-btn-label\", className].filter(Boolean).join(\" \")}>{children}</span>\n}\n\nexport interface TLUiButtonCheckProps {\n checked: boolean\n className?: string\n}\n\n/**\n * The tick at the end of a checkbox menu row.\n *\n * Always rendered, invisible when unchecked, so the row's label does not shift\n * sideways as it is toggled. `aria-hidden` because the row itself already\n * carries `aria-checked`.\n */\nexport function TldrawUiButtonCheck({ checked, className }: TLUiButtonCheckProps) {\n return (\n <span\n className={[\"mocanvas-btn-check\", className].filter(Boolean).join(\" \")}\n data-checked={checked}\n aria-hidden=\"true\"\n style={{ visibility: checked ? \"visible\" : \"hidden\", display: \"inline-flex\" }}\n >\n <TldrawUiIcon icon=\"check\" small />\n </span>\n )\n}\n","/**\n * Floating layers shared by the default UI: the tooltip and the popover.\n *\n * Both are `position: fixed` and clamped to the viewport. Absolutely positioned\n * versions cannot do either job: a tooltip on the leftmost zoom button runs off\n * the left edge of the window, and anything anchored inside the style panel is\n * clipped by that panel's own scroll container.\n */\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState, type ReactNode, type RefObject } from \"react\"\n\n/** Gap between an anchor and the layer floating beside it. */\nconst GAP = 8\n/** Smallest distance a floating layer keeps from the viewport edge. */\nconst EDGE = 8\n\nexport interface Placement {\n left: number\n top: number\n}\n\n/**\n * Centre `box` on `anchor`, on the preferred side if it fits there and on the\n * other side if it does not, then clamp the result inside the viewport.\n */\nexport function placeNear(anchor: DOMRect, box: { width: number; height: number }, prefer: \"above\" | \"below\", vw: number, vh: number): Placement {\n const above = anchor.top - box.height - GAP\n const below = anchor.bottom + GAP\n let top = prefer === \"above\" ? above : below\n if (prefer === \"above\" && above < EDGE && below + box.height <= vh - EDGE) top = below\n if (prefer === \"below\" && below + box.height > vh - EDGE && above >= EDGE) top = above\n top = Math.min(Math.max(top, EDGE), Math.max(EDGE, vh - box.height - EDGE))\n let left = anchor.left + anchor.width / 2 - box.width / 2\n left = Math.min(Math.max(left, EDGE), Math.max(EDGE, vw - box.width - EDGE))\n return { left, top }\n}\n\nfunction useClamped(getAnchor: () => DOMRect | null, prefer: \"above\" | \"below\", deps: unknown[]): [RefObject<HTMLDivElement | null>, Placement | null] {\n const ref = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState<Placement | null>(null)\n useLayoutEffect(() => {\n const el = ref.current\n const anchor = getAnchor()\n if (!el || !anchor) {\n setPos(null)\n return\n }\n const box = el.getBoundingClientRect()\n setPos(placeNear(anchor, box, prefer, window.innerWidth, window.innerHeight))\n // getAnchor is recreated per render on purpose; the caller's deps drive this.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps)\n return [ref, pos]\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip\n// ---------------------------------------------------------------------------\n\ninterface TipState {\n label: string\n shortcut: string | null\n anchor: DOMRect\n}\n\n/** How long the pointer must rest on a control before its tooltip appears. */\nconst HOVER_DELAY = 500\n\n/**\n * The single tooltip for the whole UI. Mount it once; it labels any element\n * carrying `data-tooltip` (and, optionally, `data-shortcut`) by delegation, so\n * buttons stay plain buttons.\n */\nexport function UiTooltip() {\n const [tip, setTip] = useState<TipState | null>(null)\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n const clear = useCallback(() => {\n clearTimeout(timer.current)\n setTip(null)\n }, [])\n\n useEffect(() => {\n const read = (el: HTMLElement): TipState | null => {\n const label = el.dataset[\"tooltip\"]\n if (!label) return null\n return { label, shortcut: el.dataset[\"shortcut\"] ?? null, anchor: el.getBoundingClientRect() }\n }\n const target = (e: Event): HTMLElement | null => {\n const el = (e.target as HTMLElement | null)?.closest?.<HTMLElement>(\"[data-tooltip]\")\n if (!el || el.matches(\":disabled\") || el.getAttribute(\"aria-disabled\") === \"true\") return null\n return el\n }\n const onOver = (e: PointerEvent) => {\n const el = target(e)\n clearTimeout(timer.current)\n if (!el) {\n setTip(null)\n return\n }\n timer.current = setTimeout(() => setTip(read(el)), HOVER_DELAY)\n }\n // Keyboard focus is deliberate, so it skips the hover delay.\n const onFocus = (e: FocusEvent) => {\n const el = target(e)\n clearTimeout(timer.current)\n setTip(el && el.matches(\":focus-visible\") ? read(el) : null)\n }\n document.addEventListener(\"pointerover\", onOver, true)\n document.addEventListener(\"pointerdown\", clear, true)\n document.addEventListener(\"focusin\", onFocus, true)\n document.addEventListener(\"focusout\", clear, true)\n window.addEventListener(\"scroll\", clear, true)\n return () => {\n clearTimeout(timer.current)\n document.removeEventListener(\"pointerover\", onOver, true)\n document.removeEventListener(\"pointerdown\", clear, true)\n document.removeEventListener(\"focusin\", onFocus, true)\n document.removeEventListener(\"focusout\", clear, true)\n window.removeEventListener(\"scroll\", clear, true)\n }\n }, [clear])\n\n // Above the control by default, so the tooltip never covers what it names.\n const [ref, pos] = useClamped(() => tip?.anchor ?? null, \"above\", [tip])\n if (!tip) return null\n return (\n <div\n ref={ref}\n className=\"mocanvas-tooltip mocanvas-layer\"\n role=\"tooltip\"\n style={pos ? { left: pos.left, top: pos.top } : { left: 0, top: 0, visibility: \"hidden\" }}\n >\n {tip.label}\n {tip.shortcut ? <kbd>{tip.shortcut}</kbd> : null}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Popover\n// ---------------------------------------------------------------------------\n\nexport interface PopoverProps {\n /** The control the popover belongs to; also the click target that keeps it open. */\n anchorRef: RefObject<HTMLElement | null>\n open: boolean\n onClose: () => void\n label: string\n /** Columns in the popover grid. */\n cols?: number\n prefer?: \"above\" | \"below\"\n children: ReactNode\n}\n\n/** A dismissable floating grid anchored to a button. */\nexport function Popover({ anchorRef, open, onClose, label, cols = 5, prefer = \"above\", children }: PopoverProps) {\n const [ref, pos] = useClamped(() => anchorRef.current?.getBoundingClientRect() ?? null, prefer, [open, anchorRef])\n\n useEffect(() => {\n if (!open) return\n const onDown = (e: PointerEvent) => {\n const t = e.target as Node\n if (ref.current?.contains(t) || anchorRef.current?.contains(t)) return\n onClose()\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation()\n onClose()\n anchorRef.current?.focus()\n }\n }\n document.addEventListener(\"pointerdown\", onDown, true)\n document.addEventListener(\"keydown\", onKey, true)\n return () => {\n document.removeEventListener(\"pointerdown\", onDown, true)\n document.removeEventListener(\"keydown\", onKey, true)\n }\n }, [open, onClose, anchorRef, ref])\n\n if (!open) return null\n return (\n <div\n ref={ref}\n className=\"mocanvas-popover mocanvas-layer\"\n role=\"menu\"\n aria-label={label}\n style={{\n [\"--mocanvas-popover-cols\" as string]: cols,\n ...(pos ? { left: pos.left, top: pos.top } : { left: 0, top: 0, visibility: \"hidden\" as const }),\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {children}\n </div>\n )\n}\n","import { EditorPortal } from \"@mocanvas/editor\"\nimport { useEffect, useLayoutEffect, useRef, useState, type ReactNode, type RefObject } from \"react\"\nimport { placeNear, type Placement } from \"./overlays\"\n\n/**\n * The mechanics every floating layer in the chrome shares: position beside an\n * anchor, stay inside the viewport, close on Escape or an outside click, and\n * hand focus back to the anchor when it closes.\n *\n * Factored out because getting any one of those wrong is invisible in the\n * common case and infuriating in the uncommon one — a menu that opens off the\n * bottom of a short window, or that drops focus into the void when dismissed.\n */\n\nexport type Side = \"above\" | \"below\"\n\n/** Position an element beside `anchor` once it has been measured. */\nexport function useAnchoredPosition(\n anchorRef: RefObject<HTMLElement | null>,\n open: boolean,\n prefer: Side,\n): [RefObject<HTMLDivElement | null>, Placement | null] {\n const ref = useRef<HTMLDivElement>(null)\n const [pos, setPos] = useState<Placement | null>(null)\n useLayoutEffect(() => {\n const el = ref.current\n const anchor = anchorRef.current?.getBoundingClientRect() ?? null\n if (!open || !el || !anchor) {\n setPos(null)\n return\n }\n const box = el.getBoundingClientRect()\n setPos(placeNear(anchor, box, prefer, window.innerWidth, window.innerHeight))\n }, [open, prefer, anchorRef])\n return [ref, pos]\n}\n\n/**\n * Close on Escape or on a pointer press outside both the layer and its anchor.\n *\n * Listens in the capture phase so it wins against a canvas handler that would\n * otherwise start a gesture on the same press.\n */\nexport function useDismissable(\n open: boolean,\n layerRef: RefObject<HTMLElement | null>,\n anchorRef: RefObject<HTMLElement | null>,\n onClose: () => void,\n): void {\n useEffect(() => {\n if (!open) return\n const onDown = (event: PointerEvent) => {\n const target = event.target as Node\n if (layerRef.current?.contains(target) || anchorRef.current?.contains(target)) return\n onClose()\n }\n const onKey = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return\n event.stopPropagation()\n onClose()\n anchorRef.current?.focus()\n }\n document.addEventListener(\"pointerdown\", onDown, true)\n document.addEventListener(\"keydown\", onKey, true)\n return () => {\n document.removeEventListener(\"pointerdown\", onDown, true)\n document.removeEventListener(\"keydown\", onKey, true)\n }\n }, [open, layerRef, anchorRef, onClose])\n}\n\n/** Everything inside a floating layer that the keyboard can reach. */\nconst FOCUSABLE = '[role=\"menuitem\"],[role=\"menuitemcheckbox\"],[role=\"menuitemradio\"],[role=\"option\"],button:not([disabled]),a[href],input:not([disabled])'\n\n/**\n * Roving focus inside a menu: Up/Down move, Home/End jump, and focus lands on\n * the first item when the menu opens.\n *\n * A menu whose items cannot be reached with the arrow keys is not a menu — it\n * is a set of buttons that happen to be in a box — so this is wired into every\n * floating layer rather than left to each one.\n */\nexport function useMenuKeyboard(open: boolean, layerRef: RefObject<HTMLElement | null>): void {\n useEffect(() => {\n if (!open) return\n const layer = layerRef.current\n if (!layer) return\n const items = () => Array.from(layer.querySelectorAll<HTMLElement>(FOCUSABLE))\n const first = items()[0]\n first?.focus()\n const onKey = (event: KeyboardEvent) => {\n const list = items()\n if (list.length === 0) return\n const index = list.indexOf(layer.ownerDocument.activeElement as HTMLElement)\n if (event.key === \"ArrowDown\" || event.key === \"ArrowRight\") {\n event.preventDefault()\n list[(index + 1) % list.length]?.focus()\n } else if (event.key === \"ArrowUp\" || event.key === \"ArrowLeft\") {\n event.preventDefault()\n list[(index - 1 + list.length) % list.length]?.focus()\n } else if (event.key === \"Home\") {\n event.preventDefault()\n list[0]?.focus()\n } else if (event.key === \"End\") {\n event.preventDefault()\n list[list.length - 1]?.focus()\n }\n }\n layer.addEventListener(\"keydown\", onKey)\n return () => layer.removeEventListener(\"keydown\", onKey)\n }, [open, layerRef])\n}\n\nexport interface FloatingLayerProps {\n anchorRef: RefObject<HTMLElement | null>\n open: boolean\n onClose(): void\n prefer?: Side\n role?: string\n label?: string\n className?: string\n /** Wire up arrow-key navigation. Off for a layer that is not a menu. */\n keyboardNav?: boolean\n children?: ReactNode\n}\n\n/**\n * A positioned, dismissable layer portalled into the editor's container.\n *\n * Portalled rather than rendered in place so it escapes the `overflow: hidden`\n * of whatever panel opened it, while staying inside the container that carries\n * the theme's CSS custom properties.\n */\nexport function FloatingLayer({\n anchorRef,\n open,\n onClose,\n prefer = \"below\",\n role = \"menu\",\n label,\n className,\n keyboardNav = true,\n children,\n}: FloatingLayerProps) {\n const [ref, pos] = useAnchoredPosition(anchorRef, open, prefer)\n useDismissable(open, ref, anchorRef, onClose)\n useMenuKeyboard(keyboardNav && open, ref)\n if (!open) return null\n return (\n <EditorPortal>\n <div\n ref={ref}\n className={[\"mocanvas-layer\", className].filter(Boolean).join(\" \")}\n role={role}\n {...(label ? { \"aria-label\": label } : {})}\n style={pos ? { position: \"fixed\", left: pos.left, top: pos.top } : { position: \"fixed\", left: 0, top: 0, visibility: \"hidden\" }}\n onPointerDown={(event) => event.stopPropagation()}\n >\n {children}\n </div>\n </EditorPortal>\n )\n}\n","import { createContext, useCallback, useContext, useId, useMemo, useRef, useState, type ReactNode, type RefObject } from \"react\"\nimport { FloatingLayer } from \"./ui-floating\"\nimport { TldrawUiButtonCheck } from \"./ui-button\"\nimport { TldrawUiIcon } from \"./ui-icon\"\n\n/**\n * The dropdown menu: root, trigger, content, and the rows that go in it.\n *\n * Ten components because a menu is genuinely ten things — a checkbox row is\n * not a link row is not a submenu trigger, and each has a different ARIA role.\n * Collapsing them into one `<MenuItem type=\"checkbox\">` would move that\n * distinction into a prop and make it easy to get wrong.\n */\n\ninterface MenuContextValue {\n id: string\n open: boolean\n setOpen(open: boolean): void\n anchorRef: RefObject<HTMLElement | null>\n}\n\nconst DropdownContext = createContext<MenuContextValue | null>(null)\n\nfunction useDropdown(component: string): MenuContextValue {\n const value = useContext(DropdownContext)\n if (!value) throw new Error(`${component}: render inside <TldrawUiDropdownMenuRoot>.`)\n return value\n}\n\nexport interface TLUiDropdownMenuRootProps {\n id?: string\n open?: boolean\n onOpenChange?(open: boolean): void\n /** Sets `modal` on the content: a modal menu traps focus until dismissed. */\n modal?: boolean\n children?: ReactNode\n}\n\n/** The pair's root. Owns the open state unless the caller controls it. */\nexport function TldrawUiDropdownMenuRoot({ id, open: controlled, onOpenChange, children }: TLUiDropdownMenuRootProps) {\n const generated = useId()\n const [uncontrolled, setUncontrolled] = useState(false)\n const anchorRef = useRef<HTMLElement | null>(null)\n const open = controlled ?? uncontrolled\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlled === undefined) setUncontrolled(next)\n onOpenChange?.(next)\n },\n [controlled, onOpenChange],\n )\n const value = useMemo<MenuContextValue>(() => ({ id: id ?? generated, open, setOpen, anchorRef }), [id, generated, open, setOpen])\n return <DropdownContext.Provider value={value}>{children}</DropdownContext.Provider>\n}\n\nexport interface TLUiDropdownMenuTriggerProps {\n className?: string\n /** Accessible name, when the trigger's content is an icon alone. */\n label?: string\n children?: ReactNode\n}\n\n/** The control that opens the menu. */\nexport function TldrawUiDropdownMenuTrigger({ className, label, children }: TLUiDropdownMenuTriggerProps) {\n const { id, open, setOpen, anchorRef } = useDropdown(\"TldrawUiDropdownMenuTrigger\")\n return (\n <button\n ref={(node) => {\n anchorRef.current = node\n }}\n type=\"button\"\n className={[\"mocanvas-btn\", className].filter(Boolean).join(\" \")}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={`${id}-content`}\n {...(label ? { \"aria-label\": label, \"data-tooltip\": label } : {})}\n onClick={() => setOpen(!open)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\" && !open) {\n event.preventDefault()\n setOpen(true)\n }\n }}\n >\n {children}\n </button>\n )\n}\n\nexport interface TLUiDropdownMenuContentProps {\n label?: string\n className?: string\n side?: \"above\" | \"below\"\n /** Alignment against the trigger. Kept for API parity; layers are centred. */\n align?: \"start\" | \"center\" | \"end\"\n /** Distance from the trigger, in px. Kept for API parity. */\n sideOffset?: number\n alignOffset?: number\n children?: ReactNode\n}\n\n/** The menu panel. */\nexport function TldrawUiDropdownMenuContent({ label, className, side = \"below\", children }: TLUiDropdownMenuContentProps) {\n const ctx = useDropdown(\"TldrawUiDropdownMenuContent\")\n const close = useCallback(() => ctx.setOpen(false), [ctx])\n return (\n <FloatingLayer\n anchorRef={ctx.anchorRef}\n open={ctx.open}\n onClose={close}\n prefer={side}\n role=\"menu\"\n className={[\"mocanvas-menu\", className].filter(Boolean).join(\" \")}\n {...(label ? { label } : {})}\n >\n <div id={`${ctx.id}-content`} className=\"mocanvas-menu-list\">\n {children}\n </div>\n </FloatingLayer>\n )\n}\n\nexport interface TLUiDropdownMenuGroupProps {\n label?: string\n className?: string\n children?: ReactNode\n}\n\n/**\n * A run of related rows.\n *\n * `role=\"group\"` with a label, so a screen reader says which section it is in\n * rather than reading twenty undifferentiated rows.\n */\nexport function TldrawUiDropdownMenuGroup({ label, className, children }: TLUiDropdownMenuGroupProps) {\n return (\n <div className={[\"mocanvas-menu-group\", className].filter(Boolean).join(\" \")} role=\"group\" {...(label ? { \"aria-label\": label } : {})}>\n {children}\n </div>\n )\n}\n\nexport interface TLUiDropdownMenuItemProps {\n /** Close the menu after selecting. Defaults to `true`. */\n closeOnSelect?: boolean\n disabled?: boolean\n className?: string\n onSelect?(): void\n children?: ReactNode\n}\n\n/** A plain row. */\nexport function TldrawUiDropdownMenuItem({ closeOnSelect = true, disabled, className, onSelect, children }: TLUiDropdownMenuItemProps) {\n const ctx = useContext(DropdownContext)\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n className={[\"mocanvas-menu-item\", className].filter(Boolean).join(\" \")}\n disabled={disabled}\n onClick={() => {\n onSelect?.()\n if (closeOnSelect) ctx?.setOpen(false)\n }}\n >\n {children}\n </button>\n )\n}\n\nexport interface TLUiDropdownMenuCheckboxItemProps {\n checked: boolean\n disabled?: boolean\n title?: string\n className?: string\n onSelect?(): void\n children?: ReactNode\n}\n\n/** A row that toggles. Stays open on select, because toggles come in runs. */\nexport function TldrawUiDropdownMenuCheckboxItem({ checked, disabled, title, className, onSelect, children }: TLUiDropdownMenuCheckboxItemProps) {\n return (\n <button\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n className={[\"mocanvas-menu-item\", className].filter(Boolean).join(\" \")}\n disabled={disabled}\n {...(title ? { \"data-tooltip\": title } : {})}\n onClick={() => onSelect?.()}\n >\n {children}\n <TldrawUiButtonCheck checked={checked} />\n </button>\n )\n}\n\n/** The dot marking the chosen entry in a radio group. */\nexport function TldrawUiDropdownMenuIndicator() {\n return <span className=\"mocanvas-menu-indicator\" aria-hidden=\"true\" />\n}\n\nconst SubContext = createContext<MenuContextValue | null>(null)\n\nexport interface TLUiDropdownMenuSubProps {\n id?: string\n open?: boolean\n onOpenChange?(open: boolean): void\n children?: ReactNode\n}\n\n/** A nested menu's root. */\nexport function TldrawUiDropdownMenuSub({ id, open: controlled, onOpenChange, children }: TLUiDropdownMenuSubProps) {\n const generated = useId()\n const [uncontrolled, setUncontrolled] = useState(false)\n const anchorRef = useRef<HTMLElement | null>(null)\n const open = controlled ?? uncontrolled\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlled === undefined) setUncontrolled(next)\n onOpenChange?.(next)\n },\n [controlled, onOpenChange],\n )\n const value = useMemo<MenuContextValue>(() => ({ id: id ?? generated, open, setOpen, anchorRef }), [id, generated, open, setOpen])\n return <SubContext.Provider value={value}>{children}</SubContext.Provider>\n}\n\nexport interface TLUiDropdownMenuSubTriggerProps {\n label: string\n /** Marks the submenu as containing the active choice. */\n \"data-testid\"?: string\n disabled?: boolean\n className?: string\n children?: ReactNode\n}\n\n/**\n * The row that opens a nested menu.\n *\n * Right arrow opens it and left arrow closes it, which is the convention every\n * platform menu follows — an arrow key that does nothing here reads as the\n * submenu being unreachable.\n */\nexport function TldrawUiDropdownMenuSubTrigger({ label, disabled, className, children }: TLUiDropdownMenuSubTriggerProps) {\n const ctx = useContext(SubContext)\n return (\n <button\n ref={(node) => {\n if (ctx) ctx.anchorRef.current = node\n }}\n type=\"button\"\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={ctx?.open ?? false}\n className={[\"mocanvas-menu-item\", \"mocanvas-menu-item--sub\", className].filter(Boolean).join(\" \")}\n disabled={disabled}\n onClick={() => ctx?.setOpen(!ctx.open)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowRight\") {\n event.preventDefault()\n event.stopPropagation()\n ctx?.setOpen(true)\n } else if (event.key === \"ArrowLeft\" && ctx?.open) {\n event.preventDefault()\n event.stopPropagation()\n ctx.setOpen(false)\n }\n }}\n >\n {children ?? label}\n <TldrawUiIcon icon=\"chevron-down\" small />\n </button>\n )\n}\n\nexport interface TLUiDropdownMenuSubContentProps {\n label?: string\n className?: string\n alignOffset?: number\n sideOffset?: number\n children?: ReactNode\n}\n\n/** A nested menu's panel. */\nexport function TldrawUiDropdownMenuSubContent({ label, className, children }: TLUiDropdownMenuSubContentProps) {\n const ctx = useContext(SubContext)\n const close = useCallback(() => ctx?.setOpen(false), [ctx])\n if (!ctx) return null\n return (\n <FloatingLayer\n anchorRef={ctx.anchorRef}\n open={ctx.open}\n onClose={close}\n prefer=\"below\"\n role=\"menu\"\n className={[\"mocanvas-menu\", \"mocanvas-menu--sub\", className].filter(Boolean).join(\" \")}\n {...(label ? { label } : {})}\n >\n <div id={`${ctx.id}-content`} className=\"mocanvas-menu-list\">\n {children}\n </div>\n </FloatingLayer>\n )\n}\n","import type { ReactNode } from \"react\"\n\n/**\n * A keyboard shortcut, rendered.\n *\n * Takes the shortcut in the same `\"mod+shift+z\"` notation the tool and action\n * items carry, so a menu row can pass an item's `kbd` straight through instead\n * of every call site formatting it.\n */\nexport interface TLUiKbdProps {\n /** `\"mod+z\"`, `\"shift+r\"`, `\"?\"`. Comma-separated alternatives: only the first is shown. */\n children?: ReactNode\n /** Force Apple-style glyphs. Detected from the platform when omitted. */\n isApple?: boolean\n className?: string\n}\n\nconst APPLE = {\n mod: \"⌘\",\n cmd: \"⌘\",\n alt: \"⌥\",\n opt: \"⌥\",\n shift: \"⇧\",\n ctrl: \"⌃\",\n enter: \"↵\",\n backspace: \"⌫\",\n del: \"⌦\",\n esc: \"⎋\",\n tab: \"⇥\",\n up: \"↑\",\n down: \"↓\",\n left: \"←\",\n right: \"→\",\n} as const\n\nconst OTHER = {\n mod: \"Ctrl\",\n cmd: \"Ctrl\",\n alt: \"Alt\",\n opt: \"Alt\",\n shift: \"Shift\",\n ctrl: \"Ctrl\",\n enter: \"Enter\",\n backspace: \"Backspace\",\n del: \"Delete\",\n esc: \"Esc\",\n tab: \"Tab\",\n up: \"↑\",\n down: \"↓\",\n left: \"←\",\n right: \"→\",\n} as const\n\nfunction isApplePlatform(): boolean {\n if (typeof navigator === \"undefined\") return false\n return /Mac|iPhone|iPad|iPod/.test(navigator.platform || navigator.userAgent || \"\")\n}\n\n/**\n * Split a shortcut into the keys to draw.\n *\n * Only the first comma-separated alternative is shown: a tool bound to\n * `\"d,p,b\"` has one shortcut as far as the user is concerned, and printing\n * three would suggest a chord.\n */\nexport function kbdToKeys(kbd: string, isApple = isApplePlatform()): string[] {\n const table: Record<string, string> = isApple ? APPLE : OTHER\n const first = (kbd.split(\",\")[0] ?? \"\").trim()\n if (first === \"\") return []\n return first\n .split(\"+\")\n .map((part) => part.trim())\n .filter(Boolean)\n .map((part) => table[part.toLowerCase()] ?? (part.length === 1 ? part.toUpperCase() : part))\n}\n\n/**\n * A shortcut as a row of `<kbd>` elements.\n *\n * `aria-hidden`: the shortcut is already on the control it belongs to, via\n * `aria-keyshortcuts`, and reading the glyphs out as text (\"command shift Z\"\n * rendered as three separate symbols) is noise.\n */\nexport function TldrawUiKbd({ children, isApple, className }: TLUiKbdProps) {\n const raw = typeof children === \"string\" ? children : String(children ?? \"\")\n const keys = kbdToKeys(raw, isApple ?? isApplePlatform())\n if (keys.length === 0) return null\n return (\n <span className={[\"mocanvas-kbd\", className].filter(Boolean).join(\" \")} aria-hidden=\"true\">\n {keys.map((key, i) => (\n <kbd key={`${key}-${i}`}>{key}</kbd>\n ))}\n </span>\n )\n}\n","import { useEditor, useValue, type SharedStyleMap } from \"@mocanvas/editor\"\n\n/**\n * The reactive predicates the chrome branches on.\n *\n * Each one is a thin `useValue` over the editor. They exist as named hooks\n * rather than inline reads so a menu item's enabled/disabled rule is written\n * once — `useCanApplySelectionAction()` is the same question in twelve places,\n * and twelve slightly different inline versions of it is how a menu ends up\n * with one row that greys out on a locked shape and eleven that do not.\n */\n\n/** Whether there is anything to undo. */\nexport function useCanUndo(): boolean {\n const editor = useEditor()\n return useValue(\"canUndo\", () => editor.getCanUndo(), [editor])\n}\n\n/** Whether there is anything to redo. */\nexport function useCanRedo(): boolean {\n const editor = useEditor()\n return useValue(\"canRedo\", () => editor.getCanRedo(), [editor])\n}\n\n/** Whether the editor refuses document edits. */\nexport function useReadonly(): boolean {\n const editor = useEditor()\n return useValue(\"isReadonly\", () => editor.getIsReadonly(), [editor])\n}\n\n/** How many of the selected shapes can actually be changed. */\nexport function useUnlockedSelectedShapesCount(min = 1): boolean {\n const editor = useEditor()\n return useValue(\"unlockedSelectedShapes\", () => editor.getSelectedShapes().filter((shape) => !shape.isLocked).length >= min, [editor, min])\n}\n\n/**\n * Whether an action that edits the selection can run: the editor is writable\n * and at least one selected shape is unlocked.\n *\n * The two halves are checked together because either alone is misleading — a\n * writable editor with a locked selection, or an unlocked selection in a\n * read-only editor, both mean \"no\".\n */\nexport function useCanApplySelectionAction(): boolean {\n const readonly = useReadonly()\n const hasUnlocked = useUnlockedSelectedShapesCount(1)\n return !readonly && hasUnlocked\n}\n\n/** Whether the current page has any locked shapes to unlock. */\nexport function useHasLockedShapes(): boolean {\n const editor = useEditor()\n return useValue(\"hasLockedShapes\", () => editor.getCurrentPageShapes().some((shape) => shape.isLocked), [editor])\n}\n\n/** Whether the grid is on. */\nexport function useIsGridMode(): boolean {\n const editor = useEditor()\n return useValue(\"isGridMode\", () => editor.getInstanceState().isGridMode, [editor])\n}\n\n/** Whether the editor is in dark mode right now. */\nexport function useIsDarkMode(): boolean {\n const editor = useEditor()\n return useValue(\"isDarkMode\", () => editor.getColorMode() === \"dark\", [editor])\n}\n\n/**\n * The styles the style panel should offer, and their shared values.\n *\n * With a selection this is what the selected shapes have in common; with\n * nothing selected it is what the active tool is about to create. `null` means\n * there is nothing to show — which a panel renders as nothing at all, rather\n * than as an empty frame.\n */\nexport function useRelevantStyles(): SharedStyleMap | null {\n const editor = useEditor()\n return useValue(\n \"relevantStyles\",\n () => {\n const styles = editor.getSharedStyles()\n if (styles.size === 0 && editor.getSelectedShapeIds().length > 0) return null\n return styles.size === 0 ? null : styles\n },\n [editor],\n )\n}\n\n/**\n * Whether an action can run right now, and whether it is on.\n *\n * The action list is built once per editor (see `buildDefaultActionItems`), so\n * an item cannot carry its own availability without freezing it. This is where\n * that question is answered instead: reactively, at the point of render, so a\n * menu row greys out the moment the selection stops supporting it.\n *\n * An action with no rule here is always enabled and never checked, which is\n * the right default for an app's own action: mocanvas knows nothing about when\n * it applies, and guessing \"disabled\" would make a working item look broken.\n */\nexport function useActionState(actionId: string): { disabled: boolean; checked: boolean } {\n const editor = useEditor()\n return useValue(\n \"actionState\",\n () => {\n const readonly = editor.getIsReadonly()\n const shapes = editor.getSelectedShapes()\n const unlocked = shapes.filter((shape) => !shape.isLocked).length\n const instance = editor.getInstanceState()\n const user = editor.user\n\n /** An action that edits the selection. */\n const edits = (min: number) => ({ disabled: readonly || unlocked < min, checked: false })\n\n switch (actionId) {\n case \"undo\":\n return { disabled: !editor.getCanUndo(), checked: false }\n case \"redo\":\n return { disabled: !editor.getCanRedo(), checked: false }\n case \"zoom-to-selection\":\n case \"select-none\":\n return { disabled: shapes.length === 0, checked: false }\n case \"delete\":\n case \"duplicate\":\n case \"toggle-lock\":\n case \"rotate-cw\":\n case \"rotate-ccw\":\n case \"bring-to-front\":\n case \"bring-forward\":\n case \"send-backward\":\n case \"send-to-back\":\n case \"flip-horizontal\":\n case \"flip-vertical\":\n return edits(1)\n case \"group\":\n case \"align-left\":\n case \"align-center-horizontal\":\n case \"align-right\":\n case \"align-top\":\n case \"align-center-vertical\":\n case \"align-bottom\":\n case \"stretch-horizontal\":\n case \"stretch-vertical\":\n return edits(2)\n case \"distribute-horizontal\":\n case \"distribute-vertical\":\n case \"stack-horizontal\":\n case \"stack-vertical\":\n case \"pack\":\n return edits(3)\n case \"ungroup\":\n return { disabled: readonly || !shapes.some((shape) => shape.type === \"group\"), checked: false }\n case \"unlock-all\":\n return { disabled: readonly || !editor.getCurrentPageShapes().some((shape) => shape.isLocked), checked: false }\n case \"delete-page\":\n return { disabled: readonly || editor.getPages().length < 2, checked: false }\n case \"new-page\":\n case \"duplicate-page\":\n return { disabled: readonly, checked: false }\n case \"toggle-grid\":\n return { disabled: false, checked: instance.isGridMode }\n case \"toggle-focus-mode\":\n return { disabled: false, checked: instance.isFocusMode }\n case \"toggle-debug-mode\":\n return { disabled: false, checked: instance.isDebugMode }\n case \"toggle-tool-lock\":\n return { disabled: readonly, checked: instance.isToolLocked }\n // The preference is \"transparent background\", the record is\n // \"paint a background\", so the tick is the negation.\n case \"toggle-transparent\":\n return { disabled: false, checked: !instance.exportBackground }\n case \"toggle-snap-mode\":\n return { disabled: false, checked: user.getIsSnapMode() }\n case \"toggle-wrap-mode\":\n return { disabled: false, checked: user.getIsWrapMode() }\n case \"toggle-dynamic-size-mode\":\n return { disabled: false, checked: user.getIsDynamicSizeMode() }\n case \"toggle-paste-at-cursor\":\n return { disabled: false, checked: user.getIsPasteAtCursorMode() }\n case \"toggle-edge-scrolling\":\n return { disabled: false, checked: user.getEdgeScrollSpeed() !== 0 }\n case \"toggle-reduce-motion\":\n return { disabled: false, checked: user.getAnimationSpeed() === 0 }\n case \"toggle-dark-mode\":\n return { disabled: false, checked: editor.getColorMode() === \"dark\" }\n case \"toggle-keyboard-shortcuts\":\n return { disabled: false, checked: user.getAreKeyboardShortcutsEnabled() }\n default:\n return { disabled: false, checked: false }\n }\n },\n [editor, actionId],\n )\n}\n","import { createContext, useCallback, useContext, type ReactNode } from \"react\"\nimport type { TLUiEventSource } from \"@mocanvas/editor\"\n\n/**\n * The analytics seam: one callback the whole UI reports through.\n *\n * Every piece of chrome that does something on the user's behalf announces it\n * here rather than reaching for an app's telemetry directly, so a host can\n * instrument the editor by supplying one function instead of replacing panels.\n */\n\n/**\n * The events the default chrome reports, and what each one carries beyond the\n * common `{ source }`.\n *\n * Open-ended on purpose: an app's own chrome reports its own names through the\n * same handler, so the map is what mocanvas promises to send, not a limit on\n * what may be sent.\n */\nexport interface TLUiEventMap {\n \"select-tool\": { id: string }\n \"toggle-tool-lock\": null\n \"toggle-grid-mode\": null\n \"toggle-snap-mode\": null\n \"toggle-dark-mode\": null\n \"toggle-focus-mode\": null\n \"toggle-debug-mode\": null\n \"toggle-wrap-mode\": null\n \"toggle-dynamic-size-mode\": null\n \"toggle-paste-at-cursor\": null\n \"toggle-edge-scrolling\": null\n \"toggle-reduce-motion\": null\n \"toggle-transparent\": null\n \"toggle-lock\": null\n \"toggle-auto-size\": null\n \"change-language\": { locale: string }\n \"change-page\": null\n \"change-user-name\": null\n \"delete-page\": null\n \"duplicate-page\": null\n \"move-page\": null\n \"new-page\": null\n \"rename-page\": null\n \"align-shapes\": { operation: string }\n \"distribute-shapes\": { operation: string }\n \"stack-shapes\": { operation: string }\n \"flip-shapes\": { operation: string }\n \"pack-shapes\": null\n \"stretch-shapes\": { operation: string }\n \"reorder-shapes\": { operation: string }\n \"group-shapes\": null\n \"ungroup-shapes\": null\n \"duplicate-shapes\": null\n \"delete-shapes\": null\n \"select-all-shapes\": null\n \"select-none-shapes\": null\n \"rotate-cw\": null\n \"rotate-ccw\": null\n \"edit-link\": null\n \"convert-to-embed\": null\n \"convert-to-bookmark\": null\n \"fit-frame-to-content\": null\n \"remove-frame\": null\n copy: null\n cut: null\n paste: null\n \"copy-as\": { format: string }\n \"export-as\": { format: string }\n print: null\n undo: null\n redo: null\n \"zoom-in\": null\n \"zoom-out\": null\n \"reset-zoom\": null\n \"zoom-to-fit\": null\n \"zoom-to-selection\": null\n \"open-menu\": { id: string }\n \"close-menu\": { id: string }\n \"open-url\": { url: string }\n \"set-style\": { id: string; value: unknown }\n \"insert-media\": null\n \"unlock-all\": null\n \"move-to-page\": null\n \"share-project\": null\n \"a11y-repeat-shape-announce\": null\n}\n\n/** The common half of every reported event: where the user did it. */\nexport interface TLUiEventData {\n source: TLUiEventSource\n [key: string]: unknown\n}\n\n/**\n * What a host supplies as `onUiEvent`. The name is a key of\n * {@link TLUiEventMap} for anything mocanvas reports, and any string for\n * anything an app's own chrome reports.\n */\nexport type TLUiEventHandler = (name: string, data: TLUiEventData) => void\n\nconst EventsContext = createContext<TLUiEventHandler | null>(null)\n\nexport interface EventsProviderProps {\n onEvent?: TLUiEventHandler\n children?: ReactNode\n}\n\n/** Publishes `onEvent` to {@link useUiEvents}. */\nexport function TldrawUiEventsProvider({ onEvent, children }: EventsProviderProps) {\n return <EventsContext.Provider value={onEvent ?? null}>{children}</EventsContext.Provider>\n}\n\n/**\n * Report a UI event.\n *\n * Always returns a function, so a component can call it unconditionally; with\n * no provider the call is a no-op rather than an error, which is what lets a\n * panel be rendered on its own in a test.\n */\nexport function useUiEvents(): TLUiEventHandler {\n const handler = useContext(EventsContext)\n return useCallback(\n (name: string, data: TLUiEventData) => {\n handler?.(name, data)\n },\n [handler],\n )\n}\n\n/**\n * The value {@link useUiEvents} returns — the handler an app passed as\n * `onUiEvent`, or a no-op.\n *\n * Named separately from {@link TLUiEventHandler} because they answer different\n * questions: the handler type is what an app *writes*, this is what a component\n * *reads*. They are the same function today; keeping the two names means the\n * context can gain a second member later without changing every app's handler\n * signature.\n */\nexport type TLUiEventContextType = TLUiEventHandler\n","import { getLocaleChain, resolveUiMessage, useEditor, useValue, type TLUiTranslations } from \"@mocanvas/editor\"\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\"\n\n/**\n * UI strings, and the locale they are resolved in.\n *\n * mocanvas ships no dictionary of its own — its default chrome labels are\n * already display text — so this exists to give an app's chrome one lookup\n * that follows the editor's locale rather than two that disagree.\n */\n\n/** One locale's dictionary: string id to display text. */\nexport interface TLUiTranslation {\n locale: string\n label: string\n dir: \"ltr\" | \"rtl\"\n messages: Readonly<Record<string, string>>\n}\n\n/**\n * A UI string id. Open (`string`) rather than a closed union: mocanvas has no\n * fixed key list, and an app registers its own ids freely.\n */\nexport type TLUiTranslationKey = string\n\n/** A language mocanvas knows how to name and lay out. */\nexport interface TLLanguage {\n readonly locale: string\n readonly label: string\n}\n\n/**\n * The languages offered in the language menu.\n *\n * SEMANTICS-ASSUMED: mocanvas ships no message catalogues, so this is a list\n * of locale *tags* an app can offer, not a claim that strings exist for them.\n * Picking one sets `user.locale`, which is what an app's own dictionary is\n * then resolved against.\n */\nexport const LANGUAGES: readonly TLLanguage[] = [\n { locale: \"ar\", label: \"العربية\" },\n { locale: \"cs\", label: \"Čeština\" },\n { locale: \"da\", label: \"Dansk\" },\n { locale: \"de\", label: \"Deutsch\" },\n { locale: \"en\", label: \"English\" },\n { locale: \"es\", label: \"Español\" },\n { locale: \"fa\", label: \"فارسی\" },\n { locale: \"fi\", label: \"Suomi\" },\n { locale: \"fr\", label: \"Français\" },\n { locale: \"he\", label: \"עברית\" },\n { locale: \"hi\", label: \"हिन्दी\" },\n { locale: \"hu\", label: \"Magyar\" },\n { locale: \"it\", label: \"Italiano\" },\n { locale: \"ja\", label: \"日本語\" },\n { locale: \"ko\", label: \"한국어\" },\n { locale: \"nl\", label: \"Nederlands\" },\n { locale: \"no\", label: \"Norsk\" },\n { locale: \"pl\", label: \"Polski\" },\n { locale: \"pt\", label: \"Português\" },\n { locale: \"ru\", label: \"Русский\" },\n { locale: \"sv\", label: \"Svenska\" },\n { locale: \"tr\", label: \"Türkçe\" },\n { locale: \"uk\", label: \"Українська\" },\n { locale: \"vi\", label: \"Tiếng Việt\" },\n { locale: \"zh\", label: \"中文\" },\n]\n\n/** Base languages written right to left. */\nexport const RTL_LANGUAGES: readonly string[] = [\"ar\", \"fa\", \"he\", \"ur\"]\n\n/**\n * The best match for a browser locale among {@link LANGUAGES}, falling back to\n * English. Takes the navigator's list so a browser configured with\n * `[\"cs-CZ\", \"en\"]` gets Czech rather than the first exact match.\n */\nexport function getDefaultTranslationLocale(locales: readonly string[] = typeof navigator === \"undefined\" ? [] : navigator.languages ?? []): string {\n for (const locale of locales) {\n for (const candidate of getLocaleChain(locale)) {\n if (LANGUAGES.some((l) => l.locale === candidate)) return candidate\n }\n }\n return \"en\"\n}\n\n/** Whether a locale is written right to left. */\nexport function isRtlLanguage(locale: string): boolean {\n return RTL_LANGUAGES.includes(locale.split(/[-_]/)[0] ?? locale)\n}\n\nconst TranslationContext = createContext<TLUiTranslation | null>(null)\n\nexport interface TLUiTranslationProviderProps {\n /** Extra dictionaries, keyed by locale then by string id. */\n overrides?: TLUiTranslations\n children?: ReactNode\n}\n\n/**\n * Resolves the editor's current locale into a {@link TLUiTranslation} and\n * publishes it. Re-resolves when the user changes locale, so a language menu\n * takes effect without remounting the chrome.\n */\nexport function TldrawUiTranslationProvider({ overrides, children }: TLUiTranslationProviderProps) {\n const editor = useEditor()\n const locale = useValue(\"ui locale\", () => editor.user.getLocale(), [editor])\n const value = useMemo<TLUiTranslation>(() => {\n const messages = overrides ? Object.assign({}, ...getLocaleChain(locale).reverse().map((l) => overrides[l] ?? {})) : {}\n return {\n locale,\n label: LANGUAGES.find((l) => l.locale === locale)?.label ?? locale,\n dir: isRtlLanguage(locale) ? \"rtl\" : \"ltr\",\n messages,\n }\n }, [locale, overrides])\n return <TranslationContext.Provider value={value}>{children}</TranslationContext.Provider>\n}\n\n/**\n * The resolved dictionary. Throws outside a provider — a component that needs\n * the locale as well as the strings has no sensible fallback for \"no locale\".\n */\nexport function useCurrentTranslation(): TLUiTranslation {\n const value = useContext(TranslationContext)\n if (!value) throw new Error(\"useCurrentTranslation: render inside <TldrawUiTranslationProvider>.\")\n return value\n}\n\n/** The resolved dictionary, or `null` outside a provider. */\nexport function useMaybeCurrentTranslation(): TLUiTranslation | null {\n return useContext(TranslationContext)\n}\n\n/**\n * Look a string id up. An id with no entry passes through unchanged, so a\n * component may use a localized literal as its own label and still be safe to\n * render outside a provider.\n */\nexport function useTranslation(): (id: TLUiTranslationKey) => string {\n const translation = useMaybeCurrentTranslation()\n return useMemo(() => {\n if (!translation) return (id: string) => id\n const dict: TLUiTranslations = { [translation.locale]: translation.messages as Record<string, string> }\n return (id: string) => resolveUiMessage(dict, translation.locale, id)\n }, [translation])\n}\n\n/** Alias of {@link useTranslation}, spelled as the value it returns. */\nexport const useMsg = useTranslation\n\n/** The writing direction of the current locale; `\"ltr\"` outside a provider. */\nexport function useDirection(): \"ltr\" | \"rtl\" {\n return useMaybeCurrentTranslation()?.dir ?? \"ltr\"\n}\n\n/**\n * The value {@link useCurrentTranslation} returns: the active locale's strings.\n *\n * The name a component annotates a prop with when it is handed the translation\n * rather than reading it from context — a static renderer, say, or a test.\n */\nexport type TLUiTranslationContextType = TLUiTranslation\n","import { useActions, useEditor, useIsToolSelected, useTools, type TLUiEventSource } from \"@mocanvas/editor\"\nimport { createContext, useContext, type ReactNode } from \"react\"\nimport { TldrawUiButtonCheck } from \"./ui-button\"\nimport {\n TldrawUiDropdownMenuCheckboxItem,\n TldrawUiDropdownMenuGroup,\n TldrawUiDropdownMenuItem,\n TldrawUiDropdownMenuSub,\n TldrawUiDropdownMenuSubContent,\n TldrawUiDropdownMenuSubTrigger,\n} from \"./ui-dropdown-menu\"\nimport { TldrawUiIcon } from \"./ui-icon\"\nimport { TldrawUiKbd } from \"./ui-kbd\"\nimport { useActionState } from \"./ui-actions\"\nimport { useUiEvents } from \"./ui-events\"\nimport { useTranslation } from \"./ui-translation\"\n\n/**\n * The menu system: one set of item components that render differently\n * depending on where they are.\n *\n * This is the whole point of it. The same `CutMenuItem` appears in the main\n * menu (a row with a label and a shortcut), in the context menu (the same),\n * in the actions menu (an icon-only button in a grid) and in the shortcuts\n * dialog (a label and a key, with no click behaviour at all). Writing four\n * components for each of seventy items is not an option, so the item asks the\n * context what shape to take.\n */\n\n/** Where a menu item is being rendered. */\nexport type TLUiMenuContextType =\n /** A vertical list of rows: the main menu, the help menu. */\n | \"menu\"\n /** The right-click menu. Same shape as `menu`; kept apart so items can differ. */\n | \"context-menu\"\n /** A grid of icon-only buttons: the actions menu. */\n | \"small-icons\"\n /** A row of icon buttons: the quick actions. */\n | \"icons\"\n /** Read-only rows in the keyboard shortcuts dialog. */\n | \"keyboard-shortcuts\"\n /** The helper buttons above the toolbar. */\n | \"helper-buttons\"\n /** The tool bar. */\n | \"toolbar\"\n /** A panel's own layout, e.g. the style panel. */\n | \"panel\"\n\nconst MenuContext = createContext<{ type: TLUiMenuContextType; sourceId: TLUiEventSource }>({ type: \"menu\", sourceId: \"menu\" })\n\nexport interface TLUiMenuContextProviderProps {\n type: TLUiMenuContextType\n /** Reported to `onSelect` and to the UI event handler. */\n sourceId?: TLUiEventSource\n children?: ReactNode\n}\n\n/** Tells the items inside it what shape to take. */\nexport function TldrawUiMenuContextProvider({ type, sourceId, children }: TLUiMenuContextProviderProps) {\n const resolved: TLUiEventSource = sourceId ?? (type === \"context-menu\" ? \"context-menu\" : type === \"toolbar\" ? \"toolbar\" : \"menu\")\n return <MenuContext.Provider value={{ type, sourceId: resolved }}>{children}</MenuContext.Provider>\n}\n\n/** The menu context an item is in. */\nexport function useTldrawUiMenuContext() {\n return useContext(MenuContext)\n}\n\nexport interface TLUiMenuItemProps {\n id: string\n label?: string\n icon?: string\n kbd?: string\n title?: string\n disabled?: boolean\n /** Marks this item as the active one in a set. */\n isSelected?: boolean\n /** Keep the menu open after selecting. */\n noClose?: boolean\n /** Rendered instead of the label; for an item that needs custom content. */\n children?: ReactNode\n onSelect?(source: TLUiEventSource): void\n}\n\n/**\n * One menu item, in whatever shape its context calls for.\n *\n * `label` is display text, already localized: an id with no dictionary entry\n * resolves to itself, so passing a literal is safe.\n */\nexport function TldrawUiMenuItem({ id, label, icon, kbd, title, disabled, isSelected, noClose, children, onSelect }: TLUiMenuItemProps) {\n const { type, sourceId } = useTldrawUiMenuContext()\n const msg = useTranslation()\n const trackEvent = useUiEvents()\n const text = label === undefined ? undefined : msg(label)\n\n const select = () => {\n onSelect?.(sourceId)\n trackEvent(id, { source: sourceId })\n }\n\n switch (type) {\n case \"keyboard-shortcuts\":\n return (\n <div className=\"mocanvas-shortcut-row\" data-item={id}>\n <span className=\"mocanvas-shortcut-label\">{text ?? id}</span>\n {kbd ? <TldrawUiKbd>{kbd}</TldrawUiKbd> : null}\n </div>\n )\n case \"small-icons\":\n case \"icons\":\n case \"helper-buttons\":\n case \"toolbar\":\n return (\n <button\n type=\"button\"\n className=\"mocanvas-btn\"\n data-item={id}\n disabled={disabled}\n aria-label={text ?? id}\n data-tooltip={title ?? text ?? id}\n {...(kbd ? { \"aria-keyshortcuts\": kbd, \"data-shortcut\": kbd } : {})}\n {...(isSelected === undefined ? {} : { \"aria-pressed\": isSelected })}\n onClick={select}\n >\n {icon ? <TldrawUiIcon icon={icon} label={text ?? id} /> : (children ?? <span>{text ?? id}</span>)}\n </button>\n )\n default:\n return (\n <TldrawUiDropdownMenuItem closeOnSelect={!noClose} {...(disabled ? { disabled } : {})} onSelect={select}>\n {icon ? <TldrawUiIcon icon={icon} /> : null}\n <span className=\"mocanvas-menu-item-label\">{children ?? text ?? id}</span>\n {kbd ? <TldrawUiKbd>{kbd}</TldrawUiKbd> : null}\n </TldrawUiDropdownMenuItem>\n )\n }\n}\n\nexport interface TLUiMenuGroupProps {\n id: string\n label?: string\n className?: string\n children?: ReactNode\n}\n\n/**\n * A run of related items, with a rule between it and the next.\n *\n * Renders nothing when it has no children, so a group whose items all decided\n * not to render does not leave a stray divider behind.\n */\nexport function TldrawUiMenuGroup({ id, label, className, children }: TLUiMenuGroupProps) {\n const { type } = useTldrawUiMenuContext()\n const msg = useTranslation()\n if (type === \"small-icons\" || type === \"icons\" || type === \"toolbar\" || type === \"helper-buttons\") {\n return (\n <div className=\"mocanvas-menu-icon-group\" data-group={id} role=\"group\" {...(label ? { \"aria-label\": msg(label) } : {})}>\n {children}\n </div>\n )\n }\n return (\n <TldrawUiDropdownMenuGroup className={[\"mocanvas-menu-group\", className].filter(Boolean).join(\" \")} {...(label ? { label: msg(label) } : {})}>\n {children}\n </TldrawUiDropdownMenuGroup>\n )\n}\n\nexport interface TLUiMenuSubmenuProps {\n id: string\n label?: string\n disabled?: boolean\n size?: \"tiny\" | \"small\" | \"medium\" | \"wide\"\n children?: ReactNode\n}\n\n/**\n * A nested menu.\n *\n * Flattens into a plain group in the icon-only contexts: a grid of buttons has\n * nowhere to hang a submenu off, and hiding items behind one that cannot open\n * would lose them.\n */\nexport function TldrawUiMenuSubmenu({ id, label, disabled, children }: TLUiMenuSubmenuProps) {\n const { type } = useTldrawUiMenuContext()\n const msg = useTranslation()\n const text = label ? msg(label) : id\n if (type === \"small-icons\" || type === \"icons\" || type === \"toolbar\" || type === \"helper-buttons\" || type === \"keyboard-shortcuts\") {\n return (\n <div className=\"mocanvas-menu-icon-group\" data-group={id} role=\"group\" aria-label={text}>\n {children}\n </div>\n )\n }\n return (\n <TldrawUiDropdownMenuSub id={id}>\n <TldrawUiDropdownMenuSubTrigger label={text} {...(disabled ? { disabled } : {})} />\n <TldrawUiDropdownMenuSubContent label={text}>{children}</TldrawUiDropdownMenuSubContent>\n </TldrawUiDropdownMenuSub>\n )\n}\n\nexport interface TLUiMenuCheckboxItemProps {\n id: string\n label?: string\n icon?: string\n kbd?: string\n title?: string\n checked?: boolean\n disabled?: boolean\n /** Close the menu after toggling. Off by default: toggles come in runs. */\n toggle?: boolean\n onSelect?(source: TLUiEventSource): void\n}\n\n/** A menu item that toggles. */\nexport function TldrawUiMenuCheckboxItem({ id, label, icon, kbd, title, checked = false, disabled, onSelect }: TLUiMenuCheckboxItemProps) {\n const { type, sourceId } = useTldrawUiMenuContext()\n const msg = useTranslation()\n const trackEvent = useUiEvents()\n const text = label ? msg(label) : id\n\n const select = () => {\n onSelect?.(sourceId)\n trackEvent(id, { source: sourceId })\n }\n\n if (type === \"keyboard-shortcuts\") {\n return (\n <div className=\"mocanvas-shortcut-row\" data-item={id}>\n <span className=\"mocanvas-shortcut-label\">{text}</span>\n {kbd ? <TldrawUiKbd>{kbd}</TldrawUiKbd> : null}\n </div>\n )\n }\n if (type === \"small-icons\" || type === \"icons\" || type === \"toolbar\" || type === \"helper-buttons\") {\n return (\n <button\n type=\"button\"\n className=\"mocanvas-btn\"\n data-item={id}\n role=\"checkbox\"\n aria-checked={checked}\n aria-label={text}\n data-tooltip={title ?? text}\n disabled={disabled}\n onClick={select}\n >\n {icon ? <TldrawUiIcon icon={icon} label={text} /> : <span>{text}</span>}\n </button>\n )\n }\n return (\n <TldrawUiDropdownMenuCheckboxItem checked={checked} {...(disabled ? { disabled } : {})} {...(title ? { title } : {})} onSelect={select}>\n {icon ? <TldrawUiIcon icon={icon} /> : null}\n <span className=\"mocanvas-menu-item-label\">{text}</span>\n {kbd ? <TldrawUiKbd>{kbd}</TldrawUiKbd> : null}\n </TldrawUiDropdownMenuCheckboxItem>\n )\n}\n\nexport interface TLUiMenuActionItemProps {\n /** The id of an entry in the action list. */\n actionId: string\n /** Override the item's own label. */\n label?: string\n /** Override the item's own icon. */\n icon?: string\n disabled?: boolean\n noClose?: boolean\n}\n\n/**\n * A menu item driven by the action list.\n *\n * Renders nothing when the action is not registered — the normal state on a\n * trimmed or read-only editor. That is why the concrete items below are all\n * written this way: removing an action through `overrides.actions` removes it\n * from every menu at once, rather than leaving buttons that throw.\n */\nexport function TldrawUiMenuActionItem({ actionId, label, icon, disabled, noClose }: TLUiMenuActionItemProps) {\n const actions = useActions()\n const state = useActionState(actionId)\n const action = actions[actionId]\n if (!action) return null\n return (\n <TldrawUiMenuItem\n id={action.id}\n label={label ?? action.label}\n {...(icon ?? action.icon ? { icon: icon ?? (action.icon as string) } : {})}\n {...(action.kbd ? { kbd: action.kbd } : {})}\n {...((disabled ?? action.disabled ?? state.disabled) ? { disabled: true } : {})}\n {...(noClose ? { noClose } : {})}\n onSelect={(source) => action.onSelect(source)}\n />\n )\n}\n\nexport interface TLUiMenuActionCheckboxItemProps extends TLUiMenuActionItemProps {\n checked?: boolean\n}\n\n/** A checkbox menu item driven by the action list. */\nexport function TldrawUiMenuActionCheckboxItem({ actionId, label, icon, checked, disabled }: TLUiMenuActionCheckboxItemProps) {\n const actions = useActions()\n const state = useActionState(actionId)\n const action = actions[actionId]\n if (!action) return null\n const isChecked = checked ?? (typeof action.meta?.[\"checked\"] === \"boolean\" ? (action.meta[\"checked\"] as boolean) : state.checked)\n return (\n <TldrawUiMenuCheckboxItem\n id={action.id}\n label={label ?? action.label}\n {...(icon ?? action.icon ? { icon: icon ?? (action.icon as string) } : {})}\n {...(action.kbd ? { kbd: action.kbd } : {})}\n checked={isChecked}\n {...((disabled ?? action.disabled ?? state.disabled) ? { disabled: true } : {})}\n onSelect={(source) => action.onSelect(source)}\n />\n )\n}\n\nexport interface TLUiMenuToolItemProps {\n /** The id of an entry in the tool list. */\n toolId: string\n label?: string\n icon?: string\n disabled?: boolean\n}\n\n/**\n * A menu item driven by the tool list, showing whether its tool is active.\n *\n * Renders nothing when the tool is not registered, for the same reason\n * {@link TldrawUiMenuActionItem} does.\n */\nexport function TldrawUiMenuToolItem({ toolId, label, icon, disabled }: TLUiMenuToolItemProps) {\n const tools = useTools()\n const tool = tools[toolId]\n const isSelected = useIsToolSelected(tool)\n if (!tool) return null\n return (\n <TldrawUiMenuItem\n id={tool.id}\n label={label ?? tool.label}\n icon={icon ?? tool.icon}\n {...(tool.kbd ? { kbd: tool.kbd } : {})}\n {...(disabled ?? tool.disabled ? { disabled: true } : {})}\n isSelected={isSelected}\n onSelect={(source) => tool.onSelect(source)}\n />\n )\n}\n\n/** Read for its side effect on the type checker only; keeps `useEditor` imported. */\nexport type TLUiMenuEditorHook = typeof useEditor\n","import { useActions, useTools } from \"@mocanvas/editor\"\nimport type { ReactNode } from \"react\"\nimport { TldrawUiDialogBody, TldrawUiDialogCloseButton, TldrawUiDialogHeader, TldrawUiDialogTitle, type TLUiDialogProps } from \"./ui-dialogs\"\nimport { TldrawUiMenuContextProvider, TldrawUiMenuItem } from \"./ui-menu\"\nimport type { TLUiKeyboardShortcutsDialogProps } from \"./ui-components\"\n\n/**\n * The keyboard shortcuts dialog.\n *\n * Built from the same tool and action lists everything else renders from, so\n * an app that rebinds a key through `overrides` gets a correct shortcuts sheet\n * for free — and, more usefully, cannot end up with one that lies.\n */\n\n/** Every registered tool and action that has a shortcut, grouped. */\nexport function DefaultKeyboardShortcutsDialogContent() {\n const tools = useTools()\n const actions = useActions()\n const toolItems = Object.values(tools).filter((tool) => tool.kbd)\n const actionItems = Object.values(actions).filter((action) => action.kbd)\n return (\n <TldrawUiMenuContextProvider type=\"keyboard-shortcuts\">\n <section className=\"mocanvas-shortcut-section\">\n <h3>Tools</h3>\n {toolItems.map((tool) => (\n <TldrawUiMenuItem key={tool.id} id={tool.id} label={tool.label} kbd={tool.kbd as string} />\n ))}\n </section>\n <section className=\"mocanvas-shortcut-section\">\n <h3>Actions</h3>\n {actionItems.map((action) => (\n <TldrawUiMenuItem key={action.id} id={action.id} label={action.label} kbd={action.kbd as string} />\n ))}\n </section>\n </TldrawUiMenuContextProvider>\n )\n}\n\n/**\n * The dialog frame. Replace the contents by passing `children`; replace the\n * whole dialog through the `KeyboardShortcutsDialog` component slot.\n */\nexport function DefaultKeyboardShortcutsDialog({ children }: TLUiKeyboardShortcutsDialogProps) {\n return (\n <>\n <TldrawUiDialogHeader>\n <TldrawUiDialogTitle>Keyboard shortcuts</TldrawUiDialogTitle>\n <TldrawUiDialogCloseButton />\n </TldrawUiDialogHeader>\n <TldrawUiDialogBody className=\"mocanvas-shortcuts\">{children ?? <DefaultKeyboardShortcutsDialogContent />}</TldrawUiDialogBody>\n </>\n )\n}\n\n/**\n * The form the dialog stack wants: a component taking `onClose`.\n *\n * `addDialog({ component: KeyboardShortcutsDialogContents })` is the whole\n * call, which is why this exists separately from the panel above.\n */\nexport function KeyboardShortcutsDialogContents(_props: TLUiDialogProps): ReactNode {\n return <DefaultKeyboardShortcutsDialog />\n}\n"]}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export { DefaultKeyboardShortcutsDialog, DefaultKeyboardShortcutsDialogContent, KeyboardShortcutsDialogContents } from './chunk-QDUQZXE4.js';
|
|
2
|
-
import './chunk-OMUOD53T.js';
|
|
3
|
-
//# sourceMappingURL=panel-shortcuts-R2PDTDUN.js.map
|
|
4
|
-
//# sourceMappingURL=panel-shortcuts-R2PDTDUN.js.map
|