@pixerate/editor-svelte 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/EditableTextNodeEditor.svelte","../src/editor.svelte.ts","../src/BubbleMenu.svelte","../src/TemplateRenderer.svelte","../src/navigationGuard.ts","../src/createNavigationGuard.svelte.ts","../src/index.ts","../src/spreadsheet/SpreadsheetEditor.svelte","../src/spreadsheet/FormulaBar.svelte","../src/spreadsheet/spreadsheet.svelte.ts"],"sourcesContent":["import 'EditableTextNodeEditor.svelte.css';import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { onDestroy, onMount } from \"svelte\";\nimport { initiateEditor } from \"./editor.svelte\";\n\nvar root = $.from_html(`<div class=\"flex items-center justify-center p-4 text-sm text-gray-500\">Loading editor...</div>`);\nvar root_1 = $.from_html(`<div draggable=\"false\"><!> <div></div></div>`);\n\nexport default function EditableTextNodeEditor($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet className = $.prop($$props, 'class', 3, \"\"),\n\t\teditorClass = $.prop($$props, 'editorClass', 3, \"\"),\n\t\tcontent = $.prop($$props, 'content', 3, undefined),\n\t\tshowMenu = $.prop($$props, 'showMenu', 3, true),\n\t\teditable = $.prop($$props, 'editable', 3, true),\n\t\teditor = $.prop($$props, 'editor', 15),\n\t\textensions = $.prop($$props, 'extensions', 19, () => []),\n\t\tplaceholder = $.prop($$props, 'placeholder', 3, \"\"),\n\t\tmarkdown = $.prop($$props, 'markdown', 3, undefined),\n\t\trichTextOptions = $.prop($$props, 'richTextOptions', 19, () => ({})),\n\t\tautofocus = $.prop($$props, 'autofocus', 3, false),\n\t\timage = $.prop($$props, 'image', 3, undefined),\n\t\tuploadImage = $.prop($$props, 'uploadImage', 3, undefined),\n\t\tonUploadError = $.prop($$props, 'onUploadError', 3, undefined);\n\n\tlet element = $.state(void 0);\n\n\t$.user_effect(() => {\n\t\tif (editor() && editor().isEditable !== editable()) {\n\t\t\teditor().setEditable(editable());\n\t\t}\n\t});\n\n\tonMount(() => {\n\t\teditor(initiateEditor($.get(element), content(), extensions(), {\n\t\t\trichTextOptions: {\n\t\t\t\tplaceholder: placeholder(),\n\t\t\t\t...markdown() !== undefined ? { markdown: markdown() } : {},\n\t\t\t\t...image() !== undefined || uploadImage() !== undefined || onUploadError() !== undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\timage: image() === false\n\t\t\t\t\t\t\t? false\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t...typeof image() === \"object\" ? image() : {},\n\t\t\t\t\t\t\t\t...uploadImage() ? { upload: uploadImage() } : {},\n\t\t\t\t\t\t\t\t...onUploadError() ? { onUploadError: onUploadError() } : {}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t: {},\n\t\t\t\t...richTextOptions()\n\t\t\t},\n\t\t\teditable: editable(),\n\t\t\tautofocus: autofocus(),\n\t\t\tonCreate: $$props.onCreate,\n\t\t\tonUpdate: $$props.onUpdate,\n\t\t\tonFocus() {\n\t\t\t\tif ($$props.onFocus) $$props.onFocus();\n\t\t\t},\n\n\t\t\tonBlur() {\n\t\t\t\tif ($$props.onBlur) $$props.onBlur();\n\t\t\t}\n\t\t}));\n\t});\n\n\tonDestroy(() => {\n\t\tif (editor()) {\n\t\t\teditor().destroy();\n\t\t}\n\t});\n\n\tvar div = root_1();\n\tvar node = $.child(div);\n\n\t{\n\t\tvar consequent = ($$anchor) => {\n\t\t\tvar div_1 = root();\n\n\t\t\t$.append($$anchor, div_1);\n\t\t};\n\n\t\t$.if(node, ($$render) => {\n\t\t\tif (!editor()) $$render(consequent);\n\t\t});\n\t}\n\n\tvar div_2 = $.sibling(node, 2);\n\n\t$.bind_this(div_2, ($$value) => $.set(element, $$value), () => $.get(element));\n\t$.reset(div);\n\n\t$.template_effect(\n\t\t($0) => {\n\t\t\t$.set_class(div, 1, `pixerate-editor-container ${className()}`);\n\t\t\t$.set_class(div_2, 1, $0);\n\t\t},\n\t\t[\n\t\t\t() => $.clsx(`pixerate-editor-content prose dark:prose-invert w-full max-w-none focus:outline-none ${editorClass()}`.trim())\n\t\t]\n\t);\n\n\t$.append($$anchor, div);\n\t$.pop();\n}","import { Editor } from \"@tiptap/core\";\nimport { createRichTextPreset } from \"@pixerate/editor\";\nexport const initiateEditor = (element, content, extensions, options) => {\n const { richTextOptions, ...editorOptions } = options || {};\n const defaultPreset = createRichTextPreset(richTextOptions);\n const editor = new Editor({\n element,\n content,\n extensions: [\n ...defaultPreset,\n ...extensions ?? []\n ],\n autofocus: false,\n ...editorOptions\n });\n return editor;\n};\nexport function createReactiveEditor(initialContent = \"\", extensions = [], options = {}) {\n let editorInstance;\n return {\n get current() {\n return editorInstance;\n },\n mount(element) {\n editorInstance = initiateEditor(element, initialContent, extensions, options);\n return editorInstance;\n },\n destroy() {\n if (editorInstance) {\n editorInstance.destroy();\n editorInstance = void 0;\n }\n }\n };\n}\n","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { BubbleMenuPlugin } from \"@tiptap/extension-bubble-menu\";\n\nvar root = $.from_html(`<div style=\"visibility: hidden;\"><!></div>`);\n\nexport default function BubbleMenu($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet className = $.prop($$props, 'class', 3, \"flex h-fit w-fit items-center gap-1 rounded-md border border-gray-200 bg-white p-1 shadow-md\"),\n\t\tpluginKey = $.prop($$props, 'pluginKey', 3, \"bubbleMenu\"),\n\t\tshouldShow = $.prop($$props, 'shouldShow', 3, null),\n\t\tupdateDelay = $.prop($$props, 'updateDelay', 3, 250),\n\t\ttippyOptions = $.prop($$props, 'tippyOptions', 19, () => ({}));\n\n\tlet menuElement = $.state(void 0);\n\n\t$.user_effect(() => {\n\t\tif ($$props.editor && $.get(menuElement)) {\n\t\t\tconst plugin = BubbleMenuPlugin({\n\t\t\t\tpluginKey: pluginKey(),\n\t\t\t\teditor: $$props.editor,\n\t\t\t\telement: $.get(menuElement),\n\t\t\t\ttippyOptions: {\n\t\t\t\t\tduration: 100,\n\t\t\t\t\tappendTo: () => document.body,\n\t\t\t\t\t...tippyOptions()\n\t\t\t\t},\n\t\t\t\tshouldShow: shouldShow(),\n\t\t\t\tupdateDelay: updateDelay()\n\t\t\t});\n\n\t\t\t$$props.editor.registerPlugin(plugin);\n\n\t\t\treturn () => {\n\t\t\t\t$$props.editor.unregisterPlugin(pluginKey());\n\t\t\t};\n\t\t}\n\t});\n\n\tvar div = root();\n\tvar node = $.child(div);\n\n\t{\n\t\tvar consequent = ($$anchor) => {\n\t\t\tvar fragment = $.comment();\n\t\t\tvar node_1 = $.first_child(fragment);\n\n\t\t\t$.snippet(node_1, () => $$props.children);\n\t\t\t$.append($$anchor, fragment);\n\t\t};\n\n\t\t$.if(node, ($$render) => {\n\t\t\tif ($$props.children) $$render(consequent);\n\t\t});\n\t}\n\n\t$.reset(div);\n\t$.bind_this(div, ($$value) => $.set(menuElement, $$value), () => $.get(menuElement));\n\t$.template_effect(() => $.set_class(div, 1, $.clsx(className())));\n\t$.append($$anchor, div);\n\t$.pop();\n}","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { tokenizePrompt, resolveTemplates } from \"@pixerate/editor\";\n\nvar root = $.from_html(`<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 text-xs font-semibold rounded-md border border-[var(--color-to)]/40 bg-gradient-to-r from-[var(--color-from)]/15 to-[var(--color-to)]/15 text-[var(--color-to)] hover:brightness-110 cursor-pointer transition-all\"> </span>`);\nvar root_1 = $.from_html(`<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 text-xs font-medium rounded-md border border-violet-400/40 bg-violet-400/15 text-violet-600 hover:brightness-110 cursor-pointer transition-all\"> </span>`);\nvar root_2 = $.from_html(`<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 text-xs italic font-medium rounded-md border border-rose-400/40 bg-rose-400/15 text-rose-600\"> </span>`);\nvar root_3 = $.from_html(`<span> </span>`);\nvar root_4 = $.from_html(`<div></div>`);\n\nexport default function TemplateRenderer($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet templates = $.prop($$props, 'templates', 19, () => []),\n\t\tresolve = $.prop($$props, 'resolve', 3, false),\n\t\tclassName = $.prop($$props, 'class', 3, \"font-mono text-sm leading-relaxed whitespace-pre-wrap break-words\");\n\n\tlet displayText = $.derived(() => resolve() && templates().length > 0\n\t\t? resolveTemplates($$props.content, templates())\n\t\t: $$props.content);\n\n\tlet tokens = $.derived(() => tokenizePrompt($.get(displayText)));\n\tvar div = root_4();\n\n\t$.each(div, 21, () => $.get(tokens), $.index, ($$anchor, token) => {\n\t\tvar fragment = $.comment();\n\t\tvar node = $.first_child(fragment);\n\n\t\t{\n\t\t\tvar consequent = ($$anchor) => {\n\t\t\t\tconst colors = $.derived(() => $$props.templateColorMap?.get($.get(token).value) || { from: \"#f43f5e\", to: \"#8b5cf6\" });\n\t\t\t\tvar span = root();\n\t\t\t\tvar text = $.only_child(span, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_style(span, `--color-from: ${$.get(colors).from}; --color-to: ${$.get(colors).to};`);\n\t\t\t\t\t$.set_attribute(span, 'title', `Template: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text, `{{${$.get(token).value}}}`);\n\t\t\t\t});\n\n\t\t\t\t$.delegated('click', span, () => $$props.onTemplateClick?.($.get(token).value));\n\t\t\t\t$.append($$anchor, span);\n\t\t\t};\n\n\t\t\tvar consequent_1 = ($$anchor) => {\n\t\t\t\tvar span_1 = root_1();\n\t\t\t\tvar text_1 = $.only_child(span_1, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_attribute(span_1, 'title', `Variable: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text_1, `{${$.get(token).value}}`);\n\t\t\t\t});\n\n\t\t\t\t$.delegated('click', span_1, () => $$props.onVariableClick?.($.get(token).value));\n\t\t\t\t$.append($$anchor, span_1);\n\t\t\t};\n\n\t\t\tvar consequent_2 = ($$anchor) => {\n\t\t\t\tvar span_2 = root_2();\n\t\t\t\tvar text_2 = $.only_child(span_2, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_attribute(span_2, 'title', `Instruction: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text_2, `__${$.get(token).value}__`);\n\t\t\t\t});\n\n\t\t\t\t$.append($$anchor, span_2);\n\t\t\t};\n\n\t\t\tvar alternate = ($$anchor) => {\n\t\t\t\tvar span_3 = root_3();\n\t\t\t\tvar text_3 = $.only_child(span_3, true);\n\n\t\t\t\t$.template_effect(() => $.set_text(text_3, $.get(token).value));\n\t\t\t\t$.append($$anchor, span_3);\n\t\t\t};\n\n\t\t\t$.if(node, ($$render) => {\n\t\t\t\tif ($.get(token).type === \"template\") $$render(consequent); else if ($.get(token).type === \"variable\") $$render(consequent_1, 1); else if ($.get(token).type === \"instruction\") $$render(consequent_2, 2); else $$render(alternate, -1);\n\t\t\t});\n\t\t}\n\n\t\t$.append($$anchor, fragment);\n\t});\n\n\t$.reset(div);\n\t$.template_effect(() => $.set_class(div, 1, $.clsx(className())));\n\t$.append($$anchor, div);\n\t$.pop();\n}\n\n$.delegate(['click']);","export interface NavigationGuardOptions {\n /** Whether the current form or editor has unsaved changes */\n isDirty: boolean;\n /** Whether guarding is enabled (defaults to true) */\n enabled?: boolean;\n /** Callback fired when an internal navigation attempt is intercepted */\n onBlocked?: (url: string) => void;\n}\n\nexport interface NavigationGuardActionReturn {\n update(newOptions: NavigationGuardOptions): void;\n destroy(): void;\n}\n\n/**\n * Svelte action to guard against navigation when there are unsaved changes.\n * Attaches beforeunload to window and intercepts internal anchor clicks on the element.\n *\n * Usage:\n * <div use:navigationGuard={{ isDirty, onBlocked: (url) => { pendingUrl = url; showConfirm = true; } }}>\n */\nexport function navigationGuard(\n node: HTMLElement,\n options: NavigationGuardOptions,\n): NavigationGuardActionReturn {\n let isDirty = options.isDirty;\n let enabled = options.enabled ?? true;\n let onBlocked = options.onBlocked;\n\n function handleBeforeUnload(e: BeforeUnloadEvent) {\n if (!enabled || !isDirty) return;\n e.preventDefault();\n e.returnValue = \"\";\n }\n\n function handleClick(e: MouseEvent) {\n if (!enabled || !isDirty) return;\n\n const target = e.target as HTMLElement | null;\n const anchor = target?.closest?.(\"a\");\n if (!anchor) return;\n if (anchor.target === \"_blank\") return;\n\n // Check if link is internal\n if (typeof window !== \"undefined\") {\n const isInternal = anchor.host === window.location.host;\n if (!isInternal) return;\n\n if (\n anchor.pathname === window.location.pathname &&\n anchor.search === window.location.search\n ) {\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const href = anchor.href;\n onBlocked?.(href);\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n }\n node.addEventListener(\"click\", handleClick, { capture: true });\n\n return {\n update(newOptions: NavigationGuardOptions) {\n isDirty = newOptions.isDirty;\n enabled = newOptions.enabled ?? true;\n onBlocked = newOptions.onBlocked;\n },\n destroy() {\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n }\n node.removeEventListener(\"click\", handleClick, { capture: true });\n },\n };\n}\n","export function createNavigationGuard(options) {\n let showConfirm = $state(false);\n let pendingUrl = $state(null);\n const getIsDirty = () => typeof options.isDirty === \"function\" ? options.isDirty() : options.isDirty;\n const getEnabled = () => typeof options.enabled === \"function\" ? options.enabled() : options.enabled ?? true;\n function handleBeforeUnload(e) {\n if (!getEnabled() || !getIsDirty()) return;\n e.preventDefault();\n e.returnValue = \"\";\n }\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n }\n function intercept(url) {\n if (getEnabled() && getIsDirty()) {\n pendingUrl = url;\n showConfirm = true;\n options.onBlocked?.(url);\n return true;\n }\n return false;\n }\n function confirmLeave() {\n showConfirm = false;\n const target = pendingUrl;\n if (target) {\n if (options.onNavigate) {\n options.onNavigate(target);\n } else if (typeof window !== \"undefined\") {\n window.location.href = target;\n }\n }\n }\n function cancelLeave() {\n showConfirm = false;\n pendingUrl = null;\n }\n function destroy() {\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n }\n }\n return {\n get showConfirm() {\n return showConfirm;\n },\n setShowConfirm(val) {\n showConfirm = val;\n },\n get pendingUrl() {\n return pendingUrl;\n },\n intercept,\n confirmLeave,\n cancelLeave,\n destroy\n };\n}\n","import type { Component } from \"svelte\";\nimport type { Editor, Content, Extensions, FocusPosition } from \"@tiptap/core\";\nimport type {\n Template,\n ColorGradient,\n RichTextPresetOptions,\n MarkdownOptions,\n ImageOptions,\n} from \"@pixerate/editor\";\n\nimport EditableTextNodeEditorComponent from \"./EditableTextNodeEditor.svelte\";\nimport BubbleMenuComponent from \"./BubbleMenu.svelte\";\nimport TemplateRendererComponent from \"./TemplateRenderer.svelte\";\n\nexport * from \"./editor.svelte\";\nexport * from \"./navigationGuard\";\nexport * from \"./createNavigationGuard.svelte\";\n\nexport {\n DirtyTracker,\n createDirtyTracker,\n defaultIsEqual,\n} from \"@pixerate/editor\";\nexport type { DirtyTrackerOptions } from \"@pixerate/editor\";\n\nexport interface EditableTextNodeEditorProps {\n class?: string;\n editorClass?: string;\n content?: Content;\n showMenu?: boolean;\n editable?: boolean;\n editor?: Editor;\n extensions?: Extensions;\n onUpdate?: () => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onCreate?: () => void;\n placeholder?: string;\n markdown?: boolean | MarkdownOptions;\n richTextOptions?: RichTextPresetOptions;\n autofocus?: FocusPosition | boolean;\n image?: ImageOptions | boolean;\n uploadImage?: (file: File) => Promise<string> | string;\n onUploadError?: (error: Error, file: File) => void;\n}\n\nexport interface BubbleMenuProps {\n editor?: Editor;\n class?: string;\n children?: any;\n}\n\nexport interface TemplateRendererProps {\n content: string;\n templates?: Template[];\n templateColorMap?: Map<string, ColorGradient>;\n resolve?: boolean;\n class?: string;\n onTemplateClick?: (templateName: string) => void;\n onVariableClick?: (variableName: string) => void;\n}\n\nexport const EditableTextNodeEditor =\n EditableTextNodeEditorComponent as unknown as Component<EditableTextNodeEditorProps>;\nexport const BubbleMenu =\n BubbleMenuComponent as unknown as Component<BubbleMenuProps>;\nexport const TemplateRenderer =\n TemplateRendererComponent as unknown as Component<TemplateRendererProps>;\n\nexport type {\n Template,\n TemplateVersion,\n Token,\n TokenType,\n ColorGradient,\n RichTextPresetOptions,\n ImageOptions,\n} from \"@pixerate/editor\";\n\nexport * from \"./spreadsheet\";\n","import 'SpreadsheetEditor.svelte.css';import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { indexToColName } from '@pixerate/editor';\nimport FormulaBar from './FormulaBar.svelte';\nimport { createReactiveSpreadsheet } from './spreadsheet.svelte';\n\nvar root = $.from_html(`<th><div class=\"flex items-center justify-between gap-1 min-w-0 overflow-hidden truncate\"><span class=\"truncate font-semibold text-foreground text-xs min-w-0\"> </span> <span class=\"text-[10px] text-muted-foreground/70 font-mono font-normal shrink-0\"> </span></div> <div class=\"col-resize-handle svelte-m799ch\" style=\"position: absolute; top: 0; bottom: 0; width: 12px; right: -6px; cursor: col-resize !important; z-index: 20; display: flex; justify-content: center; touch-action: none;\" role=\"separator\" aria-orientation=\"vertical\" tabindex=\"-1\"><div class=\"col-resize-handle-line svelte-m799ch\"></div></div></th>`);\nvar root_1 = $.from_html(`<th class=\"w-10 min-w-[2.5rem] px-1 text-center bg-muted/40 hover:bg-muted cursor-pointer transition-colors svelte-m799ch\" title=\"Add Column\"><span class=\"text-xs font-bold text-muted-foreground\">+</span></th>`);\nvar root_2 = $.from_html(`<input type=\"text\" class=\"absolute inset-0 w-full h-full px-2 py-1 bg-background text-foreground outline-none font-sans text-xs border-2 border-primary z-20\"/>`);\nvar root_3 = $.from_html(`<span> </span>`);\nvar root_4 = $.from_html(`<td style=\"max-width: 0; overflow: hidden;\"><!></td>`);\nvar root_5 = $.from_html(`<td class=\"w-10 min-w-[2.5rem] bg-muted/10 border-r border-border svelte-m799ch\"></td>`);\nvar root_6 = $.from_html(`<tr class=\"border-b border-border hover:bg-muted/10 transition-colors\"><td class=\"w-12 min-w-[3rem] sticky left-0 z-10 bg-muted/50 border-r border-border text-center text-[10px] text-muted-foreground font-mono select-none svelte-m799ch\"> </td><!><!><td class=\"border-b border-border bg-transparent p-0 svelte-m799ch\"></td></tr>`);\nvar root_7 = $.from_html(`<div tabindex=\"0\" role=\"grid\" aria-label=\"Spreadsheet\"><!> <div class=\"relative flex-1 overflow-auto\"><table class=\"border-collapse table-fixed w-max min-w-full svelte-m799ch\"><thead><tr class=\"h-7 bg-muted/60 sticky top-0 z-20 border-b border-border shadow-xs\"><th class=\"w-12 min-w-[3rem] sticky left-0 z-30 bg-muted/90 border-r border-border text-center text-[10px] text-muted-foreground font-medium svelte-m799ch\">#</th><!><!><th class=\"border-b border-border bg-transparent p-0 font-normal svelte-m799ch\"></th></tr></thead><tbody></tbody></table></div></div>`);\n\nexport default function SpreadsheetEditor($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet sheetState = $.prop($$props, 'sheetState', 23, createReactiveSpreadsheet),\n\t\treadOnly = $.prop($$props, 'readOnly', 3, false),\n\t\treadonly = $.prop($$props, 'readonly', 3, false),\n\t\tshowFormulaBar = $.prop($$props, 'showFormulaBar', 3, true),\n\t\tclassName = $.prop($$props, 'class', 3, '');\n\n\tlet isReadOnly = $.derived(() => readOnly() || readonly());\n\tlet gridContainer = $.state(null);\n\tlet resizingColId = $.state(null);\n\tlet hoveredColId = $.state(null);\n\tlet resizeStartX = $.state(0);\n\tlet resizeStartWidth = $.state(0);\n\n\tfunction handleCellClick(rIdx, cIdx, e) {\n\t\tif (sheetState().editingCell && (sheetState().editingCell.row !== rIdx || sheetState().editingCell.col !== cIdx)) {\n\t\t\tsheetState().commitEditing();\n\t\t}\n\n\t\tsheetState().selectCell(rIdx, cIdx, e.shiftKey);\n\t}\n\n\tfunction handleCellDblClick(rIdx, cIdx) {\n\t\tif ($.get(isReadOnly)) return;\n\n\t\tconst col = sheetState().document.columns[cIdx];\n\n\t\tif (col?.readOnly) return;\n\n\t\tsheetState().startEditing(rIdx, cIdx);\n\t}\n\n\tfunction handleKeyDown(e) {\n\t\tif (sheetState().editingCell) {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tsheetState().cancelEditing();\n\t\t\t} else if (e.key === 'Enter') {\n\t\t\t\tsheetState().commitEditing();\n\t\t\t\tsheetState().moveCursor('down');\n\t\t\t} else if (e.key === 'Tab') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsheetState().commitEditing();\n\t\t\t\tsheetState().moveCursor(e.shiftKey ? 'left' : 'right');\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!sheetState().activeCell) return;\n\n\t\tif (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('up', e.shiftKey);\n\t\t} else if (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('down', e.shiftKey);\n\t\t} else if (e.key === 'ArrowLeft') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('left', e.shiftKey);\n\t\t} else if (e.key === 'ArrowRight') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('right', e.shiftKey);\n\t\t} else if (e.key === 'Tab') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor(e.shiftKey ? 'left' : 'right');\n\t\t} else if (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\n\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\tif (!$.get(isReadOnly) && !col?.readOnly) {\n\t\t\t\tsheetState().startEditing();\n\t\t\t}\n\t\t} else if (e.key === 'Backspace' || e.key === 'Delete') {\n\t\t\tif ($.get(isReadOnly)) return;\n\n\t\t\tconst row = sheetState().document.rows[sheetState().activeCell.row];\n\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\tif (row && col && !col.readOnly) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsheetState().setCellValue(row.id, col.id, '');\n\t\t\t}\n\t\t} else if ((e.metaKey || e.ctrlKey) && e.key === 'z') {\n\t\t\te.preventDefault();\n\n\t\t\tif (e.shiftKey) {\n\t\t\t\tsheetState().redo();\n\t\t\t} else {\n\t\t\t\tsheetState().undo();\n\t\t\t}\n\t\t} else if ((e.metaKey || e.ctrlKey) && e.key === 'c') {\n\t\t\te.preventDefault();\n\n\t\t\tconst tsv = sheetState().exportToTsv();\n\n\t\t\tnavigator.clipboard?.writeText(tsv);\n\t\t} else if (!$.get(isReadOnly) && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n\t\t\t// Direct typing into cell starts editing\n\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\tif (!col?.readOnly) {\n\t\t\t\tsheetState().startEditing(sheetState().activeCell.row, sheetState().activeCell.col, e.key);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction handleResizeStart(colId, width, e) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\t$.set(resizingColId, colId, true);\n\t\t$.set(resizeStartX, e.clientX, true);\n\t\t$.set(resizeStartWidth, width, true);\n\n\t\tif (typeof document !== 'undefined') {\n\t\t\tdocument.body.style.cursor = 'col-resize';\n\t\t\tdocument.body.style.userSelect = 'none';\n\t\t}\n\n\t\tlet rafId = null;\n\t\tlet pendingWidth = width;\n\t\tlet hasDragged = false;\n\n\t\tconst handleMouseMove = (moveEvent) => {\n\t\t\tif (!$.get(resizingColId)) return;\n\n\t\t\tconst delta = moveEvent.clientX - $.get(resizeStartX);\n\n\t\t\tif (Math.abs(delta) > 2) {\n\t\t\t\thasDragged = true;\n\t\t\t}\n\n\t\t\tpendingWidth = Math.max(30, $.get(resizeStartWidth) + delta);\n\n\t\t\tif (rafId === null) {\n\t\t\t\trafId = requestAnimationFrame(() => {\n\t\t\t\t\trafId = null;\n\n\t\t\t\t\tif ($.get(resizingColId)) {\n\t\t\t\t\t\tsheetState().setColumnWidth($.get(resizingColId), pendingWidth);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tconst handleMouseUp = () => {\n\t\t\tif (rafId !== null) {\n\t\t\t\tcancelAnimationFrame(rafId);\n\t\t\t\trafId = null;\n\t\t\t}\n\n\t\t\tif ($.get(resizingColId) && hasDragged) {\n\t\t\t\tsheetState().setColumnWidth($.get(resizingColId), pendingWidth);\n\n\t\t\t\tconst col = sheetState().document.columns.find((c) => c.id === $.get(resizingColId));\n\n\t\t\t\tif (col && $$props.onColumnResize) {\n\t\t\t\t\t$$props.onColumnResize(col.id, col.width || pendingWidth);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$.set(resizingColId, null);\n\n\t\t\tif (typeof document !== 'undefined') {\n\t\t\t\tdocument.body.style.cursor = '';\n\t\t\t\tdocument.body.style.userSelect = '';\n\t\t\t}\n\n\t\t\twindow.removeEventListener('mousemove', handleMouseMove);\n\t\t\twindow.removeEventListener('mouseup', handleMouseUp);\n\t\t};\n\n\t\twindow.addEventListener('mousemove', handleMouseMove);\n\t\twindow.addEventListener('mouseup', handleMouseUp);\n\t}\n\n\tfunction measureElementContentWidth(el, container) {\n\t\tif (typeof document === 'undefined') return 0;\n\n\t\tlet maxW = el.scrollWidth || 0;\n\t\tconst firstChild = el.firstElementChild;\n\n\t\tif (firstChild && firstChild.scrollWidth > maxW) {\n\t\t\tmaxW = firstChild.scrollWidth;\n\t\t}\n\n\t\tconst truncated = el.querySelectorAll('.truncate, [title], span, div');\n\n\t\ttruncated.forEach((node) => {\n\t\t\tif (node.scrollWidth > maxW) {\n\t\t\t\tmaxW = node.scrollWidth;\n\t\t\t}\n\t\t});\n\n\t\ttry {\n\t\t\tconst clone = firstChild ? firstChild.cloneNode(true) : el.cloneNode(true);\n\n\t\t\tclone.style.cssText = `\n position: absolute !important;\n visibility: hidden !important;\n width: max-content !important;\n min-width: max-content !important;\n max-width: none !important;\n overflow: visible !important;\n white-space: nowrap !important;\n pointer-events: none !important;\n top: -9999px !important;\n left: -9999px !important;\n `;\n\n\t\t\tconst allNodes = clone.querySelectorAll('*');\n\n\t\t\tallNodes.forEach((node) => {\n\t\t\t\tnode.style.maxWidth = 'none';\n\t\t\t\tnode.style.overflow = 'visible';\n\t\t\t\tnode.style.textOverflow = 'clip';\n\t\t\t\tnode.style.whiteSpace = 'nowrap';\n\n\t\t\t\tif (node.classList.contains('truncate') || node.classList.contains('min-w-0') || node.classList.contains('w-full') || node.classList.contains('max-w-0') || node.classList.contains('flex-1')) {\n\t\t\t\t\tnode.style.width = 'max-content';\n\t\t\t\t\tnode.style.minWidth = 'max-content';\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontainer.appendChild(clone);\n\n\t\t\tconst rect = clone.getBoundingClientRect();\n\n\t\t\tcontainer.removeChild(clone);\n\n\t\t\tif (rect.width > maxW) {\n\t\t\t\tmaxW = rect.width;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore cloning/measuring errors\n\t\t}\n\n\t\treturn maxW;\n\t}\n\n\tfunction autoFitColumn(colId, colIndex) {\n\t\tconst col = sheetState().document.columns.find((c) => c.id === colId);\n\n\t\tif (!col) return;\n\n\t\tlet calculatedWidth = 0;\n\n\t\tif ($.get(gridContainer) && typeof document !== 'undefined') {\n\t\t\tconst table = $.get(gridContainer).querySelector('table');\n\n\t\t\tif (table) {\n\t\t\t\tconst thElements = table.querySelectorAll('thead th');\n\t\t\t\tconst th = thElements[colIndex + 1];\n\n\t\t\t\tif (th) {\n\t\t\t\t\tconst headerInner = th.firstElementChild || th;\n\t\t\t\t\tconst headerW = measureElementContentWidth(headerInner, $.get(gridContainer));\n\n\t\t\t\t\tcalculatedWidth = Math.max(calculatedWidth, headerW + 28);\n\t\t\t\t}\n\n\t\t\t\tconst rows = table.querySelectorAll('tbody tr');\n\t\t\t\tconst sampleLimit = Math.min(rows.length, 150);\n\n\t\t\t\tfor (let r = 0; r < sampleLimit; r++) {\n\t\t\t\t\tconst tr = rows[r];\n\t\t\t\t\tconst td = tr.children[colIndex + 1];\n\n\t\t\t\t\tif (td) {\n\t\t\t\t\t\tconst cellW = measureElementContentWidth(td, $.get(gridContainer));\n\n\t\t\t\t\t\tcalculatedWidth = Math.max(calculatedWidth, cellW + 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (calculatedWidth > 0) {\n\t\t\tconst finalWidth = Math.min(600, Math.max(50, Math.ceil(calculatedWidth)));\n\n\t\t\tsheetState().setColumnWidth(colId, finalWidth);\n\t\t} else {\n\t\t\tsheetState().autoFitColumnWidth(colId);\n\t\t}\n\n\t\tconst updatedCol = sheetState().document.columns.find((c) => c.id === colId);\n\n\t\tif (updatedCol && $$props.onColumnResize) {\n\t\t\t$$props.onColumnResize(updatedCol.id, updatedCol.width || 130);\n\t\t}\n\t}\n\n\tfunction handleResizeDblClick(colId, colIndex, e) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tautoFitColumn(colId, colIndex);\n\t}\n\n\tfunction handleHeaderDblClick(colId, colIndex, e) {\n\t\tconst target = e.currentTarget;\n\n\t\tif (target) {\n\t\t\tconst rect = target.getBoundingClientRect();\n\n\t\t\tif (rect.right - e.clientX <= 12) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tautoFitColumn(colId, colIndex);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction isCellSelected(rIdx, cIdx) {\n\t\tif (!sheetState().selectedRange) return false;\n\n\t\tconst minR = Math.min(sheetState().selectedRange.startRow, sheetState().selectedRange.endRow);\n\t\tconst maxR = Math.max(sheetState().selectedRange.startRow, sheetState().selectedRange.endRow);\n\t\tconst minC = Math.min(sheetState().selectedRange.startCol, sheetState().selectedRange.endCol);\n\t\tconst maxC = Math.max(sheetState().selectedRange.startCol, sheetState().selectedRange.endCol);\n\n\t\treturn rIdx >= minR && rIdx <= maxR && cIdx >= minC && cIdx <= maxC;\n\t}\n\n\tfunction isActiveCell(rIdx, cIdx) {\n\t\treturn sheetState().activeCell?.row === rIdx && sheetState().activeCell?.col === cIdx;\n\t}\n\n\tvar div = root_7();\n\tvar node_1 = $.child(div);\n\n\t{\n\t\tvar consequent = ($$anchor) => {\n\t\t\tFormulaBar($$anchor, {\n\t\t\t\tget sheetState() {\n\t\t\t\t\treturn sheetState();\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\t$.if(node_1, ($$render) => {\n\t\t\tif (showFormulaBar()) $$render(consequent);\n\t\t});\n\t}\n\n\tvar div_1 = $.sibling(node_1, 2);\n\tvar table_1 = $.child(div_1);\n\tvar thead = $.child(table_1);\n\tvar tr_1 = $.child(thead);\n\tvar node_2 = $.sibling($.child(tr_1));\n\n\t$.each(node_2, 19, () => sheetState().document.columns, (col) => col.id, ($$anchor, col, cIdx) => {\n\t\tvar th_1 = root();\n\t\tvar div_2 = $.child(th_1);\n\t\tvar span = $.child(div_2);\n\t\tvar text = $.only_child(span, true);\n\t\tvar span_1 = $.sibling(span, 2);\n\t\tvar text_1 = $.only_child(span_1);\n\n\t\t$.reset(div_2);\n\n\t\tvar div_3 = $.sibling(div_2, 2);\n\t\tvar div_4 = $.only_child(div_3);\n\n\t\t$.reset(th_1);\n\n\t\t$.template_effect(() => {\n\t\t\t$.set_class(th_1, 1, `relative border-r border-border px-2 text-left font-medium text-muted-foreground hover:bg-muted/90 transition-colors group overflow-hidden max-w-0 ${$$props.onColumnHeaderClick ? 'cursor-pointer' : 'cursor-default'}`, 'svelte-m799ch');\n\t\t\t$.set_style(th_1, `width: ${($.get(col).width || 130) ?? ''}px; min-width: ${($.get(col).width || 130) ?? ''}px; max-width: ${($.get(col).width || 130) ?? ''}px; overflow: hidden;`);\n\t\t\t$.set_text(text, $.get(col).title);\n\t\t\t$.set_text(text_1, `(${$.get(col).key ?? ''})`);\n\n\t\t\t$.set_style(div_4, `width: 2px; height: 100%; pointer-events: none; transition: background-color 150ms ease; background-color: ${$.get(resizingColId) === $.get(col).id\n\t\t\t\t? 'var(--primary, #6366f1)'\n\t\t\t\t: $.get(hoveredColId) === $.get(col).id\n\t\t\t\t\t? 'color-mix(in srgb, var(--primary, #6366f1) 75%, transparent)'\n\t\t\t\t\t: 'transparent'};`);\n\t\t});\n\n\t\t$.delegated('click', th_1, () => $$props.onColumnHeaderClick?.($.get(col)));\n\t\t$.delegated('dblclick', th_1, (e) => handleHeaderDblClick($.get(col).id, $.get(cIdx), e));\n\t\t$.event('mouseenter', div_3, () => $.set(hoveredColId, $.get(col).id, true));\n\n\t\t$.event('mouseleave', div_3, () => {\n\t\t\tif ($.get(hoveredColId) === $.get(col).id) $.set(hoveredColId, null);\n\t\t});\n\n\t\t$.delegated('mousedown', div_3, (e) => handleResizeStart($.get(col).id, $.get(col).width || 130, e));\n\t\t$.delegated('dblclick', div_3, (e) => handleResizeDblClick($.get(col).id, $.get(cIdx), e));\n\t\t$.append($$anchor, th_1);\n\t});\n\n\tvar node_3 = $.sibling(node_2);\n\n\t{\n\t\tvar consequent_1 = ($$anchor) => {\n\t\t\tvar th_2 = root_1();\n\n\t\t\t$.delegated('click', th_2, function (...$$args) {\n\t\t\t\t$$props.onAddColumnClick?.apply(this, $$args);\n\t\t\t});\n\n\t\t\t$.append($$anchor, th_2);\n\t\t};\n\n\t\t$.if(node_3, ($$render) => {\n\t\t\tif ($$props.onAddColumnClick) $$render(consequent_1);\n\t\t});\n\t}\n\n\t$.next();\n\t$.reset(tr_1);\n\t$.reset(thead);\n\n\tvar tbody = $.sibling(thead);\n\n\t$.each(tbody, 23, () => sheetState().document.rows, (row) => row.id, ($$anchor, row, rIdx) => {\n\t\tvar tr_2 = root_6();\n\t\tvar td_1 = $.child(tr_2);\n\t\tvar text_2 = $.only_child(td_1, true);\n\t\tvar node_4 = $.sibling(td_1);\n\n\t\t$.each(node_4, 19, () => sheetState().document.columns, (col) => col.id, ($$anchor, col, cIdx) => {\n\t\t\tconst cell = $.derived(() => sheetState().getCell($.get(row).id, $.get(col).id));\n\t\t\tconst selected = $.derived(() => isCellSelected($.get(rIdx), $.get(cIdx)));\n\t\t\tconst active = $.derived(() => isActiveCell($.get(rIdx), $.get(cIdx)));\n\t\t\tconst isEditing = $.derived(() => sheetState().editingCell?.row === $.get(rIdx) && sheetState().editingCell?.col === $.get(cIdx));\n\t\t\tvar td_2 = root_4();\n\t\t\tvar node_5 = $.child(td_2);\n\n\t\t\t{\n\t\t\t\tvar consequent_2 = ($$anchor) => {\n\t\t\t\t\tvar input = root_2();\n\n\t\t\t\t\t$.remove_input_defaults(input);\n\t\t\t\t\t$.event('blur', input, () => sheetState().commitEditing());\n\t\t\t\t\t$.bind_value(input, () => sheetState().draftValue, ($$value) => sheetState().draftValue = $$value);\n\t\t\t\t\t$.append($$anchor, input);\n\t\t\t\t};\n\n\t\t\t\tvar consequent_3 = ($$anchor) => {\n\t\t\t\t\tconst cellArg = $.derived(() => Object.assign({ row: $.get(row), col: $.get(col), cell: $.get(cell) }, $.get(cell)));\n\t\t\t\t\tvar fragment_1 = $.comment();\n\t\t\t\t\tvar node_6 = $.first_child(fragment_1);\n\n\t\t\t\t\t$.snippet(node_6, () => $$props.customCellRenderer, () => $.get(cellArg), () => $.get(col), () => $.get(row));\n\t\t\t\t\t$.append($$anchor, fragment_1);\n\t\t\t\t};\n\n\t\t\t\tvar alternate = ($$anchor) => {\n\t\t\t\t\tvar span_2 = root_3();\n\t\t\t\t\tvar text_3 = $.only_child(span_2, true);\n\n\t\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t\t$.set_class(span_2, 1, `truncate block max-w-full ${$.get(cell).error ? 'text-destructive font-semibold' : ''}`);\n\t\t\t\t\t\t$.set_text(text_3, $.get(cell).error || ($.get(cell).value ?? ''));\n\t\t\t\t\t});\n\n\t\t\t\t\t$.append($$anchor, span_2);\n\t\t\t\t};\n\n\t\t\t\t$.if(node_5, ($$render) => {\n\t\t\t\t\tif ($.get(isEditing)) $$render(consequent_2); else if ($$props.customCellRenderer) $$render(consequent_3, 1); else $$render(alternate, -1);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t$.reset(td_2);\n\t\t\t$.template_effect(() => $.set_class(td_2, 1, `relative border-r border-border px-2 py-1 truncate max-w-0 text-foreground transition-colors ${$.get(selected) ? 'bg-primary/10' : ''} ${$.get(active) ? 'ring-2 ring-primary ring-inset z-10' : ''}`, 'svelte-m799ch'));\n\t\t\t$.delegated('click', td_2, (e) => handleCellClick($.get(rIdx), $.get(cIdx), e));\n\t\t\t$.delegated('dblclick', td_2, () => handleCellDblClick($.get(rIdx), $.get(cIdx)));\n\t\t\t$.append($$anchor, td_2);\n\t\t});\n\n\t\tvar node_7 = $.sibling(node_4);\n\n\t\t{\n\t\t\tvar consequent_4 = ($$anchor) => {\n\t\t\t\tvar td_3 = root_5();\n\n\t\t\t\t$.append($$anchor, td_3);\n\t\t\t};\n\n\t\t\t$.if(node_7, ($$render) => {\n\t\t\t\tif ($$props.onAddColumnClick) $$render(consequent_4);\n\t\t\t});\n\t\t}\n\n\t\t$.next();\n\t\t$.reset(tr_2);\n\n\t\t$.template_effect(() => {\n\t\t\t$.set_style(tr_2, `height: ${($.get(row).height || 32) ?? ''}px;`);\n\t\t\t$.set_text(text_2, $.get(rIdx) + 1);\n\t\t});\n\n\t\t$.append($$anchor, tr_2);\n\t});\n\n\t$.reset(tbody);\n\t$.reset(table_1);\n\t$.reset(div_1);\n\t$.reset(div);\n\t$.bind_this(div, ($$value) => $.set(gridContainer, $$value), () => $.get(gridContainer));\n\t$.template_effect(() => $.set_class(div, 1, `flex flex-col h-full w-full overflow-hidden border border-border bg-background select-none outline-none text-foreground font-sans text-xs ${className() ?? ''}`, 'svelte-m799ch'));\n\t$.delegated('keydown', div, handleKeyDown);\n\t$.append($$anchor, div);\n\t$.pop();\n}\n\n$.delegate(['keydown', 'click', 'dblclick', 'mousedown']);","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { indexToColName } from '@pixerate/editor';\n\nvar root = $.from_html(`<div><div class=\"flex h-6 min-w-[3rem] items-center justify-center rounded border border-border bg-background px-1.5 font-semibold text-foreground\"> </div> <div class=\"flex items-center text-muted-foreground select-none\"><span class=\"italic font-serif font-bold text-sm text-primary\">fx</span></div> <input type=\"text\" class=\"flex-1 bg-transparent px-2 py-0.5 outline-none font-sans text-xs text-foreground placeholder:text-muted-foreground/60 focus:bg-background focus:ring-1 focus:ring-primary rounded\" placeholder=\"Enter a value or formula (e.g. =SUM(A1:A5))\"/></div>`);\n\nexport default function FormulaBar($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet sheetState = $.prop($$props, 'sheetState', 7),\n\t\tactiveCoord = $.prop($$props, 'activeCoord', 3, null),\n\t\tvalue = $.prop($$props, 'value', 15, ''),\n\t\tclassName = $.prop($$props, 'class', 3, '');\n\n\tlet effectiveCoord = $.derived(() => {\n\t\tif (sheetState()) return sheetState().activeCell;\n\n\t\treturn activeCoord();\n\t});\n\n\tlet coordLabel = $.derived(() => {\n\t\tif (!$.get(effectiveCoord)) return '--';\n\n\t\tconst colName = indexToColName($.get(effectiveCoord).col);\n\n\t\treturn `${colName}${$.get(effectiveCoord).row + 1}`;\n\t});\n\n\tlet effectiveValue = $.derived(() => {\n\t\tif (sheetState()) {\n\t\t\tif (sheetState().editingCell) return sheetState().draftValue;\n\t\t\tif (!sheetState().activeCell) return '';\n\n\t\t\tconst row = sheetState().document.rows[sheetState().activeCell.row];\n\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\tif (!row || !col) return '';\n\n\t\t\treturn sheetState().getCell(row.id, col.id).raw || '';\n\t\t}\n\n\t\treturn value();\n\t});\n\n\tfunction handleKeyDown(e) {\n\t\tif (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\n\t\t\tif (sheetState() && sheetState().activeCell) {\n\t\t\t\tconst row = sheetState().document.rows[sheetState().activeCell.row];\n\t\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\t\tif (row && col) {\n\t\t\t\t\tsheetState().setCellValue(row.id, col.id, $.get(effectiveValue));\n\t\t\t\t}\n\n\t\t\t\tsheetState().commitEditing();\n\t\t\t}\n\n\t\t\t$$props.onCommit?.($.get(effectiveValue));\n\t\t} else if (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\n\t\t\tif (sheetState()) {\n\t\t\t\tsheetState().cancelEditing();\n\t\t\t}\n\n\t\t\t$$props.onCancel?.();\n\t\t}\n\t}\n\n\tfunction handleInput(e) {\n\t\tconst target = e.target;\n\n\t\tif (sheetState()) {\n\t\t\tsheetState().draftValue = target.value;\n\n\t\t\tif (sheetState().activeCell && !sheetState().editingCell) {\n\t\t\t\tsheetState().startEditing(sheetState().activeCell.row, sheetState().activeCell.col, target.value);\n\t\t\t}\n\t\t} else {\n\t\t\tvalue(target.value);\n\t\t}\n\n\t\t$$props.onChange?.(target.value);\n\t}\n\n\tvar div = root();\n\tvar div_1 = $.child(div);\n\tvar text = $.only_child(div_1, true);\n\tvar input = $.sibling(div_1, 4);\n\n\t$.remove_input_defaults(input);\n\t$.reset(div);\n\n\t$.template_effect(() => {\n\t\t$.set_class(div, 1, `flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1.5 text-xs font-mono ${className() ?? ''}`);\n\t\t$.set_text(text, $.get(coordLabel));\n\t\t$.set_value(input, $.get(effectiveValue));\n\t});\n\n\t$.delegated('input', input, handleInput);\n\t$.delegated('keydown', input, handleKeyDown);\n\t$.append($$anchor, div);\n\t$.pop();\n}\n\n$.delegate(['input', 'keydown']);","import {\n SpreadsheetController\n} from \"@pixerate/editor\";\nexport function createReactiveSpreadsheet(options = {}) {\n let doc = $state({\n id: options.document?.id || `sheet_${Date.now()}`,\n name: options.document?.name || \"Sheet 1\",\n columns: options.document?.columns || [],\n rows: options.document?.rows || [],\n cells: options.document?.cells || {},\n createdAt: options.document?.createdAt || Date.now(),\n updatedAt: options.document?.updatedAt || Date.now()\n });\n let activeCell = $state(null);\n let selectedRange = $state(null);\n let editingCell = $state(null);\n let draftValue = $state(\"\");\n const controller = new SpreadsheetController({\n ...options,\n document: options.document,\n onDocumentChange: (updated) => {\n doc = { ...updated };\n options.onDocumentChange?.(updated);\n },\n onSelectionChange: (active, range) => {\n activeCell = active;\n selectedRange = range;\n options.onSelectionChange?.(active, range);\n },\n onCellCommit: (rowId, colId, raw, value) => {\n options.onCellCommit?.(rowId, colId, raw, value);\n }\n });\n doc = { ...controller.document };\n activeCell = controller.activeCell;\n selectedRange = controller.selectedRange;\n return {\n get document() {\n return doc;\n },\n get activeCell() {\n return activeCell;\n },\n get selectedRange() {\n return selectedRange;\n },\n get editingCell() {\n return editingCell;\n },\n get draftValue() {\n return draftValue;\n },\n set draftValue(val) {\n draftValue = val;\n controller.draftValue = val;\n },\n controller,\n getCell(rowId, colId) {\n return controller.getCell(rowId, colId);\n },\n setCellValue(rowId, colId, raw) {\n controller.setCellValue(rowId, colId, raw);\n doc = { ...controller.document };\n },\n selectCell(row, col, extendSelection = false) {\n controller.selectCell(row, col, extendSelection);\n activeCell = controller.activeCell;\n selectedRange = controller.selectedRange;\n },\n selectRange(range) {\n controller.selectRange(range);\n selectedRange = controller.selectedRange;\n },\n startEditing(row, col, initialVal) {\n controller.startEditing(row, col, initialVal);\n activeCell = controller.activeCell;\n editingCell = controller.editingCell;\n draftValue = controller.draftValue;\n },\n commitEditing(val) {\n controller.commitEditing(val);\n editingCell = null;\n draftValue = \"\";\n doc = { ...controller.document };\n },\n cancelEditing() {\n controller.cancelEditing();\n editingCell = null;\n draftValue = \"\";\n },\n moveCursor(dir, extend = false) {\n controller.moveCursor(dir, extend);\n activeCell = controller.activeCell;\n selectedRange = controller.selectedRange;\n },\n insertColumn(index, config) {\n controller.insertColumn(index, config);\n doc = { ...controller.document };\n },\n deleteColumn(colId) {\n controller.deleteColumn(colId);\n doc = { ...controller.document };\n },\n insertRow(index, config) {\n controller.insertRow(index, config);\n doc = { ...controller.document };\n },\n deleteRow(rowId) {\n controller.deleteRow(rowId);\n doc = { ...controller.document };\n },\n setColumnWidth(colId, width) {\n controller.setColumnWidth(colId, width);\n doc = { ...controller.document };\n },\n autoFitColumnWidth(colId, customWidth) {\n controller.autoFitColumnWidth(colId, customWidth);\n doc = { ...controller.document };\n },\n loadDocument(document) {\n controller.loadDocument(document);\n doc = { ...controller.document };\n activeCell = controller.activeCell;\n selectedRange = controller.selectedRange;\n editingCell = controller.editingCell;\n draftValue = controller.draftValue;\n },\n syncWithDataSource() {\n controller.syncWithDataSource();\n controller.recalculateAll();\n doc = { ...controller.document };\n },\n registerDataSource(ds) {\n controller.registerDataSource(ds);\n doc = { ...controller.document };\n },\n setPrimaryDataSource(id) {\n controller.setPrimaryDataSource(id);\n doc = { ...controller.document };\n },\n recalculateAll() {\n controller.recalculateAll();\n doc = { ...controller.document };\n },\n exportToTsv() {\n return controller.exportToTsv();\n },\n importFromTsv(data) {\n controller.importFromTsv(data);\n doc = { ...controller.document };\n },\n undo() {\n controller.undo();\n doc = { ...controller.document };\n },\n redo() {\n controller.redo();\n doc = { ...controller.document };\n }\n };\n}\n"],"mappings":"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","names":["$","$$anchor","$","root","$$anchor","$","root","root_1","$$anchor","$","indexToColName","$","root","index","document","root","root_1","root_2","root_3","root_4","$$anchor","EditableTextNodeEditor","BubbleMenu","TemplateRenderer"]}
1
+ {"version":3,"sources":["../src/EditableTextNodeEditor.svelte","../src/editor.svelte.ts","../src/BubbleMenu.svelte","../src/TemplateRenderer.svelte","../src/navigationGuard.ts","../src/createNavigationGuard.svelte.ts","../src/history/history.svelte.ts","../src/history/createHistoryShortcuts.ts","../src/index.ts","../src/spreadsheet/SpreadsheetEditor.svelte","../src/spreadsheet/FormulaBar.svelte","../src/spreadsheet/spreadsheet.svelte.ts"],"sourcesContent":["import 'EditableTextNodeEditor.svelte.css';import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { onDestroy, onMount } from \"svelte\";\nimport { initiateEditor } from \"./editor.svelte\";\n\nvar root = $.from_html(`<div class=\"flex items-center justify-center p-4 text-sm text-gray-500\">Loading editor...</div>`);\nvar root_1 = $.from_html(`<div draggable=\"false\"><!> <div></div></div>`);\n\nexport default function EditableTextNodeEditor($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet className = $.prop($$props, 'class', 3, \"\"),\n\t\teditorClass = $.prop($$props, 'editorClass', 3, \"\"),\n\t\tcontent = $.prop($$props, 'content', 3, undefined),\n\t\tshowMenu = $.prop($$props, 'showMenu', 3, true),\n\t\teditable = $.prop($$props, 'editable', 3, true),\n\t\teditor = $.prop($$props, 'editor', 15),\n\t\textensions = $.prop($$props, 'extensions', 19, () => []),\n\t\tplaceholder = $.prop($$props, 'placeholder', 3, \"\"),\n\t\tmarkdown = $.prop($$props, 'markdown', 3, undefined),\n\t\trichTextOptions = $.prop($$props, 'richTextOptions', 19, () => ({})),\n\t\tautofocus = $.prop($$props, 'autofocus', 3, false),\n\t\timage = $.prop($$props, 'image', 3, undefined),\n\t\tuploadImage = $.prop($$props, 'uploadImage', 3, undefined),\n\t\tonUploadError = $.prop($$props, 'onUploadError', 3, undefined);\n\n\tlet element = $.state(void 0);\n\n\t$.user_effect(() => {\n\t\tif (editor() && editor().isEditable !== editable()) {\n\t\t\teditor().setEditable(editable());\n\t\t}\n\t});\n\n\tonMount(() => {\n\t\teditor(initiateEditor($.get(element), content(), extensions(), {\n\t\t\trichTextOptions: {\n\t\t\t\tplaceholder: placeholder(),\n\t\t\t\t...markdown() !== undefined ? { markdown: markdown() } : {},\n\t\t\t\t...image() !== undefined || uploadImage() !== undefined || onUploadError() !== undefined\n\t\t\t\t\t? {\n\t\t\t\t\t\timage: image() === false\n\t\t\t\t\t\t\t? false\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t...typeof image() === \"object\" ? image() : {},\n\t\t\t\t\t\t\t\t...uploadImage() ? { upload: uploadImage() } : {},\n\t\t\t\t\t\t\t\t...onUploadError() ? { onUploadError: onUploadError() } : {}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t: {},\n\t\t\t\t...richTextOptions()\n\t\t\t},\n\t\t\teditable: editable(),\n\t\t\tautofocus: autofocus(),\n\t\t\tonCreate: $$props.onCreate,\n\t\t\tonUpdate: $$props.onUpdate,\n\t\t\tonFocus() {\n\t\t\t\tif ($$props.onFocus) $$props.onFocus();\n\t\t\t},\n\n\t\t\tonBlur() {\n\t\t\t\tif ($$props.onBlur) $$props.onBlur();\n\t\t\t}\n\t\t}));\n\t});\n\n\tonDestroy(() => {\n\t\tif (editor()) {\n\t\t\teditor().destroy();\n\t\t}\n\t});\n\n\tvar div = root_1();\n\tvar node = $.child(div);\n\n\t{\n\t\tvar consequent = ($$anchor) => {\n\t\t\tvar div_1 = root();\n\n\t\t\t$.append($$anchor, div_1);\n\t\t};\n\n\t\t$.if(node, ($$render) => {\n\t\t\tif (!editor()) $$render(consequent);\n\t\t});\n\t}\n\n\tvar div_2 = $.sibling(node, 2);\n\n\t$.bind_this(div_2, ($$value) => $.set(element, $$value), () => $.get(element));\n\t$.reset(div);\n\n\t$.template_effect(\n\t\t($0) => {\n\t\t\t$.set_class(div, 1, `pixerate-editor-container ${className()}`);\n\t\t\t$.set_class(div_2, 1, $0);\n\t\t},\n\t\t[\n\t\t\t() => $.clsx(`pixerate-editor-content prose dark:prose-invert w-full max-w-none focus:outline-none ${editorClass()}`.trim())\n\t\t]\n\t);\n\n\t$.append($$anchor, div);\n\t$.pop();\n}","import { Editor } from \"@tiptap/core\";\nimport { createRichTextPreset } from \"@pixerate/editor\";\nexport const initiateEditor = (element, content, extensions, options) => {\n const { richTextOptions, ...editorOptions } = options || {};\n const defaultPreset = createRichTextPreset(richTextOptions);\n const editor = new Editor({\n element,\n content,\n extensions: [\n ...defaultPreset,\n ...extensions ?? []\n ],\n autofocus: false,\n ...editorOptions\n });\n return editor;\n};\nexport function createReactiveEditor(initialContent = \"\", extensions = [], options = {}) {\n let editorInstance;\n return {\n get current() {\n return editorInstance;\n },\n mount(element) {\n editorInstance = initiateEditor(element, initialContent, extensions, options);\n return editorInstance;\n },\n destroy() {\n if (editorInstance) {\n editorInstance.destroy();\n editorInstance = void 0;\n }\n }\n };\n}\n","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { BubbleMenuPlugin } from \"@tiptap/extension-bubble-menu\";\n\nvar root = $.from_html(`<div style=\"visibility: hidden;\"><!></div>`);\n\nexport default function BubbleMenu($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet className = $.prop($$props, 'class', 3, \"flex h-fit w-fit items-center gap-1 rounded-md border border-gray-200 bg-white p-1 shadow-md\"),\n\t\tpluginKey = $.prop($$props, 'pluginKey', 3, \"bubbleMenu\"),\n\t\tshouldShow = $.prop($$props, 'shouldShow', 3, null),\n\t\tupdateDelay = $.prop($$props, 'updateDelay', 3, 250),\n\t\ttippyOptions = $.prop($$props, 'tippyOptions', 19, () => ({}));\n\n\tlet menuElement = $.state(void 0);\n\n\t$.user_effect(() => {\n\t\tif ($$props.editor && $.get(menuElement)) {\n\t\t\tconst plugin = BubbleMenuPlugin({\n\t\t\t\tpluginKey: pluginKey(),\n\t\t\t\teditor: $$props.editor,\n\t\t\t\telement: $.get(menuElement),\n\t\t\t\ttippyOptions: {\n\t\t\t\t\tduration: 100,\n\t\t\t\t\tappendTo: () => document.body,\n\t\t\t\t\t...tippyOptions()\n\t\t\t\t},\n\t\t\t\tshouldShow: shouldShow(),\n\t\t\t\tupdateDelay: updateDelay()\n\t\t\t});\n\n\t\t\t$$props.editor.registerPlugin(plugin);\n\n\t\t\treturn () => {\n\t\t\t\t$$props.editor.unregisterPlugin(pluginKey());\n\t\t\t};\n\t\t}\n\t});\n\n\tvar div = root();\n\tvar node = $.child(div);\n\n\t{\n\t\tvar consequent = ($$anchor) => {\n\t\t\tvar fragment = $.comment();\n\t\t\tvar node_1 = $.first_child(fragment);\n\n\t\t\t$.snippet(node_1, () => $$props.children);\n\t\t\t$.append($$anchor, fragment);\n\t\t};\n\n\t\t$.if(node, ($$render) => {\n\t\t\tif ($$props.children) $$render(consequent);\n\t\t});\n\t}\n\n\t$.reset(div);\n\t$.bind_this(div, ($$value) => $.set(menuElement, $$value), () => $.get(menuElement));\n\t$.template_effect(() => $.set_class(div, 1, $.clsx(className())));\n\t$.append($$anchor, div);\n\t$.pop();\n}","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { tokenizePrompt, resolveTemplates } from \"@pixerate/editor\";\n\nvar root = $.from_html(`<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 text-xs font-semibold rounded-md border border-[var(--color-to)]/40 bg-gradient-to-r from-[var(--color-from)]/15 to-[var(--color-to)]/15 text-[var(--color-to)] hover:brightness-110 cursor-pointer transition-all\"> </span>`);\nvar root_1 = $.from_html(`<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 text-xs font-medium rounded-md border border-violet-400/40 bg-violet-400/15 text-violet-600 hover:brightness-110 cursor-pointer transition-all\"> </span>`);\nvar root_2 = $.from_html(`<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 text-xs italic font-medium rounded-md border border-rose-400/40 bg-rose-400/15 text-rose-600\"> </span>`);\nvar root_3 = $.from_html(`<span> </span>`);\nvar root_4 = $.from_html(`<div></div>`);\n\nexport default function TemplateRenderer($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet templates = $.prop($$props, 'templates', 19, () => []),\n\t\tresolve = $.prop($$props, 'resolve', 3, false),\n\t\tclassName = $.prop($$props, 'class', 3, \"font-mono text-sm leading-relaxed whitespace-pre-wrap break-words\");\n\n\tlet displayText = $.derived(() => resolve() && templates().length > 0\n\t\t? resolveTemplates($$props.content, templates())\n\t\t: $$props.content);\n\n\tlet tokens = $.derived(() => tokenizePrompt($.get(displayText)));\n\tvar div = root_4();\n\n\t$.each(div, 21, () => $.get(tokens), $.index, ($$anchor, token) => {\n\t\tvar fragment = $.comment();\n\t\tvar node = $.first_child(fragment);\n\n\t\t{\n\t\t\tvar consequent = ($$anchor) => {\n\t\t\t\tconst colors = $.derived(() => $$props.templateColorMap?.get($.get(token).value) || { from: \"#f43f5e\", to: \"#8b5cf6\" });\n\t\t\t\tvar span = root();\n\t\t\t\tvar text = $.only_child(span, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_style(span, `--color-from: ${$.get(colors).from}; --color-to: ${$.get(colors).to};`);\n\t\t\t\t\t$.set_attribute(span, 'title', `Template: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text, `{{${$.get(token).value}}}`);\n\t\t\t\t});\n\n\t\t\t\t$.delegated('click', span, () => $$props.onTemplateClick?.($.get(token).value));\n\t\t\t\t$.append($$anchor, span);\n\t\t\t};\n\n\t\t\tvar consequent_1 = ($$anchor) => {\n\t\t\t\tvar span_1 = root_1();\n\t\t\t\tvar text_1 = $.only_child(span_1, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_attribute(span_1, 'title', `Variable: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text_1, `{${$.get(token).value}}`);\n\t\t\t\t});\n\n\t\t\t\t$.delegated('click', span_1, () => $$props.onVariableClick?.($.get(token).value));\n\t\t\t\t$.append($$anchor, span_1);\n\t\t\t};\n\n\t\t\tvar consequent_2 = ($$anchor) => {\n\t\t\t\tvar span_2 = root_2();\n\t\t\t\tvar text_2 = $.only_child(span_2, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_attribute(span_2, 'title', `Instruction: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text_2, `__${$.get(token).value}__`);\n\t\t\t\t});\n\n\t\t\t\t$.append($$anchor, span_2);\n\t\t\t};\n\n\t\t\tvar alternate = ($$anchor) => {\n\t\t\t\tvar span_3 = root_3();\n\t\t\t\tvar text_3 = $.only_child(span_3, true);\n\n\t\t\t\t$.template_effect(() => $.set_text(text_3, $.get(token).value));\n\t\t\t\t$.append($$anchor, span_3);\n\t\t\t};\n\n\t\t\t$.if(node, ($$render) => {\n\t\t\t\tif ($.get(token).type === \"template\") $$render(consequent); else if ($.get(token).type === \"variable\") $$render(consequent_1, 1); else if ($.get(token).type === \"instruction\") $$render(consequent_2, 2); else $$render(alternate, -1);\n\t\t\t});\n\t\t}\n\n\t\t$.append($$anchor, fragment);\n\t});\n\n\t$.reset(div);\n\t$.template_effect(() => $.set_class(div, 1, $.clsx(className())));\n\t$.append($$anchor, div);\n\t$.pop();\n}\n\n$.delegate(['click']);","export interface NavigationGuardOptions {\n /** Whether the current form or editor has unsaved changes */\n isDirty: boolean;\n /** Whether guarding is enabled (defaults to true) */\n enabled?: boolean;\n /** Callback fired when an internal navigation attempt is intercepted */\n onBlocked?: (url: string) => void;\n}\n\nexport interface NavigationGuardActionReturn {\n update(newOptions: NavigationGuardOptions): void;\n destroy(): void;\n}\n\n/**\n * Svelte action to guard against navigation when there are unsaved changes.\n * Attaches beforeunload to window and intercepts internal anchor clicks on the element.\n *\n * Usage:\n * <div use:navigationGuard={{ isDirty, onBlocked: (url) => { pendingUrl = url; showConfirm = true; } }}>\n */\nexport function navigationGuard(\n node: HTMLElement,\n options: NavigationGuardOptions,\n): NavigationGuardActionReturn {\n let isDirty = options.isDirty;\n let enabled = options.enabled ?? true;\n let onBlocked = options.onBlocked;\n\n function handleBeforeUnload(e: BeforeUnloadEvent) {\n if (!enabled || !isDirty) return;\n e.preventDefault();\n e.returnValue = \"\";\n }\n\n function handleClick(e: MouseEvent) {\n if (!enabled || !isDirty) return;\n\n const target = e.target as HTMLElement | null;\n const anchor = target?.closest?.(\"a\");\n if (!anchor) return;\n if (anchor.target === \"_blank\") return;\n\n // Check if link is internal\n if (typeof window !== \"undefined\") {\n const isInternal = anchor.host === window.location.host;\n if (!isInternal) return;\n\n if (\n anchor.pathname === window.location.pathname &&\n anchor.search === window.location.search\n ) {\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const href = anchor.href;\n onBlocked?.(href);\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n }\n node.addEventListener(\"click\", handleClick, { capture: true });\n\n return {\n update(newOptions: NavigationGuardOptions) {\n isDirty = newOptions.isDirty;\n enabled = newOptions.enabled ?? true;\n onBlocked = newOptions.onBlocked;\n },\n destroy() {\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n }\n node.removeEventListener(\"click\", handleClick, { capture: true });\n },\n };\n}\n","export function createNavigationGuard(options) {\n let showConfirm = $state(false);\n let pendingUrl = $state(null);\n const getIsDirty = () => typeof options.isDirty === \"function\" ? options.isDirty() : options.isDirty;\n const getEnabled = () => typeof options.enabled === \"function\" ? options.enabled() : options.enabled ?? true;\n function handleBeforeUnload(e) {\n if (!getEnabled() || !getIsDirty()) return;\n e.preventDefault();\n e.returnValue = \"\";\n }\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n }\n function intercept(url) {\n if (getEnabled() && getIsDirty()) {\n pendingUrl = url;\n showConfirm = true;\n options.onBlocked?.(url);\n return true;\n }\n return false;\n }\n function confirmLeave() {\n showConfirm = false;\n const target = pendingUrl;\n if (target) {\n if (options.onNavigate) {\n options.onNavigate(target);\n } else if (typeof window !== \"undefined\") {\n window.location.href = target;\n }\n }\n }\n function cancelLeave() {\n showConfirm = false;\n pendingUrl = null;\n }\n function destroy() {\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n }\n }\n return {\n get showConfirm() {\n return showConfirm;\n },\n setShowConfirm(val) {\n showConfirm = val;\n },\n get pendingUrl() {\n return pendingUrl;\n },\n intercept,\n confirmLeave,\n cancelLeave,\n destroy\n };\n}\n","import {\n HistoryManager,\n createHistoryManager\n} from \"@pixerate/editor\";\nexport function createHistory(managerOrOptions) {\n const manager = managerOrOptions instanceof HistoryManager ? managerOrOptions : createHistoryManager(managerOrOptions);\n let state = $state(manager.getState());\n manager.subscribe((newState) => {\n state = newState;\n });\n return {\n get canUndo() {\n return state.canUndo;\n },\n get canRedo() {\n return state.canRedo;\n },\n get undoName() {\n return state.undoName;\n },\n get redoName() {\n return state.redoName;\n },\n get undoCount() {\n return state.undoCount;\n },\n get redoCount() {\n return state.redoCount;\n },\n get manager() {\n return manager;\n },\n undo: () => manager.undo(),\n redo: () => manager.redo(),\n clear: () => manager.clear(),\n execute: (cmd) => manager.execute(cmd),\n executeMerged: (cmd, opts) => manager.executeMerged(cmd, opts),\n batch: (name, fn) => manager.batch(name, fn),\n subscribe: (run) => manager.subscribe(run)\n };\n}\n","import { HistoryManager } from \"@pixerate/editor\";\n\nexport interface HistoryShortcutsOptions {\n /**\n * Whether keyboard shortcuts are enabled. Defaults to true.\n */\n enabled?: boolean;\n /**\n * Target element or window to listen on. Defaults to window.\n */\n target?: Window | HTMLElement | null;\n /**\n * When true (default), shortcuts will not trigger if an <input>, <textarea>,\n * or [contenteditable] element is currently active / focused.\n */\n ignoreEditableElements?: boolean;\n}\n\n/**\n * Attaches keyboard listeners for Undo (Mod+Z) and Redo (Mod+Shift+Z / Mod+Y).\n * Returns an object with a `destroy()` function for lifecycle cleanup.\n */\nexport function createHistoryShortcuts(\n manager: HistoryManager,\n options: HistoryShortcutsOptions = {},\n): { destroy: () => void } {\n const {\n enabled = true,\n target,\n ignoreEditableElements = true,\n } = options;\n\n if (!enabled) {\n return { destroy: () => {} };\n }\n\n const eventTarget = target ?? (typeof window !== \"undefined\" ? window : null);\n if (!eventTarget) {\n return { destroy: () => {} };\n }\n\n const handleKeyDown = (event: Event) => {\n const e = event as KeyboardEvent;\n const isMac =\n typeof navigator !== \"undefined\" &&\n /Mac|iPod|iPhone|iPad/.test(navigator.platform || navigator.userAgent);\n const modifier = isMac ? e.metaKey : e.ctrlKey;\n\n if (!modifier) return;\n\n if (ignoreEditableElements && typeof document !== \"undefined\") {\n const targetEl = (e.target || document.activeElement) as HTMLElement | null;\n if (targetEl && targetEl.tagName) {\n const tagName = targetEl.tagName.toLowerCase();\n const isInput = tagName === \"input\" || tagName === \"textarea\";\n const isContentEditable =\n targetEl.isContentEditable ||\n targetEl.getAttribute?.(\"contenteditable\") === \"true\";\n if (isInput || isContentEditable) {\n return;\n }\n }\n }\n\n const key = e.key?.toLowerCase();\n\n // Undo: Mod+Z (without Shift)\n if (key === \"z\" && !e.shiftKey) {\n if (manager.getState().canUndo) {\n e.preventDefault();\n manager.undo();\n }\n return;\n }\n\n // Redo: Mod+Shift+Z or (on non-Mac) Mod+Y\n const isRedoKey =\n (key === \"z\" && e.shiftKey) || (!isMac && key === \"y\" && !e.shiftKey);\n\n if (isRedoKey) {\n if (manager.getState().canRedo) {\n e.preventDefault();\n manager.redo();\n }\n }\n };\n\n eventTarget.addEventListener(\"keydown\", handleKeyDown);\n\n return {\n destroy: () => {\n eventTarget.removeEventListener(\"keydown\", handleKeyDown);\n },\n };\n}\n","import type { Component } from \"svelte\";\nimport type { Editor, Content, Extensions, FocusPosition } from \"@tiptap/core\";\nimport type {\n Template,\n ColorGradient,\n RichTextPresetOptions,\n MarkdownOptions,\n ImageOptions,\n} from \"@pixerate/editor\";\n\nimport EditableTextNodeEditorComponent from \"./EditableTextNodeEditor.svelte\";\nimport BubbleMenuComponent from \"./BubbleMenu.svelte\";\nimport TemplateRendererComponent from \"./TemplateRenderer.svelte\";\n\nexport * from \"./editor.svelte\";\nexport * from \"./navigationGuard\";\nexport * from \"./createNavigationGuard.svelte\";\nexport * from \"./history\";\n\nexport {\n DirtyTracker,\n createDirtyTracker,\n defaultIsEqual,\n HistoryManager,\n createHistoryManager,\n} from \"@pixerate/editor\";\nexport type {\n DirtyTrackerOptions,\n Command,\n HistoryState,\n HistoryManagerOptions,\n} from \"@pixerate/editor\";\n\nexport interface EditableTextNodeEditorProps {\n class?: string;\n editorClass?: string;\n content?: Content;\n showMenu?: boolean;\n editable?: boolean;\n editor?: Editor;\n extensions?: Extensions;\n onUpdate?: () => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onCreate?: () => void;\n placeholder?: string;\n markdown?: boolean | MarkdownOptions;\n richTextOptions?: RichTextPresetOptions;\n autofocus?: FocusPosition | boolean;\n image?: ImageOptions | boolean;\n uploadImage?: (file: File) => Promise<string> | string;\n onUploadError?: (error: Error, file: File) => void;\n}\n\nexport interface BubbleMenuProps {\n editor?: Editor;\n class?: string;\n children?: any;\n}\n\nexport interface TemplateRendererProps {\n content: string;\n templates?: Template[];\n templateColorMap?: Map<string, ColorGradient>;\n resolve?: boolean;\n class?: string;\n onTemplateClick?: (templateName: string) => void;\n onVariableClick?: (variableName: string) => void;\n}\n\nexport const EditableTextNodeEditor =\n EditableTextNodeEditorComponent as unknown as Component<EditableTextNodeEditorProps>;\nexport const BubbleMenu =\n BubbleMenuComponent as unknown as Component<BubbleMenuProps>;\nexport const TemplateRenderer =\n TemplateRendererComponent as unknown as Component<TemplateRendererProps>;\n\nexport type {\n Template,\n TemplateVersion,\n Token,\n TokenType,\n ColorGradient,\n RichTextPresetOptions,\n ImageOptions,\n} from \"@pixerate/editor\";\n\nexport * from \"./spreadsheet\";\n","import 'SpreadsheetEditor.svelte.css';import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { indexToColName } from '@pixerate/editor';\nimport FormulaBar from './FormulaBar.svelte';\nimport { createReactiveSpreadsheet } from './spreadsheet.svelte';\n\nvar root = $.from_html(`<th><div class=\"flex items-center justify-between gap-1 min-w-0 overflow-hidden truncate\"><span class=\"truncate font-semibold text-foreground text-xs min-w-0\"> </span> <span class=\"text-[10px] text-muted-foreground/70 font-mono font-normal shrink-0\"> </span></div> <div class=\"col-resize-handle svelte-m799ch\" style=\"position: absolute; top: 0; bottom: 0; width: 12px; right: -6px; cursor: col-resize !important; z-index: 20; display: flex; justify-content: center; touch-action: none;\" role=\"separator\" aria-orientation=\"vertical\" tabindex=\"-1\"><div class=\"col-resize-handle-line svelte-m799ch\"></div></div></th>`);\nvar root_1 = $.from_html(`<th class=\"w-10 min-w-[2.5rem] px-1 text-center bg-muted/40 hover:bg-muted cursor-pointer transition-colors svelte-m799ch\" title=\"Add Column\"><span class=\"text-xs font-bold text-muted-foreground\">+</span></th>`);\nvar root_2 = $.from_html(`<input type=\"text\" class=\"absolute inset-0 w-full h-full px-2 py-1 bg-background text-foreground outline-none font-sans text-xs border-2 border-primary z-20\"/>`);\nvar root_3 = $.from_html(`<span> </span>`);\nvar root_4 = $.from_html(`<td style=\"max-width: 0; overflow: hidden;\"><!></td>`);\nvar root_5 = $.from_html(`<td class=\"w-10 min-w-[2.5rem] bg-muted/10 border-r border-border svelte-m799ch\"></td>`);\nvar root_6 = $.from_html(`<tr class=\"border-b border-border hover:bg-muted/10 transition-colors\"><td class=\"w-12 min-w-[3rem] sticky left-0 z-10 bg-muted/50 border-r border-border text-center text-[10px] text-muted-foreground font-mono select-none svelte-m799ch\"> </td><!><!><td class=\"border-b border-border bg-transparent p-0 svelte-m799ch\"></td></tr>`);\nvar root_7 = $.from_html(`<div tabindex=\"0\" role=\"grid\" aria-label=\"Spreadsheet\"><!> <div class=\"relative flex-1 overflow-auto\"><table class=\"border-collapse table-fixed w-max min-w-full svelte-m799ch\"><thead><tr class=\"h-7 bg-muted/60 sticky top-0 z-20 border-b border-border shadow-xs\"><th class=\"w-12 min-w-[3rem] sticky left-0 z-30 bg-muted/90 border-r border-border text-center text-[10px] text-muted-foreground font-medium svelte-m799ch\">#</th><!><!><th class=\"border-b border-border bg-transparent p-0 font-normal svelte-m799ch\"></th></tr></thead><tbody></tbody></table></div></div>`);\n\nexport default function SpreadsheetEditor($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet sheetState = $.prop($$props, 'sheetState', 23, createReactiveSpreadsheet),\n\t\treadOnly = $.prop($$props, 'readOnly', 3, false),\n\t\treadonly = $.prop($$props, 'readonly', 3, false),\n\t\tshowFormulaBar = $.prop($$props, 'showFormulaBar', 3, true),\n\t\tclassName = $.prop($$props, 'class', 3, '');\n\n\tlet isReadOnly = $.derived(() => readOnly() || readonly());\n\tlet gridContainer = $.state(null);\n\tlet resizingColId = $.state(null);\n\tlet hoveredColId = $.state(null);\n\tlet resizeStartX = $.state(0);\n\tlet resizeStartWidth = $.state(0);\n\n\tfunction handleCellClick(rIdx, cIdx, e) {\n\t\tif (sheetState().editingCell && (sheetState().editingCell.row !== rIdx || sheetState().editingCell.col !== cIdx)) {\n\t\t\tsheetState().commitEditing();\n\t\t}\n\n\t\tsheetState().selectCell(rIdx, cIdx, e.shiftKey);\n\t}\n\n\tfunction handleCellDblClick(rIdx, cIdx) {\n\t\tif ($.get(isReadOnly)) return;\n\n\t\tconst col = sheetState().document.columns[cIdx];\n\n\t\tif (col?.readOnly) return;\n\n\t\tsheetState().startEditing(rIdx, cIdx);\n\t}\n\n\tfunction handleKeyDown(e) {\n\t\tif (sheetState().editingCell) {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tsheetState().cancelEditing();\n\t\t\t} else if (e.key === 'Enter') {\n\t\t\t\tsheetState().commitEditing();\n\t\t\t\tsheetState().moveCursor('down');\n\t\t\t} else if (e.key === 'Tab') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsheetState().commitEditing();\n\t\t\t\tsheetState().moveCursor(e.shiftKey ? 'left' : 'right');\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!sheetState().activeCell) return;\n\n\t\tif (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('up', e.shiftKey);\n\t\t} else if (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('down', e.shiftKey);\n\t\t} else if (e.key === 'ArrowLeft') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('left', e.shiftKey);\n\t\t} else if (e.key === 'ArrowRight') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('right', e.shiftKey);\n\t\t} else if (e.key === 'Tab') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor(e.shiftKey ? 'left' : 'right');\n\t\t} else if (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\n\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\tif (!$.get(isReadOnly) && !col?.readOnly) {\n\t\t\t\tsheetState().startEditing();\n\t\t\t}\n\t\t} else if (e.key === 'Backspace' || e.key === 'Delete') {\n\t\t\tif ($.get(isReadOnly)) return;\n\n\t\t\tconst row = sheetState().document.rows[sheetState().activeCell.row];\n\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\tif (row && col && !col.readOnly) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsheetState().setCellValue(row.id, col.id, '');\n\t\t\t}\n\t\t} else if ((e.metaKey || e.ctrlKey) && e.key === 'z') {\n\t\t\te.preventDefault();\n\n\t\t\tif (e.shiftKey) {\n\t\t\t\tsheetState().redo();\n\t\t\t} else {\n\t\t\t\tsheetState().undo();\n\t\t\t}\n\t\t} else if ((e.metaKey || e.ctrlKey) && e.key === 'c') {\n\t\t\te.preventDefault();\n\n\t\t\tconst tsv = sheetState().exportToTsv();\n\n\t\t\tnavigator.clipboard?.writeText(tsv);\n\t\t} else if (!$.get(isReadOnly) && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n\t\t\t// Direct typing into cell starts editing\n\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\tif (!col?.readOnly) {\n\t\t\t\tsheetState().startEditing(sheetState().activeCell.row, sheetState().activeCell.col, e.key);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction handleResizeStart(colId, width, e) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\t$.set(resizingColId, colId, true);\n\t\t$.set(resizeStartX, e.clientX, true);\n\t\t$.set(resizeStartWidth, width, true);\n\n\t\tif (typeof document !== 'undefined') {\n\t\t\tdocument.body.style.cursor = 'col-resize';\n\t\t\tdocument.body.style.userSelect = 'none';\n\t\t}\n\n\t\tlet rafId = null;\n\t\tlet pendingWidth = width;\n\t\tlet hasDragged = false;\n\n\t\tconst handleMouseMove = (moveEvent) => {\n\t\t\tif (!$.get(resizingColId)) return;\n\n\t\t\tconst delta = moveEvent.clientX - $.get(resizeStartX);\n\n\t\t\tif (Math.abs(delta) > 2) {\n\t\t\t\thasDragged = true;\n\t\t\t}\n\n\t\t\tpendingWidth = Math.max(30, $.get(resizeStartWidth) + delta);\n\n\t\t\tif (rafId === null) {\n\t\t\t\trafId = requestAnimationFrame(() => {\n\t\t\t\t\trafId = null;\n\n\t\t\t\t\tif ($.get(resizingColId)) {\n\t\t\t\t\t\tsheetState().setColumnWidth($.get(resizingColId), pendingWidth);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tconst handleMouseUp = () => {\n\t\t\tif (rafId !== null) {\n\t\t\t\tcancelAnimationFrame(rafId);\n\t\t\t\trafId = null;\n\t\t\t}\n\n\t\t\tif ($.get(resizingColId) && hasDragged) {\n\t\t\t\tsheetState().setColumnWidth($.get(resizingColId), pendingWidth);\n\n\t\t\t\tconst col = sheetState().document.columns.find((c) => c.id === $.get(resizingColId));\n\n\t\t\t\tif (col && $$props.onColumnResize) {\n\t\t\t\t\t$$props.onColumnResize(col.id, col.width || pendingWidth);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$.set(resizingColId, null);\n\n\t\t\tif (typeof document !== 'undefined') {\n\t\t\t\tdocument.body.style.cursor = '';\n\t\t\t\tdocument.body.style.userSelect = '';\n\t\t\t}\n\n\t\t\twindow.removeEventListener('mousemove', handleMouseMove);\n\t\t\twindow.removeEventListener('mouseup', handleMouseUp);\n\t\t};\n\n\t\twindow.addEventListener('mousemove', handleMouseMove);\n\t\twindow.addEventListener('mouseup', handleMouseUp);\n\t}\n\n\tfunction measureElementContentWidth(el, container) {\n\t\tif (typeof document === 'undefined') return 0;\n\n\t\tlet maxW = el.scrollWidth || 0;\n\t\tconst firstChild = el.firstElementChild;\n\n\t\tif (firstChild && firstChild.scrollWidth > maxW) {\n\t\t\tmaxW = firstChild.scrollWidth;\n\t\t}\n\n\t\tconst truncated = el.querySelectorAll('.truncate, [title], span, div');\n\n\t\ttruncated.forEach((node) => {\n\t\t\tif (node.scrollWidth > maxW) {\n\t\t\t\tmaxW = node.scrollWidth;\n\t\t\t}\n\t\t});\n\n\t\ttry {\n\t\t\tconst clone = firstChild ? firstChild.cloneNode(true) : el.cloneNode(true);\n\n\t\t\tclone.style.cssText = `\n position: absolute !important;\n visibility: hidden !important;\n width: max-content !important;\n min-width: max-content !important;\n max-width: none !important;\n overflow: visible !important;\n white-space: nowrap !important;\n pointer-events: none !important;\n top: -9999px !important;\n left: -9999px !important;\n `;\n\n\t\t\tconst allNodes = clone.querySelectorAll('*');\n\n\t\t\tallNodes.forEach((node) => {\n\t\t\t\tnode.style.maxWidth = 'none';\n\t\t\t\tnode.style.overflow = 'visible';\n\t\t\t\tnode.style.textOverflow = 'clip';\n\t\t\t\tnode.style.whiteSpace = 'nowrap';\n\n\t\t\t\tif (node.classList.contains('truncate') || node.classList.contains('min-w-0') || node.classList.contains('w-full') || node.classList.contains('max-w-0') || node.classList.contains('flex-1')) {\n\t\t\t\t\tnode.style.width = 'max-content';\n\t\t\t\t\tnode.style.minWidth = 'max-content';\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontainer.appendChild(clone);\n\n\t\t\tconst rect = clone.getBoundingClientRect();\n\n\t\t\tcontainer.removeChild(clone);\n\n\t\t\tif (rect.width > maxW) {\n\t\t\t\tmaxW = rect.width;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore cloning/measuring errors\n\t\t}\n\n\t\treturn maxW;\n\t}\n\n\tfunction autoFitColumn(colId, colIndex) {\n\t\tconst col = sheetState().document.columns.find((c) => c.id === colId);\n\n\t\tif (!col) return;\n\n\t\tlet calculatedWidth = 0;\n\n\t\tif ($.get(gridContainer) && typeof document !== 'undefined') {\n\t\t\tconst table = $.get(gridContainer).querySelector('table');\n\n\t\t\tif (table) {\n\t\t\t\tconst thElements = table.querySelectorAll('thead th');\n\t\t\t\tconst th = thElements[colIndex + 1];\n\n\t\t\t\tif (th) {\n\t\t\t\t\tconst headerInner = th.firstElementChild || th;\n\t\t\t\t\tconst headerW = measureElementContentWidth(headerInner, $.get(gridContainer));\n\n\t\t\t\t\tcalculatedWidth = Math.max(calculatedWidth, headerW + 28);\n\t\t\t\t}\n\n\t\t\t\tconst rows = table.querySelectorAll('tbody tr');\n\t\t\t\tconst sampleLimit = Math.min(rows.length, 150);\n\n\t\t\t\tfor (let r = 0; r < sampleLimit; r++) {\n\t\t\t\t\tconst tr = rows[r];\n\t\t\t\t\tconst td = tr.children[colIndex + 1];\n\n\t\t\t\t\tif (td) {\n\t\t\t\t\t\tconst cellW = measureElementContentWidth(td, $.get(gridContainer));\n\n\t\t\t\t\t\tcalculatedWidth = Math.max(calculatedWidth, cellW + 20);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (calculatedWidth > 0) {\n\t\t\tconst finalWidth = Math.min(600, Math.max(50, Math.ceil(calculatedWidth)));\n\n\t\t\tsheetState().setColumnWidth(colId, finalWidth);\n\t\t} else {\n\t\t\tsheetState().autoFitColumnWidth(colId);\n\t\t}\n\n\t\tconst updatedCol = sheetState().document.columns.find((c) => c.id === colId);\n\n\t\tif (updatedCol && $$props.onColumnResize) {\n\t\t\t$$props.onColumnResize(updatedCol.id, updatedCol.width || 130);\n\t\t}\n\t}\n\n\tfunction handleResizeDblClick(colId, colIndex, e) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tautoFitColumn(colId, colIndex);\n\t}\n\n\tfunction handleHeaderDblClick(colId, colIndex, e) {\n\t\tconst target = e.currentTarget;\n\n\t\tif (target) {\n\t\t\tconst rect = target.getBoundingClientRect();\n\n\t\t\tif (rect.right - e.clientX <= 12) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tautoFitColumn(colId, colIndex);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction isCellSelected(rIdx, cIdx) {\n\t\tif (!sheetState().selectedRange) return false;\n\n\t\tconst minR = Math.min(sheetState().selectedRange.startRow, sheetState().selectedRange.endRow);\n\t\tconst maxR = Math.max(sheetState().selectedRange.startRow, sheetState().selectedRange.endRow);\n\t\tconst minC = Math.min(sheetState().selectedRange.startCol, sheetState().selectedRange.endCol);\n\t\tconst maxC = Math.max(sheetState().selectedRange.startCol, sheetState().selectedRange.endCol);\n\n\t\treturn rIdx >= minR && rIdx <= maxR && cIdx >= minC && cIdx <= maxC;\n\t}\n\n\tfunction isActiveCell(rIdx, cIdx) {\n\t\treturn sheetState().activeCell?.row === rIdx && sheetState().activeCell?.col === cIdx;\n\t}\n\n\tvar div = root_7();\n\tvar node_1 = $.child(div);\n\n\t{\n\t\tvar consequent = ($$anchor) => {\n\t\t\tFormulaBar($$anchor, {\n\t\t\t\tget sheetState() {\n\t\t\t\t\treturn sheetState();\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\t$.if(node_1, ($$render) => {\n\t\t\tif (showFormulaBar()) $$render(consequent);\n\t\t});\n\t}\n\n\tvar div_1 = $.sibling(node_1, 2);\n\tvar table_1 = $.child(div_1);\n\tvar thead = $.child(table_1);\n\tvar tr_1 = $.child(thead);\n\tvar node_2 = $.sibling($.child(tr_1));\n\n\t$.each(node_2, 19, () => sheetState().document.columns, (col) => col.id, ($$anchor, col, cIdx) => {\n\t\tvar th_1 = root();\n\t\tvar div_2 = $.child(th_1);\n\t\tvar span = $.child(div_2);\n\t\tvar text = $.only_child(span, true);\n\t\tvar span_1 = $.sibling(span, 2);\n\t\tvar text_1 = $.only_child(span_1);\n\n\t\t$.reset(div_2);\n\n\t\tvar div_3 = $.sibling(div_2, 2);\n\t\tvar div_4 = $.only_child(div_3);\n\n\t\t$.reset(th_1);\n\n\t\t$.template_effect(() => {\n\t\t\t$.set_class(th_1, 1, `relative border-r border-border px-2 text-left font-medium text-muted-foreground hover:bg-muted/90 transition-colors group overflow-hidden max-w-0 ${$$props.onColumnHeaderClick ? 'cursor-pointer' : 'cursor-default'}`, 'svelte-m799ch');\n\t\t\t$.set_style(th_1, `width: ${($.get(col).width || 130) ?? ''}px; min-width: ${($.get(col).width || 130) ?? ''}px; max-width: ${($.get(col).width || 130) ?? ''}px; overflow: hidden;`);\n\t\t\t$.set_text(text, $.get(col).title);\n\t\t\t$.set_text(text_1, `(${$.get(col).key ?? ''})`);\n\n\t\t\t$.set_style(div_4, `width: 2px; height: 100%; pointer-events: none; transition: background-color 150ms ease; background-color: ${$.get(resizingColId) === $.get(col).id\n\t\t\t\t? 'var(--primary, #6366f1)'\n\t\t\t\t: $.get(hoveredColId) === $.get(col).id\n\t\t\t\t\t? 'color-mix(in srgb, var(--primary, #6366f1) 75%, transparent)'\n\t\t\t\t\t: 'transparent'};`);\n\t\t});\n\n\t\t$.delegated('click', th_1, () => $$props.onColumnHeaderClick?.($.get(col)));\n\t\t$.delegated('dblclick', th_1, (e) => handleHeaderDblClick($.get(col).id, $.get(cIdx), e));\n\t\t$.event('mouseenter', div_3, () => $.set(hoveredColId, $.get(col).id, true));\n\n\t\t$.event('mouseleave', div_3, () => {\n\t\t\tif ($.get(hoveredColId) === $.get(col).id) $.set(hoveredColId, null);\n\t\t});\n\n\t\t$.delegated('mousedown', div_3, (e) => handleResizeStart($.get(col).id, $.get(col).width || 130, e));\n\t\t$.delegated('dblclick', div_3, (e) => handleResizeDblClick($.get(col).id, $.get(cIdx), e));\n\t\t$.append($$anchor, th_1);\n\t});\n\n\tvar node_3 = $.sibling(node_2);\n\n\t{\n\t\tvar consequent_1 = ($$anchor) => {\n\t\t\tvar th_2 = root_1();\n\n\t\t\t$.delegated('click', th_2, function (...$$args) {\n\t\t\t\t$$props.onAddColumnClick?.apply(this, $$args);\n\t\t\t});\n\n\t\t\t$.append($$anchor, th_2);\n\t\t};\n\n\t\t$.if(node_3, ($$render) => {\n\t\t\tif ($$props.onAddColumnClick) $$render(consequent_1);\n\t\t});\n\t}\n\n\t$.next();\n\t$.reset(tr_1);\n\t$.reset(thead);\n\n\tvar tbody = $.sibling(thead);\n\n\t$.each(tbody, 23, () => sheetState().document.rows, (row) => row.id, ($$anchor, row, rIdx) => {\n\t\tvar tr_2 = root_6();\n\t\tvar td_1 = $.child(tr_2);\n\t\tvar text_2 = $.only_child(td_1, true);\n\t\tvar node_4 = $.sibling(td_1);\n\n\t\t$.each(node_4, 19, () => sheetState().document.columns, (col) => col.id, ($$anchor, col, cIdx) => {\n\t\t\tconst cell = $.derived(() => sheetState().getCell($.get(row).id, $.get(col).id));\n\t\t\tconst selected = $.derived(() => isCellSelected($.get(rIdx), $.get(cIdx)));\n\t\t\tconst active = $.derived(() => isActiveCell($.get(rIdx), $.get(cIdx)));\n\t\t\tconst isEditing = $.derived(() => sheetState().editingCell?.row === $.get(rIdx) && sheetState().editingCell?.col === $.get(cIdx));\n\t\t\tvar td_2 = root_4();\n\t\t\tvar node_5 = $.child(td_2);\n\n\t\t\t{\n\t\t\t\tvar consequent_2 = ($$anchor) => {\n\t\t\t\t\tvar input = root_2();\n\n\t\t\t\t\t$.remove_input_defaults(input);\n\t\t\t\t\t$.event('blur', input, () => sheetState().commitEditing());\n\t\t\t\t\t$.bind_value(input, () => sheetState().draftValue, ($$value) => sheetState().draftValue = $$value);\n\t\t\t\t\t$.append($$anchor, input);\n\t\t\t\t};\n\n\t\t\t\tvar consequent_3 = ($$anchor) => {\n\t\t\t\t\tconst cellArg = $.derived(() => Object.assign({ row: $.get(row), col: $.get(col), cell: $.get(cell) }, $.get(cell)));\n\t\t\t\t\tvar fragment_1 = $.comment();\n\t\t\t\t\tvar node_6 = $.first_child(fragment_1);\n\n\t\t\t\t\t$.snippet(node_6, () => $$props.customCellRenderer, () => $.get(cellArg), () => $.get(col), () => $.get(row));\n\t\t\t\t\t$.append($$anchor, fragment_1);\n\t\t\t\t};\n\n\t\t\t\tvar alternate = ($$anchor) => {\n\t\t\t\t\tvar span_2 = root_3();\n\t\t\t\t\tvar text_3 = $.only_child(span_2, true);\n\n\t\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t\t$.set_class(span_2, 1, `truncate block max-w-full ${$.get(cell).error ? 'text-destructive font-semibold' : ''}`);\n\t\t\t\t\t\t$.set_text(text_3, $.get(cell).error || ($.get(cell).value ?? ''));\n\t\t\t\t\t});\n\n\t\t\t\t\t$.append($$anchor, span_2);\n\t\t\t\t};\n\n\t\t\t\t$.if(node_5, ($$render) => {\n\t\t\t\t\tif ($.get(isEditing)) $$render(consequent_2); else if ($$props.customCellRenderer) $$render(consequent_3, 1); else $$render(alternate, -1);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t$.reset(td_2);\n\t\t\t$.template_effect(() => $.set_class(td_2, 1, `relative border-r border-border px-2 py-1 truncate max-w-0 text-foreground transition-colors ${$.get(selected) ? 'bg-primary/10' : ''} ${$.get(active) ? 'ring-2 ring-primary ring-inset z-10' : ''}`, 'svelte-m799ch'));\n\t\t\t$.delegated('click', td_2, (e) => handleCellClick($.get(rIdx), $.get(cIdx), e));\n\t\t\t$.delegated('dblclick', td_2, () => handleCellDblClick($.get(rIdx), $.get(cIdx)));\n\t\t\t$.append($$anchor, td_2);\n\t\t});\n\n\t\tvar node_7 = $.sibling(node_4);\n\n\t\t{\n\t\t\tvar consequent_4 = ($$anchor) => {\n\t\t\t\tvar td_3 = root_5();\n\n\t\t\t\t$.append($$anchor, td_3);\n\t\t\t};\n\n\t\t\t$.if(node_7, ($$render) => {\n\t\t\t\tif ($$props.onAddColumnClick) $$render(consequent_4);\n\t\t\t});\n\t\t}\n\n\t\t$.next();\n\t\t$.reset(tr_2);\n\n\t\t$.template_effect(() => {\n\t\t\t$.set_style(tr_2, `height: ${($.get(row).height || 32) ?? ''}px;`);\n\t\t\t$.set_text(text_2, $.get(rIdx) + 1);\n\t\t});\n\n\t\t$.append($$anchor, tr_2);\n\t});\n\n\t$.reset(tbody);\n\t$.reset(table_1);\n\t$.reset(div_1);\n\t$.reset(div);\n\t$.bind_this(div, ($$value) => $.set(gridContainer, $$value), () => $.get(gridContainer));\n\t$.template_effect(() => $.set_class(div, 1, `flex flex-col h-full w-full overflow-hidden border border-border bg-background select-none outline-none text-foreground font-sans text-xs ${className() ?? ''}`, 'svelte-m799ch'));\n\t$.delegated('keydown', div, handleKeyDown);\n\t$.append($$anchor, div);\n\t$.pop();\n}\n\n$.delegate(['keydown', 'click', 'dblclick', 'mousedown']);","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { indexToColName } from '@pixerate/editor';\n\nvar root = $.from_html(`<div><div class=\"flex h-6 min-w-[3rem] items-center justify-center rounded border border-border bg-background px-1.5 font-semibold text-foreground\"> </div> <div class=\"flex items-center text-muted-foreground select-none\"><span class=\"italic font-serif font-bold text-sm text-primary\">fx</span></div> <input type=\"text\" class=\"flex-1 bg-transparent px-2 py-0.5 outline-none font-sans text-xs text-foreground placeholder:text-muted-foreground/60 focus:bg-background focus:ring-1 focus:ring-primary rounded\" placeholder=\"Enter a value or formula (e.g. =SUM(A1:A5))\"/></div>`);\n\nexport default function FormulaBar($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet sheetState = $.prop($$props, 'sheetState', 7),\n\t\tactiveCoord = $.prop($$props, 'activeCoord', 3, null),\n\t\tvalue = $.prop($$props, 'value', 15, ''),\n\t\tclassName = $.prop($$props, 'class', 3, '');\n\n\tlet effectiveCoord = $.derived(() => {\n\t\tif (sheetState()) return sheetState().activeCell;\n\n\t\treturn activeCoord();\n\t});\n\n\tlet coordLabel = $.derived(() => {\n\t\tif (!$.get(effectiveCoord)) return '--';\n\n\t\tconst colName = indexToColName($.get(effectiveCoord).col);\n\n\t\treturn `${colName}${$.get(effectiveCoord).row + 1}`;\n\t});\n\n\tlet effectiveValue = $.derived(() => {\n\t\tif (sheetState()) {\n\t\t\tif (sheetState().editingCell) return sheetState().draftValue;\n\t\t\tif (!sheetState().activeCell) return '';\n\n\t\t\tconst row = sheetState().document.rows[sheetState().activeCell.row];\n\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\tif (!row || !col) return '';\n\n\t\t\treturn sheetState().getCell(row.id, col.id).raw || '';\n\t\t}\n\n\t\treturn value();\n\t});\n\n\tfunction handleKeyDown(e) {\n\t\tif (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\n\t\t\tif (sheetState() && sheetState().activeCell) {\n\t\t\t\tconst row = sheetState().document.rows[sheetState().activeCell.row];\n\t\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\t\tif (row && col) {\n\t\t\t\t\tsheetState().setCellValue(row.id, col.id, $.get(effectiveValue));\n\t\t\t\t}\n\n\t\t\t\tsheetState().commitEditing();\n\t\t\t}\n\n\t\t\t$$props.onCommit?.($.get(effectiveValue));\n\t\t} else if (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\n\t\t\tif (sheetState()) {\n\t\t\t\tsheetState().cancelEditing();\n\t\t\t}\n\n\t\t\t$$props.onCancel?.();\n\t\t}\n\t}\n\n\tfunction handleInput(e) {\n\t\tconst target = e.target;\n\n\t\tif (sheetState()) {\n\t\t\tsheetState().draftValue = target.value;\n\n\t\t\tif (sheetState().activeCell && !sheetState().editingCell) {\n\t\t\t\tsheetState().startEditing(sheetState().activeCell.row, sheetState().activeCell.col, target.value);\n\t\t\t}\n\t\t} else {\n\t\t\tvalue(target.value);\n\t\t}\n\n\t\t$$props.onChange?.(target.value);\n\t}\n\n\tvar div = root();\n\tvar div_1 = $.child(div);\n\tvar text = $.only_child(div_1, true);\n\tvar input = $.sibling(div_1, 4);\n\n\t$.remove_input_defaults(input);\n\t$.reset(div);\n\n\t$.template_effect(() => {\n\t\t$.set_class(div, 1, `flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1.5 text-xs font-mono ${className() ?? ''}`);\n\t\t$.set_text(text, $.get(coordLabel));\n\t\t$.set_value(input, $.get(effectiveValue));\n\t});\n\n\t$.delegated('input', input, handleInput);\n\t$.delegated('keydown', input, handleKeyDown);\n\t$.append($$anchor, div);\n\t$.pop();\n}\n\n$.delegate(['input', 'keydown']);","import {\n SpreadsheetController\n} from \"@pixerate/editor\";\nexport function createReactiveSpreadsheet(options = {}) {\n let doc = $state({\n id: options.document?.id || `sheet_${Date.now()}`,\n name: options.document?.name || \"Sheet 1\",\n columns: options.document?.columns || [],\n rows: options.document?.rows || [],\n cells: options.document?.cells || {},\n createdAt: options.document?.createdAt || Date.now(),\n updatedAt: options.document?.updatedAt || Date.now()\n });\n let activeCell = $state(null);\n let selectedRange = $state(null);\n let editingCell = $state(null);\n let draftValue = $state(\"\");\n const controller = new SpreadsheetController({\n ...options,\n document: options.document,\n onDocumentChange: (updated) => {\n doc = { ...updated };\n options.onDocumentChange?.(updated);\n },\n onSelectionChange: (active, range) => {\n activeCell = active;\n selectedRange = range;\n options.onSelectionChange?.(active, range);\n },\n onCellCommit: (rowId, colId, raw, value) => {\n options.onCellCommit?.(rowId, colId, raw, value);\n }\n });\n doc = { ...controller.document };\n activeCell = controller.activeCell;\n selectedRange = controller.selectedRange;\n return {\n get document() {\n return doc;\n },\n get activeCell() {\n return activeCell;\n },\n get selectedRange() {\n return selectedRange;\n },\n get editingCell() {\n return editingCell;\n },\n get draftValue() {\n return draftValue;\n },\n set draftValue(val) {\n draftValue = val;\n controller.draftValue = val;\n },\n controller,\n getCell(rowId, colId) {\n return controller.getCell(rowId, colId);\n },\n setCellValue(rowId, colId, raw) {\n controller.setCellValue(rowId, colId, raw);\n doc = { ...controller.document };\n },\n selectCell(row, col, extendSelection = false) {\n controller.selectCell(row, col, extendSelection);\n activeCell = controller.activeCell;\n selectedRange = controller.selectedRange;\n },\n selectRange(range) {\n controller.selectRange(range);\n selectedRange = controller.selectedRange;\n },\n startEditing(row, col, initialVal) {\n controller.startEditing(row, col, initialVal);\n activeCell = controller.activeCell;\n editingCell = controller.editingCell;\n draftValue = controller.draftValue;\n },\n commitEditing(val) {\n controller.commitEditing(val);\n editingCell = null;\n draftValue = \"\";\n doc = { ...controller.document };\n },\n cancelEditing() {\n controller.cancelEditing();\n editingCell = null;\n draftValue = \"\";\n },\n moveCursor(dir, extend = false) {\n controller.moveCursor(dir, extend);\n activeCell = controller.activeCell;\n selectedRange = controller.selectedRange;\n },\n insertColumn(index, config) {\n controller.insertColumn(index, config);\n doc = { ...controller.document };\n },\n deleteColumn(colId) {\n controller.deleteColumn(colId);\n doc = { ...controller.document };\n },\n insertRow(index, config) {\n controller.insertRow(index, config);\n doc = { ...controller.document };\n },\n deleteRow(rowId) {\n controller.deleteRow(rowId);\n doc = { ...controller.document };\n },\n setColumnWidth(colId, width) {\n controller.setColumnWidth(colId, width);\n doc = { ...controller.document };\n },\n autoFitColumnWidth(colId, customWidth) {\n controller.autoFitColumnWidth(colId, customWidth);\n doc = { ...controller.document };\n },\n loadDocument(document) {\n controller.loadDocument(document);\n doc = { ...controller.document };\n activeCell = controller.activeCell;\n selectedRange = controller.selectedRange;\n editingCell = controller.editingCell;\n draftValue = controller.draftValue;\n },\n syncWithDataSource() {\n controller.syncWithDataSource();\n controller.recalculateAll();\n doc = { ...controller.document };\n },\n registerDataSource(ds) {\n controller.registerDataSource(ds);\n doc = { ...controller.document };\n },\n setPrimaryDataSource(id) {\n controller.setPrimaryDataSource(id);\n doc = { ...controller.document };\n },\n recalculateAll() {\n controller.recalculateAll();\n doc = { ...controller.document };\n },\n exportToTsv() {\n return controller.exportToTsv();\n },\n importFromTsv(data) {\n controller.importFromTsv(data);\n doc = { ...controller.document };\n },\n undo() {\n controller.undo();\n doc = { ...controller.document };\n },\n redo() {\n controller.redo();\n doc = { ...controller.document };\n }\n };\n}\n"],"mappings":";AAA2C,OAAO;AAClD,YAAYA,QAAO;AACnB,SAAS,WAAW,eAAe;;;;ACFnC,SAAS,cAAc;AACvB,SAAS,4BAA4B;AAC9B,IAAM,iBAAc,CAAI,SAAS,SAAS,YAAY,YAAY;AACvE,QAAM,EAAE,iBAAe,GAAK,cAAa,IAAK,WAAO,CAAA;AACrD,QAAM,gBAAgB,qBAAqB,eAAe;AAC1D,QAAM,SAAS,IAAI,OAAM;IACvB;IACA;IACA,YAAU,CAAA,GACL,eAAa,GACb,cAAU,CAAA,CAAA;IAEf,WAAW;OACR;;AAEL,SAAO;AACT;AACO,SAAS,qBAAqB,iBAAiB,IAAI,aAAU,CAAA,GAAO,UAAO,CAAA,GAAO;AACvF,MAAI;AACJ,SAAM;IACJ,IAAI,UAAU;AACZ,aAAO;IACT;IACA,MAAM,SAAS;AACb,uBAAiB,eAAe,SAAS,gBAAgB,YAAY,OAAO;AAC5E,aAAO;IACT;IACA,UAAU;AACR,UAAI,gBAAgB;AAClB,uBAAe,QAAO;AACtB,yBAAc;MAChB;IACF;;AAEJ;;;AD7BA,IAAI,OAAS,aAAU,iGAAiG;AACxH,IAAI,SAAW,aAAU,8CAA8C;AAExD,SAAR,uBAAwC,UAAU,SAAS;AACjE,EAAE,QAAK,SAAS,IAAI;AAEpB,MAAI,YAAc,QAAK,SAAS,SAAS,GAAG,EAAE,GAC7C,cAAgB,QAAK,SAAS,eAAe,GAAG,EAAE,GAClD,UAAY,QAAK,SAAS,WAAW,GAAG,MAAS,GACjD,WAAa,QAAK,SAAS,YAAY,GAAG,IAAI,GAC9C,WAAa,QAAK,SAAS,YAAY,GAAG,IAAI,GAC9C,SAAW,QAAK,SAAS,UAAU,EAAE,GACrC,aAAe,QAAK,SAAS,cAAc,IAAI,MAAM,CAAC,CAAC,GACvD,cAAgB,QAAK,SAAS,eAAe,GAAG,EAAE,GAClD,WAAa,QAAK,SAAS,YAAY,GAAG,MAAS,GACnD,kBAAoB,QAAK,SAAS,mBAAmB,IAAI,OAAO,CAAC,EAAE,GACnE,YAAc,QAAK,SAAS,aAAa,GAAG,KAAK,GACjD,QAAU,QAAK,SAAS,SAAS,GAAG,MAAS,GAC7C,cAAgB,QAAK,SAAS,eAAe,GAAG,MAAS,GACzD,gBAAkB,QAAK,SAAS,iBAAiB,GAAG,MAAS;AAE9D,MAAI,UAAY,SAAM,MAAM;AAE5B,EAAE,eAAY,MAAM;AACnB,QAAI,OAAO,KAAK,OAAO,EAAE,eAAe,SAAS,GAAG;AACnD,aAAO,EAAE,YAAY,SAAS,CAAC;AAAA,IAChC;AAAA,EACD,CAAC;AAED,UAAQ,MAAM;AACb,WAAO,eAAiB,OAAI,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG;AAAA,MAC9D,iBAAiB;AAAA,QAChB,aAAa,YAAY;AAAA,QACzB,GAAG,SAAS,MAAM,SAAY,EAAE,UAAU,SAAS,EAAE,IAAI,CAAC;AAAA,QAC1D,GAAG,MAAM,MAAM,UAAa,YAAY,MAAM,UAAa,cAAc,MAAM,SAC5E;AAAA,UACD,OAAO,MAAM,MAAM,QAChB,QACA;AAAA,YACD,GAAG,OAAO,MAAM,MAAM,WAAW,MAAM,IAAI,CAAC;AAAA,YAC5C,GAAG,YAAY,IAAI,EAAE,QAAQ,YAAY,EAAE,IAAI,CAAC;AAAA,YAChD,GAAG,cAAc,IAAI,EAAE,eAAe,cAAc,EAAE,IAAI,CAAC;AAAA,UAC5D;AAAA,QACF,IACE,CAAC;AAAA,QACJ,GAAG,gBAAgB;AAAA,MACpB;AAAA,MACA,UAAU,SAAS;AAAA,MACnB,WAAW,UAAU;AAAA,MACrB,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB,UAAU;AACT,YAAI,QAAQ,QAAS,SAAQ,QAAQ;AAAA,MACtC;AAAA,MAEA,SAAS;AACR,YAAI,QAAQ,OAAQ,SAAQ,OAAO;AAAA,MACpC;AAAA,IACD,CAAC,CAAC;AAAA,EACH,CAAC;AAED,YAAU,MAAM;AACf,QAAI,OAAO,GAAG;AACb,aAAO,EAAE,QAAQ;AAAA,IAClB;AAAA,EACD,CAAC;AAED,MAAI,MAAM,OAAO;AACjB,MAAI,OAAS,SAAM,GAAG;AAEtB;AACC,QAAI,aAAa,CAACC,cAAa;AAC9B,UAAI,QAAQ,KAAK;AAEjB,MAAE,UAAOA,WAAU,KAAK;AAAA,IACzB;AAEA,IAAE,MAAG,MAAM,CAAC,aAAa;AACxB,UAAI,CAAC,OAAO,EAAG,UAAS,UAAU;AAAA,IACnC,CAAC;AAAA,EACF;AAEA,MAAI,QAAU,WAAQ,MAAM,CAAC;AAE7B,EAAE,aAAU,OAAO,CAAC,YAAc,OAAI,SAAS,OAAO,GAAG,MAAQ,OAAI,OAAO,CAAC;AAC7E,EAAE,SAAM,GAAG;AAEX,EAAE;AAAA,IACD,CAAC,OAAO;AACP,MAAE,aAAU,KAAK,GAAG,6BAA6B,UAAU,CAAC,EAAE;AAC9D,MAAE,aAAU,OAAO,GAAG,EAAE;AAAA,IACzB;AAAA,IACA;AAAA,MACC,MAAQ,QAAK,wFAAwF,YAAY,CAAC,GAAG,KAAK,CAAC;AAAA,IAC5H;AAAA,EACD;AAEA,EAAE,UAAO,UAAU,GAAG;AACtB,EAAE,OAAI;AACP;;;AExGA,OAAO;AACP,YAAYC,QAAO;AACnB,SAAS,wBAAwB;AAEjC,IAAIC,QAAS,aAAU,4CAA4C;AAEpD,SAAR,WAA4B,UAAU,SAAS;AACrD,EAAE,QAAK,SAAS,IAAI;AAEpB,MAAI,YAAc,QAAK,SAAS,SAAS,GAAG,8FAA8F,GACzI,YAAc,QAAK,SAAS,aAAa,GAAG,YAAY,GACxD,aAAe,QAAK,SAAS,cAAc,GAAG,IAAI,GAClD,cAAgB,QAAK,SAAS,eAAe,GAAG,GAAG,GACnD,eAAiB,QAAK,SAAS,gBAAgB,IAAI,OAAO,CAAC,EAAE;AAE9D,MAAI,cAAgB,SAAM,MAAM;AAEhC,EAAE,eAAY,MAAM;AACnB,QAAI,QAAQ,UAAY,OAAI,WAAW,GAAG;AACzC,YAAM,SAAS,iBAAiB;AAAA,QAC/B,WAAW,UAAU;AAAA,QACrB,QAAQ,QAAQ;AAAA,QAChB,SAAW,OAAI,WAAW;AAAA,QAC1B,cAAc;AAAA,UACb,UAAU;AAAA,UACV,UAAU,MAAM,SAAS;AAAA,UACzB,GAAG,aAAa;AAAA,QACjB;AAAA,QACA,YAAY,WAAW;AAAA,QACvB,aAAa,YAAY;AAAA,MAC1B,CAAC;AAED,cAAQ,OAAO,eAAe,MAAM;AAEpC,aAAO,MAAM;AACZ,gBAAQ,OAAO,iBAAiB,UAAU,CAAC;AAAA,MAC5C;AAAA,IACD;AAAA,EACD,CAAC;AAED,MAAI,MAAMA,MAAK;AACf,MAAI,OAAS,SAAM,GAAG;AAEtB;AACC,QAAI,aAAa,CAACC,cAAa;AAC9B,UAAI,WAAa,WAAQ;AACzB,UAAI,SAAW,eAAY,QAAQ;AAEnC,MAAE,WAAQ,QAAQ,MAAM,QAAQ,QAAQ;AACxC,MAAE,UAAOA,WAAU,QAAQ;AAAA,IAC5B;AAEA,IAAE,MAAG,MAAM,CAAC,aAAa;AACxB,UAAI,QAAQ,SAAU,UAAS,UAAU;AAAA,IAC1C,CAAC;AAAA,EACF;AAEA,EAAE,SAAM,GAAG;AACX,EAAE,aAAU,KAAK,CAAC,YAAc,OAAI,aAAa,OAAO,GAAG,MAAQ,OAAI,WAAW,CAAC;AACnF,EAAE,mBAAgB,MAAQ,aAAU,KAAK,GAAK,QAAK,UAAU,CAAC,CAAC,CAAC;AAChE,EAAE,UAAO,UAAU,GAAG;AACtB,EAAE,OAAI;AACP;;;AC9DA,OAAO;AACP,YAAYC,QAAO;AACnB,SAAS,gBAAgB,wBAAwB;AAEjD,IAAIC,QAAS,aAAU,yRAAyR;AAChT,IAAIC,UAAW,aAAU,qNAAqN;AAC9O,IAAI,SAAW,aAAU,mKAAmK;AAC5L,IAAI,SAAW,aAAU,gBAAgB;AACzC,IAAI,SAAW,aAAU,aAAa;AAEvB,SAAR,iBAAkC,UAAU,SAAS;AAC3D,EAAE,QAAK,SAAS,IAAI;AAEpB,MAAI,YAAc,QAAK,SAAS,aAAa,IAAI,MAAM,CAAC,CAAC,GACxD,UAAY,QAAK,SAAS,WAAW,GAAG,KAAK,GAC7C,YAAc,QAAK,SAAS,SAAS,GAAG,mEAAmE;AAE5G,MAAI,cAAgB,WAAQ,MAAM,QAAQ,KAAK,UAAU,EAAE,SAAS,IACjE,iBAAiB,QAAQ,SAAS,UAAU,CAAC,IAC7C,QAAQ,OAAO;AAElB,MAAI,SAAW,WAAQ,MAAM,eAAiB,OAAI,WAAW,CAAC,CAAC;AAC/D,MAAI,MAAM,OAAO;AAEjB,EAAE,QAAK,KAAK,IAAI,MAAQ,OAAI,MAAM,GAAK,UAAO,CAACC,WAAU,UAAU;AAClE,QAAI,WAAa,WAAQ;AACzB,QAAI,OAAS,eAAY,QAAQ;AAEjC;AACC,UAAI,aAAa,CAACA,cAAa;AAC9B,cAAM,SAAW,WAAQ,MAAM,QAAQ,kBAAkB,IAAM,OAAI,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,WAAW,IAAI,UAAU,CAAC;AACtH,YAAI,OAAOF,MAAK;AAChB,YAAI,OAAS,cAAW,MAAM,IAAI;AAElC,QAAE,mBAAgB,MAAM;AACvB,UAAE,aAAU,MAAM,iBAAmB,OAAI,MAAM,EAAE,IAAI,iBAAmB,OAAI,MAAM,EAAE,EAAE,GAAG;AACzF,UAAE,iBAAc,MAAM,SAAS,aAAe,OAAI,KAAK,EAAE,KAAK,EAAE;AAChE,UAAE,YAAS,MAAM,KAAO,OAAI,KAAK,EAAE,KAAK,IAAI;AAAA,QAC7C,CAAC;AAED,QAAE,aAAU,SAAS,MAAM,MAAM,QAAQ,kBAAoB,OAAI,KAAK,EAAE,KAAK,CAAC;AAC9E,QAAE,UAAOE,WAAU,IAAI;AAAA,MACxB;AAEA,UAAI,eAAe,CAACA,cAAa;AAChC,YAAI,SAASD,QAAO;AACpB,YAAI,SAAW,cAAW,QAAQ,IAAI;AAEtC,QAAE,mBAAgB,MAAM;AACvB,UAAE,iBAAc,QAAQ,SAAS,aAAe,OAAI,KAAK,EAAE,KAAK,EAAE;AAClE,UAAE,YAAS,QAAQ,IAAM,OAAI,KAAK,EAAE,KAAK,GAAG;AAAA,QAC7C,CAAC;AAED,QAAE,aAAU,SAAS,QAAQ,MAAM,QAAQ,kBAAoB,OAAI,KAAK,EAAE,KAAK,CAAC;AAChF,QAAE,UAAOC,WAAU,MAAM;AAAA,MAC1B;AAEA,UAAI,eAAe,CAACA,cAAa;AAChC,YAAI,SAAS,OAAO;AACpB,YAAI,SAAW,cAAW,QAAQ,IAAI;AAEtC,QAAE,mBAAgB,MAAM;AACvB,UAAE,iBAAc,QAAQ,SAAS,gBAAkB,OAAI,KAAK,EAAE,KAAK,EAAE;AACrE,UAAE,YAAS,QAAQ,KAAO,OAAI,KAAK,EAAE,KAAK,IAAI;AAAA,QAC/C,CAAC;AAED,QAAE,UAAOA,WAAU,MAAM;AAAA,MAC1B;AAEA,UAAI,YAAY,CAACA,cAAa;AAC7B,YAAI,SAAS,OAAO;AACpB,YAAI,SAAW,cAAW,QAAQ,IAAI;AAEtC,QAAE,mBAAgB,MAAQ,YAAS,QAAU,OAAI,KAAK,EAAE,KAAK,CAAC;AAC9D,QAAE,UAAOA,WAAU,MAAM;AAAA,MAC1B;AAEA,MAAE,MAAG,MAAM,CAAC,aAAa;AACxB,YAAM,OAAI,KAAK,EAAE,SAAS,WAAY,UAAS,UAAU;AAAA,iBAAc,OAAI,KAAK,EAAE,SAAS,WAAY,UAAS,cAAc,CAAC;AAAA,iBAAc,OAAI,KAAK,EAAE,SAAS,cAAe,UAAS,cAAc,CAAC;AAAA,YAAQ,UAAS,WAAW,EAAE;AAAA,MACvO,CAAC;AAAA,IACF;AAEA,IAAE,UAAOA,WAAU,QAAQ;AAAA,EAC5B,CAAC;AAED,EAAE,SAAM,GAAG;AACX,EAAE,mBAAgB,MAAQ,aAAU,KAAK,GAAK,QAAK,UAAU,CAAC,CAAC,CAAC;AAChE,EAAE,UAAO,UAAU,GAAG;AACtB,EAAE,OAAI;AACP;AAEE,YAAS,CAAC,OAAO,CAAC;;;ACtEb,SAAS,gBACd,MACA,SAC6B;AAC7B,MAAI,UAAU,QAAQ;AACtB,MAAI,UAAU,QAAQ,WAAW;AACjC,MAAI,YAAY,QAAQ;AAExB,WAAS,mBAAmB,GAAsB;AAChD,QAAI,CAAC,WAAW,CAAC,QAAS;AAC1B,MAAE,eAAe;AACjB,MAAE,cAAc;AAAA,EAClB;AAEA,WAAS,YAAY,GAAe;AAClC,QAAI,CAAC,WAAW,CAAC,QAAS;AAE1B,UAAM,SAAS,EAAE;AACjB,UAAM,SAAS,QAAQ,UAAU,GAAG;AACpC,QAAI,CAAC,OAAQ;AACb,QAAI,OAAO,WAAW,SAAU;AAGhC,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,aAAa,OAAO,SAAS,OAAO,SAAS;AACnD,UAAI,CAAC,WAAY;AAEjB,UACE,OAAO,aAAa,OAAO,SAAS,YACpC,OAAO,WAAW,OAAO,SAAS,QAClC;AACA;AAAA,MACF;AAAA,IACF;AAEA,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAElB,UAAM,OAAO,OAAO;AACpB,gBAAY,IAAI;AAAA,EAClB;AAEA,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,iBAAiB,gBAAgB,kBAAkB;AAAA,EAC5D;AACA,OAAK,iBAAiB,SAAS,aAAa,EAAE,SAAS,KAAK,CAAC;AAE7D,SAAO;AAAA,IACL,OAAO,YAAoC;AACzC,gBAAU,WAAW;AACrB,gBAAU,WAAW,WAAW;AAChC,kBAAY,WAAW;AAAA,IACzB;AAAA,IACA,UAAU;AACR,UAAI,OAAO,WAAW,aAAa;AACjC,eAAO,oBAAoB,gBAAgB,kBAAkB;AAAA,MAC/D;AACA,WAAK,oBAAoB,SAAS,aAAa,EAAE,SAAS,KAAK,CAAC;AAAA,IAClE;AAAA,EACF;AACF;;;;ACjFO,SAAS,sBAAsB,SAAS;AAC7C,MAAI,cAAc,SAAO,KAAK;AAC9B,MAAI,aAAa,SAAO,IAAI;AAC5B,QAAM,aAAU,MAAA,OAAgB,QAAQ,YAAY,aAAa,QAAQ,QAAO,IAAK,QAAQ;AAC7F,QAAM,aAAU,MAAA,OAAgB,QAAQ,YAAY,aAAa,QAAQ,QAAO,IAAK,QAAQ,WAAW;AACxG,WAAS,mBAAmB,GAAG;AAC7B,QAAE,CAAG,WAAU,KAAA,CAAO,WAAU,EAAI;AACpC,MAAE,eAAc;AAChB,MAAE,cAAc;EAClB;AACA,MAAE,OAAS,WAAW,aAAa;AACjC,WAAO,iBAAiB,gBAAgB,kBAAkB;EAC5D;AACA,WAAS,UAAU,KAAK;AACtB,QAAI,WAAU,KAAM,WAAU,GAAI;aAChC,YAAa,KAAG,IAAA;aAChB,aAAc,IAAI;AAClB,cAAQ,YAAY,GAAG;AACvB,aAAO;IACT;AACA,WAAO;EACT;AACA,WAAS,eAAe;WACtB,aAAc,KAAK;AACnB,UAAM,SAAM,OAAG,UAAU;AACzB,QAAI,QAAQ;AACV,UAAI,QAAQ,YAAY;AACtB,gBAAQ,WAAW,MAAM;MAC3B,WAAS,OAAS,WAAW,aAAa;AACxC,eAAO,SAAS,OAAO;MACzB;IACF;EACF;AACA,WAAS,cAAc;WACrB,aAAc,KAAK;WACnB,YAAa,IAAI;EACnB;AACA,WAAS,UAAU;AACjB,QAAE,OAAS,WAAW,aAAa;AACjC,aAAO,oBAAoB,gBAAgB,kBAAkB;IAC/D;EACF;AACA,SAAM;IACJ,IAAI,cAAc;AAChB,aAAM,OAAC,WAAW;IACpB;IACA,eAAe,KAAK;aAClB,aAAc,KAAG,IAAA;IACnB;IACA,IAAI,aAAa;AACf,aAAM,OAAC,UAAU;IACnB;IACA;IACA;IACA;IACA;;AAEJ;;;;ACzDA,SACE,gBACA,4BACK;AACA,SAAS,cAAc,kBAAkB;AAC9C,QAAM,UAAU,4BAA4B,iBAAiB,mBAAmB,qBAAqB,gBAAgB;AACrH,MAAIC,SAAQ,SAAM,SAAC,QAAQ,SAAQ,CAAA,CAAA;AACnC,UAAQ,UAAS,CAAE,aAAa;WAC9BA,QAAQ,UAAQ,IAAA;EAClB,CAAC;AACD,SAAM;IACJ,IAAI,UAAU;AACZ,aAAM,OAACA,MAAK,EAAC;IACf;IACA,IAAI,UAAU;AACZ,aAAM,OAACA,MAAK,EAAC;IACf;IACA,IAAI,WAAW;AACb,aAAM,OAACA,MAAK,EAAC;IACf;IACA,IAAI,WAAW;AACb,aAAM,OAACA,MAAK,EAAC;IACf;IACA,IAAI,YAAY;AACd,aAAM,OAACA,MAAK,EAAC;IACf;IACA,IAAI,YAAY;AACd,aAAM,OAACA,MAAK,EAAC;IACf;IACA,IAAI,UAAU;AACZ,aAAO;IACT;IACA,MAAI,MAAQ,QAAQ,KAAI;IACxB,MAAI,MAAQ,QAAQ,KAAI;IACxB,OAAK,MAAQ,QAAQ,MAAK;IAC1B,SAAO,CAAG,QAAQ,QAAQ,QAAQ,GAAG;IACrC,eAAa,CAAG,KAAK,SAAS,QAAQ,cAAc,KAAK,IAAI;IAC7D,OAAK,CAAG,MAAM,OAAO,QAAQ,MAAM,MAAM,EAAE;IAC3C,WAAS,CAAG,QAAQ,QAAQ,UAAU,GAAG;;AAE7C;;;AClBO,SAAS,uBACd,SACA,UAAmC,CAAC,GACX;AACzB,QAAM;AAAA,IACJ,UAAU;AAAA,IACV;AAAA,IACA,yBAAyB;AAAA,EAC3B,IAAI;AAEJ,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,SAAS,MAAM;AAAA,IAAC,EAAE;AAAA,EAC7B;AAEA,QAAM,cAAc,WAAW,OAAO,WAAW,cAAc,SAAS;AACxE,MAAI,CAAC,aAAa;AAChB,WAAO,EAAE,SAAS,MAAM;AAAA,IAAC,EAAE;AAAA,EAC7B;AAEA,QAAM,gBAAgB,CAACC,WAAiB;AACtC,UAAM,IAAIA;AACV,UAAM,QACJ,OAAO,cAAc,eACrB,uBAAuB,KAAK,UAAU,YAAY,UAAU,SAAS;AACvE,UAAM,WAAW,QAAQ,EAAE,UAAU,EAAE;AAEvC,QAAI,CAAC,SAAU;AAEf,QAAI,0BAA0B,OAAO,aAAa,aAAa;AAC7D,YAAM,WAAY,EAAE,UAAU,SAAS;AACvC,UAAI,YAAY,SAAS,SAAS;AAChC,cAAM,UAAU,SAAS,QAAQ,YAAY;AAC7C,cAAM,UAAU,YAAY,WAAW,YAAY;AACnD,cAAM,oBACJ,SAAS,qBACT,SAAS,eAAe,iBAAiB,MAAM;AACjD,YAAI,WAAW,mBAAmB;AAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,EAAE,KAAK,YAAY;AAG/B,QAAI,QAAQ,OAAO,CAAC,EAAE,UAAU;AAC9B,UAAI,QAAQ,SAAS,EAAE,SAAS;AAC9B,UAAE,eAAe;AACjB,gBAAQ,KAAK;AAAA,MACf;AACA;AAAA,IACF;AAGA,UAAM,YACH,QAAQ,OAAO,EAAE,YAAc,CAAC,SAAS,QAAQ,OAAO,CAAC,EAAE;AAE9D,QAAI,WAAW;AACb,UAAI,QAAQ,SAAS,EAAE,SAAS;AAC9B,UAAE,eAAe;AACjB,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,cAAY,iBAAiB,WAAW,aAAa;AAErD,SAAO;AAAA,IACL,SAAS,MAAM;AACb,kBAAY,oBAAoB,WAAW,aAAa;AAAA,IAC1D;AAAA,EACF;AACF;;;AC3EA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAAC;AAAA,EACA,wBAAAC;AAAA,OACK;;;ACzB+B,OAAO;AAC7C,YAAYC,QAAO;AACnB,SAAS,kBAAAC,uBAAsB;;;ACF/B,OAAO;AACP,YAAYC,QAAO;AACnB,SAAS,sBAAsB;AAE/B,IAAIC,QAAS,aAAU,4jBAA4jB;AAEpkB,SAAR,WAA4B,UAAU,SAAS;AACrD,EAAE,QAAK,SAAS,IAAI;AAEpB,MAAI,aAAe,QAAK,SAAS,cAAc,CAAC,GAC/C,cAAgB,QAAK,SAAS,eAAe,GAAG,IAAI,GACpD,QAAU,QAAK,SAAS,SAAS,IAAI,EAAE,GACvC,YAAc,QAAK,SAAS,SAAS,GAAG,EAAE;AAE3C,MAAI,iBAAmB,WAAQ,MAAM;AACpC,QAAI,WAAW,EAAG,QAAO,WAAW,EAAE;AAEtC,WAAO,YAAY;AAAA,EACpB,CAAC;AAED,MAAI,aAAe,WAAQ,MAAM;AAChC,QAAI,CAAG,OAAI,cAAc,EAAG,QAAO;AAEnC,UAAM,UAAU,eAAiB,OAAI,cAAc,EAAE,GAAG;AAExD,WAAO,GAAG,OAAO,GAAK,OAAI,cAAc,EAAE,MAAM,CAAC;AAAA,EAClD,CAAC;AAED,MAAI,iBAAmB,WAAQ,MAAM;AACpC,QAAI,WAAW,GAAG;AACjB,UAAI,WAAW,EAAE,YAAa,QAAO,WAAW,EAAE;AAClD,UAAI,CAAC,WAAW,EAAE,WAAY,QAAO;AAErC,YAAM,MAAM,WAAW,EAAE,SAAS,KAAK,WAAW,EAAE,WAAW,GAAG;AAClE,YAAM,MAAM,WAAW,EAAE,SAAS,QAAQ,WAAW,EAAE,WAAW,GAAG;AAErE,UAAI,CAAC,OAAO,CAAC,IAAK,QAAO;AAEzB,aAAO,WAAW,EAAE,QAAQ,IAAI,IAAI,IAAI,EAAE,EAAE,OAAO;AAAA,IACpD;AAEA,WAAO,MAAM;AAAA,EACd,CAAC;AAED,WAAS,cAAc,GAAG;AACzB,QAAI,EAAE,QAAQ,SAAS;AACtB,QAAE,eAAe;AAEjB,UAAI,WAAW,KAAK,WAAW,EAAE,YAAY;AAC5C,cAAM,MAAM,WAAW,EAAE,SAAS,KAAK,WAAW,EAAE,WAAW,GAAG;AAClE,cAAM,MAAM,WAAW,EAAE,SAAS,QAAQ,WAAW,EAAE,WAAW,GAAG;AAErE,YAAI,OAAO,KAAK;AACf,qBAAW,EAAE,aAAa,IAAI,IAAI,IAAI,IAAM,OAAI,cAAc,CAAC;AAAA,QAChE;AAEA,mBAAW,EAAE,cAAc;AAAA,MAC5B;AAEA,cAAQ,WAAa,OAAI,cAAc,CAAC;AAAA,IACzC,WAAW,EAAE,QAAQ,UAAU;AAC9B,QAAE,eAAe;AAEjB,UAAI,WAAW,GAAG;AACjB,mBAAW,EAAE,cAAc;AAAA,MAC5B;AAEA,cAAQ,WAAW;AAAA,IACpB;AAAA,EACD;AAEA,WAAS,YAAY,GAAG;AACvB,UAAM,SAAS,EAAE;AAEjB,QAAI,WAAW,GAAG;AACjB,iBAAW,EAAE,aAAa,OAAO;AAEjC,UAAI,WAAW,EAAE,cAAc,CAAC,WAAW,EAAE,aAAa;AACzD,mBAAW,EAAE,aAAa,WAAW,EAAE,WAAW,KAAK,WAAW,EAAE,WAAW,KAAK,OAAO,KAAK;AAAA,MACjG;AAAA,IACD,OAAO;AACN,YAAM,OAAO,KAAK;AAAA,IACnB;AAEA,YAAQ,WAAW,OAAO,KAAK;AAAA,EAChC;AAEA,MAAI,MAAMA,MAAK;AACf,MAAI,QAAU,SAAM,GAAG;AACvB,MAAI,OAAS,cAAW,OAAO,IAAI;AACnC,MAAI,QAAU,WAAQ,OAAO,CAAC;AAE9B,EAAE,yBAAsB,KAAK;AAC7B,EAAE,SAAM,GAAG;AAEX,EAAE,mBAAgB,MAAM;AACvB,IAAE,aAAU,KAAK,GAAG,4FAA4F,UAAU,KAAK,EAAE,EAAE;AACnI,IAAE,YAAS,MAAQ,OAAI,UAAU,CAAC;AAClC,IAAE,aAAU,OAAS,OAAI,cAAc,CAAC;AAAA,EACzC,CAAC;AAED,EAAE,aAAU,SAAS,OAAO,WAAW;AACvC,EAAE,aAAU,WAAW,OAAO,aAAa;AAC3C,EAAE,UAAO,UAAU,GAAG;AACtB,EAAE,OAAI;AACP;AAEE,YAAS,CAAC,SAAS,SAAS,CAAC;;;;AC3G/B,SACE,6BACK;AACA,SAAS,0BAA0B,UAAO,CAAA,GAAO;AACtD,MAAI,MAAM,SAAM,SAAA;IACd,IAAI,QAAQ,UAAU,MAAE,SAAa,KAAK,IAAG,CAAA;IAC7C,MAAM,QAAQ,UAAU,QAAQ;IAChC,SAAS,QAAQ,UAAU,WAAO,CAAA;IAClC,MAAM,QAAQ,UAAU,QAAI,CAAA;IAC5B,OAAO,QAAQ,UAAU,SAAK,CAAA;IAC9B,WAAW,QAAQ,UAAU,aAAa,KAAK,IAAG;IAClD,WAAW,QAAQ,UAAU,aAAa,KAAK,IAAG;;AAEpD,MAAI,aAAa,SAAO,IAAI;AAC5B,MAAI,gBAAgB,SAAO,IAAI;AAC/B,MAAI,cAAc,SAAO,IAAI;AAC7B,MAAI,aAAa,SAAO,EAAE;AAC1B,QAAM,aAAa,IAAI,sBAAqB;OACvC;IACH,UAAU,QAAQ;IAClB,kBAAgB,CAAG,YAAY;aAC7B,KAAG,EAAA,GAAQ,QAAO,GAAA,IAAA;AAClB,cAAQ,mBAAmB,OAAO;IACpC;IACA,mBAAiB,CAAG,QAAQ,UAAU;aACpC,YAAa,QAAM,IAAA;aACnB,eAAgB,OAAK,IAAA;AACrB,cAAQ,oBAAoB,QAAQ,KAAK;IAC3C;IACA,cAAY,CAAG,OAAO,OAAO,KAAK,UAAU;AAC1C,cAAQ,eAAe,OAAO,OAAO,KAAK,KAAK;IACjD;;SAEF,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;SAC9B,YAAa,WAAW,YAAU,IAAA;SAClC,eAAgB,WAAW,eAAa,IAAA;AACxC,SAAM;IACJ,IAAI,WAAW;AACb,aAAM,OAAC,GAAG;IACZ;IACA,IAAI,aAAa;AACf,aAAM,OAAC,UAAU;IACnB;IACA,IAAI,gBAAgB;AAClB,aAAM,OAAC,aAAa;IACtB;IACA,IAAI,cAAc;AAChB,aAAM,OAAC,WAAW;IACpB;IACA,IAAI,aAAa;AACf,aAAM,OAAC,UAAU;IACnB;IACA,IAAI,WAAW,KAAK;aAClB,YAAa,KAAG,IAAA;AAChB,iBAAW,aAAa;IAC1B;IACA;IACA,QAAQ,OAAO,OAAO;AACpB,aAAO,WAAW,QAAQ,OAAO,KAAK;IACxC;IACA,aAAa,OAAO,OAAO,KAAK;AAC9B,iBAAW,aAAa,OAAO,OAAO,GAAG;aACzC,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,WAAW,KAAK,KAAK,kBAAkB,OAAO;AAC5C,iBAAW,WAAW,KAAK,KAAK,eAAe;aAC/C,YAAa,WAAW,YAAU,IAAA;aAClC,eAAgB,WAAW,eAAa,IAAA;IAC1C;IACA,YAAY,OAAO;AACjB,iBAAW,YAAY,KAAK;aAC5B,eAAgB,WAAW,eAAa,IAAA;IAC1C;IACA,aAAa,KAAK,KAAK,YAAY;AACjC,iBAAW,aAAa,KAAK,KAAK,UAAU;aAC5C,YAAa,WAAW,YAAU,IAAA;aAClC,aAAc,WAAW,aAAW,IAAA;aACpC,YAAa,WAAW,YAAU,IAAA;IACpC;IACA,cAAc,KAAK;AACjB,iBAAW,cAAc,GAAG;aAC5B,aAAc,IAAI;aAClB,YAAa,EAAE;aACf,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,gBAAgB;AACd,iBAAW,cAAa;aACxB,aAAc,IAAI;aAClB,YAAa,EAAE;IACjB;IACA,WAAW,KAAK,SAAS,OAAO;AAC9B,iBAAW,WAAW,KAAK,MAAM;aACjC,YAAa,WAAW,YAAU,IAAA;aAClC,eAAgB,WAAW,eAAa,IAAA;IAC1C;IACA,aAAaC,QAAO,QAAQ;AAC1B,iBAAW,aAAaA,QAAO,MAAM;aACrC,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,aAAa,OAAO;AAClB,iBAAW,aAAa,KAAK;aAC7B,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,UAAUA,QAAO,QAAQ;AACvB,iBAAW,UAAUA,QAAO,MAAM;aAClC,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,UAAU,OAAO;AACf,iBAAW,UAAU,KAAK;aAC1B,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,eAAe,OAAO,OAAO;AAC3B,iBAAW,eAAe,OAAO,KAAK;aACtC,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,mBAAmB,OAAO,aAAa;AACrC,iBAAW,mBAAmB,OAAO,WAAW;aAChD,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,aAAaC,WAAU;AACrB,iBAAW,aAAaA,SAAQ;aAChC,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;aAC9B,YAAa,WAAW,YAAU,IAAA;aAClC,eAAgB,WAAW,eAAa,IAAA;aACxC,aAAc,WAAW,aAAW,IAAA;aACpC,YAAa,WAAW,YAAU,IAAA;IACpC;IACA,qBAAqB;AACnB,iBAAW,mBAAkB;AAC7B,iBAAW,eAAc;aACzB,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,mBAAmB,IAAI;AACrB,iBAAW,mBAAmB,EAAE;aAChC,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,qBAAqB,IAAI;AACvB,iBAAW,qBAAqB,EAAE;aAClC,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,iBAAiB;AACf,iBAAW,eAAc;aACzB,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,cAAc;AACZ,aAAO,WAAW,YAAW;IAC/B;IACA,cAAc,MAAM;AAClB,iBAAW,cAAc,IAAI;aAC7B,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,OAAO;AACL,iBAAW,KAAI;aACf,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;IACA,OAAO;AACL,iBAAW,KAAI;aACf,KAAG,EAAA,GAAQ,WAAW,SAAQ,GAAA,IAAA;IAChC;;AAEJ;;;AF1JA,IAAIC,QAAS,aAAU,wmBAAwmB;AAC/nB,IAAIC,UAAW,aAAU,mNAAmN;AAC5O,IAAIC,UAAW,aAAU,iKAAiK;AAC1L,IAAIC,UAAW,aAAU,gBAAgB;AACzC,IAAIC,UAAW,aAAU,sDAAsD;AAC/E,IAAI,SAAW,aAAU,wFAAwF;AACjH,IAAI,SAAW,aAAU,yUAAyU;AAClW,IAAI,SAAW,aAAU,qjBAAqjB;AAE/jB,SAAR,kBAAmC,UAAU,SAAS;AAC5D,EAAE,QAAK,SAAS,IAAI;AAEpB,MAAI,aAAe,QAAK,SAAS,cAAc,IAAI,yBAAyB,GAC3E,WAAa,QAAK,SAAS,YAAY,GAAG,KAAK,GAC/C,WAAa,QAAK,SAAS,YAAY,GAAG,KAAK,GAC/C,iBAAmB,QAAK,SAAS,kBAAkB,GAAG,IAAI,GAC1D,YAAc,QAAK,SAAS,SAAS,GAAG,EAAE;AAE3C,MAAI,aAAe,WAAQ,MAAM,SAAS,KAAK,SAAS,CAAC;AACzD,MAAI,gBAAkB,SAAM,IAAI;AAChC,MAAI,gBAAkB,SAAM,IAAI;AAChC,MAAI,eAAiB,SAAM,IAAI;AAC/B,MAAI,eAAiB,SAAM,CAAC;AAC5B,MAAI,mBAAqB,SAAM,CAAC;AAEhC,WAAS,gBAAgB,MAAM,MAAM,GAAG;AACvC,QAAI,WAAW,EAAE,gBAAgB,WAAW,EAAE,YAAY,QAAQ,QAAQ,WAAW,EAAE,YAAY,QAAQ,OAAO;AACjH,iBAAW,EAAE,cAAc;AAAA,IAC5B;AAEA,eAAW,EAAE,WAAW,MAAM,MAAM,EAAE,QAAQ;AAAA,EAC/C;AAEA,WAAS,mBAAmB,MAAM,MAAM;AACvC,QAAM,OAAI,UAAU,EAAG;AAEvB,UAAM,MAAM,WAAW,EAAE,SAAS,QAAQ,IAAI;AAE9C,QAAI,KAAK,SAAU;AAEnB,eAAW,EAAE,aAAa,MAAM,IAAI;AAAA,EACrC;AAEA,WAAS,cAAc,GAAG;AACzB,QAAI,WAAW,EAAE,aAAa;AAC7B,UAAI,EAAE,QAAQ,UAAU;AACvB,mBAAW,EAAE,cAAc;AAAA,MAC5B,WAAW,EAAE,QAAQ,SAAS;AAC7B,mBAAW,EAAE,cAAc;AAC3B,mBAAW,EAAE,WAAW,MAAM;AAAA,MAC/B,WAAW,EAAE,QAAQ,OAAO;AAC3B,UAAE,eAAe;AACjB,mBAAW,EAAE,cAAc;AAC3B,mBAAW,EAAE,WAAW,EAAE,WAAW,SAAS,OAAO;AAAA,MACtD;AAEA;AAAA,IACD;AAEA,QAAI,CAAC,WAAW,EAAE,WAAY;AAE9B,QAAI,EAAE,QAAQ,WAAW;AACxB,QAAE,eAAe;AACjB,iBAAW,EAAE,WAAW,MAAM,EAAE,QAAQ;AAAA,IACzC,WAAW,EAAE,QAAQ,aAAa;AACjC,QAAE,eAAe;AACjB,iBAAW,EAAE,WAAW,QAAQ,EAAE,QAAQ;AAAA,IAC3C,WAAW,EAAE,QAAQ,aAAa;AACjC,QAAE,eAAe;AACjB,iBAAW,EAAE,WAAW,QAAQ,EAAE,QAAQ;AAAA,IAC3C,WAAW,EAAE,QAAQ,cAAc;AAClC,QAAE,eAAe;AACjB,iBAAW,EAAE,WAAW,SAAS,EAAE,QAAQ;AAAA,IAC5C,WAAW,EAAE,QAAQ,OAAO;AAC3B,QAAE,eAAe;AACjB,iBAAW,EAAE,WAAW,EAAE,WAAW,SAAS,OAAO;AAAA,IACtD,WAAW,EAAE,QAAQ,SAAS;AAC7B,QAAE,eAAe;AAEjB,YAAM,MAAM,WAAW,EAAE,SAAS,QAAQ,WAAW,EAAE,WAAW,GAAG;AAErE,UAAI,CAAG,OAAI,UAAU,KAAK,CAAC,KAAK,UAAU;AACzC,mBAAW,EAAE,aAAa;AAAA,MAC3B;AAAA,IACD,WAAW,EAAE,QAAQ,eAAe,EAAE,QAAQ,UAAU;AACvD,UAAM,OAAI,UAAU,EAAG;AAEvB,YAAM,MAAM,WAAW,EAAE,SAAS,KAAK,WAAW,EAAE,WAAW,GAAG;AAClE,YAAM,MAAM,WAAW,EAAE,SAAS,QAAQ,WAAW,EAAE,WAAW,GAAG;AAErE,UAAI,OAAO,OAAO,CAAC,IAAI,UAAU;AAChC,UAAE,eAAe;AACjB,mBAAW,EAAE,aAAa,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,MAC7C;AAAA,IACD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AACrD,QAAE,eAAe;AAEjB,UAAI,EAAE,UAAU;AACf,mBAAW,EAAE,KAAK;AAAA,MACnB,OAAO;AACN,mBAAW,EAAE,KAAK;AAAA,MACnB;AAAA,IACD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AACrD,QAAE,eAAe;AAEjB,YAAM,MAAM,WAAW,EAAE,YAAY;AAErC,gBAAU,WAAW,UAAU,GAAG;AAAA,IACnC,WAAW,CAAG,OAAI,UAAU,KAAK,EAAE,IAAI,WAAW,KAAK,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,QAAQ;AAE7F,YAAM,MAAM,WAAW,EAAE,SAAS,QAAQ,WAAW,EAAE,WAAW,GAAG;AAErE,UAAI,CAAC,KAAK,UAAU;AACnB,mBAAW,EAAE,aAAa,WAAW,EAAE,WAAW,KAAK,WAAW,EAAE,WAAW,KAAK,EAAE,GAAG;AAAA,MAC1F;AAAA,IACD;AAAA,EACD;AAEA,WAAS,kBAAkB,OAAO,OAAO,GAAG;AAC3C,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,IAAE,OAAI,eAAe,OAAO,IAAI;AAChC,IAAE,OAAI,cAAc,EAAE,SAAS,IAAI;AACnC,IAAE,OAAI,kBAAkB,OAAO,IAAI;AAEnC,QAAI,OAAO,aAAa,aAAa;AACpC,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AAAA,IAClC;AAEA,QAAI,QAAQ;AACZ,QAAI,eAAe;AACnB,QAAI,aAAa;AAEjB,UAAM,kBAAkB,CAAC,cAAc;AACtC,UAAI,CAAG,OAAI,aAAa,EAAG;AAE3B,YAAM,QAAQ,UAAU,UAAY,OAAI,YAAY;AAEpD,UAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AACxB,qBAAa;AAAA,MACd;AAEA,qBAAe,KAAK,IAAI,IAAM,OAAI,gBAAgB,IAAI,KAAK;AAE3D,UAAI,UAAU,MAAM;AACnB,gBAAQ,sBAAsB,MAAM;AACnC,kBAAQ;AAER,cAAM,OAAI,aAAa,GAAG;AACzB,uBAAW,EAAE,eAAiB,OAAI,aAAa,GAAG,YAAY;AAAA,UAC/D;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAEA,UAAM,gBAAgB,MAAM;AAC3B,UAAI,UAAU,MAAM;AACnB,6BAAqB,KAAK;AAC1B,gBAAQ;AAAA,MACT;AAEA,UAAM,OAAI,aAAa,KAAK,YAAY;AACvC,mBAAW,EAAE,eAAiB,OAAI,aAAa,GAAG,YAAY;AAE9D,cAAM,MAAM,WAAW,EAAE,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAS,OAAI,aAAa,CAAC;AAEnF,YAAI,OAAO,QAAQ,gBAAgB;AAClC,kBAAQ,eAAe,IAAI,IAAI,IAAI,SAAS,YAAY;AAAA,QACzD;AAAA,MACD;AAEA,MAAE,OAAI,eAAe,IAAI;AAEzB,UAAI,OAAO,aAAa,aAAa;AACpC,iBAAS,KAAK,MAAM,SAAS;AAC7B,iBAAS,KAAK,MAAM,aAAa;AAAA,MAClC;AAEA,aAAO,oBAAoB,aAAa,eAAe;AACvD,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACpD;AAEA,WAAO,iBAAiB,aAAa,eAAe;AACpD,WAAO,iBAAiB,WAAW,aAAa;AAAA,EACjD;AAEA,WAAS,2BAA2B,IAAI,WAAW;AAClD,QAAI,OAAO,aAAa,YAAa,QAAO;AAE5C,QAAI,OAAO,GAAG,eAAe;AAC7B,UAAM,aAAa,GAAG;AAEtB,QAAI,cAAc,WAAW,cAAc,MAAM;AAChD,aAAO,WAAW;AAAA,IACnB;AAEA,UAAM,YAAY,GAAG,iBAAiB,+BAA+B;AAErE,cAAU,QAAQ,CAAC,SAAS;AAC3B,UAAI,KAAK,cAAc,MAAM;AAC5B,eAAO,KAAK;AAAA,MACb;AAAA,IACD,CAAC;AAED,QAAI;AACH,YAAM,QAAQ,aAAa,WAAW,UAAU,IAAI,IAAI,GAAG,UAAU,IAAI;AAEzE,YAAM,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAatB,YAAM,WAAW,MAAM,iBAAiB,GAAG;AAE3C,eAAS,QAAQ,CAAC,SAAS;AAC1B,aAAK,MAAM,WAAW;AACtB,aAAK,MAAM,WAAW;AACtB,aAAK,MAAM,eAAe;AAC1B,aAAK,MAAM,aAAa;AAExB,YAAI,KAAK,UAAU,SAAS,UAAU,KAAK,KAAK,UAAU,SAAS,SAAS,KAAK,KAAK,UAAU,SAAS,QAAQ,KAAK,KAAK,UAAU,SAAS,SAAS,KAAK,KAAK,UAAU,SAAS,QAAQ,GAAG;AAC9L,eAAK,MAAM,QAAQ;AACnB,eAAK,MAAM,WAAW;AAAA,QACvB;AAAA,MACD,CAAC;AAED,gBAAU,YAAY,KAAK;AAE3B,YAAM,OAAO,MAAM,sBAAsB;AAEzC,gBAAU,YAAY,KAAK;AAE3B,UAAI,KAAK,QAAQ,MAAM;AACtB,eAAO,KAAK;AAAA,MACb;AAAA,IACD,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACR;AAEA,WAAS,cAAc,OAAO,UAAU;AACvC,UAAM,MAAM,WAAW,EAAE,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAEpE,QAAI,CAAC,IAAK;AAEV,QAAI,kBAAkB;AAEtB,QAAM,OAAI,aAAa,KAAK,OAAO,aAAa,aAAa;AAC5D,YAAM,QAAU,OAAI,aAAa,EAAE,cAAc,OAAO;AAExD,UAAI,OAAO;AACV,cAAM,aAAa,MAAM,iBAAiB,UAAU;AACpD,cAAM,KAAK,WAAW,WAAW,CAAC;AAElC,YAAI,IAAI;AACP,gBAAM,cAAc,GAAG,qBAAqB;AAC5C,gBAAM,UAAU,2BAA2B,aAAe,OAAI,aAAa,CAAC;AAE5E,4BAAkB,KAAK,IAAI,iBAAiB,UAAU,EAAE;AAAA,QACzD;AAEA,cAAM,OAAO,MAAM,iBAAiB,UAAU;AAC9C,cAAM,cAAc,KAAK,IAAI,KAAK,QAAQ,GAAG;AAE7C,iBAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACrC,gBAAM,KAAK,KAAK,CAAC;AACjB,gBAAM,KAAK,GAAG,SAAS,WAAW,CAAC;AAEnC,cAAI,IAAI;AACP,kBAAM,QAAQ,2BAA2B,IAAM,OAAI,aAAa,CAAC;AAEjE,8BAAkB,KAAK,IAAI,iBAAiB,QAAQ,EAAE;AAAA,UACvD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,QAAI,kBAAkB,GAAG;AACxB,YAAM,aAAa,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,eAAe,CAAC,CAAC;AAEzE,iBAAW,EAAE,eAAe,OAAO,UAAU;AAAA,IAC9C,OAAO;AACN,iBAAW,EAAE,mBAAmB,KAAK;AAAA,IACtC;AAEA,UAAM,aAAa,WAAW,EAAE,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAE3E,QAAI,cAAc,QAAQ,gBAAgB;AACzC,cAAQ,eAAe,WAAW,IAAI,WAAW,SAAS,GAAG;AAAA,IAC9D;AAAA,EACD;AAEA,WAAS,qBAAqB,OAAO,UAAU,GAAG;AACjD,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,kBAAc,OAAO,QAAQ;AAAA,EAC9B;AAEA,WAAS,qBAAqB,OAAO,UAAU,GAAG;AACjD,UAAM,SAAS,EAAE;AAEjB,QAAI,QAAQ;AACX,YAAM,OAAO,OAAO,sBAAsB;AAE1C,UAAI,KAAK,QAAQ,EAAE,WAAW,IAAI;AACjC,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,sBAAc,OAAO,QAAQ;AAAA,MAC9B;AAAA,IACD;AAAA,EACD;AAEA,WAAS,eAAe,MAAM,MAAM;AACnC,QAAI,CAAC,WAAW,EAAE,cAAe,QAAO;AAExC,UAAM,OAAO,KAAK,IAAI,WAAW,EAAE,cAAc,UAAU,WAAW,EAAE,cAAc,MAAM;AAC5F,UAAM,OAAO,KAAK,IAAI,WAAW,EAAE,cAAc,UAAU,WAAW,EAAE,cAAc,MAAM;AAC5F,UAAM,OAAO,KAAK,IAAI,WAAW,EAAE,cAAc,UAAU,WAAW,EAAE,cAAc,MAAM;AAC5F,UAAM,OAAO,KAAK,IAAI,WAAW,EAAE,cAAc,UAAU,WAAW,EAAE,cAAc,MAAM;AAE5F,WAAO,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,EAChE;AAEA,WAAS,aAAa,MAAM,MAAM;AACjC,WAAO,WAAW,EAAE,YAAY,QAAQ,QAAQ,WAAW,EAAE,YAAY,QAAQ;AAAA,EAClF;AAEA,MAAI,MAAM,OAAO;AACjB,MAAI,SAAW,SAAM,GAAG;AAExB;AACC,QAAI,aAAa,CAACC,cAAa;AAC9B,iBAAWA,WAAU;AAAA,QACpB,IAAI,aAAa;AAChB,iBAAO,WAAW;AAAA,QACnB;AAAA,MACD,CAAC;AAAA,IACF;AAEA,IAAE,MAAG,QAAQ,CAAC,aAAa;AAC1B,UAAI,eAAe,EAAG,UAAS,UAAU;AAAA,IAC1C,CAAC;AAAA,EACF;AAEA,MAAI,QAAU,WAAQ,QAAQ,CAAC;AAC/B,MAAI,UAAY,SAAM,KAAK;AAC3B,MAAI,QAAU,SAAM,OAAO;AAC3B,MAAI,OAAS,SAAM,KAAK;AACxB,MAAI,SAAW,WAAU,SAAM,IAAI,CAAC;AAEpC,EAAE,QAAK,QAAQ,IAAI,MAAM,WAAW,EAAE,SAAS,SAAS,CAAC,QAAQ,IAAI,IAAI,CAACA,WAAU,KAAK,SAAS;AACjG,QAAI,OAAOL,MAAK;AAChB,QAAI,QAAU,SAAM,IAAI;AACxB,QAAI,OAAS,SAAM,KAAK;AACxB,QAAI,OAAS,cAAW,MAAM,IAAI;AAClC,QAAI,SAAW,WAAQ,MAAM,CAAC;AAC9B,QAAI,SAAW,cAAW,MAAM;AAEhC,IAAE,SAAM,KAAK;AAEb,QAAI,QAAU,WAAQ,OAAO,CAAC;AAC9B,QAAI,QAAU,cAAW,KAAK;AAE9B,IAAE,SAAM,IAAI;AAEZ,IAAE,mBAAgB,MAAM;AACvB,MAAE,aAAU,MAAM,GAAG,sJAAsJ,QAAQ,sBAAsB,mBAAmB,gBAAgB,IAAI,eAAe;AAC/P,MAAE,aAAU,MAAM,WAAa,OAAI,GAAG,EAAE,SAAS,QAAQ,EAAE,mBAAqB,OAAI,GAAG,EAAE,SAAS,QAAQ,EAAE,mBAAqB,OAAI,GAAG,EAAE,SAAS,QAAQ,EAAE,uBAAuB;AACpL,MAAE,YAAS,MAAQ,OAAI,GAAG,EAAE,KAAK;AACjC,MAAE,YAAS,QAAQ,IAAM,OAAI,GAAG,EAAE,OAAO,EAAE,GAAG;AAE9C,MAAE,aAAU,OAAO,8GAAgH,OAAI,aAAa,MAAQ,OAAI,GAAG,EAAE,KAClK,4BACE,OAAI,YAAY,MAAQ,OAAI,GAAG,EAAE,KAClC,iEACA,aAAa,GAAG;AAAA,IACrB,CAAC;AAED,IAAE,aAAU,SAAS,MAAM,MAAM,QAAQ,sBAAwB,OAAI,GAAG,CAAC,CAAC;AAC1E,IAAE,aAAU,YAAY,MAAM,CAAC,MAAM,qBAAuB,OAAI,GAAG,EAAE,IAAM,OAAI,IAAI,GAAG,CAAC,CAAC;AACxF,IAAE,SAAM,cAAc,OAAO,MAAQ,OAAI,cAAgB,OAAI,GAAG,EAAE,IAAI,IAAI,CAAC;AAE3E,IAAE,SAAM,cAAc,OAAO,MAAM;AAClC,UAAM,OAAI,YAAY,MAAQ,OAAI,GAAG,EAAE,GAAI,CAAE,OAAI,cAAc,IAAI;AAAA,IACpE,CAAC;AAED,IAAE,aAAU,aAAa,OAAO,CAAC,MAAM,kBAAoB,OAAI,GAAG,EAAE,IAAM,OAAI,GAAG,EAAE,SAAS,KAAK,CAAC,CAAC;AACnG,IAAE,aAAU,YAAY,OAAO,CAAC,MAAM,qBAAuB,OAAI,GAAG,EAAE,IAAM,OAAI,IAAI,GAAG,CAAC,CAAC;AACzF,IAAE,UAAOK,WAAU,IAAI;AAAA,EACxB,CAAC;AAED,MAAI,SAAW,WAAQ,MAAM;AAE7B;AACC,QAAI,eAAe,CAACA,cAAa;AAChC,UAAI,OAAOJ,QAAO;AAElB,MAAE,aAAU,SAAS,MAAM,YAAa,QAAQ;AAC/C,gBAAQ,kBAAkB,MAAM,MAAM,MAAM;AAAA,MAC7C,CAAC;AAED,MAAE,UAAOI,WAAU,IAAI;AAAA,IACxB;AAEA,IAAE,MAAG,QAAQ,CAAC,aAAa;AAC1B,UAAI,QAAQ,iBAAkB,UAAS,YAAY;AAAA,IACpD,CAAC;AAAA,EACF;AAEA,EAAE,QAAK;AACP,EAAE,SAAM,IAAI;AACZ,EAAE,SAAM,KAAK;AAEb,MAAI,QAAU,WAAQ,KAAK;AAE3B,EAAE,QAAK,OAAO,IAAI,MAAM,WAAW,EAAE,SAAS,MAAM,CAAC,QAAQ,IAAI,IAAI,CAACA,WAAU,KAAK,SAAS;AAC7F,QAAI,OAAO,OAAO;AAClB,QAAI,OAAS,SAAM,IAAI;AACvB,QAAI,SAAW,cAAW,MAAM,IAAI;AACpC,QAAI,SAAW,WAAQ,IAAI;AAE3B,IAAE,QAAK,QAAQ,IAAI,MAAM,WAAW,EAAE,SAAS,SAAS,CAAC,QAAQ,IAAI,IAAI,CAACA,WAAU,KAAK,SAAS;AACjG,YAAM,OAAS,WAAQ,MAAM,WAAW,EAAE,QAAU,OAAI,GAAG,EAAE,IAAM,OAAI,GAAG,EAAE,EAAE,CAAC;AAC/E,YAAM,WAAa,WAAQ,MAAM,eAAiB,OAAI,IAAI,GAAK,OAAI,IAAI,CAAC,CAAC;AACzE,YAAM,SAAW,WAAQ,MAAM,aAAe,OAAI,IAAI,GAAK,OAAI,IAAI,CAAC,CAAC;AACrE,YAAM,YAAc,WAAQ,MAAM,WAAW,EAAE,aAAa,QAAU,OAAI,IAAI,KAAK,WAAW,EAAE,aAAa,QAAU,OAAI,IAAI,CAAC;AAChI,UAAI,OAAOD,QAAO;AAClB,UAAI,SAAW,SAAM,IAAI;AAEzB;AACC,YAAI,eAAe,CAACC,cAAa;AAChC,cAAI,QAAQH,QAAO;AAEnB,UAAE,yBAAsB,KAAK;AAC7B,UAAE,SAAM,QAAQ,OAAO,MAAM,WAAW,EAAE,cAAc,CAAC;AACzD,UAAE,cAAW,OAAO,MAAM,WAAW,EAAE,YAAY,CAAC,YAAY,WAAW,EAAE,aAAa,OAAO;AACjG,UAAE,UAAOG,WAAU,KAAK;AAAA,QACzB;AAEA,YAAI,eAAe,CAACA,cAAa;AAChC,gBAAM,UAAY,WAAQ,MAAM,OAAO,OAAO,EAAE,KAAO,OAAI,GAAG,GAAG,KAAO,OAAI,GAAG,GAAG,MAAQ,OAAI,IAAI,EAAE,GAAK,OAAI,IAAI,CAAC,CAAC;AACnH,cAAI,aAAe,WAAQ;AAC3B,cAAI,SAAW,eAAY,UAAU;AAErC,UAAE,WAAQ,QAAQ,MAAM,QAAQ,oBAAoB,MAAQ,OAAI,OAAO,GAAG,MAAQ,OAAI,GAAG,GAAG,MAAQ,OAAI,GAAG,CAAC;AAC5G,UAAE,UAAOA,WAAU,UAAU;AAAA,QAC9B;AAEA,YAAI,YAAY,CAACA,cAAa;AAC7B,cAAI,SAASF,QAAO;AACpB,cAAI,SAAW,cAAW,QAAQ,IAAI;AAEtC,UAAE,mBAAgB,MAAM;AACvB,YAAE,aAAU,QAAQ,GAAG,6BAA+B,OAAI,IAAI,EAAE,QAAQ,mCAAmC,EAAE,EAAE;AAC/G,YAAE,YAAS,QAAU,OAAI,IAAI,EAAE,UAAY,OAAI,IAAI,EAAE,SAAS,GAAG;AAAA,UAClE,CAAC;AAED,UAAE,UAAOE,WAAU,MAAM;AAAA,QAC1B;AAEA,QAAE,MAAG,QAAQ,CAAC,aAAa;AAC1B,cAAM,OAAI,SAAS,EAAG,UAAS,YAAY;AAAA,mBAAY,QAAQ,mBAAoB,UAAS,cAAc,CAAC;AAAA,cAAQ,UAAS,WAAW,EAAE;AAAA,QAC1I,CAAC;AAAA,MACF;AAEA,MAAE,SAAM,IAAI;AACZ,MAAE,mBAAgB,MAAQ,aAAU,MAAM,GAAG,gGAAkG,OAAI,QAAQ,IAAI,kBAAkB,EAAE,IAAM,OAAI,MAAM,IAAI,wCAAwC,EAAE,IAAI,eAAe,CAAC;AACrQ,MAAE,aAAU,SAAS,MAAM,CAAC,MAAM,gBAAkB,OAAI,IAAI,GAAK,OAAI,IAAI,GAAG,CAAC,CAAC;AAC9E,MAAE,aAAU,YAAY,MAAM,MAAM,mBAAqB,OAAI,IAAI,GAAK,OAAI,IAAI,CAAC,CAAC;AAChF,MAAE,UAAOA,WAAU,IAAI;AAAA,IACxB,CAAC;AAED,QAAI,SAAW,WAAQ,MAAM;AAE7B;AACC,UAAI,eAAe,CAACA,cAAa;AAChC,YAAI,OAAO,OAAO;AAElB,QAAE,UAAOA,WAAU,IAAI;AAAA,MACxB;AAEA,MAAE,MAAG,QAAQ,CAAC,aAAa;AAC1B,YAAI,QAAQ,iBAAkB,UAAS,YAAY;AAAA,MACpD,CAAC;AAAA,IACF;AAEA,IAAE,QAAK;AACP,IAAE,SAAM,IAAI;AAEZ,IAAE,mBAAgB,MAAM;AACvB,MAAE,aAAU,MAAM,YAAc,OAAI,GAAG,EAAE,UAAU,OAAO,EAAE,KAAK;AACjE,MAAE,YAAS,QAAU,OAAI,IAAI,IAAI,CAAC;AAAA,IACnC,CAAC;AAED,IAAE,UAAOA,WAAU,IAAI;AAAA,EACxB,CAAC;AAED,EAAE,SAAM,KAAK;AACb,EAAE,SAAM,OAAO;AACf,EAAE,SAAM,KAAK;AACb,EAAE,SAAM,GAAG;AACX,EAAE,aAAU,KAAK,CAAC,YAAc,OAAI,eAAe,OAAO,GAAG,MAAQ,OAAI,aAAa,CAAC;AACvF,EAAE,mBAAgB,MAAQ,aAAU,KAAK,GAAG,6IAA6I,UAAU,KAAK,EAAE,IAAI,eAAe,CAAC;AAC9N,EAAE,aAAU,WAAW,KAAK,aAAa;AACzC,EAAE,UAAO,UAAU,GAAG;AACtB,EAAE,OAAI;AACP;AAEE,YAAS,CAAC,WAAW,SAAS,YAAY,WAAW,CAAC;;;ADvcjD,IAAMC,0BACX;AACK,IAAMC,cACX;AACK,IAAMC,oBACX;","names":["$","$$anchor","$","root","$$anchor","$","root","root_1","$$anchor","state","event","HistoryManager","createHistoryManager","$","indexToColName","$","root","index","document","root","root_1","root_2","root_3","root_4","$$anchor","EditableTextNodeEditor","BubbleMenu","TemplateRenderer"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixerate/editor-svelte",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "Svelte bindings and prompt/rich-text components for @pixerate/editor",
5
5
  "author": "Pixerate",
6
6
  "license": "MIT",
@@ -46,7 +46,7 @@
46
46
  "@tiptap/extension-placeholder": "^2.11.5",
47
47
  "@tiptap/pm": "^2.11.5",
48
48
  "@tiptap/starter-kit": "^2.11.5",
49
- "@pixerate/editor": "0.7.0"
49
+ "@pixerate/editor": "0.8.0"
50
50
  },
51
51
  "peerDependencies": {
52
52
  "@xyflow/svelte": "^1.6.0",
@@ -0,0 +1,95 @@
1
+ import { HistoryManager } from "@pixerate/editor";
2
+
3
+ export interface HistoryShortcutsOptions {
4
+ /**
5
+ * Whether keyboard shortcuts are enabled. Defaults to true.
6
+ */
7
+ enabled?: boolean;
8
+ /**
9
+ * Target element or window to listen on. Defaults to window.
10
+ */
11
+ target?: Window | HTMLElement | null;
12
+ /**
13
+ * When true (default), shortcuts will not trigger if an <input>, <textarea>,
14
+ * or [contenteditable] element is currently active / focused.
15
+ */
16
+ ignoreEditableElements?: boolean;
17
+ }
18
+
19
+ /**
20
+ * Attaches keyboard listeners for Undo (Mod+Z) and Redo (Mod+Shift+Z / Mod+Y).
21
+ * Returns an object with a `destroy()` function for lifecycle cleanup.
22
+ */
23
+ export function createHistoryShortcuts(
24
+ manager: HistoryManager,
25
+ options: HistoryShortcutsOptions = {},
26
+ ): { destroy: () => void } {
27
+ const {
28
+ enabled = true,
29
+ target,
30
+ ignoreEditableElements = true,
31
+ } = options;
32
+
33
+ if (!enabled) {
34
+ return { destroy: () => {} };
35
+ }
36
+
37
+ const eventTarget = target ?? (typeof window !== "undefined" ? window : null);
38
+ if (!eventTarget) {
39
+ return { destroy: () => {} };
40
+ }
41
+
42
+ const handleKeyDown = (event: Event) => {
43
+ const e = event as KeyboardEvent;
44
+ const isMac =
45
+ typeof navigator !== "undefined" &&
46
+ /Mac|iPod|iPhone|iPad/.test(navigator.platform || navigator.userAgent);
47
+ const modifier = isMac ? e.metaKey : e.ctrlKey;
48
+
49
+ if (!modifier) return;
50
+
51
+ if (ignoreEditableElements && typeof document !== "undefined") {
52
+ const targetEl = (e.target || document.activeElement) as HTMLElement | null;
53
+ if (targetEl && targetEl.tagName) {
54
+ const tagName = targetEl.tagName.toLowerCase();
55
+ const isInput = tagName === "input" || tagName === "textarea";
56
+ const isContentEditable =
57
+ targetEl.isContentEditable ||
58
+ targetEl.getAttribute?.("contenteditable") === "true";
59
+ if (isInput || isContentEditable) {
60
+ return;
61
+ }
62
+ }
63
+ }
64
+
65
+ const key = e.key?.toLowerCase();
66
+
67
+ // Undo: Mod+Z (without Shift)
68
+ if (key === "z" && !e.shiftKey) {
69
+ if (manager.getState().canUndo) {
70
+ e.preventDefault();
71
+ manager.undo();
72
+ }
73
+ return;
74
+ }
75
+
76
+ // Redo: Mod+Shift+Z or (on non-Mac) Mod+Y
77
+ const isRedoKey =
78
+ (key === "z" && e.shiftKey) || (!isMac && key === "y" && !e.shiftKey);
79
+
80
+ if (isRedoKey) {
81
+ if (manager.getState().canRedo) {
82
+ e.preventDefault();
83
+ manager.redo();
84
+ }
85
+ }
86
+ };
87
+
88
+ eventTarget.addEventListener("keydown", handleKeyDown);
89
+
90
+ return {
91
+ destroy: () => {
92
+ eventTarget.removeEventListener("keydown", handleKeyDown);
93
+ },
94
+ };
95
+ }
@@ -0,0 +1,68 @@
1
+ import {
2
+ HistoryManager,
3
+ HistoryState,
4
+ Command,
5
+ createHistoryManager,
6
+ HistoryManagerOptions,
7
+ } from "@pixerate/editor";
8
+
9
+ export interface SvelteHistory extends HistoryState {
10
+ readonly manager: HistoryManager;
11
+ undo(): boolean;
12
+ redo(): boolean;
13
+ clear(): void;
14
+ execute(command: Command): void;
15
+ executeMerged(command: Command, options?: { windowMs?: number }): void;
16
+ batch(name: string, fn: () => void): void;
17
+ subscribe(run: (value: HistoryState) => void): () => void;
18
+ }
19
+
20
+ /**
21
+ * Creates a reactive Svelte 5 rune-based and Svelte store-compatible history adapter.
22
+ */
23
+ export function createHistory(
24
+ managerOrOptions?: HistoryManager | HistoryManagerOptions,
25
+ ): SvelteHistory {
26
+ const manager =
27
+ managerOrOptions instanceof HistoryManager
28
+ ? managerOrOptions
29
+ : createHistoryManager(managerOrOptions);
30
+
31
+ let state = $state<HistoryState>(manager.getState());
32
+
33
+ manager.subscribe((newState) => {
34
+ state = newState;
35
+ });
36
+
37
+ return {
38
+ get canUndo() {
39
+ return state.canUndo;
40
+ },
41
+ get canRedo() {
42
+ return state.canRedo;
43
+ },
44
+ get undoName() {
45
+ return state.undoName;
46
+ },
47
+ get redoName() {
48
+ return state.redoName;
49
+ },
50
+ get undoCount() {
51
+ return state.undoCount;
52
+ },
53
+ get redoCount() {
54
+ return state.redoCount;
55
+ },
56
+ get manager() {
57
+ return manager;
58
+ },
59
+ undo: () => manager.undo(),
60
+ redo: () => manager.redo(),
61
+ clear: () => manager.clear(),
62
+ execute: (cmd: Command) => manager.execute(cmd),
63
+ executeMerged: (cmd: Command, opts?: { windowMs?: number }) =>
64
+ manager.executeMerged(cmd, opts),
65
+ batch: (name: string, fn: () => void) => manager.batch(name, fn),
66
+ subscribe: (run: (value: HistoryState) => void) => manager.subscribe(run),
67
+ };
68
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./history.svelte";
2
+ export * from "./createHistoryShortcuts";
package/src/index.d.ts CHANGED
@@ -206,9 +206,42 @@ export declare function createNavigationGuard(
206
206
  options: CreateNavigationGuardOptions,
207
207
  ): NavigationGuardManager;
208
208
 
209
+ export interface SvelteHistory extends HistoryState {
210
+ readonly manager: HistoryManager;
211
+ undo(): boolean;
212
+ redo(): boolean;
213
+ clear(): void;
214
+ execute(command: Command): void;
215
+ executeMerged(command: Command, options?: { windowMs?: number }): void;
216
+ batch(name: string, fn: () => void): void;
217
+ subscribe(run: (value: HistoryState) => void): () => void;
218
+ }
219
+
220
+ export declare function createHistory(
221
+ managerOrOptions?: HistoryManager | HistoryManagerOptions,
222
+ ): SvelteHistory;
223
+
224
+ export interface HistoryShortcutsOptions {
225
+ enabled?: boolean;
226
+ target?: Window | HTMLElement | null;
227
+ ignoreEditableElements?: boolean;
228
+ }
229
+
230
+ export declare function createHistoryShortcuts(
231
+ manager: HistoryManager,
232
+ options?: HistoryShortcutsOptions,
233
+ ): { destroy: () => void };
234
+
209
235
  export {
210
236
  DirtyTracker,
211
237
  createDirtyTracker,
212
238
  defaultIsEqual,
239
+ HistoryManager,
240
+ createHistoryManager,
241
+ } from "@pixerate/editor";
242
+ export type {
243
+ DirtyTrackerOptions,
244
+ Command,
245
+ HistoryState,
246
+ HistoryManagerOptions,
213
247
  } from "@pixerate/editor";
214
- export type { DirtyTrackerOptions } from "@pixerate/editor";
package/src/index.ts CHANGED
@@ -15,13 +15,21 @@ import TemplateRendererComponent from "./TemplateRenderer.svelte";
15
15
  export * from "./editor.svelte";
16
16
  export * from "./navigationGuard";
17
17
  export * from "./createNavigationGuard.svelte";
18
+ export * from "./history";
18
19
 
19
20
  export {
20
21
  DirtyTracker,
21
22
  createDirtyTracker,
22
23
  defaultIsEqual,
24
+ HistoryManager,
25
+ createHistoryManager,
26
+ } from "@pixerate/editor";
27
+ export type {
28
+ DirtyTrackerOptions,
29
+ Command,
30
+ HistoryState,
31
+ HistoryManagerOptions,
23
32
  } from "@pixerate/editor";
24
- export type { DirtyTrackerOptions } from "@pixerate/editor";
25
33
 
26
34
  export interface EditableTextNodeEditorProps {
27
35
  class?: string;