@richardmcquiston01/dashboard-widgets-toolkit 0.14.0 → 0.16.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/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/payload.ts","../src/core/compat.ts","../src/core/definition.ts","../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/settings.ts","../src/core/layout.ts","../src/core/validate.ts","../src/core/resolve.ts","../src/core/loader.ts","../src/core/pages.ts","../src/core/scale.ts","../src/core/storage.ts","../src/core/theme.ts"],"names":["without","describeType","isRecord","uniqueTitle","valid"],"mappings":"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","file":"core.js","sourcesContent":["/**\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 * Maker Toolkit compatibility. Its API (`apps/api/src/widgets`) serves\n * `TEXT`, `GAUGE`, `TABLE` and `GRAPH` payloads; `TEXT` and `GAUGE` are\n * unchanged here, while `TABLE` and `GRAPH` grew richer shapes. These\n * helpers upgrade the older shapes so `validateWidgetData` accepts them.\n */\n\nimport type { WidgetDefinition } from './definition.js';\nimport { isWidgetKind } from './payload.js';\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string');\n}\n\n/**\n * Upgrades a Maker Toolkit payload to this package's shape:\n *\n * - `TABLE` `{columns: string[], rows: string[][]}` → `{label}` columns and\n * `{text}` cells.\n * - `GRAPH` `{points}` → one unnamed bar series with `valueFormat: 'number'`.\n *\n * Anything else, including payloads already in the new shape, is returned\n * unchanged. Validate the result with `validateWidgetData`.\n */\nexport function upgradeLegacyWidgetData(value: unknown): unknown {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return value;\n }\n const record = value as Readonly<Record<string, unknown>>;\n if (\n record['kind'] === 'TABLE' &&\n isStringArray(record['columns']) &&\n Array.isArray(record['rows']) &&\n record['rows'].every(isStringArray)\n ) {\n const rows = record['rows'] as string[][];\n return {\n ...record,\n columns: record['columns'].map((label) => ({ label })),\n rows: rows.map((row) => row.map((text) => ({ text }))),\n };\n }\n if (\n record['kind'] === 'GRAPH' &&\n Array.isArray(record['points']) &&\n record['series'] === undefined\n ) {\n const { points, ...rest } = record;\n return {\n ...rest,\n series: [{ name: 'Value', points }],\n chartType: 'bar',\n valueFormat: 'number',\n };\n }\n return value;\n}\n\n/** Maker Toolkit's served widget definition (`WidgetDefinition` in its API). */\nexport interface LegacyWidgetDefinition {\n readonly widgetKey: string;\n readonly title: string;\n readonly description: string | null;\n readonly viewType: string;\n readonly sortOrder: number;\n}\n\n/**\n * Maps a Maker Toolkit definition onto this package's. Returns null when\n * the view type isn't a known kind.\n */\nexport function fromLegacyDefinition(\n legacy: LegacyWidgetDefinition\n): WidgetDefinition | null {\n if (!isWidgetKind(legacy.viewType)) {\n return null;\n }\n return {\n key: legacy.widgetKey,\n title: legacy.title,\n ...(legacy.description === null ? {} : { description: legacy.description }),\n kind: legacy.viewType,\n sortOrder: legacy.sortOrder,\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 * The narrowest and widest a viewer may make the widget (integers from 2 to\n * 12, `minWidth <= width <= maxWidth`). A table that needs room sets\n * `minWidth: 6`; a KPI tile that looks silly wide sets `maxWidth: 4`.\n * Without them the full 2 to 12 range applies.\n */\n readonly minWidth?: number;\n readonly maxWidth?: 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 changing this widget. `true` locks everything:\n * move, hide, minimize and options. 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 /** Can't be given a title, width or option values of the viewer's own. */\n readonly options?: 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 options: false,\n});\nconst FULLY_LOCKED: ResolvedWidgetLock = Object.freeze({\n move: true,\n hide: true,\n minimize: true,\n options: 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 options: setting.options === 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 * 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","/**\n * A viewer's own choices for a widget: a title, a width and values for the\n * options its author declared. They live in the layout (`layout.settings`),\n * so the consumer's existing persistence saves them, and they override what\n * the definition says without changing it. Pure functions, no I/O.\n */\n\nimport {\n resolveWidgetLock,\n type WidgetDefinition,\n type WidgetFill,\n} from './definition.js';\nimport { MAX_WIDGET_WIDTH, MIN_WIDGET_WIDTH, isWidgetWidth } from './grid.js';\nimport {\n coerceOptionValue,\n defaultOptionValue,\n sameOptionValues,\n type OptionValue,\n type OptionValues,\n type WidgetOption,\n} from './options.js';\n\n/** What one viewer chose for one widget. Every field is optional. */\nexport interface WidgetViewerSettings {\n /** Replaces the widget's title. Plain text, at most 80 characters. */\n readonly title?: string;\n /** Share of the row in twelfths, within the definition's min and max. */\n readonly width?: number;\n /** May grow into the columns left over in its row (see `fill`). */\n readonly flexible?: boolean;\n /** Values for declared options, by option key. */\n readonly options?: Readonly<Record<string, OptionValue>>;\n}\n\n/** Viewer settings by widget key. */\nexport type LayoutSettings = Readonly<Record<string, WidgetViewerSettings>>;\n\n/** Longest title a viewer can give a widget; longer ones are cut. */\nexport const MAX_WIDGET_TITLE_LENGTH = 80;\n/**\n * Most widgets `parseLayout` keeps settings for: a safety ceiling against\n * malformed or hostile JSON, not a product limit.\n */\nexport const MAX_PARSED_SETTINGS = 500;\n\nconst MAX_COLUMN_LIST = 100;\nconst MAX_VALUE_LENGTH = 500;\n\n/** What these functions need from a definition. */\nexport type SettingsItem = Pick<WidgetDefinition, 'key'> &\n Partial<\n Pick<\n WidgetDefinition,\n | 'title'\n | 'width'\n | 'minWidth'\n | 'maxWidth'\n | 'fill'\n | 'locked'\n | 'options'\n >\n >;\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseOptionValue(value: unknown): OptionValue | undefined {\n if (typeof value === 'string') {\n return value.length <= MAX_VALUE_LENGTH ? value : undefined;\n }\n if (typeof value === 'number')\n return Number.isFinite(value) ? value : undefined;\n if (typeof value === 'boolean') return value;\n if (Array.isArray(value) && value.length <= MAX_COLUMN_LIST) {\n return value.every(\n (entry) => typeof entry === 'string' && entry.length <= MAX_VALUE_LENGTH\n )\n ? (value as readonly string[])\n : undefined;\n }\n return undefined;\n}\n\nfunction parseOne(raw: unknown): WidgetViewerSettings | undefined {\n if (!isRecord(raw)) return undefined;\n const title: unknown = raw['title'];\n const width: unknown = raw['width'];\n const flexible: unknown = raw['flexible'];\n const options: unknown = raw['options'];\n const cleanTitle: string =\n typeof title === 'string'\n ? title.trim().slice(0, MAX_WIDGET_TITLE_LENGTH)\n : '';\n const chosen: Record<string, OptionValue> = {};\n if (isRecord(options)) {\n for (const [key, value] of Object.entries(options)) {\n const parsed: OptionValue | undefined = parseOptionValue(value);\n if (parsed !== undefined) chosen[key] = parsed;\n }\n }\n const settings: WidgetViewerSettings = {\n ...(cleanTitle === '' ? {} : { title: cleanTitle }),\n ...(isWidgetWidth(width) ? { width } : {}),\n ...(typeof flexible === 'boolean' ? { flexible } : {}),\n ...(Object.keys(chosen).length === 0 ? {} : { options: chosen }),\n };\n return Object.keys(settings).length === 0 ? undefined : settings;\n}\n\n/**\n * Reads the `settings` field of a saved layout. Anything malformed is\n * dropped (wrong types, titles over the limit are cut, widths outside 2 to\n * 12), never an error. Returns undefined when nothing usable is left.\n */\nexport function parseSettings(raw: unknown): LayoutSettings | undefined {\n if (!isRecord(raw)) return undefined;\n const parsed: Record<string, WidgetViewerSettings> = {};\n for (const [key, value] of Object.entries(raw).slice(\n 0,\n MAX_PARSED_SETTINGS\n )) {\n if (key === '') continue;\n const one: WidgetViewerSettings | undefined = parseOne(value);\n if (one !== undefined) parsed[key] = one;\n }\n return Object.keys(parsed).length === 0 ? undefined : parsed;\n}\n\n/** The JSON-ready form of `layout.settings`; fields keep a stable order. */\nexport function serializeSettings(\n settings: LayoutSettings | undefined\n): Record<string, WidgetViewerSettings> | undefined {\n if (settings === undefined) return undefined;\n const out: Record<string, WidgetViewerSettings> = {};\n for (const key of Object.keys(settings)) {\n const one: WidgetViewerSettings | undefined = settings[key];\n if (one === undefined) continue;\n const piece: WidgetViewerSettings = {\n ...(one.title === undefined ? {} : { title: one.title }),\n ...(one.width === undefined ? {} : { width: one.width }),\n ...(one.flexible === undefined ? {} : { flexible: one.flexible }),\n ...(one.options === undefined || Object.keys(one.options).length === 0\n ? {}\n : { options: { ...one.options } }),\n };\n if (Object.keys(piece).length > 0) out[key] = piece;\n }\n return Object.keys(out).length === 0 ? undefined : out;\n}\n\n/** The narrowest and widest share a widget may take. */\nexport function widthRange(item: Pick<SettingsItem, 'minWidth' | 'maxWidth'>): {\n readonly min: number;\n readonly max: number;\n} {\n const min: number = isWidgetWidth(item.minWidth)\n ? item.minWidth\n : MIN_WIDGET_WIDTH;\n const max: number = isWidgetWidth(item.maxWidth)\n ? item.maxWidth\n : MAX_WIDGET_WIDTH;\n return { min, max: Math.max(min, max) };\n}\n\nconst WIDTH_SHARES: Readonly<Record<number, string>> = {\n 2: '1/6',\n 3: '1/4',\n 4: '1/3',\n 5: '5/12',\n 6: '1/2',\n 7: '7/12',\n 8: '2/3',\n 9: '3/4',\n 10: '5/6',\n 11: '11/12',\n 12: 'Full',\n};\n\n/** A width as a share of the row: 2 is `1/6`, 6 is `1/2`, 12 is `Full`. */\nexport function widthShareLabel(width: number): string {\n return WIDTH_SHARES[width] ?? `${width}/12`;\n}\n\n/** Whether the lock on this widget forbids viewer settings. */\nexport function isOptionsLocked(item: Pick<SettingsItem, 'locked'>): boolean {\n return resolveWidgetLock(item).options;\n}\n\n/** `fill` with width filling turned on or off, height filling untouched. */\nfunction fillWith(\n fill: WidgetFill | undefined,\n flexible: boolean\n): WidgetFill | undefined {\n const heightToo: boolean = fill === 'height' || fill === 'both';\n if (flexible) return heightToo ? 'both' : 'width';\n return heightToo ? 'height' : undefined;\n}\n\n/** Whether the widget grows into free columns: the viewer's choice, else its `fill`. */\nexport function isFlexible(\n item: Pick<SettingsItem, 'fill'>,\n settings: WidgetViewerSettings | undefined\n): boolean {\n if (settings?.flexible !== undefined) return settings.flexible;\n return item.fill === 'width' || item.fill === 'both';\n}\n\n/**\n * The definition as this viewer sees it: their title, their width (kept\n * within the definition's limits) and their choice of Flexible applied on\n * top of the author's. Returns the same object when there is nothing to\n * apply. Options are not part of the definition; read them with\n * `widgetOptionValues`.\n */\nexport function applySettings<D extends SettingsItem>(\n definition: D,\n settings: WidgetViewerSettings | undefined\n): D {\n if (settings === undefined) return definition;\n const range = widthRange(definition);\n const width: number | undefined =\n settings.width === undefined\n ? undefined\n : Math.min(range.max, Math.max(range.min, settings.width));\n const title: string | undefined =\n settings.title === undefined || settings.title.trim() === ''\n ? undefined\n : settings.title;\n const flexibleChanged: boolean =\n settings.flexible !== undefined &&\n settings.flexible !== isFlexible(definition, undefined);\n if (title === undefined && width === undefined && !flexibleChanged) {\n return definition;\n }\n const next: { -readonly [K in keyof D]: D[K] } = { ...definition };\n if (title !== undefined) next.title = title;\n if (width !== undefined) next.width = width;\n if (flexibleChanged) {\n const fill: WidgetFill | undefined = fillWith(\n definition.fill,\n settings.flexible === true\n );\n if (fill === undefined) {\n delete next.fill;\n } else {\n next.fill = fill;\n }\n }\n return next;\n}\n\n/**\n * The definitions with each viewer's settings applied. A widget whose lock\n * forbids options (`locked.options`) ignores them, so a saved layout can't\n * reach around a lock. Pass `overrideLocks` for an administrator.\n */\nexport function effectiveDefinitions<D extends SettingsItem>(\n definitions: readonly D[],\n layout: { readonly settings?: LayoutSettings },\n options: { readonly overrideLocks?: boolean } = {}\n): D[] {\n return definitions.map((definition) =>\n options.overrideLocks !== true && isOptionsLocked(definition)\n ? definition\n : applySettings(definition, layout.settings?.[definition.key])\n );\n}\n\n/**\n * The chosen option values for a widget, resolved: the viewer's where valid,\n * else the author's defaults. Empty when it declares no options.\n */\nexport function widgetOptionValues(\n definition: Pick<SettingsItem, 'options'>,\n settings: WidgetViewerSettings | undefined\n): OptionValues {\n const declared: readonly WidgetOption[] = definition.options ?? [];\n const values: Record<string, OptionValue> = {};\n for (const option of declared) {\n const picked: unknown = settings?.options?.[option.key];\n const value: OptionValue | undefined =\n (picked === undefined ? undefined : coerceOptionValue(option, picked)) ??\n defaultOptionValue(option);\n if (value !== undefined) values[option.key] = value;\n }\n return values;\n}\n\n/**\n * What to pass `useWidgets({ optionValues })` so the data follows the\n * layout: for every widget that declares options, the viewer's chosen\n * values (empty when they haven't chosen, which means the defaults). Every\n * such widget is listed so Reset sends its defaults back to the provider.\n */\nexport function optionValuesFromLayout(\n definitions: readonly Pick<SettingsItem, 'key' | 'options' | 'locked'>[],\n layout: { readonly settings?: LayoutSettings },\n options: { readonly overrideLocks?: boolean } = {}\n): Record<string, Readonly<Record<string, OptionValue>>> {\n const out: Record<string, Readonly<Record<string, OptionValue>>> = {};\n for (const definition of definitions) {\n if (definition.options === undefined || definition.options.length === 0) {\n continue;\n }\n const locked: boolean =\n options.overrideLocks !== true && isOptionsLocked(definition);\n out[definition.key] = locked\n ? {}\n : (layout.settings?.[definition.key]?.options ?? {});\n }\n return out;\n}\n\n/** Fields `setWidgetSettings` can change; `undefined` clears one. */\nexport interface WidgetSettingsPatch {\n readonly title?: string | undefined;\n readonly width?: number | undefined;\n readonly flexible?: boolean | undefined;\n /** Replaces all of the widget's option values (`undefined` clears them). */\n readonly options?: Readonly<Record<string, OptionValue>> | undefined;\n}\n\nfunction sameSettings(\n a: WidgetViewerSettings | undefined,\n b: WidgetViewerSettings | undefined\n): boolean {\n if (a === b) return true;\n return (\n a?.title === b?.title &&\n a?.width === b?.width &&\n a?.flexible === b?.flexible &&\n sameOptionValues(a?.options ?? {}, b?.options ?? {})\n );\n}\n\ntype LayoutWithSettings<L> = L & { readonly settings?: LayoutSettings };\n\n/**\n * A layout with `patch` applied to one widget's settings. Fields the patch\n * names as `undefined` are cleared; others stay. An entry left empty is\n * removed. Returns the same layout when nothing changes.\n */\nexport function setWidgetSettings<L extends object>(\n layout: LayoutWithSettings<L>,\n key: string,\n patch: WidgetSettingsPatch\n): LayoutWithSettings<L> {\n const before: WidgetViewerSettings | undefined = layout.settings?.[key];\n const draft: Record<string, unknown> = { ...before };\n for (const field of ['title', 'width', 'flexible', 'options'] as const) {\n if (!(field in patch)) continue;\n const value: unknown = patch[field];\n if (value === undefined) {\n delete draft[field];\n } else {\n draft[field] = value;\n }\n }\n const merged: WidgetViewerSettings | undefined = parseOne(draft);\n if (sameSettings(before, merged)) return layout;\n const rest: Record<string, WidgetViewerSettings> = { ...layout.settings };\n if (merged === undefined) {\n delete rest[key];\n } else {\n rest[key] = merged;\n }\n const { settings: _previous, ...others } = layout;\n void _previous;\n return Object.keys(rest).length === 0\n ? (others as LayoutWithSettings<L>)\n : ({ ...others, settings: rest } as LayoutWithSettings<L>);\n}\n\n/** A layout without one widget's settings (Reset to defaults). */\nexport function clearWidgetSettings<L extends object>(\n layout: LayoutWithSettings<L>,\n key: string\n): LayoutWithSettings<L> {\n if (layout.settings?.[key] === undefined) return layout;\n return setWidgetSettings(layout, key, {\n title: undefined,\n width: undefined,\n flexible: undefined,\n options: undefined,\n });\n}\n\n/** Lower-cased, trimmed and Unicode-normalized, for comparing titles. */\nexport function normalizeTitle(title: string): string {\n return title.normalize('NFKC').trim().toLowerCase();\n}\n\n/**\n * Whether another widget already shows `title`: compared trimmed,\n * case-insensitive and Unicode-normalized, against the other widgets'\n * effective titles. A dialog uses it to refuse a duplicate.\n */\nexport function isTitleInUse<D extends SettingsItem>(\n definitions: readonly D[],\n layout: { readonly settings?: LayoutSettings },\n key: string,\n title: string\n): boolean {\n const wanted: string = normalizeTitle(title);\n if (wanted === '') return false;\n return effectiveDefinitions(definitions, layout, {\n overrideLocks: true,\n }).some(\n (other) =>\n other.key !== key && normalizeTitle(other.title ?? other.key) === wanted\n );\n}\n\n/** `title (#2)`, `title (#3)`, ... cut to fit the limit, first one not taken. */\nfunction uniqueTitle(taken: ReadonlySet<string>, title: string): string {\n if (!taken.has(normalizeTitle(title))) return title;\n for (let n = 2; ; n += 1) {\n const suffix = ` (#${n})`;\n const candidate: string = `${title.slice(0, MAX_WIDGET_TITLE_LENGTH - suffix.length)}${suffix}`;\n if (!taken.has(normalizeTitle(candidate))) return candidate;\n }\n}\n\n/** Options for `normalizeSettings`. */\nexport interface NormalizeSettingsOptions {\n /** Keep settings that a widget's `locked.options` forbids. */\n readonly overrideLocks?: boolean;\n}\n\n/**\n * Cleans a layout's settings against the definitions, for a save endpoint:\n * drops settings of unknown widgets and of widgets locked against options,\n * clamps widths to `minWidth` and `maxWidth`, trims titles, drops option\n * values the definition didn't declare or that aren't valid for their\n * option, and makes titles unique by appending \"(#n)\". Idempotent; returns\n * the same layout when nothing changes.\n */\nexport function normalizeSettings<D extends SettingsItem, L extends object>(\n definitions: readonly D[],\n layout: LayoutWithSettings<L>,\n options: NormalizeSettingsOptions = {}\n): LayoutWithSettings<L> {\n const settings: LayoutSettings | undefined = layout.settings;\n if (settings === undefined) return layout;\n const cleaned: Record<string, WidgetViewerSettings> = {};\n // Titles other widgets show without a viewer rename are taken first.\n const taken = new Set<string>();\n for (const definition of definitions) {\n const renamed: boolean =\n settings[definition.key]?.title !== undefined &&\n (options.overrideLocks === true || !isOptionsLocked(definition));\n if (!renamed) taken.add(normalizeTitle(definition.title ?? definition.key));\n }\n for (const definition of definitions) {\n const one: WidgetViewerSettings | undefined = settings[definition.key];\n if (one === undefined) continue;\n if (options.overrideLocks !== true && isOptionsLocked(definition)) continue;\n const range = widthRange(definition);\n const chosen: Record<string, OptionValue> = {};\n for (const option of definition.options ?? []) {\n const picked: unknown = one.options?.[option.key];\n if (picked === undefined) continue;\n const value: OptionValue | undefined = coerceOptionValue(option, picked);\n // A date range keeps its preset (`last30`), which resolves to today's\n // interval when read; storing the interval would go stale.\n if (value !== undefined) {\n chosen[option.key] =\n option.type === 'dateRange' ? (picked as OptionValue) : value;\n }\n }\n let title: string | undefined = one.title;\n if (title !== undefined) {\n title = title.trim().slice(0, MAX_WIDGET_TITLE_LENGTH);\n if (title === '') {\n title = undefined;\n } else {\n title = uniqueTitle(taken, title);\n taken.add(normalizeTitle(title));\n }\n }\n const next: WidgetViewerSettings = {\n ...(title === undefined ? {} : { title }),\n ...(one.width === undefined\n ? {}\n : { width: Math.min(range.max, Math.max(range.min, one.width)) }),\n ...(one.flexible === undefined ? {} : { flexible: one.flexible }),\n ...(Object.keys(chosen).length === 0 ? {} : { options: chosen }),\n };\n if (Object.keys(next).length > 0) {\n cleaned[definition.key] = sameSettings(one, next) ? one : next;\n }\n }\n const keys: string[] = Object.keys(cleaned);\n const unchanged: boolean =\n keys.length === Object.keys(settings).length &&\n keys.every((key) => cleaned[key] === settings[key]);\n if (unchanged) return layout;\n const { settings: _previous, ...others } = layout;\n void _previous;\n return keys.length === 0\n ? (others as LayoutWithSettings<L>)\n : ({ ...others, settings: cleaned } as LayoutWithSettings<L>);\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';\nimport {\n parseSettings,\n serializeSettings,\n type LayoutSettings,\n} from './settings.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 * What the viewer chose for each widget (title, width, option values), by\n * widget key. See `settings.ts`. Absent when they chose nothing.\n */\n readonly settings?: LayoutSettings;\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 const settings: LayoutSettings | undefined = parseSettings(\n record['settings']\n );\n const withSettings = settings === undefined ? {} : { settings };\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 ...withSettings,\n };\n }\n if (order.length === 0 && hidden.length === 0 && minimized.length === 0) {\n return settings === undefined\n ? EMPTY_LAYOUT\n : { ...EMPTY_LAYOUT, settings };\n }\n return { order, hidden, minimized, ...withSettings };\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 ...(serializeSettings(layout.settings) === undefined\n ? {}\n : { settings: serializeSettings(layout.settings) }),\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 * 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 }`. */\n/** minWidth and maxWidth: integers from 2 to 12 around `width`. */\nfunction checkWidthLimits(value: Record_, problems: Problems): void {\n for (const field of ['minWidth', 'maxWidth'] as const) {\n const limit: unknown = value[field];\n if (limit !== undefined && !isWidgetWidth(limit)) {\n problems.push(\n `${field} must be an integer from ${MIN_WIDGET_WIDTH} to ${MAX_WIDGET_WIDTH} (twelfths of the row), got ${typeof limit === 'number' ? String(limit) : describeType(limit)}.`\n );\n return;\n }\n }\n const { minWidth, maxWidth, width } = value;\n if (\n isWidgetWidth(minWidth) &&\n isWidgetWidth(maxWidth) &&\n minWidth > maxWidth\n ) {\n problems.push(\n `minWidth (${minWidth}) must not be more than maxWidth (${maxWidth}).`\n );\n return;\n }\n if (isWidgetWidth(width)) {\n if (isWidgetWidth(minWidth) && width < minWidth) {\n problems.push(\n `width (${width}) must not be less than minWidth (${minWidth}).`\n );\n }\n if (isWidgetWidth(maxWidth) && width > maxWidth) {\n problems.push(\n `width (${width}) must not be more than maxWidth (${maxWidth}).`\n );\n }\n }\n}\n\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 optionalBoolean(locked, 'options', '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 checkWidthLimits(value, problems);\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","/**\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';\nimport { effectiveDefinitions, normalizeSettings } from './settings.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 enforced: DashboardLayout = enforceLocks(definitions, known, options);\n const locked: DashboardLayout = normalizeSettings(\n definitions,\n enforced,\n options\n );\n if (!hasPages(locked)) return locked === layout ? layout : locked;\n\n // The widths a viewer chose count toward a page's capacity.\n const defs: readonly T[] = effectiveDefinitions(\n options.overrideLocks === true\n ? definitions.map(withoutLockField)\n : definitions,\n locked,\n options\n );\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 locked.settings === layout.settings\n ? layout\n : result;\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 * Storage adapters: the contract a developer implements to keep a layout in\n * localStorage, IndexedDB, a REST API or a database, plus I/O-free helpers\n * built on it (`createLayoutPersistence` and small adapter wrappers). The\n * package does no I/O itself: no timers, DOM, `fetch` or storage globals.\n * See docs/design/storage-adapters.md.\n */\n\nimport {\n parseLayout,\n serializeLayout,\n type DashboardLayout,\n} from './layout.js';\nimport { normalizeLayout, type NormalizeOptions } from './pages.js';\nimport type { PageItem } from './pages.js';\nimport { describeUnknownError } from './result.js';\n\nexport type StoreErrorCode =\n /** Storage can't be reached or is disabled. */\n | 'unavailable'\n /** Storage is full. */\n | 'quota'\n /** Not allowed to read or write. */\n | 'forbidden'\n /** The stored revision is newer than the one given. */\n | 'conflict'\n /** The adapter was given something it can't store. */\n | 'invalid'\n /** What is stored can't be read back. */\n | 'corrupt';\n\nexport type StoreResult<T> =\n | { readonly ok: true; readonly value: T }\n | {\n readonly ok: false;\n readonly code: StoreErrorCode;\n /** Names the key and the cause. */\n readonly error: string;\n };\n\nexport interface StoredValue {\n /** The serialized layout. */\n readonly value: string;\n /** Opaque version (an ETag, a row version) for conflict detection. */\n readonly revision?: string;\n}\n\nexport interface StorageAdapter {\n /** Resolves `{ ok: true, value: null }` when nothing is stored. */\n get(\n key: string,\n options: { readonly signal: AbortSignal }\n ): Promise<StoreResult<StoredValue | null>>;\n /**\n * With `ifRevision`, fail with `conflict` when the stored revision differs.\n * Adapters without revisions ignore it (last write wins).\n */\n set(\n key: string,\n value: string,\n options: { readonly signal: AbortSignal; readonly ifRevision?: string }\n ): Promise<StoreResult<StoredValue>>;\n remove?(\n key: string,\n options: { readonly signal: AbortSignal }\n ): Promise<StoreResult<null>>;\n /** Optional: report a change made elsewhere (another tab). Returns an unsubscribe. */\n subscribe?(\n key: string,\n onChange: (stored: StoredValue | null) => void\n ): () => void;\n}\n\nfunction failure(\n code: StoreErrorCode,\n error: string\n): {\n readonly ok: false;\n readonly code: StoreErrorCode;\n readonly error: string;\n} {\n return { ok: false, code, error };\n}\n\n/** UTF-8 byte length without `TextEncoder` (the core has no DOM or Node lib). */\nexport function utf8Length(text: string): number {\n let bytes = 0;\n for (const char of text) {\n const point: number = char.codePointAt(0) ?? 0;\n bytes += point < 0x80 ? 1 : point < 0x800 ? 2 : point < 0x10000 ? 3 : 4;\n }\n return bytes;\n}\n\n/* ------------------------------------------------------------------ */\n/* Adapters and wrappers */\n/* ------------------------------------------------------------------ */\n\n/** An in-memory adapter with revisions and `subscribe`: tests, SSR, fallback. */\nexport function memoryAdapter(\n initial: Readonly<Record<string, string>> = {}\n): StorageAdapter {\n const entries = new Map<string, StoredValue>();\n const listeners = new Map<\n string,\n Set<(stored: StoredValue | null) => void>\n >();\n let counter = 0;\n for (const [key, value] of Object.entries(initial)) {\n counter += 1;\n entries.set(key, { value, revision: String(counter) });\n }\n const notify = (key: string, stored: StoredValue | null): void => {\n for (const listener of listeners.get(key) ?? []) listener(stored);\n };\n return {\n get: (key) =>\n Promise.resolve({ ok: true, value: entries.get(key) ?? null }),\n set: (key, value, options) => {\n const current: StoredValue | undefined = entries.get(key);\n if (\n options.ifRevision !== undefined &&\n (current?.revision ?? undefined) !== options.ifRevision\n ) {\n return Promise.resolve(\n failure(\n 'conflict',\n `Could not save \"${key}\": it changed since revision ${options.ifRevision} (now ${current?.revision ?? 'none'}).`\n )\n );\n }\n counter += 1;\n const stored: StoredValue = { value, revision: String(counter) };\n entries.set(key, stored);\n notify(key, stored);\n return Promise.resolve({ ok: true, value: stored });\n },\n remove: (key) => {\n entries.delete(key);\n notify(key, null);\n return Promise.resolve({ ok: true, value: null });\n },\n subscribe: (key, onChange) => {\n const set: Set<(stored: StoredValue | null) => void> =\n listeners.get(key) ?? new Set();\n set.add(onChange);\n listeners.set(key, set);\n return () => {\n set.delete(onChange);\n };\n },\n };\n}\n\n/** Namespaces every key, for several dashboards or apps in one store. */\nexport function withPrefix(\n adapter: StorageAdapter,\n prefix: string\n): StorageAdapter {\n return {\n get: (key, options) => adapter.get(prefix + key, options),\n set: (key, value, options) => adapter.set(prefix + key, value, options),\n ...(adapter.remove === undefined\n ? {}\n : {\n remove: (key: string, options: { readonly signal: AbortSignal }) =>\n adapter.remove?.(prefix + key, options) ??\n Promise.resolve(failure('invalid', 'remove is not supported.')),\n }),\n ...(adapter.subscribe === undefined\n ? {}\n : {\n subscribe: (\n key: string,\n onChange: (stored: StoredValue | null) => void\n ) => adapter.subscribe?.(prefix + key, onChange) ?? (() => undefined),\n }),\n };\n}\n\n/**\n * Reads from `primary`, falling back to `secondary` when it errs or holds\n * nothing. Writes go to `primary` first, then `secondary` (best effort); a\n * `conflict` from `primary` is returned as is and writes nothing else. When\n * `primary` can't be written but `secondary` can, the write counts as saved.\n */\nexport function withFallback(\n primary: StorageAdapter,\n secondary: StorageAdapter\n): StorageAdapter {\n return {\n async get(key, options) {\n const first = await primary.get(key, options);\n if (first.ok && first.value !== null) return first;\n const second = await secondary.get(key, options);\n if (second.ok && second.value !== null) return second;\n return first;\n },\n async set(key, value, options) {\n const first = await primary.set(key, value, options);\n if (!first.ok && first.code === 'conflict') return first;\n const second = await secondary.set(key, value, {\n signal: options.signal,\n });\n if (first.ok) return first;\n return second.ok ? second : first;\n },\n async remove(key, options) {\n const first = (await primary.remove?.(key, options)) ?? {\n ok: true as const,\n value: null,\n };\n await secondary.remove?.(key, options);\n return first;\n },\n subscribe: (key, onChange) => {\n const stops: (() => void)[] = [primary, secondary].flatMap((adapter) => {\n const stop: (() => void) | undefined = adapter.subscribe?.(\n key,\n onChange\n );\n return stop === undefined ? [] : [stop];\n });\n return () => {\n for (const stop of stops) stop();\n };\n },\n };\n}\n\n/** Remembers each key's last read or write, so repeated reads skip the store. */\nexport function withReadCache(adapter: StorageAdapter): StorageAdapter {\n const cache = new Map<string, StoredValue | null>();\n return {\n async get(key, options) {\n const cached: StoredValue | null | undefined = cache.get(key);\n if (cached !== undefined) return { ok: true, value: cached };\n const result = await adapter.get(key, options);\n if (result.ok) cache.set(key, result.value);\n return result;\n },\n async set(key, value, options) {\n const result = await adapter.set(key, value, options);\n if (result.ok) cache.set(key, result.value);\n else cache.delete(key);\n return result;\n },\n async remove(key, options) {\n cache.delete(key);\n return (\n (await adapter.remove?.(key, options)) ??\n failure(\n 'invalid',\n `Could not remove \"${key}\": remove is not supported.`\n )\n );\n },\n ...(adapter.subscribe === undefined\n ? {}\n : {\n subscribe: (\n key: string,\n onChange: (stored: StoredValue | null) => void\n ) =>\n adapter.subscribe?.(key, (stored) => {\n cache.set(key, stored);\n onChange(stored);\n }) ?? (() => undefined),\n }),\n };\n}\n\n/** Rejects writes with `forbidden`: previewing someone else's layout. */\nexport function readOnly(adapter: StorageAdapter): StorageAdapter {\n return {\n get: (key, options) => adapter.get(key, options),\n set: (key) =>\n Promise.resolve(\n failure(\n 'forbidden',\n `Could not save \"${key}\": this store is read-only.`\n )\n ),\n remove: (key) =>\n Promise.resolve(\n failure(\n 'forbidden',\n `Could not remove \"${key}\": this store is read-only.`\n )\n ),\n ...(adapter.subscribe === undefined\n ? {}\n : { subscribe: adapter.subscribe.bind(adapter) }),\n };\n}\n\nexport interface RetryOptions {\n /** Total tries, including the first. Default 3. */\n readonly attempts?: number;\n /** First wait in ms; doubles each retry. Default 200. */\n readonly delayMs?: number;\n /** Waits `ms`. You pass it, so the core has no timers. */\n readonly sleep: (ms: number, signal: AbortSignal) => Promise<void>;\n}\n\n/** Retries `unavailable` errors (and nothing else) with doubling waits. */\nexport function withRetry(\n adapter: StorageAdapter,\n options: RetryOptions\n): StorageAdapter {\n const attempts: number = Math.max(1, Math.floor(options.attempts ?? 3));\n const baseDelay: number = options.delayMs ?? 200;\n const retrying = async <T>(\n signal: AbortSignal,\n run: () => Promise<StoreResult<T>>\n ): Promise<StoreResult<T>> => {\n let result: StoreResult<T> = await run();\n for (\n let attempt = 1;\n attempt < attempts &&\n !result.ok &&\n result.code === 'unavailable' &&\n !signal.aborted;\n attempt += 1\n ) {\n await options.sleep(baseDelay * 2 ** (attempt - 1), signal);\n result = await run();\n }\n return result;\n };\n return {\n get: (key, o) => retrying(o.signal, () => adapter.get(key, o)),\n set: (key, value, o) =>\n retrying(o.signal, () => adapter.set(key, value, o)),\n ...(adapter.remove === undefined\n ? {}\n : {\n remove: (key: string, o: { readonly signal: AbortSignal }) =>\n retrying(\n o.signal,\n () =>\n adapter.remove?.(key, o) ??\n Promise.resolve(failure('invalid', 'remove is not supported.'))\n ),\n }),\n ...(adapter.subscribe === undefined\n ? {}\n : { subscribe: adapter.subscribe.bind(adapter) }),\n };\n}\n\nexport interface EncodingOptions {\n /** Applied before storing: compression, or encryption with your own crypto. */\n readonly encode: (value: string) => string | Promise<string>;\n /** Reverses `encode` after reading. */\n readonly decode: (value: string) => string | Promise<string>;\n}\n\n/** Transforms values on the way in and out. Keys and revisions pass through. */\nexport function withEncoding(\n adapter: StorageAdapter,\n codec: EncodingOptions\n): StorageAdapter {\n const decodeStored = async (\n key: string,\n stored: StoredValue\n ): Promise<StoreResult<StoredValue>> => {\n try {\n const value: string = await codec.decode(stored.value);\n return {\n ok: true,\n value:\n stored.revision === undefined\n ? { value }\n : { value, revision: stored.revision },\n };\n } catch (cause) {\n return failure(\n 'corrupt',\n `Could not decode the value stored at \"${key}\": ${describeUnknownError(cause)}`\n );\n }\n };\n return {\n async get(key, options) {\n const result = await adapter.get(key, options);\n if (!result.ok || result.value === null) return result;\n return decodeStored(key, result.value);\n },\n async set(key, value, options) {\n let encoded: string;\n try {\n encoded = await codec.encode(value);\n } catch (cause) {\n return failure(\n 'invalid',\n `Could not encode the value for \"${key}\": ${describeUnknownError(cause)}`\n );\n }\n const result = await adapter.set(key, encoded, options);\n if (!result.ok) return result;\n return result.value.revision === undefined\n ? { ok: true, value: { value } }\n : { ok: true, value: { value, revision: result.value.revision } };\n },\n ...(adapter.remove === undefined\n ? {}\n : { remove: adapter.remove.bind(adapter) }),\n ...(adapter.subscribe === undefined\n ? {}\n : {\n subscribe: (\n key: string,\n onChange: (stored: StoredValue | null) => void\n ) =>\n adapter.subscribe?.(key, (stored) => {\n if (stored === null) {\n onChange(null);\n return;\n }\n void decodeStored(key, stored).then((decoded) => {\n if (decoded.ok) onChange(decoded.value);\n });\n }) ?? (() => undefined),\n }),\n };\n}\n\nexport interface StorageLogEvent {\n readonly operation: 'get' | 'set' | 'remove';\n readonly key: string;\n readonly ok: boolean;\n /** Present when `ok` is false. Values are never logged. */\n readonly code?: StoreErrorCode;\n}\n\n/** Reports each operation's key and outcome. Never the stored value. */\nexport function withLogging(\n adapter: StorageAdapter,\n log: (event: StorageLogEvent) => void\n): StorageAdapter {\n const report = <T>(\n operation: StorageLogEvent['operation'],\n key: string,\n result: StoreResult<T>\n ): StoreResult<T> => {\n try {\n log(\n result.ok\n ? { operation, key, ok: true }\n : { operation, key, ok: false, code: result.code }\n );\n } catch {\n // A broken logger must not break storage.\n }\n return result;\n };\n return {\n get: async (key, o) => report('get', key, await adapter.get(key, o)),\n set: async (key, value, o) =>\n report('set', key, await adapter.set(key, value, o)),\n ...(adapter.remove === undefined\n ? {}\n : {\n remove: async (key: string, o: { readonly signal: AbortSignal }) =>\n report(\n 'remove',\n key,\n (await adapter.remove?.(key, o)) ??\n failure('invalid', 'remove is not supported.')\n ),\n }),\n ...(adapter.subscribe === undefined\n ? {}\n : { subscribe: adapter.subscribe.bind(adapter) }),\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Layout persistence */\n/* ------------------------------------------------------------------ */\n\nexport interface StoreScope {\n /** Which dashboard: 'sales'. */\n readonly dashboardKey: string;\n /** Who it belongs to; absent for shared defaults. A hint for building the key: a server takes the user from the session. */\n readonly userKey?: string;\n}\n\n/** Current envelope version written by `createLayoutPersistence`. */\nexport const LAYOUT_ENVELOPE_VERSION = 1;\n\n/** Default largest serialized layout (bytes). */\nexport const DEFAULT_MAX_LAYOUT_BYTES = 64 * 1024;\n\nexport type ConflictPolicy =\n /** Save anyway; the other device's change is lost. */\n | 'overwrite'\n /** Drop the local save and return what is stored. */\n | 'keep-theirs'\n /** Return `outcome: 'conflict'` and let the UI choose (default). */\n | 'ask'\n /** Merge, then save the result once. */\n | ((mine: DashboardLayout, theirs: DashboardLayout) => DashboardLayout);\n\nexport interface LayoutPersistenceOptions {\n /** Default 64 KB. */\n readonly maxBytes?: number;\n /** For adapters with revisions. Default `'ask'`. */\n readonly onConflict?: ConflictPolicy;\n /** Cancels every operation. */\n readonly signal?: AbortSignal;\n /** Epoch ms for the envelope's `savedAt`. Default `Date.now`. */\n readonly now?: () => number;\n}\n\nexport interface LoadedLayout {\n /** Repaired against the definitions; null when nothing is stored. */\n readonly layout: DashboardLayout | null;\n readonly revision?: string;\n /** ISO time from the envelope; absent for a bare legacy layout. */\n readonly savedAt?: string;\n}\n\nexport interface SavedLayout {\n /**\n * `saved`: stored (or merged, then stored). `kept-theirs`: the stored layout\n * won and `layout` is it. `conflict`: nothing was stored and `layout` is\n * the stored one; decide, then save again with `force: true`.\n */\n readonly outcome: 'saved' | 'kept-theirs' | 'conflict';\n /** What is now stored (or, for `conflict`, what is stored by someone else). */\n readonly layout: DashboardLayout;\n readonly revision?: string;\n}\n\nexport interface SaveOptions {\n /** Skip conflict detection and overwrite. */\n readonly force?: boolean;\n}\n\nexport interface LayoutPersistence {\n /** The adapter key for a scope, for example `dwt:sales:user-42:layout`. */\n keyFor(scope: StoreScope, part?: 'layout' | 'backup'): string;\n load(\n scope: StoreScope,\n definitions: readonly PageItem[],\n options?: NormalizeOptions\n ): Promise<StoreResult<LoadedLayout>>;\n save(\n scope: StoreScope,\n layout: DashboardLayout,\n options?: SaveOptions\n ): Promise<StoreResult<SavedLayout>>;\n loadBackup(scope: StoreScope): Promise<StoreResult<DashboardLayout | null>>;\n saveBackup(\n scope: StoreScope,\n layout: DashboardLayout\n ): Promise<StoreResult<null>>;\n /** Removes the layout and its backup. */\n reset(scope: StoreScope): Promise<StoreResult<null>>;\n /** Calls `onChange` when another tab or device changes the layout; needs `adapter.subscribe`. */\n watch(\n scope: StoreScope,\n definitions: readonly PageItem[],\n onChange: (loaded: LoadedLayout) => void,\n options?: NormalizeOptions\n ): () => void;\n}\n\ninterface Envelope {\n readonly v: number;\n readonly savedAt: string;\n readonly layout: unknown;\n}\n\nfunction keyPart(text: string): string {\n return encodeURIComponent(text);\n}\n\nfunction readEnvelope(\n key: string,\n stored: StoredValue\n): StoreResult<{ layout: DashboardLayout; savedAt?: string }> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(stored.value);\n } catch (cause) {\n return failure(\n 'corrupt',\n `The layout stored at \"${key}\" is not valid JSON: ${describeUnknownError(cause)}`\n );\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return failure(\n 'corrupt',\n `The layout stored at \"${key}\" is not an object.`\n );\n }\n const record = parsed as Record<string, unknown>;\n const version: unknown = record['v'];\n if (version === undefined) {\n // A bare layout saved by a consumer that called serializeLayout directly.\n return { ok: true, value: { layout: parseLayout(parsed) } };\n }\n if (typeof version !== 'number' || !Number.isInteger(version)) {\n return failure(\n 'corrupt',\n `The layout stored at \"${key}\" has an invalid version ${JSON.stringify(version)}.`\n );\n }\n if (version > LAYOUT_ENVELOPE_VERSION) {\n return failure(\n 'invalid',\n `The layout stored at \"${key}\" is version ${version}, newer than this toolkit reads (${LAYOUT_ENVELOPE_VERSION}). Update the package.`\n );\n }\n const envelope = record as unknown as Envelope;\n return {\n ok: true,\n value: {\n layout: parseLayout(envelope.layout),\n ...(typeof envelope.savedAt === 'string'\n ? { savedAt: envelope.savedAt }\n : {}),\n },\n };\n}\n\ninterface PendingSave {\n layout: DashboardLayout;\n force: boolean;\n readonly waiters: ((result: StoreResult<SavedLayout>) => void)[];\n}\n\n/**\n * Persistence for layouts over any `StorageAdapter`: an envelope with a\n * version, tolerant reads repaired against today's definitions, a size limit,\n * revision tracking with a conflict policy, and saves serialized per key so\n * rapid edits never race (while one save is in flight, later ones collapse\n * into the newest).\n */\nexport function createLayoutPersistence(\n adapter: StorageAdapter,\n options: LayoutPersistenceOptions = {}\n): LayoutPersistence {\n const maxBytes: number = options.maxBytes ?? DEFAULT_MAX_LAYOUT_BYTES;\n const policy: ConflictPolicy = options.onConflict ?? 'ask';\n const fallbackSignal: AbortSignal = new AbortController().signal;\n const signal: AbortSignal = options.signal ?? fallbackSignal;\n const now: () => number = options.now ?? Date.now;\n const revisions = new Map<string, string>();\n const lastWritten = new Map<string, string>();\n const inFlight = new Set<string>();\n const pending = new Map<string, PendingSave>();\n\n const keyFor = (\n scope: StoreScope,\n part: 'layout' | 'backup' = 'layout'\n ): string =>\n `dwt:${keyPart(scope.dashboardKey)}:${keyPart(scope.userKey ?? '_')}:${part}`;\n\n const checkScope = (scope: StoreScope): StoreResult<null> =>\n scope.dashboardKey.trim() === ''\n ? failure('invalid', 'The storage scope needs a non-empty dashboardKey.')\n : { ok: true, value: null };\n\n const encode = (\n layout: DashboardLayout,\n key: string\n ): StoreResult<string> => {\n const envelope: Envelope = {\n v: LAYOUT_ENVELOPE_VERSION,\n savedAt: new Date(now()).toISOString(),\n layout: JSON.parse(serializeLayout(layout)) as unknown,\n };\n const text: string = JSON.stringify(envelope);\n const size: number = utf8Length(text);\n if (size > maxBytes) {\n return failure(\n 'invalid',\n `Could not save \"${key}\": the layout is ${size} bytes, over the ${maxBytes} byte limit.`\n );\n }\n return { ok: true, value: text };\n };\n\n const guarded = async <T>(\n key: string,\n action: string,\n run: () => Promise<StoreResult<T>>\n ): Promise<StoreResult<T>> => {\n try {\n return await run();\n } catch (cause) {\n return failure(\n 'unavailable',\n `Could not ${action} \"${key}\": the adapter threw ${describeUnknownError(cause)}`\n );\n }\n };\n\n const readLayout = async (\n scope: StoreScope,\n part: 'layout' | 'backup'\n ): Promise<StoreResult<LoadedLayout>> => {\n const key: string = keyFor(scope, part);\n const result = await guarded(key, 'load', () =>\n adapter.get(key, { signal })\n );\n if (!result.ok) return result;\n if (result.value === null) {\n if (part === 'layout') revisions.delete(key);\n return { ok: true, value: { layout: null } };\n }\n const read = readEnvelope(key, result.value);\n if (!read.ok) return read;\n if (part === 'layout' && result.value.revision !== undefined) {\n revisions.set(key, result.value.revision);\n }\n return {\n ok: true,\n value: {\n layout: read.value.layout,\n ...(result.value.revision === undefined\n ? {}\n : { revision: result.value.revision }),\n ...(read.value.savedAt === undefined\n ? {}\n : { savedAt: read.value.savedAt }),\n },\n };\n };\n\n const repair = (\n loaded: LoadedLayout,\n definitions: readonly PageItem[],\n normalizeOptions: NormalizeOptions | undefined\n ): LoadedLayout =>\n loaded.layout === null\n ? loaded\n : {\n ...loaded,\n layout: normalizeLayout(definitions, loaded.layout, normalizeOptions),\n };\n\n const write = async (\n scope: StoreScope,\n layout: DashboardLayout,\n force: boolean\n ): Promise<StoreResult<SavedLayout>> => {\n const key: string = keyFor(scope);\n const text = encode(layout, key);\n if (!text.ok) return text;\n const known: string | undefined = revisions.get(key);\n lastWritten.set(key, text.value);\n const stored = await guarded(key, 'save', () =>\n adapter.set(key, text.value, {\n signal,\n ...(force || known === undefined ? {} : { ifRevision: known }),\n })\n );\n if (stored.ok) {\n if (stored.value.revision !== undefined) {\n revisions.set(key, stored.value.revision);\n }\n return {\n ok: true,\n value: {\n outcome: 'saved',\n layout,\n ...(stored.value.revision === undefined\n ? {}\n : { revision: stored.value.revision }),\n },\n };\n }\n if (stored.code !== 'conflict') return stored;\n\n const theirs = await readLayout(scope, 'layout');\n if (!theirs.ok) return theirs;\n const theirLayout: DashboardLayout = theirs.value.layout ?? layout;\n const theirRevision = theirs.value.revision;\n const asResult = (\n outcome: SavedLayout['outcome']\n ): StoreResult<SavedLayout> => ({\n ok: true,\n value: {\n outcome,\n layout: theirLayout,\n ...(theirRevision === undefined ? {} : { revision: theirRevision }),\n },\n });\n if (policy === 'overwrite') return write(scope, layout, true);\n if (policy === 'keep-theirs') return asResult('kept-theirs');\n if (policy === 'ask') return asResult('conflict');\n let merged: DashboardLayout;\n try {\n merged = policy(layout, theirLayout);\n } catch (cause) {\n return failure(\n 'invalid',\n `Could not save \"${key}\": the conflict merge function threw ${describeUnknownError(cause)}`\n );\n }\n const second = await write(scope, merged, false);\n if (second.ok && second.value.outcome === 'saved') return second;\n return second.ok ? asResult('conflict') : second;\n };\n\n const drain = async (\n scope: StoreScope,\n key: string,\n first: PendingSave\n ): Promise<void> => {\n let job: PendingSave | undefined = first;\n inFlight.add(key);\n while (job !== undefined) {\n const current: PendingSave = job;\n pending.delete(key);\n const result: StoreResult<SavedLayout> = await write(\n scope,\n current.layout,\n current.force\n );\n for (const waiter of current.waiters) waiter(result);\n job = pending.get(key);\n }\n inFlight.delete(key);\n };\n\n return {\n keyFor,\n async load(scope, definitions, normalizeOptions) {\n const valid = checkScope(scope);\n if (!valid.ok) return valid;\n const read = await readLayout(scope, 'layout');\n if (!read.ok) return read;\n return {\n ok: true,\n value: repair(read.value, definitions, normalizeOptions),\n };\n },\n save(scope, layout, saveOptions = {}) {\n const valid = checkScope(scope);\n if (!valid.ok) return Promise.resolve(valid);\n const key: string = keyFor(scope);\n const force: boolean = saveOptions.force === true;\n return new Promise<StoreResult<SavedLayout>>((resolve) => {\n const queued: PendingSave | undefined = pending.get(key);\n if (queued !== undefined) {\n // Newest wins: this layout replaces the one that hasn't started.\n queued.layout = layout;\n queued.force = queued.force || force;\n queued.waiters.push(resolve);\n return;\n }\n const job: PendingSave = { layout, force, waiters: [resolve] };\n if (inFlight.has(key)) {\n pending.set(key, job);\n return;\n }\n void drain(scope, key, job);\n });\n },\n async loadBackup(scope) {\n const valid = checkScope(scope);\n if (!valid.ok) return valid;\n const read = await readLayout(scope, 'backup');\n return read.ok ? { ok: true, value: read.value.layout } : read;\n },\n async saveBackup(scope, layout) {\n const valid = checkScope(scope);\n if (!valid.ok) return valid;\n const key: string = keyFor(scope, 'backup');\n const text = encode(layout, key);\n if (!text.ok) return text;\n const stored = await guarded(key, 'save', () =>\n adapter.set(key, text.value, { signal })\n );\n return stored.ok ? { ok: true, value: null } : stored;\n },\n async reset(scope) {\n const valid = checkScope(scope);\n if (!valid.ok) return valid;\n const layoutKey: string = keyFor(scope);\n const backupKey: string = keyFor(scope, 'backup');\n if (adapter.remove === undefined) {\n return failure(\n 'invalid',\n `Could not reset \"${layoutKey}\": the adapter has no remove method.`\n );\n }\n const remove = adapter.remove.bind(adapter);\n const first = await guarded(layoutKey, 'remove', () =>\n remove(layoutKey, { signal })\n );\n revisions.delete(layoutKey);\n if (!first.ok) return first;\n const second = await guarded(backupKey, 'remove', () =>\n remove(backupKey, { signal })\n );\n return second.ok ? { ok: true, value: null } : second;\n },\n watch(scope, definitions, onChange, normalizeOptions) {\n const key: string = keyFor(scope);\n const stop: (() => void) | undefined = adapter.subscribe?.(\n key,\n (stored) => {\n if (stored === null) {\n revisions.delete(key);\n onChange({ layout: null });\n return;\n }\n if (\n stored.value === lastWritten.get(key) ||\n (stored.revision !== undefined &&\n stored.revision === revisions.get(key))\n ) {\n return; // Our own save echoing back.\n }\n const read = readEnvelope(key, stored);\n if (!read.ok) return;\n onChange(\n repair(\n {\n layout: read.value.layout,\n ...(stored.revision === undefined\n ? {}\n : { revision: stored.revision }),\n ...(read.value.savedAt === undefined\n ? {}\n : { savedAt: read.value.savedAt }),\n },\n definitions,\n normalizeOptions\n )\n );\n }\n );\n return stop ?? (() => undefined);\n },\n };\n}\n","/**\n * Theming: turns a typed token object into scoped CSS for the `--dwt-*` custom\n * properties. Runtime-neutral: it only builds a string, so a Node API, a build\n * script or an SSR server can produce a theme without React or a DOM.\n *\n * The built-in defaults are declared on `.dwt-dashboard` and `.dwt-card`, so a\n * variable set on an ancestor is shadowed. The generated selectors therefore\n * target those two classes beneath a scope and out-rank the built-in dark rules.\n * See docs/design/theming.md.\n */\n\nimport { MAX_GRAPH_SERIES } from './payload.js';\nimport { err, ok, type Result } from './result.js';\n\nexport type ThemeColorKey =\n | 'surface'\n | 'page'\n | 'text'\n | 'textSecondary'\n | 'textMuted'\n | 'border'\n | 'grid'\n | 'baseline'\n | 'crosshair'\n | 'link'\n | 'focus'\n | 'good'\n | 'bad'\n | 'meterTrack'\n | 'barTrack'\n | 'buttonHover';\n\nexport type ThemeLengthKey = 'radius' | 'gap' | 'padding' | 'minColumn';\n\nexport type ThemeTokenKey = ThemeColorKey | ThemeLengthKey | 'font';\n\n/** The CSS custom property each token key sets (series are `--dwt-series-N`). */\nexport const THEME_TOKEN_VARIABLES: Readonly<Record<ThemeTokenKey, string>> = {\n font: '--dwt-font',\n surface: '--dwt-surface',\n page: '--dwt-page',\n text: '--dwt-text',\n textSecondary: '--dwt-text-secondary',\n textMuted: '--dwt-text-muted',\n border: '--dwt-border',\n grid: '--dwt-grid',\n baseline: '--dwt-baseline',\n crosshair: '--dwt-crosshair',\n link: '--dwt-link',\n focus: '--dwt-focus',\n good: '--dwt-good',\n bad: '--dwt-bad',\n meterTrack: '--dwt-meter-track',\n barTrack: '--dwt-bar-track',\n buttonHover: '--dwt-button-hover',\n radius: '--dwt-radius',\n gap: '--dwt-gap',\n padding: '--dwt-padding',\n minColumn: '--dwt-min-column',\n};\n\ntype TokenKind = 'color' | 'length' | 'font';\n\nconst LENGTH_KEYS: ReadonlySet<string> = new Set([\n 'radius',\n 'gap',\n 'padding',\n 'minColumn',\n]);\n\nfunction kindOf(key: ThemeTokenKey): TokenKind {\n if (key === 'font') {\n return 'font';\n }\n return LENGTH_KEYS.has(key) ? 'length' : 'color';\n}\n\nexport type ThemeTokens = {\n readonly [Key in ThemeTokenKey]?: string;\n} & {\n /** Chart colors in order; fills `--dwt-series-1` to `--dwt-series-N`. */\n readonly series?: readonly string[];\n};\n\nexport interface ThemeOptions {\n /** Lower-case letters, digits and hyphens, starting with a letter. */\n readonly name: string;\n /**\n * Selector of an ancestor of the dashboard. Defaults to\n * `[data-dwt-theme='<name>']`. Letters, digits, `_ - [ ] = . # ' \"` and spaces\n * only.\n */\n readonly scope?: string;\n /** Applied in light and dark mode. */\n readonly base?: ThemeTokens;\n /** Applied in light mode only; wins over `base`. */\n readonly light?: ThemeTokens;\n /** Applied in dark mode only; wins over `base`. */\n readonly dark?: ThemeTokens;\n}\n\nexport type ThemeMode = 'base' | 'light' | 'dark';\n\nexport interface WidgetThemeStyles {\n readonly name: string;\n readonly scope: string;\n /** For a `<style>` element or the head of a server-rendered page. */\n readonly css: string;\n /** The resolved custom properties per mode, e.g. `{'--dwt-surface': '#fff'}`. */\n readonly variables: Readonly<\n Record<ThemeMode, Readonly<Record<string, string>>>\n >;\n}\n\nconst NAME_PATTERN: RegExp = /^[a-z][a-z0-9-]*$/;\nconst SCOPE_PATTERN: RegExp = /^[A-Za-z0-9_\\-[\\]=.# '\"]+$/;\nconst HEX_COLOR: RegExp = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst COLOR_FUNCTION: RegExp =\n /^(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark)\\(.+\\)$/i;\nconst VAR_REFERENCE: RegExp = /^var\\(\\s*--[A-Za-z0-9_-]+\\s*(?:,.+)?\\)$/;\nconst COLOR_KEYWORD: RegExp = /^[A-Za-z]+$/;\nconst LENGTH_VALUE: RegExp =\n /^(?:0|-?(?:\\d+\\.?\\d*|\\.\\d+)(?:px|rem|em|%|ch|vw|vh|cqw|cqh))$/;\nconst LENGTH_FUNCTION: RegExp = /^(?:calc|min|max|clamp)\\(.+\\)$/i;\nconst FONT_VALUE: RegExp = /^[A-Za-z0-9 ,'\"_-]+$/;\n\n/** Why a value is unsafe to write into a stylesheet, or null when it is fine. */\nfunction unsafeReason(value: string): string | null {\n if (\n [...value].some(\n (character) =>\n character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127\n )\n ) {\n return 'contains a control character or line break';\n }\n if (/[;{}<>\\\\@]/.test(value)) {\n return 'contains one of ; { } < > \\\\ @';\n }\n const lower: string = value.toLowerCase();\n if (lower.includes('/*') || lower.includes('*/')) {\n return 'contains a comment marker';\n }\n if (lower.includes('url(') || lower.includes('expression(')) {\n return 'contains url( or expression(';\n }\n let depth: number = 0;\n for (const character of value) {\n if (character === '(') {\n depth += 1;\n } else if (character === ')') {\n depth -= 1;\n if (depth < 0) {\n return 'has unbalanced parentheses';\n }\n }\n }\n return depth === 0 ? null : 'has unbalanced parentheses';\n}\n\nfunction countOf(value: string, character: string): number {\n return value.split(character).length - 1;\n}\n\n/** Why `value` is not a valid `kind`, or null when it is. */\nfunction invalidReason(kind: TokenKind, value: string): string | null {\n if (value !== value.trim() || value === '') {\n return 'must not be empty or have leading or trailing spaces';\n }\n if (kind === 'font') {\n if (!FONT_VALUE.test(value)) {\n return 'allows only letters, digits, spaces, commas, hyphens, underscores and quotes';\n }\n if (countOf(value, \"'\") % 2 !== 0 || countOf(value, '\"') % 2 !== 0) {\n return 'has an unclosed quote';\n }\n return null;\n }\n const unsafe: string | null = unsafeReason(value);\n if (unsafe !== null) {\n return unsafe;\n }\n if (value.includes(\"'\") || value.includes('\"')) {\n return 'must not contain quotes';\n }\n if (kind === 'color') {\n const valid: boolean =\n HEX_COLOR.test(value) ||\n COLOR_FUNCTION.test(value) ||\n VAR_REFERENCE.test(value) ||\n COLOR_KEYWORD.test(value);\n return valid\n ? null\n : 'is not a color (use #hex, rgb(), hsl(), oklch() and similar, var(--name) or a keyword)';\n }\n const valid: boolean =\n LENGTH_VALUE.test(value) ||\n LENGTH_FUNCTION.test(value) ||\n VAR_REFERENCE.test(value);\n return valid\n ? null\n : 'is not a length (use a number with px, rem, em, %, ch, vw or vh, 0, calc(), min(), max(), clamp() or var(--name))';\n}\n\nfunction collectVariables(\n themeName: string,\n mode: ThemeMode,\n tokens: ThemeTokens | undefined\n): Result<Record<string, string>> {\n const variables: Record<string, string> = {};\n if (tokens === undefined) {\n return ok(variables);\n }\n const label = (key: string): string =>\n `createTheme \"${themeName}\": ${mode}.${key}`;\n const knownKeys: readonly string[] = [\n ...Object.keys(THEME_TOKEN_VARIABLES),\n 'series',\n ];\n for (const key of Object.keys(tokens)) {\n if (!knownKeys.includes(key)) {\n return err(\n `${label(key)} is not a theme token. Known tokens: ${knownKeys.join(', ')}.`\n );\n }\n }\n for (const key of Object.keys(THEME_TOKEN_VARIABLES) as ThemeTokenKey[]) {\n const value: string | undefined = tokens[key];\n if (value === undefined) {\n continue;\n }\n if (typeof value !== 'string') {\n return err(`${label(key)} must be a string, got ${typeof value}.`);\n }\n const reason: string | null = invalidReason(kindOf(key), value);\n if (reason !== null) {\n return err(`${label(key)} \"${value}\" ${reason}.`);\n }\n variables[THEME_TOKEN_VARIABLES[key]] = value;\n }\n const series: readonly string[] | undefined = tokens.series;\n if (series !== undefined) {\n if (!Array.isArray(series) || series.length === 0) {\n return err(`${label('series')} must be a non-empty array of colors.`);\n }\n if (series.length > MAX_GRAPH_SERIES) {\n return err(\n `${label('series')} has ${series.length} colors; charts draw at most ${MAX_GRAPH_SERIES} series.`\n );\n }\n for (const [index, value] of series.entries()) {\n const reason: string | null =\n typeof value === 'string'\n ? invalidReason('color', value)\n : 'must be a string';\n if (reason !== null) {\n return err(\n `${label(`series[${index}]`)} \"${String(value)}\" ${reason}.`\n );\n }\n variables[`--dwt-series-${index + 1}`] = value;\n }\n }\n return ok(variables);\n}\n\nfunction declarations(variables: Readonly<Record<string, string>>): string {\n return Object.entries(variables)\n .map(([variable, value]) => ` ${variable}: ${value};`)\n .join('\\n');\n}\n\n/** `prefix scope .dwt-dashboard, prefix scope .dwt-card`. */\nfunction targets(prefix: string, scope: string): string {\n const lead: string = prefix === '' ? '' : `${prefix} `;\n return `${lead}${scope} .dwt-dashboard,\\n${lead}${scope} .dwt-card`;\n}\n\nfunction rule(\n prefix: string,\n scope: string,\n variables: Readonly<Record<string, string>>\n): string {\n return `${targets(prefix, scope)} {\\n${declarations(variables)}\\n}`;\n}\n\n/**\n * Builds the CSS for a theme. Tokens left unset keep their built-in value in\n * each mode. Returns an error naming the mode, the token and the value when\n * anything is invalid.\n */\nexport function createTheme(options: ThemeOptions): Result<WidgetThemeStyles> {\n const name: string = options.name;\n if (typeof name !== 'string' || !NAME_PATTERN.test(name)) {\n return err(\n `createTheme: name \"${String(name)}\" must start with a lower-case letter and contain only lower-case letters, digits and hyphens.`\n );\n }\n const scope: string = (options.scope ?? `[data-dwt-theme='${name}']`).trim();\n if (scope === '' || !SCOPE_PATTERN.test(scope)) {\n return err(\n `createTheme \"${name}\": scope \"${scope}\" must be a selector of letters, digits and _ - [ ] = . # ' \" or spaces (no commas, colons or combinators).`\n );\n }\n\n const modes: readonly ThemeMode[] = ['base', 'light', 'dark'];\n const variables: Record<ThemeMode, Record<string, string>> = {\n base: {},\n light: {},\n dark: {},\n };\n for (const mode of modes) {\n const collected: Result<Record<string, string>> = collectVariables(\n name,\n mode,\n options[mode]\n );\n if (!collected.ok) {\n return collected;\n }\n variables[mode] = collected.value;\n }\n if (modes.every((mode) => Object.keys(variables[mode]).length === 0)) {\n return err(\n `createTheme \"${name}\": no tokens were set. Pass at least one value in base, light or dark.`\n );\n }\n\n const blocks: string[] = [];\n if (Object.keys(variables.base).length > 0) {\n blocks.push(rule('', scope, variables.base));\n }\n if (Object.keys(variables.light).length > 0) {\n blocks.push(\n rule(\":root:where([data-theme='light'])\", scope, variables.light)\n );\n blocks.push(\n `@media (prefers-color-scheme: light) {\\n${indent(\n rule(\n \":root:where(:not([data-theme='dark'], .dark))\",\n scope,\n variables.light\n )\n )}\\n}`\n );\n }\n if (Object.keys(variables.dark).length > 0) {\n blocks.push(\n rule(\":root:where([data-theme='dark'], .dark)\", scope, variables.dark)\n );\n blocks.push(\n `@media (prefers-color-scheme: dark) {\\n${indent(\n rule(\":root:where(:not([data-theme='light']))\", scope, variables.dark)\n )}\\n}`\n );\n }\n\n return ok({\n name,\n scope,\n css: `${blocks.join('\\n\\n')}\\n`,\n variables,\n });\n}\n\nfunction indent(block: string): string {\n return block\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n}\n"]}
1
+ {"version":3,"sources":["../src/core/definition.ts","../src/core/grid.ts","../src/core/format.ts","../src/core/payload.ts","../src/core/result.ts","../src/core/views.ts","../src/core/url.ts","../src/core/detail.ts","../src/core/options.ts","../src/core/settings.ts","../src/core/clones.ts","../src/core/compat.ts","../src/core/layout.ts","../src/core/pages.ts","../src/core/duplicate.ts","../src/core/validate.ts","../src/core/resolve.ts","../src/core/loader.ts","../src/core/scale.ts","../src/core/storage.ts","../src/core/theme.ts"],"names":["cellValue","isRecord","without","uniqueTitle","describeType","viewKind","valid"],"mappings":"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","file":"core.js","sourcesContent":["import type { WidgetDetailOptions, WidgetTableControls } from './detail.js';\nimport type { WidgetOption } from './options.js';\nimport type { WidgetKind } from './payload.js';\nimport type { WidgetView } from './views.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 * The narrowest and widest a viewer may make the widget (integers from 2 to\n * 12, `minWidth <= width <= maxWidth`). A table that needs room sets\n * `minWidth: 6`; a KPI tile that looks silly wide sets `maxWidth: 4`.\n * Without them the full 2 to 12 range applies.\n */\n readonly minWidth?: number;\n readonly maxWidth?: 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 changing this widget. `true` locks everything:\n * move, hide, minimize and options. 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 * Other ways to show this widget, built from its payload by a named\n * conversion (a table as bars or a chart). The widget's own `kind` is\n * always available as the view `base`. See `views.ts`.\n */\n readonly views?: readonly WidgetView[];\n /** The view shown until a viewer picks another: `base` or a `views` key. Default `base`. */\n readonly defaultView?: string;\n /** What the base view is called in the View field. Default: its kind's name. */\n readonly baseViewLabel?: string;\n /**\n * Set on a clone (see `clones.ts`): the key of the widget it copies. Its\n * data comes from that widget's provider. Authors never set it.\n */\n readonly sourceKey?: string;\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 /** Can't be given a title, width or option values of the viewer's own. */\n readonly options?: boolean;\n /** Can't be duplicated into a clone. */\n readonly clone?: 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 options: false,\n clone: false,\n});\nconst FULLY_LOCKED: ResolvedWidgetLock = Object.freeze({\n move: true,\n hide: true,\n minimize: true,\n options: true,\n clone: 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 options: setting.options === true,\n clone: setting.clone === 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","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 * 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 * 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 * 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 * Alternate views: other ways to show the same data. A widget declares\n * `views`, each one built from the widget's own payload by a named,\n * parameterized conversion (data, not functions, so definitions stay JSON).\n * Switching is instant: no second load. Pure functions, no I/O.\n */\n\nimport type { WidgetDefinition } from './definition.js';\nimport { formatValue, type FormatOptions, type Locale } from './format.js';\nimport {\n MAX_GRAPH_SERIES,\n type BarListItem,\n type BarListWidgetData,\n type GraphSeries,\n type GraphWidgetData,\n type TableCell,\n type TableWidgetData,\n type ValueFormat,\n type WidgetData,\n type WidgetKind,\n} from './payload.js';\nimport type { DashboardWidget } from './resolve.js';\nimport { err, ok, type Result } from './result.js';\n\n/** The key of the widget's own kind, always available as a view. */\nexport const BASE_VIEW_KEY = 'base';\n\n/** Most views one widget may declare, the base view not counted. */\nexport const MAX_WIDGET_VIEWS = 8;\n\n/** How a view is built from the widget's payload. */\nexport type ViewConversion =\n | {\n readonly type: 'tableToBarList';\n /** Column index of the bar labels. */\n readonly label: number;\n /** Column index of the bar values (cells need a numeric `value`). */\n readonly value: number;\n }\n | {\n readonly type: 'tableToGraph';\n /** Column index of the x labels. */\n readonly label: number;\n /** Column indexes of the series (cells need a numeric `value`). */\n readonly values: readonly number[];\n readonly chartType: 'bar' | 'line';\n /** How the numbers read. Default `number`. */\n readonly valueFormat?: ValueFormat;\n readonly currency?: string;\n }\n | {\n readonly type: 'barListToTable';\n /** Heading of the label column. Default \"Name\". */\n readonly labelHeading?: string;\n /** Heading of the value column. Default \"Value\". */\n readonly valueHeading?: string;\n }\n | { readonly type: 'graphToTable' }\n | {\n readonly type: 'barListToGraph';\n readonly chartType: 'bar' | 'line';\n /** Name of the one series. Default \"Value\". */\n readonly seriesName?: string;\n readonly valueFormat?: ValueFormat;\n readonly currency?: string;\n };\n\n/** The kinds a conversion reads and produces. */\nexport const VIEW_CONVERSIONS: Readonly<\n Record<ViewConversion['type'], { from: WidgetKind; to: WidgetKind }>\n> = {\n tableToBarList: { from: 'TABLE', to: 'BAR_LIST' },\n tableToGraph: { from: 'TABLE', to: 'GRAPH' },\n barListToTable: { from: 'BAR_LIST', to: 'TABLE' },\n graphToTable: { from: 'GRAPH', to: 'TABLE' },\n barListToGraph: { from: 'BAR_LIST', to: 'GRAPH' },\n};\n\n/** One alternate way to show a widget. */\nexport interface WidgetView {\n /** Unique within the widget; not `base`. Stored in the viewer's settings. */\n readonly key: string;\n /** What the viewer sees in the View field, e.g. \"Bars\". */\n readonly label: string;\n /** What this view renders; must match what the conversion produces. */\n readonly kind: WidgetKind;\n /** Builds this view from the widget's payload. */\n readonly convert: ViewConversion;\n}\n\n/** What these functions need from a definition. */\nexport type ViewsItem = Pick<WidgetDefinition, 'key' | 'kind'> &\n Partial<Pick<WidgetDefinition, 'views' | 'defaultView' | 'baseViewLabel'>>;\n\nconst KIND_LABELS: Readonly<Record<WidgetKind, string>> = {\n TEXT: 'Text',\n KPI: 'Number',\n GAUGE: 'Gauge',\n TABLE: 'Table',\n BAR_LIST: 'Bars',\n ALERT_LIST: 'List',\n GRAPH: 'Chart',\n};\n\n/** A kind's plain name, used for the base view unless `baseViewLabel` is set. */\nexport function kindLabel(kind: WidgetKind): string {\n return KIND_LABELS[kind];\n}\n\n/** Whether the definition offers a choice of views. */\nexport function hasViews(item: Pick<ViewsItem, 'views'>): boolean {\n return item.views !== undefined && item.views.length > 0;\n}\n\n/** The view with this key, or undefined (`base` is not a declared view). */\nexport function findView(\n item: Pick<ViewsItem, 'views'>,\n key: string\n): WidgetView | undefined {\n return item.views?.find((view) => view.key === key);\n}\n\n/** Every view a viewer may pick: the base first, then the declared ones. */\nexport function viewChoices(\n item: ViewsItem\n): readonly { key: string; label: string; kind: WidgetKind }[] {\n if (!hasViews(item)) return [];\n return [\n {\n key: BASE_VIEW_KEY,\n label: item.baseViewLabel ?? kindLabel(item.kind),\n kind: item.kind,\n },\n ...(item.views ?? []).map(({ key, label, kind }) => ({\n key,\n label,\n kind,\n })),\n ];\n}\n\nfunction isKnownView(item: ViewsItem, key: string | undefined): boolean {\n return (\n key !== undefined &&\n (key === BASE_VIEW_KEY || findView(item, key) !== undefined)\n );\n}\n\n/**\n * The view in effect: the viewer's pick when the definition declares it,\n * else `defaultView`, else the base. Always a valid key.\n */\nexport function effectiveViewKey(\n item: ViewsItem,\n chosen: string | undefined\n): string {\n if (!hasViews(item)) return BASE_VIEW_KEY;\n if (isKnownView(item, chosen)) return chosen as string;\n if (isKnownView(item, item.defaultView)) return item.defaultView as string;\n return BASE_VIEW_KEY;\n}\n\n/** The kind the widget renders as under this view key. */\nexport function viewKind(\n item: ViewsItem,\n chosen: string | undefined\n): WidgetKind {\n return findView(item, effectiveViewKey(item, chosen))?.kind ?? item.kind;\n}\n\nfunction cellValue(cell: TableCell | undefined): number | undefined {\n const value: string | number | undefined = cell?.value;\n return typeof value === 'number' && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction columnName(table: TableWidgetData, index: number): string {\n return table.columns[index]?.label ?? `#${index + 1}`;\n}\n\ninterface ConversionContext {\n /** Names the widget and view in error messages. */\n readonly where: string;\n readonly locale?: Locale;\n}\n\nfunction checkColumn(\n table: TableWidgetData,\n index: number,\n field: string,\n context: ConversionContext\n): string | undefined {\n if (!Number.isInteger(index) || index < 0 || index >= table.columns.length) {\n return `${context.where}: ${field} column ${index} does not exist (the table has ${table.columns.length} columns, numbered from 0).`;\n }\n return undefined;\n}\n\nfunction numericColumn(\n table: TableWidgetData,\n index: number,\n context: ConversionContext\n): Result<number[]> {\n const numbers: number[] = [];\n for (const [rowIndex, row] of table.rows.entries()) {\n const value: number | undefined = cellValue(row[index]);\n if (value === undefined) {\n return err(\n `${context.where}: row ${rowIndex + 1}, column ${index + 1} (\"${columnName(table, index)}\") has no numeric value. Add value to the cells.`\n );\n }\n numbers.push(value);\n }\n return ok(numbers);\n}\n\nfunction tableToBarList(\n table: TableWidgetData,\n conversion: Extract<ViewConversion, { type: 'tableToBarList' }>,\n context: ConversionContext\n): Result<BarListWidgetData> {\n const bad: string | undefined =\n checkColumn(table, conversion.label, 'label', context) ??\n checkColumn(table, conversion.value, 'value', context);\n if (bad !== undefined) return err(bad);\n const numbers = numericColumn(table, conversion.value, context);\n if (!numbers.ok) return numbers;\n const items: BarListItem[] = table.rows.map((row, index) => ({\n label: row[conversion.label]?.text ?? '',\n value: numbers.value[index] as number,\n display: row[conversion.value]?.text ?? String(numbers.value[index]),\n }));\n return ok({ kind: 'BAR_LIST', items });\n}\n\nfunction tableToGraph(\n table: TableWidgetData,\n conversion: Extract<ViewConversion, { type: 'tableToGraph' }>,\n context: ConversionContext\n): Result<GraphWidgetData> {\n if (\n conversion.values.length === 0 ||\n conversion.values.length > MAX_GRAPH_SERIES\n ) {\n return err(\n `${context.where}: a chart needs 1 to ${MAX_GRAPH_SERIES} series columns, got ${conversion.values.length}.`\n );\n }\n let bad: string | undefined = checkColumn(\n table,\n conversion.label,\n 'label',\n context\n );\n for (const index of conversion.values) {\n bad ??= checkColumn(table, index, 'series', context);\n }\n if (bad !== undefined) return err(bad);\n const series: GraphSeries[] = [];\n for (const index of conversion.values) {\n const numbers = numericColumn(table, index, context);\n if (!numbers.ok) return numbers;\n series.push({\n name: columnName(table, index),\n points: table.rows.map((row, rowIndex) => ({\n label: row[conversion.label]?.text ?? '',\n value: numbers.value[rowIndex] as number,\n })),\n });\n }\n return ok({\n kind: 'GRAPH',\n series,\n chartType: conversion.chartType,\n valueFormat: conversion.valueFormat ?? 'number',\n ...(conversion.currency === undefined\n ? {}\n : { currency: conversion.currency }),\n xLabel: columnName(table, conversion.label),\n });\n}\n\nfunction barListToTable(\n list: BarListWidgetData,\n conversion: Extract<ViewConversion, { type: 'barListToTable' }>\n): Result<TableWidgetData> {\n return ok({\n kind: 'TABLE',\n columns: [\n { label: conversion.labelHeading ?? 'Name' },\n { label: conversion.valueHeading ?? 'Value', numeric: true },\n ],\n rows: list.items.map((item) => [\n { text: item.label },\n { text: item.display ?? String(item.value), value: item.value },\n ]),\n });\n}\n\nfunction graphToTable(\n graph: GraphWidgetData,\n context: ConversionContext\n): Result<TableWidgetData> {\n const first: GraphSeries | undefined = graph.series[0];\n if (first === undefined)\n return err(`${context.where}: the chart has no series.`);\n const format: FormatOptions = {\n ...(graph.currency === undefined ? {} : { currency: graph.currency }),\n ...(context.locale === undefined ? {} : { locale: context.locale }),\n };\n return ok({\n kind: 'TABLE',\n columns: [\n { label: graph.xLabel ?? 'Label' },\n ...graph.series.map((series) => ({ label: series.name, numeric: true })),\n ],\n rows: first.points.map((point, index) => [\n { text: point.label },\n ...graph.series.map((series): TableCell => {\n const value: number | undefined = series.points[index]?.value;\n return value === undefined\n ? { text: '—' }\n : { text: formatValue(value, graph.valueFormat, format), value };\n }),\n ]),\n });\n}\n\nfunction barListToGraph(\n list: BarListWidgetData,\n conversion: Extract<ViewConversion, { type: 'barListToGraph' }>\n): Result<GraphWidgetData> {\n return ok({\n kind: 'GRAPH',\n series: [\n {\n name: conversion.seriesName ?? 'Value',\n points: list.items.map((item) => ({\n label: item.label,\n value: item.value,\n })),\n },\n ],\n chartType: conversion.chartType,\n valueFormat: conversion.valueFormat ?? 'number',\n ...(conversion.currency === undefined\n ? {}\n : { currency: conversion.currency }),\n });\n}\n\n/** Options for `convertView`. */\nexport interface ConvertViewOptions {\n /** Locale for numbers a conversion has to format (graph to table). */\n readonly locale?: Locale;\n}\n\n/**\n * Builds a view's payload from the widget's payload. The error names the\n * widget, the view and what to fix, for example `Widget \"top-products\" view\n * \"bars\": row 3, column 2 (\"Sold\") has no numeric value. Add value to the\n * cells.` Never throws.\n */\nexport function convertView(\n widgetKey: string,\n view: Pick<WidgetView, 'key' | 'convert'>,\n data: WidgetData,\n options: ConvertViewOptions = {}\n): Result<WidgetData> {\n const conversion: ViewConversion = view.convert;\n const context: ConversionContext = {\n where: `Widget ${JSON.stringify(widgetKey)} view ${JSON.stringify(view.key)}`,\n ...(options.locale === undefined ? {} : { locale: options.locale }),\n };\n const expected: WidgetKind | undefined =\n VIEW_CONVERSIONS[conversion.type]?.from;\n if (expected === undefined) {\n return err(\n `${context.where}: unknown conversion type ${JSON.stringify((conversion as { type: unknown }).type)}.`\n );\n }\n if (data.kind !== expected) {\n return err(\n `${context.where}: ${conversion.type} reads a ${expected} payload, but the widget returned ${data.kind}.`\n );\n }\n switch (conversion.type) {\n case 'tableToBarList':\n return tableToBarList(data as TableWidgetData, conversion, context);\n case 'tableToGraph':\n return tableToGraph(data as TableWidgetData, conversion, context);\n case 'barListToTable':\n return barListToTable(data as BarListWidgetData, conversion);\n case 'graphToTable':\n return graphToTable(data as GraphWidgetData, context);\n case 'barListToGraph':\n return barListToGraph(data as BarListWidgetData, conversion);\n }\n}\n\n/**\n * What a view keeps of a table, for the dialog: \"Shows Name and Sold only.\"\n * Empty when the view loses nothing worth saying.\n */\nexport function viewNote(\n view: WidgetView,\n data: WidgetData | undefined\n): string {\n if (data?.kind !== 'TABLE') return '';\n const conversion: ViewConversion = view.convert;\n let indexes: readonly number[];\n if (conversion.type === 'tableToBarList') {\n indexes = [conversion.label, conversion.value];\n } else if (conversion.type === 'tableToGraph') {\n indexes = [conversion.label, ...conversion.values];\n } else {\n return '';\n }\n const names: string[] = indexes.map(\n (index) => data.columns[index]?.label ?? `#${index + 1}`\n );\n return `Shows ${names.join(', ')} only.`;\n}\n\n/**\n * The widget as the chosen view shows it: the payload converted and the\n * definition's `kind` set to the view's kind, so renderers work unchanged.\n * A widget that isn't `ok`, or whose view is the base, comes back as is; a\n * failed conversion becomes an `error` widget naming the fix.\n */\nexport function applyView<W extends DashboardWidget>(\n widget: W,\n chosen: string | undefined,\n options: ConvertViewOptions = {}\n): DashboardWidget {\n const key: string = effectiveViewKey(widget.definition, chosen);\n const view: WidgetView | undefined = findView(widget.definition, key);\n if (view === undefined) return widget;\n const definition: WidgetDefinition = {\n ...widget.definition,\n kind: view.kind,\n };\n if (widget.status === 'loading') return { ...widget, definition };\n if (widget.status === 'empty') return { ...widget, definition };\n if (widget.status === 'error') return { ...widget, definition };\n const converted = convertView(\n widget.definition.key,\n view,\n widget.data,\n options\n );\n if (!converted.ok) {\n return {\n definition,\n status: 'error',\n error: converted.error,\n ...(widget.options === undefined ? {} : { options: widget.options }),\n };\n }\n return { ...widget, definition, data: converted.value };\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","/**\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","/**\n * A viewer's own choices for a widget: a title, a width and values for the\n * options its author declared. They live in the layout (`layout.settings`),\n * so the consumer's existing persistence saves them, and they override what\n * the definition says without changing it. Pure functions, no I/O.\n */\n\nimport {\n resolveWidgetLock,\n type WidgetDefinition,\n type WidgetFill,\n} from './definition.js';\nimport { MAX_WIDGET_WIDTH, MIN_WIDGET_WIDTH, isWidgetWidth } from './grid.js';\nimport { BASE_VIEW_KEY, findView } from './views.js';\nimport {\n coerceOptionValue,\n defaultOptionValue,\n sameOptionValues,\n type OptionValue,\n type OptionValues,\n type WidgetOption,\n} from './options.js';\n\n/** What one viewer chose for one widget. Every field is optional. */\nexport interface WidgetViewerSettings {\n /** Replaces the widget's title. Plain text, at most 80 characters. */\n readonly title?: string;\n /** Share of the row in twelfths, within the definition's min and max. */\n readonly width?: number;\n /** May grow into the columns left over in its row (see `fill`). */\n readonly flexible?: boolean;\n /** Values for declared options, by option key. */\n readonly options?: Readonly<Record<string, OptionValue>>;\n /** The view to show: `base` or a key from the definition's `views`. */\n readonly view?: string;\n}\n\n/** Viewer settings by widget key. */\nexport type LayoutSettings = Readonly<Record<string, WidgetViewerSettings>>;\n\n/** Longest title a viewer can give a widget; longer ones are cut. */\nexport const MAX_WIDGET_TITLE_LENGTH = 80;\n/**\n * Most widgets `parseLayout` keeps settings for: a safety ceiling against\n * malformed or hostile JSON, not a product limit.\n */\nexport const MAX_PARSED_SETTINGS = 500;\n\nconst MAX_COLUMN_LIST = 100;\nconst MAX_VALUE_LENGTH = 500;\n\n/** What these functions need from a definition. */\nexport type SettingsItem = Pick<WidgetDefinition, 'key'> &\n Partial<\n Pick<\n WidgetDefinition,\n | 'title'\n | 'width'\n | 'minWidth'\n | 'maxWidth'\n | 'fill'\n | 'locked'\n | 'options'\n | 'views'\n | 'defaultView'\n >\n >;\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseOptionValue(value: unknown): OptionValue | undefined {\n if (typeof value === 'string') {\n return value.length <= MAX_VALUE_LENGTH ? value : undefined;\n }\n if (typeof value === 'number')\n return Number.isFinite(value) ? value : undefined;\n if (typeof value === 'boolean') return value;\n if (Array.isArray(value) && value.length <= MAX_COLUMN_LIST) {\n return value.every(\n (entry) => typeof entry === 'string' && entry.length <= MAX_VALUE_LENGTH\n )\n ? (value as readonly string[])\n : undefined;\n }\n return undefined;\n}\n\nfunction parseOne(raw: unknown): WidgetViewerSettings | undefined {\n if (!isRecord(raw)) return undefined;\n const title: unknown = raw['title'];\n const width: unknown = raw['width'];\n const flexible: unknown = raw['flexible'];\n const options: unknown = raw['options'];\n const view: unknown = raw['view'];\n const cleanTitle: string =\n typeof title === 'string'\n ? title.trim().slice(0, MAX_WIDGET_TITLE_LENGTH)\n : '';\n const chosen: Record<string, OptionValue> = {};\n if (isRecord(options)) {\n for (const [key, value] of Object.entries(options)) {\n const parsed: OptionValue | undefined = parseOptionValue(value);\n if (parsed !== undefined) chosen[key] = parsed;\n }\n }\n const settings: WidgetViewerSettings = {\n ...(cleanTitle === '' ? {} : { title: cleanTitle }),\n ...(isWidgetWidth(width) ? { width } : {}),\n ...(typeof flexible === 'boolean' ? { flexible } : {}),\n ...(Object.keys(chosen).length === 0 ? {} : { options: chosen }),\n ...(typeof view === 'string' && view !== '' && view.length <= 80\n ? { view }\n : {}),\n };\n return Object.keys(settings).length === 0 ? undefined : settings;\n}\n\n/**\n * Reads the `settings` field of a saved layout. Anything malformed is\n * dropped (wrong types, titles over the limit are cut, widths outside 2 to\n * 12), never an error. Returns undefined when nothing usable is left.\n */\nexport function parseSettings(raw: unknown): LayoutSettings | undefined {\n if (!isRecord(raw)) return undefined;\n const parsed: Record<string, WidgetViewerSettings> = {};\n for (const [key, value] of Object.entries(raw).slice(\n 0,\n MAX_PARSED_SETTINGS\n )) {\n if (key === '') continue;\n const one: WidgetViewerSettings | undefined = parseOne(value);\n if (one !== undefined) parsed[key] = one;\n }\n return Object.keys(parsed).length === 0 ? undefined : parsed;\n}\n\n/** The JSON-ready form of `layout.settings`; fields keep a stable order. */\nexport function serializeSettings(\n settings: LayoutSettings | undefined\n): Record<string, WidgetViewerSettings> | undefined {\n if (settings === undefined) return undefined;\n const out: Record<string, WidgetViewerSettings> = {};\n for (const key of Object.keys(settings)) {\n const one: WidgetViewerSettings | undefined = settings[key];\n if (one === undefined) continue;\n const piece: WidgetViewerSettings = {\n ...(one.title === undefined ? {} : { title: one.title }),\n ...(one.width === undefined ? {} : { width: one.width }),\n ...(one.flexible === undefined ? {} : { flexible: one.flexible }),\n ...(one.options === undefined || Object.keys(one.options).length === 0\n ? {}\n : { options: { ...one.options } }),\n ...(one.view === undefined ? {} : { view: one.view }),\n };\n if (Object.keys(piece).length > 0) out[key] = piece;\n }\n return Object.keys(out).length === 0 ? undefined : out;\n}\n\n/** The narrowest and widest share a widget may take. */\nexport function widthRange(item: Pick<SettingsItem, 'minWidth' | 'maxWidth'>): {\n readonly min: number;\n readonly max: number;\n} {\n const min: number = isWidgetWidth(item.minWidth)\n ? item.minWidth\n : MIN_WIDGET_WIDTH;\n const max: number = isWidgetWidth(item.maxWidth)\n ? item.maxWidth\n : MAX_WIDGET_WIDTH;\n return { min, max: Math.max(min, max) };\n}\n\nconst WIDTH_SHARES: Readonly<Record<number, string>> = {\n 2: '1/6',\n 3: '1/4',\n 4: '1/3',\n 5: '5/12',\n 6: '1/2',\n 7: '7/12',\n 8: '2/3',\n 9: '3/4',\n 10: '5/6',\n 11: '11/12',\n 12: 'Full',\n};\n\n/** A width as a share of the row: 2 is `1/6`, 6 is `1/2`, 12 is `Full`. */\nexport function widthShareLabel(width: number): string {\n return WIDTH_SHARES[width] ?? `${width}/12`;\n}\n\n/** Whether the lock on this widget forbids viewer settings. */\nexport function isOptionsLocked(item: Pick<SettingsItem, 'locked'>): boolean {\n return resolveWidgetLock(item).options;\n}\n\n/** `fill` with width filling turned on or off, height filling untouched. */\nfunction fillWith(\n fill: WidgetFill | undefined,\n flexible: boolean\n): WidgetFill | undefined {\n const heightToo: boolean = fill === 'height' || fill === 'both';\n if (flexible) return heightToo ? 'both' : 'width';\n return heightToo ? 'height' : undefined;\n}\n\n/** Whether the widget grows into free columns: the viewer's choice, else its `fill`. */\nexport function isFlexible(\n item: Pick<SettingsItem, 'fill'>,\n settings: WidgetViewerSettings | undefined\n): boolean {\n if (settings?.flexible !== undefined) return settings.flexible;\n return item.fill === 'width' || item.fill === 'both';\n}\n\n/**\n * The definition as this viewer sees it: their title, their width (kept\n * within the definition's limits) and their choice of Flexible applied on\n * top of the author's. Returns the same object when there is nothing to\n * apply. Options are not part of the definition; read them with\n * `widgetOptionValues`.\n */\nexport function applySettings<D extends SettingsItem>(\n definition: D,\n settings: WidgetViewerSettings | undefined\n): D {\n if (settings === undefined) return definition;\n const range = widthRange(definition);\n const width: number | undefined =\n settings.width === undefined\n ? undefined\n : Math.min(range.max, Math.max(range.min, settings.width));\n const title: string | undefined =\n settings.title === undefined || settings.title.trim() === ''\n ? undefined\n : settings.title;\n const flexibleChanged: boolean =\n settings.flexible !== undefined &&\n settings.flexible !== isFlexible(definition, undefined);\n if (title === undefined && width === undefined && !flexibleChanged) {\n return definition;\n }\n const next: { -readonly [K in keyof D]: D[K] } = { ...definition };\n if (title !== undefined) next.title = title;\n if (width !== undefined) next.width = width;\n if (flexibleChanged) {\n const fill: WidgetFill | undefined = fillWith(\n definition.fill,\n settings.flexible === true\n );\n if (fill === undefined) {\n delete next.fill;\n } else {\n next.fill = fill;\n }\n }\n return next;\n}\n\n/**\n * The definitions with each viewer's settings applied. A widget whose lock\n * forbids options (`locked.options`) ignores them, so a saved layout can't\n * reach around a lock. Pass `overrideLocks` for an administrator.\n */\nexport function effectiveDefinitions<D extends SettingsItem>(\n definitions: readonly D[],\n layout: { readonly settings?: LayoutSettings },\n options: { readonly overrideLocks?: boolean } = {}\n): D[] {\n return definitions.map((definition) =>\n options.overrideLocks !== true && isOptionsLocked(definition)\n ? definition\n : applySettings(definition, layout.settings?.[definition.key])\n );\n}\n\n/**\n * The chosen option values for a widget, resolved: the viewer's where valid,\n * else the author's defaults. Empty when it declares no options.\n */\nexport function widgetOptionValues(\n definition: Pick<SettingsItem, 'options'>,\n settings: WidgetViewerSettings | undefined\n): OptionValues {\n const declared: readonly WidgetOption[] = definition.options ?? [];\n const values: Record<string, OptionValue> = {};\n for (const option of declared) {\n const picked: unknown = settings?.options?.[option.key];\n const value: OptionValue | undefined =\n (picked === undefined ? undefined : coerceOptionValue(option, picked)) ??\n defaultOptionValue(option);\n if (value !== undefined) values[option.key] = value;\n }\n return values;\n}\n\n/**\n * What to pass `useWidgets({ optionValues })` so the data follows the\n * layout: for every widget that declares options, the viewer's chosen\n * values (empty when they haven't chosen, which means the defaults). Every\n * such widget is listed so Reset sends its defaults back to the provider.\n */\nexport function optionValuesFromLayout(\n definitions: readonly Pick<SettingsItem, 'key' | 'options' | 'locked'>[],\n layout: { readonly settings?: LayoutSettings },\n options: { readonly overrideLocks?: boolean } = {}\n): Record<string, Readonly<Record<string, OptionValue>>> {\n const out: Record<string, Readonly<Record<string, OptionValue>>> = {};\n for (const definition of definitions) {\n if (definition.options === undefined || definition.options.length === 0) {\n continue;\n }\n const locked: boolean =\n options.overrideLocks !== true && isOptionsLocked(definition);\n out[definition.key] = locked\n ? {}\n : (layout.settings?.[definition.key]?.options ?? {});\n }\n return out;\n}\n\n/** Fields `setWidgetSettings` can change; `undefined` clears one. */\nexport interface WidgetSettingsPatch {\n readonly title?: string | undefined;\n readonly width?: number | undefined;\n readonly flexible?: boolean | undefined;\n /** Replaces all of the widget's option values (`undefined` clears them). */\n readonly options?: Readonly<Record<string, OptionValue>> | undefined;\n /** The view key (`base` or a declared view); `undefined` clears it. */\n readonly view?: string | undefined;\n}\n\nfunction sameSettings(\n a: WidgetViewerSettings | undefined,\n b: WidgetViewerSettings | undefined\n): boolean {\n if (a === b) return true;\n return (\n a?.title === b?.title &&\n a?.width === b?.width &&\n a?.flexible === b?.flexible &&\n a?.view === b?.view &&\n sameOptionValues(a?.options ?? {}, b?.options ?? {})\n );\n}\n\ntype LayoutWithSettings<L> = L & { readonly settings?: LayoutSettings };\n\n/**\n * A layout with `patch` applied to one widget's settings. Fields the patch\n * names as `undefined` are cleared; others stay. An entry left empty is\n * removed. Returns the same layout when nothing changes.\n */\nexport function setWidgetSettings<L extends object>(\n layout: LayoutWithSettings<L>,\n key: string,\n patch: WidgetSettingsPatch\n): LayoutWithSettings<L> {\n const before: WidgetViewerSettings | undefined = layout.settings?.[key];\n const draft: Record<string, unknown> = { ...before };\n for (const field of [\n 'title',\n 'width',\n 'flexible',\n 'options',\n 'view',\n ] as const) {\n if (!(field in patch)) continue;\n const value: unknown = patch[field];\n if (value === undefined) {\n delete draft[field];\n } else {\n draft[field] = value;\n }\n }\n const merged: WidgetViewerSettings | undefined = parseOne(draft);\n if (sameSettings(before, merged)) return layout;\n const rest: Record<string, WidgetViewerSettings> = { ...layout.settings };\n if (merged === undefined) {\n delete rest[key];\n } else {\n rest[key] = merged;\n }\n const { settings: _previous, ...others } = layout;\n void _previous;\n return Object.keys(rest).length === 0\n ? (others as LayoutWithSettings<L>)\n : ({ ...others, settings: rest } as LayoutWithSettings<L>);\n}\n\n/** A layout without one widget's settings (Reset to defaults). */\nexport function clearWidgetSettings<L extends object>(\n layout: LayoutWithSettings<L>,\n key: string\n): LayoutWithSettings<L> {\n if (layout.settings?.[key] === undefined) return layout;\n return setWidgetSettings(layout, key, {\n title: undefined,\n width: undefined,\n flexible: undefined,\n options: undefined,\n view: undefined,\n });\n}\n\n/** Lower-cased, trimmed and Unicode-normalized, for comparing titles. */\nexport function normalizeTitle(title: string): string {\n return title.normalize('NFKC').trim().toLowerCase();\n}\n\n/**\n * Whether another widget already shows `title`: compared trimmed,\n * case-insensitive and Unicode-normalized, against the other widgets'\n * effective titles. A dialog uses it to refuse a duplicate.\n */\nexport function isTitleInUse<D extends SettingsItem>(\n definitions: readonly D[],\n layout: { readonly settings?: LayoutSettings },\n key: string,\n title: string\n): boolean {\n const wanted: string = normalizeTitle(title);\n if (wanted === '') return false;\n return effectiveDefinitions(definitions, layout, {\n overrideLocks: true,\n }).some(\n (other) =>\n other.key !== key && normalizeTitle(other.title ?? other.key) === wanted\n );\n}\n\n/** `title (#2)`, `title (#3)`, ... cut to fit the limit, first one not taken. */\nfunction uniqueTitle(taken: ReadonlySet<string>, title: string): string {\n if (!taken.has(normalizeTitle(title))) return title;\n for (let n = 2; ; n += 1) {\n const suffix = ` (#${n})`;\n const candidate: string = `${title.slice(0, MAX_WIDGET_TITLE_LENGTH - suffix.length)}${suffix}`;\n if (!taken.has(normalizeTitle(candidate))) return candidate;\n }\n}\n\n/** Options for `normalizeSettings`. */\nexport interface NormalizeSettingsOptions {\n /** Keep settings that a widget's `locked.options` forbids. */\n readonly overrideLocks?: boolean;\n}\n\n/**\n * Cleans a layout's settings against the definitions, for a save endpoint:\n * drops settings of unknown widgets and of widgets locked against options,\n * clamps widths to `minWidth` and `maxWidth`, trims titles, drops option\n * values the definition didn't declare or that aren't valid for their\n * option, and makes titles unique by appending \"(#n)\". Idempotent; returns\n * the same layout when nothing changes.\n */\nexport function normalizeSettings<D extends SettingsItem, L extends object>(\n definitions: readonly D[],\n layout: LayoutWithSettings<L>,\n options: NormalizeSettingsOptions = {}\n): LayoutWithSettings<L> {\n const settings: LayoutSettings | undefined = layout.settings;\n if (settings === undefined) return layout;\n const cleaned: Record<string, WidgetViewerSettings> = {};\n // Titles other widgets show without a viewer rename are taken first.\n const taken = new Set<string>();\n for (const definition of definitions) {\n const renamed: boolean =\n settings[definition.key]?.title !== undefined &&\n (options.overrideLocks === true || !isOptionsLocked(definition));\n if (!renamed) taken.add(normalizeTitle(definition.title ?? definition.key));\n }\n for (const definition of definitions) {\n const one: WidgetViewerSettings | undefined = settings[definition.key];\n if (one === undefined) continue;\n if (options.overrideLocks !== true && isOptionsLocked(definition)) continue;\n const range = widthRange(definition);\n const chosen: Record<string, OptionValue> = {};\n for (const option of definition.options ?? []) {\n const picked: unknown = one.options?.[option.key];\n if (picked === undefined) continue;\n const value: OptionValue | undefined = coerceOptionValue(option, picked);\n // A date range keeps its preset (`last30`), which resolves to today's\n // interval when read; storing the interval would go stale.\n if (value !== undefined) {\n chosen[option.key] =\n option.type === 'dateRange' ? (picked as OptionValue) : value;\n }\n }\n let title: string | undefined = one.title;\n if (title !== undefined) {\n title = title.trim().slice(0, MAX_WIDGET_TITLE_LENGTH);\n if (title === '') {\n title = undefined;\n } else {\n title = uniqueTitle(taken, title);\n taken.add(normalizeTitle(title));\n }\n }\n const next: WidgetViewerSettings = {\n ...(title === undefined ? {} : { title }),\n ...(one.width === undefined\n ? {}\n : { width: Math.min(range.max, Math.max(range.min, one.width)) }),\n ...(one.flexible === undefined ? {} : { flexible: one.flexible }),\n ...(Object.keys(chosen).length === 0 ? {} : { options: chosen }),\n ...(one.view !== undefined &&\n (one.view === BASE_VIEW_KEY ||\n findView(definition, one.view) !== undefined)\n ? { view: one.view }\n : {}),\n };\n if (Object.keys(next).length > 0) {\n cleaned[definition.key] = sameSettings(one, next) ? one : next;\n }\n }\n const keys: string[] = Object.keys(cleaned);\n const unchanged: boolean =\n keys.length === Object.keys(settings).length &&\n keys.every((key) => cleaned[key] === settings[key]);\n if (unchanged) return layout;\n const { settings: _previous, ...others } = layout;\n void _previous;\n return keys.length === 0\n ? (others as LayoutWithSettings<L>)\n : ({ ...others, settings: cleaned } as LayoutWithSettings<L>);\n}\n","/**\n * Clones: copies of a widget a viewer made to keep it twice with different\n * settings (another view, width or option values). A clone is stored as\n * `{ key, from }` in `layout.clones`, its settings under its own key in\n * `layout.settings`, and it shares the original's provider. Pure functions,\n * no I/O.\n */\n\nimport { resolveWidgetLock, type WidgetDefinition } from './definition.js';\nimport { MAX_WIDGET_TITLE_LENGTH } from './settings.js';\n\n/** A widget the viewer made from another. */\nexport interface WidgetClone {\n /** Unique across definitions and clones: `from#1`, `from#2`, ... */\n readonly key: string;\n /** The original's key. Always an original, never another clone. */\n readonly from: string;\n}\n\n/**\n * Most clones `parseLayout` keeps: a safety ceiling against malformed or\n * hostile JSON, not a product limit (a page's capacity is the real limit).\n */\nexport const MAX_PARSED_CLONES = 500;\n\n/** What these functions need from a definition. */\nexport type CloneItem = Pick<WidgetDefinition, 'key'> &\n Partial<Pick<WidgetDefinition, 'title' | 'locked' | 'sourceKey'>>;\n\n/** Options for the clone functions. */\nexport interface CloneOptions {\n /** Keep clones that a widget's `locked.clone` forbids (an administrator). */\n readonly overrideLocks?: boolean;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Reads the `clones` field of a saved layout. Anything malformed is dropped\n * (wrong types, empty or repeated keys, a clone of itself). Returns undefined\n * when nothing usable is left.\n */\nexport function parseClones(raw: unknown): readonly WidgetClone[] | undefined {\n if (!Array.isArray(raw)) return undefined;\n const seen = new Set<string>();\n const clones: WidgetClone[] = [];\n for (const entry of raw.slice(0, MAX_PARSED_CLONES) as unknown[]) {\n if (!isRecord(entry)) continue;\n const key: unknown = entry['key'];\n const from: unknown = entry['from'];\n if (\n typeof key !== 'string' ||\n typeof from !== 'string' ||\n key === '' ||\n from === '' ||\n key === from ||\n seen.has(key)\n ) {\n continue;\n }\n seen.add(key);\n clones.push({ key, from });\n }\n return clones.length === 0 ? undefined : clones;\n}\n\n/** The JSON-ready form of `layout.clones`; undefined when there are none. */\nexport function serializeClones(\n clones: readonly WidgetClone[] | undefined\n): WidgetClone[] | undefined {\n if (clones === undefined || clones.length === 0) return undefined;\n return clones.map(({ key, from }) => ({ key, from }));\n}\n\n/** The number in a clone key (`orders#3` is 3), or undefined. */\nexport function cloneNumber(key: string): number | undefined {\n const match: RegExpExecArray | null = /#(\\d+)$/.exec(key);\n return match === null ? undefined : Number(match[1]);\n}\n\n/**\n * The clones that can exist for these definitions: the original is a real\n * widget (not itself a clone), the key doesn't shadow another widget, and the\n * original's `locked.clone` allows it. Returns the same array when nothing is\n * dropped. Clones already present as definitions (see `withClones`) count as\n * valid, so the function is idempotent.\n */\nexport function cleanClones<D extends CloneItem>(\n definitions: readonly D[],\n clones: readonly WidgetClone[] | undefined,\n options: CloneOptions = {}\n): readonly WidgetClone[] | undefined {\n if (clones === undefined) return undefined;\n const byKey = new Map<string, D>(definitions.map((d) => [d.key, d]));\n const seen = new Set<string>();\n const kept: WidgetClone[] = [];\n for (const clone of clones) {\n if (seen.has(clone.key)) continue;\n const original: D | undefined = byKey.get(clone.from);\n if (original === undefined || original.sourceKey !== undefined) continue;\n const existing: D | undefined = byKey.get(clone.key);\n if (existing !== undefined && existing.sourceKey !== clone.from) continue;\n if (options.overrideLocks !== true && resolveWidgetLock(original).clone) {\n continue;\n }\n seen.add(clone.key);\n kept.push(clone);\n }\n if (kept.length === 0) return undefined;\n return kept.length === clones.length && kept.every((c, i) => c === clones[i])\n ? clones\n : kept;\n}\n\nfunction defaultCloneTitle(\n original: CloneItem,\n clone: WidgetClone,\n index: number\n): string {\n const base: string = original.title ?? original.key;\n const suffix = ` (#${cloneNumber(clone.key) ?? index + 1})`;\n return `${base.slice(0, MAX_WIDGET_TITLE_LENGTH - suffix.length)}${suffix}`;\n}\n\n/**\n * The definitions with each clone added right after its original. A clone's\n * definition copies the original's, with its own key, `sourceKey` set to the\n * original, the title \"Original (#n)\" and no locks (a clone is the viewer's\n * to move, hide and delete). Settings still apply on top (`effectiveDefinitions`).\n * Pass the result to `useWidgets` so clones load, and to the settings and\n * layout functions. Idempotent; returns the same array when there are no\n * clones to add.\n */\nexport function withClones<D extends CloneItem>(\n definitions: readonly D[],\n layout: { readonly clones?: readonly WidgetClone[] },\n options: CloneOptions = {}\n): readonly D[] {\n const valid: readonly WidgetClone[] | undefined = cleanClones(\n definitions,\n layout.clones,\n options\n );\n if (valid === undefined) return definitions;\n const present = new Set<string>(definitions.map((d) => d.key));\n const toAdd: WidgetClone[] = valid.filter((c) => !present.has(c.key));\n if (toAdd.length === 0) return definitions;\n const out: D[] = [];\n for (const definition of definitions) {\n out.push(definition);\n toAdd.forEach((clone, index) => {\n if (clone.from !== definition.key) return;\n const copy = { ...definition } as D & {\n -readonly [K in keyof CloneItem]: CloneItem[K];\n };\n copy.key = clone.key;\n copy.sourceKey = definition.key;\n copy.title = defaultCloneTitle(definition, clone, index);\n delete copy.locked;\n out.push(copy);\n });\n }\n return out;\n}\n","/**\n * Maker Toolkit compatibility. Its API (`apps/api/src/widgets`) serves\n * `TEXT`, `GAUGE`, `TABLE` and `GRAPH` payloads; `TEXT` and `GAUGE` are\n * unchanged here, while `TABLE` and `GRAPH` grew richer shapes. These\n * helpers upgrade the older shapes so `validateWidgetData` accepts them.\n */\n\nimport type { WidgetDefinition } from './definition.js';\nimport { isWidgetKind } from './payload.js';\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string');\n}\n\n/**\n * Upgrades a Maker Toolkit payload to this package's shape:\n *\n * - `TABLE` `{columns: string[], rows: string[][]}` → `{label}` columns and\n * `{text}` cells.\n * - `GRAPH` `{points}` → one unnamed bar series with `valueFormat: 'number'`.\n *\n * Anything else, including payloads already in the new shape, is returned\n * unchanged. Validate the result with `validateWidgetData`.\n */\nexport function upgradeLegacyWidgetData(value: unknown): unknown {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return value;\n }\n const record = value as Readonly<Record<string, unknown>>;\n if (\n record['kind'] === 'TABLE' &&\n isStringArray(record['columns']) &&\n Array.isArray(record['rows']) &&\n record['rows'].every(isStringArray)\n ) {\n const rows = record['rows'] as string[][];\n return {\n ...record,\n columns: record['columns'].map((label) => ({ label })),\n rows: rows.map((row) => row.map((text) => ({ text }))),\n };\n }\n if (\n record['kind'] === 'GRAPH' &&\n Array.isArray(record['points']) &&\n record['series'] === undefined\n ) {\n const { points, ...rest } = record;\n return {\n ...rest,\n series: [{ name: 'Value', points }],\n chartType: 'bar',\n valueFormat: 'number',\n };\n }\n return value;\n}\n\n/** Maker Toolkit's served widget definition (`WidgetDefinition` in its API). */\nexport interface LegacyWidgetDefinition {\n readonly widgetKey: string;\n readonly title: string;\n readonly description: string | null;\n readonly viewType: string;\n readonly sortOrder: number;\n}\n\n/**\n * Maps a Maker Toolkit definition onto this package's. Returns null when\n * the view type isn't a known kind.\n */\nexport function fromLegacyDefinition(\n legacy: LegacyWidgetDefinition\n): WidgetDefinition | null {\n if (!isWidgetKind(legacy.viewType)) {\n return null;\n }\n return {\n key: legacy.widgetKey,\n title: legacy.title,\n ...(legacy.description === null ? {} : { description: legacy.description }),\n kind: legacy.viewType,\n sortOrder: legacy.sortOrder,\n };\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 { parseClones, serializeClones, type WidgetClone } from './clones.js';\nimport { resolveWidgetLock, type WidgetLock } from './definition.js';\nimport {\n parseSettings,\n serializeSettings,\n type LayoutSettings,\n} from './settings.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 * What the viewer chose for each widget (title, width, option values), by\n * widget key. See `settings.ts`. Absent when they chose nothing.\n */\n readonly settings?: LayoutSettings;\n /**\n * Widgets the viewer made from others, as `{ key, from }`. Their settings\n * live in `settings` under their own key. See `clones.ts`. Absent when\n * there are none.\n */\n readonly clones?: readonly WidgetClone[];\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 const settings: LayoutSettings | undefined = parseSettings(\n record['settings']\n );\n const clones: readonly WidgetClone[] | undefined = parseClones(\n record['clones']\n );\n const extras = {\n ...(settings === undefined ? {} : { settings }),\n ...(clones === undefined ? {} : { clones }),\n };\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 ...extras,\n };\n }\n if (order.length === 0 && hidden.length === 0 && minimized.length === 0) {\n return Object.keys(extras).length === 0\n ? EMPTY_LAYOUT\n : { ...EMPTY_LAYOUT, ...extras };\n }\n return { order, hidden, minimized, ...extras };\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 ...(serializeSettings(layout.settings) === undefined\n ? {}\n : { settings: serializeSettings(layout.settings) }),\n ...(serializeClones(layout.clones) === undefined\n ? {}\n : { clones: serializeClones(layout.clones) }),\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 { cleanClones, withClones } from './clones.js';\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';\nimport { effectiveDefinitions, normalizeSettings } from './settings.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 // Clones are widgets too: add them to the definitions, and drop the ones\n // that can't exist (original gone, key shadowing a widget, locked).\n const clones = cleanClones(definitions, layout.clones, options);\n let base: DashboardLayout = layout;\n if (clones !== layout.clones) {\n const { clones: _dropped, ...others } = layout;\n void _dropped;\n base = clones === undefined ? others : { ...others, clones };\n }\n return normalizeWidgets(\n withClones(definitions, base, options),\n base,\n options\n );\n}\n\nfunction normalizeWidgets<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n options: NormalizeOptions\n): DashboardLayout {\n const known: DashboardLayout = pruneLayout(definitions, layout);\n const enforced: DashboardLayout = enforceLocks(definitions, known, options);\n const locked: DashboardLayout = normalizeSettings(\n definitions,\n enforced,\n options\n );\n if (!hasPages(locked)) return locked === layout ? layout : locked;\n\n // The widths a viewer chose count toward a page's capacity.\n const defs: readonly T[] = effectiveDefinitions(\n options.overrideLocks === true\n ? definitions.map(withoutLockField)\n : definitions,\n locked,\n options\n );\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 locked.settings === layout.settings\n ? layout\n : result;\n}\n","/**\n * Making and deleting clones (see `clones.ts`): the layout changes behind a\n * \"Duplicate\" and a \"Delete\" control. Inputs are never mutated; a refusal is\n * a `Result` with a specific message, and a no-op returns the same object.\n */\n\nimport {\n cloneNumber,\n withClones,\n type CloneOptions,\n type WidgetClone,\n} from './clones.js';\nimport { resolveWidgetLock } from './definition.js';\nimport {\n visibleWidgets,\n type DashboardLayout,\n type LayoutPage,\n} from './layout.js';\nimport {\n assignPages,\n hasPages,\n pageLayout,\n pageRoom,\n withPageLayout,\n type PageItem,\n type PageOptions,\n} from './pages.js';\nimport { err, ok, type Result } from './result.js';\nimport {\n MAX_WIDGET_TITLE_LENGTH,\n effectiveDefinitions,\n type LayoutSettings,\n type WidgetViewerSettings,\n} from './settings.js';\n\n/** Options for `duplicateWidget`. */\nexport interface DuplicateOptions extends PageOptions, CloneOptions {}\n\n/** What `duplicateWidget` returns: the new layout and the clone's key. */\nexport interface Duplicated {\n readonly layout: DashboardLayout;\n /** The new clone's key, for opening its Options dialog. */\n readonly key: string;\n}\n\n/** Whether a widget (or the widget a clone copies) may be duplicated. */\nexport function canDuplicate(\n definitions: readonly PageItem[],\n key: string,\n options: CloneOptions = {}\n): boolean {\n const definition: PageItem | undefined = definitions.find(\n (d) => d.key === key\n );\n if (definition === undefined) return false;\n if (options.overrideLocks === true) return true;\n const sourceKey: string =\n (definition as { sourceKey?: string }).sourceKey ?? definition.key;\n const original: PageItem | undefined = definitions.find(\n (d) => d.key === sourceKey\n );\n return original !== undefined && !resolveWidgetLock(original).clone;\n}\n\n/** `from#n`, with n one more than the highest number used for that original. */\nexport function nextCloneKey(\n definitions: readonly { readonly key: string }[],\n layout: { readonly clones?: readonly WidgetClone[] },\n fromKey: string\n): string {\n const taken = new Set<string>([\n ...definitions.map((d) => d.key),\n ...(layout.clones ?? []).map((c) => c.key),\n ]);\n let highest = 0;\n for (const clone of layout.clones ?? []) {\n if (clone.from === fromKey) {\n highest = Math.max(highest, cloneNumber(clone.key) ?? 0);\n }\n }\n let n: number = highest + 1;\n while (taken.has(`${fromKey}#${n}`)) n += 1;\n return `${fromKey}#${n}`;\n}\n\n/**\n * A title for a clone shown with another view: \"Recent Orders Line Chart\".\n * Cut to the title limit.\n */\nexport function suggestedViewTitle(title: string, viewLabel: string): string {\n return `${title} ${viewLabel}`.trim().slice(0, MAX_WIDGET_TITLE_LENGTH);\n}\n\n/**\n * Duplicates a widget into a clone placed right after it. The copy starts\n * with the widget's own width, view and option values (not its title, which\n * is \"Title (#n)\"). Cloning a clone clones the original. Refused for an\n * unknown widget, when the original's `locked.clone` forbids it, and, in a\n * paged layout, when the page has no room for the clone's width.\n *\n * Pass the definitions you render with (clones included, as `withClones`\n * returns them).\n */\nexport function duplicateWidget<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string,\n options: DuplicateOptions = {}\n): Result<Duplicated> {\n const widget: T | undefined = definitions.find((d) => d.key === key);\n if (widget === undefined) {\n return err(`Widget ${JSON.stringify(key)} isn't on this dashboard.`);\n }\n const originalKey: string =\n (widget as { sourceKey?: string }).sourceKey ?? widget.key;\n if (!canDuplicate(definitions, key, options)) {\n return err(\n `Widget ${JSON.stringify(originalKey)} is locked against duplicating.`\n );\n }\n const cloneKey: string = nextCloneKey(definitions, layout, originalKey);\n const copiedSettings: WidgetViewerSettings | undefined = (() => {\n const mine: WidgetViewerSettings | undefined = layout.settings?.[key];\n if (mine === undefined) return undefined;\n const { title: _title, ...rest } = mine;\n void _title;\n return Object.keys(rest).length === 0 ? undefined : rest;\n })();\n const settings: LayoutSettings | undefined =\n copiedSettings === undefined\n ? layout.settings\n : { ...layout.settings, [cloneKey]: copiedSettings };\n let next: DashboardLayout = {\n ...layout,\n clones: [...(layout.clones ?? []), { key: cloneKey, from: originalKey }],\n ...(settings === undefined ? {} : { settings }),\n };\n const all: readonly T[] = withClones(definitions, next, options);\n\n // Place it right after the widget it was made from, on that widget's page.\n const assigned: Map<string, T[]> = assignPages(all, next);\n const pageKey: string | undefined = [...assigned].find(([, widgets]) =>\n widgets.some((w) => w.key === key)\n )?.[0];\n if (pageKey !== undefined) {\n const view: DashboardLayout | undefined = pageLayout(next, pageKey);\n const onPage: T[] = assigned.get(pageKey) ?? [];\n if (view !== undefined) {\n const shown: string[] = visibleWidgets(onPage, view)\n .filter((d) => !resolveWidgetLock(d).move && d.key !== cloneKey)\n .map((d) => d.key);\n const at: number = shown.indexOf(key);\n const order: string[] =\n at === -1\n ? [...shown, cloneKey]\n : [...shown.slice(0, at + 1), cloneKey, ...shown.slice(at + 1)];\n next = withPageLayout(next, pageKey, { ...view, order });\n }\n }\n\n if (hasPages(next) && pageKey !== undefined) {\n const effective: T[] = effectiveDefinitions(all, next, options);\n const room = pageRoom(effective, next, pageKey, options);\n if (room !== undefined && room.rowsUsed > room.maxRows) {\n const page: LayoutPage | undefined = next.pages?.find(\n (p) => p.key === pageKey\n );\n const width: number | undefined = effective.find(\n (d) => d.key === cloneKey\n )?.width;\n return err(\n `Page \"${page?.title ?? pageKey}\" has no room for a widget${\n width === undefined ? '' : ` ${width} wide`\n } (it holds ${room.maxRows} rows).`\n );\n }\n }\n return ok({ layout: next, key: cloneKey });\n}\n\n/**\n * Removes a clone from the layout: its entry, its settings, and its place in\n * every order, hidden and minimized list. Originals can't be deleted (hide\n * them), so any other key returns the layout unchanged.\n */\nexport function deleteClone(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n if (layout.clones?.some((clone) => clone.key === key) !== true) return layout;\n const without = (keys: readonly string[]): readonly string[] =>\n keys.includes(key) ? keys.filter((k) => k !== key) : keys;\n const { clones, settings, ...rest } = layout;\n const remaining: WidgetClone[] = (clones ?? []).filter((c) => c.key !== key);\n const { [key]: _gone, ...otherSettings } = settings ?? {};\n void _gone;\n return {\n ...rest,\n order: without(layout.order),\n hidden: without(layout.hidden),\n minimized: without(layout.minimized),\n ...(layout.pages === undefined\n ? {}\n : {\n pages: layout.pages.map((page) => ({\n ...page,\n order: without(page.order),\n hidden: without(page.hidden),\n minimized: without(page.minimized),\n })),\n }),\n ...(Object.keys(otherSettings).length === 0\n ? {}\n : { settings: otherSettings }),\n ...(remaining.length === 0 ? {} : { clones: remaining }),\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 {\n BASE_VIEW_KEY,\n MAX_WIDGET_VIEWS,\n VIEW_CONVERSIONS,\n type ViewConversion,\n} from './views.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, options, clone }`. */\n/** minWidth and maxWidth: integers from 2 to 12 around `width`. */\nfunction checkWidthLimits(value: Record_, problems: Problems): void {\n for (const field of ['minWidth', 'maxWidth'] as const) {\n const limit: unknown = value[field];\n if (limit !== undefined && !isWidgetWidth(limit)) {\n problems.push(\n `${field} must be an integer from ${MIN_WIDGET_WIDTH} to ${MAX_WIDGET_WIDTH} (twelfths of the row), got ${typeof limit === 'number' ? String(limit) : describeType(limit)}.`\n );\n return;\n }\n }\n const { minWidth, maxWidth, width } = value;\n if (\n isWidgetWidth(minWidth) &&\n isWidgetWidth(maxWidth) &&\n minWidth > maxWidth\n ) {\n problems.push(\n `minWidth (${minWidth}) must not be more than maxWidth (${maxWidth}).`\n );\n return;\n }\n if (isWidgetWidth(width)) {\n if (isWidgetWidth(minWidth) && width < minWidth) {\n problems.push(\n `width (${width}) must not be less than minWidth (${minWidth}).`\n );\n }\n if (isWidgetWidth(maxWidth) && width > maxWidth) {\n problems.push(\n `width (${width}) must not be more than maxWidth (${maxWidth}).`\n );\n }\n }\n}\n\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 optionalBoolean(locked, 'options', 'locked', problems);\n optionalBoolean(locked, 'clone', '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\nconst MAX_VIEW_COLUMN = 1000;\n\nfunction checkColumnIndex(\n value: unknown,\n path: string,\n problems: Problems\n): void {\n if (\n typeof value !== 'number' ||\n !Number.isInteger(value) ||\n value < 0 ||\n value > MAX_VIEW_COLUMN\n ) {\n problems.push(\n `${path} must be a column index (a whole number from 0), got ${typeof value === 'number' ? String(value) : describeType(value)}.`\n );\n }\n}\n\nfunction checkConversion(\n conversion: unknown,\n path: string,\n baseKind: unknown,\n viewKind: unknown,\n problems: Problems\n): void {\n if (!isRecord(conversion)) {\n problems.push(\n `${path} must be an object with a type, got ${describeType(conversion)}.`\n );\n return;\n }\n const type: unknown = conversion['type'];\n const known: { from: string; to: string } | undefined =\n typeof type === 'string' && Object.hasOwn(VIEW_CONVERSIONS, type)\n ? VIEW_CONVERSIONS[type as ViewConversion['type']]\n : undefined;\n if (known === undefined) {\n problems.push(\n `${path}.type must be one of ${Object.keys(VIEW_CONVERSIONS)\n .map((name) => `\"${name}\"`)\n .join(', ')}, got ${describeType(type)}.`\n );\n return;\n }\n if (baseKind !== known.from) {\n problems.push(\n `${path}.type \"${String(type)}\" reads a ${known.from} widget, but this one is ${String(baseKind)}.`\n );\n }\n if (viewKind !== known.to) {\n problems.push(\n `${path}.type \"${String(type)}\" produces ${known.to}, but the view's kind is ${String(viewKind)}.`\n );\n }\n switch (type) {\n case 'tableToBarList':\n checkColumnIndex(conversion['label'], `${path}.label`, problems);\n checkColumnIndex(conversion['value'], `${path}.value`, problems);\n break;\n case 'tableToGraph': {\n checkColumnIndex(conversion['label'], `${path}.label`, problems);\n const values: unknown = conversion['values'];\n if (!Array.isArray(values) || values.length === 0) {\n problems.push(`${path}.values must list 1 or more column indexes.`);\n } else if (values.length > MAX_GRAPH_SERIES) {\n problems.push(\n `${path}.values lists ${values.length} series; a chart carries at most ${MAX_GRAPH_SERIES}.`\n );\n } else {\n values.forEach((index: unknown, at: number) =>\n checkColumnIndex(index, `${path}.values[${at}]`, problems)\n );\n }\n if (\n conversion['chartType'] !== 'bar' &&\n conversion['chartType'] !== 'line'\n ) {\n problems.push(`${path}.chartType must be \"bar\" or \"line\".`);\n }\n break;\n }\n case 'barListToGraph':\n if (\n conversion['chartType'] !== 'bar' &&\n conversion['chartType'] !== 'line'\n ) {\n problems.push(`${path}.chartType must be \"bar\" or \"line\".`);\n }\n break;\n default:\n break;\n }\n if (\n conversion['valueFormat'] !== undefined &&\n !VALUE_FORMATS.includes(conversion['valueFormat'] as never)\n ) {\n problems.push(\n `${path}.valueFormat must be one of ${VALUE_FORMATS.map((f) => `\"${f}\"`).join(', ')}.`\n );\n }\n}\n\n/** Checks a definition's `views`, `defaultView` and `baseViewLabel`. */\nfunction checkViews(value: Record<string, unknown>, problems: Problems): void {\n const views: unknown = value['views'];\n const defaultView: unknown = value['defaultView'];\n optionalString(value, 'baseViewLabel', '', problems);\n if (value['baseViewLabel'] === '') {\n problems.push('baseViewLabel must not be empty.');\n }\n const declared = new Set<string>([BASE_VIEW_KEY]);\n if (views !== undefined) {\n if (!Array.isArray(views)) {\n problems.push(`views must be an array, got ${describeType(views)}.`);\n } else if (views.length > MAX_WIDGET_VIEWS) {\n problems.push(\n `views lists ${views.length} views; the most a widget may declare is ${MAX_WIDGET_VIEWS}.`\n );\n } else {\n views.forEach((view: unknown, index: number) => {\n const path = `views[${index}]`;\n if (!isRecord(view)) {\n problems.push(\n `${path} must be an object, got ${describeType(view)}.`\n );\n return;\n }\n const key: unknown = view['key'];\n if (typeof key !== 'string' || key.trim() === '') {\n problems.push(`${path}.key must be a non-empty string.`);\n } else if (declared.has(key)) {\n problems.push(\n key === BASE_VIEW_KEY\n ? `${path}.key \"${BASE_VIEW_KEY}\" is reserved for the widget's own kind.`\n : `${path}.key \"${key}\" is used twice.`\n );\n } else {\n declared.add(key);\n }\n if (typeof view['label'] !== 'string' || view['label'].trim() === '') {\n problems.push(`${path}.label must be a non-empty string.`);\n }\n requireOneOf(view, 'kind', WIDGET_KINDS, path, problems);\n if (view['convert'] === undefined) {\n problems.push(\n `${path}.convert is required: views supplied by a provider are not supported yet.`\n );\n } else {\n checkConversion(\n view['convert'],\n `${path}.convert`,\n value['kind'],\n view['kind'],\n problems\n );\n }\n });\n }\n }\n if (defaultView !== undefined) {\n if (typeof defaultView !== 'string' || !declared.has(defaultView)) {\n problems.push(\n `defaultView must be \"${BASE_VIEW_KEY}\" or the key of a declared view, got ${typeof defaultView === 'string' ? JSON.stringify(defaultView) : describeType(defaultView)}.`\n );\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 checkWidthLimits(value, problems);\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 checkViews(value, 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 // A clone caches under its original's key, so it shares what the original\n // loaded whenever their option values match.\n const base: string =\n options.cacheKey === undefined\n ? (definition.sourceKey ?? 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(\n providers,\n definition.sourceKey ?? definition.key\n )\n ? providers[definition.sourceKey ?? 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 providerKey: string = definition.sourceKey ?? key;\n const provider = Object.prototype.hasOwnProperty.call(\n providers,\n providerKey\n )\n ? providers[providerKey]\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","/** 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 * Storage adapters: the contract a developer implements to keep a layout in\n * localStorage, IndexedDB, a REST API or a database, plus I/O-free helpers\n * built on it (`createLayoutPersistence` and small adapter wrappers). The\n * package does no I/O itself: no timers, DOM, `fetch` or storage globals.\n * See docs/design/storage-adapters.md.\n */\n\nimport {\n parseLayout,\n serializeLayout,\n type DashboardLayout,\n} from './layout.js';\nimport { normalizeLayout, type NormalizeOptions } from './pages.js';\nimport type { PageItem } from './pages.js';\nimport { describeUnknownError } from './result.js';\n\nexport type StoreErrorCode =\n /** Storage can't be reached or is disabled. */\n | 'unavailable'\n /** Storage is full. */\n | 'quota'\n /** Not allowed to read or write. */\n | 'forbidden'\n /** The stored revision is newer than the one given. */\n | 'conflict'\n /** The adapter was given something it can't store. */\n | 'invalid'\n /** What is stored can't be read back. */\n | 'corrupt';\n\nexport type StoreResult<T> =\n | { readonly ok: true; readonly value: T }\n | {\n readonly ok: false;\n readonly code: StoreErrorCode;\n /** Names the key and the cause. */\n readonly error: string;\n };\n\nexport interface StoredValue {\n /** The serialized layout. */\n readonly value: string;\n /** Opaque version (an ETag, a row version) for conflict detection. */\n readonly revision?: string;\n}\n\nexport interface StorageAdapter {\n /** Resolves `{ ok: true, value: null }` when nothing is stored. */\n get(\n key: string,\n options: { readonly signal: AbortSignal }\n ): Promise<StoreResult<StoredValue | null>>;\n /**\n * With `ifRevision`, fail with `conflict` when the stored revision differs.\n * Adapters without revisions ignore it (last write wins).\n */\n set(\n key: string,\n value: string,\n options: { readonly signal: AbortSignal; readonly ifRevision?: string }\n ): Promise<StoreResult<StoredValue>>;\n remove?(\n key: string,\n options: { readonly signal: AbortSignal }\n ): Promise<StoreResult<null>>;\n /** Optional: report a change made elsewhere (another tab). Returns an unsubscribe. */\n subscribe?(\n key: string,\n onChange: (stored: StoredValue | null) => void\n ): () => void;\n}\n\nfunction failure(\n code: StoreErrorCode,\n error: string\n): {\n readonly ok: false;\n readonly code: StoreErrorCode;\n readonly error: string;\n} {\n return { ok: false, code, error };\n}\n\n/** UTF-8 byte length without `TextEncoder` (the core has no DOM or Node lib). */\nexport function utf8Length(text: string): number {\n let bytes = 0;\n for (const char of text) {\n const point: number = char.codePointAt(0) ?? 0;\n bytes += point < 0x80 ? 1 : point < 0x800 ? 2 : point < 0x10000 ? 3 : 4;\n }\n return bytes;\n}\n\n/* ------------------------------------------------------------------ */\n/* Adapters and wrappers */\n/* ------------------------------------------------------------------ */\n\n/** An in-memory adapter with revisions and `subscribe`: tests, SSR, fallback. */\nexport function memoryAdapter(\n initial: Readonly<Record<string, string>> = {}\n): StorageAdapter {\n const entries = new Map<string, StoredValue>();\n const listeners = new Map<\n string,\n Set<(stored: StoredValue | null) => void>\n >();\n let counter = 0;\n for (const [key, value] of Object.entries(initial)) {\n counter += 1;\n entries.set(key, { value, revision: String(counter) });\n }\n const notify = (key: string, stored: StoredValue | null): void => {\n for (const listener of listeners.get(key) ?? []) listener(stored);\n };\n return {\n get: (key) =>\n Promise.resolve({ ok: true, value: entries.get(key) ?? null }),\n set: (key, value, options) => {\n const current: StoredValue | undefined = entries.get(key);\n if (\n options.ifRevision !== undefined &&\n (current?.revision ?? undefined) !== options.ifRevision\n ) {\n return Promise.resolve(\n failure(\n 'conflict',\n `Could not save \"${key}\": it changed since revision ${options.ifRevision} (now ${current?.revision ?? 'none'}).`\n )\n );\n }\n counter += 1;\n const stored: StoredValue = { value, revision: String(counter) };\n entries.set(key, stored);\n notify(key, stored);\n return Promise.resolve({ ok: true, value: stored });\n },\n remove: (key) => {\n entries.delete(key);\n notify(key, null);\n return Promise.resolve({ ok: true, value: null });\n },\n subscribe: (key, onChange) => {\n const set: Set<(stored: StoredValue | null) => void> =\n listeners.get(key) ?? new Set();\n set.add(onChange);\n listeners.set(key, set);\n return () => {\n set.delete(onChange);\n };\n },\n };\n}\n\n/** Namespaces every key, for several dashboards or apps in one store. */\nexport function withPrefix(\n adapter: StorageAdapter,\n prefix: string\n): StorageAdapter {\n return {\n get: (key, options) => adapter.get(prefix + key, options),\n set: (key, value, options) => adapter.set(prefix + key, value, options),\n ...(adapter.remove === undefined\n ? {}\n : {\n remove: (key: string, options: { readonly signal: AbortSignal }) =>\n adapter.remove?.(prefix + key, options) ??\n Promise.resolve(failure('invalid', 'remove is not supported.')),\n }),\n ...(adapter.subscribe === undefined\n ? {}\n : {\n subscribe: (\n key: string,\n onChange: (stored: StoredValue | null) => void\n ) => adapter.subscribe?.(prefix + key, onChange) ?? (() => undefined),\n }),\n };\n}\n\n/**\n * Reads from `primary`, falling back to `secondary` when it errs or holds\n * nothing. Writes go to `primary` first, then `secondary` (best effort); a\n * `conflict` from `primary` is returned as is and writes nothing else. When\n * `primary` can't be written but `secondary` can, the write counts as saved.\n */\nexport function withFallback(\n primary: StorageAdapter,\n secondary: StorageAdapter\n): StorageAdapter {\n return {\n async get(key, options) {\n const first = await primary.get(key, options);\n if (first.ok && first.value !== null) return first;\n const second = await secondary.get(key, options);\n if (second.ok && second.value !== null) return second;\n return first;\n },\n async set(key, value, options) {\n const first = await primary.set(key, value, options);\n if (!first.ok && first.code === 'conflict') return first;\n const second = await secondary.set(key, value, {\n signal: options.signal,\n });\n if (first.ok) return first;\n return second.ok ? second : first;\n },\n async remove(key, options) {\n const first = (await primary.remove?.(key, options)) ?? {\n ok: true as const,\n value: null,\n };\n await secondary.remove?.(key, options);\n return first;\n },\n subscribe: (key, onChange) => {\n const stops: (() => void)[] = [primary, secondary].flatMap((adapter) => {\n const stop: (() => void) | undefined = adapter.subscribe?.(\n key,\n onChange\n );\n return stop === undefined ? [] : [stop];\n });\n return () => {\n for (const stop of stops) stop();\n };\n },\n };\n}\n\n/** Remembers each key's last read or write, so repeated reads skip the store. */\nexport function withReadCache(adapter: StorageAdapter): StorageAdapter {\n const cache = new Map<string, StoredValue | null>();\n return {\n async get(key, options) {\n const cached: StoredValue | null | undefined = cache.get(key);\n if (cached !== undefined) return { ok: true, value: cached };\n const result = await adapter.get(key, options);\n if (result.ok) cache.set(key, result.value);\n return result;\n },\n async set(key, value, options) {\n const result = await adapter.set(key, value, options);\n if (result.ok) cache.set(key, result.value);\n else cache.delete(key);\n return result;\n },\n async remove(key, options) {\n cache.delete(key);\n return (\n (await adapter.remove?.(key, options)) ??\n failure(\n 'invalid',\n `Could not remove \"${key}\": remove is not supported.`\n )\n );\n },\n ...(adapter.subscribe === undefined\n ? {}\n : {\n subscribe: (\n key: string,\n onChange: (stored: StoredValue | null) => void\n ) =>\n adapter.subscribe?.(key, (stored) => {\n cache.set(key, stored);\n onChange(stored);\n }) ?? (() => undefined),\n }),\n };\n}\n\n/** Rejects writes with `forbidden`: previewing someone else's layout. */\nexport function readOnly(adapter: StorageAdapter): StorageAdapter {\n return {\n get: (key, options) => adapter.get(key, options),\n set: (key) =>\n Promise.resolve(\n failure(\n 'forbidden',\n `Could not save \"${key}\": this store is read-only.`\n )\n ),\n remove: (key) =>\n Promise.resolve(\n failure(\n 'forbidden',\n `Could not remove \"${key}\": this store is read-only.`\n )\n ),\n ...(adapter.subscribe === undefined\n ? {}\n : { subscribe: adapter.subscribe.bind(adapter) }),\n };\n}\n\nexport interface RetryOptions {\n /** Total tries, including the first. Default 3. */\n readonly attempts?: number;\n /** First wait in ms; doubles each retry. Default 200. */\n readonly delayMs?: number;\n /** Waits `ms`. You pass it, so the core has no timers. */\n readonly sleep: (ms: number, signal: AbortSignal) => Promise<void>;\n}\n\n/** Retries `unavailable` errors (and nothing else) with doubling waits. */\nexport function withRetry(\n adapter: StorageAdapter,\n options: RetryOptions\n): StorageAdapter {\n const attempts: number = Math.max(1, Math.floor(options.attempts ?? 3));\n const baseDelay: number = options.delayMs ?? 200;\n const retrying = async <T>(\n signal: AbortSignal,\n run: () => Promise<StoreResult<T>>\n ): Promise<StoreResult<T>> => {\n let result: StoreResult<T> = await run();\n for (\n let attempt = 1;\n attempt < attempts &&\n !result.ok &&\n result.code === 'unavailable' &&\n !signal.aborted;\n attempt += 1\n ) {\n await options.sleep(baseDelay * 2 ** (attempt - 1), signal);\n result = await run();\n }\n return result;\n };\n return {\n get: (key, o) => retrying(o.signal, () => adapter.get(key, o)),\n set: (key, value, o) =>\n retrying(o.signal, () => adapter.set(key, value, o)),\n ...(adapter.remove === undefined\n ? {}\n : {\n remove: (key: string, o: { readonly signal: AbortSignal }) =>\n retrying(\n o.signal,\n () =>\n adapter.remove?.(key, o) ??\n Promise.resolve(failure('invalid', 'remove is not supported.'))\n ),\n }),\n ...(adapter.subscribe === undefined\n ? {}\n : { subscribe: adapter.subscribe.bind(adapter) }),\n };\n}\n\nexport interface EncodingOptions {\n /** Applied before storing: compression, or encryption with your own crypto. */\n readonly encode: (value: string) => string | Promise<string>;\n /** Reverses `encode` after reading. */\n readonly decode: (value: string) => string | Promise<string>;\n}\n\n/** Transforms values on the way in and out. Keys and revisions pass through. */\nexport function withEncoding(\n adapter: StorageAdapter,\n codec: EncodingOptions\n): StorageAdapter {\n const decodeStored = async (\n key: string,\n stored: StoredValue\n ): Promise<StoreResult<StoredValue>> => {\n try {\n const value: string = await codec.decode(stored.value);\n return {\n ok: true,\n value:\n stored.revision === undefined\n ? { value }\n : { value, revision: stored.revision },\n };\n } catch (cause) {\n return failure(\n 'corrupt',\n `Could not decode the value stored at \"${key}\": ${describeUnknownError(cause)}`\n );\n }\n };\n return {\n async get(key, options) {\n const result = await adapter.get(key, options);\n if (!result.ok || result.value === null) return result;\n return decodeStored(key, result.value);\n },\n async set(key, value, options) {\n let encoded: string;\n try {\n encoded = await codec.encode(value);\n } catch (cause) {\n return failure(\n 'invalid',\n `Could not encode the value for \"${key}\": ${describeUnknownError(cause)}`\n );\n }\n const result = await adapter.set(key, encoded, options);\n if (!result.ok) return result;\n return result.value.revision === undefined\n ? { ok: true, value: { value } }\n : { ok: true, value: { value, revision: result.value.revision } };\n },\n ...(adapter.remove === undefined\n ? {}\n : { remove: adapter.remove.bind(adapter) }),\n ...(adapter.subscribe === undefined\n ? {}\n : {\n subscribe: (\n key: string,\n onChange: (stored: StoredValue | null) => void\n ) =>\n adapter.subscribe?.(key, (stored) => {\n if (stored === null) {\n onChange(null);\n return;\n }\n void decodeStored(key, stored).then((decoded) => {\n if (decoded.ok) onChange(decoded.value);\n });\n }) ?? (() => undefined),\n }),\n };\n}\n\nexport interface StorageLogEvent {\n readonly operation: 'get' | 'set' | 'remove';\n readonly key: string;\n readonly ok: boolean;\n /** Present when `ok` is false. Values are never logged. */\n readonly code?: StoreErrorCode;\n}\n\n/** Reports each operation's key and outcome. Never the stored value. */\nexport function withLogging(\n adapter: StorageAdapter,\n log: (event: StorageLogEvent) => void\n): StorageAdapter {\n const report = <T>(\n operation: StorageLogEvent['operation'],\n key: string,\n result: StoreResult<T>\n ): StoreResult<T> => {\n try {\n log(\n result.ok\n ? { operation, key, ok: true }\n : { operation, key, ok: false, code: result.code }\n );\n } catch {\n // A broken logger must not break storage.\n }\n return result;\n };\n return {\n get: async (key, o) => report('get', key, await adapter.get(key, o)),\n set: async (key, value, o) =>\n report('set', key, await adapter.set(key, value, o)),\n ...(adapter.remove === undefined\n ? {}\n : {\n remove: async (key: string, o: { readonly signal: AbortSignal }) =>\n report(\n 'remove',\n key,\n (await adapter.remove?.(key, o)) ??\n failure('invalid', 'remove is not supported.')\n ),\n }),\n ...(adapter.subscribe === undefined\n ? {}\n : { subscribe: adapter.subscribe.bind(adapter) }),\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Layout persistence */\n/* ------------------------------------------------------------------ */\n\nexport interface StoreScope {\n /** Which dashboard: 'sales'. */\n readonly dashboardKey: string;\n /** Who it belongs to; absent for shared defaults. A hint for building the key: a server takes the user from the session. */\n readonly userKey?: string;\n}\n\n/** Current envelope version written by `createLayoutPersistence`. */\nexport const LAYOUT_ENVELOPE_VERSION = 1;\n\n/** Default largest serialized layout (bytes). */\nexport const DEFAULT_MAX_LAYOUT_BYTES = 64 * 1024;\n\nexport type ConflictPolicy =\n /** Save anyway; the other device's change is lost. */\n | 'overwrite'\n /** Drop the local save and return what is stored. */\n | 'keep-theirs'\n /** Return `outcome: 'conflict'` and let the UI choose (default). */\n | 'ask'\n /** Merge, then save the result once. */\n | ((mine: DashboardLayout, theirs: DashboardLayout) => DashboardLayout);\n\nexport interface LayoutPersistenceOptions {\n /** Default 64 KB. */\n readonly maxBytes?: number;\n /** For adapters with revisions. Default `'ask'`. */\n readonly onConflict?: ConflictPolicy;\n /** Cancels every operation. */\n readonly signal?: AbortSignal;\n /** Epoch ms for the envelope's `savedAt`. Default `Date.now`. */\n readonly now?: () => number;\n}\n\nexport interface LoadedLayout {\n /** Repaired against the definitions; null when nothing is stored. */\n readonly layout: DashboardLayout | null;\n readonly revision?: string;\n /** ISO time from the envelope; absent for a bare legacy layout. */\n readonly savedAt?: string;\n}\n\nexport interface SavedLayout {\n /**\n * `saved`: stored (or merged, then stored). `kept-theirs`: the stored layout\n * won and `layout` is it. `conflict`: nothing was stored and `layout` is\n * the stored one; decide, then save again with `force: true`.\n */\n readonly outcome: 'saved' | 'kept-theirs' | 'conflict';\n /** What is now stored (or, for `conflict`, what is stored by someone else). */\n readonly layout: DashboardLayout;\n readonly revision?: string;\n}\n\nexport interface SaveOptions {\n /** Skip conflict detection and overwrite. */\n readonly force?: boolean;\n}\n\nexport interface LayoutPersistence {\n /** The adapter key for a scope, for example `dwt:sales:user-42:layout`. */\n keyFor(scope: StoreScope, part?: 'layout' | 'backup'): string;\n load(\n scope: StoreScope,\n definitions: readonly PageItem[],\n options?: NormalizeOptions\n ): Promise<StoreResult<LoadedLayout>>;\n save(\n scope: StoreScope,\n layout: DashboardLayout,\n options?: SaveOptions\n ): Promise<StoreResult<SavedLayout>>;\n loadBackup(scope: StoreScope): Promise<StoreResult<DashboardLayout | null>>;\n saveBackup(\n scope: StoreScope,\n layout: DashboardLayout\n ): Promise<StoreResult<null>>;\n /** Removes the layout and its backup. */\n reset(scope: StoreScope): Promise<StoreResult<null>>;\n /** Calls `onChange` when another tab or device changes the layout; needs `adapter.subscribe`. */\n watch(\n scope: StoreScope,\n definitions: readonly PageItem[],\n onChange: (loaded: LoadedLayout) => void,\n options?: NormalizeOptions\n ): () => void;\n}\n\ninterface Envelope {\n readonly v: number;\n readonly savedAt: string;\n readonly layout: unknown;\n}\n\nfunction keyPart(text: string): string {\n return encodeURIComponent(text);\n}\n\nfunction readEnvelope(\n key: string,\n stored: StoredValue\n): StoreResult<{ layout: DashboardLayout; savedAt?: string }> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(stored.value);\n } catch (cause) {\n return failure(\n 'corrupt',\n `The layout stored at \"${key}\" is not valid JSON: ${describeUnknownError(cause)}`\n );\n }\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return failure(\n 'corrupt',\n `The layout stored at \"${key}\" is not an object.`\n );\n }\n const record = parsed as Record<string, unknown>;\n const version: unknown = record['v'];\n if (version === undefined) {\n // A bare layout saved by a consumer that called serializeLayout directly.\n return { ok: true, value: { layout: parseLayout(parsed) } };\n }\n if (typeof version !== 'number' || !Number.isInteger(version)) {\n return failure(\n 'corrupt',\n `The layout stored at \"${key}\" has an invalid version ${JSON.stringify(version)}.`\n );\n }\n if (version > LAYOUT_ENVELOPE_VERSION) {\n return failure(\n 'invalid',\n `The layout stored at \"${key}\" is version ${version}, newer than this toolkit reads (${LAYOUT_ENVELOPE_VERSION}). Update the package.`\n );\n }\n const envelope = record as unknown as Envelope;\n return {\n ok: true,\n value: {\n layout: parseLayout(envelope.layout),\n ...(typeof envelope.savedAt === 'string'\n ? { savedAt: envelope.savedAt }\n : {}),\n },\n };\n}\n\ninterface PendingSave {\n layout: DashboardLayout;\n force: boolean;\n readonly waiters: ((result: StoreResult<SavedLayout>) => void)[];\n}\n\n/**\n * Persistence for layouts over any `StorageAdapter`: an envelope with a\n * version, tolerant reads repaired against today's definitions, a size limit,\n * revision tracking with a conflict policy, and saves serialized per key so\n * rapid edits never race (while one save is in flight, later ones collapse\n * into the newest).\n */\nexport function createLayoutPersistence(\n adapter: StorageAdapter,\n options: LayoutPersistenceOptions = {}\n): LayoutPersistence {\n const maxBytes: number = options.maxBytes ?? DEFAULT_MAX_LAYOUT_BYTES;\n const policy: ConflictPolicy = options.onConflict ?? 'ask';\n const fallbackSignal: AbortSignal = new AbortController().signal;\n const signal: AbortSignal = options.signal ?? fallbackSignal;\n const now: () => number = options.now ?? Date.now;\n const revisions = new Map<string, string>();\n const lastWritten = new Map<string, string>();\n const inFlight = new Set<string>();\n const pending = new Map<string, PendingSave>();\n\n const keyFor = (\n scope: StoreScope,\n part: 'layout' | 'backup' = 'layout'\n ): string =>\n `dwt:${keyPart(scope.dashboardKey)}:${keyPart(scope.userKey ?? '_')}:${part}`;\n\n const checkScope = (scope: StoreScope): StoreResult<null> =>\n scope.dashboardKey.trim() === ''\n ? failure('invalid', 'The storage scope needs a non-empty dashboardKey.')\n : { ok: true, value: null };\n\n const encode = (\n layout: DashboardLayout,\n key: string\n ): StoreResult<string> => {\n const envelope: Envelope = {\n v: LAYOUT_ENVELOPE_VERSION,\n savedAt: new Date(now()).toISOString(),\n layout: JSON.parse(serializeLayout(layout)) as unknown,\n };\n const text: string = JSON.stringify(envelope);\n const size: number = utf8Length(text);\n if (size > maxBytes) {\n return failure(\n 'invalid',\n `Could not save \"${key}\": the layout is ${size} bytes, over the ${maxBytes} byte limit.`\n );\n }\n return { ok: true, value: text };\n };\n\n const guarded = async <T>(\n key: string,\n action: string,\n run: () => Promise<StoreResult<T>>\n ): Promise<StoreResult<T>> => {\n try {\n return await run();\n } catch (cause) {\n return failure(\n 'unavailable',\n `Could not ${action} \"${key}\": the adapter threw ${describeUnknownError(cause)}`\n );\n }\n };\n\n const readLayout = async (\n scope: StoreScope,\n part: 'layout' | 'backup'\n ): Promise<StoreResult<LoadedLayout>> => {\n const key: string = keyFor(scope, part);\n const result = await guarded(key, 'load', () =>\n adapter.get(key, { signal })\n );\n if (!result.ok) return result;\n if (result.value === null) {\n if (part === 'layout') revisions.delete(key);\n return { ok: true, value: { layout: null } };\n }\n const read = readEnvelope(key, result.value);\n if (!read.ok) return read;\n if (part === 'layout' && result.value.revision !== undefined) {\n revisions.set(key, result.value.revision);\n }\n return {\n ok: true,\n value: {\n layout: read.value.layout,\n ...(result.value.revision === undefined\n ? {}\n : { revision: result.value.revision }),\n ...(read.value.savedAt === undefined\n ? {}\n : { savedAt: read.value.savedAt }),\n },\n };\n };\n\n const repair = (\n loaded: LoadedLayout,\n definitions: readonly PageItem[],\n normalizeOptions: NormalizeOptions | undefined\n ): LoadedLayout =>\n loaded.layout === null\n ? loaded\n : {\n ...loaded,\n layout: normalizeLayout(definitions, loaded.layout, normalizeOptions),\n };\n\n const write = async (\n scope: StoreScope,\n layout: DashboardLayout,\n force: boolean\n ): Promise<StoreResult<SavedLayout>> => {\n const key: string = keyFor(scope);\n const text = encode(layout, key);\n if (!text.ok) return text;\n const known: string | undefined = revisions.get(key);\n lastWritten.set(key, text.value);\n const stored = await guarded(key, 'save', () =>\n adapter.set(key, text.value, {\n signal,\n ...(force || known === undefined ? {} : { ifRevision: known }),\n })\n );\n if (stored.ok) {\n if (stored.value.revision !== undefined) {\n revisions.set(key, stored.value.revision);\n }\n return {\n ok: true,\n value: {\n outcome: 'saved',\n layout,\n ...(stored.value.revision === undefined\n ? {}\n : { revision: stored.value.revision }),\n },\n };\n }\n if (stored.code !== 'conflict') return stored;\n\n const theirs = await readLayout(scope, 'layout');\n if (!theirs.ok) return theirs;\n const theirLayout: DashboardLayout = theirs.value.layout ?? layout;\n const theirRevision = theirs.value.revision;\n const asResult = (\n outcome: SavedLayout['outcome']\n ): StoreResult<SavedLayout> => ({\n ok: true,\n value: {\n outcome,\n layout: theirLayout,\n ...(theirRevision === undefined ? {} : { revision: theirRevision }),\n },\n });\n if (policy === 'overwrite') return write(scope, layout, true);\n if (policy === 'keep-theirs') return asResult('kept-theirs');\n if (policy === 'ask') return asResult('conflict');\n let merged: DashboardLayout;\n try {\n merged = policy(layout, theirLayout);\n } catch (cause) {\n return failure(\n 'invalid',\n `Could not save \"${key}\": the conflict merge function threw ${describeUnknownError(cause)}`\n );\n }\n const second = await write(scope, merged, false);\n if (second.ok && second.value.outcome === 'saved') return second;\n return second.ok ? asResult('conflict') : second;\n };\n\n const drain = async (\n scope: StoreScope,\n key: string,\n first: PendingSave\n ): Promise<void> => {\n let job: PendingSave | undefined = first;\n inFlight.add(key);\n while (job !== undefined) {\n const current: PendingSave = job;\n pending.delete(key);\n const result: StoreResult<SavedLayout> = await write(\n scope,\n current.layout,\n current.force\n );\n for (const waiter of current.waiters) waiter(result);\n job = pending.get(key);\n }\n inFlight.delete(key);\n };\n\n return {\n keyFor,\n async load(scope, definitions, normalizeOptions) {\n const valid = checkScope(scope);\n if (!valid.ok) return valid;\n const read = await readLayout(scope, 'layout');\n if (!read.ok) return read;\n return {\n ok: true,\n value: repair(read.value, definitions, normalizeOptions),\n };\n },\n save(scope, layout, saveOptions = {}) {\n const valid = checkScope(scope);\n if (!valid.ok) return Promise.resolve(valid);\n const key: string = keyFor(scope);\n const force: boolean = saveOptions.force === true;\n return new Promise<StoreResult<SavedLayout>>((resolve) => {\n const queued: PendingSave | undefined = pending.get(key);\n if (queued !== undefined) {\n // Newest wins: this layout replaces the one that hasn't started.\n queued.layout = layout;\n queued.force = queued.force || force;\n queued.waiters.push(resolve);\n return;\n }\n const job: PendingSave = { layout, force, waiters: [resolve] };\n if (inFlight.has(key)) {\n pending.set(key, job);\n return;\n }\n void drain(scope, key, job);\n });\n },\n async loadBackup(scope) {\n const valid = checkScope(scope);\n if (!valid.ok) return valid;\n const read = await readLayout(scope, 'backup');\n return read.ok ? { ok: true, value: read.value.layout } : read;\n },\n async saveBackup(scope, layout) {\n const valid = checkScope(scope);\n if (!valid.ok) return valid;\n const key: string = keyFor(scope, 'backup');\n const text = encode(layout, key);\n if (!text.ok) return text;\n const stored = await guarded(key, 'save', () =>\n adapter.set(key, text.value, { signal })\n );\n return stored.ok ? { ok: true, value: null } : stored;\n },\n async reset(scope) {\n const valid = checkScope(scope);\n if (!valid.ok) return valid;\n const layoutKey: string = keyFor(scope);\n const backupKey: string = keyFor(scope, 'backup');\n if (adapter.remove === undefined) {\n return failure(\n 'invalid',\n `Could not reset \"${layoutKey}\": the adapter has no remove method.`\n );\n }\n const remove = adapter.remove.bind(adapter);\n const first = await guarded(layoutKey, 'remove', () =>\n remove(layoutKey, { signal })\n );\n revisions.delete(layoutKey);\n if (!first.ok) return first;\n const second = await guarded(backupKey, 'remove', () =>\n remove(backupKey, { signal })\n );\n return second.ok ? { ok: true, value: null } : second;\n },\n watch(scope, definitions, onChange, normalizeOptions) {\n const key: string = keyFor(scope);\n const stop: (() => void) | undefined = adapter.subscribe?.(\n key,\n (stored) => {\n if (stored === null) {\n revisions.delete(key);\n onChange({ layout: null });\n return;\n }\n if (\n stored.value === lastWritten.get(key) ||\n (stored.revision !== undefined &&\n stored.revision === revisions.get(key))\n ) {\n return; // Our own save echoing back.\n }\n const read = readEnvelope(key, stored);\n if (!read.ok) return;\n onChange(\n repair(\n {\n layout: read.value.layout,\n ...(stored.revision === undefined\n ? {}\n : { revision: stored.revision }),\n ...(read.value.savedAt === undefined\n ? {}\n : { savedAt: read.value.savedAt }),\n },\n definitions,\n normalizeOptions\n )\n );\n }\n );\n return stop ?? (() => undefined);\n },\n };\n}\n","/**\n * Theming: turns a typed token object into scoped CSS for the `--dwt-*` custom\n * properties. Runtime-neutral: it only builds a string, so a Node API, a build\n * script or an SSR server can produce a theme without React or a DOM.\n *\n * The built-in defaults are declared on `.dwt-dashboard` and `.dwt-card`, so a\n * variable set on an ancestor is shadowed. The generated selectors therefore\n * target those two classes beneath a scope and out-rank the built-in dark rules.\n * See docs/design/theming.md.\n */\n\nimport { MAX_GRAPH_SERIES } from './payload.js';\nimport { err, ok, type Result } from './result.js';\n\nexport type ThemeColorKey =\n | 'surface'\n | 'page'\n | 'text'\n | 'textSecondary'\n | 'textMuted'\n | 'border'\n | 'grid'\n | 'baseline'\n | 'crosshair'\n | 'link'\n | 'focus'\n | 'good'\n | 'bad'\n | 'meterTrack'\n | 'barTrack'\n | 'buttonHover';\n\nexport type ThemeLengthKey = 'radius' | 'gap' | 'padding' | 'minColumn';\n\nexport type ThemeTokenKey = ThemeColorKey | ThemeLengthKey | 'font';\n\n/** The CSS custom property each token key sets (series are `--dwt-series-N`). */\nexport const THEME_TOKEN_VARIABLES: Readonly<Record<ThemeTokenKey, string>> = {\n font: '--dwt-font',\n surface: '--dwt-surface',\n page: '--dwt-page',\n text: '--dwt-text',\n textSecondary: '--dwt-text-secondary',\n textMuted: '--dwt-text-muted',\n border: '--dwt-border',\n grid: '--dwt-grid',\n baseline: '--dwt-baseline',\n crosshair: '--dwt-crosshair',\n link: '--dwt-link',\n focus: '--dwt-focus',\n good: '--dwt-good',\n bad: '--dwt-bad',\n meterTrack: '--dwt-meter-track',\n barTrack: '--dwt-bar-track',\n buttonHover: '--dwt-button-hover',\n radius: '--dwt-radius',\n gap: '--dwt-gap',\n padding: '--dwt-padding',\n minColumn: '--dwt-min-column',\n};\n\ntype TokenKind = 'color' | 'length' | 'font';\n\nconst LENGTH_KEYS: ReadonlySet<string> = new Set([\n 'radius',\n 'gap',\n 'padding',\n 'minColumn',\n]);\n\nfunction kindOf(key: ThemeTokenKey): TokenKind {\n if (key === 'font') {\n return 'font';\n }\n return LENGTH_KEYS.has(key) ? 'length' : 'color';\n}\n\nexport type ThemeTokens = {\n readonly [Key in ThemeTokenKey]?: string;\n} & {\n /** Chart colors in order; fills `--dwt-series-1` to `--dwt-series-N`. */\n readonly series?: readonly string[];\n};\n\nexport interface ThemeOptions {\n /** Lower-case letters, digits and hyphens, starting with a letter. */\n readonly name: string;\n /**\n * Selector of an ancestor of the dashboard. Defaults to\n * `[data-dwt-theme='<name>']`. Letters, digits, `_ - [ ] = . # ' \"` and spaces\n * only.\n */\n readonly scope?: string;\n /** Applied in light and dark mode. */\n readonly base?: ThemeTokens;\n /** Applied in light mode only; wins over `base`. */\n readonly light?: ThemeTokens;\n /** Applied in dark mode only; wins over `base`. */\n readonly dark?: ThemeTokens;\n}\n\nexport type ThemeMode = 'base' | 'light' | 'dark';\n\nexport interface WidgetThemeStyles {\n readonly name: string;\n readonly scope: string;\n /** For a `<style>` element or the head of a server-rendered page. */\n readonly css: string;\n /** The resolved custom properties per mode, e.g. `{'--dwt-surface': '#fff'}`. */\n readonly variables: Readonly<\n Record<ThemeMode, Readonly<Record<string, string>>>\n >;\n}\n\nconst NAME_PATTERN: RegExp = /^[a-z][a-z0-9-]*$/;\nconst SCOPE_PATTERN: RegExp = /^[A-Za-z0-9_\\-[\\]=.# '\"]+$/;\nconst HEX_COLOR: RegExp = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst COLOR_FUNCTION: RegExp =\n /^(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark)\\(.+\\)$/i;\nconst VAR_REFERENCE: RegExp = /^var\\(\\s*--[A-Za-z0-9_-]+\\s*(?:,.+)?\\)$/;\nconst COLOR_KEYWORD: RegExp = /^[A-Za-z]+$/;\nconst LENGTH_VALUE: RegExp =\n /^(?:0|-?(?:\\d+\\.?\\d*|\\.\\d+)(?:px|rem|em|%|ch|vw|vh|cqw|cqh))$/;\nconst LENGTH_FUNCTION: RegExp = /^(?:calc|min|max|clamp)\\(.+\\)$/i;\nconst FONT_VALUE: RegExp = /^[A-Za-z0-9 ,'\"_-]+$/;\n\n/** Why a value is unsafe to write into a stylesheet, or null when it is fine. */\nfunction unsafeReason(value: string): string | null {\n if (\n [...value].some(\n (character) =>\n character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127\n )\n ) {\n return 'contains a control character or line break';\n }\n if (/[;{}<>\\\\@]/.test(value)) {\n return 'contains one of ; { } < > \\\\ @';\n }\n const lower: string = value.toLowerCase();\n if (lower.includes('/*') || lower.includes('*/')) {\n return 'contains a comment marker';\n }\n if (lower.includes('url(') || lower.includes('expression(')) {\n return 'contains url( or expression(';\n }\n let depth: number = 0;\n for (const character of value) {\n if (character === '(') {\n depth += 1;\n } else if (character === ')') {\n depth -= 1;\n if (depth < 0) {\n return 'has unbalanced parentheses';\n }\n }\n }\n return depth === 0 ? null : 'has unbalanced parentheses';\n}\n\nfunction countOf(value: string, character: string): number {\n return value.split(character).length - 1;\n}\n\n/** Why `value` is not a valid `kind`, or null when it is. */\nfunction invalidReason(kind: TokenKind, value: string): string | null {\n if (value !== value.trim() || value === '') {\n return 'must not be empty or have leading or trailing spaces';\n }\n if (kind === 'font') {\n if (!FONT_VALUE.test(value)) {\n return 'allows only letters, digits, spaces, commas, hyphens, underscores and quotes';\n }\n if (countOf(value, \"'\") % 2 !== 0 || countOf(value, '\"') % 2 !== 0) {\n return 'has an unclosed quote';\n }\n return null;\n }\n const unsafe: string | null = unsafeReason(value);\n if (unsafe !== null) {\n return unsafe;\n }\n if (value.includes(\"'\") || value.includes('\"')) {\n return 'must not contain quotes';\n }\n if (kind === 'color') {\n const valid: boolean =\n HEX_COLOR.test(value) ||\n COLOR_FUNCTION.test(value) ||\n VAR_REFERENCE.test(value) ||\n COLOR_KEYWORD.test(value);\n return valid\n ? null\n : 'is not a color (use #hex, rgb(), hsl(), oklch() and similar, var(--name) or a keyword)';\n }\n const valid: boolean =\n LENGTH_VALUE.test(value) ||\n LENGTH_FUNCTION.test(value) ||\n VAR_REFERENCE.test(value);\n return valid\n ? null\n : 'is not a length (use a number with px, rem, em, %, ch, vw or vh, 0, calc(), min(), max(), clamp() or var(--name))';\n}\n\nfunction collectVariables(\n themeName: string,\n mode: ThemeMode,\n tokens: ThemeTokens | undefined\n): Result<Record<string, string>> {\n const variables: Record<string, string> = {};\n if (tokens === undefined) {\n return ok(variables);\n }\n const label = (key: string): string =>\n `createTheme \"${themeName}\": ${mode}.${key}`;\n const knownKeys: readonly string[] = [\n ...Object.keys(THEME_TOKEN_VARIABLES),\n 'series',\n ];\n for (const key of Object.keys(tokens)) {\n if (!knownKeys.includes(key)) {\n return err(\n `${label(key)} is not a theme token. Known tokens: ${knownKeys.join(', ')}.`\n );\n }\n }\n for (const key of Object.keys(THEME_TOKEN_VARIABLES) as ThemeTokenKey[]) {\n const value: string | undefined = tokens[key];\n if (value === undefined) {\n continue;\n }\n if (typeof value !== 'string') {\n return err(`${label(key)} must be a string, got ${typeof value}.`);\n }\n const reason: string | null = invalidReason(kindOf(key), value);\n if (reason !== null) {\n return err(`${label(key)} \"${value}\" ${reason}.`);\n }\n variables[THEME_TOKEN_VARIABLES[key]] = value;\n }\n const series: readonly string[] | undefined = tokens.series;\n if (series !== undefined) {\n if (!Array.isArray(series) || series.length === 0) {\n return err(`${label('series')} must be a non-empty array of colors.`);\n }\n if (series.length > MAX_GRAPH_SERIES) {\n return err(\n `${label('series')} has ${series.length} colors; charts draw at most ${MAX_GRAPH_SERIES} series.`\n );\n }\n for (const [index, value] of series.entries()) {\n const reason: string | null =\n typeof value === 'string'\n ? invalidReason('color', value)\n : 'must be a string';\n if (reason !== null) {\n return err(\n `${label(`series[${index}]`)} \"${String(value)}\" ${reason}.`\n );\n }\n variables[`--dwt-series-${index + 1}`] = value;\n }\n }\n return ok(variables);\n}\n\nfunction declarations(variables: Readonly<Record<string, string>>): string {\n return Object.entries(variables)\n .map(([variable, value]) => ` ${variable}: ${value};`)\n .join('\\n');\n}\n\n/** `prefix scope .dwt-dashboard, prefix scope .dwt-card`. */\nfunction targets(prefix: string, scope: string): string {\n const lead: string = prefix === '' ? '' : `${prefix} `;\n return `${lead}${scope} .dwt-dashboard,\\n${lead}${scope} .dwt-card`;\n}\n\nfunction rule(\n prefix: string,\n scope: string,\n variables: Readonly<Record<string, string>>\n): string {\n return `${targets(prefix, scope)} {\\n${declarations(variables)}\\n}`;\n}\n\n/**\n * Builds the CSS for a theme. Tokens left unset keep their built-in value in\n * each mode. Returns an error naming the mode, the token and the value when\n * anything is invalid.\n */\nexport function createTheme(options: ThemeOptions): Result<WidgetThemeStyles> {\n const name: string = options.name;\n if (typeof name !== 'string' || !NAME_PATTERN.test(name)) {\n return err(\n `createTheme: name \"${String(name)}\" must start with a lower-case letter and contain only lower-case letters, digits and hyphens.`\n );\n }\n const scope: string = (options.scope ?? `[data-dwt-theme='${name}']`).trim();\n if (scope === '' || !SCOPE_PATTERN.test(scope)) {\n return err(\n `createTheme \"${name}\": scope \"${scope}\" must be a selector of letters, digits and _ - [ ] = . # ' \" or spaces (no commas, colons or combinators).`\n );\n }\n\n const modes: readonly ThemeMode[] = ['base', 'light', 'dark'];\n const variables: Record<ThemeMode, Record<string, string>> = {\n base: {},\n light: {},\n dark: {},\n };\n for (const mode of modes) {\n const collected: Result<Record<string, string>> = collectVariables(\n name,\n mode,\n options[mode]\n );\n if (!collected.ok) {\n return collected;\n }\n variables[mode] = collected.value;\n }\n if (modes.every((mode) => Object.keys(variables[mode]).length === 0)) {\n return err(\n `createTheme \"${name}\": no tokens were set. Pass at least one value in base, light or dark.`\n );\n }\n\n const blocks: string[] = [];\n if (Object.keys(variables.base).length > 0) {\n blocks.push(rule('', scope, variables.base));\n }\n if (Object.keys(variables.light).length > 0) {\n blocks.push(\n rule(\":root:where([data-theme='light'])\", scope, variables.light)\n );\n blocks.push(\n `@media (prefers-color-scheme: light) {\\n${indent(\n rule(\n \":root:where(:not([data-theme='dark'], .dark))\",\n scope,\n variables.light\n )\n )}\\n}`\n );\n }\n if (Object.keys(variables.dark).length > 0) {\n blocks.push(\n rule(\":root:where([data-theme='dark'], .dark)\", scope, variables.dark)\n );\n blocks.push(\n `@media (prefers-color-scheme: dark) {\\n${indent(\n rule(\":root:where(:not([data-theme='light']))\", scope, variables.dark)\n )}\\n}`\n );\n }\n\n return ok({\n name,\n scope,\n css: `${blocks.join('\\n\\n')}\\n`,\n variables,\n });\n}\n\nfunction indent(block: string): string {\n return block\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n}\n"]}