@k2b/ui 0.51.0 → 0.52.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 (206) hide show
  1. package/dist/base.css +3 -0
  2. package/dist/browser/actions/Toolbar.js +8 -2
  3. package/dist/browser/actions/Toolbar.js.map +1 -1
  4. package/dist/browser/charts/core/bar-labels.js +5 -0
  5. package/dist/browser/charts/core/bar-labels.js.map +1 -0
  6. package/dist/browser/charts/core/bubble.js +166 -0
  7. package/dist/browser/charts/core/bubble.js.map +1 -0
  8. package/dist/browser/charts/core/default-styles.js +83 -0
  9. package/dist/browser/charts/core/default-styles.js.map +1 -0
  10. package/dist/browser/charts/core/funnel-layout.js +79 -0
  11. package/dist/browser/charts/core/funnel-layout.js.map +1 -0
  12. package/dist/browser/charts/core/funnel.js +27 -0
  13. package/dist/browser/charts/core/funnel.js.map +1 -0
  14. package/dist/browser/charts/core/index.js +6 -1
  15. package/dist/browser/charts/core/index.js.map +1 -1
  16. package/dist/browser/charts/core/pareto.js +120 -0
  17. package/dist/browser/charts/core/pareto.js.map +1 -0
  18. package/dist/browser/charts/core/radar.js +101 -0
  19. package/dist/browser/charts/core/radar.js.map +1 -0
  20. package/dist/browser/charts/core/registry.js +11 -1
  21. package/dist/browser/charts/core/registry.js.map +1 -1
  22. package/dist/browser/charts/core/render-size.js +3 -1
  23. package/dist/browser/charts/core/render-size.js.map +1 -1
  24. package/dist/browser/charts/core/render.js +19 -0
  25. package/dist/browser/charts/core/render.js.map +1 -1
  26. package/dist/browser/charts/core/snapshot.js +1 -1
  27. package/dist/browser/charts/core/snapshot.js.map +1 -1
  28. package/dist/browser/charts/core/svg-barGauge.js +67 -0
  29. package/dist/browser/charts/core/svg-barGauge.js.map +1 -0
  30. package/dist/browser/charts/core/svg-boxplot.js +127 -0
  31. package/dist/browser/charts/core/svg-boxplot.js.map +1 -0
  32. package/dist/browser/charts/core/svg-common.js +1065 -0
  33. package/dist/browser/charts/core/svg-common.js.map +1 -0
  34. package/dist/browser/charts/core/svg-gauge.js +185 -0
  35. package/dist/browser/charts/core/svg-gauge.js.map +1 -0
  36. package/dist/browser/charts/core/svg-heatmap.js +80 -0
  37. package/dist/browser/charts/core/svg-heatmap.js.map +1 -0
  38. package/dist/browser/charts/core/svg-histogram.js +73 -0
  39. package/dist/browser/charts/core/svg-histogram.js.map +1 -0
  40. package/dist/browser/charts/core/svg-renderers.js +9 -1777
  41. package/dist/browser/charts/core/svg-renderers.js.map +1 -1
  42. package/dist/browser/charts/core/svg-scatter.js +114 -0
  43. package/dist/browser/charts/core/svg-scatter.js.map +1 -0
  44. package/dist/browser/charts/core/treemap.js +138 -0
  45. package/dist/browser/charts/core/treemap.js.map +1 -0
  46. package/dist/browser/charts/description.js.map +1 -1
  47. package/dist/browser/content/ChartRoot.js +21 -7
  48. package/dist/browser/content/ChartRoot.js.map +1 -1
  49. package/dist/browser/content/ChartSnapshotView.js +4 -1
  50. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  51. package/dist/browser/content/DataTable.js +186 -193
  52. package/dist/browser/content/DataTable.js.map +1 -1
  53. package/dist/browser/content/Lightbox.js +55 -23
  54. package/dist/browser/content/Lightbox.js.map +1 -1
  55. package/dist/browser/content/ThumbnailStrip.js +174 -0
  56. package/dist/browser/content/ThumbnailStrip.js.map +1 -0
  57. package/dist/browser/content/chart-bar.js +98 -0
  58. package/dist/browser/content/chart-bar.js.map +1 -1
  59. package/dist/browser/content/chart-inspection-core.js +28 -8
  60. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  61. package/dist/browser/content/chart-message-catalog.js +18 -0
  62. package/dist/browser/content/chart-message-catalog.js.map +1 -1
  63. package/dist/browser/content/index.js +1 -0
  64. package/dist/browser/content/index.js.map +1 -1
  65. package/dist/browser/content/thumbnail-strip-messages.js +24 -0
  66. package/dist/browser/content/thumbnail-strip-messages.js.map +1 -0
  67. package/dist/browser/inputs/ChoiceInputs.js +132 -101
  68. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  69. package/dist/browser/inputs/index.js +1 -0
  70. package/dist/browser/inputs/index.js.map +1 -1
  71. package/dist/browser/inputs/markdown/MarkdownSelectionToolbar.js +330 -0
  72. package/dist/browser/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
  73. package/dist/browser/internal/field.js +96 -77
  74. package/dist/browser/internal/field.js.map +1 -1
  75. package/dist/browser/layout/AppWorkspace.js +7 -5
  76. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  77. package/dist/browser/layout/PanelDialog.js +92 -68
  78. package/dist/browser/layout/PanelDialog.js.map +1 -1
  79. package/dist/browser/surfaces/StatCell.js +82 -70
  80. package/dist/browser/surfaces/StatCell.js.map +1 -1
  81. package/dist/browser/surfaces/stat-cell-messages.js +4 -2
  82. package/dist/browser/surfaces/stat-cell-messages.js.map +1 -1
  83. package/dist/browser/widgets/DashboardFrame.js +93 -88
  84. package/dist/browser/widgets/DashboardFrame.js.map +1 -1
  85. package/dist/ssr/actions/Toolbar.js +8 -2
  86. package/dist/ssr/actions/Toolbar.js.map +1 -1
  87. package/dist/ssr/charts/core/bar-labels.js +5 -0
  88. package/dist/ssr/charts/core/bar-labels.js.map +1 -0
  89. package/dist/ssr/charts/core/bubble.js +166 -0
  90. package/dist/ssr/charts/core/bubble.js.map +1 -0
  91. package/dist/ssr/charts/core/default-styles.js +83 -0
  92. package/dist/ssr/charts/core/default-styles.js.map +1 -0
  93. package/dist/ssr/charts/core/funnel-layout.js +79 -0
  94. package/dist/ssr/charts/core/funnel-layout.js.map +1 -0
  95. package/dist/ssr/charts/core/funnel.js +27 -0
  96. package/dist/ssr/charts/core/funnel.js.map +1 -0
  97. package/dist/ssr/charts/core/index.js +6 -1
  98. package/dist/ssr/charts/core/index.js.map +1 -1
  99. package/dist/ssr/charts/core/pareto.js +120 -0
  100. package/dist/ssr/charts/core/pareto.js.map +1 -0
  101. package/dist/ssr/charts/core/radar.js +101 -0
  102. package/dist/ssr/charts/core/radar.js.map +1 -0
  103. package/dist/ssr/charts/core/registry.js +11 -1
  104. package/dist/ssr/charts/core/registry.js.map +1 -1
  105. package/dist/ssr/charts/core/render-size.js +3 -1
  106. package/dist/ssr/charts/core/render-size.js.map +1 -1
  107. package/dist/ssr/charts/core/render.js +19 -0
  108. package/dist/ssr/charts/core/render.js.map +1 -1
  109. package/dist/ssr/charts/core/snapshot.js +1 -1
  110. package/dist/ssr/charts/core/snapshot.js.map +1 -1
  111. package/dist/ssr/charts/core/svg-barGauge.js +67 -0
  112. package/dist/ssr/charts/core/svg-barGauge.js.map +1 -0
  113. package/dist/ssr/charts/core/svg-boxplot.js +127 -0
  114. package/dist/ssr/charts/core/svg-boxplot.js.map +1 -0
  115. package/dist/ssr/charts/core/svg-common.js +1065 -0
  116. package/dist/ssr/charts/core/svg-common.js.map +1 -0
  117. package/dist/ssr/charts/core/svg-gauge.js +185 -0
  118. package/dist/ssr/charts/core/svg-gauge.js.map +1 -0
  119. package/dist/ssr/charts/core/svg-heatmap.js +80 -0
  120. package/dist/ssr/charts/core/svg-heatmap.js.map +1 -0
  121. package/dist/ssr/charts/core/svg-histogram.js +73 -0
  122. package/dist/ssr/charts/core/svg-histogram.js.map +1 -0
  123. package/dist/ssr/charts/core/svg-renderers.js +9 -1777
  124. package/dist/ssr/charts/core/svg-renderers.js.map +1 -1
  125. package/dist/ssr/charts/core/svg-scatter.js +114 -0
  126. package/dist/ssr/charts/core/svg-scatter.js.map +1 -0
  127. package/dist/ssr/charts/core/treemap.js +138 -0
  128. package/dist/ssr/charts/core/treemap.js.map +1 -0
  129. package/dist/ssr/charts/description.js.map +1 -1
  130. package/dist/ssr/content/ChartRoot.js +21 -7
  131. package/dist/ssr/content/ChartRoot.js.map +1 -1
  132. package/dist/ssr/content/ChartSnapshotView.js +1 -0
  133. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  134. package/dist/ssr/content/DataTable.js +12 -16
  135. package/dist/ssr/content/DataTable.js.map +1 -1
  136. package/dist/ssr/content/Lightbox.js +32 -3
  137. package/dist/ssr/content/Lightbox.js.map +1 -1
  138. package/dist/ssr/content/ThumbnailStrip.js +103 -0
  139. package/dist/ssr/content/ThumbnailStrip.js.map +1 -0
  140. package/dist/ssr/content/chart-bar.js +98 -0
  141. package/dist/ssr/content/chart-bar.js.map +1 -1
  142. package/dist/ssr/content/chart-inspection-core.js +28 -8
  143. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  144. package/dist/ssr/content/chart-message-catalog.js +18 -0
  145. package/dist/ssr/content/chart-message-catalog.js.map +1 -1
  146. package/dist/ssr/content/index.js +1 -0
  147. package/dist/ssr/content/index.js.map +1 -1
  148. package/dist/ssr/content/thumbnail-strip-messages.js +24 -0
  149. package/dist/ssr/content/thumbnail-strip-messages.js.map +1 -0
  150. package/dist/ssr/inputs/ChoiceInputs.js +55 -40
  151. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  152. package/dist/ssr/inputs/index.js +1 -0
  153. package/dist/ssr/inputs/index.js.map +1 -1
  154. package/dist/ssr/inputs/markdown/MarkdownSelectionToolbar.js +293 -0
  155. package/dist/ssr/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
  156. package/dist/ssr/internal/field.js +36 -24
  157. package/dist/ssr/internal/field.js.map +1 -1
  158. package/dist/ssr/layout/AppWorkspace.js +5 -1
  159. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  160. package/dist/ssr/layout/PanelDialog.js +40 -26
  161. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  162. package/dist/ssr/surfaces/StatCell.js +29 -18
  163. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  164. package/dist/ssr/surfaces/stat-cell-messages.js +4 -2
  165. package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -1
  166. package/dist/ssr/widgets/DashboardFrame.js +6 -11
  167. package/dist/ssr/widgets/DashboardFrame.js.map +1 -1
  168. package/dist/styles.css +1 -1
  169. package/dist/types/actions/Toolbar.d.ts +2 -0
  170. package/dist/types/charts/core/bar-labels.d.ts +1 -0
  171. package/dist/types/charts/core/bubble.d.ts +66 -0
  172. package/dist/types/charts/core/default-styles.d.ts +1 -0
  173. package/dist/types/charts/core/funnel-layout.d.ts +43 -0
  174. package/dist/types/charts/core/funnel.d.ts +13 -0
  175. package/dist/types/charts/core/index.d.ts +6 -1
  176. package/dist/types/charts/core/pareto.d.ts +40 -0
  177. package/dist/types/charts/core/radar.d.ts +47 -0
  178. package/dist/types/charts/core/registry.d.ts +10 -0
  179. package/dist/types/charts/core/render-size.d.ts +1 -1
  180. package/dist/types/charts/core/svg-barGauge.d.ts +3 -0
  181. package/dist/types/charts/core/svg-boxplot.d.ts +18 -0
  182. package/dist/types/charts/core/svg-common.d.ts +612 -0
  183. package/dist/types/charts/core/svg-gauge.d.ts +6 -0
  184. package/dist/types/charts/core/svg-heatmap.d.ts +6 -0
  185. package/dist/types/charts/core/svg-histogram.d.ts +16 -0
  186. package/dist/types/charts/core/svg-renderers.d.ts +8 -612
  187. package/dist/types/charts/core/svg-scatter.d.ts +23 -0
  188. package/dist/types/charts/core/treemap.d.ts +45 -0
  189. package/dist/types/charts/description.d.ts +63 -0
  190. package/dist/types/content/ChartRoot.d.ts +1 -1
  191. package/dist/types/content/Lightbox.d.ts +2 -0
  192. package/dist/types/content/ThumbnailStrip.d.ts +29 -0
  193. package/dist/types/content/chart-bar.d.ts +38 -2
  194. package/dist/types/content/chart-inspection-core.d.ts +7 -0
  195. package/dist/types/content/chart-inspection.d.ts +1 -0
  196. package/dist/types/content/chart-message-catalog.d.ts +8 -0
  197. package/dist/types/content/index.d.ts +1 -0
  198. package/dist/types/content/thumbnail-strip-messages.d.ts +10 -0
  199. package/dist/types/inputs/ChoiceInputs.d.ts +2 -0
  200. package/dist/types/inputs/index.d.ts +2 -0
  201. package/dist/types/inputs/markdown/MarkdownSelectionToolbar.d.ts +19 -0
  202. package/dist/types/internal/field.d.ts +2 -0
  203. package/dist/types/layout/PanelDialog.d.ts +5 -0
  204. package/dist/types/surfaces/stat-cell-messages.d.ts +1 -0
  205. package/dist/types/widgets/DashboardFrame.d.ts +4 -1
  206. package/package.json +2 -2
@@ -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 Match,\n on,\n onCleanup,\n onMount,\n Show,\n Switch,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { announce } from \"../feedback/announce\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PanelHeader } from \"../layout/PanelHeader\";\nimport { DeltaBadge } from \"../surfaces/delta-badge\";\nimport { Paper } from \"../surfaces/Paper\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { StatusBadge } from \"../surfaces/StatusBadge\";\nimport type { CollectionSelection } from \"./collection-selection\";\nimport {\n type DataTableTypedColumn,\n formatTableNumber,\n groupRows,\n isEmptyCell,\n isNumericColumnType,\n readTableValue,\n tableCellText,\n} from \"./data-table-columns\";\nimport { useDataTableMessages } from \"./data-table-messages\";\nimport { FlowAmount } from \"./FlowAmount\";\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 * Keeps each value on one line, so the column is at least as wide as its\n * longest value. For dates, times, numbers, amounts, and short codes.\n * Defaults to true when the column's first value is a number or date. The\n * default cell wrapper already keeps every value on one line; this option\n * decides wrapping for content under a custom `cellContentClass`, and a\n * `white-space` that class sets itself wins.\n */\n nowrap?: boolean;\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 /** What the column holds; see `DataTableColumnType`. */\n type?: DataTableTypedColumn[\"type\"];\n format?: DataTableTypedColumn[\"format\"];\n /** Labels and tones of a status column, by stored value. */\n states?: DataTableTypedColumn[\"states\"];\n /** The value a bar column fills its track at; defaults to its largest value. */\n max?: number;\n /** The zone a date column with a time reads in; defaults to the reader's. */\n timeZone?: string;\n /** How a delta column reads and rates its change. */\n delta?: DataTableTypedColumn[\"delta\"];\n /**\n * How much a narrow table needs the column: 1 (default) always shows; 3 hides below a table width of 560 px,\n * 2 below 420 px. Hidden values stay one tap away in the row's details.\n */\n priority?: 1 | 2 | 3;\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 /**\n * Sorts on the client instead: sortable headers become buttons that report the\n * next order, with the same look and order of directions as `sortHref`.\n */\n onSortChange?: (next: DataTableSort) => void;\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 loading?: boolean;\n /** Initial placeholder count, clamped to an integer from 1 to 50. Defaults to 5. */\n loadingRows?: number;\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 /** Additional classes for the scrolling region, such as `k2b-detail-trail`. */\n scrollClass?: string;\n scrollPreserveKey?: string | false;\n /**\n * The id of the column whose values split the rows into groups, each its own `<tbody>` under a row with the\n * group's value and count, in the order the groups first appear.\n */\n groupBy?: string;\n /**\n * The host's search text. With no rows left, the table says that nothing matches it and offers to clear it\n * through `onClearQuery`, instead of `empty`. Filter the rows with `filterRows`.\n */\n query?: string;\n onClearQuery?: () => void;\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 = (\n value: unknown,\n locale: string,\n numbers: Intl.NumberFormat,\n messages: ReturnType<ReturnType<typeof useUiMessages>>,\n): 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 // Numbers read in the reader's language: grouping and decimal mark follow the locale, at most three decimals.\n if (typeof value === \"number\" || typeof value === \"bigint\") return numbers.format(Object.is(value, -0) ? 0 : 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 dataTableMessages = useDataTableMessages();\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 loadingRows = () => Math.min(50, Math.max(1, Math.trunc(Number.isNaN(props.loadingRows) ? 5 : (props.loadingRows ?? 5))));\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 if (event.button !== 0) return;\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 // The track's own pointerup or pointercancel ends the hold.\n suppressTextSelection(event.pointerId);\n scrollFromPointer(event, axis);\n };\n\n const valueOf = (row: T, col: DataTableColumn<T>) => readTableValue(row, col);\n\n const columnPresentation = createMemo(() => {\n const presentation = new Map<string, { align: NonNullable<DataTableColumn<T>[\"align\"]>; nowrap: boolean }>();\n for (const col of props.columns) {\n // A typed column says what it holds; only an untyped one is read from its first value.\n let numeric = isNumericColumnType(col.type);\n let date = col.type === \"date\";\n if (!col.type && (col.align === undefined || col.nowrap === undefined)) {\n for (const row of props.rows) {\n const value = valueOf(row, col);\n if (value === null || value === undefined || value === \"\") continue;\n numeric = typeof value === \"number\" || typeof value === \"bigint\";\n date = value instanceof Date;\n break;\n }\n }\n presentation.set(col.id, { align: col.align ?? (numeric ? \"right\" : \"left\"), nowrap: col.nowrap ?? (numeric || date) });\n }\n return presentation;\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 = columnPresentation().get(col.id)?.align ?? \"left\";\n return align === \"left\" ? undefined : align;\n };\n\n const nowrapAttr = (col: DataTableColumn<T>) => (columnPresentation().get(col.id)?.nowrap ? \"true\" : undefined);\n /** Text columns wrap inside their cell; every other value keeps one line. */\n const wrapAttr = (col: DataTableColumn<T>) => (col.type === \"text\" && col.nowrap !== true ? \"true\" : undefined);\n const priorityAttr = (col: DataTableColumn<T>) => (col.priority === 2 || col.priority === 3 ? String(col.priority) : undefined);\n /** The lowest priority present: 3 shows the details toggle below 560 px, 2 below 420 px. */\n const detailsPriority = createMemo(() => {\n const priorities = props.columns.map((col) => col.priority ?? 1);\n return priorities.includes(3) ? \"3\" : priorities.includes(2) ? \"2\" : undefined;\n });\n const hiddenColumns = () => props.columns.filter((col) => priorityAttr(col));\n const columnCount = () => props.columns.length + (detailsPriority() ? 1 : 0);\n const [openDetails, setOpenDetails] = createSignal<ReadonlySet<T>>(new Set());\n const toggleDetails = (row: T) =>\n setOpenDetails((open) => {\n const next = new Set(open);\n if (!next.delete(row)) next.add(row);\n return next;\n });\n /** A bar column fills its track at `max`, or else at its largest value. */\n const barMax = createMemo(() => {\n const max = new Map<string, number>();\n for (const col of props.columns) {\n if (col.type !== \"bar\") continue;\n if (col.max !== undefined && col.max > 0) {\n max.set(col.id, col.max);\n continue;\n }\n let largest = 0;\n for (const row of props.rows) {\n const value = Number(valueOf(row, col));\n if (Number.isFinite(value)) largest = Math.max(largest, Math.abs(value));\n }\n max.set(col.id, largest);\n }\n return max;\n });\n const groups = createMemo(() => {\n const col = props.groupBy ? props.columns.find((entry) => entry.id === props.groupBy) : undefined;\n return col ? groupRows(props.rows, col, locale()) : null;\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 by default: server-rendered tables keep the order in the\n * URL. Client tables pass onSortChange instead. Clicking the active column\n * flips its direction.\n */\n const nextSortFor = (key: string): DataTableSort => ({\n key,\n direction: props.sort?.key === key && props.sort?.direction === \"desc\" ? \"asc\" : \"desc\",\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.onSortChange && !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 key = sortKeyOf(col);\n // Only how a column sorts decides the element. The order lives in its attributes, so a header button keeps\n // keyboard focus when a click sorts the table and the reader can press it again to reverse the order.\n const mode = createMemo(() => (!key ? null : props.sortHref ? \"link\" : props.onSortChange ? \"button\" : null));\n const active = () => key !== null && props.sort?.key === key;\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 const line = () => (\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 ${active() && props.sort?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={active() ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </span>\n );\n\n return (\n <Switch\n fallback={\n <div class=\"k2b-data-table__header-content\" data-align={alignAttr(col)}>\n {title()}\n </div>\n }\n >\n <Match when={mode() === \"link\"}>\n <a\n href={key ? props.sortHref?.(nextSortFor(key)) : undefined}\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n >\n {line()}\n </a>\n </Match>\n <Match when={mode() === \"button\"}>\n <button\n type=\"button\"\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n onClick={() => key && props.onSortChange?.(nextSortFor(key))}\n >\n {line()}\n </button>\n </Match>\n </Switch>\n );\n };\n\n const numberFormat = createMemo(() => new Intl.NumberFormat(locale()));\n const renderValueDefault = (value: unknown) => defaultRender(value, locale(), numberFormat(), messages());\n /** A typed column shows its value the way its type reads; an untyped one falls back to the plain rendering. */\n const renderTypedValue = (col: DataTableColumn<T>, value: unknown): JSX.Element => {\n if (!col.type || isEmptyCell(value)) return renderValueDefault(value);\n if (col.type === \"status\") {\n const state = col.states?.[String(value)];\n return state ? <StatusBadge tone={state.tone} label={state.label} variant=\"dot\" /> : String(value);\n }\n if (col.type === \"flow\" && col.format?.currency && Number.isFinite(Number(value)))\n return <FlowAmount value={Number(value)} currency={col.format.currency} decimals={col.format.decimals} />;\n if (col.type === \"delta\" && Number.isFinite(Number(value)))\n return <DeltaBadge delta={{ value: Number(value), unit: col.delta?.unit, better: col.delta?.better }} />;\n if (col.type === \"bar\") {\n const number = Number(value);\n const max = barMax().get(col.id) ?? 0;\n if (!Number.isFinite(number)) return String(value);\n return (\n <span class=\"k2b-data-table__bar\">\n {formatTableNumber(number, col, locale())}\n <span class=\"k2b-data-table__bar-track\" aria-hidden=\"true\">\n <span style={{ width: `${max > 0 ? Math.min(100, (Math.abs(number) / max) * 100) : 0}%` }} />\n </span>\n </span>\n );\n }\n return tableCellText(value, col, locale());\n };\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 // A heading given as a JSX node lives in the head; each details line needs its own copy, so it takes text or a fresh call.\n const detailLabel = (col: DataTableColumn<T>) =>\n typeof col.header === \"function\"\n ? col.header({ col })\n : typeof col.header === \"string\" || typeof col.header === \"number\"\n ? col.header\n : col.id;\n const cellContent = (row: T, col: DataTableColumn<T>, value: unknown) =>\n props.renderCell ? props.renderCell({ row, col, value, render: (v) => renderTypedValue(col, v) }) : renderTypedValue(col, value);\n\n /** `last` marks the final row of its body when details rows follow every row, so the frame keeps the only edge. */\n const renderRow = (row: T, last: () => boolean) => {\n const id = () => rowId(row);\n const isSelected = () =>\n props.selection ? props.selection.selected().has(id() ?? \"\") : props.selectedRowId && id() === props.selectedRowId;\n const detailsId = `k2b-data-table-${createUniqueId()}-details`;\n const open = () => openDetails().has(row);\n return (\n <>\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 data-details-open={open() ? \"true\" : undefined}\n data-last={detailsPriority() && last() ? \"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-nowrap={nowrapAttr(col)}\n data-wrap={wrapAttr(col)}\n data-align={alignAttr(col)}\n data-priority={priorityAttr(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()}>{cellContent(row, col, value())}</div>\n </td>\n );\n }}\n </For>\n <Show when={detailsPriority()}>\n <td class=\"k2b-data-table__details-toggle\">\n <button\n type=\"button\"\n class=\"k2b-data-table__details-button\"\n aria-expanded={open()}\n aria-controls={detailsId}\n aria-label={dataTableMessages().showDetails}\n onClick={() => toggleDetails(row)}\n >\n <i class={`ti ${open() ? \"ti-chevron-up\" : \"ti-chevron-down\"}`} aria-hidden=\"true\" />\n </button>\n </td>\n </Show>\n </tr>\n <Show when={detailsPriority()}>\n {/* Only the values the table's width hides appear here; the rest are in the row above. */}\n <tr class=\"k2b-data-table__details\" id={detailsId} hidden={!open()}>\n <td colspan={columnCount()}>\n <dl>\n <For each={hiddenColumns()}>\n {(col) => (\n <div data-priority={priorityAttr(col)}>\n <dt>{detailLabel(col)}</dt>\n <dd>{cellContent(row, col, valueOf(row, col))}</dd>\n </div>\n )}\n </For>\n </dl>\n </td>\n </tr>\n </Show>\n </>\n );\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 // Announced once per wait, outside the region that `aria-busy` keeps quiet.\n createEffect(\n on(\n () => !!props.loading && props.rows.length === 0,\n (waiting) => {\n if (waiting) announce(dataTableMessages().loadingRows);\n },\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={<>{dataTableMessages().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-priorities={detailsPriority()}\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 ?? dataTableMessages().dataTable)}\n aria-labelledby={labelledBy()}\n aria-busy={props.loading ? \"true\" : undefined}\n tabIndex={0}\n class={`k2b-table-wrap${props.scrollClass ? ` ${props.scrollClass}` : \"\"}`}\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 <Show when={props.loading}>\n {/* Names the table while it waits; the announcement goes through the shared live region outside the busy region. */}\n <caption class=\"k2b-sr-only\">{dataTableMessages().loadingRows}</caption>\n </Show>\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-priority={priorityAttr(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 <Show when={detailsPriority()}>\n <th scope=\"col\" class=\"k2b-data-table__details-toggle\">\n <span class=\"k2b-sr-only\">{dataTableMessages().details}</span>\n </th>\n </Show>\n </tr>\n </thead>\n <Show\n when={props.rows.length > 0}\n fallback={\n <tbody>\n <Show\n when={props.loading}\n fallback={\n <tr>\n <Show\n when={props.query?.trim()}\n fallback={\n <td class=\"k2b-data-table__empty\" colspan={columnCount()}>\n <Placeholder description={<>{props.empty ?? dataTableMessages().noRecords}</>} />\n </td>\n }\n >\n {(query) => (\n <td class=\"k2b-data-table__no-match\" colspan={columnCount()}>\n {dataTableMessages().noMatch({ query: query() })}{\" \"}\n <Show when={props.onClearQuery}>\n <button type=\"button\" class=\"k2b-data-table__clear-query\" onClick={() => props.onClearQuery?.()}>\n {dataTableMessages().clearSearch}\n </button>\n </Show>\n </td>\n )}\n </Show>\n </tr>\n }\n >\n <For each={Array.from({ length: loadingRows() })}>\n {() => (\n <tr class=\"k2b-data-table__row\" data-loading=\"true\" aria-hidden=\"true\">\n <For each={props.columns}>\n {(col) => (\n <td data-align={alignAttr(col)} data-priority={priorityAttr(col)}>\n <span class=\"k2b-data-table__skeleton\" />\n </td>\n )}\n </For>\n <Show when={detailsPriority()}>\n <td class=\"k2b-data-table__details-toggle\" />\n </Show>\n </tr>\n )}\n </For>\n {/* The spacer takes the spare height while loading too, so rows keep their height when data arrives. */}\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={columnCount()} />\n </tr>\n </Show>\n </Show>\n </tbody>\n }\n >\n <Show\n when={groups()}\n fallback={\n <tbody>\n <For each={props.rows}>{(row, index) => renderRow(row, () => index() === props.rows.length - 1)}</For>\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={columnCount()} />\n </tr>\n </Show>\n </tbody>\n }\n >\n {(list) => (\n <>\n <For each={list()}>\n {(group) => (\n <tbody class=\"k2b-data-table__group\">\n <tr class=\"k2b-data-table__group-row\">\n <th scope=\"rowgroup\" colspan={columnCount()}>\n {group.label || \"—\"}\n <span class=\"k2b-data-table__group-count\">\n <span aria-hidden=\"true\">{group.rows.length}</span>\n <span class=\"k2b-sr-only\">, {dataTableMessages().rowCount({ count: group.rows.length })}</span>\n </span>\n </th>\n </tr>\n <For each={group.rows}>{(row, index) => renderRow(row, () => index() === group.rows.length - 1)}</For>\n </tbody>\n )}\n </For>\n <Show when={props.fillHeight}>\n <tbody aria-hidden=\"true\">\n <tr>\n <td class=\"k2b-data-table__fill\" colspan={columnCount()} />\n </tr>\n </tbody>\n </Show>\n </>\n )}\n </Show>\n </Show>\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-nowrap={nowrapAttr(col)}\n data-align={alignAttr(col)}\n data-priority={priorityAttr(col)}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {footer().renderCell\n ? footer().renderCell!({ col, value: value(), render: (v) => renderTypedValue(col, v) })\n : renderTypedValue(col, value())}\n </td>\n );\n }}\n </For>\n <Show when={detailsPriority()}>\n <td class=\"k2b-data-table__footer-cell k2b-data-table__details-toggle\" />\n </Show>\n </tr>\n {/* Totals of hidden columns stay readable under the totals row while the width hides them. */}\n <Show when={detailsPriority()}>\n <tr class=\"k2b-data-table__details\" data-footer=\"true\">\n <td colspan={columnCount()}>\n <dl>\n <For each={hiddenColumns()}>\n {(col) => (\n <div data-priority={priorityAttr(col)}>\n <dt>{detailLabel(col)}</dt>\n <dd>\n {footer().renderCell\n ? footer().renderCell!({\n col,\n value: footer().values?.[col.id],\n render: (v) => renderTypedValue(col, v),\n })\n : renderTypedValue(col, footer().values?.[col.id])}\n </dd>\n </div>\n )}\n </For>\n </dl>\n </td>\n </tr>\n </Show>\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 Match,\n on,\n onCleanup,\n onMount,\n Show,\n Switch,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { announce } from \"../feedback/announce\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PanelHeader } from \"../layout/PanelHeader\";\nimport { DeltaBadge } from \"../surfaces/delta-badge\";\nimport { Paper } from \"../surfaces/Paper\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { StatusBadge } from \"../surfaces/StatusBadge\";\nimport type { CollectionSelection } from \"./collection-selection\";\nimport {\n type DataTableTypedColumn,\n formatTableNumber,\n groupRows,\n isEmptyCell,\n isNumericColumnType,\n readTableValue,\n tableCellText,\n} from \"./data-table-columns\";\nimport { useDataTableMessages } from \"./data-table-messages\";\nimport { FlowAmount } from \"./FlowAmount\";\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 * Keeps each value on one line, so the column is at least as wide as its\n * longest value. For dates, times, numbers, amounts, and short codes.\n * Defaults to true when the column's first value is a number or date. The\n * default cell wrapper already keeps every value on one line; this option\n * decides wrapping for content under a custom `cellContentClass`, and a\n * `white-space` that class sets itself wins.\n */\n nowrap?: boolean;\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 /** What the column holds; see `DataTableColumnType`. */\n type?: DataTableTypedColumn[\"type\"];\n format?: DataTableTypedColumn[\"format\"];\n /** Labels and tones of a status column, by stored value. */\n states?: DataTableTypedColumn[\"states\"];\n /** The value a bar column fills its track at; defaults to its largest value. */\n max?: number;\n /** The zone a date column with a time reads in; defaults to the reader's. */\n timeZone?: string;\n /** How a delta column reads and rates its change. */\n delta?: DataTableTypedColumn[\"delta\"];\n /**\n * How much a narrow table needs the column: 1 (default) always shows; 3 hides below a table width of 560 px,\n * 2 below 420 px. Hidden values stay one tap away in the row's details.\n */\n priority?: 1 | 2 | 3;\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 /**\n * Sorts on the client instead: sortable headers become buttons that report the\n * next order, with the same look and order of directions as `sortHref`.\n */\n onSortChange?: (next: DataTableSort) => void;\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 loading?: boolean;\n /** Initial placeholder count, clamped to an integer from 1 to 50. Defaults to 5. */\n loadingRows?: number;\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 /** Additional classes for the scrolling region, such as `k2b-detail-trail`. */\n scrollClass?: string;\n scrollPreserveKey?: string | false;\n /**\n * The id of the column whose values split the rows into groups, each its own `<tbody>` under a row with the\n * group's value and count, in the order the groups first appear.\n */\n groupBy?: string;\n /**\n * The host's search text. With no rows left, the table says that nothing matches it and offers to clear it\n * through `onClearQuery`, instead of `empty`. Filter the rows with `filterRows`.\n */\n query?: string;\n onClearQuery?: () => void;\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 = (\n value: unknown,\n locale: string,\n numbers: Intl.NumberFormat,\n messages: ReturnType<ReturnType<typeof useUiMessages>>,\n): 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 // Numbers read in the reader's language: grouping and decimal mark follow the locale, at most three decimals.\n if (typeof value === \"number\" || typeof value === \"bigint\") return numbers.format(Object.is(value, -0) ? 0 : 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 dataTableMessages = useDataTableMessages();\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 loadingRows = () => Math.min(50, Math.max(1, Math.trunc(Number.isNaN(props.loadingRows) ? 5 : (props.loadingRows ?? 5))));\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 if (event.button !== 0) return;\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 // The track's own pointerup or pointercancel ends the hold.\n suppressTextSelection(event.pointerId);\n scrollFromPointer(event, axis);\n };\n\n const valueOf = (row: T, col: DataTableColumn<T>) => readTableValue(row, col);\n\n const columnPresentation = createMemo(() => {\n const presentation = new Map<string, { align: NonNullable<DataTableColumn<T>[\"align\"]>; nowrap: boolean }>();\n for (const col of props.columns) {\n // A typed column says what it holds; only an untyped one is read from its first value.\n let numeric = isNumericColumnType(col.type);\n let date = col.type === \"date\";\n if (!col.type && (col.align === undefined || col.nowrap === undefined)) {\n for (const row of props.rows) {\n const value = valueOf(row, col);\n if (value === null || value === undefined || value === \"\") continue;\n numeric = typeof value === \"number\" || typeof value === \"bigint\";\n date = value instanceof Date;\n break;\n }\n }\n presentation.set(col.id, { align: col.align ?? (numeric ? \"right\" : \"left\"), nowrap: col.nowrap ?? (numeric || date) });\n }\n return presentation;\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 = columnPresentation().get(col.id)?.align ?? \"left\";\n return align === \"left\" ? undefined : align;\n };\n\n const nowrapAttr = (col: DataTableColumn<T>) => (columnPresentation().get(col.id)?.nowrap ? \"true\" : undefined);\n /** Text columns wrap inside their cell; every other value keeps one line. */\n const wrapAttr = (col: DataTableColumn<T>) => (col.type === \"text\" && col.nowrap !== true ? \"true\" : undefined);\n const priorityAttr = (col: DataTableColumn<T>) => (col.priority === 2 || col.priority === 3 ? String(col.priority) : undefined);\n /** The lowest priority present: 3 shows the details toggle below 560 px, 2 below 420 px. */\n const detailsPriority = createMemo(() => {\n const priorities = props.columns.map((col) => col.priority ?? 1);\n return priorities.includes(3) ? \"3\" : priorities.includes(2) ? \"2\" : undefined;\n });\n // Keep the row's last child a cell in both SSR and the browser. Trailing conditional anchors\n // change WebKit's rendered text between the header and the first body row.\n const headerColumns = createMemo(() => (detailsPriority() ? [...props.columns, null] : props.columns));\n const hiddenColumns = () => props.columns.filter((col) => priorityAttr(col));\n const columnCount = () => props.columns.length + (detailsPriority() ? 1 : 0);\n const [openDetails, setOpenDetails] = createSignal<ReadonlySet<T>>(new Set());\n const toggleDetails = (row: T) =>\n setOpenDetails((open) => {\n const next = new Set(open);\n if (!next.delete(row)) next.add(row);\n return next;\n });\n /** A bar column fills its track at `max`, or else at its largest value. */\n const barMax = createMemo(() => {\n const max = new Map<string, number>();\n for (const col of props.columns) {\n if (col.type !== \"bar\") continue;\n if (col.max !== undefined && col.max > 0) {\n max.set(col.id, col.max);\n continue;\n }\n let largest = 0;\n for (const row of props.rows) {\n const value = Number(valueOf(row, col));\n if (Number.isFinite(value)) largest = Math.max(largest, Math.abs(value));\n }\n max.set(col.id, largest);\n }\n return max;\n });\n const groups = createMemo(() => {\n const col = props.groupBy ? props.columns.find((entry) => entry.id === props.groupBy) : undefined;\n return col ? groupRows(props.rows, col, locale()) : null;\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 by default: server-rendered tables keep the order in the\n * URL. Client tables pass onSortChange instead. Clicking the active column\n * flips its direction.\n */\n const nextSortFor = (key: string): DataTableSort => ({\n key,\n direction: props.sort?.key === key && props.sort?.direction === \"desc\" ? \"asc\" : \"desc\",\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.onSortChange && !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 key = sortKeyOf(col);\n // Only how a column sorts decides the element. The order lives in its attributes, so a header button keeps\n // keyboard focus when a click sorts the table and the reader can press it again to reverse the order.\n const mode = createMemo(() => (!key ? null : props.sortHref ? \"link\" : props.onSortChange ? \"button\" : null));\n const active = () => key !== null && props.sort?.key === key;\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 const line = () => (\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 ${active() && props.sort?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={active() ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </span>\n );\n\n return (\n <Switch\n fallback={\n <div class=\"k2b-data-table__header-content\" data-align={alignAttr(col)}>\n {title()}\n </div>\n }\n >\n <Match when={mode() === \"link\"}>\n <a\n href={key ? props.sortHref?.(nextSortFor(key)) : undefined}\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n >\n {line()}\n </a>\n </Match>\n <Match when={mode() === \"button\"}>\n <button\n type=\"button\"\n class=\"k2b-data-table__header-content k2b-data-table__sort\"\n data-align={alignAttr(col)}\n onClick={() => key && props.onSortChange?.(nextSortFor(key))}\n >\n {line()}\n </button>\n </Match>\n </Switch>\n );\n };\n\n const numberFormat = createMemo(() => new Intl.NumberFormat(locale()));\n const renderValueDefault = (value: unknown) => defaultRender(value, locale(), numberFormat(), messages());\n /** A typed column shows its value the way its type reads; an untyped one falls back to the plain rendering. */\n const renderTypedValue = (col: DataTableColumn<T>, value: unknown): JSX.Element => {\n if (!col.type || isEmptyCell(value)) return renderValueDefault(value);\n if (col.type === \"status\") {\n const state = col.states?.[String(value)];\n return state ? <StatusBadge tone={state.tone} label={state.label} variant=\"dot\" /> : String(value);\n }\n if (col.type === \"flow\" && col.format?.currency && Number.isFinite(Number(value)))\n return <FlowAmount value={Number(value)} currency={col.format.currency} decimals={col.format.decimals} />;\n if (col.type === \"delta\" && Number.isFinite(Number(value)))\n return <DeltaBadge delta={{ value: Number(value), unit: col.delta?.unit, better: col.delta?.better }} />;\n if (col.type === \"bar\") {\n const number = Number(value);\n const max = barMax().get(col.id) ?? 0;\n if (!Number.isFinite(number)) return String(value);\n return (\n <span class=\"k2b-data-table__bar\">\n {formatTableNumber(number, col, locale())}\n <span class=\"k2b-data-table__bar-track\" aria-hidden=\"true\">\n <span style={{ width: `${max > 0 ? Math.min(100, (Math.abs(number) / max) * 100) : 0}%` }} />\n </span>\n </span>\n );\n }\n return tableCellText(value, col, locale());\n };\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 // A heading given as a JSX node lives in the head; each details line needs its own copy, so it takes text or a fresh call.\n const detailLabel = (col: DataTableColumn<T>) =>\n typeof col.header === \"function\"\n ? col.header({ col })\n : typeof col.header === \"string\" || typeof col.header === \"number\"\n ? col.header\n : col.id;\n const cellContent = (row: T, col: DataTableColumn<T>, value: unknown) =>\n props.renderCell ? props.renderCell({ row, col, value, render: (v) => renderTypedValue(col, v) }) : renderTypedValue(col, value);\n\n /** `last` marks the final row of its body when details rows follow every row, so the frame keeps the only edge. */\n const renderRow = (row: T, last: () => boolean) => {\n const id = () => rowId(row);\n const isSelected = () =>\n props.selection ? props.selection.selected().has(id() ?? \"\") : props.selectedRowId && id() === props.selectedRowId;\n const detailsId = `k2b-data-table-${createUniqueId()}-details`;\n const open = () => openDetails().has(row);\n return (\n <>\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 data-details-open={open() ? \"true\" : undefined}\n data-last={detailsPriority() && last() ? \"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-nowrap={nowrapAttr(col)}\n data-wrap={wrapAttr(col)}\n data-align={alignAttr(col)}\n data-priority={priorityAttr(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()}>{cellContent(row, col, value())}</div>\n </td>\n );\n }}\n </For>\n <Show when={detailsPriority()}>\n <td class=\"k2b-data-table__details-toggle\">\n <button\n type=\"button\"\n class=\"k2b-data-table__details-button\"\n aria-expanded={open()}\n aria-controls={detailsId}\n aria-label={dataTableMessages().showDetails}\n onClick={() => toggleDetails(row)}\n >\n <i class={`ti ${open() ? \"ti-chevron-up\" : \"ti-chevron-down\"}`} aria-hidden=\"true\" />\n </button>\n </td>\n </Show>\n </tr>\n <Show when={detailsPriority()}>\n {/* Only the values the table's width hides appear here; the rest are in the row above. */}\n <tr class=\"k2b-data-table__details\" id={detailsId} hidden={!open()}>\n <td colspan={columnCount()}>\n <dl>\n <For each={hiddenColumns()}>\n {(col) => (\n <div data-priority={priorityAttr(col)}>\n <dt>{detailLabel(col)}</dt>\n <dd>{cellContent(row, col, valueOf(row, col))}</dd>\n </div>\n )}\n </For>\n </dl>\n </td>\n </tr>\n </Show>\n </>\n );\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 // Announced once per wait, outside the region that `aria-busy` keeps quiet.\n createEffect(\n on(\n () => !!props.loading && props.rows.length === 0,\n (waiting) => {\n if (waiting) announce(dataTableMessages().loadingRows);\n },\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={<>{dataTableMessages().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-priorities={detailsPriority()}\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 ?? dataTableMessages().dataTable)}\n aria-labelledby={labelledBy()}\n aria-busy={props.loading ? \"true\" : undefined}\n tabIndex={0}\n class={`k2b-table-wrap${props.scrollClass ? ` ${props.scrollClass}` : \"\"}`}\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 <Show when={props.loading}>\n {/* Names the table while it waits; the announcement goes through the shared live region outside the busy region. */}\n <caption class=\"k2b-sr-only\">{dataTableMessages().loadingRows}</caption>\n </Show>\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={headerColumns()}>\n {(col, index) =>\n col ? (\n <th\n scope=\"col\"\n class={`${col.headerClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-priority={priorityAttr(col)}\n data-highlighted={columnHighlighted(index())}\n aria-sort={ariaSortFor(col)}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {props.renderHeader\n ? props.renderHeader({ col, render: () => renderHeaderDefault(col) })\n : renderHeaderDefault(col)}\n </th>\n ) : (\n <th scope=\"col\" class=\"k2b-data-table__details-toggle\">\n <span class=\"k2b-sr-only\">{dataTableMessages().details}</span>\n </th>\n )\n }\n </For>\n </tr>\n </thead>\n <Show\n when={props.rows.length > 0}\n fallback={\n <tbody>\n <Show\n when={props.loading}\n fallback={\n <tr>\n <Show\n when={props.query?.trim()}\n fallback={\n <td class=\"k2b-data-table__empty\" colspan={columnCount()}>\n <Placeholder description={<>{props.empty ?? dataTableMessages().noRecords}</>} />\n </td>\n }\n >\n {(query) => (\n <td class=\"k2b-data-table__no-match\" colspan={columnCount()}>\n {dataTableMessages().noMatch({ query: query() })}{\" \"}\n <Show when={props.onClearQuery}>\n <button type=\"button\" class=\"k2b-data-table__clear-query\" onClick={() => props.onClearQuery?.()}>\n {dataTableMessages().clearSearch}\n </button>\n </Show>\n </td>\n )}\n </Show>\n </tr>\n }\n >\n <For each={Array.from({ length: loadingRows() })}>\n {() => (\n <tr class=\"k2b-data-table__row\" data-loading=\"true\" aria-hidden=\"true\">\n <For each={props.columns}>\n {(col) => (\n <td data-align={alignAttr(col)} data-priority={priorityAttr(col)}>\n <span class=\"k2b-data-table__skeleton\" />\n </td>\n )}\n </For>\n <Show when={detailsPriority()}>\n <td class=\"k2b-data-table__details-toggle\" />\n </Show>\n </tr>\n )}\n </For>\n {/* The spacer takes the spare height while loading too, so rows keep their height when data arrives. */}\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={columnCount()} />\n </tr>\n </Show>\n </Show>\n </tbody>\n }\n >\n <Show\n when={groups()}\n fallback={\n <tbody>\n <For each={props.rows}>{(row, index) => renderRow(row, () => index() === props.rows.length - 1)}</For>\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={columnCount()} />\n </tr>\n </Show>\n </tbody>\n }\n >\n {(list) => (\n <>\n <For each={list()}>\n {(group) => (\n <tbody class=\"k2b-data-table__group\">\n <tr class=\"k2b-data-table__group-row\">\n <th scope=\"rowgroup\" colspan={columnCount()}>\n {group.label || \"—\"}\n <span class=\"k2b-data-table__group-count\">\n <span aria-hidden=\"true\">{group.rows.length}</span>\n <span class=\"k2b-sr-only\">, {dataTableMessages().rowCount({ count: group.rows.length })}</span>\n </span>\n </th>\n </tr>\n <For each={group.rows}>{(row, index) => renderRow(row, () => index() === group.rows.length - 1)}</For>\n </tbody>\n )}\n </For>\n <Show when={props.fillHeight}>\n <tbody aria-hidden=\"true\">\n <tr>\n <td class=\"k2b-data-table__fill\" colspan={columnCount()} />\n </tr>\n </tbody>\n </Show>\n </>\n )}\n </Show>\n </Show>\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-nowrap={nowrapAttr(col)}\n data-align={alignAttr(col)}\n data-priority={priorityAttr(col)}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {footer().renderCell\n ? footer().renderCell!({ col, value: value(), render: (v) => renderTypedValue(col, v) })\n : renderTypedValue(col, value())}\n </td>\n );\n }}\n </For>\n <Show when={detailsPriority()}>\n <td class=\"k2b-data-table__footer-cell k2b-data-table__details-toggle\" />\n </Show>\n </tr>\n {/* Totals of hidden columns stay readable under the totals row while the width hides them. */}\n <Show when={detailsPriority()}>\n <tr class=\"k2b-data-table__details\" data-footer=\"true\">\n <td colspan={columnCount()}>\n <dl>\n <For each={hiddenColumns()}>\n {(col) => (\n <div data-priority={priorityAttr(col)}>\n <dt>{detailLabel(col)}</dt>\n <dd>\n {footer().renderCell\n ? footer().renderCell!({\n col,\n value: footer().values?.[col.id],\n render: (v) => renderTypedValue(col, v),\n })\n : renderTypedValue(col, footer().values?.[col.id])}\n </dd>\n </div>\n )}\n </For>\n </dl>\n </td>\n </tr>\n </Show>\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":[]}
@@ -16,7 +16,7 @@ var _tmpl$ = /*#__PURE__*/_$template(`<span class="k2b-content-lightbox__counter
16
16
  _tmpl$4 = /*#__PURE__*/_$template(`<button type=button class="k2b-content-lightbox__nav k2b-overlay-surface"data-direction=previous><i class="ti ti-chevron-left"aria-hidden=true>`),
17
17
  _tmpl$5 = /*#__PURE__*/_$template(`<button type=button class="k2b-content-lightbox__nav k2b-overlay-surface"data-direction=next><i class="ti ti-chevron-right"aria-hidden=true>`),
18
18
  _tmpl$6 = /*#__PURE__*/_$template(`<div class="k2b-content-lightbox__dots k2b-overlay-surface"role=group>`),
19
- _tmpl$7 = /*#__PURE__*/_$template(`<dialog class=k2b-content-lightbox><div class=k2b-content-lightbox__bar><div class=k2b-content-lightbox__meta><!$><!/><!$><!/></div><div class=k2b-content-lightbox__actions><!$><!/><!$><!/><button type=button class="k2b-content-lightbox__button k2b-overlay-surface"><i class="ti ti-x"aria-hidden=true></i><span class=k2b-content-lightbox__button-label></span></button></div></div><div class=k2b-content-lightbox__stage></div><!$><!/><!$><!/>`),
19
+ _tmpl$7 = /*#__PURE__*/_$template(`<dialog class=k2b-content-lightbox><div class=k2b-content-lightbox__bar><div class=k2b-content-lightbox__meta><!$><!/><!$><!/></div><div class=k2b-content-lightbox__actions><!$><!/><!$><!/><button type=button class="k2b-content-lightbox__button k2b-overlay-surface"><i class="ti ti-x"aria-hidden=true></i><span class=k2b-content-lightbox__button-label></span></button></div></div><div class=k2b-content-lightbox__stage></div><!$><!/><!$><!/><!$><!/>`),
20
20
  _tmpl$8 = /*#__PURE__*/_$template(`<button type=button class="k2b-content-lightbox__button k2b-overlay-surface"><i aria-hidden=true></i><span class=k2b-content-lightbox__button-label>`),
21
21
  _tmpl$9 = /*#__PURE__*/_$template(`<img class=k2b-content-lightbox__image>`),
22
22
  _tmpl$0 = /*#__PURE__*/_$template(`<button type=button class=k2b-content-lightbox__dot>`);
@@ -24,9 +24,12 @@ import { createEffect, createSignal, For, onCleanup, onMount, Show } from "solid
24
24
  import { returnFocus, ringOnReturn } from "../internal/focus-return";
25
25
  import { useUiMessages } from "../intl/messages";
26
26
  import { useLightboxMessages } from "./lightbox-messages";
27
+ import { ThumbnailStrip } from "./ThumbnailStrip";
27
28
 
28
29
  /** One more thing to do with the shown image, beside Download: a short label, its icon class, and what it does. */
29
30
 
31
+ /** From this many images the gallery shows a thumbnail strip instead of dots. */
32
+ const STRIP_FROM = 4;
30
33
  /**
31
34
  * Minimal, accessible lightbox using native <dialog>.
32
35
  * Supports keyboard navigation, touch swipe gestures, and screen readers.
@@ -83,7 +86,8 @@ export default function Lightbox(props) {
83
86
 
84
87
  // Keyboard navigation
85
88
  const handleKeyDown = e => {
86
- if (!ownsKey(e.target)) return;
89
+ // A part that handled the key itself, such as the thumbnail strip moving its focus, keeps it.
90
+ if (e.defaultPrevented || !ownsKey(e.target)) return;
87
91
  switch (e.key) {
88
92
  case "Escape":
89
93
  // Handled here, so WebKit does not light the returned focus for this key.
@@ -168,7 +172,9 @@ export default function Lightbox(props) {
168
172
  _el$29 = _el$25.nextSibling,
169
173
  [_el$30, _co$7] = _$getNextMarker(_el$29.nextSibling),
170
174
  _el$31 = _el$30.nextSibling,
171
- [_el$32, _co$8] = _$getNextMarker(_el$31.nextSibling);
175
+ [_el$32, _co$8] = _$getNextMarker(_el$31.nextSibling),
176
+ _el$33 = _el$32.nextSibling,
177
+ [_el$34, _co$9] = _$getNextMarker(_el$33.nextSibling);
172
178
  _el$.$$touchend = handleTouchEnd;
173
179
  _el$.$$touchstart = handleTouchStart;
174
180
  _el$.addEventListener("cancel", handleCancel);
@@ -207,23 +213,23 @@ export default function Lightbox(props) {
207
213
  return current()?.actions ?? [];
208
214
  },
209
215
  children: action => (() => {
210
- var _el$33 = _$getNextElement(_tmpl$8),
211
- _el$34 = _el$33.firstChild,
212
- _el$35 = _el$34.nextSibling;
213
- _el$33.$$click = () => action.onClick();
214
- _$insert(_el$35, () => action.label);
216
+ var _el$35 = _$getNextElement(_tmpl$8),
217
+ _el$36 = _el$35.firstChild,
218
+ _el$37 = _el$36.nextSibling;
219
+ _el$35.$$click = () => action.onClick();
220
+ _$insert(_el$37, () => action.label);
215
221
  _$effect(_p$ => {
216
222
  var _v$5 = action.label,
217
223
  _v$6 = action.icon;
218
- _v$5 !== _p$.e && _$setAttribute(_el$33, "aria-label", _p$.e = _v$5);
219
- _v$6 !== _p$.t && _$className(_el$34, _p$.t = _v$6);
224
+ _v$5 !== _p$.e && _$setAttribute(_el$35, "aria-label", _p$.e = _v$5);
225
+ _v$6 !== _p$.t && _$className(_el$36, _p$.t = _v$6);
220
226
  return _p$;
221
227
  }, {
222
228
  e: undefined,
223
229
  t: undefined
224
230
  });
225
231
  _$runHydrationEvents();
226
- return _el$33;
232
+ return _el$35;
227
233
  })()
228
234
  }), _el$22, _co$5);
229
235
  _$insert(_el$14, _$createComponent(Show, {
@@ -255,19 +261,19 @@ export default function Lightbox(props) {
255
261
  return current();
256
262
  },
257
263
  children: image => (() => {
258
- var _el$36 = _$getNextElement(_tmpl$9);
259
- _$setAttribute(_el$36, "draggable", false);
264
+ var _el$38 = _$getNextElement(_tmpl$9);
265
+ _$setAttribute(_el$38, "draggable", false);
260
266
  _$effect(_p$ => {
261
267
  var _v$7 = image().src,
262
268
  _v$8 = image().alt ?? "";
263
- _v$7 !== _p$.e && _$setAttribute(_el$36, "src", _p$.e = _v$7);
264
- _v$8 !== _p$.t && _$setAttribute(_el$36, "alt", _p$.t = _v$8);
269
+ _v$7 !== _p$.e && _$setAttribute(_el$38, "src", _p$.e = _v$7);
270
+ _v$8 !== _p$.t && _$setAttribute(_el$38, "alt", _p$.t = _v$8);
265
271
  return _p$;
266
272
  }, {
267
273
  e: undefined,
268
274
  t: undefined
269
275
  });
270
- return _el$36;
276
+ return _el$38;
271
277
  })()
272
278
  }));
273
279
  _$insert(_el$, _$createComponent(Show, {
@@ -292,7 +298,33 @@ export default function Lightbox(props) {
292
298
  }), _el$30, _co$7);
293
299
  _$insert(_el$, _$createComponent(Show, {
294
300
  get when() {
295
- return _$memo(() => !!isMultiple())() && props.images.length <= 10;
301
+ return props.images.length >= STRIP_FROM;
302
+ },
303
+ get children() {
304
+ return _$createComponent(ThumbnailStrip, {
305
+ "class": "k2b-content-lightbox__strip k2b-overlay-surface",
306
+ get label() {
307
+ return lightboxMessages().imageNavigation;
308
+ },
309
+ get items() {
310
+ return props.images.map((image, i) => ({
311
+ id: String(i),
312
+ name: image.alt || lightboxMessages().goToImage({
313
+ index: i + 1
314
+ }),
315
+ thumbnail: image.thumbnail ?? image.src
316
+ }));
317
+ },
318
+ get currentItem() {
319
+ return String(index());
320
+ },
321
+ onSelectItem: id => setIndex(Number(id))
322
+ });
323
+ }
324
+ }), _el$32, _co$8);
325
+ _$insert(_el$, _$createComponent(Show, {
326
+ get when() {
327
+ return _$memo(() => !!isMultiple())() && props.images.length < STRIP_FROM;
296
328
  },
297
329
  get children() {
298
330
  var _el$28 = _$getNextElement(_tmpl$6);
@@ -301,28 +333,28 @@ export default function Lightbox(props) {
301
333
  return props.images;
302
334
  },
303
335
  children: (_, i) => (() => {
304
- var _el$37 = _$getNextElement(_tmpl$0);
305
- _el$37.$$click = () => setIndex(i());
336
+ var _el$39 = _$getNextElement(_tmpl$0);
337
+ _el$39.$$click = () => setIndex(i());
306
338
  _$effect(_p$ => {
307
339
  var _v$9 = index() === i() ? "true" : undefined,
308
340
  _v$0 = lightboxMessages().goToImage({
309
341
  index: i() + 1
310
342
  });
311
- _v$9 !== _p$.e && _$setAttribute(_el$37, "aria-current", _p$.e = _v$9);
312
- _v$0 !== _p$.t && _$setAttribute(_el$37, "aria-label", _p$.t = _v$0);
343
+ _v$9 !== _p$.e && _$setAttribute(_el$39, "aria-current", _p$.e = _v$9);
344
+ _v$0 !== _p$.t && _$setAttribute(_el$39, "aria-label", _p$.t = _v$0);
313
345
  return _p$;
314
346
  }, {
315
347
  e: undefined,
316
348
  t: undefined
317
349
  });
318
350
  _$runHydrationEvents();
319
- return _el$37;
351
+ return _el$39;
320
352
  })()
321
353
  }));
322
354
  _$effect(() => _$setAttribute(_el$28, "aria-label", lightboxMessages().imageNavigation));
323
355
  return _el$28;
324
356
  }
325
- }), _el$32, _co$8);
357
+ }), _el$34, _co$9);
326
358
  _$effect(_p$ => {
327
359
  var _v$3 = lightboxMessages().imageLightbox,
328
360
  _v$4 = lightboxMessages().closeLightbox;