@richardmcquiston01/dashboard-widgets-toolkit 0.11.2 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { b as WidgetDefinition, D as DashboardWidget, n as WidgetContext, m as ResolveOptions, o as WidgetProviders, p as WidgetKind, q as Result, r as WidgetPayload } from './storage-VaaysVnZ.cjs';
2
- export { s as AddPageOptions, t as AlertListItem, A as AlertListWidgetData, u as BarListItem, B as BarListWidgetData, v as BooleanOption, C as CachedPayload, w as ChoiceOption, x as ColorOption, y as ColumnsOption, z as ConflictPolicy, E as DATE_RANGE_PRESETS, F as DEFAULT_COMPARISON_LABEL, H as DEFAULT_CURRENCY, I as DEFAULT_DETAIL_PAGE_SIZE, J as DEFAULT_EMPTY_TEXT, M as DEFAULT_MAX_LAYOUT_BYTES, Q as DEFAULT_PAGE_KEY, U as DEFAULT_PAGE_ROWS, V as DETAIL_MODES, f as DashboardLayout, X as DateRangeOption, Y as DateRangePreset, Z as DeltaDirection, _ as DeltaSentiment, $ as DetailCell, a0 as DetailColumn, d as DetailData, a1 as DetailMode, a2 as DetailPage, a3 as DetailProvider, c as DetailProviderOptions, a4 as DetailProviders, e as DetailQuery, h as DetailSort, a5 as EMPTY_LAYOUT, a6 as EmptyWidget, a7 as EncodingOptions, a8 as EnforceLocksOptions, a9 as Err, aa as ErrorWidget, ab as FormatOptions, g as GaugeWidgetData, ac as GraphPoint, ad as GraphSeries, G as GraphWidgetData, ae as GridItem, af as KpiDelta, ag as KpiDeltaOptions, K as KpiWidgetData, ah as LAYOUT_ENVELOPE_VERSION, ai as LayoutItem, aj as LayoutPage, k as LayoutPersistence, ak as LayoutPersistenceOptions, al as LoadedLayout, am as LoadingWidget, L as Locale, an as MAX_DETAIL_PAGE_SIZE, ao as MAX_GRAPH_SERIES, ap as MAX_PAGE_ROWS, aq as MAX_PAGE_TITLE_LENGTH, ar as MAX_PARSED_PAGES, as as MAX_TEXT_OPTION_LENGTH, at as MAX_WIDGET_OPTIONS, au as MAX_WIDGET_WIDTH, av as MIN_WIDGET_WIDTH, N as NiceDomain, l as NormalizeOptions, aw as NumberOption, ax as OPTION_KEY_PATTERN, ay as Ok, az as OkWidget, aA as OptionContext, aB as OptionValue, O as OptionValues, P as PageItem, aC as PageOptions, aD as PageRoom, aE as PlacedRow, aF as ProviderOptions, aG as ResolvedDetailOptions, R as ResolvedTableControls, aH as ResolvedWidget, aI as ResolvedWidgetLock, aJ as RetryOptions, aK as SaveOptions, aL as SavedLayout, aM as SortDirection, aN as SortOption, aO as StorageAdapter, aP as StorageLogEvent, aQ as StoreErrorCode, aR as StoreResult, S as StoreScope, aS as StoredValue, aT as TableCell, aU as TableColumn, T as TableWidgetData, aV as TextOption, i as TextWidgetData, aW as VALUE_FORMATS, aX as ValueFormat, aY as WIDGET_FILLS, aZ as WIDGET_KINDS, a_ as WIDGET_OPTION_TYPES, a$ as WIDGET_SIZES, b0 as WIDTH_COLUMNS, b1 as WidgetCache, j as WidgetData, b2 as WidgetDataOf, b3 as WidgetDetailOptions, b4 as WidgetEmptyState, a as WidgetFill, b5 as WidgetLock, b6 as WidgetOption, b7 as WidgetProvider, W as WidgetSize, b8 as WidgetStatus, b9 as WidgetTableControls, ba as addPage, bb as applyClientOptions, bc as assignPages, bd as baseColumnSpan, be as cacheKeyFor, bf as coerceOptionValue, bg as createLayoutPersistence, bh as defaultDetailQuery, bi as defaultOptionValue, bj as defineWidget, bk as deriveDetailData, bl as describeUnknownError, bm as emptyTextFor, bn as emptyWidget, bo as enforceLocks, bp as err, bq as failedWidget, br as fillColumnSpans, bs as fillWidthSpans, bt as fillsHeight, bu as fillsWidth, bv as finalizeWidget, bw as fitCount, bx as formatCount, by as formatPercentChange, bz as formatValue, bA as hasPages, bB as hiddenWidgets, bC as hideWidget, bD as isClientApplied, bE as isColumnKeyFor, bF as isHidden, bG as isIsoInterval, bH as isMinimized, bI as isWidgetEmptyState, bJ as isWidgetKind, bK as isWidgetVisibleTo, bL as isWidgetWidth, bM as itemWidth, bN as kpiDelta, bO as labelStride, bP as loadingWidgets, bQ as memoryAdapter, bR as minimizeWidget, bS as movePage, bT as moveWidget, bU as moveWidgetBy, bV as moveWidgetDown, bW as moveWidgetToPage, bX as moveWidgetUp, bY as nextPageKey, bZ as niceDomain, b_ as niceStep, b$ as normalizeLayout, c0 as ok, c1 as optionValuesFor, c2 as optionsCacheSuffix, c3 as pageLayout, c4 as pageList, c5 as pageOf, c6 as pageRoom, c7 as pageWidgets, c8 as parseDetailQuery, c9 as parseLayout, ca as parseSortValue, cb as percentChange, cc as placeRows, cd as pruneLayout, ce as queryRows, cf as readOnly, cg as removePage, ch as renamePage, ci as resolveDateRange, cj as resolveDetailOptions, ck as resolveOptionValues, cl as resolvePageKey, cm as resolvePayload, cn as resolveTableControls, co as resolveWidget, cp as resolveWidgetLock, cq as resolveWidgetUnapplied, cr as resolveWidgets, cs as restoreWidget, ct as sameOptionValues, cu as serializeDetailQuery, cv as serializeLayout, cw as shareOf, cx as showWidget, cy as sortDefinitions, cz as sortFromOptions, cA as tableDetailData, cB as toggleHidden, cC as toggleMinimized, cD as usesWidthColumns, cE as utf8Length, cF as validateDetailData, cG as visibleWidgets, cH as widgetsFor, cI as widthForSize, cJ as withEncoding, cK as withFallback, cL as withLogging, cM as withPageLayout, cN as withPrefix, cO as withReadCache, cP as withRetry } from './storage-VaaysVnZ.cjs';
1
+ import { b as WidgetDefinition, D as DashboardWidget, n as WidgetContext, m as ResolveOptions, o as WidgetProviders, p as Result, q as WidgetKind, r as WidgetPayload } from './storage-DNB7gjvT.cjs';
2
+ export { s as AddPageOptions, t as AlertListItem, A as AlertListWidgetData, u as BarListItem, B as BarListWidgetData, v as BooleanOption, C as CachedPayload, w as ChoiceOption, x as ColorOption, y as ColumnsOption, z as ConflictPolicy, E as DATE_RANGE_PRESETS, F as DEFAULT_COMPARISON_LABEL, H as DEFAULT_CURRENCY, I as DEFAULT_DETAIL_PAGE_SIZE, J as DEFAULT_EMPTY_TEXT, M as DEFAULT_MAX_LAYOUT_BYTES, Q as DEFAULT_PAGE_KEY, U as DEFAULT_PAGE_ROWS, V as DETAIL_MODES, f as DashboardLayout, X as DateRangeOption, Y as DateRangePreset, Z as DeltaDirection, _ as DeltaSentiment, $ as DetailCell, a0 as DetailColumn, d as DetailData, a1 as DetailMode, a2 as DetailPage, a3 as DetailProvider, c as DetailProviderOptions, a4 as DetailProviders, e as DetailQuery, h as DetailSort, a5 as EMPTY_LAYOUT, a6 as EmptyWidget, a7 as EncodingOptions, a8 as EnforceLocksOptions, a9 as Err, aa as ErrorWidget, ab as FormatOptions, g as GaugeWidgetData, ac as GraphPoint, ad as GraphSeries, G as GraphWidgetData, ae as GridItem, af as KpiDelta, ag as KpiDeltaOptions, K as KpiWidgetData, ah as LAYOUT_ENVELOPE_VERSION, ai as LayoutItem, aj as LayoutPage, k as LayoutPersistence, ak as LayoutPersistenceOptions, al as LoadedLayout, am as LoadingWidget, L as Locale, an as MAX_DETAIL_PAGE_SIZE, ao as MAX_GRAPH_SERIES, ap as MAX_PAGE_ROWS, aq as MAX_PAGE_TITLE_LENGTH, ar as MAX_PARSED_PAGES, as as MAX_TEXT_OPTION_LENGTH, at as MAX_WIDGET_OPTIONS, au as MAX_WIDGET_WIDTH, av as MIN_WIDGET_WIDTH, N as NiceDomain, l as NormalizeOptions, aw as NumberOption, ax as OPTION_KEY_PATTERN, ay as Ok, az as OkWidget, aA as OptionContext, aB as OptionValue, O as OptionValues, P as PageItem, aC as PageOptions, aD as PageRoom, aE as PlacedRow, aF as ProviderOptions, aG as ResolvedDetailOptions, R as ResolvedTableControls, aH as ResolvedWidget, aI as ResolvedWidgetLock, aJ as RetryOptions, aK as SaveOptions, aL as SavedLayout, aM as SortDirection, aN as SortOption, aO as StorageAdapter, aP as StorageLogEvent, aQ as StoreErrorCode, aR as StoreResult, S as StoreScope, aS as StoredValue, aT as TableCell, aU as TableColumn, T as TableWidgetData, aV as TextOption, i as TextWidgetData, aW as VALUE_FORMATS, aX as ValueFormat, aY as WIDGET_FILLS, aZ as WIDGET_KINDS, a_ as WIDGET_OPTION_TYPES, a$ as WIDGET_SIZES, b0 as WIDTH_COLUMNS, b1 as WidgetCache, j as WidgetData, b2 as WidgetDataOf, b3 as WidgetDetailOptions, b4 as WidgetEmptyState, a as WidgetFill, b5 as WidgetLock, b6 as WidgetOption, b7 as WidgetProvider, W as WidgetSize, b8 as WidgetStatus, b9 as WidgetTableControls, ba as addPage, bb as applyClientOptions, bc as assignPages, bd as baseColumnSpan, be as cacheKeyFor, bf as coerceOptionValue, bg as createLayoutPersistence, bh as defaultDetailQuery, bi as defaultOptionValue, bj as defineWidget, bk as deriveDetailData, bl as describeUnknownError, bm as emptyTextFor, bn as emptyWidget, bo as enforceLocks, bp as err, bq as failedWidget, br as fillColumnSpans, bs as fillWidthSpans, bt as fillsHeight, bu as fillsWidth, bv as finalizeWidget, bw as fitCount, bx as formatCount, by as formatPercentChange, bz as formatValue, bA as hasPages, bB as hiddenWidgets, bC as hideWidget, bD as isClientApplied, bE as isColumnKeyFor, bF as isHidden, bG as isIsoInterval, bH as isMinimized, bI as isWidgetEmptyState, bJ as isWidgetKind, bK as isWidgetVisibleTo, bL as isWidgetWidth, bM as itemWidth, bN as kpiDelta, bO as labelStride, bP as loadingWidgets, bQ as memoryAdapter, bR as minimizeWidget, bS as movePage, bT as moveWidget, bU as moveWidgetBy, bV as moveWidgetDown, bW as moveWidgetToPage, bX as moveWidgetUp, bY as nextPageKey, bZ as niceDomain, b_ as niceStep, b$ as normalizeLayout, c0 as ok, c1 as optionValuesFor, c2 as optionsCacheSuffix, c3 as pageLayout, c4 as pageList, c5 as pageOf, c6 as pageRoom, c7 as pageWidgets, c8 as parseDetailQuery, c9 as parseLayout, ca as parseSortValue, cb as percentChange, cc as placeRows, cd as pruneLayout, ce as queryRows, cf as readOnly, cg as removePage, ch as renamePage, ci as resolveDateRange, cj as resolveDetailOptions, ck as resolveOptionValues, cl as resolvePageKey, cm as resolvePayload, cn as resolveTableControls, co as resolveWidget, cp as resolveWidgetLock, cq as resolveWidgetUnapplied, cr as resolveWidgets, cs as restoreWidget, ct as sameOptionValues, cu as serializeDetailQuery, cv as serializeLayout, cw as shareOf, cx as showWidget, cy as sortDefinitions, cz as sortFromOptions, cA as tableDetailData, cB as toggleHidden, cC as toggleMinimized, cD as usesWidthColumns, cE as utf8Length, cF as validateDetailData, cG as visibleWidgets, cH as widgetsFor, cI as widthForSize, cJ as withEncoding, cK as withFallback, cL as withLogging, cM as withPageLayout, cN as withPrefix, cO as withReadCache, cP as withRetry } from './storage-DNB7gjvT.cjs';
3
3
 
4
4
  /**
5
5
  * Maker Toolkit compatibility. Its API (`apps/api/src/widgets`) serves
@@ -87,6 +87,60 @@ interface WidgetLoader {
87
87
  }
88
88
  declare function createWidgetLoader<C extends WidgetContext>(options: WidgetLoaderOptions<C>): WidgetLoader;
89
89
 
90
+ /**
91
+ * Theming: turns a typed token object into scoped CSS for the `--dwt-*` custom
92
+ * properties. Runtime-neutral: it only builds a string, so a Node API, a build
93
+ * script or an SSR server can produce a theme without React or a DOM.
94
+ *
95
+ * The built-in defaults are declared on `.dwt-dashboard` and `.dwt-card`, so a
96
+ * variable set on an ancestor is shadowed. The generated selectors therefore
97
+ * target those two classes beneath a scope and out-rank the built-in dark rules.
98
+ * See docs/design/theming.md.
99
+ */
100
+
101
+ type ThemeColorKey = 'surface' | 'page' | 'text' | 'textSecondary' | 'textMuted' | 'border' | 'grid' | 'baseline' | 'crosshair' | 'link' | 'focus' | 'good' | 'bad' | 'meterTrack' | 'barTrack' | 'buttonHover';
102
+ type ThemeLengthKey = 'radius' | 'gap' | 'padding' | 'minColumn';
103
+ type ThemeTokenKey = ThemeColorKey | ThemeLengthKey | 'font';
104
+ /** The CSS custom property each token key sets (series are `--dwt-series-N`). */
105
+ declare const THEME_TOKEN_VARIABLES: Readonly<Record<ThemeTokenKey, string>>;
106
+ type ThemeTokens = {
107
+ readonly [Key in ThemeTokenKey]?: string;
108
+ } & {
109
+ /** Chart colors in order; fills `--dwt-series-1` to `--dwt-series-N`. */
110
+ readonly series?: readonly string[];
111
+ };
112
+ interface ThemeOptions {
113
+ /** Lower-case letters, digits and hyphens, starting with a letter. */
114
+ readonly name: string;
115
+ /**
116
+ * Selector of an ancestor of the dashboard. Defaults to
117
+ * `[data-dwt-theme='<name>']`. Letters, digits, `_ - [ ] = . # ' "` and spaces
118
+ * only.
119
+ */
120
+ readonly scope?: string;
121
+ /** Applied in light and dark mode. */
122
+ readonly base?: ThemeTokens;
123
+ /** Applied in light mode only; wins over `base`. */
124
+ readonly light?: ThemeTokens;
125
+ /** Applied in dark mode only; wins over `base`. */
126
+ readonly dark?: ThemeTokens;
127
+ }
128
+ type ThemeMode = 'base' | 'light' | 'dark';
129
+ interface WidgetThemeStyles {
130
+ readonly name: string;
131
+ readonly scope: string;
132
+ /** For a `<style>` element or the head of a server-rendered page. */
133
+ readonly css: string;
134
+ /** The resolved custom properties per mode, e.g. `{'--dwt-surface': '#fff'}`. */
135
+ readonly variables: Readonly<Record<ThemeMode, Readonly<Record<string, string>>>>;
136
+ }
137
+ /**
138
+ * Builds the CSS for a theme. Tokens left unset keep their built-in value in
139
+ * each mode. Returns an error naming the mode, the token and the value when
140
+ * anything is invalid.
141
+ */
142
+ declare function createTheme(options: ThemeOptions): Result<WidgetThemeStyles>;
143
+
90
144
  /**
91
145
  * Link and image URL checks. Payloads often come from an API, so a link is
92
146
  * only rendered when it can't run script: http(s), mailto, or a relative
@@ -124,4 +178,4 @@ declare function validateWidgetData(value: unknown, options?: ValidateWidgetData
124
178
  */
125
179
  declare function validateWidgetDefinition(value: unknown): Result<WidgetDefinition>;
126
180
 
127
- export { DashboardWidget, type LegacyWidgetDefinition, MAX_REPORTED_PROBLEMS, type RefreshOptions, ResolveOptions, Result, type ValidateWidgetDataOptions, WidgetContext, WidgetDefinition, WidgetKind, type WidgetLoader, type WidgetLoaderOptions, WidgetPayload, WidgetProviders, createWidgetLoader, fromLegacyDefinition, isSafeHref, isSafeImageUrl, upgradeLegacyWidgetData, validateWidgetData, validateWidgetDefinition };
181
+ export { DashboardWidget, type LegacyWidgetDefinition, MAX_REPORTED_PROBLEMS, type RefreshOptions, ResolveOptions, Result, THEME_TOKEN_VARIABLES, type ThemeColorKey, type ThemeLengthKey, type ThemeMode, type ThemeOptions, type ThemeTokenKey, type ThemeTokens, type ValidateWidgetDataOptions, WidgetContext, WidgetDefinition, WidgetKind, type WidgetLoader, type WidgetLoaderOptions, WidgetPayload, WidgetProviders, type WidgetThemeStyles, createTheme, createWidgetLoader, fromLegacyDefinition, isSafeHref, isSafeImageUrl, upgradeLegacyWidgetData, validateWidgetData, validateWidgetDefinition };
package/dist/core.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { b as WidgetDefinition, D as DashboardWidget, n as WidgetContext, m as ResolveOptions, o as WidgetProviders, p as WidgetKind, q as Result, r as WidgetPayload } from './storage-VaaysVnZ.js';
2
- export { s as AddPageOptions, t as AlertListItem, A as AlertListWidgetData, u as BarListItem, B as BarListWidgetData, v as BooleanOption, C as CachedPayload, w as ChoiceOption, x as ColorOption, y as ColumnsOption, z as ConflictPolicy, E as DATE_RANGE_PRESETS, F as DEFAULT_COMPARISON_LABEL, H as DEFAULT_CURRENCY, I as DEFAULT_DETAIL_PAGE_SIZE, J as DEFAULT_EMPTY_TEXT, M as DEFAULT_MAX_LAYOUT_BYTES, Q as DEFAULT_PAGE_KEY, U as DEFAULT_PAGE_ROWS, V as DETAIL_MODES, f as DashboardLayout, X as DateRangeOption, Y as DateRangePreset, Z as DeltaDirection, _ as DeltaSentiment, $ as DetailCell, a0 as DetailColumn, d as DetailData, a1 as DetailMode, a2 as DetailPage, a3 as DetailProvider, c as DetailProviderOptions, a4 as DetailProviders, e as DetailQuery, h as DetailSort, a5 as EMPTY_LAYOUT, a6 as EmptyWidget, a7 as EncodingOptions, a8 as EnforceLocksOptions, a9 as Err, aa as ErrorWidget, ab as FormatOptions, g as GaugeWidgetData, ac as GraphPoint, ad as GraphSeries, G as GraphWidgetData, ae as GridItem, af as KpiDelta, ag as KpiDeltaOptions, K as KpiWidgetData, ah as LAYOUT_ENVELOPE_VERSION, ai as LayoutItem, aj as LayoutPage, k as LayoutPersistence, ak as LayoutPersistenceOptions, al as LoadedLayout, am as LoadingWidget, L as Locale, an as MAX_DETAIL_PAGE_SIZE, ao as MAX_GRAPH_SERIES, ap as MAX_PAGE_ROWS, aq as MAX_PAGE_TITLE_LENGTH, ar as MAX_PARSED_PAGES, as as MAX_TEXT_OPTION_LENGTH, at as MAX_WIDGET_OPTIONS, au as MAX_WIDGET_WIDTH, av as MIN_WIDGET_WIDTH, N as NiceDomain, l as NormalizeOptions, aw as NumberOption, ax as OPTION_KEY_PATTERN, ay as Ok, az as OkWidget, aA as OptionContext, aB as OptionValue, O as OptionValues, P as PageItem, aC as PageOptions, aD as PageRoom, aE as PlacedRow, aF as ProviderOptions, aG as ResolvedDetailOptions, R as ResolvedTableControls, aH as ResolvedWidget, aI as ResolvedWidgetLock, aJ as RetryOptions, aK as SaveOptions, aL as SavedLayout, aM as SortDirection, aN as SortOption, aO as StorageAdapter, aP as StorageLogEvent, aQ as StoreErrorCode, aR as StoreResult, S as StoreScope, aS as StoredValue, aT as TableCell, aU as TableColumn, T as TableWidgetData, aV as TextOption, i as TextWidgetData, aW as VALUE_FORMATS, aX as ValueFormat, aY as WIDGET_FILLS, aZ as WIDGET_KINDS, a_ as WIDGET_OPTION_TYPES, a$ as WIDGET_SIZES, b0 as WIDTH_COLUMNS, b1 as WidgetCache, j as WidgetData, b2 as WidgetDataOf, b3 as WidgetDetailOptions, b4 as WidgetEmptyState, a as WidgetFill, b5 as WidgetLock, b6 as WidgetOption, b7 as WidgetProvider, W as WidgetSize, b8 as WidgetStatus, b9 as WidgetTableControls, ba as addPage, bb as applyClientOptions, bc as assignPages, bd as baseColumnSpan, be as cacheKeyFor, bf as coerceOptionValue, bg as createLayoutPersistence, bh as defaultDetailQuery, bi as defaultOptionValue, bj as defineWidget, bk as deriveDetailData, bl as describeUnknownError, bm as emptyTextFor, bn as emptyWidget, bo as enforceLocks, bp as err, bq as failedWidget, br as fillColumnSpans, bs as fillWidthSpans, bt as fillsHeight, bu as fillsWidth, bv as finalizeWidget, bw as fitCount, bx as formatCount, by as formatPercentChange, bz as formatValue, bA as hasPages, bB as hiddenWidgets, bC as hideWidget, bD as isClientApplied, bE as isColumnKeyFor, bF as isHidden, bG as isIsoInterval, bH as isMinimized, bI as isWidgetEmptyState, bJ as isWidgetKind, bK as isWidgetVisibleTo, bL as isWidgetWidth, bM as itemWidth, bN as kpiDelta, bO as labelStride, bP as loadingWidgets, bQ as memoryAdapter, bR as minimizeWidget, bS as movePage, bT as moveWidget, bU as moveWidgetBy, bV as moveWidgetDown, bW as moveWidgetToPage, bX as moveWidgetUp, bY as nextPageKey, bZ as niceDomain, b_ as niceStep, b$ as normalizeLayout, c0 as ok, c1 as optionValuesFor, c2 as optionsCacheSuffix, c3 as pageLayout, c4 as pageList, c5 as pageOf, c6 as pageRoom, c7 as pageWidgets, c8 as parseDetailQuery, c9 as parseLayout, ca as parseSortValue, cb as percentChange, cc as placeRows, cd as pruneLayout, ce as queryRows, cf as readOnly, cg as removePage, ch as renamePage, ci as resolveDateRange, cj as resolveDetailOptions, ck as resolveOptionValues, cl as resolvePageKey, cm as resolvePayload, cn as resolveTableControls, co as resolveWidget, cp as resolveWidgetLock, cq as resolveWidgetUnapplied, cr as resolveWidgets, cs as restoreWidget, ct as sameOptionValues, cu as serializeDetailQuery, cv as serializeLayout, cw as shareOf, cx as showWidget, cy as sortDefinitions, cz as sortFromOptions, cA as tableDetailData, cB as toggleHidden, cC as toggleMinimized, cD as usesWidthColumns, cE as utf8Length, cF as validateDetailData, cG as visibleWidgets, cH as widgetsFor, cI as widthForSize, cJ as withEncoding, cK as withFallback, cL as withLogging, cM as withPageLayout, cN as withPrefix, cO as withReadCache, cP as withRetry } from './storage-VaaysVnZ.js';
1
+ import { b as WidgetDefinition, D as DashboardWidget, n as WidgetContext, m as ResolveOptions, o as WidgetProviders, p as Result, q as WidgetKind, r as WidgetPayload } from './storage-DNB7gjvT.js';
2
+ export { s as AddPageOptions, t as AlertListItem, A as AlertListWidgetData, u as BarListItem, B as BarListWidgetData, v as BooleanOption, C as CachedPayload, w as ChoiceOption, x as ColorOption, y as ColumnsOption, z as ConflictPolicy, E as DATE_RANGE_PRESETS, F as DEFAULT_COMPARISON_LABEL, H as DEFAULT_CURRENCY, I as DEFAULT_DETAIL_PAGE_SIZE, J as DEFAULT_EMPTY_TEXT, M as DEFAULT_MAX_LAYOUT_BYTES, Q as DEFAULT_PAGE_KEY, U as DEFAULT_PAGE_ROWS, V as DETAIL_MODES, f as DashboardLayout, X as DateRangeOption, Y as DateRangePreset, Z as DeltaDirection, _ as DeltaSentiment, $ as DetailCell, a0 as DetailColumn, d as DetailData, a1 as DetailMode, a2 as DetailPage, a3 as DetailProvider, c as DetailProviderOptions, a4 as DetailProviders, e as DetailQuery, h as DetailSort, a5 as EMPTY_LAYOUT, a6 as EmptyWidget, a7 as EncodingOptions, a8 as EnforceLocksOptions, a9 as Err, aa as ErrorWidget, ab as FormatOptions, g as GaugeWidgetData, ac as GraphPoint, ad as GraphSeries, G as GraphWidgetData, ae as GridItem, af as KpiDelta, ag as KpiDeltaOptions, K as KpiWidgetData, ah as LAYOUT_ENVELOPE_VERSION, ai as LayoutItem, aj as LayoutPage, k as LayoutPersistence, ak as LayoutPersistenceOptions, al as LoadedLayout, am as LoadingWidget, L as Locale, an as MAX_DETAIL_PAGE_SIZE, ao as MAX_GRAPH_SERIES, ap as MAX_PAGE_ROWS, aq as MAX_PAGE_TITLE_LENGTH, ar as MAX_PARSED_PAGES, as as MAX_TEXT_OPTION_LENGTH, at as MAX_WIDGET_OPTIONS, au as MAX_WIDGET_WIDTH, av as MIN_WIDGET_WIDTH, N as NiceDomain, l as NormalizeOptions, aw as NumberOption, ax as OPTION_KEY_PATTERN, ay as Ok, az as OkWidget, aA as OptionContext, aB as OptionValue, O as OptionValues, P as PageItem, aC as PageOptions, aD as PageRoom, aE as PlacedRow, aF as ProviderOptions, aG as ResolvedDetailOptions, R as ResolvedTableControls, aH as ResolvedWidget, aI as ResolvedWidgetLock, aJ as RetryOptions, aK as SaveOptions, aL as SavedLayout, aM as SortDirection, aN as SortOption, aO as StorageAdapter, aP as StorageLogEvent, aQ as StoreErrorCode, aR as StoreResult, S as StoreScope, aS as StoredValue, aT as TableCell, aU as TableColumn, T as TableWidgetData, aV as TextOption, i as TextWidgetData, aW as VALUE_FORMATS, aX as ValueFormat, aY as WIDGET_FILLS, aZ as WIDGET_KINDS, a_ as WIDGET_OPTION_TYPES, a$ as WIDGET_SIZES, b0 as WIDTH_COLUMNS, b1 as WidgetCache, j as WidgetData, b2 as WidgetDataOf, b3 as WidgetDetailOptions, b4 as WidgetEmptyState, a as WidgetFill, b5 as WidgetLock, b6 as WidgetOption, b7 as WidgetProvider, W as WidgetSize, b8 as WidgetStatus, b9 as WidgetTableControls, ba as addPage, bb as applyClientOptions, bc as assignPages, bd as baseColumnSpan, be as cacheKeyFor, bf as coerceOptionValue, bg as createLayoutPersistence, bh as defaultDetailQuery, bi as defaultOptionValue, bj as defineWidget, bk as deriveDetailData, bl as describeUnknownError, bm as emptyTextFor, bn as emptyWidget, bo as enforceLocks, bp as err, bq as failedWidget, br as fillColumnSpans, bs as fillWidthSpans, bt as fillsHeight, bu as fillsWidth, bv as finalizeWidget, bw as fitCount, bx as formatCount, by as formatPercentChange, bz as formatValue, bA as hasPages, bB as hiddenWidgets, bC as hideWidget, bD as isClientApplied, bE as isColumnKeyFor, bF as isHidden, bG as isIsoInterval, bH as isMinimized, bI as isWidgetEmptyState, bJ as isWidgetKind, bK as isWidgetVisibleTo, bL as isWidgetWidth, bM as itemWidth, bN as kpiDelta, bO as labelStride, bP as loadingWidgets, bQ as memoryAdapter, bR as minimizeWidget, bS as movePage, bT as moveWidget, bU as moveWidgetBy, bV as moveWidgetDown, bW as moveWidgetToPage, bX as moveWidgetUp, bY as nextPageKey, bZ as niceDomain, b_ as niceStep, b$ as normalizeLayout, c0 as ok, c1 as optionValuesFor, c2 as optionsCacheSuffix, c3 as pageLayout, c4 as pageList, c5 as pageOf, c6 as pageRoom, c7 as pageWidgets, c8 as parseDetailQuery, c9 as parseLayout, ca as parseSortValue, cb as percentChange, cc as placeRows, cd as pruneLayout, ce as queryRows, cf as readOnly, cg as removePage, ch as renamePage, ci as resolveDateRange, cj as resolveDetailOptions, ck as resolveOptionValues, cl as resolvePageKey, cm as resolvePayload, cn as resolveTableControls, co as resolveWidget, cp as resolveWidgetLock, cq as resolveWidgetUnapplied, cr as resolveWidgets, cs as restoreWidget, ct as sameOptionValues, cu as serializeDetailQuery, cv as serializeLayout, cw as shareOf, cx as showWidget, cy as sortDefinitions, cz as sortFromOptions, cA as tableDetailData, cB as toggleHidden, cC as toggleMinimized, cD as usesWidthColumns, cE as utf8Length, cF as validateDetailData, cG as visibleWidgets, cH as widgetsFor, cI as widthForSize, cJ as withEncoding, cK as withFallback, cL as withLogging, cM as withPageLayout, cN as withPrefix, cO as withReadCache, cP as withRetry } from './storage-DNB7gjvT.js';
3
3
 
4
4
  /**
5
5
  * Maker Toolkit compatibility. Its API (`apps/api/src/widgets`) serves
@@ -87,6 +87,60 @@ interface WidgetLoader {
87
87
  }
88
88
  declare function createWidgetLoader<C extends WidgetContext>(options: WidgetLoaderOptions<C>): WidgetLoader;
89
89
 
90
+ /**
91
+ * Theming: turns a typed token object into scoped CSS for the `--dwt-*` custom
92
+ * properties. Runtime-neutral: it only builds a string, so a Node API, a build
93
+ * script or an SSR server can produce a theme without React or a DOM.
94
+ *
95
+ * The built-in defaults are declared on `.dwt-dashboard` and `.dwt-card`, so a
96
+ * variable set on an ancestor is shadowed. The generated selectors therefore
97
+ * target those two classes beneath a scope and out-rank the built-in dark rules.
98
+ * See docs/design/theming.md.
99
+ */
100
+
101
+ type ThemeColorKey = 'surface' | 'page' | 'text' | 'textSecondary' | 'textMuted' | 'border' | 'grid' | 'baseline' | 'crosshair' | 'link' | 'focus' | 'good' | 'bad' | 'meterTrack' | 'barTrack' | 'buttonHover';
102
+ type ThemeLengthKey = 'radius' | 'gap' | 'padding' | 'minColumn';
103
+ type ThemeTokenKey = ThemeColorKey | ThemeLengthKey | 'font';
104
+ /** The CSS custom property each token key sets (series are `--dwt-series-N`). */
105
+ declare const THEME_TOKEN_VARIABLES: Readonly<Record<ThemeTokenKey, string>>;
106
+ type ThemeTokens = {
107
+ readonly [Key in ThemeTokenKey]?: string;
108
+ } & {
109
+ /** Chart colors in order; fills `--dwt-series-1` to `--dwt-series-N`. */
110
+ readonly series?: readonly string[];
111
+ };
112
+ interface ThemeOptions {
113
+ /** Lower-case letters, digits and hyphens, starting with a letter. */
114
+ readonly name: string;
115
+ /**
116
+ * Selector of an ancestor of the dashboard. Defaults to
117
+ * `[data-dwt-theme='<name>']`. Letters, digits, `_ - [ ] = . # ' "` and spaces
118
+ * only.
119
+ */
120
+ readonly scope?: string;
121
+ /** Applied in light and dark mode. */
122
+ readonly base?: ThemeTokens;
123
+ /** Applied in light mode only; wins over `base`. */
124
+ readonly light?: ThemeTokens;
125
+ /** Applied in dark mode only; wins over `base`. */
126
+ readonly dark?: ThemeTokens;
127
+ }
128
+ type ThemeMode = 'base' | 'light' | 'dark';
129
+ interface WidgetThemeStyles {
130
+ readonly name: string;
131
+ readonly scope: string;
132
+ /** For a `<style>` element or the head of a server-rendered page. */
133
+ readonly css: string;
134
+ /** The resolved custom properties per mode, e.g. `{'--dwt-surface': '#fff'}`. */
135
+ readonly variables: Readonly<Record<ThemeMode, Readonly<Record<string, string>>>>;
136
+ }
137
+ /**
138
+ * Builds the CSS for a theme. Tokens left unset keep their built-in value in
139
+ * each mode. Returns an error naming the mode, the token and the value when
140
+ * anything is invalid.
141
+ */
142
+ declare function createTheme(options: ThemeOptions): Result<WidgetThemeStyles>;
143
+
90
144
  /**
91
145
  * Link and image URL checks. Payloads often come from an API, so a link is
92
146
  * only rendered when it can't run script: http(s), mailto, or a relative
@@ -124,4 +178,4 @@ declare function validateWidgetData(value: unknown, options?: ValidateWidgetData
124
178
  */
125
179
  declare function validateWidgetDefinition(value: unknown): Result<WidgetDefinition>;
126
180
 
127
- export { DashboardWidget, type LegacyWidgetDefinition, MAX_REPORTED_PROBLEMS, type RefreshOptions, ResolveOptions, Result, type ValidateWidgetDataOptions, WidgetContext, WidgetDefinition, WidgetKind, type WidgetLoader, type WidgetLoaderOptions, WidgetPayload, WidgetProviders, createWidgetLoader, fromLegacyDefinition, isSafeHref, isSafeImageUrl, upgradeLegacyWidgetData, validateWidgetData, validateWidgetDefinition };
181
+ export { DashboardWidget, type LegacyWidgetDefinition, MAX_REPORTED_PROBLEMS, type RefreshOptions, ResolveOptions, Result, THEME_TOKEN_VARIABLES, type ThemeColorKey, type ThemeLengthKey, type ThemeMode, type ThemeOptions, type ThemeTokenKey, type ThemeTokens, type ValidateWidgetDataOptions, WidgetContext, WidgetDefinition, WidgetKind, type WidgetLoader, type WidgetLoaderOptions, WidgetPayload, WidgetProviders, type WidgetThemeStyles, createTheme, createWidgetLoader, fromLegacyDefinition, isSafeHref, isSafeImageUrl, upgradeLegacyWidgetData, validateWidgetData, validateWidgetDefinition };
package/dist/core.js CHANGED
@@ -3234,6 +3234,255 @@ function createLayoutPersistence(adapter, options = {}) {
3234
3234
  };
3235
3235
  }
3236
3236
 
3237
- export { DATE_RANGE_PRESETS, DEFAULT_COMPARISON_LABEL, DEFAULT_CURRENCY, DEFAULT_DETAIL_PAGE_SIZE, DEFAULT_EMPTY_TEXT, DEFAULT_MAX_LAYOUT_BYTES, DEFAULT_PAGE_KEY, DEFAULT_PAGE_ROWS, DETAIL_MODES, EMPTY_LAYOUT, LAYOUT_ENVELOPE_VERSION, MAX_DETAIL_PAGE_SIZE, MAX_GRAPH_SERIES, MAX_PAGE_ROWS, MAX_PAGE_TITLE_LENGTH, MAX_PARSED_PAGES, MAX_REPORTED_PROBLEMS, MAX_TEXT_OPTION_LENGTH, MAX_WIDGET_OPTIONS, MAX_WIDGET_WIDTH, MIN_WIDGET_WIDTH, OPTION_KEY_PATTERN, VALUE_FORMATS, WIDGET_FILLS, WIDGET_KINDS, WIDGET_OPTION_TYPES, WIDGET_SIZES, WIDTH_COLUMNS, addPage, applyClientOptions, assignPages, baseColumnSpan, cacheKeyFor, coerceOptionValue, createLayoutPersistence, createWidgetLoader, defaultDetailQuery, defaultOptionValue, defineWidget, deriveDetailData, describeUnknownError, emptyTextFor, emptyWidget, enforceLocks, err, failedWidget, fillColumnSpans, fillWidthSpans, fillsHeight, fillsWidth, finalizeWidget, fitCount, formatCount, formatPercentChange, formatValue, fromLegacyDefinition, hasPages, hiddenWidgets, hideWidget, isClientApplied, isColumnKeyFor, isHidden, isIsoInterval, isMinimized, isSafeHref, isSafeImageUrl, isWidgetEmptyState, isWidgetKind, isWidgetVisibleTo, isWidgetWidth, itemWidth, kpiDelta, labelStride, loadingWidgets, memoryAdapter, minimizeWidget, movePage, moveWidget, moveWidgetBy, moveWidgetDown, moveWidgetToPage, moveWidgetUp, nextPageKey, niceDomain, niceStep, normalizeLayout, ok, optionValuesFor, optionsCacheSuffix, pageLayout, pageList, pageOf, pageRoom, pageWidgets, parseDetailQuery, parseLayout, parseSortValue, percentChange, placeRows, pruneLayout, queryRows, readOnly, removePage, renamePage, resolveDateRange, resolveDetailOptions, resolveOptionValues, resolvePageKey, resolvePayload, resolveTableControls, resolveWidget, resolveWidgetLock, resolveWidgetUnapplied, resolveWidgets, restoreWidget, sameOptionValues, serializeDetailQuery, serializeLayout, shareOf, showWidget, sortDefinitions, sortFromOptions, tableDetailData, toggleHidden, toggleMinimized, upgradeLegacyWidgetData, usesWidthColumns, utf8Length, validateDetailData, validateWidgetData, validateWidgetDefinition, visibleWidgets, widgetsFor, widthForSize, withEncoding, withFallback, withLogging, withPageLayout, withPrefix, withReadCache, withRetry };
3237
+ // src/core/theme.ts
3238
+ var THEME_TOKEN_VARIABLES = {
3239
+ font: "--dwt-font",
3240
+ surface: "--dwt-surface",
3241
+ page: "--dwt-page",
3242
+ text: "--dwt-text",
3243
+ textSecondary: "--dwt-text-secondary",
3244
+ textMuted: "--dwt-text-muted",
3245
+ border: "--dwt-border",
3246
+ grid: "--dwt-grid",
3247
+ baseline: "--dwt-baseline",
3248
+ crosshair: "--dwt-crosshair",
3249
+ link: "--dwt-link",
3250
+ focus: "--dwt-focus",
3251
+ good: "--dwt-good",
3252
+ bad: "--dwt-bad",
3253
+ meterTrack: "--dwt-meter-track",
3254
+ barTrack: "--dwt-bar-track",
3255
+ buttonHover: "--dwt-button-hover",
3256
+ radius: "--dwt-radius",
3257
+ gap: "--dwt-gap",
3258
+ padding: "--dwt-padding",
3259
+ minColumn: "--dwt-min-column"
3260
+ };
3261
+ var LENGTH_KEYS = /* @__PURE__ */ new Set([
3262
+ "radius",
3263
+ "gap",
3264
+ "padding",
3265
+ "minColumn"
3266
+ ]);
3267
+ function kindOf(key) {
3268
+ if (key === "font") {
3269
+ return "font";
3270
+ }
3271
+ return LENGTH_KEYS.has(key) ? "length" : "color";
3272
+ }
3273
+ var NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
3274
+ var SCOPE_PATTERN = /^[A-Za-z0-9_\-[\]=.# '"]+$/;
3275
+ var HEX_COLOR = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
3276
+ var COLOR_FUNCTION = /^(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark)\(.+\)$/i;
3277
+ var VAR_REFERENCE = /^var\(\s*--[A-Za-z0-9_-]+\s*(?:,.+)?\)$/;
3278
+ var COLOR_KEYWORD = /^[A-Za-z]+$/;
3279
+ var LENGTH_VALUE = /^(?:0|-?(?:\d+\.?\d*|\.\d+)(?:px|rem|em|%|ch|vw|vh|cqw|cqh))$/;
3280
+ var LENGTH_FUNCTION = /^(?:calc|min|max|clamp)\(.+\)$/i;
3281
+ var FONT_VALUE = /^[A-Za-z0-9 ,'"_-]+$/;
3282
+ function unsafeReason(value) {
3283
+ if ([...value].some(
3284
+ (character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127
3285
+ )) {
3286
+ return "contains a control character or line break";
3287
+ }
3288
+ if (/[;{}<>\\@]/.test(value)) {
3289
+ return "contains one of ; { } < > \\ @";
3290
+ }
3291
+ const lower = value.toLowerCase();
3292
+ if (lower.includes("/*") || lower.includes("*/")) {
3293
+ return "contains a comment marker";
3294
+ }
3295
+ if (lower.includes("url(") || lower.includes("expression(")) {
3296
+ return "contains url( or expression(";
3297
+ }
3298
+ let depth = 0;
3299
+ for (const character of value) {
3300
+ if (character === "(") {
3301
+ depth += 1;
3302
+ } else if (character === ")") {
3303
+ depth -= 1;
3304
+ if (depth < 0) {
3305
+ return "has unbalanced parentheses";
3306
+ }
3307
+ }
3308
+ }
3309
+ return depth === 0 ? null : "has unbalanced parentheses";
3310
+ }
3311
+ function countOf(value, character) {
3312
+ return value.split(character).length - 1;
3313
+ }
3314
+ function invalidReason(kind, value) {
3315
+ if (value !== value.trim() || value === "") {
3316
+ return "must not be empty or have leading or trailing spaces";
3317
+ }
3318
+ if (kind === "font") {
3319
+ if (!FONT_VALUE.test(value)) {
3320
+ return "allows only letters, digits, spaces, commas, hyphens, underscores and quotes";
3321
+ }
3322
+ if (countOf(value, "'") % 2 !== 0 || countOf(value, '"') % 2 !== 0) {
3323
+ return "has an unclosed quote";
3324
+ }
3325
+ return null;
3326
+ }
3327
+ const unsafe = unsafeReason(value);
3328
+ if (unsafe !== null) {
3329
+ return unsafe;
3330
+ }
3331
+ if (value.includes("'") || value.includes('"')) {
3332
+ return "must not contain quotes";
3333
+ }
3334
+ if (kind === "color") {
3335
+ const valid2 = HEX_COLOR.test(value) || COLOR_FUNCTION.test(value) || VAR_REFERENCE.test(value) || COLOR_KEYWORD.test(value);
3336
+ return valid2 ? null : "is not a color (use #hex, rgb(), hsl(), oklch() and similar, var(--name) or a keyword)";
3337
+ }
3338
+ const valid = LENGTH_VALUE.test(value) || LENGTH_FUNCTION.test(value) || VAR_REFERENCE.test(value);
3339
+ return valid ? null : "is not a length (use a number with px, rem, em, %, ch, vw or vh, 0, calc(), min(), max(), clamp() or var(--name))";
3340
+ }
3341
+ function collectVariables(themeName, mode, tokens) {
3342
+ const variables = {};
3343
+ if (tokens === void 0) {
3344
+ return ok(variables);
3345
+ }
3346
+ const label = (key) => `createTheme "${themeName}": ${mode}.${key}`;
3347
+ const knownKeys = [
3348
+ ...Object.keys(THEME_TOKEN_VARIABLES),
3349
+ "series"
3350
+ ];
3351
+ for (const key of Object.keys(tokens)) {
3352
+ if (!knownKeys.includes(key)) {
3353
+ return err(
3354
+ `${label(key)} is not a theme token. Known tokens: ${knownKeys.join(", ")}.`
3355
+ );
3356
+ }
3357
+ }
3358
+ for (const key of Object.keys(THEME_TOKEN_VARIABLES)) {
3359
+ const value = tokens[key];
3360
+ if (value === void 0) {
3361
+ continue;
3362
+ }
3363
+ if (typeof value !== "string") {
3364
+ return err(`${label(key)} must be a string, got ${typeof value}.`);
3365
+ }
3366
+ const reason = invalidReason(kindOf(key), value);
3367
+ if (reason !== null) {
3368
+ return err(`${label(key)} "${value}" ${reason}.`);
3369
+ }
3370
+ variables[THEME_TOKEN_VARIABLES[key]] = value;
3371
+ }
3372
+ const series = tokens.series;
3373
+ if (series !== void 0) {
3374
+ if (!Array.isArray(series) || series.length === 0) {
3375
+ return err(`${label("series")} must be a non-empty array of colors.`);
3376
+ }
3377
+ if (series.length > MAX_GRAPH_SERIES) {
3378
+ return err(
3379
+ `${label("series")} has ${series.length} colors; charts draw at most ${MAX_GRAPH_SERIES} series.`
3380
+ );
3381
+ }
3382
+ for (const [index, value] of series.entries()) {
3383
+ const reason = typeof value === "string" ? invalidReason("color", value) : "must be a string";
3384
+ if (reason !== null) {
3385
+ return err(
3386
+ `${label(`series[${index}]`)} "${String(value)}" ${reason}.`
3387
+ );
3388
+ }
3389
+ variables[`--dwt-series-${index + 1}`] = value;
3390
+ }
3391
+ }
3392
+ return ok(variables);
3393
+ }
3394
+ function declarations(variables) {
3395
+ return Object.entries(variables).map(([variable, value]) => ` ${variable}: ${value};`).join("\n");
3396
+ }
3397
+ function targets(prefix, scope) {
3398
+ const lead = prefix === "" ? "" : `${prefix} `;
3399
+ return `${lead}${scope} .dwt-dashboard,
3400
+ ${lead}${scope} .dwt-card`;
3401
+ }
3402
+ function rule(prefix, scope, variables) {
3403
+ return `${targets(prefix, scope)} {
3404
+ ${declarations(variables)}
3405
+ }`;
3406
+ }
3407
+ function createTheme(options) {
3408
+ const name = options.name;
3409
+ if (typeof name !== "string" || !NAME_PATTERN.test(name)) {
3410
+ return err(
3411
+ `createTheme: name "${String(name)}" must start with a lower-case letter and contain only lower-case letters, digits and hyphens.`
3412
+ );
3413
+ }
3414
+ const scope = (options.scope ?? `[data-dwt-theme='${name}']`).trim();
3415
+ if (scope === "" || !SCOPE_PATTERN.test(scope)) {
3416
+ return err(
3417
+ `createTheme "${name}": scope "${scope}" must be a selector of letters, digits and _ - [ ] = . # ' " or spaces (no commas, colons or combinators).`
3418
+ );
3419
+ }
3420
+ const modes = ["base", "light", "dark"];
3421
+ const variables = {
3422
+ base: {},
3423
+ light: {},
3424
+ dark: {}
3425
+ };
3426
+ for (const mode of modes) {
3427
+ const collected = collectVariables(
3428
+ name,
3429
+ mode,
3430
+ options[mode]
3431
+ );
3432
+ if (!collected.ok) {
3433
+ return collected;
3434
+ }
3435
+ variables[mode] = collected.value;
3436
+ }
3437
+ if (modes.every((mode) => Object.keys(variables[mode]).length === 0)) {
3438
+ return err(
3439
+ `createTheme "${name}": no tokens were set. Pass at least one value in base, light or dark.`
3440
+ );
3441
+ }
3442
+ const blocks = [];
3443
+ if (Object.keys(variables.base).length > 0) {
3444
+ blocks.push(rule("", scope, variables.base));
3445
+ }
3446
+ if (Object.keys(variables.light).length > 0) {
3447
+ blocks.push(
3448
+ rule(":root:where([data-theme='light'])", scope, variables.light)
3449
+ );
3450
+ blocks.push(
3451
+ `@media (prefers-color-scheme: light) {
3452
+ ${indent(
3453
+ rule(
3454
+ ":root:where(:not([data-theme='dark'], .dark))",
3455
+ scope,
3456
+ variables.light
3457
+ )
3458
+ )}
3459
+ }`
3460
+ );
3461
+ }
3462
+ if (Object.keys(variables.dark).length > 0) {
3463
+ blocks.push(
3464
+ rule(":root:where([data-theme='dark'], .dark)", scope, variables.dark)
3465
+ );
3466
+ blocks.push(
3467
+ `@media (prefers-color-scheme: dark) {
3468
+ ${indent(
3469
+ rule(":root:where(:not([data-theme='light']))", scope, variables.dark)
3470
+ )}
3471
+ }`
3472
+ );
3473
+ }
3474
+ return ok({
3475
+ name,
3476
+ scope,
3477
+ css: `${blocks.join("\n\n")}
3478
+ `,
3479
+ variables
3480
+ });
3481
+ }
3482
+ function indent(block) {
3483
+ return block.split("\n").map((line) => ` ${line}`).join("\n");
3484
+ }
3485
+
3486
+ export { DATE_RANGE_PRESETS, DEFAULT_COMPARISON_LABEL, DEFAULT_CURRENCY, DEFAULT_DETAIL_PAGE_SIZE, DEFAULT_EMPTY_TEXT, DEFAULT_MAX_LAYOUT_BYTES, DEFAULT_PAGE_KEY, DEFAULT_PAGE_ROWS, DETAIL_MODES, EMPTY_LAYOUT, LAYOUT_ENVELOPE_VERSION, MAX_DETAIL_PAGE_SIZE, MAX_GRAPH_SERIES, MAX_PAGE_ROWS, MAX_PAGE_TITLE_LENGTH, MAX_PARSED_PAGES, MAX_REPORTED_PROBLEMS, MAX_TEXT_OPTION_LENGTH, MAX_WIDGET_OPTIONS, MAX_WIDGET_WIDTH, MIN_WIDGET_WIDTH, OPTION_KEY_PATTERN, THEME_TOKEN_VARIABLES, VALUE_FORMATS, WIDGET_FILLS, WIDGET_KINDS, WIDGET_OPTION_TYPES, WIDGET_SIZES, WIDTH_COLUMNS, addPage, applyClientOptions, assignPages, baseColumnSpan, cacheKeyFor, coerceOptionValue, createLayoutPersistence, createTheme, createWidgetLoader, defaultDetailQuery, defaultOptionValue, defineWidget, deriveDetailData, describeUnknownError, emptyTextFor, emptyWidget, enforceLocks, err, failedWidget, fillColumnSpans, fillWidthSpans, fillsHeight, fillsWidth, finalizeWidget, fitCount, formatCount, formatPercentChange, formatValue, fromLegacyDefinition, hasPages, hiddenWidgets, hideWidget, isClientApplied, isColumnKeyFor, isHidden, isIsoInterval, isMinimized, isSafeHref, isSafeImageUrl, isWidgetEmptyState, isWidgetKind, isWidgetVisibleTo, isWidgetWidth, itemWidth, kpiDelta, labelStride, loadingWidgets, memoryAdapter, minimizeWidget, movePage, moveWidget, moveWidgetBy, moveWidgetDown, moveWidgetToPage, moveWidgetUp, nextPageKey, niceDomain, niceStep, normalizeLayout, ok, optionValuesFor, optionsCacheSuffix, pageLayout, pageList, pageOf, pageRoom, pageWidgets, parseDetailQuery, parseLayout, parseSortValue, percentChange, placeRows, pruneLayout, queryRows, readOnly, removePage, renamePage, resolveDateRange, resolveDetailOptions, resolveOptionValues, resolvePageKey, resolvePayload, resolveTableControls, resolveWidget, resolveWidgetLock, resolveWidgetUnapplied, resolveWidgets, restoreWidget, sameOptionValues, serializeDetailQuery, serializeLayout, shareOf, showWidget, sortDefinitions, sortFromOptions, tableDetailData, toggleHidden, toggleMinimized, upgradeLegacyWidgetData, usesWidthColumns, utf8Length, validateDetailData, validateWidgetData, validateWidgetDefinition, visibleWidgets, widgetsFor, widthForSize, withEncoding, withFallback, withLogging, withPageLayout, withPrefix, withReadCache, withRetry };
3238
3487
  //# sourceMappingURL=core.js.map
3239
3488
  //# sourceMappingURL=core.js.map