@richardmcquiston01/dashboard-widgets-toolkit 0.1.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/LICENSE +202 -0
- package/README.md +324 -0
- package/dist/core.cjs +836 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +93 -0
- package/dist/core.d.ts +93 -0
- package/dist/core.js +778 -0
- package/dist/core.js.map +1 -0
- package/dist/index.cjs +836 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +778 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +1273 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +203 -0
- package/dist/react.d.ts +203 -0
- package/dist/react.js +1248 -0
- package/dist/react.js.map +1 -0
- package/dist/scale-WlRozDCf.d.cts +416 -0
- package/dist/scale-WlRozDCf.d.ts +416 -0
- package/dist/styles.css +550 -0
- package/package.json +121 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/format.ts","../src/core/scale.ts","../src/react/palette.ts","../src/react/settings.tsx","../src/react/charts.tsx","../src/core/url.ts","../src/react/primitives.tsx","../src/react/renderers.tsx","../src/react/card.tsx","../src/core/layout.ts","../src/react/dashboard.tsx"],"names":["createContext","jsx","useContext","useId","useState","jsxs","Fragment"],"mappings":"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","file":"react.cjs","sourcesContent":["/**\n * Number formatting via `Intl`, with an injectable locale (undefined uses\n * the runtime's default), plus KPI period-over-period deltas.\n */\n\nimport type { ValueFormat } from './payload.js';\n\nexport type Locale = string | readonly string[] | undefined;\n\nexport interface FormatOptions {\n readonly locale?: Locale;\n /** ISO 4217 code for `currency`. Default \"USD\". */\n readonly currency?: string;\n /** \"1.2K\" style, for axis ticks. */\n readonly compact?: boolean;\n}\n\nexport const DEFAULT_CURRENCY = 'USD';\n\nfunction localeArgument(locale: Locale): string | string[] | undefined {\n return locale === undefined || typeof locale === 'string'\n ? locale\n : [...locale];\n}\n\nfunction numberFormat(\n locale: Locale,\n options: Intl.NumberFormatOptions\n): Intl.NumberFormat {\n try {\n return new Intl.NumberFormat(localeArgument(locale), options);\n } catch {\n // An invalid locale tag or currency code: fall back to the default\n // locale and a plain number rather than throwing mid-render.\n const { style: _style, currency: _currency, ...rest } = options;\n return new Intl.NumberFormat(undefined, rest);\n }\n}\n\n/**\n * Formats `value` as a count (\"1,284\"), money (\"$12.50\", major units) or a\n * percent (\"25%\" from 0.25).\n */\nexport function formatValue(\n value: number,\n format: ValueFormat,\n options: FormatOptions = {}\n): string {\n if (!Number.isFinite(value)) {\n return '—';\n }\n const compact: Intl.NumberFormatOptions = options.compact\n ? { notation: 'compact', maximumFractionDigits: 1 }\n : {};\n switch (format) {\n case 'number':\n return numberFormat(options.locale, {\n maximumFractionDigits: 2,\n ...compact,\n }).format(value);\n case 'currency': {\n const currency: string = (\n options.currency ?? DEFAULT_CURRENCY\n ).toUpperCase();\n const formatter = numberFormat(options.locale, {\n style: 'currency',\n currency,\n ...compact,\n });\n const text: string = formatter.format(value);\n // The fallback formatter has no currency, so say which one it was.\n return formatter.resolvedOptions().style === 'currency'\n ? text\n : `${text} ${currency}`;\n }\n case 'percent':\n return numberFormat(options.locale, {\n style: 'percent',\n maximumFractionDigits: 1,\n ...compact,\n }).format(value);\n }\n}\n\n/** A plain count, e.g. \"1,284\". */\nexport function formatCount(value: number, locale?: Locale): string {\n return formatValue(value, 'number', { locale });\n}\n\n/** `part` as a whole percentage of `total` (0 when total is 0 or less). */\nexport function shareOf(part: number, total: number): number {\n return total <= 0 ? 0 : Math.round((part / total) * 100);\n}\n\n/**\n * Change from `previous` to `current` in percent (unrounded), or null when\n * there is nothing to compare: no previous value, or a previous of 0.\n */\nexport function percentChange(\n current: number,\n previous: number | null | undefined\n): number | null {\n if (\n previous === null ||\n previous === undefined ||\n previous === 0 ||\n !Number.isFinite(previous) ||\n !Number.isFinite(current)\n ) {\n return null;\n }\n return ((current - previous) / Math.abs(previous)) * 100;\n}\n\n/**\n * \"+12%\", \"-8%\", \"±0%\". Below 10% one decimal is kept (\"+2.5%\"), so small\n * changes don't round away.\n */\nexport function formatPercentChange(change: number, locale?: Locale): string {\n const digits: number = Math.abs(change) < 10 ? 1 : 0;\n const rounded: number = Number(change.toFixed(digits));\n if (rounded === 0) {\n return '±0%';\n }\n return numberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: digits,\n signDisplay: 'exceptZero',\n }).format(rounded / 100);\n}\n\nexport type DeltaDirection = 'up' | 'down' | 'flat';\nexport type DeltaSentiment = 'good' | 'bad' | 'neutral';\n\nexport interface KpiDelta {\n /** Percent change, unrounded. */\n readonly percent: number;\n readonly direction: DeltaDirection;\n /** Direction combined with whether higher is better. */\n readonly sentiment: DeltaSentiment;\n /** \"+12%\" */\n readonly text: string;\n /** \"+12% vs previous period\" */\n readonly description: string;\n}\n\nexport interface KpiDeltaOptions {\n /** Default true. */\n readonly higherIsBetter?: boolean;\n readonly locale?: Locale;\n /** What the change is against. Default \"previous period\". */\n readonly comparisonLabel?: string;\n}\n\n/** The default comparison wording in delta descriptions. */\nexport const DEFAULT_COMPARISON_LABEL = 'previous period';\n\n/**\n * The period-over-period change for a KPI, or null when it can't be worked\n * out (no previous value, or a previous of 0).\n */\nexport function kpiDelta(\n current: number,\n previous: number | null | undefined,\n options: KpiDeltaOptions = {}\n): KpiDelta | null {\n const percent: number | null = percentChange(current, previous);\n if (percent === null) {\n return null;\n }\n const text: string = formatPercentChange(percent, options.locale);\n const direction: DeltaDirection =\n text === '±0%' ? 'flat' : percent > 0 ? 'up' : 'down';\n const higherIsBetter: boolean = options.higherIsBetter ?? true;\n const sentiment: DeltaSentiment =\n direction === 'flat'\n ? 'neutral'\n : (direction === 'up') === higherIsBetter\n ? 'good'\n : 'bad';\n return {\n percent,\n direction,\n sentiment,\n text,\n description: `${text} vs ${options.comparisonLabel ?? DEFAULT_COMPARISON_LABEL}`,\n };\n}\n","/** Axis maths for charts: clean domains and tick values. Pure. */\n\n/** The smallest 1, 2 or 5 × 10^n that is at least `value` (1 for 0 or less). */\nexport function niceStep(value: number): number {\n if (!(value > 0) || !Number.isFinite(value)) return 1;\n const exponent: number = Math.floor(Math.log10(value));\n const fraction: number = value / 10 ** exponent;\n const nice: number =\n fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return nice * 10 ** exponent;\n}\n\nexport interface NiceDomain {\n readonly min: number;\n readonly max: number;\n /** From min to max inclusive, evenly spaced on a clean step. */\n readonly ticks: readonly number[];\n}\n\n/**\n * A y-axis domain that always includes 0 (bars grow from a single\n * baseline), rounded out to a clean step, with about `tickCount` intervals.\n */\nexport function niceDomain(\n values: readonly number[],\n tickCount: number = 4\n): NiceDomain {\n const finite: number[] = values.filter((v) => Number.isFinite(v));\n let low: number = Math.min(0, ...finite);\n let high: number = Math.max(0, ...finite);\n if (low === high) {\n high = 1;\n low = 0;\n }\n const step: number = niceStep((high - low) / Math.max(1, tickCount));\n const min: number = Math.floor(low / step) * step;\n const max: number = Math.ceil(high / step) * step;\n const ticks: number[] = [];\n const count: number = Math.round((max - min) / step);\n for (let index = 0; index <= count; index++) {\n ticks.push(Number((min + index * step).toPrecision(12)));\n }\n return { min, max, ticks };\n}\n\n/**\n * Show every `n`th x label so at most `maxLabels` appear (always at least 1).\n */\nexport function labelStride(count: number, maxLabels: number = 6): number {\n return Math.max(1, Math.ceil(count / Math.max(1, maxLabels)));\n}\n","/**\n * Default colours, used as `var(--dwt-*, fallback)` so charts read correctly\n * without the stylesheet. `styles.css` redefines them for dark mode, and an\n * app can override any of them with its own CSS custom properties.\n *\n * The categorical order is the dataviz reference palette, validated for\n * colour-vision deficiency on adjacent pairs in light and dark modes. Slots\n * are assigned in this fixed order, never cycled, and follow the series\n * (its position in the payload), never its rank.\n */\nexport const DEFAULT_SERIES_COLORS: readonly string[] = [\n '#2a78d6',\n '#eb6834',\n '#1baf7a',\n '#eda100',\n '#e87ba4',\n '#008300',\n '#4a3aa7',\n '#e34948',\n];\n\n/** `var(--dwt-series-N, #hex)` for the series at `index` (0-based). */\nexport function seriesColor(index: number): string {\n const slot: number = Math.min(index, DEFAULT_SERIES_COLORS.length - 1);\n return `var(--dwt-series-${slot + 1}, ${DEFAULT_SERIES_COLORS[slot] ?? '#2a78d6'})`;\n}\n\nexport const CHART_COLORS = {\n surface: 'var(--dwt-surface, #fcfcfb)',\n grid: 'var(--dwt-grid, #e1e0d9)',\n baseline: 'var(--dwt-baseline, #c3c2b7)',\n textMuted: 'var(--dwt-text-muted, #6b6a66)',\n textPrimary: 'var(--dwt-text, #0b0b0b)',\n crosshair: 'var(--dwt-crosshair, #898781)',\n meterTrack: 'var(--dwt-meter-track, #cde2fb)',\n barTrack: 'var(--dwt-bar-track, #f0efec)',\n} as const;\n","import { createContext, useContext, type ReactNode } from 'react';\n\nimport type { Locale } from '../core/format.js';\n\n/** Every element that carries a stable `dwt-*` class, for `classNames`. */\nexport type DashboardClassSlot =\n | 'dashboard'\n | 'hiddenBar'\n | 'grid'\n | 'card'\n | 'cardHeader'\n | 'cardTitle'\n | 'cardDescription'\n | 'cardActions'\n | 'cardBody'\n | 'cardFooter'\n | 'button'\n | 'status'\n | 'empty'\n | 'error'\n | 'text'\n | 'kpi'\n | 'gauge'\n | 'table'\n | 'barList'\n | 'alertList'\n | 'chart'\n | 'legend'\n | 'tooltip'\n | 'tableTwin';\n\n/**\n * Extra classes per slot, appended to the `dwt-*` class (never replacing\n * it), e.g. `{ card: 'rounded-lg shadow-sm' }` for Tailwind.\n */\nexport type DashboardClassNames = Partial<Record<DashboardClassSlot, string>>;\n\n/** Interface text, overridable for other languages or house style. */\nexport interface DashboardLabels {\n readonly loading: string;\n readonly retry: string;\n readonly viewAsTable: string;\n readonly hide: (title: string) => string;\n readonly show: (title: string) => string;\n readonly minimize: (title: string) => string;\n readonly expand: (title: string) => string;\n readonly moveEarlier: (title: string) => string;\n readonly moveLater: (title: string) => string;\n readonly hiddenWidgets: string;\n readonly allHidden: string;\n readonly noWidgets: string;\n readonly andMore: (count: number) => string;\n /** The comparison in KPI deltas, e.g. \"previous period\". */\n readonly comparison: string;\n}\n\nexport const DEFAULT_LABELS: DashboardLabels = {\n loading: 'Loading…',\n retry: 'Retry',\n viewAsTable: 'View as table',\n hide: (title) => `Hide ${title}`,\n show: (title) => `Show ${title}`,\n minimize: (title) => `Minimise ${title}`,\n expand: (title) => `Expand ${title}`,\n moveEarlier: (title) => `Move ${title} earlier`,\n moveLater: (title) => `Move ${title} later`,\n hiddenWidgets: 'Hidden:',\n allHidden: 'Every widget is hidden. Show one from the list above.',\n noWidgets: 'No widgets to show.',\n andMore: (count) => `and ${count} more`,\n comparison: 'previous period',\n};\n\nexport interface WidgetSettings {\n /** BCP 47 locale for numbers; undefined uses the runtime default. */\n readonly locale?: Locale;\n /** e.g. \"_blank\". Links always get rel=\"noreferrer\". */\n readonly linkTarget?: string;\n readonly classNames?: DashboardClassNames;\n readonly labels?: Partial<DashboardLabels>;\n}\n\ninterface ResolvedSettings {\n readonly locale: Locale;\n readonly linkTarget: string | undefined;\n readonly classNames: DashboardClassNames;\n readonly labels: DashboardLabels;\n}\n\nconst SettingsContext = createContext<ResolvedSettings>({\n locale: undefined,\n linkTarget: undefined,\n classNames: {},\n labels: DEFAULT_LABELS,\n});\n\n/** Sets locale, link target, extra classes and labels for widgets inside it. */\nexport function WidgetSettingsProvider({\n children,\n ...settings\n}: WidgetSettings & { readonly children?: ReactNode }): ReactNode {\n return (\n <SettingsContext.Provider\n value={{\n locale: settings.locale,\n linkTarget: settings.linkTarget,\n classNames: settings.classNames ?? {},\n labels: { ...DEFAULT_LABELS, ...settings.labels },\n }}\n >\n {children}\n </SettingsContext.Provider>\n );\n}\n\nexport function useWidgetSettings(): ResolvedSettings {\n return useContext(SettingsContext);\n}\n\n/** Joins class names, skipping empty ones. */\nexport function joinClassNames(\n ...names: readonly (string | false | null | undefined)[]\n): string {\n return names\n .filter((name) => typeof name === 'string' && name !== '')\n .join(' ');\n}\n\n/** `dwt-<base>` plus any extra classes for that slot. */\nexport function useSlotClassName(): (\n slot: DashboardClassSlot,\n base: string,\n ...extra: readonly (string | false | null | undefined)[]\n) => string {\n const { classNames } = useWidgetSettings();\n return (slot, base, ...extra) =>\n joinClassNames(base, ...extra, classNames[slot]);\n}\n","import {\n useId,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\n\nimport { formatValue } from '../core/format.js';\nimport type { GraphWidgetData } from '../core/payload.js';\nimport { labelStride, niceDomain, type NiceDomain } from '../core/scale.js';\nimport { CHART_COLORS, seriesColor } from './palette.js';\nimport { useSlotClassName, useWidgetSettings } from './settings.js';\n\n/**\n * GRAPH renderer: inline SVG bar (grouped) or line chart with one y axis.\n *\n * Follows the dataviz marks spec: bars at most 24px thick with a 4px rounded\n * data end and a square baseline end, 2px gaps between adjacent bars; 2px\n * lines; markers r=4 with a 2px surface ring; a 10% wash under a single\n * line; solid hairline grid. Two or more series get a legend; a single\n * series is named by the widget title. Hover or keyboard focus (arrow keys)\n * shows every series at that position, and every value is also in the\n * \"View as table\" twin, so the tooltip never gates a value.\n */\n\nconst WIDTH = 640;\nconst HEIGHT = 220;\nconst MARGIN = { top: 16, right: 20, bottom: 28, left: 56 } as const;\nconst INNER_WIDTH: number = WIDTH - MARGIN.left - MARGIN.right;\nconst INNER_HEIGHT: number = HEIGHT - MARGIN.top - MARGIN.bottom;\nconst MAX_BAR_WIDTH = 24;\nconst BAR_GAP = 2;\nconst BAR_RADIUS = 4;\n/** Above this many points, line markers are only drawn at the end. */\nconst MAX_MARKED_POINTS = 24;\n\n/** A bar with a rounded data end and a square end on the baseline. */\nexport function barPath(\n x: number,\n y: number,\n width: number,\n height: number,\n roundedEnd: 'top' | 'bottom'\n): string {\n const r: number = Math.max(0, Math.min(BAR_RADIUS, width / 2, height));\n const right: number = x + width;\n const bottom: number = y + height;\n const f = (n: number): string => n.toFixed(2);\n if (roundedEnd === 'top') {\n return `M${f(x)},${f(bottom)}V${f(y + r)}Q${f(x)},${f(y)} ${f(x + r)},${f(y)}H${f(right - r)}Q${f(right)},${f(y)} ${f(right)},${f(y + r)}V${f(bottom)}Z`;\n }\n return `M${f(x)},${f(y)}V${f(bottom - r)}Q${f(x)},${f(bottom)} ${f(x + r)},${f(bottom)}H${f(right - r)}Q${f(right)},${f(bottom)} ${f(right)},${f(bottom - r)}V${f(y)}Z`;\n}\n\ninterface ChartModel {\n readonly labels: readonly string[];\n /** values[series][index]; null where a series has no point. */\n readonly values: readonly (readonly (number | null)[])[];\n readonly domain: NiceDomain;\n}\n\n/** Labels by position (first series that has one) and a value matrix. */\nexport function buildChartModel(data: GraphWidgetData): ChartModel {\n const count: number = Math.max(0, ...data.series.map((s) => s.points.length));\n const labels: string[] = [];\n for (let index = 0; index < count; index++) {\n const label: string | undefined = data.series.find(\n (s) => s.points[index] !== undefined\n )?.points[index]?.label;\n labels.push(label ?? '');\n }\n const values: (number | null)[][] = data.series.map((s) =>\n labels.map((_, index) => s.points[index]?.value ?? null)\n );\n const all: number[] = values.flat().filter((v): v is number => v !== null);\n return { labels, values, domain: niceDomain(all) };\n}\n\nfunction yFor(domain: NiceDomain, value: number): number {\n const range: number = domain.max - domain.min || 1;\n return MARGIN.top + INNER_HEIGHT * ((domain.max - value) / range);\n}\n\n/** Bar charts centre each label in a slot; lines span the full width. */\nfunction xFor(chartType: 'bar' | 'line', count: number, index: number): number {\n if (chartType === 'bar') {\n const slot: number = INNER_WIDTH / Math.max(1, count);\n return MARGIN.left + slot * index + slot / 2;\n }\n return count <= 1\n ? MARGIN.left + INNER_WIDTH / 2\n : MARGIN.left + (index / (count - 1)) * INNER_WIDTH;\n}\n\n/** The x band a pointer must be in to select `index` (bigger than the mark). */\nfunction hitBand(\n chartType: 'bar' | 'line',\n count: number,\n index: number\n): { x: number; width: number } {\n if (chartType === 'bar' || count <= 1) {\n const slot: number = INNER_WIDTH / Math.max(1, count);\n return { x: MARGIN.left + slot * index, width: slot };\n }\n const step: number = INNER_WIDTH / (count - 1);\n const left: number = Math.max(\n MARGIN.left,\n xFor('line', count, index) - step / 2\n );\n const right: number = Math.min(\n MARGIN.left + INNER_WIDTH,\n xFor('line', count, index) + step / 2\n );\n return { x: left, width: right - left };\n}\n\nfunction linePath(\n values: readonly (number | null)[],\n domain: NiceDomain,\n count: number\n): string {\n let path = '';\n let penDown = false;\n values.forEach((value, index) => {\n if (value === null) {\n penDown = false;\n return;\n }\n path += `${penDown ? 'L' : 'M'}${xFor('line', count, index).toFixed(2)},${yFor(domain, value).toFixed(2)}`;\n penDown = true;\n });\n return path;\n}\n\nfunction areaPath(\n values: readonly (number | null)[],\n domain: NiceDomain,\n count: number\n): string | null {\n if (values.some((value) => value === null) || values.length < 2) {\n return null;\n }\n const baseline: number = yFor(\n domain,\n Math.max(domain.min, Math.min(0, domain.max))\n );\n const first: string = xFor('line', count, 0).toFixed(2);\n const last: string = xFor('line', count, count - 1).toFixed(2);\n return `M${first},${baseline.toFixed(2)}${linePath(values, domain, count).replace(/^M/, 'L')}L${last},${baseline.toFixed(2)}Z`;\n}\n\n/** A plain-language summary of the chart, for its SVG <desc>. */\nexport function describeChart(\n data: GraphWidgetData,\n model: ChartModel,\n format: (value: number) => string\n): string {\n const first: string = model.labels[0] ?? '';\n const last: string = model.labels[model.labels.length - 1] ?? '';\n const span: string =\n model.labels.length <= 1 ? first : `from ${first} to ${last}`;\n const parts: string[] = data.series.map((series, s) => {\n const present: number[] = (model.values[s] ?? []).filter(\n (v): v is number => v !== null\n );\n if (present.length === 0) return `${series.name}: no values.`;\n const latest: number = present[present.length - 1] ?? 0;\n return `${series.name}: latest ${format(latest)}, high ${format(Math.max(...present))}, low ${format(Math.min(...present))}.`;\n });\n return `${data.chartType === 'bar' ? 'Bar' : 'Line'} chart, ${model.labels.length} point(s) ${span}. ${parts.join(' ')}`;\n}\n\nexport function GraphWidget({\n data,\n title,\n}: {\n readonly data: GraphWidgetData;\n /** The accessible name; defaults to the series names. */\n readonly title?: string;\n}): ReactNode {\n const slot = useSlotClassName();\n const { locale, labels: text } = useWidgetSettings();\n const id: string = useId();\n const [active, setActive] = useState<number | null>(null);\n\n const model: ChartModel = buildChartModel(data);\n const count: number = model.labels.length;\n const currency =\n data.currency === undefined ? {} : { currency: data.currency };\n const format = (value: number): string =>\n formatValue(value, data.valueFormat, { locale, ...currency });\n const formatTick = (value: number): string =>\n formatValue(value, data.valueFormat, {\n locale,\n compact: true,\n ...currency,\n });\n const chartTitle: string = title ?? data.series.map((s) => s.name).join(', ');\n const description: string = describeChart(data, model, format);\n const stride: number = labelStride(count);\n const zeroY: number = yFor(\n model.domain,\n Math.max(model.domain.min, Math.min(0, model.domain.max))\n );\n const seriesCount: number = data.series.length;\n const isBar: boolean = data.chartType === 'bar';\n\n // Bar geometry: thin bars, capped, with the slot's leftover left as air.\n const slotWidth: number = INNER_WIDTH / Math.max(1, count);\n const barWidth: number = Math.max(\n 1,\n Math.min(\n MAX_BAR_WIDTH,\n (slotWidth * 0.7 - BAR_GAP * (seriesCount - 1)) / Math.max(1, seriesCount)\n )\n );\n const groupWidth: number =\n barWidth * seriesCount + BAR_GAP * (seriesCount - 1);\n\n function handleKeyDown(event: ReactKeyboardEvent<SVGSVGElement>): void {\n if (count === 0) return;\n let next: number | null;\n switch (event.key) {\n case 'ArrowRight':\n next = Math.min(count - 1, (active ?? -1) + 1);\n break;\n case 'ArrowLeft':\n next = Math.max(0, (active ?? count) - 1);\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = count - 1;\n break;\n case 'Escape':\n next = null;\n break;\n default:\n return;\n }\n event.preventDefault();\n setActive(next);\n }\n\n const activeLabel: string | null =\n active === null ? null : (model.labels[active] ?? null);\n\n return (\n <figure\n className={slot('chart', 'dwt-chart', `dwt-chart--${data.chartType}`)}\n >\n {seriesCount >= 2 && (\n <ul className={slot('legend', 'dwt-legend')}>\n {data.series.map((series, s) => (\n <li key={s} className=\"dwt-legend-item\">\n <svg\n width=\"16\"\n height=\"10\"\n aria-hidden=\"true\"\n className=\"dwt-legend-key\"\n >\n {isBar ? (\n <rect\n x=\"3\"\n y=\"0\"\n width=\"10\"\n height=\"10\"\n rx=\"2\"\n fill={seriesColor(s)}\n />\n ) : (\n <line\n x1=\"1\"\n x2=\"15\"\n y1=\"5\"\n y2=\"5\"\n stroke={seriesColor(s)}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n )}\n </svg>\n {series.name}\n </li>\n ))}\n </ul>\n )}\n <div className=\"dwt-chart-frame\">\n <svg\n viewBox={`0 0 ${WIDTH} ${HEIGHT}`}\n className=\"dwt-chart-svg\"\n role=\"img\"\n aria-labelledby={`${id}-title ${id}-desc`}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onBlur={() => setActive(null)}\n onPointerLeave={() => setActive(null)}\n width=\"100%\"\n >\n <title id={`${id}-title`}>{chartTitle}</title>\n <desc id={`${id}-desc`}>{description}</desc>\n\n <g className=\"dwt-chart-grid\" aria-hidden=\"true\">\n {model.domain.ticks.map((tick) => (\n <g key={tick}>\n <line\n x1={MARGIN.left}\n x2={WIDTH - MARGIN.right}\n y1={yFor(model.domain, tick)}\n y2={yFor(model.domain, tick)}\n stroke={CHART_COLORS.grid}\n strokeWidth={1}\n />\n <text\n x={MARGIN.left - 8}\n y={yFor(model.domain, tick)}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n className=\"dwt-axis-label dwt-axis-label--y\"\n fill={CHART_COLORS.textMuted}\n fontSize={11}\n >\n {formatTick(tick)}\n </text>\n </g>\n ))}\n <line\n x1={MARGIN.left}\n x2={WIDTH - MARGIN.right}\n y1={zeroY}\n y2={zeroY}\n stroke={CHART_COLORS.baseline}\n strokeWidth={1}\n />\n {model.labels.map((label, index) =>\n index % stride === 0 || index === count - 1 ? (\n <text\n key={index}\n x={xFor(data.chartType, count, index)}\n y={HEIGHT - 8}\n textAnchor={\n !isBar && count > 1 && index === 0\n ? 'start'\n : !isBar && count > 1 && index === count - 1\n ? 'end'\n : 'middle'\n }\n className=\"dwt-axis-label dwt-axis-label--x\"\n fill={CHART_COLORS.textMuted}\n fontSize={11}\n >\n {label}\n </text>\n ) : null\n )}\n </g>\n\n {isBar ? (\n <g className=\"dwt-chart-marks\" aria-hidden=\"true\">\n {model.labels.map((_, index) => (\n <g\n key={index}\n className={\n active !== null && active !== index\n ? 'dwt-mark-group dwt-mark-group--dimmed'\n : 'dwt-mark-group'\n }\n opacity={active !== null && active !== index ? 0.55 : 1}\n >\n {model.values.map((values, s) => {\n const value: number | null = values[index] ?? null;\n if (value === null || value === 0) return null;\n const x: number =\n xFor('bar', count, index) -\n groupWidth / 2 +\n s * (barWidth + BAR_GAP);\n const valueY: number = yFor(model.domain, value);\n const top: number = Math.min(valueY, zeroY);\n const height: number = Math.abs(zeroY - valueY);\n return (\n <path\n key={s}\n className=\"dwt-bar\"\n d={barPath(\n x,\n top,\n barWidth,\n height,\n value >= 0 ? 'top' : 'bottom'\n )}\n fill={seriesColor(s)}\n />\n );\n })}\n </g>\n ))}\n </g>\n ) : (\n <g className=\"dwt-chart-marks\" aria-hidden=\"true\">\n {seriesCount === 1 &&\n (() => {\n const area: string | null = areaPath(\n model.values[0] ?? [],\n model.domain,\n count\n );\n return area === null ? null : (\n <path\n d={area}\n fill={seriesColor(0)}\n fillOpacity={0.1}\n stroke=\"none\"\n />\n );\n })()}\n {model.values.map((values, s) => (\n <path\n key={s}\n className=\"dwt-line\"\n d={linePath(values, model.domain, count)}\n fill=\"none\"\n stroke={seriesColor(s)}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n ))}\n {model.values.map((values, s) =>\n values.map((value, index) => {\n const isLast: boolean = index === count - 1;\n if (value === null) return null;\n if (count > MAX_MARKED_POINTS && !isLast && index !== active)\n return null;\n return (\n <circle\n key={`${s}-${index}`}\n className=\"dwt-marker\"\n cx={xFor('line', count, index)}\n cy={yFor(model.domain, value)}\n r={index === active ? 5 : 4}\n fill={seriesColor(s)}\n stroke={CHART_COLORS.surface}\n strokeWidth={2}\n />\n );\n })\n )}\n {seriesCount === 1 &&\n (() => {\n const last: number | null =\n model.values[0]?.[count - 1] ?? null;\n if (last === null) return null;\n return (\n <text\n className=\"dwt-end-label\"\n x={xFor('line', count, count - 1)}\n y={yFor(model.domain, last) - 10}\n textAnchor=\"end\"\n fill={CHART_COLORS.textPrimary}\n fontSize={12}\n fontWeight={600}\n >\n {format(last)}\n </text>\n );\n })()}\n {active !== null && (\n <line\n className=\"dwt-crosshair\"\n x1={xFor('line', count, active)}\n x2={xFor('line', count, active)}\n y1={MARGIN.top}\n y2={MARGIN.top + INNER_HEIGHT}\n stroke={CHART_COLORS.crosshair}\n strokeWidth={1}\n />\n )}\n </g>\n )}\n\n <g className=\"dwt-hit-layer\">\n {model.labels.map((_, index) => {\n const band = hitBand(data.chartType, count, index);\n return (\n <rect\n key={index}\n x={band.x}\n y={MARGIN.top}\n width={Math.max(0, band.width)}\n height={INNER_HEIGHT}\n fill=\"transparent\"\n onPointerEnter={() => setActive(index)}\n onPointerMove={() => setActive(index)}\n />\n );\n })}\n </g>\n </svg>\n {active !== null && activeLabel !== null && (\n <div\n className={slot('tooltip', 'dwt-tooltip')}\n style={{\n left: `${(xFor(data.chartType, count, active) / WIDTH) * 100}%`,\n }}\n >\n <p className=\"dwt-tooltip-label\">{activeLabel}</p>\n <ul className=\"dwt-tooltip-rows\">\n {data.series.map((series, s) => {\n const value: number | null = model.values[s]?.[active] ?? null;\n return (\n <li key={s} className=\"dwt-tooltip-row\">\n <svg width=\"12\" height=\"4\" aria-hidden=\"true\">\n <line\n x1=\"0\"\n x2=\"12\"\n y1=\"2\"\n y2=\"2\"\n stroke={seriesColor(s)}\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n <strong className=\"dwt-tooltip-value\">\n {value === null ? '—' : format(value)}\n </strong>\n {seriesCount >= 2 && (\n <span className=\"dwt-tooltip-series\">{series.name}</span>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n <details className={slot('tableTwin', 'dwt-table-twin')}>\n <summary>{text.viewAsTable}</summary>\n <table className={slot('table', 'dwt-table')}>\n <thead>\n <tr>\n <th scope=\"col\">{data.xLabel ?? 'Label'}</th>\n {data.series.map((series, s) => (\n <th key={s} scope=\"col\" className=\"dwt-numeric\">\n {series.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {model.labels.map((label, index) => (\n <tr key={index}>\n <th scope=\"row\">{label}</th>\n {model.values.map((values, s) => {\n const value: number | null = values[index] ?? null;\n return (\n <td key={s} className=\"dwt-numeric\">\n {value === null ? '—' : format(value)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </details>\n </figure>\n );\n}\n","/**\n * Link and image URL checks. Payloads often come from an API, so a link is\n * only rendered when it can't run script: http(s), mailto, or a relative\n * path. Nothing here fetches anything.\n */\n\nconst SCHEME_PATTERN = /^([a-z][a-z0-9+.-]*):/i;\n\n// Browsers ignore ASCII control characters and whitespace inside a scheme\n// (\"java\\tscript:\"), so strip them before reading it.\n// eslint-disable-next-line no-control-regex\nconst IGNORED_IN_SCHEME = /[\\u0000- \\u007f]/g;\n\nfunction schemeOf(url: string): string | null {\n const match: RegExpExecArray | null = SCHEME_PATTERN.exec(\n url.replace(IGNORED_IN_SCHEME, '')\n );\n return match === null ? null : (match[1] ?? '').toLowerCase();\n}\n\n/** Whether `url` is safe as an anchor href: http, https, mailto or relative. */\nexport function isSafeHref(url: string): boolean {\n if (url.trim() === '') {\n return false;\n }\n const scheme: string | null = schemeOf(url);\n return (\n scheme === null ||\n scheme === 'http' ||\n scheme === 'https' ||\n scheme === 'mailto'\n );\n}\n\n/** Whether `url` is safe as an image source: http, https or relative. */\nexport function isSafeImageUrl(url: string): boolean {\n if (url.trim() === '') {\n return false;\n }\n const scheme: string | null = schemeOf(url);\n return scheme === null || scheme === 'http' || scheme === 'https';\n}\n","import type { ReactNode } from 'react';\n\nimport { isSafeHref, isSafeImageUrl } from '../core/url.js';\nimport { useWidgetSettings } from './settings.js';\n\n/**\n * An anchor with rel=\"noreferrer\", or plain text when there is no href or\n * it isn't a safe scheme (http, https, mailto, relative). Never fetches.\n */\nexport function WidgetLink({\n href,\n className,\n children,\n}: {\n readonly href: string | undefined;\n readonly className?: string;\n readonly children: ReactNode;\n}): ReactNode {\n const { linkTarget } = useWidgetSettings();\n if (href === undefined || !isSafeHref(href)) {\n return <span className={className}>{children}</span>;\n }\n return (\n <a href={href} target={linkTarget} rel=\"noreferrer\" className={className}>\n {children}\n </a>\n );\n}\n\n/** A decorative square thumbnail; nothing for an unsafe or missing URL. */\nexport function Thumbnail({\n url,\n}: {\n readonly url: string | undefined;\n}): ReactNode {\n if (url === undefined || !isSafeImageUrl(url)) {\n return (\n <span\n className=\"dwt-thumbnail dwt-thumbnail--placeholder\"\n aria-hidden=\"true\"\n />\n );\n }\n return (\n <img\n className=\"dwt-thumbnail\"\n src={url}\n alt=\"\"\n width={36}\n height={36}\n loading=\"lazy\"\n decoding=\"async\"\n />\n );\n}\n","import type { ReactNode } from 'react';\n\nimport {\n formatValue,\n kpiDelta,\n shareOf,\n type KpiDelta,\n} from '../core/format.js';\nimport type {\n AlertListWidgetData,\n BarListWidgetData,\n GaugeWidgetData,\n KpiWidgetData,\n TableWidgetData,\n TextWidgetData,\n WidgetData,\n} from '../core/payload.js';\nimport { GraphWidget } from './charts.js';\nimport { CHART_COLORS, seriesColor } from './palette.js';\nimport { Thumbnail, WidgetLink } from './primitives.js';\nimport { useSlotClassName, useWidgetSettings } from './settings.js';\n\n/** TEXT: a headline value and its label. */\nexport function TextWidget({\n data,\n}: {\n readonly data: TextWidgetData;\n}): ReactNode {\n const slot = useSlotClassName();\n return (\n <div className={slot('text', 'dwt-text')}>\n <p className=\"dwt-figure\">{data.value}</p>\n <p className=\"dwt-figure-label\">{data.label}</p>\n </div>\n );\n}\n\nconst DELTA_ARROWS: Readonly<Record<KpiDelta['direction'], string>> = {\n up: '▲',\n down: '▼',\n flat: '■',\n};\n\n/**\n * KPI: a stat tile. The change against the previous period carries an arrow\n * and signed text as well as colour, so it never relies on colour alone.\n */\nexport function KpiWidget({\n data,\n}: {\n readonly data: KpiWidgetData;\n}): ReactNode {\n const slot = useSlotClassName();\n const { locale, labels } = useWidgetSettings();\n const value: string = formatValue(data.value, data.format, {\n locale,\n ...(data.currency === undefined ? {} : { currency: data.currency }),\n });\n const delta: KpiDelta | null = kpiDelta(data.value, data.previous, {\n locale,\n comparisonLabel: labels.comparison,\n ...(data.higherIsBetter === undefined\n ? {}\n : { higherIsBetter: data.higherIsBetter }),\n });\n return (\n <div className={slot('kpi', 'dwt-kpi')}>\n <p className=\"dwt-figure-label\">{data.label}</p>\n <p className=\"dwt-figure\">{value}</p>\n {(delta !== null || data.hint !== undefined) && (\n <p className=\"dwt-kpi-meta\">\n {delta !== null && (\n <span\n className={`dwt-delta dwt-delta--${delta.sentiment} dwt-delta--${delta.direction}`}\n >\n <span aria-hidden=\"true\" className=\"dwt-delta-arrow\">\n {DELTA_ARROWS[delta.direction]}\n </span>{' '}\n {delta.text}\n <span className=\"dwt-delta-comparison\">\n {' '}\n vs {labels.comparison}\n </span>\n </span>\n )}\n {data.hint !== undefined && (\n <span className=\"dwt-hint\">{data.hint}</span>\n )}\n </p>\n )}\n </div>\n );\n}\n\n/** GAUGE: a meter whose track is a lighter step of the fill's own hue. */\nexport function GaugeWidget({\n data,\n}: {\n readonly data: GaugeWidgetData;\n}): ReactNode {\n const slot = useSlotClassName();\n const { locale } = useWidgetSettings();\n const max: number = data.max > 0 ? data.max : 1;\n const percent: number = Math.max(0, Math.min(100, (data.value / max) * 100));\n return (\n <div className={slot('gauge', 'dwt-gauge')}>\n <div\n className=\"dwt-meter\"\n role=\"meter\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={data.value}\n aria-label={data.label}\n style={{ background: CHART_COLORS.meterTrack }}\n >\n <div\n className=\"dwt-meter-fill\"\n style={{ width: `${percent}%`, background: seriesColor(0) }}\n />\n </div>\n <p className=\"dwt-gauge-caption\">\n <span className=\"dwt-gauge-value\">\n {formatValue(data.value, 'number', { locale })} /{' '}\n {formatValue(max, 'number', { locale })}\n </span>{' '}\n <span className=\"dwt-figure-label\">{data.label}</span>\n </p>\n </div>\n );\n}\n\n/** TABLE: a data table; cells with a safe `href` become links. */\nexport function TableWidget({\n data,\n}: {\n readonly data: TableWidgetData;\n}): ReactNode {\n const slot = useSlotClassName();\n return (\n <div className=\"dwt-table-wrap\">\n <table className={slot('table', 'dwt-table')}>\n <thead>\n <tr>\n {data.columns.map((column, index) => (\n <th\n key={index}\n scope=\"col\"\n className={column.numeric === true ? 'dwt-numeric' : undefined}\n >\n {column.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.rows.map((row, rowIndex) => (\n <tr key={rowIndex}>\n {row.map((cell, cellIndex) => (\n <td\n key={cellIndex}\n className={\n data.columns[cellIndex]?.numeric === true\n ? 'dwt-numeric'\n : undefined\n }\n >\n {cell.href === undefined ? (\n cell.text\n ) : (\n <WidgetLink href={cell.href} className=\"dwt-link\">\n {cell.text}\n </WidgetLink>\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n {data.footer !== undefined && <p className=\"dwt-note\">{data.footer}</p>}\n </div>\n );\n}\n\n/**\n * BAR_LIST: labelled horizontal bars. One series, so one colour (slot 1)\n * for every bar; the value text sits beside the bar, never inside it.\n */\nexport function BarListWidget({\n data,\n}: {\n readonly data: BarListWidgetData;\n}): ReactNode {\n const slot = useSlotClassName();\n const { locale } = useWidgetSettings();\n const denominator: number =\n data.total !== undefined && data.total > 0\n ? data.total\n : Math.max(0, ...data.items.map((item) => item.value));\n return (\n <ul className={slot('barList', 'dwt-bar-list')}>\n {data.items.map((item, index) => {\n const width: number =\n denominator > 0\n ? Math.max(0, Math.min(100, (item.value / denominator) * 100))\n : 0;\n const display: string =\n item.display ??\n (data.total !== undefined\n ? `${formatValue(item.value, 'number', { locale })} (${shareOf(item.value, data.total)}%)`\n : formatValue(item.value, 'number', { locale }));\n return (\n <li key={`${index}-${item.label}`} className=\"dwt-bar-row\">\n <span className=\"dwt-bar-label\">{item.label}</span>\n <span className=\"dwt-bar-value\">{display}</span>\n <span\n className=\"dwt-bar-track\"\n aria-hidden=\"true\"\n style={{ background: CHART_COLORS.barTrack }}\n >\n <span\n className=\"dwt-bar-fill\"\n style={{ width: `${width}%`, background: seriesColor(0) }}\n />\n </span>\n </li>\n );\n })}\n </ul>\n );\n}\n\n/** ALERT_LIST: rows needing attention, with thumbnail, link and value. */\nexport function AlertListWidget({\n data,\n}: {\n readonly data: AlertListWidgetData;\n}): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n if (data.items.length === 0) {\n return <p className={slot('empty', 'dwt-empty')}>{data.emptyText}</p>;\n }\n const more: number = data.total - data.items.length;\n return (\n <div>\n <ul className={slot('alertList', 'dwt-alert-list')}>\n {data.items.map((item, index) => (\n <li key={`${index}-${item.title}`} className=\"dwt-alert-row\">\n <Thumbnail url={item.thumbnailUrl} />\n <span className=\"dwt-alert-main\">\n <WidgetLink href={item.href} className=\"dwt-alert-title\">\n {item.title}\n </WidgetLink>\n {item.detail !== undefined && (\n <span className=\"dwt-alert-detail\">{item.detail}</span>\n )}\n </span>\n <span className=\"dwt-alert-value\">{item.valueLabel}</span>\n </li>\n ))}\n </ul>\n {more > 0 && <p className=\"dwt-note\">{labels.andMore(more)}</p>}\n </div>\n );\n}\n\n/** Renders any payload with the renderer for its kind. */\nexport function WidgetContent({\n data,\n}: {\n readonly data: WidgetData;\n}): ReactNode {\n switch (data.kind) {\n case 'TEXT':\n return <TextWidget data={data} />;\n case 'KPI':\n return <KpiWidget data={data} />;\n case 'GAUGE':\n return <GaugeWidget data={data} />;\n case 'TABLE':\n return <TableWidget data={data} />;\n case 'BAR_LIST':\n return <BarListWidget data={data} />;\n case 'ALERT_LIST':\n return <AlertListWidget data={data} />;\n case 'GRAPH':\n return <GraphWidget data={data} />;\n }\n}\n","import { useId, type ReactNode } from 'react';\n\nimport type { WidgetSize } from '../core/definition.js';\nimport type { DashboardWidget } from '../core/resolve.js';\nimport { WidgetContent } from './renderers.js';\nimport { useSlotClassName, useWidgetSettings } from './settings.js';\n\nexport interface WidgetCardProps {\n readonly title: string;\n readonly description?: string;\n /** Extra controls in the header (move, hide...), before the minimise toggle. */\n readonly actions?: ReactNode;\n readonly minimized?: boolean;\n /** Shows the minimise/expand toggle when given. */\n readonly onToggleMinimized?: () => void;\n /** Default 'ok', which renders `children`. */\n readonly status?: 'ok' | 'loading' | 'empty' | 'error';\n readonly emptyText?: string;\n readonly error?: string;\n /** Shows a Retry button on the error state when given. */\n readonly onRetry?: () => void;\n readonly footer?: ReactNode;\n readonly size?: WidgetSize;\n /** 2 to 6; default 2. */\n readonly headingLevel?: 2 | 3 | 4 | 5 | 6;\n readonly className?: string;\n readonly children?: ReactNode;\n}\n\n/**\n * The frame every widget sits in: title, optional description and actions,\n * a minimise toggle, and loading, empty and error states.\n */\nexport function WidgetCard({\n title,\n description,\n actions,\n minimized = false,\n onToggleMinimized,\n status = 'ok',\n emptyText,\n error,\n onRetry,\n footer,\n size,\n headingLevel = 2,\n className,\n children,\n}: WidgetCardProps): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const id: string = useId();\n const Heading = `h${headingLevel}` as const;\n const bodyId = `${id}-body`;\n\n let body: ReactNode;\n switch (status) {\n case 'loading':\n body = (\n <p role=\"status\" className={slot('status', 'dwt-status')}>\n {labels.loading}\n </p>\n );\n break;\n case 'empty':\n body = <p className={slot('empty', 'dwt-empty')}>{emptyText ?? ''}</p>;\n break;\n case 'error':\n body = (\n <div role=\"alert\" className={slot('error', 'dwt-error')}>\n <p className=\"dwt-error-message\">{error ?? ''}</p>\n {onRetry !== undefined && (\n <button\n type=\"button\"\n className={slot('button', 'dwt-button')}\n onClick={onRetry}\n >\n {labels.retry}\n </button>\n )}\n </div>\n );\n break;\n case 'ok':\n body = children;\n break;\n }\n\n return (\n <section\n aria-labelledby={`${id}-title`}\n className={slot(\n 'card',\n 'dwt-card',\n `dwt-card--${status}`,\n minimized && 'dwt-card--minimized',\n size !== undefined && `dwt-card--size-${size}`,\n className\n )}\n >\n <header className={slot('cardHeader', 'dwt-card-header')}>\n <div className=\"dwt-card-heading\">\n <Heading\n id={`${id}-title`}\n className={slot('cardTitle', 'dwt-card-title')}\n >\n {title}\n </Heading>\n {description !== undefined && !minimized && (\n <p className={slot('cardDescription', 'dwt-card-description')}>\n {description}\n </p>\n )}\n </div>\n {(actions !== undefined || onToggleMinimized !== undefined) && (\n <div className={slot('cardActions', 'dwt-card-actions')}>\n {actions}\n {onToggleMinimized !== undefined && (\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-expanded={!minimized}\n aria-controls={bodyId}\n aria-label={\n minimized ? labels.expand(title) : labels.minimize(title)\n }\n title={\n minimized ? labels.expand(title) : labels.minimize(title)\n }\n onClick={onToggleMinimized}\n >\n <span aria-hidden=\"true\">{minimized ? '▸' : '▾'}</span>\n </button>\n )}\n </div>\n )}\n </header>\n <div\n id={bodyId}\n className={slot('cardBody', 'dwt-card-body')}\n hidden={minimized}\n >\n {minimized ? null : body}\n </div>\n {footer !== undefined && footer !== null && !minimized && (\n <div className={slot('cardFooter', 'dwt-card-footer')}>{footer}</div>\n )}\n </section>\n );\n}\n\n/** The title to show: alert lists add their total, e.g. \"Low stock (3)\". */\nexport function widgetTitle(widget: DashboardWidget): string {\n if (\n widget.status === 'ok' &&\n widget.data.kind === 'ALERT_LIST' &&\n widget.data.total > 0\n ) {\n return `${widget.definition.title} (${widget.data.total})`;\n }\n return widget.definition.title;\n}\n\nexport interface ResolvedWidgetCardProps {\n readonly widget: DashboardWidget;\n readonly actions?: ReactNode;\n readonly minimized?: boolean;\n readonly onToggleMinimized?: () => void;\n readonly onRetry?: () => void;\n readonly headingLevel?: 2 | 3 | 4 | 5 | 6;\n readonly className?: string;\n}\n\n/** A WidgetCard for a resolved (or loading) widget, with its renderer. */\nexport function ResolvedWidgetCard({\n widget,\n ...props\n}: ResolvedWidgetCardProps): ReactNode {\n const { definition } = widget;\n return (\n <WidgetCard\n {...props}\n title={widgetTitle(widget)}\n status={widget.status}\n {...(definition.description === undefined\n ? {}\n : { description: definition.description })}\n {...(definition.defaultSize === undefined\n ? {}\n : { size: definition.defaultSize })}\n {...(widget.status === 'empty' ? { emptyText: widget.emptyText } : {})}\n {...(widget.status === 'error' ? { error: widget.error } : {})}\n >\n {widget.status === 'ok' ? <WidgetContent data={widget.data} /> : null}\n </WidgetCard>\n );\n}\n","/**\n * A viewer's dashboard customisation: order, hidden and minimised widgets.\n * Pure functions over a small JSON-serialisable object. Persist it however\n * you like (a settings table, localStorage); `parseLayout` tolerates\n * anything, so a corrupt saved value never breaks the dashboard.\n *\n * Generalised from Maker Toolkit's desktop `dashboard-layout.ts`.\n */\n\n/** What layout functions need from a widget definition. */\nexport interface LayoutItem {\n readonly key: string;\n readonly sortOrder?: number;\n}\n\nexport interface DashboardLayout {\n /** Widget keys in display order. Keys not listed follow, by sortOrder. */\n readonly order: readonly string[];\n /** Widget keys removed from the dashboard (restorable). */\n readonly hidden: readonly string[];\n /** Widget keys collapsed to their header. */\n readonly minimized: readonly string[];\n}\n\nexport const EMPTY_LAYOUT: DashboardLayout = Object.freeze({\n order: Object.freeze([]) as readonly string[],\n hidden: Object.freeze([]) as readonly string[],\n minimized: Object.freeze([]) as readonly string[],\n});\n\nfunction uniqueStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n const seen = new Set<string>();\n for (const entry of value) {\n if (typeof entry === 'string' && entry !== '') seen.add(entry);\n }\n return [...seen];\n}\n\n/**\n * Reads a saved layout: a JSON string or an already-parsed object. Missing,\n * corrupt or wrongly typed values give the empty layout (or empty lists for\n * the fields that are wrong); non-string and duplicate keys are dropped.\n */\nexport function parseLayout(raw: unknown): DashboardLayout {\n let value: unknown = raw;\n if (typeof raw === 'string') {\n try {\n value = JSON.parse(raw);\n } catch {\n return EMPTY_LAYOUT;\n }\n }\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return EMPTY_LAYOUT;\n }\n const record = value as Readonly<Record<string, unknown>>;\n const order: string[] = uniqueStrings(record['order']);\n const hidden: string[] = uniqueStrings(record['hidden']);\n const minimized: string[] = uniqueStrings(record['minimized']);\n if (order.length === 0 && hidden.length === 0 && minimized.length === 0) {\n return EMPTY_LAYOUT;\n }\n return { order, hidden, minimized };\n}\n\n/** The JSON string to persist. */\nexport function serializeLayout(layout: DashboardLayout): string {\n return JSON.stringify({\n order: [...layout.order],\n hidden: [...layout.hidden],\n minimized: [...layout.minimized],\n });\n}\n\nfunction bySortOrder<T extends LayoutItem>(items: readonly T[]): T[] {\n return items\n .map((item, index) => ({ item, index }))\n .sort(\n (a, b) =>\n (a.item.sortOrder ?? 0) - (b.item.sortOrder ?? 0) || a.index - b.index\n )\n .map(({ item }) => item);\n}\n\n/**\n * The widgets to show, in order: saved keys first (when still present),\n * then widgets the layout doesn't know yet, by sortOrder. Hidden widgets\n * are left out.\n */\nexport function visibleWidgets<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout\n): T[] {\n const hidden = new Set<string>(layout.hidden);\n const visible: T[] = definitions.filter((d) => !hidden.has(d.key));\n const byKey = new Map<string, T>(visible.map((d) => [d.key, d]));\n const ordered: T[] = [];\n for (const key of layout.order) {\n const definition: T | undefined = byKey.get(key);\n if (definition !== undefined) {\n ordered.push(definition);\n byKey.delete(key);\n }\n }\n for (const definition of bySortOrder(visible)) {\n if (byKey.has(definition.key)) ordered.push(definition);\n }\n return ordered;\n}\n\n/** Hidden widgets, by sortOrder, for a \"restore\" menu. */\nexport function hiddenWidgets<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout\n): T[] {\n const hidden = new Set<string>(layout.hidden);\n return bySortOrder(definitions.filter((d) => hidden.has(d.key)));\n}\n\n/**\n * Moves `key` to `toIndex` within the current visible order. Returns the\n * same layout object when the key isn't visible or the index is out of\n * range, so callers can skip a save.\n */\nexport function moveWidget<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string,\n toIndex: number\n): DashboardLayout {\n const current: string[] = visibleWidgets(definitions, layout).map(\n (d) => d.key\n );\n const fromIndex: number = current.indexOf(key);\n if (\n fromIndex === -1 ||\n !Number.isInteger(toIndex) ||\n toIndex < 0 ||\n toIndex >= current.length ||\n toIndex === fromIndex\n ) {\n return layout;\n }\n const next: string[] = [...current];\n next.splice(fromIndex, 1);\n next.splice(toIndex, 0, key);\n return { ...layout, order: next };\n}\n\n/** Moves `key` by `offset` places (negative is earlier). Clamped at the ends. */\nexport function moveWidgetBy<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string,\n offset: number\n): DashboardLayout {\n const current: string[] = visibleWidgets(definitions, layout).map(\n (d) => d.key\n );\n const fromIndex: number = current.indexOf(key);\n if (fromIndex === -1) return layout;\n const toIndex: number = Math.max(\n 0,\n Math.min(current.length - 1, fromIndex + Math.trunc(offset))\n );\n return moveWidget(definitions, layout, key, toIndex);\n}\n\n/** Moves `key` one place earlier. */\nexport function moveWidgetUp<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n return moveWidgetBy(definitions, layout, key, -1);\n}\n\n/** Moves `key` one place later. */\nexport function moveWidgetDown<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n return moveWidgetBy(definitions, layout, key, 1);\n}\n\nexport function isHidden(layout: DashboardLayout, key: string): boolean {\n return layout.hidden.includes(key);\n}\n\nexport function isMinimized(layout: DashboardLayout, key: string): boolean {\n return layout.minimized.includes(key);\n}\n\n/** Hides `key`. No-op (same object) if already hidden. */\nexport function hideWidget(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n if (isHidden(layout, key)) return layout;\n return { ...layout, hidden: [...layout.hidden, key] };\n}\n\n/** Shows `key` again, expanded. No-op (same object) if not hidden. */\nexport function showWidget(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n if (!isHidden(layout, key)) return layout;\n return {\n ...layout,\n hidden: layout.hidden.filter((k) => k !== key),\n minimized: layout.minimized.filter((k) => k !== key),\n };\n}\n\n/** Hides or shows `key` (showing also clears its minimised state). */\nexport function toggleHidden(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n return isHidden(layout, key)\n ? showWidget(layout, key)\n : hideWidget(layout, key);\n}\n\n/** Collapses `key` to its header. No-op (same object) if already minimised. */\nexport function minimizeWidget(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n if (isMinimized(layout, key)) return layout;\n return { ...layout, minimized: [...layout.minimized, key] };\n}\n\n/** Expands `key`. No-op (same object) if not minimised. */\nexport function restoreWidget(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n if (!isMinimized(layout, key)) return layout;\n return { ...layout, minimized: layout.minimized.filter((k) => k !== key) };\n}\n\n/** Minimises or restores `key`. */\nexport function toggleMinimized(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n return isMinimized(layout, key)\n ? restoreWidget(layout, key)\n : minimizeWidget(layout, key);\n}\n\n/**\n * Drops keys for widgets that no longer exist. Only pass the full list of\n * definitions (not a role-filtered one), or a viewer's settings for widgets\n * they temporarily can't see are lost.\n */\nexport function pruneLayout<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout\n): DashboardLayout {\n const known = new Set<string>(definitions.map((d) => d.key));\n const keep = (keys: readonly string[]): string[] =>\n keys.filter((k) => known.has(k));\n const next: DashboardLayout = {\n order: keep(layout.order),\n hidden: keep(layout.hidden),\n minimized: keep(layout.minimized),\n };\n return next.order.length === layout.order.length &&\n next.hidden.length === layout.hidden.length &&\n next.minimized.length === layout.minimized.length\n ? layout\n : next;\n}\n","import type { ReactNode } from 'react';\n\nimport type { WidgetDefinition } from '../core/definition.js';\nimport {\n EMPTY_LAYOUT,\n hiddenWidgets,\n isMinimized,\n moveWidgetBy,\n showWidget,\n hideWidget,\n toggleMinimized,\n visibleWidgets,\n type DashboardLayout,\n} from '../core/layout.js';\nimport type { DashboardWidget } from '../core/resolve.js';\nimport { ResolvedWidgetCard } from './card.js';\nimport {\n WidgetSettingsProvider,\n useSlotClassName,\n useWidgetSettings,\n type WidgetSettings,\n} from './settings.js';\n\nexport interface WidgetGridProps {\n /** Rendered in the order given. */\n readonly widgets: readonly DashboardWidget[];\n readonly onRetry?: (key: string) => void;\n readonly headingLevel?: 2 | 3 | 4 | 5 | 6;\n readonly className?: string;\n}\n\n/** A plain grid of widget cards, no layout controls. */\nexport function WidgetGrid({\n widgets,\n onRetry,\n headingLevel,\n className,\n}: WidgetGridProps): ReactNode {\n const slot = useSlotClassName();\n return (\n <div className={slot('grid', 'dwt-grid', className)}>\n {widgets.map((widget) => (\n <ResolvedWidgetCard\n key={widget.definition.key}\n widget={widget}\n {...(headingLevel === undefined ? {} : { headingLevel })}\n {...(onRetry === undefined || widget.status !== 'error'\n ? {}\n : { onRetry: () => onRetry(widget.definition.key) })}\n />\n ))}\n </div>\n );\n}\n\nexport interface DashboardProps extends WidgetSettings {\n /** Resolved (or loading) widgets, any order: the layout orders them. */\n readonly widgets: readonly DashboardWidget[];\n /** The viewer's saved layout. Default: none saved. */\n readonly layout?: DashboardLayout;\n /**\n * Called with the next layout after a move, hide, show, minimise or\n * restore; persist it. Without it the layout is read-only (no controls).\n */\n readonly onLayoutChange?: (layout: DashboardLayout) => void;\n readonly onRetry?: (key: string) => void;\n readonly headingLevel?: 2 | 3 | 4 | 5 | 6;\n readonly className?: string;\n}\n\nfunction DashboardInner({\n widgets,\n layout = EMPTY_LAYOUT,\n onLayoutChange,\n onRetry,\n headingLevel,\n className,\n}: DashboardProps): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const definitions: WidgetDefinition[] = widgets.map((w) => w.definition);\n const byKey = new Map<string, DashboardWidget>(\n widgets.map((w) => [w.definition.key, w])\n );\n const visible: WidgetDefinition[] = visibleWidgets(definitions, layout);\n const hidden: WidgetDefinition[] = hiddenWidgets(definitions, layout);\n const editable: boolean = onLayoutChange !== undefined;\n\n function change(next: DashboardLayout): void {\n if (next !== layout) onLayoutChange?.(next);\n }\n\n return (\n <div className={slot('dashboard', 'dwt-dashboard', className)}>\n {editable && hidden.length > 0 && (\n <div className={slot('hiddenBar', 'dwt-hidden-bar')}>\n <span className=\"dwt-hidden-label\">{labels.hiddenWidgets}</span>\n {hidden.map((definition) => (\n <button\n key={definition.key}\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-show-button')}\n aria-label={labels.show(definition.title)}\n onClick={() => change(showWidget(layout, definition.key))}\n >\n <span aria-hidden=\"true\">+ </span>\n {definition.title}\n </button>\n ))}\n </div>\n )}\n {visible.length === 0 ? (\n <p className={slot('empty', 'dwt-empty', 'dwt-dashboard-empty')}>\n {definitions.length === 0 ? labels.noWidgets : labels.allHidden}\n </p>\n ) : (\n <div className={slot('grid', 'dwt-grid')}>\n {visible.map((definition, index) => {\n const widget: DashboardWidget | undefined = byKey.get(\n definition.key\n );\n if (widget === undefined) return null;\n const key: string = definition.key;\n const title: string = definition.title;\n const actions: ReactNode = editable ? (\n <>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.moveEarlier(title)}\n title={labels.moveEarlier(title)}\n disabled={index === 0}\n onClick={() =>\n change(moveWidgetBy(definitions, layout, key, -1))\n }\n >\n <span aria-hidden=\"true\">↑</span>\n </button>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.moveLater(title)}\n title={labels.moveLater(title)}\n disabled={index === visible.length - 1}\n onClick={() =>\n change(moveWidgetBy(definitions, layout, key, 1))\n }\n >\n <span aria-hidden=\"true\">↓</span>\n </button>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.hide(title)}\n title={labels.hide(title)}\n onClick={() => change(hideWidget(layout, key))}\n >\n <span aria-hidden=\"true\">×</span>\n </button>\n </>\n ) : undefined;\n return (\n <ResolvedWidgetCard\n key={key}\n widget={widget}\n minimized={isMinimized(layout, key)}\n {...(actions === undefined ? {} : { actions })}\n {...(editable\n ? {\n onToggleMinimized: () =>\n change(toggleMinimized(layout, key)),\n }\n : {})}\n {...(headingLevel === undefined ? {} : { headingLevel })}\n {...(onRetry === undefined || widget.status !== 'error'\n ? {}\n : { onRetry: () => onRetry(key) })}\n />\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * A full dashboard: widgets ordered by the viewer's layout, with move,\n * hide/show and minimise controls when `onLayoutChange` is given. Settings\n * (locale, link target, classNames, labels) apply to every widget inside.\n */\nexport function Dashboard({\n locale,\n linkTarget,\n classNames,\n labels,\n ...props\n}: DashboardProps): ReactNode {\n const parent = useWidgetSettings();\n const resolvedLocale = locale ?? parent.locale;\n const resolvedTarget: string | undefined = linkTarget ?? parent.linkTarget;\n return (\n <WidgetSettingsProvider\n {...(resolvedLocale === undefined ? {} : { locale: resolvedLocale })}\n {...(resolvedTarget === undefined ? {} : { linkTarget: resolvedTarget })}\n classNames={{ ...parent.classNames, ...classNames }}\n labels={{ ...parent.labels, ...labels }}\n >\n <DashboardInner {...props} />\n </WidgetSettingsProvider>\n );\n}\n"]}
|
package/dist/react.d.cts
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { D as DashboardWidget, W as WidgetSize, G as GraphWidgetData, N as NiceDomain, L as Locale, a as DashboardLayout, A as AlertListWidgetData, B as BarListWidgetData, b as GaugeWidgetData, K as KpiWidgetData, T as TableWidgetData, c as TextWidgetData, d as WidgetData } from './scale-WlRozDCf.cjs';
|
|
3
|
+
|
|
4
|
+
interface WidgetCardProps {
|
|
5
|
+
readonly title: string;
|
|
6
|
+
readonly description?: string;
|
|
7
|
+
/** Extra controls in the header (move, hide...), before the minimise toggle. */
|
|
8
|
+
readonly actions?: ReactNode;
|
|
9
|
+
readonly minimized?: boolean;
|
|
10
|
+
/** Shows the minimise/expand toggle when given. */
|
|
11
|
+
readonly onToggleMinimized?: () => void;
|
|
12
|
+
/** Default 'ok', which renders `children`. */
|
|
13
|
+
readonly status?: 'ok' | 'loading' | 'empty' | 'error';
|
|
14
|
+
readonly emptyText?: string;
|
|
15
|
+
readonly error?: string;
|
|
16
|
+
/** Shows a Retry button on the error state when given. */
|
|
17
|
+
readonly onRetry?: () => void;
|
|
18
|
+
readonly footer?: ReactNode;
|
|
19
|
+
readonly size?: WidgetSize;
|
|
20
|
+
/** 2 to 6; default 2. */
|
|
21
|
+
readonly headingLevel?: 2 | 3 | 4 | 5 | 6;
|
|
22
|
+
readonly className?: string;
|
|
23
|
+
readonly children?: ReactNode;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The frame every widget sits in: title, optional description and actions,
|
|
27
|
+
* a minimise toggle, and loading, empty and error states.
|
|
28
|
+
*/
|
|
29
|
+
declare function WidgetCard({ title, description, actions, minimized, onToggleMinimized, status, emptyText, error, onRetry, footer, size, headingLevel, className, children, }: WidgetCardProps): ReactNode;
|
|
30
|
+
/** The title to show: alert lists add their total, e.g. "Low stock (3)". */
|
|
31
|
+
declare function widgetTitle(widget: DashboardWidget): string;
|
|
32
|
+
interface ResolvedWidgetCardProps {
|
|
33
|
+
readonly widget: DashboardWidget;
|
|
34
|
+
readonly actions?: ReactNode;
|
|
35
|
+
readonly minimized?: boolean;
|
|
36
|
+
readonly onToggleMinimized?: () => void;
|
|
37
|
+
readonly onRetry?: () => void;
|
|
38
|
+
readonly headingLevel?: 2 | 3 | 4 | 5 | 6;
|
|
39
|
+
readonly className?: string;
|
|
40
|
+
}
|
|
41
|
+
/** A WidgetCard for a resolved (or loading) widget, with its renderer. */
|
|
42
|
+
declare function ResolvedWidgetCard({ widget, ...props }: ResolvedWidgetCardProps): ReactNode;
|
|
43
|
+
|
|
44
|
+
/** A bar with a rounded data end and a square end on the baseline. */
|
|
45
|
+
declare function barPath(x: number, y: number, width: number, height: number, roundedEnd: 'top' | 'bottom'): string;
|
|
46
|
+
interface ChartModel {
|
|
47
|
+
readonly labels: readonly string[];
|
|
48
|
+
/** values[series][index]; null where a series has no point. */
|
|
49
|
+
readonly values: readonly (readonly (number | null)[])[];
|
|
50
|
+
readonly domain: NiceDomain;
|
|
51
|
+
}
|
|
52
|
+
/** Labels by position (first series that has one) and a value matrix. */
|
|
53
|
+
declare function buildChartModel(data: GraphWidgetData): ChartModel;
|
|
54
|
+
/** A plain-language summary of the chart, for its SVG <desc>. */
|
|
55
|
+
declare function describeChart(data: GraphWidgetData, model: ChartModel, format: (value: number) => string): string;
|
|
56
|
+
declare function GraphWidget({ data, title, }: {
|
|
57
|
+
readonly data: GraphWidgetData;
|
|
58
|
+
/** The accessible name; defaults to the series names. */
|
|
59
|
+
readonly title?: string;
|
|
60
|
+
}): ReactNode;
|
|
61
|
+
|
|
62
|
+
/** Every element that carries a stable `dwt-*` class, for `classNames`. */
|
|
63
|
+
type DashboardClassSlot = 'dashboard' | 'hiddenBar' | 'grid' | 'card' | 'cardHeader' | 'cardTitle' | 'cardDescription' | 'cardActions' | 'cardBody' | 'cardFooter' | 'button' | 'status' | 'empty' | 'error' | 'text' | 'kpi' | 'gauge' | 'table' | 'barList' | 'alertList' | 'chart' | 'legend' | 'tooltip' | 'tableTwin';
|
|
64
|
+
/**
|
|
65
|
+
* Extra classes per slot, appended to the `dwt-*` class (never replacing
|
|
66
|
+
* it), e.g. `{ card: 'rounded-lg shadow-sm' }` for Tailwind.
|
|
67
|
+
*/
|
|
68
|
+
type DashboardClassNames = Partial<Record<DashboardClassSlot, string>>;
|
|
69
|
+
/** Interface text, overridable for other languages or house style. */
|
|
70
|
+
interface DashboardLabels {
|
|
71
|
+
readonly loading: string;
|
|
72
|
+
readonly retry: string;
|
|
73
|
+
readonly viewAsTable: string;
|
|
74
|
+
readonly hide: (title: string) => string;
|
|
75
|
+
readonly show: (title: string) => string;
|
|
76
|
+
readonly minimize: (title: string) => string;
|
|
77
|
+
readonly expand: (title: string) => string;
|
|
78
|
+
readonly moveEarlier: (title: string) => string;
|
|
79
|
+
readonly moveLater: (title: string) => string;
|
|
80
|
+
readonly hiddenWidgets: string;
|
|
81
|
+
readonly allHidden: string;
|
|
82
|
+
readonly noWidgets: string;
|
|
83
|
+
readonly andMore: (count: number) => string;
|
|
84
|
+
/** The comparison in KPI deltas, e.g. "previous period". */
|
|
85
|
+
readonly comparison: string;
|
|
86
|
+
}
|
|
87
|
+
declare const DEFAULT_LABELS: DashboardLabels;
|
|
88
|
+
interface WidgetSettings {
|
|
89
|
+
/** BCP 47 locale for numbers; undefined uses the runtime default. */
|
|
90
|
+
readonly locale?: Locale;
|
|
91
|
+
/** e.g. "_blank". Links always get rel="noreferrer". */
|
|
92
|
+
readonly linkTarget?: string;
|
|
93
|
+
readonly classNames?: DashboardClassNames;
|
|
94
|
+
readonly labels?: Partial<DashboardLabels>;
|
|
95
|
+
}
|
|
96
|
+
interface ResolvedSettings {
|
|
97
|
+
readonly locale: Locale;
|
|
98
|
+
readonly linkTarget: string | undefined;
|
|
99
|
+
readonly classNames: DashboardClassNames;
|
|
100
|
+
readonly labels: DashboardLabels;
|
|
101
|
+
}
|
|
102
|
+
/** Sets locale, link target, extra classes and labels for widgets inside it. */
|
|
103
|
+
declare function WidgetSettingsProvider({ children, ...settings }: WidgetSettings & {
|
|
104
|
+
readonly children?: ReactNode;
|
|
105
|
+
}): ReactNode;
|
|
106
|
+
declare function useWidgetSettings(): ResolvedSettings;
|
|
107
|
+
/** Joins class names, skipping empty ones. */
|
|
108
|
+
declare function joinClassNames(...names: readonly (string | false | null | undefined)[]): string;
|
|
109
|
+
|
|
110
|
+
interface WidgetGridProps {
|
|
111
|
+
/** Rendered in the order given. */
|
|
112
|
+
readonly widgets: readonly DashboardWidget[];
|
|
113
|
+
readonly onRetry?: (key: string) => void;
|
|
114
|
+
readonly headingLevel?: 2 | 3 | 4 | 5 | 6;
|
|
115
|
+
readonly className?: string;
|
|
116
|
+
}
|
|
117
|
+
/** A plain grid of widget cards, no layout controls. */
|
|
118
|
+
declare function WidgetGrid({ widgets, onRetry, headingLevel, className, }: WidgetGridProps): ReactNode;
|
|
119
|
+
interface DashboardProps extends WidgetSettings {
|
|
120
|
+
/** Resolved (or loading) widgets, any order: the layout orders them. */
|
|
121
|
+
readonly widgets: readonly DashboardWidget[];
|
|
122
|
+
/** The viewer's saved layout. Default: none saved. */
|
|
123
|
+
readonly layout?: DashboardLayout;
|
|
124
|
+
/**
|
|
125
|
+
* Called with the next layout after a move, hide, show, minimise or
|
|
126
|
+
* restore; persist it. Without it the layout is read-only (no controls).
|
|
127
|
+
*/
|
|
128
|
+
readonly onLayoutChange?: (layout: DashboardLayout) => void;
|
|
129
|
+
readonly onRetry?: (key: string) => void;
|
|
130
|
+
readonly headingLevel?: 2 | 3 | 4 | 5 | 6;
|
|
131
|
+
readonly className?: string;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* A full dashboard: widgets ordered by the viewer's layout, with move,
|
|
135
|
+
* hide/show and minimise controls when `onLayoutChange` is given. Settings
|
|
136
|
+
* (locale, link target, classNames, labels) apply to every widget inside.
|
|
137
|
+
*/
|
|
138
|
+
declare function Dashboard({ locale, linkTarget, classNames, labels, ...props }: DashboardProps): ReactNode;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Default colours, used as `var(--dwt-*, fallback)` so charts read correctly
|
|
142
|
+
* without the stylesheet. `styles.css` redefines them for dark mode, and an
|
|
143
|
+
* app can override any of them with its own CSS custom properties.
|
|
144
|
+
*
|
|
145
|
+
* The categorical order is the dataviz reference palette, validated for
|
|
146
|
+
* colour-vision deficiency on adjacent pairs in light and dark modes. Slots
|
|
147
|
+
* are assigned in this fixed order, never cycled, and follow the series
|
|
148
|
+
* (its position in the payload), never its rank.
|
|
149
|
+
*/
|
|
150
|
+
declare const DEFAULT_SERIES_COLORS: readonly string[];
|
|
151
|
+
/** `var(--dwt-series-N, #hex)` for the series at `index` (0-based). */
|
|
152
|
+
declare function seriesColor(index: number): string;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* An anchor with rel="noreferrer", or plain text when there is no href or
|
|
156
|
+
* it isn't a safe scheme (http, https, mailto, relative). Never fetches.
|
|
157
|
+
*/
|
|
158
|
+
declare function WidgetLink({ href, className, children, }: {
|
|
159
|
+
readonly href: string | undefined;
|
|
160
|
+
readonly className?: string;
|
|
161
|
+
readonly children: ReactNode;
|
|
162
|
+
}): ReactNode;
|
|
163
|
+
/** A decorative square thumbnail; nothing for an unsafe or missing URL. */
|
|
164
|
+
declare function Thumbnail({ url, }: {
|
|
165
|
+
readonly url: string | undefined;
|
|
166
|
+
}): ReactNode;
|
|
167
|
+
|
|
168
|
+
/** TEXT: a headline value and its label. */
|
|
169
|
+
declare function TextWidget({ data, }: {
|
|
170
|
+
readonly data: TextWidgetData;
|
|
171
|
+
}): ReactNode;
|
|
172
|
+
/**
|
|
173
|
+
* KPI: a stat tile. The change against the previous period carries an arrow
|
|
174
|
+
* and signed text as well as colour, so it never relies on colour alone.
|
|
175
|
+
*/
|
|
176
|
+
declare function KpiWidget({ data, }: {
|
|
177
|
+
readonly data: KpiWidgetData;
|
|
178
|
+
}): ReactNode;
|
|
179
|
+
/** GAUGE: a meter whose track is a lighter step of the fill's own hue. */
|
|
180
|
+
declare function GaugeWidget({ data, }: {
|
|
181
|
+
readonly data: GaugeWidgetData;
|
|
182
|
+
}): ReactNode;
|
|
183
|
+
/** TABLE: a data table; cells with a safe `href` become links. */
|
|
184
|
+
declare function TableWidget({ data, }: {
|
|
185
|
+
readonly data: TableWidgetData;
|
|
186
|
+
}): ReactNode;
|
|
187
|
+
/**
|
|
188
|
+
* BAR_LIST: labelled horizontal bars. One series, so one colour (slot 1)
|
|
189
|
+
* for every bar; the value text sits beside the bar, never inside it.
|
|
190
|
+
*/
|
|
191
|
+
declare function BarListWidget({ data, }: {
|
|
192
|
+
readonly data: BarListWidgetData;
|
|
193
|
+
}): ReactNode;
|
|
194
|
+
/** ALERT_LIST: rows needing attention, with thumbnail, link and value. */
|
|
195
|
+
declare function AlertListWidget({ data, }: {
|
|
196
|
+
readonly data: AlertListWidgetData;
|
|
197
|
+
}): ReactNode;
|
|
198
|
+
/** Renders any payload with the renderer for its kind. */
|
|
199
|
+
declare function WidgetContent({ data, }: {
|
|
200
|
+
readonly data: WidgetData;
|
|
201
|
+
}): ReactNode;
|
|
202
|
+
|
|
203
|
+
export { AlertListWidget, BarListWidget, DEFAULT_LABELS, DEFAULT_SERIES_COLORS, Dashboard, type DashboardClassNames, type DashboardClassSlot, type DashboardLabels, type DashboardProps, GaugeWidget, GraphWidget, KpiWidget, ResolvedWidgetCard, type ResolvedWidgetCardProps, TableWidget, TextWidget, Thumbnail, WidgetCard, type WidgetCardProps, WidgetContent, WidgetGrid, type WidgetGridProps, WidgetLink, type WidgetSettings, WidgetSettingsProvider, barPath, buildChartModel, describeChart, joinClassNames, seriesColor, useWidgetSettings, widgetTitle };
|