@k2b/ui 0.28.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/dist/browser/actions/ContextMenu.js +5 -0
  2. package/dist/browser/actions/ContextMenu.js.map +1 -1
  3. package/dist/browser/actions/DragAndDrop.js +89 -0
  4. package/dist/browser/actions/DragAndDrop.js.map +1 -0
  5. package/dist/browser/actions/GestureMenu.js +26 -3
  6. package/dist/browser/actions/GestureMenu.js.map +1 -1
  7. package/dist/browser/actions/drag-and-drop-messages.js +75 -0
  8. package/dist/browser/actions/drag-and-drop-messages.js.map +1 -0
  9. package/dist/browser/actions/drag-and-drop.js +692 -0
  10. package/dist/browser/actions/drag-and-drop.js.map +1 -0
  11. package/dist/browser/actions/index.js +1 -0
  12. package/dist/browser/actions/index.js.map +1 -1
  13. package/dist/browser/chat/ChatComposer.js +385 -265
  14. package/dist/browser/chat/ChatComposer.js.map +1 -1
  15. package/dist/browser/chat/ChatDecision.js +778 -0
  16. package/dist/browser/chat/ChatDecision.js.map +1 -0
  17. package/dist/browser/chat/ChatPrimitives.js +34 -28
  18. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  19. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  20. package/dist/browser/chat/chat-messages.js +6 -0
  21. package/dist/browser/chat/chat-messages.js.map +1 -1
  22. package/dist/browser/chat/command-search.js +10 -3
  23. package/dist/browser/chat/command-search.js.map +1 -1
  24. package/dist/browser/chat/index.js +6 -1
  25. package/dist/browser/chat/index.js.map +1 -1
  26. package/dist/browser/chat/types.js.map +1 -1
  27. package/dist/browser/content/Calendar.js +3 -3
  28. package/dist/browser/content/Calendar.js.map +1 -1
  29. package/dist/browser/content/Chart.js +54 -71
  30. package/dist/browser/content/Chart.js.map +1 -1
  31. package/dist/browser/content/FileBrowser.js +2 -2
  32. package/dist/browser/content/FileBrowser.js.map +1 -1
  33. package/dist/browser/content/FileTree.js +42 -36
  34. package/dist/browser/content/FileTree.js.map +1 -1
  35. package/dist/browser/content/FileTypeIcon.js +72 -0
  36. package/dist/browser/content/FileTypeIcon.js.map +1 -0
  37. package/dist/browser/content/FileView.js +2 -2
  38. package/dist/browser/content/FileView.js.map +1 -1
  39. package/dist/browser/content/ReferenceChip.js +162 -0
  40. package/dist/browser/content/ReferenceChip.js.map +1 -0
  41. package/dist/browser/content/calendar-pointer.js +9 -0
  42. package/dist/browser/content/calendar-pointer.js.map +1 -1
  43. package/dist/browser/content/calendar-time-view.js +6 -3
  44. package/dist/browser/content/calendar-time-view.js.map +1 -1
  45. package/dist/browser/content/index.js +2 -0
  46. package/dist/browser/content/index.js.map +1 -1
  47. package/dist/browser/layout/AppOverview.js +1 -1
  48. package/dist/browser/layout/AppOverview.js.map +1 -1
  49. package/dist/browser/layout/AppWorkspace.js +644 -445
  50. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  51. package/dist/browser/layout/PanelDialog.js +88 -86
  52. package/dist/browser/layout/PanelDialog.js.map +1 -1
  53. package/dist/browser/layout/ResizeSeparator.js +81 -0
  54. package/dist/browser/layout/ResizeSeparator.js.map +1 -0
  55. package/dist/browser/layout/SidebarSwitcher.js +9 -2
  56. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  57. package/dist/browser/layout/TabBar.js +15 -12
  58. package/dist/browser/layout/TabBar.js.map +1 -1
  59. package/dist/browser/layout/app-workspace-controller.js +130 -17
  60. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  61. package/dist/browser/layout/index.js +3 -1
  62. package/dist/browser/layout/index.js.map +1 -1
  63. package/dist/browser/layout/resize-separator.js +90 -0
  64. package/dist/browser/layout/resize-separator.js.map +1 -0
  65. package/dist/browser/layout/workspace-messages.js +12 -2
  66. package/dist/browser/layout/workspace-messages.js.map +1 -1
  67. package/dist/browser/surfaces/LinkCard.js +1 -1
  68. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  69. package/dist/browser/surfaces/Placeholder.js +14 -3
  70. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  71. package/dist/browser/surfaces/StatCell.js +23 -0
  72. package/dist/browser/surfaces/StatCell.js.map +1 -1
  73. package/dist/browser/widgets/Widget.js +1 -1
  74. package/dist/browser/widgets/Widget.js.map +1 -1
  75. package/dist/ssr/actions/ContextMenu.js +5 -0
  76. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  77. package/dist/ssr/actions/DragAndDrop.js +63 -0
  78. package/dist/ssr/actions/DragAndDrop.js.map +1 -0
  79. package/dist/ssr/actions/GestureMenu.js +26 -3
  80. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  81. package/dist/ssr/actions/drag-and-drop-messages.js +75 -0
  82. package/dist/ssr/actions/drag-and-drop-messages.js.map +1 -0
  83. package/dist/ssr/actions/drag-and-drop.js +692 -0
  84. package/dist/ssr/actions/drag-and-drop.js.map +1 -0
  85. package/dist/ssr/actions/index.js +1 -0
  86. package/dist/ssr/actions/index.js.map +1 -1
  87. package/dist/ssr/chat/ChatComposer.js +131 -14
  88. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  89. package/dist/ssr/chat/ChatDecision.js +465 -0
  90. package/dist/ssr/chat/ChatDecision.js.map +1 -0
  91. package/dist/ssr/chat/ChatPrimitives.js +2 -2
  92. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  93. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  94. package/dist/ssr/chat/chat-messages.js +6 -0
  95. package/dist/ssr/chat/chat-messages.js.map +1 -1
  96. package/dist/ssr/chat/command-search.js +10 -3
  97. package/dist/ssr/chat/command-search.js.map +1 -1
  98. package/dist/ssr/chat/index.js +6 -1
  99. package/dist/ssr/chat/index.js.map +1 -1
  100. package/dist/ssr/chat/types.js.map +1 -1
  101. package/dist/ssr/content/Calendar.js +3 -3
  102. package/dist/ssr/content/Calendar.js.map +1 -1
  103. package/dist/ssr/content/Chart.js +19 -23
  104. package/dist/ssr/content/Chart.js.map +1 -1
  105. package/dist/ssr/content/FileBrowser.js +2 -2
  106. package/dist/ssr/content/FileBrowser.js.map +1 -1
  107. package/dist/ssr/content/FileTree.js +21 -14
  108. package/dist/ssr/content/FileTree.js.map +1 -1
  109. package/dist/ssr/content/FileTypeIcon.js +50 -0
  110. package/dist/ssr/content/FileTypeIcon.js.map +1 -0
  111. package/dist/ssr/content/FileView.js +2 -2
  112. package/dist/ssr/content/FileView.js.map +1 -1
  113. package/dist/ssr/content/ReferenceChip.js +121 -0
  114. package/dist/ssr/content/ReferenceChip.js.map +1 -0
  115. package/dist/ssr/content/calendar-pointer.js +9 -0
  116. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  117. package/dist/ssr/content/calendar-time-view.js +6 -3
  118. package/dist/ssr/content/calendar-time-view.js.map +1 -1
  119. package/dist/ssr/content/index.js +2 -0
  120. package/dist/ssr/content/index.js.map +1 -1
  121. package/dist/ssr/layout/AppOverview.js +1 -1
  122. package/dist/ssr/layout/AppOverview.js.map +1 -1
  123. package/dist/ssr/layout/AppWorkspace.js +272 -95
  124. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  125. package/dist/ssr/layout/PanelDialog.js +7 -6
  126. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  127. package/dist/ssr/layout/ResizeSeparator.js +45 -0
  128. package/dist/ssr/layout/ResizeSeparator.js.map +1 -0
  129. package/dist/ssr/layout/SidebarSwitcher.js +9 -2
  130. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  131. package/dist/ssr/layout/TabBar.js +1 -1
  132. package/dist/ssr/layout/TabBar.js.map +1 -1
  133. package/dist/ssr/layout/app-workspace-controller.js +130 -17
  134. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  135. package/dist/ssr/layout/index.js +3 -1
  136. package/dist/ssr/layout/index.js.map +1 -1
  137. package/dist/ssr/layout/resize-separator.js +90 -0
  138. package/dist/ssr/layout/resize-separator.js.map +1 -0
  139. package/dist/ssr/layout/workspace-messages.js +12 -2
  140. package/dist/ssr/layout/workspace-messages.js.map +1 -1
  141. package/dist/ssr/surfaces/LinkCard.js +1 -1
  142. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  143. package/dist/ssr/surfaces/Placeholder.js +4 -2
  144. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  145. package/dist/ssr/surfaces/StatCell.js +23 -0
  146. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  147. package/dist/ssr/widgets/Widget.js +1 -1
  148. package/dist/ssr/widgets/Widget.js.map +1 -1
  149. package/dist/styles.css +1 -1
  150. package/dist/types/actions/ContextMenu.d.ts +1 -0
  151. package/dist/types/actions/DragAndDrop.d.ts +29 -0
  152. package/dist/types/actions/drag-and-drop-messages.d.ts +35 -0
  153. package/dist/types/actions/drag-and-drop.d.ts +36 -0
  154. package/dist/types/actions/index.d.ts +2 -0
  155. package/dist/types/chat/ChatComposer.d.ts +19 -1
  156. package/dist/types/chat/ChatDecision.d.ts +133 -0
  157. package/dist/types/chat/ChatPrimitives.d.ts +4 -1
  158. package/dist/types/chat/ChatTimeline.d.ts +2 -1
  159. package/dist/types/chat/chat-messages.d.ts +3 -0
  160. package/dist/types/chat/command-search.d.ts +3 -0
  161. package/dist/types/chat/index.d.ts +23 -1
  162. package/dist/types/chat/types.d.ts +54 -1
  163. package/dist/types/content/Chart.d.ts +9 -3
  164. package/dist/types/content/FileTypeIcon.d.ts +27 -0
  165. package/dist/types/content/ReferenceChip.d.ts +49 -0
  166. package/dist/types/content/calendar-pointer.d.ts +6 -0
  167. package/dist/types/content/index.d.ts +3 -0
  168. package/dist/types/layout/AppWorkspace.d.ts +5 -3
  169. package/dist/types/layout/ResizeSeparator.d.ts +9 -0
  170. package/dist/types/layout/TabBar.d.ts +7 -0
  171. package/dist/types/layout/app-workspace-controller.d.ts +2 -0
  172. package/dist/types/layout/index.d.ts +3 -1
  173. package/dist/types/layout/resize-separator.d.ts +18 -0
  174. package/dist/types/layout/workspace-messages.d.ts +5 -0
  175. package/dist/types/surfaces/StatCell.d.ts +6 -0
  176. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/FileView.tsx"],"sourcesContent":["import { useMarkdownEditorMessages } from \"../inputs/markdown/editor-messages\";\nimport { useDataTableMessages } from \"./data-table-messages\";\nimport { useFileViewMessages } from \"./file-view-messages\";\n/**\n * FileView — renders one file through a small renderer registry keyed by\n * media type / path. Editing is enabled purely by the presence of `save`;\n * without it every renderer is read-only. IDE-style chrome: editors reuse\n * the markdown editor's surface (toolbar with an in-toolbar save, Ctrl/Cmd+S),\n * previews are quiet paper panels with icon-only actions overlaid top-right.\n * A plain preview drops the panel and sits on its host's surface instead.\n * Custom renderers are passed per instance, which keeps SSR requests and\n * independently mounted applications isolated.\n */\n\nimport { mutation } from \"@k2b/stdlib/solid\";\nimport {\n type Component,\n createContext,\n createEffect,\n createMemo,\n createResource,\n createSignal,\n For,\n type JSX,\n Match,\n onCleanup,\n onMount,\n Show,\n Switch,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { prompts } from \"../feedback/prompts\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { toast } from \"../feedback/toast\";\nimport { MarkdownEditor } from \"../inputs/markdown/MarkdownEditor\";\nimport { Select } from \"../inputs/Select\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport CodeDisplay, { type CodeDisplayLanguage } from \"./CodeDisplay\";\nimport { type DelimitedPreferences, decodeDelimitedContent, readDelimitedPreferences } from \"./delimited-preferences\";\nimport { type FileViewFile, fileViewExtension, getFileViewPreviewKind, parseDelimitedText } from \"./file-view-preview\";\nimport MarkdownView from \"./MarkdownView\";\nimport { leadingMarkdownTitle } from \"./markdown-title\";\nimport PdfPreview from \"./PdfPreview\";\nimport StructuredDataPreview, { type StructuredDataValue } from \"./StructuredDataPreview\";\nimport VideoPlayer from \"./VideoPlayer\";\n\nexport type { FileViewFile, FileViewPreviewKind } from \"./file-view-preview\";\nexport { canPreviewFile, getFileViewPreviewKind } from \"./file-view-preview\";\nexport type FileViewContent = { encoding: \"utf8\" | \"base64\"; content: string; mediaType: string };\n\nexport type FileViewProps = {\n /**\n * Plain previews inherit the surrounding surface without a frame or inset padding. They keep their natural height,\n * so the host scrolls them and owns the actions around them; a host that stretches one gets its scrolling back.\n */\n variant?: \"default\" | \"plain\";\n /**\n * Lifts a leading Markdown level-one heading into the host, for example a dialog title. Reports its plain text and\n * leaves that heading out of the preview, or reports null when the shown file has none, the heading holds a link or\n * image or is the whole document, or the file fails to load.\n */\n onDocumentTitle?: (title: string | null) => void;\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n load: () => Promise<FileViewContent>;\n /** Refetch the current path when this host-owned revision changes. */\n revision?: unknown;\n /** Register an awaitable refresh for the currently visible preview. */\n registerRefresh?: (refresh: () => Promise<void>) => void | (() => void);\n /** Presence enables editing for text-based renderers. */\n save?: (content: string) => Promise<void>;\n /** Authenticated inline URL used by browser-native image, PDF, audio, and video previews. */\n previewHref?: string | null;\n /** CORS mode for native image/audio/video previews. Omit to preserve browser defaults. */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n /** Native media failed to load; the host can renew a signed URL and offer retry. */\n onPreviewError?: () => void;\n /** Download actions only; never a preview source, because an attachment response does not render inline. */\n downloadHref?: string | null;\n /** App-specific renderers matched before the built-ins for this instance. */\n renderers?: readonly FileViewRenderer[];\n /** Reports local edit state so a parent browser can guard navigation. */\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\nexport type FileViewRendererProps = {\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n content: FileViewContent;\n previewHref: string | null;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n onPreviewError?: () => void;\n downloadHref: string | null;\n /** Null when the file is read-only. */\n editor: {\n draft: () => string;\n setDraft: (value: string) => void;\n dirty: () => boolean;\n saving: () => boolean;\n save: () => Promise<void>;\n } | null;\n};\n\nexport type FileViewRenderer = {\n id: string;\n match: (file: FileViewFile, content: FileViewContent) => boolean;\n component: Component<FileViewRendererProps>;\n /** Text renderers that support the edit affordance when `save` is present. */\n editable?: boolean;\n};\n\n/** Instance options that reach the built-in renderers without widening the public renderer props. */\nconst FileViewHost = createContext({ plain: false, liftTitle: false });\n\nconst codeLanguage = (path: string): CodeDisplayLanguage => {\n const extension = fileViewExtension(path);\n if (extension === \"ts\" || extension === \"mts\" || extension === \"cts\") return \"ts\";\n if (extension === \"tsx\") return \"tsx\";\n if (extension === \"js\" || extension === \"mjs\" || extension === \"cjs\") return \"js\";\n if (extension === \"jsx\") return \"jsx\";\n if (extension === \"md\" || extension === \"markdown\") return \"md\";\n return \"text\";\n};\n\nconst isMarkdown = (file: FileViewFile, content: FileViewContent) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"markdown\";\n\n/** Rendered previews hide a leading YAML frontmatter block — it's metadata, not content. */\nconst stripFrontmatter = (text: string): string => {\n const match = /^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/.exec(text.trimStart());\n return match ? text.trimStart().slice(match[0].length) : text;\n};\n\n/** Icon-only download link with the shared tooltip, for toolbars that style their own controls. */\nfunction DownloadLink(props: { class: string; href: string; download: string; label: string; icon: string }) {\n let link: HTMLAnchorElement | undefined;\n return (\n <>\n <a ref={link} class={props.class} href={props.href} download={props.download} aria-label={props.label}>\n <i class={props.icon} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{props.label}</span>\n </a>\n <Tooltip content={props.label} target={() => link} />\n </>\n );\n}\n\n/** Icon-only action, IDE style — sits in the floating top-right cluster of previews. */\nfunction OverlayAction(props: { icon: string; title: string; onClick?: () => void; href?: string; download?: string }) {\n const classes = \"k2b-content-file-view__action\";\n return (\n <Show\n when={props.href}\n fallback={\n <Tooltip.Trigger type=\"button\" class={classes} content={props.title} aria-label={props.title} onClick={props.onClick}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n {(href) => (\n <DownloadLink class={classes} href={href()} download={props.download ?? \"\"} label={props.title} icon={`ti ${props.icon}`} />\n )}\n </Show>\n );\n}\n\n/** Scrollable preview panel with the floating action cluster overlaid top-right. */\nfunction OverlayPanel(props: { actions?: JSX.Element; children: JSX.Element }) {\n return (\n <div class=\"k2b-content-file-view__panel\">\n <div class=\"k2b-content-file-view__preview\">{props.children}</div>\n <Show when={props.actions}>\n <div class=\"k2b-content-file-view__overlay\">{props.actions}</div>\n </Show>\n </div>\n );\n}\n\nconst DownloadAction = (props: FileViewRendererProps): JSX.Element => {\n const messages = useUiMessages();\n return (\n <Show when={props.downloadHref}>\n {(href) => (\n <OverlayAction\n icon=\"ti-download\"\n title={messages().download}\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n />\n )}\n </Show>\n );\n};\n\n/** Toolbar-styled icon button — reuses the package markdown-editor tool primitive. */\nfunction EditorToolButton(props: { icon: string; title: string; onClick: () => void; disabled?: boolean }) {\n return (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n content={props.title}\n aria-label={props.title}\n tabIndex={-1}\n disabled={props.disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={props.onClick}\n >\n <i class={props.icon} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n );\n}\n\n// ── Built-in renderers ──────────────────────────────────────────────────────\n\nfunction MoreLines(props: { count: number; onClick?: () => void }) {\n const fileViewMessages = useFileViewMessages();\n return (\n <Show when={props.count > 0}>\n <div class=\"k2b-content-file-view__truncated\">\n <Show when={props.onClick} fallback={<span>{fileViewMessages().previewMoreLines(props.count)}</span>}>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.onClick}>\n {fileViewMessages().previewMoreLines(props.count)}\n </Button>\n </Show>\n </div>\n </Show>\n );\n}\nfunction TextExcerpt(props: { renderer: FileViewRendererProps; text: string; markdown?: boolean }) {\n const lines = createMemo(() => props.text.replace(/\\r\\n?/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\"));\n const limit = () => (props.renderer.previewLines === undefined ? lines().length : Math.max(1, props.renderer.previewLines));\n const text = () => lines().slice(0, limit()).join(\"\\n\");\n const host = useContext(FileViewHost);\n // A plain preview has no code box: the host frames the file and owns its copy action.\n const content = () => (\n <Show\n when={props.markdown}\n fallback={<CodeDisplay code={text()} language={codeLanguage(props.renderer.file.path)} copy={host.plain ? false : undefined} />}\n >\n <MarkdownView markdown={text()} headingScale={props.renderer.headingScale ?? \"compact\"} />\n </Show>\n );\n // Only an excerpt needs a clipping box; a complete preview keeps its content\n // a direct child of the preview frame, which the frame's styles expect.\n return (\n <>\n <Show when={props.renderer.previewLines !== undefined} fallback={content()}>\n <div class=\"k2b-content-file-view__excerpt\">{content()}</div>\n </Show>\n <MoreLines count={lines().length - limit()} onClick={props.renderer.onExpandPreview} />\n </>\n );\n}\n\nfunction MarkdownRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const host = useContext(FileViewHost);\n const [editing, setEditing] = createSignal(false);\n const markdown = () => {\n const text = stripFrontmatter(props.editor?.draft() ?? props.content.content);\n return host.liftTitle ? (leadingMarkdownTitle(text)?.body ?? text) : text;\n };\n return (\n <Show\n when={props.editor && editing()}\n fallback={\n <OverlayPanel\n actions={\n <>\n <Show when={props.editor}>\n <OverlayAction icon=\"ti-pencil\" title={messages().edit} onClick={() => setEditing(true)} />\n </Show>\n <DownloadAction {...props} />\n </>\n }\n >\n <div class=\"k2b-content-file-view__document\">\n <TextExcerpt renderer={props} text={markdown()} markdown />\n </div>\n </OverlayPanel>\n }\n >\n {(_) => {\n const editor = props.editor!;\n return (\n <div class=\"k2b-content-file-view__editor\">\n <MarkdownEditor\n class=\"k2b-content-file-view__markdown-field\"\n aria-label={`Edit ${props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}`}\n fill\n value={editor.draft()}\n onValueChange={editor.setDraft}\n showStats={false}\n onSave={() => void editor.save()}\n saveDisabled={!editor.dirty()}\n saving={editor.saving()}\n toolbarTrailing={<EditorToolButton icon=\"ti ti-eye\" title={messages().preview} onClick={() => setEditing(false)} />}\n />\n </div>\n );\n }}\n </Show>\n );\n}\n\nfunction TextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const markdownEditorMessages = useMarkdownEditorMessages();\n return (\n <Show\n when={props.editor}\n fallback={\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <TextExcerpt renderer={props} text={props.content.content} />\n </OverlayPanel>\n }\n >\n {(editor) => (\n // Same chrome as the markdown editor — literally the same classes, so\n // border, radius, focus ring, toolbar height and text metrics cannot drift.\n <div class=\"k2b-content-file-view__editor\">\n <div\n class=\"k2b-markdown-editor\"\n data-fill=\"true\"\n role=\"group\"\n aria-label={fileViewMessages().textEditor}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"s\") {\n event.preventDefault();\n if (editor().dirty() && !editor().saving()) void editor().save();\n }\n }}\n >\n {/* No formatting tools here — the divider under an actions-only bar reads lost. */}\n <div class=\"k2b-markdown-editor__toolbar k2b-content-file-view__code-toolbar\">\n <span class=\"k2b-content-file-view__code-language\">{codeLanguage(props.file.path)}</span>\n <span class=\"k2b-markdown-editor__trailing\">\n <Show when={props.downloadHref}>\n {(href) => (\n <DownloadLink\n class=\"k2b-markdown-editor__tool\"\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n label={messages().download}\n icon=\"ti ti-download\"\n />\n )}\n </Show>\n <EditorToolButton\n icon={editor().saving() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-device-floppy\"}\n title={markdownEditorMessages().saveShortcut}\n disabled={!editor().dirty() || editor().saving()}\n onClick={() => void editor().save()}\n />\n </span>\n </div>\n <div class=\"k2b-markdown-editor__surface\">\n <textarea\n class=\"k2b-content-file-view__code-input\"\n value={editor().draft()}\n spellcheck={false}\n onInput={(event) => editor().setDraft(event.currentTarget.value)}\n />\n </div>\n </div>\n </div>\n )}\n </Show>\n );\n}\n\nfunction JsonRenderer(props: FileViewRendererProps) {\n const parsed = createMemo(() => {\n try {\n return { ok: true as const, value: JSON.parse(props.content.content) as StructuredDataValue };\n } catch {\n return { ok: false as const };\n }\n });\n const parsedValue = (): StructuredDataValue => {\n const result = parsed();\n return result.ok ? result.value : null;\n };\n\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__document\">\n <Show when={parsed().ok} fallback={<TextExcerpt renderer={props} text={props.content.content} />}>\n <Show\n when={props.previewLines === undefined}\n fallback={<TextExcerpt renderer={props} text={JSON.stringify(parsedValue(), null, 2)} />}\n >\n <StructuredDataPreview data={parsedValue()} maxRows={200} />\n </Show>\n </Show>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction DelimitedTextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const dataTableMessages = useDataTableMessages();\n const [preferences, setPreferences] = createSignal<DelimitedPreferences>({ encoding: \"utf-8\", delimiter: \"auto\", view: \"table\" });\n onMount(() => {\n if (!props.previewPreferencesKey) return;\n try {\n setPreferences(readDelimitedPreferences(localStorage.getItem(props.previewPreferencesKey)));\n } catch {\n /* Storage may be disabled. */\n }\n });\n const update = (patch: Partial<DelimitedPreferences>) => {\n const next = { ...preferences(), ...patch };\n setPreferences(next);\n if (props.previewPreferencesKey) {\n try {\n localStorage.setItem(props.previewPreferencesKey, JSON.stringify(next));\n } catch {\n /* Keep the local selection. */\n }\n }\n };\n const text = createMemo(() => decodeDelimitedContent(props.content, preferences().encoding));\n const delimiter = () =>\n preferences().delimiter === \"auto\"\n ? fileViewExtension(props.file.path) === \"tsv\" || props.content.mediaType === \"text/tab-separated-values\"\n ? \"\\t\"\n : \",\"\n : preferences().delimiter;\n const [page, setPage] = createSignal(0);\n createEffect(() => {\n text();\n delimiter();\n props.previewLines;\n setPage(0);\n });\n const pageSize = () => (props.previewLines === undefined ? 200 : Math.max(1, props.previewLines));\n const preview = createMemo(() => parseDelimitedText(text(), delimiter(), { rows: pageSize() + 1, offset: page() * pageSize() }));\n const settings = () =>\n prompts.dialog(\n () => (\n <div class=\"k2b-content-file-view__settings\">\n <Select\n label={fileViewMessages().csvEncoding}\n value={preferences().encoding}\n disabled={props.content.encoding !== \"base64\"}\n options={[\"utf-8\", \"windows-1252\", \"utf-16le\", \"utf-16be\"]}\n onValueChange={(value) => {\n if (value) update({ encoding: value });\n }}\n />\n <Select\n label={fileViewMessages().csvSeparator}\n value={preferences().delimiter}\n options={[\n { value: \"auto\", label: fileViewMessages().csvDefaultSeparator },\n { value: \",\", label: fileViewMessages().csvComma },\n { value: \";\", label: fileViewMessages().csvSemicolon },\n { value: \"\\t\", label: fileViewMessages().csvTab },\n { value: \"|\", label: \"|\" },\n ]}\n onValueChange={(value) => {\n if (value) update({ delimiter: value });\n }}\n />\n <Select\n label={fileViewMessages().csvView}\n value={preferences().view}\n options={[\n { value: \"table\", label: dataTableMessages().dataTable },\n { value: \"raw\", label: fileViewMessages().csvRaw },\n ]}\n onValueChange={(value) => {\n if (value === \"table\" || value === \"raw\") update({ view: value });\n }}\n />\n </div>\n ),\n { title: fileViewMessages().csvSettings },\n );\n const headers = createMemo(() => preview().rows[0] ?? []);\n const rows = createMemo(() => preview().rows.slice(1));\n\n return (\n <OverlayPanel\n actions={\n <>\n <OverlayAction icon=\"ti-adjustments-horizontal\" title={fileViewMessages().csvSettings} onClick={() => void settings()} />\n <DownloadAction {...props} />\n </>\n }\n >\n <Show when={preferences().view === \"table\"} fallback={<TextExcerpt renderer={props} text={text()} />}>\n <Show\n when={headers().length > 0}\n fallback={\n <Placeholder icon=\"ti ti-table\" title={fileViewMessages().emptyFile} description={fileViewMessages().delimitedFileEmpty} />\n }\n >\n <div class=\"k2b-content-file-view__sheet\">\n <table class=\"k2b-content-file-view__table\">\n <thead>\n <tr>\n <For each={headers()}>\n {(header, index) => (\n <th scope=\"col\">\n <span>{header || fileViewMessages().column({ number: index() + 1 })}</span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={rows()}>\n {(row) => (\n <tr>\n <For each={headers()}>{(_, index) => <td>{row[index()] ?? \"\"}</td>}</For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n <Show when={preview().columnsTruncated}>\n <div class=\"k2b-content-file-view__truncated\">{fileViewMessages().previewColumnsLimited}</div>\n </Show>\n <Show\n when={props.previewLines !== undefined}\n fallback={\n <Show when={preview().totalRows > 201}>\n <div class=\"k2b-content-file-view__pagination\">\n <Button size=\"sm\" variant=\"ghost\" disabled={page() === 0} onClick={() => setPage(page() - 1)}>\n {messages().previous}\n </Button>\n <span>\n {page() * pageSize() + 1}–{Math.min((page() + 1) * pageSize(), preview().totalRows - 1)} / {preview().totalRows - 1}\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={(page() + 1) * pageSize() >= preview().totalRows - 1}\n onClick={() => setPage(page() + 1)}\n >\n {messages().next}\n </Button>\n </div>\n </Show>\n }\n >\n <MoreLines count={preview().totalRows - rows().length - 1} onClick={props.onExpandPreview} />\n </Show>\n </div>\n </Show>\n </Show>\n </OverlayPanel>\n );\n}\n\nconst mediaSource = (props: FileViewRendererProps): string =>\n props.previewHref ?? `data:${props.content.mediaType};base64,${props.content.content}`;\n\nfunction ImageRenderer(props: FileViewRendererProps) {\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\">\n <img crossOrigin={props.crossOrigin} onError={props.onPreviewError} src={mediaSource(props)} alt={props.file.path} />\n </div>\n </OverlayPanel>\n );\n}\n\nconst pdfBlob = (content: FileViewContent): Blob => {\n if (content.encoding === \"utf8\") return new Blob([content.content], { type: \"application/pdf\" });\n const binary = atob(content.content);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return new Blob([bytes], { type: \"application/pdf\" });\n};\n\n/**\n * A host inline URL goes to the browser's native viewer. Without one, the\n * loaded bytes become a local PDF Blob: a download URL is an attachment and\n * would leave a native viewer empty.\n */\nfunction PdfRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n // A new Blob remounts the preview, so changed bytes show the new file. A revision refetch\n // often returns the same bytes (the Assistant refetches on every tool step); keeping the\n // Blob then keeps the reader's page instead of reloading the viewer.\n const bytes = createMemo(() => props.content, undefined, {\n equals: (previous, next) => previous.encoding === next.encoding && previous.content === next.content,\n });\n const blob = createMemo(() => (props.previewHref || !bytes().content ? null : pdfBlob(bytes())));\n return (\n <Show\n when={props.previewHref}\n fallback={\n <Show\n keyed\n when={blob()}\n fallback={<Placeholder icon=\"ti ti-file-type-pdf\" title=\"PDF\" description={fileViewMessages().noInlinePreview} />}\n >\n {(pdf) => (\n // Composed without the standalone heading: the host already names the file, and the frame keeps the\n // file name as its accessible title.\n <PdfPreview autoLoad title={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)} request={async () => pdf}>\n {(parts) => (\n <div class=\"k2b-content-file-view__pdf-viewer\">\n {parts.actions}\n {parts.content}\n </div>\n )}\n </PdfPreview>\n )}\n </Show>\n }\n >\n {(href) => <object data={href()} type=\"application/pdf\" class=\"k2b-content-file-view__pdf\" aria-label={props.file.path} />}\n </Show>\n );\n}\n\nfunction AudioRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"audio\">\n <audio\n crossOrigin={props.crossOrigin}\n onError={props.onPreviewError}\n controls\n preload=\"metadata\"\n src={mediaSource(props)}\n aria-label={props.file.path}\n >\n {fileViewMessages().audioUnsupported}\n </audio>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction VideoRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const name = () => props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1);\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"video\">\n <VideoPlayer\n src={mediaSource(props)}\n label={name()}\n crossOrigin={props.crossOrigin}\n onFallback={props.onPreviewError}\n fallbackAction={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download={name()}>\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n </div>\n </OverlayPanel>\n );\n}\n\nfunction BinaryRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n return (\n <Placeholder\n icon=\"ti ti-file-unknown\"\n title={fileViewMessages().noPreview}\n description={props.content.mediaType || fileViewMessages().binaryFile}\n action={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download=\"\">\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n );\n}\n\nconst BUILTIN_RENDERERS: FileViewRenderer[] = [\n { id: \"markdown\", match: isMarkdown, component: MarkdownRenderer, editable: true },\n {\n id: \"image\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"image\",\n component: ImageRenderer,\n },\n {\n id: \"pdf\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"pdf\",\n component: PdfRenderer,\n },\n {\n id: \"json\",\n match: (file, content) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"json\",\n component: JsonRenderer,\n },\n {\n id: \"delimited-text\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"delimited-text\",\n component: DelimitedTextRenderer,\n },\n {\n id: \"audio\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"audio\",\n component: AudioRenderer,\n },\n {\n id: \"video\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"video\",\n component: VideoRenderer,\n },\n { id: \"text\", match: (_file, content) => content.encoding === \"utf8\", component: TextRenderer, editable: true },\n { id: \"binary\", match: () => true, component: BinaryRenderer },\n];\n\n// ── Component ───────────────────────────────────────────────────────────────\n\nexport const formatFileViewSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nexport default function FileView(props: FileViewProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const [draft, setDraft] = createSignal(\"\");\n const [savedDraft, setSavedDraft] = createSignal(\"\");\n const [nativeRevision, setNativeRevision] = createSignal(0);\n const dirty = createMemo(() => draft() !== savedDraft());\n const instanceRenderers = () => props.renderers ?? [];\n const saveMutation = mutation.create<{ path: string; content: string }, { path: string; content: string }>({\n mutation: async (input) => {\n await props.save!(input.content);\n return input;\n },\n onSuccess: (saved) => {\n if (props.file.path === saved.path) setSavedDraft(saved.content);\n toast.success(fileViewMessages().fileSaved);\n },\n onError: (error) => toast.error(error.message),\n });\n const nativePreviewHref = createMemo(() => {\n const href = props.previewHref;\n if (!href) return null;\n const separator = href.includes(\"?\") ? \"&\" : \"?\";\n return `${href}${separator}preview-revision=${nativeRevision()}`;\n });\n const browserPreviewContent = createMemo<FileViewContent | null>(() => {\n const kind = getFileViewPreviewKind(props.file);\n if (kind !== \"image\" && kind !== \"pdf\" && kind !== \"audio\" && kind !== \"video\") return null;\n const href = nativePreviewHref();\n if (!href) return null;\n\n const candidate: FileViewContent = {\n encoding: \"base64\",\n content: \"\",\n mediaType: props.file.mediaType ?? \"application/octet-stream\",\n };\n return instanceRenderers().some((renderer) => renderer.match(props.file, candidate)) ? null : candidate;\n });\n const [content, { refetch }] = createResource(\n () => (browserPreviewContent() ? null : { path: props.file.path, revision: props.revision }),\n async () => {\n saveMutation.abort();\n // `load` is an imperative source adapter. Host signal reads inside it\n // must not turn this resource into a hidden reactive feedback loop.\n const loaded = await untrack(() => props.load());\n const loadedDraft = loaded.encoding === \"utf8\" ? loaded.content : \"\";\n setDraft(loadedDraft);\n setSavedDraft(loadedDraft);\n return loaded;\n },\n );\n createEffect(() => {\n if (!props.registerRefresh) return;\n const unregister = props.registerRefresh(async () => {\n if (browserPreviewContent()) setNativeRevision((value) => value + 1);\n else await refetch();\n });\n if (unregister) onCleanup(unregister);\n });\n // An errored resource throws when read; the error state below shows it instead.\n const resolvedContent = createMemo(() => browserPreviewContent() ?? (content.error ? undefined : content()));\n\n const renderer = createMemo(() => {\n const loaded = resolvedContent();\n if (!loaded) return null;\n return [...instanceRenderers(), ...BUILTIN_RENDERERS].find((candidate) => candidate.match(props.file, loaded)) ?? null;\n });\n\n createEffect(() => {\n props.onDirtyChange?.(dirty());\n });\n\n const save = async () => {\n if (!props.save || saveMutation.loading()) return;\n await saveMutation.mutate({ path: props.file.path, content: draft() });\n };\n\n const editor = () =>\n props.save && renderer()?.editable && resolvedContent()?.encoding === \"utf8\"\n ? {\n draft,\n setDraft,\n dirty,\n saving: saveMutation.loading,\n save,\n }\n : null;\n\n // Undefined while loading; the host keeps its own placeholder until the shown file decides.\n const documentTitle = createMemo<string | null | undefined>(() => {\n if (!props.onDocumentTitle) return undefined;\n if (content.error) return null;\n const loaded = resolvedContent();\n if (!loaded) return undefined;\n if (renderer()?.component !== MarkdownRenderer) return null;\n return leadingMarkdownTitle(stripFrontmatter(editor()?.draft() ?? loaded.content))?.title ?? null;\n });\n createEffect(() => {\n const title = documentTitle();\n if (title !== undefined) props.onDocumentTitle?.(title);\n });\n\n return (\n <div\n class={`k2b-content-file-view ${props.class ?? \"\"}`}\n data-variant={props.variant}\n data-excerpt={props.previewLines !== undefined ? \"true\" : undefined}\n >\n <FileViewHost.Provider\n value={{\n get plain() {\n return props.variant === \"plain\";\n },\n get liftTitle() {\n return Boolean(props.onDocumentTitle);\n },\n }}\n >\n <Switch>\n <Match when={content.loading && content() === undefined}>\n <Placeholder icon=\"ti ti-loader-2\" title={messages().loading} />\n </Match>\n <Match when={content.error}>\n <Placeholder\n icon=\"ti ti-alert-circle\"\n title={fileViewMessages().failedLoadFile}\n description={String(content.error?.message ?? \"\")}\n />\n </Match>\n <Match when={resolvedContent() && renderer()}>\n {(active) => {\n const Renderer = active().component;\n return (\n <Renderer\n previewLines={props.previewLines}\n onExpandPreview={props.onExpandPreview}\n headingScale={props.headingScale}\n previewPreferencesKey={props.previewPreferencesKey}\n file={props.file}\n content={resolvedContent()!}\n previewHref={nativePreviewHref()}\n crossOrigin={props.crossOrigin}\n onPreviewError={props.onPreviewError}\n downloadHref={props.downloadHref ?? null}\n editor={editor()}\n />\n );\n }}\n </Match>\n </Switch>\n </FileViewHost.Provider>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,yBAAyB,QAAQ,oCAAoC;AAC9E,SAAS,oBAAoB,QAAQ,uBAAuB;AAC5D,SAAS,mBAAmB,QAAQ,sBAAsB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,QAAQ,QAAQ,mBAAmB;AAC5C,SAEE,aAAa,EACb,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,GAAG,EAEH,KAAK,EACL,SAAS,EACT,OAAO,EACP,IAAI,EACJ,MAAM,EACN,OAAO,EACP,UAAU,QACL,UAAU;AACjB,SAAS,MAAM,QAAQ,mBAAmB;AAC1C,SAAS,OAAO,QAAQ,qBAAqB;AAC7C,SAAS,OAAO,QAAQ,qBAAqB;AAC7C,SAAS,KAAK,QAAQ,mBAAmB;AACzC,SAAS,cAAc,QAAQ,mCAAmC;AAClE,SAAS,MAAM,QAAQ,kBAAkB;AACzC,SAAS,aAAa,QAAQ,kBAAkB;AAChD,OAAO,WAAW,MAAM,yBAAyB;AACjD,OAAO,WAAW,MAAoC,eAAe;AACrE,SAAoC,sBAAsB,EAAE,wBAAwB,QAAQ,yBAAyB;AACrH,SAA4B,iBAAiB,EAAE,sBAAsB,EAAE,kBAAkB,QAAQ,qBAAqB;AACtH,OAAO,YAAY,MAAM,gBAAgB;AACzC,SAAS,oBAAoB,QAAQ,kBAAkB;AACvD,OAAO,UAAU,MAAM,cAAc;AACrC,OAAO,qBAAqB,MAAoC,yBAAyB;AACzF,OAAO,WAAW,MAAM,eAAe;AAGvC,SAAS,cAAc,EAAE,sBAAsB,QAAQ,qBAAqB;AA2E5E;AACA,MAAM,YAAY,GAAG,aAAa,CAAC;EAAE,KAAK,EAAE,KAAK;EAAE,SAAS,EAAE;AAAM,CAAC,CAAC;AAEtE,MAAM,YAAY,GAAI,IAAY,IAA0B;EAC1D,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC;EACzC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK,EAAE,OAAO,IAAI;EACjF,IAAI,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK;EACrC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK,EAAE,OAAO,IAAI;EACjF,IAAI,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK;EACrC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,IAAI;EAC/D,OAAO,MAAM;AACf,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAkB,EAAE,OAAwB,KAC9D,OAAO,CAAC,QAAQ,KAAK,MAAM,IAAI,sBAAsB,CAAC;EAAE,GAAG,IAAI;EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;AAAU,CAAC,CAAC,KAAK,UAAU;;AAEnI;AACA,MAAM,gBAAgB,GAAI,IAAY,IAAa;EACjD,MAAM,KAAK,GAAG,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;EACtE,OAAO,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI;AAC/D,CAAC;;AAED;AACA,SAAS,YAAY,CAAC,KAAqF,EAAE;EAC3G,IAAI,IAAmC;EACvC;IAAA;MAAA;MAAA;IAAA,YAEY,IAAI;IAAA,mDAAJ,IAAI;IAAA,sBAEiB,KAAK,CAAC,KAAK;IAAA;MAAA,UAFnB,KAAK,CAAC,KAAK;QAAA,OAAQ,KAAK,CAAC,IAAI;QAAA,OAAY,KAAK,CAAC,QAAQ;QAAA,OAAc,KAAK,CAAC,KAAK;QAAA,OACzF,KAAK,CAAC,IAAI;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;IAAA;EAAA,wBAGrB,OAAO;IAAA,IAAC,OAAO;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAE,MAAM,EAAE,MAAM;EAAI;AAGvD;;AAEA;AACA,SAAS,aAAa,CAAC,KAA8F,EAAE;EACrH,MAAM,OAAO,GAAG,+BAA+B;EAC/C,yBACG,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI;IAAA;IAAA,IAChB,QAAQ;MAAA,yBACL,OAAO,CAAC,OAAO;QAAC,IAAI;QAAA,SAAiB,OAAO;QAAA,IAAE,OAAO;UAAA,OAAE,KAAK,CAAC,KAAK;QAAA;QAAA;UAAA,OAAc,KAAK,CAAC,KAAK;QAAA;QAAA,IAAE,OAAO;UAAA,OAAE,KAAK,CAAC,OAAO;QAAA;QAAA;UAAA;UAAA,kCACxG,MAAM,KAAK,CAAC,IAAI,EAAE;UAAA;QAAA;MAAA;IAAA;IAAA,UAI9B,IAAI,sBACH,YAAY;MAAA,SAAQ,OAAO;MAAA,IAAE,IAAI;QAAA,OAAE,IAAI,CAAC,CAAC;MAAA;MAAA,IAAE,QAAQ;QAAA,OAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;MAAA;MAAA,IAAE,KAAK;QAAA,OAAE,KAAK,CAAC,KAAK;MAAA;MAAA,IAAE,IAAI;QAAA,OAAE,MAAM,KAAK,CAAC,IAAI,EAAE;MAAA;IAAA;EACzH;AAGP;;AAEA;AACA,SAAS,YAAY,CAAC,KAAuD,EAAE;EAC7E;IAAA;MAAA;MAAA;MAAA;IAAA,sBAEiD,KAAK,CAAC,QAAQ;IAAA,kCAC1D,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,OAAO;MAAA;MAAA;QAAA;QAAA,sBACsB,KAAK,CAAC,OAAO;QAAA;MAAA;IAAA;IAAA;EAAA;AAIlE;AAEA,MAAM,cAAc,GAAI,KAA4B,IAAkB;EACpE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,yBACG,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,YAAY;IAAA;IAAA,UAC1B,IAAI,sBACH,aAAa;MACZ,IAAI;MAAA,IACJ,KAAK;QAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ;MAAA;MAAA,IAC1B,IAAI;QAAA,OAAE,IAAI,CAAC,CAAC;MAAA;MAAA,IACZ,QAAQ;QAAA,OAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;MAAA;IAAA;EAExE;AAGP,CAAC;;AAED;AACA,SAAS,gBAAgB,CAAC,KAA+E,EAAE;EACzG,yBACG,OAAO,CAAC,OAAO;IACd,IAAI;IAAA;IAAA,IAEJ,OAAO;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAA;MAAA,OACR,KAAK,CAAC,KAAK;IAAA;IACvB,QAAQ,EAAE,CAAC,CAAC;IAAA,IACZ,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IACxB,WAAW,EAAG,CAAC,IAAK,CAAC,CAAC,cAAc,CAAC,CAAC;IAAA,IACtC,OAAO;MAAA,OAAE,KAAK,CAAC,OAAO;IAAA;IAAA;MAAA;MAAA,kCAEZ,KAAK,CAAC,IAAI;MAAA;IAAA;EAAA;AAG1B;;AAEA;;AAEA,SAAS,SAAS,CAAC,KAA8C,EAAE;EACjE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,yBACG,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,KAAK,GAAG,CAAC;IAAA;IAAA;MAAA;MAAA,kCAEtB,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,OAAO;QAAA;QAAA,IAAE,QAAQ;UAAA;YAAA;YAAA,uBAAS,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;YAAA;UAAA;QAAA;QAAA;UAAA,yBACzF,MAAM;YAAC,IAAI;YAAM,OAAO;YAAA,IAAS,OAAO;cAAA,OAAE,KAAK,CAAC,OAAO;YAAA;YAAA;cAAA,OACrD,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;YAAA;UAAA;QAAA;MAAA;MAAA;IAAA;EAAA;AAM7D;AACA,SAAS,WAAW,CAAC,KAA4E,EAAE;EACjG,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;EACjG,MAAM,KAAK,GAAG,MAAO,KAAK,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAE;EAC3H,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;EACvD,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC;EACrC;EACA,MAAM,OAAO,GAAG,wBACb,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,IACpB,QAAQ;MAAA,yBAAG,WAAW;QAAA,IAAC,IAAI;UAAA,OAAE,IAAI,CAAC,CAAC;QAAA;QAAA,IAAE,QAAQ;UAAA,OAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAA;QAAA,IAAE,IAAI;UAAA,OAAE,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,SAAS;QAAA;MAAA;IAAA;IAAA;MAAA,yBAE1H,YAAY;QAAA,IAAC,QAAQ;UAAA,OAAE,IAAI,CAAC,CAAC;QAAA;QAAA,IAAE,YAAY;UAAA,OAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,IAAI,SAAS;QAAA;MAAA;IAAA;EAAA,EAEzF;EACD;EACA;EACA,0BAEK,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS;IAAA;IAAA,IAAE,QAAQ;MAAA,OAAE,OAAO,CAAC,CAAC;IAAA;IAAA;MAAA;MAAA,iBAC3B,OAAO;MAAA;IAAA;EAAA,sBAErD,SAAS;IAAA,IAAC,KAAK;MAAA,OAAE,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAAA;IAAA,IAAE,OAAO;MAAA,OAAE,KAAK,CAAC,QAAQ,CAAC,eAAe;IAAA;EAAA;AAGzF;AAEA,SAAS,gBAAgB,CAAC,KAA4B,EAAE;EACtD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC;EACrC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EACjD,MAAM,QAAQ,GAAG,MAAM;IACrB,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;IAC7E,OAAO,IAAI,CAAC,SAAS,GAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,GAAI,IAAI;EAC3E,CAAC;EACD,yBACG,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,oBAAK,CAAC,MAAM,OAAI,OAAO,CAAC,CAAC;IAAA;IAAA,IAC/B,QAAQ;MAAA,yBACL,YAAY;QAAA,IACX,OAAO;UAAA,0BAEF,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,KAAK,CAAC,MAAM;YAAA;YAAA;cAAA,yBACrB,aAAa;gBAAC,IAAI;gBAAA,IAAa,KAAK;kBAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,IAAI;gBAAA;gBAAE,OAAO,EAAE,MAAM,UAAU,CAAC,IAAI;cAAC;YAAA;UAAA,sBAExF,cAAc,EAAK,KAAK;QAAA;QAAA;UAAA;UAAA,mCAK1B,WAAW;YAAC,QAAQ,EAAE,KAAK;YAAA,IAAE,IAAI;cAAA,OAAE,QAAQ,CAAC,CAAC;YAAA;YAAE,QAAQ;UAAA;UAAA;QAAA;MAAA;IAAA;IAAA,UAK5D,CAAC,IAAK;MACN,MAAM,MAAM,GAAG,KAAK,CAAC,MAAO;MAC5B;QAAA;QAAA,mCAEK,cAAc;UAAA;UAAA;YAAA,OAED,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;UAAA;UACjF,IAAI;UAAA,IACJ,KAAK;YAAA,OAAE,MAAM,CAAC,KAAK,CAAC,CAAC;UAAA;UAAA,IACrB,aAAa;YAAA,OAAE,MAAM,CAAC,QAAQ;UAAA;UAC9B,SAAS,EAAE,KAAK;UAChB,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;UAAA,IAChC,YAAY;YAAA,OAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;UAAA;UAAA,IAC7B,MAAM;YAAA,OAAE,MAAM,CAAC,MAAM,CAAC,CAAC;UAAA;UAAA,IACvB,eAAe;YAAA,yBAAG,gBAAgB;cAAC,IAAI;cAAA,IAAa,KAAK;gBAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,OAAO;cAAA;cAAE,OAAO,EAAE,MAAM,UAAU,CAAC,KAAK;YAAC;UAAA;QAAA;QAAA;MAAA;IAIvH;EAAC;AAGP;AAEA,SAAS,YAAY,CAAC,KAA4B,EAAE;EAClD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,MAAM,sBAAsB,GAAG,yBAAyB,CAAC,CAAC;EAC1D,yBACG,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,KAAK,CAAC,MAAM;IAAA;IAAA,IAClB,QAAQ;MAAA,yBACL,YAAY;QAAA,IAAC,OAAO;UAAA,yBAAG,cAAc,EAAK,KAAK;QAAA;QAAA;UAAA,yBAC7C,WAAW;YAAC,QAAQ,EAAE,KAAK;YAAA,IAAE,IAAI;cAAA,OAAE,KAAK,CAAC,OAAO,CAAC,OAAO;YAAA;UAAA;QAAA;MAAA;IAAA;IAAA,UAI3D,MAAM,IACN;IACA;IAAA;MAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;MAAA,mBAOgB,KAAK,IAAK;QACpB,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,GAAG,EAAE;UACvE,KAAK,CAAC,cAAc,CAAC,CAAC;UACtB,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE;MACF,CAAC;MAAA,uBAIqD,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;MAAA,mCAE9E,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,YAAY;QAAA;QAAA,UAC1B,IAAI,sBACH,YAAY;UAAA;UAAA,IAEX,IAAI;YAAA,OAAE,IAAI,CAAC,CAAC;UAAA;UAAA,IACZ,QAAQ;YAAA,OAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;UAAA;UAAA,IACrE,KAAK;YAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ;UAAA;UAC1B,IAAI;QAAA;MAEP;MAAA,mCAEF,gBAAgB;QAAA,IACf,IAAI;UAAA,OAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,yBAAyB,GAAG,qBAAqB;QAAA;QAAA,IAC3E,KAAK;UAAA,OAAE,sBAAsB,CAAC,CAAC,CAAC,YAAY;QAAA;QAAA,IAC5C,QAAQ;UAAA,OAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAAA;QAChD,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;MAAC;MAAA,iBAS3B,KAAK,IAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;MAAA,qCADpD,KAAK;MAAA,oDAnCT,gBAAgB,CAAC,CAAC,CAAC,UAAU;MAAA,8CAkC9B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;MAAA;MAAA;IAAA;EAOhC;AAGP;AAEA,SAAS,YAAY,CAAC,KAA4B,EAAE;EAClD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM;IAC9B,IAAI;MACF,OAAO;QAAE,EAAE,EAAE,IAAa;QAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO;MAAyB,CAAC;IAC/F,CAAC,CAAC,MAAM;MACN,OAAO;QAAE,EAAE,EAAE;MAAe,CAAC;IAC/B;EACF,CAAC,CAAC;EACF,MAAM,WAAW,GAAG,MAA2B;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI;EACxC,CAAC;EAED,yBACG,YAAY;IAAA,IAAC,OAAO;MAAA,yBAAG,cAAc,EAAK,KAAK;IAAA;IAAA;MAAA;MAAA,mCAE3C,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,MAAM,CAAC,CAAC,CAAC,EAAE;QAAA;QAAA,IAAE,QAAQ;UAAA,yBAAG,WAAW;YAAC,QAAQ,EAAE,KAAK;YAAA,IAAE,IAAI;cAAA,OAAE,KAAK,CAAC,OAAO,CAAC,OAAO;YAAA;UAAA;QAAA;QAAA;UAAA,yBACzF,IAAI;YAAA,IACH,IAAI;cAAA,OAAE,KAAK,CAAC,YAAY,KAAK,SAAS;YAAA;YAAA,IACtC,QAAQ;cAAA,yBAAG,WAAW;gBAAC,QAAQ,EAAE,KAAK;gBAAA,IAAE,IAAI;kBAAA,OAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAA;cAAA;YAAA;YAAA;cAAA,yBAEnF,qBAAqB;gBAAA,IAAC,IAAI;kBAAA,OAAE,WAAW,CAAC,CAAC;gBAAA;gBAAE,OAAO,EAAE;cAAG;YAAA;UAAA;QAAA;MAAA;MAAA;IAAA;EAAA;AAMpE;AAEA,SAAS,qBAAqB,CAAC,KAA4B,EAAE;EAC3D,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,CAAC;EAChD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,YAAY,CAAuB;IAAE,QAAQ,EAAE,OAAO;IAAE,SAAS,EAAE,MAAM;IAAE,IAAI,EAAE;EAAQ,CAAC,CAAC;EACjI,OAAO,CAAC,MAAM;IACZ,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE;IAClC,IAAI;MACF,cAAc,CAAC,wBAAwB,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ,CAAC,CAAC;EACF,MAAM,MAAM,GAAI,KAAoC,IAAK;IACvD,MAAM,IAAI,GAAG;MAAE,GAAG,WAAW,CAAC,CAAC;MAAE,GAAG;IAAM,CAAC;IAC3C,cAAc,CAAC,IAAI,CAAC;IACpB,IAAI,KAAK,CAAC,qBAAqB,EAAE;MAC/B,IAAI;QACF,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;MACzE,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF,CAAC;EACD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;EAC5F,MAAM,SAAS,GAAG,MAChB,WAAW,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,GAC9B,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,KAAK,2BAA2B,GACrG,IAAI,GACJ,GAAG,GACL,WAAW,CAAC,CAAC,CAAC,SAAS;EAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;EACvC,YAAY,CAAC,MAAM;IACjB,IAAI,CAAC,CAAC;IACN,SAAS,CAAC,CAAC;IACX,KAAK,CAAC,YAAY;IAClB,OAAO,CAAC,CAAC,CAAC;EACZ,CAAC,CAAC;EACF,MAAM,QAAQ,GAAG,MAAO,KAAK,CAAC,YAAY,KAAK,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAE;EACjG,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC;IAAE,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC;EAAE,CAAC,CAAC,CAAC;EAChI,MAAM,QAAQ,GAAG,MACf,OAAO,CAAC,MAAM,CACZ;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA,mCAEK,MAAM;MAAA,IACL,KAAK;QAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,WAAW;MAAA;MAAA,IACrC,KAAK;QAAA,OAAE,WAAW,CAAC,CAAC,CAAC,QAAQ;MAAA;MAAA,IAC7B,QAAQ;QAAA,OAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;MAAA;MAC7C,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC;MAC1D,aAAa,EAAG,KAAK,IAAK;QACxB,IAAI,KAAK,EAAE,MAAM,CAAC;UAAE,QAAQ,EAAE;QAAM,CAAC,CAAC;MACxC;IAAC;IAAA,mCAEF,MAAM;MAAA,IACL,KAAK;QAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,YAAY;MAAA;MAAA,IACtC,KAAK;QAAA,OAAE,WAAW,CAAC,CAAC,CAAC,SAAS;MAAA;MAAA,IAC9B,OAAO;QAAA,OAAE,CACP;UAAE,KAAK,EAAE,MAAM;UAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAAoB,CAAC,EAChE;UAAE,KAAK,EAAE,GAAG;UAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAAS,CAAC,EAClD;UAAE,KAAK,EAAE,GAAG;UAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAAa,CAAC,EACtD;UAAE,KAAK,EAAE,IAAI;UAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAAO,CAAC,EACjD;UAAE,KAAK,EAAE,GAAG;UAAE,KAAK,EAAE;QAAI,CAAC,CAC3B;MAAA;MACD,aAAa,EAAG,KAAK,IAAK;QACxB,IAAI,KAAK,EAAE,MAAM,CAAC;UAAE,SAAS,EAAE;QAAM,CAAC,CAAC;MACzC;IAAC;IAAA,mCAEF,MAAM;MAAA,IACL,KAAK;QAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,OAAO;MAAA;MAAA,IACjC,KAAK;QAAA,OAAE,WAAW,CAAC,CAAC,CAAC,IAAI;MAAA;MAAA,IACzB,OAAO;QAAA,OAAE,CACP;UAAE,KAAK,EAAE,OAAO;UAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAAU,CAAC,EACxD;UAAE,KAAK,EAAE,KAAK;UAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAAO,CAAC,CACnD;MAAA;MACD,aAAa,EAAG,KAAK,IAAK;QACxB,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK,EAAE,MAAM,CAAC;UAAE,IAAI,EAAE;QAAM,CAAC,CAAC;MACnE;IAAC;IAAA;EAAA,IAGN,EACD;IAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;EAAY,CAC1C,CAAC;EACH,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;EACzD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;EAEtD,yBACG,YAAY;IAAA,IACX,OAAO;MAAA,0BAEF,aAAa;QAAC,IAAI;QAAA,IAA6B,KAAK;UAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,WAAW;QAAA;QAAE,OAAO,EAAE,MAAM,KAAK,QAAQ,CAAC;MAAC,sBACpH,cAAc,EAAK,KAAK;IAAA;IAAA;MAAA,yBAI5B,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,WAAW,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO;QAAA;QAAA,IAAE,QAAQ;UAAA,yBAAG,WAAW;YAAC,QAAQ,EAAE,KAAK;YAAA,IAAE,IAAI;cAAA,OAAE,IAAI,CAAC,CAAC;YAAA;UAAA;QAAA;QAAA;UAAA,yBAC7F,IAAI;YAAA,IACH,IAAI;cAAA,OAAE,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;YAAA;YAAA,IAC1B,QAAQ;cAAA,yBACL,WAAW;gBAAC,IAAI;gBAAA,IAAe,KAAK;kBAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS;gBAAA;gBAAA,IAAE,WAAW;kBAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,kBAAkB;gBAAA;cAAA;YAAA;YAAA;cAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;cAAA,mCAOhH,GAAG;gBAAA,IAAC,IAAI;kBAAA,OAAE,OAAO,CAAC,CAAC;gBAAA;gBAAA,UACjB,CAAC,MAAM,EAAE,KAAK;kBAAA;oBAAA;kBAAA,uBAEJ,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC;oBAAE,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG;kBAAE,CAAC,CAAC;kBAAA;gBAAA;cAEtE;cAAA,mCAKJ,GAAG;gBAAA,IAAC,IAAI;kBAAA,OAAE,IAAI,CAAC,CAAC;gBAAA;gBAAA,UACb,GAAG;kBAAA;kBAAA,mCAEA,GAAG;oBAAA,IAAC,IAAI;sBAAA,OAAE,OAAO,CAAC,CAAC;oBAAA;oBAAA,UAAG,CAAC,CAAC,EAAE,KAAK;sBAAA;sBAAA,uBAAU,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;sBAAA;oBAAA;kBAAM;kBAAA;gBAAA;cAErE;cAAA,mCAIN,IAAI;gBAAA,IAAC,IAAI;kBAAA,OAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB;gBAAA;gBAAA;kBAAA;kBAAA,uBACW,gBAAgB,CAAC,CAAC,CAAC,qBAAqB;kBAAA;gBAAA;cAAA;cAAA,mCAExF,IAAI;gBAAA,IACH,IAAI;kBAAA,OAAE,KAAK,CAAC,YAAY,KAAK,SAAS;gBAAA;gBAAA,IACtC,QAAQ;kBAAA,yBACL,IAAI;oBAAA,IAAC,IAAI;sBAAA,OAAE,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;oBAAA;oBAAA;sBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;sBAAA,mCAEhC,MAAM;wBAAC,IAAI;wBAAM,OAAO;wBAAA,IAAS,QAAQ;0BAAA,OAAE,IAAI,CAAC,CAAC,KAAK,CAAC;wBAAA;wBAAE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;wBAAA;0BAAA,OACzF,QAAQ,CAAC,CAAC,CAAC,QAAQ;wBAAA;sBAAA;sBAAA,uBAGnB,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC;sBAAA,uBAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;sBAAA,uBAAK,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC;sBAAA,mCAEpH,MAAM;wBACL,IAAI;wBACJ,OAAO;wBAAA,IACP,QAAQ;0BAAA,OAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC;wBAAA;wBAC9D,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;wBAAA;0BAAA,OAEjC,QAAQ,CAAC,CAAC,CAAC,IAAI;wBAAA;sBAAA;sBAAA;oBAAA;kBAAA;gBAAA;gBAAA;kBAAA,yBAMvB,SAAS;oBAAA,IAAC,KAAK;sBAAA,OAAE,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;oBAAA;oBAAA,IAAE,OAAO;sBAAA,OAAE,KAAK,CAAC,eAAe;oBAAA;kBAAA;gBAAA;cAAA;cAAA;YAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AAOvG;AAEA,MAAM,WAAW,GAAI,KAA4B,IAC/C,KAAK,CAAC,WAAW,IAAI,QAAQ,KAAK,CAAC,OAAO,CAAC,SAAS,WAAW,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE;AAExF,SAAS,aAAa,CAAC,KAA4B,EAAE;EACnD,yBACG,YAAY;IAAA,IAAC,OAAO;MAAA,yBAAG,cAAc,EAAK,KAAK;IAAA;IAAA;MAAA;QAAA;MAAA,oCAEE,KAAK,CAAC,cAAc;MAAA;QAAA,WAAhD,KAAK,CAAC,WAAW;UAAA,OAAsC,WAAW,CAAC,KAAK,CAAC;UAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI;QAAA;QAAA;QAAA;QAAA;MAAA;QAAA;QAAA;QAAA;MAAA;MAAA;IAAA;EAAA;AAIzH;AAEA,MAAM,OAAO,GAAI,OAAwB,IAAW;EAClD,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,EAAE;EAAkB,CAAC,CAAC;EAChG,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;EACpC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;EAC3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;EAC9F,OAAO,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE;IAAE,IAAI,EAAE;EAAkB,CAAC,CAAC;AACvD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW,CAAC,KAA4B,EAAE;EACjD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C;EACA;EACA;EACA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE;IACvD,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,KAAK,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC;EAC/F,CAAC,CAAC;EACF,MAAM,IAAI,GAAG,UAAU,CAAC,MAAO,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;EAChG,yBACG,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,KAAK,CAAC,WAAW;IAAA;IAAA,IACvB,QAAQ;MAAA,yBACL,IAAI;QACH,KAAK;QAAA,IACL,IAAI;UAAA,OAAE,IAAI,CAAC,CAAC;QAAA;QAAA,IACZ,QAAQ;UAAA,yBAAG,WAAW;YAAC,IAAI;YAAuB,KAAK;YAAA,IAAO,WAAW;cAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,eAAe;YAAA;UAAA;QAAA;QAAA,UAE3G,GAAG,IACH;QACA;QAAA,kBACC,UAAU;UAAC,QAAQ;UAAA,IAAC,KAAK;YAAA,OAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;UAAA;UAAE,OAAO,EAAE,YAAY,GAAG;UAAA,UAC7G,KAAK;YAAA;cAAA;cAAA;cAAA;cAAA;YAAA,uBAEF,KAAK,CAAC,OAAO;YAAA,uBACb,KAAK,CAAC,OAAO;YAAA;UAAA;QAEjB;MAEJ;IAAA;IAAA,UAIH,IAAI;MAAA;MAAA;QAAA,WAAmB,IAAI,CAAC,CAAC;UAAA,OAAwE,KAAK,CAAC,IAAI,CAAC,IAAI;QAAA;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA;MAAA;IAAA;EAAI;AAGhI;AAEA,SAAS,aAAa,CAAC,KAA4B,EAAE;EACnD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,yBACG,YAAY;IAAA,IAAC,OAAO;MAAA,yBAAG,cAAc,EAAK,KAAK;IAAA;IAAA;MAAA;QAAA;MAAA,oCAIjC,KAAK,CAAC,cAAc;MAAA,uBAM5B,gBAAgB,CAAC,CAAC,CAAC,gBAAgB;MAAA;QAAA,WAPvB,KAAK,CAAC,WAAW;UAAA,QAIzB,WAAW,CAAC,KAAK,CAAC;UAAA,QACX,KAAK,CAAC,IAAI,CAAC,IAAI;QAAA;QAAA;QAAA;QAAA;MAAA;QAAA;QAAA;QAAA;MAAA;MAAA;IAAA;EAAA;AAOrC;AAEA,SAAS,aAAa,CAAC,KAA4B,EAAE;EACnD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;EAC9E,yBACG,YAAY;IAAA,IAAC,OAAO;MAAA,yBAAG,cAAc,EAAK,KAAK;IAAA;IAAA;MAAA;MAAA,mCAE3C,WAAW;QAAA,IACV,GAAG;UAAA,OAAE,WAAW,CAAC,KAAK,CAAC;QAAA;QAAA,IACvB,KAAK;UAAA,OAAE,IAAI,CAAC,CAAC;QAAA;QAAA,IACb,WAAW;UAAA,OAAE,KAAK,CAAC,WAAW;QAAA;QAAA,IAC9B,UAAU;UAAA,OAAE,KAAK,CAAC,cAAc;QAAA;QAAA,IAChC,cAAc;UAAA,yBACX,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,KAAK,CAAC,YAAY;YAAA;YAAA,UAC1B,IAAI;cAAA;gBAAA;gBAAA;gBAAA;cAAA,uBAGD,QAAQ,CAAC,CAAC,CAAC,QAAQ;cAAA;gBAAA,YAF8C,IAAI,CAAC,CAAC;kBAAA,QAAY,IAAI,CAAC,CAAC;gBAAA;gBAAA;gBAAA;cAAA;gBAAA;gBAAA;cAAA;cAAA;YAAA;UAI7F;QAAA;MAAA;MAAA;IAAA;EAAA;AAOf;AAEA,SAAS,cAAc,CAAC,KAA4B,EAAE;EACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,yBACG,WAAW;IACV,IAAI;IAAA,IACJ,KAAK;MAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS;IAAA;IAAA,IACnC,WAAW;MAAA,OAAE,KAAK,CAAC,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC,CAAC,CAAC,UAAU;IAAA;IAAA,IACrE,MAAM;MAAA,yBACH,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,YAAY;QAAA;QAAA,UAC1B,IAAI;UAAA;YAAA;YAAA;YAAA;UAAA,uBAGD,QAAQ,CAAC,CAAC,CAAC,QAAQ;UAAA,8CAF8C,IAAI,CAAC,CAAC;UAAA;QAAA;MAI3E;IAAA;EAAA;AAKX;AAEA,MAAM,iBAAqC,GAAG,CAC5C;EAAE,EAAE,EAAE,UAAU;EAAE,KAAK,EAAE,UAAU;EAAE,SAAS,EAAE,gBAAgB;EAAE,QAAQ,EAAE;AAAK,CAAC,EAClF;EACE,EAAE,EAAE,OAAO;EACX,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,OAAO;EACzH,SAAS,EAAE;AACb,CAAC,EACD;EACE,EAAE,EAAE,KAAK;EACT,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,KAAK;EACvH,SAAS,EAAE;AACb,CAAC,EACD;EACE,EAAE,EAAE,MAAM;EACV,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KACnB,OAAO,CAAC,QAAQ,KAAK,MAAM,IAAI,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,MAAM;EAC/H,SAAS,EAAE;AACb,CAAC,EACD;EACE,EAAE,EAAE,gBAAgB;EACpB,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,gBAAgB;EAClI,SAAS,EAAE;AACb,CAAC,EACD;EACE,EAAE,EAAE,OAAO;EACX,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,OAAO;EACzH,SAAS,EAAE;AACb,CAAC,EACD;EACE,EAAE,EAAE,OAAO;EACX,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,OAAO;EACzH,SAAS,EAAE;AACb,CAAC,EACD;EAAE,EAAE,EAAE,MAAM;EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,KAAK,MAAM;EAAE,SAAS,EAAE,YAAY;EAAE,QAAQ,EAAE;AAAK,CAAC,EAC/G;EAAE,EAAE,EAAE,QAAQ;EAAE,KAAK,EAAE,MAAM,IAAI;EAAE,SAAS,EAAE;AAAe,CAAC,CAC/D;;AAED;;AAEA,OAAO,MAAM,kBAAkB,GAAI,KAAa,IAAa;EAC3D,IAAI,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,KAAK,IAAI;EACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK;EACjE,OAAO,GAAG,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK;AACnD,CAAC;AAED,eAAe,SAAS,QAAQ,CAAC,KAAoB,EAAE;EACrD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EAC1C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EACpD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;EAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC;EACxD,MAAM,iBAAiB,GAAG,MAAM,KAAK,CAAC,SAAS,IAAI,EAAE;EACrD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAuE;IACzG,QAAQ,EAAE,MAAO,KAAK,IAAK;MACzB,MAAM,KAAK,CAAC,IAAI,CAAE,KAAK,CAAC,OAAO,CAAC;MAChC,OAAO,KAAK;IACd,CAAC;IACD,SAAS,EAAG,KAAK,IAAK;MACpB,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC;MAChE,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,CAAC;IACD,OAAO,EAAG,KAAK,IAAK,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO;EAC/C,CAAC,CAAC;EACF,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW;IAC9B,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG;IAChD,OAAO,GAAG,IAAI,GAAG,SAAS,oBAAoB,cAAc,CAAC,CAAC,EAAE;EAClE,CAAC,CAAC;EACF,MAAM,qBAAqB,GAAG,UAAU,CAAyB,MAAM;IACrE,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC;IAC/C,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,OAAO,IAAI;IAC3F,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI;IAEtB,MAAM,SAA0B,GAAG;MACjC,QAAQ,EAAE,QAAQ;MAClB,OAAO,EAAE,EAAE;MACX,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI;IACrC,CAAC;IACD,OAAO,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAE,QAAQ,IAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS;EACzG,CAAC,CAAC;EACF,MAAM,CAAC,OAAO,EAAE;IAAE;EAAQ,CAAC,CAAC,GAAG,cAAc,CAC3C,MAAO,qBAAqB,CAAC,CAAC,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;IAAE,QAAQ,EAAE,KAAK,CAAC;EAAS,CAAE,EAC5F,YAAY;IACV,YAAY,CAAC,KAAK,CAAC,CAAC;IACpB;IACA;IACA,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,EAAE;IACpE,QAAQ,CAAC,WAAW,CAAC;IACrB,aAAa,CAAC,WAAW,CAAC;IAC1B,OAAO,MAAM;EACf,CACF,CAAC;EACD,YAAY,CAAC,MAAM;IACjB,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;IAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC,YAAY;MACnD,IAAI,qBAAqB,CAAC,CAAC,EAAE,iBAAiB,CAAE,KAAK,IAAK,KAAK,GAAG,CAAC,CAAC,CAAC,KAChE,MAAM,OAAO,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,IAAI,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC;EACvC,CAAC,CAAC;EACF;EACA,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,qBAAqB,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;EAE5G,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM;IAChC,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI;IACxB,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAE,SAAS,IAAK,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,IAAI;EACxH,CAAC,CAAC;EAEF,YAAY,CAAC,MAAM;IACjB,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC;EAChC,CAAC,CAAC;EAEF,MAAM,IAAI,GAAG,YAAY;IACvB,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE;IAC3C,MAAM,YAAY,CAAC,MAAM,CAAC;MAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;MAAE,OAAO,EAAE,KAAK,CAAC;IAAE,CAAC,CAAC;EACxE,CAAC;EAED,MAAM,MAAM,GAAG,MACb,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,EAAE,QAAQ,IAAI,eAAe,CAAC,CAAC,EAAE,QAAQ,KAAK,MAAM,GACxE;IACE,KAAK;IACL,QAAQ;IACR,KAAK;IACL,MAAM,EAAE,YAAY,CAAC,OAAO;IAC5B;EACF,CAAC,GACD,IAAI;;EAEV;EACA,MAAM,aAAa,GAAG,UAAU,CAA4B,MAAM;IAChE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,OAAO,SAAS;IAC5C,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI;IAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE,OAAO,SAAS;IAC7B,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,KAAK,gBAAgB,EAAE,OAAO,IAAI;IAC3D,OAAO,oBAAoB,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI;EACnG,CAAC,CAAC;EACF,YAAY,CAAC,MAAM;IACjB,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;EACzD,CAAC,CAAC;EAEF;IAAA;IAAA,mCAMK,YAAY,CAAC,QAAQ;MACpB,KAAK,EAAE;QACL,IAAI,KAAK,GAAG;UACV,OAAO,KAAK,CAAC,OAAO,KAAK,OAAO;QAClC,CAAC;QACD,IAAI,SAAS,GAAG;UACd,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;QACvC;MACF,CAAC;MAAA;QAAA,yBAEA,MAAM;UAAA;YAAA,0BACJ,KAAK;cAAA,IAAC,IAAI;gBAAA,OAAE,sBAAO,CAAC,OAAO,OAAI,OAAO,CAAC,CAAC,KAAK,SAAS;cAAA;cAAA;gBAAA,yBACpD,WAAW;kBAAC,IAAI;kBAAA,IAAkB,KAAK;oBAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,OAAO;kBAAA;gBAAA;cAAA;YAAA,sBAE7D,KAAK;cAAA,IAAC,IAAI;gBAAA,OAAE,OAAO,CAAC,KAAK;cAAA;cAAA;gBAAA,yBACvB,WAAW;kBACV,IAAI;kBAAA,IACJ,KAAK;oBAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,cAAc;kBAAA;kBAAA,IACxC,WAAW;oBAAA,OAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;kBAAA;gBAAA;cAAA;YAAA,sBAGpD,KAAK;cAAA,IAAC,IAAI;gBAAA,OAAE,8BAAe,CAAC,CAAC,OAAI,QAAQ,CAAC,CAAC;cAAA;cAAA,UACxC,MAAM,IAAK;gBACX,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS;gBACnC,yBACG,QAAQ;kBAAA,IACP,YAAY;oBAAA,OAAE,KAAK,CAAC,YAAY;kBAAA;kBAAA,IAChC,eAAe;oBAAA,OAAE,KAAK,CAAC,eAAe;kBAAA;kBAAA,IACtC,YAAY;oBAAA,OAAE,KAAK,CAAC,YAAY;kBAAA;kBAAA,IAChC,qBAAqB;oBAAA,OAAE,KAAK,CAAC,qBAAqB;kBAAA;kBAAA,IAClD,IAAI;oBAAA,OAAE,KAAK,CAAC,IAAI;kBAAA;kBAAA,IAChB,OAAO;oBAAA,OAAE,eAAe,CAAC,CAAC;kBAAA;kBAAA,IAC1B,WAAW;oBAAA,OAAE,iBAAiB,CAAC,CAAC;kBAAA;kBAAA,IAChC,WAAW;oBAAA,OAAE,KAAK,CAAC,WAAW;kBAAA;kBAAA,IAC9B,cAAc;oBAAA,OAAE,KAAK,CAAC,cAAc;kBAAA;kBAAA,IACpC,YAAY;oBAAA,OAAE,KAAK,CAAC,YAAY,IAAI,IAAI;kBAAA;kBAAA,IACxC,MAAM;oBAAA,OAAE,MAAM,CAAC,CAAC;kBAAA;gBAAA;cAGtB;YAAC;UAAA;QAAA;MAAA;IAAA;IAAA;MAAA,YA3CA,yBAAyB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;QAAA,QACrC,KAAK,CAAC,OAAO;QAAA,QACb,KAAK,CAAC,YAAY,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;IAAA;IAAA;EAAA;AA+CzE;AAAC","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/FileView.tsx"],"sourcesContent":["import { useMarkdownEditorMessages } from \"../inputs/markdown/editor-messages\";\nimport { useDataTableMessages } from \"./data-table-messages\";\nimport { useFileViewMessages } from \"./file-view-messages\";\n/**\n * FileView — renders one file through a small renderer registry keyed by\n * media type / path. Editing is enabled purely by the presence of `save`;\n * without it every renderer is read-only. IDE-style chrome: editors reuse\n * the markdown editor's surface (toolbar with an in-toolbar save, Ctrl/Cmd+S),\n * previews are quiet paper panels with icon-only actions overlaid top-right.\n * A plain preview drops the panel and sits on its host's surface instead.\n * Custom renderers are passed per instance, which keeps SSR requests and\n * independently mounted applications isolated.\n */\n\nimport { mutation } from \"@k2b/stdlib/solid\";\nimport {\n type Component,\n createContext,\n createEffect,\n createMemo,\n createResource,\n createSignal,\n For,\n type JSX,\n Match,\n onCleanup,\n onMount,\n Show,\n Switch,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { prompts } from \"../feedback/prompts\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { toast } from \"../feedback/toast\";\nimport { MarkdownEditor } from \"../inputs/markdown/MarkdownEditor\";\nimport { Select } from \"../inputs/Select\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport CodeDisplay, { type CodeDisplayLanguage } from \"./CodeDisplay\";\nimport { type DelimitedPreferences, decodeDelimitedContent, readDelimitedPreferences } from \"./delimited-preferences\";\nimport { type FileViewFile, fileViewExtension, getFileViewPreviewKind, parseDelimitedText } from \"./file-view-preview\";\nimport MarkdownView from \"./MarkdownView\";\nimport { leadingMarkdownTitle } from \"./markdown-title\";\nimport PdfPreview from \"./PdfPreview\";\nimport StructuredDataPreview, { type StructuredDataValue } from \"./StructuredDataPreview\";\nimport VideoPlayer from \"./VideoPlayer\";\n\nexport type { FileViewFile, FileViewPreviewKind } from \"./file-view-preview\";\nexport { canPreviewFile, getFileViewPreviewKind } from \"./file-view-preview\";\nexport type FileViewContent = { encoding: \"utf8\" | \"base64\"; content: string; mediaType: string };\n\nexport type FileViewProps = {\n /**\n * Plain previews inherit the surrounding surface without a frame or inset padding. They keep their natural height,\n * so the host scrolls them and owns the actions around them; a host that stretches one gets its scrolling back.\n */\n variant?: \"default\" | \"plain\";\n /**\n * Lifts a leading Markdown level-one heading into the host, for example a dialog title. Reports its plain text and\n * leaves that heading out of the preview, or reports null when the shown file has none, the heading holds a link or\n * image or is the whole document, or the file fails to load.\n */\n onDocumentTitle?: (title: string | null) => void;\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n load: () => Promise<FileViewContent>;\n /** Refetch the current path when this host-owned revision changes. */\n revision?: unknown;\n /** Register an awaitable refresh for the currently visible preview. */\n registerRefresh?: (refresh: () => Promise<void>) => void | (() => void);\n /** Presence enables editing for text-based renderers. */\n save?: (content: string) => Promise<void>;\n /** Authenticated inline URL used by browser-native image, PDF, audio, and video previews. */\n previewHref?: string | null;\n /** CORS mode for native image/audio/video previews. Omit to preserve browser defaults. */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n /** Native media failed to load; the host can renew a signed URL and offer retry. */\n onPreviewError?: () => void;\n /** Download actions only; never a preview source, because an attachment response does not render inline. */\n downloadHref?: string | null;\n /** App-specific renderers matched before the built-ins for this instance. */\n renderers?: readonly FileViewRenderer[];\n /** Reports local edit state so a parent browser can guard navigation. */\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\nexport type FileViewRendererProps = {\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n content: FileViewContent;\n previewHref: string | null;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n onPreviewError?: () => void;\n downloadHref: string | null;\n /** Null when the file is read-only. */\n editor: {\n draft: () => string;\n setDraft: (value: string) => void;\n dirty: () => boolean;\n saving: () => boolean;\n save: () => Promise<void>;\n } | null;\n};\n\nexport type FileViewRenderer = {\n id: string;\n match: (file: FileViewFile, content: FileViewContent) => boolean;\n component: Component<FileViewRendererProps>;\n /** Text renderers that support the edit affordance when `save` is present. */\n editable?: boolean;\n};\n\n/** Instance options that reach the built-in renderers without widening the public renderer props. */\nconst FileViewHost = createContext({ plain: false, liftTitle: false });\n\nconst codeLanguage = (path: string): CodeDisplayLanguage => {\n const extension = fileViewExtension(path);\n if (extension === \"ts\" || extension === \"mts\" || extension === \"cts\") return \"ts\";\n if (extension === \"tsx\") return \"tsx\";\n if (extension === \"js\" || extension === \"mjs\" || extension === \"cjs\") return \"js\";\n if (extension === \"jsx\") return \"jsx\";\n if (extension === \"md\" || extension === \"markdown\") return \"md\";\n return \"text\";\n};\n\nconst isMarkdown = (file: FileViewFile, content: FileViewContent) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"markdown\";\n\n/** Rendered previews hide a leading YAML frontmatter block — it's metadata, not content. */\nconst stripFrontmatter = (text: string): string => {\n const match = /^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/.exec(text.trimStart());\n return match ? text.trimStart().slice(match[0].length) : text;\n};\n\n/** Icon-only download link with the shared tooltip, for toolbars that style their own controls. */\nfunction DownloadLink(props: { class: string; href: string; download: string; label: string; icon: string }) {\n let link: HTMLAnchorElement | undefined;\n return (\n <>\n <a ref={link} class={props.class} href={props.href} download={props.download} aria-label={props.label}>\n <i class={props.icon} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{props.label}</span>\n </a>\n <Tooltip content={props.label} target={() => link} />\n </>\n );\n}\n\n/** Icon-only action, IDE style — sits in the floating top-right cluster of previews. */\nfunction OverlayAction(props: { icon: string; title: string; onClick?: () => void; href?: string; download?: string }) {\n const classes = \"k2b-content-file-view__action\";\n return (\n <Show\n when={props.href}\n fallback={\n <Tooltip.Trigger type=\"button\" class={classes} content={props.title} aria-label={props.title} onClick={props.onClick}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n {(href) => (\n <DownloadLink class={classes} href={href()} download={props.download ?? \"\"} label={props.title} icon={`ti ${props.icon}`} />\n )}\n </Show>\n );\n}\n\n/** Scrollable preview panel with the floating action cluster overlaid top-right. */\nfunction OverlayPanel(props: { actions?: JSX.Element; children: JSX.Element }) {\n return (\n <div class=\"k2b-content-file-view__panel\">\n <div class=\"k2b-content-file-view__preview\">{props.children}</div>\n <Show when={props.actions}>\n <div class=\"k2b-content-file-view__overlay\">{props.actions}</div>\n </Show>\n </div>\n );\n}\n\nconst DownloadAction = (props: FileViewRendererProps): JSX.Element => {\n const messages = useUiMessages();\n return (\n <Show when={props.downloadHref}>\n {(href) => (\n <OverlayAction\n icon=\"ti-download\"\n title={messages().download}\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n />\n )}\n </Show>\n );\n};\n\n/** Toolbar-styled icon button — reuses the package markdown-editor tool primitive. */\nfunction EditorToolButton(props: { icon: string; title: string; onClick: () => void; disabled?: boolean }) {\n return (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n content={props.title}\n aria-label={props.title}\n tabIndex={-1}\n disabled={props.disabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={props.onClick}\n >\n <i class={props.icon} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n );\n}\n\n// ── Built-in renderers ──────────────────────────────────────────────────────\n\nfunction MoreLines(props: { count: number; onClick?: () => void }) {\n const fileViewMessages = useFileViewMessages();\n return (\n <Show when={props.count > 0}>\n <div class=\"k2b-content-file-view__truncated\">\n <Show when={props.onClick} fallback={<span>{fileViewMessages().previewMoreLines(props.count)}</span>}>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.onClick}>\n {fileViewMessages().previewMoreLines(props.count)}\n </Button>\n </Show>\n </div>\n </Show>\n );\n}\nfunction TextExcerpt(props: { renderer: FileViewRendererProps; text: string; markdown?: boolean }) {\n const lines = createMemo(() => props.text.replace(/\\r\\n?/g, \"\\n\").replace(/\\n$/, \"\").split(\"\\n\"));\n const limit = () => (props.renderer.previewLines === undefined ? lines().length : Math.max(1, props.renderer.previewLines));\n const text = () => lines().slice(0, limit()).join(\"\\n\");\n const host = useContext(FileViewHost);\n // A plain preview has no code box: the host frames the file and owns its copy action.\n const content = () => (\n <Show\n when={props.markdown}\n fallback={<CodeDisplay code={text()} language={codeLanguage(props.renderer.file.path)} copy={host.plain ? false : undefined} />}\n >\n <MarkdownView markdown={text()} headingScale={props.renderer.headingScale ?? \"compact\"} />\n </Show>\n );\n // Only an excerpt needs a clipping box; a complete preview keeps its content\n // a direct child of the preview frame, which the frame's styles expect.\n return (\n <>\n <Show when={props.renderer.previewLines !== undefined} fallback={content()}>\n <div class=\"k2b-content-file-view__excerpt\">{content()}</div>\n </Show>\n <MoreLines count={lines().length - limit()} onClick={props.renderer.onExpandPreview} />\n </>\n );\n}\n\nfunction MarkdownRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const host = useContext(FileViewHost);\n const [editing, setEditing] = createSignal(false);\n const markdown = () => {\n const text = stripFrontmatter(props.editor?.draft() ?? props.content.content);\n return host.liftTitle ? (leadingMarkdownTitle(text)?.body ?? text) : text;\n };\n return (\n <Show\n when={props.editor && editing()}\n fallback={\n <OverlayPanel\n actions={\n <>\n <Show when={props.editor}>\n <OverlayAction icon=\"ti-pencil\" title={messages().edit} onClick={() => setEditing(true)} />\n </Show>\n <DownloadAction {...props} />\n </>\n }\n >\n <div class=\"k2b-content-file-view__document\">\n <TextExcerpt renderer={props} text={markdown()} markdown />\n </div>\n </OverlayPanel>\n }\n >\n {(_) => {\n const editor = props.editor!;\n return (\n <div class=\"k2b-content-file-view__editor\">\n <MarkdownEditor\n class=\"k2b-content-file-view__markdown-field\"\n aria-label={`Edit ${props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}`}\n fill\n value={editor.draft()}\n onValueChange={editor.setDraft}\n showStats={false}\n onSave={() => void editor.save()}\n saveDisabled={!editor.dirty()}\n saving={editor.saving()}\n toolbarTrailing={<EditorToolButton icon=\"ti ti-eye\" title={messages().preview} onClick={() => setEditing(false)} />}\n />\n </div>\n );\n }}\n </Show>\n );\n}\n\nfunction TextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const markdownEditorMessages = useMarkdownEditorMessages();\n return (\n <Show\n when={props.editor}\n fallback={\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <TextExcerpt renderer={props} text={props.content.content} />\n </OverlayPanel>\n }\n >\n {(editor) => (\n // Same chrome as the markdown editor — literally the same classes, so\n // border, radius, focus ring, toolbar height and text metrics cannot drift.\n <div class=\"k2b-content-file-view__editor\">\n <div\n class=\"k2b-markdown-editor\"\n data-fill=\"true\"\n role=\"group\"\n aria-label={fileViewMessages().textEditor}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === \"s\") {\n event.preventDefault();\n if (editor().dirty() && !editor().saving()) void editor().save();\n }\n }}\n >\n {/* No formatting tools here — the divider under an actions-only bar reads lost. */}\n <div class=\"k2b-markdown-editor__toolbar k2b-content-file-view__code-toolbar\">\n <span class=\"k2b-content-file-view__code-language\">{codeLanguage(props.file.path)}</span>\n <span class=\"k2b-markdown-editor__trailing\">\n <Show when={props.downloadHref}>\n {(href) => (\n <DownloadLink\n class=\"k2b-markdown-editor__tool\"\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n label={messages().download}\n icon=\"ti ti-download\"\n />\n )}\n </Show>\n <EditorToolButton\n icon={editor().saving() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-device-floppy\"}\n title={markdownEditorMessages().saveShortcut}\n disabled={!editor().dirty() || editor().saving()}\n onClick={() => void editor().save()}\n />\n </span>\n </div>\n <div class=\"k2b-markdown-editor__surface\">\n <textarea\n class=\"k2b-content-file-view__code-input\"\n value={editor().draft()}\n spellcheck={false}\n onInput={(event) => editor().setDraft(event.currentTarget.value)}\n />\n </div>\n </div>\n </div>\n )}\n </Show>\n );\n}\n\nfunction JsonRenderer(props: FileViewRendererProps) {\n const parsed = createMemo(() => {\n try {\n return { ok: true as const, value: JSON.parse(props.content.content) as StructuredDataValue };\n } catch {\n return { ok: false as const };\n }\n });\n const parsedValue = (): StructuredDataValue => {\n const result = parsed();\n return result.ok ? result.value : null;\n };\n\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__document\">\n <Show when={parsed().ok} fallback={<TextExcerpt renderer={props} text={props.content.content} />}>\n <Show\n when={props.previewLines === undefined}\n fallback={<TextExcerpt renderer={props} text={JSON.stringify(parsedValue(), null, 2)} />}\n >\n <StructuredDataPreview data={parsedValue()} maxRows={200} />\n </Show>\n </Show>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction DelimitedTextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const dataTableMessages = useDataTableMessages();\n const [preferences, setPreferences] = createSignal<DelimitedPreferences>({ encoding: \"utf-8\", delimiter: \"auto\", view: \"table\" });\n onMount(() => {\n if (!props.previewPreferencesKey) return;\n try {\n setPreferences(readDelimitedPreferences(localStorage.getItem(props.previewPreferencesKey)));\n } catch {\n /* Storage may be disabled. */\n }\n });\n const update = (patch: Partial<DelimitedPreferences>) => {\n const next = { ...preferences(), ...patch };\n setPreferences(next);\n if (props.previewPreferencesKey) {\n try {\n localStorage.setItem(props.previewPreferencesKey, JSON.stringify(next));\n } catch {\n /* Keep the local selection. */\n }\n }\n };\n const text = createMemo(() => decodeDelimitedContent(props.content, preferences().encoding));\n const delimiter = () =>\n preferences().delimiter === \"auto\"\n ? fileViewExtension(props.file.path) === \"tsv\" || props.content.mediaType === \"text/tab-separated-values\"\n ? \"\\t\"\n : \",\"\n : preferences().delimiter;\n const [page, setPage] = createSignal(0);\n createEffect(() => {\n text();\n delimiter();\n props.previewLines;\n setPage(0);\n });\n const pageSize = () => (props.previewLines === undefined ? 200 : Math.max(1, props.previewLines));\n const preview = createMemo(() => parseDelimitedText(text(), delimiter(), { rows: pageSize() + 1, offset: page() * pageSize() }));\n const settings = () =>\n prompts.dialog(\n () => (\n <div class=\"k2b-content-file-view__settings\">\n <Select\n label={fileViewMessages().csvEncoding}\n value={preferences().encoding}\n disabled={props.content.encoding !== \"base64\"}\n options={[\"utf-8\", \"windows-1252\", \"utf-16le\", \"utf-16be\"]}\n onValueChange={(value) => {\n if (value) update({ encoding: value });\n }}\n />\n <Select\n label={fileViewMessages().csvSeparator}\n value={preferences().delimiter}\n options={[\n { value: \"auto\", label: fileViewMessages().csvDefaultSeparator },\n { value: \",\", label: fileViewMessages().csvComma },\n { value: \";\", label: fileViewMessages().csvSemicolon },\n { value: \"\\t\", label: fileViewMessages().csvTab },\n { value: \"|\", label: \"|\" },\n ]}\n onValueChange={(value) => {\n if (value) update({ delimiter: value });\n }}\n />\n <Select\n label={fileViewMessages().csvView}\n value={preferences().view}\n options={[\n { value: \"table\", label: dataTableMessages().dataTable },\n { value: \"raw\", label: fileViewMessages().csvRaw },\n ]}\n onValueChange={(value) => {\n if (value === \"table\" || value === \"raw\") update({ view: value });\n }}\n />\n </div>\n ),\n { title: fileViewMessages().csvSettings },\n );\n const headers = createMemo(() => preview().rows[0] ?? []);\n const rows = createMemo(() => preview().rows.slice(1));\n\n return (\n <OverlayPanel\n actions={\n <>\n <OverlayAction icon=\"ti-adjustments-horizontal\" title={fileViewMessages().csvSettings} onClick={() => void settings()} />\n <DownloadAction {...props} />\n </>\n }\n >\n <Show when={preferences().view === \"table\"} fallback={<TextExcerpt renderer={props} text={text()} />}>\n <Show\n when={headers().length > 0}\n fallback={\n <Placeholder icon=\"ti ti-table\" title={fileViewMessages().emptyFile} description={fileViewMessages().delimitedFileEmpty} />\n }\n >\n <div class=\"k2b-content-file-view__sheet\">\n <table class=\"k2b-content-file-view__table\">\n <thead>\n <tr>\n <For each={headers()}>\n {(header, index) => (\n <th scope=\"col\">\n <span>{header || fileViewMessages().column({ number: index() + 1 })}</span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={rows()}>\n {(row) => (\n <tr>\n <For each={headers()}>{(_, index) => <td>{row[index()] ?? \"\"}</td>}</For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n <Show when={preview().columnsTruncated}>\n <div class=\"k2b-content-file-view__truncated\">{fileViewMessages().previewColumnsLimited}</div>\n </Show>\n <Show\n when={props.previewLines !== undefined}\n fallback={\n <Show when={preview().totalRows > 201}>\n <div class=\"k2b-content-file-view__pagination\">\n <Button size=\"sm\" variant=\"ghost\" disabled={page() === 0} onClick={() => setPage(page() - 1)}>\n {messages().previous}\n </Button>\n <span>\n {page() * pageSize() + 1}–{Math.min((page() + 1) * pageSize(), preview().totalRows - 1)} / {preview().totalRows - 1}\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={(page() + 1) * pageSize() >= preview().totalRows - 1}\n onClick={() => setPage(page() + 1)}\n >\n {messages().next}\n </Button>\n </div>\n </Show>\n }\n >\n <MoreLines count={preview().totalRows - rows().length - 1} onClick={props.onExpandPreview} />\n </Show>\n </div>\n </Show>\n </Show>\n </OverlayPanel>\n );\n}\n\nconst mediaSource = (props: FileViewRendererProps): string =>\n props.previewHref ?? `data:${props.content.mediaType};base64,${props.content.content}`;\n\nfunction ImageRenderer(props: FileViewRendererProps) {\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\">\n <img crossOrigin={props.crossOrigin} onError={props.onPreviewError} src={mediaSource(props)} alt={props.file.path} />\n </div>\n </OverlayPanel>\n );\n}\n\nconst pdfBlob = (content: FileViewContent): Blob => {\n if (content.encoding === \"utf8\") return new Blob([content.content], { type: \"application/pdf\" });\n const binary = atob(content.content);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return new Blob([bytes], { type: \"application/pdf\" });\n};\n\n/**\n * A host inline URL goes to the browser's native viewer. Without one, the\n * loaded bytes become a local PDF Blob: a download URL is an attachment and\n * would leave a native viewer empty.\n */\nfunction PdfRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n // A new Blob remounts the preview, so changed bytes show the new file. A revision refetch\n // often returns the same bytes (the Assistant refetches on every tool step); keeping the\n // Blob then keeps the reader's page instead of reloading the viewer.\n const bytes = createMemo(() => props.content, undefined, {\n equals: (previous, next) => previous.encoding === next.encoding && previous.content === next.content,\n });\n const blob = createMemo(() => (props.previewHref || !bytes().content ? null : pdfBlob(bytes())));\n return (\n <Show\n when={props.previewHref}\n fallback={\n <Show\n keyed\n when={blob()}\n fallback={<Placeholder icon=\"ti ti-file-type-pdf\" title=\"PDF\" description={fileViewMessages().noInlinePreview} />}\n >\n {(pdf) => (\n // Composed without the standalone heading: the host already names the file, and the frame keeps the\n // file name as its accessible title.\n <PdfPreview autoLoad title={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)} request={async () => pdf}>\n {(parts) => (\n <div class=\"k2b-content-file-view__pdf-viewer\">\n {parts.actions}\n {parts.content}\n </div>\n )}\n </PdfPreview>\n )}\n </Show>\n }\n >\n {(href) => <object data={href()} type=\"application/pdf\" class=\"k2b-content-file-view__pdf\" aria-label={props.file.path} />}\n </Show>\n );\n}\n\nfunction AudioRenderer(props: FileViewRendererProps) {\n const fileViewMessages = useFileViewMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"audio\">\n <audio\n crossOrigin={props.crossOrigin}\n onError={props.onPreviewError}\n controls\n preload=\"metadata\"\n src={mediaSource(props)}\n aria-label={props.file.path}\n >\n {fileViewMessages().audioUnsupported}\n </audio>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction VideoRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const name = () => props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1);\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"video\">\n <VideoPlayer\n src={mediaSource(props)}\n label={name()}\n crossOrigin={props.crossOrigin}\n onFallback={props.onPreviewError}\n fallbackAction={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download={name()}>\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n </div>\n </OverlayPanel>\n );\n}\n\nfunction BinaryRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n return (\n <Placeholder\n icon=\"ti ti-file-unknown\"\n title={fileViewMessages().noPreview}\n description={props.content.mediaType || fileViewMessages().binaryFile}\n action={\n <Show when={props.downloadHref}>\n {(href) => (\n <a class=\"k2b-button\" data-variant=\"secondary\" data-size=\"sm\" href={href()} download=\"\">\n <i class=\"ti ti-download\" aria-hidden=\"true\" />\n {messages().download}\n </a>\n )}\n </Show>\n }\n />\n );\n}\n\nconst BUILTIN_RENDERERS: FileViewRenderer[] = [\n { id: \"markdown\", match: isMarkdown, component: MarkdownRenderer, editable: true },\n {\n id: \"image\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"image\",\n component: ImageRenderer,\n },\n {\n id: \"pdf\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"pdf\",\n component: PdfRenderer,\n },\n {\n id: \"json\",\n match: (file, content) =>\n content.encoding === \"utf8\" && getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"json\",\n component: JsonRenderer,\n },\n {\n id: \"delimited-text\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"delimited-text\",\n component: DelimitedTextRenderer,\n },\n {\n id: \"audio\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"audio\",\n component: AudioRenderer,\n },\n {\n id: \"video\",\n match: (file, content) => getFileViewPreviewKind({ ...file, mediaType: content.mediaType || file.mediaType }) === \"video\",\n component: VideoRenderer,\n },\n { id: \"text\", match: (_file, content) => content.encoding === \"utf8\", component: TextRenderer, editable: true },\n { id: \"binary\", match: () => true, component: BinaryRenderer },\n];\n\n// ── Component ───────────────────────────────────────────────────────────────\n\nexport const formatFileViewSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nexport default function FileView(props: FileViewProps) {\n const messages = useUiMessages();\n const fileViewMessages = useFileViewMessages();\n const [draft, setDraft] = createSignal(\"\");\n const [savedDraft, setSavedDraft] = createSignal(\"\");\n const [nativeRevision, setNativeRevision] = createSignal(0);\n const dirty = createMemo(() => draft() !== savedDraft());\n const instanceRenderers = () => props.renderers ?? [];\n const saveMutation = mutation.create<{ path: string; content: string }, { path: string; content: string }>({\n mutation: async (input) => {\n await props.save!(input.content);\n return input;\n },\n onSuccess: (saved) => {\n if (props.file.path === saved.path) setSavedDraft(saved.content);\n toast.success(fileViewMessages().fileSaved);\n },\n onError: (error) => toast.error(error.message),\n });\n const nativePreviewHref = createMemo(() => {\n const href = props.previewHref;\n if (!href) return null;\n const separator = href.includes(\"?\") ? \"&\" : \"?\";\n return `${href}${separator}preview-revision=${nativeRevision()}`;\n });\n const browserPreviewContent = createMemo<FileViewContent | null>(() => {\n const kind = getFileViewPreviewKind(props.file);\n if (kind !== \"image\" && kind !== \"pdf\" && kind !== \"audio\" && kind !== \"video\") return null;\n const href = nativePreviewHref();\n if (!href) return null;\n\n const candidate: FileViewContent = {\n encoding: \"base64\",\n content: \"\",\n mediaType: props.file.mediaType ?? \"application/octet-stream\",\n };\n return instanceRenderers().some((renderer) => renderer.match(props.file, candidate)) ? null : candidate;\n });\n const [content, { refetch }] = createResource(\n () => (browserPreviewContent() ? null : { path: props.file.path, revision: props.revision }),\n async () => {\n saveMutation.abort();\n // `load` is an imperative source adapter. Host signal reads inside it\n // must not turn this resource into a hidden reactive feedback loop.\n const loaded = await untrack(() => props.load());\n const loadedDraft = loaded.encoding === \"utf8\" ? loaded.content : \"\";\n setDraft(loadedDraft);\n setSavedDraft(loadedDraft);\n return loaded;\n },\n );\n createEffect(() => {\n if (!props.registerRefresh) return;\n const unregister = props.registerRefresh(async () => {\n if (browserPreviewContent()) setNativeRevision((value) => value + 1);\n else await refetch();\n });\n if (unregister) onCleanup(unregister);\n });\n // An errored resource throws when read; the error state below shows it instead.\n const resolvedContent = createMemo(() => browserPreviewContent() ?? (content.error ? undefined : content()));\n\n const renderer = createMemo(() => {\n const loaded = resolvedContent();\n if (!loaded) return null;\n return [...instanceRenderers(), ...BUILTIN_RENDERERS].find((candidate) => candidate.match(props.file, loaded)) ?? null;\n });\n\n createEffect(() => {\n props.onDirtyChange?.(dirty());\n });\n\n const save = async () => {\n if (!props.save || saveMutation.loading()) return;\n await saveMutation.mutate({ path: props.file.path, content: draft() });\n };\n\n const editor = () =>\n props.save && renderer()?.editable && resolvedContent()?.encoding === \"utf8\"\n ? {\n draft,\n setDraft,\n dirty,\n saving: saveMutation.loading,\n save,\n }\n : null;\n\n // Undefined while loading; the host keeps its own placeholder until the shown file decides.\n const documentTitle = createMemo<string | null | undefined>(() => {\n if (!props.onDocumentTitle) return undefined;\n if (content.error) return null;\n const loaded = resolvedContent();\n if (!loaded) return undefined;\n if (renderer()?.component !== MarkdownRenderer) return null;\n return leadingMarkdownTitle(stripFrontmatter(editor()?.draft() ?? loaded.content))?.title ?? null;\n });\n createEffect(() => {\n const title = documentTitle();\n if (title !== undefined) props.onDocumentTitle?.(title);\n });\n\n return (\n <div\n class={`k2b-content-file-view ${props.class ?? \"\"}`}\n data-variant={props.variant}\n data-excerpt={props.previewLines !== undefined ? \"true\" : undefined}\n >\n <FileViewHost.Provider\n value={{\n get plain() {\n return props.variant === \"plain\";\n },\n get liftTitle() {\n return Boolean(props.onDocumentTitle);\n },\n }}\n >\n <Switch>\n <Match when={content.loading && content() === undefined}>\n <Placeholder state=\"loading\" title={messages().loading} />\n </Match>\n <Match when={content.error}>\n <Placeholder state=\"error\" title={fileViewMessages().failedLoadFile} description={String(content.error?.message ?? \"\")} />\n </Match>\n <Match when={resolvedContent() && renderer()}>\n {(active) => {\n const Renderer = active().component;\n return (\n <Renderer\n previewLines={props.previewLines}\n onExpandPreview={props.onExpandPreview}\n headingScale={props.headingScale}\n previewPreferencesKey={props.previewPreferencesKey}\n file={props.file}\n content={resolvedContent()!}\n previewHref={nativePreviewHref()}\n crossOrigin={props.crossOrigin}\n onPreviewError={props.onPreviewError}\n downloadHref={props.downloadHref ?? null}\n editor={editor()}\n />\n );\n }}\n </Match>\n </Switch>\n </FileViewHost.Provider>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,yBAAyB,QAAQ,oCAAoC;AAC9E,SAAS,oBAAoB,QAAQ,uBAAuB;AAC5D,SAAS,mBAAmB,QAAQ,sBAAsB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAS,QAAQ,QAAQ,mBAAmB;AAC5C,SAEE,aAAa,EACb,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,GAAG,EAEH,KAAK,EACL,SAAS,EACT,OAAO,EACP,IAAI,EACJ,MAAM,EACN,OAAO,EACP,UAAU,QACL,UAAU;AACjB,SAAS,MAAM,QAAQ,mBAAmB;AAC1C,SAAS,OAAO,QAAQ,qBAAqB;AAC7C,SAAS,OAAO,QAAQ,qBAAqB;AAC7C,SAAS,KAAK,QAAQ,mBAAmB;AACzC,SAAS,cAAc,QAAQ,mCAAmC;AAClE,SAAS,MAAM,QAAQ,kBAAkB;AACzC,SAAS,aAAa,QAAQ,kBAAkB;AAChD,OAAO,WAAW,MAAM,yBAAyB;AACjD,OAAO,WAAW,MAAoC,eAAe;AACrE,SAAoC,sBAAsB,EAAE,wBAAwB,QAAQ,yBAAyB;AACrH,SAA4B,iBAAiB,EAAE,sBAAsB,EAAE,kBAAkB,QAAQ,qBAAqB;AACtH,OAAO,YAAY,MAAM,gBAAgB;AACzC,SAAS,oBAAoB,QAAQ,kBAAkB;AACvD,OAAO,UAAU,MAAM,cAAc;AACrC,OAAO,qBAAqB,MAAoC,yBAAyB;AACzF,OAAO,WAAW,MAAM,eAAe;AAGvC,SAAS,cAAc,EAAE,sBAAsB,QAAQ,qBAAqB;AA2E5E;AACA,MAAM,YAAY,GAAG,aAAa,CAAC;EAAE,KAAK,EAAE,KAAK;EAAE,SAAS,EAAE;AAAM,CAAC,CAAC;AAEtE,MAAM,YAAY,GAAI,IAAY,IAA0B;EAC1D,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC;EACzC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK,EAAE,OAAO,IAAI;EACjF,IAAI,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK;EACrC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK,EAAE,OAAO,IAAI;EACjF,IAAI,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK;EACrC,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,IAAI;EAC/D,OAAO,MAAM;AACf,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAkB,EAAE,OAAwB,KAC9D,OAAO,CAAC,QAAQ,KAAK,MAAM,IAAI,sBAAsB,CAAC;EAAE,GAAG,IAAI;EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;AAAU,CAAC,CAAC,KAAK,UAAU;;AAEnI;AACA,MAAM,gBAAgB,GAAI,IAAY,IAAa;EACjD,MAAM,KAAK,GAAG,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;EACtE,OAAO,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI;AAC/D,CAAC;;AAED;AACA,SAAS,YAAY,CAAC,KAAqF,EAAE;EAC3G,IAAI,IAAmC;EACvC;IAAA;MAAA;MAAA;IAAA,YAEY,IAAI;IAAA,mDAAJ,IAAI;IAAA,sBAEiB,KAAK,CAAC,KAAK;IAAA;MAAA,UAFnB,KAAK,CAAC,KAAK;QAAA,OAAQ,KAAK,CAAC,IAAI;QAAA,OAAY,KAAK,CAAC,QAAQ;QAAA,OAAc,KAAK,CAAC,KAAK;QAAA,OACzF,KAAK,CAAC,IAAI;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA;IAAA;EAAA,wBAGrB,OAAO;IAAA,IAAC,OAAO;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAE,MAAM,EAAE,MAAM;EAAI;AAGvD;;AAEA;AACA,SAAS,aAAa,CAAC,KAA8F,EAAE;EACrH,MAAM,OAAO,GAAG,+BAA+B;EAC/C,yBACG,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI;IAAA;IAAA,IAChB,QAAQ;MAAA,yBACL,OAAO,CAAC,OAAO;QAAC,IAAI;QAAA,SAAiB,OAAO;QAAA,IAAE,OAAO;UAAA,OAAE,KAAK,CAAC,KAAK;QAAA;QAAA;UAAA,OAAc,KAAK,CAAC,KAAK;QAAA;QAAA,IAAE,OAAO;UAAA,OAAE,KAAK,CAAC,OAAO;QAAA;QAAA;UAAA;UAAA,kCACxG,MAAM,KAAK,CAAC,IAAI,EAAE;UAAA;QAAA;MAAA;IAAA;IAAA,UAI9B,IAAI,sBACH,YAAY;MAAA,SAAQ,OAAO;MAAA,IAAE,IAAI;QAAA,OAAE,IAAI,CAAC,CAAC;MAAA;MAAA,IAAE,QAAQ;QAAA,OAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;MAAA;MAAA,IAAE,KAAK;QAAA,OAAE,KAAK,CAAC,KAAK;MAAA;MAAA,IAAE,IAAI;QAAA,OAAE,MAAM,KAAK,CAAC,IAAI,EAAE;MAAA;IAAA;EACzH;AAGP;;AAEA;AACA,SAAS,YAAY,CAAC,KAAuD,EAAE;EAC7E;IAAA;MAAA;MAAA;MAAA;IAAA,sBAEiD,KAAK,CAAC,QAAQ;IAAA,kCAC1D,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,OAAO;MAAA;MAAA;QAAA;QAAA,sBACsB,KAAK,CAAC,OAAO;QAAA;MAAA;IAAA;IAAA;EAAA;AAIlE;AAEA,MAAM,cAAc,GAAI,KAA4B,IAAkB;EACpE,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,yBACG,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,YAAY;IAAA;IAAA,UAC1B,IAAI,sBACH,aAAa;MACZ,IAAI;MAAA,IACJ,KAAK;QAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ;MAAA;MAAA,IAC1B,IAAI;QAAA,OAAE,IAAI,CAAC,CAAC;MAAA;MAAA,IACZ,QAAQ;QAAA,OAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;MAAA;IAAA;EAExE;AAGP,CAAC;;AAED;AACA,SAAS,gBAAgB,CAAC,KAA+E,EAAE;EACzG,yBACG,OAAO,CAAC,OAAO;IACd,IAAI;IAAA;IAAA,IAEJ,OAAO;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAA;MAAA,OACR,KAAK,CAAC,KAAK;IAAA;IACvB,QAAQ,EAAE,CAAC,CAAC;IAAA,IACZ,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IACxB,WAAW,EAAG,CAAC,IAAK,CAAC,CAAC,cAAc,CAAC,CAAC;IAAA,IACtC,OAAO;MAAA,OAAE,KAAK,CAAC,OAAO;IAAA;IAAA;MAAA;MAAA,kCAEZ,KAAK,CAAC,IAAI;MAAA;IAAA;EAAA;AAG1B;;AAEA;;AAEA,SAAS,SAAS,CAAC,KAA8C,EAAE;EACjE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,yBACG,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,KAAK,GAAG,CAAC;IAAA;IAAA;MAAA;MAAA,kCAEtB,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,OAAO;QAAA;QAAA,IAAE,QAAQ;UAAA;YAAA;YAAA,uBAAS,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;YAAA;UAAA;QAAA;QAAA;UAAA,yBACzF,MAAM;YAAC,IAAI;YAAM,OAAO;YAAA,IAAS,OAAO;cAAA,OAAE,KAAK,CAAC,OAAO;YAAA;YAAA;cAAA,OACrD,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;YAAA;UAAA;QAAA;MAAA;MAAA;IAAA;EAAA;AAM7D;AACA,SAAS,WAAW,CAAC,KAA4E,EAAE;EACjG,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;EACjG,MAAM,KAAK,GAAG,MAAO,KAAK,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAE;EAC3H,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;EACvD,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC;EACrC;EACA,MAAM,OAAO,GAAG,wBACb,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,IACpB,QAAQ;MAAA,yBAAG,WAAW;QAAA,IAAC,IAAI;UAAA,OAAE,IAAI,CAAC,CAAC;QAAA;QAAA,IAAE,QAAQ;UAAA,OAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAA;QAAA,IAAE,IAAI;UAAA,OAAE,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,SAAS;QAAA;MAAA;IAAA;IAAA;MAAA,yBAE1H,YAAY;QAAA,IAAC,QAAQ;UAAA,OAAE,IAAI,CAAC,CAAC;QAAA;QAAA,IAAE,YAAY;UAAA,OAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,IAAI,SAAS;QAAA;MAAA;IAAA;EAAA,EAEzF;EACD;EACA;EACA,0BAEK,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS;IAAA;IAAA,IAAE,QAAQ;MAAA,OAAE,OAAO,CAAC,CAAC;IAAA;IAAA;MAAA;MAAA,iBAC3B,OAAO;MAAA;IAAA;EAAA,sBAErD,SAAS;IAAA,IAAC,KAAK;MAAA,OAAE,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAAA;IAAA,IAAE,OAAO;MAAA,OAAE,KAAK,CAAC,QAAQ,CAAC,eAAe;IAAA;EAAA;AAGzF;AAEA,SAAS,gBAAgB,CAAC,KAA4B,EAAE;EACtD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC;EACrC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EACjD,MAAM,QAAQ,GAAG,MAAM;IACrB,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;IAC7E,OAAO,IAAI,CAAC,SAAS,GAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,GAAI,IAAI;EAC3E,CAAC;EACD,yBACG,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,oBAAK,CAAC,MAAM,OAAI,OAAO,CAAC,CAAC;IAAA;IAAA,IAC/B,QAAQ;MAAA,yBACL,YAAY;QAAA,IACX,OAAO;UAAA,0BAEF,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,KAAK,CAAC,MAAM;YAAA;YAAA;cAAA,yBACrB,aAAa;gBAAC,IAAI;gBAAA,IAAa,KAAK;kBAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,IAAI;gBAAA;gBAAE,OAAO,EAAE,MAAM,UAAU,CAAC,IAAI;cAAC;YAAA;UAAA,sBAExF,cAAc,EAAK,KAAK;QAAA;QAAA;UAAA;UAAA,mCAK1B,WAAW;YAAC,QAAQ,EAAE,KAAK;YAAA,IAAE,IAAI;cAAA,OAAE,QAAQ,CAAC,CAAC;YAAA;YAAE,QAAQ;UAAA;UAAA;QAAA;MAAA;IAAA;IAAA,UAK5D,CAAC,IAAK;MACN,MAAM,MAAM,GAAG,KAAK,CAAC,MAAO;MAC5B;QAAA;QAAA,mCAEK,cAAc;UAAA;UAAA;YAAA,OAED,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;UAAA;UACjF,IAAI;UAAA,IACJ,KAAK;YAAA,OAAE,MAAM,CAAC,KAAK,CAAC,CAAC;UAAA;UAAA,IACrB,aAAa;YAAA,OAAE,MAAM,CAAC,QAAQ;UAAA;UAC9B,SAAS,EAAE,KAAK;UAChB,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;UAAA,IAChC,YAAY;YAAA,OAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;UAAA;UAAA,IAC7B,MAAM;YAAA,OAAE,MAAM,CAAC,MAAM,CAAC,CAAC;UAAA;UAAA,IACvB,eAAe;YAAA,yBAAG,gBAAgB;cAAC,IAAI;cAAA,IAAa,KAAK;gBAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,OAAO;cAAA;cAAE,OAAO,EAAE,MAAM,UAAU,CAAC,KAAK;YAAC;UAAA;QAAA;QAAA;MAAA;IAIvH;EAAC;AAGP;AAEA,SAAS,YAAY,CAAC,KAA4B,EAAE;EAClD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,MAAM,sBAAsB,GAAG,yBAAyB,CAAC,CAAC;EAC1D,yBACG,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,KAAK,CAAC,MAAM;IAAA;IAAA,IAClB,QAAQ;MAAA,yBACL,YAAY;QAAA,IAAC,OAAO;UAAA,yBAAG,cAAc,EAAK,KAAK;QAAA;QAAA;UAAA,yBAC7C,WAAW;YAAC,QAAQ,EAAE,KAAK;YAAA,IAAE,IAAI;cAAA,OAAE,KAAK,CAAC,OAAO,CAAC,OAAO;YAAA;UAAA;QAAA;MAAA;IAAA;IAAA,UAI3D,MAAM,IACN;IACA;IAAA;MAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;QAAA;MAAA,mBAOgB,KAAK,IAAK;QACpB,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,GAAG,EAAE;UACvE,KAAK,CAAC,cAAc,CAAC,CAAC;UACtB,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE;MACF,CAAC;MAAA,uBAIqD,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;MAAA,mCAE9E,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,YAAY;QAAA;QAAA,UAC1B,IAAI,sBACH,YAAY;UAAA;UAAA,IAEX,IAAI;YAAA,OAAE,IAAI,CAAC,CAAC;UAAA;UAAA,IACZ,QAAQ;YAAA,OAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;UAAA;UAAA,IACrE,KAAK;YAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ;UAAA;UAC1B,IAAI;QAAA;MAEP;MAAA,mCAEF,gBAAgB;QAAA,IACf,IAAI;UAAA,OAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,yBAAyB,GAAG,qBAAqB;QAAA;QAAA,IAC3E,KAAK;UAAA,OAAE,sBAAsB,CAAC,CAAC,CAAC,YAAY;QAAA;QAAA,IAC5C,QAAQ;UAAA,OAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAAA;QAChD,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;MAAC;MAAA,iBAS3B,KAAK,IAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;MAAA,qCADpD,KAAK;MAAA,oDAnCT,gBAAgB,CAAC,CAAC,CAAC,UAAU;MAAA,8CAkC9B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;MAAA;MAAA;IAAA;EAOhC;AAGP;AAEA,SAAS,YAAY,CAAC,KAA4B,EAAE;EAClD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM;IAC9B,IAAI;MACF,OAAO;QAAE,EAAE,EAAE,IAAa;QAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO;MAAyB,CAAC;IAC/F,CAAC,CAAC,MAAM;MACN,OAAO;QAAE,EAAE,EAAE;MAAe,CAAC;IAC/B;EACF,CAAC,CAAC;EACF,MAAM,WAAW,GAAG,MAA2B;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI;EACxC,CAAC;EAED,yBACG,YAAY;IAAA,IAAC,OAAO;MAAA,yBAAG,cAAc,EAAK,KAAK;IAAA;IAAA;MAAA;MAAA,mCAE3C,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,MAAM,CAAC,CAAC,CAAC,EAAE;QAAA;QAAA,IAAE,QAAQ;UAAA,yBAAG,WAAW;YAAC,QAAQ,EAAE,KAAK;YAAA,IAAE,IAAI;cAAA,OAAE,KAAK,CAAC,OAAO,CAAC,OAAO;YAAA;UAAA;QAAA;QAAA;UAAA,yBACzF,IAAI;YAAA,IACH,IAAI;cAAA,OAAE,KAAK,CAAC,YAAY,KAAK,SAAS;YAAA;YAAA,IACtC,QAAQ;cAAA,yBAAG,WAAW;gBAAC,QAAQ,EAAE,KAAK;gBAAA,IAAE,IAAI;kBAAA,OAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAA;cAAA;YAAA;YAAA;cAAA,yBAEnF,qBAAqB;gBAAA,IAAC,IAAI;kBAAA,OAAE,WAAW,CAAC,CAAC;gBAAA;gBAAE,OAAO,EAAE;cAAG;YAAA;UAAA;QAAA;MAAA;MAAA;IAAA;EAAA;AAMpE;AAEA,SAAS,qBAAqB,CAAC,KAA4B,EAAE;EAC3D,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,CAAC;EAChD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,YAAY,CAAuB;IAAE,QAAQ,EAAE,OAAO;IAAE,SAAS,EAAE,MAAM;IAAE,IAAI,EAAE;EAAQ,CAAC,CAAC;EACjI,OAAO,CAAC,MAAM;IACZ,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE;IAClC,IAAI;MACF,cAAc,CAAC,wBAAwB,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ,CAAC,CAAC;EACF,MAAM,MAAM,GAAI,KAAoC,IAAK;IACvD,MAAM,IAAI,GAAG;MAAE,GAAG,WAAW,CAAC,CAAC;MAAE,GAAG;IAAM,CAAC;IAC3C,cAAc,CAAC,IAAI,CAAC;IACpB,IAAI,KAAK,CAAC,qBAAqB,EAAE;MAC/B,IAAI;QACF,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;MACzE,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF,CAAC;EACD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;EAC5F,MAAM,SAAS,GAAG,MAChB,WAAW,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,GAC9B,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,KAAK,2BAA2B,GACrG,IAAI,GACJ,GAAG,GACL,WAAW,CAAC,CAAC,CAAC,SAAS;EAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;EACvC,YAAY,CAAC,MAAM;IACjB,IAAI,CAAC,CAAC;IACN,SAAS,CAAC,CAAC;IACX,KAAK,CAAC,YAAY;IAClB,OAAO,CAAC,CAAC,CAAC;EACZ,CAAC,CAAC;EACF,MAAM,QAAQ,GAAG,MAAO,KAAK,CAAC,YAAY,KAAK,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAE;EACjG,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC;IAAE,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC;EAAE,CAAC,CAAC,CAAC;EAChI,MAAM,QAAQ,GAAG,MACf,OAAO,CAAC,MAAM,CACZ;IAAA;MAAA;MAAA;MAAA;MAAA;MAAA;MAAA;IAAA,mCAEK,MAAM;MAAA,IACL,KAAK;QAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,WAAW;MAAA;MAAA,IACrC,KAAK;QAAA,OAAE,WAAW,CAAC,CAAC,CAAC,QAAQ;MAAA;MAAA,IAC7B,QAAQ;QAAA,OAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;MAAA;MAC7C,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC;MAC1D,aAAa,EAAG,KAAK,IAAK;QACxB,IAAI,KAAK,EAAE,MAAM,CAAC;UAAE,QAAQ,EAAE;QAAM,CAAC,CAAC;MACxC;IAAC;IAAA,mCAEF,MAAM;MAAA,IACL,KAAK;QAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,YAAY;MAAA;MAAA,IACtC,KAAK;QAAA,OAAE,WAAW,CAAC,CAAC,CAAC,SAAS;MAAA;MAAA,IAC9B,OAAO;QAAA,OAAE,CACP;UAAE,KAAK,EAAE,MAAM;UAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAAoB,CAAC,EAChE;UAAE,KAAK,EAAE,GAAG;UAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAAS,CAAC,EAClD;UAAE,KAAK,EAAE,GAAG;UAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAAa,CAAC,EACtD;UAAE,KAAK,EAAE,IAAI;UAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAAO,CAAC,EACjD;UAAE,KAAK,EAAE,GAAG;UAAE,KAAK,EAAE;QAAI,CAAC,CAC3B;MAAA;MACD,aAAa,EAAG,KAAK,IAAK;QACxB,IAAI,KAAK,EAAE,MAAM,CAAC;UAAE,SAAS,EAAE;QAAM,CAAC,CAAC;MACzC;IAAC;IAAA,mCAEF,MAAM;MAAA,IACL,KAAK;QAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,OAAO;MAAA;MAAA,IACjC,KAAK;QAAA,OAAE,WAAW,CAAC,CAAC,CAAC,IAAI;MAAA;MAAA,IACzB,OAAO;QAAA,OAAE,CACP;UAAE,KAAK,EAAE,OAAO;UAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAAU,CAAC,EACxD;UAAE,KAAK,EAAE,KAAK;UAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAAO,CAAC,CACnD;MAAA;MACD,aAAa,EAAG,KAAK,IAAK;QACxB,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,KAAK,EAAE,MAAM,CAAC;UAAE,IAAI,EAAE;QAAM,CAAC,CAAC;MACnE;IAAC;IAAA;EAAA,IAGN,EACD;IAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;EAAY,CAC1C,CAAC;EACH,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;EACzD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;EAEtD,yBACG,YAAY;IAAA,IACX,OAAO;MAAA,0BAEF,aAAa;QAAC,IAAI;QAAA,IAA6B,KAAK;UAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,WAAW;QAAA;QAAE,OAAO,EAAE,MAAM,KAAK,QAAQ,CAAC;MAAC,sBACpH,cAAc,EAAK,KAAK;IAAA;IAAA;MAAA,yBAI5B,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,WAAW,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO;QAAA;QAAA,IAAE,QAAQ;UAAA,yBAAG,WAAW;YAAC,QAAQ,EAAE,KAAK;YAAA,IAAE,IAAI;cAAA,OAAE,IAAI,CAAC,CAAC;YAAA;UAAA;QAAA;QAAA;UAAA,yBAC7F,IAAI;YAAA,IACH,IAAI;cAAA,OAAE,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;YAAA;YAAA,IAC1B,QAAQ;cAAA,yBACL,WAAW;gBAAC,IAAI;gBAAA,IAAe,KAAK;kBAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS;gBAAA;gBAAA,IAAE,WAAW;kBAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,kBAAkB;gBAAA;cAAA;YAAA;YAAA;cAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;gBAAA;cAAA,mCAOhH,GAAG;gBAAA,IAAC,IAAI;kBAAA,OAAE,OAAO,CAAC,CAAC;gBAAA;gBAAA,UACjB,CAAC,MAAM,EAAE,KAAK;kBAAA;oBAAA;kBAAA,uBAEJ,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC;oBAAE,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG;kBAAE,CAAC,CAAC;kBAAA;gBAAA;cAEtE;cAAA,mCAKJ,GAAG;gBAAA,IAAC,IAAI;kBAAA,OAAE,IAAI,CAAC,CAAC;gBAAA;gBAAA,UACb,GAAG;kBAAA;kBAAA,mCAEA,GAAG;oBAAA,IAAC,IAAI;sBAAA,OAAE,OAAO,CAAC,CAAC;oBAAA;oBAAA,UAAG,CAAC,CAAC,EAAE,KAAK;sBAAA;sBAAA,uBAAU,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;sBAAA;oBAAA;kBAAM;kBAAA;gBAAA;cAErE;cAAA,mCAIN,IAAI;gBAAA,IAAC,IAAI;kBAAA,OAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB;gBAAA;gBAAA;kBAAA;kBAAA,uBACW,gBAAgB,CAAC,CAAC,CAAC,qBAAqB;kBAAA;gBAAA;cAAA;cAAA,mCAExF,IAAI;gBAAA,IACH,IAAI;kBAAA,OAAE,KAAK,CAAC,YAAY,KAAK,SAAS;gBAAA;gBAAA,IACtC,QAAQ;kBAAA,yBACL,IAAI;oBAAA,IAAC,IAAI;sBAAA,OAAE,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;oBAAA;oBAAA;sBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;wBAAA;sBAAA,mCAEhC,MAAM;wBAAC,IAAI;wBAAM,OAAO;wBAAA,IAAS,QAAQ;0BAAA,OAAE,IAAI,CAAC,CAAC,KAAK,CAAC;wBAAA;wBAAE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;wBAAA;0BAAA,OACzF,QAAQ,CAAC,CAAC,CAAC,QAAQ;wBAAA;sBAAA;sBAAA,uBAGnB,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC;sBAAA,uBAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;sBAAA,uBAAK,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC;sBAAA,mCAEpH,MAAM;wBACL,IAAI;wBACJ,OAAO;wBAAA,IACP,QAAQ;0BAAA,OAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC;wBAAA;wBAC9D,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;wBAAA;0BAAA,OAEjC,QAAQ,CAAC,CAAC,CAAC,IAAI;wBAAA;sBAAA;sBAAA;oBAAA;kBAAA;gBAAA;gBAAA;kBAAA,yBAMvB,SAAS;oBAAA,IAAC,KAAK;sBAAA,OAAE,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;oBAAA;oBAAA,IAAE,OAAO;sBAAA,OAAE,KAAK,CAAC,eAAe;oBAAA;kBAAA;gBAAA;cAAA;cAAA;YAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AAOvG;AAEA,MAAM,WAAW,GAAI,KAA4B,IAC/C,KAAK,CAAC,WAAW,IAAI,QAAQ,KAAK,CAAC,OAAO,CAAC,SAAS,WAAW,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE;AAExF,SAAS,aAAa,CAAC,KAA4B,EAAE;EACnD,yBACG,YAAY;IAAA,IAAC,OAAO;MAAA,yBAAG,cAAc,EAAK,KAAK;IAAA;IAAA;MAAA;QAAA;MAAA,oCAEE,KAAK,CAAC,cAAc;MAAA;QAAA,WAAhD,KAAK,CAAC,WAAW;UAAA,OAAsC,WAAW,CAAC,KAAK,CAAC;UAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI;QAAA;QAAA;QAAA;QAAA;MAAA;QAAA;QAAA;QAAA;MAAA;MAAA;IAAA;EAAA;AAIzH;AAEA,MAAM,OAAO,GAAI,OAAwB,IAAW;EAClD,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,EAAE;EAAkB,CAAC,CAAC;EAChG,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;EACpC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;EAC3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;EAC9F,OAAO,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE;IAAE,IAAI,EAAE;EAAkB,CAAC,CAAC;AACvD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW,CAAC,KAA4B,EAAE;EACjD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C;EACA;EACA;EACA,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE;IACvD,MAAM,EAAE,CAAC,QAAQ,EAAE,IAAI,KAAK,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC;EAC/F,CAAC,CAAC;EACF,MAAM,IAAI,GAAG,UAAU,CAAC,MAAO,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;EAChG,yBACG,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,KAAK,CAAC,WAAW;IAAA;IAAA,IACvB,QAAQ;MAAA,yBACL,IAAI;QACH,KAAK;QAAA,IACL,IAAI;UAAA,OAAE,IAAI,CAAC,CAAC;QAAA;QAAA,IACZ,QAAQ;UAAA,yBAAG,WAAW;YAAC,IAAI;YAAuB,KAAK;YAAA,IAAO,WAAW;cAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,eAAe;YAAA;UAAA;QAAA;QAAA,UAE3G,GAAG,IACH;QACA;QAAA,kBACC,UAAU;UAAC,QAAQ;UAAA,IAAC,KAAK;YAAA,OAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;UAAA;UAAE,OAAO,EAAE,YAAY,GAAG;UAAA,UAC7G,KAAK;YAAA;cAAA;cAAA;cAAA;cAAA;YAAA,uBAEF,KAAK,CAAC,OAAO;YAAA,uBACb,KAAK,CAAC,OAAO;YAAA;UAAA;QAEjB;MAEJ;IAAA;IAAA,UAIH,IAAI;MAAA;MAAA;QAAA,WAAmB,IAAI,CAAC,CAAC;UAAA,OAAwE,KAAK,CAAC,IAAI,CAAC,IAAI;QAAA;QAAA;QAAA;MAAA;QAAA;QAAA;MAAA;MAAA;IAAA;EAAI;AAGhI;AAEA,SAAS,aAAa,CAAC,KAA4B,EAAE;EACnD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,yBACG,YAAY;IAAA,IAAC,OAAO;MAAA,yBAAG,cAAc,EAAK,KAAK;IAAA;IAAA;MAAA;QAAA;MAAA,oCAIjC,KAAK,CAAC,cAAc;MAAA,uBAM5B,gBAAgB,CAAC,CAAC,CAAC,gBAAgB;MAAA;QAAA,WAPvB,KAAK,CAAC,WAAW;UAAA,QAIzB,WAAW,CAAC,KAAK,CAAC;UAAA,QACX,KAAK,CAAC,IAAI,CAAC,IAAI;QAAA;QAAA;QAAA;QAAA;MAAA;QAAA;QAAA;QAAA;MAAA;MAAA;IAAA;EAAA;AAOrC;AAEA,SAAS,aAAa,CAAC,KAA4B,EAAE;EACnD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;EAC9E,yBACG,YAAY;IAAA,IAAC,OAAO;MAAA,yBAAG,cAAc,EAAK,KAAK;IAAA;IAAA;MAAA;MAAA,mCAE3C,WAAW;QAAA,IACV,GAAG;UAAA,OAAE,WAAW,CAAC,KAAK,CAAC;QAAA;QAAA,IACvB,KAAK;UAAA,OAAE,IAAI,CAAC,CAAC;QAAA;QAAA,IACb,WAAW;UAAA,OAAE,KAAK,CAAC,WAAW;QAAA;QAAA,IAC9B,UAAU;UAAA,OAAE,KAAK,CAAC,cAAc;QAAA;QAAA,IAChC,cAAc;UAAA,yBACX,IAAI;YAAA,IAAC,IAAI;cAAA,OAAE,KAAK,CAAC,YAAY;YAAA;YAAA,UAC1B,IAAI;cAAA;gBAAA;gBAAA;gBAAA;cAAA,uBAGD,QAAQ,CAAC,CAAC,CAAC,QAAQ;cAAA;gBAAA,YAF8C,IAAI,CAAC,CAAC;kBAAA,QAAY,IAAI,CAAC,CAAC;gBAAA;gBAAA;gBAAA;cAAA;gBAAA;gBAAA;cAAA;cAAA;YAAA;UAI7F;QAAA;MAAA;MAAA;IAAA;EAAA;AAOf;AAEA,SAAS,cAAc,CAAC,KAA4B,EAAE;EACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,yBACG,WAAW;IACV,IAAI;IAAA,IACJ,KAAK;MAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS;IAAA;IAAA,IACnC,WAAW;MAAA,OAAE,KAAK,CAAC,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC,CAAC,CAAC,UAAU;IAAA;IAAA,IACrE,MAAM;MAAA,yBACH,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,YAAY;QAAA;QAAA,UAC1B,IAAI;UAAA;YAAA;YAAA;YAAA;UAAA,uBAGD,QAAQ,CAAC,CAAC,CAAC,QAAQ;UAAA,8CAF8C,IAAI,CAAC,CAAC;UAAA;QAAA;MAI3E;IAAA;EAAA;AAKX;AAEA,MAAM,iBAAqC,GAAG,CAC5C;EAAE,EAAE,EAAE,UAAU;EAAE,KAAK,EAAE,UAAU;EAAE,SAAS,EAAE,gBAAgB;EAAE,QAAQ,EAAE;AAAK,CAAC,EAClF;EACE,EAAE,EAAE,OAAO;EACX,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,OAAO;EACzH,SAAS,EAAE;AACb,CAAC,EACD;EACE,EAAE,EAAE,KAAK;EACT,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,KAAK;EACvH,SAAS,EAAE;AACb,CAAC,EACD;EACE,EAAE,EAAE,MAAM;EACV,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KACnB,OAAO,CAAC,QAAQ,KAAK,MAAM,IAAI,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,MAAM;EAC/H,SAAS,EAAE;AACb,CAAC,EACD;EACE,EAAE,EAAE,gBAAgB;EACpB,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,gBAAgB;EAClI,SAAS,EAAE;AACb,CAAC,EACD;EACE,EAAE,EAAE,OAAO;EACX,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,OAAO;EACzH,SAAS,EAAE;AACb,CAAC,EACD;EACE,EAAE,EAAE,OAAO;EACX,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,sBAAsB,CAAC;IAAE,GAAG,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;EAAU,CAAC,CAAC,KAAK,OAAO;EACzH,SAAS,EAAE;AACb,CAAC,EACD;EAAE,EAAE,EAAE,MAAM;EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,KAAK,MAAM;EAAE,SAAS,EAAE,YAAY;EAAE,QAAQ,EAAE;AAAK,CAAC,EAC/G;EAAE,EAAE,EAAE,QAAQ;EAAE,KAAK,EAAE,MAAM,IAAI;EAAE,SAAS,EAAE;AAAe,CAAC,CAC/D;;AAED;;AAEA,OAAO,MAAM,kBAAkB,GAAI,KAAa,IAAa;EAC3D,IAAI,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,KAAK,IAAI;EACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK;EACjE,OAAO,GAAG,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK;AACnD,CAAC;AAED,eAAe,SAAS,QAAQ,CAAC,KAAoB,EAAE;EACrD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC;EAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EAC1C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EACpD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;EAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC;EACxD,MAAM,iBAAiB,GAAG,MAAM,KAAK,CAAC,SAAS,IAAI,EAAE;EACrD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAuE;IACzG,QAAQ,EAAE,MAAO,KAAK,IAAK;MACzB,MAAM,KAAK,CAAC,IAAI,CAAE,KAAK,CAAC,OAAO,CAAC;MAChC,OAAO,KAAK;IACd,CAAC;IACD,SAAS,EAAG,KAAK,IAAK;MACpB,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC;MAChE,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,CAAC;IACD,OAAO,EAAG,KAAK,IAAK,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO;EAC/C,CAAC,CAAC;EACF,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW;IAC9B,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG;IAChD,OAAO,GAAG,IAAI,GAAG,SAAS,oBAAoB,cAAc,CAAC,CAAC,EAAE;EAClE,CAAC,CAAC;EACF,MAAM,qBAAqB,GAAG,UAAU,CAAyB,MAAM;IACrE,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC;IAC/C,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,OAAO,IAAI;IAC3F,MAAM,IAAI,GAAG,iBAAiB,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI;IAEtB,MAAM,SAA0B,GAAG;MACjC,QAAQ,EAAE,QAAQ;MAClB,OAAO,EAAE,EAAE;MACX,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI;IACrC,CAAC;IACD,OAAO,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAE,QAAQ,IAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS;EACzG,CAAC,CAAC;EACF,MAAM,CAAC,OAAO,EAAE;IAAE;EAAQ,CAAC,CAAC,GAAG,cAAc,CAC3C,MAAO,qBAAqB,CAAC,CAAC,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;IAAE,QAAQ,EAAE,KAAK,CAAC;EAAS,CAAE,EAC5F,YAAY;IACV,YAAY,CAAC,KAAK,CAAC,CAAC;IACpB;IACA;IACA,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,EAAE;IACpE,QAAQ,CAAC,WAAW,CAAC;IACrB,aAAa,CAAC,WAAW,CAAC;IAC1B,OAAO,MAAM;EACf,CACF,CAAC;EACD,YAAY,CAAC,MAAM;IACjB,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;IAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,eAAe,CAAC,YAAY;MACnD,IAAI,qBAAqB,CAAC,CAAC,EAAE,iBAAiB,CAAE,KAAK,IAAK,KAAK,GAAG,CAAC,CAAC,CAAC,KAChE,MAAM,OAAO,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,IAAI,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC;EACvC,CAAC,CAAC;EACF;EACA,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,qBAAqB,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;EAE5G,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM;IAChC,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI;IACxB,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAE,SAAS,IAAK,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,IAAI;EACxH,CAAC,CAAC;EAEF,YAAY,CAAC,MAAM;IACjB,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC;EAChC,CAAC,CAAC;EAEF,MAAM,IAAI,GAAG,YAAY;IACvB,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE;IAC3C,MAAM,YAAY,CAAC,MAAM,CAAC;MAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;MAAE,OAAO,EAAE,KAAK,CAAC;IAAE,CAAC,CAAC;EACxE,CAAC;EAED,MAAM,MAAM,GAAG,MACb,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,EAAE,QAAQ,IAAI,eAAe,CAAC,CAAC,EAAE,QAAQ,KAAK,MAAM,GACxE;IACE,KAAK;IACL,QAAQ;IACR,KAAK;IACL,MAAM,EAAE,YAAY,CAAC,OAAO;IAC5B;EACF,CAAC,GACD,IAAI;;EAEV;EACA,MAAM,aAAa,GAAG,UAAU,CAA4B,MAAM;IAChE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,OAAO,SAAS;IAC5C,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI;IAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE,OAAO,SAAS;IAC7B,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,KAAK,gBAAgB,EAAE,OAAO,IAAI;IAC3D,OAAO,oBAAoB,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI;EACnG,CAAC,CAAC;EACF,YAAY,CAAC,MAAM;IACjB,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;EACzD,CAAC,CAAC;EAEF;IAAA;IAAA,mCAMK,YAAY,CAAC,QAAQ;MACpB,KAAK,EAAE;QACL,IAAI,KAAK,GAAG;UACV,OAAO,KAAK,CAAC,OAAO,KAAK,OAAO;QAClC,CAAC;QACD,IAAI,SAAS,GAAG;UACd,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;QACvC;MACF,CAAC;MAAA;QAAA,yBAEA,MAAM;UAAA;YAAA,0BACJ,KAAK;cAAA,IAAC,IAAI;gBAAA,OAAE,sBAAO,CAAC,OAAO,OAAI,OAAO,CAAC,CAAC,KAAK,SAAS;cAAA;cAAA;gBAAA,yBACpD,WAAW;kBAAC,KAAK;kBAAA,IAAW,KAAK;oBAAA,OAAE,QAAQ,CAAC,CAAC,CAAC,OAAO;kBAAA;gBAAA;cAAA;YAAA,sBAEvD,KAAK;cAAA,IAAC,IAAI;gBAAA,OAAE,OAAO,CAAC,KAAK;cAAA;cAAA;gBAAA,yBACvB,WAAW;kBAAC,KAAK;kBAAA,IAAS,KAAK;oBAAA,OAAE,gBAAgB,CAAC,CAAC,CAAC,cAAc;kBAAA;kBAAA,IAAE,WAAW;oBAAA,OAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;kBAAA;gBAAA;cAAA;YAAA,sBAEvH,KAAK;cAAA,IAAC,IAAI;gBAAA,OAAE,8BAAe,CAAC,CAAC,OAAI,QAAQ,CAAC,CAAC;cAAA;cAAA,UACxC,MAAM,IAAK;gBACX,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS;gBACnC,yBACG,QAAQ;kBAAA,IACP,YAAY;oBAAA,OAAE,KAAK,CAAC,YAAY;kBAAA;kBAAA,IAChC,eAAe;oBAAA,OAAE,KAAK,CAAC,eAAe;kBAAA;kBAAA,IACtC,YAAY;oBAAA,OAAE,KAAK,CAAC,YAAY;kBAAA;kBAAA,IAChC,qBAAqB;oBAAA,OAAE,KAAK,CAAC,qBAAqB;kBAAA;kBAAA,IAClD,IAAI;oBAAA,OAAE,KAAK,CAAC,IAAI;kBAAA;kBAAA,IAChB,OAAO;oBAAA,OAAE,eAAe,CAAC,CAAC;kBAAA;kBAAA,IAC1B,WAAW;oBAAA,OAAE,iBAAiB,CAAC,CAAC;kBAAA;kBAAA,IAChC,WAAW;oBAAA,OAAE,KAAK,CAAC,WAAW;kBAAA;kBAAA,IAC9B,cAAc;oBAAA,OAAE,KAAK,CAAC,cAAc;kBAAA;kBAAA,IACpC,YAAY;oBAAA,OAAE,KAAK,CAAC,YAAY,IAAI,IAAI;kBAAA;kBAAA,IACxC,MAAM;oBAAA,OAAE,MAAM,CAAC,CAAC;kBAAA;gBAAA;cAGtB;YAAC;UAAA;QAAA;MAAA;IAAA;IAAA;MAAA,YAvCA,yBAAyB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;QAAA,QACrC,KAAK,CAAC,OAAO;QAAA,QACb,KAAK,CAAC,YAAY,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS;MAAA;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;MAAA;IAAA;IAAA;EAAA;AA2CzE;AAAC","ignoreList":[]}
@@ -0,0 +1,162 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
3
+ import { spread as _$spread } from "solid-js/web";
4
+ import { mergeProps as _$mergeProps } from "solid-js/web";
5
+ import { className as _$className } from "solid-js/web";
6
+ import { effect as _$effect } from "solid-js/web";
7
+ import { getNextElement as _$getNextElement } from "solid-js/web";
8
+ import { insert as _$insert } from "solid-js/web";
9
+ import { createComponent as _$createComponent } from "solid-js/web";
10
+ import { memo as _$memo } from "solid-js/web";
11
+ var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-sr-only>`),
12
+ _tmpl$2 = /*#__PURE__*/_$template(`<span aria-hidden=true>`),
13
+ _tmpl$3 = /*#__PURE__*/_$template(`<span class=k2b-reference__avatar aria-hidden=true>`),
14
+ _tmpl$4 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
15
+ _tmpl$5 = /*#__PURE__*/_$template(`<span>`),
16
+ _tmpl$6 = /*#__PURE__*/_$template(`<time>`),
17
+ _tmpl$7 = /*#__PURE__*/_$template(`<a>`);
18
+ import { Show } from "solid-js";
19
+ import { Avatar } from "../surfaces/Avatar";
20
+
21
+ /** The visible length of a chip; longer titles are cut in the middle. */
22
+ export const REFERENCE_CHIP_MAX_CHARACTERS = 40;
23
+ const graphemes = text => typeof Intl.Segmenter === "function" ? Array.from(new Intl.Segmenter(undefined, {
24
+ granularity: "grapheme"
25
+ }).segment(text), part => part.segment) : Array.from(text);
26
+
27
+ /**
28
+ * Shortens `text` to at most `max` visible characters by cutting its middle, so the start and an ending such as
29
+ * ".pdf" stay readable. Counts user-perceived characters, so an emoji is never split.
30
+ * @example truncateMiddle("Quarterly report for the operations team 2026.pdf", 24) // "Quarterly re…m 2026.pdf"
31
+ */
32
+ export const truncateMiddle = (text, max = REFERENCE_CHIP_MAX_CHARACTERS) => {
33
+ const characters = graphemes(text);
34
+ if (characters.length <= max) return text;
35
+ if (max < 2) return "…";
36
+ const tail = Math.floor((max - 1) / 2);
37
+ const head = max - 1 - tail;
38
+ return `${characters.slice(0, head).join("").trimEnd()}…${characters.slice(characters.length - tail).join("").trimStart()}`;
39
+ };
40
+
41
+ /** A thing or a place: an icon in its application colour and its title, a link while it exists. */
42
+
43
+ /** A person: avatar and display name. The address belongs in the preview, never in the chip. */
44
+
45
+ /** A date or time the host already formatted for the reader. */
46
+
47
+ const fullText = props => props.kind === "person" ? props.name : props.kind === "time" ? props.label : props.title;
48
+
49
+ /**
50
+ * A typed reference inside a sentence: a thing, a place, a person, or a time, in the calm `.k2b-reference` pill.
51
+ * A chip shows at most 40 characters and cuts longer titles in the middle; the full title stays its accessible name
52
+ * and tooltip.
53
+ * @example <ReferenceChip kind="object" title="Maintenance window" icon="ti ti-mail" accent="var(--app-mail)" href="/mail/…" />
54
+ */
55
+ export function ReferenceChip(props) {
56
+ const full = () => fullText(props);
57
+ const visible = () => truncateMiddle(full());
58
+ const cut = () => visible() !== full();
59
+ const gone = () => props.kind !== "person" && props.kind !== "time" && props.gone === true;
60
+ const href = () => gone() || props.kind === "time" ? undefined : props.href;
61
+ const accent = () => props.kind === "object" || props.kind === "place" ? props.accent : undefined;
62
+ const icon = () => props.kind === "time" ? "ti ti-clock" : props.kind === "object" || props.kind === "place" ? props.icon : undefined;
63
+ const content = () => [_$createComponent(Show, {
64
+ get when() {
65
+ return props.kind === "person" ? props : undefined;
66
+ },
67
+ children: person => (() => {
68
+ var _el$3 = _$getNextElement(_tmpl$3);
69
+ _$insert(_el$3, _$createComponent(Avatar, {
70
+ get name() {
71
+ return person().name;
72
+ },
73
+ get src() {
74
+ return person().src;
75
+ },
76
+ size: "xs"
77
+ }));
78
+ return _el$3;
79
+ })()
80
+ }), _$createComponent(Show, {
81
+ get when() {
82
+ return icon();
83
+ },
84
+ children: name => (() => {
85
+ var _el$4 = _$getNextElement(_tmpl$4);
86
+ _$effect(() => _$className(_el$4, `k2b-reference__icon ${name()}`));
87
+ return _el$4;
88
+ })()
89
+ }), _$createComponent(Show, {
90
+ get when() {
91
+ return cut();
92
+ },
93
+ get fallback() {
94
+ return full();
95
+ },
96
+ get children() {
97
+ return [(() => {
98
+ var _el$ = _$getNextElement(_tmpl$);
99
+ _$insert(_el$, full);
100
+ return _el$;
101
+ })(), (() => {
102
+ var _el$2 = _$getNextElement(_tmpl$2);
103
+ _$insert(_el$2, visible);
104
+ return _el$2;
105
+ })()];
106
+ }
107
+ })];
108
+ const shared = () => ({
109
+ class: `k2b-reference k2b-reference-chip${props.class ? ` ${props.class}` : ""}`,
110
+ "data-kind": props.kind,
111
+ "data-gone": gone() ? "true" : undefined,
112
+ title: cut() ? full() : undefined,
113
+ style: accent() ? {
114
+ "--k2b-reference-icon": accent()
115
+ } : undefined
116
+ });
117
+ return _$createComponent(Show, {
118
+ get when() {
119
+ return href();
120
+ },
121
+ get fallback() {
122
+ return _$createComponent(Show, {
123
+ get when() {
124
+ return props.kind === "time" ? props : undefined;
125
+ },
126
+ get fallback() {
127
+ return (() => {
128
+ var _el$5 = _$getNextElement(_tmpl$5);
129
+ _$spread(_el$5, _$mergeProps(shared), false, true);
130
+ _$insert(_el$5, content);
131
+ _$runHydrationEvents();
132
+ return _el$5;
133
+ })();
134
+ },
135
+ children: time => (() => {
136
+ var _el$6 = _$getNextElement(_tmpl$6);
137
+ _$spread(_el$6, _$mergeProps(shared, {
138
+ get dateTime() {
139
+ return time().dateTime;
140
+ }
141
+ }), false, true);
142
+ _$insert(_el$6, content);
143
+ _$runHydrationEvents();
144
+ return _el$6;
145
+ })()
146
+ });
147
+ },
148
+ children: link => (() => {
149
+ var _el$7 = _$getNextElement(_tmpl$7);
150
+ _$spread(_el$7, _$mergeProps(shared, {
151
+ get href() {
152
+ return link();
153
+ }
154
+ }), false, true);
155
+ _$insert(_el$7, content);
156
+ _$runHydrationEvents();
157
+ return _el$7;
158
+ })()
159
+ });
160
+ }
161
+ export default ReferenceChip;
162
+ //# sourceMappingURL=ReferenceChip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["content/ReferenceChip.tsx"],"sourcesContent":["import { type JSX, Show } from \"solid-js\";\nimport { Avatar } from \"../surfaces/Avatar\";\n\n/** The visible length of a chip; longer titles are cut in the middle. */\nexport const REFERENCE_CHIP_MAX_CHARACTERS = 40;\n\nconst graphemes = (text: string): string[] =>\n typeof Intl.Segmenter === \"function\"\n ? Array.from(new Intl.Segmenter(undefined, { granularity: \"grapheme\" }).segment(text), (part) => part.segment)\n : Array.from(text);\n\n/**\n * Shortens `text` to at most `max` visible characters by cutting its middle, so the start and an ending such as\n * \".pdf\" stay readable. Counts user-perceived characters, so an emoji is never split.\n * @example truncateMiddle(\"Quarterly report for the operations team 2026.pdf\", 24) // \"Quarterly re…m 2026.pdf\"\n */\nexport const truncateMiddle = (text: string, max: number = REFERENCE_CHIP_MAX_CHARACTERS): string => {\n const characters = graphemes(text);\n if (characters.length <= max) return text;\n if (max < 2) return \"…\";\n const tail = Math.floor((max - 1) / 2);\n const head = max - 1 - tail;\n return `${characters.slice(0, head).join(\"\").trimEnd()}…${characters\n .slice(characters.length - tail)\n .join(\"\")\n .trimStart()}`;\n};\n\ntype ReferenceChipCommon = {\n class?: string;\n};\n\n/** A thing or a place: an icon in its application colour and its title, a link while it exists. */\nexport type ReferenceChipObjectProps = ReferenceChipCommon & {\n kind: \"object\" | \"place\";\n title: string;\n /** Destination of the chip. Omit it, or set `gone`, when there is nothing to open. */\n href?: string;\n /** Icon class, for example `ti ti-mail`. */\n icon?: string;\n /** Icon colour, usually the owning application's accent. Sets `--k2b-reference-icon`. */\n accent?: string;\n /** The thing no longer exists: struck through and never a link. */\n gone?: boolean;\n};\n\n/** A person: avatar and display name. The address belongs in the preview, never in the chip. */\nexport type ReferenceChipPersonProps = ReferenceChipCommon & {\n kind: \"person\";\n name: string;\n /** Avatar image; initials on a tint from the name otherwise. */\n src?: string | null;\n href?: string;\n};\n\n/** A date or time the host already formatted for the reader. */\nexport type ReferenceChipTimeProps = ReferenceChipCommon & {\n kind: \"time\";\n label: string;\n /** Machine-readable value for `<time datetime>`. */\n dateTime?: string;\n};\n\nexport type ReferenceChipProps = ReferenceChipObjectProps | ReferenceChipPersonProps | ReferenceChipTimeProps;\n\nconst fullText = (props: ReferenceChipProps): string =>\n props.kind === \"person\" ? props.name : props.kind === \"time\" ? props.label : props.title;\n\n/**\n * A typed reference inside a sentence: a thing, a place, a person, or a time, in the calm `.k2b-reference` pill.\n * A chip shows at most 40 characters and cuts longer titles in the middle; the full title stays its accessible name\n * and tooltip.\n * @example <ReferenceChip kind=\"object\" title=\"Maintenance window\" icon=\"ti ti-mail\" accent=\"var(--app-mail)\" href=\"/mail/…\" />\n */\nexport function ReferenceChip(props: ReferenceChipProps): JSX.Element {\n const full = () => fullText(props);\n const visible = () => truncateMiddle(full());\n const cut = () => visible() !== full();\n const gone = () => props.kind !== \"person\" && props.kind !== \"time\" && props.gone === true;\n const href = () => (gone() || props.kind === \"time\" ? undefined : props.href);\n const accent = () => (props.kind === \"object\" || props.kind === \"place\" ? props.accent : undefined);\n const icon = () => (props.kind === \"time\" ? \"ti ti-clock\" : props.kind === \"object\" || props.kind === \"place\" ? props.icon : undefined);\n\n const content = () => (\n <>\n <Show when={props.kind === \"person\" ? props : undefined}>\n {(person) => (\n <span class=\"k2b-reference__avatar\" aria-hidden=\"true\">\n <Avatar name={person().name} src={person().src} size=\"xs\" />\n </span>\n )}\n </Show>\n <Show when={icon()}>{(name) => <i class={`k2b-reference__icon ${name()}`} aria-hidden=\"true\" />}</Show>\n <Show when={cut()} fallback={full()}>\n <span class=\"k2b-sr-only\">{full()}</span>\n <span aria-hidden=\"true\">{visible()}</span>\n </Show>\n </>\n );\n\n const shared = () => ({\n class: `k2b-reference k2b-reference-chip${props.class ? ` ${props.class}` : \"\"}`,\n \"data-kind\": props.kind,\n \"data-gone\": gone() ? \"true\" : undefined,\n title: cut() ? full() : undefined,\n style: accent() ? { \"--k2b-reference-icon\": accent() } : undefined,\n });\n\n return (\n <Show\n when={href()}\n fallback={\n <Show when={props.kind === \"time\" ? props : undefined} fallback={<span {...shared()}>{content()}</span>}>\n {(time) => (\n <time {...shared()} dateTime={time().dateTime}>\n {content()}\n </time>\n )}\n </Show>\n }\n >\n {(link) => (\n <a {...shared()} href={link()}>\n {content()}\n </a>\n )}\n </Show>\n );\n}\n\nexport default ReferenceChip;\n"],"mappings":"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","ignoreList":[]}
@@ -17,6 +17,15 @@ export const calendarAutoScrollSpeed = (clientY, top, bottom, edge = 56, maximum
17
17
  };
18
18
  let cancelActiveSession = null;
19
19
 
20
+ /**
21
+ * Runs `open` once the browser has handled the pointer release that ends a drag. The browser light-dismisses an
22
+ * `auto` popover that opens while it dispatches that `pointerup`, as the HTML popover rules ask and Chromium 156
23
+ * does, so a popover that a drag opens must open after the release.
24
+ */
25
+ export const afterPointerRelease = open => {
26
+ window.setTimeout(open, 0);
27
+ };
28
+
20
29
  /**
21
30
  * Owns one pointer gesture from threshold crossing through commit or cancel.
22
31
  * Views provide geometry through `resolve`; this helper owns global cleanup,
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/calendar-pointer.ts"],"sourcesContent":["import { suppressTextSelection } from \"../internal/text-selection\";\n\nexport const CALENDAR_SNAP_MINUTES = 15;\n\nexport const snapCalendarMinutes = (minutes: number, step = CALENDAR_SNAP_MINUTES): number => Math.round(minutes / step) * step;\n\nexport const calendarDayIndexAtPoint = (clientX: number, startX: number, width: number, days: number): number | null => {\n if (days <= 0 || width <= 0 || clientX < startX || clientX >= startX + width) return null;\n return Math.min(days - 1, Math.floor(((clientX - startX) / width) * days));\n};\n\nexport const calendarMinuteAtPoint = (clientY: number, top: number, height: number, startHour: number, endHour: number): number => {\n const totalMinutes = Math.max(60, (endHour - startHour + 1) * 60);\n const ratio = height > 0 ? Math.min(1, Math.max(0, (clientY - top) / height)) : 0;\n return snapCalendarMinutes(startHour * 60 + ratio * totalMinutes);\n};\n\nexport const calendarAutoScrollSpeed = (clientY: number, top: number, bottom: number, edge = 56, maximum = 18): number => {\n if (clientY < top + edge) return -Math.ceil(maximum * Math.min(1, (top + edge - clientY) / edge));\n if (clientY > bottom - edge) return Math.ceil(maximum * Math.min(1, (clientY - (bottom - edge)) / edge));\n return 0;\n};\n\ntype CalendarPointerSessionOptions<T> = {\n event: PointerEvent;\n resolve: (clientX: number, clientY: number) => T | null;\n onActivate?: () => void;\n onPreview: (value: T) => void;\n onCommit: (value: T) => void;\n onCancel?: () => void;\n /** Called once whenever the session ends, even before activation, after onCommit or onCancel. */\n onEnd?: () => void;\n scrollContainer?: HTMLElement;\n threshold?: number;\n /**\n * The edges scroll only once the pointer has been well inside the container, and only while it is over it, so a drag\n * that comes in from outside, such as from a list below, does not scroll on its way in.\n */\n armAutoScroll?: boolean;\n /** Called on every move once the gesture is active, such as to move a token with the pointer. */\n onMove?: (clientX: number, clientY: number) => void;\n};\n\nlet cancelActiveSession: (() => void) | null = null;\n\n/**\n * Owns one pointer gesture from threshold crossing through commit or cancel.\n * Views provide geometry through `resolve`; this helper owns global cleanup,\n * pointer cancellation, Escape handling, and edge auto-scroll.\n */\nexport const startCalendarPointerSession = <T>(options: CalendarPointerSessionOptions<T>): (() => void) => {\n if (options.event.button !== 0 || !options.event.isPrimary) return () => {};\n\n cancelActiveSession?.();\n\n const pointerId = options.event.pointerId;\n const target = options.event.currentTarget instanceof HTMLElement ? options.event.currentTarget : null;\n const startX = options.event.clientX;\n const startY = options.event.clientY;\n // Leave enough room for normal click jitter before an event becomes a drag.\n const threshold = options.threshold ?? 6;\n let clientX = startX;\n let clientY = startY;\n let active = false;\n let finished = false;\n let latest: T | null = null;\n let scrollFrame = 0;\n let releaseTextSelection: (() => void) | null = null;\n let armed = !options.armAutoScroll;\n\n const preview = () => {\n const value = options.resolve(clientX, clientY);\n if (value === null) return;\n latest = value;\n options.onPreview(value);\n };\n\n const autoScroll = () => {\n scrollFrame = 0;\n if (!active || !options.scrollContainer) return;\n const rect = options.scrollContainer.getBoundingClientRect();\n const inside = clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom;\n if (!armed && inside && clientY > rect.top + 56 && clientY < rect.bottom - 56) armed = true;\n const speed = armed && (inside || !options.armAutoScroll) ? calendarAutoScrollSpeed(clientY, rect.top, rect.bottom) : 0;\n if (speed !== 0) {\n const before = options.scrollContainer.scrollTop;\n options.scrollContainer.scrollTop += speed;\n if (options.scrollContainer.scrollTop !== before) preview();\n }\n scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n const cleanup = () => {\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", cancel);\n window.removeEventListener(\"blur\", cancel);\n window.removeEventListener(\"keydown\", onKeyDown);\n if (target?.hasPointerCapture?.(pointerId)) target.releasePointerCapture(pointerId);\n releaseTextSelection?.();\n if (cancelActiveSession === cancel) cancelActiveSession = null;\n };\n\n const activate = () => {\n if (active) return;\n active = true;\n releaseTextSelection = suppressTextSelection(pointerId);\n target?.setPointerCapture?.(pointerId);\n options.onActivate?.();\n preview();\n if (options.scrollContainer) scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n function cancel() {\n if (finished) return;\n finished = true;\n cleanup();\n try {\n if (active) options.onCancel?.();\n } finally {\n options.onEnd?.();\n }\n }\n\n function onMove(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n clientX = event.clientX;\n clientY = event.clientY;\n if (!active && Math.hypot(clientX - startX, clientY - startY) >= threshold) activate();\n if (!active) return;\n event.preventDefault();\n options.onMove?.(clientX, clientY);\n preview();\n }\n\n function onUp(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n finished = true;\n cleanup();\n try {\n if (active && latest !== null) options.onCommit(latest);\n else if (active) options.onCancel?.();\n } finally {\n options.onEnd?.();\n }\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n cancel();\n }\n\n window.addEventListener(\"pointermove\", onMove, { passive: false });\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", cancel);\n window.addEventListener(\"blur\", cancel);\n window.addEventListener(\"keydown\", onKeyDown);\n cancelActiveSession = cancel;\n return cancel;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/calendar-pointer.ts"],"sourcesContent":["import { suppressTextSelection } from \"../internal/text-selection\";\n\nexport const CALENDAR_SNAP_MINUTES = 15;\n\nexport const snapCalendarMinutes = (minutes: number, step = CALENDAR_SNAP_MINUTES): number => Math.round(minutes / step) * step;\n\nexport const calendarDayIndexAtPoint = (clientX: number, startX: number, width: number, days: number): number | null => {\n if (days <= 0 || width <= 0 || clientX < startX || clientX >= startX + width) return null;\n return Math.min(days - 1, Math.floor(((clientX - startX) / width) * days));\n};\n\nexport const calendarMinuteAtPoint = (clientY: number, top: number, height: number, startHour: number, endHour: number): number => {\n const totalMinutes = Math.max(60, (endHour - startHour + 1) * 60);\n const ratio = height > 0 ? Math.min(1, Math.max(0, (clientY - top) / height)) : 0;\n return snapCalendarMinutes(startHour * 60 + ratio * totalMinutes);\n};\n\nexport const calendarAutoScrollSpeed = (clientY: number, top: number, bottom: number, edge = 56, maximum = 18): number => {\n if (clientY < top + edge) return -Math.ceil(maximum * Math.min(1, (top + edge - clientY) / edge));\n if (clientY > bottom - edge) return Math.ceil(maximum * Math.min(1, (clientY - (bottom - edge)) / edge));\n return 0;\n};\n\ntype CalendarPointerSessionOptions<T> = {\n event: PointerEvent;\n resolve: (clientX: number, clientY: number) => T | null;\n onActivate?: () => void;\n onPreview: (value: T) => void;\n onCommit: (value: T) => void;\n onCancel?: () => void;\n /** Called once whenever the session ends, even before activation, after onCommit or onCancel. */\n onEnd?: () => void;\n scrollContainer?: HTMLElement;\n threshold?: number;\n /**\n * The edges scroll only once the pointer has been well inside the container, and only while it is over it, so a drag\n * that comes in from outside, such as from a list below, does not scroll on its way in.\n */\n armAutoScroll?: boolean;\n /** Called on every move once the gesture is active, such as to move a token with the pointer. */\n onMove?: (clientX: number, clientY: number) => void;\n};\n\nlet cancelActiveSession: (() => void) | null = null;\n\n/**\n * Runs `open` once the browser has handled the pointer release that ends a drag. The browser light-dismisses an\n * `auto` popover that opens while it dispatches that `pointerup`, as the HTML popover rules ask and Chromium 156\n * does, so a popover that a drag opens must open after the release.\n */\nexport const afterPointerRelease = (open: () => void): void => {\n window.setTimeout(open, 0);\n};\n\n/**\n * Owns one pointer gesture from threshold crossing through commit or cancel.\n * Views provide geometry through `resolve`; this helper owns global cleanup,\n * pointer cancellation, Escape handling, and edge auto-scroll.\n */\nexport const startCalendarPointerSession = <T>(options: CalendarPointerSessionOptions<T>): (() => void) => {\n if (options.event.button !== 0 || !options.event.isPrimary) return () => {};\n\n cancelActiveSession?.();\n\n const pointerId = options.event.pointerId;\n const target = options.event.currentTarget instanceof HTMLElement ? options.event.currentTarget : null;\n const startX = options.event.clientX;\n const startY = options.event.clientY;\n // Leave enough room for normal click jitter before an event becomes a drag.\n const threshold = options.threshold ?? 6;\n let clientX = startX;\n let clientY = startY;\n let active = false;\n let finished = false;\n let latest: T | null = null;\n let scrollFrame = 0;\n let releaseTextSelection: (() => void) | null = null;\n let armed = !options.armAutoScroll;\n\n const preview = () => {\n const value = options.resolve(clientX, clientY);\n if (value === null) return;\n latest = value;\n options.onPreview(value);\n };\n\n const autoScroll = () => {\n scrollFrame = 0;\n if (!active || !options.scrollContainer) return;\n const rect = options.scrollContainer.getBoundingClientRect();\n const inside = clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom;\n if (!armed && inside && clientY > rect.top + 56 && clientY < rect.bottom - 56) armed = true;\n const speed = armed && (inside || !options.armAutoScroll) ? calendarAutoScrollSpeed(clientY, rect.top, rect.bottom) : 0;\n if (speed !== 0) {\n const before = options.scrollContainer.scrollTop;\n options.scrollContainer.scrollTop += speed;\n if (options.scrollContainer.scrollTop !== before) preview();\n }\n scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n const cleanup = () => {\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", cancel);\n window.removeEventListener(\"blur\", cancel);\n window.removeEventListener(\"keydown\", onKeyDown);\n if (target?.hasPointerCapture?.(pointerId)) target.releasePointerCapture(pointerId);\n releaseTextSelection?.();\n if (cancelActiveSession === cancel) cancelActiveSession = null;\n };\n\n const activate = () => {\n if (active) return;\n active = true;\n releaseTextSelection = suppressTextSelection(pointerId);\n target?.setPointerCapture?.(pointerId);\n options.onActivate?.();\n preview();\n if (options.scrollContainer) scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n function cancel() {\n if (finished) return;\n finished = true;\n cleanup();\n try {\n if (active) options.onCancel?.();\n } finally {\n options.onEnd?.();\n }\n }\n\n function onMove(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n clientX = event.clientX;\n clientY = event.clientY;\n if (!active && Math.hypot(clientX - startX, clientY - startY) >= threshold) activate();\n if (!active) return;\n event.preventDefault();\n options.onMove?.(clientX, clientY);\n preview();\n }\n\n function onUp(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n finished = true;\n cleanup();\n try {\n if (active && latest !== null) options.onCommit(latest);\n else if (active) options.onCancel?.();\n } finally {\n options.onEnd?.();\n }\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n cancel();\n }\n\n window.addEventListener(\"pointermove\", onMove, { passive: false });\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", cancel);\n window.addEventListener(\"blur\", cancel);\n window.addEventListener(\"keydown\", onKeyDown);\n cancelActiveSession = cancel;\n return cancel;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -33,7 +33,7 @@ import { createEffect, createMemo, createSignal, For, on, onCleanup, onMount, Sh
33
33
  import { announce } from "../feedback/announce";
34
34
  import { addDayKeys, buildDays, clockAt, DAY_MINUTES, dayKeyOf, dayLanes, dayMinuteAt, dayTopTerms, dayYTerms, freeGaps, GAP_LABEL_MINUTES, GAP_LONG_MINUTES, gapProposal, instantInDay, instantsInDay, minuteInDay, readDayGeometry, resizedInDay, snapMinutes, subtractTerms, termsCss, wakeMinutes } from "./calendar-days";
35
35
  import { useCalendarMessages } from "./calendar-messages";
36
- import { startCalendarPointerSession } from "./calendar-pointer";
36
+ import { afterPointerRelease, startCalendarPointerSession } from "./calendar-pointer";
37
37
  import { EventChip, eventHref, ownerDateConfig, parseDate, placeCalendarPopover, validDate } from "./calendar-shared";
38
38
 
39
39
  /**
@@ -574,9 +574,12 @@ export const createTimeView = props => {
574
574
  }),
575
575
  onCommit: next => {
576
576
  const anchor = document.querySelector(".k2b-calendar-ghost[data-live]")?.getBoundingClientRect() ?? body.element;
577
- endGesture();
578
577
  swallowNextClick();
579
- openQuickCreate(key, next.start, next.end, anchor);
578
+ // The ghost stays until the quick create replaces it, so the slot never blinks.
579
+ afterPointerRelease(() => {
580
+ endGesture();
581
+ openQuickCreate(key, next.start, next.end, anchor);
582
+ });
580
583
  },
581
584
  onCancel: endGesture
582
585
  });