@k2b/ui 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/actions/index.js +2 -2
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js +1 -1
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatContextPopup.js.map +1 -1
- package/dist/browser/chat/ChatPrimitives.js +2 -2
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatTasks.js +1 -1
- package/dist/browser/chat/ChatTasks.js.map +1 -1
- package/dist/browser/chat/ChatTimeline.js +1 -1
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/composer-document.js.map +1 -1
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/content/Chart.js +3 -3
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +4 -4
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartExplorerControls.js +1 -1
- package/dist/browser/content/ChartExplorerControls.js.map +1 -1
- package/dist/browser/content/ChartFilterControls.js +2 -2
- package/dist/browser/content/ChartFilterControls.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +2 -1
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/FileView.js +7 -3
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/MarkdownView.js.map +1 -1
- package/dist/browser/content/Pagination.js.map +1 -1
- package/dist/browser/content/chart-explorer.js.map +1 -1
- package/dist/browser/content/chart-inspection.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-snapshot.js.map +1 -1
- package/dist/browser/content/file-view-preview.js.map +1 -1
- package/dist/browser/content/index.js +9 -9
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/toast.js.map +1 -1
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/NumberInput.js +9 -1
- package/dist/browser/inputs/NumberInput.js.map +1 -1
- package/dist/browser/inputs/Select.js.map +1 -1
- package/dist/browser/inputs/markdown/behaviors.js +1 -1
- package/dist/browser/inputs/markdown/behaviors.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +264 -248
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/DetailPanel.js +1 -1
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/ScrollArea.js.map +1 -1
- package/dist/browser/layout/SidebarItemPreview.js +1 -1
- package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +1 -1
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/app-workspace-state.js.map +1 -1
- package/dist/browser/layout/index.js +3 -3
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/ssr/actions/index.js +2 -2
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +1 -1
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatContextPopup.js.map +1 -1
- package/dist/ssr/chat/ChatPrimitives.js +2 -2
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatTasks.js +1 -1
- package/dist/ssr/chat/ChatTasks.js.map +1 -1
- package/dist/ssr/chat/ChatTimeline.js +1 -1
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/composer-document.js.map +1 -1
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/content/Chart.js +3 -3
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +4 -4
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartExplorerControls.js +1 -1
- package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
- package/dist/ssr/content/ChartFilterControls.js +2 -2
- package/dist/ssr/content/ChartFilterControls.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +2 -1
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/FileView.js +7 -3
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/MarkdownView.js.map +1 -1
- package/dist/ssr/content/Pagination.js.map +1 -1
- package/dist/ssr/content/chart-explorer.js.map +1 -1
- package/dist/ssr/content/chart-inspection.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-snapshot.js.map +1 -1
- package/dist/ssr/content/file-view-preview.js.map +1 -1
- package/dist/ssr/content/index.js +9 -9
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/toast.js.map +1 -1
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
- package/dist/ssr/inputs/NumberInput.js +9 -1
- package/dist/ssr/inputs/NumberInput.js.map +1 -1
- package/dist/ssr/inputs/Select.js.map +1 -1
- package/dist/ssr/inputs/markdown/behaviors.js +1 -1
- package/dist/ssr/inputs/markdown/behaviors.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +74 -62
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/DetailPanel.js +1 -1
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/ScrollArea.js.map +1 -1
- package/dist/ssr/layout/SidebarItemPreview.js +1 -1
- package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +1 -1
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/app-workspace-state.js.map +1 -1
- package/dist/ssr/layout/index.js +3 -3
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/index.d.ts +4 -4
- package/dist/types/chat/ChatComposer.d.ts +1 -1
- package/dist/types/chat/index.d.ts +1 -1
- package/dist/types/content/Chart.d.ts +2 -2
- package/dist/types/content/ChartExplorer.d.ts +2 -2
- package/dist/types/content/ChartExplorerControls.d.ts +1 -1
- package/dist/types/content/ChartSnapshotView.d.ts +1 -1
- package/dist/types/content/chart-inspection.d.ts +1 -1
- package/dist/types/content/index.d.ts +15 -15
- package/dist/types/inputs/NumberInput.d.ts +2 -0
- package/dist/types/layout/AppWorkspace.d.ts +1 -1
- package/dist/types/layout/SidebarItemPreview.d.ts +1 -1
- package/dist/types/layout/index.d.ts +3 -3
- package/package.json +2 -4
|
@@ -38,10 +38,10 @@ var _tmpl$ = ["<button type=\"button\" class=\"k2b-content-file-view__action\"",
|
|
|
38
38
|
|
|
39
39
|
import { mutation } from "@k2b/stdlib/solid";
|
|
40
40
|
import { createEffect, createMemo, createResource, createSignal, For, Match, onCleanup, onMount, Show, Switch, untrack } from "solid-js";
|
|
41
|
+
import { Button } from "../actions/Button";
|
|
41
42
|
import { prompts } from "../feedback/prompts";
|
|
42
43
|
import { toast } from "../feedback/toast";
|
|
43
44
|
import { MarkdownEditor } from "../inputs/markdown/MarkdownEditor";
|
|
44
|
-
import { Button } from "../actions/Button";
|
|
45
45
|
import { Select } from "../inputs/Select";
|
|
46
46
|
import { useUiMessages } from "../intl/messages";
|
|
47
47
|
import Placeholder from "../surfaces/Placeholder";
|
|
@@ -376,7 +376,9 @@ function DelimitedTextRenderer(props) {
|
|
|
376
376
|
if (!props.previewPreferencesKey) return;
|
|
377
377
|
try {
|
|
378
378
|
setPreferences(readDelimitedPreferences(localStorage.getItem(props.previewPreferencesKey)));
|
|
379
|
-
} catch {
|
|
379
|
+
} catch {
|
|
380
|
+
/* Storage may be disabled. */
|
|
381
|
+
}
|
|
380
382
|
});
|
|
381
383
|
const update = patch => {
|
|
382
384
|
const next = {
|
|
@@ -387,7 +389,9 @@ function DelimitedTextRenderer(props) {
|
|
|
387
389
|
if (props.previewPreferencesKey) {
|
|
388
390
|
try {
|
|
389
391
|
localStorage.setItem(props.previewPreferencesKey, JSON.stringify(next));
|
|
390
|
-
} catch {
|
|
392
|
+
} catch {
|
|
393
|
+
/* Keep the local selection. */
|
|
394
|
+
}
|
|
391
395
|
}
|
|
392
396
|
};
|
|
393
397
|
const text = createMemo(() => decodeDelimitedContent(props.content, preferences().encoding));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["mutation","createEffect","createMemo","createResource","createSignal","For","Match","onCleanup","onMount","Show","Switch","untrack","prompts","toast","MarkdownEditor","Button","Select","useUiMessages","Placeholder","CodeDisplay","decodeDelimitedContent","readDelimitedPreferences","fileViewExtension","getFileViewPreviewKind","parseDelimitedText","MarkdownView","StructuredDataPreview","canPreviewFile","codeLanguage","path","extension","isMarkdown","file","content","encoding","mediaType","stripFrontmatter","text","match","exec","trimStart","slice","length","OverlayAction","props","classes","_$createComponent","when","href","fallback","_$ssr","_tmpl$","_$ssrAttribute","_$escape","title","icon","children","_tmpl$2","download","OverlayPanel","_tmpl$4","actions","_tmpl$3","DownloadAction","messages","downloadHref","lastIndexOf","EditorToolButton","_tmpl$5","disabled","MoreLines","count","_tmpl$6","onClick","_tmpl$7","previewMoreLines","size","variant","TextExcerpt","lines","replace","split","limit","renderer","previewLines","undefined","Math","max","join","_tmpl$8","markdown","code","language","headingScale","onExpandPreview","MarkdownRenderer","editing","setEditing","editor","edit","_tmpl$9","draft","_","_tmpl$0","aria-label","fill","value","onValueChange","setDraft","showStats","onSave","save","saveDisabled","dirty","saving","toolbarTrailing","preview","TextRenderer","_tmpl$1","textEditor","_tmpl$10","saveShortcut","JsonRenderer","parsed","ok","JSON","parse","parsedValue","result","stringify","data","maxRows","DelimitedTextRenderer","preferences","setPreferences","delimiter","view","previewPreferencesKey","localStorage","getItem","update","patch","next","setItem","page","setPage","pageSize","rows","offset","settings","dialog","_tmpl$11","label","csvEncoding","options","csvSeparator","csvDefaultSeparator","csvComma","csvSemicolon","csvTab","csvView","dataTable","csvRaw","csvSettings","headers","emptyFile","description","delimitedFileEmpty","_tmpl$12","each","header","index","_tmpl$13","column","number","row","_tmpl$14","_tmpl$15","columnsTruncated","previewColumnsLimited","totalRows","_tmpl$16","previous","min","mediaSource","previewHref","ImageRenderer","_tmpl$17","crossOrigin","PdfRenderer","noInlinePreview","_tmpl$18","AudioRenderer","_tmpl$19","audioUnsupported","VideoRenderer","_tmpl$20","videoUnsupported","BinaryRenderer","noPreview","binaryFile","action","_tmpl$21","BUILTIN_RENDERERS","id","component","editable","_file","formatFileViewSize","bytes","toFixed","FileView","savedDraft","setSavedDraft","nativeRevision","setNativeRevision","instanceRenderers","renderers","saveMutation","create","input","onSuccess","saved","success","fileSaved","onError","error","message","nativePreviewHref","kind","separator","includes","browserPreviewContent","candidate","some","refetch","revision","abort","loaded","load","loadedDraft","registerRefresh","unregister","resolvedContent","find","onDirtyChange","loading","mutate","_tmpl$22","class","failedLoadFile","String","active","Renderer","onPreviewError"],"sources":["content/FileView.tsx"],"sourcesContent":["/**\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 * 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 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} from \"solid-js\";\nimport { prompts } from \"../feedback/prompts\";\nimport { toast } from \"../feedback/toast\";\nimport { MarkdownEditor } from \"../inputs/markdown/MarkdownEditor\";\nimport { Button } from \"../actions/Button\";\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 StructuredDataPreview, { type StructuredDataValue } from \"./StructuredDataPreview\";\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 /** Plain previews inherit the surrounding surface without a frame or inset padding. */\n variant?: \"default\" | \"plain\";\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 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\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 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 <button type=\"button\" class={classes} title={props.title} aria-label={props.title} onClick={props.onClick}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n </button>\n }\n >\n {(href) => (\n <a class={classes} href={href()} download={props.download ?? \"\"} title={props.title} aria-label={props.title}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{props.title}</span>\n </a>\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 <button\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n title={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} />\n </button>\n );\n}\n\n// ── Built-in renderers ──────────────────────────────────────────────────────\n\nfunction MoreLines(props: { count: number; onClick?: () => void }) {\n const messages = useUiMessages();\n return <Show when={props.count > 0}><div class=\"k2b-content-file-view__truncated\">\n <Show when={props.onClick} fallback={<span>{messages().previewMoreLines(props.count)}</span>}>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.onClick}>{messages().previewMoreLines(props.count)}</Button>\n </Show>\n </div></Show>;\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 return <>\n <div classList={{ \"k2b-content-file-view__excerpt\": props.renderer.previewLines !== undefined }}>\n <Show when={props.markdown} fallback={<CodeDisplay code={text()} language={codeLanguage(props.renderer.file.path)} />}>\n <MarkdownView markdown={text()} headingScale={props.renderer.headingScale ?? \"compact\"} />\n </Show>\n </div>\n <MoreLines count={lines().length - limit()} onClick={props.renderer.onExpandPreview} />\n </>;\n}\n\nfunction MarkdownRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const [editing, setEditing] = createSignal(false);\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={stripFrontmatter(props.editor?.draft() ?? props.content.content)} 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 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={messages().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 <a\n class=\"k2b-markdown-editor__tool\"\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n title={messages().download}\n aria-label={messages().download}\n >\n <i class=\"ti ti-download\" />\n </a>\n )}\n </Show>\n <EditorToolButton\n icon={editor().saving() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-device-floppy\"}\n title={messages().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 when={props.previewLines === undefined} fallback={<TextExcerpt renderer={props} text={JSON.stringify(parsedValue(), null, 2)} />}><StructuredDataPreview data={parsedValue()} maxRows={200} /></Show>\n </Show>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction DelimitedTextRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const [preferences, setPreferences] = createSignal<DelimitedPreferences>({ encoding: \"utf-8\", delimiter: \"auto\", view: \"table\" });\n onMount(() => {\n if (!props.previewPreferencesKey) return;\n try { setPreferences(readDelimitedPreferences(localStorage.getItem(props.previewPreferencesKey))); } catch { /* Storage may be disabled. */ }\n });\n const update = (patch: Partial<DelimitedPreferences>) => {\n const next = { ...preferences(), ...patch };\n setPreferences(next);\n if (props.previewPreferencesKey) {\n try { localStorage.setItem(props.previewPreferencesKey, JSON.stringify(next)); } catch { /* Keep the local selection. */ }\n }\n };\n const text = createMemo(() => decodeDelimitedContent(props.content, preferences().encoding));\n const delimiter = () => preferences().delimiter === \"auto\"\n ? (fileViewExtension(props.file.path) === \"tsv\" || props.content.mediaType === \"text/tab-separated-values\" ? \"\\t\" : \",\")\n : preferences().delimiter;\n const [page, setPage] = createSignal(0);\n createEffect(() => { text(); delimiter(); props.previewLines; setPage(0); });\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 = () => prompts.dialog(() => <div class=\"k2b-content-file-view__settings\">\n <Select label={messages().csvEncoding} value={preferences().encoding} disabled={props.content.encoding !== \"base64\"}\n options={[\"utf-8\", \"windows-1252\", \"utf-16le\", \"utf-16be\"]} onValueChange={(value) => { if (value) update({ encoding: value }); }} />\n <Select label={messages().csvSeparator} value={preferences().delimiter} options={[\n { value: \"auto\", label: messages().csvDefaultSeparator }, { value: \",\", label: messages().csvComma },\n { value: \";\", label: messages().csvSemicolon }, { value: \"\\t\", label: messages().csvTab }, { value: \"|\", label: \"|\" },\n ]} onValueChange={(value) => { if (value) update({ delimiter: value }); }} />\n <Select label={messages().csvView} value={preferences().view} options={[\n { value: \"table\", label: messages().dataTable }, { value: \"raw\", label: messages().csvRaw },\n ]} onValueChange={(value) => { if (value === \"table\" || value === \"raw\") update({ view: value }); }} />\n </div>, { title: messages().csvSettings });\n const headers = createMemo(() => preview().rows[0] ?? []);\n const rows = createMemo(() => preview().rows.slice(1));\n\n return (\n <OverlayPanel actions={<><OverlayAction icon=\"ti-adjustments-horizontal\" title={messages().csvSettings} onClick={() => void settings()} /><DownloadAction {...props} /></>}>\n <Show when={preferences().view === \"table\"} fallback={<TextExcerpt renderer={props} text={text()} />}>\n <Show\n when={headers().length > 0}\n fallback={<Placeholder icon=\"ti ti-table\" title={messages().emptyFile} description={messages().delimitedFileEmpty} />}\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 || messages().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}><div class=\"k2b-content-file-view__truncated\">{messages().previewColumnsLimited}</div></Show>\n <Show when={props.previewLines !== undefined} fallback={\n <Show when={preview().totalRows > 201}><div class=\"k2b-content-file-view__pagination\">\n <Button size=\"sm\" variant=\"ghost\" disabled={page() === 0} onClick={() => setPage(page() - 1)}>{messages().previous}</Button>\n <span>{page() * pageSize() + 1}–{Math.min((page() + 1) * pageSize(), preview().totalRows - 1)} / {preview().totalRows - 1}</span>\n <Button size=\"sm\" variant=\"ghost\" disabled={(page() + 1) * pageSize() >= preview().totalRows - 1} onClick={() => setPage(page() + 1)}>{messages().next}</Button>\n </div></Show>\n }><MoreLines count={preview().totalRows - rows().length - 1} onClick={props.onExpandPreview} /></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\nfunction PdfRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const href = () => props.previewHref ?? props.downloadHref;\n return (\n <Show when={href()} fallback={<Placeholder icon=\"ti ti-file-type-pdf\" title=\"PDF\" description={messages().noInlinePreview} />}>\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 messages = useUiMessages();\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 {messages().audioUnsupported}\n </audio>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction VideoRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"video\">\n <video\n crossOrigin={props.crossOrigin}\n onError={props.onPreviewError}\n controls\n preload=\"metadata\"\n playsinline\n src={mediaSource(props)}\n aria-label={props.file.path}\n >\n {messages().videoUnsupported}\n </video>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction BinaryRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <Placeholder\n icon=\"ti ti-file-unknown\"\n title={messages().noPreview}\n description={props.content.mediaType || messages().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 [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(messages().fileSaved);\n },\n onError: (error) => toast.error(error.message),\n });\n const nativePreviewHref = createMemo(() => {\n const kind = getFileViewPreviewKind(props.file);\n const href = props.previewHref ?? (kind === \"pdf\" ? props.downloadHref : null);\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 const resolvedContent = createMemo(() => browserPreviewContent() ?? 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 return (\n <div class={`k2b-content-file-view ${props.class ?? \"\"}`} data-variant={props.variant} data-excerpt={props.previewLines !== undefined ? \"true\" : undefined}>\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 icon=\"ti ti-alert-circle\" title={messages().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 </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["mutation","createEffect","createMemo","createResource","createSignal","For","Match","onCleanup","onMount","Show","Switch","untrack","Button","prompts","toast","MarkdownEditor","Select","useUiMessages","Placeholder","CodeDisplay","decodeDelimitedContent","readDelimitedPreferences","fileViewExtension","getFileViewPreviewKind","parseDelimitedText","MarkdownView","StructuredDataPreview","canPreviewFile","codeLanguage","path","extension","isMarkdown","file","content","encoding","mediaType","stripFrontmatter","text","match","exec","trimStart","slice","length","OverlayAction","props","classes","_$createComponent","when","href","fallback","_$ssr","_tmpl$","_$ssrAttribute","_$escape","title","icon","children","_tmpl$2","download","OverlayPanel","_tmpl$4","actions","_tmpl$3","DownloadAction","messages","downloadHref","lastIndexOf","EditorToolButton","_tmpl$5","disabled","MoreLines","count","_tmpl$6","onClick","_tmpl$7","previewMoreLines","size","variant","TextExcerpt","lines","replace","split","limit","renderer","previewLines","undefined","Math","max","join","_tmpl$8","markdown","code","language","headingScale","onExpandPreview","MarkdownRenderer","editing","setEditing","editor","edit","_tmpl$9","draft","_","_tmpl$0","aria-label","fill","value","onValueChange","setDraft","showStats","onSave","save","saveDisabled","dirty","saving","toolbarTrailing","preview","TextRenderer","_tmpl$1","textEditor","_tmpl$10","saveShortcut","JsonRenderer","parsed","ok","JSON","parse","parsedValue","result","stringify","data","maxRows","DelimitedTextRenderer","preferences","setPreferences","delimiter","view","previewPreferencesKey","localStorage","getItem","update","patch","next","setItem","page","setPage","pageSize","rows","offset","settings","dialog","_tmpl$11","label","csvEncoding","options","csvSeparator","csvDefaultSeparator","csvComma","csvSemicolon","csvTab","csvView","dataTable","csvRaw","csvSettings","headers","emptyFile","description","delimitedFileEmpty","_tmpl$12","each","header","index","_tmpl$13","column","number","row","_tmpl$14","_tmpl$15","columnsTruncated","previewColumnsLimited","totalRows","_tmpl$16","previous","min","mediaSource","previewHref","ImageRenderer","_tmpl$17","crossOrigin","PdfRenderer","noInlinePreview","_tmpl$18","AudioRenderer","_tmpl$19","audioUnsupported","VideoRenderer","_tmpl$20","videoUnsupported","BinaryRenderer","noPreview","binaryFile","action","_tmpl$21","BUILTIN_RENDERERS","id","component","editable","_file","formatFileViewSize","bytes","toFixed","FileView","savedDraft","setSavedDraft","nativeRevision","setNativeRevision","instanceRenderers","renderers","saveMutation","create","input","onSuccess","saved","success","fileSaved","onError","error","message","nativePreviewHref","kind","separator","includes","browserPreviewContent","candidate","some","refetch","revision","abort","loaded","load","loadedDraft","registerRefresh","unregister","resolvedContent","find","onDirtyChange","loading","mutate","_tmpl$22","class","failedLoadFile","String","active","Renderer","onPreviewError"],"sources":["content/FileView.tsx"],"sourcesContent":["/**\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 * 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 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} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { prompts } from \"../feedback/prompts\";\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 StructuredDataPreview, { type StructuredDataValue } from \"./StructuredDataPreview\";\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 /** Plain previews inherit the surrounding surface without a frame or inset padding. */\n variant?: \"default\" | \"plain\";\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 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\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 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 <button type=\"button\" class={classes} title={props.title} aria-label={props.title} onClick={props.onClick}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n </button>\n }\n >\n {(href) => (\n <a class={classes} href={href()} download={props.download ?? \"\"} title={props.title} aria-label={props.title}>\n <i class={`ti ${props.icon}`} aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{props.title}</span>\n </a>\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 <button\n type=\"button\"\n class=\"k2b-markdown-editor__tool\"\n title={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} />\n </button>\n );\n}\n\n// ── Built-in renderers ──────────────────────────────────────────────────────\n\nfunction MoreLines(props: { count: number; onClick?: () => void }) {\n const messages = useUiMessages();\n return (\n <Show when={props.count > 0}>\n <div class=\"k2b-content-file-view__truncated\">\n <Show when={props.onClick} fallback={<span>{messages().previewMoreLines(props.count)}</span>}>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.onClick}>\n {messages().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 return (\n <>\n <div classList={{ \"k2b-content-file-view__excerpt\": props.renderer.previewLines !== undefined }}>\n <Show when={props.markdown} fallback={<CodeDisplay code={text()} language={codeLanguage(props.renderer.file.path)} />}>\n <MarkdownView markdown={text()} headingScale={props.renderer.headingScale ?? \"compact\"} />\n </Show>\n </div>\n <MoreLines count={lines().length - limit()} onClick={props.renderer.onExpandPreview} />\n </>\n );\n}\n\nfunction MarkdownRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const [editing, setEditing] = createSignal(false);\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={stripFrontmatter(props.editor?.draft() ?? props.content.content)} 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 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={messages().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 <a\n class=\"k2b-markdown-editor__tool\"\n href={href()}\n download={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n title={messages().download}\n aria-label={messages().download}\n >\n <i class=\"ti ti-download\" />\n </a>\n )}\n </Show>\n <EditorToolButton\n icon={editor().saving() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-device-floppy\"}\n title={messages().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 [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={messages().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={messages().csvSeparator}\n value={preferences().delimiter}\n options={[\n { value: \"auto\", label: messages().csvDefaultSeparator },\n { value: \",\", label: messages().csvComma },\n { value: \";\", label: messages().csvSemicolon },\n { value: \"\\t\", label: messages().csvTab },\n { value: \"|\", label: \"|\" },\n ]}\n onValueChange={(value) => {\n if (value) update({ delimiter: value });\n }}\n />\n <Select\n label={messages().csvView}\n value={preferences().view}\n options={[\n { value: \"table\", label: messages().dataTable },\n { value: \"raw\", label: messages().csvRaw },\n ]}\n onValueChange={(value) => {\n if (value === \"table\" || value === \"raw\") update({ view: value });\n }}\n />\n </div>\n ),\n { title: messages().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={messages().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={<Placeholder icon=\"ti ti-table\" title={messages().emptyFile} description={messages().delimitedFileEmpty} />}\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 || messages().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\">{messages().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\nfunction PdfRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n const href = () => props.previewHref ?? props.downloadHref;\n return (\n <Show when={href()} fallback={<Placeholder icon=\"ti ti-file-type-pdf\" title=\"PDF\" description={messages().noInlinePreview} />}>\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 messages = useUiMessages();\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 {messages().audioUnsupported}\n </audio>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction VideoRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <OverlayPanel actions={<DownloadAction {...props} />}>\n <div class=\"k2b-content-file-view__media\" data-kind=\"video\">\n <video\n crossOrigin={props.crossOrigin}\n onError={props.onPreviewError}\n controls\n preload=\"metadata\"\n playsinline\n src={mediaSource(props)}\n aria-label={props.file.path}\n >\n {messages().videoUnsupported}\n </video>\n </div>\n </OverlayPanel>\n );\n}\n\nfunction BinaryRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n return (\n <Placeholder\n icon=\"ti ti-file-unknown\"\n title={messages().noPreview}\n description={props.content.mediaType || messages().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 [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(messages().fileSaved);\n },\n onError: (error) => toast.error(error.message),\n });\n const nativePreviewHref = createMemo(() => {\n const kind = getFileViewPreviewKind(props.file);\n const href = props.previewHref ?? (kind === \"pdf\" ? props.downloadHref : null);\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 const resolvedContent = createMemo(() => browserPreviewContent() ?? 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 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 <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 icon=\"ti ti-alert-circle\" title={messages().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 </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["marked","Renderer","escapeHtml","value","replaceAll","safeUrl","normalized","trim","replace","test","normalizeInlineTokens","tokens","Set","filter","Boolean","sort","left","right","length","isStandaloneInlineToken","text","start","before","end","after","createSafeRenderer","options","renderer","inlineTokens","renderText","bind","renderTable","table","token","content","header","every","cell","html","link","href","title","body","parser","parseInline","url","linkProtocols","includes","URL","protocol","titleAttribute","target","linkTarget","image","allowImages","type","parts","plainStart","cursor","inlineToken","find","candidate","startsWith","slice","push","raw","join","renderSafeMarkdown","markdown","parse","async","MarkdownView","props","undefined","trustedHtml","_$ssr","_tmpl$","_$escape","class","_$ssrAttribute","headingScale"],"sources":["content/MarkdownView.tsx"],"sourcesContent":["import { marked, Renderer, type Tokens } from \"marked\";\n\ntype CommonProps = MarkdownRenderOptions & {\n /** Optional additional CSS classes */\n class?: string;\n /**\n * Visual heading scale. Markdown heading levels and document structure stay\n * unchanged.\n */\n headingScale?: \"compact\" | \"normal\" | \"large\";\n};\n\nexport type MarkdownViewProps = CommonProps &\n (\n | {\n /** Untrusted Markdown. Raw HTML and unsafe link protocols are escaped. */\n markdown: string;\n /** Exact standalone text tokens to emphasize without changing Markdown parsing or trusted-HTML boundaries. */\n inlineTokens?: readonly string[];\n trustedHtml?: never;\n }\n | {\n /** Explicitly trusted, already-rendered HTML. The caller owns sanitization. */\n trustedHtml: string;\n markdown?: never;\n inlineTokens?: never;\n }\n );\n\nexport type MarkdownRenderOptions = {\n inlineTokens?: readonly string[];\n /** Whether to render images. False renders alt text without resource requests. Defaults to true. */\n allowImages?: boolean;\n /** Optional protocol allowlist, including trailing colons. Relative URLs resolve as HTTPS. */\n linkProtocols?: readonly string[];\n linkTarget?: \"_blank\";\n};\n\nconst escapeHtml = (value: string): string =>\n value.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\").replaceAll('\"', \""\").replaceAll(\"'\", \"'\");\n\nconst safeUrl = (value: string): string | null => {\n const normalized = value.trim().replace(/[\\u0000-\\u001f\\u007f-\\u009f\\s]+/g, \"\");\n if (/^(?:javascript|vbscript|data):/i.test(normalized)) return null;\n return value;\n};\n\nconst normalizeInlineTokens = (tokens: readonly string[] | undefined): string[] =>\n [...new Set(tokens?.filter(Boolean) ?? [])].sort((left, right) => right.length - left.length);\n\nconst isStandaloneInlineToken = (text: string, start: number, value: string): boolean => {\n const before = text[start - 1];\n if (before && /[a-zA-Z0-9_.%+\\-]/.test(before)) return false;\n const end = start + value.length;\n const after = text[end];\n if (after && /[a-zA-Z0-9_@]/.test(after)) return false;\n return !(after === \".\" && /[a-zA-Z0-9_]/.test(text[end + 1] ?? \"\"));\n};\n\nconst createSafeRenderer = (options: MarkdownRenderOptions = {}): Renderer => {\n const renderer = new Renderer();\n const inlineTokens = normalizeInlineTokens(options.inlineTokens);\n const renderText = renderer.text.bind(renderer);\n const renderTable = renderer.table.bind(renderer);\n renderer.table = (token: Tokens.Table) => {\n const table = renderTable(token);\n const content = token.header.every((cell) => !cell.text.trim())\n ? table.replace(/<thead>[\\s\\S]*?<\\/thead>\\n?/, \"\")\n : table;\n return `<div class=\"k2b-content-markdown__table\" tabindex=\"0\">${content}</div>`;\n };\n renderer.html = ({ text }: Tokens.HTML | Tokens.Tag) => escapeHtml(text);\n renderer.link = function ({ href, title, tokens }: Tokens.Link) {\n const body = this.parser.parseInline(tokens);\n const url = safeUrl(href);\n if (!url) return body;\n if (options.linkProtocols) {\n try {\n if (!options.linkProtocols.includes(new URL(url, \"https://markdown.invalid/\").protocol)) return body;\n } catch {\n return body;\n }\n }\n const titleAttribute = title ? ` title=\"${escapeHtml(title)}\"` : \"\";\n const target = options.linkTarget === \"_blank\" ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : \"\";\n return `<a href=\"${escapeHtml(url)}\"${titleAttribute}${target}>${body}</a>`;\n };\n renderer.image = ({ href, title, text }: Tokens.Image) => {\n const url = safeUrl(href);\n if (!url || options.allowImages === false) return escapeHtml(text);\n const titleAttribute = title ? ` title=\"${escapeHtml(title)}\"` : \"\";\n return `<img src=\"${escapeHtml(url)}\" alt=\"${escapeHtml(text)}\"${titleAttribute}>`;\n };\n renderer.text = (token) => {\n if (inlineTokens.length === 0 || token.type === \"escape\" || (\"tokens\" in token && token.tokens)) return renderText(token);\n const parts: string[] = [];\n let plainStart = 0;\n let cursor = 0;\n while (cursor < token.text.length) {\n const inlineToken = inlineTokens.find(\n (candidate) => token.text.startsWith(candidate, cursor) && isStandaloneInlineToken(token.text, cursor, candidate),\n );\n if (!inlineToken) {\n cursor += 1;\n continue;\n }\n if (plainStart < cursor) {\n const text = token.text.slice(plainStart, cursor);\n parts.push(renderText({ ...token, raw: text, text }));\n }\n parts.push(\n `<span class=\"k2b-content-markdown__inline-token\">${renderText({ ...token, raw: inlineToken, text: inlineToken })}</span>`,\n );\n cursor += inlineToken.length;\n plainStart = cursor;\n }\n if (plainStart === 0) return renderText(token);\n if (plainStart < token.text.length) {\n const text = token.text.slice(plainStart);\n parts.push(renderText({ ...token, raw: text, text }));\n }\n return parts.join(\"\");\n };\n return renderer;\n};\n\nexport const renderSafeMarkdown = (markdown: string, options: MarkdownRenderOptions = {}): string =>\n marked.parse(markdown, {\n async: false,\n renderer: createSafeRenderer(options),\n }) as string;\n\n/**\n * Markdown View Component (SSR)\n *\n * Renders untrusted Markdown safely by default. Raw HTML and unsafe link\n * protocols are escaped. Already-rendered HTML requires the deliberately named\n * `trustedHtml` boundary; the caller owns sanitization in that mode.\n *\n * @example\n * ```tsx\n * import { MarkdownView } from \"@k2b/ui\";\n *\n * <MarkdownView markdown={source} />;\n * ```\n *\n * @example Compact headings, e.g. inside comments or file previews:\n * ```tsx\n * <MarkdownView markdown={source} headingScale=\"compact\" />;\n * ```\n */\nexport default function MarkdownView(props: MarkdownViewProps) {\n const html = () =>\n props.markdown !== undefined\n ? renderSafeMarkdown(props.markdown, {\n inlineTokens: props.inlineTokens,\n allowImages: props.allowImages,\n linkProtocols: props.linkProtocols,\n linkTarget: props.linkTarget,\n })\n : props.trustedHtml;\n return (\n <div\n class={`k2b-content-markdown ${props.class ?? \"\"}`}\n data-heading-scale={props.headingScale && props.headingScale !== \"normal\" ? props.headingScale : undefined}\n innerHTML={html()}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["marked","Renderer","escapeHtml","value","replaceAll","safeUrl","normalized","trim","replace","test","normalizeInlineTokens","tokens","Set","filter","Boolean","sort","left","right","length","isStandaloneInlineToken","text","start","before","end","after","createSafeRenderer","options","renderer","inlineTokens","renderText","bind","renderTable","table","token","content","header","every","cell","html","link","href","title","body","parser","parseInline","url","linkProtocols","includes","URL","protocol","titleAttribute","target","linkTarget","image","allowImages","type","parts","plainStart","cursor","inlineToken","find","candidate","startsWith","slice","push","raw","join","renderSafeMarkdown","markdown","parse","async","MarkdownView","props","undefined","trustedHtml","_$ssr","_tmpl$","_$escape","class","_$ssrAttribute","headingScale"],"sources":["content/MarkdownView.tsx"],"sourcesContent":["import { marked, Renderer, type Tokens } from \"marked\";\n\ntype CommonProps = MarkdownRenderOptions & {\n /** Optional additional CSS classes */\n class?: string;\n /**\n * Visual heading scale. Markdown heading levels and document structure stay\n * unchanged.\n */\n headingScale?: \"compact\" | \"normal\" | \"large\";\n};\n\nexport type MarkdownViewProps = CommonProps &\n (\n | {\n /** Untrusted Markdown. Raw HTML and unsafe link protocols are escaped. */\n markdown: string;\n /** Exact standalone text tokens to emphasize without changing Markdown parsing or trusted-HTML boundaries. */\n inlineTokens?: readonly string[];\n trustedHtml?: never;\n }\n | {\n /** Explicitly trusted, already-rendered HTML. The caller owns sanitization. */\n trustedHtml: string;\n markdown?: never;\n inlineTokens?: never;\n }\n );\n\nexport type MarkdownRenderOptions = {\n inlineTokens?: readonly string[];\n /** Whether to render images. False renders alt text without resource requests. Defaults to true. */\n allowImages?: boolean;\n /** Optional protocol allowlist, including trailing colons. Relative URLs resolve as HTTPS. */\n linkProtocols?: readonly string[];\n linkTarget?: \"_blank\";\n};\n\nconst escapeHtml = (value: string): string =>\n value.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\").replaceAll('\"', \""\").replaceAll(\"'\", \"'\");\n\nconst safeUrl = (value: string): string | null => {\n const normalized = value.trim().replace(/[\\u0000-\\u001f\\u007f-\\u009f\\s]+/g, \"\");\n if (/^(?:javascript|vbscript|data):/i.test(normalized)) return null;\n return value;\n};\n\nconst normalizeInlineTokens = (tokens: readonly string[] | undefined): string[] =>\n [...new Set(tokens?.filter(Boolean) ?? [])].sort((left, right) => right.length - left.length);\n\nconst isStandaloneInlineToken = (text: string, start: number, value: string): boolean => {\n const before = text[start - 1];\n if (before && /[a-zA-Z0-9_.%+\\-]/.test(before)) return false;\n const end = start + value.length;\n const after = text[end];\n if (after && /[a-zA-Z0-9_@]/.test(after)) return false;\n return !(after === \".\" && /[a-zA-Z0-9_]/.test(text[end + 1] ?? \"\"));\n};\n\nconst createSafeRenderer = (options: MarkdownRenderOptions = {}): Renderer => {\n const renderer = new Renderer();\n const inlineTokens = normalizeInlineTokens(options.inlineTokens);\n const renderText = renderer.text.bind(renderer);\n const renderTable = renderer.table.bind(renderer);\n renderer.table = (token: Tokens.Table) => {\n const table = renderTable(token);\n const content = token.header.every((cell) => !cell.text.trim()) ? table.replace(/<thead>[\\s\\S]*?<\\/thead>\\n?/, \"\") : table;\n return `<div class=\"k2b-content-markdown__table\" tabindex=\"0\">${content}</div>`;\n };\n renderer.html = ({ text }: Tokens.HTML | Tokens.Tag) => escapeHtml(text);\n renderer.link = function ({ href, title, tokens }: Tokens.Link) {\n const body = this.parser.parseInline(tokens);\n const url = safeUrl(href);\n if (!url) return body;\n if (options.linkProtocols) {\n try {\n if (!options.linkProtocols.includes(new URL(url, \"https://markdown.invalid/\").protocol)) return body;\n } catch {\n return body;\n }\n }\n const titleAttribute = title ? ` title=\"${escapeHtml(title)}\"` : \"\";\n const target = options.linkTarget === \"_blank\" ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : \"\";\n return `<a href=\"${escapeHtml(url)}\"${titleAttribute}${target}>${body}</a>`;\n };\n renderer.image = ({ href, title, text }: Tokens.Image) => {\n const url = safeUrl(href);\n if (!url || options.allowImages === false) return escapeHtml(text);\n const titleAttribute = title ? ` title=\"${escapeHtml(title)}\"` : \"\";\n return `<img src=\"${escapeHtml(url)}\" alt=\"${escapeHtml(text)}\"${titleAttribute}>`;\n };\n renderer.text = (token) => {\n if (inlineTokens.length === 0 || token.type === \"escape\" || (\"tokens\" in token && token.tokens)) return renderText(token);\n const parts: string[] = [];\n let plainStart = 0;\n let cursor = 0;\n while (cursor < token.text.length) {\n const inlineToken = inlineTokens.find(\n (candidate) => token.text.startsWith(candidate, cursor) && isStandaloneInlineToken(token.text, cursor, candidate),\n );\n if (!inlineToken) {\n cursor += 1;\n continue;\n }\n if (plainStart < cursor) {\n const text = token.text.slice(plainStart, cursor);\n parts.push(renderText({ ...token, raw: text, text }));\n }\n parts.push(\n `<span class=\"k2b-content-markdown__inline-token\">${renderText({ ...token, raw: inlineToken, text: inlineToken })}</span>`,\n );\n cursor += inlineToken.length;\n plainStart = cursor;\n }\n if (plainStart === 0) return renderText(token);\n if (plainStart < token.text.length) {\n const text = token.text.slice(plainStart);\n parts.push(renderText({ ...token, raw: text, text }));\n }\n return parts.join(\"\");\n };\n return renderer;\n};\n\nexport const renderSafeMarkdown = (markdown: string, options: MarkdownRenderOptions = {}): string =>\n marked.parse(markdown, {\n async: false,\n renderer: createSafeRenderer(options),\n }) as string;\n\n/**\n * Markdown View Component (SSR)\n *\n * Renders untrusted Markdown safely by default. Raw HTML and unsafe link\n * protocols are escaped. Already-rendered HTML requires the deliberately named\n * `trustedHtml` boundary; the caller owns sanitization in that mode.\n *\n * @example\n * ```tsx\n * import { MarkdownView } from \"@k2b/ui\";\n *\n * <MarkdownView markdown={source} />;\n * ```\n *\n * @example Compact headings, e.g. inside comments or file previews:\n * ```tsx\n * <MarkdownView markdown={source} headingScale=\"compact\" />;\n * ```\n */\nexport default function MarkdownView(props: MarkdownViewProps) {\n const html = () =>\n props.markdown !== undefined\n ? renderSafeMarkdown(props.markdown, {\n inlineTokens: props.inlineTokens,\n allowImages: props.allowImages,\n linkProtocols: props.linkProtocols,\n linkTarget: props.linkTarget,\n })\n : props.trustedHtml;\n return (\n <div\n class={`k2b-content-markdown ${props.class ?? \"\"}`}\n data-heading-scale={props.headingScale && props.headingScale !== \"normal\" ? props.headingScale : undefined}\n innerHTML={html()}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Link","createMemo","For","Show","useUiMessages","PaginationLink","props","onNavigate","_$createComponent","href","rel","scroll","class","aria-label","label","children","_$ssr","_tmpl$","_$ssrAttribute","_$escape","Pagination","messages","totalPages","Math","max","floor","Number","isFinite","currentPage","min","page","baseUrl","visiblePages","Set","filter","sort","left","right","when","_tmpl$4","pagination","pageOf","total","previousPage","_tmpl$2","each","index","hasGap","undefined","isCurrent","mobileVisible","_tmpl$5","fallback","goToPage","_tmpl$6","nextPage","_tmpl$3"],"sources":["content/Pagination.tsx"],"sourcesContent":["import { Link, type LinkNavigateEvent } from \"@k2b/ssr/nav\";\nimport { createMemo, For, type JSX, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\nexport type PaginationProps = {\n currentPage: number;\n totalPages: number;\n baseUrl: string;\n onNavigate?: (event: LinkNavigateEvent) => void | Promise<void>;\n};\n\ntype PaginationLinkProps = {\n href: string;\n label: string;\n rel?: \"prev\" | \"next\";\n class?: string;\n onNavigate?: PaginationProps[\"onNavigate\"];\n children: JSX.Element;\n};\n\nconst PaginationLink = (props: PaginationLinkProps) =>\n props.onNavigate ? (\n <Link\n href={props.href}\n rel={props.rel}\n scroll=\"top\"\n onNavigate={props.onNavigate}\n class={`k2b-pagination__page ${props.class ?? \"\"}`}\n aria-label={props.label}\n >\n {props.children}\n </Link>\n ) : (\n <a href={props.href} rel={props.rel} class={`k2b-pagination__page ${props.class ?? \"\"}`} aria-label={props.label}>\n {props.children}\n </a>\n );\n\n/** Link-based pagination with directional navigation and compact mobile disclosure. */\nexport const Pagination = (props: PaginationProps): JSX.Element => {\n const messages = useUiMessages();\n const totalPages = createMemo(() => Math.max(1, Math.floor(Number.isFinite(props.totalPages) ? props.totalPages : 1)));\n const currentPage = createMemo(() =>\n Math.min(totalPages(), Math.max(1, Math.floor(Number.isFinite(props.currentPage) ? props.currentPage : 1))),\n );\n const href = (page: number) => `${props.baseUrl}${page}`;\n const visiblePages = createMemo(() =>\n [...new Set([1, currentPage() - 1, currentPage(), currentPage() + 1, totalPages()])]\n .filter((page) => page >= 1 && page <= totalPages())\n .sort((left, right) => left - right),\n );\n\n return (\n <Show when={totalPages() > 1}>\n <nav class=\"k2b-pagination\" aria-label={messages().pagination}>\n <span class=\"k2b-sr-only\"
|
|
1
|
+
{"version":3,"names":["Link","createMemo","For","Show","useUiMessages","PaginationLink","props","onNavigate","_$createComponent","href","rel","scroll","class","aria-label","label","children","_$ssr","_tmpl$","_$ssrAttribute","_$escape","Pagination","messages","totalPages","Math","max","floor","Number","isFinite","currentPage","min","page","baseUrl","visiblePages","Set","filter","sort","left","right","when","_tmpl$4","pagination","pageOf","total","previousPage","_tmpl$2","each","index","hasGap","undefined","isCurrent","mobileVisible","_tmpl$5","fallback","goToPage","_tmpl$6","nextPage","_tmpl$3"],"sources":["content/Pagination.tsx"],"sourcesContent":["import { Link, type LinkNavigateEvent } from \"@k2b/ssr/nav\";\nimport { createMemo, For, type JSX, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\nexport type PaginationProps = {\n currentPage: number;\n totalPages: number;\n baseUrl: string;\n onNavigate?: (event: LinkNavigateEvent) => void | Promise<void>;\n};\n\ntype PaginationLinkProps = {\n href: string;\n label: string;\n rel?: \"prev\" | \"next\";\n class?: string;\n onNavigate?: PaginationProps[\"onNavigate\"];\n children: JSX.Element;\n};\n\nconst PaginationLink = (props: PaginationLinkProps) =>\n props.onNavigate ? (\n <Link\n href={props.href}\n rel={props.rel}\n scroll=\"top\"\n onNavigate={props.onNavigate}\n class={`k2b-pagination__page ${props.class ?? \"\"}`}\n aria-label={props.label}\n >\n {props.children}\n </Link>\n ) : (\n <a href={props.href} rel={props.rel} class={`k2b-pagination__page ${props.class ?? \"\"}`} aria-label={props.label}>\n {props.children}\n </a>\n );\n\n/** Link-based pagination with directional navigation and compact mobile disclosure. */\nexport const Pagination = (props: PaginationProps): JSX.Element => {\n const messages = useUiMessages();\n const totalPages = createMemo(() => Math.max(1, Math.floor(Number.isFinite(props.totalPages) ? props.totalPages : 1)));\n const currentPage = createMemo(() =>\n Math.min(totalPages(), Math.max(1, Math.floor(Number.isFinite(props.currentPage) ? props.currentPage : 1))),\n );\n const href = (page: number) => `${props.baseUrl}${page}`;\n const visiblePages = createMemo(() =>\n [...new Set([1, currentPage() - 1, currentPage(), currentPage() + 1, totalPages()])]\n .filter((page) => page >= 1 && page <= totalPages())\n .sort((left, right) => left - right),\n );\n\n return (\n <Show when={totalPages() > 1}>\n <nav class=\"k2b-pagination\" aria-label={messages().pagination}>\n <span class=\"k2b-sr-only\">{messages().pageOf({ page: currentPage(), total: totalPages() })}</span>\n <div class=\"k2b-pagination__pages\">\n <Show when={currentPage() > 1}>\n <PaginationLink href={href(currentPage() - 1)} rel=\"prev\" label={messages().previousPage} onNavigate={props.onNavigate}>\n <i class=\"ti ti-chevron-left\" aria-hidden=\"true\" />\n </PaginationLink>\n </Show>\n\n <For each={visiblePages()}>\n {(page, index) => {\n const previousPage = () => visiblePages()[index() - 1];\n const hasGap = () => previousPage() !== undefined && page - previousPage()! > 1;\n const isCurrent = () => page === currentPage();\n const mobileVisible = () => page === 1 || page === totalPages() || isCurrent();\n\n return (\n <>\n <Show when={hasGap()}>\n <span class=\"k2b-pagination__ellipsis\" aria-hidden=\"true\">\n …\n </span>\n </Show>\n <Show\n when={isCurrent()}\n fallback={\n <PaginationLink\n href={href(page)}\n label={messages().goToPage({ page })}\n class={mobileVisible() ? \"\" : \"k2b-pagination__page--wide-only\"}\n onNavigate={props.onNavigate}\n >\n {page}\n </PaginationLink>\n }\n >\n <span class=\"k2b-pagination__page is-current\" aria-current=\"page\">\n {page}\n </span>\n </Show>\n </>\n );\n }}\n </For>\n\n <Show when={currentPage() < totalPages()}>\n <PaginationLink href={href(currentPage() + 1)} rel=\"next\" label={messages().nextPage} onNavigate={props.onNavigate}>\n <i class=\"ti ti-chevron-right\" aria-hidden=\"true\" />\n </PaginationLink>\n </Show>\n </div>\n </nav>\n </Show>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["batch","createEffect","createSignal","onCleanup","untrack","sameExplorerRequest","a","b","step","referenceStep","visibleKeys","undefined","length","every","key","includes","validateRequest","request","some","Set","size","Error","validateChartExplorerData","data","keys","rows","map","row","marks","chart","mark","has","rowKey","createChartExplorer","options","onRequestChange","selectedKey","onSelectedKeyChange","initial","snapshot","ids","Object","charts","sort","id","validate","value","nextIds","i","values","forEach","setSnapshot","desired","setDesired","loading","setLoading","error","setError","localSelection","setLocalSelection","rawSelection","hasRow","select","pending","disposed","adopt","next","execute","force","abort","controller","AbortController","result","load","signal","aborted","cause","setRequest","refresh","retry","pinReference","clearReference"],"sources":["content/chart-explorer.ts"],"sourcesContent":["import { batch, createEffect, createSignal, onCleanup, untrack, type Accessor } from \"solid-js\";\nimport type { ChartSnapshot } from \"./chart-snapshot\";\n\n/** Omitted visibleKeys means no series filter; [] explicitly hides every series. */\nexport type ChartExplorerRequest = { step?: string; visibleKeys?: readonly string[]; referenceStep?: string };\nexport type ChartExplorerRow = { key: string };\nexport type ChartExplorerData<T extends ChartExplorerRow = ChartExplorerRow> = { chart: ChartSnapshot; rows: readonly T[] };\nexport type ChartExplorerCharts = Readonly<Record<string, ChartExplorerData>>;\nexport type ChartExplorerSnapshot<C extends ChartExplorerCharts> = { request: ChartExplorerRequest; charts: C };\nexport type ChartExplorerOptions<C extends ChartExplorerCharts> = {\n /** Authoritative initial/replacement data. Replacements cancel pending work. */\n snapshot: Accessor<ChartExplorerSnapshot<C>>;\n load: (\n request: ChartExplorerRequest,\n signal: AbortSignal,\n ) => ChartExplorerSnapshot<NoInfer<C>> | Promise<ChartExplorerSnapshot<NoInfer<C>>>;\n /** Optional controlled filters. Changes trigger loading; setRequest emits onRequestChange. */\n request?: Accessor<ChartExplorerRequest>;\n onRequestChange?: (request: ChartExplorerRequest) => void;\n selectedKey?: Accessor<string | null>;\n onSelectedKeyChange?: (key: string | null) => void;\n};\nexport type ChartExplorerController<C extends ChartExplorerCharts> = ReturnType<typeof createChartExplorer<C>>;\n\nexport const sameExplorerRequest = (a: ChartExplorerRequest, b: ChartExplorerRequest) =>\n a.step === b.step &&\n a.referenceStep === b.referenceStep &&\n (a.visibleKeys === undefined || b.visibleKeys === undefined\n ? a.visibleKeys === b.visibleKeys\n : a.visibleKeys.length === b.visibleKeys.length && a.visibleKeys.every((key) => b.visibleKeys!.includes(key)));\n\nfunction validateRequest(request: ChartExplorerRequest) {\n if (\n request.step === \"\" ||\n request.referenceStep === \"\" ||\n (request.referenceStep !== undefined && request.step === undefined) ||\n request.visibleKeys?.some((key) => !key) ||\n new Set(request.visibleKeys).size !== (request.visibleKeys?.length ?? 0)\n ) {\n throw new Error(\"Chart filters require nonempty unique keys; a reference requires a current step\");\n }\n}\n\nexport function validateChartExplorerData(data: ChartExplorerData) {\n const keys = data.rows.map((row) => row.key);\n const rows = new Set(keys);\n const marks = data.chart.marks.map((mark) => mark.key);\n if (\n keys.some((key) => !key) ||\n rows.size !== keys.length ||\n marks.some((key) => !key) ||\n new Set(marks).size !== marks.length ||\n data.chart.marks.some((mark) => !rows.has(mark.rowKey))\n ) {\n throw new Error(\"Chart data requires unique row/mark keys and a row for every mark.rowKey\");\n }\n}\n\n/** One owner for one or many charts. Source/HTTP/aggregation remain caller-owned. */\nexport function createChartExplorer<C extends ChartExplorerCharts>(options: ChartExplorerOptions<C>) {\n if (options.request && !options.onRequestChange) throw new Error(\"Controlled chart filters require onRequestChange\");\n if (options.selectedKey && !options.onSelectedKeyChange) throw new Error(\"Controlled chart selection requires onSelectedKeyChange\");\n const initial = options.snapshot();\n const ids = Object.keys(initial.charts).sort();\n if (!ids.length || ids.some((id) => !id)) throw new Error(\"An explorer needs named charts\");\n const validate = (value: ChartExplorerSnapshot<C>) => {\n validateRequest(value.request);\n const nextIds = Object.keys(value.charts).sort();\n if (nextIds.length !== ids.length || nextIds.some((id, i) => id !== ids[i])) throw new Error(\"Return every configured chart\");\n Object.values(value.charts).forEach(validateChartExplorerData);\n };\n validate(initial);\n const [snapshot, setSnapshot] = createSignal(initial);\n const [desired, setDesired] = createSignal(options.request?.() ?? initial.request);\n const [loading, setLoading] = createSignal(false);\n const [error, setError] = createSignal<Error | null>(null);\n const [localSelection, setLocalSelection] = createSignal<string | null>(null);\n const rawSelection = () => (options.selectedKey ? options.selectedKey() : localSelection());\n const hasRow = (value: ChartExplorerSnapshot<C>, key: string) =>\n Object.values(value.charts).some((data) => data.rows.some((row) => row.key === key));\n const selectedKey = () => {\n const key = rawSelection();\n return key !== null && hasRow(snapshot(), key) ? key : null;\n };\n const select = (key: string | null) => {\n if (key !== null && !hasRow(snapshot(), key)) return;\n if (!options.selectedKey) setLocalSelection(key);\n options.onSelectedKeyChange?.(key);\n };\n let pending: AbortController | undefined;\n let disposed = false;\n const adopt = (next: ChartExplorerSnapshot<C>) => {\n setSnapshot(() => next);\n const key = rawSelection();\n if (!options.selectedKey && key !== null && !hasRow(next, key)) select(null);\n };\n const execute = async (next: ChartExplorerRequest, force = false) => {\n if (disposed) return;\n validateRequest(next);\n if (!force && pending && sameExplorerRequest(next, desired())) return;\n pending?.abort();\n const controller = new AbortController();\n pending = controller;\n batch(() => {\n setDesired(next);\n setError(null);\n });\n if (!force && sameExplorerRequest(next, snapshot().request)) {\n pending = undefined;\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const result = await options.load(next, controller.signal);\n if (controller.signal.aborted || pending !== controller) return;\n if (!sameExplorerRequest(result.request, next)) throw new Error(\"Chart response does not match requested filters\");\n validate(result);\n batch(() => adopt(result));\n } catch (cause) {\n if (!controller.signal.aborted && pending === controller)\n setError(() => (cause instanceof Error ? cause : new Error(\"Could not load chart data\", { cause })));\n } finally {\n if (!controller.signal.aborted && pending === controller) {\n setLoading(false);\n pending = undefined;\n }\n }\n };\n createEffect(() => {\n const next = options.snapshot();\n untrack(() => {\n validate(next);\n pending?.abort();\n pending = undefined;\n batch(() => {\n adopt(next);\n setDesired(options.request?.() ?? next.request);\n setLoading(false);\n setError(null);\n });\n });\n });\n createEffect(() => {\n options.snapshot();\n const request = options.request?.();\n if (request)\n untrack(() => {\n void execute(request);\n });\n });\n onCleanup(() => {\n disposed = true;\n pending?.abort();\n });\n const setRequest = (next: ChartExplorerRequest) => {\n validateRequest(next);\n if (!options.request) void execute(next);\n options.onRequestChange?.(next);\n };\n return {\n snapshot,\n desired,\n loading,\n error,\n selectedKey,\n select,\n setRequest,\n /** Force a fresh read of the desired filters, even when nothing changed. */\n refresh: () => execute(options.request?.() ?? desired(), true),\n retry: () => execute(options.request?.() ?? desired(), true),\n pinReference() {\n const step = snapshot().request.step;\n if (step !== undefined) setRequest({ ...desired(), referenceStep: step });\n },\n clearReference() {\n setRequest({ ...desired(), referenceStep: undefined });\n },\n };\n}\n"],"mappings":"AAAA,SAASA,KAAK,EAAEC,YAAY,EAAEC,YAAY,EAAEC,SAAS,EAAEC,OAAO,QAAuB,UAAU;;AAG/F;;AAqBA,OAAO,MAAMC,mBAAmB,GAAGA,CAACC,CAAuB,EAAEC,CAAuB,KAClFD,CAAC,CAACE,IAAI,KAAKD,CAAC,CAACC,IAAI,IACjBF,CAAC,CAACG,aAAa,KAAKF,CAAC,CAACE,aAAa,KAClCH,CAAC,CAACI,WAAW,KAAKC,SAAS,IAAIJ,CAAC,CAACG,WAAW,KAAKC,SAAS,GACvDL,CAAC,CAACI,WAAW,KAAKH,CAAC,CAACG,WAAW,GAC/BJ,CAAC,CAACI,WAAW,CAACE,MAAM,KAAKL,CAAC,CAACG,WAAW,CAACE,MAAM,IAAIN,CAAC,CAACI,WAAW,CAACG,KAAK,CAAEC,GAAG,IAAKP,CAAC,CAACG,WAAW,CAAEK,QAAQ,CAACD,GAAG,CAAC,CAAC,CAAC;AAElH,SAASE,eAAeA,CAACC,OAA6B,EAAE;EACtD,IACEA,OAAO,CAACT,IAAI,KAAK,EAAE,IACnBS,OAAO,CAACR,aAAa,KAAK,EAAE,IAC3BQ,OAAO,CAACR,aAAa,KAAKE,SAAS,IAAIM,OAAO,CAACT,IAAI,KAAKG,SAAU,IACnEM,OAAO,CAACP,WAAW,EAAEQ,IAAI,CAAEJ,GAAG,IAAK,CAACA,GAAG,CAAC,IACxC,IAAIK,GAAG,CAACF,OAAO,CAACP,WAAW,CAAC,CAACU,IAAI,MAAMH,OAAO,CAACP,WAAW,EAAEE,MAAM,IAAI,CAAC,CAAC,EACxE;IACA,MAAM,IAAIS,KAAK,CAAC,iFAAiF,CAAC;EACpG;AACF;AAEA,OAAO,SAASC,yBAAyBA,CAACC,IAAuB,EAAE;EACjE,MAAMC,IAAI,GAAGD,IAAI,CAACE,IAAI,CAACC,GAAG,CAAEC,GAAG,IAAKA,GAAG,CAACb,GAAG,CAAC;EAC5C,MAAMW,IAAI,GAAG,IAAIN,GAAG,CAACK,IAAI,CAAC;EAC1B,MAAMI,KAAK,GAAGL,IAAI,CAACM,KAAK,CAACD,KAAK,CAACF,GAAG,CAAEI,IAAI,IAAKA,IAAI,CAAChB,GAAG,CAAC;EACtD,IACEU,IAAI,CAACN,IAAI,CAAEJ,GAAG,IAAK,CAACA,GAAG,CAAC,IACxBW,IAAI,CAACL,IAAI,KAAKI,IAAI,CAACZ,MAAM,IACzBgB,KAAK,CAACV,IAAI,CAAEJ,GAAG,IAAK,CAACA,GAAG,CAAC,IACzB,IAAIK,GAAG,CAACS,KAAK,CAAC,CAACR,IAAI,KAAKQ,KAAK,CAAChB,MAAM,IACpCW,IAAI,CAACM,KAAK,CAACD,KAAK,CAACV,IAAI,CAAEY,IAAI,IAAK,CAACL,IAAI,CAACM,GAAG,CAACD,IAAI,CAACE,MAAM,CAAC,CAAC,EACvD;IACA,MAAM,IAAIX,KAAK,CAAC,0EAA0E,CAAC;EAC7F;AACF;;AAEA;AACA,OAAO,SAASY,mBAAmBA,CAAgCC,OAAgC,EAAE;EACnG,IAAIA,OAAO,CAACjB,OAAO,IAAI,CAACiB,OAAO,CAACC,eAAe,EAAE,MAAM,IAAId,KAAK,CAAC,kDAAkD,CAAC;EACpH,IAAIa,OAAO,CAACE,WAAW,IAAI,CAACF,OAAO,CAACG,mBAAmB,EAAE,MAAM,IAAIhB,KAAK,CAAC,yDAAyD,CAAC;EACnI,MAAMiB,OAAO,GAAGJ,OAAO,CAACK,QAAQ,CAAC,CAAC;EAClC,MAAMC,GAAG,GAAGC,MAAM,CAACjB,IAAI,CAACc,OAAO,CAACI,MAAM,CAAC,CAACC,IAAI,CAAC,CAAC;EAC9C,IAAI,CAACH,GAAG,CAAC5B,MAAM,IAAI4B,GAAG,CAACtB,IAAI,CAAE0B,EAAE,IAAK,CAACA,EAAE,CAAC,EAAE,MAAM,IAAIvB,KAAK,CAAC,gCAAgC,CAAC;EAC3F,MAAMwB,QAAQ,GAAIC,KAA+B,IAAK;IACpD9B,eAAe,CAAC8B,KAAK,CAAC7B,OAAO,CAAC;IAC9B,MAAM8B,OAAO,GAAGN,MAAM,CAACjB,IAAI,CAACsB,KAAK,CAACJ,MAAM,CAAC,CAACC,IAAI,CAAC,CAAC;IAChD,IAAII,OAAO,CAACnC,MAAM,KAAK4B,GAAG,CAAC5B,MAAM,IAAImC,OAAO,CAAC7B,IAAI,CAAC,CAAC0B,EAAE,EAAEI,CAAC,KAAKJ,EAAE,KAAKJ,GAAG,CAACQ,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI3B,KAAK,CAAC,+BAA+B,CAAC;IAC7HoB,MAAM,CAACQ,MAAM,CAACH,KAAK,CAACJ,MAAM,CAAC,CAACQ,OAAO,CAAC5B,yBAAyB,CAAC;EAChE,CAAC;EACDuB,QAAQ,CAACP,OAAO,CAAC;EACjB,MAAM,CAACC,QAAQ,EAAEY,WAAW,CAAC,GAAGjD,YAAY,CAACoC,OAAO,CAAC;EACrD,MAAM,CAACc,OAAO,EAAEC,UAAU,CAAC,GAAGnD,YAAY,CAACgC,OAAO,CAACjB,OAAO,GAAG,CAAC,IAAIqB,OAAO,CAACrB,OAAO,CAAC;EAClF,MAAM,CAACqC,OAAO,EAAEC,UAAU,CAAC,GAAGrD,YAAY,CAAC,KAAK,CAAC;EACjD,MAAM,CAACsD,KAAK,EAAEC,QAAQ,CAAC,GAAGvD,YAAY,CAAe,IAAI,CAAC;EAC1D,MAAM,CAACwD,cAAc,EAAEC,iBAAiB,CAAC,GAAGzD,YAAY,CAAgB,IAAI,CAAC;EAC7E,MAAM0D,YAAY,GAAGA,CAAA,KAAO1B,OAAO,CAACE,WAAW,GAAGF,OAAO,CAACE,WAAW,CAAC,CAAC,GAAGsB,cAAc,CAAC,CAAE;EAC3F,MAAMG,MAAM,GAAGA,CAACf,KAA+B,EAAEhC,GAAW,KAC1D2B,MAAM,CAACQ,MAAM,CAACH,KAAK,CAACJ,MAAM,CAAC,CAACxB,IAAI,CAAEK,IAAI,IAAKA,IAAI,CAACE,IAAI,CAACP,IAAI,CAAES,GAAG,IAAKA,GAAG,CAACb,GAAG,KAAKA,GAAG,CAAC,CAAC;EACtF,MAAMsB,WAAW,GAAGA,CAAA,KAAM;IACxB,MAAMtB,GAAG,GAAG8C,YAAY,CAAC,CAAC;IAC1B,OAAO9C,GAAG,KAAK,IAAI,IAAI+C,MAAM,CAACtB,QAAQ,CAAC,CAAC,EAAEzB,GAAG,CAAC,GAAGA,GAAG,GAAG,IAAI;EAC7D,CAAC;EACD,MAAMgD,MAAM,GAAIhD,GAAkB,IAAK;IACrC,IAAIA,GAAG,KAAK,IAAI,IAAI,CAAC+C,MAAM,CAACtB,QAAQ,CAAC,CAAC,EAAEzB,GAAG,CAAC,EAAE;IAC9C,IAAI,CAACoB,OAAO,CAACE,WAAW,EAAEuB,iBAAiB,CAAC7C,GAAG,CAAC;IAChDoB,OAAO,CAACG,mBAAmB,GAAGvB,GAAG,CAAC;EACpC,CAAC;EACD,IAAIiD,OAAoC;EACxC,IAAIC,QAAQ,GAAG,KAAK;EACpB,MAAMC,KAAK,GAAIC,IAA8B,IAAK;IAChDf,WAAW,CAAC,MAAMe,IAAI,CAAC;IACvB,MAAMpD,GAAG,GAAG8C,YAAY,CAAC,CAAC;IAC1B,IAAI,CAAC1B,OAAO,CAACE,WAAW,IAAItB,GAAG,KAAK,IAAI,IAAI,CAAC+C,MAAM,CAACK,IAAI,EAAEpD,GAAG,CAAC,EAAEgD,MAAM,CAAC,IAAI,CAAC;EAC9E,CAAC;EACD,MAAMK,OAAO,GAAG,MAAAA,CAAOD,IAA0B,EAAEE,KAAK,GAAG,KAAK,KAAK;IACnE,IAAIJ,QAAQ,EAAE;IACdhD,eAAe,CAACkD,IAAI,CAAC;IACrB,IAAI,CAACE,KAAK,IAAIL,OAAO,IAAI1D,mBAAmB,CAAC6D,IAAI,EAAEd,OAAO,CAAC,CAAC,CAAC,EAAE;IAC/DW,OAAO,EAAEM,KAAK,CAAC,CAAC;IAChB,MAAMC,UAAU,GAAG,IAAIC,eAAe,CAAC,CAAC;IACxCR,OAAO,GAAGO,UAAU;IACpBtE,KAAK,CAAC,MAAM;MACVqD,UAAU,CAACa,IAAI,CAAC;MAChBT,QAAQ,CAAC,IAAI,CAAC;IAChB,CAAC,CAAC;IACF,IAAI,CAACW,KAAK,IAAI/D,mBAAmB,CAAC6D,IAAI,EAAE3B,QAAQ,CAAC,CAAC,CAACtB,OAAO,CAAC,EAAE;MAC3D8C,OAAO,GAAGpD,SAAS;MACnB4C,UAAU,CAAC,KAAK,CAAC;MACjB;IACF;IACAA,UAAU,CAAC,IAAI,CAAC;IAChB,IAAI;MACF,MAAMiB,MAAM,GAAG,MAAMtC,OAAO,CAACuC,IAAI,CAACP,IAAI,EAAEI,UAAU,CAACI,MAAM,CAAC;MAC1D,IAAIJ,UAAU,CAACI,MAAM,CAACC,OAAO,IAAIZ,OAAO,KAAKO,UAAU,EAAE;MACzD,IAAI,CAACjE,mBAAmB,CAACmE,MAAM,CAACvD,OAAO,EAAEiD,IAAI,CAAC,EAAE,MAAM,IAAI7C,KAAK,CAAC,iDAAiD,CAAC;MAClHwB,QAAQ,CAAC2B,MAAM,CAAC;MAChBxE,KAAK,CAAC,MAAMiE,KAAK,CAACO,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,OAAOI,KAAK,EAAE;MACd,IAAI,CAACN,UAAU,CAACI,MAAM,CAACC,OAAO,IAAIZ,OAAO,KAAKO,UAAU,EACtDb,QAAQ,CAAC,MAAOmB,KAAK,YAAYvD,KAAK,GAAGuD,KAAK,GAAG,IAAIvD,KAAK,CAAC,2BAA2B,EAAE;QAAEuD;MAAM,CAAC,CAAE,CAAC;IACxG,CAAC,SAAS;MACR,IAAI,CAACN,UAAU,CAACI,MAAM,CAACC,OAAO,IAAIZ,OAAO,KAAKO,UAAU,EAAE;QACxDf,UAAU,CAAC,KAAK,CAAC;QACjBQ,OAAO,GAAGpD,SAAS;MACrB;IACF;EACF,CAAC;EACDV,YAAY,CAAC,MAAM;IACjB,MAAMiE,IAAI,GAAGhC,OAAO,CAACK,QAAQ,CAAC,CAAC;IAC/BnC,OAAO,CAAC,MAAM;MACZyC,QAAQ,CAACqB,IAAI,CAAC;MACdH,OAAO,EAAEM,KAAK,CAAC,CAAC;MAChBN,OAAO,GAAGpD,SAAS;MACnBX,KAAK,CAAC,MAAM;QACViE,KAAK,CAACC,IAAI,CAAC;QACXb,UAAU,CAACnB,OAAO,CAACjB,OAAO,GAAG,CAAC,IAAIiD,IAAI,CAACjD,OAAO,CAAC;QAC/CsC,UAAU,CAAC,KAAK,CAAC;QACjBE,QAAQ,CAAC,IAAI,CAAC;MAChB,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ,CAAC,CAAC;EACFxD,YAAY,CAAC,MAAM;IACjBiC,OAAO,CAACK,QAAQ,CAAC,CAAC;IAClB,MAAMtB,OAAO,GAAGiB,OAAO,CAACjB,OAAO,GAAG,CAAC;IACnC,IAAIA,OAAO,EACTb,OAAO,CAAC,MAAM;MACZ,KAAK+D,OAAO,CAAClD,OAAO,CAAC;IACvB,CAAC,CAAC;EACN,CAAC,CAAC;EACFd,SAAS,CAAC,MAAM;IACd6D,QAAQ,GAAG,IAAI;IACfD,OAAO,EAAEM,KAAK,CAAC,CAAC;EAClB,CAAC,CAAC;EACF,MAAMQ,UAAU,GAAIX,IAA0B,IAAK;IACjDlD,eAAe,CAACkD,IAAI,CAAC;IACrB,IAAI,CAAChC,OAAO,CAACjB,OAAO,EAAE,KAAKkD,OAAO,CAACD,IAAI,CAAC;IACxChC,OAAO,CAACC,eAAe,GAAG+B,IAAI,CAAC;EACjC,CAAC;EACD,OAAO;IACL3B,QAAQ;IACRa,OAAO;IACPE,OAAO;IACPE,KAAK;IACLpB,WAAW;IACX0B,MAAM;IACNe,UAAU;IACV;IACAC,OAAO,EAAEA,CAAA,KAAMX,OAAO,CAACjC,OAAO,CAACjB,OAAO,GAAG,CAAC,IAAImC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC;IAC9D2B,KAAK,EAAEA,CAAA,KAAMZ,OAAO,CAACjC,OAAO,CAACjB,OAAO,GAAG,CAAC,IAAImC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC;IAC5D4B,YAAYA,CAAA,EAAG;MACb,MAAMxE,IAAI,GAAG+B,QAAQ,CAAC,CAAC,CAACtB,OAAO,CAACT,IAAI;MACpC,IAAIA,IAAI,KAAKG,SAAS,EAAEkE,UAAU,CAAC;QAAE,GAAGzB,OAAO,CAAC,CAAC;QAAE3C,aAAa,EAAED;MAAK,CAAC,CAAC;IAC3E,CAAC;IACDyE,cAAcA,CAAA,EAAG;MACfJ,UAAU,CAAC;QAAE,GAAGzB,OAAO,CAAC,CAAC;QAAE3C,aAAa,EAAEE;MAAU,CAAC,CAAC;IACxD;EACF,CAAC;AACH","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["batch","createEffect","createSignal","onCleanup","untrack","sameExplorerRequest","a","b","step","referenceStep","visibleKeys","undefined","length","every","key","includes","validateRequest","request","some","Set","size","Error","validateChartExplorerData","data","keys","rows","map","row","marks","chart","mark","has","rowKey","createChartExplorer","options","onRequestChange","selectedKey","onSelectedKeyChange","initial","snapshot","ids","Object","charts","sort","id","validate","value","nextIds","i","values","forEach","setSnapshot","desired","setDesired","loading","setLoading","error","setError","localSelection","setLocalSelection","rawSelection","hasRow","select","pending","disposed","adopt","next","execute","force","abort","controller","AbortController","result","load","signal","aborted","cause","setRequest","refresh","retry","pinReference","clearReference"],"sources":["content/chart-explorer.ts"],"sourcesContent":["import { type Accessor, batch, createEffect, createSignal, onCleanup, untrack } from \"solid-js\";\nimport type { ChartSnapshot } from \"./chart-snapshot\";\n\n/** Omitted visibleKeys means no series filter; [] explicitly hides every series. */\nexport type ChartExplorerRequest = { step?: string; visibleKeys?: readonly string[]; referenceStep?: string };\nexport type ChartExplorerRow = { key: string };\nexport type ChartExplorerData<T extends ChartExplorerRow = ChartExplorerRow> = { chart: ChartSnapshot; rows: readonly T[] };\nexport type ChartExplorerCharts = Readonly<Record<string, ChartExplorerData>>;\nexport type ChartExplorerSnapshot<C extends ChartExplorerCharts> = { request: ChartExplorerRequest; charts: C };\nexport type ChartExplorerOptions<C extends ChartExplorerCharts> = {\n /** Authoritative initial/replacement data. Replacements cancel pending work. */\n snapshot: Accessor<ChartExplorerSnapshot<C>>;\n load: (\n request: ChartExplorerRequest,\n signal: AbortSignal,\n ) => ChartExplorerSnapshot<NoInfer<C>> | Promise<ChartExplorerSnapshot<NoInfer<C>>>;\n /** Optional controlled filters. Changes trigger loading; setRequest emits onRequestChange. */\n request?: Accessor<ChartExplorerRequest>;\n onRequestChange?: (request: ChartExplorerRequest) => void;\n selectedKey?: Accessor<string | null>;\n onSelectedKeyChange?: (key: string | null) => void;\n};\nexport type ChartExplorerController<C extends ChartExplorerCharts> = ReturnType<typeof createChartExplorer<C>>;\n\nexport const sameExplorerRequest = (a: ChartExplorerRequest, b: ChartExplorerRequest) =>\n a.step === b.step &&\n a.referenceStep === b.referenceStep &&\n (a.visibleKeys === undefined || b.visibleKeys === undefined\n ? a.visibleKeys === b.visibleKeys\n : a.visibleKeys.length === b.visibleKeys.length && a.visibleKeys.every((key) => b.visibleKeys!.includes(key)));\n\nfunction validateRequest(request: ChartExplorerRequest) {\n if (\n request.step === \"\" ||\n request.referenceStep === \"\" ||\n (request.referenceStep !== undefined && request.step === undefined) ||\n request.visibleKeys?.some((key) => !key) ||\n new Set(request.visibleKeys).size !== (request.visibleKeys?.length ?? 0)\n ) {\n throw new Error(\"Chart filters require nonempty unique keys; a reference requires a current step\");\n }\n}\n\nexport function validateChartExplorerData(data: ChartExplorerData) {\n const keys = data.rows.map((row) => row.key);\n const rows = new Set(keys);\n const marks = data.chart.marks.map((mark) => mark.key);\n if (\n keys.some((key) => !key) ||\n rows.size !== keys.length ||\n marks.some((key) => !key) ||\n new Set(marks).size !== marks.length ||\n data.chart.marks.some((mark) => !rows.has(mark.rowKey))\n ) {\n throw new Error(\"Chart data requires unique row/mark keys and a row for every mark.rowKey\");\n }\n}\n\n/** One owner for one or many charts. Source/HTTP/aggregation remain caller-owned. */\nexport function createChartExplorer<C extends ChartExplorerCharts>(options: ChartExplorerOptions<C>) {\n if (options.request && !options.onRequestChange) throw new Error(\"Controlled chart filters require onRequestChange\");\n if (options.selectedKey && !options.onSelectedKeyChange) throw new Error(\"Controlled chart selection requires onSelectedKeyChange\");\n const initial = options.snapshot();\n const ids = Object.keys(initial.charts).sort();\n if (!ids.length || ids.some((id) => !id)) throw new Error(\"An explorer needs named charts\");\n const validate = (value: ChartExplorerSnapshot<C>) => {\n validateRequest(value.request);\n const nextIds = Object.keys(value.charts).sort();\n if (nextIds.length !== ids.length || nextIds.some((id, i) => id !== ids[i])) throw new Error(\"Return every configured chart\");\n Object.values(value.charts).forEach(validateChartExplorerData);\n };\n validate(initial);\n const [snapshot, setSnapshot] = createSignal(initial);\n const [desired, setDesired] = createSignal(options.request?.() ?? initial.request);\n const [loading, setLoading] = createSignal(false);\n const [error, setError] = createSignal<Error | null>(null);\n const [localSelection, setLocalSelection] = createSignal<string | null>(null);\n const rawSelection = () => (options.selectedKey ? options.selectedKey() : localSelection());\n const hasRow = (value: ChartExplorerSnapshot<C>, key: string) =>\n Object.values(value.charts).some((data) => data.rows.some((row) => row.key === key));\n const selectedKey = () => {\n const key = rawSelection();\n return key !== null && hasRow(snapshot(), key) ? key : null;\n };\n const select = (key: string | null) => {\n if (key !== null && !hasRow(snapshot(), key)) return;\n if (!options.selectedKey) setLocalSelection(key);\n options.onSelectedKeyChange?.(key);\n };\n let pending: AbortController | undefined;\n let disposed = false;\n const adopt = (next: ChartExplorerSnapshot<C>) => {\n setSnapshot(() => next);\n const key = rawSelection();\n if (!options.selectedKey && key !== null && !hasRow(next, key)) select(null);\n };\n const execute = async (next: ChartExplorerRequest, force = false) => {\n if (disposed) return;\n validateRequest(next);\n if (!force && pending && sameExplorerRequest(next, desired())) return;\n pending?.abort();\n const controller = new AbortController();\n pending = controller;\n batch(() => {\n setDesired(next);\n setError(null);\n });\n if (!force && sameExplorerRequest(next, snapshot().request)) {\n pending = undefined;\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const result = await options.load(next, controller.signal);\n if (controller.signal.aborted || pending !== controller) return;\n if (!sameExplorerRequest(result.request, next)) throw new Error(\"Chart response does not match requested filters\");\n validate(result);\n batch(() => adopt(result));\n } catch (cause) {\n if (!controller.signal.aborted && pending === controller)\n setError(() => (cause instanceof Error ? cause : new Error(\"Could not load chart data\", { cause })));\n } finally {\n if (!controller.signal.aborted && pending === controller) {\n setLoading(false);\n pending = undefined;\n }\n }\n };\n createEffect(() => {\n const next = options.snapshot();\n untrack(() => {\n validate(next);\n pending?.abort();\n pending = undefined;\n batch(() => {\n adopt(next);\n setDesired(options.request?.() ?? next.request);\n setLoading(false);\n setError(null);\n });\n });\n });\n createEffect(() => {\n options.snapshot();\n const request = options.request?.();\n if (request)\n untrack(() => {\n void execute(request);\n });\n });\n onCleanup(() => {\n disposed = true;\n pending?.abort();\n });\n const setRequest = (next: ChartExplorerRequest) => {\n validateRequest(next);\n if (!options.request) void execute(next);\n options.onRequestChange?.(next);\n };\n return {\n snapshot,\n desired,\n loading,\n error,\n selectedKey,\n select,\n setRequest,\n /** Force a fresh read of the desired filters, even when nothing changed. */\n refresh: () => execute(options.request?.() ?? desired(), true),\n retry: () => execute(options.request?.() ?? desired(), true),\n pinReference() {\n const step = snapshot().request.step;\n if (step !== undefined) setRequest({ ...desired(), referenceStep: step });\n },\n clearReference() {\n setRequest({ ...desired(), referenceStep: undefined });\n },\n };\n}\n"],"mappings":"AAAA,SAAwBA,KAAK,EAAEC,YAAY,EAAEC,YAAY,EAAEC,SAAS,EAAEC,OAAO,QAAQ,UAAU;;AAG/F;;AAqBA,OAAO,MAAMC,mBAAmB,GAAGA,CAACC,CAAuB,EAAEC,CAAuB,KAClFD,CAAC,CAACE,IAAI,KAAKD,CAAC,CAACC,IAAI,IACjBF,CAAC,CAACG,aAAa,KAAKF,CAAC,CAACE,aAAa,KAClCH,CAAC,CAACI,WAAW,KAAKC,SAAS,IAAIJ,CAAC,CAACG,WAAW,KAAKC,SAAS,GACvDL,CAAC,CAACI,WAAW,KAAKH,CAAC,CAACG,WAAW,GAC/BJ,CAAC,CAACI,WAAW,CAACE,MAAM,KAAKL,CAAC,CAACG,WAAW,CAACE,MAAM,IAAIN,CAAC,CAACI,WAAW,CAACG,KAAK,CAAEC,GAAG,IAAKP,CAAC,CAACG,WAAW,CAAEK,QAAQ,CAACD,GAAG,CAAC,CAAC,CAAC;AAElH,SAASE,eAAeA,CAACC,OAA6B,EAAE;EACtD,IACEA,OAAO,CAACT,IAAI,KAAK,EAAE,IACnBS,OAAO,CAACR,aAAa,KAAK,EAAE,IAC3BQ,OAAO,CAACR,aAAa,KAAKE,SAAS,IAAIM,OAAO,CAACT,IAAI,KAAKG,SAAU,IACnEM,OAAO,CAACP,WAAW,EAAEQ,IAAI,CAAEJ,GAAG,IAAK,CAACA,GAAG,CAAC,IACxC,IAAIK,GAAG,CAACF,OAAO,CAACP,WAAW,CAAC,CAACU,IAAI,MAAMH,OAAO,CAACP,WAAW,EAAEE,MAAM,IAAI,CAAC,CAAC,EACxE;IACA,MAAM,IAAIS,KAAK,CAAC,iFAAiF,CAAC;EACpG;AACF;AAEA,OAAO,SAASC,yBAAyBA,CAACC,IAAuB,EAAE;EACjE,MAAMC,IAAI,GAAGD,IAAI,CAACE,IAAI,CAACC,GAAG,CAAEC,GAAG,IAAKA,GAAG,CAACb,GAAG,CAAC;EAC5C,MAAMW,IAAI,GAAG,IAAIN,GAAG,CAACK,IAAI,CAAC;EAC1B,MAAMI,KAAK,GAAGL,IAAI,CAACM,KAAK,CAACD,KAAK,CAACF,GAAG,CAAEI,IAAI,IAAKA,IAAI,CAAChB,GAAG,CAAC;EACtD,IACEU,IAAI,CAACN,IAAI,CAAEJ,GAAG,IAAK,CAACA,GAAG,CAAC,IACxBW,IAAI,CAACL,IAAI,KAAKI,IAAI,CAACZ,MAAM,IACzBgB,KAAK,CAACV,IAAI,CAAEJ,GAAG,IAAK,CAACA,GAAG,CAAC,IACzB,IAAIK,GAAG,CAACS,KAAK,CAAC,CAACR,IAAI,KAAKQ,KAAK,CAAChB,MAAM,IACpCW,IAAI,CAACM,KAAK,CAACD,KAAK,CAACV,IAAI,CAAEY,IAAI,IAAK,CAACL,IAAI,CAACM,GAAG,CAACD,IAAI,CAACE,MAAM,CAAC,CAAC,EACvD;IACA,MAAM,IAAIX,KAAK,CAAC,0EAA0E,CAAC;EAC7F;AACF;;AAEA;AACA,OAAO,SAASY,mBAAmBA,CAAgCC,OAAgC,EAAE;EACnG,IAAIA,OAAO,CAACjB,OAAO,IAAI,CAACiB,OAAO,CAACC,eAAe,EAAE,MAAM,IAAId,KAAK,CAAC,kDAAkD,CAAC;EACpH,IAAIa,OAAO,CAACE,WAAW,IAAI,CAACF,OAAO,CAACG,mBAAmB,EAAE,MAAM,IAAIhB,KAAK,CAAC,yDAAyD,CAAC;EACnI,MAAMiB,OAAO,GAAGJ,OAAO,CAACK,QAAQ,CAAC,CAAC;EAClC,MAAMC,GAAG,GAAGC,MAAM,CAACjB,IAAI,CAACc,OAAO,CAACI,MAAM,CAAC,CAACC,IAAI,CAAC,CAAC;EAC9C,IAAI,CAACH,GAAG,CAAC5B,MAAM,IAAI4B,GAAG,CAACtB,IAAI,CAAE0B,EAAE,IAAK,CAACA,EAAE,CAAC,EAAE,MAAM,IAAIvB,KAAK,CAAC,gCAAgC,CAAC;EAC3F,MAAMwB,QAAQ,GAAIC,KAA+B,IAAK;IACpD9B,eAAe,CAAC8B,KAAK,CAAC7B,OAAO,CAAC;IAC9B,MAAM8B,OAAO,GAAGN,MAAM,CAACjB,IAAI,CAACsB,KAAK,CAACJ,MAAM,CAAC,CAACC,IAAI,CAAC,CAAC;IAChD,IAAII,OAAO,CAACnC,MAAM,KAAK4B,GAAG,CAAC5B,MAAM,IAAImC,OAAO,CAAC7B,IAAI,CAAC,CAAC0B,EAAE,EAAEI,CAAC,KAAKJ,EAAE,KAAKJ,GAAG,CAACQ,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI3B,KAAK,CAAC,+BAA+B,CAAC;IAC7HoB,MAAM,CAACQ,MAAM,CAACH,KAAK,CAACJ,MAAM,CAAC,CAACQ,OAAO,CAAC5B,yBAAyB,CAAC;EAChE,CAAC;EACDuB,QAAQ,CAACP,OAAO,CAAC;EACjB,MAAM,CAACC,QAAQ,EAAEY,WAAW,CAAC,GAAGjD,YAAY,CAACoC,OAAO,CAAC;EACrD,MAAM,CAACc,OAAO,EAAEC,UAAU,CAAC,GAAGnD,YAAY,CAACgC,OAAO,CAACjB,OAAO,GAAG,CAAC,IAAIqB,OAAO,CAACrB,OAAO,CAAC;EAClF,MAAM,CAACqC,OAAO,EAAEC,UAAU,CAAC,GAAGrD,YAAY,CAAC,KAAK,CAAC;EACjD,MAAM,CAACsD,KAAK,EAAEC,QAAQ,CAAC,GAAGvD,YAAY,CAAe,IAAI,CAAC;EAC1D,MAAM,CAACwD,cAAc,EAAEC,iBAAiB,CAAC,GAAGzD,YAAY,CAAgB,IAAI,CAAC;EAC7E,MAAM0D,YAAY,GAAGA,CAAA,KAAO1B,OAAO,CAACE,WAAW,GAAGF,OAAO,CAACE,WAAW,CAAC,CAAC,GAAGsB,cAAc,CAAC,CAAE;EAC3F,MAAMG,MAAM,GAAGA,CAACf,KAA+B,EAAEhC,GAAW,KAC1D2B,MAAM,CAACQ,MAAM,CAACH,KAAK,CAACJ,MAAM,CAAC,CAACxB,IAAI,CAAEK,IAAI,IAAKA,IAAI,CAACE,IAAI,CAACP,IAAI,CAAES,GAAG,IAAKA,GAAG,CAACb,GAAG,KAAKA,GAAG,CAAC,CAAC;EACtF,MAAMsB,WAAW,GAAGA,CAAA,KAAM;IACxB,MAAMtB,GAAG,GAAG8C,YAAY,CAAC,CAAC;IAC1B,OAAO9C,GAAG,KAAK,IAAI,IAAI+C,MAAM,CAACtB,QAAQ,CAAC,CAAC,EAAEzB,GAAG,CAAC,GAAGA,GAAG,GAAG,IAAI;EAC7D,CAAC;EACD,MAAMgD,MAAM,GAAIhD,GAAkB,IAAK;IACrC,IAAIA,GAAG,KAAK,IAAI,IAAI,CAAC+C,MAAM,CAACtB,QAAQ,CAAC,CAAC,EAAEzB,GAAG,CAAC,EAAE;IAC9C,IAAI,CAACoB,OAAO,CAACE,WAAW,EAAEuB,iBAAiB,CAAC7C,GAAG,CAAC;IAChDoB,OAAO,CAACG,mBAAmB,GAAGvB,GAAG,CAAC;EACpC,CAAC;EACD,IAAIiD,OAAoC;EACxC,IAAIC,QAAQ,GAAG,KAAK;EACpB,MAAMC,KAAK,GAAIC,IAA8B,IAAK;IAChDf,WAAW,CAAC,MAAMe,IAAI,CAAC;IACvB,MAAMpD,GAAG,GAAG8C,YAAY,CAAC,CAAC;IAC1B,IAAI,CAAC1B,OAAO,CAACE,WAAW,IAAItB,GAAG,KAAK,IAAI,IAAI,CAAC+C,MAAM,CAACK,IAAI,EAAEpD,GAAG,CAAC,EAAEgD,MAAM,CAAC,IAAI,CAAC;EAC9E,CAAC;EACD,MAAMK,OAAO,GAAG,MAAAA,CAAOD,IAA0B,EAAEE,KAAK,GAAG,KAAK,KAAK;IACnE,IAAIJ,QAAQ,EAAE;IACdhD,eAAe,CAACkD,IAAI,CAAC;IACrB,IAAI,CAACE,KAAK,IAAIL,OAAO,IAAI1D,mBAAmB,CAAC6D,IAAI,EAAEd,OAAO,CAAC,CAAC,CAAC,EAAE;IAC/DW,OAAO,EAAEM,KAAK,CAAC,CAAC;IAChB,MAAMC,UAAU,GAAG,IAAIC,eAAe,CAAC,CAAC;IACxCR,OAAO,GAAGO,UAAU;IACpBtE,KAAK,CAAC,MAAM;MACVqD,UAAU,CAACa,IAAI,CAAC;MAChBT,QAAQ,CAAC,IAAI,CAAC;IAChB,CAAC,CAAC;IACF,IAAI,CAACW,KAAK,IAAI/D,mBAAmB,CAAC6D,IAAI,EAAE3B,QAAQ,CAAC,CAAC,CAACtB,OAAO,CAAC,EAAE;MAC3D8C,OAAO,GAAGpD,SAAS;MACnB4C,UAAU,CAAC,KAAK,CAAC;MACjB;IACF;IACAA,UAAU,CAAC,IAAI,CAAC;IAChB,IAAI;MACF,MAAMiB,MAAM,GAAG,MAAMtC,OAAO,CAACuC,IAAI,CAACP,IAAI,EAAEI,UAAU,CAACI,MAAM,CAAC;MAC1D,IAAIJ,UAAU,CAACI,MAAM,CAACC,OAAO,IAAIZ,OAAO,KAAKO,UAAU,EAAE;MACzD,IAAI,CAACjE,mBAAmB,CAACmE,MAAM,CAACvD,OAAO,EAAEiD,IAAI,CAAC,EAAE,MAAM,IAAI7C,KAAK,CAAC,iDAAiD,CAAC;MAClHwB,QAAQ,CAAC2B,MAAM,CAAC;MAChBxE,KAAK,CAAC,MAAMiE,KAAK,CAACO,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,OAAOI,KAAK,EAAE;MACd,IAAI,CAACN,UAAU,CAACI,MAAM,CAACC,OAAO,IAAIZ,OAAO,KAAKO,UAAU,EACtDb,QAAQ,CAAC,MAAOmB,KAAK,YAAYvD,KAAK,GAAGuD,KAAK,GAAG,IAAIvD,KAAK,CAAC,2BAA2B,EAAE;QAAEuD;MAAM,CAAC,CAAE,CAAC;IACxG,CAAC,SAAS;MACR,IAAI,CAACN,UAAU,CAACI,MAAM,CAACC,OAAO,IAAIZ,OAAO,KAAKO,UAAU,EAAE;QACxDf,UAAU,CAAC,KAAK,CAAC;QACjBQ,OAAO,GAAGpD,SAAS;MACrB;IACF;EACF,CAAC;EACDV,YAAY,CAAC,MAAM;IACjB,MAAMiE,IAAI,GAAGhC,OAAO,CAACK,QAAQ,CAAC,CAAC;IAC/BnC,OAAO,CAAC,MAAM;MACZyC,QAAQ,CAACqB,IAAI,CAAC;MACdH,OAAO,EAAEM,KAAK,CAAC,CAAC;MAChBN,OAAO,GAAGpD,SAAS;MACnBX,KAAK,CAAC,MAAM;QACViE,KAAK,CAACC,IAAI,CAAC;QACXb,UAAU,CAACnB,OAAO,CAACjB,OAAO,GAAG,CAAC,IAAIiD,IAAI,CAACjD,OAAO,CAAC;QAC/CsC,UAAU,CAAC,KAAK,CAAC;QACjBE,QAAQ,CAAC,IAAI,CAAC;MAChB,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ,CAAC,CAAC;EACFxD,YAAY,CAAC,MAAM;IACjBiC,OAAO,CAACK,QAAQ,CAAC,CAAC;IAClB,MAAMtB,OAAO,GAAGiB,OAAO,CAACjB,OAAO,GAAG,CAAC;IACnC,IAAIA,OAAO,EACTb,OAAO,CAAC,MAAM;MACZ,KAAK+D,OAAO,CAAClD,OAAO,CAAC;IACvB,CAAC,CAAC;EACN,CAAC,CAAC;EACFd,SAAS,CAAC,MAAM;IACd6D,QAAQ,GAAG,IAAI;IACfD,OAAO,EAAEM,KAAK,CAAC,CAAC;EAClB,CAAC,CAAC;EACF,MAAMQ,UAAU,GAAIX,IAA0B,IAAK;IACjDlD,eAAe,CAACkD,IAAI,CAAC;IACrB,IAAI,CAAChC,OAAO,CAACjB,OAAO,EAAE,KAAKkD,OAAO,CAACD,IAAI,CAAC;IACxChC,OAAO,CAACC,eAAe,GAAG+B,IAAI,CAAC;EACjC,CAAC;EACD,OAAO;IACL3B,QAAQ;IACRa,OAAO;IACPE,OAAO;IACPE,KAAK;IACLpB,WAAW;IACX0B,MAAM;IACNe,UAAU;IACV;IACAC,OAAO,EAAEA,CAAA,KAAMX,OAAO,CAACjC,OAAO,CAACjB,OAAO,GAAG,CAAC,IAAImC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC;IAC9D2B,KAAK,EAAEA,CAAA,KAAMZ,OAAO,CAACjC,OAAO,CAACjB,OAAO,GAAG,CAAC,IAAImC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC;IAC5D4B,YAAYA,CAAA,EAAG;MACb,MAAMxE,IAAI,GAAG+B,QAAQ,CAAC,CAAC,CAACtB,OAAO,CAACT,IAAI;MACpC,IAAIA,IAAI,KAAKG,SAAS,EAAEkE,UAAU,CAAC;QAAE,GAAGzB,OAAO,CAAC,CAAC;QAAE3C,aAAa,EAAED;MAAK,CAAC,CAAC;IAC3E,CAAC;IACDyE,cAAcA,CAAA,EAAG;MACfJ,UAAU,CAAC;QAAE,GAAGzB,OAAO,CAAC,CAAC;QAAE3C,aAAa,EAAEE;MAAU,CAAC,CAAC;IACxD;EACF,CAAC;AACH","ignoreList":[]}
|