@richardmcquiston01/dashboard-widgets-toolkit 0.9.0 → 0.10.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.
@@ -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/layout.ts","../src/core/validate.ts","../src/core/resolve.ts","../src/core/loader.ts","../src/core/scale.ts"],"names":["describeType"],"mappings":"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","file":"index.cjs","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 { WidgetKind } from './payload.js';\n\n/** A size hint for grid layouts; renderers may map it to column spans. */\nexport const WIDGET_SIZES = ['small', 'medium', 'large', 'full'] as const;\n\nexport type WidgetSize = (typeof WIDGET_SIZES)[number];\n\n/**\n * How a widget fills free space in a grid layout. `height` stretches it to\n * the height of its row; `width` widens it to take the columns left over in\n * its row; `both` does both. Absent, a widget is only as big as its content\n * and `defaultSize`.\n */\nexport const WIDGET_FILLS = ['height', 'width', 'both'] as const;\n\nexport type WidgetFill = (typeof WIDGET_FILLS)[number];\n\n/**\n * What a widget is, independent of its data. Mirrors Maker Toolkit's\n * `widget` table (`widget_key`, `title`, `description`, `view_type`,\n * `roles`, `sort_order`, `active`).\n */\nexport interface WidgetDefinition {\n /** Stable, unique id. Layouts and providers are keyed by it. */\n readonly key: string;\n readonly title: string;\n readonly description?: string;\n readonly kind: WidgetKind;\n /** Lower comes first. Default 0; ties keep definition order. */\n readonly sortOrder?: number;\n /** Roles allowed to see it. Absent or empty means everyone. */\n readonly roles?: readonly string[];\n /** False hides it from every user. Default true. */\n readonly active?: boolean;\n readonly defaultSize?: WidgetSize;\n /**\n * Share of the row the widget takes, in twelfths: an integer from 2 to 12\n * (6 is half the row, 12 the whole row). When any widget in a grid sets\n * it, the grid becomes 12 columns wide and widgets without a `width` use\n * the one their `defaultSize` implies (see `widthForSize`). Narrow grids\n * give widgets more room automatically.\n */\n readonly width?: number;\n /**\n * Gives the widget a detail view: a full list with sorting, filtering and\n * paging. `true` uses defaults. The data comes from a detail provider.\n */\n readonly detail?: boolean | WidgetDetailOptions;\n /**\n * TABLE widgets only: a search box and sortable column headers in the card\n * itself, working on the rows the card holds. `true` turns on both. With a\n * `footer` (rows were left out) they only see the rows shown; use `detail`\n * for the full list.\n */\n readonly tableControls?: boolean | WidgetTableControls;\n /** Fill free space in the row (height, width or both). Default: none. */\n readonly fill?: WidgetFill;\n /**\n * Keeps viewers from rearranging this widget. `true` locks everything:\n * move, hide and minimize. Use an object to lock only some; fields left out\n * are not locked.\n */\n readonly locked?: boolean | WidgetLock;\n}\n\n/** What a viewer may not do to a locked widget. */\nexport interface WidgetLock {\n /** Can't be reordered, and holds its place (a pinned slot). */\n readonly move?: boolean;\n /** Can't be hidden. */\n readonly hide?: boolean;\n /** Can't be collapsed to its header. */\n readonly minimize?: boolean;\n}\n\n/** `WidgetLock` with every default filled in. */\nexport type ResolvedWidgetLock = Required<WidgetLock>;\n\nconst NOT_LOCKED: ResolvedWidgetLock = Object.freeze({\n move: false,\n hide: false,\n minimize: false,\n});\nconst FULLY_LOCKED: ResolvedWidgetLock = Object.freeze({\n move: true,\n hide: true,\n minimize: true,\n});\n\n/**\n * Reads a widget's `locked` setting with defaults: `true` locks move, hide\n * and minimize, an object locks the fields it sets to `true`, and anything\n * else (absent, `false`) locks nothing.\n */\nexport function resolveWidgetLock(\n definition: Pick<WidgetDefinition, 'locked'>\n): ResolvedWidgetLock {\n const setting: boolean | WidgetLock | undefined = definition.locked;\n if (setting === true) return FULLY_LOCKED;\n if (setting === undefined || setting === false) return NOT_LOCKED;\n return {\n move: setting.move === true,\n hide: setting.hide === true,\n minimize: setting.minimize === true,\n };\n}\n\n/**\n * Identity helper that keeps the literal `kind` (so typed providers can be\n * checked against it) and gives a definition its type without a cast.\n */\nexport function defineWidget<const D extends WidgetDefinition>(\n definition: D\n): D {\n return definition;\n}\n\n/** Definitions sorted by `sortOrder` (stable: ties keep their input order). */\nexport function sortDefinitions<D extends WidgetDefinition>(\n definitions: readonly D[]\n): D[] {\n return definitions\n .map((definition, index) => ({ definition, index }))\n .sort(\n (a, b) =>\n (a.definition.sortOrder ?? 0) - (b.definition.sortOrder ?? 0) ||\n a.index - b.index\n )\n .map(({ definition }) => definition);\n}\n\n/** Whether a widget is active and visible to someone with these roles. */\nexport function isWidgetVisibleTo(\n definition: WidgetDefinition,\n roles: readonly string[] | undefined\n): boolean {\n if (definition.active === false) {\n return false;\n }\n if (definition.roles === undefined || definition.roles.length === 0) {\n return true;\n }\n if (roles === undefined) {\n return false;\n }\n return definition.roles.some((role) => roles.includes(role));\n}\n","/**\n * 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\nfunction placeAndFill(\n items: readonly GridItem[],\n columns: number,\n spanOf: (item: GridItem, trackCount: number) => number\n): Map<string, number> {\n const trackCount: number = Math.max(1, Math.floor(columns));\n const spans = new Map<string, number>();\n let row: { item: GridItem; span: number }[] = [];\n let used = 0;\n\n function closeRow(): void {\n const fillers = row.filter(({ item }) => fillsWidth(item.fill));\n const leftover: number = trackCount - used;\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 spans.set(item.key, span + share + (index < remainder ? 1 : 0));\n });\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;\n}\n","/**\n * A viewer's dashboard customization: order, hidden and minimized widgets.\n * Pure functions over a small JSON-serialisable object. Persist it however\n * you like (a settings table, localStorage); `parseLayout` tolerates\n * anything, so a corrupt saved value never breaks the dashboard.\n *\n * Generalised from Maker Toolkit's desktop `dashboard-layout.ts`.\n */\n\nimport { resolveWidgetLock, type WidgetLock } from './definition.js';\n\n/** What layout functions need from a widget definition. */\nexport interface LayoutItem {\n readonly key: string;\n readonly sortOrder?: number;\n /** See `WidgetDefinition.locked`. Pinned widgets hold their slot. */\n readonly locked?: boolean | WidgetLock;\n}\n\nexport interface DashboardLayout {\n /** Widget keys in display order. Keys not listed follow, by sortOrder. */\n readonly order: readonly string[];\n /** Widget keys removed from the dashboard (restorable). */\n readonly hidden: readonly string[];\n /** Widget keys collapsed to their header. */\n readonly minimized: readonly string[];\n}\n\nexport const EMPTY_LAYOUT: DashboardLayout = Object.freeze({\n order: Object.freeze([]) as readonly string[],\n hidden: Object.freeze([]) as readonly string[],\n minimized: Object.freeze([]) as readonly string[],\n});\n\nfunction uniqueStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n const seen = new Set<string>();\n for (const entry of value) {\n if (typeof entry === 'string' && entry !== '') seen.add(entry);\n }\n return [...seen];\n}\n\n/**\n * Reads a saved layout: a JSON string or an already-parsed object. Missing,\n * corrupt or wrongly typed values give the empty layout (or empty lists for\n * the fields that are wrong); non-string and duplicate keys are dropped.\n */\nexport function parseLayout(raw: unknown): DashboardLayout {\n let value: unknown = raw;\n if (typeof raw === 'string') {\n try {\n value = JSON.parse(raw);\n } catch {\n return EMPTY_LAYOUT;\n }\n }\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return EMPTY_LAYOUT;\n }\n const record = value as Readonly<Record<string, unknown>>;\n const order: string[] = uniqueStrings(record['order']);\n const hidden: string[] = uniqueStrings(record['hidden']);\n const minimized: string[] = uniqueStrings(record['minimized']);\n if (order.length === 0 && hidden.length === 0 && minimized.length === 0) {\n return EMPTY_LAYOUT;\n }\n return { order, hidden, minimized };\n}\n\n/** The JSON string to persist. */\nexport function serializeLayout(layout: DashboardLayout): string {\n return JSON.stringify({\n order: [...layout.order],\n hidden: [...layout.hidden],\n minimized: [...layout.minimized],\n });\n}\n\nfunction bySortOrder<T extends LayoutItem>(items: readonly T[]): T[] {\n return items\n .map((item, index) => ({ item, index }))\n .sort(\n (a, b) =>\n (a.item.sortOrder ?? 0) - (b.item.sortOrder ?? 0) || a.index - b.index\n )\n .map(({ item }) => item);\n}\n\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[]): string[] =>\n keys.filter((k) => known.has(k));\n const next: DashboardLayout = {\n order: keep(layout.order),\n hidden: keep(layout.hidden),\n minimized: keep(layout.minimized),\n };\n return next.order.length === layout.order.length &&\n next.hidden.length === layout.hidden.length &&\n next.minimized.length === layout.minimized.length\n ? layout\n : next;\n}\n\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 const order = without(layout.order, noMove);\n const hidden = without(layout.hidden, noHide);\n const minimized = without(layout.minimized, noMinimize);\n return order === layout.order &&\n hidden === layout.hidden &&\n minimized === layout.minimized\n ? layout\n : { ...layout, order, hidden, minimized };\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 { MAX_WIDGET_WIDTH, MIN_WIDGET_WIDTH, isWidgetWidth } from './grid.js';\nimport { err, ok, type Result } from './result.js';\nimport { isSafeHref, isSafeImageUrl } from './url.js';\n\n/** At most this many problems are listed in one error message. */\nexport const MAX_REPORTED_PROBLEMS = 10;\n\nexport interface ValidateWidgetDataOptions {\n /** Named in error messages, e.g. the widget key. */\n readonly widgetKey?: string;\n /** Fails unless the payload is this kind (an empty state always passes). */\n readonly expectedKind?: WidgetKind;\n}\n\ntype Problems = string[];\ntype Record_ = Readonly<Record<string, unknown>>;\n\nfunction describeType(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (typeof value === 'number' && !Number.isFinite(value)) {\n return String(value);\n }\n return typeof value;\n}\n\nfunction isRecord(value: unknown): value is Record_ {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction join(path: string, field: string): string {\n return path === '' ? field : `${path}.${field}`;\n}\n\nfunction requireString(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'string') {\n problems.push(\n `${join(path, field)} must be a string, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalString(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n if (record[field] !== undefined) {\n requireString(record, field, path, problems);\n }\n}\n\nfunction requireNumber(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n problems.push(\n `${join(path, field)} must be a finite number, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalNumber(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n if (record[field] !== undefined) {\n requireNumber(record, field, path, problems);\n }\n}\n\n/** A cell's optional sort `value`: a string or a finite number. */\nfunction optionalSortValue(\n record: Record_,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record['value'];\n if (\n value !== undefined &&\n typeof value !== 'string' &&\n !(typeof value === 'number' && Number.isFinite(value))\n ) {\n problems.push(\n `${path}.value must be a string or a finite number, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalBoolean(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (value !== undefined && typeof value !== 'boolean') {\n problems.push(\n `${join(path, field)} must be a boolean, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalUrl(\n record: Record_,\n field: string,\n path: string,\n problems: Problems,\n isSafe: (url: string) => boolean,\n allowed: string\n): void {\n const value: unknown = record[field];\n if (value === undefined) return;\n if (typeof value !== 'string') {\n problems.push(\n `${join(path, field)} must be a string, got ${describeType(value)}.`\n );\n } else if (!isSafe(value)) {\n problems.push(\n `${join(path, field)} must be ${allowed}, got ${JSON.stringify(value.slice(0, 80))}.`\n );\n }\n}\n\nfunction requireArray(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): readonly unknown[] | null {\n const value: unknown = record[field];\n if (!Array.isArray(value)) {\n problems.push(\n `${join(path, field)} must be an array, got ${describeType(value)}.`\n );\n return null;\n }\n return value;\n}\n\nfunction requireOneOf(\n record: Record_,\n field: string,\n options: readonly string[],\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'string' || !options.includes(value)) {\n problems.push(\n `${join(path, field)} must be one of ${options.map((o) => `\"${o}\"`).join(', ')}, got ${\n typeof value === 'string' ? JSON.stringify(value) : describeType(value)\n }.`\n );\n }\n}\n\n/** Runs `check` on each element that is an object, reporting the others. */\nfunction eachRecord(\n items: readonly unknown[],\n path: string,\n problems: Problems,\n check: (item: Record_, itemPath: string) => void\n): void {\n items.forEach((item: unknown, index: number) => {\n const itemPath = `${path}[${index}]`;\n if (isRecord(item)) {\n check(item, itemPath);\n } else {\n problems.push(\n `${itemPath} must be an object, got ${describeType(item)}.`\n );\n }\n });\n}\n\nconst HREF_RULE = 'an http(s), mailto or relative URL';\nconst IMAGE_RULE = 'an http(s) or relative URL';\n\nfunction checkPayloadFields(\n kind: WidgetKind,\n data: Record_,\n problems: Problems\n): void {\n switch (kind) {\n case 'TEXT':\n requireString(data, 'value', '', problems);\n requireString(data, 'label', '', problems);\n return;\n case 'KPI':\n requireNumber(data, 'value', '', problems);\n if (data['previous'] !== null) {\n optionalNumber(data, 'previous', '', problems);\n }\n requireOneOf(data, 'format', VALUE_FORMATS, '', problems);\n optionalString(data, 'currency', '', problems);\n requireString(data, 'label', '', problems);\n optionalString(data, 'hint', '', problems);\n optionalBoolean(data, 'higherIsBetter', '', problems);\n return;\n case 'GAUGE':\n requireNumber(data, 'value', '', problems);\n requireNumber(data, 'max', '', problems);\n requireString(data, 'label', '', problems);\n if (typeof data['max'] === 'number' && data['max'] <= 0) {\n problems.push(`max must be greater than 0, got ${data['max']}.`);\n }\n return;\n case 'TABLE': {\n const columns = requireArray(data, 'columns', '', problems);\n if (columns !== null) {\n eachRecord(columns, 'columns', problems, (column, path) => {\n requireString(column, 'label', path, problems);\n optionalBoolean(column, 'numeric', path, problems);\n });\n }\n const rows = requireArray(data, 'rows', '', problems);\n if (rows !== null) {\n rows.forEach((row: unknown, rowIndex: number) => {\n const rowPath = `rows[${rowIndex}]`;\n if (!Array.isArray(row)) {\n problems.push(\n `${rowPath} must be an array of cells, got ${describeType(row)}.`\n );\n return;\n }\n if (columns !== null && row.length !== columns.length) {\n problems.push(\n `${rowPath} has ${row.length} cell(s) but there are ${columns.length} column(s).`\n );\n }\n eachRecord(row, rowPath, problems, (cell, cellPath) => {\n requireString(cell, 'text', cellPath, problems);\n optionalSortValue(cell, cellPath, problems);\n optionalUrl(\n cell,\n 'href',\n cellPath,\n problems,\n isSafeHref,\n HREF_RULE\n );\n });\n });\n }\n optionalString(data, 'footer', '', problems);\n return;\n }\n case 'BAR_LIST': {\n const items = requireArray(data, 'items', '', problems);\n if (items !== null) {\n eachRecord(items, 'items', problems, (item, path) => {\n requireString(item, 'label', path, problems);\n requireNumber(item, 'value', path, problems);\n optionalString(item, 'display', path, problems);\n });\n }\n optionalNumber(data, 'total', '', problems);\n return;\n }\n case 'ALERT_LIST': {\n const items = requireArray(data, 'items', '', problems);\n if (items !== null) {\n eachRecord(items, 'items', problems, (item, path) => {\n requireString(item, 'title', path, problems);\n optionalUrl(item, 'href', path, problems, isSafeHref, HREF_RULE);\n optionalUrl(\n item,\n 'thumbnailUrl',\n path,\n problems,\n isSafeImageUrl,\n IMAGE_RULE\n );\n requireString(item, 'valueLabel', path, problems);\n optionalString(item, 'detail', path, problems);\n });\n }\n requireNumber(data, 'total', '', problems);\n requireString(data, 'emptyText', '', problems);\n if (\n items !== null &&\n typeof data['total'] === 'number' &&\n data['total'] < items.length\n ) {\n problems.push(\n `total (${data['total']}) must be at least the number of items (${items.length}).`\n );\n }\n return;\n }\n case 'GRAPH': {\n const series = requireArray(data, 'series', '', problems);\n if (series !== null) {\n if (series.length > MAX_GRAPH_SERIES) {\n problems.push(\n `series has ${series.length} entries; at most ${MAX_GRAPH_SERIES} are allowed (fold the rest into \"Other\").`\n );\n }\n eachRecord(series, 'series', problems, (entry, path) => {\n requireString(entry, 'name', path, problems);\n const points = requireArray(entry, 'points', path, problems);\n if (points !== null) {\n eachRecord(\n points,\n `${path}.points`,\n problems,\n (point, pointPath) => {\n requireString(point, 'label', pointPath, problems);\n requireNumber(point, 'value', pointPath, problems);\n }\n );\n }\n });\n }\n requireOneOf(data, 'chartType', ['bar', 'line'], '', problems);\n requireOneOf(data, 'valueFormat', VALUE_FORMATS, '', problems);\n optionalString(data, 'currency', '', problems);\n optionalString(data, 'xLabel', '', problems);\n return;\n }\n }\n}\n\n/** Checks a definition's `detail` setting: a boolean or an options object. */\nfunction checkDetailOption(detail: unknown, problems: Problems): void {\n if (detail === undefined || typeof detail === 'boolean') return;\n if (!isRecord(detail)) {\n problems.push(\n `detail must be true, false or an options object, got ${describeType(detail)}.`\n );\n return;\n }\n optionalString(detail, 'title', 'detail', problems);\n const pageSize: unknown = detail['pageSize'];\n if (\n pageSize !== undefined &&\n !(\n typeof pageSize === 'number' &&\n Number.isInteger(pageSize) &&\n pageSize >= 1 &&\n pageSize <= MAX_DETAIL_PAGE_SIZE\n )\n ) {\n problems.push(\n `detail.pageSize must be a whole number from 1 to ${MAX_DETAIL_PAGE_SIZE}, got ${typeof pageSize === 'number' ? String(pageSize) : describeType(pageSize)}.`\n );\n }\n if (detail['mode'] !== undefined) {\n requireOneOf(detail, 'mode', DETAIL_MODES, 'detail', problems);\n }\n}\n\n/** Checks a definition's `tableControls`: a boolean or `{ search, sort }`. */\nfunction checkTableControlsOption(\n controls: unknown,\n kind: unknown,\n problems: Problems\n): void {\n if (controls === undefined || controls === false) return;\n if (typeof controls !== 'boolean' && !isRecord(controls)) {\n problems.push(\n `tableControls must be true, false or an options object, got ${describeType(controls)}.`\n );\n return;\n }\n if (isRecord(controls)) {\n optionalBoolean(controls, 'search', 'tableControls', problems);\n optionalBoolean(controls, 'sort', 'tableControls', problems);\n }\n if (typeof kind === 'string' && kind !== 'TABLE') {\n problems.push(\n `tableControls only applies to TABLE widgets, but kind is \"${kind}\".`\n );\n }\n}\n\n/** Checks a definition's `locked`: a boolean or `{ move, hide, minimize }`. */\nfunction checkLockedOption(locked: unknown, problems: Problems): void {\n if (locked === undefined || typeof locked === 'boolean') return;\n if (!isRecord(locked)) {\n problems.push(\n `locked must be true, false or an object, got ${describeType(locked)}.`\n );\n return;\n }\n optionalBoolean(locked, 'move', 'locked', problems);\n optionalBoolean(locked, 'hide', 'locked', problems);\n optionalBoolean(locked, 'minimize', 'locked', problems);\n}\n\nfunction formatProblems(prefix: string, problems: Problems): string {\n const shown: Problems = problems.slice(0, MAX_REPORTED_PROBLEMS);\n const more: number = problems.length - shown.length;\n return `${prefix}: ${shown.join(' ')}${more > 0 ? ` (and ${more} more problem(s))` : ''}`;\n}\n\n/**\n * Checks that `value` is a valid widget payload (any kind, or an empty\n * state). Returns it typed, or an error naming every problem found (up to\n * `MAX_REPORTED_PROBLEMS`). Unknown extra fields are allowed and ignored.\n */\nexport function validateWidgetData(\n value: unknown,\n options: ValidateWidgetDataOptions = {}\n): Result<WidgetPayload> {\n const subject: string =\n options.widgetKey === undefined\n ? 'Widget data'\n : `Widget ${JSON.stringify(options.widgetKey)}`;\n if (!isRecord(value)) {\n return err(`${subject}: must be an object, got ${describeType(value)}.`);\n }\n if (value['empty'] === true) {\n if (typeof value['text'] !== 'string') {\n return err(\n `${subject} (empty): text must be a string, got ${describeType(value['text'])}.`\n );\n }\n return ok(value as unknown as WidgetPayload);\n }\n const kind: unknown = value['kind'];\n if (!isWidgetKind(kind)) {\n return err(\n `${subject}: kind must be one of ${WIDGET_KINDS.join(', ')} (or the payload must be {\"empty\": true, \"text\": ...}), got ${\n typeof kind === 'string' ? JSON.stringify(kind) : describeType(kind)\n }.`\n );\n }\n if (options.expectedKind !== undefined && kind !== options.expectedKind) {\n return err(\n `${subject}: expected kind ${options.expectedKind} from its definition, got ${kind}.`\n );\n }\n const problems: Problems = [];\n checkPayloadFields(kind, value, problems);\n if (problems.length > 0) {\n return err(formatProblems(`${subject} (${kind})`, problems));\n }\n return ok(value as unknown as WidgetPayload);\n}\n\n/**\n * Checks that `value` is a valid widget definition. Returns it typed, or an\n * error naming every problem found.\n */\nexport function validateWidgetDefinition(\n value: unknown\n): Result<WidgetDefinition> {\n if (!isRecord(value)) {\n return err(\n `Widget definition: must be an object, got ${describeType(value)}.`\n );\n }\n const subject: string =\n typeof value['key'] === 'string'\n ? `Widget definition ${JSON.stringify(value['key'])}`\n : 'Widget definition';\n const problems: Problems = [];\n requireString(value, 'key', '', problems);\n if (value['key'] === '') {\n problems.push('key must not be empty.');\n }\n requireString(value, 'title', '', problems);\n optionalString(value, 'description', '', problems);\n requireOneOf(value, 'kind', WIDGET_KINDS, '', problems);\n optionalNumber(value, 'sortOrder', '', problems);\n if (value['roles'] !== undefined) {\n const roles = requireArray(value, 'roles', '', problems);\n roles?.forEach((role: unknown, index: number) => {\n if (typeof role !== 'string') {\n problems.push(\n `roles[${index}] must be a string, got ${describeType(role)}.`\n );\n }\n });\n }\n optionalBoolean(value, 'active', '', problems);\n if (value['defaultSize'] !== undefined) {\n requireOneOf(value, 'defaultSize', WIDGET_SIZES, '', problems);\n }\n if (value['width'] !== undefined && !isWidgetWidth(value['width'])) {\n problems.push(\n `width must be an integer from ${MIN_WIDGET_WIDTH} to ${MAX_WIDGET_WIDTH} (twelfths of the row), got ${typeof value['width'] === 'number' ? String(value['width']) : describeType(value['width'])}.`\n );\n }\n checkDetailOption(value['detail'], problems);\n checkTableControlsOption(value['tableControls'], value['kind'], problems);\n checkLockedOption(value['locked'], problems);\n 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 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\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}\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}\n\nexport interface ErrorWidget {\n readonly definition: WidgetDefinition;\n readonly status: 'error';\n /** Names the widget and what failed. */\n readonly error: string;\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}\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 {\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/** The cache key for a widget under these options. */\nexport function cacheKeyFor(\n definition: WidgetDefinition,\n options: ResolveOptions\n): string {\n return options.cacheKey === undefined\n ? definition.key\n : options.cacheKey(definition);\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 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, { signal: controller.signal });\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), {\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 cacheKeyFor,\n loadingWidgets,\n resolvePayload,\n resolveWidget,\n widgetsFor,\n type DashboardWidget,\n type ResolveOptions,\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 /** 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, ...resolveOptions } = options;\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 if (readCache && resolveOptions.cache !== undefined) {\n try {\n const entry = await resolveOptions.cache.get(\n cacheKeyFor(definition, resolveOptions)\n );\n if (entry !== undefined && isCurrent()) {\n const cached = resolvePayload(\n definition,\n entry.payload,\n resolveOptions\n );\n if (cached.status === 'ok') {\n replace(key, { ...cached, updatedAt: entry.storedAt, stale: true });\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 resolveWidget(definition, provider, context, {\n ...resolveOptions,\n signal: controller.signal,\n });\n if (!isCurrent()) return;\n inFlight.delete(key);\n replace(key, result);\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 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 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"]}
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/layout.ts","../src/core/validate.ts","../src/core/resolve.ts","../src/core/loader.ts","../src/core/pages.ts","../src/core/scale.ts"],"names":["without","describeType"],"mappings":"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","file":"index.cjs","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 { WidgetKind } from './payload.js';\n\n/** A size hint for grid layouts; renderers may map it to column spans. */\nexport const WIDGET_SIZES = ['small', 'medium', 'large', 'full'] as const;\n\nexport type WidgetSize = (typeof WIDGET_SIZES)[number];\n\n/**\n * How a widget fills free space in a grid layout. `height` stretches it to\n * the height of its row; `width` widens it to take the columns left over in\n * its row; `both` does both. Absent, a widget is only as big as its content\n * and `defaultSize`.\n */\nexport const WIDGET_FILLS = ['height', 'width', 'both'] as const;\n\nexport type WidgetFill = (typeof WIDGET_FILLS)[number];\n\n/**\n * What a widget is, independent of its data. Mirrors Maker Toolkit's\n * `widget` table (`widget_key`, `title`, `description`, `view_type`,\n * `roles`, `sort_order`, `active`).\n */\nexport interface WidgetDefinition {\n /** Stable, unique id. Layouts and providers are keyed by it. */\n readonly key: string;\n readonly title: string;\n readonly description?: string;\n readonly kind: WidgetKind;\n /** Lower comes first. Default 0; ties keep definition order. */\n readonly sortOrder?: number;\n /** Roles allowed to see it. Absent or empty means everyone. */\n readonly roles?: readonly string[];\n /** False hides it from every user. Default true. */\n readonly active?: boolean;\n readonly defaultSize?: WidgetSize;\n /**\n * Share of the row the widget takes, in twelfths: an integer from 2 to 12\n * (6 is half the row, 12 the whole row). When any widget in a grid sets\n * it, the grid becomes 12 columns wide and widgets without a `width` use\n * the one their `defaultSize` implies (see `widthForSize`). Narrow grids\n * give widgets more room automatically.\n */\n readonly width?: number;\n /**\n * Gives the widget a detail view: a full list with sorting, filtering and\n * paging. `true` uses defaults. The data comes from a detail provider.\n */\n readonly detail?: boolean | WidgetDetailOptions;\n /**\n * TABLE widgets only: a search box and sortable column headers in the card\n * itself, working on the rows the card holds. `true` turns on both. With a\n * `footer` (rows were left out) they only see the rows shown; use `detail`\n * for the full list.\n */\n readonly tableControls?: boolean | WidgetTableControls;\n /** Fill free space in the row (height, width or both). Default: none. */\n readonly fill?: WidgetFill;\n /**\n * Keeps viewers from rearranging this widget. `true` locks everything:\n * move, hide and minimize. Use an object to lock only some; fields left out\n * are not locked.\n */\n readonly locked?: boolean | WidgetLock;\n /**\n * The widget's home page in a paged dashboard: a page key or title. A\n * widget no page lists yet (and a widget locked against moving) shows here;\n * without it, on the first page. Ignored when the layout has no pages.\n */\n readonly page?: string;\n}\n\n/** What a viewer may not do to a locked widget. */\nexport interface WidgetLock {\n /** Can't be reordered, and holds its place (a pinned slot). */\n readonly move?: boolean;\n /** Can't be hidden. */\n readonly hide?: boolean;\n /** Can't be collapsed to its header. */\n readonly minimize?: boolean;\n}\n\n/** `WidgetLock` with every default filled in. */\nexport type ResolvedWidgetLock = Required<WidgetLock>;\n\nconst NOT_LOCKED: ResolvedWidgetLock = Object.freeze({\n move: false,\n hide: false,\n minimize: false,\n});\nconst FULLY_LOCKED: ResolvedWidgetLock = Object.freeze({\n move: true,\n hide: true,\n minimize: true,\n});\n\n/**\n * Reads a widget's `locked` setting with defaults: `true` locks move, hide\n * and minimize, an object locks the fields it sets to `true`, and anything\n * else (absent, `false`) locks nothing.\n */\nexport function resolveWidgetLock(\n definition: Pick<WidgetDefinition, 'locked'>\n): ResolvedWidgetLock {\n const setting: boolean | WidgetLock | undefined = definition.locked;\n if (setting === true) return FULLY_LOCKED;\n if (setting === undefined || setting === false) return NOT_LOCKED;\n return {\n move: setting.move === true,\n hide: setting.hide === true,\n minimize: setting.minimize === true,\n };\n}\n\n/**\n * Identity helper that keeps the literal `kind` (so typed providers can be\n * checked against it) and gives a definition its type without a cast.\n */\nexport function defineWidget<const D extends WidgetDefinition>(\n definition: D\n): D {\n return definition;\n}\n\n/** Definitions sorted by `sortOrder` (stable: ties keep their input order). */\nexport function sortDefinitions<D extends WidgetDefinition>(\n definitions: readonly D[]\n): D[] {\n return definitions\n .map((definition, index) => ({ definition, index }))\n .sort(\n (a, b) =>\n (a.definition.sortOrder ?? 0) - (b.definition.sortOrder ?? 0) ||\n a.index - b.index\n )\n .map(({ definition }) => definition);\n}\n\n/** Whether a widget is active and visible to someone with these roles. */\nexport function isWidgetVisibleTo(\n definition: WidgetDefinition,\n roles: readonly string[] | undefined\n): boolean {\n if (definition.active === false) {\n return false;\n }\n if (definition.roles === undefined || definition.roles.length === 0) {\n return true;\n }\n if (roles === undefined) {\n return false;\n }\n return definition.roles.some((role) => roles.includes(role));\n}\n","/**\n * 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 * A viewer's dashboard customization: order, hidden and minimized widgets.\n * Pure functions over a small JSON-serialisable object. Persist it however\n * you like (a settings table, localStorage); `parseLayout` tolerates\n * anything, so a corrupt saved value never breaks the dashboard.\n *\n * Generalised from Maker Toolkit's desktop `dashboard-layout.ts`.\n */\n\nimport { resolveWidgetLock, type WidgetLock } from './definition.js';\n\n/** What layout functions need from a widget definition. */\nexport interface LayoutItem {\n readonly key: string;\n readonly sortOrder?: number;\n /** See `WidgetDefinition.locked`. Pinned widgets hold their slot. */\n readonly locked?: boolean | WidgetLock;\n /** See `WidgetDefinition.page`: the widget's home page. */\n readonly page?: string;\n}\n\nexport interface DashboardLayout {\n /** Widget keys in display order. Keys not listed follow, by sortOrder. */\n readonly order: readonly string[];\n /** Widget keys removed from the dashboard (restorable). */\n readonly hidden: readonly string[];\n /** Widget keys collapsed to their header. */\n readonly minimized: readonly string[];\n /**\n * Pages of widgets. Absent, the lists above are the one and only page. With\n * pages, each page owns its own lists and the top-level lists are left\n * empty. See `pages.ts`.\n */\n readonly pages?: readonly LayoutPage[];\n}\n\n/** One page of a paged layout: the same lists as a layout, plus a name. */\nexport interface LayoutPage {\n /** Unique within the layout and stable when the page is renamed or moved. */\n readonly key: string;\n /** Shown in the page bar. At most `MAX_PAGE_TITLE_LENGTH` characters. */\n readonly title: string;\n readonly order: readonly string[];\n readonly hidden: readonly string[];\n readonly minimized: readonly string[];\n /** Rows this page holds, overriding the dashboard's default. */\n readonly maxRows?: number;\n}\n\n/** Longest page title; longer saved titles are cut. */\nexport const MAX_PAGE_TITLE_LENGTH = 30;\n/**\n * Most pages `parseLayout` keeps: a safety ceiling against malformed or\n * hostile JSON, not a product limit.\n */\nexport const MAX_PARSED_PAGES = 50;\n/** Most rows a page may be given with `maxRows`. */\nexport const MAX_PAGE_ROWS = 20;\n\nexport const EMPTY_LAYOUT: DashboardLayout = Object.freeze({\n order: Object.freeze([]) as readonly string[],\n hidden: Object.freeze([]) as readonly string[],\n minimized: Object.freeze([]) as readonly string[],\n});\n\nfunction uniqueStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n const seen = new Set<string>();\n for (const entry of value) {\n if (typeof entry === 'string' && entry !== '') seen.add(entry);\n }\n return [...seen];\n}\n\n/**\n * Reads a saved layout: a JSON string or an already-parsed object. Missing,\n * corrupt or wrongly typed values give the empty layout (or empty lists for\n * the fields that are wrong); non-string and duplicate keys are dropped.\n */\nexport function parseLayout(raw: unknown): DashboardLayout {\n let value: unknown = raw;\n if (typeof raw === 'string') {\n try {\n value = JSON.parse(raw);\n } catch {\n return EMPTY_LAYOUT;\n }\n }\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return EMPTY_LAYOUT;\n }\n const record = value as Readonly<Record<string, unknown>>;\n const order: string[] = uniqueStrings(record['order']);\n const hidden: string[] = uniqueStrings(record['hidden']);\n const minimized: string[] = uniqueStrings(record['minimized']);\n const pages: LayoutPage[] = parsePages(record['pages']);\n if (pages.length > 0) {\n // With pages, the pages own placement and the top-level lists stay empty.\n return {\n order: EMPTY_LAYOUT.order,\n hidden: EMPTY_LAYOUT.hidden,\n minimized: EMPTY_LAYOUT.minimized,\n pages,\n };\n }\n if (order.length === 0 && hidden.length === 0 && minimized.length === 0) {\n return EMPTY_LAYOUT;\n }\n return { order, hidden, minimized };\n}\n\nfunction parsePages(value: unknown): LayoutPage[] {\n if (!Array.isArray(value)) return [];\n const pages: LayoutPage[] = [];\n const keys = new Set<string>();\n for (const entry of value.slice(0, MAX_PARSED_PAGES)) {\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {\n continue;\n }\n const record = entry as Readonly<Record<string, unknown>>;\n const key: unknown = record['key'];\n if (typeof key !== 'string' || key === '' || keys.has(key)) continue;\n keys.add(key);\n const rawTitle: unknown = record['title'];\n const title: string =\n typeof rawTitle === 'string' && rawTitle.trim() !== ''\n ? rawTitle.trim().slice(0, MAX_PAGE_TITLE_LENGTH)\n : `Page ${pages.length + 1}`;\n const maxRows: unknown = record['maxRows'];\n // A widget lives on one page: the first page that holds it keeps it.\n const held = new Set<string>();\n for (const earlier of pages) {\n for (const k of [...earlier.order, ...earlier.hidden]) held.add(k);\n }\n const keep = (list: unknown): string[] =>\n uniqueStrings(list).filter((k) => !held.has(k));\n pages.push({\n key,\n title,\n order: keep(record['order']),\n hidden: keep(record['hidden']),\n minimized: keep(record['minimized']),\n ...(typeof maxRows === 'number' &&\n Number.isInteger(maxRows) &&\n maxRows >= 1 &&\n maxRows <= MAX_PAGE_ROWS\n ? { maxRows }\n : {}),\n });\n }\n return pages;\n}\n\n/** The JSON string to persist. */\nexport function serializeLayout(layout: DashboardLayout): string {\n return JSON.stringify({\n order: [...layout.order],\n hidden: [...layout.hidden],\n minimized: [...layout.minimized],\n ...(layout.pages === undefined || layout.pages.length === 0\n ? {}\n : {\n pages: layout.pages.map((page) => ({\n key: page.key,\n title: page.title,\n order: [...page.order],\n hidden: [...page.hidden],\n minimized: [...page.minimized],\n ...(page.maxRows === undefined ? {} : { maxRows: page.maxRows }),\n })),\n }),\n });\n}\n\nfunction bySortOrder<T extends LayoutItem>(items: readonly T[]): T[] {\n return items\n .map((item, index) => ({ item, index }))\n .sort(\n (a, b) =>\n (a.item.sortOrder ?? 0) - (b.item.sortOrder ?? 0) || a.index - b.index\n )\n .map(({ item }) => item);\n}\n\nfunction isPinned(item: LayoutItem): boolean {\n return resolveWidgetLock(item).move;\n}\n\n/**\n * The visible widgets in the viewer's order, ignoring locks: saved keys first\n * (when still present), then widgets the layout doesn't know yet, by\n * sortOrder.\n */\nfunction viewerOrder<T extends LayoutItem>(\n visible: readonly T[],\n layout: DashboardLayout\n): T[] {\n const byKey = new Map<string, T>(visible.map((d) => [d.key, d]));\n const ordered: T[] = [];\n for (const key of layout.order) {\n const definition: T | undefined = byKey.get(key);\n if (definition !== undefined) {\n ordered.push(definition);\n byKey.delete(key);\n }\n }\n for (const definition of bySortOrder(visible)) {\n if (byKey.has(definition.key)) ordered.push(definition);\n }\n return ordered;\n}\n\n/**\n * Lays `free` widgets out around the pinned ones. A pinned widget keeps its\n * slot: its index among the visible widgets in `sortOrder` order. Free\n * widgets fill the remaining slots, left to right.\n */\nfunction placeAroundPinned<T extends LayoutItem>(\n visible: readonly T[],\n free: readonly T[]\n): T[] {\n const slots: (T | undefined)[] = bySortOrder(visible).map((item) =>\n isPinned(item) ? item : undefined\n );\n let next = 0;\n return slots.map((pinned) => pinned ?? (free[next++] as T));\n}\n\n/**\n * The widgets to show, in order: saved keys first (when still present),\n * then widgets the layout doesn't know yet, by sortOrder. Hidden widgets\n * are left out. Widgets locked against moving are pinned: each keeps its\n * place from the definitions (never from `layout.order`) and the others\n * rearrange around it.\n */\nexport function visibleWidgets<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout\n): T[] {\n const hidden = new Set<string>(layout.hidden);\n const visible: T[] = definitions.filter((d) => !hidden.has(d.key));\n const ordered: T[] = viewerOrder(visible, layout);\n if (!visible.some(isPinned)) return ordered;\n return placeAroundPinned(\n visible,\n ordered.filter((item) => !isPinned(item))\n );\n}\n\n/** Hidden widgets, by sortOrder, for a \"restore\" menu. */\nexport function hiddenWidgets<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout\n): T[] {\n const hidden = new Set<string>(layout.hidden);\n return bySortOrder(definitions.filter((d) => hidden.has(d.key)));\n}\n\n/**\n * Moves `key` to `toIndex` within the current visible order. Returns the\n * same layout object when the key isn't visible, the index is out of range,\n * or the move isn't allowed: a pinned widget can't move, and nothing can be\n * moved onto a pinned slot. Free widgets keep their relative order around\n * pinned ones, so a move that crosses a pinned slot lands on the nearest\n * free slot you named.\n */\nexport function moveWidget<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string,\n toIndex: number\n): DashboardLayout {\n const current: T[] = visibleWidgets(definitions, layout);\n const fromIndex: number = current.findIndex((d) => d.key === key);\n const mover: T | undefined = current[fromIndex];\n if (\n mover === undefined ||\n !Number.isInteger(toIndex) ||\n toIndex < 0 ||\n toIndex >= current.length ||\n toIndex === fromIndex ||\n isPinned(mover) ||\n isPinned(current[toIndex] as T)\n ) {\n return layout;\n }\n const freeSlots: number[] = freeSlotIndexes(current);\n const free: T[] = current.filter((item) => !isPinned(item));\n const fromFree: number = freeSlots.indexOf(fromIndex);\n const toFree: number = freeSlots.indexOf(toIndex);\n free.splice(fromFree, 1);\n free.splice(toFree, 0, mover);\n const next: T[] = placeAroundPinned(current, free);\n return { ...layout, order: next.map((d) => d.key) };\n}\n\n/** Indexes of the slots in `ordered` that are not pinned. */\nfunction freeSlotIndexes(ordered: readonly LayoutItem[]): number[] {\n const slots: number[] = [];\n ordered.forEach((item, index) => {\n if (!isPinned(item)) slots.push(index);\n });\n return slots;\n}\n\n/**\n * Moves `key` by `offset` places (negative is earlier). Pinned slots are\n * stepped over, not counted, and the move is clamped at the first and last\n * free slot.\n */\nexport function moveWidgetBy<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string,\n offset: number\n): DashboardLayout {\n const current: T[] = visibleWidgets(definitions, layout);\n const fromIndex: number = current.findIndex((d) => d.key === key);\n if (fromIndex === -1) return layout;\n const freeSlots: number[] = freeSlotIndexes(current);\n const fromFree: number = freeSlots.indexOf(fromIndex);\n if (fromFree === -1) return layout;\n const toFree: number = Math.max(\n 0,\n Math.min(freeSlots.length - 1, fromFree + Math.trunc(offset))\n );\n return moveWidget(definitions, layout, key, freeSlots[toFree] as number);\n}\n\n/** Moves `key` one place earlier. */\nexport function moveWidgetUp<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n return moveWidgetBy(definitions, layout, key, -1);\n}\n\n/** Moves `key` one place later. */\nexport function moveWidgetDown<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n return moveWidgetBy(definitions, layout, key, 1);\n}\n\nexport function isHidden(layout: DashboardLayout, key: string): boolean {\n return layout.hidden.includes(key);\n}\n\nexport function isMinimized(layout: DashboardLayout, key: string): boolean {\n return layout.minimized.includes(key);\n}\n\n/** Hides `key`. No-op (same object) if already hidden. */\nexport function hideWidget(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n if (isHidden(layout, key)) return layout;\n return { ...layout, hidden: [...layout.hidden, key] };\n}\n\n/** Shows `key` again, expanded. No-op (same object) if not hidden. */\nexport function showWidget(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n if (!isHidden(layout, key)) return layout;\n return {\n ...layout,\n hidden: layout.hidden.filter((k) => k !== key),\n minimized: layout.minimized.filter((k) => k !== key),\n };\n}\n\n/** Hides or shows `key` (showing also clears its minimized state). */\nexport function toggleHidden(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n return isHidden(layout, key)\n ? showWidget(layout, key)\n : hideWidget(layout, key);\n}\n\n/** Collapses `key` to its header. No-op (same object) if already minimized. */\nexport function minimizeWidget(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n if (isMinimized(layout, key)) return layout;\n return { ...layout, minimized: [...layout.minimized, key] };\n}\n\n/** Expands `key`. No-op (same object) if not minimized. */\nexport function restoreWidget(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n if (!isMinimized(layout, key)) return layout;\n return { ...layout, minimized: layout.minimized.filter((k) => k !== key) };\n}\n\n/** Minimizes or restores `key`. */\nexport function toggleMinimized(\n layout: DashboardLayout,\n key: string\n): DashboardLayout {\n return isMinimized(layout, key)\n ? restoreWidget(layout, key)\n : minimizeWidget(layout, key);\n}\n\n/**\n * Drops keys for widgets that no longer exist. Only pass the full list of\n * definitions (not a role-filtered one), or a viewer's settings for widgets\n * they temporarily can't see are lost.\n */\nexport function pruneLayout<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout\n): DashboardLayout {\n const known = new Set<string>(definitions.map((d) => d.key));\n const keep = (keys: readonly string[]): readonly string[] =>\n keys.every((k) => known.has(k)) ? keys : keys.filter((k) => known.has(k));\n return mapLayoutLists(layout, (lists) => ({\n order: keep(lists.order),\n hidden: keep(lists.hidden),\n minimized: keep(lists.minimized),\n }));\n}\n\n/** The three lists a layout and each of its pages carry. */\ninterface LayoutLists {\n readonly order: readonly string[];\n readonly hidden: readonly string[];\n readonly minimized: readonly string[];\n}\n\n/**\n * Applies `change` to the top-level lists and to each page's lists. Returns\n * the same object when no list changed (compared by identity, so `change`\n * should return the same arrays it was given when it has nothing to do).\n */\nfunction mapLayoutLists(\n layout: DashboardLayout,\n change: (lists: LayoutLists) => LayoutLists\n): DashboardLayout {\n const top: LayoutLists = change(layout);\n const pages: LayoutPage[] | undefined = layout.pages?.map((page) => {\n const next: LayoutLists = change(page);\n return next.order === page.order &&\n next.hidden === page.hidden &&\n next.minimized === page.minimized\n ? page\n : { ...page, ...next };\n });\n const pagesChanged: boolean =\n pages !== undefined && pages.some((page, i) => page !== layout.pages?.[i]);\n if (\n top.order === layout.order &&\n top.hidden === layout.hidden &&\n top.minimized === layout.minimized &&\n !pagesChanged\n ) {\n return layout;\n }\n return {\n ...layout,\n ...top,\n ...(pages === undefined ? {} : { pages }),\n };\n}\n\n/** Options for `enforceLocks`. */\nexport interface EnforceLocksOptions {\n /**\n * Skip enforcement. Set it server-side only for a user who may rearrange\n * locked widgets (an administrator editing the default layout), never from\n * a flag the client sends.\n */\n readonly overrideLocks?: boolean;\n}\n\n/**\n * Removes whatever a widget's lock forbids from a layout: a hide-locked key\n * leaves `hidden`, a minimize-locked key leaves `minimized`, and a\n * move-locked key leaves `order` (a pinned widget's place comes from the\n * definitions). Idempotent; returns the same object when nothing changes.\n * Run it on a layout a client sends before saving it.\n */\nexport function enforceLocks<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n options: EnforceLocksOptions = {}\n): DashboardLayout {\n if (options.overrideLocks === true) return layout;\n const noMove = new Set<string>();\n const noHide = new Set<string>();\n const noMinimize = new Set<string>();\n for (const definition of definitions) {\n const lock = resolveWidgetLock(definition);\n if (lock.move) noMove.add(definition.key);\n if (lock.hide) noHide.add(definition.key);\n if (lock.minimize) noMinimize.add(definition.key);\n }\n const without = (keys: readonly string[], drop: ReadonlySet<string>) =>\n keys.some((key) => drop.has(key))\n ? keys.filter((key) => !drop.has(key))\n : keys;\n return mapLayoutLists(layout, (lists) => ({\n order: without(lists.order, noMove),\n hidden: without(lists.hidden, noHide),\n minimized: without(lists.minimized, noMinimize),\n }));\n}\n","/**\n * 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 { MAX_WIDGET_WIDTH, MIN_WIDGET_WIDTH, isWidgetWidth } from './grid.js';\nimport { err, ok, type Result } from './result.js';\nimport { isSafeHref, isSafeImageUrl } from './url.js';\n\n/** At most this many problems are listed in one error message. */\nexport const MAX_REPORTED_PROBLEMS = 10;\n\nexport interface ValidateWidgetDataOptions {\n /** Named in error messages, e.g. the widget key. */\n readonly widgetKey?: string;\n /** Fails unless the payload is this kind (an empty state always passes). */\n readonly expectedKind?: WidgetKind;\n}\n\ntype Problems = string[];\ntype Record_ = Readonly<Record<string, unknown>>;\n\nfunction describeType(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (typeof value === 'number' && !Number.isFinite(value)) {\n return String(value);\n }\n return typeof value;\n}\n\nfunction isRecord(value: unknown): value is Record_ {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction join(path: string, field: string): string {\n return path === '' ? field : `${path}.${field}`;\n}\n\nfunction requireString(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'string') {\n problems.push(\n `${join(path, field)} must be a string, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalString(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n if (record[field] !== undefined) {\n requireString(record, field, path, problems);\n }\n}\n\nfunction requireNumber(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n problems.push(\n `${join(path, field)} must be a finite number, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalNumber(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n if (record[field] !== undefined) {\n requireNumber(record, field, path, problems);\n }\n}\n\n/** A cell's optional sort `value`: a string or a finite number. */\nfunction optionalSortValue(\n record: Record_,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record['value'];\n if (\n value !== undefined &&\n typeof value !== 'string' &&\n !(typeof value === 'number' && Number.isFinite(value))\n ) {\n problems.push(\n `${path}.value must be a string or a finite number, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalBoolean(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (value !== undefined && typeof value !== 'boolean') {\n problems.push(\n `${join(path, field)} must be a boolean, got ${describeType(value)}.`\n );\n }\n}\n\nfunction optionalUrl(\n record: Record_,\n field: string,\n path: string,\n problems: Problems,\n isSafe: (url: string) => boolean,\n allowed: string\n): void {\n const value: unknown = record[field];\n if (value === undefined) return;\n if (typeof value !== 'string') {\n problems.push(\n `${join(path, field)} must be a string, got ${describeType(value)}.`\n );\n } else if (!isSafe(value)) {\n problems.push(\n `${join(path, field)} must be ${allowed}, got ${JSON.stringify(value.slice(0, 80))}.`\n );\n }\n}\n\nfunction requireArray(\n record: Record_,\n field: string,\n path: string,\n problems: Problems\n): readonly unknown[] | null {\n const value: unknown = record[field];\n if (!Array.isArray(value)) {\n problems.push(\n `${join(path, field)} must be an array, got ${describeType(value)}.`\n );\n return null;\n }\n return value;\n}\n\nfunction requireOneOf(\n record: Record_,\n field: string,\n options: readonly string[],\n path: string,\n problems: Problems\n): void {\n const value: unknown = record[field];\n if (typeof value !== 'string' || !options.includes(value)) {\n problems.push(\n `${join(path, field)} must be one of ${options.map((o) => `\"${o}\"`).join(', ')}, got ${\n typeof value === 'string' ? JSON.stringify(value) : describeType(value)\n }.`\n );\n }\n}\n\n/** Runs `check` on each element that is an object, reporting the others. */\nfunction eachRecord(\n items: readonly unknown[],\n path: string,\n problems: Problems,\n check: (item: Record_, itemPath: string) => void\n): void {\n items.forEach((item: unknown, index: number) => {\n const itemPath = `${path}[${index}]`;\n if (isRecord(item)) {\n check(item, itemPath);\n } else {\n problems.push(\n `${itemPath} must be an object, got ${describeType(item)}.`\n );\n }\n });\n}\n\nconst HREF_RULE = 'an http(s), mailto or relative URL';\nconst IMAGE_RULE = 'an http(s) or relative URL';\n\nfunction checkPayloadFields(\n kind: WidgetKind,\n data: Record_,\n problems: Problems\n): void {\n switch (kind) {\n case 'TEXT':\n requireString(data, 'value', '', problems);\n requireString(data, 'label', '', problems);\n return;\n case 'KPI':\n requireNumber(data, 'value', '', problems);\n if (data['previous'] !== null) {\n optionalNumber(data, 'previous', '', problems);\n }\n requireOneOf(data, 'format', VALUE_FORMATS, '', problems);\n optionalString(data, 'currency', '', problems);\n requireString(data, 'label', '', problems);\n optionalString(data, 'hint', '', problems);\n optionalBoolean(data, 'higherIsBetter', '', problems);\n return;\n case 'GAUGE':\n requireNumber(data, 'value', '', problems);\n requireNumber(data, 'max', '', problems);\n requireString(data, 'label', '', problems);\n if (typeof data['max'] === 'number' && data['max'] <= 0) {\n problems.push(`max must be greater than 0, got ${data['max']}.`);\n }\n return;\n case 'TABLE': {\n const columns = requireArray(data, 'columns', '', problems);\n if (columns !== null) {\n eachRecord(columns, 'columns', problems, (column, path) => {\n requireString(column, 'label', path, problems);\n optionalBoolean(column, 'numeric', path, problems);\n });\n }\n const rows = requireArray(data, 'rows', '', problems);\n if (rows !== null) {\n rows.forEach((row: unknown, rowIndex: number) => {\n const rowPath = `rows[${rowIndex}]`;\n if (!Array.isArray(row)) {\n problems.push(\n `${rowPath} must be an array of cells, got ${describeType(row)}.`\n );\n return;\n }\n if (columns !== null && row.length !== columns.length) {\n problems.push(\n `${rowPath} has ${row.length} cell(s) but there are ${columns.length} column(s).`\n );\n }\n eachRecord(row, rowPath, problems, (cell, cellPath) => {\n requireString(cell, 'text', cellPath, problems);\n optionalSortValue(cell, cellPath, problems);\n optionalUrl(\n cell,\n 'href',\n cellPath,\n problems,\n isSafeHref,\n HREF_RULE\n );\n });\n });\n }\n optionalString(data, 'footer', '', problems);\n return;\n }\n case 'BAR_LIST': {\n const items = requireArray(data, 'items', '', problems);\n if (items !== null) {\n eachRecord(items, 'items', problems, (item, path) => {\n requireString(item, 'label', path, problems);\n requireNumber(item, 'value', path, problems);\n optionalString(item, 'display', path, problems);\n });\n }\n optionalNumber(data, 'total', '', problems);\n return;\n }\n case 'ALERT_LIST': {\n const items = requireArray(data, 'items', '', problems);\n if (items !== null) {\n eachRecord(items, 'items', problems, (item, path) => {\n requireString(item, 'title', path, problems);\n optionalUrl(item, 'href', path, problems, isSafeHref, HREF_RULE);\n optionalUrl(\n item,\n 'thumbnailUrl',\n path,\n problems,\n isSafeImageUrl,\n IMAGE_RULE\n );\n requireString(item, 'valueLabel', path, problems);\n optionalString(item, 'detail', path, problems);\n });\n }\n requireNumber(data, 'total', '', problems);\n requireString(data, 'emptyText', '', problems);\n if (\n items !== null &&\n typeof data['total'] === 'number' &&\n data['total'] < items.length\n ) {\n problems.push(\n `total (${data['total']}) must be at least the number of items (${items.length}).`\n );\n }\n return;\n }\n case 'GRAPH': {\n const series = requireArray(data, 'series', '', problems);\n if (series !== null) {\n if (series.length > MAX_GRAPH_SERIES) {\n problems.push(\n `series has ${series.length} entries; at most ${MAX_GRAPH_SERIES} are allowed (fold the rest into \"Other\").`\n );\n }\n eachRecord(series, 'series', problems, (entry, path) => {\n requireString(entry, 'name', path, problems);\n const points = requireArray(entry, 'points', path, problems);\n if (points !== null) {\n eachRecord(\n points,\n `${path}.points`,\n problems,\n (point, pointPath) => {\n requireString(point, 'label', pointPath, problems);\n requireNumber(point, 'value', pointPath, problems);\n }\n );\n }\n });\n }\n requireOneOf(data, 'chartType', ['bar', 'line'], '', problems);\n requireOneOf(data, 'valueFormat', VALUE_FORMATS, '', problems);\n optionalString(data, 'currency', '', problems);\n optionalString(data, 'xLabel', '', problems);\n return;\n }\n }\n}\n\n/** Checks a definition's `detail` setting: a boolean or an options object. */\nfunction checkDetailOption(detail: unknown, problems: Problems): void {\n if (detail === undefined || typeof detail === 'boolean') return;\n if (!isRecord(detail)) {\n problems.push(\n `detail must be true, false or an options object, got ${describeType(detail)}.`\n );\n return;\n }\n optionalString(detail, 'title', 'detail', problems);\n const pageSize: unknown = detail['pageSize'];\n if (\n pageSize !== undefined &&\n !(\n typeof pageSize === 'number' &&\n Number.isInteger(pageSize) &&\n pageSize >= 1 &&\n pageSize <= MAX_DETAIL_PAGE_SIZE\n )\n ) {\n problems.push(\n `detail.pageSize must be a whole number from 1 to ${MAX_DETAIL_PAGE_SIZE}, got ${typeof pageSize === 'number' ? String(pageSize) : describeType(pageSize)}.`\n );\n }\n if (detail['mode'] !== undefined) {\n requireOneOf(detail, 'mode', DETAIL_MODES, 'detail', problems);\n }\n}\n\n/** Checks a definition's `tableControls`: a boolean or `{ search, sort }`. */\nfunction checkTableControlsOption(\n controls: unknown,\n kind: unknown,\n problems: Problems\n): void {\n if (controls === undefined || controls === false) return;\n if (typeof controls !== 'boolean' && !isRecord(controls)) {\n problems.push(\n `tableControls must be true, false or an options object, got ${describeType(controls)}.`\n );\n return;\n }\n if (isRecord(controls)) {\n optionalBoolean(controls, 'search', 'tableControls', problems);\n optionalBoolean(controls, 'sort', 'tableControls', problems);\n }\n if (typeof kind === 'string' && kind !== 'TABLE') {\n problems.push(\n `tableControls only applies to TABLE widgets, but kind is \"${kind}\".`\n );\n }\n}\n\n/** Checks a definition's `locked`: a boolean or `{ move, hide, minimize }`. */\nfunction checkLockedOption(locked: unknown, problems: Problems): void {\n if (locked === undefined || typeof locked === 'boolean') return;\n if (!isRecord(locked)) {\n problems.push(\n `locked must be true, false or an object, got ${describeType(locked)}.`\n );\n return;\n }\n optionalBoolean(locked, 'move', 'locked', problems);\n optionalBoolean(locked, 'hide', 'locked', problems);\n optionalBoolean(locked, 'minimize', 'locked', problems);\n}\n\nfunction formatProblems(prefix: string, problems: Problems): string {\n const shown: Problems = problems.slice(0, MAX_REPORTED_PROBLEMS);\n const more: number = problems.length - shown.length;\n return `${prefix}: ${shown.join(' ')}${more > 0 ? ` (and ${more} more problem(s))` : ''}`;\n}\n\n/**\n * Checks that `value` is a valid widget payload (any kind, or an empty\n * state). Returns it typed, or an error naming every problem found (up to\n * `MAX_REPORTED_PROBLEMS`). Unknown extra fields are allowed and ignored.\n */\nexport function validateWidgetData(\n value: unknown,\n options: ValidateWidgetDataOptions = {}\n): Result<WidgetPayload> {\n const subject: string =\n options.widgetKey === undefined\n ? 'Widget data'\n : `Widget ${JSON.stringify(options.widgetKey)}`;\n if (!isRecord(value)) {\n return err(`${subject}: must be an object, got ${describeType(value)}.`);\n }\n if (value['empty'] === true) {\n if (typeof value['text'] !== 'string') {\n return err(\n `${subject} (empty): text must be a string, got ${describeType(value['text'])}.`\n );\n }\n return ok(value as unknown as WidgetPayload);\n }\n const kind: unknown = value['kind'];\n if (!isWidgetKind(kind)) {\n return err(\n `${subject}: kind must be one of ${WIDGET_KINDS.join(', ')} (or the payload must be {\"empty\": true, \"text\": ...}), got ${\n typeof kind === 'string' ? JSON.stringify(kind) : describeType(kind)\n }.`\n );\n }\n if (options.expectedKind !== undefined && kind !== options.expectedKind) {\n return err(\n `${subject}: expected kind ${options.expectedKind} from its definition, got ${kind}.`\n );\n }\n const problems: Problems = [];\n checkPayloadFields(kind, value, problems);\n if (problems.length > 0) {\n return err(formatProblems(`${subject} (${kind})`, problems));\n }\n return ok(value as unknown as WidgetPayload);\n}\n\n/**\n * Checks that `value` is a valid widget definition. Returns it typed, or an\n * error naming every problem found.\n */\nexport function validateWidgetDefinition(\n value: unknown\n): Result<WidgetDefinition> {\n if (!isRecord(value)) {\n return err(\n `Widget definition: must be an object, got ${describeType(value)}.`\n );\n }\n const subject: string =\n typeof value['key'] === 'string'\n ? `Widget definition ${JSON.stringify(value['key'])}`\n : 'Widget definition';\n const problems: Problems = [];\n requireString(value, 'key', '', problems);\n if (value['key'] === '') {\n problems.push('key must not be empty.');\n }\n requireString(value, 'title', '', problems);\n optionalString(value, 'description', '', problems);\n requireOneOf(value, 'kind', WIDGET_KINDS, '', problems);\n optionalNumber(value, 'sortOrder', '', problems);\n if (value['roles'] !== undefined) {\n const roles = requireArray(value, 'roles', '', problems);\n roles?.forEach((role: unknown, index: number) => {\n if (typeof role !== 'string') {\n problems.push(\n `roles[${index}] must be a string, got ${describeType(role)}.`\n );\n }\n });\n }\n optionalBoolean(value, 'active', '', problems);\n if (value['defaultSize'] !== undefined) {\n requireOneOf(value, 'defaultSize', WIDGET_SIZES, '', problems);\n }\n if (value['width'] !== undefined && !isWidgetWidth(value['width'])) {\n problems.push(\n `width must be an integer from ${MIN_WIDGET_WIDTH} to ${MAX_WIDGET_WIDTH} (twelfths of the row), got ${typeof value['width'] === 'number' ? String(value['width']) : describeType(value['width'])}.`\n );\n }\n checkDetailOption(value['detail'], problems);\n checkTableControlsOption(value['tableControls'], value['kind'], problems);\n checkLockedOption(value['locked'], problems);\n 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 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\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}\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}\n\nexport interface ErrorWidget {\n readonly definition: WidgetDefinition;\n readonly status: 'error';\n /** Names the widget and what failed. */\n readonly error: string;\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}\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 {\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/** The cache key for a widget under these options. */\nexport function cacheKeyFor(\n definition: WidgetDefinition,\n options: ResolveOptions\n): string {\n return options.cacheKey === undefined\n ? definition.key\n : options.cacheKey(definition);\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 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, { signal: controller.signal });\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), {\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 cacheKeyFor,\n loadingWidgets,\n resolvePayload,\n resolveWidget,\n widgetsFor,\n type DashboardWidget,\n type ResolveOptions,\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 /** 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, ...resolveOptions } = options;\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 if (readCache && resolveOptions.cache !== undefined) {\n try {\n const entry = await resolveOptions.cache.get(\n cacheKeyFor(definition, resolveOptions)\n );\n if (entry !== undefined && isCurrent()) {\n const cached = resolvePayload(\n definition,\n entry.payload,\n resolveOptions\n );\n if (cached.status === 'ok') {\n replace(key, { ...cached, updatedAt: entry.storedAt, stale: true });\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 resolveWidget(definition, provider, context, {\n ...resolveOptions,\n signal: controller.signal,\n });\n if (!isCurrent()) return;\n inFlight.delete(key);\n replace(key, result);\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 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 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';\n\n/** The key of the implicit page of a layout that has no `pages`. */\nexport const DEFAULT_PAGE_KEY = 'default';\n/** Rows a page holds unless it (or the dashboard) says otherwise. */\nexport const DEFAULT_PAGE_ROWS = 4;\n\n/** What the page functions need from a widget definition. */\nexport type PageItem = LayoutItem &\n GridItem & {\n /** Used in messages; the key stands in when absent. */\n readonly title?: string;\n };\n\nexport interface PageOptions {\n /** Rows a page holds when it has no `maxRows` of its own. Default 4. */\n readonly maxRows?: number;\n}\n\nfunction rowsAllowed(page: LayoutPage, options: PageOptions): number {\n const rows: number = page.maxRows ?? options.maxRows ?? DEFAULT_PAGE_ROWS;\n return Math.max(1, Math.min(MAX_PAGE_ROWS, Math.floor(rows)));\n}\n\n/** Whether the layout has pages of its own (rather than one implicit page). */\nexport function hasPages(layout: DashboardLayout): boolean {\n return layout.pages !== undefined && layout.pages.length > 0;\n}\n\n/**\n * The layout's pages. A layout without `pages` has one implicit page called\n * \"Page 1\" made from its top-level lists.\n */\nexport function pageList(layout: DashboardLayout): readonly LayoutPage[] {\n if (layout.pages !== undefined && layout.pages.length > 0) {\n return layout.pages;\n }\n return [\n {\n key: DEFAULT_PAGE_KEY,\n title: 'Page 1',\n order: layout.order,\n hidden: layout.hidden,\n minimized: layout.minimized,\n },\n ];\n}\n\n/** Turns an implicit single page into an explicit one, so it can be edited. */\nfunction withExplicitPages(layout: DashboardLayout): DashboardLayout {\n if (hasPages(layout)) return layout;\n return {\n ...layout,\n order: [],\n hidden: [],\n minimized: [],\n pages: pageList(layout),\n };\n}\n\nfunction sameKeys(a: readonly string[], b: readonly string[]): boolean {\n return a === b || (a.length === b.length && a.every((k, i) => k === b[i]));\n}\n\n/**\n * One page as an ordinary layout, so every function in `layout.ts` (move,\n * hide, minimize, `visibleWidgets`) works on it unchanged. For a layout with\n * no pages this is the layout itself. Undefined for an unknown page.\n */\nexport function pageLayout(\n layout: DashboardLayout,\n pageKey: string\n): DashboardLayout | undefined {\n if (!hasPages(layout))\n return pageKey === DEFAULT_PAGE_KEY ? layout : undefined;\n const page: LayoutPage | undefined = layout.pages?.find(\n (p) => p.key === pageKey\n );\n if (page === undefined) return undefined;\n const { pages, ...rest } = layout;\n void pages;\n return {\n ...rest,\n order: page.order,\n hidden: page.hidden,\n minimized: page.minimized,\n };\n}\n\n/**\n * Writes a page's layout (changed with the functions in `layout.ts`) back\n * into the whole layout. Returns the same object when nothing changed or the\n * page doesn't exist.\n */\nexport function withPageLayout(\n layout: DashboardLayout,\n pageKey: string,\n next: DashboardLayout\n): DashboardLayout {\n const current: DashboardLayout | undefined = pageLayout(layout, pageKey);\n if (\n current === undefined ||\n (sameKeys(current.order, next.order) &&\n sameKeys(current.hidden, next.hidden) &&\n sameKeys(current.minimized, next.minimized))\n ) {\n return layout;\n }\n if (!hasPages(layout)) {\n return {\n ...layout,\n order: next.order,\n hidden: next.hidden,\n minimized: next.minimized,\n };\n }\n return {\n ...layout,\n pages: (layout.pages ?? []).map((page) =>\n page.key === pageKey\n ? {\n ...page,\n order: next.order,\n hidden: next.hidden,\n minimized: next.minimized,\n }\n : page\n ),\n };\n}\n\nfunction normalizedTitle(title: string): string {\n return title.trim().normalize('NFKC').toLowerCase();\n}\n\n/** The key of the page a `page` reference names: a key, else a title. */\nexport function resolvePageKey(\n layout: DashboardLayout,\n reference: string | undefined\n): string | undefined {\n if (reference === undefined || reference === '') return undefined;\n const pages: readonly LayoutPage[] = pageList(layout);\n const byKey: LayoutPage | undefined = pages.find((p) => p.key === reference);\n if (byKey !== undefined) return byKey.key;\n const wanted: string = normalizedTitle(reference);\n return pages.find((p) => normalizedTitle(p.title) === wanted)?.key;\n}\n\nfunction homePageKey(layout: DashboardLayout, item: LayoutItem): string {\n return (\n resolvePageKey(layout, item.page) ?? (pageList(layout)[0] as LayoutPage).key\n );\n}\n\n/**\n * Which page each widget shows on: the page that lists it (in its order or\n * hidden list), else its home page (`definition.page`, else the first page).\n * A widget locked against moving always shows on its home page, so a viewer's\n * saved layout can't move it. Definitions keep their input order.\n */\nexport function assignPages<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout\n): Map<string, T[]> {\n const pages: readonly LayoutPage[] = pageList(layout);\n const assigned = new Map<string, T[]>(pages.map((p) => [p.key, []]));\n for (const definition of definitions) {\n let pageKey: string | undefined;\n if (!resolveWidgetLock(definition).move) {\n pageKey = pages.find(\n (p) =>\n p.order.includes(definition.key) || p.hidden.includes(definition.key)\n )?.key;\n }\n assigned.get(pageKey ?? homePageKey(layout, definition))?.push(definition);\n }\n return assigned;\n}\n\n/** The key of the page a widget shows on; undefined if it isn't a definition. */\nexport function pageOf<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n key: string\n): string | undefined {\n for (const [pageKey, widgets] of assignPages(definitions, layout)) {\n if (widgets.some((w) => w.key === key)) return pageKey;\n }\n return undefined;\n}\n\n/** A page's visible widgets, in display order (minimized ones included). */\nexport function pageWidgets<T extends LayoutItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n pageKey: string\n): T[] {\n const onPage: T[] = assignPages(definitions, layout).get(pageKey) ?? [];\n const view: DashboardLayout | undefined = pageLayout(layout, pageKey);\n return view === undefined ? [] : visibleWidgets(onPage, view);\n}\n\n/** How full a page is. */\nexport interface PageRoom {\n readonly maxRows: number;\n readonly rowsUsed: number;\n readonly rowsFree: number;\n}\n\n/** Rows a page allows, uses and has left, as the grid will draw them. */\nexport function pageRoom<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n pageKey: string,\n options: PageOptions = {}\n): PageRoom | undefined {\n const page: LayoutPage | undefined = pageList(layout).find(\n (p) => p.key === pageKey\n );\n if (page === undefined) return undefined;\n const maxRows: number = rowsAllowed(page, options);\n const rowsUsed: number = placeRows(\n pageWidgets(definitions, layout, pageKey)\n ).length;\n return { maxRows, rowsUsed, rowsFree: Math.max(0, maxRows - rowsUsed) };\n}\n\nfunction describePage(page: LayoutPage): string {\n return `Page \"${page.title}\"`;\n}\n\nfunction titleOf(item: PageItem): string {\n return item.title ?? item.key;\n}\n\n/** Checks a page title: not empty, short enough, not used by another page. */\nfunction checkTitle(\n layout: DashboardLayout,\n title: string,\n exceptKey?: string\n): Result<string> {\n const trimmed: string = title.trim();\n if (trimmed === '') return err('A page title must not be empty.');\n if (trimmed.length > MAX_PAGE_TITLE_LENGTH) {\n return err(\n `Page title \"${trimmed}\" is ${trimmed.length} characters; the most is ${MAX_PAGE_TITLE_LENGTH}.`\n );\n }\n const wanted: string = normalizedTitle(trimmed);\n const clash: LayoutPage | undefined = pageList(layout).find(\n (p) => p.key !== exceptKey && normalizedTitle(p.title) === wanted\n );\n if (clash !== undefined) {\n return err(`Another page is already called \"${clash.title}\".`);\n }\n return ok(trimmed);\n}\n\n/** The first `page-N` key no page uses. */\nexport function nextPageKey(layout: DashboardLayout): string {\n const keys = new Set<string>(pageList(layout).map((p) => p.key));\n let n = 1;\n while (keys.has(`page-${n}`)) n += 1;\n return `page-${n}`;\n}\n\n/** The first \"Page N\" title no page uses. */\nfunction nextPageTitle(layout: DashboardLayout): string {\n const used = new Set<string>(\n pageList(layout).map((p) => normalizedTitle(p.title))\n );\n let n: number = pageList(layout).length + 1;\n while (used.has(normalizedTitle(`Page ${n}`))) n += 1;\n return `Page ${n}`;\n}\n\nexport interface AddPageOptions {\n /** The new page's title. Default: the next free \"Page N\". */\n readonly title?: string;\n /** The new page's key. Default: the next free `page-N`. */\n readonly key?: string;\n}\n\n/**\n * Adds an empty page after the last one. A layout without pages gains an\n * explicit first page holding everything it had.\n */\nexport function addPage(\n layout: DashboardLayout,\n options: AddPageOptions = {}\n): Result<DashboardLayout> {\n if (pageList(layout).length >= MAX_PARSED_PAGES) {\n return err(\n `The layout already has ${MAX_PARSED_PAGES} pages, the most it can keep.`\n );\n }\n const key: string = options.key ?? nextPageKey(layout);\n if (pageList(layout).some((p) => p.key === key)) {\n return err(`A page with the key \"${key}\" already exists.`);\n }\n const title: Result<string> = checkTitle(\n layout,\n options.title ?? nextPageTitle(layout)\n );\n if (!title.ok) return title;\n const base: DashboardLayout = withExplicitPages(layout);\n const page: LayoutPage = {\n key,\n title: title.value,\n order: [],\n hidden: [],\n minimized: [],\n };\n return ok({ ...base, pages: [...(base.pages ?? []), page] });\n}\n\n/** Renames a page. The same layout comes back when the title is unchanged. */\nexport function renamePage(\n layout: DashboardLayout,\n pageKey: string,\n title: string\n): Result<DashboardLayout> {\n const page: LayoutPage | undefined = pageList(layout).find(\n (p) => p.key === pageKey\n );\n if (page === undefined) return err(`Page \"${pageKey}\" doesn't exist.`);\n const checked: Result<string> = checkTitle(layout, title, pageKey);\n if (!checked.ok) return checked;\n if (checked.value === page.title) return ok(layout);\n const base: DashboardLayout = withExplicitPages(layout);\n return ok({\n ...base,\n pages: (base.pages ?? []).map((p) =>\n p.key === pageKey ? { ...p, title: checked.value } : p\n ),\n });\n}\n\n/**\n * Moves a page `offset` places (negative is earlier), clamped at the ends.\n * Returns the same layout when nothing moves.\n */\nexport function movePage(\n layout: DashboardLayout,\n pageKey: string,\n offset: number\n): DashboardLayout {\n const pages: readonly LayoutPage[] = layout.pages ?? [];\n const from: number = pages.findIndex((p) => p.key === pageKey);\n if (from === -1) return layout;\n const to: number = Math.max(\n 0,\n Math.min(pages.length - 1, from + Math.trunc(offset))\n );\n if (to === from) return layout;\n const next: LayoutPage[] = [...pages];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved as LayoutPage);\n return { ...layout, pages: next };\n}\n\nfunction overflowing<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n options: PageOptions\n): LayoutPage | undefined {\n return pageList(layout).find(\n (page) =>\n placeRows(pageWidgets(definitions, layout, page.key)).length >\n rowsAllowed(page, options)\n );\n}\n\n/**\n * Removes a page. Its widgets move to the end of the previous page (the next\n * one when it was first), keeping their hidden and minimized state. Refused\n * for the only page, and when the widgets wouldn't fit on the pages left.\n */\nexport function removePage<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n pageKey: string,\n options: PageOptions = {}\n): Result<DashboardLayout> {\n const pages: readonly LayoutPage[] = pageList(layout);\n const index: number = pages.findIndex((p) => p.key === pageKey);\n const page: LayoutPage | undefined = pages[index];\n if (page === undefined) return err(`Page \"${pageKey}\" doesn't exist.`);\n if (pages.length === 1) {\n return err(\n `${describePage(page)} is the only page, so it can't be removed.`\n );\n }\n const target: LayoutPage = pages[index > 0 ? index - 1 : 1] as LayoutPage;\n const merged: DashboardLayout = {\n ...layout,\n pages: pages\n .filter((p) => p.key !== pageKey)\n .map((p) =>\n p.key === target.key\n ? {\n ...p,\n order:\n index > 0\n ? [...p.order, ...page.order]\n : [...page.order, ...p.order],\n hidden: [...p.hidden, ...page.hidden],\n minimized: [...p.minimized, ...page.minimized],\n }\n : p\n ),\n };\n const full: LayoutPage | undefined = overflowing(\n definitions,\n merged,\n options\n );\n if (full !== undefined) {\n return err(\n `${describePage(page)} has widgets that don't fit on the other pages (${describePage(full)} would need more than ${rowsAllowed(full, options)} rows). Move or hide some first.`\n );\n }\n return ok(merged);\n}\n\nfunction without(keys: readonly string[], key: string): readonly string[] {\n return keys.includes(key) ? keys.filter((k) => k !== key) : keys;\n}\n\n/**\n * Moves a widget to the end of another page, keeping its hidden and\n * minimized state. Refused for an unknown widget or page, for a widget locked\n * against moving, and when a visible widget wouldn't fit in the page's rows.\n */\nexport function moveWidgetToPage<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n widgetKey: string,\n targetKey: string,\n options: PageOptions = {}\n): Result<DashboardLayout> {\n const widget: T | undefined = definitions.find((d) => d.key === widgetKey);\n if (widget === undefined) {\n return err(\n `Widget \"${widgetKey}\" isn't one of the widgets, so it can't be moved to a page.`\n );\n }\n const pages: readonly LayoutPage[] = pageList(layout);\n const target: LayoutPage | undefined = pages.find((p) => p.key === targetKey);\n if (target === undefined) return err(`Page \"${targetKey}\" doesn't exist.`);\n const sourceKey: string = pageOf(definitions, layout, widgetKey) as string;\n if (sourceKey === targetKey) return ok(layout);\n if (resolveWidgetLock(widget).move) {\n return err(\n `Widget \"${titleOf(widget)}\" is locked against moving, so it can't be moved to ${describePage(target)}.`\n );\n }\n const base: DashboardLayout = withExplicitPages(layout);\n const source: LayoutPage = (base.pages ?? []).find(\n (p) => p.key === sourceKey\n ) as LayoutPage;\n const hidden: boolean = source.hidden.includes(widgetKey);\n const minimized: boolean = source.minimized.includes(widgetKey);\n // The widget joins the end of the target's display order.\n const targetOrder: readonly string[] = pageWidgets(\n definitions,\n base,\n targetKey\n ).map((d) => d.key);\n const moved: DashboardLayout = {\n ...base,\n pages: (base.pages ?? []).map((p) => {\n if (p.key === sourceKey) {\n return {\n ...p,\n order: without(p.order, widgetKey),\n hidden: without(p.hidden, widgetKey),\n minimized: without(p.minimized, widgetKey),\n };\n }\n if (p.key === targetKey) {\n return {\n ...p,\n order: hidden ? p.order : [...targetOrder, widgetKey],\n hidden: hidden ? [...p.hidden, widgetKey] : p.hidden,\n minimized: minimized ? [...p.minimized, widgetKey] : p.minimized,\n };\n }\n return p;\n }),\n };\n if (!hidden) {\n const allowed: number = rowsAllowed(target, options);\n const needed: number = placeRows(\n pageWidgets(definitions, moved, targetKey)\n ).length;\n if (needed > allowed) {\n return err(\n `${describePage(target)} has no room for \"${titleOf(widget)}\": it would need row ${needed}, and the page allows ${allowed}.`\n );\n }\n }\n return ok(moved);\n}\n\nexport interface NormalizeOptions extends PageOptions {\n /** Skip lock enforcement, for a user who may rearrange locked widgets. */\n readonly overrideLocks?: boolean;\n}\n\nfunction withoutLockField<T extends LayoutItem>(definition: T): T {\n if (definition.locked === undefined) return definition;\n const copy: { -readonly [K in keyof T]: T[K] } = { ...definition };\n delete copy.locked;\n return copy;\n}\n\nfunction uniqueTitle(taken: Set<string>, title: string, index: number): string {\n let base: string = title.trim().slice(0, MAX_PAGE_TITLE_LENGTH);\n if (base === '') base = `Page ${index + 1}`;\n let candidate: string = base;\n let n = 1;\n while (taken.has(normalizedTitle(candidate))) {\n const suffix = ` (#${n})`;\n candidate = `${base.slice(0, MAX_PAGE_TITLE_LENGTH - suffix.length)}${suffix}`;\n n += 1;\n }\n taken.add(normalizedTitle(candidate));\n return candidate;\n}\n\nfunction samePages(\n a: readonly LayoutPage[],\n b: readonly LayoutPage[]\n): boolean {\n return (\n a.length === b.length &&\n a.every((p, i) => {\n const q = b[i] as LayoutPage;\n return (\n p.key === q.key &&\n p.title === q.title &&\n p.maxRows === q.maxRows &&\n sameKeys(p.order, q.order) &&\n sameKeys(p.hidden, q.hidden) &&\n sameKeys(p.minimized, q.minimized)\n );\n })\n );\n}\n\n/**\n * Repairs a layout so it can be trusted, for the place it is saved: unknown\n * widgets are dropped, locks are enforced, and in a paged layout each widget\n * lives on one page, titles are trimmed, unique and short, widgets no page\n * lists yet are placed (on their home page), and a page that holds too many\n * rows has its overflow moved, in order, to the next page with room or a new\n * page after it. Nothing is hidden or dropped to make room. Idempotent;\n * returns the same object when nothing changes.\n */\nexport function normalizeLayout<T extends PageItem>(\n definitions: readonly T[],\n layout: DashboardLayout,\n options: NormalizeOptions = {}\n): DashboardLayout {\n const known: DashboardLayout = pruneLayout(definitions, layout);\n const locked: DashboardLayout = enforceLocks(definitions, known, options);\n if (!hasPages(locked)) return locked === layout ? layout : locked;\n\n const defs: readonly T[] =\n options.overrideLocks === true\n ? definitions.map(withoutLockField)\n : definitions;\n\n // Pages: one per key, one page per widget, clean titles.\n const taken = new Set<string>();\n const seenKeys = new Set<string>();\n const held = new Set<string>();\n let pages: LayoutPage[] = [];\n (locked.pages ?? []).forEach((page, index) => {\n if (seenKeys.has(page.key)) return;\n seenKeys.add(page.key);\n const keep = (list: readonly string[]): string[] => [\n ...new Set(list.filter((k) => !held.has(k))),\n ];\n const next: LayoutPage = {\n ...page,\n title: uniqueTitle(taken, page.title, index),\n order: keep(page.order),\n hidden: keep(page.hidden),\n minimized: keep(page.minimized),\n };\n for (const k of [...next.order, ...next.hidden]) held.add(k);\n pages.push(next);\n });\n\n const work = (): DashboardLayout => ({ ...locked, pages });\n\n // A widget locked against moving belongs to its home page: its hidden and\n // minimized entries move there, and it is never listed in an order.\n const pinned: T[] = defs.filter((d) => resolveWidgetLock(d).move);\n for (const widget of pinned) {\n const home: string = homePageKey(work(), widget);\n const keysHere = (p: LayoutPage, list: 'hidden' | 'minimized') =>\n p.key !== home && p[list].includes(widget.key);\n const wasHidden: boolean = pages.some((p) => keysHere(p, 'hidden'));\n const wasMinimized: boolean = pages.some((p) => keysHere(p, 'minimized'));\n if (!wasHidden && !wasMinimized) continue;\n pages = pages.map((p) => {\n let next: LayoutPage = p;\n if (keysHere(p, 'hidden')) {\n next = { ...next, hidden: without(next.hidden, widget.key) };\n }\n if (keysHere(p, 'minimized')) {\n next = { ...next, minimized: without(next.minimized, widget.key) };\n }\n if (p.key === home) {\n next = {\n ...next,\n hidden:\n wasHidden && !next.hidden.includes(widget.key)\n ? [...next.hidden, widget.key]\n : next.hidden,\n minimized:\n wasMinimized && !next.minimized.includes(widget.key)\n ? [...next.minimized, widget.key]\n : next.minimized,\n };\n }\n return next;\n });\n }\n\n // Widgets no page lists yet join the end of their home page's order.\n const placedKeys = new Set<string>();\n for (const p of pages) {\n for (const k of [...p.order, ...p.hidden]) placedKeys.add(k);\n }\n const pinnedKeys = new Set<string>(pinned.map((d) => d.key));\n const unplaced: T[] = defs\n .filter((d) => !placedKeys.has(d.key) && !pinnedKeys.has(d.key))\n .map((definition, index) => ({ definition, index }))\n .sort(\n (a, b) =>\n (a.definition.sortOrder ?? 0) - (b.definition.sortOrder ?? 0) ||\n a.index - b.index\n )\n .map(({ definition }) => definition);\n for (const widget of unplaced) {\n const home: string = homePageKey(work(), widget);\n pages = pages.map((p) =>\n p.key === home ? { ...p, order: [...p.order, widget.key] } : p\n );\n }\n\n // Overflow moves, in order, to the next page with room or a new page.\n for (let i = 0; i < pages.length; i += 1) {\n const page = pages[i] as LayoutPage;\n const shown: T[] = pageWidgets(defs, work(), page.key);\n const fits: number = fitCount(shown, rowsAllowed(page, options));\n if (fits >= shown.length) continue;\n const moving: string[] = shown\n .slice(fits)\n .filter((d) => !pinnedKeys.has(d.key))\n .map((d) => d.key);\n if (moving.length === 0) continue;\n const moveSet = new Set<string>(moving);\n const movedMinimized: string[] = page.minimized.filter((k) =>\n moveSet.has(k)\n );\n pages = pages.map((p) =>\n p.key === page.key\n ? {\n ...p,\n order: p.order.filter((k) => !moveSet.has(k)),\n minimized: p.minimized.filter((k) => !moveSet.has(k)),\n }\n : p\n );\n let placed = false;\n for (let j = i + 1; j < pages.length && !placed; j += 1) {\n const candidate: LayoutPage = pages[j] as LayoutPage;\n const trial: LayoutPage[] = pages.map((p) =>\n p.key === candidate.key\n ? {\n ...p,\n order: [...moving, ...p.order],\n minimized: [...p.minimized, ...movedMinimized],\n }\n : p\n );\n const items: T[] = pageWidgets(\n defs,\n { ...locked, pages: trial },\n candidate.key\n );\n if (placeRows(items).length <= rowsAllowed(candidate, options)) {\n pages = trial;\n placed = true;\n }\n }\n if (!placed) {\n const key: string = nextPageKey(work());\n const title: string = uniqueTitle(\n new Set<string>(pages.map((p) => normalizedTitle(p.title))),\n `Page ${pages.length + 1}`,\n pages.length\n );\n pages = [\n ...pages,\n { key, title, order: moving, hidden: [], minimized: movedMinimized },\n ];\n }\n }\n\n const result: DashboardLayout = work();\n return samePages(layout.pages ?? [], pages) &&\n sameKeys(layout.order, result.order)\n ? layout\n : result;\n}\n","/** 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"]}