@k2b/ui 0.48.0 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base.css +40 -2
- package/dist/browser/actions/ContextMenu.js +3 -0
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/CopyButton.js +26 -18
- package/dist/browser/actions/CopyButton.js.map +1 -1
- package/dist/browser/charts/core/area.js +190 -0
- package/dist/browser/charts/core/area.js.map +1 -0
- package/dist/browser/charts/core/calendar.js +186 -0
- package/dist/browser/charts/core/calendar.js.map +1 -0
- package/dist/browser/charts/core/chart-map-data.js +9 -0
- package/dist/browser/charts/core/chart-map-data.js.map +1 -0
- package/dist/browser/charts/core/index.js +12 -0
- package/dist/browser/charts/core/index.js.map +1 -0
- package/dist/browser/charts/core/inspection.js +9 -0
- package/dist/browser/charts/core/inspection.js.map +1 -0
- package/dist/browser/charts/core/registry.js +28 -0
- package/dist/browser/charts/core/registry.js.map +1 -0
- package/dist/browser/charts/core/render.js +103 -0
- package/dist/browser/charts/core/render.js.map +1 -0
- package/dist/browser/charts/core/snapshot.js +65 -0
- package/dist/browser/charts/core/snapshot.js.map +1 -0
- package/dist/browser/charts/core/svg.js +2542 -0
- package/dist/browser/charts/core/svg.js.map +1 -0
- package/dist/browser/charts/core/termination.test-fixture.js +162 -0
- package/dist/browser/charts/core/termination.test-fixture.js.map +1 -0
- package/dist/browser/charts/core/text.js +13 -0
- package/dist/browser/charts/core/text.js.map +1 -0
- package/dist/browser/charts/core/types.js +8 -0
- package/dist/browser/charts/core/types.js.map +1 -0
- package/dist/browser/charts.js +4 -2
- package/dist/browser/charts.js.map +1 -1
- package/dist/browser/content/BalanceSummary.js +106 -0
- package/dist/browser/content/BalanceSummary.js.map +1 -0
- package/dist/browser/content/Chart.js +134 -115
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +366 -122
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +16 -9
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/DataTable.js +676 -293
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/DataTableTools.js +119 -0
- package/dist/browser/content/DataTableTools.js.map +1 -0
- package/dist/browser/content/FlowAmount.js +82 -0
- package/dist/browser/content/FlowAmount.js.map +1 -0
- package/dist/browser/content/balance-summary-messages.js +26 -0
- package/dist/browser/content/balance-summary-messages.js.map +1 -0
- package/dist/browser/content/chart-bar.js +6 -6
- package/dist/browser/content/chart-bar.js.map +1 -1
- package/dist/browser/content/chart-calendar.js +43 -0
- package/dist/browser/content/chart-calendar.js.map +1 -0
- package/dist/browser/content/chart-inspection-core.js +164 -37
- package/dist/browser/content/chart-inspection-core.js.map +1 -1
- package/dist/browser/content/chart-inspection.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js +2 -2
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-map-viewport.js.map +1 -1
- package/dist/browser/content/chart-message-catalog.js +164 -0
- package/dist/browser/content/chart-message-catalog.js.map +1 -0
- package/dist/browser/content/chart-messages.js +2 -138
- package/dist/browser/content/chart-messages.js.map +1 -1
- package/dist/browser/content/chart-snapshot.js +1 -62
- package/dist/browser/content/chart-snapshot.js.map +1 -1
- package/dist/browser/content/chart-state-timeline.js +1 -1
- package/dist/browser/content/chart-state-timeline.js.map +1 -1
- package/dist/browser/content/chart-svg.js +2 -1
- package/dist/browser/content/chart-svg.js.map +1 -1
- package/dist/browser/content/chart-time-axis.js +139 -0
- package/dist/browser/content/chart-time-axis.js.map +1 -0
- package/dist/browser/content/data-table-columns.js +160 -0
- package/dist/browser/content/data-table-columns.js.map +1 -0
- package/dist/browser/content/data-table-messages.js +38 -2
- package/dist/browser/content/data-table-messages.js.map +1 -1
- package/dist/browser/content/flow-amount-messages.js +26 -0
- package/dist/browser/content/flow-amount-messages.js.map +1 -0
- package/dist/browser/content/index.js +4 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/prompt-confirm.js +7 -4
- package/dist/browser/feedback/prompt-confirm.js.map +1 -1
- package/dist/browser/feedback/prompts.js +3 -3
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +5 -4
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/NumberInput.js +17 -5
- package/dist/browser/inputs/NumberInput.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js +50 -17
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/date-picker.js +13 -0
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/intl/Format.js +31 -8
- package/dist/browser/intl/Format.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +580 -522
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/MobileShell.js +26 -0
- package/dist/browser/layout/MobileShell.js.map +1 -1
- package/dist/browser/layout/index.js +1 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/sheet-handle.js +155 -0
- package/dist/browser/layout/sheet-handle.js.map +1 -0
- package/dist/browser/surfaces/BudgetList.js +281 -0
- package/dist/browser/surfaces/BudgetList.js.map +1 -0
- package/dist/browser/surfaces/NoticeCard.js +48 -29
- package/dist/browser/surfaces/NoticeCard.js.map +1 -1
- package/dist/browser/surfaces/ProgressBar.js +134 -21
- package/dist/browser/surfaces/ProgressBar.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +320 -144
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/StatGrid.js +75 -57
- package/dist/browser/surfaces/StatGrid.js.map +1 -1
- package/dist/browser/surfaces/budget-messages.js +64 -0
- package/dist/browser/surfaces/budget-messages.js.map +1 -0
- package/dist/browser/surfaces/delta-badge.js +65 -0
- package/dist/browser/surfaces/delta-badge.js.map +1 -0
- package/dist/browser/surfaces/index.js +2 -1
- package/dist/browser/surfaces/index.js.map +1 -1
- package/dist/browser/surfaces/person-color.js +2 -2
- package/dist/browser/surfaces/person-color.js.map +1 -1
- package/dist/browser/surfaces/stat-cell-messages.js +41 -0
- package/dist/browser/surfaces/stat-cell-messages.js.map +1 -0
- package/dist/browser/widgets/Dashboard.js +137 -0
- package/dist/browser/widgets/Dashboard.js.map +1 -0
- package/dist/browser/widgets/index.js +1 -0
- package/dist/browser/widgets/index.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +3 -0
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/CopyButton.js +13 -8
- package/dist/ssr/actions/CopyButton.js.map +1 -1
- package/dist/ssr/charts/core/area.js +190 -0
- package/dist/ssr/charts/core/area.js.map +1 -0
- package/dist/ssr/charts/core/calendar.js +186 -0
- package/dist/ssr/charts/core/calendar.js.map +1 -0
- package/dist/ssr/charts/core/chart-map-data.js +9 -0
- package/dist/ssr/charts/core/chart-map-data.js.map +1 -0
- package/dist/ssr/charts/core/index.js +12 -0
- package/dist/ssr/charts/core/index.js.map +1 -0
- package/dist/ssr/charts/core/inspection.js +9 -0
- package/dist/ssr/charts/core/inspection.js.map +1 -0
- package/dist/ssr/charts/core/registry.js +28 -0
- package/dist/ssr/charts/core/registry.js.map +1 -0
- package/dist/ssr/charts/core/render.js +103 -0
- package/dist/ssr/charts/core/render.js.map +1 -0
- package/dist/ssr/charts/core/snapshot.js +65 -0
- package/dist/ssr/charts/core/snapshot.js.map +1 -0
- package/dist/ssr/charts/core/svg.js +2542 -0
- package/dist/ssr/charts/core/svg.js.map +1 -0
- package/dist/ssr/charts/core/termination.test-fixture.js +162 -0
- package/dist/ssr/charts/core/termination.test-fixture.js.map +1 -0
- package/dist/ssr/charts/core/text.js +13 -0
- package/dist/ssr/charts/core/text.js.map +1 -0
- package/dist/ssr/charts/core/types.js +8 -0
- package/dist/ssr/charts/core/types.js.map +1 -0
- package/dist/ssr/charts.js +4 -2
- package/dist/ssr/charts.js.map +1 -1
- package/dist/ssr/content/BalanceSummary.js +75 -0
- package/dist/ssr/content/BalanceSummary.js.map +1 -0
- package/dist/ssr/content/Chart.js +90 -95
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +190 -46
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +5 -1
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +287 -78
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/DataTableTools.js +106 -0
- package/dist/ssr/content/DataTableTools.js.map +1 -0
- package/dist/ssr/content/FlowAmount.js +58 -0
- package/dist/ssr/content/FlowAmount.js.map +1 -0
- package/dist/ssr/content/balance-summary-messages.js +26 -0
- package/dist/ssr/content/balance-summary-messages.js.map +1 -0
- package/dist/ssr/content/chart-bar.js +6 -6
- package/dist/ssr/content/chart-bar.js.map +1 -1
- package/dist/ssr/content/chart-calendar.js +43 -0
- package/dist/ssr/content/chart-calendar.js.map +1 -0
- package/dist/ssr/content/chart-inspection-core.js +164 -37
- package/dist/ssr/content/chart-inspection-core.js.map +1 -1
- package/dist/ssr/content/chart-inspection.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js +2 -2
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-map-viewport.js.map +1 -1
- package/dist/ssr/content/chart-message-catalog.js +164 -0
- package/dist/ssr/content/chart-message-catalog.js.map +1 -0
- package/dist/ssr/content/chart-messages.js +2 -138
- package/dist/ssr/content/chart-messages.js.map +1 -1
- package/dist/ssr/content/chart-snapshot.js +1 -62
- package/dist/ssr/content/chart-snapshot.js.map +1 -1
- package/dist/ssr/content/chart-state-timeline.js +1 -1
- package/dist/ssr/content/chart-state-timeline.js.map +1 -1
- package/dist/ssr/content/chart-svg.js +2 -1
- package/dist/ssr/content/chart-svg.js.map +1 -1
- package/dist/ssr/content/chart-time-axis.js +139 -0
- package/dist/ssr/content/chart-time-axis.js.map +1 -0
- package/dist/ssr/content/data-table-columns.js +160 -0
- package/dist/ssr/content/data-table-columns.js.map +1 -0
- package/dist/ssr/content/data-table-messages.js +38 -2
- package/dist/ssr/content/data-table-messages.js.map +1 -1
- package/dist/ssr/content/flow-amount-messages.js +26 -0
- package/dist/ssr/content/flow-amount-messages.js.map +1 -0
- package/dist/ssr/content/index.js +4 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/prompt-confirm.js +7 -4
- package/dist/ssr/feedback/prompt-confirm.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +3 -3
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +5 -4
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/NumberInput.js +17 -5
- package/dist/ssr/inputs/NumberInput.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +26 -9
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/date-picker.js +13 -0
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/intl/Format.js +22 -2
- package/dist/ssr/intl/Format.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +158 -114
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/MobileShell.js +26 -0
- package/dist/ssr/layout/MobileShell.js.map +1 -1
- package/dist/ssr/layout/index.js +1 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/sheet-handle.js +155 -0
- package/dist/ssr/layout/sheet-handle.js.map +1 -0
- package/dist/ssr/surfaces/BudgetList.js +170 -0
- package/dist/ssr/surfaces/BudgetList.js.map +1 -0
- package/dist/ssr/surfaces/NoticeCard.js +25 -10
- package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
- package/dist/ssr/surfaces/ProgressBar.js +96 -5
- package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +157 -51
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/StatGrid.js +24 -35
- package/dist/ssr/surfaces/StatGrid.js.map +1 -1
- package/dist/ssr/surfaces/budget-messages.js +64 -0
- package/dist/ssr/surfaces/budget-messages.js.map +1 -0
- package/dist/ssr/surfaces/delta-badge.js +41 -0
- package/dist/ssr/surfaces/delta-badge.js.map +1 -0
- package/dist/ssr/surfaces/index.js +2 -1
- package/dist/ssr/surfaces/index.js.map +1 -1
- package/dist/ssr/surfaces/person-color.js +2 -2
- package/dist/ssr/surfaces/person-color.js.map +1 -1
- package/dist/ssr/surfaces/stat-cell-messages.js +41 -0
- package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -0
- package/dist/ssr/widgets/Dashboard.js +84 -0
- package/dist/ssr/widgets/Dashboard.js.map +1 -0
- package/dist/ssr/widgets/index.js +1 -0
- package/dist/ssr/widgets/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/charts/core/area.d.ts +62 -0
- package/dist/types/charts/core/calendar.d.ts +57 -0
- package/dist/types/charts/core/chart-map-data.d.ts +3 -0
- package/dist/types/charts/core/index.d.ts +11 -0
- package/dist/types/charts/core/inspection.d.ts +16 -0
- package/dist/types/charts/core/registry.d.ts +27 -0
- package/dist/types/charts/core/render.d.ts +40 -0
- package/dist/types/charts/core/snapshot.d.ts +27 -0
- package/dist/types/charts/core/svg.d.ts +714 -0
- package/dist/types/charts/core/termination.test-fixture.d.ts +1 -0
- package/dist/types/charts/core/text.d.ts +5 -0
- package/dist/types/charts/core/types.d.ts +31 -0
- package/dist/types/charts.d.ts +4 -2
- package/dist/types/content/BalanceSummary.d.ts +29 -0
- package/dist/types/content/Chart.d.ts +26 -36
- package/dist/types/content/ChartExplorer.d.ts +43 -2
- package/dist/types/content/ChartSnapshotView.d.ts +1 -0
- package/dist/types/content/DataTable.d.ts +28 -0
- package/dist/types/content/DataTableTools.d.ts +44 -0
- package/dist/types/content/FlowAmount.d.ts +28 -0
- package/dist/types/content/balance-summary-messages.d.ts +11 -0
- package/dist/types/content/chart-bar.d.ts +1 -1
- package/dist/types/content/chart-calendar.d.ts +4 -0
- package/dist/types/content/chart-inspection-core.d.ts +21 -16
- package/dist/types/content/chart-inspection.d.ts +5 -1
- package/dist/types/content/chart-map-viewport.d.ts +1 -1
- package/dist/types/content/chart-message-catalog.d.ts +84 -0
- package/dist/types/content/chart-messages.d.ts +2 -33
- package/dist/types/content/chart-snapshot.d.ts +1 -26
- package/dist/types/content/chart-svg.d.ts +1 -1
- package/dist/types/content/chart-time-axis.d.ts +26 -0
- package/dist/types/content/data-table-columns.d.ts +72 -0
- package/dist/types/content/data-table-messages.d.ts +18 -0
- package/dist/types/content/flow-amount-messages.d.ts +11 -0
- package/dist/types/content/index.d.ts +10 -2
- package/dist/types/feedback/prompt-confirm.d.ts +3 -1
- package/dist/types/feedback/prompts.d.ts +2 -2
- package/dist/types/inputs/NumberInput.d.ts +1 -1
- package/dist/types/inputs/SelectChip.d.ts +2 -0
- package/dist/types/inputs/date-picker.d.ts +6 -0
- package/dist/types/intl/Format.d.ts +5 -0
- package/dist/types/layout/AppWorkspace.d.ts +21 -1
- package/dist/types/layout/MobileShell.d.ts +5 -0
- package/dist/types/layout/index.d.ts +2 -1
- package/dist/types/layout/sheet-handle.d.ts +21 -0
- package/dist/types/surfaces/BudgetList.d.ts +42 -0
- package/dist/types/surfaces/NoticeCard.d.ts +5 -2
- package/dist/types/surfaces/ProgressBar.d.ts +38 -2
- package/dist/types/surfaces/StatCell.d.ts +35 -2
- package/dist/types/surfaces/StatGrid.d.ts +3 -1
- package/dist/types/surfaces/budget-messages.d.ts +30 -0
- package/dist/types/surfaces/delta-badge.d.ts +10 -0
- package/dist/types/surfaces/index.d.ts +4 -3
- package/dist/types/surfaces/person-color.d.ts +2 -2
- package/dist/types/surfaces/stat-cell-messages.d.ts +19 -0
- package/dist/types/widgets/Dashboard.d.ts +42 -0
- package/dist/types/widgets/index.d.ts +1 -0
- package/package.json +7 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/ChartExplorer.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, Show } from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { CopyButton } from \"../actions/CopyButton\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { DescriptionList } from \"../surfaces/DescriptionList\";\nimport { Paper } from \"../surfaces/Paper\";\nimport { ChartSnapshotView } from \"./ChartSnapshotView\";\nimport type { ChartCursor } from \"./chart-cursor\";\nimport { type ChartExplorerData, type ChartExplorerRow, validateChartExplorerData } from \"./chart-explorer\";\nimport { useChartMessages } from \"./chart-messages\";\nimport DataTable, { type DataTableSort } from \"./DataTable\";\n\nexport type ChartExplorerColumn<T> = {\n id: string;\n label: string;\n value: (row: T) => string;\n /** Optional table cell presentation; value remains the plain text used for copy/details. */\n render?: (row: T) => JSX.Element;\n /**\n * Explicit comparable value. Omit to leave the column unsortable.\n */\n sortValue?: (row: T) => string | number | null;\n align?: \"left\" | \"center\" | \"right\";\n};\n/** One legend entry; `color` is the palette index the renderer gave the series (0 is `--stdlib-chart-c1`). */\nexport type ChartLegendEntry = {\n label: string;\n color: number;\n /** Line pattern of a line series; a solid series shows a filled swatch. */\n style?: \"solid\" | \"dashed\" | \"dotted\";\n /** A comparison series, drawn hollow like its marks. */\n reference?: boolean;\n};\nexport type ChartExplorerProps<T extends ChartExplorerRow> = {\n cursor?: ChartCursor;\n title: string;\n /** Level of the title heading. Defaults to 3; a chart inside a titled group of charts sits one level below it. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n description?: JSX.Element;\n data: ChartExplorerData<T>;\n columns: readonly ChartExplorerColumn<T>[];\n view?: \"chart\" | \"table\";\n defaultView?: \"chart\" | \"table\";\n onViewChange?: (view: \"chart\" | \"table\") => void;\n /**\n * Several charts of the same rows. The switcher then lists each chart and the table; `chart` names the one `data`\n * holds, and `onChartChange` reports a pick, so the owner passes the matching data.\n */\n charts?: readonly { id: string; label: string }[];\n chart?: string;\n onChartChange?: (id: string) => void;\n /** Filter controls between the header and the viewport, such as ChartFilterControls. */\n controls?: JSX.Element;\n /** The table renders at most this many rows of the sorted order; sorting and Copy data use every row. */\n tableRows?: number;\n sort?: DataTableSort | null;\n defaultSort?: DataTableSort | null;\n onSortChange?: (sort: DataTableSort | null) => void;\n selectedKey?: string | null;\n onSelectedKeyChange?: (key: string | null) => void;\n /** false hides the complete local detail area for a shared selection panel. */\n renderDetails?: false | ((row: T) => JSX.Element);\n height?: string;\n /**\n * Series names below the chart, wrapping inside the fixed viewport height. Use it instead of the renderer's legend,\n * which draws in one row and runs out of narrow columns.\n */\n legend?: readonly ChartLegendEntry[];\n /** What the viewport shows without rows, for example while they load; defaults to \"No data\". */\n empty?: JSX.Element;\n class?: string;\n};\n\n// Only the copied text can prove that a cell is a number; a numeric sort key cannot.\nconst plainNumber = /^[-+]?\\p{Sc}?\\s?\\d[\\d.,\\s]*(?:\\s?(?:%|\\p{Sc}))?$/u;\nconst tsvCell = (value: string) => {\n const safe = /^[=+\\-@\\t\\r]/.test(value) && !plainNumber.test(value) ? `'${value}` : value;\n return /[\\t\\r\\n\"]/.test(safe) ? `\"${safe.replaceAll('\"', '\"\"')}\"` : safe;\n};\n\nexport function ChartExplorer<T extends ChartExplorerRow>(props: ChartExplorerProps<T>) {\n const messages = useUiMessages();\n const chartMessages = useChartMessages();\n const locale = useLocale();\n const id = `k2b-chart-explorer-${createUniqueId()}`;\n const data = () => props.data;\n const [copyFailed, setCopyFailed] = createSignal(false);\n const [localSelection, setLocalSelection] = createSignal<string | null>(null);\n const [localView, setLocalView] = createSignal(props.defaultView ?? \"chart\");\n const [localSort, setLocalSort] = createSignal<DataTableSort | null>(props.defaultSort ?? null);\n const view = () => props.view ?? localView();\n const sort = () => (props.sort === undefined ? localSort() : props.sort);\n const setView = (value: \"chart\" | \"table\") => {\n if (props.view === undefined) setLocalView(value);\n props.onViewChange?.(value);\n };\n const setSort = (value: DataTableSort | null) => {\n if (props.sort === undefined) setLocalSort(value);\n props.onSortChange?.(value);\n };\n const rowsByKey = createMemo(() => new Map(data().rows.map((row) => [row.key, row])));\n const rawSelected = () => (props.selectedKey !== undefined ? props.selectedKey : localSelection());\n const selected = () => (rowsByKey().has(rawSelected() ?? \"\") ? rawSelected() : null);\n const selectedRow = () => rowsByKey().get(selected() ?? \"\");\n const select = (key: string | null) => {\n if (key !== null && !rowsByKey().has(key)) return;\n setLocalSelection(key);\n props.onSelectedKeyChange?.(key);\n };\n if (\n !props.columns.length ||\n props.columns.some((column) => !column.id) ||\n new Set(props.columns.map((column) => column.id)).size !== props.columns.length\n ) {\n throw new Error(\"Chart columns require unique nonempty IDs and at least one column\");\n }\n validateChartExplorerData(data());\n createEffect(() => validateChartExplorerData(data()));\n createEffect(() => {\n if (props.selectedKey === undefined && rawSelected() !== null && selected() === null) select(null);\n });\n const rows = createMemo(() => {\n const result = [...data().rows];\n const order = sort();\n const column = props.columns.find((c) => c.id === order?.key);\n const value = column?.sortValue;\n if (!order || !value) return result;\n const collator = new Intl.Collator(locale(), { numeric: true });\n return result.sort((a, b) => {\n const av = value(a),\n bv = value(b);\n if (av === null) return bv === null ? 0 : 1;\n if (bv === null) return -1;\n const comparison = typeof av === \"number\" && typeof bv === \"number\" ? av - bv : collator.compare(String(av), String(bv));\n return order.direction === \"asc\" ? comparison : -comparison;\n });\n });\n const shownRows = () => (props.tableRows === undefined ? rows() : rows().slice(0, props.tableRows));\n // Chart ids are data; a prefix keeps one named \"table\" apart from the table entry.\n const switcherValue = () => (view() === \"table\" || !props.charts?.length ? view() : `chart:${props.chart ?? props.charts[0]?.id}`);\n const switcherOptions = () =>\n props.charts?.length\n ? [\n ...props.charts.map((chart) => ({ value: `chart:${chart.id}`, label: chart.label })),\n { value: \"table\", label: chartMessages().chartData },\n ]\n : [\n { value: \"chart\", label: chartMessages().chartDiagram },\n { value: \"table\", label: chartMessages().chartData },\n ];\n const pick = (value: string) => {\n if (value === \"table\" || value === \"chart\") return setView(value);\n setView(\"chart\");\n props.onChartChange?.(value.slice(\"chart:\".length));\n };\n const copyText = () =>\n [\n props.columns.map((c) => tsvCell(c.label)).join(\"\\t\"),\n ...rows().map((row) => props.columns.map((c) => tsvCell(c.value(row))).join(\"\\t\")),\n ].join(\"\\n\");\n return (\n <section class={`k2b-chart-explorer ${props.class ?? \"\"}`} aria-labelledby={id}>\n <header class=\"k2b-chart-explorer__header\">\n <div>\n <Dynamic component={`h${props.headingLevel ?? 3}`} id={id} class=\"k2b-chart-explorer__title\">\n {props.title}\n </Dynamic>\n <Show when={props.description}>\n <div>{props.description}</div>\n </Show>\n </div>\n <div class=\"k2b-chart-explorer__actions\">\n <CopyButton\n text={copyText()}\n label={chartMessages().chartCopyData}\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n disabled={!rows().length}\n onCopyError={() => setCopyFailed(true)}\n onCopied={() => setCopyFailed(false)}\n />\n <SelectChip<string>\n value={switcherValue()}\n onValueChange={pick}\n aria-label={chartMessages().chartView}\n options={switcherOptions()}\n />\n </div>\n </header>\n <Show when={copyFailed()}>\n <span role=\"alert\">{chartMessages().chartCopyFailed}</span>\n </Show>\n {props.controls}\n <div\n class=\"k2b-chart-explorer__viewport\"\n data-legend={view() === \"chart\" && props.legend?.length && data().rows.length > 0 ? \"true\" : undefined}\n data-capped={view() === \"table\" && shownRows().length < rows().length ? \"true\" : undefined}\n style={{ height: props.height ?? \"18rem\" }}\n >\n <Show when={data().rows.length > 0} fallback={<div class=\"k2b-chart__empty\">{props.empty ?? messages().noData}</div>}>\n <Show\n when={view() === \"chart\"}\n fallback={\n <>\n <DataTable\n rows={shownRows()}\n columns={props.columns.map((column) => ({\n id: column.id,\n header: column.label,\n value: column.value,\n align: column.align,\n sortable: Boolean(column.sortValue),\n }))}\n ariaLabelledBy={id}\n getRowId={(row) => row.key}\n selectedRowId={selected()}\n sort={sort()}\n fillHeight\n surface=\"paper\"\n onRowClick={(row) => select(row.key)}\n renderCell={({ row, col, value, render }) => {\n const custom = props.columns.find((column) => column.id === col.id)?.render;\n const cell = () => (custom ? custom(row) : render(value));\n return !custom && col.id === props.columns[0]?.id ? (\n <Button variant=\"text\" size=\"sm\" onClick={() => select(row.key)}>\n {cell()}\n </Button>\n ) : (\n cell()\n );\n }}\n renderHeader={({ col, render }) =>\n col.sortable ? (\n <Button\n variant=\"text\"\n size=\"sm\"\n onClick={() =>\n setSort({\n key: col.id,\n direction: sort()?.key === col.id && sort()?.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n >\n {props.columns.find((column) => column.id === col.id)?.label}\n {/* The data table's own marker: inactive columns keep a dimmed arrow so the header reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort()?.key === col.id ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </Button>\n ) : (\n render()\n )\n }\n />\n <Show when={shownRows().length < rows().length}>\n <p class=\"k2b-chart-explorer__note\">\n {chartMessages().chartRowsShown({\n shown: new Intl.NumberFormat(locale()).format(shownRows().length),\n total: new Intl.NumberFormat(locale()).format(rows().length),\n })}\n </p>\n </Show>\n </>\n }\n >\n <ChartSnapshotView\n cursor={props.cursor}\n snapshot={data().chart}\n selectedKey={selected()}\n onSelect={select}\n style={props.legend?.length ? undefined : { height: \"100%\" }}\n />\n <Show when={props.legend?.length}>\n <ul class=\"k2b-chart-legend\" aria-label={chartMessages().chartLegend}>\n <For each={props.legend}>\n {(entry) => (\n <li>\n <span\n class=\"k2b-chart-legend__swatch\"\n data-style={entry.style && entry.style !== \"solid\" ? entry.style : undefined}\n data-reference={entry.reference ? \"true\" : undefined}\n style={{ \"--k2b-chart-legend-color\": `var(--stdlib-chart-c${(Math.abs(Math.trunc(entry.color)) % 8) + 1})` }}\n aria-hidden=\"true\"\n />\n {entry.label}\n </li>\n )}\n </For>\n </ul>\n </Show>\n </Show>\n </Show>\n </div>\n <Show when={props.renderDetails !== false}>\n <div class=\"k2b-chart-explorer__details\" aria-live=\"polite\">\n <Show when={selectedRow()}>\n {(row) => (\n <Paper class=\"k2b-chart-explorer__detail-paper\">\n <div class=\"k2b-chart-explorer__detail-header\">\n <span>{chartMessages().chartSelectedDatum}</span>\n <IconButton variant=\"text\" size=\"sm\" label={messages().clearSelection} onClick={() => select(null)}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n {props.renderDetails ? (\n props.renderDetails(row())\n ) : (\n <DescriptionList\n columns={3}\n size=\"sm\"\n items={props.columns.map((column) => ({\n term: column.label,\n description: column.value(row()),\n }))}\n />\n )}\n </Paper>\n )}\n </Show>\n </div>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/ChartExplorer.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, Show } from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { CopyButton } from \"../actions/CopyButton\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { DescriptionList } from \"../surfaces/DescriptionList\";\nimport { Paper } from \"../surfaces/Paper\";\nimport { ChartSnapshotView } from \"./ChartSnapshotView\";\nimport type { ChartCursor } from \"./chart-cursor\";\nimport { type ChartExplorerData, type ChartExplorerRow, validateChartExplorerData } from \"./chart-explorer\";\nimport { useChartMessages } from \"./chart-messages\";\nimport DataTable, { type DataTableSort } from \"./DataTable\";\n\nexport type ChartExplorerColumn<T> = {\n id: string;\n label: string;\n value: (row: T) => string;\n /** Optional table cell presentation; value remains the plain text used for copy/details. */\n render?: (row: T) => JSX.Element;\n /**\n * Explicit comparable value. Omit to leave the column unsortable.\n */\n sortValue?: (row: T) => string | number | null;\n align?: \"left\" | \"center\" | \"right\";\n};\n/** One legend entry; `color` is the palette index the renderer gave the series (0 is `--stdlib-chart-c1`). */\nexport type ChartLegendEntry = {\n label: string;\n color: number;\n /** Line pattern of a line series; a solid series shows a filled swatch. */\n style?: \"solid\" | \"dashed\" | \"dotted\";\n /** A comparison series, drawn hollow like its marks. */\n reference?: boolean;\n};\n/**\n * The latest read of an explorer's rows, kept apart from the rows on screen. Loading and a failure keep shown rows;\n * without rows they take the viewport's place at its height.\n */\nexport type ChartFrameRequest = {\n status: \"idle\" | \"loading\" | \"error\";\n /** A host sentence for a failure, such as \"The query timed out.\" */\n reason?: string;\n /** The range being read, such as \"Last 90 days\"; while it differs from `range` the subtitle names it. */\n requestedRange?: string;\n};\nexport type ChartExplorerProps<T extends ChartExplorerRow> = {\n cursor?: ChartCursor;\n title: string;\n /** Level of the title heading. Defaults to 3; a chart inside a titled group of charts sits one level below it. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n description?: JSX.Element;\n /** Owner actions in the header before Copy data, such as showing the query behind the chart. */\n actions?: JSX.Element;\n /**\n * Rows and the prepared chart. Without `chart`, `children` draws the chart view, such as a live `<Chart>`; the\n * table and Copy data still come from the typed rows.\n */\n data: ChartExplorerData<T> | { rows: readonly T[] };\n /** The chart view when `data` has no prepared chart. */\n children?: JSX.Element;\n columns: readonly ChartExplorerColumn<T>[];\n /**\n * The read in flight or the last one that failed. With it the explorer shows loading, empty, failure and stale\n * data in place: the title and subtitle stay, the viewport keeps its height, and nothing moves between states.\n */\n request?: ChartFrameRequest;\n /** When the shown rows were read, formatted by the host (\"09:12\"); named only when a newer read failed. */\n asOf?: string;\n /** The range the shown rows cover, such as \"Last 30 days\". */\n range?: string;\n /** Try again after a failure. Without it a failure has no button. */\n onRetry?: () => void;\n /**\n * The padding of the frame around the explorer, one value or block and inline like CSS `padding` (\"14px 16px\").\n * The table view then reaches the frame's left, right and bottom edges without a border of its own, and the frame\n * keeps its height.\n */\n inset?: string;\n view?: \"chart\" | \"table\";\n defaultView?: \"chart\" | \"table\";\n onViewChange?: (view: \"chart\" | \"table\") => void;\n /**\n * Several charts of the same rows. The switcher then lists each chart and the table; `chart` names the one `data`\n * holds, and `onChartChange` reports a pick, so the owner passes the matching data.\n */\n charts?: readonly { id: string; label: string }[];\n chart?: string;\n onChartChange?: (id: string) => void;\n /** Filter controls between the header and the viewport, such as ChartFilterControls. */\n controls?: JSX.Element;\n /** The table renders at most this many rows of the sorted order; sorting and Copy data use every row. */\n tableRows?: number;\n sort?: DataTableSort | null;\n defaultSort?: DataTableSort | null;\n onSortChange?: (sort: DataTableSort | null) => void;\n selectedKey?: string | null;\n onSelectedKeyChange?: (key: string | null) => void;\n /** false hides the complete local detail area for a shared selection panel. */\n renderDetails?: false | ((row: T) => JSX.Element);\n height?: string;\n /**\n * Series names below the chart, wrapping inside the fixed viewport height. Use it instead of the renderer's legend,\n * which draws in one row and runs out of narrow columns.\n */\n legend?: readonly ChartLegendEntry[];\n /**\n * What the viewport shows without rows; defaults to \"No data\". With `request`, write one sentence that says why,\n * such as \"No newsletter was sent in this period.\"\n */\n empty?: JSX.Element;\n class?: string;\n};\n\n// Only the copied text can prove that a cell is a number; a numeric sort key cannot.\nconst plainNumber = /^[-+]?\\p{Sc}?\\s?\\d[\\d.,\\s]*(?:\\s?(?:%|\\p{Sc}))?$/u;\nconst tsvCell = (value: string) => {\n const safe = /^[=+\\-@\\t\\r]/.test(value) && !plainNumber.test(value) ? `'${value}` : value;\n return /[\\t\\r\\n\"]/.test(safe) ? `\"${safe.replaceAll('\"', '\"\"')}\"` : safe;\n};\n\nexport function ChartExplorer<T extends ChartExplorerRow>(props: ChartExplorerProps<T>) {\n const messages = useUiMessages();\n const chartMessages = useChartMessages();\n const locale = useLocale();\n let legendHost: HTMLDivElement | undefined;\n const id = `k2b-chart-explorer-${createUniqueId()}`;\n const data = () => props.data;\n const snapshot = () => (\"chart\" in props.data ? props.data.chart : undefined);\n /** Without `request` the explorer behaves as before: rows or the empty slot. */\n const state = () => {\n if (!props.request) return undefined;\n const status = props.request.status;\n if (data().rows.length) return status === \"error\" ? \"stale\" : status === \"loading\" ? \"refreshing\" : \"data\";\n return status === \"idle\" ? \"empty\" : status;\n };\n const switching = () =>\n state() === \"refreshing\" && props.request?.requestedRange !== undefined && props.request.requestedRange !== props.range;\n const legendValue = (index: number) => {\n const marks = snapshot()?.marks ?? [];\n let latest = -Infinity;\n for (const mark of marks) latest = Math.max(latest, mark.datum.anchor[0]);\n const valueField =\n snapshot()?.kind === \"area\"\n ? marks.some((mark) => mark.datum.values.some((field) => field.key === \"percent\"))\n ? \"percent\"\n : \"value\"\n : \"y\";\n const field = marks\n .find((mark) => mark.datum.seriesIndex === index && mark.datum.anchor[0] === latest)\n ?.datum.values.find((field) => field.key === valueField);\n return field\n ? (field.formatted ??\n (typeof field.value === \"number\"\n ? new Intl.NumberFormat(locale(), { maximumFractionDigits: 6 }).format(field.value)\n : field.value))\n : \"—\";\n };\n\n const [copyFailed, setCopyFailed] = createSignal(false);\n const [localSelection, setLocalSelection] = createSignal<string | null>(null);\n const [localView, setLocalView] = createSignal(props.defaultView ?? \"chart\");\n const [localSort, setLocalSort] = createSignal<DataTableSort | null>(props.defaultSort ?? null);\n const view = () => props.view ?? localView();\n const sort = () => (props.sort === undefined ? localSort() : props.sort);\n const setView = (value: \"chart\" | \"table\") => {\n if (props.view === undefined) setLocalView(value);\n props.onViewChange?.(value);\n };\n const setSort = (value: DataTableSort | null) => {\n if (props.sort === undefined) setLocalSort(value);\n props.onSortChange?.(value);\n };\n const rowsByKey = createMemo(() => new Map(data().rows.map((row) => [row.key, row])));\n const rawSelected = () => (props.selectedKey !== undefined ? props.selectedKey : localSelection());\n const selected = () => (rowsByKey().has(rawSelected() ?? \"\") ? rawSelected() : null);\n const selectedRow = () => rowsByKey().get(selected() ?? \"\");\n const select = (key: string | null) => {\n if (key !== null && !rowsByKey().has(key)) return;\n setLocalSelection(key);\n props.onSelectedKeyChange?.(key);\n };\n if (\n !props.columns.length ||\n props.columns.some((column) => !column.id) ||\n new Set(props.columns.map((column) => column.id)).size !== props.columns.length\n ) {\n throw new Error(\"Chart columns require unique nonempty IDs and at least one column\");\n }\n const validate = () => {\n const chart = snapshot();\n if (chart) validateChartExplorerData({ chart, rows: data().rows });\n else if (new Set(data().rows.map((row) => row.key)).size !== data().rows.length || data().rows.some((row) => !row.key))\n throw new Error(\"Chart data requires unique row/mark keys and a row for every mark.rowKey\");\n };\n validate();\n createEffect(validate);\n createEffect(() => {\n if (props.selectedKey === undefined && rawSelected() !== null && selected() === null) select(null);\n });\n const rows = createMemo(() => {\n const result = [...data().rows];\n const order = sort();\n const column = props.columns.find((c) => c.id === order?.key);\n const value = column?.sortValue;\n if (!order || !value) return result;\n const collator = new Intl.Collator(locale(), { numeric: true });\n return result.sort((a, b) => {\n const av = value(a),\n bv = value(b);\n if (av === null) return bv === null ? 0 : 1;\n if (bv === null) return -1;\n const comparison = typeof av === \"number\" && typeof bv === \"number\" ? av - bv : collator.compare(String(av), String(bv));\n return order.direction === \"asc\" ? comparison : -comparison;\n });\n });\n const shownRows = () => (props.tableRows === undefined ? rows() : rows().slice(0, props.tableRows));\n // Chart ids are data; a prefix keeps one named \"table\" apart from the table entry.\n const switcherValue = () => (view() === \"table\" || !props.charts?.length ? view() : `chart:${props.chart ?? props.charts[0]?.id}`);\n const switcherOptions = () =>\n props.charts?.length\n ? [\n ...props.charts.map((chart) => ({ value: `chart:${chart.id}`, label: chart.label })),\n { value: \"table\", label: chartMessages().chartData },\n ]\n : [\n { value: \"chart\", label: chartMessages().chartDiagram },\n { value: \"table\", label: chartMessages().chartData },\n ];\n const pick = (value: string) => {\n if (value === \"table\" || value === \"chart\") return setView(value);\n setView(\"chart\");\n props.onChartChange?.(value.slice(\"chart:\".length));\n };\n const copyText = () =>\n [\n props.columns.map((c) => tsvCell(c.label)).join(\"\\t\"),\n ...rows().map((row) => props.columns.map((c) => tsvCell(c.value(row))).join(\"\\t\")),\n ].join(\"\\n\");\n const tableView = () => view() === \"table\" && data().rows.length > 0 && state() !== \"loading\" && state() !== \"error\";\n const retryButton = (variant: \"secondary\" | \"text\") => (\n <Show when={props.onRetry}>\n {(retry) => (\n <Button variant={variant} size=\"sm\" onClick={() => retry()()}>\n <Show when={variant === \"secondary\"}>\n <i class=\"ti ti-refresh\" aria-hidden=\"true\" />\n </Show>\n {messages().tryAgain}\n </Button>\n )}\n </Show>\n );\n // \"14px 16px\" reads like CSS padding: block first, then inline; one value is both.\n const insetBlock = () => props.inset?.trim().split(/\\s+/)[0] ?? \"\";\n const insetInline = () => props.inset?.trim().split(/\\s+/)[1] ?? insetBlock();\n return (\n <section\n class={`k2b-chart-explorer ${props.class ?? \"\"}`}\n aria-labelledby={id}\n aria-busy={state() === \"loading\" || state() === \"refreshing\" ? \"true\" : undefined}\n data-state={state()}\n data-inset={props.inset ? \"true\" : undefined}\n style={props.inset ? { \"--k2b-chart-explorer-inset\": insetInline(), \"--k2b-chart-explorer-inset-block\": insetBlock() } : undefined}\n >\n <header class=\"k2b-chart-explorer__header\">\n <div>\n <Dynamic component={`h${props.headingLevel ?? 3}`} id={id} class=\"k2b-chart-explorer__title\">\n {props.title}\n </Dynamic>\n {/* With a request the subtitle is one reserved line and a polite live region: stale and loading replace its\n text without moving anything, and a screen reader hears that the shown values are out of date. */}\n <Show when={props.description || state()}>\n <div\n class=\"k2b-chart-explorer__description\"\n classList={{ \"k2b-chart-explorer__status-line\": state() === \"stale\" || state() === \"loading\" || switching() }}\n data-tone={state() === \"stale\" ? \"warning\" : undefined}\n role={state() ? \"status\" : undefined}\n >\n <Show when={state() === \"stale\" || state() === \"loading\" || switching()} fallback={props.description}>\n <Show\n when={state() === \"stale\"}\n fallback={\n <span>\n {switching()\n ? chartMessages().chartLoadingRange({ range: props.request!.requestedRange! })\n : chartMessages().chartLoading}\n </span>\n }\n >\n <i class=\"ti ti-clock-exclamation\" aria-hidden=\"true\" />\n <span>\n {[props.asOf ? chartMessages().chartAsOf({ time: props.asOf }) : undefined, chartMessages().chartRefreshFailed]\n .filter(Boolean)\n .join(\" · \")}\n {props.onRetry ? \" · \" : \"\"}\n </span>\n {retryButton(\"text\")}\n </Show>\n </Show>\n </div>\n </Show>\n </div>\n <div class=\"k2b-chart-explorer__actions\">\n {props.actions}\n {/* Without rows the view controls keep their place but are hidden, so the header never rewraps. */}\n <span class=\"k2b-chart-explorer__views\" inert={state() && !data().rows.length ? true : undefined}>\n <CopyButton\n text={copyText()}\n label={chartMessages().chartCopyData}\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n disabled={!rows().length}\n onCopyError={() => setCopyFailed(true)}\n onCopied={() => setCopyFailed(false)}\n />\n {/* The switcher keeps the width of its longest view, so picking one never rewraps the header. */}\n <SelectChip<string>\n stableWidth\n value={switcherValue()}\n onValueChange={pick}\n aria-label={chartMessages().chartView}\n options={switcherOptions()}\n />\n </span>\n </div>\n </header>\n <Show when={copyFailed()}>\n <span role=\"alert\">{chartMessages().chartCopyFailed}</span>\n </Show>\n {props.controls}\n <div\n ref={legendHost}\n class=\"k2b-chart-explorer__viewport\"\n data-view={tableView() ? \"table\" : undefined}\n data-legend={view() === \"chart\" && props.legend?.length && data().rows.length > 0 ? \"true\" : undefined}\n data-capped={tableView() && shownRows().length < rows().length ? \"true\" : undefined}\n style={{ height: tableView() && props.inset ? `calc(${props.height ?? \"18rem\"} + ${insetBlock()})` : (props.height ?? \"18rem\") }}\n >\n <Show\n when={state() !== \"loading\" && state() !== \"error\" && data().rows.length > 0}\n fallback={\n <Show\n when={state() === \"loading\"}\n fallback={\n <Show\n when={state() === \"error\"}\n fallback={\n <Show when={state() === \"empty\"} fallback={<div class=\"k2b-chart__empty\">{props.empty ?? messages().noData}</div>}>\n <div class=\"k2b-chart-explorer__state\" data-state=\"empty\">\n <span class=\"k2b-chart-explorer__state-icon\" aria-hidden=\"true\">\n <i class=\"ti ti-chart-bar-off\" />\n </span>\n <p>{props.empty ?? messages().noData}</p>\n </div>\n </Show>\n }\n >\n <div class=\"k2b-chart-explorer__state\" data-state=\"error\" role=\"alert\">\n <span class=\"k2b-chart-explorer__state-icon\" aria-hidden=\"true\">\n <i class=\"ti ti-alert-circle\" />\n </span>\n <p>\n {chartMessages().chartLoadFailed}\n <br />\n {props.request?.reason ?? chartMessages().chartLoadFailedKept}\n </p>\n {retryButton(\"secondary\")}\n </div>\n </Show>\n }\n >\n <div class=\"k2b-chart-explorer__skeleton\" role=\"status\" aria-label={chartMessages().chartLoading}>\n <For each={[0.45, 0.62, 0.55, 0.72, 0.6, 0.8, 0.66, 0.88, 0.63, 0.78, 0.7, 0.95]}>\n {(height) => <span style={{ height: `${height * 100}%` }} />}\n </For>\n </div>\n </Show>\n }\n >\n <Show\n when={view() === \"chart\"}\n fallback={\n <>\n <DataTable\n rows={shownRows()}\n columns={props.columns.map((column) => ({\n id: column.id,\n header: column.label,\n value: column.value,\n align: column.align,\n sortable: Boolean(column.sortValue),\n }))}\n ariaLabelledBy={id}\n getRowId={(row) => row.key}\n selectedRowId={selected()}\n sort={sort()}\n fillHeight\n surface={props.inset ? \"plain\" : \"paper\"}\n onRowClick={(row) => select(row.key)}\n renderCell={({ row, col, value, render }) => {\n const custom = props.columns.find((column) => column.id === col.id)?.render;\n const cell = () => (custom ? custom(row) : render(value));\n return !custom && col.id === props.columns[0]?.id ? (\n <Button variant=\"text\" size=\"sm\" onClick={() => select(row.key)}>\n {cell()}\n </Button>\n ) : (\n cell()\n );\n }}\n renderHeader={({ col, render }) =>\n col.sortable ? (\n <Button\n variant=\"text\"\n size=\"sm\"\n onClick={() =>\n setSort({\n key: col.id,\n direction: sort()?.key === col.id && sort()?.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n >\n {props.columns.find((column) => column.id === col.id)?.label}\n {/* The data table's own marker: inactive columns keep a dimmed arrow so the header reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${sort()?.key === col.id && sort()?.direction === \"asc\" ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort()?.key === col.id ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </Button>\n ) : (\n render()\n )\n }\n />\n <Show when={shownRows().length < rows().length}>\n <p class=\"k2b-chart-explorer__note\">\n {chartMessages().chartRowsShown({\n shown: new Intl.NumberFormat(locale()).format(shownRows().length),\n total: new Intl.NumberFormat(locale()).format(rows().length),\n })}\n </p>\n </Show>\n </>\n }\n >\n <Show when={snapshot()} fallback={<div class=\"k2b-chart-explorer__chart\">{props.children}</div>}>\n {(chart) => (\n <ChartSnapshotView\n cursor={props.cursor}\n legend={() => legendHost}\n snapshot={chart()}\n selectedKey={selected()}\n onSelect={select}\n style={props.legend?.length ? undefined : { height: \"100%\" }}\n />\n )}\n </Show>\n\n <Show when={props.legend?.length}>\n <ul class=\"k2b-chart-legend\" aria-label={chartMessages().chartLegend}>\n <For each={props.legend}>\n {(entry, index) => (\n <li>\n <span\n class=\"k2b-chart-legend__swatch\"\n data-style={entry.style && entry.style !== \"solid\" ? entry.style : undefined}\n data-reference={entry.reference ? \"true\" : undefined}\n style={{ \"--k2b-chart-legend-color\": `var(--stdlib-chart-c${(Math.abs(Math.trunc(entry.color)) % 8) + 1})` }}\n aria-hidden=\"true\"\n />\n {entry.label}\n <Show when={snapshot()?.kind === \"area\"}>\n <b\n data-chart-legend-value\n data-series-index={index()}\n data-field={\n snapshot()?.kind === \"area\"\n ? snapshot()?.marks.some((mark) => mark.datum.values.some((field) => field.key === \"percent\"))\n ? \"percent\"\n : \"value\"\n : \"y\"\n }\n data-default={legendValue(index())}\n >\n {legendValue(index())}\n </b>\n </Show>\n </li>\n )}\n </For>\n </ul>\n </Show>\n </Show>\n </Show>\n </div>\n <Show when={props.renderDetails !== false}>\n <div class=\"k2b-chart-explorer__details\" aria-live=\"polite\">\n <Show when={selectedRow()}>\n {(row) => (\n <Paper class=\"k2b-chart-explorer__detail-paper\">\n <div class=\"k2b-chart-explorer__detail-header\">\n <span>{chartMessages().chartSelectedDatum}</span>\n <IconButton variant=\"text\" size=\"sm\" label={messages().clearSelection} onClick={() => select(null)}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n {props.renderDetails ? (\n props.renderDetails(row())\n ) : (\n <DescriptionList\n columns={3}\n size=\"sm\"\n items={props.columns.map((column) => ({\n term: column.label,\n description: column.value(row()),\n }))}\n />\n )}\n </Paper>\n )}\n </Show>\n </div>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,6 +6,7 @@ import { escape as _$escape } from "solid-js/web";
|
|
|
6
6
|
var _tmpl$ = ["<div class=\"k2b-chart\"", " data-interactive=\"true\" style=\"", "\" role=\"group\"", " tabindex=\"0\"><div class=\"k2b-chart__svg\"", " style=\"", "\">", "</div><span class=\"k2b-chart__anchor\" aria-hidden=\"true\"></span><span", " class=\"k2b-chart__tooltip k2b-tooltip\" role=\"tooltip\" popover=\"manual\" data-instant=\"true\"></span></div>"];
|
|
7
7
|
import { createEffect, createUniqueId, onCleanup, onMount } from "solid-js";
|
|
8
8
|
import { isServer } from "solid-js/web";
|
|
9
|
+
import { useLocale } from "../intl/locale";
|
|
9
10
|
import { createChartInspection } from "./chart-inspection";
|
|
10
11
|
import { closeChartInspectionOnOutside, sameChartDatum } from "./chart-inspection-core";
|
|
11
12
|
import { useChartMessages } from "./chart-messages";
|
|
@@ -13,6 +14,7 @@ import { selectedChartSvg } from "./chart-svg";
|
|
|
13
14
|
|
|
14
15
|
/** Internal display for server-prepared geometry. Viewports are snapshot-owned. */
|
|
15
16
|
export function ChartSnapshotView(props) {
|
|
17
|
+
const locale = useLocale();
|
|
16
18
|
const chartMessages = useChartMessages();
|
|
17
19
|
let container;
|
|
18
20
|
let tooltip;
|
|
@@ -20,6 +22,8 @@ export function ChartSnapshotView(props) {
|
|
|
20
22
|
const id = `k2b-chart-tooltip-${createUniqueId()}`;
|
|
21
23
|
const inspection = createChartInspection({
|
|
22
24
|
container: () => container,
|
|
25
|
+
locale,
|
|
26
|
+
legend: props.legend,
|
|
23
27
|
cursor: () => props.cursor,
|
|
24
28
|
tooltip: () => tooltip,
|
|
25
29
|
anchor: () => anchor,
|
|
@@ -50,6 +54,6 @@ export function ChartSnapshotView(props) {
|
|
|
50
54
|
}));
|
|
51
55
|
});
|
|
52
56
|
onCleanup(inspection.close);
|
|
53
|
-
return _$ssr(_tmpl$, _$ssrAttribute("data-chart-kind", _$escape(props.snapshot.kind, true), false), _$ssrStyle(props.style), _$ssrAttribute("aria-label", _$escape(chartMessages().interactiveChart, true), false), _$ssrAttribute("data-stretch", props.snapshot.stretch ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("
|
|
57
|
+
return _$ssr(_tmpl$, _$ssrAttribute("data-chart-kind", _$escape(props.snapshot.kind, true), false), _$ssrStyle(props.style), _$ssrAttribute("aria-label", _$escape(chartMessages().interactiveChart, true), false), _$ssrAttribute("data-stretch", props.snapshot.stretch ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("min-width:", props.snapshot.minWidth ? `${_$escape(props.snapshot.minWidth, true)}px` : _$escape(undefined, true)) + _$ssrStyleProperty(";--k2b-chart-width:", `${_$escape(props.snapshot.width, true)}px`) + _$ssrStyleProperty(";--k2b-chart-height:", `${_$escape(props.snapshot.height, true)}px`) + _$ssrStyleProperty(";aspect-ratio:", `${_$escape(props.snapshot.width, true)}/${_$escape(props.snapshot.height, true)}`), isServer ? selectedChartSvg(props.snapshot.svg, props.snapshot.marks.filter(m => m.rowKey === props.selectedKey).map(m => m.datum)) : props.snapshot.svg, _$ssrAttribute("id", _$escape(id, true), false));
|
|
54
58
|
}
|
|
55
59
|
//# sourceMappingURL=ChartSnapshotView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/ChartSnapshotView.tsx"],"sourcesContent":["import { createEffect, createUniqueId, type JSX, onCleanup, onMount } from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nimport type { ChartCursor } from \"./chart-cursor\";\nimport { createChartInspection } from \"./chart-inspection\";\nimport { closeChartInspectionOnOutside, sameChartDatum } from \"./chart-inspection-core\";\nimport { useChartMessages } from \"./chart-messages\";\nimport type { ChartSnapshot } from \"./chart-snapshot\";\nimport { selectedChartSvg } from \"./chart-svg\";\n\n/** Internal display for server-prepared geometry. Viewports are snapshot-owned. */\nexport function ChartSnapshotView(props: {\n snapshot: ChartSnapshot;\n cursor?: ChartCursor;\n selectedKey: string | null;\n onSelect: (key: string) => void;\n style?: JSX.CSSProperties;\n}) {\n const chartMessages = useChartMessages();\n let container: HTMLDivElement | undefined;\n let tooltip: HTMLSpanElement | undefined;\n let anchor: HTMLSpanElement | undefined;\n const id = `k2b-chart-tooltip-${createUniqueId()}`;\n const inspection = createChartInspection({\n container: () => container,\n cursor: () => props.cursor,\n tooltip: () => tooltip,\n anchor: () => anchor,\n kind: () => props.snapshot.kind,\n enabled: () => true,\n format: ({ datum }) => props.snapshot.marks.find((m) => sameChartDatum(m.datum, datum))?.tooltip ?? { rows: [] },\n select: ({ datum }) => {\n const mark = props.snapshot.marks.find((m) => sameChartDatum(m.datum, datum));\n if (mark) props.onSelect(mark.rowKey);\n },\n });\n createEffect(() => {\n props.snapshot;\n inspection.invalidate();\n });\n createEffect(() => inspection.selectData(props.snapshot.marks.filter((m) => m.rowKey === props.selectedKey).map((m) => m.datum)));\n onMount(() => {\n onCleanup(\n closeChartInspectionOnOutside({\n container: () => container,\n tooltip: () => tooltip,\n close: inspection.close,\n }),\n );\n });\n onCleanup(inspection.close);\n return (\n <div\n ref={container}\n class=\"k2b-chart\"\n data-chart-kind={props.snapshot.kind}\n data-interactive=\"true\"\n style={props.style}\n role=\"group\"\n aria-label={chartMessages().interactiveChart}\n tabIndex={0}\n onPointerDown={inspection.down}\n onPointerMove={inspection.move}\n onClick={inspection.click}\n onPointerLeave={inspection.leave}\n onFocusIn={inspection.focus}\n onFocusOut={inspection.close}\n onKeyDown={inspection.key}\n >\n <div\n class=\"k2b-chart__svg\"\n data-stretch={props.snapshot.stretch ? \"true\" : undefined}\n style={{\n \"--k2b-chart-width\": `${props.snapshot.width}px`,\n \"--k2b-chart-height\": `${props.snapshot.height}px`,\n \"aspect-ratio\": `${props.snapshot.width}/${props.snapshot.height}`,\n }}\n innerHTML={\n isServer\n ? selectedChartSvg(\n props.snapshot.svg,\n props.snapshot.marks.filter((m) => m.rowKey === props.selectedKey).map((m) => m.datum),\n )\n : props.snapshot.svg\n }\n />\n <span ref={anchor} class=\"k2b-chart__anchor\" aria-hidden=\"true\" />\n <span ref={tooltip} id={id} class=\"k2b-chart__tooltip k2b-tooltip\" role=\"tooltip\" popover=\"manual\" data-instant=\"true\" />\n </div>\n );\n}\n"],"mappings":";;;;;;AAAA,SAAS,YAAY,EAAE,cAAc,EAAY,SAAS,EAAE,OAAO,QAAQ,UAAU;AACrF,SAAS,QAAQ,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":[],"sources":["content/ChartSnapshotView.tsx"],"sourcesContent":["import { createEffect, createUniqueId, type JSX, onCleanup, onMount } from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nimport { useLocale } from \"../intl/locale\";\nimport type { ChartCursor } from \"./chart-cursor\";\nimport { createChartInspection } from \"./chart-inspection\";\nimport { closeChartInspectionOnOutside, sameChartDatum } from \"./chart-inspection-core\";\nimport { useChartMessages } from \"./chart-messages\";\nimport type { ChartSnapshot } from \"./chart-snapshot\";\nimport { selectedChartSvg } from \"./chart-svg\";\n\n/** Internal display for server-prepared geometry. Viewports are snapshot-owned. */\nexport function ChartSnapshotView(props: {\n snapshot: ChartSnapshot;\n cursor?: ChartCursor;\n legend?: () => ParentNode | undefined;\n selectedKey: string | null;\n onSelect: (key: string) => void;\n style?: JSX.CSSProperties;\n}) {\n const locale = useLocale();\n const chartMessages = useChartMessages();\n let container: HTMLDivElement | undefined;\n let tooltip: HTMLSpanElement | undefined;\n let anchor: HTMLSpanElement | undefined;\n const id = `k2b-chart-tooltip-${createUniqueId()}`;\n const inspection = createChartInspection({\n container: () => container,\n locale,\n legend: props.legend,\n cursor: () => props.cursor,\n tooltip: () => tooltip,\n anchor: () => anchor,\n kind: () => props.snapshot.kind,\n enabled: () => true,\n format: ({ datum }) => props.snapshot.marks.find((m) => sameChartDatum(m.datum, datum))?.tooltip ?? { rows: [] },\n select: ({ datum }) => {\n const mark = props.snapshot.marks.find((m) => sameChartDatum(m.datum, datum));\n if (mark) props.onSelect(mark.rowKey);\n },\n });\n createEffect(() => {\n props.snapshot;\n inspection.invalidate();\n });\n createEffect(() => inspection.selectData(props.snapshot.marks.filter((m) => m.rowKey === props.selectedKey).map((m) => m.datum)));\n onMount(() => {\n onCleanup(\n closeChartInspectionOnOutside({\n container: () => container,\n tooltip: () => tooltip,\n close: inspection.close,\n }),\n );\n });\n onCleanup(inspection.close);\n return (\n <div\n ref={container}\n class=\"k2b-chart\"\n data-chart-kind={props.snapshot.kind}\n data-interactive=\"true\"\n style={props.style}\n role=\"group\"\n aria-label={chartMessages().interactiveChart}\n tabIndex={0}\n onPointerDown={inspection.down}\n onPointerMove={inspection.move}\n onClick={inspection.click}\n onPointerLeave={inspection.leave}\n onFocusIn={inspection.focus}\n onFocusOut={inspection.close}\n onKeyDown={inspection.key}\n >\n <div\n class=\"k2b-chart__svg\"\n data-stretch={props.snapshot.stretch ? \"true\" : undefined}\n style={{\n \"min-width\": props.snapshot.minWidth ? `${props.snapshot.minWidth}px` : undefined,\n \"--k2b-chart-width\": `${props.snapshot.width}px`,\n \"--k2b-chart-height\": `${props.snapshot.height}px`,\n \"aspect-ratio\": `${props.snapshot.width}/${props.snapshot.height}`,\n }}\n innerHTML={\n isServer\n ? selectedChartSvg(\n props.snapshot.svg,\n props.snapshot.marks.filter((m) => m.rowKey === props.selectedKey).map((m) => m.datum),\n )\n : props.snapshot.svg\n }\n />\n <span ref={anchor} class=\"k2b-chart__anchor\" aria-hidden=\"true\" />\n <span ref={tooltip} id={id} class=\"k2b-chart__tooltip k2b-tooltip\" role=\"tooltip\" popover=\"manual\" data-instant=\"true\" />\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|