@richardmcquiston01/dashboard-widgets-toolkit 0.11.1 → 0.12.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/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/format.ts","../src/core/result.ts","../src/core/url.ts","../src/core/detail.ts","../src/core/grid.ts","../src/core/options.ts","../src/core/scale.ts","../src/react/palette.ts","../src/react/settings.tsx","../src/react/charts.tsx","../src/react/primitives.tsx","../src/react/renderers.tsx","../src/react/card.tsx","../src/core/definition.ts","../src/core/layout.ts","../src/core/pages.ts","../src/react/detail.tsx","../src/react/dashboard.tsx","../src/react/use-stored-layout.ts","../src/core/payload.ts","../src/core/validate.ts","../src/core/resolve.ts","../src/core/loader.ts","../src/react/use-widgets.ts"],"names":["jsx","jsxs","Fragment","useId","useState","without","useEffect","useRef","describeType","useMemo","useCallback"],"mappings":"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","file":"react.js","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","/**\n * A small Result type. Functions in this package return a Result rather than\n * throwing, so the caller has to look at the outcome. `throw` is reserved for\n * programmer error.\n */\n\nexport interface Ok<T> {\n readonly ok: true;\n readonly value: T;\n}\n\nexport interface Err {\n readonly ok: false;\n /** Specific enough to act on: names the field, the widget and the problem. */\n readonly error: string;\n}\n\nexport type Result<T> = Ok<T> | Err;\n\nexport function ok<T>(value: T): Ok<T> {\n return { ok: true, value };\n}\n\nexport function err(error: string): Err {\n return { ok: false, error };\n}\n\n/** Turns an unknown thrown value into a readable message. */\nexport function describeUnknownError(cause: unknown): string {\n if (cause instanceof Error) {\n return cause.message === '' ? cause.name : cause.message;\n }\n if (typeof cause === 'string') {\n return cause;\n }\n try {\n const json: string | undefined = JSON.stringify(cause);\n return json ?? String(cause);\n } catch {\n return String(cause);\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","/**\n * Detail view, core part: the data and query types, sorting, filtering and\n * paging, query (de)serialisation for URLs, and validation. Pure functions;\n * nothing here renders, fetches or reads `location`. See\n * `docs/design/detail-view.md`.\n */\n\nimport type { WidgetDefinition } from './definition.js';\nimport { formatValue, type Locale } from './format.js';\nimport type { TableWidgetData, WidgetData } from './payload.js';\nimport type { ProviderOptions, WidgetContext } from './resolve.js';\nimport { err, ok, type Result } from './result.js';\nimport { isSafeHref } from './url.js';\n\n/** `client`: the provider returns every row; `server`: it honors the query. */\nexport const DETAIL_MODES = ['client', 'server'] as const;\nexport type DetailMode = (typeof DETAIL_MODES)[number];\n\nexport const DEFAULT_DETAIL_PAGE_SIZE = 25;\nexport const MAX_DETAIL_PAGE_SIZE = 200;\n\n/** The `detail` setting on a widget definition. `true` means all defaults. */\nexport interface WidgetDetailOptions {\n /** Heading of the detail view. Default: the widget's title. */\n readonly title?: string;\n /** Rows per page, 1 to 200. Default 25. */\n readonly pageSize?: number;\n /** Default `client`. */\n readonly mode?: DetailMode;\n}\n\n/** `WidgetDetailOptions` with every default filled in. */\nexport interface ResolvedDetailOptions {\n readonly title: string;\n readonly pageSize: number;\n readonly mode: DetailMode;\n}\n\n/** The `tableControls` setting on a widget definition. `true` means both. */\nexport interface WidgetTableControls {\n /** A search box over every column. Default true. */\n readonly search?: boolean;\n /** Sortable column headers. Default true. */\n readonly sort?: boolean;\n}\n\n/** `WidgetTableControls` with every default filled in. */\nexport interface ResolvedTableControls {\n readonly search: boolean;\n readonly sort: boolean;\n}\n\nexport interface DetailColumn {\n /** Stable id used by sort, filters and URLs. Unique within the data. */\n readonly key: string;\n readonly label: string;\n /** Right-aligned, and sorted as numbers when cell values are numbers. */\n readonly numeric?: boolean;\n /** Default true. */\n readonly sortable?: boolean;\n /** Default false: gets its own filter input when true. */\n readonly filterable?: boolean;\n}\n\nexport interface DetailCell {\n /** What is shown. */\n readonly text: string;\n /** What sorts and filters. Default: `text`. */\n readonly value?: string | number;\n /** Renders the cell as a link (http, https, mailto or relative only). */\n readonly href?: string;\n}\n\nexport interface DetailData {\n readonly columns: readonly DetailColumn[];\n /** One array of cells per row, each as long as `columns`. */\n readonly rows: readonly (readonly DetailCell[])[];\n /** Server mode: rows matching the query across all pages. */\n readonly totalRows?: number;\n}\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface DetailSort {\n readonly column: string;\n readonly direction: SortDirection;\n}\n\nexport interface DetailQuery {\n /** Free text, matched against every column. */\n readonly search?: string;\n /** Per-column text, keyed by column key. Blank entries are ignored. */\n readonly filters?: Readonly<Record<string, string>>;\n readonly sort?: DetailSort;\n /** 1-based. */\n readonly page: number;\n readonly pageSize: number;\n}\n\n/** What a detail provider receives beyond the usual arguments. */\nexport interface DetailProviderOptions extends ProviderOptions {\n readonly query: DetailQuery;\n}\n\n/**\n * Loads the full data for one widget's detail view. In client mode it may\n * ignore `options.query`; in server mode it returns one page and `totalRows`.\n */\nexport type DetailProvider<C = WidgetContext> = (\n context: C,\n definition: WidgetDefinition,\n options: DetailProviderOptions\n) => DetailData | Promise<DetailData>;\n\n/** Detail providers keyed by widget key. */\nexport type DetailProviders<C = WidgetContext> = Readonly<\n Record<string, DetailProvider<C>>\n>;\n\nexport interface DetailPage {\n /** The rows of the requested page (after filtering and sorting). */\n readonly rows: readonly (readonly DetailCell[])[];\n /** Rows matching the query, across all pages. */\n readonly totalRows: number;\n /** The page shown: the requested one, clamped into range. */\n readonly page: number;\n readonly pageCount: number;\n}\n\n/** Reads `definition.detail` with defaults; undefined when there is none. */\nexport function resolveDetailOptions(\n definition: Pick<WidgetDefinition, 'title' | 'detail'>\n): ResolvedDetailOptions | undefined {\n const detail: boolean | WidgetDetailOptions | undefined = definition.detail;\n if (detail === undefined || detail === false) return undefined;\n const options: WidgetDetailOptions = detail === true ? {} : detail;\n return {\n title: options.title ?? definition.title,\n pageSize: options.pageSize ?? DEFAULT_DETAIL_PAGE_SIZE,\n mode: options.mode ?? 'client',\n };\n}\n\n/**\n * Reads `definition.tableControls` with defaults; undefined when the widget\n * has none (or both are turned off).\n */\nexport function resolveTableControls(\n definition: Pick<WidgetDefinition, 'tableControls'>\n): ResolvedTableControls | undefined {\n const setting: boolean | WidgetTableControls | undefined =\n definition.tableControls;\n if (setting === undefined || setting === false) return undefined;\n const options: WidgetTableControls = setting === true ? {} : setting;\n const resolved: ResolvedTableControls = {\n search: options.search ?? true,\n sort: options.sort ?? true,\n };\n return resolved.search || resolved.sort ? resolved : undefined;\n}\n\n/** The first page, unsorted and unfiltered. */\nexport function defaultDetailQuery(\n pageSize: number = DEFAULT_DETAIL_PAGE_SIZE\n): DetailQuery {\n return { page: 1, pageSize };\n}\n\n/** Lower case with accents removed, so \"Café\" matches \"cafe\". */\nfunction fold(text: string): string {\n return text.normalize('NFD').replace(/\\p{M}/gu, '').toLowerCase();\n}\n\nfunction cellValue(cell: DetailCell): string | number {\n return cell.value ?? cell.text;\n}\n\nfunction cellMatches(cell: DetailCell, needle: string): boolean {\n return fold(String(cellValue(cell))).includes(needle);\n}\n\nfunction compareCells(\n a: DetailCell,\n b: DetailCell,\n collator: Intl.Collator\n): number {\n const left: string | number = cellValue(a);\n const right: string | number = cellValue(b);\n if (typeof left === 'number' && typeof right === 'number') {\n return left - right;\n }\n // Numbers sort before text when a column mixes them.\n if (typeof left === 'number') return -1;\n if (typeof right === 'number') return 1;\n return collator.compare(left, right);\n}\n\n/**\n * Filters, sorts and pages `data` in memory (client mode). Matching is\n * case- and accent-insensitive substring matching on each cell's `value`\n * (else `text`). Sorting is stable, locale-aware (`locale`, default the\n * runtime's) and numeric for number values. `page` is clamped into range.\n * Fails, naming the column, when the query names a column that does not\n * exist or cannot be sorted.\n */\nexport function queryRows(\n data: DetailData,\n query: DetailQuery,\n locale?: string\n): Result<DetailPage> {\n const indexOf = new Map<string, number>(\n data.columns.map((column, index) => [column.key, index])\n );\n const filterEntries: { index: number; needle: string }[] = [];\n for (const [key, text] of Object.entries(query.filters ?? {})) {\n const index: number | undefined = indexOf.get(key);\n if (index === undefined) {\n return err(\n `Detail query: filter column \"${key}\" does not exist. Columns: ${listKeys(data)}.`\n );\n }\n const needle: string = fold(text.trim());\n if (needle !== '') filterEntries.push({ index, needle });\n }\n let sortIndex = -1;\n if (query.sort !== undefined) {\n const found: number | undefined = indexOf.get(query.sort.column);\n const column: DetailColumn | undefined =\n found === undefined ? undefined : data.columns[found];\n if (found === undefined || column === undefined) {\n return err(\n `Detail query: sort column \"${query.sort.column}\" does not exist. Columns: ${listKeys(data)}.`\n );\n }\n if (column.sortable === false) {\n return err(\n `Detail query: column \"${column.key}\" is not sortable (sortable: false).`\n );\n }\n sortIndex = found;\n }\n const search: string = fold((query.search ?? '').trim());\n\n let rows: (readonly DetailCell[])[] = data.rows.filter(\n (row) =>\n filterEntries.every(({ index, needle }) => {\n const cell: DetailCell | undefined = row[index];\n return cell !== undefined && cellMatches(cell, needle);\n }) &&\n (search === '' || row.some((cell) => cellMatches(cell, search)))\n );\n\n if (query.sort !== undefined && sortIndex >= 0) {\n const collator = new Intl.Collator(locale, {\n numeric: true,\n sensitivity: 'base',\n });\n const sign: number = query.sort.direction === 'desc' ? -1 : 1;\n rows = rows\n .map((row, position) => ({ row, position }))\n .sort((a, b) => {\n const left: DetailCell | undefined = a.row[sortIndex];\n const right: DetailCell | undefined = b.row[sortIndex];\n const order: number =\n left === undefined || right === undefined\n ? 0\n : sign * compareCells(left, right, collator);\n return order || a.position - b.position;\n })\n .map(({ row }) => row);\n }\n\n const pageSize: number = Math.max(1, Math.floor(query.pageSize));\n const pageCount: number = Math.max(1, Math.ceil(rows.length / pageSize));\n const page: number = Math.min(Math.max(1, Math.floor(query.page)), pageCount);\n return ok({\n rows: rows.slice((page - 1) * pageSize, page * pageSize),\n totalRows: rows.length,\n page,\n pageCount,\n });\n}\n\nfunction listKeys(data: DetailData): string {\n return data.columns.map((column) => `\"${column.key}\"`).join(', ');\n}\n\n/* URL query strings ------------------------------------------------------ */\n\nconst FILTER_PREFIX = 'f.';\n\n/**\n * The query as a URL query string without the leading `?`: `q` (search),\n * `sort` (`column:asc|desc`), `page` and `f.<column>` filters. `pageSize` is\n * not included: the widget definition owns it. Defaults are left out.\n */\nexport function serializeDetailQuery(query: DetailQuery): string {\n const parts: string[] = [];\n const add = (key: string, value: string): void => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n };\n if (query.search !== undefined && query.search !== '') {\n add('q', query.search);\n }\n if (query.sort !== undefined) {\n add('sort', `${query.sort.column}:${query.sort.direction}`);\n }\n for (const [column, text] of Object.entries(query.filters ?? {})) {\n if (text !== '') add(`${FILTER_PREFIX}${column}`, text);\n }\n if (query.page > 1) add('page', String(query.page));\n return parts.join('&');\n}\n\n/**\n * Reads a query string (with or without the leading `?`) written by\n * `serializeDetailQuery`. Unknown parameters are ignored, so it can share a\n * URL with the rest of an app. A malformed value fails with a message naming\n * the parameter. When `data` is given, column keys are checked against it.\n */\nexport function parseDetailQuery(\n queryString: string,\n pageSize: number = DEFAULT_DETAIL_PAGE_SIZE,\n data?: Pick<DetailData, 'columns'>\n): Result<DetailQuery> {\n let search: string | undefined;\n let sort: DetailSort | undefined;\n let page = 1;\n const filters: Record<string, string> = {};\n const columnKeys: ReadonlySet<string> | undefined =\n data === undefined\n ? undefined\n : new Set(data.columns.map((column) => column.key));\n const text: string = queryString.startsWith('?')\n ? queryString.slice(1)\n : queryString;\n\n for (const pair of text.split('&')) {\n if (pair === '') continue;\n const equals: number = pair.indexOf('=');\n const rawKey: string = equals < 0 ? pair : pair.slice(0, equals);\n const rawValue: string = equals < 0 ? '' : pair.slice(equals + 1);\n let key: string;\n let value: string;\n try {\n key = decodeURIComponent(rawKey.replace(/\\+/g, ' '));\n value = decodeURIComponent(rawValue.replace(/\\+/g, ' '));\n } catch {\n return err(\n `Detail query: \"${pair}\" is not valid percent-encoding in the URL.`\n );\n }\n if (key === 'q') {\n search = value;\n } else if (key === 'page') {\n if (!/^[1-9]\\d*$/.test(value)) {\n return err(\n `Detail query: page must be a whole number from 1, got \"${value}\".`\n );\n }\n page = Number(value);\n } else if (key === 'sort') {\n const colon: number = value.lastIndexOf(':');\n const column: string = colon < 0 ? value : value.slice(0, colon);\n const direction: string = colon < 0 ? 'asc' : value.slice(colon + 1);\n if (column === '' || (direction !== 'asc' && direction !== 'desc')) {\n return err(\n `Detail query: sort must look like \"column:asc\" or \"column:desc\", got \"${value}\".`\n );\n }\n if (columnKeys !== undefined && !columnKeys.has(column)) {\n return err(`Detail query: sort column \"${column}\" does not exist.`);\n }\n sort = { column, direction };\n } else if (key.startsWith(FILTER_PREFIX)) {\n const column: string = key.slice(FILTER_PREFIX.length);\n if (columnKeys !== undefined && !columnKeys.has(column)) {\n return err(`Detail query: filter column \"${column}\" does not exist.`);\n }\n if (value !== '') filters[column] = value;\n }\n }\n return ok({\n ...(search === undefined || search === '' ? {} : { search }),\n ...(Object.keys(filters).length === 0 ? {} : { filters }),\n ...(sort === undefined ? {} : { sort }),\n page,\n pageSize,\n });\n}\n\n/* Validation ------------------------------------------------------------- */\n\nfunction describeType(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n return typeof value;\n}\n\n/**\n * Checks data from a detail provider: unique non-empty column keys, labels,\n * every row as long as `columns`, cell `text` strings, `value` a string or\n * finite number, safe `href`s, and `totalRows` a non-negative integer.\n * Reports every problem, naming the column or row and cell.\n */\nexport function validateDetailData(\n data: unknown,\n subject = 'Detail data'\n): Result<DetailData> {\n const problems: string[] = [];\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n return err(`${subject}: must be an object, got ${describeType(data)}.`);\n }\n const record = data as Readonly<Record<string, unknown>>;\n const columns: unknown = record['columns'];\n const rows: unknown = record['rows'];\n const keys = new Set<string>();\n let columnCount = 0;\n\n if (!Array.isArray(columns) || columns.length === 0) {\n problems.push(\n `columns must be a non-empty array, got ${describeType(columns)}.`\n );\n } else {\n columnCount = columns.length;\n columns.forEach((column: unknown, index: number) => {\n const at = `columns[${index}]`;\n if (typeof column !== 'object' || column === null) {\n problems.push(`${at} must be an object, got ${describeType(column)}.`);\n return;\n }\n const fields = column as Readonly<Record<string, unknown>>;\n const key: unknown = fields['key'];\n if (typeof key !== 'string' || key === '') {\n problems.push(`${at}.key must be a non-empty string.`);\n } else if (keys.has(key)) {\n problems.push(`${at}.key \"${key}\" is used by an earlier column.`);\n } else {\n keys.add(key);\n }\n if (typeof fields['label'] !== 'string') {\n problems.push(\n `${at}.label must be a string, got ${describeType(fields['label'])}.`\n );\n }\n for (const flag of ['numeric', 'sortable', 'filterable']) {\n const flagValue: unknown = fields[flag];\n if (flagValue !== undefined && typeof flagValue !== 'boolean') {\n problems.push(\n `${at}.${flag} must be a boolean, got ${describeType(flagValue)}.`\n );\n }\n }\n });\n }\n\n if (!Array.isArray(rows)) {\n problems.push(`rows must be an array, got ${describeType(rows)}.`);\n } else {\n rows.forEach((row: unknown, rowIndex: number) => {\n if (!Array.isArray(row)) {\n problems.push(\n `rows[${rowIndex}] must be an array of cells, got ${describeType(row)}.`\n );\n return;\n }\n if (columnCount > 0 && row.length !== columnCount) {\n problems.push(\n `rows[${rowIndex}] has ${row.length} cells but there are ${columnCount} columns.`\n );\n }\n row.forEach((cell: unknown, cellIndex: number) => {\n const at = `rows[${rowIndex}][${cellIndex}]`;\n if (typeof cell !== 'object' || cell === null) {\n problems.push(`${at} must be an object, got ${describeType(cell)}.`);\n return;\n }\n const fields = cell as Readonly<Record<string, unknown>>;\n if (typeof fields['text'] !== 'string') {\n problems.push(\n `${at}.text must be a string, got ${describeType(fields['text'])}.`\n );\n }\n const value: unknown = fields['value'];\n if (\n value !== undefined &&\n typeof value !== 'string' &&\n !(typeof value === 'number' && Number.isFinite(value))\n ) {\n problems.push(\n `${at}.value must be a string or a finite number, got ${describeType(value)}.`\n );\n }\n const href: unknown = fields['href'];\n if (href !== undefined) {\n if (typeof href !== 'string') {\n problems.push(\n `${at}.href must be a string, got ${describeType(href)}.`\n );\n } else if (!isSafeHref(href)) {\n problems.push(\n `${at}.href \"${href}\" is not allowed (only http, https, mailto and relative URLs).`\n );\n }\n }\n });\n });\n }\n\n const totalRows: unknown = record['totalRows'];\n if (\n totalRows !== undefined &&\n !(\n typeof totalRows === 'number' &&\n Number.isInteger(totalRows) &&\n totalRows >= 0\n )\n ) {\n problems.push(\n `totalRows must be a non-negative whole number, got ${describeType(totalRows)}.`\n );\n }\n\n if (problems.length > 0) {\n return err(`${subject}: ${problems.join(' ')}`);\n }\n return ok(data as DetailData);\n}\n\n/* Derived details --------------------------------------------------------- */\n\n/**\n * A TABLE's columns and rows as detail data (column keys `c0`, `c1`, ...),\n * footer ignored, so the table can be searched and sorted with `queryRows`.\n */\nexport function tableDetailData(data: TableWidgetData): DetailData {\n return {\n columns: data.columns.map((column, index) => ({\n key: `c${index}`,\n label: column.label,\n ...(column.numeric === undefined ? {} : { numeric: column.numeric }),\n })),\n rows: data.rows,\n };\n}\n\n/**\n * The detail data for a widget whose card payload is already complete, so a\n * detail view needs no provider: a TABLE without a `footer` (a footer means\n * rows were left out) and a BAR_LIST. Returns undefined for everything else\n * (alert lists, gauges, KPIs, text and charts): those need a detail provider.\n */\nexport function deriveDetailData(\n data: WidgetData,\n locale?: Locale\n): DetailData | undefined {\n if (data.kind === 'TABLE') {\n return data.footer === undefined ? tableDetailData(data) : undefined;\n }\n if (data.kind === 'BAR_LIST') {\n return {\n columns: [\n { key: 'label', label: 'Name' },\n { key: 'value', label: 'Value', numeric: true },\n ],\n rows: data.items.map((item) => [\n { text: item.label },\n {\n text: item.display ?? formatValue(item.value, 'number', { locale }),\n value: item.value,\n },\n ]),\n };\n }\n return undefined;\n}\n","import type { WidgetFill, WidgetSize } from './definition.js';\n\n/** The parts of a widget definition that decide its place in a grid. */\nexport interface GridItem {\n readonly key: string;\n readonly defaultSize?: WidgetSize;\n readonly fill?: WidgetFill;\n readonly width?: number;\n}\n\n/** Columns in a grid that uses widget `width`. */\nexport const WIDTH_COLUMNS = 12;\n/** Smallest and largest `width`, in twelfths of a row. */\nexport const MIN_WIDGET_WIDTH = 2;\nexport const MAX_WIDGET_WIDTH = 12;\n\n/** Whether `value` is a valid widget `width`: an integer from 2 to 12. */\nexport function isWidgetWidth(value: unknown): value is number {\n return (\n typeof value === 'number' &&\n Number.isInteger(value) &&\n value >= MIN_WIDGET_WIDTH &&\n value <= MAX_WIDGET_WIDTH\n );\n}\n\n/** The width (in twelfths) a `defaultSize` stands for. Default `medium`. */\nexport function widthForSize(size: WidgetSize | undefined): number {\n switch (size) {\n case 'small':\n return 3;\n case 'large':\n return 6;\n case 'full':\n return 12;\n default:\n return 4;\n }\n}\n\n/** The 12-column width of an item: its `width`, else from its size. */\nexport function itemWidth(item: GridItem): number {\n return isWidgetWidth(item.width)\n ? item.width\n : widthForSize(item.defaultSize);\n}\n\n/** Whether a grid of `items` should use 12 columns (any item sets `width`). */\nexport function usesWidthColumns(items: readonly GridItem[]): boolean {\n return items.some((item) => item.width !== undefined);\n}\n\n/** Whether the widget should take the columns left over in its row. */\nexport function fillsWidth(fill: WidgetFill | undefined): boolean {\n return fill === 'width' || fill === 'both';\n}\n\n/** Whether the widget should stretch to the height of its row. */\nexport function fillsHeight(fill: WidgetFill | undefined): boolean {\n return fill === 'height' || fill === 'both';\n}\n\n/**\n * Columns a size takes in a grid of `columns` tracks: `large` spans\n * `largeSpan` (default 2), `full` spans every column, anything else one.\n */\nexport function baseColumnSpan(\n size: WidgetSize | undefined,\n columns: number,\n largeSpan = 2\n): number {\n if (size === 'full') return columns;\n if (size === 'large') return Math.min(largeSpan, columns);\n return 1;\n}\n\n/**\n * Places `items` in a grid of `columns` tracks the way a sparse grid\n * auto-places them (left to right, wrapping to a new row when an item does\n * not fit), then gives the columns left over in each row to the items that\n * `fill` their width, shared evenly (earlier items get the remainder).\n *\n * Returns the column span for each width-filling item, keyed by `key`. Items\n * that do not fill width keep their normal size and are not in the map.\n */\nexport function fillColumnSpans(\n items: readonly GridItem[],\n columns: number,\n largeSpan = 2\n): Map<string, number> {\n return placeAndFill(items, columns, (item, trackCount) =>\n baseColumnSpan(item.defaultSize, trackCount, largeSpan)\n );\n}\n\n/**\n * Like `fillColumnSpans` for a 12-column grid: each item starts at its\n * `width` (see `itemWidth`) and width-fillers share the leftover twelfths.\n */\nexport function fillWidthSpans(\n items: readonly GridItem[]\n): Map<string, number> {\n return placeAndFill(items, WIDTH_COLUMNS, itemWidth);\n}\n\n/** One row of a placed grid: the widgets in it and their final column spans. */\nexport interface PlacedRow {\n readonly keys: readonly string[];\n /** Column spans, in `keys` order, after width-fillers took the leftovers. */\n readonly spans: readonly number[];\n}\n\n/**\n * The rows `items` occupy in a 12-column grid, exactly as `fillWidthSpans`\n * places them: left to right, a widget that doesn't fit in the rest of a row\n * starts the next row whole (a widget is never split), and width-fillers then\n * grow into the leftover columns. Growth never changes how many rows there\n * are.\n */\nexport function placeRows(items: readonly GridItem[]): readonly PlacedRow[] {\n return placeAndFillRows(items, WIDTH_COLUMNS, itemWidth).rows;\n}\n\n/**\n * How many of `items`, in order, fit in `maxRows` rows of a 12-column grid.\n * Placement is left to right, so this is the length of the longest prefix\n * whose rows number at most `maxRows`.\n */\nexport function fitCount(items: readonly GridItem[], maxRows: number): number {\n const rows: readonly PlacedRow[] = placeRows(items);\n let count = 0;\n for (const row of rows.slice(0, Math.max(0, Math.floor(maxRows)))) {\n count += row.keys.length;\n }\n return count;\n}\n\nfunction placeAndFill(\n items: readonly GridItem[],\n columns: number,\n spanOf: (item: GridItem, trackCount: number) => number\n): Map<string, number> {\n return placeAndFillRows(items, columns, spanOf).spans;\n}\n\nfunction placeAndFillRows(\n items: readonly GridItem[],\n columns: number,\n spanOf: (item: GridItem, trackCount: number) => number\n): { readonly spans: Map<string, number>; readonly rows: PlacedRow[] } {\n const trackCount: number = Math.max(1, Math.floor(columns));\n const spans = new Map<string, number>();\n const rows: PlacedRow[] = [];\n let row: { item: GridItem; span: number }[] = [];\n let used = 0;\n\n function closeRow(): void {\n if (row.length === 0) return;\n const fillers = row.filter(({ item }) => fillsWidth(item.fill));\n const leftover: number = trackCount - used;\n const finalSpans = new Map<string, number>();\n if (fillers.length > 0) {\n const share: number = Math.floor(leftover / fillers.length);\n const remainder: number = leftover % fillers.length;\n fillers.forEach(({ item, span }, index) => {\n const grown: number = span + share + (index < remainder ? 1 : 0);\n spans.set(item.key, grown);\n finalSpans.set(item.key, grown);\n });\n }\n rows.push({\n keys: row.map(({ item }) => item.key),\n spans: row.map(({ item, span }) => finalSpans.get(item.key) ?? span),\n });\n row = [];\n used = 0;\n }\n\n for (const item of items) {\n const span: number = Math.min(spanOf(item, trackCount), trackCount);\n if (used + span > trackCount && row.length > 0) closeRow();\n row.push({ item, span });\n used += span;\n }\n closeRow();\n return { spans, rows };\n}\n","/**\n * Options a widget author declares and a viewer (or the consumer) can choose:\n * a default sort, \"top N\", a period, which columns show. The package never\n * decides what an option means for your data. It validates the chosen values,\n * hands them to your provider (`ProviderOptions.options`), keeps cached\n * payloads for different choices apart, and can sort or trim a payload itself\n * when the author says so (`apply: 'client'`).\n *\n * Definitions stay plain JSON: no functions, no regular expressions.\n */\n\nimport { queryRows, tableDetailData, type DetailSort } from './detail.js';\nimport type {\n BarListItem,\n TableCell,\n TableColumn,\n WidgetData,\n} from './payload.js';\n\n/** A chosen option value. Only a `columns` option holds more than a scalar. */\nexport type OptionValue = string | number | boolean | readonly string[];\n\n/** Resolved option values by option key. */\nexport type OptionValues = Readonly<Record<string, OptionValue>>;\n\n/** Fields every declared option has. */\ninterface OptionBase {\n /** Unique within the widget; letters, digits, `_` and `-`, starting with a letter. */\n readonly key: string;\n /** What the viewer sees, in your own words (and language). */\n readonly label: string;\n}\n\n/** A pick from a fixed list. */\nexport interface ChoiceOption extends OptionBase {\n readonly type: 'choice';\n readonly choices: readonly {\n readonly value: string;\n readonly label: string;\n }[];\n readonly default: string;\n}\n\nexport interface NumberOption extends OptionBase {\n readonly type: 'number';\n readonly min: number;\n readonly max: number;\n /** Chosen values must be `min` plus a whole number of steps. */\n readonly step?: number;\n readonly default: number;\n}\n\nexport interface BooleanOption extends OptionBase {\n readonly type: 'boolean';\n readonly default: boolean;\n}\n\n/** Free text: a search term, a tag. Always plain text, never HTML. */\nexport interface TextOption extends OptionBase {\n readonly type: 'text';\n /** At most 500. */\n readonly maxLength: number;\n readonly default: string;\n}\n\n/** The named ranges a `dateRange` option can use (see `resolveDateRange`). */\nexport const DATE_RANGE_PRESETS = [\n 'today',\n 'yesterday',\n 'last7',\n 'last30',\n 'last90',\n 'thisMonth',\n 'lastMonth',\n 'thisYear',\n 'lastYear',\n] as const;\n\nexport type DateRangePreset = (typeof DATE_RANGE_PRESETS)[number];\n\n/**\n * A range of calendar days. The value is a preset key (`last30`) or an ISO\n * interval `YYYY-MM-DD/YYYY-MM-DD`. Providers always receive the interval.\n */\nexport interface DateRangeOption extends OptionBase {\n readonly type: 'dateRange';\n /** The presets a viewer may pick. Default: every preset. */\n readonly presets?: readonly {\n readonly value: DateRangePreset;\n readonly label: string;\n }[];\n readonly default: string;\n}\n\n/** A `#rrggbb` color. A color alone should never carry meaning. */\nexport interface ColorOption extends OptionBase {\n readonly type: 'color';\n readonly default: string;\n}\n\n/**\n * How rows are ordered. The value is `column:asc` or `column:desc`, where\n * `column` is a column key: `c0`, `c1`, ... for a TABLE (by position) and\n * `label` or `value` for a BAR_LIST.\n */\nexport interface SortOption extends OptionBase {\n readonly type: 'sort';\n readonly columns: readonly { readonly key: string; readonly label: string }[];\n /** Absent: no sort until the viewer picks one. */\n readonly default?: string;\n /**\n * `provider` (default): your provider returns the right rows, which a\n * truncated table needs. `client`: the toolkit sorts the payload it got.\n */\n readonly apply?: 'provider' | 'client';\n}\n\n/** Which TABLE columns show, and in what order. The value is column keys. */\nexport interface ColumnsOption extends OptionBase {\n readonly type: 'columns';\n readonly columns: readonly { readonly key: string; readonly label: string }[];\n readonly default: readonly string[];\n /** `provider` (default) passes the keys on; `client` trims the payload here. */\n readonly apply?: 'provider' | 'client';\n}\n\nexport type WidgetOption =\n | ChoiceOption\n | NumberOption\n | BooleanOption\n | TextOption\n | DateRangeOption\n | ColorOption\n | SortOption\n | ColumnsOption;\n\nexport const WIDGET_OPTION_TYPES = [\n 'choice',\n 'number',\n 'boolean',\n 'text',\n 'dateRange',\n 'color',\n 'sort',\n 'columns',\n] as const;\n\n/** The most options one widget may declare. */\nexport const MAX_WIDGET_OPTIONS = 20;\n/** The most characters in a `text` option. */\nexport const MAX_TEXT_OPTION_LENGTH = 500;\n/** Allowed option keys. */\nexport const OPTION_KEY_PATTERN = /^[A-Za-z][A-Za-z0-9_-]{0,39}$/;\nconst COLOR_PATTERN = /^#[0-9a-fA-F]{6}$/;\nconst INTERVAL_PATTERN = /^(\\d{4}-\\d{2}-\\d{2})\\/(\\d{4}-\\d{2}-\\d{2})$/;\n// eslint-disable-next-line no-control-regex -- rejecting control characters is the point\nconst CONTROL_CHARACTERS = /[\\u0000-\\u001f\\u007f]/;\n\n/** What option resolution needs from the outside world. */\nexport interface OptionContext {\n /** \"Now\" in epoch ms, for date range presets. Default `Date.now()`. */\n readonly now?: number;\n /** An IANA time zone for \"today\". Default `UTC`. */\n readonly timeZone?: string;\n}\n\n/** The value a column key refers to in a sort or columns option. */\nexport function isColumnKeyFor(kind: string, key: string): boolean {\n if (kind === 'TABLE') return /^c\\d+$/.test(key);\n if (kind === 'BAR_LIST') return key === 'label' || key === 'value';\n return false;\n}\n\n/** Whether the toolkit (not your provider) applies this option. */\nexport function isClientApplied(option: WidgetOption): boolean {\n return (\n (option.type === 'sort' || option.type === 'columns') &&\n option.apply === 'client'\n );\n}\n\n// --- Date ranges -----------------------------------------------------------\n\ninterface CivilDate {\n readonly year: number;\n readonly month: number; // 1 to 12\n readonly day: number;\n}\n\nfunction civilToday(context: OptionContext): CivilDate {\n const now: number = context.now ?? Date.now();\n let timeZone: string = context.timeZone ?? 'UTC';\n try {\n new Intl.DateTimeFormat('en-US', { timeZone });\n } catch {\n timeZone = 'UTC';\n }\n const parts: Intl.DateTimeFormatPart[] = new Intl.DateTimeFormat('en-US', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(new Date(now));\n const pick = (type: string): number =>\n Number(parts.find((part) => part.type === type)?.value ?? '0');\n return { year: pick('year'), month: pick('month'), day: pick('day') };\n}\n\nfunction toIso(epochMs: number): string {\n return new Date(epochMs).toISOString().slice(0, 10);\n}\n\nconst DAY_MS = 86_400_000;\n\nfunction parseIsoDay(text: string): number | undefined {\n const match: RegExpMatchArray | null = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(text);\n if (match === null) return undefined;\n const epoch: number = Date.UTC(\n Number(match[1]),\n Number(match[2]) - 1,\n Number(match[3])\n );\n return toIso(epoch) === text ? epoch : undefined;\n}\n\n/** Whether `value` is `YYYY-MM-DD/YYYY-MM-DD` with real days, start not after end. */\nexport function isIsoInterval(value: string): boolean {\n const match: RegExpMatchArray | null = INTERVAL_PATTERN.exec(value);\n if (match === null) return false;\n const start: number | undefined = parseIsoDay(match[1] as string);\n const end: number | undefined = parseIsoDay(match[2] as string);\n return start !== undefined && end !== undefined && start <= end;\n}\n\nfunction isPreset(value: string): value is DateRangePreset {\n return (DATE_RANGE_PRESETS as readonly string[]).includes(value);\n}\n\n/**\n * The ISO interval a date range value stands for, or undefined when it is\n * neither a preset nor a valid interval. Presets, in calendar days of the\n * context's time zone: `today`, `yesterday`, `last7`, `last30` and `last90`\n * (ending today), `thisMonth` and `thisYear` (from the first day to today),\n * `lastMonth` and `lastYear` (the whole of it).\n */\nexport function resolveDateRange(\n value: string,\n context: OptionContext = {}\n): string | undefined {\n if (isIsoInterval(value)) return value;\n if (!isPreset(value)) return undefined;\n const today: CivilDate = civilToday(context);\n const todayMs: number = Date.UTC(today.year, today.month - 1, today.day);\n const range = (startMs: number, endMs: number): string =>\n `${toIso(startMs)}/${toIso(endMs)}`;\n switch (value) {\n case 'today':\n return range(todayMs, todayMs);\n case 'yesterday':\n return range(todayMs - DAY_MS, todayMs - DAY_MS);\n case 'last7':\n return range(todayMs - 6 * DAY_MS, todayMs);\n case 'last30':\n return range(todayMs - 29 * DAY_MS, todayMs);\n case 'last90':\n return range(todayMs - 89 * DAY_MS, todayMs);\n case 'thisMonth':\n return range(Date.UTC(today.year, today.month - 1, 1), todayMs);\n case 'lastMonth':\n return range(\n Date.UTC(today.year, today.month - 2, 1),\n Date.UTC(today.year, today.month - 1, 1) - DAY_MS\n );\n case 'thisYear':\n return range(Date.UTC(today.year, 0, 1), todayMs);\n case 'lastYear':\n return range(\n Date.UTC(today.year - 1, 0, 1),\n Date.UTC(today.year, 0, 1) - DAY_MS\n );\n }\n}\n\n// --- Choosing values ---------------------------------------------------------\n\nfunction onStepGrid(option: NumberOption, value: number): boolean {\n if (option.step === undefined) return true;\n const steps: number = (value - option.min) / option.step;\n return Math.abs(steps - Math.round(steps)) < 1e-9;\n}\n\n/** `column:asc|desc` as a detail sort, or undefined when malformed. */\nexport function parseSortValue(value: string): DetailSort | undefined {\n const separator: number = value.lastIndexOf(':');\n if (separator <= 0) return undefined;\n const column: string = value.slice(0, separator);\n const direction: string = value.slice(separator + 1);\n if (direction !== 'asc' && direction !== 'desc') return undefined;\n return { column, direction };\n}\n\n/**\n * The sort the widget's `sort` option currently selects, or undefined when\n * the widget has no sort option or no sort is chosen. Use it to seed table\n * headers and the detail view.\n */\nexport function sortFromOptions(\n definition: { readonly options?: readonly WidgetOption[] },\n values: OptionValues | undefined\n): DetailSort | undefined {\n if (values === undefined) return undefined;\n const sortOption: WidgetOption | undefined = definition.options?.find(\n (option) => option.type === 'sort'\n );\n if (sortOption === undefined) return undefined;\n const chosen: OptionValue | undefined = values[sortOption.key];\n return typeof chosen === 'string' ? parseSortValue(chosen) : undefined;\n}\n\n/**\n * A chosen value made valid for `option`, or undefined when it isn't one the\n * option allows. Text is trimmed, colors lower-cased, date ranges resolved to\n * an interval.\n */\nexport function coerceOptionValue(\n option: WidgetOption,\n value: unknown,\n context: OptionContext = {}\n): OptionValue | undefined {\n switch (option.type) {\n case 'choice':\n return typeof value === 'string' &&\n option.choices.some((choice) => choice.value === value)\n ? value\n : undefined;\n case 'number':\n return typeof value === 'number' &&\n Number.isFinite(value) &&\n value >= option.min &&\n value <= option.max &&\n onStepGrid(option, value)\n ? value\n : undefined;\n case 'boolean':\n return typeof value === 'boolean' ? value : undefined;\n case 'text': {\n if (typeof value !== 'string') return undefined;\n const trimmed: string = value.trim();\n return trimmed.length <= option.maxLength &&\n !CONTROL_CHARACTERS.test(trimmed)\n ? trimmed\n : undefined;\n }\n case 'dateRange': {\n if (typeof value !== 'string') return undefined;\n if (\n isPreset(value) &&\n option.presets !== undefined &&\n !option.presets.some((preset) => preset.value === value)\n ) {\n return undefined;\n }\n return resolveDateRange(value, context);\n }\n case 'color':\n return typeof value === 'string' && COLOR_PATTERN.test(value)\n ? value.toLowerCase()\n : undefined;\n case 'sort': {\n if (typeof value !== 'string') return undefined;\n const sort: DetailSort | undefined = parseSortValue(value);\n return sort !== undefined &&\n option.columns.some((column) => column.key === sort.column)\n ? value\n : undefined;\n }\n case 'columns': {\n if (!Array.isArray(value) || value.length === 0) return undefined;\n const keys: readonly unknown[] = value;\n const allowed = new Set<string>(option.columns.map((c) => c.key));\n const seen = new Set<string>();\n for (const key of keys) {\n if (typeof key !== 'string' || !allowed.has(key) || seen.has(key)) {\n return undefined;\n }\n seen.add(key);\n }\n return [...seen];\n }\n }\n}\n\n/** The value an option has when nothing valid was chosen. */\nexport function defaultOptionValue(\n option: WidgetOption,\n context: OptionContext = {}\n): OptionValue | undefined {\n switch (option.type) {\n case 'dateRange':\n return resolveDateRange(option.default, context);\n case 'sort':\n return option.default;\n case 'columns':\n return [...option.default];\n default:\n return option.default;\n }\n}\n\nconst NO_VALUES: OptionValues = Object.freeze({});\n\n/**\n * The value of every option a definition declares: the chosen one when it is\n * valid for that option, else the default. Keys that aren't declared and\n * values that aren't valid are ignored (never an error), so a layout saved\n * before an option changed still loads. A `sort` option with no default and\n * no valid choice is left out. Empty when the definition declares none.\n */\nexport function resolveOptionValues(\n definition: { readonly options?: readonly WidgetOption[] },\n chosen: Readonly<Record<string, unknown>> | undefined,\n context: OptionContext = {}\n): OptionValues {\n const options: readonly WidgetOption[] | undefined = definition.options;\n if (options === undefined || options.length === 0) return NO_VALUES;\n const values: Record<string, OptionValue> = {};\n for (const option of options) {\n const picked: unknown = chosen?.[option.key];\n const value: OptionValue | undefined =\n (picked === undefined\n ? undefined\n : coerceOptionValue(option, picked, context)) ??\n defaultOptionValue(option, context);\n if (value !== undefined) values[option.key] = value;\n }\n return values;\n}\n\nfunction sameValue(\n a: OptionValue | undefined,\n b: OptionValue | undefined\n): boolean {\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((item, i) => item === b[i]);\n }\n return a === b;\n}\n\n/** Whether two sets of resolved values are the same. */\nexport function sameOptionValues(a: OptionValues, b: OptionValues): boolean {\n const keys: string[] = Object.keys({ ...a, ...b });\n return keys.every((key) => sameValue(a[key], b[key]));\n}\n\n/**\n * Text that tells apart the payloads different choices produce, for cache\n * keys: the values that differ from the default, in key order, and only the\n * options your provider sees (`apply: 'client'` ones don't change the data it\n * returns). Empty when everything is on its default, so a widget on defaults\n * keeps its plain key.\n */\nexport function optionsCacheSuffix(\n definition: { readonly options?: readonly WidgetOption[] },\n values: OptionValues,\n context: OptionContext = {}\n): string {\n const parts: string[] = [];\n for (const option of definition.options ?? []) {\n if (isClientApplied(option)) continue;\n const value: OptionValue | undefined = values[option.key];\n if (sameValue(value, defaultOptionValue(option, context))) continue;\n parts.push(\n `${option.key}=${encodeURIComponent(JSON.stringify(value ?? null))}`\n );\n }\n parts.sort();\n return parts.length === 0 ? '' : `?${parts.join('&')}`;\n}\n\n// --- Applying client-side options ---------------------------------------------\n\nfunction tableColumnIndex(key: string): number | undefined {\n const match: RegExpMatchArray | null = /^c(\\d+)$/.exec(key);\n return match === null ? undefined : Number(match[1]);\n}\n\nfunction sortBarItems(\n items: readonly BarListItem[],\n sort: DetailSort\n): BarListItem[] {\n const sign: number = sort.direction === 'desc' ? -1 : 1;\n return items\n .map((item, index) => ({ item, index }))\n .sort((a, b) => {\n const order: number =\n sort.column === 'value'\n ? a.item.value - b.item.value\n : a.item.label.localeCompare(b.item.label);\n return order * sign || a.index - b.index;\n })\n .map(({ item }) => item);\n}\n\n/**\n * Applies the options the author marked `apply: 'client'` to a payload: sorts\n * the rows of a TABLE or the items of a BAR_LIST, and trims and reorders the\n * columns of a TABLE. Other payloads, and options whose columns don't fit the\n * payload, come back unchanged. Sorting happens before trimming, so a sort\n * can use a column that is then hidden.\n */\nexport function applyClientOptions(\n definition: { readonly options?: readonly WidgetOption[] },\n data: WidgetData,\n values: OptionValues\n): WidgetData {\n const options: readonly WidgetOption[] = definition.options ?? [];\n const sortOption: WidgetOption | undefined = options.find(\n (o) => o.type === 'sort' && o.apply === 'client'\n );\n const columnsOption: WidgetOption | undefined = options.find(\n (o) => o.type === 'columns' && o.apply === 'client'\n );\n const sortValue: OptionValue | undefined =\n sortOption === undefined ? undefined : values[sortOption.key];\n const columnsValue: OptionValue | undefined =\n columnsOption === undefined ? undefined : values[columnsOption.key];\n let next: WidgetData = data;\n\n if (typeof sortValue === 'string') {\n const sort: DetailSort | undefined = parseSortValue(sortValue);\n if (sort !== undefined && next.kind === 'BAR_LIST') {\n if (sort.column === 'label' || sort.column === 'value') {\n next = { ...next, items: sortBarItems(next.items, sort) };\n }\n } else if (sort !== undefined && next.kind === 'TABLE') {\n const index: number | undefined = tableColumnIndex(sort.column);\n if (index !== undefined && index < next.columns.length) {\n const sorted = queryRows(tableDetailData(next), {\n page: 1,\n pageSize: Math.max(1, next.rows.length),\n sort,\n });\n if (sorted.ok) next = { ...next, rows: sorted.value.rows };\n }\n }\n }\n\n if (Array.isArray(columnsValue) && next.kind === 'TABLE') {\n const table = next;\n const indexes: number[] = (columnsValue as readonly string[])\n .map(tableColumnIndex)\n .filter(\n (index): index is number =>\n index !== undefined && index < table.columns.length\n );\n if (indexes.length > 0) {\n next = {\n ...table,\n columns: indexes.map((i) => table.columns[i] as TableColumn),\n rows: table.rows.map((row) => indexes.map((i) => row[i] as TableCell)),\n };\n }\n }\n return next;\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 colors, 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 * color-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 | 'toolbar'\n | 'pageBar'\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 | 'detail';\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 minimizedWidgets: string;\n /** Edit mode toolbar (`editMode=\"toggle\"`). */\n readonly customize: string;\n readonly done: string;\n readonly reset: string;\n readonly revertChanges: string;\n readonly confirmReset: string;\n readonly confirmRevert: string;\n /** Accessible names of the inline \"✓\" and \"X\" confirmation buttons. */\n readonly confirmYes: string;\n readonly confirmNo: string;\n /** Announced when edit mode starts and ends. */\n readonly editingOn: string;\n readonly editingOff: string;\n /** Names the toolbar group for assistive technology. */\n readonly dashboardControls: string;\n /** The lock icon on a locked card, e.g. \"Revenue is locked\". */\n readonly locked: (title: string) => string;\n /** The lock icon on a card shown to an administrator (`overrideLocks`). */\n readonly lockedForViewers: (title: string) => string;\n /** Pages: names the tab list, and each tab (\"Page 2 of 3: Sales\"). */\n readonly pageBar: string;\n readonly pageTabName: (index: number, count: number, title: string) => string;\n readonly previousPageButton: string;\n readonly nextPageButton: string;\n /** Page management while editing. */\n readonly managePages: string;\n readonly addPage: string;\n readonly renamePage: (title: string) => string;\n readonly pageTitle: string;\n readonly savePageTitle: string;\n readonly cancelPageTitle: string;\n readonly deletePage: (title: string) => string;\n readonly confirmDeletePage: (title: string) => string;\n readonly movePageLeft: (title: string) => string;\n readonly movePageRight: (title: string) => string;\n /** The select on each card that moves it to another page. */\n readonly moveToPage: (title: string) => string;\n readonly moveToPagePlaceholder: string;\n readonly moveToPageOption: (title: string, rowsFree: number) => string;\n readonly newPageOption: string;\n readonly movedToPage: (title: string, pageTitle: string) => string;\n readonly pageFull: (pageTitle: string, maxRows: number) => string;\n readonly emptyPage: string;\n /** Added to the accessible name of links that open in a new tab. */\n readonly opensInNewTab: string;\n /** The card's View button, opening the detail view. */\n readonly view: (title: string) => string;\n readonly close: string;\n readonly search: string;\n readonly filterBy: (column: string) => string;\n readonly sortBy: (column: string) => string;\n readonly noResults: string;\n /** e.g. \"Showing 1–25 of 312 results\". */\n readonly showingRows: (from: number, to: number, total: number) => string;\n readonly previousPage: string;\n readonly nextPage: string;\n readonly pageOf: (page: number, pageCount: number) => string;\n readonly pagination: 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) => `Minimize ${title}`,\n expand: (title) => `Expand ${title}`,\n moveEarlier: (title) => `Move ${title} earlier`,\n moveLater: (title) => `Move ${title} later`,\n hiddenWidgets: 'Hidden:',\n minimizedWidgets: 'Minimized:',\n customize: 'Customize',\n done: 'Done',\n reset: 'Reset layout',\n revertChanges: 'Revert changes',\n confirmReset: 'Reset the layout to the default?',\n confirmRevert: 'Revert to how this looked before you started editing?',\n confirmYes: 'Yes',\n confirmNo: 'No',\n editingOn:\n 'Editing dashboard. Use the buttons on each card to reorder or hide it.',\n editingOff: 'Finished editing.',\n dashboardControls: 'Dashboard controls',\n locked: (title) => `${title} is locked`,\n lockedForViewers: (title) => `${title} is locked for viewers`,\n pageBar: 'Pages',\n pageTabName: (index, count, title) => `Page ${index} of ${count}: ${title}`,\n previousPageButton: 'Previous page',\n nextPageButton: 'Next page',\n managePages: 'Manage pages',\n addPage: 'Add page',\n renamePage: (title) => `Rename ${title}`,\n pageTitle: 'Page title',\n savePageTitle: 'Save page title',\n cancelPageTitle: 'Cancel renaming',\n deletePage: (title) => `Delete ${title}`,\n confirmDeletePage: (title) =>\n `Delete the page \"${title}\" and move its widgets to another page?`,\n movePageLeft: (title) => `Move ${title} page left`,\n movePageRight: (title) => `Move ${title} page right`,\n moveToPage: (title) => `Move ${title} to another page`,\n moveToPagePlaceholder: 'Move to page…',\n moveToPageOption: (title, rowsFree) =>\n `${title} (${rowsFree} ${rowsFree === 1 ? 'row' : 'rows'} free)`,\n newPageOption: 'New page…',\n movedToPage: (title, pageTitle) => `${title} moved to ${pageTitle}`,\n pageFull: (pageTitle, maxRows) =>\n `Page \"${pageTitle}\" is full (${maxRows} rows). Move or hide a widget first.`,\n emptyPage: 'This page has no widgets. Move one here from another page.',\n opensInNewTab: '(opens in a new tab)',\n view: (title) => `View ${title}`,\n close: 'Close',\n search: 'Search',\n filterBy: (column) => `Filter ${column}`,\n sortBy: (column) => `Sort by ${column}`,\n noResults: 'No matching results.',\n showingRows: (from, to, total) => `Showing ${from}–${to} of ${total} results`,\n previousPage: 'Previous',\n nextPage: 'Next',\n pageOf: (page, pageCount) => `Page ${page} of ${pageCount}`,\n pagination: 'Pagination',\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 center 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","import type { ReactNode } from 'react';\n\nimport { isSafeHref, isSafeImageUrl } from '../core/url.js';\nimport { useWidgetSettings } from './settings.js';\n\n/** Whether a link `target` opens a new browsing context (not `_self`). */\nfunction isNewTabTarget(target: string | undefined): boolean {\n return target !== undefined && target !== '' && target !== '_self';\n}\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, labels } = useWidgetSettings();\n if (href === undefined || !isSafeHref(href)) {\n return <span className={className}>{children}</span>;\n }\n const opensNewTab: boolean = isNewTabTarget(linkTarget);\n return (\n <a href={href} target={linkTarget} rel=\"noreferrer\" className={className}>\n {children}\n {opensNewTab && (\n <>\n <svg\n className=\"dwt-external-icon\"\n viewBox=\"0 0 12 12\"\n width=\"1em\"\n height=\"1em\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M7 1h4v4M11 1 5.5 6.5M9 7.5V10a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h2.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"dwt-visually-hidden\"> {labels.opensInNewTab}</span>\n </>\n )}\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 { useId, useState, type ReactNode } from 'react';\n\nimport {\n queryRows,\n tableDetailData,\n type DetailPage,\n type DetailQuery,\n type DetailSort,\n type ResolvedTableControls,\n} from '../core/detail.js';\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 color, so it never relies on color 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 controls,\n initialSort,\n}: {\n readonly data: TableWidgetData;\n /** Search box and sortable headers; see `WidgetDefinition.tableControls`. */\n readonly controls?: ResolvedTableControls | undefined;\n /** The header sort to start with, for example from a `sort` option. */\n readonly initialSort?: DetailSort | undefined;\n}): ReactNode {\n if (controls === undefined) {\n return (\n <div className=\"dwt-table-wrap\">\n <TableView data={data} />\n {data.footer !== undefined && <p className=\"dwt-note\">{data.footer}</p>}\n </div>\n );\n }\n return (\n <InteractiveTable\n data={data}\n controls={controls}\n initialSort={initialSort}\n />\n );\n}\n\nfunction TableView({\n data,\n rows = data.rows,\n sort,\n onSort,\n}: {\n readonly data: TableWidgetData;\n readonly rows?: TableWidgetData['rows'];\n readonly sort?: DetailSort | undefined;\n /** Makes the headers sort buttons. */\n readonly onSort?: ((columnKey: string) => void) | undefined;\n}): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n return (\n <>\n <table className={slot('table', 'dwt-table')}>\n <thead>\n <tr>\n {data.columns.map((column, index) => {\n const key = `c${index}`;\n const sorted: boolean = sort?.column === key;\n return (\n <th\n key={index}\n scope=\"col\"\n className={\n column.numeric === true ? 'dwt-numeric' : undefined\n }\n aria-sort={\n sorted\n ? sort?.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\n }\n >\n {onSort === undefined ? (\n column.label\n ) : (\n <button\n type=\"button\"\n className=\"dwt-detail-sort\"\n aria-label={labels.sortBy(column.label)}\n onClick={() => onSort(key)}\n >\n {column.label}\n <span aria-hidden=\"true\">\n {!sorted\n ? ' ↕'\n : sort?.direction === 'asc'\n ? ' ↑'\n : ' ↓'}\n </span>\n </button>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {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 </>\n );\n}\n\n/** Next sort for a click on a header: ascending, descending, then none. */\nfunction nextTableSort(\n current: DetailSort | undefined,\n column: string\n): DetailSort | undefined {\n if (current?.column !== column) return { column, direction: 'asc' };\n return current.direction === 'asc'\n ? { column, direction: 'desc' }\n : undefined;\n}\n\nfunction InteractiveTable({\n data,\n controls,\n initialSort,\n}: {\n readonly data: TableWidgetData;\n readonly controls: ResolvedTableControls;\n readonly initialSort: DetailSort | undefined;\n}): ReactNode {\n const slot = useSlotClassName();\n const { labels, locale } = useWidgetSettings();\n const searchId: string = useId();\n const [search, setSearch] = useState<string>('');\n const [sort, setSort] = useState<DetailSort | undefined>(initialSort);\n // A changed sort option replaces the header sort (derived state, so no\n // effect and no extra render with stale rows).\n const seed: string =\n initialSort === undefined\n ? ''\n : `${initialSort.column}:${initialSort.direction}`;\n const [seededWith, setSeededWith] = useState<string>(seed);\n if (seededWith !== seed) {\n setSeededWith(seed);\n setSort(initialSort);\n }\n const localeTag: string | undefined =\n typeof locale === 'string' ? locale : locale?.[0];\n\n const query: DetailQuery = {\n page: 1,\n pageSize: Math.max(1, data.rows.length),\n ...(controls.search && search !== '' ? { search } : {}),\n ...(controls.sort && sort !== undefined ? { sort } : {}),\n };\n const result = queryRows(tableDetailData(data), query, localeTag);\n const page: DetailPage | undefined = result.ok ? result.value : undefined;\n\n return (\n <div className=\"dwt-table-wrap\">\n {controls.search && (\n <div className=\"dwt-table-search\">\n <label htmlFor={searchId} className=\"dwt-visually-hidden\">\n {labels.search}\n </label>\n <input\n id={searchId}\n type=\"search\"\n placeholder={labels.search}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n )}\n {result.ok ? (\n <>\n <p\n className=\"dwt-visually-hidden\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {page !== undefined && page.totalRows === 0\n ? labels.noResults\n : page === undefined\n ? ''\n : labels.showingRows(1, page.rows.length, page.totalRows)}\n </p>\n <TableView\n data={data}\n rows={page?.rows ?? data.rows}\n sort={sort}\n onSort={\n controls.sort\n ? (column) => setSort(nextTableSort(sort, column))\n : undefined\n }\n />\n {page !== undefined && page.totalRows === 0 && (\n <p className=\"dwt-note\">{labels.noResults}</p>\n )}\n </>\n ) : (\n <p role=\"alert\" className={slot('error', 'dwt-error')}>\n {result.error}\n </p>\n )}\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 color (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 tableControls,\n initialSort,\n}: {\n readonly data: WidgetData;\n /** Search and sort for TABLE data; see `resolveTableControls`. */\n readonly tableControls?: ResolvedTableControls | undefined;\n /** TABLE header sort to start with; see `sortFromOptions`. */\n readonly initialSort?: DetailSort | undefined;\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 (\n <TableWidget\n data={data}\n controls={tableControls}\n initialSort={initialSort}\n />\n );\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 CSSProperties, type ReactNode } from 'react';\n\nimport type { WidgetFill, WidgetSize } from '../core/definition.js';\nimport { resolveTableControls } from '../core/detail.js';\nimport { fillsHeight, fillsWidth } from '../core/grid.js';\nimport { sortFromOptions } from '../core/options.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 minimize toggle. */\n readonly actions?: ReactNode;\n readonly minimized?: boolean;\n /** Shows the minimize/expand toggle when given. */\n readonly onToggleMinimized?: () => void;\n /**\n * Opens the widget's detail view. Adds a \"View\" icon button to the header\n * actions and makes the title clickable (for mouse and touch; the button is\n * the accessible control).\n */\n readonly onView?: () => 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 /** Fill free space in the grid row (height, width or both). */\n readonly fill?: WidgetFill;\n /**\n * Explicit grid column span, set by `Dashboard` and `WidgetGrid` to give a\n * width-filling card the columns left over in its row.\n */\n readonly columnSpan?: number;\n /** 12-column width (see `WidgetDefinition.width`); sets `--dwt-width`. */\n readonly width?: number;\n /**\n * The widget's key, rendered as `data-widget-key` so `useWidgets` can tell\n * which card scrolled into view. `ResolvedWidgetCard` sets it for you.\n */\n readonly widgetKey?: string;\n /** Marks the card as being edited (dashed outline); set by `Dashboard`. */\n readonly editing?: boolean;\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 minimize toggle, and loading, empty and error states.\n */\nexport function WidgetCard({\n title,\n description,\n actions,\n minimized = false,\n onToggleMinimized,\n onView,\n status = 'ok',\n emptyText,\n error,\n onRetry,\n footer,\n size,\n fill,\n columnSpan,\n width,\n widgetKey,\n editing = false,\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 editing && 'dwt-card--editing',\n size !== undefined && `dwt-card--size-${size}`,\n fillsHeight(fill) && 'dwt-card--fill-height',\n fillsWidth(fill) && 'dwt-card--fill-width',\n className\n )}\n {...(widgetKey === undefined ? {} : { 'data-widget-key': widgetKey })}\n {...(columnSpan === undefined && width === undefined\n ? {}\n : {\n style: {\n ...(width === undefined ? {} : { '--dwt-width': width }),\n ...(columnSpan === undefined\n ? {}\n : { gridColumn: `span ${columnSpan}` }),\n } as CSSProperties,\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 {onView === undefined ? (\n title\n ) : (\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"dwt-card-title-button\"\n onClick={onView}\n >\n {title}\n </button>\n )}\n </Heading>\n {description !== undefined && !minimized && (\n <p className={slot('cardDescription', 'dwt-card-description')}>\n {description}\n </p>\n )}\n </div>\n {(actions !== undefined ||\n onToggleMinimized !== undefined ||\n onView !== undefined) && (\n <div className={slot('cardActions', 'dwt-card-actions')}>\n {onView !== undefined && (\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.view(title)}\n title={labels.view(title)}\n onClick={onView}\n >\n <svg\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M1 8s2.6-4.5 7-4.5S15 8 15 8s-2.6 4.5-7 4.5S1 8 1 8Z\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"8\" cy=\"8\" r=\"2.1\" fill=\"currentColor\" />\n </svg>\n </button>\n )}\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 /** See `WidgetCardProps.columnSpan`. */\n readonly columnSpan?: number;\n /** 12-column width (see `WidgetDefinition.width`); sets `--dwt-width`. */\n readonly width?: number;\n readonly actions?: ReactNode;\n readonly minimized?: boolean;\n readonly onToggleMinimized?: () => void;\n /** See `WidgetCardProps.onView`. */\n readonly onView?: () => void;\n readonly onRetry?: () => void;\n /** See `WidgetCardProps.editing`. */\n readonly editing?: boolean;\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 widgetKey={definition.key}\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 {...(definition.fill === undefined ? {} : { fill: definition.fill })}\n {...(widget.status === 'empty' ? { emptyText: widget.emptyText } : {})}\n {...(widget.status === 'error' ? { error: widget.error } : {})}\n >\n {widget.status === 'ok' ? (\n <WidgetContent\n data={widget.data}\n tableControls={resolveTableControls(definition)}\n initialSort={sortFromOptions(definition, widget.options)}\n />\n ) : null}\n </WidgetCard>\n );\n}\n","import type { WidgetDetailOptions, WidgetTableControls } from './detail.js';\nimport type { WidgetOption } from './options.js';\nimport type { WidgetKind } from './payload.js';\n\n/** A size hint for grid layouts; renderers may map it to column spans. */\nexport const WIDGET_SIZES = ['small', 'medium', 'large', 'full'] as const;\n\nexport type WidgetSize = (typeof WIDGET_SIZES)[number];\n\n/**\n * How a widget fills free space in a grid layout. `height` stretches it to\n * the height of its row; `width` widens it to take the columns left over in\n * its row; `both` does both. Absent, a widget is only as big as its content\n * and `defaultSize`.\n */\nexport const WIDGET_FILLS = ['height', 'width', 'both'] as const;\n\nexport type WidgetFill = (typeof WIDGET_FILLS)[number];\n\n/**\n * What a widget is, independent of its data. Mirrors Maker Toolkit's\n * `widget` table (`widget_key`, `title`, `description`, `view_type`,\n * `roles`, `sort_order`, `active`).\n */\nexport interface WidgetDefinition {\n /** Stable, unique id. Layouts and providers are keyed by it. */\n readonly key: string;\n readonly title: string;\n readonly description?: string;\n readonly kind: WidgetKind;\n /** Lower comes first. Default 0; ties keep definition order. */\n readonly sortOrder?: number;\n /** Roles allowed to see it. Absent or empty means everyone. */\n readonly roles?: readonly string[];\n /** False hides it from every user. Default true. */\n readonly active?: boolean;\n readonly defaultSize?: WidgetSize;\n /**\n * Share of the row the widget takes, in twelfths: an integer from 2 to 12\n * (6 is half the row, 12 the whole row). When any widget in a grid sets\n * it, the grid becomes 12 columns wide and widgets without a `width` use\n * the one their `defaultSize` implies (see `widthForSize`). Narrow grids\n * give widgets more room automatically.\n */\n readonly width?: number;\n /**\n * Gives the widget a detail view: a full list with sorting, filtering and\n * paging. `true` uses defaults. The data comes from a detail provider.\n */\n readonly detail?: boolean | WidgetDetailOptions;\n /**\n * TABLE widgets only: a search box and sortable column headers in the card\n * itself, working on the rows the card holds. `true` turns on both. With a\n * `footer` (rows were left out) they only see the rows shown; use `detail`\n * for the full list.\n */\n readonly tableControls?: boolean | WidgetTableControls;\n /** Fill free space in the row (height, width or both). Default: none. */\n readonly fill?: WidgetFill;\n /**\n * Keeps viewers from rearranging this widget. `true` locks everything:\n * move, hide and minimize. Use an object to lock only some; fields left out\n * are not locked.\n */\n readonly locked?: boolean | WidgetLock;\n /**\n * The widget's home page in a paged dashboard: a page key or title. A\n * widget no page lists yet (and a widget locked against moving) shows here;\n * without it, on the first page. Ignored when the layout has no pages.\n */\n readonly page?: string;\n /**\n * Choices the author offers, with defaults: a default sort, \"top N\", a\n * period, which columns show. The chosen values reach your provider as\n * `ProviderOptions.options`. See `options.ts`.\n */\n readonly options?: readonly WidgetOption[];\n}\n\n/** What a viewer may not do to a locked widget. */\nexport interface WidgetLock {\n /** Can't be reordered, and holds its place (a pinned slot). */\n readonly move?: boolean;\n /** Can't be hidden. */\n readonly hide?: boolean;\n /** Can't be collapsed to its header. */\n readonly minimize?: boolean;\n}\n\n/** `WidgetLock` with every default filled in. */\nexport type ResolvedWidgetLock = Required<WidgetLock>;\n\nconst NOT_LOCKED: ResolvedWidgetLock = Object.freeze({\n move: false,\n hide: false,\n minimize: false,\n});\nconst FULLY_LOCKED: ResolvedWidgetLock = Object.freeze({\n move: true,\n hide: true,\n minimize: true,\n});\n\n/**\n * Reads a widget's `locked` setting with defaults: `true` locks move, hide\n * and minimize, an object locks the fields it sets to `true`, and anything\n * else (absent, `false`) locks nothing.\n */\nexport function resolveWidgetLock(\n definition: Pick<WidgetDefinition, 'locked'>\n): ResolvedWidgetLock {\n const setting: boolean | WidgetLock | undefined = definition.locked;\n if (setting === true) return FULLY_LOCKED;\n if (setting === undefined || setting === false) return NOT_LOCKED;\n return {\n move: setting.move === true,\n hide: setting.hide === true,\n minimize: setting.minimize === true,\n };\n}\n\n/**\n * Identity helper that keeps the literal `kind` (so typed providers can be\n * checked against it) and gives a definition its type without a cast.\n */\nexport function defineWidget<const D extends WidgetDefinition>(\n definition: D\n): D {\n return definition;\n}\n\n/** Definitions sorted by `sortOrder` (stable: ties keep their input order). */\nexport function sortDefinitions<D extends WidgetDefinition>(\n definitions: readonly D[]\n): D[] {\n return definitions\n .map((definition, index) => ({ definition, index }))\n .sort(\n (a, b) =>\n (a.definition.sortOrder ?? 0) - (b.definition.sortOrder ?? 0) ||\n a.index - b.index\n )\n .map(({ definition }) => definition);\n}\n\n/** Whether a widget is active and visible to someone with these roles. */\nexport function isWidgetVisibleTo(\n definition: WidgetDefinition,\n roles: readonly string[] | undefined\n): boolean {\n if (definition.active === false) {\n return false;\n }\n if (definition.roles === undefined || definition.roles.length === 0) {\n return true;\n }\n if (roles === undefined) {\n return false;\n }\n return definition.roles.some((role) => roles.includes(role));\n}\n","/**\n * A viewer's dashboard customization: order, hidden and minimized 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\nimport { resolveWidgetLock, type WidgetLock } from './definition.js';\n\n/** What layout functions need from a widget definition. */\nexport interface LayoutItem {\n readonly key: string;\n readonly sortOrder?: number;\n /** See `WidgetDefinition.locked`. Pinned widgets hold their slot. */\n readonly locked?: boolean | WidgetLock;\n /** See `WidgetDefinition.page`: the widget's home page. */\n readonly page?: string;\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 * Pages of widgets. Absent, the lists above are the one and only page. With\n * pages, each page owns its own lists and the top-level lists are left\n * empty. See `pages.ts`.\n */\n readonly pages?: readonly LayoutPage[];\n}\n\n/** One page of a paged layout: the same lists as a layout, plus a name. */\nexport interface LayoutPage {\n /** Unique within the layout and stable when the page is renamed or moved. */\n readonly key: string;\n /** Shown in the page bar. At most `MAX_PAGE_TITLE_LENGTH` characters. */\n readonly title: string;\n readonly order: readonly string[];\n readonly hidden: readonly string[];\n readonly minimized: readonly string[];\n /** Rows this page holds, overriding the dashboard's default. */\n readonly maxRows?: number;\n}\n\n/** Longest page title; longer saved titles are cut. */\nexport const MAX_PAGE_TITLE_LENGTH = 30;\n/**\n * Most pages `parseLayout` keeps: a safety ceiling against malformed or\n * hostile JSON, not a product limit.\n */\nexport const MAX_PARSED_PAGES = 50;\n/** Most rows a page may be given with `maxRows`. */\nexport const MAX_PAGE_ROWS = 20;\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 const pages: LayoutPage[] = parsePages(record['pages']);\n if (pages.length > 0) {\n // With pages, the pages own placement and the top-level lists stay empty.\n return {\n order: EMPTY_LAYOUT.order,\n hidden: EMPTY_LAYOUT.hidden,\n minimized: EMPTY_LAYOUT.minimized,\n pages,\n };\n }\n if (order.length === 0 && hidden.length === 0 && minimized.length === 0) {\n return EMPTY_LAYOUT;\n }\n return { order, hidden, minimized };\n}\n\nfunction parsePages(value: unknown): LayoutPage[] {\n if (!Array.isArray(value)) return [];\n const pages: LayoutPage[] = [];\n const keys = new Set<string>();\n for (const entry of value.slice(0, MAX_PARSED_PAGES)) {\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {\n continue;\n }\n const record = entry as Readonly<Record<string, unknown>>;\n const key: unknown = record['key'];\n if (typeof key !== 'string' || key === '' || keys.has(key)) continue;\n keys.add(key);\n const rawTitle: unknown = record['title'];\n const title: string =\n typeof rawTitle === 'string' && rawTitle.trim() !== ''\n ? rawTitle.trim().slice(0, MAX_PAGE_TITLE_LENGTH)\n : `Page ${pages.length + 1}`;\n const maxRows: unknown = record['maxRows'];\n // A widget lives on one page: the first page that holds it keeps it.\n const held = new Set<string>();\n for (const earlier of pages) {\n for (const k of [...earlier.order, ...earlier.hidden]) held.add(k);\n }\n const keep = (list: unknown): string[] =>\n uniqueStrings(list).filter((k) => !held.has(k));\n pages.push({\n key,\n title,\n order: keep(record['order']),\n hidden: keep(record['hidden']),\n minimized: keep(record['minimized']),\n ...(typeof maxRows === 'number' &&\n Number.isInteger(maxRows) &&\n maxRows >= 1 &&\n maxRows <= MAX_PAGE_ROWS\n ? { maxRows }\n : {}),\n });\n }\n return pages;\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 ...(layout.pages === undefined || layout.pages.length === 0\n ? {}\n : {\n pages: layout.pages.map((page) => ({\n key: page.key,\n title: page.title,\n order: [...page.order],\n hidden: [...page.hidden],\n minimized: [...page.minimized],\n ...(page.maxRows === undefined ? {} : { maxRows: page.maxRows }),\n })),\n }),\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\nfunction isPinned(item: LayoutItem): boolean {\n return resolveWidgetLock(item).move;\n}\n\n/**\n * The visible widgets in the viewer's order, ignoring locks: saved keys first\n * (when still present), then widgets the layout doesn't know yet, by\n * sortOrder.\n */\nfunction viewerOrder<T extends LayoutItem>(\n visible: readonly T[],\n layout: DashboardLayout\n): T[] {\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/**\n * Lays `free` widgets out around the pinned ones. A pinned widget keeps its\n * slot: its index among the visible widgets in `sortOrder` order. Free\n * widgets fill the remaining slots, left to right.\n */\nfunction placeAroundPinned<T extends LayoutItem>(\n visible: readonly T[],\n free: readonly T[]\n): T[] {\n const slots: (T | undefined)[] = bySortOrder(visible).map((item) =>\n isPinned(item) ? item : undefined\n );\n let next = 0;\n return slots.map((pinned) => pinned ?? (free[next++] as T));\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. Widgets locked against moving are pinned: each keeps its\n * place from the definitions (never from `layout.order`) and the others\n * rearrange around it.\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 ordered: T[] = viewerOrder(visible, layout);\n if (!visible.some(isPinned)) return ordered;\n return placeAroundPinned(\n visible,\n ordered.filter((item) => !isPinned(item))\n );\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, the index is out of range,\n * or the move isn't allowed: a pinned widget can't move, and nothing can be\n * moved onto a pinned slot. Free widgets keep their relative order around\n * pinned ones, so a move that crosses a pinned slot lands on the nearest\n * free slot you named.\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: T[] = visibleWidgets(definitions, layout);\n const fromIndex: number = current.findIndex((d) => d.key === key);\n const mover: T | undefined = current[fromIndex];\n if (\n mover === undefined ||\n !Number.isInteger(toIndex) ||\n toIndex < 0 ||\n toIndex >= current.length ||\n toIndex === fromIndex ||\n isPinned(mover) ||\n isPinned(current[toIndex] as T)\n ) {\n return layout;\n }\n const freeSlots: number[] = freeSlotIndexes(current);\n const free: T[] = current.filter((item) => !isPinned(item));\n const fromFree: number = freeSlots.indexOf(fromIndex);\n const toFree: number = freeSlots.indexOf(toIndex);\n free.splice(fromFree, 1);\n free.splice(toFree, 0, mover);\n const next: T[] = placeAroundPinned(current, free);\n return { ...layout, order: next.map((d) => d.key) };\n}\n\n/** Indexes of the slots in `ordered` that are not pinned. */\nfunction freeSlotIndexes(ordered: readonly LayoutItem[]): number[] {\n const slots: number[] = [];\n ordered.forEach((item, index) => {\n if (!isPinned(item)) slots.push(index);\n });\n return slots;\n}\n\n/**\n * Moves `key` by `offset` places (negative is earlier). Pinned slots are\n * stepped over, not counted, and the move is clamped at the first and last\n * free slot.\n */\nexport function moveWidgetBy<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string,\n offset: number\n): DashboardLayout {\n const current: T[] = visibleWidgets(definitions, layout);\n const fromIndex: number = current.findIndex((d) => d.key === key);\n if (fromIndex === -1) return layout;\n const freeSlots: number[] = freeSlotIndexes(current);\n const fromFree: number = freeSlots.indexOf(fromIndex);\n if (fromFree === -1) return layout;\n const toFree: number = Math.max(\n 0,\n Math.min(freeSlots.length - 1, fromFree + Math.trunc(offset))\n );\n return moveWidget(definitions, layout, key, freeSlots[toFree] as number);\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 minimized 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 minimized. */\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 minimized. */\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/** Minimizes 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[]): readonly string[] =>\n keys.every((k) => known.has(k)) ? keys : keys.filter((k) => known.has(k));\n return mapLayoutLists(layout, (lists) => ({\n order: keep(lists.order),\n hidden: keep(lists.hidden),\n minimized: keep(lists.minimized),\n }));\n}\n\n/** The three lists a layout and each of its pages carry. */\ninterface LayoutLists {\n readonly order: readonly string[];\n readonly hidden: readonly string[];\n readonly minimized: readonly string[];\n}\n\n/**\n * Applies `change` to the top-level lists and to each page's lists. Returns\n * the same object when no list changed (compared by identity, so `change`\n * should return the same arrays it was given when it has nothing to do).\n */\nfunction mapLayoutLists(\n layout: DashboardLayout,\n change: (lists: LayoutLists) => LayoutLists\n): DashboardLayout {\n const top: LayoutLists = change(layout);\n const pages: LayoutPage[] | undefined = layout.pages?.map((page) => {\n const next: LayoutLists = change(page);\n return next.order === page.order &&\n next.hidden === page.hidden &&\n next.minimized === page.minimized\n ? page\n : { ...page, ...next };\n });\n const pagesChanged: boolean =\n pages !== undefined && pages.some((page, i) => page !== layout.pages?.[i]);\n if (\n top.order === layout.order &&\n top.hidden === layout.hidden &&\n top.minimized === layout.minimized &&\n !pagesChanged\n ) {\n return layout;\n }\n return {\n ...layout,\n ...top,\n ...(pages === undefined ? {} : { pages }),\n };\n}\n\n/** Options for `enforceLocks`. */\nexport interface EnforceLocksOptions {\n /**\n * Skip enforcement. Set it server-side only for a user who may rearrange\n * locked widgets (an administrator editing the default layout), never from\n * a flag the client sends.\n */\n readonly overrideLocks?: boolean;\n}\n\n/**\n * Removes whatever a widget's lock forbids from a layout: a hide-locked key\n * leaves `hidden`, a minimize-locked key leaves `minimized`, and a\n * move-locked key leaves `order` (a pinned widget's place comes from the\n * definitions). Idempotent; returns the same object when nothing changes.\n * Run it on a layout a client sends before saving it.\n */\nexport function enforceLocks<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n options: EnforceLocksOptions = {}\n): DashboardLayout {\n if (options.overrideLocks === true) return layout;\n const noMove = new Set<string>();\n const noHide = new Set<string>();\n const noMinimize = new Set<string>();\n for (const definition of definitions) {\n const lock = resolveWidgetLock(definition);\n if (lock.move) noMove.add(definition.key);\n if (lock.hide) noHide.add(definition.key);\n if (lock.minimize) noMinimize.add(definition.key);\n }\n const without = (keys: readonly string[], drop: ReadonlySet<string>) =>\n keys.some((key) => drop.has(key))\n ? keys.filter((key) => !drop.has(key))\n : keys;\n return mapLayoutLists(layout, (lists) => ({\n order: without(lists.order, noMove),\n hidden: without(lists.hidden, noHide),\n minimized: without(lists.minimized, noMinimize),\n }));\n}\n","/**\n * Pages of widgets: a dashboard split into pages, like the home screens of a\n * phone. Each page is a small layout (order, hidden, minimized) with a name\n * and a capacity of `maxRows` rows of 12 columns. Pure functions, in the\n * style of `layout.ts`: inputs are never mutated, a refusal is a `Result`\n * with a specific message, and a no-op returns the same object.\n *\n * A layout without `pages` has one implicit page (`DEFAULT_PAGE_KEY`), so\n * everything here also works on layouts saved before pages existed.\n */\n\nimport { resolveWidgetLock } from './definition.js';\nimport { placeRows, fitCount, type GridItem } from './grid.js';\nimport {\n enforceLocks,\n MAX_PAGE_ROWS,\n MAX_PAGE_TITLE_LENGTH,\n MAX_PARSED_PAGES,\n pruneLayout,\n visibleWidgets,\n type DashboardLayout,\n type LayoutItem,\n type LayoutPage,\n} from './layout.js';\nimport { err, ok, type Result } from './result.js';\n\n/** The key of the implicit page of a layout that has no `pages`. */\nexport const DEFAULT_PAGE_KEY = 'default';\n/** Rows a page holds unless it (or the dashboard) says otherwise. */\nexport const DEFAULT_PAGE_ROWS = 4;\n\n/** What the page functions need from a widget definition. */\nexport type PageItem = LayoutItem &\n GridItem & {\n /** Used in messages; the key stands in when absent. */\n readonly title?: string;\n };\n\nexport interface PageOptions {\n /** Rows a page holds when it has no `maxRows` of its own. Default 4. */\n readonly maxRows?: number;\n}\n\nfunction rowsAllowed(page: LayoutPage, options: PageOptions): number {\n const rows: number = page.maxRows ?? options.maxRows ?? DEFAULT_PAGE_ROWS;\n return Math.max(1, Math.min(MAX_PAGE_ROWS, Math.floor(rows)));\n}\n\n/** Whether the layout has pages of its own (rather than one implicit page). */\nexport function hasPages(layout: DashboardLayout): boolean {\n return layout.pages !== undefined && layout.pages.length > 0;\n}\n\n/**\n * The layout's pages. A layout without `pages` has one implicit page called\n * \"Page 1\" made from its top-level lists.\n */\nexport function pageList(layout: DashboardLayout): readonly LayoutPage[] {\n if (layout.pages !== undefined && layout.pages.length > 0) {\n return layout.pages;\n }\n return [\n {\n key: DEFAULT_PAGE_KEY,\n title: 'Page 1',\n order: layout.order,\n hidden: layout.hidden,\n minimized: layout.minimized,\n },\n ];\n}\n\n/** Turns an implicit single page into an explicit one, so it can be edited. */\nfunction withExplicitPages(layout: DashboardLayout): DashboardLayout {\n if (hasPages(layout)) return layout;\n return {\n ...layout,\n order: [],\n hidden: [],\n minimized: [],\n pages: pageList(layout),\n };\n}\n\nfunction sameKeys(a: readonly string[], b: readonly string[]): boolean {\n return a === b || (a.length === b.length && a.every((k, i) => k === b[i]));\n}\n\n/**\n * One page as an ordinary layout, so every function in `layout.ts` (move,\n * hide, minimize, `visibleWidgets`) works on it unchanged. For a layout with\n * no pages this is the layout itself. Undefined for an unknown page.\n */\nexport function pageLayout(\n layout: DashboardLayout,\n pageKey: string\n): DashboardLayout | undefined {\n if (!hasPages(layout))\n return pageKey === DEFAULT_PAGE_KEY ? layout : undefined;\n const page: LayoutPage | undefined = layout.pages?.find(\n (p) => p.key === pageKey\n );\n if (page === undefined) return undefined;\n const { pages, ...rest } = layout;\n void pages;\n return {\n ...rest,\n order: page.order,\n hidden: page.hidden,\n minimized: page.minimized,\n };\n}\n\n/**\n * Writes a page's layout (changed with the functions in `layout.ts`) back\n * into the whole layout. Returns the same object when nothing changed or the\n * page doesn't exist.\n */\nexport function withPageLayout(\n layout: DashboardLayout,\n pageKey: string,\n next: DashboardLayout\n): DashboardLayout {\n const current: DashboardLayout | undefined = pageLayout(layout, pageKey);\n if (\n current === undefined ||\n (sameKeys(current.order, next.order) &&\n sameKeys(current.hidden, next.hidden) &&\n sameKeys(current.minimized, next.minimized))\n ) {\n return layout;\n }\n if (!hasPages(layout)) {\n return {\n ...layout,\n order: next.order,\n hidden: next.hidden,\n minimized: next.minimized,\n };\n }\n return {\n ...layout,\n pages: (layout.pages ?? []).map((page) =>\n page.key === pageKey\n ? {\n ...page,\n order: next.order,\n hidden: next.hidden,\n minimized: next.minimized,\n }\n : page\n ),\n };\n}\n\nfunction normalizedTitle(title: string): string {\n return title.trim().normalize('NFKC').toLowerCase();\n}\n\n/** The key of the page a `page` reference names: a key, else a title. */\nexport function resolvePageKey(\n layout: DashboardLayout,\n reference: string | undefined\n): string | undefined {\n if (reference === undefined || reference === '') return undefined;\n const pages: readonly LayoutPage[] = pageList(layout);\n const byKey: LayoutPage | undefined = pages.find((p) => p.key === reference);\n if (byKey !== undefined) return byKey.key;\n const wanted: string = normalizedTitle(reference);\n return pages.find((p) => normalizedTitle(p.title) === wanted)?.key;\n}\n\nfunction homePageKey(layout: DashboardLayout, item: LayoutItem): string {\n return (\n resolvePageKey(layout, item.page) ?? (pageList(layout)[0] as LayoutPage).key\n );\n}\n\n/**\n * Which page each widget shows on: the page that lists it (in its order or\n * hidden list), else its home page (`definition.page`, else the first page).\n * A widget locked against moving always shows on its home page, so a viewer's\n * saved layout can't move it. Definitions keep their input order.\n */\nexport function assignPages<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout\n): Map<string, T[]> {\n const pages: readonly LayoutPage[] = pageList(layout);\n const assigned = new Map<string, T[]>(pages.map((p) => [p.key, []]));\n for (const definition of definitions) {\n let pageKey: string | undefined;\n if (!resolveWidgetLock(definition).move) {\n pageKey = pages.find(\n (p) =>\n p.order.includes(definition.key) || p.hidden.includes(definition.key)\n )?.key;\n }\n assigned.get(pageKey ?? homePageKey(layout, definition))?.push(definition);\n }\n return assigned;\n}\n\n/** The key of the page a widget shows on; undefined if it isn't a definition. */\nexport function pageOf<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string\n): string | undefined {\n for (const [pageKey, widgets] of assignPages(definitions, layout)) {\n if (widgets.some((w) => w.key === key)) return pageKey;\n }\n return undefined;\n}\n\n/** A page's visible widgets, in display order (minimized ones included). */\nexport function pageWidgets<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n pageKey: string\n): T[] {\n const onPage: T[] = assignPages(definitions, layout).get(pageKey) ?? [];\n const view: DashboardLayout | undefined = pageLayout(layout, pageKey);\n return view === undefined ? [] : visibleWidgets(onPage, view);\n}\n\n/** How full a page is. */\nexport interface PageRoom {\n readonly maxRows: number;\n readonly rowsUsed: number;\n readonly rowsFree: number;\n}\n\n/** Rows a page allows, uses and has left, as the grid will draw them. */\nexport function pageRoom<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n pageKey: string,\n options: PageOptions = {}\n): PageRoom | undefined {\n const page: LayoutPage | undefined = pageList(layout).find(\n (p) => p.key === pageKey\n );\n if (page === undefined) return undefined;\n const maxRows: number = rowsAllowed(page, options);\n const rowsUsed: number = placeRows(\n pageWidgets(definitions, layout, pageKey)\n ).length;\n return { maxRows, rowsUsed, rowsFree: Math.max(0, maxRows - rowsUsed) };\n}\n\nfunction describePage(page: LayoutPage): string {\n return `Page \"${page.title}\"`;\n}\n\nfunction titleOf(item: PageItem): string {\n return item.title ?? item.key;\n}\n\n/** Checks a page title: not empty, short enough, not used by another page. */\nfunction checkTitle(\n layout: DashboardLayout,\n title: string,\n exceptKey?: string\n): Result<string> {\n const trimmed: string = title.trim();\n if (trimmed === '') return err('A page title must not be empty.');\n if (trimmed.length > MAX_PAGE_TITLE_LENGTH) {\n return err(\n `Page title \"${trimmed}\" is ${trimmed.length} characters; the most is ${MAX_PAGE_TITLE_LENGTH}.`\n );\n }\n const wanted: string = normalizedTitle(trimmed);\n const clash: LayoutPage | undefined = pageList(layout).find(\n (p) => p.key !== exceptKey && normalizedTitle(p.title) === wanted\n );\n if (clash !== undefined) {\n return err(`Another page is already called \"${clash.title}\".`);\n }\n return ok(trimmed);\n}\n\n/** The first `page-N` key no page uses. */\nexport function nextPageKey(layout: DashboardLayout): string {\n const keys = new Set<string>(pageList(layout).map((p) => p.key));\n let n = 1;\n while (keys.has(`page-${n}`)) n += 1;\n return `page-${n}`;\n}\n\n/** The first \"Page N\" title no page uses. */\nfunction nextPageTitle(layout: DashboardLayout): string {\n const used = new Set<string>(\n pageList(layout).map((p) => normalizedTitle(p.title))\n );\n let n: number = pageList(layout).length + 1;\n while (used.has(normalizedTitle(`Page ${n}`))) n += 1;\n return `Page ${n}`;\n}\n\nexport interface AddPageOptions {\n /** The new page's title. Default: the next free \"Page N\". */\n readonly title?: string;\n /** The new page's key. Default: the next free `page-N`. */\n readonly key?: string;\n}\n\n/**\n * Adds an empty page after the last one. A layout without pages gains an\n * explicit first page holding everything it had.\n */\nexport function addPage(\n layout: DashboardLayout,\n options: AddPageOptions = {}\n): Result<DashboardLayout> {\n if (pageList(layout).length >= MAX_PARSED_PAGES) {\n return err(\n `The layout already has ${MAX_PARSED_PAGES} pages, the most it can keep.`\n );\n }\n const key: string = options.key ?? nextPageKey(layout);\n if (pageList(layout).some((p) => p.key === key)) {\n return err(`A page with the key \"${key}\" already exists.`);\n }\n const title: Result<string> = checkTitle(\n layout,\n options.title ?? nextPageTitle(layout)\n );\n if (!title.ok) return title;\n const base: DashboardLayout = withExplicitPages(layout);\n const page: LayoutPage = {\n key,\n title: title.value,\n order: [],\n hidden: [],\n minimized: [],\n };\n return ok({ ...base, pages: [...(base.pages ?? []), page] });\n}\n\n/** Renames a page. The same layout comes back when the title is unchanged. */\nexport function renamePage(\n layout: DashboardLayout,\n pageKey: string,\n title: string\n): Result<DashboardLayout> {\n const page: LayoutPage | undefined = pageList(layout).find(\n (p) => p.key === pageKey\n );\n if (page === undefined) return err(`Page \"${pageKey}\" doesn't exist.`);\n const checked: Result<string> = checkTitle(layout, title, pageKey);\n if (!checked.ok) return checked;\n if (checked.value === page.title) return ok(layout);\n const base: DashboardLayout = withExplicitPages(layout);\n return ok({\n ...base,\n pages: (base.pages ?? []).map((p) =>\n p.key === pageKey ? { ...p, title: checked.value } : p\n ),\n });\n}\n\n/**\n * Moves a page `offset` places (negative is earlier), clamped at the ends.\n * Returns the same layout when nothing moves.\n */\nexport function movePage(\n layout: DashboardLayout,\n pageKey: string,\n offset: number\n): DashboardLayout {\n const pages: readonly LayoutPage[] = layout.pages ?? [];\n const from: number = pages.findIndex((p) => p.key === pageKey);\n if (from === -1) return layout;\n const to: number = Math.max(\n 0,\n Math.min(pages.length - 1, from + Math.trunc(offset))\n );\n if (to === from) return layout;\n const next: LayoutPage[] = [...pages];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved as LayoutPage);\n return { ...layout, pages: next };\n}\n\nfunction overflowing<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n options: PageOptions\n): LayoutPage | undefined {\n return pageList(layout).find(\n (page) =>\n placeRows(pageWidgets(definitions, layout, page.key)).length >\n rowsAllowed(page, options)\n );\n}\n\n/**\n * Removes a page. Its widgets move to the end of the previous page (the next\n * one when it was first), keeping their hidden and minimized state. Refused\n * for the only page, and when the widgets wouldn't fit on the pages left.\n */\nexport function removePage<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n pageKey: string,\n options: PageOptions = {}\n): Result<DashboardLayout> {\n const pages: readonly LayoutPage[] = pageList(layout);\n const index: number = pages.findIndex((p) => p.key === pageKey);\n const page: LayoutPage | undefined = pages[index];\n if (page === undefined) return err(`Page \"${pageKey}\" doesn't exist.`);\n if (pages.length === 1) {\n return err(\n `${describePage(page)} is the only page, so it can't be removed.`\n );\n }\n const target: LayoutPage = pages[index > 0 ? index - 1 : 1] as LayoutPage;\n const merged: DashboardLayout = {\n ...layout,\n pages: pages\n .filter((p) => p.key !== pageKey)\n .map((p) =>\n p.key === target.key\n ? {\n ...p,\n order:\n index > 0\n ? [...p.order, ...page.order]\n : [...page.order, ...p.order],\n hidden: [...p.hidden, ...page.hidden],\n minimized: [...p.minimized, ...page.minimized],\n }\n : p\n ),\n };\n const full: LayoutPage | undefined = overflowing(\n definitions,\n merged,\n options\n );\n if (full !== undefined) {\n return err(\n `${describePage(page)} has widgets that don't fit on the other pages (${describePage(full)} would need more than ${rowsAllowed(full, options)} rows). Move or hide some first.`\n );\n }\n return ok(merged);\n}\n\nfunction without(keys: readonly string[], key: string): readonly string[] {\n return keys.includes(key) ? keys.filter((k) => k !== key) : keys;\n}\n\n/**\n * Moves a widget to the end of another page, keeping its hidden and\n * minimized state. Refused for an unknown widget or page, for a widget locked\n * against moving, and when a visible widget wouldn't fit in the page's rows.\n */\nexport function moveWidgetToPage<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n widgetKey: string,\n targetKey: string,\n options: PageOptions = {}\n): Result<DashboardLayout> {\n const widget: T | undefined = definitions.find((d) => d.key === widgetKey);\n if (widget === undefined) {\n return err(\n `Widget \"${widgetKey}\" isn't one of the widgets, so it can't be moved to a page.`\n );\n }\n const pages: readonly LayoutPage[] = pageList(layout);\n const target: LayoutPage | undefined = pages.find((p) => p.key === targetKey);\n if (target === undefined) return err(`Page \"${targetKey}\" doesn't exist.`);\n const sourceKey: string = pageOf(definitions, layout, widgetKey) as string;\n if (sourceKey === targetKey) return ok(layout);\n if (resolveWidgetLock(widget).move) {\n return err(\n `Widget \"${titleOf(widget)}\" is locked against moving, so it can't be moved to ${describePage(target)}.`\n );\n }\n const base: DashboardLayout = withExplicitPages(layout);\n const source: LayoutPage = (base.pages ?? []).find(\n (p) => p.key === sourceKey\n ) as LayoutPage;\n const hidden: boolean = source.hidden.includes(widgetKey);\n const minimized: boolean = source.minimized.includes(widgetKey);\n // The widget joins the end of the target's display order.\n const targetOrder: readonly string[] = pageWidgets(\n definitions,\n base,\n targetKey\n ).map((d) => d.key);\n const moved: DashboardLayout = {\n ...base,\n pages: (base.pages ?? []).map((p) => {\n if (p.key === sourceKey) {\n return {\n ...p,\n order: without(p.order, widgetKey),\n hidden: without(p.hidden, widgetKey),\n minimized: without(p.minimized, widgetKey),\n };\n }\n if (p.key === targetKey) {\n return {\n ...p,\n order: hidden ? p.order : [...targetOrder, widgetKey],\n hidden: hidden ? [...p.hidden, widgetKey] : p.hidden,\n minimized: minimized ? [...p.minimized, widgetKey] : p.minimized,\n };\n }\n return p;\n }),\n };\n if (!hidden) {\n const allowed: number = rowsAllowed(target, options);\n const needed: number = placeRows(\n pageWidgets(definitions, moved, targetKey)\n ).length;\n if (needed > allowed) {\n return err(\n `${describePage(target)} has no room for \"${titleOf(widget)}\": it would need row ${needed}, and the page allows ${allowed}.`\n );\n }\n }\n return ok(moved);\n}\n\nexport interface NormalizeOptions extends PageOptions {\n /** Skip lock enforcement, for a user who may rearrange locked widgets. */\n readonly overrideLocks?: boolean;\n}\n\nfunction withoutLockField<T extends LayoutItem>(definition: T): T {\n if (definition.locked === undefined) return definition;\n const copy: { -readonly [K in keyof T]: T[K] } = { ...definition };\n delete copy.locked;\n return copy;\n}\n\nfunction uniqueTitle(taken: Set<string>, title: string, index: number): string {\n let base: string = title.trim().slice(0, MAX_PAGE_TITLE_LENGTH);\n if (base === '') base = `Page ${index + 1}`;\n let candidate: string = base;\n let n = 1;\n while (taken.has(normalizedTitle(candidate))) {\n const suffix = ` (#${n})`;\n candidate = `${base.slice(0, MAX_PAGE_TITLE_LENGTH - suffix.length)}${suffix}`;\n n += 1;\n }\n taken.add(normalizedTitle(candidate));\n return candidate;\n}\n\nfunction samePages(\n a: readonly LayoutPage[],\n b: readonly LayoutPage[]\n): boolean {\n return (\n a.length === b.length &&\n a.every((p, i) => {\n const q = b[i] as LayoutPage;\n return (\n p.key === q.key &&\n p.title === q.title &&\n p.maxRows === q.maxRows &&\n sameKeys(p.order, q.order) &&\n sameKeys(p.hidden, q.hidden) &&\n sameKeys(p.minimized, q.minimized)\n );\n })\n );\n}\n\n/**\n * Repairs a layout so it can be trusted, for the place it is saved: unknown\n * widgets are dropped, locks are enforced, and in a paged layout each widget\n * lives on one page, titles are trimmed, unique and short, widgets no page\n * lists yet are placed (on their home page), and a page that holds too many\n * rows has its overflow moved, in order, to the next page with room or a new\n * page after it. Nothing is hidden or dropped to make room. Idempotent;\n * returns the same object when nothing changes.\n */\nexport function normalizeLayout<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n options: NormalizeOptions = {}\n): DashboardLayout {\n const known: DashboardLayout = pruneLayout(definitions, layout);\n const locked: DashboardLayout = enforceLocks(definitions, known, options);\n if (!hasPages(locked)) return locked === layout ? layout : locked;\n\n const defs: readonly T[] =\n options.overrideLocks === true\n ? definitions.map(withoutLockField)\n : definitions;\n\n // Pages: one per key, one page per widget, clean titles.\n const taken = new Set<string>();\n const seenKeys = new Set<string>();\n const held = new Set<string>();\n let pages: LayoutPage[] = [];\n (locked.pages ?? []).forEach((page, index) => {\n if (seenKeys.has(page.key)) return;\n seenKeys.add(page.key);\n const keep = (list: readonly string[]): string[] => [\n ...new Set(list.filter((k) => !held.has(k))),\n ];\n const next: LayoutPage = {\n ...page,\n title: uniqueTitle(taken, page.title, index),\n order: keep(page.order),\n hidden: keep(page.hidden),\n minimized: keep(page.minimized),\n };\n for (const k of [...next.order, ...next.hidden]) held.add(k);\n pages.push(next);\n });\n\n const work = (): DashboardLayout => ({ ...locked, pages });\n\n // A widget locked against moving belongs to its home page: its hidden and\n // minimized entries move there, and it is never listed in an order.\n const pinned: T[] = defs.filter((d) => resolveWidgetLock(d).move);\n for (const widget of pinned) {\n const home: string = homePageKey(work(), widget);\n const keysHere = (p: LayoutPage, list: 'hidden' | 'minimized') =>\n p.key !== home && p[list].includes(widget.key);\n const wasHidden: boolean = pages.some((p) => keysHere(p, 'hidden'));\n const wasMinimized: boolean = pages.some((p) => keysHere(p, 'minimized'));\n if (!wasHidden && !wasMinimized) continue;\n pages = pages.map((p) => {\n let next: LayoutPage = p;\n if (keysHere(p, 'hidden')) {\n next = { ...next, hidden: without(next.hidden, widget.key) };\n }\n if (keysHere(p, 'minimized')) {\n next = { ...next, minimized: without(next.minimized, widget.key) };\n }\n if (p.key === home) {\n next = {\n ...next,\n hidden:\n wasHidden && !next.hidden.includes(widget.key)\n ? [...next.hidden, widget.key]\n : next.hidden,\n minimized:\n wasMinimized && !next.minimized.includes(widget.key)\n ? [...next.minimized, widget.key]\n : next.minimized,\n };\n }\n return next;\n });\n }\n\n // Widgets no page lists yet join the end of their home page's order.\n const placedKeys = new Set<string>();\n for (const p of pages) {\n for (const k of [...p.order, ...p.hidden]) placedKeys.add(k);\n }\n const pinnedKeys = new Set<string>(pinned.map((d) => d.key));\n const unplaced: T[] = defs\n .filter((d) => !placedKeys.has(d.key) && !pinnedKeys.has(d.key))\n .map((definition, index) => ({ definition, index }))\n .sort(\n (a, b) =>\n (a.definition.sortOrder ?? 0) - (b.definition.sortOrder ?? 0) ||\n a.index - b.index\n )\n .map(({ definition }) => definition);\n for (const widget of unplaced) {\n const home: string = homePageKey(work(), widget);\n pages = pages.map((p) =>\n p.key === home ? { ...p, order: [...p.order, widget.key] } : p\n );\n }\n\n // Overflow moves, in order, to the next page with room or a new page.\n for (let i = 0; i < pages.length; i += 1) {\n const page = pages[i] as LayoutPage;\n const shown: T[] = pageWidgets(defs, work(), page.key);\n const fits: number = fitCount(shown, rowsAllowed(page, options));\n if (fits >= shown.length) continue;\n const moving: string[] = shown\n .slice(fits)\n .filter((d) => !pinnedKeys.has(d.key))\n .map((d) => d.key);\n if (moving.length === 0) continue;\n const moveSet = new Set<string>(moving);\n const movedMinimized: string[] = page.minimized.filter((k) =>\n moveSet.has(k)\n );\n pages = pages.map((p) =>\n p.key === page.key\n ? {\n ...p,\n order: p.order.filter((k) => !moveSet.has(k)),\n minimized: p.minimized.filter((k) => !moveSet.has(k)),\n }\n : p\n );\n let placed = false;\n for (let j = i + 1; j < pages.length && !placed; j += 1) {\n const candidate: LayoutPage = pages[j] as LayoutPage;\n const trial: LayoutPage[] = pages.map((p) =>\n p.key === candidate.key\n ? {\n ...p,\n order: [...moving, ...p.order],\n minimized: [...p.minimized, ...movedMinimized],\n }\n : p\n );\n const items: T[] = pageWidgets(\n defs,\n { ...locked, pages: trial },\n candidate.key\n );\n if (placeRows(items).length <= rowsAllowed(candidate, options)) {\n pages = trial;\n placed = true;\n }\n }\n if (!placed) {\n const key: string = nextPageKey(work());\n const title: string = uniqueTitle(\n new Set<string>(pages.map((p) => normalizedTitle(p.title))),\n `Page ${pages.length + 1}`,\n pages.length\n );\n pages = [\n ...pages,\n { key, title, order: moving, hidden: [], minimized: movedMinimized },\n ];\n }\n }\n\n const result: DashboardLayout = work();\n return samePages(layout.pages ?? [], pages) &&\n sameKeys(layout.order, result.order)\n ? layout\n : result;\n}\n","import {\n useEffect,\n useId,\n useRef,\n useState,\n type ReactNode,\n type RefObject,\n} from 'react';\n\nimport {\n defaultDetailQuery,\n queryRows,\n validateDetailData,\n type DetailCell,\n type DetailColumn,\n type DetailData,\n type DetailProviderOptions,\n type DetailPage,\n type DetailQuery,\n type DetailSort,\n} from '../core/detail.js';\nimport type { WidgetDefinition } from '../core/definition.js';\nimport type { OptionValues } from '../core/options.js';\nimport { WidgetLink } from './primitives.js';\nimport { useSlotClassName, useWidgetSettings } from './settings.js';\n\n/**\n * Loads a widget's full detail data. Close over your own context (a Prisma\n * client, a fetch) here; the package never fetches. See `DetailProvider`.\n * Return `undefined` for a widget you have no extra data for: the card's own\n * data is used when it is complete (see `deriveDetailData`).\n */\nexport type DetailLoader = (\n definition: WidgetDefinition,\n options: DetailProviderOptions\n) => DetailData | undefined | Promise<DetailData | undefined>;\n\nexport interface WidgetDetailProps {\n /** Table caption: the widget's title. */\n readonly title: string;\n /** The rows to show. Absent while `status` is `loading` or `error`. */\n readonly data?: DetailData;\n /** Controlled: you own the query, so you can keep it in the URL. */\n readonly query: DetailQuery;\n readonly onQueryChange: (query: DetailQuery) => void;\n /** Default `ok`. */\n readonly status?: 'ok' | 'loading' | 'error';\n readonly error?: string;\n readonly onRetry?: () => void;\n /** Heading level of the title, 2 to 6. Default 2. */\n readonly headingLevel?: 2 | 3 | 4 | 5 | 6;\n /** Id of the heading, so a dialog can label itself with it. */\n readonly headingId?: string;\n readonly className?: string;\n}\n\nfunction nextSort(\n current: DetailSort | undefined,\n column: string\n): DetailSort | undefined {\n if (current?.column !== column) return { column, direction: 'asc' };\n return current.direction === 'asc'\n ? { column, direction: 'desc' }\n : undefined;\n}\n\n/** `query` with a new sort (or none), back on the first page. */\nfunction withSort(\n query: DetailQuery,\n sort: DetailSort | undefined\n): DetailQuery {\n const { sort: _previous, ...rest } = query;\n return sort === undefined ? { ...rest, page: 1 } : { ...rest, sort, page: 1 };\n}\n\nfunction SortGlyph({\n sort,\n column,\n}: {\n readonly sort: DetailSort | undefined;\n readonly column: string;\n}): ReactNode {\n if (sort?.column !== column) return <span aria-hidden=\"true\"> ↕</span>;\n return (\n <span aria-hidden=\"true\">{sort.direction === 'asc' ? ' ↑' : ' ↓'}</span>\n );\n}\n\nfunction Cell({\n cell,\n column,\n}: {\n readonly cell: DetailCell;\n readonly column: DetailColumn | undefined;\n}): ReactNode {\n return (\n <td className={column?.numeric === true ? 'dwt-numeric' : undefined}>\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}\n\n/**\n * The detail view of a widget: search and column filters, a sortable table\n * and paging, over data you give it (client mode: it filters, sorts and pages\n * in memory with `queryRows`). Controlled by `query`. Use it on its own as a\n * page, or inside `WidgetDetailDialog`.\n */\nexport function WidgetDetail({\n title,\n data,\n query,\n onQueryChange,\n status = 'ok',\n error,\n onRetry,\n headingLevel = 2,\n headingId,\n className,\n}: WidgetDetailProps): ReactNode {\n const slot = useSlotClassName();\n const { labels, locale } = useWidgetSettings();\n const id: string = useId();\n const Heading = `h${headingLevel}` as const;\n const localeTag: string | undefined =\n typeof locale === 'string' ? locale : locale?.[0];\n\n let page: DetailPage | undefined;\n let problem: string | undefined;\n if (status === 'ok' && data !== undefined) {\n const result = queryRows(data, query, localeTag);\n if (result.ok) page = result.value;\n else problem = result.error;\n }\n\n function change(patch: Partial<DetailQuery>): void {\n onQueryChange({ ...query, ...patch, page: patch.page ?? 1 });\n }\n\n let body: ReactNode;\n if (status === 'loading') {\n body = (\n <p role=\"status\" className={slot('status', 'dwt-status')}>\n {labels.loading}\n </p>\n );\n } else if (status === 'error' || problem !== undefined) {\n body = (\n <div role=\"alert\" className={slot('error', 'dwt-error')}>\n <p className=\"dwt-error-message\">{error ?? problem ?? ''}</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 } else if (data !== undefined && page !== undefined) {\n const columns: readonly DetailColumn[] = data.columns;\n const from: number = (page.page - 1) * query.pageSize + 1;\n const to: number = from + page.rows.length - 1;\n body = (\n <>\n <div className=\"dwt-detail-controls\">\n <label className=\"dwt-detail-field\">\n <span>{labels.search}</span>\n <input\n type=\"search\"\n value={query.search ?? ''}\n onChange={(event) => change({ search: event.target.value })}\n />\n </label>\n {columns\n .filter((column) => column.filterable === true)\n .map((column) => (\n <label key={column.key} className=\"dwt-detail-field\">\n <span>{labels.filterBy(column.label)}</span>\n <input\n type=\"search\"\n value={query.filters?.[column.key] ?? ''}\n onChange={(event) =>\n change({\n filters: {\n ...query.filters,\n [column.key]: event.target.value,\n },\n })\n }\n />\n </label>\n ))}\n </div>\n <p\n className=\"dwt-detail-summary\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {page.totalRows === 0\n ? labels.noResults\n : labels.showingRows(from, to, page.totalRows)}\n </p>\n <div className=\"dwt-table-wrap\">\n <table className={slot('table', 'dwt-table', 'dwt-detail-table')}>\n <caption className=\"dwt-visually-hidden\">{title}</caption>\n <thead>\n <tr>\n {columns.map((column) => {\n const sorted: boolean = query.sort?.column === column.key;\n return (\n <th\n key={column.key}\n scope=\"col\"\n className={\n column.numeric === true ? 'dwt-numeric' : undefined\n }\n aria-sort={\n sorted\n ? query.sort?.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\n }\n >\n {column.sortable === false ? (\n column.label\n ) : (\n <button\n type=\"button\"\n className=\"dwt-detail-sort\"\n aria-label={labels.sortBy(column.label)}\n onClick={() =>\n onQueryChange(\n withSort(query, nextSort(query.sort, column.key))\n )\n }\n >\n {column.label}\n <SortGlyph sort={query.sort} column={column.key} />\n </button>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {page.rows.map((row, rowIndex) => (\n <tr key={rowIndex}>\n {row.map((cell, cellIndex) => (\n <Cell\n key={cellIndex}\n cell={cell}\n column={columns[cellIndex]}\n />\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {page.pageCount > 1 && (\n <nav className=\"dwt-detail-pager\" aria-label={labels.pagination}>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button')}\n disabled={page.page <= 1}\n onClick={() => onQueryChange({ ...query, page: page.page - 1 })}\n >\n {labels.previousPage}\n </button>\n <span>{labels.pageOf(page.page, page.pageCount)}</span>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button')}\n disabled={page.page >= page.pageCount}\n onClick={() => onQueryChange({ ...query, page: page.page + 1 })}\n >\n {labels.nextPage}\n </button>\n </nav>\n )}\n </>\n );\n }\n\n return (\n <section\n aria-labelledby={headingId ?? `${id}-title`}\n className={slot('detail', 'dwt-detail', className)}\n >\n <Heading\n id={headingId ?? `${id}-title`}\n className={slot('cardTitle', 'dwt-card-title', 'dwt-detail-title')}\n >\n {title}\n </Heading>\n {body}\n </section>\n );\n}\n\nexport interface WidgetDetailDialogProps {\n readonly title: string;\n readonly open: boolean;\n /** Called on Esc, the Close button and a click on the backdrop. */\n readonly onClose: () => void;\n readonly children: ReactNode;\n}\n\n/**\n * A native modal `<dialog>`: focus is trapped, Esc closes it, the page behind\n * is inert, and focus returns to the control that opened it.\n */\nexport function WidgetDetailDialog({\n title,\n open,\n onClose,\n children,\n}: WidgetDetailDialogProps): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const dialogRef: RefObject<HTMLDialogElement | null> =\n useRef<HTMLDialogElement>(null);\n const titleId: string = useId();\n\n useEffect(() => {\n const dialog: HTMLDialogElement | null = dialogRef.current;\n if (dialog === null || !open) return undefined;\n // Remember what had focus so closing (or unmounting) can give it back.\n const opener: Element | null = document.activeElement;\n if (!dialog.open) dialog.showModal();\n return () => {\n if (dialog.open) dialog.close();\n if (opener instanceof HTMLElement) opener.focus();\n };\n }, [open]);\n\n return (\n <dialog\n ref={dialogRef}\n className=\"dwt-detail-dialog\"\n aria-labelledby={titleId}\n onCancel={(event) => {\n event.preventDefault();\n onClose();\n }}\n onClick={(event) => {\n if (event.target === dialogRef.current) onClose();\n }}\n >\n {open && (\n <div className=\"dwt-detail-dialog-body\">\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-detail-close')}\n onClick={onClose}\n >\n {labels.close}\n </button>\n <span id={titleId} className=\"dwt-visually-hidden\">\n {title}\n </span>\n {children}\n </div>\n )}\n </dialog>\n );\n}\n\nconst NO_OPTION_VALUES: OptionValues = Object.freeze({});\n\nexport interface DetailLoadState {\n readonly status: 'loading' | 'ok' | 'error';\n readonly data?: DetailData;\n readonly error?: string;\n}\n\n/**\n * Loads a widget's detail data while `enabled`: calls `load` with an abort\n * signal (aborted on close, retry or unmount), validates the result and\n * reports loading, ok or error. When `load` is missing or returns\n * `undefined`, `fallback` (for example the card's own complete data) is used\n * instead. `reload` runs it again. Keep `load` and `fallback` referentially\n * stable (`useCallback` / `useMemo`): a new value restarts the load.\n * `optionValues` (the widget's resolved options) go to the loader as\n * `options.options`.\n */\nexport function useDetailData(\n definition: WidgetDefinition,\n load: DetailLoader | undefined,\n enabled: boolean,\n fallback?: DetailData,\n optionValues: OptionValues = NO_OPTION_VALUES\n): { readonly state: DetailLoadState; readonly reload: () => void } {\n const [state, setState] = useState<DetailLoadState>({ status: 'loading' });\n const [attempt, setAttempt] = useState(0);\n\n useEffect(() => {\n if (!enabled) return undefined;\n const controller = new AbortController();\n setState({ status: 'loading' });\n Promise.resolve()\n .then(() =>\n load === undefined\n ? undefined\n : load(definition, {\n signal: controller.signal,\n options: optionValues,\n query: defaultDetailQuery(),\n })\n )\n .then((raw) => {\n if (controller.signal.aborted) return;\n const data: DetailData | undefined = raw ?? fallback;\n if (data === undefined) {\n setState({\n status: 'error',\n error: `Widget \"${definition.key}\" detail: no data. The loader returned nothing for this widget and its card does not hold the full data (use a loader that returns rows, or a TABLE without a footer or a BAR_LIST).`,\n });\n return;\n }\n const checked = validateDetailData(\n data,\n `Widget \"${definition.key}\" detail`\n );\n setState(\n checked.ok\n ? { status: 'ok', data: checked.value }\n : { status: 'error', error: checked.error }\n );\n })\n .catch((cause: unknown) => {\n if (controller.signal.aborted) return;\n setState({\n status: 'error',\n error: `Widget \"${definition.key}\" detail: ${\n cause instanceof Error ? cause.message : String(cause)\n }`,\n });\n });\n return () => controller.abort();\n }, [enabled, load, fallback, definition, optionValues, attempt]);\n\n return { state, reload: () => setAttempt((count) => count + 1) };\n}\n","import {\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n} from 'react';\n\nimport {\n resolveWidgetLock,\n type ResolvedWidgetLock,\n type WidgetDefinition,\n} from '../core/definition.js';\nimport {\n WIDTH_COLUMNS,\n fillColumnSpans,\n fillWidthSpans,\n fillsWidth,\n itemWidth,\n usesWidthColumns,\n} from '../core/grid.js';\nimport {\n EMPTY_LAYOUT,\n enforceLocks,\n hiddenWidgets,\n isMinimized,\n moveWidgetBy,\n showWidget,\n hideWidget,\n toggleMinimized,\n visibleWidgets,\n MAX_PAGE_TITLE_LENGTH,\n type DashboardLayout,\n type LayoutPage,\n} from '../core/layout.js';\nimport {\n addPage,\n assignPages,\n hasPages,\n movePage,\n moveWidgetToPage,\n pageLayout,\n pageList,\n pageRoom,\n removePage,\n renamePage,\n withPageLayout,\n type PageOptions,\n} from '../core/pages.js';\nimport { sortFromOptions } from '../core/options.js';\nimport type { DashboardWidget } from '../core/resolve.js';\nimport {\n defaultDetailQuery,\n deriveDetailData,\n resolveDetailOptions,\n type DetailData,\n type DetailQuery,\n type DetailSort,\n} from '../core/detail.js';\nimport { ResolvedWidgetCard } from './card.js';\nimport {\n WidgetDetail,\n WidgetDetailDialog,\n useDetailData,\n type DetailLoader,\n} from './detail.js';\nimport {\n WidgetSettingsProvider,\n useSlotClassName,\n useWidgetSettings,\n type WidgetSettings,\n} from './settings.js';\n\n/** The \"New page…\" choice of a card's move-to-page select. */\nconst NEW_PAGE_VALUE = '__new-page__';\n\n/** The tab panel of a paged dashboard; a plain wrapper-free fragment otherwise. */\nfunction PagePanel({\n paged,\n id,\n labelledBy,\n children,\n}: {\n readonly paged: boolean;\n readonly id: string;\n readonly labelledBy: string;\n readonly children: ReactNode;\n}): ReactNode {\n if (!paged) return <>{children}</>;\n return (\n <div\n role=\"tabpanel\"\n id={id}\n aria-labelledby={labelledBy}\n className=\"dwt-page-panel\"\n >\n {children}\n </div>\n );\n}\n\n/** Viewport width at or below which the stylesheet stops spanning `large`. */\nconst NARROW_VIEWPORT_QUERY = '(max-width: 640px)';\n\n/** Grid width above which a 12-column grid uses each widget's own width. */\nconst WIDE_GRID_PX = 900;\n\ninterface GridMetrics {\n readonly columns: number;\n readonly largeSpan: number;\n}\n\n/**\n * Column spans for widgets that `fill` their width. The number of columns\n * comes from the rendered grid (so it follows your CSS and the container\n * width); until it is measured, and on the server, no spans are set and the\n * grid lays out normally. Returns an empty map when no widget fills width.\n */\nfunction useFillSpans(\n definitions: readonly WidgetDefinition[],\n gridRef: RefObject<HTMLDivElement | null>,\n twelve: boolean\n): ReadonlyMap<string, number> {\n const [metrics, setMetrics] = useState<GridMetrics | undefined>(undefined);\n const needsSpans: boolean = definitions.some((definition) =>\n fillsWidth(definition.fill)\n );\n\n useEffect(() => {\n const grid: HTMLDivElement | null = gridRef.current;\n if (!needsSpans || grid === null || typeof ResizeObserver === 'undefined') {\n setMetrics(undefined);\n return undefined;\n }\n function measure(): void {\n if (grid === null) return;\n if (twelve) {\n // Narrow grids reflow in CSS; only fill when widths apply as set.\n const wide: boolean = grid.clientWidth > WIDE_GRID_PX;\n setMetrics((previous) =>\n !wide\n ? undefined\n : previous?.columns === WIDTH_COLUMNS\n ? previous\n : { columns: WIDTH_COLUMNS, largeSpan: 2 }\n );\n return;\n }\n const tracks: string = getComputedStyle(grid).gridTemplateColumns;\n const columns: number =\n tracks === '' || tracks === 'none'\n ? 0\n : tracks.trim().split(/\\s+/).length;\n const largeSpan: number = window.matchMedia(NARROW_VIEWPORT_QUERY).matches\n ? 1\n : 2;\n setMetrics((previous) =>\n columns === 0\n ? undefined\n : previous?.columns === columns && previous.largeSpan === largeSpan\n ? previous\n : { columns, largeSpan }\n );\n }\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(grid);\n return () => observer.disconnect();\n }, [needsSpans, gridRef, twelve]);\n\n return useMemo(\n () =>\n metrics === undefined\n ? new Map<string, number>()\n : twelve\n ? fillWidthSpans(definitions)\n : fillColumnSpans(definitions, metrics.columns, metrics.largeSpan),\n [definitions, metrics, twelve]\n );\n}\n\nfunction widthProps(\n twelve: boolean,\n definition: WidgetDefinition\n): { width?: number } {\n return twelve ? { width: itemWidth(definition) } : {};\n}\n\nfunction spanProps(\n spans: ReadonlyMap<string, number>,\n key: string\n): { columnSpan?: number } {\n const columnSpan: number | undefined = spans.get(key);\n return columnSpan === undefined ? {} : { columnSpan };\n}\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 const gridRef = useRef<HTMLDivElement>(null);\n const definitions: WidgetDefinition[] = widgets.map((w) => w.definition);\n const twelve: boolean = usesWidthColumns(definitions);\n const spans: ReadonlyMap<string, number> = useFillSpans(\n definitions,\n gridRef,\n twelve\n );\n return (\n <div\n ref={gridRef}\n className={slot(\n 'grid',\n 'dwt-grid',\n twelve && 'dwt-grid--twelve',\n className\n )}\n >\n {widgets.map((widget) => (\n <ResolvedWidgetCard\n key={widget.definition.key}\n widget={widget}\n {...spanProps(spans, widget.definition.key)}\n {...widthProps(twelve, widget.definition)}\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, minimize or\n * restore; persist it. Without it the layout is read-only (no controls).\n */\n readonly onLayoutChange?: (layout: DashboardLayout) => void;\n /**\n * Ignore widget `locked` settings, so locked widgets can be moved, hidden\n * and minimized. For administrators editing the default layout: pass it\n * only for roles you trust, and enforce locks again on the server for\n * everyone else (`enforceLocks`). It never changes the locks themselves.\n */\n readonly overrideLocks?: boolean;\n /**\n * `always` (default): move and hide controls show whenever `onLayoutChange`\n * is set. `toggle`: they show only while editing, behind a Customize\n * button, so a stray click can't rearrange the page. Minimize and its bar\n * work in both modes.\n */\n readonly editMode?: 'always' | 'toggle';\n /** Controlled editing state (`editMode=\"toggle\"`). */\n readonly editing?: boolean;\n /** Initial editing state when uncontrolled. Default false. */\n readonly defaultEditing?: boolean;\n /** Called when the viewer starts or finishes editing. */\n readonly onEditingChange?: (editing: boolean) => void;\n /** What Reset layout restores. Default: the empty layout (sortOrder order). */\n readonly defaultLayout?: DashboardLayout;\n /** Show the built-in Customize/Done/Reset toolbar (toggle mode). Default true. */\n readonly toolbar?: boolean;\n /**\n * The page in view (a page key) when the layout has pages. Controlled with\n * `onActivePageChange`; without it the dashboard keeps its own, starting on\n * `defaultActivePage` or the first page. Pages never listed fall back to\n * the first.\n */\n readonly activePage?: string;\n readonly defaultActivePage?: string;\n readonly onActivePageChange?: (pageKey: string) => void;\n /** Rows a page holds unless the page says otherwise. Default 4. */\n readonly maxRows?: number;\n /** Most pages the viewer can add while editing. Default: no limit. */\n readonly maxPages?: number;\n readonly onRetry?: (key: string) => void;\n /**\n * Loads the full data for a widget's detail view (widgets whose definition\n * sets `detail`). Close over your own context. Return `undefined` for a\n * widget you have no extra data for: a TABLE with no footer or a BAR_LIST\n * then shows its card data. Without `loadDetail`, those two still work and\n * other widgets get no View button.\n */\n readonly loadDetail?: DetailLoader;\n /**\n * Called with the widget key when the viewer opens a detail view, instead\n * of the built-in dialog: navigate to your own page.\n */\n readonly onOpenDetail?: (key: string) => void;\n readonly headingLevel?: 2 | 3 | 4 | 5 | 6;\n readonly className?: string;\n}\n\n/** The built-in dialog for one widget's detail view. */\nfunction DetailHost({\n widget,\n loadDetail,\n onClose,\n}: {\n readonly widget: DashboardWidget;\n readonly loadDetail: DetailLoader | undefined;\n readonly onClose: () => void;\n}): ReactNode {\n const { locale } = useWidgetSettings();\n const { definition } = widget;\n const options = resolveDetailOptions(definition);\n const pageSize: number = options?.pageSize ?? 25;\n const optionSort: DetailSort | undefined = sortFromOptions(\n definition,\n widget.options\n );\n const [query, setQuery] = useState<DetailQuery>({\n ...defaultDetailQuery(pageSize),\n ...(optionSort === undefined ? {} : { sort: optionSort }),\n });\n // Memoized: a fresh object each render would restart the load every time.\n const derived: DetailData | undefined = useMemo(\n () =>\n widget.status === 'ok'\n ? deriveDetailData(widget.data, locale)\n : undefined,\n [widget, locale]\n );\n const { state, reload } = useDetailData(\n definition,\n loadDetail,\n true,\n derived,\n widget.options\n );\n const title: string = options?.title ?? definition.title;\n return (\n <WidgetDetailDialog title={title} open onClose={onClose}>\n <WidgetDetail\n title={title}\n query={query}\n onQueryChange={setQuery}\n status={state.status}\n {...(state.data === undefined ? {} : { data: state.data })}\n {...(state.error === undefined ? {} : { error: state.error })}\n onRetry={reload}\n />\n </WidgetDetailDialog>\n );\n}\n\n/**\n * \"Reset the layout?\" with \"✓\" and \"X\" buttons, inline in the toolbar. Focus\n * starts on the safe choice, and Escape answers no.\n */\nfunction InlineConfirm({\n message,\n onAnswer,\n}: {\n readonly message: string;\n readonly onAnswer: (yes: boolean) => void;\n}): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const noRef = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n noRef.current?.focus();\n }, []);\n return (\n <span\n role=\"group\"\n aria-label={message}\n className=\"dwt-confirm\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onAnswer(false);\n }\n }}\n >\n <span role=\"alert\" className=\"dwt-confirm-message\">\n {message}\n </span>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.confirmYes}\n title={labels.confirmYes}\n onClick={() => onAnswer(true)}\n >\n <span aria-hidden=\"true\">✓</span>\n </button>\n <button\n ref={noRef}\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.confirmNo}\n title={labels.confirmNo}\n onClick={() => onAnswer(false)}\n >\n <span aria-hidden=\"true\">✕</span>\n </button>\n </span>\n );\n}\n\n/** The tab list of a paged dashboard: tabs on wide screens, dots on narrow. */\nfunction PageTabs({\n pages,\n activeKey,\n idPrefix,\n panelId,\n announcement,\n onSelect,\n}: {\n readonly pages: readonly LayoutPage[];\n readonly activeKey: string;\n readonly idPrefix: string;\n readonly panelId: string;\n readonly announcement: string;\n readonly onSelect: (pageKey: string) => void;\n}): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const tabs = useRef(new Map<string, HTMLButtonElement>());\n const activeIndex: number = pages.findIndex((p) => p.key === activeKey);\n\n function onKeyDown(event: KeyboardEvent, index: number): void {\n const last: number = pages.length - 1;\n let next: number | undefined;\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n next = index === last ? 0 : index + 1;\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n next = index === 0 ? last : index - 1;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = last;\n break;\n default:\n return;\n }\n event.preventDefault();\n const target: LayoutPage | undefined = pages[next];\n if (target === undefined) return;\n onSelect(target.key);\n tabs.current.get(target.key)?.focus();\n }\n\n return (\n <div className={slot('pageBar', 'dwt-pages')}>\n <button\n type=\"button\"\n className={slot(\n 'button',\n 'dwt-button',\n 'dwt-icon-button',\n 'dwt-page-nav'\n )}\n aria-label={labels.previousPageButton}\n disabled={activeIndex <= 0}\n onClick={() => onSelect((pages[activeIndex - 1] as LayoutPage).key)}\n >\n <span aria-hidden=\"true\">‹</span>\n </button>\n <div role=\"tablist\" aria-label={labels.pageBar} className=\"dwt-page-tabs\">\n {pages.map((page, index) => {\n const selected: boolean = page.key === activeKey;\n return (\n <button\n key={page.key}\n ref={(element) => {\n if (element === null) tabs.current.delete(page.key);\n else tabs.current.set(page.key, element);\n }}\n type=\"button\"\n role=\"tab\"\n id={`${idPrefix}-tab-${index}`}\n aria-selected={selected}\n aria-controls={panelId}\n aria-label={labels.pageTabName(\n index + 1,\n pages.length,\n page.title\n )}\n title={page.title}\n tabIndex={selected ? 0 : -1}\n className={slot('button', 'dwt-page-tab')}\n onClick={() => onSelect(page.key)}\n onKeyDown={(event) => onKeyDown(event, index)}\n >\n <span className=\"dwt-page-tab-title\">{page.title}</span>\n <span className=\"dwt-page-dot\" aria-hidden=\"true\" />\n </button>\n );\n })}\n </div>\n <button\n type=\"button\"\n className={slot(\n 'button',\n 'dwt-button',\n 'dwt-icon-button',\n 'dwt-page-nav'\n )}\n aria-label={labels.nextPageButton}\n disabled={activeIndex === pages.length - 1}\n onClick={() => onSelect((pages[activeIndex + 1] as LayoutPage).key)}\n >\n <span aria-hidden=\"true\">›</span>\n </button>\n <span className=\"dwt-visually-hidden\" aria-live=\"polite\">\n {announcement}\n </span>\n </div>\n );\n}\n\n/** A small form to rename a page. `onSubmit` returns an error to show. */\nfunction PageRenameForm({\n initial,\n onSubmit,\n onCancel,\n}: {\n readonly initial: string;\n readonly onSubmit: (title: string) => string | undefined;\n readonly onCancel: () => void;\n}): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const [title, setTitle] = useState<string>(initial);\n const [error, setError] = useState<string | undefined>(undefined);\n const inputRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, []);\n return (\n <form\n className=\"dwt-page-rename\"\n onSubmit={(event) => {\n event.preventDefault();\n setError(onSubmit(title));\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onCancel();\n }\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n className=\"dwt-page-title-input\"\n aria-label={labels.pageTitle}\n aria-invalid={error !== undefined}\n maxLength={MAX_PAGE_TITLE_LENGTH}\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n />\n <button\n type=\"submit\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.savePageTitle}\n title={labels.savePageTitle}\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.cancelPageTitle}\n title={labels.cancelPageTitle}\n onClick={onCancel}\n >\n <span aria-hidden=\"true\">✕</span>\n </button>\n {error !== undefined && (\n <span role=\"alert\" className=\"dwt-page-error\">\n {error}\n </span>\n )}\n </form>\n );\n}\n\n/** The definition without its lock, for `overrideLocks`. */\nfunction withoutLock(definition: WidgetDefinition): WidgetDefinition {\n if (definition.locked === undefined) return definition;\n const copy: { -readonly [K in keyof WidgetDefinition]: WidgetDefinition[K] } =\n { ...definition };\n delete copy.locked;\n return copy;\n}\n\nfunction DashboardInner({\n widgets,\n layout: savedLayout = EMPTY_LAYOUT,\n onLayoutChange,\n overrideLocks = false,\n editMode = 'always',\n editing: editingProp,\n defaultEditing = false,\n onEditingChange,\n defaultLayout,\n toolbar = true,\n activePage: activePageProp,\n defaultActivePage,\n onActivePageChange,\n maxRows,\n maxPages,\n onRetry,\n loadDetail,\n onOpenDetail,\n headingLevel,\n className,\n}: DashboardProps): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const definitions: WidgetDefinition[] = widgets.map((w) =>\n overrideLocks ? withoutLock(w.definition) : w.definition\n );\n // A saved layout can predate a lock (or be edited by hand), so what a lock\n // forbids is removed before anything is shown.\n const layout: DashboardLayout = enforceLocks(definitions, savedLayout);\n const byKey = new Map<string, DashboardWidget>(\n widgets.map((w) => [w.definition.key, w])\n );\n // Pages: with none, the layout is one implicit page and `view` is the layout\n // itself, so everything below works on one page's widgets and lists.\n const pages: readonly LayoutPage[] = pageList(layout);\n const paged: boolean = pages.length >= 2;\n const [activeState, setActiveState] = useState<string | undefined>(\n defaultActivePage\n );\n const requested: string | undefined = activePageProp ?? activeState;\n const activePage: LayoutPage =\n pages.find((page) => page.key === requested) ?? (pages[0] as LayoutPage);\n const activeKey: string = activePage.key;\n const pageDefs: WidgetDefinition[] =\n assignPages(definitions, layout).get(activeKey) ?? [];\n const view: DashboardLayout = pageLayout(layout, activeKey) ?? layout;\n const roomOptions: PageOptions = maxRows === undefined ? {} : { maxRows };\n const visible: WidgetDefinition[] = visibleWidgets(pageDefs, view);\n const hidden: WidgetDefinition[] = hiddenWidgets(pageDefs, view);\n const editable: boolean = onLayoutChange !== undefined;\n const toggleMode: boolean = editMode === 'toggle';\n const [editingState, setEditingState] = useState<boolean>(defaultEditing);\n const editing: boolean = editingProp ?? editingState;\n // Move, hide and the other layout controls: always, or only while editing.\n const controlsShown: boolean = editable && (!toggleMode || editing);\n // Editing keeps a snapshot of the layout from when it began, for Revert.\n const [snapshot, setSnapshot] = useState<DashboardLayout | undefined>(\n undefined\n );\n if (toggleMode && editable && editing) {\n if (snapshot === undefined) setSnapshot(savedLayout);\n } else if (snapshot !== undefined) {\n setSnapshot(undefined);\n }\n const [confirming, setConfirming] = useState<'reset' | 'revert' | undefined>(\n undefined\n );\n const pending: 'reset' | 'revert' | undefined = editing\n ? confirming\n : undefined;\n const [announcement, setAnnouncement] = useState<string>('');\n const [pageAnnouncement, setPageAnnouncement] = useState<string>('');\n const [pageError, setPageError] = useState<string | undefined>(undefined);\n const [pageEditor, setPageEditor] = useState<\n { readonly mode: 'rename' | 'delete'; readonly key: string } | undefined\n >(undefined);\n const editorMode: 'rename' | 'delete' | undefined =\n pageEditor?.key === activeKey ? pageEditor.mode : undefined;\n const instanceId: string = useId();\n const panelId = `${instanceId}-panel`;\n const toggleRef = useRef<HTMLButtonElement>(null);\n const resetRef = useRef<HTMLButtonElement>(null);\n // Minimized widgets leave the grid for their own bar, so they stop taking\n // space. Without layout controls there is no way to restore them, so a\n // read-only dashboard shows them as normal cards.\n const minimized: WidgetDefinition[] = editable\n ? visible.filter((definition) => isMinimized(view, definition.key))\n : [];\n const shown: WidgetDefinition[] = editable\n ? visible.filter((definition) => !isMinimized(view, definition.key))\n : visible;\n const [detailKey, setDetailKey] = useState<string | undefined>(undefined);\n const gridRef = useRef<HTMLDivElement>(null);\n const twelve: boolean = usesWidthColumns(shown);\n const spans: ReadonlyMap<string, number> = useFillSpans(\n shown,\n gridRef,\n twelve\n );\n\n function change(next: DashboardLayout): void {\n if (next !== layout) onLayoutChange?.(next);\n }\n\n /** Applies a change made to the page in view (a page-level layout). */\n function changePage(next: DashboardLayout): void {\n setPageError(undefined);\n change(withPageLayout(layout, activeKey, next));\n }\n\n function selectPage(pageKey: string): void {\n const index: number = pages.findIndex((page) => page.key === pageKey);\n if (index === -1) return;\n if (activePageProp === undefined) setActiveState(pageKey);\n onActivePageChange?.(pageKey);\n setPageError(undefined);\n setPageEditor(undefined);\n setPageAnnouncement(\n labels.pageTabName(\n index + 1,\n pages.length,\n (pages[index] as LayoutPage).title\n )\n );\n }\n\n function addPageAction(): void {\n const added = addPage(layout);\n if (!added.ok) {\n setPageError(added.error);\n return;\n }\n change(added.value);\n const created: LayoutPage | undefined = added.value.pages?.at(-1);\n if (created !== undefined) {\n if (activePageProp === undefined) setActiveState(created.key);\n onActivePageChange?.(created.key);\n setPageError(undefined);\n setPageEditor({ mode: 'rename', key: created.key });\n }\n }\n\n function renamePageAction(title: string): string | undefined {\n const renamed = renamePage(layout, activeKey, title);\n if (!renamed.ok) return renamed.error;\n change(renamed.value);\n setPageEditor(undefined);\n return undefined;\n }\n\n function deletePageAction(): void {\n const index: number = pages.findIndex((page) => page.key === activeKey);\n const removed = removePage(definitions, layout, activeKey, roomOptions);\n setPageEditor(undefined);\n if (!removed.ok) {\n setPageError(removed.error);\n return;\n }\n const neighbor: LayoutPage | undefined = pages[index > 0 ? index - 1 : 1];\n change(removed.value);\n if (neighbor !== undefined) selectPage(neighbor.key);\n }\n\n function moveWidgetAction(widgetKey: string, targetKey: string): void {\n let target: string = targetKey;\n let base: DashboardLayout = layout;\n if (targetKey === NEW_PAGE_VALUE) {\n const added = addPage(layout);\n if (!added.ok) {\n setPageError(added.error);\n return;\n }\n base = added.value;\n target = (added.value.pages?.at(-1) as LayoutPage).key;\n }\n const moved = moveWidgetToPage(\n definitions,\n base,\n widgetKey,\n target,\n roomOptions\n );\n if (!moved.ok) {\n setPageError(moved.error);\n return;\n }\n setPageError(undefined);\n change(moved.value);\n const destination: LayoutPage | undefined = moved.value.pages?.find(\n (page) => page.key === target\n );\n setPageAnnouncement(\n labels.movedToPage(\n byKey.get(widgetKey)?.definition.title ?? widgetKey,\n destination?.title ?? target\n )\n );\n }\n\n /** Restores a hidden widget, unless that would overflow a paged page. */\n function showAction(widgetKey: string): void {\n const next: DashboardLayout = withPageLayout(\n layout,\n activeKey,\n showWidget(view, widgetKey)\n );\n if (hasPages(next)) {\n const room = pageRoom(definitions, next, activeKey, roomOptions);\n if (room !== undefined && room.rowsUsed > room.maxRows) {\n setPageError(labels.pageFull(activePage.title, room.maxRows));\n return;\n }\n }\n setPageError(undefined);\n change(next);\n }\n\n function setEditing(next: boolean): void {\n if (editingProp === undefined) setEditingState(next);\n onEditingChange?.(next);\n setAnnouncement(next ? labels.editingOn : labels.editingOff);\n setConfirming(undefined);\n }\n\n function answerConfirmation(yes: boolean): void {\n const which: 'reset' | 'revert' | undefined = pending;\n setConfirming(undefined);\n if (yes && which === 'reset') {\n change(enforceLocks(definitions, defaultLayout ?? EMPTY_LAYOUT));\n } else if (yes && which === 'revert' && snapshot !== undefined) {\n change(snapshot);\n }\n // Focus goes back to the control that asked.\n (which === 'revert' ? toggleRef : resetRef).current?.focus();\n }\n\n return (\n <div\n className={slot(\n 'dashboard',\n 'dwt-dashboard',\n toggleMode && controlsShown && 'dwt-dashboard--editing',\n className\n )}\n >\n {editable && toggleMode && toolbar && (\n <div\n role=\"group\"\n aria-label={labels.dashboardControls}\n className={slot('toolbar', 'dwt-toolbar')}\n >\n <button\n ref={toggleRef}\n type=\"button\"\n aria-pressed={editing}\n className={slot('button', 'dwt-button', 'dwt-toolbar-toggle')}\n onClick={() => setEditing(!editing)}\n >\n {editing ? labels.done : labels.customize}\n </button>\n {editing && (\n <>\n <button\n ref={resetRef}\n type=\"button\"\n className={slot('button', 'dwt-button')}\n onClick={() => setConfirming('reset')}\n >\n {labels.reset}\n </button>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button')}\n disabled={snapshot === undefined || savedLayout === snapshot}\n onClick={() => setConfirming('revert')}\n >\n {labels.revertChanges}\n </button>\n </>\n )}\n {pending !== undefined && (\n <InlineConfirm\n message={\n pending === 'reset' ? labels.confirmReset : labels.confirmRevert\n }\n onAnswer={answerConfirmation}\n />\n )}\n <span className=\"dwt-visually-hidden\" aria-live=\"polite\">\n {announcement}\n </span>\n </div>\n )}\n {paged && (\n <PageTabs\n pages={pages}\n activeKey={activeKey}\n idPrefix={instanceId}\n panelId={panelId}\n announcement={pageAnnouncement}\n onSelect={selectPage}\n />\n )}\n {controlsShown && (\n <div\n role=\"group\"\n aria-label={labels.managePages}\n className=\"dwt-page-manage\"\n >\n <button\n type=\"button\"\n className={slot('button', 'dwt-button')}\n disabled={maxPages !== undefined && pages.length >= maxPages}\n onClick={addPageAction}\n >\n {labels.addPage}\n </button>\n {paged && editorMode === 'rename' && (\n <PageRenameForm\n key={activeKey}\n initial={activePage.title}\n onSubmit={renamePageAction}\n onCancel={() => setPageEditor(undefined)}\n />\n )}\n {paged && editorMode !== 'rename' && (\n <>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.renamePage(activePage.title)}\n title={labels.renamePage(activePage.title)}\n onClick={() =>\n setPageEditor({ mode: 'rename', key: activeKey })\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.movePageLeft(activePage.title)}\n title={labels.movePageLeft(activePage.title)}\n disabled={pages[0]?.key === activeKey}\n onClick={() => change(movePage(layout, activeKey, -1))}\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.movePageRight(activePage.title)}\n title={labels.movePageRight(activePage.title)}\n disabled={pages.at(-1)?.key === activeKey}\n onClick={() => change(movePage(layout, activeKey, 1))}\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.deletePage(activePage.title)}\n title={labels.deletePage(activePage.title)}\n onClick={() =>\n setPageEditor({ mode: 'delete', key: activeKey })\n }\n >\n <span aria-hidden=\"true\">×</span>\n </button>\n </>\n )}\n {paged && editorMode === 'delete' && (\n <InlineConfirm\n message={labels.confirmDeletePage(activePage.title)}\n onAnswer={(yes) =>\n yes ? deletePageAction() : setPageEditor(undefined)\n }\n />\n )}\n {pageError !== undefined && (\n <span role=\"alert\" className=\"dwt-page-error\">\n {pageError}\n </span>\n )}\n </div>\n )}\n <PagePanel\n paged={paged}\n id={panelId}\n labelledBy={`${instanceId}-tab-${pages.findIndex((p) => p.key === activeKey)}`}\n >\n {controlsShown && 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={() => showAction(definition.key)}\n >\n <span aria-hidden=\"true\">+ </span>\n {definition.title}\n </button>\n ))}\n </div>\n )}\n {minimized.length > 0 && (\n <div\n className={slot('hiddenBar', 'dwt-hidden-bar', 'dwt-minimized-bar')}\n >\n <span className=\"dwt-hidden-label\">{labels.minimizedWidgets}</span>\n {minimized.map((definition) => (\n <button\n key={definition.key}\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-show-button')}\n aria-label={labels.expand(definition.title)}\n onClick={() =>\n changePage(toggleMinimized(view, definition.key))\n }\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 {paged && pageDefs.length === 0\n ? labels.emptyPage\n : definitions.length === 0\n ? labels.noWidgets\n : labels.allHidden}\n </p>\n ) : shown.length === 0 ? null : (\n <div\n ref={gridRef}\n className={slot('grid', 'dwt-grid', twelve && 'dwt-grid--twelve')}\n >\n {shown.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 lock: ResolvedWidgetLock = resolveWidgetLock(definition);\n // The widget's own lock, shown even when `overrideLocks` ignores it.\n const ownLock: ResolvedWidgetLock = resolveWidgetLock(\n widget.definition\n );\n const isLocked: boolean =\n ownLock.move || ownLock.hide || ownLock.minimize;\n const lockLabel: string = overrideLocks\n ? labels.lockedForViewers(title)\n : labels.locked(title);\n const canMoveEarlier: boolean =\n !lock.move && moveWidgetBy(pageDefs, view, key, -1) !== view;\n const canMoveLater: boolean =\n !lock.move && moveWidgetBy(pageDefs, view, key, 1) !== view;\n const actions: ReactNode = controlsShown ? (\n <>\n {isLocked && (\n <span\n role=\"img\"\n className=\"dwt-lock\"\n aria-label={lockLabel}\n title={lockLabel}\n >\n <svg\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect\n x=\"3\"\n y=\"7\"\n width=\"10\"\n height=\"7\"\n rx=\"1.5\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5.5 7V5a2.5 2.5 0 0 1 5 0v2\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n />\n </svg>\n </span>\n )}\n {!lock.move && (\n <>\n <button\n type=\"button\"\n className={slot(\n 'button',\n 'dwt-button',\n 'dwt-icon-button'\n )}\n aria-label={labels.moveEarlier(title)}\n title={labels.moveEarlier(title)}\n disabled={index === 0 || !canMoveEarlier}\n onClick={() =>\n changePage(moveWidgetBy(pageDefs, view, key, -1))\n }\n >\n <span aria-hidden=\"true\">↑</span>\n </button>\n <button\n type=\"button\"\n className={slot(\n 'button',\n 'dwt-button',\n 'dwt-icon-button'\n )}\n aria-label={labels.moveLater(title)}\n title={labels.moveLater(title)}\n disabled={index === shown.length - 1 || !canMoveLater}\n onClick={() =>\n changePage(moveWidgetBy(pageDefs, view, key, 1))\n }\n >\n <span aria-hidden=\"true\">↓</span>\n </button>\n {paged && (\n <select\n className=\"dwt-move-select\"\n aria-label={labels.moveToPage(title)}\n value=\"\"\n onChange={(event) => {\n if (event.target.value !== '') {\n moveWidgetAction(key, event.target.value);\n }\n }}\n >\n <option value=\"\">\n {labels.moveToPagePlaceholder}\n </option>\n {pages\n .filter((page) => page.key !== activeKey)\n .map((page) => (\n <option key={page.key} value={page.key}>\n {labels.moveToPageOption(\n page.title,\n pageRoom(\n definitions,\n layout,\n page.key,\n roomOptions\n )?.rowsFree ?? 0\n )}\n </option>\n ))}\n {(maxPages === undefined ||\n pages.length < maxPages) && (\n <option value={NEW_PAGE_VALUE}>\n {labels.newPageOption}\n </option>\n )}\n </select>\n )}\n </>\n )}\n {!lock.hide && (\n <button\n type=\"button\"\n className={slot(\n 'button',\n 'dwt-button',\n 'dwt-icon-button'\n )}\n aria-label={labels.hide(title)}\n title={labels.hide(title)}\n onClick={() => changePage(hideWidget(view, key))}\n >\n <span aria-hidden=\"true\">×</span>\n </button>\n )}\n </>\n ) : undefined;\n const viewable: boolean =\n resolveDetailOptions(definition) !== undefined &&\n (onOpenDetail !== undefined ||\n loadDetail !== undefined ||\n (widget.status === 'ok' &&\n deriveDetailData(widget.data) !== undefined));\n return (\n <ResolvedWidgetCard\n key={key}\n widget={widget}\n {...(viewable\n ? {\n onView: () =>\n onOpenDetail === undefined\n ? setDetailKey(key)\n : onOpenDetail(key),\n }\n : {})}\n {...spanProps(spans, key)}\n {...widthProps(twelve, definition)}\n minimized={isMinimized(view, key)}\n editing={toggleMode && controlsShown}\n {...(actions === undefined ? {} : { actions })}\n {...(editable && !lock.minimize\n ? {\n onToggleMinimized: () =>\n changePage(toggleMinimized(view, 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 </PagePanel>\n {detailKey !== undefined && byKey.get(detailKey) !== undefined && (\n <DetailHost\n key={detailKey}\n widget={byKey.get(detailKey) as DashboardWidget}\n loadDetail={loadDetail}\n onClose={() => setDetailKey(undefined)}\n />\n )}\n </div>\n );\n}\n\n/**\n * A full dashboard: widgets ordered by the viewer's layout, with move,\n * hide/show and minimize 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","import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { DashboardLayout } from '../core/layout.js';\nimport type { NormalizeOptions, PageItem } from '../core/pages.js';\nimport type {\n LayoutPersistence,\n LoadedLayout,\n SavedLayout,\n StoreResult,\n StoreScope,\n} from '../core/storage.js';\n\nexport type StoredLayoutStatus =\n 'loading' | 'ready' | 'saving' | 'error' | 'conflict';\n\nexport interface UseStoredLayoutOptions {\n /** From `createLayoutPersistence`. Keep it referentially stable. */\n readonly persistence: LayoutPersistence;\n /** Which dashboard and viewer. Changing its key loads the other layout. */\n readonly scope: StoreScope;\n /** Keep stable (module constant or `useMemo`). */\n readonly definitions: readonly PageItem[];\n /** The organization default: shown until loaded and when nothing is stored. */\n readonly defaultLayout: DashboardLayout;\n /** Wait this long after the last change before saving. Default 500 ms. */\n readonly saveDelayMs?: number;\n /** From the server render, to avoid a flash; used instead of `defaultLayout` first. */\n readonly initialLayout?: DashboardLayout;\n readonly normalizeOptions?: NormalizeOptions;\n}\n\nexport interface StoredLayoutConflict {\n /** The layout this viewer was saving. */\n readonly mine: DashboardLayout;\n /** The layout stored by someone else. */\n readonly theirs: DashboardLayout;\n}\n\nexport interface UseStoredLayoutResult {\n /** Pass to `Dashboard` as `layout`. */\n readonly layout: DashboardLayout;\n /** Pass to `Dashboard` as `onLayoutChange`. Saves after `saveDelayMs`. */\n readonly setLayout: (layout: DashboardLayout) => void;\n /** The pre-edit snapshot, or null. */\n readonly backup: DashboardLayout | null;\n /** Stores a snapshot at once (not debounced). Pass null to clear it in memory only. */\n readonly setBackup: (layout: DashboardLayout | null) => void;\n readonly status: StoredLayoutStatus;\n /** The latest failure, specific enough to log or show; null when none. */\n readonly error: string | null;\n /** Set while `status` is `'conflict'`. */\n readonly conflict: StoredLayoutConflict | null;\n /** Settle a conflict: keep this viewer's layout (overwrite) or take the stored one. */\n readonly resolveConflict: (choice: 'mine' | 'theirs') => void;\n /**\n * A change made in another tab or device while this one had unsaved edits.\n * Without unsaved edits it is applied automatically and this stays null.\n */\n readonly remoteLayout: DashboardLayout | null;\n /** Use or ignore `remoteLayout`. */\n readonly resolveRemote: (choice: 'use' | 'ignore') => void;\n}\n\n/**\n * Joins a `LayoutPersistence` to `Dashboard`. The dashboard never waits on\n * storage: it shows `initialLayout` or `defaultLayout` while loading, and a\n * failed load or save keeps the in-memory layout working and reports `error`.\n * Saves are debounced and flushed when the page is hidden. Effects don't run\n * on the server, so a server render shows the initial or default layout.\n */\nexport function useStoredLayout(\n options: UseStoredLayoutOptions\n): UseStoredLayoutResult {\n const {\n persistence,\n scope,\n definitions,\n defaultLayout,\n saveDelayMs = 500,\n initialLayout,\n normalizeOptions,\n } = options;\n const scopeKey: string = persistence.keyFor(scope);\n\n const [layout, setLayoutState] = useState<DashboardLayout>(\n initialLayout ?? defaultLayout\n );\n const [backup, setBackupState] = useState<DashboardLayout | null>(null);\n const [status, setStatus] = useState<StoredLayoutStatus>('loading');\n const [error, setError] = useState<string | null>(null);\n const [conflict, setConflict] = useState<StoredLayoutConflict | null>(null);\n const [remoteLayout, setRemoteLayout] = useState<DashboardLayout | null>(\n null\n );\n\n const latest = useRef<DashboardLayout>(layout);\n const scopeRef = useRef<StoreScope>(scope);\n scopeRef.current = scope;\n const normalizeRef = useRef<NormalizeOptions | undefined>(normalizeOptions);\n normalizeRef.current = normalizeOptions;\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n /** True from a local change until its save finishes. */\n const dirty = useRef<boolean>(false);\n\n const apply = useCallback((next: DashboardLayout): void => {\n latest.current = next;\n setLayoutState(next);\n }, []);\n\n const finishSave = useCallback(\n (result: StoreResult<SavedLayout>, mine: DashboardLayout): void => {\n if (!result.ok) {\n setError(result.error);\n setStatus('error');\n return;\n }\n const saved: SavedLayout = result.value;\n if (saved.outcome === 'saved') {\n // Edits made while this save ran are still pending: stay dirty.\n dirty.current = latest.current !== mine;\n setError(null);\n setStatus(dirty.current ? 'saving' : 'ready');\n return;\n }\n if (saved.outcome === 'kept-theirs') {\n dirty.current = false;\n apply(saved.layout);\n setError(null);\n setStatus('ready');\n return;\n }\n setConflict({ mine, theirs: saved.layout });\n setStatus('conflict');\n },\n [apply]\n );\n\n const flush = useCallback((): void => {\n if (timer.current !== undefined) {\n clearTimeout(timer.current);\n timer.current = undefined;\n }\n if (!dirty.current) return;\n const mine: DashboardLayout = latest.current;\n setStatus('saving');\n void persistence\n .save(scopeRef.current, mine)\n .then((result) => finishSave(result, mine));\n }, [persistence, finishSave]);\n\n // Load when the scope changes. A change made while loading wins.\n useEffect(() => {\n let current = true;\n setStatus('loading');\n setConflict(null);\n setRemoteLayout(null);\n void persistence\n .load(scopeRef.current, definitions, normalizeRef.current)\n .then((result) => {\n if (!current) return;\n if (!result.ok) {\n setError(result.error);\n setStatus('error');\n return;\n }\n setError(null);\n if (!dirty.current && result.value.layout !== null) {\n apply(result.value.layout);\n }\n setStatus(dirty.current ? 'saving' : 'ready');\n });\n void persistence.loadBackup(scopeRef.current).then((result) => {\n if (current && result.ok) setBackupState(result.value);\n });\n return () => {\n current = false;\n };\n // scopeKey stands for the scope's contents.\n }, [persistence, scopeKey, definitions, apply]);\n\n // Another tab or device.\n useEffect(() => {\n return persistence.watch(\n scopeRef.current,\n definitions,\n (loaded: LoadedLayout) => {\n if (loaded.layout === null) return;\n if (dirty.current) {\n setRemoteLayout(loaded.layout);\n return;\n }\n apply(loaded.layout);\n },\n normalizeRef.current\n );\n }, [persistence, scopeKey, definitions, apply]);\n\n // Flush best-effort when the page is hidden or the hook goes away.\n useEffect(() => {\n const onHide = (): void => {\n if (\n typeof document === 'undefined' ||\n document.visibilityState !== 'hidden'\n ) {\n return;\n }\n flush();\n };\n if (typeof window !== 'undefined') {\n window.addEventListener('pagehide', flush);\n document.addEventListener('visibilitychange', onHide);\n }\n return () => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('pagehide', flush);\n document.removeEventListener('visibilitychange', onHide);\n }\n flush();\n };\n }, [flush]);\n\n const setLayout = useCallback(\n (next: DashboardLayout): void => {\n apply(next);\n dirty.current = true;\n if (timer.current !== undefined) clearTimeout(timer.current);\n timer.current = setTimeout(flush, Math.max(0, saveDelayMs));\n },\n [apply, flush, saveDelayMs]\n );\n\n const setBackup = useCallback(\n (next: DashboardLayout | null): void => {\n setBackupState(next);\n if (next === null) return;\n void persistence.saveBackup(scopeRef.current, next).then((result) => {\n if (!result.ok) setError(result.error);\n });\n },\n [persistence]\n );\n\n const resolveConflict = useCallback(\n (choice: 'mine' | 'theirs'): void => {\n const pending: StoredLayoutConflict | null = conflict;\n if (pending === null) return;\n setConflict(null);\n if (choice === 'theirs') {\n dirty.current = false;\n apply(pending.theirs);\n setStatus('ready');\n return;\n }\n setStatus('saving');\n void persistence\n .save(scopeRef.current, pending.mine, { force: true })\n .then((result) => finishSave(result, pending.mine));\n },\n [conflict, persistence, apply, finishSave]\n );\n\n const resolveRemote = useCallback(\n (choice: 'use' | 'ignore'): void => {\n const remote: DashboardLayout | null = remoteLayout;\n setRemoteLayout(null);\n if (choice === 'use' && remote !== null) {\n if (timer.current !== undefined) {\n clearTimeout(timer.current);\n timer.current = undefined;\n }\n dirty.current = false;\n apply(remote);\n }\n },\n [remoteLayout, apply]\n );\n\n return {\n layout,\n setLayout,\n backup,\n setBackup,\n status,\n error,\n conflict,\n resolveConflict,\n remoteLayout,\n resolveRemote,\n };\n}\n","/**\n * Widget data payloads, one shape per kind, discriminated by `kind`.\n *\n * The kind names are upper case to stay compatible with Maker Toolkit's\n * `WidgetViewType` (`TEXT`, `GAUGE`, `TABLE`, `GRAPH`). `KPI`, `BAR_LIST`\n * and `ALERT_LIST` are new. Every payload is plain JSON: strings, finite\n * numbers, booleans, null, arrays and objects. No dates (send ISO strings),\n * no functions, no class instances.\n */\n\n/** Every widget kind, in a stable order. */\nexport const WIDGET_KINDS = [\n 'TEXT',\n 'KPI',\n 'GAUGE',\n 'TABLE',\n 'BAR_LIST',\n 'ALERT_LIST',\n 'GRAPH',\n] as const;\n\nexport type WidgetKind = (typeof WIDGET_KINDS)[number];\n\nexport function isWidgetKind(value: unknown): value is WidgetKind {\n return (\n typeof value === 'string' &&\n (WIDGET_KINDS as readonly string[]).includes(value)\n );\n}\n\n/** How a number is shown: a plain count, money, or a fraction as a percent. */\nexport const VALUE_FORMATS = ['number', 'currency', 'percent'] as const;\n\nexport type ValueFormat = (typeof VALUE_FORMATS)[number];\n\n/** A single headline value as text, e.g. \"12\" or \"Open\". */\nexport interface TextWidgetData {\n readonly kind: 'TEXT';\n readonly value: string;\n readonly label: string;\n}\n\n/**\n * A stat tile: one number, optionally compared with the previous period.\n *\n * `value` and `previous` are in major units for `currency` (12.5 is $12.50)\n * and fractions for `percent` (0.25 is 25%).\n */\nexport interface KpiWidgetData {\n readonly kind: 'KPI';\n readonly value: number;\n /** The same measure for the previous period; null or absent for none. */\n readonly previous?: number | null;\n readonly format: ValueFormat;\n /** ISO 4217 code for `currency`, e.g. \"USD\". Defaults to USD. */\n readonly currency?: string;\n readonly label: string;\n /** Short context under the value, e.g. \"Incl. shipping and tax\". */\n readonly hint?: string;\n /** Whether a rise is good news (default true). Colors the change. */\n readonly higherIsBetter?: boolean;\n}\n\n/** A value against a maximum, drawn as a meter. */\nexport interface GaugeWidgetData {\n readonly kind: 'GAUGE';\n readonly value: number;\n readonly max: number;\n readonly label: string;\n}\n\nexport interface TableColumn {\n readonly label: string;\n /** Right-aligned, tabular figures. */\n readonly numeric?: boolean;\n}\n\nexport interface TableCell {\n readonly text: string;\n /** Renders the cell as a link (http, https, mailto or relative only). */\n readonly href?: string;\n /**\n * What the card's table controls (and the detail view) sort and search\n * on, when `text` is formatted for reading: a timestamp behind \"3 days\n * ago\", a rating behind stars, an amount behind \"$1,234.00\". Default:\n * `text`.\n */\n readonly value?: string | number;\n}\n\nexport interface TableWidgetData {\n readonly kind: 'TABLE';\n readonly columns: readonly TableColumn[];\n /** One array of cells per row, each as long as `columns`. */\n readonly rows: readonly (readonly TableCell[])[];\n /** A note under the table, e.g. \"and 12 more\". */\n readonly footer?: string;\n}\n\nexport interface BarListItem {\n readonly label: string;\n readonly value: number;\n /** Text shown beside the bar; defaults to the formatted value. */\n readonly display?: string;\n}\n\n/**\n * Labelled horizontal bars, e.g. ratings or purchases by country. Bars are a\n * share of `total` when it is given, otherwise of the largest value.\n */\nexport interface BarListWidgetData {\n readonly kind: 'BAR_LIST';\n readonly items: readonly BarListItem[];\n readonly total?: number;\n}\n\nexport interface AlertListItem {\n readonly title: string;\n /** Renders the title as a link (http, https, mailto or relative only). */\n readonly href?: string;\n /** A small square image (http, https or relative only). */\n readonly thumbnailUrl?: string;\n /** The short figure on the right, e.g. \"2 left\" or \"31 views\". */\n readonly valueLabel: string;\n /** A secondary line under the title. */\n readonly detail?: string;\n}\n\n/**\n * Things that need attention (low stock, stale listings...). `items` may be\n * the first few of `total`; the renderer says \"and N more\".\n */\nexport interface AlertListWidgetData {\n readonly kind: 'ALERT_LIST';\n readonly items: readonly AlertListItem[];\n readonly total: number;\n /** Shown when there is nothing to flag, e.g. \"Nothing low on stock.\" */\n readonly emptyText: string;\n}\n\nexport interface GraphPoint {\n /** The category or date label on the x axis, e.g. \"Oct 2026\". */\n readonly label: string;\n readonly value: number;\n}\n\nexport interface GraphSeries {\n readonly name: string;\n readonly points: readonly GraphPoint[];\n}\n\n/** The most series a graph may carry: the categorical palette's eight slots. */\nexport const MAX_GRAPH_SERIES = 8;\n\n/**\n * A bar (grouped for several series) or line chart. All series share the\n * x labels of the first series, by position, and one y axis.\n */\nexport interface GraphWidgetData {\n readonly kind: 'GRAPH';\n readonly series: readonly GraphSeries[];\n readonly chartType: 'bar' | 'line';\n readonly valueFormat: ValueFormat;\n /** ISO 4217 code for `currency`. Defaults to USD. */\n readonly currency?: string;\n /** Heading for the label column in the table view, e.g. \"Month\". */\n readonly xLabel?: string;\n}\n\n/** Any widget's data, discriminated by `kind`. */\nexport type WidgetData =\n | TextWidgetData\n | KpiWidgetData\n | GaugeWidgetData\n | TableWidgetData\n | BarListWidgetData\n | AlertListWidgetData\n | GraphWidgetData;\n\n/** The payload type for one kind, e.g. `WidgetDataOf<'KPI'>`. */\nexport type WidgetDataOf<K extends WidgetKind> = Extract<\n WidgetData,\n { kind: K }\n>;\n\n/**\n * A widget with nothing to show yet, with the reason as text (\"No orders\n * synced yet.\"). Any widget may return this instead of its kind's payload.\n */\nexport interface WidgetEmptyState {\n readonly empty: true;\n readonly text: string;\n}\n\n/** What a provider or API returns for a widget: its data, or an empty state. */\nexport type WidgetPayload = WidgetData | WidgetEmptyState;\n\n/** The default text for an empty widget. */\nexport const DEFAULT_EMPTY_TEXT = 'Nothing to show yet.';\n\n/** Builds an empty state. */\nexport function emptyWidget(\n text: string = DEFAULT_EMPTY_TEXT\n): WidgetEmptyState {\n return { empty: true, text };\n}\n\nexport function isWidgetEmptyState(\n payload: WidgetPayload\n): payload is WidgetEmptyState {\n return 'empty' in payload && payload.empty === true;\n}\n\n/**\n * The empty text for a payload with nothing in it (a table with no rows, a\n * list with no items, a graph with no points), or null when it has content.\n * TEXT, KPI and GAUGE always have content.\n */\nexport function emptyTextFor(payload: WidgetPayload): string | null {\n if (isWidgetEmptyState(payload)) {\n return payload.text;\n }\n switch (payload.kind) {\n case 'TABLE':\n return payload.rows.length === 0 ? DEFAULT_EMPTY_TEXT : null;\n case 'BAR_LIST':\n return payload.items.length === 0 ? DEFAULT_EMPTY_TEXT : null;\n case 'ALERT_LIST':\n return payload.items.length === 0 ? payload.emptyText : null;\n case 'GRAPH':\n return payload.series.every((series) => series.points.length === 0)\n ? DEFAULT_EMPTY_TEXT\n : null;\n case 'TEXT':\n case 'KPI':\n case 'GAUGE':\n return null;\n }\n}\n","/**\n * Hand-written validators for widget payloads and definitions, so data from\n * an API can be checked in a client without a schema library. Problems name\n * the widget, the field path and what was wrong, e.g.\n * `Widget \"top-products\" (TABLE): rows[2][0].text must be a string, got number.`\n */\n\nimport {\n WIDGET_FILLS,\n WIDGET_SIZES,\n type WidgetDefinition,\n} from './definition.js';\nimport {\n MAX_GRAPH_SERIES,\n VALUE_FORMATS,\n WIDGET_KINDS,\n isWidgetKind,\n type WidgetKind,\n type WidgetPayload,\n} from './payload.js';\nimport { DETAIL_MODES, MAX_DETAIL_PAGE_SIZE } from './detail.js';\nimport {\n DATE_RANGE_PRESETS,\n MAX_TEXT_OPTION_LENGTH,\n MAX_WIDGET_OPTIONS,\n OPTION_KEY_PATTERN,\n WIDGET_OPTION_TYPES,\n isColumnKeyFor,\n isIsoInterval,\n parseSortValue,\n} from './options.js';\nimport { MAX_WIDGET_WIDTH, MIN_WIDGET_WIDTH, isWidgetWidth } from './grid.js';\nimport { err, ok, type Result } from './result.js';\nimport { isSafeHref, isSafeImageUrl } from './url.js';\n\n/** At most this many problems are listed in one error message. */\nexport const MAX_REPORTED_PROBLEMS = 10;\n\nexport interface ValidateWidgetDataOptions {\n /** Named in error messages, e.g. the widget key. */\n readonly widgetKey?: string;\n /** Fails unless the payload is this kind (an empty state always passes). */\n readonly expectedKind?: WidgetKind;\n}\n\ntype Problems = string[];\ntype Record_ = Readonly<Record<string, unknown>>;\n\nfunction describeType(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (typeof value === 'number' && !Number.isFinite(value)) {\n return String(value);\n }\n return typeof value;\n}\n\nfunction isRecord(value: unknown): value is Record_ {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction join(path: string, field: string): string {\n return path === '' ? field : `${path}.${field}`;\n}\n\nfunction requireString(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'string') {\n problems.push(\n `${join(path, field)} must be a string, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalString(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n if (record[field] !== undefined) {\n requireString(record, field, path, problems);\n }\n}\n\nfunction requireNumber(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n problems.push(\n `${join(path, field)} must be a finite number, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalNumber(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n if (record[field] !== undefined) {\n requireNumber(record, field, path, problems);\n }\n}\n\n/** A cell's optional sort `value`: a string or a finite number. */\nfunction optionalSortValue(\n record: Record_,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record['value'];\n if (\n value !== undefined &&\n typeof value !== 'string' &&\n !(typeof value === 'number' && Number.isFinite(value))\n ) {\n problems.push(\n `${path}.value must be a string or a finite number, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalBoolean(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (value !== undefined && typeof value !== 'boolean') {\n problems.push(\n `${join(path, field)} must be a boolean, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalUrl(\n record: Record_,\n field: string,\n path: string,\n problems: Problems,\n isSafe: (url: string) => boolean,\n allowed: string\n): void {\n const value: unknown = record[field];\n if (value === undefined) return;\n if (typeof value !== 'string') {\n problems.push(\n `${join(path, field)} must be a string, got ${describeType(value)}.`\n );\n } else if (!isSafe(value)) {\n problems.push(\n `${join(path, field)} must be ${allowed}, got ${JSON.stringify(value.slice(0, 80))}.`\n );\n }\n}\n\nfunction requireArray(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): readonly unknown[] | null {\n const value: unknown = record[field];\n if (!Array.isArray(value)) {\n problems.push(\n `${join(path, field)} must be an array, got ${describeType(value)}.`\n );\n return null;\n }\n return value;\n}\n\nfunction requireOneOf(\n record: Record_,\n field: string,\n options: readonly string[],\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'string' || !options.includes(value)) {\n problems.push(\n `${join(path, field)} must be one of ${options.map((o) => `\"${o}\"`).join(', ')}, got ${\n typeof value === 'string' ? JSON.stringify(value) : describeType(value)\n }.`\n );\n }\n}\n\n/** Runs `check` on each element that is an object, reporting the others. */\nfunction eachRecord(\n items: readonly unknown[],\n path: string,\n problems: Problems,\n check: (item: Record_, itemPath: string) => void\n): void {\n items.forEach((item: unknown, index: number) => {\n const itemPath = `${path}[${index}]`;\n if (isRecord(item)) {\n check(item, itemPath);\n } else {\n problems.push(\n `${itemPath} must be an object, got ${describeType(item)}.`\n );\n }\n });\n}\n\nconst HREF_RULE = 'an http(s), mailto or relative URL';\nconst IMAGE_RULE = 'an http(s) or relative URL';\n\nfunction checkPayloadFields(\n kind: WidgetKind,\n data: Record_,\n problems: Problems\n): void {\n switch (kind) {\n case 'TEXT':\n requireString(data, 'value', '', problems);\n requireString(data, 'label', '', problems);\n return;\n case 'KPI':\n requireNumber(data, 'value', '', problems);\n if (data['previous'] !== null) {\n optionalNumber(data, 'previous', '', problems);\n }\n requireOneOf(data, 'format', VALUE_FORMATS, '', problems);\n optionalString(data, 'currency', '', problems);\n requireString(data, 'label', '', problems);\n optionalString(data, 'hint', '', problems);\n optionalBoolean(data, 'higherIsBetter', '', problems);\n return;\n case 'GAUGE':\n requireNumber(data, 'value', '', problems);\n requireNumber(data, 'max', '', problems);\n requireString(data, 'label', '', problems);\n if (typeof data['max'] === 'number' && data['max'] <= 0) {\n problems.push(`max must be greater than 0, got ${data['max']}.`);\n }\n return;\n case 'TABLE': {\n const columns = requireArray(data, 'columns', '', problems);\n if (columns !== null) {\n eachRecord(columns, 'columns', problems, (column, path) => {\n requireString(column, 'label', path, problems);\n optionalBoolean(column, 'numeric', path, problems);\n });\n }\n const rows = requireArray(data, 'rows', '', problems);\n if (rows !== null) {\n rows.forEach((row: unknown, rowIndex: number) => {\n const rowPath = `rows[${rowIndex}]`;\n if (!Array.isArray(row)) {\n problems.push(\n `${rowPath} must be an array of cells, got ${describeType(row)}.`\n );\n return;\n }\n if (columns !== null && row.length !== columns.length) {\n problems.push(\n `${rowPath} has ${row.length} cell(s) but there are ${columns.length} column(s).`\n );\n }\n eachRecord(row, rowPath, problems, (cell, cellPath) => {\n requireString(cell, 'text', cellPath, problems);\n optionalSortValue(cell, cellPath, problems);\n optionalUrl(\n cell,\n 'href',\n cellPath,\n problems,\n isSafeHref,\n HREF_RULE\n );\n });\n });\n }\n optionalString(data, 'footer', '', problems);\n return;\n }\n case 'BAR_LIST': {\n const items = requireArray(data, 'items', '', problems);\n if (items !== null) {\n eachRecord(items, 'items', problems, (item, path) => {\n requireString(item, 'label', path, problems);\n requireNumber(item, 'value', path, problems);\n optionalString(item, 'display', path, problems);\n });\n }\n optionalNumber(data, 'total', '', problems);\n return;\n }\n case 'ALERT_LIST': {\n const items = requireArray(data, 'items', '', problems);\n if (items !== null) {\n eachRecord(items, 'items', problems, (item, path) => {\n requireString(item, 'title', path, problems);\n optionalUrl(item, 'href', path, problems, isSafeHref, HREF_RULE);\n optionalUrl(\n item,\n 'thumbnailUrl',\n path,\n problems,\n isSafeImageUrl,\n IMAGE_RULE\n );\n requireString(item, 'valueLabel', path, problems);\n optionalString(item, 'detail', path, problems);\n });\n }\n requireNumber(data, 'total', '', problems);\n requireString(data, 'emptyText', '', problems);\n if (\n items !== null &&\n typeof data['total'] === 'number' &&\n data['total'] < items.length\n ) {\n problems.push(\n `total (${data['total']}) must be at least the number of items (${items.length}).`\n );\n }\n return;\n }\n case 'GRAPH': {\n const series = requireArray(data, 'series', '', problems);\n if (series !== null) {\n if (series.length > MAX_GRAPH_SERIES) {\n problems.push(\n `series has ${series.length} entries; at most ${MAX_GRAPH_SERIES} are allowed (fold the rest into \"Other\").`\n );\n }\n eachRecord(series, 'series', problems, (entry, path) => {\n requireString(entry, 'name', path, problems);\n const points = requireArray(entry, 'points', path, problems);\n if (points !== null) {\n eachRecord(\n points,\n `${path}.points`,\n problems,\n (point, pointPath) => {\n requireString(point, 'label', pointPath, problems);\n requireNumber(point, 'value', pointPath, problems);\n }\n );\n }\n });\n }\n requireOneOf(data, 'chartType', ['bar', 'line'], '', problems);\n requireOneOf(data, 'valueFormat', VALUE_FORMATS, '', problems);\n optionalString(data, 'currency', '', problems);\n optionalString(data, 'xLabel', '', problems);\n return;\n }\n }\n}\n\n/** Checks a definition's `detail` setting: a boolean or an options object. */\nfunction checkDetailOption(detail: unknown, problems: Problems): void {\n if (detail === undefined || typeof detail === 'boolean') return;\n if (!isRecord(detail)) {\n problems.push(\n `detail must be true, false or an options object, got ${describeType(detail)}.`\n );\n return;\n }\n optionalString(detail, 'title', 'detail', problems);\n const pageSize: unknown = detail['pageSize'];\n if (\n pageSize !== undefined &&\n !(\n typeof pageSize === 'number' &&\n Number.isInteger(pageSize) &&\n pageSize >= 1 &&\n pageSize <= MAX_DETAIL_PAGE_SIZE\n )\n ) {\n problems.push(\n `detail.pageSize must be a whole number from 1 to ${MAX_DETAIL_PAGE_SIZE}, got ${typeof pageSize === 'number' ? String(pageSize) : describeType(pageSize)}.`\n );\n }\n if (detail['mode'] !== undefined) {\n requireOneOf(detail, 'mode', DETAIL_MODES, 'detail', problems);\n }\n}\n\n/** Checks a definition's `tableControls`: a boolean or `{ search, sort }`. */\nfunction checkTableControlsOption(\n controls: unknown,\n kind: unknown,\n problems: Problems\n): void {\n if (controls === undefined || controls === false) return;\n if (typeof controls !== 'boolean' && !isRecord(controls)) {\n problems.push(\n `tableControls must be true, false or an options object, got ${describeType(controls)}.`\n );\n return;\n }\n if (isRecord(controls)) {\n optionalBoolean(controls, 'search', 'tableControls', problems);\n optionalBoolean(controls, 'sort', 'tableControls', problems);\n }\n if (typeof kind === 'string' && kind !== 'TABLE') {\n problems.push(\n `tableControls only applies to TABLE widgets, but kind is \"${kind}\".`\n );\n }\n}\n\n/** Checks a definition's `locked`: a boolean or `{ move, hide, minimize }`. */\nfunction checkLockedOption(locked: unknown, problems: Problems): void {\n if (locked === undefined || typeof locked === 'boolean') return;\n if (!isRecord(locked)) {\n problems.push(\n `locked must be true, false or an object, got ${describeType(locked)}.`\n );\n return;\n }\n optionalBoolean(locked, 'move', 'locked', problems);\n optionalBoolean(locked, 'hide', 'locked', problems);\n optionalBoolean(locked, 'minimize', 'locked', problems);\n}\n\n/** Checks a list of column choices (`{ key, label }`) for a sort or columns option. */\nfunction checkOptionColumns(\n option: Record_,\n path: string,\n kind: unknown,\n problems: Problems\n): readonly string[] {\n const columns: unknown = option['columns'];\n if (!Array.isArray(columns) || columns.length === 0) {\n problems.push(\n `${join(path, 'columns')} must be a non-empty array of { key, label }, got ${describeType(columns)}.`\n );\n return [];\n }\n const keys: string[] = [];\n columns.forEach((entry: unknown, index: number) => {\n const entryPath = `${path}.columns[${index}]`;\n if (!isRecord(entry)) {\n problems.push(\n `${entryPath} must be an object, got ${describeType(entry)}.`\n );\n return;\n }\n requireString(entry, 'label', entryPath, problems);\n const key: unknown = entry['key'];\n if (typeof key !== 'string') {\n problems.push(\n `${entryPath}.key must be a string, got ${describeType(key)}.`\n );\n } else if (typeof kind === 'string' && !isColumnKeyFor(kind, key)) {\n problems.push(\n `${entryPath}.key \"${key}\" is not a column of a ${kind} widget (${\n kind === 'TABLE' ? '\"c0\", \"c1\", ...' : '\"label\" or \"value\"'\n }).`\n );\n } else if (keys.includes(key)) {\n problems.push(`${entryPath}.key \"${key}\" is used twice.`);\n } else {\n keys.push(key);\n }\n });\n return keys;\n}\n\nfunction checkOption(\n option: unknown,\n path: string,\n kind: unknown,\n seenKeys: Set<string>,\n seenTypes: Set<string>,\n problems: Problems\n): void {\n if (!isRecord(option)) {\n problems.push(`${path} must be an object, got ${describeType(option)}.`);\n return;\n }\n const type: unknown = option['type'];\n if (\n typeof type !== 'string' ||\n !WIDGET_OPTION_TYPES.includes(type as never)\n ) {\n requireOneOf(option, 'type', WIDGET_OPTION_TYPES, path, problems);\n return;\n }\n const key: unknown = option['key'];\n if (typeof key !== 'string' || !OPTION_KEY_PATTERN.test(key)) {\n problems.push(\n `${path}.key must be letters, digits, \"_\" or \"-\", starting with a letter (40 characters at most), got ${\n typeof key === 'string' ? JSON.stringify(key) : describeType(key)\n }.`\n );\n } else if (seenKeys.has(key)) {\n problems.push(`${path}.key \"${key}\" is used by another option.`);\n } else {\n seenKeys.add(key);\n }\n requireString(option, 'label', path, problems);\n\n const fallback: unknown = option['default'];\n switch (type) {\n case 'choice': {\n const choices: unknown = option['choices'];\n const values: string[] = [];\n if (!Array.isArray(choices) || choices.length === 0) {\n problems.push(\n `${path}.choices must be a non-empty array of { value, label }, got ${describeType(choices)}.`\n );\n } else {\n choices.forEach((choice: unknown, index: number) => {\n const choicePath = `${path}.choices[${index}]`;\n if (!isRecord(choice)) {\n problems.push(\n `${choicePath} must be an object, got ${describeType(choice)}.`\n );\n return;\n }\n requireString(choice, 'label', choicePath, problems);\n const value: unknown = choice['value'];\n if (typeof value !== 'string' || value === '') {\n problems.push(\n `${choicePath}.value must be a non-empty string, got ${describeType(value)}.`\n );\n } else if (values.includes(value)) {\n problems.push(`${choicePath}.value \"${value}\" is used twice.`);\n } else {\n values.push(value);\n }\n });\n }\n if (values.length > 0)\n requireOneOf(option, 'default', values, path, problems);\n break;\n }\n case 'number': {\n const { min, max, step } = option as {\n min?: unknown;\n max?: unknown;\n step?: unknown;\n };\n requireNumber(option, 'min', path, problems);\n requireNumber(option, 'max', path, problems);\n if (typeof min === 'number' && typeof max === 'number' && min > max) {\n problems.push(\n `${path}.min (${min}) must not be more than max (${max}).`\n );\n }\n if (\n step !== undefined &&\n !(typeof step === 'number' && Number.isFinite(step) && step > 0)\n ) {\n problems.push(\n `${path}.step must be a number above 0, got ${describeType(step)}.`\n );\n }\n if (typeof fallback !== 'number' || !Number.isFinite(fallback)) {\n problems.push(\n `${path}.default must be a finite number, got ${describeType(fallback)}.`\n );\n } else if (\n typeof min === 'number' &&\n typeof max === 'number' &&\n (fallback < min || fallback > max)\n ) {\n problems.push(\n `${path}.default (${fallback}) must be between min (${min}) and max (${max}).`\n );\n } else if (\n typeof min === 'number' &&\n typeof step === 'number' &&\n step > 0 &&\n Math.abs(\n (fallback - min) / step - Math.round((fallback - min) / step)\n ) > 1e-9\n ) {\n problems.push(\n `${path}.default (${fallback}) must be ${min} plus a whole number of steps of ${step}.`\n );\n }\n break;\n }\n case 'boolean':\n if (typeof fallback !== 'boolean') {\n problems.push(\n `${path}.default must be a boolean, got ${describeType(fallback)}.`\n );\n }\n break;\n case 'text': {\n const maxLength: unknown = option['maxLength'];\n if (\n typeof maxLength !== 'number' ||\n !Number.isInteger(maxLength) ||\n maxLength < 1 ||\n maxLength > MAX_TEXT_OPTION_LENGTH\n ) {\n problems.push(\n `${path}.maxLength must be a whole number from 1 to ${MAX_TEXT_OPTION_LENGTH}, got ${\n typeof maxLength === 'number' ? maxLength : describeType(maxLength)\n }.`\n );\n }\n if (typeof fallback !== 'string') {\n problems.push(\n `${path}.default must be a string, got ${describeType(fallback)}.`\n );\n } else if (typeof maxLength === 'number' && fallback.length > maxLength) {\n problems.push(\n `${path}.default is ${fallback.length} characters; maxLength is ${maxLength}.`\n );\n }\n break;\n }\n case 'dateRange': {\n const presets: unknown = option['presets'];\n const offered: string[] = [];\n if (presets !== undefined) {\n if (!Array.isArray(presets) || presets.length === 0) {\n problems.push(\n `${path}.presets must be a non-empty array of { value, label }, got ${describeType(presets)}.`\n );\n } else {\n presets.forEach((preset: unknown, index: number) => {\n const presetPath = `${path}.presets[${index}]`;\n if (!isRecord(preset)) {\n problems.push(\n `${presetPath} must be an object, got ${describeType(preset)}.`\n );\n return;\n }\n requireString(preset, 'label', presetPath, problems);\n requireOneOf(\n preset,\n 'value',\n DATE_RANGE_PRESETS,\n presetPath,\n problems\n );\n if (typeof preset['value'] === 'string')\n offered.push(preset['value']);\n });\n }\n }\n const allowed: readonly string[] =\n offered.length > 0 ? offered : DATE_RANGE_PRESETS;\n if (\n typeof fallback !== 'string' ||\n !(allowed.includes(fallback) || isIsoInterval(fallback))\n ) {\n problems.push(\n `${path}.default must be one of ${allowed.map((p) => `\"${p}\"`).join(', ')} or an interval like \"2026-01-01/2026-01-31\", got ${\n typeof fallback === 'string'\n ? JSON.stringify(fallback)\n : describeType(fallback)\n }.`\n );\n }\n break;\n }\n case 'color':\n if (typeof fallback !== 'string' || !/^#[0-9a-fA-F]{6}$/.test(fallback)) {\n problems.push(\n `${path}.default must be a color like \"#1c5cab\", got ${\n typeof fallback === 'string'\n ? JSON.stringify(fallback)\n : describeType(fallback)\n }.`\n );\n }\n break;\n case 'sort':\n case 'columns': {\n const supported: boolean =\n type === 'sort'\n ? kind === 'TABLE' || kind === 'BAR_LIST'\n : kind === 'TABLE';\n if (!supported && typeof kind === 'string') {\n problems.push(\n `${path} is a ${type} option, which only applies to ${\n type === 'sort' ? 'TABLE and BAR_LIST' : 'TABLE'\n } widgets, but kind is \"${kind}\".`\n );\n }\n if (seenTypes.has(type)) {\n problems.push(\n `${path} is a second ${type} option; a widget has at most one.`\n );\n }\n seenTypes.add(type);\n const columnKeys: readonly string[] = checkOptionColumns(\n option,\n path,\n supported ? kind : undefined,\n problems\n );\n if (option['apply'] !== undefined) {\n requireOneOf(option, 'apply', ['provider', 'client'], path, problems);\n }\n if (type === 'sort') {\n if (fallback !== undefined) {\n const sort =\n typeof fallback === 'string' ? parseSortValue(fallback) : undefined;\n if (sort === undefined) {\n problems.push(\n `${path}.default must look like \"c1:desc\" (\"column:asc\" or \"column:desc\"), got ${\n typeof fallback === 'string'\n ? JSON.stringify(fallback)\n : describeType(fallback)\n }.`\n );\n } else if (\n columnKeys.length > 0 &&\n !columnKeys.includes(sort.column)\n ) {\n requireOneOf(\n { default: sort.column },\n 'default',\n columnKeys,\n path,\n problems\n );\n }\n }\n } else if (\n !Array.isArray(fallback) ||\n fallback.length === 0 ||\n fallback.some((k: unknown) => typeof k !== 'string')\n ) {\n problems.push(\n `${path}.default must be a non-empty array of column keys, got ${describeType(fallback)}.`\n );\n } else {\n const shown = new Set<string>();\n for (const columnKey of fallback as string[]) {\n if (columnKeys.length > 0 && !columnKeys.includes(columnKey)) {\n problems.push(\n `${path}.default has \"${columnKey}\", which is not one of the columns (${columnKeys.map((c) => `\"${c}\"`).join(', ')}).`\n );\n } else if (shown.has(columnKey)) {\n problems.push(`${path}.default lists \"${columnKey}\" twice.`);\n }\n shown.add(columnKey);\n }\n }\n break;\n }\n }\n}\n\n/** Checks a definition's `options` list. */\nfunction checkOptions(\n options: unknown,\n kind: unknown,\n problems: Problems\n): void {\n if (options === undefined) return;\n if (!Array.isArray(options)) {\n problems.push(`options must be an array, got ${describeType(options)}.`);\n return;\n }\n if (options.length > MAX_WIDGET_OPTIONS) {\n problems.push(\n `options lists ${options.length} options; the most a widget may declare is ${MAX_WIDGET_OPTIONS}.`\n );\n return;\n }\n const seenKeys = new Set<string>();\n const seenTypes = new Set<string>();\n options.forEach((option: unknown, index: number) => {\n checkOption(\n option,\n `options[${index}]`,\n kind,\n seenKeys,\n seenTypes,\n problems\n );\n });\n}\n\nfunction formatProblems(prefix: string, problems: Problems): string {\n const shown: Problems = problems.slice(0, MAX_REPORTED_PROBLEMS);\n const more: number = problems.length - shown.length;\n return `${prefix}: ${shown.join(' ')}${more > 0 ? ` (and ${more} more problem(s))` : ''}`;\n}\n\n/**\n * Checks that `value` is a valid widget payload (any kind, or an empty\n * state). Returns it typed, or an error naming every problem found (up to\n * `MAX_REPORTED_PROBLEMS`). Unknown extra fields are allowed and ignored.\n */\nexport function validateWidgetData(\n value: unknown,\n options: ValidateWidgetDataOptions = {}\n): Result<WidgetPayload> {\n const subject: string =\n options.widgetKey === undefined\n ? 'Widget data'\n : `Widget ${JSON.stringify(options.widgetKey)}`;\n if (!isRecord(value)) {\n return err(`${subject}: must be an object, got ${describeType(value)}.`);\n }\n if (value['empty'] === true) {\n if (typeof value['text'] !== 'string') {\n return err(\n `${subject} (empty): text must be a string, got ${describeType(value['text'])}.`\n );\n }\n return ok(value as unknown as WidgetPayload);\n }\n const kind: unknown = value['kind'];\n if (!isWidgetKind(kind)) {\n return err(\n `${subject}: kind must be one of ${WIDGET_KINDS.join(', ')} (or the payload must be {\"empty\": true, \"text\": ...}), got ${\n typeof kind === 'string' ? JSON.stringify(kind) : describeType(kind)\n }.`\n );\n }\n if (options.expectedKind !== undefined && kind !== options.expectedKind) {\n return err(\n `${subject}: expected kind ${options.expectedKind} from its definition, got ${kind}.`\n );\n }\n const problems: Problems = [];\n checkPayloadFields(kind, value, problems);\n if (problems.length > 0) {\n return err(formatProblems(`${subject} (${kind})`, problems));\n }\n return ok(value as unknown as WidgetPayload);\n}\n\n/**\n * Checks that `value` is a valid widget definition. Returns it typed, or an\n * error naming every problem found.\n */\nexport function validateWidgetDefinition(\n value: unknown\n): Result<WidgetDefinition> {\n if (!isRecord(value)) {\n return err(\n `Widget definition: must be an object, got ${describeType(value)}.`\n );\n }\n const subject: string =\n typeof value['key'] === 'string'\n ? `Widget definition ${JSON.stringify(value['key'])}`\n : 'Widget definition';\n const problems: Problems = [];\n requireString(value, 'key', '', problems);\n if (value['key'] === '') {\n problems.push('key must not be empty.');\n }\n requireString(value, 'title', '', problems);\n optionalString(value, 'description', '', problems);\n requireOneOf(value, 'kind', WIDGET_KINDS, '', problems);\n optionalNumber(value, 'sortOrder', '', problems);\n if (value['roles'] !== undefined) {\n const roles = requireArray(value, 'roles', '', problems);\n roles?.forEach((role: unknown, index: number) => {\n if (typeof role !== 'string') {\n problems.push(\n `roles[${index}] must be a string, got ${describeType(role)}.`\n );\n }\n });\n }\n optionalBoolean(value, 'active', '', problems);\n if (value['defaultSize'] !== undefined) {\n requireOneOf(value, 'defaultSize', WIDGET_SIZES, '', problems);\n }\n if (value['width'] !== undefined && !isWidgetWidth(value['width'])) {\n problems.push(\n `width must be an integer from ${MIN_WIDGET_WIDTH} to ${MAX_WIDGET_WIDTH} (twelfths of the row), got ${typeof value['width'] === 'number' ? String(value['width']) : describeType(value['width'])}.`\n );\n }\n checkDetailOption(value['detail'], problems);\n checkTableControlsOption(value['tableControls'], value['kind'], problems);\n checkLockedOption(value['locked'], problems);\n checkOptions(value['options'], value['kind'], problems);\n if (value['page'] !== undefined) {\n if (typeof value['page'] !== 'string' || value['page'].trim() === '') {\n problems.push(\n `page must be a non-empty page key or title, got ${describeType(value['page'])}.`\n );\n }\n }\n if (value['fill'] !== undefined) {\n requireOneOf(value, 'fill', WIDGET_FILLS, '', problems);\n }\n if (problems.length > 0) {\n return err(formatProblems(subject, problems));\n }\n return ok(value as unknown as WidgetDefinition);\n}\n","/**\n * Runs each widget's data provider and collects the outcome per widget, so\n * one failing provider never breaks the rest of the dashboard. The package\n * never fetches anything itself: providers are the consumer's functions\n * (a Prisma query, an HTTP call, a computed value).\n */\n\nimport {\n isWidgetVisibleTo,\n sortDefinitions,\n type WidgetDefinition,\n} from './definition.js';\nimport {\n applyClientOptions,\n optionsCacheSuffix,\n resolveOptionValues,\n type OptionContext,\n type OptionValues,\n} from './options.js';\nimport {\n emptyTextFor,\n type WidgetData,\n type WidgetPayload,\n} from './payload.js';\nimport { describeUnknownError } from './result.js';\nimport { validateWidgetData } from './validate.js';\n\n/** The minimum a resolve context carries; add whatever your providers need. */\nexport interface WidgetContext {\n /** The viewer's roles. Widgets with `roles` need at least one of them. */\n readonly roles?: readonly string[];\n}\n\n/** What the resolver hands every provider, after the context and definition. */\nexport interface ProviderOptions {\n /**\n * Aborted when the widget times out, is refreshed, or the dashboard is torn\n * down. Pass it to `fetch` (or any cancellable call) to stop the work; a\n * provider that ignores it is still abandoned, just not stopped.\n */\n readonly signal: AbortSignal;\n /**\n * The widget's declared options, resolved: what was chosen when it is valid,\n * else the default. Empty when the definition declares none. Treat values\n * that reach a database query (`text`, `sort`, `columns`) as untrusted input\n * and check them again on the server.\n */\n readonly options: OptionValues;\n}\n\n/**\n * Loads one widget's payload. May be sync or async; may throw. The third\n * argument is optional to use: a provider that takes only `(context,\n * definition)` keeps working.\n */\nexport type WidgetProvider<C = WidgetContext> = (\n context: C,\n definition: WidgetDefinition,\n options: ProviderOptions\n) => WidgetPayload | Promise<WidgetPayload>;\n\n/** Providers keyed by widget key. */\nexport type WidgetProviders<C = WidgetContext> = Readonly<\n Record<string, WidgetProvider<C>>\n>;\n\nexport interface OkWidget {\n readonly definition: WidgetDefinition;\n readonly status: 'ok';\n readonly data: WidgetData;\n /** When the data was produced (epoch ms), set when a provider resolved it. */\n readonly updatedAt?: number;\n /** True while cached data is shown and a fresh load is still running. */\n readonly stale?: boolean;\n /** The widget's resolved option values; present when it declares options. */\n readonly options?: OptionValues;\n}\n\nexport interface EmptyWidget {\n readonly definition: WidgetDefinition;\n readonly status: 'empty';\n /** Why there is nothing to show, e.g. \"No orders synced yet.\" */\n readonly emptyText: string;\n /** The widget's resolved option values; present when it declares options. */\n readonly options?: OptionValues;\n}\n\nexport interface ErrorWidget {\n readonly definition: WidgetDefinition;\n readonly status: 'error';\n /** Names the widget and what failed. */\n readonly error: string;\n /** The widget's resolved option values; present when it declares options. */\n readonly options?: OptionValues;\n}\n\n/** One widget after its provider ran. */\nexport type ResolvedWidget = OkWidget | EmptyWidget | ErrorWidget;\n\n/** A widget whose data hasn't arrived yet (for client-side loading states). */\nexport interface LoadingWidget {\n readonly definition: WidgetDefinition;\n readonly status: 'loading';\n /** The widget's resolved option values; present when it declares options. */\n readonly options?: OptionValues;\n}\n\n/** Anything a dashboard can render: resolved, or still loading. */\nexport type DashboardWidget = ResolvedWidget | LoadingWidget;\n\nexport type WidgetStatus = DashboardWidget['status'];\n\n/** A payload the cache holds, with when it was stored (epoch ms). */\nexport interface CachedPayload {\n readonly payload: unknown;\n readonly storedAt: number;\n}\n\n/**\n * Consumer-supplied storage for widget payloads (memory, localStorage, a\n * database). The package never stores anything itself. Payloads read back\n * are validated again, so a corrupt entry cannot break a widget.\n */\nexport interface WidgetCache {\n get(\n key: string\n ): CachedPayload | undefined | Promise<CachedPayload | undefined>;\n set(key: string, entry: CachedPayload): void | Promise<void>;\n}\n\nexport interface ResolveOptions extends OptionContext {\n /**\n * The values chosen for each widget's options, by widget key. Values a\n * widget didn't declare, or that aren't valid for the option, are ignored\n * and the option's default is used.\n */\n readonly optionValues?: Readonly<\n Record<string, Readonly<Record<string, unknown>> | undefined>\n >;\n /**\n * Validate each provider's payload with `validateWidgetData` (and check\n * its kind matches the definition). Default true; turn off only for\n * trusted, typed providers.\n */\n readonly validate?: boolean;\n /**\n * Give each provider this many milliseconds. A timeout aborts the\n * provider's signal and yields an `error` widget naming the key.\n */\n readonly timeoutMs?: number;\n /** Cancels loading; affected widgets resolve as `error` (canceled). */\n readonly signal?: AbortSignal;\n /** Where to store successful payloads (see `WidgetCache`). */\n readonly cache?: WidgetCache;\n /** Cache key for a widget. Default: the widget's `key`. */\n readonly cacheKey?: (definition: WidgetDefinition) => string;\n}\n\n/**\n * Turns a payload (typically JSON from an API) into a resolved widget:\n * validated against the definition's kind, and marked empty when it has\n * nothing to show.\n */\nexport function resolvePayload(\n definition: WidgetDefinition,\n payload: unknown,\n options: ResolveOptions = {}\n): ResolvedWidget {\n let checked: WidgetPayload;\n if (options.validate === false) {\n checked = payload as WidgetPayload;\n } else {\n const result = validateWidgetData(payload, {\n widgetKey: definition.key,\n expectedKind: definition.kind,\n });\n if (!result.ok) {\n return { definition, status: 'error', error: result.error };\n }\n checked = result.value;\n }\n const emptyText: string | null = emptyTextFor(checked);\n if (emptyText !== null) {\n return { definition, status: 'empty', emptyText };\n }\n return { definition, status: 'ok', data: checked as WidgetData };\n}\n\n/** A widget that failed, with the reason. */\nexport function failedWidget(\n definition: WidgetDefinition,\n error: string\n): ErrorWidget {\n return { definition, status: 'error', error };\n}\n\n/** Loading placeholders for definitions, before their data arrives. */\nexport function loadingWidgets(\n definitions: readonly WidgetDefinition[]\n): LoadingWidget[] {\n return definitions.map((definition) => ({ definition, status: 'loading' }));\n}\n\n/**\n * The cache key for a widget under these options. With resolved option\n * `values`, choices that differ from the defaults are appended, so \"top 5 by\n * units\" and \"top 10 by revenue\" are cached apart, while a widget on its\n * defaults keeps its plain key.\n */\nexport function cacheKeyFor(\n definition: WidgetDefinition,\n options: ResolveOptions,\n values?: OptionValues\n): string {\n const base: string =\n options.cacheKey === undefined\n ? definition.key\n : options.cacheKey(definition);\n return values === undefined\n ? base\n : `${base}${optionsCacheSuffix(definition, values, options)}`;\n}\n\n/** The resolved option values for a widget under these resolve options. */\nexport function optionValuesFor(\n definition: WidgetDefinition,\n options: ResolveOptions\n): OptionValues {\n return resolveOptionValues(\n definition,\n options.optionValues?.[definition.key],\n options\n );\n}\n\n/**\n * Applies the options marked `apply: 'client'` to an `ok` widget's payload and\n * records the resolved values on the widget (when it declares options). Other\n * widgets only get the values. Returns the same object when nothing changes.\n */\nexport function finalizeWidget<W extends DashboardWidget>(\n widget: W,\n values: OptionValues\n): W {\n if (Object.keys(values).length === 0) return widget;\n if (widget.status === 'ok') {\n const data: WidgetData = applyClientOptions(\n widget.definition,\n widget.data,\n values\n );\n return { ...widget, data, options: values };\n }\n return { ...widget, options: values };\n}\n\n/** Thrown inside the resolver when a load is canceled or times out. */\nclass LoadInterruption extends Error {}\n\n/**\n * Runs one widget's provider, capturing a throw, a timeout, a cancellation or\n * a bad payload as an error widget. Never rejects.\n */\nexport async function resolveWidget<C extends WidgetContext>(\n definition: WidgetDefinition,\n provider: WidgetProvider<C> | undefined,\n context: C,\n options: ResolveOptions = {}\n): Promise<ResolvedWidget> {\n const values: OptionValues = optionValuesFor(definition, options);\n return finalizeWidget(\n await resolveWidgetUnapplied(definition, provider, context, options),\n values\n );\n}\n\n/**\n * Like `resolveWidget`, but leaves the payload as the provider returned it:\n * options marked `apply: 'client'` are not applied (see `finalizeWidget`). For\n * loaders that keep the payload so a client-side choice can change without\n * asking the provider again.\n */\nexport async function resolveWidgetUnapplied<C extends WidgetContext>(\n definition: WidgetDefinition,\n provider: WidgetProvider<C> | undefined,\n context: C,\n options: ResolveOptions = {}\n): Promise<ResolvedWidget> {\n const values: OptionValues = optionValuesFor(definition, options);\n const quotedKey: string = JSON.stringify(definition.key);\n if (provider === undefined) {\n return failedWidget(\n definition,\n `Widget ${quotedKey}: no provider is registered for this key.`\n );\n }\n if (options.signal?.aborted === true) {\n return failedWidget(\n definition,\n `Widget ${quotedKey}: loading was canceled before it started.`\n );\n }\n\n const controller = new AbortController();\n const onExternalAbort = (): void => controller.abort(options.signal?.reason);\n options.signal?.addEventListener('abort', onExternalAbort, { once: true });\n\n let timedOut = false;\n const timeoutMs: number | undefined =\n options.timeoutMs !== undefined && options.timeoutMs > 0\n ? options.timeoutMs\n : undefined;\n const timer: ReturnType<typeof setTimeout> | undefined =\n timeoutMs === undefined\n ? undefined\n : setTimeout(() => {\n timedOut = true;\n controller.abort(new Error(`Timed out after ${timeoutMs} ms.`));\n }, timeoutMs);\n\n // Rejects when the load is aborted, so a provider that ignores its signal\n // is still abandoned instead of holding the widget in \"loading\".\n const interrupted = new Promise<never>((_resolve, reject) => {\n controller.signal.addEventListener(\n 'abort',\n () => reject(new LoadInterruption()),\n { once: true }\n );\n });\n\n let payload: WidgetPayload;\n try {\n payload = await Promise.race([\n Promise.resolve().then(() => {\n // Cancelled before the provider got a turn: never call it.\n if (controller.signal.aborted) throw new LoadInterruption();\n return provider(context, definition, {\n signal: controller.signal,\n options: values,\n });\n }),\n interrupted,\n ]);\n } catch (cause: unknown) {\n if (cause instanceof LoadInterruption) {\n return failedWidget(\n definition,\n timedOut\n ? `Widget ${quotedKey}: provider timed out after ${timeoutMs} ms.`\n : `Widget ${quotedKey}: loading was canceled.`\n );\n }\n return failedWidget(\n definition,\n `Widget ${quotedKey}: provider failed: ${describeUnknownError(cause)}`\n );\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n options.signal?.removeEventListener('abort', onExternalAbort);\n }\n\n const resolved: ResolvedWidget = resolvePayload(definition, payload, options);\n if (resolved.status !== 'ok') return resolved;\n\n const storedAt: number = Date.now();\n if (options.cache !== undefined) {\n try {\n await options.cache.set(cacheKeyFor(definition, options, values), {\n payload: resolved.data,\n storedAt,\n });\n } catch {\n // A failing cache must never fail the widget.\n }\n }\n return { ...resolved, updatedAt: storedAt };\n}\n\n/**\n * The widgets a viewer can see: active, allowed for `roles`, in sort order.\n */\nexport function widgetsFor(\n definitions: readonly WidgetDefinition[],\n roles: readonly string[] | undefined\n): WidgetDefinition[] {\n return sortDefinitions(\n definitions.filter((definition) => isWidgetVisibleTo(definition, roles))\n );\n}\n\n/**\n * Resolves every widget the context's roles may see, in parallel. Inactive\n * and role-filtered widgets are skipped (and their providers never run).\n * Results come back in sort order; a provider that throws, is missing or\n * returns a bad payload yields an `error` widget and never rejects.\n */\nexport async function resolveWidgets<C extends WidgetContext>(\n definitions: readonly WidgetDefinition[],\n providers: WidgetProviders<C>,\n context: C,\n options: ResolveOptions = {}\n): Promise<ResolvedWidget[]> {\n const visible: WidgetDefinition[] = widgetsFor(definitions, context.roles);\n return Promise.all(\n visible.map((definition) =>\n resolveWidget(\n definition,\n Object.prototype.hasOwnProperty.call(providers, definition.key)\n ? providers[definition.key]\n : undefined,\n context,\n options\n )\n )\n );\n}\n","/**\n * Loads widgets one by one, after the first render, and reports each result\n * as it arrives. It is the logic behind the React `useWidgets` hook, kept\n * framework-agnostic and runtime-neutral so it can be tested without a DOM\n * and reused by other renderers. Like the rest of the core it never fetches\n * anything itself: providers do the work.\n *\n * Lifecycle: `createWidgetLoader` (nothing runs yet; every widget is\n * `loading`) then `load(key)` / `loadAll()` when you want data (immediately\n * after mount, or when a card scrolls into view), `refresh()` to reload, and\n * `dispose()` to cancel everything.\n */\n\nimport type { WidgetDefinition } from './definition.js';\nimport {\n optionsCacheSuffix,\n sameOptionValues,\n type OptionValues,\n} from './options.js';\nimport {\n cacheKeyFor,\n finalizeWidget,\n loadingWidgets,\n optionValuesFor,\n resolvePayload,\n resolveWidgetUnapplied,\n widgetsFor,\n type DashboardWidget,\n type ResolveOptions,\n type ResolvedWidget,\n type WidgetContext,\n type WidgetProviders,\n} from './resolve.js';\n\nexport interface WidgetLoaderOptions<\n C extends WidgetContext,\n> extends ResolveOptions {\n readonly definitions: readonly WidgetDefinition[];\n readonly providers: WidgetProviders<C>;\n readonly context: C;\n}\n\nexport interface RefreshOptions {\n /** Leave widgets that are still loading alone instead of restarting them. */\n readonly skipInFlight?: boolean;\n}\n\nexport interface WidgetLoader {\n /** The current widgets in display order. A new array after every change. */\n getSnapshot(): readonly DashboardWidget[];\n /** Calls `listener` after every change. Returns an unsubscribe function. */\n subscribe(listener: () => void): () => void;\n /** Starts loading one widget. Does nothing if it already started. */\n load(key: string): void;\n /** Starts loading every widget that has not started yet. */\n loadAll(): void;\n /**\n * Reloads started widgets (or just `key`). The previous call is aborted and\n * its result ignored. Visible data stays until the new data arrives; an\n * `error` widget goes back to `loading`. With `skipInFlight`, widgets that\n * are still loading are left alone (what polling wants: a provider slower\n * than the interval would otherwise be restarted forever and never finish).\n */\n refresh(key?: string, options?: RefreshOptions): void;\n /**\n * Sets the values chosen for a widget's options (all of them: keys left out\n * go back to their defaults). A choice only the toolkit applies (`sort` or\n * `columns` with `apply: 'client'`) re-derives the payload it already has.\n * A choice your provider sees reloads that widget alone: what is shown stays\n * (marked `stale`) until the new data arrives, and an earlier answer for the\n * same choices comes back from the cache. Does nothing when the resolved\n * values don't change.\n */\n setOptions(key: string, chosen: Readonly<Record<string, unknown>>): void;\n /** Aborts everything in flight and ignores any later result. */\n dispose(): void;\n}\n\nexport function createWidgetLoader<C extends WidgetContext>(\n options: WidgetLoaderOptions<C>\n): WidgetLoader {\n const { definitions, providers, context, ...baseOptions } = options;\n // What was chosen per widget; `setOptions` changes it.\n const chosen = new Map<string, Readonly<Record<string, unknown>>>(\n Object.entries(baseOptions.optionValues ?? {}).flatMap(([key, values]) =>\n values === undefined ? [] : [[key, values] as const]\n )\n );\n const resolveOptions: ResolveOptions = baseOptions;\n /** The resolve options as they are right now, with the current choices. */\n function currentOptions(): ResolveOptions {\n return { ...resolveOptions, optionValues: Object.fromEntries(chosen) };\n }\n // The payload as the provider returned it, before client-side options.\n const unapplied = new Map<string, ResolvedWidget>();\n const visible: WidgetDefinition[] = widgetsFor(definitions, context.roles);\n let snapshot: readonly DashboardWidget[] = loadingWidgets(visible);\n\n const listeners = new Set<() => void>();\n const started = new Set<string>();\n const generations = new Map<string, number>();\n const inFlight = new Map<string, AbortController>();\n let disposed = false;\n\n function publish(next: readonly DashboardWidget[]): void {\n snapshot = next;\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // One failing subscriber must not stop the others or the load.\n }\n }\n }\n\n function replace(key: string, widget: DashboardWidget): void {\n publish(\n snapshot.map((current) =>\n current.definition.key === key ? widget : current\n )\n );\n }\n\n function abortAll(reason: unknown): void {\n for (const controller of inFlight.values()) controller.abort(reason);\n inFlight.clear();\n }\n\n resolveOptions.signal?.addEventListener(\n 'abort',\n () => abortAll(resolveOptions.signal?.reason),\n { once: true }\n );\n\n async function run(\n definition: WidgetDefinition,\n readCache: boolean\n ): Promise<void> {\n const key: string = definition.key;\n const generation: number = (generations.get(key) ?? 0) + 1;\n generations.set(key, generation);\n inFlight.get(key)?.abort(new Error('Superseded by a newer load.'));\n const controller = new AbortController();\n inFlight.set(key, controller);\n const isCurrent = (): boolean =>\n !disposed && generations.get(key) === generation;\n\n const runOptions: ResolveOptions = currentOptions();\n const values: OptionValues = optionValuesFor(definition, runOptions);\n if (readCache && runOptions.cache !== undefined) {\n try {\n const entry = await runOptions.cache.get(\n cacheKeyFor(definition, runOptions, values)\n );\n if (entry !== undefined && isCurrent()) {\n const cached = resolvePayload(definition, entry.payload, runOptions);\n if (cached.status === 'ok') {\n const stale = { ...cached, updatedAt: entry.storedAt, stale: true };\n unapplied.set(key, stale);\n replace(key, finalizeWidget(stale, values));\n }\n }\n } catch {\n // An unreadable cache is just a miss.\n }\n }\n if (!isCurrent()) return;\n\n const provider = Object.prototype.hasOwnProperty.call(providers, key)\n ? providers[key]\n : undefined;\n const result = await resolveWidgetUnapplied(definition, provider, context, {\n ...runOptions,\n signal: controller.signal,\n });\n if (!isCurrent()) return;\n inFlight.delete(key);\n if (result.status === 'ok') unapplied.set(key, result);\n else unapplied.delete(key);\n replace(key, finalizeWidget(result, values));\n }\n\n function start(definition: WidgetDefinition, readCache: boolean): void {\n started.add(definition.key);\n void run(definition, readCache);\n }\n\n function definitionFor(key: string): WidgetDefinition | undefined {\n return visible.find((definition) => definition.key === key);\n }\n\n function load(key: string): void {\n if (disposed || started.has(key)) return;\n const definition: WidgetDefinition | undefined = definitionFor(key);\n if (definition !== undefined) start(definition, true);\n }\n\n function loadAll(): void {\n for (const definition of visible) load(definition.key);\n }\n\n function refresh(key?: string, refreshOptions?: RefreshOptions): void {\n if (disposed) return;\n const keys: string[] = key === undefined ? [...started] : [key];\n for (const target of keys) {\n const definition: WidgetDefinition | undefined = definitionFor(target);\n if (definition === undefined) continue;\n if (refreshOptions?.skipInFlight === true && inFlight.has(target)) {\n continue;\n }\n const current: DashboardWidget | undefined = snapshot.find(\n (widget) => widget.definition.key === target\n );\n if (current?.status === 'error') {\n replace(target, { definition, status: 'loading' });\n }\n start(definition, false);\n }\n }\n\n function setOptions(\n key: string,\n values: Readonly<Record<string, unknown>>\n ): void {\n if (disposed) return;\n const definition: WidgetDefinition | undefined = definitionFor(key);\n if (definition === undefined) return;\n const before: OptionValues = optionValuesFor(definition, currentOptions());\n chosen.set(key, { ...values });\n const runOptions: ResolveOptions = currentOptions();\n const after: OptionValues = optionValuesFor(definition, runOptions);\n if (sameOptionValues(before, after) || !started.has(key)) return;\n const kept: ResolvedWidget | undefined = unapplied.get(key);\n if (\n kept !== undefined &&\n optionsCacheSuffix(definition, before, runOptions) ===\n optionsCacheSuffix(definition, after, runOptions)\n ) {\n // Only a choice the toolkit applies changed: no need to ask again.\n replace(key, finalizeWidget(kept, after));\n return;\n }\n const current: DashboardWidget | undefined = snapshot.find(\n (widget) => widget.definition.key === key\n );\n if (current?.status === 'ok') replace(key, { ...current, stale: true });\n else if (current?.status === 'error') {\n replace(key, { definition, status: 'loading' });\n }\n start(definition, true);\n }\n\n function dispose(): void {\n disposed = true;\n abortAll(new Error('The widget loader was disposed.'));\n listeners.clear();\n }\n\n function subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n\n return {\n getSnapshot: () => snapshot,\n subscribe,\n load,\n loadAll,\n refresh,\n setOptions,\n dispose,\n };\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type RefObject,\n} from 'react';\n\nimport type { WidgetDefinition } from '../core/definition.js';\nimport { createWidgetLoader, type WidgetLoader } from '../core/loader.js';\nimport {\n loadingWidgets,\n widgetsFor,\n type DashboardWidget,\n type ResolveOptions,\n type WidgetContext,\n type WidgetProviders,\n} from '../core/resolve.js';\n\nexport interface UseWidgetsOptions extends ResolveOptions {\n /**\n * When each widget's provider starts. `'mount'` (default): right after the\n * first render, so the page and the dashboard shell appear first and each\n * card fills in as its data arrives. `'visible'`: only once the card is\n * near the viewport (attach `gridRef` to an element around the cards).\n */\n readonly loadWhen?: 'mount' | 'visible';\n /** `IntersectionObserver` margin for `loadWhen: 'visible'`. Default `'200px'`. */\n readonly rootMargin?: string;\n /**\n * Reload started widgets every this many ms. Ticks are skipped while the\n * tab is hidden, and a widget still loading is not restarted.\n */\n readonly refreshMs?: number;\n /**\n * The viewer's chosen option values by widget key (see\n * `WidgetDefinition.options`). Changing them reloads only the widgets whose\n * resolved values changed; it never recreates the loader, so it may be a\n * fresh object each render.\n */\n readonly optionValues?: Readonly<\n Record<string, Readonly<Record<string, unknown>> | undefined>\n >;\n}\n\nexport interface UseWidgetsResult {\n /** Pass to `Dashboard` or `WidgetGrid`: placeholders first, then results. */\n readonly widgets: readonly DashboardWidget[];\n /** Reload one widget (for example from the error card's Retry) or all. */\n readonly refresh: (key?: string) => void;\n /** Choose option values for one widget; same effect as `optionValues`. */\n readonly setOptions: (\n key: string,\n chosen: Readonly<Record<string, unknown>>\n ) => void;\n /**\n * For `loadWhen: 'visible'`: attach to any element that contains the cards,\n * for example a wrapper `<div ref={gridRef}>` around `Dashboard`.\n */\n readonly gridRef: RefObject<HTMLDivElement | null>;\n}\n\n/**\n * Loads widget data after the page has rendered and returns widgets for\n * `Dashboard`. The first render never waits for data (so server rendering\n * and first paint are unaffected); every widget starts as `loading`, loads\n * independently, and replaces its placeholder when its own data arrives.\n *\n * Keep `definitions`, `providers`, `context` and `options.cache` referentially\n * stable (module constants or `useMemo`): a changed value restarts loading,\n * aborting whatever is in flight.\n */\nexport function useWidgets<C extends WidgetContext>(\n definitions: readonly WidgetDefinition[],\n providers: WidgetProviders<C>,\n context: C,\n options: UseWidgetsOptions = {}\n): UseWidgetsResult {\n const {\n loadWhen = 'mount',\n rootMargin = '200px',\n refreshMs = 0,\n validate,\n timeoutMs,\n signal,\n cache,\n cacheKey,\n optionValues,\n } = options;\n\n const placeholders: readonly DashboardWidget[] = useMemo(\n () => loadingWidgets(widgetsFor(definitions, context.roles)),\n [definitions, context.roles]\n );\n const [widgets, setWidgets] =\n useState<readonly DashboardWidget[]>(placeholders);\n const [loader, setLoader] = useState<WidgetLoader | null>(null);\n const loaderRef = useRef<WidgetLoader | null>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n const optionValuesRef = useRef(optionValues);\n optionValuesRef.current = optionValues;\n\n // One loader per set of inputs. It is created in an effect (never during\n // render) so server rendering starts nothing, and so React StrictMode's\n // mount, unmount, mount cycle gets a fresh loader instead of a disposed one.\n useEffect(() => {\n const created: WidgetLoader = createWidgetLoader({\n definitions,\n providers,\n context,\n ...(validate === undefined ? {} : { validate }),\n ...(timeoutMs === undefined ? {} : { timeoutMs }),\n ...(signal === undefined ? {} : { signal }),\n ...(cache === undefined ? {} : { cache }),\n ...(cacheKey === undefined ? {} : { cacheKey }),\n ...(optionValuesRef.current === undefined\n ? {}\n : { optionValues: optionValuesRef.current }),\n });\n loaderRef.current = created;\n setWidgets(created.getSnapshot());\n const unsubscribe: () => void = created.subscribe(() =>\n setWidgets(created.getSnapshot())\n );\n setLoader(created);\n if (loadWhen === 'mount' || typeof IntersectionObserver === 'undefined') {\n created.loadAll();\n }\n return () => {\n unsubscribe();\n created.dispose();\n loaderRef.current = null;\n setLoader(null);\n };\n }, [\n definitions,\n providers,\n context,\n validate,\n timeoutMs,\n signal,\n cache,\n cacheKey,\n loadWhen,\n ]);\n\n // loadWhen 'visible': start a widget the first time its card nears the\n // viewport. Cards that appear later (another page, a restored widget) are\n // picked up as they are added, so they load when first shown.\n const cardKeys: string = widgets\n .map((widget) => widget.definition.key)\n .join('\\u0000');\n useEffect(() => {\n const grid: HTMLDivElement | null = gridRef.current;\n if (\n loader === null ||\n grid === null ||\n loadWhen !== 'visible' ||\n typeof IntersectionObserver === 'undefined'\n ) {\n return undefined;\n }\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const key: string | undefined = (entry.target as HTMLElement).dataset[\n 'widgetKey'\n ];\n if (entry.isIntersecting && key !== undefined) {\n loader.load(key);\n observer.unobserve(entry.target);\n }\n }\n },\n { rootMargin }\n );\n const observed = new WeakSet<Element>();\n const observeNewCards = (): void => {\n grid.querySelectorAll('[data-widget-key]').forEach((card) => {\n if (observed.has(card)) return;\n observed.add(card);\n observer.observe(card);\n });\n };\n observeNewCards();\n const mutations: MutationObserver | undefined =\n typeof MutationObserver === 'undefined'\n ? undefined\n : new MutationObserver(observeNewCards);\n mutations?.observe(grid, { childList: true, subtree: true });\n return () => {\n mutations?.disconnect();\n observer.disconnect();\n };\n }, [loader, loadWhen, rootMargin, cardKeys]);\n\n // Polling: reload started widgets, skipping ticks while the tab is hidden.\n useEffect(() => {\n if (loader === null || !(refreshMs > 0)) return undefined;\n const timer = setInterval(() => {\n if (\n typeof document !== 'undefined' &&\n document.visibilityState === 'hidden'\n ) {\n return;\n }\n loader.refresh(undefined, { skipInFlight: true });\n }, refreshMs);\n return () => clearInterval(timer);\n }, [loader, refreshMs]);\n\n // Push changed option values to the running loader, which reloads just the\n // widgets whose resolved values differ.\n const optionSignature: string = JSON.stringify(optionValues ?? {});\n useEffect(() => {\n if (loader === null) return;\n for (const [key, chosen] of Object.entries(optionValuesRef.current ?? {})) {\n if (chosen !== undefined) loader.setOptions(key, chosen);\n }\n }, [loader, optionSignature]);\n\n const setOptions = useCallback(\n (key: string, chosen: Readonly<Record<string, unknown>>): void => {\n loaderRef.current?.setOptions(key, chosen);\n },\n []\n );\n\n const refresh = useCallback((key?: string): void => {\n loaderRef.current?.refresh(key);\n }, []);\n\n return { widgets, refresh, setOptions, gridRef };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/format.ts","../src/core/result.ts","../src/core/url.ts","../src/core/detail.ts","../src/core/grid.ts","../src/core/options.ts","../src/core/scale.ts","../src/react/palette.ts","../src/react/settings.tsx","../src/react/charts.tsx","../src/react/primitives.tsx","../src/react/renderers.tsx","../src/react/card.tsx","../src/core/definition.ts","../src/core/layout.ts","../src/core/pages.ts","../src/react/edit-menu.tsx","../src/react/detail.tsx","../src/react/dashboard.tsx","../src/react/use-stored-layout.ts","../src/core/payload.ts","../src/core/validate.ts","../src/core/resolve.ts","../src/core/loader.ts","../src/react/use-widgets.ts"],"names":["jsx","jsxs","Fragment","useId","useState","without","createContext","useContext","useRef","useEffect","describeType","useMemo","useCallback"],"mappings":"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","file":"react.js","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","/**\n * A small Result type. Functions in this package return a Result rather than\n * throwing, so the caller has to look at the outcome. `throw` is reserved for\n * programmer error.\n */\n\nexport interface Ok<T> {\n readonly ok: true;\n readonly value: T;\n}\n\nexport interface Err {\n readonly ok: false;\n /** Specific enough to act on: names the field, the widget and the problem. */\n readonly error: string;\n}\n\nexport type Result<T> = Ok<T> | Err;\n\nexport function ok<T>(value: T): Ok<T> {\n return { ok: true, value };\n}\n\nexport function err(error: string): Err {\n return { ok: false, error };\n}\n\n/** Turns an unknown thrown value into a readable message. */\nexport function describeUnknownError(cause: unknown): string {\n if (cause instanceof Error) {\n return cause.message === '' ? cause.name : cause.message;\n }\n if (typeof cause === 'string') {\n return cause;\n }\n try {\n const json: string | undefined = JSON.stringify(cause);\n return json ?? String(cause);\n } catch {\n return String(cause);\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","/**\n * Detail view, core part: the data and query types, sorting, filtering and\n * paging, query (de)serialisation for URLs, and validation. Pure functions;\n * nothing here renders, fetches or reads `location`. See\n * `docs/design/detail-view.md`.\n */\n\nimport type { WidgetDefinition } from './definition.js';\nimport { formatValue, type Locale } from './format.js';\nimport type { TableWidgetData, WidgetData } from './payload.js';\nimport type { ProviderOptions, WidgetContext } from './resolve.js';\nimport { err, ok, type Result } from './result.js';\nimport { isSafeHref } from './url.js';\n\n/** `client`: the provider returns every row; `server`: it honors the query. */\nexport const DETAIL_MODES = ['client', 'server'] as const;\nexport type DetailMode = (typeof DETAIL_MODES)[number];\n\nexport const DEFAULT_DETAIL_PAGE_SIZE = 25;\nexport const MAX_DETAIL_PAGE_SIZE = 200;\n\n/** The `detail` setting on a widget definition. `true` means all defaults. */\nexport interface WidgetDetailOptions {\n /** Heading of the detail view. Default: the widget's title. */\n readonly title?: string;\n /** Rows per page, 1 to 200. Default 25. */\n readonly pageSize?: number;\n /** Default `client`. */\n readonly mode?: DetailMode;\n}\n\n/** `WidgetDetailOptions` with every default filled in. */\nexport interface ResolvedDetailOptions {\n readonly title: string;\n readonly pageSize: number;\n readonly mode: DetailMode;\n}\n\n/** The `tableControls` setting on a widget definition. `true` means both. */\nexport interface WidgetTableControls {\n /** A search box over every column. Default true. */\n readonly search?: boolean;\n /** Sortable column headers. Default true. */\n readonly sort?: boolean;\n}\n\n/** `WidgetTableControls` with every default filled in. */\nexport interface ResolvedTableControls {\n readonly search: boolean;\n readonly sort: boolean;\n}\n\nexport interface DetailColumn {\n /** Stable id used by sort, filters and URLs. Unique within the data. */\n readonly key: string;\n readonly label: string;\n /** Right-aligned, and sorted as numbers when cell values are numbers. */\n readonly numeric?: boolean;\n /** Default true. */\n readonly sortable?: boolean;\n /** Default false: gets its own filter input when true. */\n readonly filterable?: boolean;\n}\n\nexport interface DetailCell {\n /** What is shown. */\n readonly text: string;\n /** What sorts and filters. Default: `text`. */\n readonly value?: string | number;\n /** Renders the cell as a link (http, https, mailto or relative only). */\n readonly href?: string;\n}\n\nexport interface DetailData {\n readonly columns: readonly DetailColumn[];\n /** One array of cells per row, each as long as `columns`. */\n readonly rows: readonly (readonly DetailCell[])[];\n /** Server mode: rows matching the query across all pages. */\n readonly totalRows?: number;\n}\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface DetailSort {\n readonly column: string;\n readonly direction: SortDirection;\n}\n\nexport interface DetailQuery {\n /** Free text, matched against every column. */\n readonly search?: string;\n /** Per-column text, keyed by column key. Blank entries are ignored. */\n readonly filters?: Readonly<Record<string, string>>;\n readonly sort?: DetailSort;\n /** 1-based. */\n readonly page: number;\n readonly pageSize: number;\n}\n\n/** What a detail provider receives beyond the usual arguments. */\nexport interface DetailProviderOptions extends ProviderOptions {\n readonly query: DetailQuery;\n}\n\n/**\n * Loads the full data for one widget's detail view. In client mode it may\n * ignore `options.query`; in server mode it returns one page and `totalRows`.\n */\nexport type DetailProvider<C = WidgetContext> = (\n context: C,\n definition: WidgetDefinition,\n options: DetailProviderOptions\n) => DetailData | Promise<DetailData>;\n\n/** Detail providers keyed by widget key. */\nexport type DetailProviders<C = WidgetContext> = Readonly<\n Record<string, DetailProvider<C>>\n>;\n\nexport interface DetailPage {\n /** The rows of the requested page (after filtering and sorting). */\n readonly rows: readonly (readonly DetailCell[])[];\n /** Rows matching the query, across all pages. */\n readonly totalRows: number;\n /** The page shown: the requested one, clamped into range. */\n readonly page: number;\n readonly pageCount: number;\n}\n\n/** Reads `definition.detail` with defaults; undefined when there is none. */\nexport function resolveDetailOptions(\n definition: Pick<WidgetDefinition, 'title' | 'detail'>\n): ResolvedDetailOptions | undefined {\n const detail: boolean | WidgetDetailOptions | undefined = definition.detail;\n if (detail === undefined || detail === false) return undefined;\n const options: WidgetDetailOptions = detail === true ? {} : detail;\n return {\n title: options.title ?? definition.title,\n pageSize: options.pageSize ?? DEFAULT_DETAIL_PAGE_SIZE,\n mode: options.mode ?? 'client',\n };\n}\n\n/**\n * Reads `definition.tableControls` with defaults; undefined when the widget\n * has none (or both are turned off).\n */\nexport function resolveTableControls(\n definition: Pick<WidgetDefinition, 'tableControls'>\n): ResolvedTableControls | undefined {\n const setting: boolean | WidgetTableControls | undefined =\n definition.tableControls;\n if (setting === undefined || setting === false) return undefined;\n const options: WidgetTableControls = setting === true ? {} : setting;\n const resolved: ResolvedTableControls = {\n search: options.search ?? true,\n sort: options.sort ?? true,\n };\n return resolved.search || resolved.sort ? resolved : undefined;\n}\n\n/** The first page, unsorted and unfiltered. */\nexport function defaultDetailQuery(\n pageSize: number = DEFAULT_DETAIL_PAGE_SIZE\n): DetailQuery {\n return { page: 1, pageSize };\n}\n\n/** Lower case with accents removed, so \"Café\" matches \"cafe\". */\nfunction fold(text: string): string {\n return text.normalize('NFD').replace(/\\p{M}/gu, '').toLowerCase();\n}\n\nfunction cellValue(cell: DetailCell): string | number {\n return cell.value ?? cell.text;\n}\n\nfunction cellMatches(cell: DetailCell, needle: string): boolean {\n return fold(String(cellValue(cell))).includes(needle);\n}\n\nfunction compareCells(\n a: DetailCell,\n b: DetailCell,\n collator: Intl.Collator\n): number {\n const left: string | number = cellValue(a);\n const right: string | number = cellValue(b);\n if (typeof left === 'number' && typeof right === 'number') {\n return left - right;\n }\n // Numbers sort before text when a column mixes them.\n if (typeof left === 'number') return -1;\n if (typeof right === 'number') return 1;\n return collator.compare(left, right);\n}\n\n/**\n * Filters, sorts and pages `data` in memory (client mode). Matching is\n * case- and accent-insensitive substring matching on each cell's `value`\n * (else `text`). Sorting is stable, locale-aware (`locale`, default the\n * runtime's) and numeric for number values. `page` is clamped into range.\n * Fails, naming the column, when the query names a column that does not\n * exist or cannot be sorted.\n */\nexport function queryRows(\n data: DetailData,\n query: DetailQuery,\n locale?: string\n): Result<DetailPage> {\n const indexOf = new Map<string, number>(\n data.columns.map((column, index) => [column.key, index])\n );\n const filterEntries: { index: number; needle: string }[] = [];\n for (const [key, text] of Object.entries(query.filters ?? {})) {\n const index: number | undefined = indexOf.get(key);\n if (index === undefined) {\n return err(\n `Detail query: filter column \"${key}\" does not exist. Columns: ${listKeys(data)}.`\n );\n }\n const needle: string = fold(text.trim());\n if (needle !== '') filterEntries.push({ index, needle });\n }\n let sortIndex = -1;\n if (query.sort !== undefined) {\n const found: number | undefined = indexOf.get(query.sort.column);\n const column: DetailColumn | undefined =\n found === undefined ? undefined : data.columns[found];\n if (found === undefined || column === undefined) {\n return err(\n `Detail query: sort column \"${query.sort.column}\" does not exist. Columns: ${listKeys(data)}.`\n );\n }\n if (column.sortable === false) {\n return err(\n `Detail query: column \"${column.key}\" is not sortable (sortable: false).`\n );\n }\n sortIndex = found;\n }\n const search: string = fold((query.search ?? '').trim());\n\n let rows: (readonly DetailCell[])[] = data.rows.filter(\n (row) =>\n filterEntries.every(({ index, needle }) => {\n const cell: DetailCell | undefined = row[index];\n return cell !== undefined && cellMatches(cell, needle);\n }) &&\n (search === '' || row.some((cell) => cellMatches(cell, search)))\n );\n\n if (query.sort !== undefined && sortIndex >= 0) {\n const collator = new Intl.Collator(locale, {\n numeric: true,\n sensitivity: 'base',\n });\n const sign: number = query.sort.direction === 'desc' ? -1 : 1;\n rows = rows\n .map((row, position) => ({ row, position }))\n .sort((a, b) => {\n const left: DetailCell | undefined = a.row[sortIndex];\n const right: DetailCell | undefined = b.row[sortIndex];\n const order: number =\n left === undefined || right === undefined\n ? 0\n : sign * compareCells(left, right, collator);\n return order || a.position - b.position;\n })\n .map(({ row }) => row);\n }\n\n const pageSize: number = Math.max(1, Math.floor(query.pageSize));\n const pageCount: number = Math.max(1, Math.ceil(rows.length / pageSize));\n const page: number = Math.min(Math.max(1, Math.floor(query.page)), pageCount);\n return ok({\n rows: rows.slice((page - 1) * pageSize, page * pageSize),\n totalRows: rows.length,\n page,\n pageCount,\n });\n}\n\nfunction listKeys(data: DetailData): string {\n return data.columns.map((column) => `\"${column.key}\"`).join(', ');\n}\n\n/* URL query strings ------------------------------------------------------ */\n\nconst FILTER_PREFIX = 'f.';\n\n/**\n * The query as a URL query string without the leading `?`: `q` (search),\n * `sort` (`column:asc|desc`), `page` and `f.<column>` filters. `pageSize` is\n * not included: the widget definition owns it. Defaults are left out.\n */\nexport function serializeDetailQuery(query: DetailQuery): string {\n const parts: string[] = [];\n const add = (key: string, value: string): void => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n };\n if (query.search !== undefined && query.search !== '') {\n add('q', query.search);\n }\n if (query.sort !== undefined) {\n add('sort', `${query.sort.column}:${query.sort.direction}`);\n }\n for (const [column, text] of Object.entries(query.filters ?? {})) {\n if (text !== '') add(`${FILTER_PREFIX}${column}`, text);\n }\n if (query.page > 1) add('page', String(query.page));\n return parts.join('&');\n}\n\n/**\n * Reads a query string (with or without the leading `?`) written by\n * `serializeDetailQuery`. Unknown parameters are ignored, so it can share a\n * URL with the rest of an app. A malformed value fails with a message naming\n * the parameter. When `data` is given, column keys are checked against it.\n */\nexport function parseDetailQuery(\n queryString: string,\n pageSize: number = DEFAULT_DETAIL_PAGE_SIZE,\n data?: Pick<DetailData, 'columns'>\n): Result<DetailQuery> {\n let search: string | undefined;\n let sort: DetailSort | undefined;\n let page = 1;\n const filters: Record<string, string> = {};\n const columnKeys: ReadonlySet<string> | undefined =\n data === undefined\n ? undefined\n : new Set(data.columns.map((column) => column.key));\n const text: string = queryString.startsWith('?')\n ? queryString.slice(1)\n : queryString;\n\n for (const pair of text.split('&')) {\n if (pair === '') continue;\n const equals: number = pair.indexOf('=');\n const rawKey: string = equals < 0 ? pair : pair.slice(0, equals);\n const rawValue: string = equals < 0 ? '' : pair.slice(equals + 1);\n let key: string;\n let value: string;\n try {\n key = decodeURIComponent(rawKey.replace(/\\+/g, ' '));\n value = decodeURIComponent(rawValue.replace(/\\+/g, ' '));\n } catch {\n return err(\n `Detail query: \"${pair}\" is not valid percent-encoding in the URL.`\n );\n }\n if (key === 'q') {\n search = value;\n } else if (key === 'page') {\n if (!/^[1-9]\\d*$/.test(value)) {\n return err(\n `Detail query: page must be a whole number from 1, got \"${value}\".`\n );\n }\n page = Number(value);\n } else if (key === 'sort') {\n const colon: number = value.lastIndexOf(':');\n const column: string = colon < 0 ? value : value.slice(0, colon);\n const direction: string = colon < 0 ? 'asc' : value.slice(colon + 1);\n if (column === '' || (direction !== 'asc' && direction !== 'desc')) {\n return err(\n `Detail query: sort must look like \"column:asc\" or \"column:desc\", got \"${value}\".`\n );\n }\n if (columnKeys !== undefined && !columnKeys.has(column)) {\n return err(`Detail query: sort column \"${column}\" does not exist.`);\n }\n sort = { column, direction };\n } else if (key.startsWith(FILTER_PREFIX)) {\n const column: string = key.slice(FILTER_PREFIX.length);\n if (columnKeys !== undefined && !columnKeys.has(column)) {\n return err(`Detail query: filter column \"${column}\" does not exist.`);\n }\n if (value !== '') filters[column] = value;\n }\n }\n return ok({\n ...(search === undefined || search === '' ? {} : { search }),\n ...(Object.keys(filters).length === 0 ? {} : { filters }),\n ...(sort === undefined ? {} : { sort }),\n page,\n pageSize,\n });\n}\n\n/* Validation ------------------------------------------------------------- */\n\nfunction describeType(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n return typeof value;\n}\n\n/**\n * Checks data from a detail provider: unique non-empty column keys, labels,\n * every row as long as `columns`, cell `text` strings, `value` a string or\n * finite number, safe `href`s, and `totalRows` a non-negative integer.\n * Reports every problem, naming the column or row and cell.\n */\nexport function validateDetailData(\n data: unknown,\n subject = 'Detail data'\n): Result<DetailData> {\n const problems: string[] = [];\n if (typeof data !== 'object' || data === null || Array.isArray(data)) {\n return err(`${subject}: must be an object, got ${describeType(data)}.`);\n }\n const record = data as Readonly<Record<string, unknown>>;\n const columns: unknown = record['columns'];\n const rows: unknown = record['rows'];\n const keys = new Set<string>();\n let columnCount = 0;\n\n if (!Array.isArray(columns) || columns.length === 0) {\n problems.push(\n `columns must be a non-empty array, got ${describeType(columns)}.`\n );\n } else {\n columnCount = columns.length;\n columns.forEach((column: unknown, index: number) => {\n const at = `columns[${index}]`;\n if (typeof column !== 'object' || column === null) {\n problems.push(`${at} must be an object, got ${describeType(column)}.`);\n return;\n }\n const fields = column as Readonly<Record<string, unknown>>;\n const key: unknown = fields['key'];\n if (typeof key !== 'string' || key === '') {\n problems.push(`${at}.key must be a non-empty string.`);\n } else if (keys.has(key)) {\n problems.push(`${at}.key \"${key}\" is used by an earlier column.`);\n } else {\n keys.add(key);\n }\n if (typeof fields['label'] !== 'string') {\n problems.push(\n `${at}.label must be a string, got ${describeType(fields['label'])}.`\n );\n }\n for (const flag of ['numeric', 'sortable', 'filterable']) {\n const flagValue: unknown = fields[flag];\n if (flagValue !== undefined && typeof flagValue !== 'boolean') {\n problems.push(\n `${at}.${flag} must be a boolean, got ${describeType(flagValue)}.`\n );\n }\n }\n });\n }\n\n if (!Array.isArray(rows)) {\n problems.push(`rows must be an array, got ${describeType(rows)}.`);\n } else {\n rows.forEach((row: unknown, rowIndex: number) => {\n if (!Array.isArray(row)) {\n problems.push(\n `rows[${rowIndex}] must be an array of cells, got ${describeType(row)}.`\n );\n return;\n }\n if (columnCount > 0 && row.length !== columnCount) {\n problems.push(\n `rows[${rowIndex}] has ${row.length} cells but there are ${columnCount} columns.`\n );\n }\n row.forEach((cell: unknown, cellIndex: number) => {\n const at = `rows[${rowIndex}][${cellIndex}]`;\n if (typeof cell !== 'object' || cell === null) {\n problems.push(`${at} must be an object, got ${describeType(cell)}.`);\n return;\n }\n const fields = cell as Readonly<Record<string, unknown>>;\n if (typeof fields['text'] !== 'string') {\n problems.push(\n `${at}.text must be a string, got ${describeType(fields['text'])}.`\n );\n }\n const value: unknown = fields['value'];\n if (\n value !== undefined &&\n typeof value !== 'string' &&\n !(typeof value === 'number' && Number.isFinite(value))\n ) {\n problems.push(\n `${at}.value must be a string or a finite number, got ${describeType(value)}.`\n );\n }\n const href: unknown = fields['href'];\n if (href !== undefined) {\n if (typeof href !== 'string') {\n problems.push(\n `${at}.href must be a string, got ${describeType(href)}.`\n );\n } else if (!isSafeHref(href)) {\n problems.push(\n `${at}.href \"${href}\" is not allowed (only http, https, mailto and relative URLs).`\n );\n }\n }\n });\n });\n }\n\n const totalRows: unknown = record['totalRows'];\n if (\n totalRows !== undefined &&\n !(\n typeof totalRows === 'number' &&\n Number.isInteger(totalRows) &&\n totalRows >= 0\n )\n ) {\n problems.push(\n `totalRows must be a non-negative whole number, got ${describeType(totalRows)}.`\n );\n }\n\n if (problems.length > 0) {\n return err(`${subject}: ${problems.join(' ')}`);\n }\n return ok(data as DetailData);\n}\n\n/* Derived details --------------------------------------------------------- */\n\n/**\n * A TABLE's columns and rows as detail data (column keys `c0`, `c1`, ...),\n * footer ignored, so the table can be searched and sorted with `queryRows`.\n */\nexport function tableDetailData(data: TableWidgetData): DetailData {\n return {\n columns: data.columns.map((column, index) => ({\n key: `c${index}`,\n label: column.label,\n ...(column.numeric === undefined ? {} : { numeric: column.numeric }),\n })),\n rows: data.rows,\n };\n}\n\n/**\n * The detail data for a widget whose card payload is already complete, so a\n * detail view needs no provider: a TABLE without a `footer` (a footer means\n * rows were left out) and a BAR_LIST. Returns undefined for everything else\n * (alert lists, gauges, KPIs, text and charts): those need a detail provider.\n */\nexport function deriveDetailData(\n data: WidgetData,\n locale?: Locale\n): DetailData | undefined {\n if (data.kind === 'TABLE') {\n return data.footer === undefined ? tableDetailData(data) : undefined;\n }\n if (data.kind === 'BAR_LIST') {\n return {\n columns: [\n { key: 'label', label: 'Name' },\n { key: 'value', label: 'Value', numeric: true },\n ],\n rows: data.items.map((item) => [\n { text: item.label },\n {\n text: item.display ?? formatValue(item.value, 'number', { locale }),\n value: item.value,\n },\n ]),\n };\n }\n return undefined;\n}\n","import type { WidgetFill, WidgetSize } from './definition.js';\n\n/** The parts of a widget definition that decide its place in a grid. */\nexport interface GridItem {\n readonly key: string;\n readonly defaultSize?: WidgetSize;\n readonly fill?: WidgetFill;\n readonly width?: number;\n}\n\n/** Columns in a grid that uses widget `width`. */\nexport const WIDTH_COLUMNS = 12;\n/** Smallest and largest `width`, in twelfths of a row. */\nexport const MIN_WIDGET_WIDTH = 2;\nexport const MAX_WIDGET_WIDTH = 12;\n\n/** Whether `value` is a valid widget `width`: an integer from 2 to 12. */\nexport function isWidgetWidth(value: unknown): value is number {\n return (\n typeof value === 'number' &&\n Number.isInteger(value) &&\n value >= MIN_WIDGET_WIDTH &&\n value <= MAX_WIDGET_WIDTH\n );\n}\n\n/** The width (in twelfths) a `defaultSize` stands for. Default `medium`. */\nexport function widthForSize(size: WidgetSize | undefined): number {\n switch (size) {\n case 'small':\n return 3;\n case 'large':\n return 6;\n case 'full':\n return 12;\n default:\n return 4;\n }\n}\n\n/** The 12-column width of an item: its `width`, else from its size. */\nexport function itemWidth(item: GridItem): number {\n return isWidgetWidth(item.width)\n ? item.width\n : widthForSize(item.defaultSize);\n}\n\n/** Whether a grid of `items` should use 12 columns (any item sets `width`). */\nexport function usesWidthColumns(items: readonly GridItem[]): boolean {\n return items.some((item) => item.width !== undefined);\n}\n\n/** Whether the widget should take the columns left over in its row. */\nexport function fillsWidth(fill: WidgetFill | undefined): boolean {\n return fill === 'width' || fill === 'both';\n}\n\n/** Whether the widget should stretch to the height of its row. */\nexport function fillsHeight(fill: WidgetFill | undefined): boolean {\n return fill === 'height' || fill === 'both';\n}\n\n/**\n * Columns a size takes in a grid of `columns` tracks: `large` spans\n * `largeSpan` (default 2), `full` spans every column, anything else one.\n */\nexport function baseColumnSpan(\n size: WidgetSize | undefined,\n columns: number,\n largeSpan = 2\n): number {\n if (size === 'full') return columns;\n if (size === 'large') return Math.min(largeSpan, columns);\n return 1;\n}\n\n/**\n * Places `items` in a grid of `columns` tracks the way a sparse grid\n * auto-places them (left to right, wrapping to a new row when an item does\n * not fit), then gives the columns left over in each row to the items that\n * `fill` their width, shared evenly (earlier items get the remainder).\n *\n * Returns the column span for each width-filling item, keyed by `key`. Items\n * that do not fill width keep their normal size and are not in the map.\n */\nexport function fillColumnSpans(\n items: readonly GridItem[],\n columns: number,\n largeSpan = 2\n): Map<string, number> {\n return placeAndFill(items, columns, (item, trackCount) =>\n baseColumnSpan(item.defaultSize, trackCount, largeSpan)\n );\n}\n\n/**\n * Like `fillColumnSpans` for a 12-column grid: each item starts at its\n * `width` (see `itemWidth`) and width-fillers share the leftover twelfths.\n */\nexport function fillWidthSpans(\n items: readonly GridItem[]\n): Map<string, number> {\n return placeAndFill(items, WIDTH_COLUMNS, itemWidth);\n}\n\n/** One row of a placed grid: the widgets in it and their final column spans. */\nexport interface PlacedRow {\n readonly keys: readonly string[];\n /** Column spans, in `keys` order, after width-fillers took the leftovers. */\n readonly spans: readonly number[];\n}\n\n/**\n * The rows `items` occupy in a 12-column grid, exactly as `fillWidthSpans`\n * places them: left to right, a widget that doesn't fit in the rest of a row\n * starts the next row whole (a widget is never split), and width-fillers then\n * grow into the leftover columns. Growth never changes how many rows there\n * are.\n */\nexport function placeRows(items: readonly GridItem[]): readonly PlacedRow[] {\n return placeAndFillRows(items, WIDTH_COLUMNS, itemWidth).rows;\n}\n\n/**\n * How many of `items`, in order, fit in `maxRows` rows of a 12-column grid.\n * Placement is left to right, so this is the length of the longest prefix\n * whose rows number at most `maxRows`.\n */\nexport function fitCount(items: readonly GridItem[], maxRows: number): number {\n const rows: readonly PlacedRow[] = placeRows(items);\n let count = 0;\n for (const row of rows.slice(0, Math.max(0, Math.floor(maxRows)))) {\n count += row.keys.length;\n }\n return count;\n}\n\nfunction placeAndFill(\n items: readonly GridItem[],\n columns: number,\n spanOf: (item: GridItem, trackCount: number) => number\n): Map<string, number> {\n return placeAndFillRows(items, columns, spanOf).spans;\n}\n\nfunction placeAndFillRows(\n items: readonly GridItem[],\n columns: number,\n spanOf: (item: GridItem, trackCount: number) => number\n): { readonly spans: Map<string, number>; readonly rows: PlacedRow[] } {\n const trackCount: number = Math.max(1, Math.floor(columns));\n const spans = new Map<string, number>();\n const rows: PlacedRow[] = [];\n let row: { item: GridItem; span: number }[] = [];\n let used = 0;\n\n function closeRow(): void {\n if (row.length === 0) return;\n const fillers = row.filter(({ item }) => fillsWidth(item.fill));\n const leftover: number = trackCount - used;\n const finalSpans = new Map<string, number>();\n if (fillers.length > 0) {\n const share: number = Math.floor(leftover / fillers.length);\n const remainder: number = leftover % fillers.length;\n fillers.forEach(({ item, span }, index) => {\n const grown: number = span + share + (index < remainder ? 1 : 0);\n spans.set(item.key, grown);\n finalSpans.set(item.key, grown);\n });\n }\n rows.push({\n keys: row.map(({ item }) => item.key),\n spans: row.map(({ item, span }) => finalSpans.get(item.key) ?? span),\n });\n row = [];\n used = 0;\n }\n\n for (const item of items) {\n const span: number = Math.min(spanOf(item, trackCount), trackCount);\n if (used + span > trackCount && row.length > 0) closeRow();\n row.push({ item, span });\n used += span;\n }\n closeRow();\n return { spans, rows };\n}\n","/**\n * Options a widget author declares and a viewer (or the consumer) can choose:\n * a default sort, \"top N\", a period, which columns show. The package never\n * decides what an option means for your data. It validates the chosen values,\n * hands them to your provider (`ProviderOptions.options`), keeps cached\n * payloads for different choices apart, and can sort or trim a payload itself\n * when the author says so (`apply: 'client'`).\n *\n * Definitions stay plain JSON: no functions, no regular expressions.\n */\n\nimport { queryRows, tableDetailData, type DetailSort } from './detail.js';\nimport type {\n BarListItem,\n TableCell,\n TableColumn,\n WidgetData,\n} from './payload.js';\n\n/** A chosen option value. Only a `columns` option holds more than a scalar. */\nexport type OptionValue = string | number | boolean | readonly string[];\n\n/** Resolved option values by option key. */\nexport type OptionValues = Readonly<Record<string, OptionValue>>;\n\n/** Fields every declared option has. */\ninterface OptionBase {\n /** Unique within the widget; letters, digits, `_` and `-`, starting with a letter. */\n readonly key: string;\n /** What the viewer sees, in your own words (and language). */\n readonly label: string;\n}\n\n/** A pick from a fixed list. */\nexport interface ChoiceOption extends OptionBase {\n readonly type: 'choice';\n readonly choices: readonly {\n readonly value: string;\n readonly label: string;\n }[];\n readonly default: string;\n}\n\nexport interface NumberOption extends OptionBase {\n readonly type: 'number';\n readonly min: number;\n readonly max: number;\n /** Chosen values must be `min` plus a whole number of steps. */\n readonly step?: number;\n readonly default: number;\n}\n\nexport interface BooleanOption extends OptionBase {\n readonly type: 'boolean';\n readonly default: boolean;\n}\n\n/** Free text: a search term, a tag. Always plain text, never HTML. */\nexport interface TextOption extends OptionBase {\n readonly type: 'text';\n /** At most 500. */\n readonly maxLength: number;\n readonly default: string;\n}\n\n/** The named ranges a `dateRange` option can use (see `resolveDateRange`). */\nexport const DATE_RANGE_PRESETS = [\n 'today',\n 'yesterday',\n 'last7',\n 'last30',\n 'last90',\n 'thisMonth',\n 'lastMonth',\n 'thisYear',\n 'lastYear',\n] as const;\n\nexport type DateRangePreset = (typeof DATE_RANGE_PRESETS)[number];\n\n/**\n * A range of calendar days. The value is a preset key (`last30`) or an ISO\n * interval `YYYY-MM-DD/YYYY-MM-DD`. Providers always receive the interval.\n */\nexport interface DateRangeOption extends OptionBase {\n readonly type: 'dateRange';\n /** The presets a viewer may pick. Default: every preset. */\n readonly presets?: readonly {\n readonly value: DateRangePreset;\n readonly label: string;\n }[];\n readonly default: string;\n}\n\n/** A `#rrggbb` color. A color alone should never carry meaning. */\nexport interface ColorOption extends OptionBase {\n readonly type: 'color';\n readonly default: string;\n}\n\n/**\n * How rows are ordered. The value is `column:asc` or `column:desc`, where\n * `column` is a column key: `c0`, `c1`, ... for a TABLE (by position) and\n * `label` or `value` for a BAR_LIST.\n */\nexport interface SortOption extends OptionBase {\n readonly type: 'sort';\n readonly columns: readonly { readonly key: string; readonly label: string }[];\n /** Absent: no sort until the viewer picks one. */\n readonly default?: string;\n /**\n * `provider` (default): your provider returns the right rows, which a\n * truncated table needs. `client`: the toolkit sorts the payload it got.\n */\n readonly apply?: 'provider' | 'client';\n}\n\n/** Which TABLE columns show, and in what order. The value is column keys. */\nexport interface ColumnsOption extends OptionBase {\n readonly type: 'columns';\n readonly columns: readonly { readonly key: string; readonly label: string }[];\n readonly default: readonly string[];\n /** `provider` (default) passes the keys on; `client` trims the payload here. */\n readonly apply?: 'provider' | 'client';\n}\n\nexport type WidgetOption =\n | ChoiceOption\n | NumberOption\n | BooleanOption\n | TextOption\n | DateRangeOption\n | ColorOption\n | SortOption\n | ColumnsOption;\n\nexport const WIDGET_OPTION_TYPES = [\n 'choice',\n 'number',\n 'boolean',\n 'text',\n 'dateRange',\n 'color',\n 'sort',\n 'columns',\n] as const;\n\n/** The most options one widget may declare. */\nexport const MAX_WIDGET_OPTIONS = 20;\n/** The most characters in a `text` option. */\nexport const MAX_TEXT_OPTION_LENGTH = 500;\n/** Allowed option keys. */\nexport const OPTION_KEY_PATTERN = /^[A-Za-z][A-Za-z0-9_-]{0,39}$/;\nconst COLOR_PATTERN = /^#[0-9a-fA-F]{6}$/;\nconst INTERVAL_PATTERN = /^(\\d{4}-\\d{2}-\\d{2})\\/(\\d{4}-\\d{2}-\\d{2})$/;\n// eslint-disable-next-line no-control-regex -- rejecting control characters is the point\nconst CONTROL_CHARACTERS = /[\\u0000-\\u001f\\u007f]/;\n\n/** What option resolution needs from the outside world. */\nexport interface OptionContext {\n /** \"Now\" in epoch ms, for date range presets. Default `Date.now()`. */\n readonly now?: number;\n /** An IANA time zone for \"today\". Default `UTC`. */\n readonly timeZone?: string;\n}\n\n/** The value a column key refers to in a sort or columns option. */\nexport function isColumnKeyFor(kind: string, key: string): boolean {\n if (kind === 'TABLE') return /^c\\d+$/.test(key);\n if (kind === 'BAR_LIST') return key === 'label' || key === 'value';\n return false;\n}\n\n/** Whether the toolkit (not your provider) applies this option. */\nexport function isClientApplied(option: WidgetOption): boolean {\n return (\n (option.type === 'sort' || option.type === 'columns') &&\n option.apply === 'client'\n );\n}\n\n// --- Date ranges -----------------------------------------------------------\n\ninterface CivilDate {\n readonly year: number;\n readonly month: number; // 1 to 12\n readonly day: number;\n}\n\nfunction civilToday(context: OptionContext): CivilDate {\n const now: number = context.now ?? Date.now();\n let timeZone: string = context.timeZone ?? 'UTC';\n try {\n new Intl.DateTimeFormat('en-US', { timeZone });\n } catch {\n timeZone = 'UTC';\n }\n const parts: Intl.DateTimeFormatPart[] = new Intl.DateTimeFormat('en-US', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(new Date(now));\n const pick = (type: string): number =>\n Number(parts.find((part) => part.type === type)?.value ?? '0');\n return { year: pick('year'), month: pick('month'), day: pick('day') };\n}\n\nfunction toIso(epochMs: number): string {\n return new Date(epochMs).toISOString().slice(0, 10);\n}\n\nconst DAY_MS = 86_400_000;\n\nfunction parseIsoDay(text: string): number | undefined {\n const match: RegExpMatchArray | null = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(text);\n if (match === null) return undefined;\n const epoch: number = Date.UTC(\n Number(match[1]),\n Number(match[2]) - 1,\n Number(match[3])\n );\n return toIso(epoch) === text ? epoch : undefined;\n}\n\n/** Whether `value` is `YYYY-MM-DD/YYYY-MM-DD` with real days, start not after end. */\nexport function isIsoInterval(value: string): boolean {\n const match: RegExpMatchArray | null = INTERVAL_PATTERN.exec(value);\n if (match === null) return false;\n const start: number | undefined = parseIsoDay(match[1] as string);\n const end: number | undefined = parseIsoDay(match[2] as string);\n return start !== undefined && end !== undefined && start <= end;\n}\n\nfunction isPreset(value: string): value is DateRangePreset {\n return (DATE_RANGE_PRESETS as readonly string[]).includes(value);\n}\n\n/**\n * The ISO interval a date range value stands for, or undefined when it is\n * neither a preset nor a valid interval. Presets, in calendar days of the\n * context's time zone: `today`, `yesterday`, `last7`, `last30` and `last90`\n * (ending today), `thisMonth` and `thisYear` (from the first day to today),\n * `lastMonth` and `lastYear` (the whole of it).\n */\nexport function resolveDateRange(\n value: string,\n context: OptionContext = {}\n): string | undefined {\n if (isIsoInterval(value)) return value;\n if (!isPreset(value)) return undefined;\n const today: CivilDate = civilToday(context);\n const todayMs: number = Date.UTC(today.year, today.month - 1, today.day);\n const range = (startMs: number, endMs: number): string =>\n `${toIso(startMs)}/${toIso(endMs)}`;\n switch (value) {\n case 'today':\n return range(todayMs, todayMs);\n case 'yesterday':\n return range(todayMs - DAY_MS, todayMs - DAY_MS);\n case 'last7':\n return range(todayMs - 6 * DAY_MS, todayMs);\n case 'last30':\n return range(todayMs - 29 * DAY_MS, todayMs);\n case 'last90':\n return range(todayMs - 89 * DAY_MS, todayMs);\n case 'thisMonth':\n return range(Date.UTC(today.year, today.month - 1, 1), todayMs);\n case 'lastMonth':\n return range(\n Date.UTC(today.year, today.month - 2, 1),\n Date.UTC(today.year, today.month - 1, 1) - DAY_MS\n );\n case 'thisYear':\n return range(Date.UTC(today.year, 0, 1), todayMs);\n case 'lastYear':\n return range(\n Date.UTC(today.year - 1, 0, 1),\n Date.UTC(today.year, 0, 1) - DAY_MS\n );\n }\n}\n\n// --- Choosing values ---------------------------------------------------------\n\nfunction onStepGrid(option: NumberOption, value: number): boolean {\n if (option.step === undefined) return true;\n const steps: number = (value - option.min) / option.step;\n return Math.abs(steps - Math.round(steps)) < 1e-9;\n}\n\n/** `column:asc|desc` as a detail sort, or undefined when malformed. */\nexport function parseSortValue(value: string): DetailSort | undefined {\n const separator: number = value.lastIndexOf(':');\n if (separator <= 0) return undefined;\n const column: string = value.slice(0, separator);\n const direction: string = value.slice(separator + 1);\n if (direction !== 'asc' && direction !== 'desc') return undefined;\n return { column, direction };\n}\n\n/**\n * The sort the widget's `sort` option currently selects, or undefined when\n * the widget has no sort option or no sort is chosen. Use it to seed table\n * headers and the detail view.\n */\nexport function sortFromOptions(\n definition: { readonly options?: readonly WidgetOption[] },\n values: OptionValues | undefined\n): DetailSort | undefined {\n if (values === undefined) return undefined;\n const sortOption: WidgetOption | undefined = definition.options?.find(\n (option) => option.type === 'sort'\n );\n if (sortOption === undefined) return undefined;\n const chosen: OptionValue | undefined = values[sortOption.key];\n return typeof chosen === 'string' ? parseSortValue(chosen) : undefined;\n}\n\n/**\n * A chosen value made valid for `option`, or undefined when it isn't one the\n * option allows. Text is trimmed, colors lower-cased, date ranges resolved to\n * an interval.\n */\nexport function coerceOptionValue(\n option: WidgetOption,\n value: unknown,\n context: OptionContext = {}\n): OptionValue | undefined {\n switch (option.type) {\n case 'choice':\n return typeof value === 'string' &&\n option.choices.some((choice) => choice.value === value)\n ? value\n : undefined;\n case 'number':\n return typeof value === 'number' &&\n Number.isFinite(value) &&\n value >= option.min &&\n value <= option.max &&\n onStepGrid(option, value)\n ? value\n : undefined;\n case 'boolean':\n return typeof value === 'boolean' ? value : undefined;\n case 'text': {\n if (typeof value !== 'string') return undefined;\n const trimmed: string = value.trim();\n return trimmed.length <= option.maxLength &&\n !CONTROL_CHARACTERS.test(trimmed)\n ? trimmed\n : undefined;\n }\n case 'dateRange': {\n if (typeof value !== 'string') return undefined;\n if (\n isPreset(value) &&\n option.presets !== undefined &&\n !option.presets.some((preset) => preset.value === value)\n ) {\n return undefined;\n }\n return resolveDateRange(value, context);\n }\n case 'color':\n return typeof value === 'string' && COLOR_PATTERN.test(value)\n ? value.toLowerCase()\n : undefined;\n case 'sort': {\n if (typeof value !== 'string') return undefined;\n const sort: DetailSort | undefined = parseSortValue(value);\n return sort !== undefined &&\n option.columns.some((column) => column.key === sort.column)\n ? value\n : undefined;\n }\n case 'columns': {\n if (!Array.isArray(value) || value.length === 0) return undefined;\n const keys: readonly unknown[] = value;\n const allowed = new Set<string>(option.columns.map((c) => c.key));\n const seen = new Set<string>();\n for (const key of keys) {\n if (typeof key !== 'string' || !allowed.has(key) || seen.has(key)) {\n return undefined;\n }\n seen.add(key);\n }\n return [...seen];\n }\n }\n}\n\n/** The value an option has when nothing valid was chosen. */\nexport function defaultOptionValue(\n option: WidgetOption,\n context: OptionContext = {}\n): OptionValue | undefined {\n switch (option.type) {\n case 'dateRange':\n return resolveDateRange(option.default, context);\n case 'sort':\n return option.default;\n case 'columns':\n return [...option.default];\n default:\n return option.default;\n }\n}\n\nconst NO_VALUES: OptionValues = Object.freeze({});\n\n/**\n * The value of every option a definition declares: the chosen one when it is\n * valid for that option, else the default. Keys that aren't declared and\n * values that aren't valid are ignored (never an error), so a layout saved\n * before an option changed still loads. A `sort` option with no default and\n * no valid choice is left out. Empty when the definition declares none.\n */\nexport function resolveOptionValues(\n definition: { readonly options?: readonly WidgetOption[] },\n chosen: Readonly<Record<string, unknown>> | undefined,\n context: OptionContext = {}\n): OptionValues {\n const options: readonly WidgetOption[] | undefined = definition.options;\n if (options === undefined || options.length === 0) return NO_VALUES;\n const values: Record<string, OptionValue> = {};\n for (const option of options) {\n const picked: unknown = chosen?.[option.key];\n const value: OptionValue | undefined =\n (picked === undefined\n ? undefined\n : coerceOptionValue(option, picked, context)) ??\n defaultOptionValue(option, context);\n if (value !== undefined) values[option.key] = value;\n }\n return values;\n}\n\nfunction sameValue(\n a: OptionValue | undefined,\n b: OptionValue | undefined\n): boolean {\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((item, i) => item === b[i]);\n }\n return a === b;\n}\n\n/** Whether two sets of resolved values are the same. */\nexport function sameOptionValues(a: OptionValues, b: OptionValues): boolean {\n const keys: string[] = Object.keys({ ...a, ...b });\n return keys.every((key) => sameValue(a[key], b[key]));\n}\n\n/**\n * Text that tells apart the payloads different choices produce, for cache\n * keys: the values that differ from the default, in key order, and only the\n * options your provider sees (`apply: 'client'` ones don't change the data it\n * returns). Empty when everything is on its default, so a widget on defaults\n * keeps its plain key.\n */\nexport function optionsCacheSuffix(\n definition: { readonly options?: readonly WidgetOption[] },\n values: OptionValues,\n context: OptionContext = {}\n): string {\n const parts: string[] = [];\n for (const option of definition.options ?? []) {\n if (isClientApplied(option)) continue;\n const value: OptionValue | undefined = values[option.key];\n if (sameValue(value, defaultOptionValue(option, context))) continue;\n parts.push(\n `${option.key}=${encodeURIComponent(JSON.stringify(value ?? null))}`\n );\n }\n parts.sort();\n return parts.length === 0 ? '' : `?${parts.join('&')}`;\n}\n\n// --- Applying client-side options ---------------------------------------------\n\nfunction tableColumnIndex(key: string): number | undefined {\n const match: RegExpMatchArray | null = /^c(\\d+)$/.exec(key);\n return match === null ? undefined : Number(match[1]);\n}\n\nfunction sortBarItems(\n items: readonly BarListItem[],\n sort: DetailSort\n): BarListItem[] {\n const sign: number = sort.direction === 'desc' ? -1 : 1;\n return items\n .map((item, index) => ({ item, index }))\n .sort((a, b) => {\n const order: number =\n sort.column === 'value'\n ? a.item.value - b.item.value\n : a.item.label.localeCompare(b.item.label);\n return order * sign || a.index - b.index;\n })\n .map(({ item }) => item);\n}\n\n/**\n * Applies the options the author marked `apply: 'client'` to a payload: sorts\n * the rows of a TABLE or the items of a BAR_LIST, and trims and reorders the\n * columns of a TABLE. Other payloads, and options whose columns don't fit the\n * payload, come back unchanged. Sorting happens before trimming, so a sort\n * can use a column that is then hidden.\n */\nexport function applyClientOptions(\n definition: { readonly options?: readonly WidgetOption[] },\n data: WidgetData,\n values: OptionValues\n): WidgetData {\n const options: readonly WidgetOption[] = definition.options ?? [];\n const sortOption: WidgetOption | undefined = options.find(\n (o) => o.type === 'sort' && o.apply === 'client'\n );\n const columnsOption: WidgetOption | undefined = options.find(\n (o) => o.type === 'columns' && o.apply === 'client'\n );\n const sortValue: OptionValue | undefined =\n sortOption === undefined ? undefined : values[sortOption.key];\n const columnsValue: OptionValue | undefined =\n columnsOption === undefined ? undefined : values[columnsOption.key];\n let next: WidgetData = data;\n\n if (typeof sortValue === 'string') {\n const sort: DetailSort | undefined = parseSortValue(sortValue);\n if (sort !== undefined && next.kind === 'BAR_LIST') {\n if (sort.column === 'label' || sort.column === 'value') {\n next = { ...next, items: sortBarItems(next.items, sort) };\n }\n } else if (sort !== undefined && next.kind === 'TABLE') {\n const index: number | undefined = tableColumnIndex(sort.column);\n if (index !== undefined && index < next.columns.length) {\n const sorted = queryRows(tableDetailData(next), {\n page: 1,\n pageSize: Math.max(1, next.rows.length),\n sort,\n });\n if (sorted.ok) next = { ...next, rows: sorted.value.rows };\n }\n }\n }\n\n if (Array.isArray(columnsValue) && next.kind === 'TABLE') {\n const table = next;\n const indexes: number[] = (columnsValue as readonly string[])\n .map(tableColumnIndex)\n .filter(\n (index): index is number =>\n index !== undefined && index < table.columns.length\n );\n if (indexes.length > 0) {\n next = {\n ...table,\n columns: indexes.map((i) => table.columns[i] as TableColumn),\n rows: table.rows.map((row) => indexes.map((i) => row[i] as TableCell)),\n };\n }\n }\n return next;\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 colors, 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 * color-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 | 'toolbar'\n | 'pageBar'\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 | 'detail';\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 minimizedWidgets: string;\n /** Edit mode toolbar (`editMode=\"toggle\"`). */\n readonly customize: string;\n readonly done: string;\n readonly reset: string;\n readonly revertChanges: string;\n readonly confirmReset: string;\n readonly confirmRevert: string;\n /** Accessible names of the inline \"✓\" and \"X\" confirmation buttons. */\n readonly confirmYes: string;\n readonly confirmNo: string;\n /** Announced when edit mode starts and ends. */\n readonly editingOn: string;\n readonly editingOff: string;\n /** Names the toolbar group for assistive technology. */\n readonly dashboardControls: string;\n /** The lock icon on a locked card, e.g. \"Revenue is locked\". */\n readonly locked: (title: string) => string;\n /** The lock icon on a card shown to an administrator (`overrideLocks`). */\n readonly lockedForViewers: (title: string) => string;\n /** Pages: names the tab list, and each tab (\"Page 2 of 3: Sales\"). */\n readonly pageBar: string;\n readonly pageTabName: (index: number, count: number, title: string) => string;\n readonly previousPageButton: string;\n readonly nextPageButton: string;\n /** Page management while editing. */\n readonly managePages: string;\n readonly addPage: string;\n readonly renamePage: (title: string) => string;\n readonly pageTitle: string;\n readonly savePageTitle: string;\n readonly cancelPageTitle: string;\n readonly deletePage: (title: string) => string;\n readonly confirmDeletePage: (title: string) => string;\n readonly movePageLeft: (title: string) => string;\n readonly movePageRight: (title: string) => string;\n /** The icon on each card, while editing, that opens its menu of moves. */\n readonly arrangeWidget: (title: string) => string;\n /** Short text of the menu's items (the full names are `moveEarlier` and so on). */\n readonly menuMoveEarlier: string;\n readonly menuMoveLater: string;\n readonly menuHide: string;\n /** The card menu's heading over the pages a widget can move to. */\n readonly moveToPage: (title: string) => string;\n readonly moveToPagePlaceholder: string;\n readonly moveToPageOption: (title: string, rowsFree: number) => string;\n readonly newPageOption: string;\n readonly movedToPage: (title: string, pageTitle: string) => string;\n readonly pageFull: (pageTitle: string, maxRows: number) => string;\n readonly emptyPage: string;\n /** Added to the accessible name of links that open in a new tab. */\n readonly opensInNewTab: string;\n /** The card's View button, opening the detail view. */\n readonly view: (title: string) => string;\n readonly close: string;\n readonly search: string;\n readonly filterBy: (column: string) => string;\n readonly sortBy: (column: string) => string;\n readonly noResults: string;\n /** e.g. \"Showing 1–25 of 312 results\". */\n readonly showingRows: (from: number, to: number, total: number) => string;\n readonly previousPage: string;\n readonly nextPage: string;\n readonly pageOf: (page: number, pageCount: number) => string;\n readonly pagination: 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) => `Minimize ${title}`,\n expand: (title) => `Expand ${title}`,\n moveEarlier: (title) => `Move ${title} earlier`,\n moveLater: (title) => `Move ${title} later`,\n hiddenWidgets: 'Hidden:',\n minimizedWidgets: 'Minimized:',\n customize: 'Customize',\n done: 'Done',\n reset: 'Reset layout',\n revertChanges: 'Revert changes',\n confirmReset: 'Reset the layout to the default?',\n confirmRevert: 'Revert to how this looked before you started editing?',\n confirmYes: 'Yes',\n confirmNo: 'No',\n editingOn:\n 'Editing dashboard. Use the buttons on each card to reorder or hide it.',\n editingOff: 'Finished editing.',\n dashboardControls: 'Dashboard controls',\n locked: (title) => `${title} is locked`,\n lockedForViewers: (title) => `${title} is locked for viewers`,\n pageBar: 'Pages',\n pageTabName: (index, count, title) => `Page ${index} of ${count}: ${title}`,\n previousPageButton: 'Previous page',\n nextPageButton: 'Next page',\n managePages: 'Manage pages',\n addPage: 'Add page',\n renamePage: (title) => `Rename ${title}`,\n pageTitle: 'Page title',\n savePageTitle: 'Save page title',\n cancelPageTitle: 'Cancel renaming',\n deletePage: (title) => `Delete ${title}`,\n confirmDeletePage: (title) =>\n `Delete the page \"${title}\" and move its widgets to another page?`,\n movePageLeft: (title) => `Move ${title} page left`,\n movePageRight: (title) => `Move ${title} page right`,\n arrangeWidget: (title) => `Arrange ${title}`,\n menuMoveEarlier: 'Move earlier',\n menuMoveLater: 'Move later',\n menuHide: 'Hide',\n moveToPage: (title) => `Move ${title} to another page`,\n moveToPagePlaceholder: 'Move to page…',\n moveToPageOption: (title, rowsFree) =>\n `${title} (${rowsFree} ${rowsFree === 1 ? 'row' : 'rows'} free)`,\n newPageOption: 'New page…',\n movedToPage: (title, pageTitle) => `${title} moved to ${pageTitle}`,\n pageFull: (pageTitle, maxRows) =>\n `Page \"${pageTitle}\" is full (${maxRows} rows). Move or hide a widget first.`,\n emptyPage: 'This page has no widgets. Move one here from another page.',\n opensInNewTab: '(opens in a new tab)',\n view: (title) => `View ${title}`,\n close: 'Close',\n search: 'Search',\n filterBy: (column) => `Filter ${column}`,\n sortBy: (column) => `Sort by ${column}`,\n noResults: 'No matching results.',\n showingRows: (from, to, total) => `Showing ${from}–${to} of ${total} results`,\n previousPage: 'Previous',\n nextPage: 'Next',\n pageOf: (page, pageCount) => `Page ${page} of ${pageCount}`,\n pagination: 'Pagination',\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 center 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","import type { ReactNode } from 'react';\n\nimport { isSafeHref, isSafeImageUrl } from '../core/url.js';\nimport { useWidgetSettings } from './settings.js';\n\n/** Whether a link `target` opens a new browsing context (not `_self`). */\nfunction isNewTabTarget(target: string | undefined): boolean {\n return target !== undefined && target !== '' && target !== '_self';\n}\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, labels } = useWidgetSettings();\n if (href === undefined || !isSafeHref(href)) {\n return <span className={className}>{children}</span>;\n }\n const opensNewTab: boolean = isNewTabTarget(linkTarget);\n return (\n <a href={href} target={linkTarget} rel=\"noreferrer\" className={className}>\n {children}\n {opensNewTab && (\n <>\n <svg\n className=\"dwt-external-icon\"\n viewBox=\"0 0 12 12\"\n width=\"1em\"\n height=\"1em\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M7 1h4v4M11 1 5.5 6.5M9 7.5V10a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h2.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className=\"dwt-visually-hidden\"> {labels.opensInNewTab}</span>\n </>\n )}\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 { useId, useState, type ReactNode } from 'react';\n\nimport {\n queryRows,\n tableDetailData,\n type DetailPage,\n type DetailQuery,\n type DetailSort,\n type ResolvedTableControls,\n} from '../core/detail.js';\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 color, so it never relies on color 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 controls,\n initialSort,\n}: {\n readonly data: TableWidgetData;\n /** Search box and sortable headers; see `WidgetDefinition.tableControls`. */\n readonly controls?: ResolvedTableControls | undefined;\n /** The header sort to start with, for example from a `sort` option. */\n readonly initialSort?: DetailSort | undefined;\n}): ReactNode {\n if (controls === undefined) {\n return (\n <div className=\"dwt-table-wrap\">\n <TableView data={data} />\n {data.footer !== undefined && <p className=\"dwt-note\">{data.footer}</p>}\n </div>\n );\n }\n return (\n <InteractiveTable\n data={data}\n controls={controls}\n initialSort={initialSort}\n />\n );\n}\n\nfunction TableView({\n data,\n rows = data.rows,\n sort,\n onSort,\n}: {\n readonly data: TableWidgetData;\n readonly rows?: TableWidgetData['rows'];\n readonly sort?: DetailSort | undefined;\n /** Makes the headers sort buttons. */\n readonly onSort?: ((columnKey: string) => void) | undefined;\n}): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n return (\n <>\n <table className={slot('table', 'dwt-table')}>\n <thead>\n <tr>\n {data.columns.map((column, index) => {\n const key = `c${index}`;\n const sorted: boolean = sort?.column === key;\n return (\n <th\n key={index}\n scope=\"col\"\n className={\n column.numeric === true ? 'dwt-numeric' : undefined\n }\n aria-sort={\n sorted\n ? sort?.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\n }\n >\n {onSort === undefined ? (\n column.label\n ) : (\n <button\n type=\"button\"\n className=\"dwt-detail-sort\"\n aria-label={labels.sortBy(column.label)}\n onClick={() => onSort(key)}\n >\n {column.label}\n <span aria-hidden=\"true\">\n {!sorted\n ? ' ↕'\n : sort?.direction === 'asc'\n ? ' ↑'\n : ' ↓'}\n </span>\n </button>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {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 </>\n );\n}\n\n/** Next sort for a click on a header: ascending, descending, then none. */\nfunction nextTableSort(\n current: DetailSort | undefined,\n column: string\n): DetailSort | undefined {\n if (current?.column !== column) return { column, direction: 'asc' };\n return current.direction === 'asc'\n ? { column, direction: 'desc' }\n : undefined;\n}\n\nfunction InteractiveTable({\n data,\n controls,\n initialSort,\n}: {\n readonly data: TableWidgetData;\n readonly controls: ResolvedTableControls;\n readonly initialSort: DetailSort | undefined;\n}): ReactNode {\n const slot = useSlotClassName();\n const { labels, locale } = useWidgetSettings();\n const searchId: string = useId();\n const [search, setSearch] = useState<string>('');\n const [sort, setSort] = useState<DetailSort | undefined>(initialSort);\n // A changed sort option replaces the header sort (derived state, so no\n // effect and no extra render with stale rows).\n const seed: string =\n initialSort === undefined\n ? ''\n : `${initialSort.column}:${initialSort.direction}`;\n const [seededWith, setSeededWith] = useState<string>(seed);\n if (seededWith !== seed) {\n setSeededWith(seed);\n setSort(initialSort);\n }\n const localeTag: string | undefined =\n typeof locale === 'string' ? locale : locale?.[0];\n\n const query: DetailQuery = {\n page: 1,\n pageSize: Math.max(1, data.rows.length),\n ...(controls.search && search !== '' ? { search } : {}),\n ...(controls.sort && sort !== undefined ? { sort } : {}),\n };\n const result = queryRows(tableDetailData(data), query, localeTag);\n const page: DetailPage | undefined = result.ok ? result.value : undefined;\n\n return (\n <div className=\"dwt-table-wrap\">\n {controls.search && (\n <div className=\"dwt-table-search\">\n <label htmlFor={searchId} className=\"dwt-visually-hidden\">\n {labels.search}\n </label>\n <input\n id={searchId}\n type=\"search\"\n placeholder={labels.search}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n )}\n {result.ok ? (\n <>\n <p\n className=\"dwt-visually-hidden\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {page !== undefined && page.totalRows === 0\n ? labels.noResults\n : page === undefined\n ? ''\n : labels.showingRows(1, page.rows.length, page.totalRows)}\n </p>\n <TableView\n data={data}\n rows={page?.rows ?? data.rows}\n sort={sort}\n onSort={\n controls.sort\n ? (column) => setSort(nextTableSort(sort, column))\n : undefined\n }\n />\n {page !== undefined && page.totalRows === 0 && (\n <p className=\"dwt-note\">{labels.noResults}</p>\n )}\n </>\n ) : (\n <p role=\"alert\" className={slot('error', 'dwt-error')}>\n {result.error}\n </p>\n )}\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 color (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 tableControls,\n initialSort,\n}: {\n readonly data: WidgetData;\n /** Search and sort for TABLE data; see `resolveTableControls`. */\n readonly tableControls?: ResolvedTableControls | undefined;\n /** TABLE header sort to start with; see `sortFromOptions`. */\n readonly initialSort?: DetailSort | undefined;\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 (\n <TableWidget\n data={data}\n controls={tableControls}\n initialSort={initialSort}\n />\n );\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 CSSProperties, type ReactNode } from 'react';\n\nimport type { WidgetFill, WidgetSize } from '../core/definition.js';\nimport { resolveTableControls } from '../core/detail.js';\nimport { fillsHeight, fillsWidth } from '../core/grid.js';\nimport { sortFromOptions } from '../core/options.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 minimize toggle. */\n readonly actions?: ReactNode;\n readonly minimized?: boolean;\n /** Shows the minimize/expand toggle when given. */\n readonly onToggleMinimized?: () => void;\n /**\n * Opens the widget's detail view. Adds a \"View\" icon button to the header\n * actions and makes the title clickable (for mouse and touch; the button is\n * the accessible control).\n */\n readonly onView?: () => 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 /** Fill free space in the grid row (height, width or both). */\n readonly fill?: WidgetFill;\n /**\n * Explicit grid column span, set by `Dashboard` and `WidgetGrid` to give a\n * width-filling card the columns left over in its row.\n */\n readonly columnSpan?: number;\n /** 12-column width (see `WidgetDefinition.width`); sets `--dwt-width`. */\n readonly width?: number;\n /**\n * The widget's key, rendered as `data-widget-key` so `useWidgets` can tell\n * which card scrolled into view. `ResolvedWidgetCard` sets it for you.\n */\n readonly widgetKey?: string;\n /** Marks the card as being edited (dashed outline); set by `Dashboard`. */\n readonly editing?: boolean;\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 minimize toggle, and loading, empty and error states.\n */\nexport function WidgetCard({\n title,\n description,\n actions,\n minimized = false,\n onToggleMinimized,\n onView,\n status = 'ok',\n emptyText,\n error,\n onRetry,\n footer,\n size,\n fill,\n columnSpan,\n width,\n widgetKey,\n editing = false,\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 editing && 'dwt-card--editing',\n size !== undefined && `dwt-card--size-${size}`,\n fillsHeight(fill) && 'dwt-card--fill-height',\n fillsWidth(fill) && 'dwt-card--fill-width',\n className\n )}\n {...(widgetKey === undefined ? {} : { 'data-widget-key': widgetKey })}\n {...(columnSpan === undefined && width === undefined\n ? {}\n : {\n style: {\n ...(width === undefined ? {} : { '--dwt-width': width }),\n ...(columnSpan === undefined\n ? {}\n : { gridColumn: `span ${columnSpan}` }),\n } as CSSProperties,\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 {onView === undefined ? (\n title\n ) : (\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"dwt-card-title-button\"\n onClick={onView}\n >\n {title}\n </button>\n )}\n </Heading>\n {description !== undefined && !minimized && (\n <p className={slot('cardDescription', 'dwt-card-description')}>\n {description}\n </p>\n )}\n </div>\n {(actions !== undefined ||\n onToggleMinimized !== undefined ||\n onView !== undefined) && (\n <div className={slot('cardActions', 'dwt-card-actions')}>\n {onView !== undefined && (\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.view(title)}\n title={labels.view(title)}\n onClick={onView}\n >\n <svg\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M1 8s2.6-4.5 7-4.5S15 8 15 8s-2.6 4.5-7 4.5S1 8 1 8Z\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"8\" cy=\"8\" r=\"2.1\" fill=\"currentColor\" />\n </svg>\n </button>\n )}\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 /** See `WidgetCardProps.columnSpan`. */\n readonly columnSpan?: number;\n /** 12-column width (see `WidgetDefinition.width`); sets `--dwt-width`. */\n readonly width?: number;\n readonly actions?: ReactNode;\n readonly minimized?: boolean;\n readonly onToggleMinimized?: () => void;\n /** See `WidgetCardProps.onView`. */\n readonly onView?: () => void;\n readonly onRetry?: () => void;\n /** See `WidgetCardProps.editing`. */\n readonly editing?: boolean;\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 widgetKey={definition.key}\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 {...(definition.fill === undefined ? {} : { fill: definition.fill })}\n {...(widget.status === 'empty' ? { emptyText: widget.emptyText } : {})}\n {...(widget.status === 'error' ? { error: widget.error } : {})}\n >\n {widget.status === 'ok' ? (\n <WidgetContent\n data={widget.data}\n tableControls={resolveTableControls(definition)}\n initialSort={sortFromOptions(definition, widget.options)}\n />\n ) : null}\n </WidgetCard>\n );\n}\n","import type { WidgetDetailOptions, WidgetTableControls } from './detail.js';\nimport type { WidgetOption } from './options.js';\nimport type { WidgetKind } from './payload.js';\n\n/** A size hint for grid layouts; renderers may map it to column spans. */\nexport const WIDGET_SIZES = ['small', 'medium', 'large', 'full'] as const;\n\nexport type WidgetSize = (typeof WIDGET_SIZES)[number];\n\n/**\n * How a widget fills free space in a grid layout. `height` stretches it to\n * the height of its row; `width` widens it to take the columns left over in\n * its row; `both` does both. Absent, a widget is only as big as its content\n * and `defaultSize`.\n */\nexport const WIDGET_FILLS = ['height', 'width', 'both'] as const;\n\nexport type WidgetFill = (typeof WIDGET_FILLS)[number];\n\n/**\n * What a widget is, independent of its data. Mirrors Maker Toolkit's\n * `widget` table (`widget_key`, `title`, `description`, `view_type`,\n * `roles`, `sort_order`, `active`).\n */\nexport interface WidgetDefinition {\n /** Stable, unique id. Layouts and providers are keyed by it. */\n readonly key: string;\n readonly title: string;\n readonly description?: string;\n readonly kind: WidgetKind;\n /** Lower comes first. Default 0; ties keep definition order. */\n readonly sortOrder?: number;\n /** Roles allowed to see it. Absent or empty means everyone. */\n readonly roles?: readonly string[];\n /** False hides it from every user. Default true. */\n readonly active?: boolean;\n readonly defaultSize?: WidgetSize;\n /**\n * Share of the row the widget takes, in twelfths: an integer from 2 to 12\n * (6 is half the row, 12 the whole row). When any widget in a grid sets\n * it, the grid becomes 12 columns wide and widgets without a `width` use\n * the one their `defaultSize` implies (see `widthForSize`). Narrow grids\n * give widgets more room automatically.\n */\n readonly width?: number;\n /**\n * Gives the widget a detail view: a full list with sorting, filtering and\n * paging. `true` uses defaults. The data comes from a detail provider.\n */\n readonly detail?: boolean | WidgetDetailOptions;\n /**\n * TABLE widgets only: a search box and sortable column headers in the card\n * itself, working on the rows the card holds. `true` turns on both. With a\n * `footer` (rows were left out) they only see the rows shown; use `detail`\n * for the full list.\n */\n readonly tableControls?: boolean | WidgetTableControls;\n /** Fill free space in the row (height, width or both). Default: none. */\n readonly fill?: WidgetFill;\n /**\n * Keeps viewers from rearranging this widget. `true` locks everything:\n * move, hide and minimize. Use an object to lock only some; fields left out\n * are not locked.\n */\n readonly locked?: boolean | WidgetLock;\n /**\n * The widget's home page in a paged dashboard: a page key or title. A\n * widget no page lists yet (and a widget locked against moving) shows here;\n * without it, on the first page. Ignored when the layout has no pages.\n */\n readonly page?: string;\n /**\n * Choices the author offers, with defaults: a default sort, \"top N\", a\n * period, which columns show. The chosen values reach your provider as\n * `ProviderOptions.options`. See `options.ts`.\n */\n readonly options?: readonly WidgetOption[];\n}\n\n/** What a viewer may not do to a locked widget. */\nexport interface WidgetLock {\n /** Can't be reordered, and holds its place (a pinned slot). */\n readonly move?: boolean;\n /** Can't be hidden. */\n readonly hide?: boolean;\n /** Can't be collapsed to its header. */\n readonly minimize?: boolean;\n}\n\n/** `WidgetLock` with every default filled in. */\nexport type ResolvedWidgetLock = Required<WidgetLock>;\n\nconst NOT_LOCKED: ResolvedWidgetLock = Object.freeze({\n move: false,\n hide: false,\n minimize: false,\n});\nconst FULLY_LOCKED: ResolvedWidgetLock = Object.freeze({\n move: true,\n hide: true,\n minimize: true,\n});\n\n/**\n * Reads a widget's `locked` setting with defaults: `true` locks move, hide\n * and minimize, an object locks the fields it sets to `true`, and anything\n * else (absent, `false`) locks nothing.\n */\nexport function resolveWidgetLock(\n definition: Pick<WidgetDefinition, 'locked'>\n): ResolvedWidgetLock {\n const setting: boolean | WidgetLock | undefined = definition.locked;\n if (setting === true) return FULLY_LOCKED;\n if (setting === undefined || setting === false) return NOT_LOCKED;\n return {\n move: setting.move === true,\n hide: setting.hide === true,\n minimize: setting.minimize === true,\n };\n}\n\n/**\n * Identity helper that keeps the literal `kind` (so typed providers can be\n * checked against it) and gives a definition its type without a cast.\n */\nexport function defineWidget<const D extends WidgetDefinition>(\n definition: D\n): D {\n return definition;\n}\n\n/** Definitions sorted by `sortOrder` (stable: ties keep their input order). */\nexport function sortDefinitions<D extends WidgetDefinition>(\n definitions: readonly D[]\n): D[] {\n return definitions\n .map((definition, index) => ({ definition, index }))\n .sort(\n (a, b) =>\n (a.definition.sortOrder ?? 0) - (b.definition.sortOrder ?? 0) ||\n a.index - b.index\n )\n .map(({ definition }) => definition);\n}\n\n/** Whether a widget is active and visible to someone with these roles. */\nexport function isWidgetVisibleTo(\n definition: WidgetDefinition,\n roles: readonly string[] | undefined\n): boolean {\n if (definition.active === false) {\n return false;\n }\n if (definition.roles === undefined || definition.roles.length === 0) {\n return true;\n }\n if (roles === undefined) {\n return false;\n }\n return definition.roles.some((role) => roles.includes(role));\n}\n","/**\n * A viewer's dashboard customization: order, hidden and minimized 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\nimport { resolveWidgetLock, type WidgetLock } from './definition.js';\n\n/** What layout functions need from a widget definition. */\nexport interface LayoutItem {\n readonly key: string;\n readonly sortOrder?: number;\n /** See `WidgetDefinition.locked`. Pinned widgets hold their slot. */\n readonly locked?: boolean | WidgetLock;\n /** See `WidgetDefinition.page`: the widget's home page. */\n readonly page?: string;\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 * Pages of widgets. Absent, the lists above are the one and only page. With\n * pages, each page owns its own lists and the top-level lists are left\n * empty. See `pages.ts`.\n */\n readonly pages?: readonly LayoutPage[];\n}\n\n/** One page of a paged layout: the same lists as a layout, plus a name. */\nexport interface LayoutPage {\n /** Unique within the layout and stable when the page is renamed or moved. */\n readonly key: string;\n /** Shown in the page bar. At most `MAX_PAGE_TITLE_LENGTH` characters. */\n readonly title: string;\n readonly order: readonly string[];\n readonly hidden: readonly string[];\n readonly minimized: readonly string[];\n /** Rows this page holds, overriding the dashboard's default. */\n readonly maxRows?: number;\n}\n\n/** Longest page title; longer saved titles are cut. */\nexport const MAX_PAGE_TITLE_LENGTH = 30;\n/**\n * Most pages `parseLayout` keeps: a safety ceiling against malformed or\n * hostile JSON, not a product limit.\n */\nexport const MAX_PARSED_PAGES = 50;\n/** Most rows a page may be given with `maxRows`. */\nexport const MAX_PAGE_ROWS = 20;\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 const pages: LayoutPage[] = parsePages(record['pages']);\n if (pages.length > 0) {\n // With pages, the pages own placement and the top-level lists stay empty.\n return {\n order: EMPTY_LAYOUT.order,\n hidden: EMPTY_LAYOUT.hidden,\n minimized: EMPTY_LAYOUT.minimized,\n pages,\n };\n }\n if (order.length === 0 && hidden.length === 0 && minimized.length === 0) {\n return EMPTY_LAYOUT;\n }\n return { order, hidden, minimized };\n}\n\nfunction parsePages(value: unknown): LayoutPage[] {\n if (!Array.isArray(value)) return [];\n const pages: LayoutPage[] = [];\n const keys = new Set<string>();\n for (const entry of value.slice(0, MAX_PARSED_PAGES)) {\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {\n continue;\n }\n const record = entry as Readonly<Record<string, unknown>>;\n const key: unknown = record['key'];\n if (typeof key !== 'string' || key === '' || keys.has(key)) continue;\n keys.add(key);\n const rawTitle: unknown = record['title'];\n const title: string =\n typeof rawTitle === 'string' && rawTitle.trim() !== ''\n ? rawTitle.trim().slice(0, MAX_PAGE_TITLE_LENGTH)\n : `Page ${pages.length + 1}`;\n const maxRows: unknown = record['maxRows'];\n // A widget lives on one page: the first page that holds it keeps it.\n const held = new Set<string>();\n for (const earlier of pages) {\n for (const k of [...earlier.order, ...earlier.hidden]) held.add(k);\n }\n const keep = (list: unknown): string[] =>\n uniqueStrings(list).filter((k) => !held.has(k));\n pages.push({\n key,\n title,\n order: keep(record['order']),\n hidden: keep(record['hidden']),\n minimized: keep(record['minimized']),\n ...(typeof maxRows === 'number' &&\n Number.isInteger(maxRows) &&\n maxRows >= 1 &&\n maxRows <= MAX_PAGE_ROWS\n ? { maxRows }\n : {}),\n });\n }\n return pages;\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 ...(layout.pages === undefined || layout.pages.length === 0\n ? {}\n : {\n pages: layout.pages.map((page) => ({\n key: page.key,\n title: page.title,\n order: [...page.order],\n hidden: [...page.hidden],\n minimized: [...page.minimized],\n ...(page.maxRows === undefined ? {} : { maxRows: page.maxRows }),\n })),\n }),\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\nfunction isPinned(item: LayoutItem): boolean {\n return resolveWidgetLock(item).move;\n}\n\n/**\n * The visible widgets in the viewer's order, ignoring locks: saved keys first\n * (when still present), then widgets the layout doesn't know yet, by\n * sortOrder.\n */\nfunction viewerOrder<T extends LayoutItem>(\n visible: readonly T[],\n layout: DashboardLayout\n): T[] {\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/**\n * Lays `free` widgets out around the pinned ones. A pinned widget keeps its\n * slot: its index among the visible widgets in `sortOrder` order. Free\n * widgets fill the remaining slots, left to right.\n */\nfunction placeAroundPinned<T extends LayoutItem>(\n visible: readonly T[],\n free: readonly T[]\n): T[] {\n const slots: (T | undefined)[] = bySortOrder(visible).map((item) =>\n isPinned(item) ? item : undefined\n );\n let next = 0;\n return slots.map((pinned) => pinned ?? (free[next++] as T));\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. Widgets locked against moving are pinned: each keeps its\n * place from the definitions (never from `layout.order`) and the others\n * rearrange around it.\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 ordered: T[] = viewerOrder(visible, layout);\n if (!visible.some(isPinned)) return ordered;\n return placeAroundPinned(\n visible,\n ordered.filter((item) => !isPinned(item))\n );\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, the index is out of range,\n * or the move isn't allowed: a pinned widget can't move, and nothing can be\n * moved onto a pinned slot. Free widgets keep their relative order around\n * pinned ones, so a move that crosses a pinned slot lands on the nearest\n * free slot you named.\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: T[] = visibleWidgets(definitions, layout);\n const fromIndex: number = current.findIndex((d) => d.key === key);\n const mover: T | undefined = current[fromIndex];\n if (\n mover === undefined ||\n !Number.isInteger(toIndex) ||\n toIndex < 0 ||\n toIndex >= current.length ||\n toIndex === fromIndex ||\n isPinned(mover) ||\n isPinned(current[toIndex] as T)\n ) {\n return layout;\n }\n const freeSlots: number[] = freeSlotIndexes(current);\n const free: T[] = current.filter((item) => !isPinned(item));\n const fromFree: number = freeSlots.indexOf(fromIndex);\n const toFree: number = freeSlots.indexOf(toIndex);\n free.splice(fromFree, 1);\n free.splice(toFree, 0, mover);\n const next: T[] = placeAroundPinned(current, free);\n return { ...layout, order: next.map((d) => d.key) };\n}\n\n/** Indexes of the slots in `ordered` that are not pinned. */\nfunction freeSlotIndexes(ordered: readonly LayoutItem[]): number[] {\n const slots: number[] = [];\n ordered.forEach((item, index) => {\n if (!isPinned(item)) slots.push(index);\n });\n return slots;\n}\n\n/**\n * Moves `key` by `offset` places (negative is earlier). Pinned slots are\n * stepped over, not counted, and the move is clamped at the first and last\n * free slot.\n */\nexport function moveWidgetBy<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string,\n offset: number\n): DashboardLayout {\n const current: T[] = visibleWidgets(definitions, layout);\n const fromIndex: number = current.findIndex((d) => d.key === key);\n if (fromIndex === -1) return layout;\n const freeSlots: number[] = freeSlotIndexes(current);\n const fromFree: number = freeSlots.indexOf(fromIndex);\n if (fromFree === -1) return layout;\n const toFree: number = Math.max(\n 0,\n Math.min(freeSlots.length - 1, fromFree + Math.trunc(offset))\n );\n return moveWidget(definitions, layout, key, freeSlots[toFree] as number);\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 minimized 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 minimized. */\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 minimized. */\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/** Minimizes 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[]): readonly string[] =>\n keys.every((k) => known.has(k)) ? keys : keys.filter((k) => known.has(k));\n return mapLayoutLists(layout, (lists) => ({\n order: keep(lists.order),\n hidden: keep(lists.hidden),\n minimized: keep(lists.minimized),\n }));\n}\n\n/** The three lists a layout and each of its pages carry. */\ninterface LayoutLists {\n readonly order: readonly string[];\n readonly hidden: readonly string[];\n readonly minimized: readonly string[];\n}\n\n/**\n * Applies `change` to the top-level lists and to each page's lists. Returns\n * the same object when no list changed (compared by identity, so `change`\n * should return the same arrays it was given when it has nothing to do).\n */\nfunction mapLayoutLists(\n layout: DashboardLayout,\n change: (lists: LayoutLists) => LayoutLists\n): DashboardLayout {\n const top: LayoutLists = change(layout);\n const pages: LayoutPage[] | undefined = layout.pages?.map((page) => {\n const next: LayoutLists = change(page);\n return next.order === page.order &&\n next.hidden === page.hidden &&\n next.minimized === page.minimized\n ? page\n : { ...page, ...next };\n });\n const pagesChanged: boolean =\n pages !== undefined && pages.some((page, i) => page !== layout.pages?.[i]);\n if (\n top.order === layout.order &&\n top.hidden === layout.hidden &&\n top.minimized === layout.minimized &&\n !pagesChanged\n ) {\n return layout;\n }\n return {\n ...layout,\n ...top,\n ...(pages === undefined ? {} : { pages }),\n };\n}\n\n/** Options for `enforceLocks`. */\nexport interface EnforceLocksOptions {\n /**\n * Skip enforcement. Set it server-side only for a user who may rearrange\n * locked widgets (an administrator editing the default layout), never from\n * a flag the client sends.\n */\n readonly overrideLocks?: boolean;\n}\n\n/**\n * Removes whatever a widget's lock forbids from a layout: a hide-locked key\n * leaves `hidden`, a minimize-locked key leaves `minimized`, and a\n * move-locked key leaves `order` (a pinned widget's place comes from the\n * definitions). Idempotent; returns the same object when nothing changes.\n * Run it on a layout a client sends before saving it.\n */\nexport function enforceLocks<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n options: EnforceLocksOptions = {}\n): DashboardLayout {\n if (options.overrideLocks === true) return layout;\n const noMove = new Set<string>();\n const noHide = new Set<string>();\n const noMinimize = new Set<string>();\n for (const definition of definitions) {\n const lock = resolveWidgetLock(definition);\n if (lock.move) noMove.add(definition.key);\n if (lock.hide) noHide.add(definition.key);\n if (lock.minimize) noMinimize.add(definition.key);\n }\n const without = (keys: readonly string[], drop: ReadonlySet<string>) =>\n keys.some((key) => drop.has(key))\n ? keys.filter((key) => !drop.has(key))\n : keys;\n return mapLayoutLists(layout, (lists) => ({\n order: without(lists.order, noMove),\n hidden: without(lists.hidden, noHide),\n minimized: without(lists.minimized, noMinimize),\n }));\n}\n","/**\n * Pages of widgets: a dashboard split into pages, like the home screens of a\n * phone. Each page is a small layout (order, hidden, minimized) with a name\n * and a capacity of `maxRows` rows of 12 columns. Pure functions, in the\n * style of `layout.ts`: inputs are never mutated, a refusal is a `Result`\n * with a specific message, and a no-op returns the same object.\n *\n * A layout without `pages` has one implicit page (`DEFAULT_PAGE_KEY`), so\n * everything here also works on layouts saved before pages existed.\n */\n\nimport { resolveWidgetLock } from './definition.js';\nimport { placeRows, fitCount, type GridItem } from './grid.js';\nimport {\n enforceLocks,\n MAX_PAGE_ROWS,\n MAX_PAGE_TITLE_LENGTH,\n MAX_PARSED_PAGES,\n pruneLayout,\n visibleWidgets,\n type DashboardLayout,\n type LayoutItem,\n type LayoutPage,\n} from './layout.js';\nimport { err, ok, type Result } from './result.js';\n\n/** The key of the implicit page of a layout that has no `pages`. */\nexport const DEFAULT_PAGE_KEY = 'default';\n/** Rows a page holds unless it (or the dashboard) says otherwise. */\nexport const DEFAULT_PAGE_ROWS = 4;\n\n/** What the page functions need from a widget definition. */\nexport type PageItem = LayoutItem &\n GridItem & {\n /** Used in messages; the key stands in when absent. */\n readonly title?: string;\n };\n\nexport interface PageOptions {\n /** Rows a page holds when it has no `maxRows` of its own. Default 4. */\n readonly maxRows?: number;\n}\n\nfunction rowsAllowed(page: LayoutPage, options: PageOptions): number {\n const rows: number = page.maxRows ?? options.maxRows ?? DEFAULT_PAGE_ROWS;\n return Math.max(1, Math.min(MAX_PAGE_ROWS, Math.floor(rows)));\n}\n\n/** Whether the layout has pages of its own (rather than one implicit page). */\nexport function hasPages(layout: DashboardLayout): boolean {\n return layout.pages !== undefined && layout.pages.length > 0;\n}\n\n/**\n * The layout's pages. A layout without `pages` has one implicit page called\n * \"Page 1\" made from its top-level lists.\n */\nexport function pageList(layout: DashboardLayout): readonly LayoutPage[] {\n if (layout.pages !== undefined && layout.pages.length > 0) {\n return layout.pages;\n }\n return [\n {\n key: DEFAULT_PAGE_KEY,\n title: 'Page 1',\n order: layout.order,\n hidden: layout.hidden,\n minimized: layout.minimized,\n },\n ];\n}\n\n/** Turns an implicit single page into an explicit one, so it can be edited. */\nfunction withExplicitPages(layout: DashboardLayout): DashboardLayout {\n if (hasPages(layout)) return layout;\n return {\n ...layout,\n order: [],\n hidden: [],\n minimized: [],\n pages: pageList(layout),\n };\n}\n\nfunction sameKeys(a: readonly string[], b: readonly string[]): boolean {\n return a === b || (a.length === b.length && a.every((k, i) => k === b[i]));\n}\n\n/**\n * One page as an ordinary layout, so every function in `layout.ts` (move,\n * hide, minimize, `visibleWidgets`) works on it unchanged. For a layout with\n * no pages this is the layout itself. Undefined for an unknown page.\n */\nexport function pageLayout(\n layout: DashboardLayout,\n pageKey: string\n): DashboardLayout | undefined {\n if (!hasPages(layout))\n return pageKey === DEFAULT_PAGE_KEY ? layout : undefined;\n const page: LayoutPage | undefined = layout.pages?.find(\n (p) => p.key === pageKey\n );\n if (page === undefined) return undefined;\n const { pages, ...rest } = layout;\n void pages;\n return {\n ...rest,\n order: page.order,\n hidden: page.hidden,\n minimized: page.minimized,\n };\n}\n\n/**\n * Writes a page's layout (changed with the functions in `layout.ts`) back\n * into the whole layout. Returns the same object when nothing changed or the\n * page doesn't exist.\n */\nexport function withPageLayout(\n layout: DashboardLayout,\n pageKey: string,\n next: DashboardLayout\n): DashboardLayout {\n const current: DashboardLayout | undefined = pageLayout(layout, pageKey);\n if (\n current === undefined ||\n (sameKeys(current.order, next.order) &&\n sameKeys(current.hidden, next.hidden) &&\n sameKeys(current.minimized, next.minimized))\n ) {\n return layout;\n }\n if (!hasPages(layout)) {\n return {\n ...layout,\n order: next.order,\n hidden: next.hidden,\n minimized: next.minimized,\n };\n }\n return {\n ...layout,\n pages: (layout.pages ?? []).map((page) =>\n page.key === pageKey\n ? {\n ...page,\n order: next.order,\n hidden: next.hidden,\n minimized: next.minimized,\n }\n : page\n ),\n };\n}\n\nfunction normalizedTitle(title: string): string {\n return title.trim().normalize('NFKC').toLowerCase();\n}\n\n/** The key of the page a `page` reference names: a key, else a title. */\nexport function resolvePageKey(\n layout: DashboardLayout,\n reference: string | undefined\n): string | undefined {\n if (reference === undefined || reference === '') return undefined;\n const pages: readonly LayoutPage[] = pageList(layout);\n const byKey: LayoutPage | undefined = pages.find((p) => p.key === reference);\n if (byKey !== undefined) return byKey.key;\n const wanted: string = normalizedTitle(reference);\n return pages.find((p) => normalizedTitle(p.title) === wanted)?.key;\n}\n\nfunction homePageKey(layout: DashboardLayout, item: LayoutItem): string {\n return (\n resolvePageKey(layout, item.page) ?? (pageList(layout)[0] as LayoutPage).key\n );\n}\n\n/**\n * Which page each widget shows on: the page that lists it (in its order or\n * hidden list), else its home page (`definition.page`, else the first page).\n * A widget locked against moving always shows on its home page, so a viewer's\n * saved layout can't move it. Definitions keep their input order.\n */\nexport function assignPages<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout\n): Map<string, T[]> {\n const pages: readonly LayoutPage[] = pageList(layout);\n const assigned = new Map<string, T[]>(pages.map((p) => [p.key, []]));\n for (const definition of definitions) {\n let pageKey: string | undefined;\n if (!resolveWidgetLock(definition).move) {\n pageKey = pages.find(\n (p) =>\n p.order.includes(definition.key) || p.hidden.includes(definition.key)\n )?.key;\n }\n assigned.get(pageKey ?? homePageKey(layout, definition))?.push(definition);\n }\n return assigned;\n}\n\n/** The key of the page a widget shows on; undefined if it isn't a definition. */\nexport function pageOf<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string\n): string | undefined {\n for (const [pageKey, widgets] of assignPages(definitions, layout)) {\n if (widgets.some((w) => w.key === key)) return pageKey;\n }\n return undefined;\n}\n\n/** A page's visible widgets, in display order (minimized ones included). */\nexport function pageWidgets<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n pageKey: string\n): T[] {\n const onPage: T[] = assignPages(definitions, layout).get(pageKey) ?? [];\n const view: DashboardLayout | undefined = pageLayout(layout, pageKey);\n return view === undefined ? [] : visibleWidgets(onPage, view);\n}\n\n/** How full a page is. */\nexport interface PageRoom {\n readonly maxRows: number;\n readonly rowsUsed: number;\n readonly rowsFree: number;\n}\n\n/** Rows a page allows, uses and has left, as the grid will draw them. */\nexport function pageRoom<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n pageKey: string,\n options: PageOptions = {}\n): PageRoom | undefined {\n const page: LayoutPage | undefined = pageList(layout).find(\n (p) => p.key === pageKey\n );\n if (page === undefined) return undefined;\n const maxRows: number = rowsAllowed(page, options);\n const rowsUsed: number = placeRows(\n pageWidgets(definitions, layout, pageKey)\n ).length;\n return { maxRows, rowsUsed, rowsFree: Math.max(0, maxRows - rowsUsed) };\n}\n\nfunction describePage(page: LayoutPage): string {\n return `Page \"${page.title}\"`;\n}\n\nfunction titleOf(item: PageItem): string {\n return item.title ?? item.key;\n}\n\n/** Checks a page title: not empty, short enough, not used by another page. */\nfunction checkTitle(\n layout: DashboardLayout,\n title: string,\n exceptKey?: string\n): Result<string> {\n const trimmed: string = title.trim();\n if (trimmed === '') return err('A page title must not be empty.');\n if (trimmed.length > MAX_PAGE_TITLE_LENGTH) {\n return err(\n `Page title \"${trimmed}\" is ${trimmed.length} characters; the most is ${MAX_PAGE_TITLE_LENGTH}.`\n );\n }\n const wanted: string = normalizedTitle(trimmed);\n const clash: LayoutPage | undefined = pageList(layout).find(\n (p) => p.key !== exceptKey && normalizedTitle(p.title) === wanted\n );\n if (clash !== undefined) {\n return err(`Another page is already called \"${clash.title}\".`);\n }\n return ok(trimmed);\n}\n\n/** The first `page-N` key no page uses. */\nexport function nextPageKey(layout: DashboardLayout): string {\n const keys = new Set<string>(pageList(layout).map((p) => p.key));\n let n = 1;\n while (keys.has(`page-${n}`)) n += 1;\n return `page-${n}`;\n}\n\n/** The first \"Page N\" title no page uses. */\nfunction nextPageTitle(layout: DashboardLayout): string {\n const used = new Set<string>(\n pageList(layout).map((p) => normalizedTitle(p.title))\n );\n let n: number = pageList(layout).length + 1;\n while (used.has(normalizedTitle(`Page ${n}`))) n += 1;\n return `Page ${n}`;\n}\n\nexport interface AddPageOptions {\n /** The new page's title. Default: the next free \"Page N\". */\n readonly title?: string;\n /** The new page's key. Default: the next free `page-N`. */\n readonly key?: string;\n}\n\n/**\n * Adds an empty page after the last one. A layout without pages gains an\n * explicit first page holding everything it had.\n */\nexport function addPage(\n layout: DashboardLayout,\n options: AddPageOptions = {}\n): Result<DashboardLayout> {\n if (pageList(layout).length >= MAX_PARSED_PAGES) {\n return err(\n `The layout already has ${MAX_PARSED_PAGES} pages, the most it can keep.`\n );\n }\n const key: string = options.key ?? nextPageKey(layout);\n if (pageList(layout).some((p) => p.key === key)) {\n return err(`A page with the key \"${key}\" already exists.`);\n }\n const title: Result<string> = checkTitle(\n layout,\n options.title ?? nextPageTitle(layout)\n );\n if (!title.ok) return title;\n const base: DashboardLayout = withExplicitPages(layout);\n const page: LayoutPage = {\n key,\n title: title.value,\n order: [],\n hidden: [],\n minimized: [],\n };\n return ok({ ...base, pages: [...(base.pages ?? []), page] });\n}\n\n/** Renames a page. The same layout comes back when the title is unchanged. */\nexport function renamePage(\n layout: DashboardLayout,\n pageKey: string,\n title: string\n): Result<DashboardLayout> {\n const page: LayoutPage | undefined = pageList(layout).find(\n (p) => p.key === pageKey\n );\n if (page === undefined) return err(`Page \"${pageKey}\" doesn't exist.`);\n const checked: Result<string> = checkTitle(layout, title, pageKey);\n if (!checked.ok) return checked;\n if (checked.value === page.title) return ok(layout);\n const base: DashboardLayout = withExplicitPages(layout);\n return ok({\n ...base,\n pages: (base.pages ?? []).map((p) =>\n p.key === pageKey ? { ...p, title: checked.value } : p\n ),\n });\n}\n\n/**\n * Moves a page `offset` places (negative is earlier), clamped at the ends.\n * Returns the same layout when nothing moves.\n */\nexport function movePage(\n layout: DashboardLayout,\n pageKey: string,\n offset: number\n): DashboardLayout {\n const pages: readonly LayoutPage[] = layout.pages ?? [];\n const from: number = pages.findIndex((p) => p.key === pageKey);\n if (from === -1) return layout;\n const to: number = Math.max(\n 0,\n Math.min(pages.length - 1, from + Math.trunc(offset))\n );\n if (to === from) return layout;\n const next: LayoutPage[] = [...pages];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved as LayoutPage);\n return { ...layout, pages: next };\n}\n\nfunction overflowing<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n options: PageOptions\n): LayoutPage | undefined {\n return pageList(layout).find(\n (page) =>\n placeRows(pageWidgets(definitions, layout, page.key)).length >\n rowsAllowed(page, options)\n );\n}\n\n/**\n * Removes a page. Its widgets move to the end of the previous page (the next\n * one when it was first), keeping their hidden and minimized state. Refused\n * for the only page, and when the widgets wouldn't fit on the pages left.\n */\nexport function removePage<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n pageKey: string,\n options: PageOptions = {}\n): Result<DashboardLayout> {\n const pages: readonly LayoutPage[] = pageList(layout);\n const index: number = pages.findIndex((p) => p.key === pageKey);\n const page: LayoutPage | undefined = pages[index];\n if (page === undefined) return err(`Page \"${pageKey}\" doesn't exist.`);\n if (pages.length === 1) {\n return err(\n `${describePage(page)} is the only page, so it can't be removed.`\n );\n }\n const target: LayoutPage = pages[index > 0 ? index - 1 : 1] as LayoutPage;\n const merged: DashboardLayout = {\n ...layout,\n pages: pages\n .filter((p) => p.key !== pageKey)\n .map((p) =>\n p.key === target.key\n ? {\n ...p,\n order:\n index > 0\n ? [...p.order, ...page.order]\n : [...page.order, ...p.order],\n hidden: [...p.hidden, ...page.hidden],\n minimized: [...p.minimized, ...page.minimized],\n }\n : p\n ),\n };\n const full: LayoutPage | undefined = overflowing(\n definitions,\n merged,\n options\n );\n if (full !== undefined) {\n return err(\n `${describePage(page)} has widgets that don't fit on the other pages (${describePage(full)} would need more than ${rowsAllowed(full, options)} rows). Move or hide some first.`\n );\n }\n return ok(merged);\n}\n\nfunction without(keys: readonly string[], key: string): readonly string[] {\n return keys.includes(key) ? keys.filter((k) => k !== key) : keys;\n}\n\n/**\n * Moves a widget to the end of another page, keeping its hidden and\n * minimized state. Refused for an unknown widget or page, for a widget locked\n * against moving, and when a visible widget wouldn't fit in the page's rows.\n */\nexport function moveWidgetToPage<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n widgetKey: string,\n targetKey: string,\n options: PageOptions = {}\n): Result<DashboardLayout> {\n const widget: T | undefined = definitions.find((d) => d.key === widgetKey);\n if (widget === undefined) {\n return err(\n `Widget \"${widgetKey}\" isn't one of the widgets, so it can't be moved to a page.`\n );\n }\n const pages: readonly LayoutPage[] = pageList(layout);\n const target: LayoutPage | undefined = pages.find((p) => p.key === targetKey);\n if (target === undefined) return err(`Page \"${targetKey}\" doesn't exist.`);\n const sourceKey: string = pageOf(definitions, layout, widgetKey) as string;\n if (sourceKey === targetKey) return ok(layout);\n if (resolveWidgetLock(widget).move) {\n return err(\n `Widget \"${titleOf(widget)}\" is locked against moving, so it can't be moved to ${describePage(target)}.`\n );\n }\n const base: DashboardLayout = withExplicitPages(layout);\n const source: LayoutPage = (base.pages ?? []).find(\n (p) => p.key === sourceKey\n ) as LayoutPage;\n const hidden: boolean = source.hidden.includes(widgetKey);\n const minimized: boolean = source.minimized.includes(widgetKey);\n // The widget joins the end of the target's display order.\n const targetOrder: readonly string[] = pageWidgets(\n definitions,\n base,\n targetKey\n ).map((d) => d.key);\n const moved: DashboardLayout = {\n ...base,\n pages: (base.pages ?? []).map((p) => {\n if (p.key === sourceKey) {\n return {\n ...p,\n order: without(p.order, widgetKey),\n hidden: without(p.hidden, widgetKey),\n minimized: without(p.minimized, widgetKey),\n };\n }\n if (p.key === targetKey) {\n return {\n ...p,\n order: hidden ? p.order : [...targetOrder, widgetKey],\n hidden: hidden ? [...p.hidden, widgetKey] : p.hidden,\n minimized: minimized ? [...p.minimized, widgetKey] : p.minimized,\n };\n }\n return p;\n }),\n };\n if (!hidden) {\n const allowed: number = rowsAllowed(target, options);\n const needed: number = placeRows(\n pageWidgets(definitions, moved, targetKey)\n ).length;\n if (needed > allowed) {\n return err(\n `${describePage(target)} has no room for \"${titleOf(widget)}\": it would need row ${needed}, and the page allows ${allowed}.`\n );\n }\n }\n return ok(moved);\n}\n\nexport interface NormalizeOptions extends PageOptions {\n /** Skip lock enforcement, for a user who may rearrange locked widgets. */\n readonly overrideLocks?: boolean;\n}\n\nfunction withoutLockField<T extends LayoutItem>(definition: T): T {\n if (definition.locked === undefined) return definition;\n const copy: { -readonly [K in keyof T]: T[K] } = { ...definition };\n delete copy.locked;\n return copy;\n}\n\nfunction uniqueTitle(taken: Set<string>, title: string, index: number): string {\n let base: string = title.trim().slice(0, MAX_PAGE_TITLE_LENGTH);\n if (base === '') base = `Page ${index + 1}`;\n let candidate: string = base;\n let n = 1;\n while (taken.has(normalizedTitle(candidate))) {\n const suffix = ` (#${n})`;\n candidate = `${base.slice(0, MAX_PAGE_TITLE_LENGTH - suffix.length)}${suffix}`;\n n += 1;\n }\n taken.add(normalizedTitle(candidate));\n return candidate;\n}\n\nfunction samePages(\n a: readonly LayoutPage[],\n b: readonly LayoutPage[]\n): boolean {\n return (\n a.length === b.length &&\n a.every((p, i) => {\n const q = b[i] as LayoutPage;\n return (\n p.key === q.key &&\n p.title === q.title &&\n p.maxRows === q.maxRows &&\n sameKeys(p.order, q.order) &&\n sameKeys(p.hidden, q.hidden) &&\n sameKeys(p.minimized, q.minimized)\n );\n })\n );\n}\n\n/**\n * Repairs a layout so it can be trusted, for the place it is saved: unknown\n * widgets are dropped, locks are enforced, and in a paged layout each widget\n * lives on one page, titles are trimmed, unique and short, widgets no page\n * lists yet are placed (on their home page), and a page that holds too many\n * rows has its overflow moved, in order, to the next page with room or a new\n * page after it. Nothing is hidden or dropped to make room. Idempotent;\n * returns the same object when nothing changes.\n */\nexport function normalizeLayout<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n options: NormalizeOptions = {}\n): DashboardLayout {\n const known: DashboardLayout = pruneLayout(definitions, layout);\n const locked: DashboardLayout = enforceLocks(definitions, known, options);\n if (!hasPages(locked)) return locked === layout ? layout : locked;\n\n const defs: readonly T[] =\n options.overrideLocks === true\n ? definitions.map(withoutLockField)\n : definitions;\n\n // Pages: one per key, one page per widget, clean titles.\n const taken = new Set<string>();\n const seenKeys = new Set<string>();\n const held = new Set<string>();\n let pages: LayoutPage[] = [];\n (locked.pages ?? []).forEach((page, index) => {\n if (seenKeys.has(page.key)) return;\n seenKeys.add(page.key);\n const keep = (list: readonly string[]): string[] => [\n ...new Set(list.filter((k) => !held.has(k))),\n ];\n const next: LayoutPage = {\n ...page,\n title: uniqueTitle(taken, page.title, index),\n order: keep(page.order),\n hidden: keep(page.hidden),\n minimized: keep(page.minimized),\n };\n for (const k of [...next.order, ...next.hidden]) held.add(k);\n pages.push(next);\n });\n\n const work = (): DashboardLayout => ({ ...locked, pages });\n\n // A widget locked against moving belongs to its home page: its hidden and\n // minimized entries move there, and it is never listed in an order.\n const pinned: T[] = defs.filter((d) => resolveWidgetLock(d).move);\n for (const widget of pinned) {\n const home: string = homePageKey(work(), widget);\n const keysHere = (p: LayoutPage, list: 'hidden' | 'minimized') =>\n p.key !== home && p[list].includes(widget.key);\n const wasHidden: boolean = pages.some((p) => keysHere(p, 'hidden'));\n const wasMinimized: boolean = pages.some((p) => keysHere(p, 'minimized'));\n if (!wasHidden && !wasMinimized) continue;\n pages = pages.map((p) => {\n let next: LayoutPage = p;\n if (keysHere(p, 'hidden')) {\n next = { ...next, hidden: without(next.hidden, widget.key) };\n }\n if (keysHere(p, 'minimized')) {\n next = { ...next, minimized: without(next.minimized, widget.key) };\n }\n if (p.key === home) {\n next = {\n ...next,\n hidden:\n wasHidden && !next.hidden.includes(widget.key)\n ? [...next.hidden, widget.key]\n : next.hidden,\n minimized:\n wasMinimized && !next.minimized.includes(widget.key)\n ? [...next.minimized, widget.key]\n : next.minimized,\n };\n }\n return next;\n });\n }\n\n // Widgets no page lists yet join the end of their home page's order.\n const placedKeys = new Set<string>();\n for (const p of pages) {\n for (const k of [...p.order, ...p.hidden]) placedKeys.add(k);\n }\n const pinnedKeys = new Set<string>(pinned.map((d) => d.key));\n const unplaced: T[] = defs\n .filter((d) => !placedKeys.has(d.key) && !pinnedKeys.has(d.key))\n .map((definition, index) => ({ definition, index }))\n .sort(\n (a, b) =>\n (a.definition.sortOrder ?? 0) - (b.definition.sortOrder ?? 0) ||\n a.index - b.index\n )\n .map(({ definition }) => definition);\n for (const widget of unplaced) {\n const home: string = homePageKey(work(), widget);\n pages = pages.map((p) =>\n p.key === home ? { ...p, order: [...p.order, widget.key] } : p\n );\n }\n\n // Overflow moves, in order, to the next page with room or a new page.\n for (let i = 0; i < pages.length; i += 1) {\n const page = pages[i] as LayoutPage;\n const shown: T[] = pageWidgets(defs, work(), page.key);\n const fits: number = fitCount(shown, rowsAllowed(page, options));\n if (fits >= shown.length) continue;\n const moving: string[] = shown\n .slice(fits)\n .filter((d) => !pinnedKeys.has(d.key))\n .map((d) => d.key);\n if (moving.length === 0) continue;\n const moveSet = new Set<string>(moving);\n const movedMinimized: string[] = page.minimized.filter((k) =>\n moveSet.has(k)\n );\n pages = pages.map((p) =>\n p.key === page.key\n ? {\n ...p,\n order: p.order.filter((k) => !moveSet.has(k)),\n minimized: p.minimized.filter((k) => !moveSet.has(k)),\n }\n : p\n );\n let placed = false;\n for (let j = i + 1; j < pages.length && !placed; j += 1) {\n const candidate: LayoutPage = pages[j] as LayoutPage;\n const trial: LayoutPage[] = pages.map((p) =>\n p.key === candidate.key\n ? {\n ...p,\n order: [...moving, ...p.order],\n minimized: [...p.minimized, ...movedMinimized],\n }\n : p\n );\n const items: T[] = pageWidgets(\n defs,\n { ...locked, pages: trial },\n candidate.key\n );\n if (placeRows(items).length <= rowsAllowed(candidate, options)) {\n pages = trial;\n placed = true;\n }\n }\n if (!placed) {\n const key: string = nextPageKey(work());\n const title: string = uniqueTitle(\n new Set<string>(pages.map((p) => normalizedTitle(p.title))),\n `Page ${pages.length + 1}`,\n pages.length\n );\n pages = [\n ...pages,\n { key, title, order: moving, hidden: [], minimized: movedMinimized },\n ];\n }\n }\n\n const result: DashboardLayout = work();\n return samePages(layout.pages ?? [], pages) &&\n sameKeys(layout.order, result.order)\n ? layout\n : result;\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\n\nimport { useSlotClassName } from './settings.js';\n\n/**\n * Whether menus start open. Only tests and previews change it: server\n * rendering can't click, so a provider with `true` shows every menu's items.\n */\nexport const EditMenuInitialOpenContext = createContext<boolean>(false);\n\nexport type EditMenuItem =\n | {\n readonly kind: 'action';\n readonly key: string;\n /** Short text shown in the menu: \"Move earlier\". */\n readonly label: string;\n /** Full accessible name when the short text isn't enough: \"Move Revenue earlier\". */\n readonly ariaLabel?: string;\n readonly disabled?: boolean;\n readonly onSelect: () => void;\n }\n /** A small heading over the items that follow, such as \"Move to page\". */\n | { readonly kind: 'heading'; readonly key: string; readonly label: string };\n\nexport interface WidgetEditMenuProps {\n /** Accessible name of the icon button, for example \"Arrange Revenue\". */\n readonly label: string;\n readonly items: readonly EditMenuItem[];\n /** Render with the menu open (used for tests and previews). */\n readonly initialOpen?: boolean;\n}\n\nconst ITEM_SELECTOR = '[role=\"menuitem\"]:not(:disabled)';\n\n/**\n * One icon button on a card that opens a small floating menu of everything\n * the viewer can do to that widget while editing: move it earlier or later,\n * move it to another page, hide it. Choosing an item closes the menu and runs\n * it; Escape, a click outside, or focus leaving closes it without choosing.\n * Arrow keys, Home and End move between the enabled items.\n */\nexport function WidgetEditMenu({\n label,\n items,\n initialOpen,\n}: WidgetEditMenuProps): ReactNode {\n const slot = useSlotClassName();\n const startOpen: boolean = useContext(EditMenuInitialOpenContext);\n const menuId: string = useId();\n const [open, setOpen] = useState<boolean>(initialOpen ?? startOpen);\n const wrapper = useRef<HTMLSpanElement>(null);\n const button = useRef<HTMLButtonElement>(null);\n const menu = useRef<HTMLDivElement>(null);\n\n // Focus the first choice when the menu opens, and close on an outside click.\n useEffect(() => {\n if (!open) return undefined;\n menu.current?.querySelector<HTMLElement>(ITEM_SELECTOR)?.focus();\n const onPointerDown = (event: PointerEvent): void => {\n if (!wrapper.current?.contains(event.target as Node)) setOpen(false);\n };\n document.addEventListener('pointerdown', onPointerDown);\n return () => document.removeEventListener('pointerdown', onPointerDown);\n }, [open]);\n\n function close(returnFocus: boolean): void {\n setOpen(false);\n if (returnFocus) button.current?.focus();\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLDivElement>): void {\n if (event.key === 'Escape') {\n event.stopPropagation();\n close(true);\n return;\n }\n const enabled: HTMLElement[] = [\n ...(menu.current?.querySelectorAll<HTMLElement>(ITEM_SELECTOR) ?? []),\n ];\n if (enabled.length === 0) return;\n const current: number = enabled.indexOf(\n document.activeElement as HTMLElement\n );\n let next: number | undefined;\n if (event.key === 'ArrowDown') next = (current + 1) % enabled.length;\n else if (event.key === 'ArrowUp') {\n next = (current - 1 + enabled.length) % enabled.length;\n } else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = enabled.length - 1;\n if (next !== undefined) {\n event.preventDefault();\n enabled[next]?.focus();\n }\n }\n\n return (\n <span\n ref={wrapper}\n className=\"dwt-edit-menu\"\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) {\n setOpen(false);\n }\n }}\n >\n <button\n ref={button}\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={label}\n title={label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n onClick={() => setOpen((current) => !current)}\n >\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M5 9l-3 3 3 3M9 5l3-3 3 3M15 19l-3 3-3-3M19 9l3 3-3 3M2 12h20M12 2v20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n {open && (\n <div\n ref={menu}\n id={menuId}\n className=\"dwt-edit-popover\"\n role=\"menu\"\n aria-label={label}\n onKeyDown={onKeyDown}\n >\n {items.map((item) =>\n item.kind === 'heading' ? (\n <p\n key={item.key}\n className=\"dwt-edit-heading\"\n role=\"presentation\"\n >\n {item.label}\n </p>\n ) : (\n <button\n key={item.key}\n type=\"button\"\n role=\"menuitem\"\n className=\"dwt-edit-option\"\n {...(item.ariaLabel === undefined\n ? {}\n : { 'aria-label': item.ariaLabel })}\n disabled={item.disabled === true}\n onClick={() => {\n close(false);\n item.onSelect();\n }}\n >\n {item.label}\n </button>\n )\n )}\n </div>\n )}\n </span>\n );\n}\n","import {\n useEffect,\n useId,\n useRef,\n useState,\n type ReactNode,\n type RefObject,\n} from 'react';\n\nimport {\n defaultDetailQuery,\n queryRows,\n validateDetailData,\n type DetailCell,\n type DetailColumn,\n type DetailData,\n type DetailProviderOptions,\n type DetailPage,\n type DetailQuery,\n type DetailSort,\n} from '../core/detail.js';\nimport type { WidgetDefinition } from '../core/definition.js';\nimport type { OptionValues } from '../core/options.js';\nimport { WidgetLink } from './primitives.js';\nimport { useSlotClassName, useWidgetSettings } from './settings.js';\n\n/**\n * Loads a widget's full detail data. Close over your own context (a Prisma\n * client, a fetch) here; the package never fetches. See `DetailProvider`.\n * Return `undefined` for a widget you have no extra data for: the card's own\n * data is used when it is complete (see `deriveDetailData`).\n */\nexport type DetailLoader = (\n definition: WidgetDefinition,\n options: DetailProviderOptions\n) => DetailData | undefined | Promise<DetailData | undefined>;\n\nexport interface WidgetDetailProps {\n /** Table caption: the widget's title. */\n readonly title: string;\n /** The rows to show. Absent while `status` is `loading` or `error`. */\n readonly data?: DetailData;\n /** Controlled: you own the query, so you can keep it in the URL. */\n readonly query: DetailQuery;\n readonly onQueryChange: (query: DetailQuery) => void;\n /** Default `ok`. */\n readonly status?: 'ok' | 'loading' | 'error';\n readonly error?: string;\n readonly onRetry?: () => void;\n /** Heading level of the title, 2 to 6. Default 2. */\n readonly headingLevel?: 2 | 3 | 4 | 5 | 6;\n /** Id of the heading, so a dialog can label itself with it. */\n readonly headingId?: string;\n readonly className?: string;\n}\n\nfunction nextSort(\n current: DetailSort | undefined,\n column: string\n): DetailSort | undefined {\n if (current?.column !== column) return { column, direction: 'asc' };\n return current.direction === 'asc'\n ? { column, direction: 'desc' }\n : undefined;\n}\n\n/** `query` with a new sort (or none), back on the first page. */\nfunction withSort(\n query: DetailQuery,\n sort: DetailSort | undefined\n): DetailQuery {\n const { sort: _previous, ...rest } = query;\n return sort === undefined ? { ...rest, page: 1 } : { ...rest, sort, page: 1 };\n}\n\nfunction SortGlyph({\n sort,\n column,\n}: {\n readonly sort: DetailSort | undefined;\n readonly column: string;\n}): ReactNode {\n if (sort?.column !== column) return <span aria-hidden=\"true\"> ↕</span>;\n return (\n <span aria-hidden=\"true\">{sort.direction === 'asc' ? ' ↑' : ' ↓'}</span>\n );\n}\n\nfunction Cell({\n cell,\n column,\n}: {\n readonly cell: DetailCell;\n readonly column: DetailColumn | undefined;\n}): ReactNode {\n return (\n <td className={column?.numeric === true ? 'dwt-numeric' : undefined}>\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}\n\n/**\n * The detail view of a widget: search and column filters, a sortable table\n * and paging, over data you give it (client mode: it filters, sorts and pages\n * in memory with `queryRows`). Controlled by `query`. Use it on its own as a\n * page, or inside `WidgetDetailDialog`.\n */\nexport function WidgetDetail({\n title,\n data,\n query,\n onQueryChange,\n status = 'ok',\n error,\n onRetry,\n headingLevel = 2,\n headingId,\n className,\n}: WidgetDetailProps): ReactNode {\n const slot = useSlotClassName();\n const { labels, locale } = useWidgetSettings();\n const id: string = useId();\n const Heading = `h${headingLevel}` as const;\n const localeTag: string | undefined =\n typeof locale === 'string' ? locale : locale?.[0];\n\n let page: DetailPage | undefined;\n let problem: string | undefined;\n if (status === 'ok' && data !== undefined) {\n const result = queryRows(data, query, localeTag);\n if (result.ok) page = result.value;\n else problem = result.error;\n }\n\n function change(patch: Partial<DetailQuery>): void {\n onQueryChange({ ...query, ...patch, page: patch.page ?? 1 });\n }\n\n let body: ReactNode;\n if (status === 'loading') {\n body = (\n <p role=\"status\" className={slot('status', 'dwt-status')}>\n {labels.loading}\n </p>\n );\n } else if (status === 'error' || problem !== undefined) {\n body = (\n <div role=\"alert\" className={slot('error', 'dwt-error')}>\n <p className=\"dwt-error-message\">{error ?? problem ?? ''}</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 } else if (data !== undefined && page !== undefined) {\n const columns: readonly DetailColumn[] = data.columns;\n const from: number = (page.page - 1) * query.pageSize + 1;\n const to: number = from + page.rows.length - 1;\n body = (\n <>\n <div className=\"dwt-detail-controls\">\n <label className=\"dwt-detail-field\">\n <span>{labels.search}</span>\n <input\n type=\"search\"\n value={query.search ?? ''}\n onChange={(event) => change({ search: event.target.value })}\n />\n </label>\n {columns\n .filter((column) => column.filterable === true)\n .map((column) => (\n <label key={column.key} className=\"dwt-detail-field\">\n <span>{labels.filterBy(column.label)}</span>\n <input\n type=\"search\"\n value={query.filters?.[column.key] ?? ''}\n onChange={(event) =>\n change({\n filters: {\n ...query.filters,\n [column.key]: event.target.value,\n },\n })\n }\n />\n </label>\n ))}\n </div>\n <p\n className=\"dwt-detail-summary\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {page.totalRows === 0\n ? labels.noResults\n : labels.showingRows(from, to, page.totalRows)}\n </p>\n <div className=\"dwt-table-wrap\">\n <table className={slot('table', 'dwt-table', 'dwt-detail-table')}>\n <caption className=\"dwt-visually-hidden\">{title}</caption>\n <thead>\n <tr>\n {columns.map((column) => {\n const sorted: boolean = query.sort?.column === column.key;\n return (\n <th\n key={column.key}\n scope=\"col\"\n className={\n column.numeric === true ? 'dwt-numeric' : undefined\n }\n aria-sort={\n sorted\n ? query.sort?.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\n }\n >\n {column.sortable === false ? (\n column.label\n ) : (\n <button\n type=\"button\"\n className=\"dwt-detail-sort\"\n aria-label={labels.sortBy(column.label)}\n onClick={() =>\n onQueryChange(\n withSort(query, nextSort(query.sort, column.key))\n )\n }\n >\n {column.label}\n <SortGlyph sort={query.sort} column={column.key} />\n </button>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {page.rows.map((row, rowIndex) => (\n <tr key={rowIndex}>\n {row.map((cell, cellIndex) => (\n <Cell\n key={cellIndex}\n cell={cell}\n column={columns[cellIndex]}\n />\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {page.pageCount > 1 && (\n <nav className=\"dwt-detail-pager\" aria-label={labels.pagination}>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button')}\n disabled={page.page <= 1}\n onClick={() => onQueryChange({ ...query, page: page.page - 1 })}\n >\n {labels.previousPage}\n </button>\n <span>{labels.pageOf(page.page, page.pageCount)}</span>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button')}\n disabled={page.page >= page.pageCount}\n onClick={() => onQueryChange({ ...query, page: page.page + 1 })}\n >\n {labels.nextPage}\n </button>\n </nav>\n )}\n </>\n );\n }\n\n return (\n <section\n aria-labelledby={headingId ?? `${id}-title`}\n className={slot('detail', 'dwt-detail', className)}\n >\n <Heading\n id={headingId ?? `${id}-title`}\n className={slot('cardTitle', 'dwt-card-title', 'dwt-detail-title')}\n >\n {title}\n </Heading>\n {body}\n </section>\n );\n}\n\nexport interface WidgetDetailDialogProps {\n readonly title: string;\n readonly open: boolean;\n /** Called on Esc, the Close button and a click on the backdrop. */\n readonly onClose: () => void;\n readonly children: ReactNode;\n}\n\n/**\n * A native modal `<dialog>`: focus is trapped, Esc closes it, the page behind\n * is inert, and focus returns to the control that opened it.\n */\nexport function WidgetDetailDialog({\n title,\n open,\n onClose,\n children,\n}: WidgetDetailDialogProps): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const dialogRef: RefObject<HTMLDialogElement | null> =\n useRef<HTMLDialogElement>(null);\n const titleId: string = useId();\n\n useEffect(() => {\n const dialog: HTMLDialogElement | null = dialogRef.current;\n if (dialog === null || !open) return undefined;\n // Remember what had focus so closing (or unmounting) can give it back.\n const opener: Element | null = document.activeElement;\n if (!dialog.open) dialog.showModal();\n return () => {\n if (dialog.open) dialog.close();\n if (opener instanceof HTMLElement) opener.focus();\n };\n }, [open]);\n\n return (\n <dialog\n ref={dialogRef}\n className=\"dwt-detail-dialog\"\n aria-labelledby={titleId}\n onCancel={(event) => {\n event.preventDefault();\n onClose();\n }}\n onClick={(event) => {\n if (event.target === dialogRef.current) onClose();\n }}\n >\n {open && (\n <div className=\"dwt-detail-dialog-body\">\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-detail-close')}\n onClick={onClose}\n >\n {labels.close}\n </button>\n <span id={titleId} className=\"dwt-visually-hidden\">\n {title}\n </span>\n {children}\n </div>\n )}\n </dialog>\n );\n}\n\nconst NO_OPTION_VALUES: OptionValues = Object.freeze({});\n\nexport interface DetailLoadState {\n readonly status: 'loading' | 'ok' | 'error';\n readonly data?: DetailData;\n readonly error?: string;\n}\n\n/**\n * Loads a widget's detail data while `enabled`: calls `load` with an abort\n * signal (aborted on close, retry or unmount), validates the result and\n * reports loading, ok or error. When `load` is missing or returns\n * `undefined`, `fallback` (for example the card's own complete data) is used\n * instead. `reload` runs it again. Keep `load` and `fallback` referentially\n * stable (`useCallback` / `useMemo`): a new value restarts the load.\n * `optionValues` (the widget's resolved options) go to the loader as\n * `options.options`.\n */\nexport function useDetailData(\n definition: WidgetDefinition,\n load: DetailLoader | undefined,\n enabled: boolean,\n fallback?: DetailData,\n optionValues: OptionValues = NO_OPTION_VALUES\n): { readonly state: DetailLoadState; readonly reload: () => void } {\n const [state, setState] = useState<DetailLoadState>({ status: 'loading' });\n const [attempt, setAttempt] = useState(0);\n\n useEffect(() => {\n if (!enabled) return undefined;\n const controller = new AbortController();\n setState({ status: 'loading' });\n Promise.resolve()\n .then(() =>\n load === undefined\n ? undefined\n : load(definition, {\n signal: controller.signal,\n options: optionValues,\n query: defaultDetailQuery(),\n })\n )\n .then((raw) => {\n if (controller.signal.aborted) return;\n const data: DetailData | undefined = raw ?? fallback;\n if (data === undefined) {\n setState({\n status: 'error',\n error: `Widget \"${definition.key}\" detail: no data. The loader returned nothing for this widget and its card does not hold the full data (use a loader that returns rows, or a TABLE without a footer or a BAR_LIST).`,\n });\n return;\n }\n const checked = validateDetailData(\n data,\n `Widget \"${definition.key}\" detail`\n );\n setState(\n checked.ok\n ? { status: 'ok', data: checked.value }\n : { status: 'error', error: checked.error }\n );\n })\n .catch((cause: unknown) => {\n if (controller.signal.aborted) return;\n setState({\n status: 'error',\n error: `Widget \"${definition.key}\" detail: ${\n cause instanceof Error ? cause.message : String(cause)\n }`,\n });\n });\n return () => controller.abort();\n }, [enabled, load, fallback, definition, optionValues, attempt]);\n\n return { state, reload: () => setAttempt((count) => count + 1) };\n}\n","import {\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n} from 'react';\n\nimport {\n resolveWidgetLock,\n type ResolvedWidgetLock,\n type WidgetDefinition,\n} from '../core/definition.js';\nimport {\n WIDTH_COLUMNS,\n fillColumnSpans,\n fillWidthSpans,\n fillsWidth,\n itemWidth,\n usesWidthColumns,\n} from '../core/grid.js';\nimport {\n EMPTY_LAYOUT,\n enforceLocks,\n hiddenWidgets,\n isMinimized,\n moveWidgetBy,\n showWidget,\n hideWidget,\n toggleMinimized,\n visibleWidgets,\n MAX_PAGE_TITLE_LENGTH,\n type DashboardLayout,\n type LayoutPage,\n} from '../core/layout.js';\nimport {\n addPage,\n assignPages,\n hasPages,\n movePage,\n moveWidgetToPage,\n pageLayout,\n pageList,\n pageRoom,\n removePage,\n renamePage,\n withPageLayout,\n type PageOptions,\n} from '../core/pages.js';\nimport { sortFromOptions } from '../core/options.js';\nimport type { DashboardWidget } from '../core/resolve.js';\nimport {\n defaultDetailQuery,\n deriveDetailData,\n resolveDetailOptions,\n type DetailData,\n type DetailQuery,\n type DetailSort,\n} from '../core/detail.js';\nimport { ResolvedWidgetCard } from './card.js';\nimport { WidgetEditMenu, type EditMenuItem } from './edit-menu.js';\nimport {\n WidgetDetail,\n WidgetDetailDialog,\n useDetailData,\n type DetailLoader,\n} from './detail.js';\nimport {\n WidgetSettingsProvider,\n useSlotClassName,\n useWidgetSettings,\n type WidgetSettings,\n} from './settings.js';\n\n/** The \"New page…\" choice of a card's move-to-page select. */\nconst NEW_PAGE_VALUE = '__new-page__';\n\n/** The tab panel of a paged dashboard; a plain wrapper-free fragment otherwise. */\nfunction PagePanel({\n paged,\n id,\n labelledBy,\n children,\n}: {\n readonly paged: boolean;\n readonly id: string;\n readonly labelledBy: string;\n readonly children: ReactNode;\n}): ReactNode {\n if (!paged) return <>{children}</>;\n return (\n <div\n role=\"tabpanel\"\n id={id}\n aria-labelledby={labelledBy}\n className=\"dwt-page-panel\"\n >\n {children}\n </div>\n );\n}\n\n/** Viewport width at or below which the stylesheet stops spanning `large`. */\nconst NARROW_VIEWPORT_QUERY = '(max-width: 640px)';\n\n/** Grid width above which a 12-column grid uses each widget's own width. */\nconst WIDE_GRID_PX = 900;\n\ninterface GridMetrics {\n readonly columns: number;\n readonly largeSpan: number;\n}\n\n/**\n * Column spans for widgets that `fill` their width. The number of columns\n * comes from the rendered grid (so it follows your CSS and the container\n * width); until it is measured, and on the server, no spans are set and the\n * grid lays out normally. Returns an empty map when no widget fills width.\n */\nfunction useFillSpans(\n definitions: readonly WidgetDefinition[],\n gridRef: RefObject<HTMLDivElement | null>,\n twelve: boolean\n): ReadonlyMap<string, number> {\n const [metrics, setMetrics] = useState<GridMetrics | undefined>(undefined);\n const needsSpans: boolean = definitions.some((definition) =>\n fillsWidth(definition.fill)\n );\n\n useEffect(() => {\n const grid: HTMLDivElement | null = gridRef.current;\n if (!needsSpans || grid === null || typeof ResizeObserver === 'undefined') {\n setMetrics(undefined);\n return undefined;\n }\n function measure(): void {\n if (grid === null) return;\n if (twelve) {\n // Narrow grids reflow in CSS; only fill when widths apply as set.\n const wide: boolean = grid.clientWidth > WIDE_GRID_PX;\n setMetrics((previous) =>\n !wide\n ? undefined\n : previous?.columns === WIDTH_COLUMNS\n ? previous\n : { columns: WIDTH_COLUMNS, largeSpan: 2 }\n );\n return;\n }\n const tracks: string = getComputedStyle(grid).gridTemplateColumns;\n const columns: number =\n tracks === '' || tracks === 'none'\n ? 0\n : tracks.trim().split(/\\s+/).length;\n const largeSpan: number = window.matchMedia(NARROW_VIEWPORT_QUERY).matches\n ? 1\n : 2;\n setMetrics((previous) =>\n columns === 0\n ? undefined\n : previous?.columns === columns && previous.largeSpan === largeSpan\n ? previous\n : { columns, largeSpan }\n );\n }\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(grid);\n return () => observer.disconnect();\n }, [needsSpans, gridRef, twelve]);\n\n return useMemo(\n () =>\n metrics === undefined\n ? new Map<string, number>()\n : twelve\n ? fillWidthSpans(definitions)\n : fillColumnSpans(definitions, metrics.columns, metrics.largeSpan),\n [definitions, metrics, twelve]\n );\n}\n\nfunction widthProps(\n twelve: boolean,\n definition: WidgetDefinition\n): { width?: number } {\n return twelve ? { width: itemWidth(definition) } : {};\n}\n\nfunction spanProps(\n spans: ReadonlyMap<string, number>,\n key: string\n): { columnSpan?: number } {\n const columnSpan: number | undefined = spans.get(key);\n return columnSpan === undefined ? {} : { columnSpan };\n}\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 const gridRef = useRef<HTMLDivElement>(null);\n const definitions: WidgetDefinition[] = widgets.map((w) => w.definition);\n const twelve: boolean = usesWidthColumns(definitions);\n const spans: ReadonlyMap<string, number> = useFillSpans(\n definitions,\n gridRef,\n twelve\n );\n return (\n <div\n ref={gridRef}\n className={slot(\n 'grid',\n 'dwt-grid',\n twelve && 'dwt-grid--twelve',\n className\n )}\n >\n {widgets.map((widget) => (\n <ResolvedWidgetCard\n key={widget.definition.key}\n widget={widget}\n {...spanProps(spans, widget.definition.key)}\n {...widthProps(twelve, widget.definition)}\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, minimize or\n * restore; persist it. Without it the layout is read-only (no controls).\n */\n readonly onLayoutChange?: (layout: DashboardLayout) => void;\n /**\n * Ignore widget `locked` settings, so locked widgets can be moved, hidden\n * and minimized. For administrators editing the default layout: pass it\n * only for roles you trust, and enforce locks again on the server for\n * everyone else (`enforceLocks`). It never changes the locks themselves.\n */\n readonly overrideLocks?: boolean;\n /**\n * `always` (default): move and hide controls show whenever `onLayoutChange`\n * is set. `toggle`: they show only while editing, behind a Customize\n * button, so a stray click can't rearrange the page. Minimize and its bar\n * work in both modes.\n */\n readonly editMode?: 'always' | 'toggle';\n /** Controlled editing state (`editMode=\"toggle\"`). */\n readonly editing?: boolean;\n /** Initial editing state when uncontrolled. Default false. */\n readonly defaultEditing?: boolean;\n /** Called when the viewer starts or finishes editing. */\n readonly onEditingChange?: (editing: boolean) => void;\n /** What Reset layout restores. Default: the empty layout (sortOrder order). */\n readonly defaultLayout?: DashboardLayout;\n /** Show the built-in Customize/Done/Reset toolbar (toggle mode). Default true. */\n readonly toolbar?: boolean;\n /**\n * The page in view (a page key) when the layout has pages. Controlled with\n * `onActivePageChange`; without it the dashboard keeps its own, starting on\n * `defaultActivePage` or the first page. Pages never listed fall back to\n * the first.\n */\n readonly activePage?: string;\n readonly defaultActivePage?: string;\n readonly onActivePageChange?: (pageKey: string) => void;\n /** Rows a page holds unless the page says otherwise. Default 4. */\n readonly maxRows?: number;\n /** Most pages the viewer can add while editing. Default: no limit. */\n readonly maxPages?: number;\n readonly onRetry?: (key: string) => void;\n /**\n * Loads the full data for a widget's detail view (widgets whose definition\n * sets `detail`). Close over your own context. Return `undefined` for a\n * widget you have no extra data for: a TABLE with no footer or a BAR_LIST\n * then shows its card data. Without `loadDetail`, those two still work and\n * other widgets get no View button.\n */\n readonly loadDetail?: DetailLoader;\n /**\n * Called with the widget key when the viewer opens a detail view, instead\n * of the built-in dialog: navigate to your own page.\n */\n readonly onOpenDetail?: (key: string) => void;\n readonly headingLevel?: 2 | 3 | 4 | 5 | 6;\n readonly className?: string;\n}\n\n/** The built-in dialog for one widget's detail view. */\nfunction DetailHost({\n widget,\n loadDetail,\n onClose,\n}: {\n readonly widget: DashboardWidget;\n readonly loadDetail: DetailLoader | undefined;\n readonly onClose: () => void;\n}): ReactNode {\n const { locale } = useWidgetSettings();\n const { definition } = widget;\n const options = resolveDetailOptions(definition);\n const pageSize: number = options?.pageSize ?? 25;\n const optionSort: DetailSort | undefined = sortFromOptions(\n definition,\n widget.options\n );\n const [query, setQuery] = useState<DetailQuery>({\n ...defaultDetailQuery(pageSize),\n ...(optionSort === undefined ? {} : { sort: optionSort }),\n });\n // Memoized: a fresh object each render would restart the load every time.\n const derived: DetailData | undefined = useMemo(\n () =>\n widget.status === 'ok'\n ? deriveDetailData(widget.data, locale)\n : undefined,\n [widget, locale]\n );\n const { state, reload } = useDetailData(\n definition,\n loadDetail,\n true,\n derived,\n widget.options\n );\n const title: string = options?.title ?? definition.title;\n return (\n <WidgetDetailDialog title={title} open onClose={onClose}>\n <WidgetDetail\n title={title}\n query={query}\n onQueryChange={setQuery}\n status={state.status}\n {...(state.data === undefined ? {} : { data: state.data })}\n {...(state.error === undefined ? {} : { error: state.error })}\n onRetry={reload}\n />\n </WidgetDetailDialog>\n );\n}\n\n/**\n * \"Reset the layout?\" with \"✓\" and \"X\" buttons, inline in the toolbar. Focus\n * starts on the safe choice, and Escape answers no.\n */\nfunction InlineConfirm({\n message,\n onAnswer,\n}: {\n readonly message: string;\n readonly onAnswer: (yes: boolean) => void;\n}): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const noRef = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n noRef.current?.focus();\n }, []);\n return (\n <span\n role=\"group\"\n aria-label={message}\n className=\"dwt-confirm\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onAnswer(false);\n }\n }}\n >\n <span role=\"alert\" className=\"dwt-confirm-message\">\n {message}\n </span>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.confirmYes}\n title={labels.confirmYes}\n onClick={() => onAnswer(true)}\n >\n <span aria-hidden=\"true\">✓</span>\n </button>\n <button\n ref={noRef}\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.confirmNo}\n title={labels.confirmNo}\n onClick={() => onAnswer(false)}\n >\n <span aria-hidden=\"true\">✕</span>\n </button>\n </span>\n );\n}\n\n/** The tab list of a paged dashboard: tabs on wide screens, dots on narrow. */\nfunction PageTabs({\n pages,\n activeKey,\n idPrefix,\n panelId,\n announcement,\n onSelect,\n}: {\n readonly pages: readonly LayoutPage[];\n readonly activeKey: string;\n readonly idPrefix: string;\n readonly panelId: string;\n readonly announcement: string;\n readonly onSelect: (pageKey: string) => void;\n}): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const tabs = useRef(new Map<string, HTMLButtonElement>());\n const activeIndex: number = pages.findIndex((p) => p.key === activeKey);\n\n function onKeyDown(event: KeyboardEvent, index: number): void {\n const last: number = pages.length - 1;\n let next: number | undefined;\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n next = index === last ? 0 : index + 1;\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n next = index === 0 ? last : index - 1;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = last;\n break;\n default:\n return;\n }\n event.preventDefault();\n const target: LayoutPage | undefined = pages[next];\n if (target === undefined) return;\n onSelect(target.key);\n tabs.current.get(target.key)?.focus();\n }\n\n return (\n <div className={slot('pageBar', 'dwt-pages')}>\n <button\n type=\"button\"\n className={slot(\n 'button',\n 'dwt-button',\n 'dwt-icon-button',\n 'dwt-page-nav'\n )}\n aria-label={labels.previousPageButton}\n disabled={activeIndex <= 0}\n onClick={() => onSelect((pages[activeIndex - 1] as LayoutPage).key)}\n >\n <span aria-hidden=\"true\">‹</span>\n </button>\n <div role=\"tablist\" aria-label={labels.pageBar} className=\"dwt-page-tabs\">\n {pages.map((page, index) => {\n const selected: boolean = page.key === activeKey;\n return (\n <button\n key={page.key}\n ref={(element) => {\n if (element === null) tabs.current.delete(page.key);\n else tabs.current.set(page.key, element);\n }}\n type=\"button\"\n role=\"tab\"\n id={`${idPrefix}-tab-${index}`}\n aria-selected={selected}\n aria-controls={panelId}\n aria-label={labels.pageTabName(\n index + 1,\n pages.length,\n page.title\n )}\n title={page.title}\n tabIndex={selected ? 0 : -1}\n className={slot('button', 'dwt-page-tab')}\n onClick={() => onSelect(page.key)}\n onKeyDown={(event) => onKeyDown(event, index)}\n >\n <span className=\"dwt-page-tab-title\">{page.title}</span>\n <span className=\"dwt-page-dot\" aria-hidden=\"true\" />\n </button>\n );\n })}\n </div>\n <button\n type=\"button\"\n className={slot(\n 'button',\n 'dwt-button',\n 'dwt-icon-button',\n 'dwt-page-nav'\n )}\n aria-label={labels.nextPageButton}\n disabled={activeIndex === pages.length - 1}\n onClick={() => onSelect((pages[activeIndex + 1] as LayoutPage).key)}\n >\n <span aria-hidden=\"true\">›</span>\n </button>\n <span className=\"dwt-visually-hidden\" aria-live=\"polite\">\n {announcement}\n </span>\n </div>\n );\n}\n\n/** A small form to rename a page. `onSubmit` returns an error to show. */\nfunction PageRenameForm({\n initial,\n onSubmit,\n onCancel,\n}: {\n readonly initial: string;\n readonly onSubmit: (title: string) => string | undefined;\n readonly onCancel: () => void;\n}): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const [title, setTitle] = useState<string>(initial);\n const [error, setError] = useState<string | undefined>(undefined);\n const inputRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, []);\n return (\n <form\n className=\"dwt-page-rename\"\n onSubmit={(event) => {\n event.preventDefault();\n setError(onSubmit(title));\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onCancel();\n }\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n className=\"dwt-page-title-input\"\n aria-label={labels.pageTitle}\n aria-invalid={error !== undefined}\n maxLength={MAX_PAGE_TITLE_LENGTH}\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n />\n <button\n type=\"submit\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.savePageTitle}\n title={labels.savePageTitle}\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.cancelPageTitle}\n title={labels.cancelPageTitle}\n onClick={onCancel}\n >\n <span aria-hidden=\"true\">✕</span>\n </button>\n {error !== undefined && (\n <span role=\"alert\" className=\"dwt-page-error\">\n {error}\n </span>\n )}\n </form>\n );\n}\n\n/** The definition without its lock, for `overrideLocks`. */\nfunction withoutLock(definition: WidgetDefinition): WidgetDefinition {\n if (definition.locked === undefined) return definition;\n const copy: { -readonly [K in keyof WidgetDefinition]: WidgetDefinition[K] } =\n { ...definition };\n delete copy.locked;\n return copy;\n}\n\nfunction DashboardInner({\n widgets,\n layout: savedLayout = EMPTY_LAYOUT,\n onLayoutChange,\n overrideLocks = false,\n editMode = 'always',\n editing: editingProp,\n defaultEditing = false,\n onEditingChange,\n defaultLayout,\n toolbar = true,\n activePage: activePageProp,\n defaultActivePage,\n onActivePageChange,\n maxRows,\n maxPages,\n onRetry,\n loadDetail,\n onOpenDetail,\n headingLevel,\n className,\n}: DashboardProps): ReactNode {\n const slot = useSlotClassName();\n const { labels } = useWidgetSettings();\n const definitions: WidgetDefinition[] = widgets.map((w) =>\n overrideLocks ? withoutLock(w.definition) : w.definition\n );\n // A saved layout can predate a lock (or be edited by hand), so what a lock\n // forbids is removed before anything is shown.\n const layout: DashboardLayout = enforceLocks(definitions, savedLayout);\n const byKey = new Map<string, DashboardWidget>(\n widgets.map((w) => [w.definition.key, w])\n );\n // Pages: with none, the layout is one implicit page and `view` is the layout\n // itself, so everything below works on one page's widgets and lists.\n const pages: readonly LayoutPage[] = pageList(layout);\n const paged: boolean = pages.length >= 2;\n const [activeState, setActiveState] = useState<string | undefined>(\n defaultActivePage\n );\n const requested: string | undefined = activePageProp ?? activeState;\n const activePage: LayoutPage =\n pages.find((page) => page.key === requested) ?? (pages[0] as LayoutPage);\n const activeKey: string = activePage.key;\n const pageDefs: WidgetDefinition[] =\n assignPages(definitions, layout).get(activeKey) ?? [];\n const view: DashboardLayout = pageLayout(layout, activeKey) ?? layout;\n const roomOptions: PageOptions = maxRows === undefined ? {} : { maxRows };\n const visible: WidgetDefinition[] = visibleWidgets(pageDefs, view);\n const hidden: WidgetDefinition[] = hiddenWidgets(pageDefs, view);\n const editable: boolean = onLayoutChange !== undefined;\n const toggleMode: boolean = editMode === 'toggle';\n const [editingState, setEditingState] = useState<boolean>(defaultEditing);\n const editing: boolean = editingProp ?? editingState;\n // Move, hide and the other layout controls: always, or only while editing.\n const controlsShown: boolean = editable && (!toggleMode || editing);\n // Editing keeps a snapshot of the layout from when it began, for Revert.\n const [snapshot, setSnapshot] = useState<DashboardLayout | undefined>(\n undefined\n );\n if (toggleMode && editable && editing) {\n if (snapshot === undefined) setSnapshot(savedLayout);\n } else if (snapshot !== undefined) {\n setSnapshot(undefined);\n }\n const [confirming, setConfirming] = useState<'reset' | 'revert' | undefined>(\n undefined\n );\n const pending: 'reset' | 'revert' | undefined = editing\n ? confirming\n : undefined;\n const [announcement, setAnnouncement] = useState<string>('');\n const [pageAnnouncement, setPageAnnouncement] = useState<string>('');\n const [pageError, setPageError] = useState<string | undefined>(undefined);\n /** A page just added through Add page and still being named: cancelling removes it. */\n const [newPage, setNewPage] = useState<\n { readonly key: string; readonly activeBefore: string } | undefined\n >(undefined);\n const [pageEditor, setPageEditor] = useState<\n { readonly mode: 'rename' | 'delete'; readonly key: string } | undefined\n >(undefined);\n const editorMode: 'rename' | 'delete' | undefined =\n pageEditor?.key === activeKey ? pageEditor.mode : undefined;\n const instanceId: string = useId();\n const panelId = `${instanceId}-panel`;\n const toggleRef = useRef<HTMLButtonElement>(null);\n const resetRef = useRef<HTMLButtonElement>(null);\n // Minimized widgets leave the grid for their own bar, so they stop taking\n // space. Without layout controls there is no way to restore them, so a\n // read-only dashboard shows them as normal cards.\n const minimized: WidgetDefinition[] = editable\n ? visible.filter((definition) => isMinimized(view, definition.key))\n : [];\n const shown: WidgetDefinition[] = editable\n ? visible.filter((definition) => !isMinimized(view, definition.key))\n : visible;\n const [detailKey, setDetailKey] = useState<string | undefined>(undefined);\n const gridRef = useRef<HTMLDivElement>(null);\n const twelve: boolean = usesWidthColumns(shown);\n const spans: ReadonlyMap<string, number> = useFillSpans(\n shown,\n gridRef,\n twelve\n );\n\n function change(next: DashboardLayout): void {\n if (next !== layout) onLayoutChange?.(next);\n }\n\n /** Applies a change made to the page in view (a page-level layout). */\n function changePage(next: DashboardLayout): void {\n setPageError(undefined);\n change(withPageLayout(layout, activeKey, next));\n }\n\n function selectPage(pageKey: string): void {\n const index: number = pages.findIndex((page) => page.key === pageKey);\n if (index === -1) return;\n if (activePageProp === undefined) setActiveState(pageKey);\n onActivePageChange?.(pageKey);\n setPageError(undefined);\n setPageEditor(undefined);\n setNewPage(undefined);\n setPageAnnouncement(\n labels.pageTabName(\n index + 1,\n pages.length,\n (pages[index] as LayoutPage).title\n )\n );\n }\n\n function addPageAction(): void {\n const added = addPage(layout);\n if (!added.ok) {\n setPageError(added.error);\n return;\n }\n change(added.value);\n const created: LayoutPage | undefined = added.value.pages?.at(-1);\n if (created !== undefined) {\n setNewPage({ key: created.key, activeBefore: activeKey });\n if (activePageProp === undefined) setActiveState(created.key);\n onActivePageChange?.(created.key);\n setPageError(undefined);\n setPageEditor({ mode: 'rename', key: created.key });\n }\n }\n\n function renamePageAction(title: string): string | undefined {\n const renamed = renamePage(layout, activeKey, title);\n if (!renamed.ok) return renamed.error;\n change(renamed.value);\n setPageEditor(undefined);\n setNewPage(undefined);\n return undefined;\n }\n\n /** Escape or ✕ in the page name form: a page that was just added goes away again. */\n function cancelPageEditor(): void {\n const fresh = newPage;\n setPageEditor(undefined);\n setNewPage(undefined);\n if (fresh === undefined || fresh.key !== activeKey) return;\n // The page is brand new and empty, so dropping it is exact: nothing moves.\n const pagesWithout: LayoutPage[] = pages.filter(\n (page) => page.key !== fresh.key\n );\n if (pagesWithout.length === pages.length) return;\n change({ ...layout, pages: pagesWithout });\n selectPage(fresh.activeBefore);\n }\n\n function deletePageAction(): void {\n const index: number = pages.findIndex((page) => page.key === activeKey);\n const removed = removePage(definitions, layout, activeKey, roomOptions);\n setPageEditor(undefined);\n if (!removed.ok) {\n setPageError(removed.error);\n return;\n }\n const neighbor: LayoutPage | undefined = pages[index > 0 ? index - 1 : 1];\n change(removed.value);\n if (neighbor !== undefined) selectPage(neighbor.key);\n }\n\n function moveWidgetAction(widgetKey: string, targetKey: string): void {\n let target: string = targetKey;\n let base: DashboardLayout = layout;\n if (targetKey === NEW_PAGE_VALUE) {\n const added = addPage(layout);\n if (!added.ok) {\n setPageError(added.error);\n return;\n }\n base = added.value;\n target = (added.value.pages?.at(-1) as LayoutPage).key;\n }\n const moved = moveWidgetToPage(\n definitions,\n base,\n widgetKey,\n target,\n roomOptions\n );\n if (!moved.ok) {\n setPageError(moved.error);\n return;\n }\n setPageError(undefined);\n change(moved.value);\n const destination: LayoutPage | undefined = moved.value.pages?.find(\n (page) => page.key === target\n );\n setPageAnnouncement(\n labels.movedToPage(\n byKey.get(widgetKey)?.definition.title ?? widgetKey,\n destination?.title ?? target\n )\n );\n }\n\n /** Restores a hidden widget, unless that would overflow a paged page. */\n function showAction(widgetKey: string): void {\n const next: DashboardLayout = withPageLayout(\n layout,\n activeKey,\n showWidget(view, widgetKey)\n );\n if (hasPages(next)) {\n const room = pageRoom(definitions, next, activeKey, roomOptions);\n if (room !== undefined && room.rowsUsed > room.maxRows) {\n setPageError(labels.pageFull(activePage.title, room.maxRows));\n return;\n }\n }\n setPageError(undefined);\n change(next);\n }\n\n function setEditing(next: boolean): void {\n if (editingProp === undefined) setEditingState(next);\n onEditingChange?.(next);\n setAnnouncement(next ? labels.editingOn : labels.editingOff);\n setConfirming(undefined);\n }\n\n function answerConfirmation(yes: boolean): void {\n const which: 'reset' | 'revert' | undefined = pending;\n setConfirming(undefined);\n if (yes && which === 'reset') {\n change(enforceLocks(definitions, defaultLayout ?? EMPTY_LAYOUT));\n } else if (yes && which === 'revert' && snapshot !== undefined) {\n change(snapshot);\n }\n // Focus goes back to the control that asked.\n (which === 'revert' ? toggleRef : resetRef).current?.focus();\n }\n\n return (\n <div\n className={slot(\n 'dashboard',\n 'dwt-dashboard',\n toggleMode && controlsShown && 'dwt-dashboard--editing',\n className\n )}\n >\n {editable && toggleMode && toolbar && (\n <div\n role=\"group\"\n aria-label={labels.dashboardControls}\n className={slot('toolbar', 'dwt-toolbar')}\n >\n <button\n ref={toggleRef}\n type=\"button\"\n aria-pressed={editing}\n className={slot('button', 'dwt-button', 'dwt-toolbar-toggle')}\n onClick={() => setEditing(!editing)}\n >\n {editing ? labels.done : labels.customize}\n </button>\n {editing && (\n <>\n <button\n ref={resetRef}\n type=\"button\"\n className={slot('button', 'dwt-button')}\n onClick={() => setConfirming('reset')}\n >\n {labels.reset}\n </button>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button')}\n disabled={snapshot === undefined || savedLayout === snapshot}\n onClick={() => setConfirming('revert')}\n >\n {labels.revertChanges}\n </button>\n </>\n )}\n {pending !== undefined && (\n <InlineConfirm\n message={\n pending === 'reset' ? labels.confirmReset : labels.confirmRevert\n }\n onAnswer={answerConfirmation}\n />\n )}\n <span className=\"dwt-visually-hidden\" aria-live=\"polite\">\n {announcement}\n </span>\n </div>\n )}\n {paged && (\n <PageTabs\n pages={pages}\n activeKey={activeKey}\n idPrefix={instanceId}\n panelId={panelId}\n announcement={pageAnnouncement}\n onSelect={selectPage}\n />\n )}\n {controlsShown && (\n <div\n role=\"group\"\n aria-label={labels.managePages}\n className=\"dwt-page-manage\"\n >\n <button\n type=\"button\"\n className={slot('button', 'dwt-button')}\n disabled={maxPages !== undefined && pages.length >= maxPages}\n onClick={addPageAction}\n >\n {labels.addPage}\n </button>\n {paged && editorMode === 'rename' && (\n <PageRenameForm\n key={activeKey}\n initial={activePage.title}\n onSubmit={renamePageAction}\n onCancel={cancelPageEditor}\n />\n )}\n {paged && editorMode !== 'rename' && (\n <>\n <button\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-icon-button')}\n aria-label={labels.renamePage(activePage.title)}\n title={labels.renamePage(activePage.title)}\n onClick={() =>\n setPageEditor({ mode: 'rename', key: activeKey })\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.movePageLeft(activePage.title)}\n title={labels.movePageLeft(activePage.title)}\n disabled={pages[0]?.key === activeKey}\n onClick={() => change(movePage(layout, activeKey, -1))}\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.movePageRight(activePage.title)}\n title={labels.movePageRight(activePage.title)}\n disabled={pages.at(-1)?.key === activeKey}\n onClick={() => change(movePage(layout, activeKey, 1))}\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.deletePage(activePage.title)}\n title={labels.deletePage(activePage.title)}\n onClick={() =>\n setPageEditor({ mode: 'delete', key: activeKey })\n }\n >\n <svg\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M3 4.5h10M6.5 4.5V3h3v1.5M4.5 4.5l.6 8.5h5.8l.6-8.5M6.8 7v3.5M9.2 7v3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </>\n )}\n {paged && editorMode === 'delete' && (\n <InlineConfirm\n message={labels.confirmDeletePage(activePage.title)}\n onAnswer={(yes) =>\n yes ? deletePageAction() : setPageEditor(undefined)\n }\n />\n )}\n {pageError !== undefined && (\n <span role=\"alert\" className=\"dwt-page-error\">\n {pageError}\n </span>\n )}\n </div>\n )}\n <PagePanel\n paged={paged}\n id={panelId}\n labelledBy={`${instanceId}-tab-${pages.findIndex((p) => p.key === activeKey)}`}\n >\n {controlsShown && 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={() => showAction(definition.key)}\n >\n <span aria-hidden=\"true\">+ </span>\n {definition.title}\n </button>\n ))}\n </div>\n )}\n {minimized.length > 0 && (\n <div\n className={slot('hiddenBar', 'dwt-hidden-bar', 'dwt-minimized-bar')}\n >\n <span className=\"dwt-hidden-label\">{labels.minimizedWidgets}</span>\n {minimized.map((definition) => (\n <button\n key={definition.key}\n type=\"button\"\n className={slot('button', 'dwt-button', 'dwt-show-button')}\n aria-label={labels.expand(definition.title)}\n onClick={() =>\n changePage(toggleMinimized(view, definition.key))\n }\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 {paged && pageDefs.length === 0\n ? labels.emptyPage\n : definitions.length === 0\n ? labels.noWidgets\n : labels.allHidden}\n </p>\n ) : shown.length === 0 ? null : (\n <div\n ref={gridRef}\n className={slot('grid', 'dwt-grid', twelve && 'dwt-grid--twelve')}\n >\n {shown.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 lock: ResolvedWidgetLock = resolveWidgetLock(definition);\n // The widget's own lock, shown even when `overrideLocks` ignores it.\n const ownLock: ResolvedWidgetLock = resolveWidgetLock(\n widget.definition\n );\n const isLocked: boolean =\n ownLock.move || ownLock.hide || ownLock.minimize;\n const lockLabel: string = overrideLocks\n ? labels.lockedForViewers(title)\n : labels.locked(title);\n const canMoveEarlier: boolean =\n !lock.move && moveWidgetBy(pageDefs, view, key, -1) !== view;\n const canMoveLater: boolean =\n !lock.move && moveWidgetBy(pageDefs, view, key, 1) !== view;\n const pageTargets: EditMenuItem[] =\n paged && !lock.move\n ? [\n {\n kind: 'heading',\n key: 'page-heading',\n label: labels.moveToPagePlaceholder,\n },\n ...pages\n .filter((page) => page.key !== activeKey)\n .map((page): EditMenuItem => ({\n kind: 'action',\n key: `page:${page.key}`,\n label: labels.moveToPageOption(\n page.title,\n pageRoom(definitions, layout, page.key, roomOptions)\n ?.rowsFree ?? 0\n ),\n ariaLabel: labels.moveToPageOption(\n page.title,\n pageRoom(definitions, layout, page.key, roomOptions)\n ?.rowsFree ?? 0\n ),\n onSelect: () => moveWidgetAction(key, page.key),\n })),\n ...(maxPages === undefined || pages.length < maxPages\n ? [\n {\n kind: 'action' as const,\n key: 'page:new',\n label: labels.newPageOption,\n onSelect: () =>\n moveWidgetAction(key, NEW_PAGE_VALUE),\n },\n ]\n : []),\n ]\n : [];\n const editItems: EditMenuItem[] = [\n ...(lock.move\n ? []\n : [\n {\n kind: 'action' as const,\n key: 'earlier',\n label: labels.menuMoveEarlier,\n ariaLabel: labels.moveEarlier(title),\n disabled: index === 0 || !canMoveEarlier,\n onSelect: () =>\n changePage(moveWidgetBy(pageDefs, view, key, -1)),\n },\n {\n kind: 'action' as const,\n key: 'later',\n label: labels.menuMoveLater,\n ariaLabel: labels.moveLater(title),\n disabled: index === shown.length - 1 || !canMoveLater,\n onSelect: () =>\n changePage(moveWidgetBy(pageDefs, view, key, 1)),\n },\n ]),\n ...pageTargets,\n ...(lock.hide\n ? []\n : [\n {\n kind: 'action' as const,\n key: 'hide',\n label: labels.menuHide,\n ariaLabel: labels.hide(title),\n onSelect: () => changePage(hideWidget(view, key)),\n },\n ]),\n ];\n const actions: ReactNode = controlsShown ? (\n <>\n {isLocked && (\n <span\n role=\"img\"\n className=\"dwt-lock\"\n aria-label={lockLabel}\n title={lockLabel}\n >\n <svg\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect\n x=\"3\"\n y=\"7\"\n width=\"10\"\n height=\"7\"\n rx=\"1.5\"\n fill=\"currentColor\"\n />\n <path\n d=\"M5.5 7V5a2.5 2.5 0 0 1 5 0v2\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n />\n </svg>\n </span>\n )}\n {editItems.length > 0 && (\n <WidgetEditMenu\n label={labels.arrangeWidget(title)}\n items={editItems}\n />\n )}\n </>\n ) : undefined;\n const viewable: boolean =\n resolveDetailOptions(definition) !== undefined &&\n (onOpenDetail !== undefined ||\n loadDetail !== undefined ||\n (widget.status === 'ok' &&\n deriveDetailData(widget.data) !== undefined));\n return (\n <ResolvedWidgetCard\n key={key}\n widget={widget}\n {...(viewable\n ? {\n onView: () =>\n onOpenDetail === undefined\n ? setDetailKey(key)\n : onOpenDetail(key),\n }\n : {})}\n {...spanProps(spans, key)}\n {...widthProps(twelve, definition)}\n minimized={isMinimized(view, key)}\n editing={toggleMode && controlsShown}\n {...(actions === undefined ? {} : { actions })}\n {...(editable && !lock.minimize\n ? {\n onToggleMinimized: () =>\n changePage(toggleMinimized(view, 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 </PagePanel>\n {detailKey !== undefined && byKey.get(detailKey) !== undefined && (\n <DetailHost\n key={detailKey}\n widget={byKey.get(detailKey) as DashboardWidget}\n loadDetail={loadDetail}\n onClose={() => setDetailKey(undefined)}\n />\n )}\n </div>\n );\n}\n\n/**\n * A full dashboard: widgets ordered by the viewer's layout, with move,\n * hide/show and minimize 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","import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { DashboardLayout } from '../core/layout.js';\nimport type { NormalizeOptions, PageItem } from '../core/pages.js';\nimport type {\n LayoutPersistence,\n LoadedLayout,\n SavedLayout,\n StoreResult,\n StoreScope,\n} from '../core/storage.js';\n\nexport type StoredLayoutStatus =\n 'loading' | 'ready' | 'saving' | 'error' | 'conflict';\n\nexport interface UseStoredLayoutOptions {\n /** From `createLayoutPersistence`. Keep it referentially stable. */\n readonly persistence: LayoutPersistence;\n /** Which dashboard and viewer. Changing its key loads the other layout. */\n readonly scope: StoreScope;\n /** Keep stable (module constant or `useMemo`). */\n readonly definitions: readonly PageItem[];\n /** The organization default: shown until loaded and when nothing is stored. */\n readonly defaultLayout: DashboardLayout;\n /** Wait this long after the last change before saving. Default 500 ms. */\n readonly saveDelayMs?: number;\n /** From the server render, to avoid a flash; used instead of `defaultLayout` first. */\n readonly initialLayout?: DashboardLayout;\n readonly normalizeOptions?: NormalizeOptions;\n}\n\nexport interface StoredLayoutConflict {\n /** The layout this viewer was saving. */\n readonly mine: DashboardLayout;\n /** The layout stored by someone else. */\n readonly theirs: DashboardLayout;\n}\n\nexport interface UseStoredLayoutResult {\n /** Pass to `Dashboard` as `layout`. */\n readonly layout: DashboardLayout;\n /** Pass to `Dashboard` as `onLayoutChange`. Saves after `saveDelayMs`. */\n readonly setLayout: (layout: DashboardLayout) => void;\n /** The pre-edit snapshot, or null. */\n readonly backup: DashboardLayout | null;\n /** Stores a snapshot at once (not debounced). Pass null to clear it in memory only. */\n readonly setBackup: (layout: DashboardLayout | null) => void;\n readonly status: StoredLayoutStatus;\n /** The latest failure, specific enough to log or show; null when none. */\n readonly error: string | null;\n /** Set while `status` is `'conflict'`. */\n readonly conflict: StoredLayoutConflict | null;\n /** Settle a conflict: keep this viewer's layout (overwrite) or take the stored one. */\n readonly resolveConflict: (choice: 'mine' | 'theirs') => void;\n /**\n * A change made in another tab or device while this one had unsaved edits.\n * Without unsaved edits it is applied automatically and this stays null.\n */\n readonly remoteLayout: DashboardLayout | null;\n /** Use or ignore `remoteLayout`. */\n readonly resolveRemote: (choice: 'use' | 'ignore') => void;\n}\n\n/**\n * Joins a `LayoutPersistence` to `Dashboard`. The dashboard never waits on\n * storage: it shows `initialLayout` or `defaultLayout` while loading, and a\n * failed load or save keeps the in-memory layout working and reports `error`.\n * Saves are debounced and flushed when the page is hidden. Effects don't run\n * on the server, so a server render shows the initial or default layout.\n */\nexport function useStoredLayout(\n options: UseStoredLayoutOptions\n): UseStoredLayoutResult {\n const {\n persistence,\n scope,\n definitions,\n defaultLayout,\n saveDelayMs = 500,\n initialLayout,\n normalizeOptions,\n } = options;\n const scopeKey: string = persistence.keyFor(scope);\n\n const [layout, setLayoutState] = useState<DashboardLayout>(\n initialLayout ?? defaultLayout\n );\n const [backup, setBackupState] = useState<DashboardLayout | null>(null);\n const [status, setStatus] = useState<StoredLayoutStatus>('loading');\n const [error, setError] = useState<string | null>(null);\n const [conflict, setConflict] = useState<StoredLayoutConflict | null>(null);\n const [remoteLayout, setRemoteLayout] = useState<DashboardLayout | null>(\n null\n );\n\n const latest = useRef<DashboardLayout>(layout);\n const scopeRef = useRef<StoreScope>(scope);\n scopeRef.current = scope;\n const normalizeRef = useRef<NormalizeOptions | undefined>(normalizeOptions);\n normalizeRef.current = normalizeOptions;\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n /** True from a local change until its save finishes. */\n const dirty = useRef<boolean>(false);\n\n const apply = useCallback((next: DashboardLayout): void => {\n latest.current = next;\n setLayoutState(next);\n }, []);\n\n const finishSave = useCallback(\n (result: StoreResult<SavedLayout>, mine: DashboardLayout): void => {\n if (!result.ok) {\n setError(result.error);\n setStatus('error');\n return;\n }\n const saved: SavedLayout = result.value;\n if (saved.outcome === 'saved') {\n // Edits made while this save ran are still pending: stay dirty.\n dirty.current = latest.current !== mine;\n setError(null);\n setStatus(dirty.current ? 'saving' : 'ready');\n return;\n }\n if (saved.outcome === 'kept-theirs') {\n dirty.current = false;\n apply(saved.layout);\n setError(null);\n setStatus('ready');\n return;\n }\n setConflict({ mine, theirs: saved.layout });\n setStatus('conflict');\n },\n [apply]\n );\n\n const flush = useCallback((): void => {\n if (timer.current !== undefined) {\n clearTimeout(timer.current);\n timer.current = undefined;\n }\n if (!dirty.current) return;\n const mine: DashboardLayout = latest.current;\n setStatus('saving');\n void persistence\n .save(scopeRef.current, mine)\n .then((result) => finishSave(result, mine));\n }, [persistence, finishSave]);\n\n // Load when the scope changes. A change made while loading wins.\n useEffect(() => {\n let current = true;\n setStatus('loading');\n setConflict(null);\n setRemoteLayout(null);\n void persistence\n .load(scopeRef.current, definitions, normalizeRef.current)\n .then((result) => {\n if (!current) return;\n if (!result.ok) {\n setError(result.error);\n setStatus('error');\n return;\n }\n setError(null);\n if (!dirty.current && result.value.layout !== null) {\n apply(result.value.layout);\n }\n setStatus(dirty.current ? 'saving' : 'ready');\n });\n void persistence.loadBackup(scopeRef.current).then((result) => {\n if (current && result.ok) setBackupState(result.value);\n });\n return () => {\n current = false;\n };\n // scopeKey stands for the scope's contents.\n }, [persistence, scopeKey, definitions, apply]);\n\n // Another tab or device.\n useEffect(() => {\n return persistence.watch(\n scopeRef.current,\n definitions,\n (loaded: LoadedLayout) => {\n if (loaded.layout === null) return;\n if (dirty.current) {\n setRemoteLayout(loaded.layout);\n return;\n }\n apply(loaded.layout);\n },\n normalizeRef.current\n );\n }, [persistence, scopeKey, definitions, apply]);\n\n // Flush best-effort when the page is hidden or the hook goes away.\n useEffect(() => {\n const onHide = (): void => {\n if (\n typeof document === 'undefined' ||\n document.visibilityState !== 'hidden'\n ) {\n return;\n }\n flush();\n };\n if (typeof window !== 'undefined') {\n window.addEventListener('pagehide', flush);\n document.addEventListener('visibilitychange', onHide);\n }\n return () => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('pagehide', flush);\n document.removeEventListener('visibilitychange', onHide);\n }\n flush();\n };\n }, [flush]);\n\n const setLayout = useCallback(\n (next: DashboardLayout): void => {\n apply(next);\n dirty.current = true;\n if (timer.current !== undefined) clearTimeout(timer.current);\n timer.current = setTimeout(flush, Math.max(0, saveDelayMs));\n },\n [apply, flush, saveDelayMs]\n );\n\n const setBackup = useCallback(\n (next: DashboardLayout | null): void => {\n setBackupState(next);\n if (next === null) return;\n void persistence.saveBackup(scopeRef.current, next).then((result) => {\n if (!result.ok) setError(result.error);\n });\n },\n [persistence]\n );\n\n const resolveConflict = useCallback(\n (choice: 'mine' | 'theirs'): void => {\n const pending: StoredLayoutConflict | null = conflict;\n if (pending === null) return;\n setConflict(null);\n if (choice === 'theirs') {\n dirty.current = false;\n apply(pending.theirs);\n setStatus('ready');\n return;\n }\n setStatus('saving');\n void persistence\n .save(scopeRef.current, pending.mine, { force: true })\n .then((result) => finishSave(result, pending.mine));\n },\n [conflict, persistence, apply, finishSave]\n );\n\n const resolveRemote = useCallback(\n (choice: 'use' | 'ignore'): void => {\n const remote: DashboardLayout | null = remoteLayout;\n setRemoteLayout(null);\n if (choice === 'use' && remote !== null) {\n if (timer.current !== undefined) {\n clearTimeout(timer.current);\n timer.current = undefined;\n }\n dirty.current = false;\n apply(remote);\n }\n },\n [remoteLayout, apply]\n );\n\n return {\n layout,\n setLayout,\n backup,\n setBackup,\n status,\n error,\n conflict,\n resolveConflict,\n remoteLayout,\n resolveRemote,\n };\n}\n","/**\n * Widget data payloads, one shape per kind, discriminated by `kind`.\n *\n * The kind names are upper case to stay compatible with Maker Toolkit's\n * `WidgetViewType` (`TEXT`, `GAUGE`, `TABLE`, `GRAPH`). `KPI`, `BAR_LIST`\n * and `ALERT_LIST` are new. Every payload is plain JSON: strings, finite\n * numbers, booleans, null, arrays and objects. No dates (send ISO strings),\n * no functions, no class instances.\n */\n\n/** Every widget kind, in a stable order. */\nexport const WIDGET_KINDS = [\n 'TEXT',\n 'KPI',\n 'GAUGE',\n 'TABLE',\n 'BAR_LIST',\n 'ALERT_LIST',\n 'GRAPH',\n] as const;\n\nexport type WidgetKind = (typeof WIDGET_KINDS)[number];\n\nexport function isWidgetKind(value: unknown): value is WidgetKind {\n return (\n typeof value === 'string' &&\n (WIDGET_KINDS as readonly string[]).includes(value)\n );\n}\n\n/** How a number is shown: a plain count, money, or a fraction as a percent. */\nexport const VALUE_FORMATS = ['number', 'currency', 'percent'] as const;\n\nexport type ValueFormat = (typeof VALUE_FORMATS)[number];\n\n/** A single headline value as text, e.g. \"12\" or \"Open\". */\nexport interface TextWidgetData {\n readonly kind: 'TEXT';\n readonly value: string;\n readonly label: string;\n}\n\n/**\n * A stat tile: one number, optionally compared with the previous period.\n *\n * `value` and `previous` are in major units for `currency` (12.5 is $12.50)\n * and fractions for `percent` (0.25 is 25%).\n */\nexport interface KpiWidgetData {\n readonly kind: 'KPI';\n readonly value: number;\n /** The same measure for the previous period; null or absent for none. */\n readonly previous?: number | null;\n readonly format: ValueFormat;\n /** ISO 4217 code for `currency`, e.g. \"USD\". Defaults to USD. */\n readonly currency?: string;\n readonly label: string;\n /** Short context under the value, e.g. \"Incl. shipping and tax\". */\n readonly hint?: string;\n /** Whether a rise is good news (default true). Colors the change. */\n readonly higherIsBetter?: boolean;\n}\n\n/** A value against a maximum, drawn as a meter. */\nexport interface GaugeWidgetData {\n readonly kind: 'GAUGE';\n readonly value: number;\n readonly max: number;\n readonly label: string;\n}\n\nexport interface TableColumn {\n readonly label: string;\n /** Right-aligned, tabular figures. */\n readonly numeric?: boolean;\n}\n\nexport interface TableCell {\n readonly text: string;\n /** Renders the cell as a link (http, https, mailto or relative only). */\n readonly href?: string;\n /**\n * What the card's table controls (and the detail view) sort and search\n * on, when `text` is formatted for reading: a timestamp behind \"3 days\n * ago\", a rating behind stars, an amount behind \"$1,234.00\". Default:\n * `text`.\n */\n readonly value?: string | number;\n}\n\nexport interface TableWidgetData {\n readonly kind: 'TABLE';\n readonly columns: readonly TableColumn[];\n /** One array of cells per row, each as long as `columns`. */\n readonly rows: readonly (readonly TableCell[])[];\n /** A note under the table, e.g. \"and 12 more\". */\n readonly footer?: string;\n}\n\nexport interface BarListItem {\n readonly label: string;\n readonly value: number;\n /** Text shown beside the bar; defaults to the formatted value. */\n readonly display?: string;\n}\n\n/**\n * Labelled horizontal bars, e.g. ratings or purchases by country. Bars are a\n * share of `total` when it is given, otherwise of the largest value.\n */\nexport interface BarListWidgetData {\n readonly kind: 'BAR_LIST';\n readonly items: readonly BarListItem[];\n readonly total?: number;\n}\n\nexport interface AlertListItem {\n readonly title: string;\n /** Renders the title as a link (http, https, mailto or relative only). */\n readonly href?: string;\n /** A small square image (http, https or relative only). */\n readonly thumbnailUrl?: string;\n /** The short figure on the right, e.g. \"2 left\" or \"31 views\". */\n readonly valueLabel: string;\n /** A secondary line under the title. */\n readonly detail?: string;\n}\n\n/**\n * Things that need attention (low stock, stale listings...). `items` may be\n * the first few of `total`; the renderer says \"and N more\".\n */\nexport interface AlertListWidgetData {\n readonly kind: 'ALERT_LIST';\n readonly items: readonly AlertListItem[];\n readonly total: number;\n /** Shown when there is nothing to flag, e.g. \"Nothing low on stock.\" */\n readonly emptyText: string;\n}\n\nexport interface GraphPoint {\n /** The category or date label on the x axis, e.g. \"Oct 2026\". */\n readonly label: string;\n readonly value: number;\n}\n\nexport interface GraphSeries {\n readonly name: string;\n readonly points: readonly GraphPoint[];\n}\n\n/** The most series a graph may carry: the categorical palette's eight slots. */\nexport const MAX_GRAPH_SERIES = 8;\n\n/**\n * A bar (grouped for several series) or line chart. All series share the\n * x labels of the first series, by position, and one y axis.\n */\nexport interface GraphWidgetData {\n readonly kind: 'GRAPH';\n readonly series: readonly GraphSeries[];\n readonly chartType: 'bar' | 'line';\n readonly valueFormat: ValueFormat;\n /** ISO 4217 code for `currency`. Defaults to USD. */\n readonly currency?: string;\n /** Heading for the label column in the table view, e.g. \"Month\". */\n readonly xLabel?: string;\n}\n\n/** Any widget's data, discriminated by `kind`. */\nexport type WidgetData =\n | TextWidgetData\n | KpiWidgetData\n | GaugeWidgetData\n | TableWidgetData\n | BarListWidgetData\n | AlertListWidgetData\n | GraphWidgetData;\n\n/** The payload type for one kind, e.g. `WidgetDataOf<'KPI'>`. */\nexport type WidgetDataOf<K extends WidgetKind> = Extract<\n WidgetData,\n { kind: K }\n>;\n\n/**\n * A widget with nothing to show yet, with the reason as text (\"No orders\n * synced yet.\"). Any widget may return this instead of its kind's payload.\n */\nexport interface WidgetEmptyState {\n readonly empty: true;\n readonly text: string;\n}\n\n/** What a provider or API returns for a widget: its data, or an empty state. */\nexport type WidgetPayload = WidgetData | WidgetEmptyState;\n\n/** The default text for an empty widget. */\nexport const DEFAULT_EMPTY_TEXT = 'Nothing to show yet.';\n\n/** Builds an empty state. */\nexport function emptyWidget(\n text: string = DEFAULT_EMPTY_TEXT\n): WidgetEmptyState {\n return { empty: true, text };\n}\n\nexport function isWidgetEmptyState(\n payload: WidgetPayload\n): payload is WidgetEmptyState {\n return 'empty' in payload && payload.empty === true;\n}\n\n/**\n * The empty text for a payload with nothing in it (a table with no rows, a\n * list with no items, a graph with no points), or null when it has content.\n * TEXT, KPI and GAUGE always have content.\n */\nexport function emptyTextFor(payload: WidgetPayload): string | null {\n if (isWidgetEmptyState(payload)) {\n return payload.text;\n }\n switch (payload.kind) {\n case 'TABLE':\n return payload.rows.length === 0 ? DEFAULT_EMPTY_TEXT : null;\n case 'BAR_LIST':\n return payload.items.length === 0 ? DEFAULT_EMPTY_TEXT : null;\n case 'ALERT_LIST':\n return payload.items.length === 0 ? payload.emptyText : null;\n case 'GRAPH':\n return payload.series.every((series) => series.points.length === 0)\n ? DEFAULT_EMPTY_TEXT\n : null;\n case 'TEXT':\n case 'KPI':\n case 'GAUGE':\n return null;\n }\n}\n","/**\n * Hand-written validators for widget payloads and definitions, so data from\n * an API can be checked in a client without a schema library. Problems name\n * the widget, the field path and what was wrong, e.g.\n * `Widget \"top-products\" (TABLE): rows[2][0].text must be a string, got number.`\n */\n\nimport {\n WIDGET_FILLS,\n WIDGET_SIZES,\n type WidgetDefinition,\n} from './definition.js';\nimport {\n MAX_GRAPH_SERIES,\n VALUE_FORMATS,\n WIDGET_KINDS,\n isWidgetKind,\n type WidgetKind,\n type WidgetPayload,\n} from './payload.js';\nimport { DETAIL_MODES, MAX_DETAIL_PAGE_SIZE } from './detail.js';\nimport {\n DATE_RANGE_PRESETS,\n MAX_TEXT_OPTION_LENGTH,\n MAX_WIDGET_OPTIONS,\n OPTION_KEY_PATTERN,\n WIDGET_OPTION_TYPES,\n isColumnKeyFor,\n isIsoInterval,\n parseSortValue,\n} from './options.js';\nimport { MAX_WIDGET_WIDTH, MIN_WIDGET_WIDTH, isWidgetWidth } from './grid.js';\nimport { err, ok, type Result } from './result.js';\nimport { isSafeHref, isSafeImageUrl } from './url.js';\n\n/** At most this many problems are listed in one error message. */\nexport const MAX_REPORTED_PROBLEMS = 10;\n\nexport interface ValidateWidgetDataOptions {\n /** Named in error messages, e.g. the widget key. */\n readonly widgetKey?: string;\n /** Fails unless the payload is this kind (an empty state always passes). */\n readonly expectedKind?: WidgetKind;\n}\n\ntype Problems = string[];\ntype Record_ = Readonly<Record<string, unknown>>;\n\nfunction describeType(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (typeof value === 'number' && !Number.isFinite(value)) {\n return String(value);\n }\n return typeof value;\n}\n\nfunction isRecord(value: unknown): value is Record_ {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction join(path: string, field: string): string {\n return path === '' ? field : `${path}.${field}`;\n}\n\nfunction requireString(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'string') {\n problems.push(\n `${join(path, field)} must be a string, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalString(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n if (record[field] !== undefined) {\n requireString(record, field, path, problems);\n }\n}\n\nfunction requireNumber(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n problems.push(\n `${join(path, field)} must be a finite number, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalNumber(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n if (record[field] !== undefined) {\n requireNumber(record, field, path, problems);\n }\n}\n\n/** A cell's optional sort `value`: a string or a finite number. */\nfunction optionalSortValue(\n record: Record_,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record['value'];\n if (\n value !== undefined &&\n typeof value !== 'string' &&\n !(typeof value === 'number' && Number.isFinite(value))\n ) {\n problems.push(\n `${path}.value must be a string or a finite number, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalBoolean(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (value !== undefined && typeof value !== 'boolean') {\n problems.push(\n `${join(path, field)} must be a boolean, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalUrl(\n record: Record_,\n field: string,\n path: string,\n problems: Problems,\n isSafe: (url: string) => boolean,\n allowed: string\n): void {\n const value: unknown = record[field];\n if (value === undefined) return;\n if (typeof value !== 'string') {\n problems.push(\n `${join(path, field)} must be a string, got ${describeType(value)}.`\n );\n } else if (!isSafe(value)) {\n problems.push(\n `${join(path, field)} must be ${allowed}, got ${JSON.stringify(value.slice(0, 80))}.`\n );\n }\n}\n\nfunction requireArray(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): readonly unknown[] | null {\n const value: unknown = record[field];\n if (!Array.isArray(value)) {\n problems.push(\n `${join(path, field)} must be an array, got ${describeType(value)}.`\n );\n return null;\n }\n return value;\n}\n\nfunction requireOneOf(\n record: Record_,\n field: string,\n options: readonly string[],\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'string' || !options.includes(value)) {\n problems.push(\n `${join(path, field)} must be one of ${options.map((o) => `\"${o}\"`).join(', ')}, got ${\n typeof value === 'string' ? JSON.stringify(value) : describeType(value)\n }.`\n );\n }\n}\n\n/** Runs `check` on each element that is an object, reporting the others. */\nfunction eachRecord(\n items: readonly unknown[],\n path: string,\n problems: Problems,\n check: (item: Record_, itemPath: string) => void\n): void {\n items.forEach((item: unknown, index: number) => {\n const itemPath = `${path}[${index}]`;\n if (isRecord(item)) {\n check(item, itemPath);\n } else {\n problems.push(\n `${itemPath} must be an object, got ${describeType(item)}.`\n );\n }\n });\n}\n\nconst HREF_RULE = 'an http(s), mailto or relative URL';\nconst IMAGE_RULE = 'an http(s) or relative URL';\n\nfunction checkPayloadFields(\n kind: WidgetKind,\n data: Record_,\n problems: Problems\n): void {\n switch (kind) {\n case 'TEXT':\n requireString(data, 'value', '', problems);\n requireString(data, 'label', '', problems);\n return;\n case 'KPI':\n requireNumber(data, 'value', '', problems);\n if (data['previous'] !== null) {\n optionalNumber(data, 'previous', '', problems);\n }\n requireOneOf(data, 'format', VALUE_FORMATS, '', problems);\n optionalString(data, 'currency', '', problems);\n requireString(data, 'label', '', problems);\n optionalString(data, 'hint', '', problems);\n optionalBoolean(data, 'higherIsBetter', '', problems);\n return;\n case 'GAUGE':\n requireNumber(data, 'value', '', problems);\n requireNumber(data, 'max', '', problems);\n requireString(data, 'label', '', problems);\n if (typeof data['max'] === 'number' && data['max'] <= 0) {\n problems.push(`max must be greater than 0, got ${data['max']}.`);\n }\n return;\n case 'TABLE': {\n const columns = requireArray(data, 'columns', '', problems);\n if (columns !== null) {\n eachRecord(columns, 'columns', problems, (column, path) => {\n requireString(column, 'label', path, problems);\n optionalBoolean(column, 'numeric', path, problems);\n });\n }\n const rows = requireArray(data, 'rows', '', problems);\n if (rows !== null) {\n rows.forEach((row: unknown, rowIndex: number) => {\n const rowPath = `rows[${rowIndex}]`;\n if (!Array.isArray(row)) {\n problems.push(\n `${rowPath} must be an array of cells, got ${describeType(row)}.`\n );\n return;\n }\n if (columns !== null && row.length !== columns.length) {\n problems.push(\n `${rowPath} has ${row.length} cell(s) but there are ${columns.length} column(s).`\n );\n }\n eachRecord(row, rowPath, problems, (cell, cellPath) => {\n requireString(cell, 'text', cellPath, problems);\n optionalSortValue(cell, cellPath, problems);\n optionalUrl(\n cell,\n 'href',\n cellPath,\n problems,\n isSafeHref,\n HREF_RULE\n );\n });\n });\n }\n optionalString(data, 'footer', '', problems);\n return;\n }\n case 'BAR_LIST': {\n const items = requireArray(data, 'items', '', problems);\n if (items !== null) {\n eachRecord(items, 'items', problems, (item, path) => {\n requireString(item, 'label', path, problems);\n requireNumber(item, 'value', path, problems);\n optionalString(item, 'display', path, problems);\n });\n }\n optionalNumber(data, 'total', '', problems);\n return;\n }\n case 'ALERT_LIST': {\n const items = requireArray(data, 'items', '', problems);\n if (items !== null) {\n eachRecord(items, 'items', problems, (item, path) => {\n requireString(item, 'title', path, problems);\n optionalUrl(item, 'href', path, problems, isSafeHref, HREF_RULE);\n optionalUrl(\n item,\n 'thumbnailUrl',\n path,\n problems,\n isSafeImageUrl,\n IMAGE_RULE\n );\n requireString(item, 'valueLabel', path, problems);\n optionalString(item, 'detail', path, problems);\n });\n }\n requireNumber(data, 'total', '', problems);\n requireString(data, 'emptyText', '', problems);\n if (\n items !== null &&\n typeof data['total'] === 'number' &&\n data['total'] < items.length\n ) {\n problems.push(\n `total (${data['total']}) must be at least the number of items (${items.length}).`\n );\n }\n return;\n }\n case 'GRAPH': {\n const series = requireArray(data, 'series', '', problems);\n if (series !== null) {\n if (series.length > MAX_GRAPH_SERIES) {\n problems.push(\n `series has ${series.length} entries; at most ${MAX_GRAPH_SERIES} are allowed (fold the rest into \"Other\").`\n );\n }\n eachRecord(series, 'series', problems, (entry, path) => {\n requireString(entry, 'name', path, problems);\n const points = requireArray(entry, 'points', path, problems);\n if (points !== null) {\n eachRecord(\n points,\n `${path}.points`,\n problems,\n (point, pointPath) => {\n requireString(point, 'label', pointPath, problems);\n requireNumber(point, 'value', pointPath, problems);\n }\n );\n }\n });\n }\n requireOneOf(data, 'chartType', ['bar', 'line'], '', problems);\n requireOneOf(data, 'valueFormat', VALUE_FORMATS, '', problems);\n optionalString(data, 'currency', '', problems);\n optionalString(data, 'xLabel', '', problems);\n return;\n }\n }\n}\n\n/** Checks a definition's `detail` setting: a boolean or an options object. */\nfunction checkDetailOption(detail: unknown, problems: Problems): void {\n if (detail === undefined || typeof detail === 'boolean') return;\n if (!isRecord(detail)) {\n problems.push(\n `detail must be true, false or an options object, got ${describeType(detail)}.`\n );\n return;\n }\n optionalString(detail, 'title', 'detail', problems);\n const pageSize: unknown = detail['pageSize'];\n if (\n pageSize !== undefined &&\n !(\n typeof pageSize === 'number' &&\n Number.isInteger(pageSize) &&\n pageSize >= 1 &&\n pageSize <= MAX_DETAIL_PAGE_SIZE\n )\n ) {\n problems.push(\n `detail.pageSize must be a whole number from 1 to ${MAX_DETAIL_PAGE_SIZE}, got ${typeof pageSize === 'number' ? String(pageSize) : describeType(pageSize)}.`\n );\n }\n if (detail['mode'] !== undefined) {\n requireOneOf(detail, 'mode', DETAIL_MODES, 'detail', problems);\n }\n}\n\n/** Checks a definition's `tableControls`: a boolean or `{ search, sort }`. */\nfunction checkTableControlsOption(\n controls: unknown,\n kind: unknown,\n problems: Problems\n): void {\n if (controls === undefined || controls === false) return;\n if (typeof controls !== 'boolean' && !isRecord(controls)) {\n problems.push(\n `tableControls must be true, false or an options object, got ${describeType(controls)}.`\n );\n return;\n }\n if (isRecord(controls)) {\n optionalBoolean(controls, 'search', 'tableControls', problems);\n optionalBoolean(controls, 'sort', 'tableControls', problems);\n }\n if (typeof kind === 'string' && kind !== 'TABLE') {\n problems.push(\n `tableControls only applies to TABLE widgets, but kind is \"${kind}\".`\n );\n }\n}\n\n/** Checks a definition's `locked`: a boolean or `{ move, hide, minimize }`. */\nfunction checkLockedOption(locked: unknown, problems: Problems): void {\n if (locked === undefined || typeof locked === 'boolean') return;\n if (!isRecord(locked)) {\n problems.push(\n `locked must be true, false or an object, got ${describeType(locked)}.`\n );\n return;\n }\n optionalBoolean(locked, 'move', 'locked', problems);\n optionalBoolean(locked, 'hide', 'locked', problems);\n optionalBoolean(locked, 'minimize', 'locked', problems);\n}\n\n/** Checks a list of column choices (`{ key, label }`) for a sort or columns option. */\nfunction checkOptionColumns(\n option: Record_,\n path: string,\n kind: unknown,\n problems: Problems\n): readonly string[] {\n const columns: unknown = option['columns'];\n if (!Array.isArray(columns) || columns.length === 0) {\n problems.push(\n `${join(path, 'columns')} must be a non-empty array of { key, label }, got ${describeType(columns)}.`\n );\n return [];\n }\n const keys: string[] = [];\n columns.forEach((entry: unknown, index: number) => {\n const entryPath = `${path}.columns[${index}]`;\n if (!isRecord(entry)) {\n problems.push(\n `${entryPath} must be an object, got ${describeType(entry)}.`\n );\n return;\n }\n requireString(entry, 'label', entryPath, problems);\n const key: unknown = entry['key'];\n if (typeof key !== 'string') {\n problems.push(\n `${entryPath}.key must be a string, got ${describeType(key)}.`\n );\n } else if (typeof kind === 'string' && !isColumnKeyFor(kind, key)) {\n problems.push(\n `${entryPath}.key \"${key}\" is not a column of a ${kind} widget (${\n kind === 'TABLE' ? '\"c0\", \"c1\", ...' : '\"label\" or \"value\"'\n }).`\n );\n } else if (keys.includes(key)) {\n problems.push(`${entryPath}.key \"${key}\" is used twice.`);\n } else {\n keys.push(key);\n }\n });\n return keys;\n}\n\nfunction checkOption(\n option: unknown,\n path: string,\n kind: unknown,\n seenKeys: Set<string>,\n seenTypes: Set<string>,\n problems: Problems\n): void {\n if (!isRecord(option)) {\n problems.push(`${path} must be an object, got ${describeType(option)}.`);\n return;\n }\n const type: unknown = option['type'];\n if (\n typeof type !== 'string' ||\n !WIDGET_OPTION_TYPES.includes(type as never)\n ) {\n requireOneOf(option, 'type', WIDGET_OPTION_TYPES, path, problems);\n return;\n }\n const key: unknown = option['key'];\n if (typeof key !== 'string' || !OPTION_KEY_PATTERN.test(key)) {\n problems.push(\n `${path}.key must be letters, digits, \"_\" or \"-\", starting with a letter (40 characters at most), got ${\n typeof key === 'string' ? JSON.stringify(key) : describeType(key)\n }.`\n );\n } else if (seenKeys.has(key)) {\n problems.push(`${path}.key \"${key}\" is used by another option.`);\n } else {\n seenKeys.add(key);\n }\n requireString(option, 'label', path, problems);\n\n const fallback: unknown = option['default'];\n switch (type) {\n case 'choice': {\n const choices: unknown = option['choices'];\n const values: string[] = [];\n if (!Array.isArray(choices) || choices.length === 0) {\n problems.push(\n `${path}.choices must be a non-empty array of { value, label }, got ${describeType(choices)}.`\n );\n } else {\n choices.forEach((choice: unknown, index: number) => {\n const choicePath = `${path}.choices[${index}]`;\n if (!isRecord(choice)) {\n problems.push(\n `${choicePath} must be an object, got ${describeType(choice)}.`\n );\n return;\n }\n requireString(choice, 'label', choicePath, problems);\n const value: unknown = choice['value'];\n if (typeof value !== 'string' || value === '') {\n problems.push(\n `${choicePath}.value must be a non-empty string, got ${describeType(value)}.`\n );\n } else if (values.includes(value)) {\n problems.push(`${choicePath}.value \"${value}\" is used twice.`);\n } else {\n values.push(value);\n }\n });\n }\n if (values.length > 0)\n requireOneOf(option, 'default', values, path, problems);\n break;\n }\n case 'number': {\n const { min, max, step } = option as {\n min?: unknown;\n max?: unknown;\n step?: unknown;\n };\n requireNumber(option, 'min', path, problems);\n requireNumber(option, 'max', path, problems);\n if (typeof min === 'number' && typeof max === 'number' && min > max) {\n problems.push(\n `${path}.min (${min}) must not be more than max (${max}).`\n );\n }\n if (\n step !== undefined &&\n !(typeof step === 'number' && Number.isFinite(step) && step > 0)\n ) {\n problems.push(\n `${path}.step must be a number above 0, got ${describeType(step)}.`\n );\n }\n if (typeof fallback !== 'number' || !Number.isFinite(fallback)) {\n problems.push(\n `${path}.default must be a finite number, got ${describeType(fallback)}.`\n );\n } else if (\n typeof min === 'number' &&\n typeof max === 'number' &&\n (fallback < min || fallback > max)\n ) {\n problems.push(\n `${path}.default (${fallback}) must be between min (${min}) and max (${max}).`\n );\n } else if (\n typeof min === 'number' &&\n typeof step === 'number' &&\n step > 0 &&\n Math.abs(\n (fallback - min) / step - Math.round((fallback - min) / step)\n ) > 1e-9\n ) {\n problems.push(\n `${path}.default (${fallback}) must be ${min} plus a whole number of steps of ${step}.`\n );\n }\n break;\n }\n case 'boolean':\n if (typeof fallback !== 'boolean') {\n problems.push(\n `${path}.default must be a boolean, got ${describeType(fallback)}.`\n );\n }\n break;\n case 'text': {\n const maxLength: unknown = option['maxLength'];\n if (\n typeof maxLength !== 'number' ||\n !Number.isInteger(maxLength) ||\n maxLength < 1 ||\n maxLength > MAX_TEXT_OPTION_LENGTH\n ) {\n problems.push(\n `${path}.maxLength must be a whole number from 1 to ${MAX_TEXT_OPTION_LENGTH}, got ${\n typeof maxLength === 'number' ? maxLength : describeType(maxLength)\n }.`\n );\n }\n if (typeof fallback !== 'string') {\n problems.push(\n `${path}.default must be a string, got ${describeType(fallback)}.`\n );\n } else if (typeof maxLength === 'number' && fallback.length > maxLength) {\n problems.push(\n `${path}.default is ${fallback.length} characters; maxLength is ${maxLength}.`\n );\n }\n break;\n }\n case 'dateRange': {\n const presets: unknown = option['presets'];\n const offered: string[] = [];\n if (presets !== undefined) {\n if (!Array.isArray(presets) || presets.length === 0) {\n problems.push(\n `${path}.presets must be a non-empty array of { value, label }, got ${describeType(presets)}.`\n );\n } else {\n presets.forEach((preset: unknown, index: number) => {\n const presetPath = `${path}.presets[${index}]`;\n if (!isRecord(preset)) {\n problems.push(\n `${presetPath} must be an object, got ${describeType(preset)}.`\n );\n return;\n }\n requireString(preset, 'label', presetPath, problems);\n requireOneOf(\n preset,\n 'value',\n DATE_RANGE_PRESETS,\n presetPath,\n problems\n );\n if (typeof preset['value'] === 'string')\n offered.push(preset['value']);\n });\n }\n }\n const allowed: readonly string[] =\n offered.length > 0 ? offered : DATE_RANGE_PRESETS;\n if (\n typeof fallback !== 'string' ||\n !(allowed.includes(fallback) || isIsoInterval(fallback))\n ) {\n problems.push(\n `${path}.default must be one of ${allowed.map((p) => `\"${p}\"`).join(', ')} or an interval like \"2026-01-01/2026-01-31\", got ${\n typeof fallback === 'string'\n ? JSON.stringify(fallback)\n : describeType(fallback)\n }.`\n );\n }\n break;\n }\n case 'color':\n if (typeof fallback !== 'string' || !/^#[0-9a-fA-F]{6}$/.test(fallback)) {\n problems.push(\n `${path}.default must be a color like \"#1c5cab\", got ${\n typeof fallback === 'string'\n ? JSON.stringify(fallback)\n : describeType(fallback)\n }.`\n );\n }\n break;\n case 'sort':\n case 'columns': {\n const supported: boolean =\n type === 'sort'\n ? kind === 'TABLE' || kind === 'BAR_LIST'\n : kind === 'TABLE';\n if (!supported && typeof kind === 'string') {\n problems.push(\n `${path} is a ${type} option, which only applies to ${\n type === 'sort' ? 'TABLE and BAR_LIST' : 'TABLE'\n } widgets, but kind is \"${kind}\".`\n );\n }\n if (seenTypes.has(type)) {\n problems.push(\n `${path} is a second ${type} option; a widget has at most one.`\n );\n }\n seenTypes.add(type);\n const columnKeys: readonly string[] = checkOptionColumns(\n option,\n path,\n supported ? kind : undefined,\n problems\n );\n if (option['apply'] !== undefined) {\n requireOneOf(option, 'apply', ['provider', 'client'], path, problems);\n }\n if (type === 'sort') {\n if (fallback !== undefined) {\n const sort =\n typeof fallback === 'string' ? parseSortValue(fallback) : undefined;\n if (sort === undefined) {\n problems.push(\n `${path}.default must look like \"c1:desc\" (\"column:asc\" or \"column:desc\"), got ${\n typeof fallback === 'string'\n ? JSON.stringify(fallback)\n : describeType(fallback)\n }.`\n );\n } else if (\n columnKeys.length > 0 &&\n !columnKeys.includes(sort.column)\n ) {\n requireOneOf(\n { default: sort.column },\n 'default',\n columnKeys,\n path,\n problems\n );\n }\n }\n } else if (\n !Array.isArray(fallback) ||\n fallback.length === 0 ||\n fallback.some((k: unknown) => typeof k !== 'string')\n ) {\n problems.push(\n `${path}.default must be a non-empty array of column keys, got ${describeType(fallback)}.`\n );\n } else {\n const shown = new Set<string>();\n for (const columnKey of fallback as string[]) {\n if (columnKeys.length > 0 && !columnKeys.includes(columnKey)) {\n problems.push(\n `${path}.default has \"${columnKey}\", which is not one of the columns (${columnKeys.map((c) => `\"${c}\"`).join(', ')}).`\n );\n } else if (shown.has(columnKey)) {\n problems.push(`${path}.default lists \"${columnKey}\" twice.`);\n }\n shown.add(columnKey);\n }\n }\n break;\n }\n }\n}\n\n/** Checks a definition's `options` list. */\nfunction checkOptions(\n options: unknown,\n kind: unknown,\n problems: Problems\n): void {\n if (options === undefined) return;\n if (!Array.isArray(options)) {\n problems.push(`options must be an array, got ${describeType(options)}.`);\n return;\n }\n if (options.length > MAX_WIDGET_OPTIONS) {\n problems.push(\n `options lists ${options.length} options; the most a widget may declare is ${MAX_WIDGET_OPTIONS}.`\n );\n return;\n }\n const seenKeys = new Set<string>();\n const seenTypes = new Set<string>();\n options.forEach((option: unknown, index: number) => {\n checkOption(\n option,\n `options[${index}]`,\n kind,\n seenKeys,\n seenTypes,\n problems\n );\n });\n}\n\nfunction formatProblems(prefix: string, problems: Problems): string {\n const shown: Problems = problems.slice(0, MAX_REPORTED_PROBLEMS);\n const more: number = problems.length - shown.length;\n return `${prefix}: ${shown.join(' ')}${more > 0 ? ` (and ${more} more problem(s))` : ''}`;\n}\n\n/**\n * Checks that `value` is a valid widget payload (any kind, or an empty\n * state). Returns it typed, or an error naming every problem found (up to\n * `MAX_REPORTED_PROBLEMS`). Unknown extra fields are allowed and ignored.\n */\nexport function validateWidgetData(\n value: unknown,\n options: ValidateWidgetDataOptions = {}\n): Result<WidgetPayload> {\n const subject: string =\n options.widgetKey === undefined\n ? 'Widget data'\n : `Widget ${JSON.stringify(options.widgetKey)}`;\n if (!isRecord(value)) {\n return err(`${subject}: must be an object, got ${describeType(value)}.`);\n }\n if (value['empty'] === true) {\n if (typeof value['text'] !== 'string') {\n return err(\n `${subject} (empty): text must be a string, got ${describeType(value['text'])}.`\n );\n }\n return ok(value as unknown as WidgetPayload);\n }\n const kind: unknown = value['kind'];\n if (!isWidgetKind(kind)) {\n return err(\n `${subject}: kind must be one of ${WIDGET_KINDS.join(', ')} (or the payload must be {\"empty\": true, \"text\": ...}), got ${\n typeof kind === 'string' ? JSON.stringify(kind) : describeType(kind)\n }.`\n );\n }\n if (options.expectedKind !== undefined && kind !== options.expectedKind) {\n return err(\n `${subject}: expected kind ${options.expectedKind} from its definition, got ${kind}.`\n );\n }\n const problems: Problems = [];\n checkPayloadFields(kind, value, problems);\n if (problems.length > 0) {\n return err(formatProblems(`${subject} (${kind})`, problems));\n }\n return ok(value as unknown as WidgetPayload);\n}\n\n/**\n * Checks that `value` is a valid widget definition. Returns it typed, or an\n * error naming every problem found.\n */\nexport function validateWidgetDefinition(\n value: unknown\n): Result<WidgetDefinition> {\n if (!isRecord(value)) {\n return err(\n `Widget definition: must be an object, got ${describeType(value)}.`\n );\n }\n const subject: string =\n typeof value['key'] === 'string'\n ? `Widget definition ${JSON.stringify(value['key'])}`\n : 'Widget definition';\n const problems: Problems = [];\n requireString(value, 'key', '', problems);\n if (value['key'] === '') {\n problems.push('key must not be empty.');\n }\n requireString(value, 'title', '', problems);\n optionalString(value, 'description', '', problems);\n requireOneOf(value, 'kind', WIDGET_KINDS, '', problems);\n optionalNumber(value, 'sortOrder', '', problems);\n if (value['roles'] !== undefined) {\n const roles = requireArray(value, 'roles', '', problems);\n roles?.forEach((role: unknown, index: number) => {\n if (typeof role !== 'string') {\n problems.push(\n `roles[${index}] must be a string, got ${describeType(role)}.`\n );\n }\n });\n }\n optionalBoolean(value, 'active', '', problems);\n if (value['defaultSize'] !== undefined) {\n requireOneOf(value, 'defaultSize', WIDGET_SIZES, '', problems);\n }\n if (value['width'] !== undefined && !isWidgetWidth(value['width'])) {\n problems.push(\n `width must be an integer from ${MIN_WIDGET_WIDTH} to ${MAX_WIDGET_WIDTH} (twelfths of the row), got ${typeof value['width'] === 'number' ? String(value['width']) : describeType(value['width'])}.`\n );\n }\n checkDetailOption(value['detail'], problems);\n checkTableControlsOption(value['tableControls'], value['kind'], problems);\n checkLockedOption(value['locked'], problems);\n checkOptions(value['options'], value['kind'], problems);\n if (value['page'] !== undefined) {\n if (typeof value['page'] !== 'string' || value['page'].trim() === '') {\n problems.push(\n `page must be a non-empty page key or title, got ${describeType(value['page'])}.`\n );\n }\n }\n if (value['fill'] !== undefined) {\n requireOneOf(value, 'fill', WIDGET_FILLS, '', problems);\n }\n if (problems.length > 0) {\n return err(formatProblems(subject, problems));\n }\n return ok(value as unknown as WidgetDefinition);\n}\n","/**\n * Runs each widget's data provider and collects the outcome per widget, so\n * one failing provider never breaks the rest of the dashboard. The package\n * never fetches anything itself: providers are the consumer's functions\n * (a Prisma query, an HTTP call, a computed value).\n */\n\nimport {\n isWidgetVisibleTo,\n sortDefinitions,\n type WidgetDefinition,\n} from './definition.js';\nimport {\n applyClientOptions,\n optionsCacheSuffix,\n resolveOptionValues,\n type OptionContext,\n type OptionValues,\n} from './options.js';\nimport {\n emptyTextFor,\n type WidgetData,\n type WidgetPayload,\n} from './payload.js';\nimport { describeUnknownError } from './result.js';\nimport { validateWidgetData } from './validate.js';\n\n/** The minimum a resolve context carries; add whatever your providers need. */\nexport interface WidgetContext {\n /** The viewer's roles. Widgets with `roles` need at least one of them. */\n readonly roles?: readonly string[];\n}\n\n/** What the resolver hands every provider, after the context and definition. */\nexport interface ProviderOptions {\n /**\n * Aborted when the widget times out, is refreshed, or the dashboard is torn\n * down. Pass it to `fetch` (or any cancellable call) to stop the work; a\n * provider that ignores it is still abandoned, just not stopped.\n */\n readonly signal: AbortSignal;\n /**\n * The widget's declared options, resolved: what was chosen when it is valid,\n * else the default. Empty when the definition declares none. Treat values\n * that reach a database query (`text`, `sort`, `columns`) as untrusted input\n * and check them again on the server.\n */\n readonly options: OptionValues;\n}\n\n/**\n * Loads one widget's payload. May be sync or async; may throw. The third\n * argument is optional to use: a provider that takes only `(context,\n * definition)` keeps working.\n */\nexport type WidgetProvider<C = WidgetContext> = (\n context: C,\n definition: WidgetDefinition,\n options: ProviderOptions\n) => WidgetPayload | Promise<WidgetPayload>;\n\n/** Providers keyed by widget key. */\nexport type WidgetProviders<C = WidgetContext> = Readonly<\n Record<string, WidgetProvider<C>>\n>;\n\nexport interface OkWidget {\n readonly definition: WidgetDefinition;\n readonly status: 'ok';\n readonly data: WidgetData;\n /** When the data was produced (epoch ms), set when a provider resolved it. */\n readonly updatedAt?: number;\n /** True while cached data is shown and a fresh load is still running. */\n readonly stale?: boolean;\n /** The widget's resolved option values; present when it declares options. */\n readonly options?: OptionValues;\n}\n\nexport interface EmptyWidget {\n readonly definition: WidgetDefinition;\n readonly status: 'empty';\n /** Why there is nothing to show, e.g. \"No orders synced yet.\" */\n readonly emptyText: string;\n /** The widget's resolved option values; present when it declares options. */\n readonly options?: OptionValues;\n}\n\nexport interface ErrorWidget {\n readonly definition: WidgetDefinition;\n readonly status: 'error';\n /** Names the widget and what failed. */\n readonly error: string;\n /** The widget's resolved option values; present when it declares options. */\n readonly options?: OptionValues;\n}\n\n/** One widget after its provider ran. */\nexport type ResolvedWidget = OkWidget | EmptyWidget | ErrorWidget;\n\n/** A widget whose data hasn't arrived yet (for client-side loading states). */\nexport interface LoadingWidget {\n readonly definition: WidgetDefinition;\n readonly status: 'loading';\n /** The widget's resolved option values; present when it declares options. */\n readonly options?: OptionValues;\n}\n\n/** Anything a dashboard can render: resolved, or still loading. */\nexport type DashboardWidget = ResolvedWidget | LoadingWidget;\n\nexport type WidgetStatus = DashboardWidget['status'];\n\n/** A payload the cache holds, with when it was stored (epoch ms). */\nexport interface CachedPayload {\n readonly payload: unknown;\n readonly storedAt: number;\n}\n\n/**\n * Consumer-supplied storage for widget payloads (memory, localStorage, a\n * database). The package never stores anything itself. Payloads read back\n * are validated again, so a corrupt entry cannot break a widget.\n */\nexport interface WidgetCache {\n get(\n key: string\n ): CachedPayload | undefined | Promise<CachedPayload | undefined>;\n set(key: string, entry: CachedPayload): void | Promise<void>;\n}\n\nexport interface ResolveOptions extends OptionContext {\n /**\n * The values chosen for each widget's options, by widget key. Values a\n * widget didn't declare, or that aren't valid for the option, are ignored\n * and the option's default is used.\n */\n readonly optionValues?: Readonly<\n Record<string, Readonly<Record<string, unknown>> | undefined>\n >;\n /**\n * Validate each provider's payload with `validateWidgetData` (and check\n * its kind matches the definition). Default true; turn off only for\n * trusted, typed providers.\n */\n readonly validate?: boolean;\n /**\n * Give each provider this many milliseconds. A timeout aborts the\n * provider's signal and yields an `error` widget naming the key.\n */\n readonly timeoutMs?: number;\n /** Cancels loading; affected widgets resolve as `error` (canceled). */\n readonly signal?: AbortSignal;\n /** Where to store successful payloads (see `WidgetCache`). */\n readonly cache?: WidgetCache;\n /** Cache key for a widget. Default: the widget's `key`. */\n readonly cacheKey?: (definition: WidgetDefinition) => string;\n}\n\n/**\n * Turns a payload (typically JSON from an API) into a resolved widget:\n * validated against the definition's kind, and marked empty when it has\n * nothing to show.\n */\nexport function resolvePayload(\n definition: WidgetDefinition,\n payload: unknown,\n options: ResolveOptions = {}\n): ResolvedWidget {\n let checked: WidgetPayload;\n if (options.validate === false) {\n checked = payload as WidgetPayload;\n } else {\n const result = validateWidgetData(payload, {\n widgetKey: definition.key,\n expectedKind: definition.kind,\n });\n if (!result.ok) {\n return { definition, status: 'error', error: result.error };\n }\n checked = result.value;\n }\n const emptyText: string | null = emptyTextFor(checked);\n if (emptyText !== null) {\n return { definition, status: 'empty', emptyText };\n }\n return { definition, status: 'ok', data: checked as WidgetData };\n}\n\n/** A widget that failed, with the reason. */\nexport function failedWidget(\n definition: WidgetDefinition,\n error: string\n): ErrorWidget {\n return { definition, status: 'error', error };\n}\n\n/** Loading placeholders for definitions, before their data arrives. */\nexport function loadingWidgets(\n definitions: readonly WidgetDefinition[]\n): LoadingWidget[] {\n return definitions.map((definition) => ({ definition, status: 'loading' }));\n}\n\n/**\n * The cache key for a widget under these options. With resolved option\n * `values`, choices that differ from the defaults are appended, so \"top 5 by\n * units\" and \"top 10 by revenue\" are cached apart, while a widget on its\n * defaults keeps its plain key.\n */\nexport function cacheKeyFor(\n definition: WidgetDefinition,\n options: ResolveOptions,\n values?: OptionValues\n): string {\n const base: string =\n options.cacheKey === undefined\n ? definition.key\n : options.cacheKey(definition);\n return values === undefined\n ? base\n : `${base}${optionsCacheSuffix(definition, values, options)}`;\n}\n\n/** The resolved option values for a widget under these resolve options. */\nexport function optionValuesFor(\n definition: WidgetDefinition,\n options: ResolveOptions\n): OptionValues {\n return resolveOptionValues(\n definition,\n options.optionValues?.[definition.key],\n options\n );\n}\n\n/**\n * Applies the options marked `apply: 'client'` to an `ok` widget's payload and\n * records the resolved values on the widget (when it declares options). Other\n * widgets only get the values. Returns the same object when nothing changes.\n */\nexport function finalizeWidget<W extends DashboardWidget>(\n widget: W,\n values: OptionValues\n): W {\n if (Object.keys(values).length === 0) return widget;\n if (widget.status === 'ok') {\n const data: WidgetData = applyClientOptions(\n widget.definition,\n widget.data,\n values\n );\n return { ...widget, data, options: values };\n }\n return { ...widget, options: values };\n}\n\n/** Thrown inside the resolver when a load is canceled or times out. */\nclass LoadInterruption extends Error {}\n\n/**\n * Runs one widget's provider, capturing a throw, a timeout, a cancellation or\n * a bad payload as an error widget. Never rejects.\n */\nexport async function resolveWidget<C extends WidgetContext>(\n definition: WidgetDefinition,\n provider: WidgetProvider<C> | undefined,\n context: C,\n options: ResolveOptions = {}\n): Promise<ResolvedWidget> {\n const values: OptionValues = optionValuesFor(definition, options);\n return finalizeWidget(\n await resolveWidgetUnapplied(definition, provider, context, options),\n values\n );\n}\n\n/**\n * Like `resolveWidget`, but leaves the payload as the provider returned it:\n * options marked `apply: 'client'` are not applied (see `finalizeWidget`). For\n * loaders that keep the payload so a client-side choice can change without\n * asking the provider again.\n */\nexport async function resolveWidgetUnapplied<C extends WidgetContext>(\n definition: WidgetDefinition,\n provider: WidgetProvider<C> | undefined,\n context: C,\n options: ResolveOptions = {}\n): Promise<ResolvedWidget> {\n const values: OptionValues = optionValuesFor(definition, options);\n const quotedKey: string = JSON.stringify(definition.key);\n if (provider === undefined) {\n return failedWidget(\n definition,\n `Widget ${quotedKey}: no provider is registered for this key.`\n );\n }\n if (options.signal?.aborted === true) {\n return failedWidget(\n definition,\n `Widget ${quotedKey}: loading was canceled before it started.`\n );\n }\n\n const controller = new AbortController();\n const onExternalAbort = (): void => controller.abort(options.signal?.reason);\n options.signal?.addEventListener('abort', onExternalAbort, { once: true });\n\n let timedOut = false;\n const timeoutMs: number | undefined =\n options.timeoutMs !== undefined && options.timeoutMs > 0\n ? options.timeoutMs\n : undefined;\n const timer: ReturnType<typeof setTimeout> | undefined =\n timeoutMs === undefined\n ? undefined\n : setTimeout(() => {\n timedOut = true;\n controller.abort(new Error(`Timed out after ${timeoutMs} ms.`));\n }, timeoutMs);\n\n // Rejects when the load is aborted, so a provider that ignores its signal\n // is still abandoned instead of holding the widget in \"loading\".\n const interrupted = new Promise<never>((_resolve, reject) => {\n controller.signal.addEventListener(\n 'abort',\n () => reject(new LoadInterruption()),\n { once: true }\n );\n });\n\n let payload: WidgetPayload;\n try {\n payload = await Promise.race([\n Promise.resolve().then(() => {\n // Cancelled before the provider got a turn: never call it.\n if (controller.signal.aborted) throw new LoadInterruption();\n return provider(context, definition, {\n signal: controller.signal,\n options: values,\n });\n }),\n interrupted,\n ]);\n } catch (cause: unknown) {\n if (cause instanceof LoadInterruption) {\n return failedWidget(\n definition,\n timedOut\n ? `Widget ${quotedKey}: provider timed out after ${timeoutMs} ms.`\n : `Widget ${quotedKey}: loading was canceled.`\n );\n }\n return failedWidget(\n definition,\n `Widget ${quotedKey}: provider failed: ${describeUnknownError(cause)}`\n );\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n options.signal?.removeEventListener('abort', onExternalAbort);\n }\n\n const resolved: ResolvedWidget = resolvePayload(definition, payload, options);\n if (resolved.status !== 'ok') return resolved;\n\n const storedAt: number = Date.now();\n if (options.cache !== undefined) {\n try {\n await options.cache.set(cacheKeyFor(definition, options, values), {\n payload: resolved.data,\n storedAt,\n });\n } catch {\n // A failing cache must never fail the widget.\n }\n }\n return { ...resolved, updatedAt: storedAt };\n}\n\n/**\n * The widgets a viewer can see: active, allowed for `roles`, in sort order.\n */\nexport function widgetsFor(\n definitions: readonly WidgetDefinition[],\n roles: readonly string[] | undefined\n): WidgetDefinition[] {\n return sortDefinitions(\n definitions.filter((definition) => isWidgetVisibleTo(definition, roles))\n );\n}\n\n/**\n * Resolves every widget the context's roles may see, in parallel. Inactive\n * and role-filtered widgets are skipped (and their providers never run).\n * Results come back in sort order; a provider that throws, is missing or\n * returns a bad payload yields an `error` widget and never rejects.\n */\nexport async function resolveWidgets<C extends WidgetContext>(\n definitions: readonly WidgetDefinition[],\n providers: WidgetProviders<C>,\n context: C,\n options: ResolveOptions = {}\n): Promise<ResolvedWidget[]> {\n const visible: WidgetDefinition[] = widgetsFor(definitions, context.roles);\n return Promise.all(\n visible.map((definition) =>\n resolveWidget(\n definition,\n Object.prototype.hasOwnProperty.call(providers, definition.key)\n ? providers[definition.key]\n : undefined,\n context,\n options\n )\n )\n );\n}\n","/**\n * Loads widgets one by one, after the first render, and reports each result\n * as it arrives. It is the logic behind the React `useWidgets` hook, kept\n * framework-agnostic and runtime-neutral so it can be tested without a DOM\n * and reused by other renderers. Like the rest of the core it never fetches\n * anything itself: providers do the work.\n *\n * Lifecycle: `createWidgetLoader` (nothing runs yet; every widget is\n * `loading`) then `load(key)` / `loadAll()` when you want data (immediately\n * after mount, or when a card scrolls into view), `refresh()` to reload, and\n * `dispose()` to cancel everything.\n */\n\nimport type { WidgetDefinition } from './definition.js';\nimport {\n optionsCacheSuffix,\n sameOptionValues,\n type OptionValues,\n} from './options.js';\nimport {\n cacheKeyFor,\n finalizeWidget,\n loadingWidgets,\n optionValuesFor,\n resolvePayload,\n resolveWidgetUnapplied,\n widgetsFor,\n type DashboardWidget,\n type ResolveOptions,\n type ResolvedWidget,\n type WidgetContext,\n type WidgetProviders,\n} from './resolve.js';\n\nexport interface WidgetLoaderOptions<\n C extends WidgetContext,\n> extends ResolveOptions {\n readonly definitions: readonly WidgetDefinition[];\n readonly providers: WidgetProviders<C>;\n readonly context: C;\n}\n\nexport interface RefreshOptions {\n /** Leave widgets that are still loading alone instead of restarting them. */\n readonly skipInFlight?: boolean;\n}\n\nexport interface WidgetLoader {\n /** The current widgets in display order. A new array after every change. */\n getSnapshot(): readonly DashboardWidget[];\n /** Calls `listener` after every change. Returns an unsubscribe function. */\n subscribe(listener: () => void): () => void;\n /** Starts loading one widget. Does nothing if it already started. */\n load(key: string): void;\n /** Starts loading every widget that has not started yet. */\n loadAll(): void;\n /**\n * Reloads started widgets (or just `key`). The previous call is aborted and\n * its result ignored. Visible data stays until the new data arrives; an\n * `error` widget goes back to `loading`. With `skipInFlight`, widgets that\n * are still loading are left alone (what polling wants: a provider slower\n * than the interval would otherwise be restarted forever and never finish).\n */\n refresh(key?: string, options?: RefreshOptions): void;\n /**\n * Sets the values chosen for a widget's options (all of them: keys left out\n * go back to their defaults). A choice only the toolkit applies (`sort` or\n * `columns` with `apply: 'client'`) re-derives the payload it already has.\n * A choice your provider sees reloads that widget alone: what is shown stays\n * (marked `stale`) until the new data arrives, and an earlier answer for the\n * same choices comes back from the cache. Does nothing when the resolved\n * values don't change.\n */\n setOptions(key: string, chosen: Readonly<Record<string, unknown>>): void;\n /** Aborts everything in flight and ignores any later result. */\n dispose(): void;\n}\n\nexport function createWidgetLoader<C extends WidgetContext>(\n options: WidgetLoaderOptions<C>\n): WidgetLoader {\n const { definitions, providers, context, ...baseOptions } = options;\n // What was chosen per widget; `setOptions` changes it.\n const chosen = new Map<string, Readonly<Record<string, unknown>>>(\n Object.entries(baseOptions.optionValues ?? {}).flatMap(([key, values]) =>\n values === undefined ? [] : [[key, values] as const]\n )\n );\n const resolveOptions: ResolveOptions = baseOptions;\n /** The resolve options as they are right now, with the current choices. */\n function currentOptions(): ResolveOptions {\n return { ...resolveOptions, optionValues: Object.fromEntries(chosen) };\n }\n // The payload as the provider returned it, before client-side options.\n const unapplied = new Map<string, ResolvedWidget>();\n const visible: WidgetDefinition[] = widgetsFor(definitions, context.roles);\n let snapshot: readonly DashboardWidget[] = loadingWidgets(visible);\n\n const listeners = new Set<() => void>();\n const started = new Set<string>();\n const generations = new Map<string, number>();\n const inFlight = new Map<string, AbortController>();\n let disposed = false;\n\n function publish(next: readonly DashboardWidget[]): void {\n snapshot = next;\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // One failing subscriber must not stop the others or the load.\n }\n }\n }\n\n function replace(key: string, widget: DashboardWidget): void {\n publish(\n snapshot.map((current) =>\n current.definition.key === key ? widget : current\n )\n );\n }\n\n function abortAll(reason: unknown): void {\n for (const controller of inFlight.values()) controller.abort(reason);\n inFlight.clear();\n }\n\n resolveOptions.signal?.addEventListener(\n 'abort',\n () => abortAll(resolveOptions.signal?.reason),\n { once: true }\n );\n\n async function run(\n definition: WidgetDefinition,\n readCache: boolean\n ): Promise<void> {\n const key: string = definition.key;\n const generation: number = (generations.get(key) ?? 0) + 1;\n generations.set(key, generation);\n inFlight.get(key)?.abort(new Error('Superseded by a newer load.'));\n const controller = new AbortController();\n inFlight.set(key, controller);\n const isCurrent = (): boolean =>\n !disposed && generations.get(key) === generation;\n\n const runOptions: ResolveOptions = currentOptions();\n const values: OptionValues = optionValuesFor(definition, runOptions);\n if (readCache && runOptions.cache !== undefined) {\n try {\n const entry = await runOptions.cache.get(\n cacheKeyFor(definition, runOptions, values)\n );\n if (entry !== undefined && isCurrent()) {\n const cached = resolvePayload(definition, entry.payload, runOptions);\n if (cached.status === 'ok') {\n const stale = { ...cached, updatedAt: entry.storedAt, stale: true };\n unapplied.set(key, stale);\n replace(key, finalizeWidget(stale, values));\n }\n }\n } catch {\n // An unreadable cache is just a miss.\n }\n }\n if (!isCurrent()) return;\n\n const provider = Object.prototype.hasOwnProperty.call(providers, key)\n ? providers[key]\n : undefined;\n const result = await resolveWidgetUnapplied(definition, provider, context, {\n ...runOptions,\n signal: controller.signal,\n });\n if (!isCurrent()) return;\n inFlight.delete(key);\n if (result.status === 'ok') unapplied.set(key, result);\n else unapplied.delete(key);\n replace(key, finalizeWidget(result, values));\n }\n\n function start(definition: WidgetDefinition, readCache: boolean): void {\n started.add(definition.key);\n void run(definition, readCache);\n }\n\n function definitionFor(key: string): WidgetDefinition | undefined {\n return visible.find((definition) => definition.key === key);\n }\n\n function load(key: string): void {\n if (disposed || started.has(key)) return;\n const definition: WidgetDefinition | undefined = definitionFor(key);\n if (definition !== undefined) start(definition, true);\n }\n\n function loadAll(): void {\n for (const definition of visible) load(definition.key);\n }\n\n function refresh(key?: string, refreshOptions?: RefreshOptions): void {\n if (disposed) return;\n const keys: string[] = key === undefined ? [...started] : [key];\n for (const target of keys) {\n const definition: WidgetDefinition | undefined = definitionFor(target);\n if (definition === undefined) continue;\n if (refreshOptions?.skipInFlight === true && inFlight.has(target)) {\n continue;\n }\n const current: DashboardWidget | undefined = snapshot.find(\n (widget) => widget.definition.key === target\n );\n if (current?.status === 'error') {\n replace(target, { definition, status: 'loading' });\n }\n start(definition, false);\n }\n }\n\n function setOptions(\n key: string,\n values: Readonly<Record<string, unknown>>\n ): void {\n if (disposed) return;\n const definition: WidgetDefinition | undefined = definitionFor(key);\n if (definition === undefined) return;\n const before: OptionValues = optionValuesFor(definition, currentOptions());\n chosen.set(key, { ...values });\n const runOptions: ResolveOptions = currentOptions();\n const after: OptionValues = optionValuesFor(definition, runOptions);\n if (sameOptionValues(before, after) || !started.has(key)) return;\n const kept: ResolvedWidget | undefined = unapplied.get(key);\n if (\n kept !== undefined &&\n optionsCacheSuffix(definition, before, runOptions) ===\n optionsCacheSuffix(definition, after, runOptions)\n ) {\n // Only a choice the toolkit applies changed: no need to ask again.\n replace(key, finalizeWidget(kept, after));\n return;\n }\n const current: DashboardWidget | undefined = snapshot.find(\n (widget) => widget.definition.key === key\n );\n if (current?.status === 'ok') replace(key, { ...current, stale: true });\n else if (current?.status === 'error') {\n replace(key, { definition, status: 'loading' });\n }\n start(definition, true);\n }\n\n function dispose(): void {\n disposed = true;\n abortAll(new Error('The widget loader was disposed.'));\n listeners.clear();\n }\n\n function subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n\n return {\n getSnapshot: () => snapshot,\n subscribe,\n load,\n loadAll,\n refresh,\n setOptions,\n dispose,\n };\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type RefObject,\n} from 'react';\n\nimport type { WidgetDefinition } from '../core/definition.js';\nimport { createWidgetLoader, type WidgetLoader } from '../core/loader.js';\nimport {\n loadingWidgets,\n widgetsFor,\n type DashboardWidget,\n type ResolveOptions,\n type WidgetContext,\n type WidgetProviders,\n} from '../core/resolve.js';\n\nexport interface UseWidgetsOptions extends ResolveOptions {\n /**\n * When each widget's provider starts. `'mount'` (default): right after the\n * first render, so the page and the dashboard shell appear first and each\n * card fills in as its data arrives. `'visible'`: only once the card is\n * near the viewport (attach `gridRef` to an element around the cards).\n */\n readonly loadWhen?: 'mount' | 'visible';\n /** `IntersectionObserver` margin for `loadWhen: 'visible'`. Default `'200px'`. */\n readonly rootMargin?: string;\n /**\n * Reload started widgets every this many ms. Ticks are skipped while the\n * tab is hidden, and a widget still loading is not restarted.\n */\n readonly refreshMs?: number;\n /**\n * The viewer's chosen option values by widget key (see\n * `WidgetDefinition.options`). Changing them reloads only the widgets whose\n * resolved values changed; it never recreates the loader, so it may be a\n * fresh object each render.\n */\n readonly optionValues?: Readonly<\n Record<string, Readonly<Record<string, unknown>> | undefined>\n >;\n}\n\nexport interface UseWidgetsResult {\n /** Pass to `Dashboard` or `WidgetGrid`: placeholders first, then results. */\n readonly widgets: readonly DashboardWidget[];\n /** Reload one widget (for example from the error card's Retry) or all. */\n readonly refresh: (key?: string) => void;\n /** Choose option values for one widget; same effect as `optionValues`. */\n readonly setOptions: (\n key: string,\n chosen: Readonly<Record<string, unknown>>\n ) => void;\n /**\n * For `loadWhen: 'visible'`: attach to any element that contains the cards,\n * for example a wrapper `<div ref={gridRef}>` around `Dashboard`.\n */\n readonly gridRef: RefObject<HTMLDivElement | null>;\n}\n\n/**\n * Loads widget data after the page has rendered and returns widgets for\n * `Dashboard`. The first render never waits for data (so server rendering\n * and first paint are unaffected); every widget starts as `loading`, loads\n * independently, and replaces its placeholder when its own data arrives.\n *\n * Keep `definitions`, `providers`, `context` and `options.cache` referentially\n * stable (module constants or `useMemo`): a changed value restarts loading,\n * aborting whatever is in flight.\n */\nexport function useWidgets<C extends WidgetContext>(\n definitions: readonly WidgetDefinition[],\n providers: WidgetProviders<C>,\n context: C,\n options: UseWidgetsOptions = {}\n): UseWidgetsResult {\n const {\n loadWhen = 'mount',\n rootMargin = '200px',\n refreshMs = 0,\n validate,\n timeoutMs,\n signal,\n cache,\n cacheKey,\n optionValues,\n } = options;\n\n const placeholders: readonly DashboardWidget[] = useMemo(\n () => loadingWidgets(widgetsFor(definitions, context.roles)),\n [definitions, context.roles]\n );\n const [widgets, setWidgets] =\n useState<readonly DashboardWidget[]>(placeholders);\n const [loader, setLoader] = useState<WidgetLoader | null>(null);\n const loaderRef = useRef<WidgetLoader | null>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n const optionValuesRef = useRef(optionValues);\n optionValuesRef.current = optionValues;\n\n // One loader per set of inputs. It is created in an effect (never during\n // render) so server rendering starts nothing, and so React StrictMode's\n // mount, unmount, mount cycle gets a fresh loader instead of a disposed one.\n useEffect(() => {\n const created: WidgetLoader = createWidgetLoader({\n definitions,\n providers,\n context,\n ...(validate === undefined ? {} : { validate }),\n ...(timeoutMs === undefined ? {} : { timeoutMs }),\n ...(signal === undefined ? {} : { signal }),\n ...(cache === undefined ? {} : { cache }),\n ...(cacheKey === undefined ? {} : { cacheKey }),\n ...(optionValuesRef.current === undefined\n ? {}\n : { optionValues: optionValuesRef.current }),\n });\n loaderRef.current = created;\n setWidgets(created.getSnapshot());\n const unsubscribe: () => void = created.subscribe(() =>\n setWidgets(created.getSnapshot())\n );\n setLoader(created);\n if (loadWhen === 'mount' || typeof IntersectionObserver === 'undefined') {\n created.loadAll();\n }\n return () => {\n unsubscribe();\n created.dispose();\n loaderRef.current = null;\n setLoader(null);\n };\n }, [\n definitions,\n providers,\n context,\n validate,\n timeoutMs,\n signal,\n cache,\n cacheKey,\n loadWhen,\n ]);\n\n // loadWhen 'visible': start a widget the first time its card nears the\n // viewport. Cards that appear later (another page, a restored widget) are\n // picked up as they are added, so they load when first shown.\n const cardKeys: string = widgets\n .map((widget) => widget.definition.key)\n .join('\\u0000');\n useEffect(() => {\n const grid: HTMLDivElement | null = gridRef.current;\n if (\n loader === null ||\n grid === null ||\n loadWhen !== 'visible' ||\n typeof IntersectionObserver === 'undefined'\n ) {\n return undefined;\n }\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n const key: string | undefined = (entry.target as HTMLElement).dataset[\n 'widgetKey'\n ];\n if (entry.isIntersecting && key !== undefined) {\n loader.load(key);\n observer.unobserve(entry.target);\n }\n }\n },\n { rootMargin }\n );\n const observed = new WeakSet<Element>();\n const observeNewCards = (): void => {\n grid.querySelectorAll('[data-widget-key]').forEach((card) => {\n if (observed.has(card)) return;\n observed.add(card);\n observer.observe(card);\n });\n };\n observeNewCards();\n const mutations: MutationObserver | undefined =\n typeof MutationObserver === 'undefined'\n ? undefined\n : new MutationObserver(observeNewCards);\n mutations?.observe(grid, { childList: true, subtree: true });\n return () => {\n mutations?.disconnect();\n observer.disconnect();\n };\n }, [loader, loadWhen, rootMargin, cardKeys]);\n\n // Polling: reload started widgets, skipping ticks while the tab is hidden.\n useEffect(() => {\n if (loader === null || !(refreshMs > 0)) return undefined;\n const timer = setInterval(() => {\n if (\n typeof document !== 'undefined' &&\n document.visibilityState === 'hidden'\n ) {\n return;\n }\n loader.refresh(undefined, { skipInFlight: true });\n }, refreshMs);\n return () => clearInterval(timer);\n }, [loader, refreshMs]);\n\n // Push changed option values to the running loader, which reloads just the\n // widgets whose resolved values differ.\n const optionSignature: string = JSON.stringify(optionValues ?? {});\n useEffect(() => {\n if (loader === null) return;\n for (const [key, chosen] of Object.entries(optionValuesRef.current ?? {})) {\n if (chosen !== undefined) loader.setOptions(key, chosen);\n }\n }, [loader, optionSignature]);\n\n const setOptions = useCallback(\n (key: string, chosen: Readonly<Record<string, unknown>>): void => {\n loaderRef.current?.setOptions(key, chosen);\n },\n []\n );\n\n const refresh = useCallback((key?: string): void => {\n loaderRef.current?.refresh(key);\n }, []);\n\n return { widgets, refresh, setOptions, gridRef };\n}\n"]}