@k2b/ui 0.6.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/browser/actions/Dropdown.js +2 -0
  2. package/dist/browser/actions/Dropdown.js.map +1 -1
  3. package/dist/browser/chat/ChatPrimitives.js +4 -1
  4. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  5. package/dist/browser/content/DataTable.js +25 -10
  6. package/dist/browser/content/DataTable.js.map +1 -1
  7. package/dist/browser/content/FileView.js +49 -10
  8. package/dist/browser/content/FileView.js.map +1 -1
  9. package/dist/browser/inputs/AutocompleteSelect.js +1 -1
  10. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  11. package/dist/browser/inputs/FileInputs.js.map +1 -1
  12. package/dist/browser/inputs/MultiSelectInput.js +258 -174
  13. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  14. package/dist/browser/inputs/Select.js +1 -1
  15. package/dist/browser/inputs/Select.js.map +1 -1
  16. package/dist/browser/inputs/choice.js +27 -0
  17. package/dist/browser/inputs/choice.js.map +1 -1
  18. package/dist/browser/intl/messages.js +6 -0
  19. package/dist/browser/intl/messages.js.map +1 -1
  20. package/dist/browser/layout/DetailPanel.js +168 -133
  21. package/dist/browser/layout/DetailPanel.js.map +1 -1
  22. package/dist/browser/layout/index.js.map +1 -1
  23. package/dist/browser/surfaces/Placeholder.js +3 -0
  24. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  25. package/dist/ssr/actions/Dropdown.js +2 -0
  26. package/dist/ssr/actions/Dropdown.js.map +1 -1
  27. package/dist/ssr/chat/ChatPrimitives.js +3 -1
  28. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  29. package/dist/ssr/content/DataTable.js +25 -10
  30. package/dist/ssr/content/DataTable.js.map +1 -1
  31. package/dist/ssr/content/FileView.js +49 -10
  32. package/dist/ssr/content/FileView.js.map +1 -1
  33. package/dist/ssr/inputs/AutocompleteSelect.js +1 -1
  34. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  35. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  36. package/dist/ssr/inputs/MultiSelectInput.js +88 -43
  37. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  38. package/dist/ssr/inputs/Select.js +1 -1
  39. package/dist/ssr/inputs/Select.js.map +1 -1
  40. package/dist/ssr/inputs/choice.js +27 -0
  41. package/dist/ssr/inputs/choice.js.map +1 -1
  42. package/dist/ssr/intl/messages.js +6 -0
  43. package/dist/ssr/intl/messages.js.map +1 -1
  44. package/dist/ssr/layout/DetailPanel.js +68 -38
  45. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  46. package/dist/ssr/layout/index.js.map +1 -1
  47. package/dist/ssr/surfaces/Placeholder.js +3 -0
  48. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  49. package/dist/styles.css +1 -1
  50. package/dist/types/content/FileView.d.ts +1 -0
  51. package/dist/types/inputs/FileInputs.d.ts +1 -0
  52. package/dist/types/inputs/choice.d.ts +12 -0
  53. package/dist/types/intl/messages.d.ts +3 -0
  54. package/dist/types/layout/DetailPanel.d.ts +10 -0
  55. package/dist/types/layout/index.d.ts +1 -1
  56. package/dist/types/surfaces/Placeholder.d.ts +2 -1
  57. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["content/DataTable.tsx"],"sourcesContent":["import {\n type Accessor,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PanelHeader } from \"../layout/PanelHeader\";\nimport { Paper } from \"../surfaces/Paper\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport type { CollectionSelection } from \"./collection-selection\";\n\nexport type DataTableColumn<T> = {\n id: string;\n header: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n subtitle?: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n value?: keyof T | ((row: T) => unknown);\n class?: string;\n headerClass?: string;\n cellClass?: string;\n /** Defaults to right for numeric values and left for everything else. */\n align?: \"left\" | \"center\" | \"right\";\n /**\n * Marks the column sortable. Pass a string when the server's sort key\n * differs from the column id — they often do, because one column can show a\n * rate while another sorts by the absolute count behind it.\n */\n sortable?: boolean | string;\n};\n\nexport type DataTableSort = { key: string; direction: \"asc\" | \"desc\" };\n\nexport type DataTableRenderCell<T> = (ctx: {\n row: T;\n col: DataTableColumn<T>;\n value: unknown;\n render: (value: unknown) => JSX.Element;\n}) => JSX.Element;\n\nexport type DataTableRenderHeader<T> = (ctx: { col: DataTableColumn<T>; render: () => JSX.Element }) => JSX.Element;\n\nexport type DataTableFooter<T> = {\n values?: Record<string, unknown>;\n renderCell?: (ctx: { col: DataTableColumn<T>; value: unknown; render: (value: unknown) => JSX.Element }) => JSX.Element;\n};\n\nexport type DataTableProps<T> = {\n rows: readonly T[];\n columns: readonly DataTableColumn<T>[];\n /** Accessible name for a standalone table region. Defaults to \"Data table\". */\n ariaLabel?: string;\n /** ID of a visible heading that labels the table region. Takes precedence over ariaLabel. */\n ariaLabelledBy?: string;\n getRowId?: (row: T) => string;\n /** Current server-side ordering, or null when the default applies. */\n sort?: DataTableSort | null;\n /**\n * Link target for a sortable header. Link-based because every admin table is\n * server-rendered: sorting is a query change, not client state.\n */\n sortHref?: (next: DataTableSort) => string;\n selectedRowId?: string | null;\n /** Optional multi-selection shared with another collection view. Requires getRowId. */\n selection?: CollectionSelection;\n rowClass?: string | ((row: T) => string | undefined);\n hoverRows?: boolean;\n onRowClick?: (row: T) => void;\n onRowDoubleClick?: (row: T) => void;\n onRowContextMenu?: (row: T) => void;\n renderCell?: DataTableRenderCell<T>;\n renderHeader?: DataTableRenderHeader<T>;\n footer?: DataTableFooter<T>;\n hasMore?: boolean;\n loadingMore?: boolean;\n onLoadMore?: () => void;\n empty?: JSX.Element;\n density?: \"compact\" | \"normal\";\n stickyHeader?: boolean;\n highlightColumns?: boolean;\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n cellContentClass?: string;\n fillHeight?: boolean;\n /** Visual frame for a standalone table. Defaults preserve the legacy class-based behavior. */\n surface?: \"paper\" | \"plain\";\n class?: string;\n /** Additional classes for the table element. Core table geometry is always retained. */\n tableClass?: string;\n scrollPreserveKey?: string | false;\n};\n\nexport type DataTablePanelProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTableHeaderProps = {\n title: string;\n subtitle?: string;\n children?: JSX.Element;\n as?: \"h1\" | \"h2\" | \"h3\";\n size?: \"sm\" | \"md\";\n class?: string;\n};\n\nexport type DataTableControlsProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTablePanelFooterProps = {\n children: JSX.Element;\n class?: string;\n};\n\ntype DataTablePanelContextValue = {\n headingId: string;\n hasHeading: Accessor<boolean>;\n registerHeading: () => void;\n};\n\nconst DataTablePanelContext = createContext<DataTablePanelContextValue>();\n\nconst defaultRender = (value: unknown, locale: string, messages: ReturnType<ReturnType<typeof useUiMessages>>): JSX.Element => {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (value instanceof Date) return value.toLocaleString(locale);\n if (typeof value === \"boolean\") return value ? messages.yes : messages.no;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n};\n\nconst renderColumnPart = <T,>(\n part: DataTableColumn<T>[\"header\"] | DataTableColumn<T>[\"subtitle\"],\n col: DataTableColumn<T>,\n): JSX.Element => {\n if (typeof part === \"function\") return part({ col });\n return part;\n};\n\nconst rowInteractiveSelector = [\n \"a[href]\",\n \"button\",\n \"input\",\n \"label\",\n \"select\",\n \"textarea\",\n \"summary\",\n \"[contenteditable]\",\n \"[role='button']\",\n \"[role='checkbox']\",\n \"[role='link']\",\n \"[role='menuitem']\",\n \"[role='option']\",\n \"[role='radio']\",\n \"[role='switch']\",\n \"[role='tab']\",\n \"[tabindex]\",\n].join(\",\");\n\nconst isNestedRowControl = (event: Event): boolean =>\n event.target instanceof Element && event.target.closest(rowInteractiveSelector) !== event.currentTarget;\n\ntype DataTableScrollbarAxis = \"x\" | \"y\";\ntype DataTableScrollbarMetrics = { overflow: boolean; offset: number; size: number };\n\nconst scrollbarMetrics = (viewportSize: number, contentSize: number, scrollOffset: number): DataTableScrollbarMetrics => {\n if (viewportSize <= 0 || contentSize <= viewportSize + 1) return { overflow: false, offset: 0, size: 0 };\n const size = Math.min(viewportSize, Math.max(24, (viewportSize * viewportSize) / contentSize));\n const offset = (scrollOffset / (contentSize - viewportSize)) * (viewportSize - size);\n return { overflow: true, offset, size };\n};\n\nfunction DataTableRoot<T>(props: DataTableProps<T>) {\n const messages = useUiMessages();\n const locale = useLocale();\n const [hoveredColumn, setHoveredColumn] = createSignal<number | null>(null);\n const [scrollbars, setScrollbars] = createSignal<Record<DataTableScrollbarAxis, DataTableScrollbarMetrics>>({\n x: { overflow: false, offset: 0, size: 0 },\n y: { overflow: false, offset: 0, size: 0 },\n });\n const [scrollbarEnhanced, setScrollbarEnhanced] = createSignal(false);\n const [scrolling, setScrolling] = createSignal(false);\n const panel = useContext(DataTablePanelContext);\n let tableRef: HTMLTableElement | undefined;\n let scrollRef: HTMLDivElement | undefined;\n let loadMoreRef: HTMLDivElement | undefined;\n let scrollingTimeout: ReturnType<typeof setTimeout> | undefined;\n let scrollbarDragOffset = 0;\n let hasMore = false;\n let loadingMore = false;\n let onLoadMore: (() => void) | undefined;\n let loadMoreRequested = false;\n let previousRowsLength = props.rows.length;\n let previousLoadingMore = !!props.loadingMore;\n let previousHasMore = !!props.hasMore;\n const rowId = (row: T) => props.getRowId?.(row);\n const isInteractive = () => !!props.selection || !!props.onRowClick || !!props.onRowDoubleClick;\n const shouldHoverRows = () => props.hoverRows ?? isInteractive();\n const shouldRenderLoadMoreSentinel = () => !!props.onLoadMore;\n const labelledBy = () => props.ariaLabelledBy ?? (panel?.hasHeading() ? panel.headingId : undefined);\n const surface = () => props.surface ?? (props.class ? \"plain\" : \"paper\");\n const cellContentClass = () => props.cellContentClass ?? \"k2b-data-table__cell-text\";\n const tableClass = () => `k2b-data-table ${props.tableClass ?? \"\"}`.trim();\n const columnHighlighted = (index: number) =>\n props.highlightColumns !== false && shouldHoverRows() && hoveredColumn() === index ? \"true\" : undefined;\n const setHoveredColumnIfEnabled = (index: number) => {\n if (shouldHoverRows()) setHoveredColumn(index);\n };\n\n const isNearBottom = () => {\n if (!scrollRef) return false;\n return scrollRef.scrollTop + scrollRef.clientHeight >= scrollRef.scrollHeight - 240;\n };\n\n const maybeLoadMore = () => {\n if (!hasMore || loadingMore || loadMoreRequested || !onLoadMore) return;\n if (!isNearBottom()) return;\n loadMoreRequested = true;\n try {\n onLoadMore();\n } catch (error) {\n loadMoreRequested = false;\n throw error;\n }\n };\n\n const syncScrollbars = () => {\n if (!scrollRef) return;\n setScrollbars({\n x: scrollbarMetrics(scrollRef.clientWidth, scrollRef.scrollWidth, scrollRef.scrollLeft),\n y: scrollbarMetrics(scrollRef.clientHeight, scrollRef.scrollHeight, scrollRef.scrollTop),\n });\n };\n\n const revealScrollbars = () => {\n setScrolling(true);\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n scrollingTimeout = setTimeout(() => {\n setScrolling(false);\n scrollingTimeout = undefined;\n }, 700);\n };\n\n const onScroll = () => {\n syncScrollbars();\n revealScrollbars();\n maybeLoadMore();\n };\n\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (!scrollRef) return;\n const track = event.currentTarget;\n const metrics = scrollbars()[axis];\n const rect = track.getBoundingClientRect();\n const trackSize = axis === \"y\" ? rect.height : rect.width;\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n const available = Math.max(1, trackSize - metrics.size);\n const thumbOffset = Math.min(available, Math.max(0, pointerOffset - scrollbarDragOffset));\n const maxScroll = axis === \"y\" ? scrollRef.scrollHeight - scrollRef.clientHeight : scrollRef.scrollWidth - scrollRef.clientWidth;\n if (axis === \"y\") scrollRef.scrollTop = (thumbOffset / available) * maxScroll;\n else scrollRef.scrollLeft = (thumbOffset / available) * maxScroll;\n syncScrollbars();\n revealScrollbars();\n };\n\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n event.preventDefault();\n const metrics = scrollbars()[axis];\n const rect = event.currentTarget.getBoundingClientRect();\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n scrollbarDragOffset =\n event.target === event.currentTarget ? metrics.size / 2 : Math.min(metrics.size, Math.max(0, pointerOffset - metrics.offset));\n event.currentTarget.setPointerCapture(event.pointerId);\n scrollFromPointer(event, axis);\n };\n\n const valueOf = (row: T, col: DataTableColumn<T>) => {\n if (typeof col.value === \"function\") return col.value(row);\n if (col.value) return row[col.value];\n return undefined;\n };\n\n const columnAlignments = createMemo(() => {\n const alignments = new Map<string, NonNullable<DataTableColumn<T>[\"align\"]>>();\n for (const col of props.columns) {\n if (col.align) {\n alignments.set(col.id, col.align);\n continue;\n }\n let align: NonNullable<DataTableColumn<T>[\"align\"]> = \"left\";\n for (const row of props.rows) {\n const value = valueOf(row, col);\n if (value === null || value === undefined || value === \"\") continue;\n align = typeof value === \"number\" || typeof value === \"bigint\" ? \"right\" : \"left\";\n break;\n }\n alignments.set(col.id, align);\n }\n return alignments;\n });\n\n /** `data-align` mirrors Cloud's `text-left/center/right` on the same cell. */\n const alignAttr = (col: DataTableColumn<T>) => {\n const align = columnAlignments().get(col.id) ?? \"left\";\n return align === \"left\" ? undefined : align;\n };\n\n const sortKeyOf = (col: DataTableColumn<T>): string | null =>\n col.sortable === true ? col.id : typeof col.sortable === \"string\" ? col.sortable : null;\n\n /**\n * Sorting is a link, not a handler: these tables are server-rendered, so the\n * order belongs in the URL. Clicking the active column flips its direction.\n */\n const sortLinkFor = (col: DataTableColumn<T>): { href: string; active: boolean; direction: \"asc\" | \"desc\" } | null => {\n const key = sortKeyOf(col);\n if (!key || !props.sortHref) return null;\n const active = props.sort?.key === key;\n const direction: \"asc\" | \"desc\" = active && props.sort?.direction === \"desc\" ? \"asc\" : \"desc\";\n return { href: props.sortHref({ key, direction }), active, direction };\n };\n\n /** Only a sortable column carries a sort state; the rest carry none at all. */\n const ariaSortFor = (col: DataTableColumn<T>): \"ascending\" | \"descending\" | \"none\" | undefined => {\n const key = sortKeyOf(col);\n if (!key || (!props.sortHref && !props.renderHeader)) return undefined;\n if (props.sort?.key !== key) return \"none\";\n return props.sort?.direction === \"asc\" ? \"ascending\" : \"descending\";\n };\n\n const renderHeaderDefault = (col: DataTableColumn<T>): JSX.Element => {\n const sort = sortLinkFor(col);\n const title = (\n <>\n <span class=\"k2b-data-table__header-title\">{renderColumnPart(col.header, col)}</span>\n <Show when={col.subtitle !== undefined}>\n <span class=\"k2b-data-table__header-subtitle\">{renderColumnPart(col.subtitle, col)}</span>\n </Show>\n </>\n );\n\n if (!sort)\n return (\n <div class=\"k2b-data-table__header-content\" data-align={alignAttr(col)}>\n {title}\n </div>\n );\n\n return (\n <a href={sort.href} class=\"k2b-data-table__header-content k2b-data-table__sort\" data-align={alignAttr(col)}>\n <span class=\"k2b-data-table__header-line\">\n {title}\n {/* Inactive columns keep a dimmed marker so the row reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${props.sort?.direction === \"asc\" && sort.active ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort.active ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </span>\n </a>\n );\n };\n\n const renderValueDefault = (value: unknown) => defaultRender(value, locale(), messages());\n const renderCellDefault = (row: T, col: DataTableColumn<T>) => renderValueDefault(valueOf(row, col));\n\n const onRowKeyDown = (event: KeyboardEvent, row: T) => {\n if (!isInteractive()) return;\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined && props.selection?.keyDown(event, id)) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n (props.selection ? props.onRowDoubleClick : (props.onRowClick ?? props.onRowDoubleClick))?.(row);\n };\n\n const onRowClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined) props.selection?.select(id, event);\n props.onRowClick?.(row);\n };\n\n const onRowDoubleClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n props.onRowDoubleClick?.(row);\n };\n\n const rowClass = (row: T) => {\n if (typeof props.rowClass === \"function\") return props.rowClass(row) ?? \"\";\n return props.rowClass ?? \"\";\n };\n\n onMount(() => {\n if (typeof IntersectionObserver === \"undefined\" || !scrollRef || !loadMoreRef) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) maybeLoadMore();\n },\n { root: scrollRef, rootMargin: \"240px\" },\n );\n observer.observe(loadMoreRef);\n onCleanup(() => observer.disconnect());\n });\n\n onMount(() => {\n setScrollbarEnhanced(true);\n syncScrollbars();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbars);\n if (scrollRef) observer?.observe(scrollRef);\n if (tableRef) observer?.observe(tableRef);\n onCleanup(() => {\n observer?.disconnect();\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n });\n });\n\n createEffect(() => {\n const rowsLength = props.rows.length;\n const nextHasMore = !!props.hasMore;\n const nextLoadingMore = !!props.loadingMore;\n if (rowsLength !== previousRowsLength || (previousLoadingMore && !nextLoadingMore) || (!previousHasMore && nextHasMore)) {\n loadMoreRequested = false;\n }\n previousRowsLength = rowsLength;\n previousLoadingMore = nextLoadingMore;\n previousHasMore = nextHasMore;\n hasMore = nextHasMore;\n loadingMore = nextLoadingMore;\n onLoadMore = props.onLoadMore;\n maybeLoadMore();\n queueMicrotask(syncScrollbars);\n });\n\n return (\n <Show when={props.columns.length > 0} fallback={<Placeholder surface=\"paper\" description={<>{messages().noColumns}</>} />}>\n <Dynamic\n component={surface() === \"paper\" ? Paper : \"div\"}\n class={`k2b-table-shell ${props.class ?? \"\"}`}\n data-surface={surface()}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-overflow-x={scrollbars().x.overflow ? \"true\" : undefined}\n data-overflow-y={scrollbars().y.overflow ? \"true\" : undefined}\n data-scrollbar-enhanced={scrollbarEnhanced() ? \"true\" : undefined}\n data-scrolling={scrolling() ? \"true\" : undefined}\n onMouseLeave={() => setHoveredColumn(null)}\n >\n <div\n ref={scrollRef}\n role=\"region\"\n aria-label={labelledBy() ? undefined : (props.ariaLabel ?? messages().dataTable)}\n aria-labelledby={labelledBy()}\n tabIndex={0}\n class=\"k2b-table-wrap\"\n data-density={props.density === \"compact\" ? \"compact\" : undefined}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-surface={surface()}\n data-scroll-preserve={props.scrollPreserveKey || undefined}\n onScroll={onScroll}\n >\n <table ref={tableRef} class={tableClass()} data-fill={props.fillHeight ? \"true\" : undefined}>\n <thead class=\"k2b-data-table__head\" data-sticky={props.stickyHeader === false ? undefined : \"true\"}>\n <tr class=\"k2b-data-table__head-row\">\n <For each={props.columns}>\n {(col, index) => (\n <th\n scope=\"col\"\n class={`${col.headerClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n aria-sort={ariaSortFor(col)}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {props.renderHeader ? props.renderHeader({ col, render: () => renderHeaderDefault(col) }) : renderHeaderDefault(col)}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <Show\n when={props.rows.length > 0}\n fallback={\n <tr>\n <td class=\"k2b-data-table__empty\" colspan={props.columns.length}>\n <Placeholder description={<>{props.empty ?? messages().noRecords}</>} />\n </td>\n </tr>\n }\n >\n <For each={props.rows}>\n {(row) => {\n const id = () => rowId(row);\n const isSelected = () =>\n props.selection ? props.selection.selected().has(id() ?? \"\") : props.selectedRowId && id() === props.selectedRowId;\n return (\n <tr\n ref={(element) => {\n const key = id();\n if (key !== undefined) props.selection?.register(key, element);\n }}\n class={`k2b-data-table__row ${rowClass(row)}`}\n data-hover={shouldHoverRows() ? \"true\" : undefined}\n data-clickable={shouldHoverRows() && isInteractive() ? \"true\" : undefined}\n data-selected={isSelected() ? \"true\" : undefined}\n aria-selected={props.selection ? !!isSelected() : undefined}\n tabIndex={props.selection ? (props.selection.focused() === id() ? 0 : -1) : isInteractive() ? 0 : undefined}\n onFocus={() => {\n const key = id();\n if (key !== undefined) props.selection?.markFocused(key);\n }}\n onClick={(event) => onRowClick(event, row)}\n onDblClick={(event) => onRowDoubleClick(event, row)}\n onContextMenu={() => props.onRowContextMenu?.(row)}\n onKeyDown={(e) => onRowKeyDown(e, row)}\n >\n <For each={props.columns}>\n {(col, index) => {\n const value = () => valueOf(row, col);\n return (\n <td\n class={`${col.cellClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-valign={props.verticalAlign && props.verticalAlign !== \"middle\" ? props.verticalAlign : undefined}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n <div class={cellContentClass()}>\n {props.renderCell\n ? props.renderCell({\n row,\n col,\n value: value(),\n render: (v) => renderCellDefault(row, { ...col, value: () => v }),\n })\n : renderValueDefault(value())}\n </div>\n </td>\n );\n }}\n </For>\n </tr>\n );\n }}\n </For>\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={props.columns.length} />\n </tr>\n </Show>\n </Show>\n </tbody>\n <Show when={props.footer}>\n {(footer) => (\n <tfoot class=\"k2b-data-table__foot\" data-sticky=\"true\">\n <tr class=\"k2b-data-table__foot-row\">\n <For each={props.columns}>\n {(col, index) => {\n const value = () => footer().values?.[col.id];\n return (\n <td\n class=\"k2b-data-table__footer-cell\"\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {footer().renderCell\n ? footer().renderCell!({ col, value: value(), render: renderValueDefault })\n : renderValueDefault(value())}\n </td>\n );\n }}\n </For>\n </tr>\n </tfoot>\n )}\n </Show>\n </table>\n <Show when={shouldRenderLoadMoreSentinel()}>\n <div ref={loadMoreRef} class=\"k2b-data-table__sentinel\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={[\"y\", \"x\"] as const}>\n {(axis) => (\n <div\n class=\"k2b-data-table__scrollbar\"\n data-axis={axis}\n data-overflow={scrollbars()[axis].overflow ? \"true\" : undefined}\n aria-hidden=\"true\"\n onPointerDown={(event) => startScrollbarDrag(event, axis)}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event, axis);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-data-table-scroll-offset\": `${scrollbars()[axis].offset}px`,\n \"--k2b-data-table-scroll-size\": `${scrollbars()[axis].size}px`,\n }}\n />\n </div>\n )}\n </For>\n </Dynamic>\n </Show>\n );\n}\n\nconst DataTablePanel = (props: DataTablePanelProps): JSX.Element => {\n const headingId = `k2b-data-table-${createUniqueId()}-heading`;\n const [hasHeading, setHasHeading] = createSignal(false);\n const context: DataTablePanelContextValue = {\n headingId,\n hasHeading,\n registerHeading: () => setHasHeading(true),\n };\n\n return (\n <DataTablePanelContext.Provider value={context}>\n <Paper as=\"section\" class={`k2b-data-panel ${props.class ?? \"\"}`}>\n {props.children}\n </Paper>\n </DataTablePanelContext.Provider>\n );\n};\n\nconst DataTableHeader = (props: DataTableHeaderProps): JSX.Element => {\n const panel = useContext(DataTablePanelContext);\n panel?.registerHeading();\n\n return (\n <div class={`k2b-data-panel__header ${props.class ?? \"\"}`}>\n <PanelHeader\n title={<span id={panel?.headingId}>{props.title}</span>}\n subtitle={props.subtitle}\n actions={props.children}\n as={props.as}\n size={props.size}\n />\n </div>\n );\n};\n\nconst DataTableControls = (props: DataTableControlsProps): JSX.Element => (\n <div class={`k2b-data-panel__controls ${props.class ?? \"\"}`}>{props.children}</div>\n);\n\nconst DataTablePanelFooter = (props: DataTablePanelFooterProps): JSX.Element => (\n <footer class={`k2b-data-panel__footer ${props.class ?? \"\"}`}>{props.children}</footer>\n);\n\ntype DataTableComponent = {\n <T>(props: DataTableProps<T>): JSX.Element;\n Panel: (props: DataTablePanelProps) => JSX.Element;\n Header: (props: DataTableHeaderProps) => JSX.Element;\n Controls: (props: DataTableControlsProps) => JSX.Element;\n Footer: (props: DataTablePanelFooterProps) => JSX.Element;\n};\n\nconst DataTable = DataTableRoot as DataTableComponent;\nDataTable.Panel = DataTablePanel;\nDataTable.Header = DataTableHeader;\nDataTable.Controls = DataTableControls;\nDataTable.Footer = DataTablePanelFooter;\n\nexport default DataTable;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["content/DataTable.tsx"],"sourcesContent":["import {\n type Accessor,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PanelHeader } from \"../layout/PanelHeader\";\nimport { Paper } from \"../surfaces/Paper\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport type { CollectionSelection } from \"./collection-selection\";\n\nexport type DataTableColumn<T> = {\n id: string;\n header: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n subtitle?: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n value?: keyof T | ((row: T) => unknown);\n class?: string;\n headerClass?: string;\n cellClass?: string;\n /** Defaults to right for numeric values and left for everything else. */\n align?: \"left\" | \"center\" | \"right\";\n /**\n * Marks the column sortable. Pass a string when the server's sort key\n * differs from the column id — they often do, because one column can show a\n * rate while another sorts by the absolute count behind it.\n */\n sortable?: boolean | string;\n};\n\nexport type DataTableSort = { key: string; direction: \"asc\" | \"desc\" };\n\nexport type DataTableRenderCell<T> = (ctx: {\n row: T;\n col: DataTableColumn<T>;\n value: unknown;\n render: (value: unknown) => JSX.Element;\n}) => JSX.Element;\n\nexport type DataTableRenderHeader<T> = (ctx: { col: DataTableColumn<T>; render: () => JSX.Element }) => JSX.Element;\n\nexport type DataTableFooter<T> = {\n values?: Record<string, unknown>;\n renderCell?: (ctx: { col: DataTableColumn<T>; value: unknown; render: (value: unknown) => JSX.Element }) => JSX.Element;\n};\n\nexport type DataTableProps<T> = {\n rows: readonly T[];\n columns: readonly DataTableColumn<T>[];\n /** Accessible name for a standalone table region. Defaults to \"Data table\". */\n ariaLabel?: string;\n /** ID of a visible heading that labels the table region. Takes precedence over ariaLabel. */\n ariaLabelledBy?: string;\n getRowId?: (row: T) => string;\n /** Current server-side ordering, or null when the default applies. */\n sort?: DataTableSort | null;\n /**\n * Link target for a sortable header. Link-based because every admin table is\n * server-rendered: sorting is a query change, not client state.\n */\n sortHref?: (next: DataTableSort) => string;\n selectedRowId?: string | null;\n /** Optional multi-selection shared with another collection view. Requires getRowId. */\n selection?: CollectionSelection;\n rowClass?: string | ((row: T) => string | undefined);\n hoverRows?: boolean;\n onRowClick?: (row: T) => void;\n onRowDoubleClick?: (row: T) => void;\n onRowContextMenu?: (row: T) => void;\n renderCell?: DataTableRenderCell<T>;\n renderHeader?: DataTableRenderHeader<T>;\n footer?: DataTableFooter<T>;\n hasMore?: boolean;\n loadingMore?: boolean;\n onLoadMore?: () => void;\n empty?: JSX.Element;\n density?: \"compact\" | \"normal\";\n stickyHeader?: boolean;\n highlightColumns?: boolean;\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n cellContentClass?: string;\n fillHeight?: boolean;\n /** Visual frame for a standalone table. Defaults preserve the legacy class-based behavior. */\n surface?: \"paper\" | \"plain\";\n class?: string;\n /** Additional classes for the table element. Core table geometry is always retained. */\n tableClass?: string;\n scrollPreserveKey?: string | false;\n};\n\nexport type DataTablePanelProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTableHeaderProps = {\n title: string;\n subtitle?: string;\n children?: JSX.Element;\n as?: \"h1\" | \"h2\" | \"h3\";\n size?: \"sm\" | \"md\";\n class?: string;\n};\n\nexport type DataTableControlsProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTablePanelFooterProps = {\n children: JSX.Element;\n class?: string;\n};\n\ntype DataTablePanelContextValue = {\n headingId: string;\n hasHeading: Accessor<boolean>;\n registerHeading: () => void;\n};\n\nconst DataTablePanelContext = createContext<DataTablePanelContextValue>();\n\nconst defaultRender = (value: unknown, locale: string, messages: ReturnType<ReturnType<typeof useUiMessages>>): JSX.Element => {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (value instanceof Date) return value.toLocaleString(locale);\n if (typeof value === \"boolean\") return value ? messages.yes : messages.no;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n};\n\nconst renderColumnPart = <T,>(\n part: DataTableColumn<T>[\"header\"] | DataTableColumn<T>[\"subtitle\"],\n col: DataTableColumn<T>,\n): JSX.Element => {\n if (typeof part === \"function\") return part({ col });\n return part;\n};\n\nconst rowInteractiveSelector = [\n \"a[href]\",\n \"button\",\n \"input\",\n \"label\",\n \"select\",\n \"textarea\",\n \"summary\",\n \"[contenteditable]\",\n \"[role='button']\",\n \"[role='checkbox']\",\n \"[role='link']\",\n \"[role='menuitem']\",\n \"[role='option']\",\n \"[role='radio']\",\n \"[role='switch']\",\n \"[role='tab']\",\n \"[tabindex]\",\n].join(\",\");\n\nconst isNestedRowControl = (event: Event): boolean =>\n event.target instanceof Element && event.target.closest(rowInteractiveSelector) !== event.currentTarget;\n\n/** Distance in pixels before the table's end at which the next page is requested. */\nconst loadMoreMargin = 240;\n\ntype DataTableScrollbarAxis = \"x\" | \"y\";\ntype DataTableScrollbarMetrics = { overflow: boolean; offset: number; size: number };\n\nconst scrollbarMetrics = (viewportSize: number, contentSize: number, scrollOffset: number): DataTableScrollbarMetrics => {\n if (viewportSize <= 0 || contentSize <= viewportSize + 1) return { overflow: false, offset: 0, size: 0 };\n const size = Math.min(viewportSize, Math.max(24, (viewportSize * viewportSize) / contentSize));\n const offset = (scrollOffset / (contentSize - viewportSize)) * (viewportSize - size);\n return { overflow: true, offset, size };\n};\n\nfunction DataTableRoot<T>(props: DataTableProps<T>) {\n const messages = useUiMessages();\n const locale = useLocale();\n const [hoveredColumn, setHoveredColumn] = createSignal<number | null>(null);\n const [scrollbars, setScrollbars] = createSignal<Record<DataTableScrollbarAxis, DataTableScrollbarMetrics>>({\n x: { overflow: false, offset: 0, size: 0 },\n y: { overflow: false, offset: 0, size: 0 },\n });\n const [scrollbarEnhanced, setScrollbarEnhanced] = createSignal(false);\n const [scrolling, setScrolling] = createSignal(false);\n const panel = useContext(DataTablePanelContext);\n let tableRef: HTMLTableElement | undefined;\n let scrollRef: HTMLDivElement | undefined;\n let loadMoreRef: HTMLDivElement | undefined;\n let scrollingTimeout: ReturnType<typeof setTimeout> | undefined;\n let scrollbarDragOffset = 0;\n let hasMore = false;\n let loadingMore = false;\n let onLoadMore: (() => void) | undefined;\n let loadMoreRequested = false;\n let previousRowsLength = props.rows.length;\n let previousLoadingMore = !!props.loadingMore;\n let previousHasMore = !!props.hasMore;\n const rowId = (row: T) => props.getRowId?.(row);\n const isInteractive = () => !!props.selection || !!props.onRowClick || !!props.onRowDoubleClick;\n const shouldHoverRows = () => props.hoverRows ?? isInteractive();\n const shouldRenderLoadMoreSentinel = () => !!props.onLoadMore;\n const labelledBy = () => props.ariaLabelledBy ?? (panel?.hasHeading() ? panel.headingId : undefined);\n const surface = () => props.surface ?? (props.class ? \"plain\" : \"paper\");\n const cellContentClass = () => props.cellContentClass ?? \"k2b-data-table__cell-text\";\n const tableClass = () => `k2b-data-table ${props.tableClass ?? \"\"}`.trim();\n const columnHighlighted = (index: number) =>\n props.highlightColumns !== false && shouldHoverRows() && hoveredColumn() === index ? \"true\" : undefined;\n const setHoveredColumnIfEnabled = (index: number) => {\n if (shouldHoverRows()) setHoveredColumn(index);\n };\n\n /**\n * A bounded table scrolls its own viewport. A table that grows with its rows\n * leaves scrolling to the page or an ancestor, so its end is measured against\n * the browser viewport instead.\n */\n const isNearBottom = () => {\n if (!scrollRef || !loadMoreRef) return false;\n if (scrollRef.scrollHeight > scrollRef.clientHeight + 1) {\n return scrollRef.scrollTop + scrollRef.clientHeight >= scrollRef.scrollHeight - loadMoreMargin;\n }\n return loadMoreRef.getBoundingClientRect().top <= window.innerHeight + loadMoreMargin;\n };\n\n const maybeLoadMore = () => {\n if (!hasMore || loadingMore || !onLoadMore) return;\n if (!isNearBottom()) {\n // Leaving the end re-arms a request the owner declined, for example while its first page was still loading.\n loadMoreRequested = false;\n return;\n }\n if (loadMoreRequested) return;\n loadMoreRequested = true;\n try {\n onLoadMore();\n } catch (error) {\n loadMoreRequested = false;\n throw error;\n }\n };\n\n const syncScrollbars = () => {\n if (!scrollRef) return;\n setScrollbars({\n x: scrollbarMetrics(scrollRef.clientWidth, scrollRef.scrollWidth, scrollRef.scrollLeft),\n y: scrollbarMetrics(scrollRef.clientHeight, scrollRef.scrollHeight, scrollRef.scrollTop),\n });\n };\n\n const revealScrollbars = () => {\n setScrolling(true);\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n scrollingTimeout = setTimeout(() => {\n setScrolling(false);\n scrollingTimeout = undefined;\n }, 700);\n };\n\n const onScroll = () => {\n syncScrollbars();\n revealScrollbars();\n maybeLoadMore();\n };\n\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (!scrollRef) return;\n const track = event.currentTarget;\n const metrics = scrollbars()[axis];\n const rect = track.getBoundingClientRect();\n const trackSize = axis === \"y\" ? rect.height : rect.width;\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n const available = Math.max(1, trackSize - metrics.size);\n const thumbOffset = Math.min(available, Math.max(0, pointerOffset - scrollbarDragOffset));\n const maxScroll = axis === \"y\" ? scrollRef.scrollHeight - scrollRef.clientHeight : scrollRef.scrollWidth - scrollRef.clientWidth;\n if (axis === \"y\") scrollRef.scrollTop = (thumbOffset / available) * maxScroll;\n else scrollRef.scrollLeft = (thumbOffset / available) * maxScroll;\n syncScrollbars();\n revealScrollbars();\n };\n\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n event.preventDefault();\n const metrics = scrollbars()[axis];\n const rect = event.currentTarget.getBoundingClientRect();\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n scrollbarDragOffset =\n event.target === event.currentTarget ? metrics.size / 2 : Math.min(metrics.size, Math.max(0, pointerOffset - metrics.offset));\n event.currentTarget.setPointerCapture(event.pointerId);\n scrollFromPointer(event, axis);\n };\n\n const valueOf = (row: T, col: DataTableColumn<T>) => {\n if (typeof col.value === \"function\") return col.value(row);\n if (col.value) return row[col.value];\n return undefined;\n };\n\n const columnAlignments = createMemo(() => {\n const alignments = new Map<string, NonNullable<DataTableColumn<T>[\"align\"]>>();\n for (const col of props.columns) {\n if (col.align) {\n alignments.set(col.id, col.align);\n continue;\n }\n let align: NonNullable<DataTableColumn<T>[\"align\"]> = \"left\";\n for (const row of props.rows) {\n const value = valueOf(row, col);\n if (value === null || value === undefined || value === \"\") continue;\n align = typeof value === \"number\" || typeof value === \"bigint\" ? \"right\" : \"left\";\n break;\n }\n alignments.set(col.id, align);\n }\n return alignments;\n });\n\n /** `data-align` mirrors Cloud's `text-left/center/right` on the same cell. */\n const alignAttr = (col: DataTableColumn<T>) => {\n const align = columnAlignments().get(col.id) ?? \"left\";\n return align === \"left\" ? undefined : align;\n };\n\n const sortKeyOf = (col: DataTableColumn<T>): string | null =>\n col.sortable === true ? col.id : typeof col.sortable === \"string\" ? col.sortable : null;\n\n /**\n * Sorting is a link, not a handler: these tables are server-rendered, so the\n * order belongs in the URL. Clicking the active column flips its direction.\n */\n const sortLinkFor = (col: DataTableColumn<T>): { href: string; active: boolean; direction: \"asc\" | \"desc\" } | null => {\n const key = sortKeyOf(col);\n if (!key || !props.sortHref) return null;\n const active = props.sort?.key === key;\n const direction: \"asc\" | \"desc\" = active && props.sort?.direction === \"desc\" ? \"asc\" : \"desc\";\n return { href: props.sortHref({ key, direction }), active, direction };\n };\n\n /** Only a sortable column carries a sort state; the rest carry none at all. */\n const ariaSortFor = (col: DataTableColumn<T>): \"ascending\" | \"descending\" | \"none\" | undefined => {\n const key = sortKeyOf(col);\n if (!key || (!props.sortHref && !props.renderHeader)) return undefined;\n if (props.sort?.key !== key) return \"none\";\n return props.sort?.direction === \"asc\" ? \"ascending\" : \"descending\";\n };\n\n const renderHeaderDefault = (col: DataTableColumn<T>): JSX.Element => {\n const sort = sortLinkFor(col);\n const title = (\n <>\n <span class=\"k2b-data-table__header-title\">{renderColumnPart(col.header, col)}</span>\n <Show when={col.subtitle !== undefined}>\n <span class=\"k2b-data-table__header-subtitle\">{renderColumnPart(col.subtitle, col)}</span>\n </Show>\n </>\n );\n\n if (!sort)\n return (\n <div class=\"k2b-data-table__header-content\" data-align={alignAttr(col)}>\n {title}\n </div>\n );\n\n return (\n <a href={sort.href} class=\"k2b-data-table__header-content k2b-data-table__sort\" data-align={alignAttr(col)}>\n <span class=\"k2b-data-table__header-line\">\n {title}\n {/* Inactive columns keep a dimmed marker so the row reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${props.sort?.direction === \"asc\" && sort.active ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort.active ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </span>\n </a>\n );\n };\n\n const renderValueDefault = (value: unknown) => defaultRender(value, locale(), messages());\n const renderCellDefault = (row: T, col: DataTableColumn<T>) => renderValueDefault(valueOf(row, col));\n\n const onRowKeyDown = (event: KeyboardEvent, row: T) => {\n if (!isInteractive()) return;\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined && props.selection?.keyDown(event, id)) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n (props.selection ? props.onRowDoubleClick : (props.onRowClick ?? props.onRowDoubleClick))?.(row);\n };\n\n const onRowClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined) props.selection?.select(id, event);\n props.onRowClick?.(row);\n };\n\n const onRowDoubleClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n props.onRowDoubleClick?.(row);\n };\n\n const rowClass = (row: T) => {\n if (typeof props.rowClass === \"function\") return props.rowClass(row) ?? \"\";\n return props.rowClass ?? \"\";\n };\n\n onMount(() => {\n if (typeof IntersectionObserver === \"undefined\" || !loadMoreRef) return;\n // The viewport root notices the end whichever element scrolls; `isNearBottom` decides.\n const observer = new IntersectionObserver(maybeLoadMore, { rootMargin: `${loadMoreMargin}px` });\n observer.observe(loadMoreRef);\n onCleanup(() => observer.disconnect());\n });\n\n onMount(() => {\n setScrollbarEnhanced(true);\n syncScrollbars();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbars);\n if (scrollRef) observer?.observe(scrollRef);\n if (tableRef) observer?.observe(tableRef);\n onCleanup(() => {\n observer?.disconnect();\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n });\n });\n\n createEffect(() => {\n const rowsLength = props.rows.length;\n const nextHasMore = !!props.hasMore;\n const nextLoadingMore = !!props.loadingMore;\n if (rowsLength !== previousRowsLength || (previousLoadingMore && !nextLoadingMore) || (!previousHasMore && nextHasMore)) {\n loadMoreRequested = false;\n }\n previousRowsLength = rowsLength;\n previousLoadingMore = nextLoadingMore;\n previousHasMore = nextHasMore;\n hasMore = nextHasMore;\n loadingMore = nextLoadingMore;\n onLoadMore = props.onLoadMore;\n maybeLoadMore();\n queueMicrotask(syncScrollbars);\n });\n\n return (\n <Show when={props.columns.length > 0} fallback={<Placeholder surface=\"paper\" description={<>{messages().noColumns}</>} />}>\n <Dynamic\n component={surface() === \"paper\" ? Paper : \"div\"}\n class={`k2b-table-shell ${props.class ?? \"\"}`}\n data-surface={surface()}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-overflow-x={scrollbars().x.overflow ? \"true\" : undefined}\n data-overflow-y={scrollbars().y.overflow ? \"true\" : undefined}\n data-scrollbar-enhanced={scrollbarEnhanced() ? \"true\" : undefined}\n data-scrolling={scrolling() ? \"true\" : undefined}\n onMouseLeave={() => setHoveredColumn(null)}\n >\n <div\n ref={scrollRef}\n role=\"region\"\n aria-label={labelledBy() ? undefined : (props.ariaLabel ?? messages().dataTable)}\n aria-labelledby={labelledBy()}\n tabIndex={0}\n class=\"k2b-table-wrap\"\n data-density={props.density === \"compact\" ? \"compact\" : undefined}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-surface={surface()}\n data-scroll-preserve={props.scrollPreserveKey || undefined}\n onScroll={onScroll}\n >\n <table ref={tableRef} class={tableClass()} data-fill={props.fillHeight ? \"true\" : undefined}>\n <thead class=\"k2b-data-table__head\" data-sticky={props.stickyHeader === false ? undefined : \"true\"}>\n <tr class=\"k2b-data-table__head-row\">\n <For each={props.columns}>\n {(col, index) => (\n <th\n scope=\"col\"\n class={`${col.headerClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n aria-sort={ariaSortFor(col)}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {props.renderHeader ? props.renderHeader({ col, render: () => renderHeaderDefault(col) }) : renderHeaderDefault(col)}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <Show\n when={props.rows.length > 0}\n fallback={\n <tr>\n <td class=\"k2b-data-table__empty\" colspan={props.columns.length}>\n <Placeholder description={<>{props.empty ?? messages().noRecords}</>} />\n </td>\n </tr>\n }\n >\n <For each={props.rows}>\n {(row) => {\n const id = () => rowId(row);\n const isSelected = () =>\n props.selection ? props.selection.selected().has(id() ?? \"\") : props.selectedRowId && id() === props.selectedRowId;\n return (\n <tr\n ref={(element) => {\n const key = id();\n if (key !== undefined) props.selection?.register(key, element);\n }}\n class={`k2b-data-table__row ${rowClass(row)}`}\n data-hover={shouldHoverRows() ? \"true\" : undefined}\n data-clickable={shouldHoverRows() && isInteractive() ? \"true\" : undefined}\n data-selected={isSelected() ? \"true\" : undefined}\n aria-selected={props.selection ? !!isSelected() : undefined}\n tabIndex={props.selection ? (props.selection.focused() === id() ? 0 : -1) : isInteractive() ? 0 : undefined}\n onFocus={() => {\n const key = id();\n if (key !== undefined) props.selection?.markFocused(key);\n }}\n onClick={(event) => onRowClick(event, row)}\n onDblClick={(event) => onRowDoubleClick(event, row)}\n onContextMenu={() => props.onRowContextMenu?.(row)}\n onKeyDown={(e) => onRowKeyDown(e, row)}\n >\n <For each={props.columns}>\n {(col, index) => {\n const value = () => valueOf(row, col);\n return (\n <td\n class={`${col.cellClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-valign={props.verticalAlign && props.verticalAlign !== \"middle\" ? props.verticalAlign : undefined}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n <div class={cellContentClass()}>\n {props.renderCell\n ? props.renderCell({\n row,\n col,\n value: value(),\n render: (v) => renderCellDefault(row, { ...col, value: () => v }),\n })\n : renderValueDefault(value())}\n </div>\n </td>\n );\n }}\n </For>\n </tr>\n );\n }}\n </For>\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={props.columns.length} />\n </tr>\n </Show>\n </Show>\n </tbody>\n <Show when={props.footer}>\n {(footer) => (\n <tfoot class=\"k2b-data-table__foot\" data-sticky=\"true\">\n <tr class=\"k2b-data-table__foot-row\">\n <For each={props.columns}>\n {(col, index) => {\n const value = () => footer().values?.[col.id];\n return (\n <td\n class=\"k2b-data-table__footer-cell\"\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {footer().renderCell\n ? footer().renderCell!({ col, value: value(), render: renderValueDefault })\n : renderValueDefault(value())}\n </td>\n );\n }}\n </For>\n </tr>\n </tfoot>\n )}\n </Show>\n </table>\n <Show when={shouldRenderLoadMoreSentinel()}>\n <div ref={loadMoreRef} class=\"k2b-data-table__sentinel\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={[\"y\", \"x\"] as const}>\n {(axis) => (\n <div\n class=\"k2b-data-table__scrollbar\"\n data-axis={axis}\n data-overflow={scrollbars()[axis].overflow ? \"true\" : undefined}\n aria-hidden=\"true\"\n onPointerDown={(event) => startScrollbarDrag(event, axis)}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event, axis);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-data-table-scroll-offset\": `${scrollbars()[axis].offset}px`,\n \"--k2b-data-table-scroll-size\": `${scrollbars()[axis].size}px`,\n }}\n />\n </div>\n )}\n </For>\n </Dynamic>\n </Show>\n );\n}\n\nconst DataTablePanel = (props: DataTablePanelProps): JSX.Element => {\n const headingId = `k2b-data-table-${createUniqueId()}-heading`;\n const [hasHeading, setHasHeading] = createSignal(false);\n const context: DataTablePanelContextValue = {\n headingId,\n hasHeading,\n registerHeading: () => setHasHeading(true),\n };\n\n return (\n <DataTablePanelContext.Provider value={context}>\n <Paper as=\"section\" class={`k2b-data-panel ${props.class ?? \"\"}`}>\n {props.children}\n </Paper>\n </DataTablePanelContext.Provider>\n );\n};\n\nconst DataTableHeader = (props: DataTableHeaderProps): JSX.Element => {\n const panel = useContext(DataTablePanelContext);\n panel?.registerHeading();\n\n return (\n <div class={`k2b-data-panel__header ${props.class ?? \"\"}`}>\n <PanelHeader\n title={<span id={panel?.headingId}>{props.title}</span>}\n subtitle={props.subtitle}\n actions={props.children}\n as={props.as}\n size={props.size}\n />\n </div>\n );\n};\n\nconst DataTableControls = (props: DataTableControlsProps): JSX.Element => (\n <div class={`k2b-data-panel__controls ${props.class ?? \"\"}`}>{props.children}</div>\n);\n\nconst DataTablePanelFooter = (props: DataTablePanelFooterProps): JSX.Element => (\n <footer class={`k2b-data-panel__footer ${props.class ?? \"\"}`}>{props.children}</footer>\n);\n\ntype DataTableComponent = {\n <T>(props: DataTableProps<T>): JSX.Element;\n Panel: (props: DataTablePanelProps) => JSX.Element;\n Header: (props: DataTableHeaderProps) => JSX.Element;\n Controls: (props: DataTableControlsProps) => JSX.Element;\n Footer: (props: DataTablePanelFooterProps) => JSX.Element;\n};\n\nconst DataTable = DataTableRoot as DataTableComponent;\nDataTable.Panel = DataTablePanel;\nDataTable.Header = DataTableHeader;\nDataTable.Controls = DataTableControls;\nDataTable.Footer = DataTablePanelFooter;\n\nexport default DataTable;\n"],"mappings":"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","ignoreList":[]}
@@ -50,6 +50,7 @@ import CodeDisplay from "./CodeDisplay";
50
50
  import { decodeDelimitedContent, readDelimitedPreferences } from "./delimited-preferences";
51
51
  import { fileViewExtension, getFileViewPreviewKind, parseDelimitedText } from "./file-view-preview";
52
52
  import MarkdownView from "./MarkdownView";
53
+ import PdfPreview from "./PdfPreview";
53
54
  import StructuredDataPreview from "./StructuredDataPreview";
54
55
  export { canPreviewFile, getFileViewPreviewKind } from "./file-view-preview";
55
56
  const codeLanguage = path => {
@@ -608,20 +609,59 @@ function ImageRenderer(props) {
608
609
  }
609
610
  });
610
611
  }
612
+ const pdfBlob = content => {
613
+ if (content.encoding === "utf8") return new Blob([content.content], {
614
+ type: "application/pdf"
615
+ });
616
+ const binary = atob(content.content);
617
+ const bytes = new Uint8Array(binary.length);
618
+ for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);
619
+ return new Blob([bytes], {
620
+ type: "application/pdf"
621
+ });
622
+ };
623
+
624
+ /**
625
+ * A host inline URL goes to the browser's native viewer. Without one, the
626
+ * loaded bytes become a local PDF Blob: a download URL is an attachment and
627
+ * would leave a native viewer empty.
628
+ */
611
629
  function PdfRenderer(props) {
612
630
  const messages = useUiMessages();
613
- const href = () => props.previewHref ?? props.downloadHref;
631
+ // A new Blob remounts the preview, so changed bytes show the new file. A revision refetch
632
+ // often returns the same bytes (the Assistant refetches on every tool step); keeping the
633
+ // Blob then keeps the reader's page instead of reloading the viewer.
634
+ const bytes = createMemo(() => props.content, undefined, {
635
+ equals: (previous, next) => previous.encoding === next.encoding && previous.content === next.content
636
+ });
637
+ const blob = createMemo(() => props.previewHref || !bytes().content ? null : pdfBlob(bytes()));
614
638
  return _$createComponent(Show, {
615
639
  get when() {
616
- return href();
640
+ return props.previewHref;
617
641
  },
618
642
  get fallback() {
619
- return _$createComponent(Placeholder, {
620
- icon: "ti ti-file-type-pdf",
621
- title: "PDF",
622
- get description() {
623
- return messages().noInlinePreview;
624
- }
643
+ return _$createComponent(Show, {
644
+ keyed: true,
645
+ get when() {
646
+ return blob();
647
+ },
648
+ get fallback() {
649
+ return _$createComponent(Placeholder, {
650
+ icon: "ti ti-file-type-pdf",
651
+ title: "PDF",
652
+ get description() {
653
+ return messages().noInlinePreview;
654
+ }
655
+ });
656
+ },
657
+ children: pdf => _$createComponent(PdfPreview, {
658
+ autoLoad: true,
659
+ get title() {
660
+ return props.file.path.slice(props.file.path.lastIndexOf("/") + 1);
661
+ },
662
+ request: async () => pdf,
663
+ "class": "k2b-content-file-view__pdf"
664
+ })
625
665
  });
626
666
  },
627
667
  children: href => _$ssr(_tmpl$18, _$ssrAttribute("data", _$escape(href(), true), false), _$ssrAttribute("aria-label", _$escape(props.file.path, true), false))
@@ -753,8 +793,7 @@ export default function FileView(props) {
753
793
  onError: error => toast.error(error.message)
754
794
  });
755
795
  const nativePreviewHref = createMemo(() => {
756
- const kind = getFileViewPreviewKind(props.file);
757
- const href = props.previewHref ?? (kind === "pdf" ? props.downloadHref : null);
796
+ const href = props.previewHref;
758
797
  if (!href) return null;
759
798
  const separator = href.includes("?") ? "&" : "?";
760
799
  return `${href}${separator}preview-revision=${nativeRevision()}`;
@@ -1 +1 @@
1
- {"version":3,"names":[],"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
+ {"version":3,"names":[],"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 PdfPreview from \"./PdfPreview\";\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 /** Download actions only; never a preview source, because an attachment response does not render inline. */\n downloadHref?: string | null;\n /** App-specific renderers matched before the built-ins for this instance. */\n renderers?: readonly FileViewRenderer[];\n /** Reports local edit state so a parent browser can guard navigation. */\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\nexport type FileViewRendererProps = {\n /** Read-only excerpt limit; omitted renders the complete preview. */\n previewLines?: number;\n onExpandPreview?: () => void;\n headingScale?: \"compact\" | \"normal\" | \"large\";\n /** Optional browser-local preference scope, owned by the host. */\n previewPreferencesKey?: string;\n file: FileViewFile;\n content: FileViewContent;\n previewHref: string | null;\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n onPreviewError?: () => void;\n downloadHref: string | null;\n /** Null when the file is read-only. */\n editor: {\n draft: () => string;\n setDraft: (value: string) => void;\n dirty: () => boolean;\n saving: () => boolean;\n save: () => Promise<void>;\n } | null;\n};\n\nexport type FileViewRenderer = {\n id: string;\n match: (file: FileViewFile, content: FileViewContent) => boolean;\n component: Component<FileViewRendererProps>;\n /** Text renderers that support the edit affordance when `save` is present. */\n editable?: boolean;\n};\n\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\nconst pdfBlob = (content: FileViewContent): Blob => {\n if (content.encoding === \"utf8\") return new Blob([content.content], { type: \"application/pdf\" });\n const binary = atob(content.content);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return new Blob([bytes], { type: \"application/pdf\" });\n};\n\n/**\n * A host inline URL goes to the browser's native viewer. Without one, the\n * loaded bytes become a local PDF Blob: a download URL is an attachment and\n * would leave a native viewer empty.\n */\nfunction PdfRenderer(props: FileViewRendererProps) {\n const messages = useUiMessages();\n // A new Blob remounts the preview, so changed bytes show the new file. A revision refetch\n // often returns the same bytes (the Assistant refetches on every tool step); keeping the\n // Blob then keeps the reader's page instead of reloading the viewer.\n const bytes = createMemo(() => props.content, undefined, {\n equals: (previous, next) => previous.encoding === next.encoding && previous.content === next.content,\n });\n const blob = createMemo(() => (props.previewHref || !bytes().content ? null : pdfBlob(bytes())));\n return (\n <Show\n when={props.previewHref}\n fallback={\n <Show\n keyed\n when={blob()}\n fallback={<Placeholder icon=\"ti ti-file-type-pdf\" title=\"PDF\" description={messages().noInlinePreview} />}\n >\n {(pdf) => (\n <PdfPreview\n autoLoad\n title={props.file.path.slice(props.file.path.lastIndexOf(\"/\") + 1)}\n request={async () => pdf}\n class=\"k2b-content-file-view__pdf\"\n />\n )}\n </Show>\n }\n >\n {(href) => <object data={href()} type=\"application/pdf\" class=\"k2b-content-file-view__pdf\" aria-label={props.file.path} />}\n </Show>\n );\n}\n\nfunction AudioRenderer(props: FileViewRendererProps) {\n const 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 href = props.previewHref;\n if (!href) return null;\n const separator = href.includes(\"?\") ? \"&\" : \"?\";\n return `${href}${separator}preview-revision=${nativeRevision()}`;\n });\n const browserPreviewContent = createMemo<FileViewContent | null>(() => {\n const kind = getFileViewPreviewKind(props.file);\n if (kind !== \"image\" && kind !== \"pdf\" && kind !== \"audio\" && kind !== \"video\") return null;\n const href = nativePreviewHref();\n if (!href) return null;\n\n const candidate: FileViewContent = {\n encoding: \"base64\",\n content: \"\",\n mediaType: props.file.mediaType ?? \"application/octet-stream\",\n };\n return instanceRenderers().some((renderer) => renderer.match(props.file, candidate)) ? null : candidate;\n });\n const [content, { refetch }] = createResource(\n () => (browserPreviewContent() ? null : { path: props.file.path, revision: props.revision }),\n async () => {\n saveMutation.abort();\n // `load` is an imperative source adapter. Host signal reads inside it\n // must not turn this resource into a hidden reactive feedback loop.\n const loaded = await untrack(() => props.load());\n const loadedDraft = loaded.encoding === \"utf8\" ? loaded.content : \"\";\n setDraft(loadedDraft);\n setSavedDraft(loadedDraft);\n return loaded;\n },\n );\n createEffect(() => {\n if (!props.registerRefresh) return;\n const unregister = props.registerRefresh(async () => {\n if (browserPreviewContent()) setNativeRevision((value) => value + 1);\n else await refetch();\n });\n if (unregister) onCleanup(unregister);\n });\n 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":[]}
@@ -349,7 +349,7 @@ export function AutocompleteSelect(props) {
349
349
  return props.name;
350
350
  },
351
351
  children: name => _$ssr(_tmpl$8, _$ssrAttribute("name", _$escape(name(), true), false) + _$ssrAttribute("value", _$escape(value() ?? "", true), false))
352
- })), loader.loading() ? _$escape(props.checkingText ?? messages().checkingOptions) : match() ? `Match: ${_$escape(formatValue(match()))}` : _$escape(internalError() ?? ""), _$ssrAttribute("aria-label", typeof props.label === "string" ? _$escape(props.label, true) : _$escape(messages().options, true), false), _$escape(_$createComponent(Show, {
352
+ })), loader.loading() ? _$escape(props.checkingText ?? messages().checkingOptions) : match() ? `Match: ${_$escape(formatValue(match()))}` : _$escape(internalError() ?? ""), _$ssrAttribute("aria-label", typeof props.label === "string" ? _$escape(props.label, true) : _$escape(props["aria-label"] ?? messages().options, true), false), _$escape(_$createComponent(Show, {
353
353
  get when() {
354
354
  return (props.groups?.length ?? 0) > 0;
355
355
  },