@texturehq/edges 5.21.0 → 5.22.1

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/index.d.ts CHANGED
@@ -1,15 +1,15 @@
1
1
  import { BreadcrumbProps, BreadcrumbsProps, DateValue, CalendarProps as CalendarProps$1, ValidationResult, DisclosureGroupProps, DisclosurePanelProps, ButtonProps, DisclosureProps, DateRangePickerProps as DateRangePickerProps$1, FormProps, TooltipTriggerComponentProps, TooltipProps as TooltipProps$1, ListBoxProps as ListBoxProps$1, ListBoxItemProps, ModalOverlayProps, Key, PopoverProps as PopoverProps$1, ProgressBarProps as ProgressBarProps$1, RangeCalendarProps as RangeCalendarProps$1, TabProps as TabProps$1, TabListProps as TabListProps$1, TabPanelProps, TabsProps as TabsProps$2 } from 'react-aria-components';
2
2
  export { BreadcrumbProps, BreadcrumbsProps, DialogTrigger, Focusable } from 'react-aria-components';
3
- import { au as LoadingState, B as BadgeProps, av as FilterState, aw as SortState, ax as SearchConfig, ay as FacetConfig, az as FacetCounts, aA as Column, aB as CellEmphasis, aC as FieldValue, aD as BooleanFormat, aE as FormattedValue, aF as FieldFormat, aG as CurrentFormat, aH as DateFormat, aI as DistanceFormat, aJ as EnergyUnit, aK as EnergyFormat, aL as CurrencyFormat, aM as NumberFormat, aN as PhoneFormat, aO as PowerFormat, aP as FormatterFunction, aQ as ResistanceFormat, aR as TemperatureFormat, aS as TemperatureUnitString, aT as TemperatureUnit, aU as TextFormat, aV as VoltageFormat, e as BaseDataPoint, $ as YFormatType, R as TooltipData, aW as CellComponentProps, aX as CellAlignment, aY as LinkBehavior, D as DeviceState, s as GridState, aZ as ComponentFormatter, a_ as DataTableProps, a$ as LayerSpec, b0 as CustomPinsSpec, b1 as GeoJsonLayerSpec, b2 as RasterLayerSpec, b3 as VectorLayerSpec, b4 as ClusteredVectorLayerSpec, b5 as ColorSpec } from './colors-FpM-WXGA.js';
4
- export { A as ABSENT_GRID_FIELDS, a as ActionItem, b6 as ActionMenu, b as ActionMenuProps, b7 as AppShell, c as AppShellProps, b8 as Avatar, d as AvatarProps, b9 as Badge, ba as BaseFormat, C as CATEGORY_COLOR_TOKENS, f as CATEGORY_NEUTRAL_COLOR, bb as CellComponent, bc as CellContext, bd as ChartContext, g as ChartMargin, be as CodeEditor, h as CodeEditorProps, i as CodeLanguage, j as CodeTheme, bf as ComponentFormatOptions, bg as CurrentUnit, bh as CustomFormat, bi as DEFAULT_MAP_TYPE, bj as DateFormatStyle, bk as DistanceUnit, bl as ENTITY_CATEGORY_CONFIG, E as ENTITY_CONFIG, k as EntityArchetype, bm as EntityCategory, bn as EntityCategoryConfig, l as EntityConfig, m as EntityStateRule, n as EntityType, bo as FacetType, bp as FilterChip, bq as FilterCondition, br as FilterGroup, bs as FilterOperator, G as GRID_ELEMENT_TYPE_BY_ENTITY, bt as GRID_STATE_COLORS, o as GRID_STAT_LIST, bu as GRID_STAT_LIST_CAPACITOR_PER_PHASE_KVAR, bv as GRID_STAT_LIST_CAPACITOR_TOTAL_KVAR, p as GridElementSourceType, q as GridStatField, r as GridStatFieldFormat, bw as GridStateColor, H as HEADLINE_METRIC_BOUNDS, t as Heading, u as HeadlineMetric, bx as InteractiveMap, by as InteractiveMapHandle, I as InteractiveMapProps, bz as LayerCheckState, bA as LayerFeature, bB as LayerSelection, bC as LayerStyle, bD as LayerTreeNode, bE as LayerVisibilityPatch, L as Loader, v as Logo, bF as MAP_TYPES, M as MapPoint, bG as MapType, bH as Meter, w as MeterProps, x as MetricFormat, y as MetricSource, bI as MobileBreakpoint, bJ as MobileConfig, bK as MobileRenderer, bL as PercentBarCell, bM as PercentBarCellProps, P as PercentThresholdLevel, z as PercentThresholds, bN as PercentageFormat, bO as PowerUnit, bP as RenderType, bQ as ResistanceUnit, S as SegmentOption, bR as SegmentedControl, F as SegmentedControlProps, J as SerializableFieldFormat, K as SideNav, N as SideNavItem, O as SideNavProps, bS as SortConfig, bT as SortDirection, bU as StackNav, bV as StackNavGroup, bW as StackNavItem, bX as StackNavLinkComponentProps, bY as StackNavProps, bZ as StackNavRenderRow, b_ as StackNavRowRenderProps, b$ as StackNavTheme, c0 as StaticMap, Q as StaticMapProps, c1 as TableDensity, c2 as TableLayout, c3 as TableWidth, T as TextLink, c4 as TextTransform, c5 as TextTruncatePosition, U as TooltipSeries, V as TopNav, W as TopNavProps, X as UNARY_FILTER_OPERATORS, Y as UNARY_OPERATOR_LABELS, c6 as UNVERIFIED_VOLTAGE_UNIT_ROWS, Z as UnaryFilterOperator, c7 as UseInfiniteScrollOptions, c8 as UseInfiniteScrollReturn, c9 as VoltageUnit, _ as YFormatSettings, ca as ZoomStops, a0 as activeDeviceStates, cb as addFilterCondition, a1 as archetypeFor, cc as baselineFromPoint, a2 as clearColorCache, a3 as createCategoryColorMap, cd as createEmptyFilter, ce as createFilter, cf as createFilters, a4 as createXScale, a5 as createYScale, a6 as defaultMargin, a7 as deviceStateLabels, a8 as deviceStateMetricFormats, a9 as entityHasDetailPage, aa as entityHasStatList, ab as entityShowsNow, cg as filterToChips, ch as formatComponentValue, ac as getContrastingTextColor, ad as getDefaultChartColor, ae as getDefaultColors, af as getDeviceStateDisplayLabel, af as getDeviceStateLabel, ci as getEntityCategory, ag as getEntityConfig, ah as getEntityIcon, ai as getEntityLabel, aj as getEntityStatList, cj as getFilterFields, ak as getGridStateLabel, al as getResolvedColor, am as getThemeCategoricalColors, an as getYFormatSettings, ao as gridEntityTypeKeys, ap as gridStateLabels, aq as isActiveDeviceState, aq as isActiveState, ck as isFilterEmpty, ar as isGridEntityTypeKey, as as isLightColor, at as isUnaryFilterOperator, cl as mapValuesToCategoricalColors, cm as percentThresholdLevel, cn as removeFilterCondition, co as useChartContext, cp as useComponentFormatter, cq as useInfiniteScroll } from './colors-FpM-WXGA.js';
3
+ import { au as LoadingState, B as BadgeProps, av as FilterState, aw as SortState, ax as SearchConfig, ay as FacetConfig, az as FacetCounts, aA as Column, aB as CellEmphasis, aC as FieldValue, aD as BooleanFormat, aE as FormattedValue, aF as FieldFormat, aG as CurrentFormat, aH as DateFormat, aI as DistanceFormat, aJ as EnergyUnit, aK as EnergyFormat, aL as CurrencyFormat, aM as NumberFormat, aN as PhoneFormat, aO as PowerFormat, aP as FormatterFunction, aQ as ResistanceFormat, aR as TemperatureFormat, aS as TemperatureUnitString, aT as TemperatureUnit, aU as TextFormat, aV as VoltageFormat, e as BaseDataPoint, $ as YFormatType, R as TooltipData, aW as CellComponentProps, aX as CellAlignment, aY as LinkBehavior, D as DeviceState, s as GridState, aZ as ComponentFormatter, a_ as DataTableProps, a$ as TableDensity, b0 as DataTablePagination, b1 as LayerSpec, b2 as CustomPinsSpec, b3 as GeoJsonLayerSpec, b4 as RasterLayerSpec, b5 as VectorLayerSpec, b6 as ClusteredVectorLayerSpec, b7 as ColorSpec } from './colors-C4MlTwKS.js';
4
+ export { A as ABSENT_GRID_FIELDS, a as ActionItem, b8 as ActionMenu, b as ActionMenuProps, b9 as AppShell, c as AppShellProps, ba as Avatar, d as AvatarProps, bb as Badge, bc as BaseFormat, C as CATEGORY_COLOR_TOKENS, f as CATEGORY_NEUTRAL_COLOR, bd as CellComponent, be as CellContext, bf as ChartContext, g as ChartMargin, bg as CodeEditor, h as CodeEditorProps, i as CodeLanguage, j as CodeTheme, bh as ComponentFormatOptions, bi as CurrentUnit, bj as CustomFormat, bk as DEFAULT_MAP_TYPE, bl as DateFormatStyle, bm as DistanceUnit, bn as ENTITY_CATEGORY_CONFIG, E as ENTITY_CONFIG, k as EntityArchetype, bo as EntityCategory, bp as EntityCategoryConfig, l as EntityConfig, m as EntityStateRule, n as EntityType, bq as FacetType, br as FilterChip, bs as FilterCondition, bt as FilterGroup, bu as FilterOperator, G as GRID_ELEMENT_TYPE_BY_ENTITY, bv as GRID_STATE_COLORS, o as GRID_STAT_LIST, bw as GRID_STAT_LIST_CAPACITOR_PER_PHASE_KVAR, bx as GRID_STAT_LIST_CAPACITOR_TOTAL_KVAR, p as GridElementSourceType, q as GridStatField, r as GridStatFieldFormat, by as GridStateColor, H as HEADLINE_METRIC_BOUNDS, t as Heading, u as HeadlineMetric, bz as InteractiveMap, bA as InteractiveMapHandle, I as InteractiveMapProps, bB as LayerCheckState, bC as LayerFeature, bD as LayerSelection, bE as LayerStyle, bF as LayerTreeNode, bG as LayerVisibilityPatch, L as Loader, v as Logo, bH as MAP_TYPES, M as MapPoint, bI as MapType, bJ as Meter, w as MeterProps, x as MetricFormat, y as MetricSource, bK as MobileBreakpoint, bL as MobileConfig, bM as MobileRenderer, bN as PercentBarCell, bO as PercentBarCellProps, P as PercentThresholdLevel, z as PercentThresholds, bP as PercentageFormat, bQ as PowerUnit, bR as RenderType, bS as ResistanceUnit, S as SegmentOption, bT as SegmentedControl, F as SegmentedControlProps, J as SerializableFieldFormat, K as SideNav, N as SideNavItem, O as SideNavProps, bU as SortConfig, bV as SortDirection, bW as StackNav, bX as StackNavGroup, bY as StackNavItem, bZ as StackNavLinkComponentProps, b_ as StackNavProps, b$ as StackNavRenderRow, c0 as StackNavRowRenderProps, c1 as StackNavTheme, c2 as StaticMap, Q as StaticMapProps, c3 as TableLayout, c4 as TableWidth, T as TextLink, c5 as TextTransform, c6 as TextTruncatePosition, U as TooltipSeries, V as TopNav, W as TopNavProps, X as UNARY_FILTER_OPERATORS, Y as UNARY_OPERATOR_LABELS, c7 as UNVERIFIED_VOLTAGE_UNIT_ROWS, Z as UnaryFilterOperator, c8 as UseInfiniteScrollOptions, c9 as UseInfiniteScrollReturn, ca as VoltageUnit, _ as YFormatSettings, cb as ZoomStops, a0 as activeDeviceStates, cc as addFilterCondition, a1 as archetypeFor, cd as baselineFromPoint, a2 as clearColorCache, a3 as createCategoryColorMap, ce as createEmptyFilter, cf as createFilter, cg as createFilters, a4 as createXScale, a5 as createYScale, a6 as defaultMargin, a7 as deviceStateLabels, a8 as deviceStateMetricFormats, a9 as entityHasDetailPage, aa as entityHasStatList, ab as entityShowsNow, ch as filterToChips, ci as formatComponentValue, ac as getContrastingTextColor, ad as getDefaultChartColor, ae as getDefaultColors, af as getDeviceStateDisplayLabel, af as getDeviceStateLabel, cj as getEntityCategory, ag as getEntityConfig, ah as getEntityIcon, ai as getEntityLabel, aj as getEntityStatList, ck as getFilterFields, ak as getGridStateLabel, al as getResolvedColor, am as getThemeCategoricalColors, an as getYFormatSettings, ao as gridEntityTypeKeys, ap as gridStateLabels, aq as isActiveDeviceState, aq as isActiveState, cl as isFilterEmpty, ar as isGridEntityTypeKey, as as isLightColor, at as isUnaryFilterOperator, cm as mapValuesToCategoricalColors, cn as percentThresholdLevel, co as removeFilterCondition, cp as useChartContext, cq as useComponentFormatter, cr as useInfiniteScroll } from './colors-C4MlTwKS.js';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
6
6
  import * as React$1 from 'react';
7
7
  import React__default, { ReactNode, HTMLAttributes, ComponentProps, CSSProperties, Component, ErrorInfo } from 'react';
8
- import { I as Icon$1, S as Size, d as IconName$2, B as BaseInputProps } from './RichTextEditor-B_GaE_Yf.js';
9
- export { e as BaseProps, C as CUSTOM_ICON_REGISTRY, f as ClearButton, g as CustomIconName, a as DateField, D as DateFieldProps, h as Description, i as DescriptionPlacement, j as DescriptionProps, k as FieldError, l as FieldErrorProps, m as FieldGroup, n as FieldGroupProps, b as FileUpload, F as FileUploadProps, o as Input, p as InputProps, q as InputStyleProps, r as InputWrapper, L as Label, s as LabelProps, P as PhosphorIconName, c as RichTextEditor, R as RichTextEditorProps, t as getFieldGroupStyles, u as getInputBackgroundStyles, v as getInputBaseStyles, w as getInputStateStyles, x as useInputFocus } from './RichTextEditor-B_GaE_Yf.js';
8
+ import { I as Icon$1, S as Size, d as IconName$2, B as BaseInputProps } from './RichTextEditor-tUSSVqwi.js';
9
+ export { e as BaseProps, C as CUSTOM_ICON_REGISTRY, f as ClearButton, g as CustomIconName, a as DateField, D as DateFieldProps, h as Description, i as DescriptionPlacement, j as DescriptionProps, k as FieldError, l as FieldErrorProps, m as FieldGroup, n as FieldGroupProps, b as FileUpload, F as FileUploadProps, o as Input, p as InputProps, q as InputStyleProps, r as InputWrapper, L as Label, s as LabelProps, P as PhosphorIconName, c as RichTextEditor, R as RichTextEditorProps, t as getFieldGroupStyles, u as getInputBackgroundStyles, v as getInputBaseStyles, w as getInputStateStyles, x as useInputFocus } from './RichTextEditor-tUSSVqwi.js';
10
10
  import { D as DialogAction, a as DialogHeaderConfig, b as DialogFooterConfig } from './index-dofSwYId.js';
11
11
  export { c as Dialog, d as DialogForm, e as DialogProps, f as Drawer, g as DrawerForm, h as DrawerProps, F as FormActions, i as FormDivider, j as FormGrid, k as FormSection, l as FormStepper, S as SaveBar, U as UnsavedChangesPrompt, u as useWizard } from './index-dofSwYId.js';
12
- export { A as Autocomplete, B as Button, h as ButtonProps, C as Checkbox, a as CheckboxGroup, b as ColorField, i as ColorFieldProps, M as MultiSelect, j as MultiSelectMatcher, c as MultiSelectOption, k as MultiSelectProps, l as MultiSelectSelectionEntry, N as NumberField, m as Radio, n as RadioCard, R as RadioCardGroup, o as RadioCardGroupProps, p as RadioCardProps, d as RadioGroup, S as Select, q as SelectItem, e as Switch, T as TextArea, f as TextField, r as TimeField, s as defaultMultiSelectMatcher, t as filterMultiSelectOptions, u as multiSelectSearchKeys, v as multiSelectSelectionEntries, w as shouldOfferLiteralOption } from './TimeField-B6DyOZXU.js';
12
+ export { A as Autocomplete, B as Button, h as ButtonProps, C as Checkbox, a as CheckboxGroup, b as ColorField, i as ColorFieldProps, M as MultiSelect, j as MultiSelectMatcher, c as MultiSelectOption, k as MultiSelectProps, l as MultiSelectSelectionEntry, N as NumberField, m as Radio, n as RadioCard, R as RadioCardGroup, o as RadioCardGroupProps, p as RadioCardProps, d as RadioGroup, S as Select, q as SelectItem, e as Switch, T as TextArea, f as TextField, r as TimeField, s as defaultMultiSelectMatcher, t as filterMultiSelectOptions, u as multiSelectSearchKeys, v as multiSelectSelectionEntries, w as shouldOfferLiteralOption } from './TimeField-CVfhh7Rc.js';
13
13
  import { ScaleTime, ScaleLinear, ScaleBand } from 'd3-scale';
14
14
  import { Icon } from '@phosphor-icons/react';
15
15
  import { Map } from 'mapbox-gl';
@@ -1275,6 +1275,8 @@ interface ContactMetaDisplayProps {
1275
1275
  * When provided, adds data-pii-* attributes for the Curtain extension
1276
1276
  */
1277
1277
  piiEntity?: string;
1278
+ /** PII type of the primary label when an email stands in for a missing name. */
1279
+ piiPrimaryTextType?: "full-name" | "email";
1278
1280
  }
1279
1281
  /**
1280
1282
  * ContactMetaDisplay
@@ -1311,7 +1313,7 @@ interface ContactMetaDisplayProps {
1311
1313
  * />
1312
1314
  * ```
1313
1315
  */
1314
- declare function ContactMetaDisplay({ firstName, lastName, email, avatarUrl, layout, size, href, LinkComponent, linkVariant, emphasis, showEmail, badge, avatarShape, isLoading, className, piiEntity, }: ContactMetaDisplayProps): react_jsx_runtime.JSX.Element;
1316
+ declare function ContactMetaDisplay({ firstName, lastName, email, avatarUrl, layout, size, href, LinkComponent, linkVariant, emphasis, showEmail, badge, avatarShape, isLoading, className, piiEntity, piiPrimaryTextType, }: ContactMetaDisplayProps): react_jsx_runtime.JSX.Element;
1315
1317
 
1316
1318
  /**
1317
1319
  * ContainerQueryProvider — measures its own width via ResizeObserver and
@@ -2067,9 +2069,142 @@ declare const createFormat: <T extends FieldFormat["type"]>(type: T, options?: O
2067
2069
  type: T;
2068
2070
  }>;
2069
2071
 
2072
+ /** The camera: the visible time window, absolute epoch ms. */
2073
+ type Viewport = {
2074
+ startMs: number;
2075
+ endMs: number;
2076
+ };
2077
+ /** One rung of the resolution ladder. */
2078
+ type Tier = {
2079
+ id: string;
2080
+ bucketMs: number;
2081
+ tileSpanMs: number;
2082
+ };
2083
+ type ResolutionLadder = Tier[];
2084
+ /** A fixed-grid data slice: tile `index` at `tierId`, covering [startMs, endMs). */
2085
+ type TileRef = {
2086
+ tierId: string;
2087
+ index: number;
2088
+ startMs: number;
2089
+ endMs: number;
2090
+ };
2091
+ /** Data a tile carries. `band` optional → engine is metric-agnostic.
2092
+ * `lines` carries additional named series (e.g. export/net flows) that
2093
+ * stitch with the same dedup-by-timestamp semantics as `line`. */
2094
+ type TileData = {
2095
+ line: BaseDataPoint[];
2096
+ band?: BaseDataPoint[];
2097
+ lines?: Record<string, BaseDataPoint[]>;
2098
+ };
2099
+ /** Injected loader: one tile = one bounded fetch. */
2100
+ type FetchTileContext = {
2101
+ reason: "load" | "refresh";
2102
+ /** Check before adapter side effects such as shared-cache writes. */
2103
+ isCurrent?: () => boolean;
2104
+ };
2105
+ type FetchTile = (tier: Tier, startMs: number, endMs: number, signal: AbortSignal, context?: FetchTileContext) => Promise<TileData>;
2106
+ declare const tileKey: (tierId: string, index: number) => string;
2107
+ declare const hasTileData: (data?: TileData) => boolean;
2108
+
2109
+ /**
2110
+ * Pick the finest tier whose bucket is coarse enough to hit ~targetPointsPerPx
2111
+ * across the chart and is not finer than the series' native cadence.
2112
+ */
2113
+ declare function tierForViewport(spanMs: number, widthPx: number, ladder: ResolutionLadder, opts: {
2114
+ targetPointsPerPx: number;
2115
+ nativeMs: number;
2116
+ }): Tier;
2117
+
2118
+ type TileStatus = "loading" | "loaded" | "empty" | "error";
2119
+ type TileEntry = {
2120
+ status: TileStatus;
2121
+ data?: TileData;
2122
+ error?: Error;
2123
+ refreshing?: boolean;
2124
+ revision?: number;
2125
+ revalidated?: boolean;
2126
+ };
2127
+ type TileStore = ReadonlyMap<string, TileEntry>;
2128
+ type TileAction = {
2129
+ type: "request";
2130
+ ids: string[];
2131
+ refresh?: boolean;
2132
+ } | {
2133
+ type: "cancel";
2134
+ ids: string[];
2135
+ } | {
2136
+ type: "fulfilled";
2137
+ id: string;
2138
+ data: TileData;
2139
+ refresh?: boolean;
2140
+ } | {
2141
+ type: "failed";
2142
+ id: string;
2143
+ error: Error;
2144
+ } | {
2145
+ type: "reset";
2146
+ };
2147
+ declare const emptyStore: TileStore;
2148
+ declare function tileReducer(store: TileStore, action: TileAction): TileStore;
2149
+
2150
+ type Coverage = {
2151
+ earliestMs?: number;
2152
+ latestMs?: number;
2153
+ erroredTiles: number;
2154
+ };
2155
+ type AssembledSeries = {
2156
+ line: BaseDataPoint[];
2157
+ band: BaseDataPoint[];
2158
+ lines: Record<string, BaseDataPoint[]>;
2159
+ renderTier: Tier | null;
2160
+ targetTier: Tier;
2161
+ isFallback: boolean;
2162
+ isStale: boolean;
2163
+ coverage: Coverage;
2164
+ };
2165
+ type AssembleSeriesArgs = {
2166
+ viewport: Viewport;
2167
+ targetTier: Tier;
2168
+ ladder: ResolutionLadder;
2169
+ store: TileStore;
2170
+ overscanTiles: number;
2171
+ prev?: AssembledSeries | null;
2172
+ prevViewport?: Viewport | null;
2173
+ maxFutureMs?: number;
2174
+ };
2175
+ declare function assembleSeries({ viewport, targetTier, ladder, store, overscanTiles, prev, prevViewport, maxFutureMs, }: AssembleSeriesArgs): AssembledSeries;
2176
+
2177
+ declare function tileIndexAt(tsMs: number, tier: Tier): number;
2178
+ declare function tilesForViewport(viewport: Viewport, tier: Tier, overscanTiles: number): TileRef[];
2179
+
2070
2180
  type AreaSeriesBaseline = number | ((point: BaseDataPoint, index: number) => number);
2071
2181
  interface AreaSeriesProps {
2072
- data: BaseDataPoint[];
2182
+ /**
2183
+ * The points to draw.
2184
+ *
2185
+ * Optional ONLY inside a streaming chart, where the points do not exist until
2186
+ * the reader looks at a window: there the child names its stream with
2187
+ * `seriesKey` and the chart supplies `data` before this component renders. In
2188
+ * an ordinary chart it is required in practice — a series with neither is
2189
+ * skipped rather than drawn.
2190
+ */
2191
+ data?: BaseDataPoint[];
2192
+ /**
2193
+ * Which stream this series draws, in a chart with a streaming `source`.
2194
+ *
2195
+ * Defaults to `"line"`, the primary stream. Ignored entirely by a chart that
2196
+ * holds its own data, so the same `<AreaSeries>` serves both sources.
2197
+ */
2198
+ seriesKey?: string;
2199
+ /**
2200
+ * Relabel this series once its points arrive, in a streaming chart.
2201
+ *
2202
+ * Declared here rather than only on the chart because the element carrying it
2203
+ * is this one; the streaming branch reads it, resolves it against every
2204
+ * assembled stream, and passes the result down as `label`. This component
2205
+ * never calls it — by the time it renders, `label` is already the answer.
2206
+ */
2207
+ labelFromData?: (plotted: BaseDataPoint[], series: AssembledSeries) => string;
2073
2208
  color?: string;
2074
2209
  label?: string;
2075
2210
  categoryColors?: Record<string, string>;
@@ -2117,7 +2252,24 @@ interface AreaSeriesProps {
2117
2252
  declare const AreaSeries: React__default.FC<AreaSeriesProps>;
2118
2253
 
2119
2254
  interface BarSeriesProps {
2120
- data: BaseDataPoint[];
2255
+ /**
2256
+ * The points to draw.
2257
+ *
2258
+ * Optional ONLY inside a streaming chart, where the points do not exist until
2259
+ * the reader looks at a window: there the child names its stream with
2260
+ * `seriesKey` and the chart supplies `data` before this component renders. In
2261
+ * an ordinary chart it is required in practice — a series with neither
2262
+ * renders nothing rather than throwing.
2263
+ */
2264
+ data?: BaseDataPoint[];
2265
+ /**
2266
+ * Which stream this series draws, in a chart with a streaming `source`.
2267
+ *
2268
+ * Defaults to `"line"`, the primary stream — the same default `AreaSeries`
2269
+ * and `LineSeries` use, so the same child serves both sources. Ignored
2270
+ * entirely by a chart that holds its own data.
2271
+ */
2272
+ seriesKey?: string;
2121
2273
  color?: string;
2122
2274
  label?: string;
2123
2275
  opacity?: number;
@@ -2147,6 +2299,8 @@ interface CategoryBarChartProps {
2147
2299
  width?: number;
2148
2300
  /** Height of the chart (auto-resizes to container if not provided) */
2149
2301
  height?: number;
2302
+ /** Scale the fixed coordinate system to the container width for static displays. Requires both width and height; otherwise uses normal responsive sizing. Disables tooltips when active. */
2303
+ scaleToFit?: boolean;
2150
2304
  /** Margin around the chart area */
2151
2305
  margin?: {
2152
2306
  top: number;
@@ -2199,16 +2353,22 @@ interface AxisBottomProps {
2199
2353
  width: number;
2200
2354
  }
2201
2355
  interface AxisLeftProps {
2356
+ /** Optional start-aligned label position relative to the axis. */
2357
+ labelLeft?: number;
2202
2358
  left: number;
2203
2359
  scale: ScaleLinear<number, number>;
2204
2360
  yFormatter: YFormatType;
2205
2361
  height?: number;
2206
2362
  }
2363
+ /** Space for the widest formatted numeric tick plus its gap to the plot. */
2364
+ declare function getNumericAxisGutter(scale: ScaleLinear<number, number>, yFormatter: YFormatType, height?: number): number;
2207
2365
  interface CategoryAxisBottomProps {
2208
2366
  top: number;
2209
2367
  scale: ScaleBand<string>;
2210
2368
  }
2211
2369
  interface CategoryAxisLeftProps {
2370
+ /** Label start relative to the axis; omitted preserves end-aligned ticks. */
2371
+ labelLeft?: number;
2212
2372
  left: number;
2213
2373
  scale: ScaleBand<string>;
2214
2374
  /**
@@ -2320,6 +2480,15 @@ interface ChartBottomBarProps {
2320
2480
  isZoomed?: boolean;
2321
2481
  onResetZoom?: () => void;
2322
2482
  onLegendItemToggle?: (category: string) => void;
2483
+ /**
2484
+ * Drop the Export control, keeping the legend. Distinct from `hideBottomBar` on the engines,
2485
+ * which removes both — a chart can want the legend and not the export affordance.
2486
+ *
2487
+ * Scoped to Export alone: it shares a row with Reset Zoom, which is not an export affordance and
2488
+ * appears only while a chart IS zoomed. Hiding it alongside Export stranded the reader in a
2489
+ * zoomed view with no way back.
2490
+ */
2491
+ hideExport?: boolean;
2323
2492
  }
2324
2493
  interface LegendItem {
2325
2494
  category: string;
@@ -2350,947 +2519,1605 @@ declare const LegendItem: React__default.FC<{
2350
2519
  */
2351
2520
  declare const ChartBottomBar: React__default.FC<ChartBottomBarProps>;
2352
2521
 
2353
- interface ChartContainerProps {
2354
- children: React__default.ReactNode;
2355
- parentWidth: number;
2356
- parentHeight: number;
2522
+ /**
2523
+ * Which plotted series the readout should inspect.
2524
+ *
2525
+ * ── Why a named kind and not a function ───────────────────────────────────────
2526
+ * A streaming chart can be driven from stored JSON, and a render-prop is exactly
2527
+ * what such a caller cannot hold. The set of things worth reading "latest data"
2528
+ * out of is small and closed — a single plotted series, a net band plus its
2529
+ * average line, or an import/export pair — so naming them costs nothing and buys
2530
+ * the whole affordance for a declarative caller.
2531
+ *
2532
+ * `single` is the general case and the others are named for the shape they read,
2533
+ * not for the domain that happens to use them: this file knows nothing about
2534
+ * meters.
2535
+ */
2536
+ type LatestDataReadoutKind = "single" | "band" | "pair";
2537
+
2538
+ interface TiledTimeSeriesLiveControl {
2539
+ label: string;
2540
+ checked: boolean;
2541
+ onChange: (checked: boolean) => void;
2542
+ /** Healthy requires a delivered signal and current measurement evidence where available. */
2543
+ status: "live" | "connecting" | "reconnecting" | "stale" | "delayed" | "refresh-failed";
2544
+ disabledReason?: string | undefined;
2545
+ /** Optional cadence context owned by the consumer, shown while waiting for an update. */
2546
+ waitingDescription?: string | undefined;
2547
+ }
2548
+
2549
+ /**
2550
+ * Window size for data aggregation
2551
+ * Matches GraphQL WindowSize enum, plus the telemetry-only rungs below it:
2552
+ * FIVE_MINUTES and ONE_MINUTE are `TelemetryBucketSize` capabilities that no
2553
+ * metrics query offers. ONE_MINUTE is served only by a power-quality sensor —
2554
+ * meters report at 5m or coarser — so a chart offering it must say so with its
2555
+ * own `windowSizeOptions` rather than relying on the defaults below.
2556
+ */
2557
+ type WindowSize = "ONE_MINUTE" | "FIVE_MINUTES" | "FIFTEEN_MINUTES" | "HOUR" | "DAY" | "WEEK" | "MONTH" | "YEAR";
2558
+ /**
2559
+ * Date range with native Date objects
2560
+ */
2561
+ interface TimeRange {
2562
+ after: Date;
2563
+ before: Date;
2564
+ }
2565
+ /**
2566
+ * Preset range option
2567
+ */
2568
+ interface PresetRange {
2569
+ id: string;
2570
+ label: string;
2571
+ getRange: () => TimeRange;
2572
+ }
2573
+ /**
2574
+ * Window size option
2575
+ */
2576
+ interface WindowSizeOption {
2577
+ id: WindowSize;
2578
+ label: string;
2579
+ }
2580
+ /**
2581
+ * Props for TimeControls component
2582
+ */
2583
+ interface TimeControlsProps {
2357
2584
  /**
2358
- * Accessible name for the chart, rendered as the SVG `<title>`. Required so
2359
- * that screen readers announce what each chart shows; every chart needs its
2360
- * own, and there is deliberately no default to fall back to.
2585
+ * Current date range
2361
2586
  */
2362
- title: string;
2587
+ dateRange: TimeRange;
2363
2588
  /**
2364
- * Y-axis formatter using the main formatting system
2365
- * Accepts ComponentFormatter types (string shorthand or full options)
2366
- * @example "energy", "currency", { type: "temperature", unit: "F" }
2589
+ * Callback when date range changes. `meta.presetId` is set when the change
2590
+ * came from choosing a preset (vs. the calendar picker).
2367
2591
  */
2368
- yFormatter?: YFormatType;
2592
+ onDateRangeChange: (range: TimeRange, meta?: {
2593
+ presetId?: string;
2594
+ }) => void;
2369
2595
  /**
2370
- * Explicit y-axis domain `[min, max]`. Overrides the default behavior of
2371
- * anchoring the axis at zero for all-positive data. Use for deviation-style
2372
- * metrics (voltage ~240V, frequency ~60Hz, power factor ~1.0) where the
2373
- * signal is variation around a nominal value, not magnitude from zero.
2596
+ * Current window size (optional)
2374
2597
  */
2375
- yDomain?: [number, number];
2598
+ windowSize?: WindowSize;
2376
2599
  /**
2377
- * Horizontal reference lines drawn across the plot at fixed y-values — e.g.
2378
- * regulatory limits (ANSI voltage bounds), targets, or thresholds. Rendered
2379
- * as dashed lines with an optional right-aligned label.
2600
+ * Callback when window size changes (optional)
2380
2601
  */
2381
- referenceLines?: {
2382
- value: number;
2383
- label?: string;
2384
- color?: string;
2385
- }[];
2386
- isLoading?: boolean;
2387
- /** Enable scroll-to-zoom and pan on main chart */
2388
- enableZoom?: boolean;
2389
- /** Show brush overview chart below */
2390
- enableBrush?: boolean;
2391
- /** Height of brush chart (default: 60px) */
2392
- brushHeight?: number;
2602
+ onWindowSizeChange?: (size: WindowSize) => void;
2393
2603
  /**
2394
- * Notification callback when the zoom range changes.
2395
- *
2396
- * Fires on every transition, including the initial `null` render. Use this
2397
- * for one-way "observe the zoom" plumbing (e.g. driving an external panel
2398
- * showing the current window).
2399
- *
2400
- * In controlled-zoom mode (when the `zoomDomain` prop is provided), this is
2401
- * ALSO the change callback the parent uses to update its own state —
2402
- * mirroring the `onHiddenSeriesChange` pattern. The parent should treat the
2403
- * incoming `domain` argument as the next value to commit to its state.
2604
+ * Whether to show window size selector
2605
+ * @default true
2404
2606
  */
2405
- onZoomChange?: (domain: [Date, Date] | null) => void;
2607
+ showWindowSize?: boolean;
2406
2608
  /**
2407
- * Controlled zoom domain. When provided, ChartContainer uses this value
2408
- * instead of its internal useState (controlled mode). Mirrors the
2409
- * `hiddenSeriesLabels` pattern — useful when an inline + dialog instance
2410
- * pair need to share zoom state (see BOLT-1160 Phase 3 / SiteEnergyCharts).
2411
- *
2412
- * Pass `null` for "full domain, no zoom". Omit entirely to use the default
2413
- * uncontrolled behaviour (ChartContainer manages its own zoom state).
2414
- *
2415
- * When controlled, the visx Zoom transform is kept in sync with the
2416
- * incoming prop via an internal effect, so brush + scroll-zoom + reset
2417
- * all continue to work — they just route the new domain through
2418
- * `onZoomChange` to the parent, which echoes it back via the prop.
2609
+ * Auto-adjust window size based on date range
2610
+ * @default false
2419
2611
  */
2420
- zoomDomain?: [Date, Date] | null;
2612
+ autoAdjustWindowSize?: boolean;
2421
2613
  /**
2422
- * Controlled set of hidden series labels. When provided, ChartContainer
2423
- * uses this value instead of its internal useState (controlled mode).
2424
- * Omit to use the default uncontrolled behaviour.
2614
+ * Whether to show range selector presets
2615
+ * @default true
2425
2616
  */
2426
- hiddenSeriesLabels?: Set<string>;
2617
+ showRangeSelector?: boolean;
2427
2618
  /**
2428
- * Called when the user toggles a legend item in controlled mode.
2429
- * Accepts either the next Set directly or a functional updater
2430
- * `(prev: Set<string>) => Set<string>` — the latter lets parents compose
2431
- * rapid sequential toggles correctly (each sees the latest prev rather than
2432
- * the stale render-closure value). Only called when `hiddenSeriesLabels`
2433
- * prop is provided.
2434
- */
2435
- onHiddenSeriesChange?: (updater: Set<string> | ((prev: Set<string>) => Set<string>)) => void;
2436
- /**
2437
- * Hide the bottom bar (legend + export button). Useful for small/embedded
2438
- * charts — e.g. inline sparklines — where the legend and export affordance
2439
- * add unwanted chrome. Defaults to false (bottom bar shown) to preserve
2440
- * existing behavior for all current consumers.
2441
- */
2442
- hideBottomBar?: boolean;
2443
- /** Trailing actions rendered in the `ChartHeader`, opposite the title. */
2444
- headerActions?: React__default.ReactNode;
2445
- /** Control cluster rendered in the `ChartHeader` — `TimeControls` today. */
2446
- headerControls?: React__default.ReactNode;
2447
- }
2448
- /**
2449
- * Default plot-body height for a chart block, in px. Pairs with `CHART_HEADER_HEIGHT`.
2450
- *
2451
- * It lives here rather than in each block because four blocks had four private copies of `280`
2452
- * that happened to agree, with nothing enforcing the agreement — a design change to chart height
2453
- * was a four-file diff where three files could be forgotten and nothing failed. This is `P10 R-23`.
2454
- *
2455
- * A block that needs a different body height passes its own; this is the value it starts from.
2456
- */
2457
- declare const DEFAULT_CHART_HEIGHT = 280;
2458
- /**
2459
- * ChartContainer
2460
- *
2461
- * Main chart wrapper component that provides context and layout for chart visualizations.
2462
- * Handles scaling, tooltips, axes, and data management for area, line, and bar charts.
2463
- */
2464
- declare const ChartContainer: React__default.FC<Omit<ChartContainerProps, "parentWidth" | "parentHeight"> & {
2465
- parentWidth?: number;
2466
- parentHeight?: number;
2467
- }>;
2468
-
2469
- /**
2470
- * Event marker type — shared by ChartEventMarkers and ChartEventSpans.
2471
- */
2472
- type EventMarkerType = "command" | "alert" | "info" | "success" | "warning" | "error";
2473
- /**
2474
- * Get the resolved color for a given event marker type.
2475
- * Uses getResolvedColor to ensure CSS variables work in SVG context.
2476
- */
2477
- declare function getEventColor(type: EventMarkerType | undefined): string;
2478
-
2479
- /**
2480
- * Event marker data point
2481
- */
2482
- interface EventMarker {
2483
- /**
2484
- * Event timestamp
2619
+ * Whether to show calendar date picker button
2620
+ * @default false
2485
2621
  */
2486
- timestamp: Date;
2622
+ allowDatePicker?: boolean;
2487
2623
  /**
2488
- * Event label/name
2624
+ * Whether window size is locked (read-only)
2625
+ * @default false
2489
2626
  */
2490
- label: string;
2627
+ lockWindowSize?: boolean;
2491
2628
  /**
2492
- * Optional event type for styling
2629
+ * Whether to show the built-in Reset button beside the calendar picker. It
2630
+ * returns to the first preset. Turn off in views that own their own reset
2631
+ * with different semantics (e.g. pan/zoom explorers returning to the last
2632
+ * explicit selection).
2633
+ * @default true
2493
2634
  */
2494
- type?: EventMarkerType;
2635
+ showReset?: boolean;
2495
2636
  /**
2496
- * Optional per-marker color override; takes precedence over the component-level color prop
2637
+ * Restrict to single day selection (uses Calendar instead of RangeCalendar)
2638
+ * @default false
2497
2639
  */
2498
- color?: string;
2640
+ restrictToSingleDay?: boolean;
2499
2641
  /**
2500
- * Optional metadata to display in tooltip
2642
+ * Available preset range options
2501
2643
  */
2502
- metadata?: Record<string, string | number>;
2503
- }
2504
- interface ChartEventMarkersProps {
2644
+ presetRanges?: PresetRange[];
2505
2645
  /**
2506
- * Array of event markers to display
2646
+ * Available window size options
2507
2647
  */
2508
- events: EventMarker[];
2648
+ windowSizeOptions?: WindowSizeOption[];
2509
2649
  /**
2510
- * Marker color for every event that does not carry its own `color`
2511
- * (defaults to a theme-aware color per event `type`)
2650
+ * Control size, matching the shared `Button` / `Select` scale.
2651
+ *
2652
+ * Defaults to `md`, which is what this component always rendered. `sm` exists
2653
+ * for a caller placing these beside smaller controls — a chart header, where
2654
+ * `md` here stood 39px next to 33px selects and read as a mismatch rather
2655
+ * than a hierarchy.
2512
2656
  */
2513
- color?: string;
2657
+ size?: "sm" | "md";
2514
2658
  /**
2515
- * Whether to show labels above markers
2516
- * @default false
2659
+ * Additional CSS classes
2517
2660
  */
2518
- showLabels?: boolean;
2661
+ className?: string;
2519
2662
  }
2520
2663
  /**
2521
- * ChartEventMarkers
2664
+ * TimeControls
2522
2665
  *
2523
- * Renders vertical lines with markers for events (e.g., commands) on a chart.
2524
- * Must be used as a child of ChartContainer to access chart context.
2666
+ * Sophisticated time control component with responsive behavior and calendar integration.
2667
+ * Features preset ranges, custom date picker, and window size selection.
2668
+ *
2669
+ * **Responsive Behavior:**
2670
+ * - < 600px: Compact mode with Select dropdowns
2671
+ * - ≥ 600px: Expanded mode with ToggleButton group for presets
2525
2672
  *
2526
2673
  * @example
2527
2674
  * ```tsx
2528
- * <ChartContainer title="Device power">
2529
- * <AreaSeries data={data} label="Power" />
2530
- * <ChartEventMarkers
2531
- * events={[
2532
- * { timestamp: new Date('2024-01-01T10:00:00Z'), label: 'Command sent', type: 'command' },
2533
- * { timestamp: new Date('2024-01-01T12:00:00Z'), label: 'Alert triggered', type: 'alert' }
2534
- * ]}
2535
- * />
2536
- * </ChartContainer>
2675
+ * const [dateRange, setDateRange] = useState({
2676
+ * after: subDays(new Date(), 7),
2677
+ * before: new Date()
2678
+ * });
2679
+ * const [windowSize, setWindowSize] = useState<WindowSize>("HOUR");
2680
+ *
2681
+ * <TimeControls
2682
+ * dateRange={dateRange}
2683
+ * onDateRangeChange={setDateRange}
2684
+ * windowSize={windowSize}
2685
+ * onWindowSizeChange={setWindowSize}
2686
+ * presetRanges={presetRanges}
2687
+ * allowDatePicker
2688
+ * />
2537
2689
  * ```
2538
2690
  */
2539
- declare function ChartEventMarkers({ events, color, showLabels }: ChartEventMarkersProps): react_jsx_runtime.JSX.Element | null;
2691
+ declare function TimeControls({ dateRange, onDateRangeChange, windowSize, onWindowSizeChange, showWindowSize, showRangeSelector, allowDatePicker, lockWindowSize, showReset, restrictToSingleDay, presetRanges, windowSizeOptions, autoAdjustWindowSize, size, className, }: TimeControlsProps): react_jsx_runtime.JSX.Element;
2540
2692
 
2693
+ type ClassicPresetId = "day" | "week" | "month";
2541
2694
  /**
2542
- * A time span to render as a translucent highlight band on a chart.
2695
+ * The standard ladder for classic (non-tiled) charts. Labels are supplied by the
2696
+ * caller rather than baked in, because consumers localize them — edges owns the
2697
+ * ids and ranges, which is the part that was duplicated per chart and drifted.
2543
2698
  */
2544
- interface EventSpan {
2545
- /** Start of the span */
2546
- start: Date;
2547
- /** End of the span */
2548
- end: Date;
2549
- /** Human-readable label shown in tooltip */
2550
- label: string;
2551
- /** Optional type for color coding */
2552
- type?: EventMarkerType;
2553
- /** Optional per-span color override; takes precedence over the component-level color prop */
2554
- color?: string;
2555
- /** Optional metadata to display in tooltip */
2556
- metadata?: Record<string, string | number>;
2699
+ declare function classicPresetRanges(labels: Record<ClassicPresetId, string>, getAnchorEndMs?: () => number): PresetRange[];
2700
+ /**
2701
+ * The standard telemetry time-range ladder. `getAnchorEndMs` is called at press
2702
+ * time, not build time, so a long-lived view jumps to a fresh "now" (or stays
2703
+ * pinned to a scrubbed instant under time travel).
2704
+ */
2705
+ declare function telemetryPresetRanges(getAnchorEndMs?: () => number): PresetRange[];
2706
+
2707
+ type TiledCameraPreviewDomain = [number, number] | null;
2708
+ interface TiledCameraSyncGroup {
2709
+ publish(source: object, preview: TiledCameraPreviewDomain): void;
2710
+ subscribe(source: object, onPreview: (preview: TiledCameraPreviewDomain) => void): () => void;
2557
2711
  }
2558
- interface ChartEventSpansProps {
2712
+ /**
2713
+ * Shared camera for a set of TiledTimeSeriesCharts: pass one group to each
2714
+ * chart's `cameraSync` prop and an in-progress pan/zoom on any chart previews
2715
+ * live on the others, frame-by-frame. Purely imperative — sibling charts apply
2716
+ * the previewed domain as a plot-group transform and axis re-tick, so nothing
2717
+ * re-renders through React until the gesture settles.
2718
+ */
2719
+ declare function createTiledCameraSyncGroup(): TiledCameraSyncGroup;
2720
+
2721
+ interface TiledTimeSeriesChartViewport {
2722
+ startMs: number;
2723
+ endMs: number;
2724
+ }
2725
+ interface TiledTimeSeriesChartProps {
2726
+ /** Drop the Export control while keeping the legend. See `ChartBottomBarProps.hideExport`. */
2727
+ hideExport?: boolean;
2559
2728
  /**
2560
- * Array of event spans to render as translucent bands.
2729
+ * Series labels the legend shows struck through and the plot omits. Controlled only — the
2730
+ * caller owns the set, because the thing a reader toggles is usually a group of series (every
2731
+ * signal on one phase) rather than the one label they clicked.
2561
2732
  */
2562
- spans: EventSpan[];
2733
+ hiddenSeriesLabels?: ReadonlySet<string>;
2734
+ /** Makes the legend clickable. Receives the label of the item pressed. */
2735
+ onLegendItemToggle?: (label: string) => void;
2563
2736
  /**
2564
- * Override fill opacity (default 0.25). Hover state doubles this up to a cap.
2737
+ * Legend entries to show INSTEAD of one per series.
2738
+ *
2739
+ * For a chart whose series are a cross-product the reader does not think in: three phases × three
2740
+ * signals is nine lines, but the questions are "which phases?" and "which signals?" — six
2741
+ * entries, not nine. The caller maps an entry back to the series it governs and answers with
2742
+ * `hiddenSeriesLabels`, so this prop is presentation only; it never decides what is drawn.
2743
+ */
2744
+ legend?: {
2745
+ category: string;
2746
+ fill: string;
2747
+ isHidden?: boolean;
2748
+ }[];
2749
+ /**
2750
+ * Moments worth flagging on the time axis.
2751
+ *
2752
+ * `point` is the reading that caused the mark. Hovering shows that one value, not the series the
2753
+ * plot happens to be drawing — the mark exists because of a single sample, and answering with
2754
+ * five other numbers makes the reader hunt for the one that crossed. It is shown even when that
2755
+ * series is hidden, since the mark is the only trace of it left on screen.
2565
2756
  */
2566
- opacity?: number;
2757
+ xMarkers?: {
2758
+ timeMs: number;
2759
+ label: string;
2760
+ color?: string;
2761
+ point?: {
2762
+ label: string;
2763
+ value: number;
2764
+ };
2765
+ }[];
2766
+ /** AreaSeries / LineSeries children. */
2767
+ children: React__default.ReactNode;
2567
2768
  /**
2568
- * Override fill color for all spans (defaults to getEventColor(span.type)).
2769
+ * Accessible name for the chart, rendered as the SVG `<title>`. Required so
2770
+ * that screen readers announce what each chart shows; every chart needs its
2771
+ * own, and there is deliberately no default to fall back to.
2569
2772
  */
2570
- color?: string;
2773
+ title: string;
2774
+ /** Trailing actions rendered in the `ChartHeader`, opposite the title. */
2775
+ headerActions?: React__default.ReactNode;
2776
+ /** Control cluster rendered in the `ChartHeader` — `TimeControls` today. */
2777
+ headerControls?: React__default.ReactNode;
2778
+ /** The camera. Drives the x-scale directly, decoupled from the data extent. */
2779
+ viewport: TiledTimeSeriesChartViewport;
2780
+ /** Optional clamp for pan gestures. New viewports stay within these bounds. */
2781
+ panBounds?: TiledTimeSeriesChartViewport;
2782
+ /** Resolve current pan bounds at gesture commit without updating the plotted viewport. */
2783
+ getPanBounds?: (() => TiledTimeSeriesChartViewport) | undefined;
2784
+ /** Committed once per settled gesture (drag/wheel), with the new ms viewport. */
2785
+ onViewportChange: (viewport: TiledTimeSeriesChartViewport) => void;
2786
+ /** Measured PLOT width (after margins), for level-of-detail / tile resolution. */
2787
+ onPlotWidthChange?: (widthPx: number) => void;
2788
+ yFormatter?: YFormatType;
2789
+ /** Explicit bounds or a domain derived from visible geometry, including connected bracketing samples. */
2790
+ yDomain?: [number, number] | ((data: BaseDataPoint[]) => [number, number]);
2791
+ /** Horizontal reference lines (regulatory limits, thresholds). */
2792
+ referenceLines?: {
2793
+ value: number;
2794
+ label?: string;
2795
+ color?: string;
2796
+ }[];
2797
+ /**
2798
+ * Shared camera group (see `createTiledCameraSyncGroup`). While a gesture is
2799
+ * in progress on any chart in the group, the others mirror its live camera
2800
+ * frame-by-frame; the settled commit still arrives via `onViewportChange`.
2801
+ */
2802
+ cameraSync?: TiledCameraSyncGroup;
2803
+ parentWidth?: number;
2804
+ parentHeight?: number;
2571
2805
  }
2572
2806
  /**
2573
- * ChartEventSpans
2574
- *
2575
- * Renders translucent rectangular bands representing time spans (e.g., scheduled command windows)
2576
- * on a chart. Must be used as a child of ChartContainer to access chart context.
2577
- *
2578
- * Renders BEFORE ChartEventMarkers so the vertical marker lines appear on top of the span bands.
2807
+ * TiledTimeSeriesChart
2579
2808
  *
2580
- * @example
2581
- * ```tsx
2582
- * <ChartContainer title="Device power">
2583
- * <LineSeries data={data} label="Power" />
2584
- * <ChartEventSpans
2585
- * spans={[
2586
- * { start: new Date('2024-01-01T12:00:00Z'), end: new Date('2024-01-01T14:00:00Z'), label: 'Scheduled window', type: 'command' }
2587
- * ]}
2588
- * />
2589
- * <ChartEventMarkers events={markers} />
2590
- * </ChartContainer>
2591
- * ```
2809
+ * Camera-mode time-series chart for the meter telemetry explorer. A parent-owned
2810
+ * `viewport` (ms) drives the x-scale directly — decoupled from the loaded data
2811
+ * extent — and pan/zoom gestures commit a new viewport once per settled gesture.
2812
+ * The data is assumed pre-bounded to the viewport (± overscan) upstream, so the
2813
+ * series group is wrapped in a plot-area clip and series animation is disabled.
2592
2814
  */
2593
- declare function ChartEventSpans({ spans, opacity, color }: ChartEventSpansProps): react_jsx_runtime.JSX.Element | null;
2594
-
2595
- /**
2596
- * The height the header is assumed to claim before it has been measured, in px.
2815
+ declare const TiledTimeSeriesChart: React__default.FC<Omit<TiledTimeSeriesChartProps, "parentWidth" | "parentHeight"> & {
2816
+ parentWidth?: number;
2817
+ parentHeight?: number;
2818
+ }>;
2819
+
2820
+ interface TiledTimeSeriesSource {
2821
+ fetchTile: FetchTile;
2822
+ ladder: ResolutionLadder;
2823
+ nativeMs: number;
2824
+ resetKey: string;
2825
+ /** Revalidate visible tiles without discarding the plot. */
2826
+ refreshKey?: string | undefined;
2827
+ /** Cancel automatic refreshes while preserving manual navigation. */
2828
+ refreshEnabled?: boolean | undefined;
2829
+ tileCostSeriesCount: number;
2830
+ }
2831
+ interface TiledTimeSeriesView {
2832
+ targetTierId: string;
2833
+ renderedTierId: string | null;
2834
+ viewport: {
2835
+ startMs: number;
2836
+ endMs: number;
2837
+ };
2838
+ followingLatest: boolean;
2839
+ /** Relative Now navigation intent, independent of whether live updates are enabled. */
2840
+ atLiveEdge?: boolean | undefined;
2841
+ }
2842
+ /**
2843
+ * One additional plot drawn on this explorer's camera.
2597
2844
  *
2598
- * This was once the whole story — a constant both engines subtracted from the
2599
- * measured parent height. `TimeControls` ended that: it is `w-full flex-wrap`,
2600
- * so a header hosting it is two rows at narrow widths and one row at wide ones.
2601
- * No constant describes that, and a constant that disagrees with the render is
2602
- * exactly the drift this component exists to remove.
2845
+ * ── 🔴 Why panels rather than N explorers ────────────────────────────────────
2846
+ * A stack of telemetry panels is ONE view of one node: the reader picks a
2847
+ * window once and every metric answers for that window. N explorers would mean
2848
+ * N control bars stacked down the page, each able to disagree with the others —
2849
+ * a reader could put Voltage on last week and Current on today and have no
2850
+ * indication the two plots no longer describe the same moment.
2603
2851
  *
2604
- * It survives as the first-paint estimate. Without it the header reserves zero
2605
- * until the observer fires and every chart on the page visibly reflows.
2852
+ * So the camera, the controls, the resolution ladder and the reset button stay
2853
+ * singular, and a panel contributes only its own stream and its own plot. This
2854
+ * is the shape `TiledGridTelemetryView` already ships by hand in the Explore
2855
+ * drawer; `panels` is that arrangement made reachable from a declaration.
2856
+ *
2857
+ * Each panel owns a separate `useTileWindow`, exactly as the drawer does — the
2858
+ * streams have different cadences and different tile costs, and merging them
2859
+ * into one window would make the coarsest metric dictate the resolution of the
2860
+ * finest.
2606
2861
  */
2607
- declare const CHART_HEADER_HEIGHT = 48;
2862
+ interface TiledTimeSeriesPanel {
2863
+ /** Stable identity. Also the React key, so it must not be positional. */
2864
+ key: string;
2865
+ /** Accessible name for this plot's SVG `<title>`, and its heading. */
2866
+ title: string;
2867
+ /** Where this panel's points come from. Its own ladder and cost. */
2868
+ source: TiledTimeSeriesSource;
2869
+ yFormatter?: YFormatType | undefined;
2870
+ yDomain?: TiledTimeSeriesChartProps["yDomain"] | undefined;
2871
+ referenceLines?: {
2872
+ value: number;
2873
+ label?: string;
2874
+ color?: string;
2875
+ }[] | undefined;
2876
+ /** Plot height in px. Panels are shorter than a lone chart by default. */
2877
+ height?: number | undefined;
2878
+ /** See `ChartBottomBarProps.hideExport`. Defaults to the explorer's own setting. */
2879
+ hideExport?: boolean | undefined;
2880
+ /** See `TiledTimeSeriesChartProps.legend`. A panel's legend is its own — it draws its own series. */
2881
+ legend?: TiledTimeSeriesChartProps["legend"] | undefined;
2882
+ /** See `TiledTimeSeriesChartProps.hiddenSeriesLabels`. */
2883
+ hiddenSeriesLabels?: ReadonlySet<string> | undefined;
2884
+ /** See `TiledTimeSeriesChartProps.onLegendItemToggle`. */
2885
+ onLegendItemToggle?: ((label: string) => void) | undefined;
2886
+ /** This panel's series children, given its own assembled streams. */
2887
+ children: (args: {
2888
+ series: AssembledSeries;
2889
+ gapMs: number;
2890
+ }) => ReactNode;
2891
+ }
2892
+ interface TiledTimeSeriesExplorerProps {
2893
+ source: TiledTimeSeriesSource;
2894
+ /** Accessible name for the chart. Forwarded to the underlying tiled chart's SVG `<title>`. */
2895
+ title: string;
2896
+ liveControl?: TiledTimeSeriesLiveControl | undefined;
2897
+ initialRange?: {
2898
+ days: number;
2899
+ } | undefined;
2900
+ viewportEnd?: Date | undefined;
2901
+ yFormatter?: YFormatType | undefined;
2902
+ yDomain?: TiledTimeSeriesChartProps["yDomain"] | undefined;
2903
+ referenceLines?: {
2904
+ value: number;
2905
+ label?: string;
2906
+ color?: string;
2907
+ }[] | undefined;
2908
+ emptyState: {
2909
+ title: string;
2910
+ description: string;
2911
+ };
2912
+ presetRanges?: PresetRange[] | undefined;
2913
+ tierToWindow: Record<string, WindowSize>;
2914
+ windowSizeOptions: WindowSizeOption[];
2915
+ height?: number | undefined;
2916
+ /**
2917
+ * Fill the parent's height instead of the fixed `height`.
2918
+ *
2919
+ * For a caller that has already reserved a box — a block inside a card, a
2920
+ * dashboard tile — where the fixed 360px plot PLUS this component's controls
2921
+ * would overflow whatever was reserved. Uses the same `min-h-0 flex-1` the
2922
+ * expanded view uses, so the plot takes what is left after the controls
2923
+ * rather than adding to them.
2924
+ */
2925
+ fitParent?: boolean | undefined;
2926
+ /** ReactNode, not just a string, so a caller can emphasise the gesture names inside it. */
2927
+ hint?: ReactNode | undefined;
2928
+ dataBounds?: {
2929
+ startMs?: number;
2930
+ endMs?: number;
2931
+ } | undefined;
2932
+ /** Reports committed camera/tier state, including while rendered tiles fall back. */
2933
+ onViewChange?: ((view: TiledTimeSeriesView) => void) | undefined;
2934
+ /** Advance unanchored views at Now. Historical navigation pauses following. */
2935
+ followLatest?: boolean | undefined;
2936
+ /** Change to explicitly resume a navigation-paused view at Now, preserving its span. */
2937
+ followLatestKey?: string | number | undefined;
2938
+ /** Metadata for the accepted plotted data and visible window, shared with expanded view.
2939
+ * Render only; publish state through onViewChange instead. Series may include overscan.
2940
+ * maxDataTimeMs is the inclusive fetch cutoff; viewport.endMs is exclusive. */
2941
+ /**
2942
+ * A built-in "latest data in view" readout, for callers that cannot pass a
2943
+ * function.
2944
+ *
2945
+ * The declarative counterpart of `renderMetadata`: same slot, same rule,
2946
+ * selected by name. A caller that can hold a function may keep using
2947
+ * `renderMetadata`; one driven from stored JSON gets the affordance too.
2948
+ * Passing both renders both, which is a caller error rather than something to
2949
+ * silently resolve here.
2950
+ */
2951
+ latestDataReadout?: LatestDataReadoutKind | undefined;
2952
+ /** Which streams `latestDataReadout` inspects, when its defaults do not fit. */
2953
+ latestDataSeriesKeys?: string[] | undefined;
2954
+ renderMetadata?: ((args: {
2955
+ series: AssembledSeries;
2956
+ viewport: {
2957
+ startMs: number;
2958
+ endMs: number;
2959
+ };
2960
+ maxDataTimeMs: number;
2961
+ }) => ReactNode) | undefined;
2962
+ children: (args: {
2963
+ series: AssembledSeries;
2964
+ gapMs: number;
2965
+ }) => ReactNode;
2966
+ /**
2967
+ * Extra plots stacked below the primary one, on this same camera.
2968
+ *
2969
+ * Omit it and this is exactly the single-plot explorer it has always been —
2970
+ * no sync group is created and nothing about the existing path changes. See
2971
+ * {@link TiledTimeSeriesPanel}.
2972
+ */
2973
+ /** Drop the Export control while keeping the legend. See `ChartBottomBarProps.hideExport`. */
2974
+ hideExport?: boolean | undefined;
2975
+ /**
2976
+ * Caller controls over what the plot draws, on their own row above the time controls.
2977
+ *
2978
+ * 🔴 Inside the explorer, not above it in the caller's own markup: the expanded view re-renders
2979
+ * THIS component inside a dialog, so anything the caller renders as a sibling is left behind on
2980
+ * the page and the control disappears exactly when the chart gets big enough to need it.
2981
+ */
2982
+ leadingControls?: ReactNode | undefined;
2983
+ /**
2984
+ * Caller controls that belong under the plot, right-aligned on the hint's row.
2985
+ *
2986
+ * Right rather than leading: the hint is prose and reads from the plot's left edge, and the
2987
+ * control set varies per view — leading it, the sentence started at a different x every time
2988
+ * the view changed.
2989
+ */
2990
+ trailingControls?: ReactNode | undefined;
2991
+ /**
2992
+ * Drop the "Window … · Resolution …" readout and the "no earlier data loaded" note, keeping the
2993
+ * rest of that row — partial-coverage and refresh errors, which report something a reader cannot
2994
+ * see for themselves. For a caller whose controls already state the window and the resolution.
2995
+ */
2996
+ hideWindowSummary?: boolean | undefined;
2997
+ /**
2998
+ * See `TiledTimeSeriesChartProps.xMarkers`. The function form is resolved against the assembled
2999
+ * series, for markers that are a property of the data rather than of the caller's config.
3000
+ */
3001
+ xMarkers?: TiledTimeSeriesChartProps["xMarkers"] | ((series: AssembledSeries) => TiledTimeSeriesChartProps["xMarkers"]) | undefined;
3002
+ /** See `TiledTimeSeriesChartProps.legend`. */
3003
+ legend?: TiledTimeSeriesChartProps["legend"] | undefined;
3004
+ /** See `TiledTimeSeriesChartProps.hiddenSeriesLabels`. */
3005
+ hiddenSeriesLabels?: ReadonlySet<string> | undefined;
3006
+ /** See `TiledTimeSeriesChartProps.onLegendItemToggle`. */
3007
+ onLegendItemToggle?: ((label: string) => void) | undefined;
3008
+ panels?: TiledTimeSeriesPanel[] | undefined;
3009
+ }
3010
+ declare function TiledTimeSeriesExplorer({ source, hideExport, hideWindowSummary, leadingControls, trailingControls, xMarkers, legend, hiddenSeriesLabels, onLegendItemToggle, title, liveControl, initialRange, viewportEnd, yFormatter, yDomain, referenceLines, emptyState, presetRanges, tierToWindow, windowSizeOptions, height, fitParent, hint, dataBounds, onViewChange, followLatest, followLatestKey, children, latestDataReadout, latestDataSeriesKeys, renderMetadata, panels, }: TiledTimeSeriesExplorerProps): react_jsx_runtime.JSX.Element;
3011
+
2608
3012
  /**
2609
- * Width of the enclosing `ChartHeader`, or `null` outside one / before it is
2610
- * measured. See {@link ChartHeaderWidthContext}.
3013
+ * JSON-safe recursive types.
3014
+ *
3015
+ * `source.ref` is serialized to storage — a BigInt, function, or cyclic
3016
+ * reference there would throw at persist time, far from the block that caused
3017
+ * it. These types enforce JSON-safety at the type level.
2611
3018
  */
2612
- declare function useChartHeaderWidth(): number | null;
3019
+ type JsonValue = string | number | boolean | null | JsonValue[] | {
3020
+ [key: string]: JsonValue;
3021
+ };
3022
+ type JsonObject = {
3023
+ [key: string]: JsonValue;
3024
+ };
2613
3025
  /**
2614
- * Marks a subtree as already carrying a visible label, so charts inside it do
2615
- * not render their own title. Wrap the body of a titled section or card.
3026
+ * WHERE a chart's data comes from.
3027
+ *
3028
+ * ── Why this union exists ─────────────────────────────────────────────────────
3029
+ * A chart either holds its data or streams it. Until now those were two
3030
+ * different COMPONENTS — `ChartContainer` for the first, `TiledTimeSeriesChart`
3031
+ * for the second — which meant the choice was made when you picked an import,
3032
+ * and a block (whose props must be JSON) could only ever reach the first.
3033
+ *
3034
+ * Loading strategy is not a kind of chart. It is a property OF one. So it moves
3035
+ * into a prop, and the two cases become one component with two sources.
3036
+ *
3037
+ * Modelled on `MapDataSource` in `@texturehq/edges-blocks-maps`, which made the
3038
+ * same call for geometry: `{ kind: "inline" } | { kind: "tileset" }`, with the
3039
+ * fetching itself left to the runtime. One idea, two media.
3040
+ *
3041
+ * ── The serialization rule ────────────────────────────────────────────────────
3042
+ * Everything here is JSON-safe on purpose, because that is what lets a BLOCK
3043
+ * declare it: block props are stringified into `data-composition-schema`, and a
3044
+ * function there blanks the page. So this union says WHICH series to draw and at
3045
+ * what resolutions — never HOW to fetch them. The fetcher is supplied separately
3046
+ * at the render site (see `ChartSourceResolver`), exactly as the maps blocks
3047
+ * declare a tileset and let the host attach `createAuthenticatedTileTransform`.
2616
3048
  */
2617
- declare function ChartLabelledBy({ children }: {
2618
- children: ReactNode;
2619
- }): react_jsx_runtime.JSX.Element;
3049
+ type ChartSource = InlineChartSource | StreamingChartSource;
2620
3050
  /**
2621
- * Marks a subtree as unlabelled, so charts inside it own their title. Use where
2622
- * a chart stands on its own with no section or card heading above it.
3051
+ * Data the caller already has. The default, and what every chart does today —
3052
+ * series children carry their own `data` arrays.
3053
+ *
3054
+ * Declared explicitly (rather than inferred from the absence of a source) so a
3055
+ * composition can say "inline" out loud, and so a schema can reject a block that
3056
+ * sets both `series` and a streaming source.
2623
3057
  */
2624
- declare function ChartOwnsItsTitle({ children }: {
2625
- children: ReactNode;
2626
- }): react_jsx_runtime.JSX.Element;
3058
+ interface InlineChartSource {
3059
+ kind: "inline";
3060
+ }
2627
3061
  /**
2628
- * The height the header claims here, and the ref that establishes it.
3062
+ * Data fetched as the reader moves through it.
2629
3063
  *
2630
- * Both engines subtract `headerHeight` from the measured parent height before
2631
- * sizing the plot, and pass `headerRef` to the `ChartHeader` they render. The
2632
- * reserve is therefore the render, measured — not a second statement of it that
2633
- * someone has to keep in agreement.
3064
+ * The chart requests slices as the camera pans and re-requests at a coarser or
3065
+ * finer resolution as it zooms. Which slices, and how they are cached, is the
3066
+ * renderer's business — a caller describes the SHAPE of the history and nothing
3067
+ * else.
2634
3068
  *
2635
- * Returns 0 when the header will render nothing, so a chart that is already
2636
- * labelled and has no slots filled loses no plot height to empty chrome.
3069
+ * `ref` is the part a host resolves. It is deliberately opaque here: edges
3070
+ * cannot know what a "meter demand series" is, and should not learn. The app
3071
+ * maps it to a real fetcher (see `ChartSourceResolver`), which is what keeps
3072
+ * this package free of GraphQL and any app dependency.
2637
3073
  */
2638
- declare function useChartHeaderMetrics(hasActions: boolean, hasControls: boolean): {
2639
- headerRef: (node: HTMLDivElement | null) => void;
2640
- headerHeight: number;
2641
- };
2642
- /** Returns `true` when the chart should render its own visible title. */
2643
- declare function useChartOwnsItsTitle(): boolean;
2644
- interface ChartHeaderProps {
3074
+ interface StreamingChartSource {
3075
+ kind: "streaming";
2645
3076
  /**
2646
- * The chart's title. Both engines pass the same string they render as the SVG
2647
- * `<title>`, so the accessible name and the visible heading cannot drift
2648
- * apart (ALL-2539). Shown only when nothing above already labels the chart.
3077
+ * Opaque, serializable descriptor of WHICH series to stream — resolved by the
3078
+ * host. In the dashboard this is a `Binding`; edges never inspects it.
2649
3079
  */
2650
- title: string;
3080
+ ref: JsonObject;
2651
3081
  /**
2652
- * Control cluster — `TimeControls` today.
2653
- *
2654
- * Separate from `actions` because it is not a trailing icon: it is full-width
2655
- * and it wraps, which is the whole reason this header measures itself rather
2656
- * than reserving a constant.
3082
+ * Resolutions this history can be drawn at, coarsest to finest, with the span
3083
+ * of one fetched slice at each. Plain data — `[{ id: "1h", bucketMs, tileSpanMs }]`.
3084
+ */
3085
+ ladder: ResolutionLadder;
3086
+ /**
3087
+ * The finest spacing the underlying data actually has, in ms.
2657
3088
  *
2658
- * Belongs here when it governs exactly this chart. Controls that govern a
2659
- * composed panel stay at panel level: `SiteEnergyCharts` pairs them with a KPI
2660
- * strip and expands the whole body as one unit, `Dnp3TelemetryChartsSection`
2661
- * drives a grid of charts from one cluster, and `TiledTimeSeriesExplorer`
2662
- * swaps its chart for an `EmptyState` — moving those controls inside the chart
2663
- * would reorder them, or make them vanish exactly when the window needs
2664
- * changing.
3089
+ * Optional because it is frequently NOT known up front: a source that probes
3090
+ * its own cadence discovers this after its first response, and the renderer
3091
+ * already handles it arriving late. Pass it when the value is known
3092
+ * statically; otherwise let the resolver report it.
2665
3093
  */
2666
- controls?: ReactNode;
2667
- /** Trailing action slot — expand first, more later. */
2668
- actions?: ReactNode;
2669
- /** Measurement ref from `useChartHeaderMetrics`. */
2670
- containerRef?: (node: HTMLDivElement | null) => void;
3094
+ nativeMs?: number;
3095
+ /** The window to open on. Defaults to the last 30 days. */
3096
+ initialRange?: {
3097
+ days: number;
3098
+ };
2671
3099
  /**
2672
- * Horizontal insets, in px. Both default to 0 and no engine passes them.
3100
+ * The instant this chart is pinned to, as an ISO-8601 string.
2673
3101
  *
2674
- * They exist for a caller that genuinely needs the header indented, NOT for
2675
- * aligning with the plot. Both engines used to pass the plot's own
2676
- * `dynamicMargin.right` here, which put the expand action 8px in from the card
2677
- * edge while the title stayed flush left — a lopsided header, visible on every
2678
- * chart in the app. That margin is axis padding, so a point at the domain max
2679
- * does not sit on the plot border; it describes the PLOT, and the header is
2680
- * chrome that shares the card's edges with everything else in it.
3102
+ * ── What it is ────────────────────────────────────────────────────────────
3103
+ * Time travel. A surface showing a historical moment — Explore's scrubber,
3104
+ * a match event under DER detection — pins every panel to the same instant,
3105
+ * and this is how a streaming chart joins that. `initialRange` says how WIDE
3106
+ * the opening window is; this says where its right edge sits. Panning and
3107
+ * zooming stay unrestricted from there.
3108
+ *
3109
+ * ── 🔴 An anchored chart must not go live ─────────────────────────────────
3110
+ * The two are mutually exclusive, and the failure is the quiet kind: a chart
3111
+ * that kept refreshing while pinned would advance to now while the rest of
3112
+ * the panel stayed in the past, so the page would show two different
3113
+ * instants and look entirely normal doing it. The renderer already declines
3114
+ * to follow when this is set (`canFollow`, `atLiveEdge`), and a host that
3115
+ * offers a live control is expected to withhold it for the same reason.
3116
+ *
3117
+ * A STRING rather than a `Date`, because this declaration is stored: a board
3118
+ * tile or a composition carries it as JSON, and `Date` does not survive that
3119
+ * round trip. The renderer parses it once.
2681
3120
  */
2682
- marginLeft?: number;
2683
- marginRight?: number;
2684
- }
2685
- declare function ChartHeader({ title, controls, actions, containerRef, marginLeft, marginRight, }: ChartHeaderProps): react_jsx_runtime.JSX.Element | null;
2686
-
2687
- interface ExpandedSize {
2688
- width: number;
2689
- height: number;
2690
- }
2691
- interface ChartExpand {
2692
- isExpanded: boolean;
2693
- /** The expand control, for `ChartHeader`'s action slot. */
2694
- action: ReactNode;
3121
+ viewportEnd?: string;
2695
3122
  /**
2696
- * Dimensions to render at. `null` inline, where the `withParentSize` HOC's
2697
- * own measurements apply.
3123
+ * Changing this discards fetched data and starts over — use it when the
3124
+ * IDENTITY of what is plotted changes (a different device, a different
3125
+ * workspace). Panning and zooming do not need it.
2698
3126
  */
2699
- expandedSize: ExpandedSize | null;
2700
- /** Wraps the chart body: inline it passes through, expanded it opens a Dialog. */
2701
- present: (body: ReactNode) => ReactNode;
2702
- }
2703
- /** Marks a subtree whose expand is owned by an ancestor. */
2704
- declare function ChartExpandOwnedByAncestor({ children }: {
2705
- children: ReactNode;
2706
- }): react_jsx_runtime.JSX.Element;
2707
- declare function useChartExpand(title: string): ChartExpand;
2708
-
2709
- interface ChartTooltipProps {
2710
- data: TooltipData | null;
2711
- formatter: YFormatType;
2712
- /** Optional label to display instead of formatting xValue (for categorical charts) */
2713
- label?: string;
2714
- /** Optional category labels override (for standalone usage without ChartContext) */
2715
- categoryLabels?: Record<string, string>;
3127
+ resetKey?: string;
3128
+ /**
3129
+ * Changing this re-validates what is on screen WITHOUT clearing the plot, so
3130
+ * a refresh does not blank the chart. Use it for live updates.
3131
+ */
3132
+ refreshKey?: string;
2716
3133
  }
2717
3134
  /**
2718
- * ChartTooltip
3135
+ * The runtime half of a streaming source: turns the serializable `ref` into
3136
+ * something that can actually fetch.
2719
3137
  *
2720
- * Interactive tooltip component for charts.
2721
- * Displays formatted data values at hover position with automatic positioning and animations.
2722
- * Uses the main formatting system for consistency with Kpi, StatList, and DataTable.
3138
+ * This is a FUNCTION and therefore never a block prop. It is supplied once at
3139
+ * the render site — a provider near the top of the app — so that every chart
3140
+ * below it can stream without any of them importing a data client. Mirrors how
3141
+ * the maps blocks declare a tileset in props while the host attaches tile
3142
+ * authentication at the `<Map>` itself.
2723
3143
  *
2724
- * Can be used standalone (with label prop) or within ChartContext (for time-series charts).
3144
+ * Returning `null` means "I do not know this ref" — the chart then renders its
3145
+ * empty state rather than throwing, which is the right behaviour for a board
3146
+ * tile whose source is no longer registered.
2725
3147
  */
2726
- declare const ChartTooltip: React__default.FC<ChartTooltipProps>;
2727
-
2728
- interface FunnelStage {
2729
- id: string;
2730
- /** Label for the stage (e.g., "Product Viewed") */
2731
- label: string;
2732
- /** Numeric value for this stage */
2733
- value: number;
2734
- /** Optional secondary value (e.g., "+12% MoM") */
2735
- secondaryValue?: string;
2736
- /** Optional annotation badge */
2737
- annotation?: string;
2738
- /** Override color for this stage */
2739
- color?: string;
2740
- }
2741
- interface FunnelSeriesProps {
2742
- /** Array of funnel stages ordered from top to bottom */
2743
- data: FunnelStage[];
2744
- /** Width of the chart */
2745
- width?: number;
2746
- /** Height of the chart */
2747
- height?: number;
2748
- /** Padding around the chart area */
2749
- padding?: number;
2750
- /** Gap between bars */
2751
- barGap?: number;
2752
- /** Format function for values */
2753
- formatValue?: (value: number) => string;
2754
- /** Format function for percentages */
2755
- formatPercentage?: (value: number) => string;
2756
- /** Single color to use for all bars (uses theme color if not provided) */
2757
- color?: string;
2758
- /** Show percentage scale on left */
2759
- showScale?: boolean;
2760
- /** Show overall conversion rate at top */
2761
- showOverallConversion?: boolean;
2762
- /** Label text for overall conversion (for internationalization) */
2763
- overallConversionLabel?: string;
2764
- /** Optional external active stage identifier */
2765
- activeStageId?: string | null;
2766
- /** Callback when a stage is clicked */
2767
- onStageClick?: (stage: FunnelStage) => void;
2768
- /** Callback when a stage is hovered */
2769
- onStageHover?: (stage: FunnelStage | null) => void;
2770
- /** Additional className */
2771
- className?: string;
2772
- /** Inline styles */
2773
- style?: React__default.CSSProperties;
2774
- /** Accessible label */
2775
- "aria-label"?: string;
2776
- }
2777
- declare const FunnelSeries: React__default.FC<FunnelSeriesProps>;
2778
-
2779
- interface LineSeriesProps {
2780
- data: BaseDataPoint[];
2781
- color?: string;
2782
- label?: string;
2783
- strokeWidth?: number;
2784
- /** CSS stroke-dasharray value (e.g. "4 2" for dotted, "8 4" for dashed) */
2785
- strokeDasharray?: string;
2786
- categoryColors?: Record<string, string>;
2787
- categoryLabels?: Record<string, string>;
2788
- /**
2789
- * When set, break the line wherever consecutive points are spaced more than
2790
- * this many ms apart (missing buckets / outages). Omit to connect across gaps.
2791
- */
2792
- maxGapMs?: number;
2793
- animate?: boolean;
2794
- }
3148
+ type ChartSourceResolver = (source: StreamingChartSource) => ResolvedChartSource | null;
2795
3149
  /**
2796
- * LineSeries
2797
- *
2798
- * Chart component for rendering line charts.
2799
- * Displays data as a continuous line with customizable stroke width, color, and dash patterns.
2800
- * When categoryColors are provided, contiguous line segments are colored by each segment
2801
- * start point category while preserving tooltip and legend metadata from ChartContainer.
3150
+ * What a resolver hands back: the fetcher, plus anything it learned about the
3151
+ * data that the declaration could not state up front.
2802
3152
  */
2803
- declare const LineSeries: React__default.FC<LineSeriesProps>;
2804
-
2805
- interface PieDataPoint {
2806
- /** Category label */
2807
- label: string;
2808
- /** Numeric value. Non-positive values take no arc — see `shareOf`. */
2809
- value: number;
2810
- /** Optional color override for this slice */
2811
- color?: string;
2812
- }
2813
- interface PieChartProps {
2814
- /** Array of data points with labels and values */
2815
- data: PieDataPoint[];
2816
- /** Width of the chart (auto-resizes to container if not provided) */
2817
- width?: number;
2818
- /** Height of the chart (auto-resizes to container if not provided) */
2819
- height?: number;
3153
+ interface ResolvedChartSource {
2820
3154
  /**
2821
- * Hole radius as a fraction of the outer radius. `0` (the default) is a pie;
2822
- * `0.6` is a donut. Values outside 0–0.95 are clamped.
3155
+ * Fetches one slice. The renderer owns when and how often this is called.
3156
+ *
3157
+ * Typed structurally rather than as `FetchTile` so this file stays free of
3158
+ * the tile vocabulary in its public surface; it is the same function.
2823
3159
  */
2824
- innerRadiusRatio?: number;
2825
- /** Formatter for slice values (uses the standard chart formatting system) */
2826
- yFormatter?: YFormatType;
2827
- /** Show the label/value/share legend beside the pie (default true) */
2828
- showLegend?: boolean;
2829
- /** Show tooltip on hover (default true) */
2830
- showTooltip?: boolean;
3160
+ fetchSlice: FetchTile;
2831
3161
  /**
2832
- * Callback when a slice is clicked. Supplying it turns every slice into a
2833
- * focusable, named control that answers Enter and Space, and the drawing's
2834
- * role from `img` to `group` — an `img` hides the controls inside it.
3162
+ * The finest real spacing of the data, if the resolver discovered it.
3163
+ *
3164
+ * 🔴 This is an OUTPUT, not an input, and that is load-bearing. A source that
3165
+ * probes its own cadence only learns it after a response, and the renderer
3166
+ * deliberately re-picks its resolution when this arrives late — without that,
3167
+ * a chart stays pinned to the resolution its fallback guessed. Overrides
3168
+ * `StreamingChartSource.nativeMs` when both are present.
2835
3169
  */
2836
- onSliceClick?: (dataPoint: PieDataPoint, index: number) => void;
2837
- /** Callback when a slice is hovered */
2838
- onSliceHover?: (dataPoint: PieDataPoint | null, index: number | null) => void;
2839
- /** Additional className */
2840
- className?: string;
2841
- /** Inline styles */
2842
- style?: React__default.CSSProperties;
3170
+ nativeMs?: number;
2843
3171
  /**
2844
- * The chart's accessible name. Required, not optional-with-a-default, for the
2845
- * reason `CategoryBarChart` states: a default means every chart of this kind
2846
- * announces identically to a screen reader (ALL-2539, ALL-2715).
3172
+ * How many backend series one slice costs, for the renderer's fetch budget.
3173
+ * Defaults to the renderer's own default when omitted.
2847
3174
  */
2848
- "aria-label": string;
3175
+ costSeriesCount?: number;
3176
+ /**
3177
+ * How many underlying REQUESTS one `fetchSlice` call issues. Defaults to 1.
3178
+ *
3179
+ * 🔴 Distinct from `costSeriesCount`, and the two answer different questions.
3180
+ * That one is about volume — how much data a tier costs — and feeds the
3181
+ * overscan guard inside a single chart's ladder. This one is about
3182
+ * CONCURRENCY: how many requests hit the wire at once, which is what the
3183
+ * page-wide ceiling counts.
3184
+ *
3185
+ * They come apart wherever a resolver merges several loaders into one slice.
3186
+ * The grid cohort's role-split slice fetches net, consumption and generation
3187
+ * — three requests, charged one permit unless it says so, and twelve such
3188
+ * slices would then run 36 requests under a ceiling reporting 12.
3189
+ *
3190
+ * Only a resolver that fans out needs to set it; a slice that makes one
3191
+ * request should leave it alone.
3192
+ */
3193
+ fetchesPerSlice?: number;
3194
+ /**
3195
+ * The Live/Static affordance, when this source can serve live updates.
3196
+ *
3197
+ * Omit it and no control renders at all — which is the correct reading of a
3198
+ * meter that is not in the live pilot, rather than a disabled button whose
3199
+ * reason nobody can act on.
3200
+ */
3201
+ liveControl?: TiledTimeSeriesLiveControl;
3202
+ /**
3203
+ * The reader's committed camera position, reported as it changes.
3204
+ *
3205
+ * This is the upward half of the loop: a host discovering the meter's real
3206
+ * cadence needs to know which window is on screen and whether it is pinned to
3207
+ * the live edge, because the answer decides what it may probe for and whether
3208
+ * a refresh is even meaningful.
3209
+ */
3210
+ onViewChange?: (view: TiledTimeSeriesView) => void;
3211
+ /** Keep an unanchored view advancing at Now. */
3212
+ followLatest?: boolean;
3213
+ /** Change to resume a navigation-paused view at Now, preserving its span. */
3214
+ followLatestKey?: string | number;
3215
+ /**
3216
+ * Whether automatic refreshes may run at all.
3217
+ *
3218
+ * 🔴 Defaults to TRUE when omitted, which is why a host that offers a
3219
+ * Live/Static control MUST set it. "Static" that still refreshes in the
3220
+ * background is the quiet kind of wrong: the button reads paused, the data
3221
+ * keeps moving, and nothing errors.
3222
+ */
3223
+ refreshEnabled?: boolean;
3224
+ /**
3225
+ * Re-validate what is on screen without clearing the plot.
3226
+ *
3227
+ * Overrides `StreamingChartSource.refreshKey` when present, because a live
3228
+ * host derives this from a delivered signal rather than from the declaration.
3229
+ */
3230
+ refreshKey?: string;
2849
3231
  }
2850
3232
  /**
2851
- * PieChart
2852
- *
2853
- * Part-of-whole mark for categorical data: one slice per category, sized by its
2854
- * share of the total, with a legend carrying the value and the percentage. Pass
2855
- * `innerRadiusRatio` for a donut.
3233
+ * The same job as `ChartSourceResolver`, for sources that cannot be a function.
3234
+ *
3235
+ * ── Why this exists alongside the resolver ────────────────────────────────────
3236
+ * A resolver is called from inside a `useMemo`, which means it may not call
3237
+ * hooks. Most sources do not care. But a source that PROBES ITS OWN CADENCE
3238
+ * does: discovering the finest real spacing of a meter's data takes a query,
3239
+ * that query's result arrives after the first render, and `nativeMs` therefore
3240
+ * has to be able to change over the life of the chart. In the dashboard that
3241
+ * logic is already a hook (`useMeterUsageTileSource`) and is several hundred
3242
+ * lines of Apollo queries, abort handling and settle-state — none of which can
3243
+ * be flattened into a synchronous call, and none of which should be rewritten
3244
+ * to satisfy a type.
3245
+ *
3246
+ * So a host is a COMPONENT rather than a function. It renders, which is exactly
3247
+ * what buys it the right to hold hooks, and it hands back what it resolved
3248
+ * through a child function. The chart does not care which half of the contract
3249
+ * answered it.
3250
+ *
3251
+ * 🔴 This is a COMPONENT TYPE. `StreamingChart` renders it as `<Host …>`, and
3252
+ * that is load-bearing rather than stylistic: a host invoked as a plain function
3253
+ * would have its hooks counted against the CALLER's hook list, and since a host
3254
+ * is optional that list would change length whenever one is installed or
3255
+ * removed. Holding hooks is the whole job here, so the host must own a fiber.
3256
+ * Do not "simplify" the render back into a call.
3257
+ *
3258
+ * 🔴 The two "no answer yet" cases are signalled DIFFERENTLY, and conflating
3259
+ * them is a real bug:
3260
+ * - **still resolving** → render nothing (return `null`) WITHOUT calling
3261
+ * `children`. The chart keeps its own loading state.
3262
+ * - **not my ref** → call `children(null)`. The chart falls through to any
3263
+ * plain resolver installed alongside, then to its empty state.
3264
+ *
3265
+ * A probing source that used `children(null)` for "still resolving" would flash
3266
+ * "No data source" for the length of its first query before drawing.
3267
+ */
3268
+ type ChartSourceHost = (props: {
3269
+ source: StreamingChartSource;
3270
+ children: (resolved: ResolvedChartSource | null) => React$1.ReactNode;
3271
+ }) => React$1.ReactNode;
3272
+ /** Narrowing helper — a source that streams rather than carrying its data. */
3273
+ declare function isStreamingSource(source: ChartSource | undefined): source is StreamingChartSource;
3274
+ /**
3275
+ * One ISO-8601 instant, or `null`.
3276
+ *
3277
+ * ── 🔴 Why `Date.parse` alone is not enough ───────────────────────────────────
3278
+ * Three of its behaviours are wrong for a STORED anchor, and all three fail
3279
+ * quietly:
3280
+ *
3281
+ * - **A missing timezone is read as the VIEWER's.** `"2026-09-01T12:00:00"`
3282
+ * parses to a different real instant in every timezone, so one saved
3283
+ * composition anchors two readers to two different moments — and each sees
3284
+ * a chart that looks entirely correct.
3285
+ * - **Impossible dates are normalised.** `"2026-02-30"` silently becomes
3286
+ * March 2 rather than failing.
3287
+ * - **Non-ISO strings are accepted.** `"March 1 2026"` parses fine, so a
3288
+ * declaration can drift from the format the contract promises.
3289
+ *
3290
+ * An absolute instant has to be unambiguous, so this requires an explicit `Z`
3291
+ * or numeric offset and rejects anything the calendar does not contain. Shared
3292
+ * by the renderer, the block schema and the host so all three agree on what
3293
+ * counts as an anchor — a value one accepted and another rejected would pin the
3294
+ * chart while leaving live mode on, which is the worst of both.
3295
+ */
3296
+ declare function parseInstant(value: unknown): Date | null;
3297
+
3298
+ interface StreamingChartProps {
3299
+ source: StreamingChartSource;
3300
+ title: string;
3301
+ children: ReactNode;
3302
+ yFormatter?: React.ComponentProps<typeof TiledTimeSeriesExplorer>["yFormatter"];
3303
+ yDomain?: React.ComponentProps<typeof TiledTimeSeriesExplorer>["yDomain"];
3304
+ referenceLines?: React.ComponentProps<typeof TiledTimeSeriesExplorer>["referenceLines"];
3305
+ headerActions?: ReactNode;
3306
+ height?: number;
3307
+ hint?: string;
3308
+ emptyState?: {
3309
+ title: string;
3310
+ description: string;
3311
+ };
3312
+ tierToWindow?: React.ComponentProps<typeof TiledTimeSeriesExplorer>["tierToWindow"];
3313
+ windowSizeOptions?: React.ComponentProps<typeof TiledTimeSeriesExplorer>["windowSizeOptions"];
3314
+ presetRanges?: React.ComponentProps<typeof TiledTimeSeriesExplorer>["presetRanges"];
3315
+ /** Built-in "latest data in view" readout, selected by name. */
3316
+ latestDataReadout?: React.ComponentProps<typeof TiledTimeSeriesExplorer>["latestDataReadout"];
3317
+ /** Which streams that readout inspects, when the defaults do not fit. */
3318
+ latestDataSeriesKeys?: string[];
3319
+ /**
3320
+ * Extra plots stacked below this one, sharing its camera and its controls.
3321
+ *
3322
+ * Each declares its OWN streaming source — a different ref, a different
3323
+ * ladder, its own cost — and each resolves through the same host, because a
3324
+ * stack of telemetry panels is several streams of one node rather than
3325
+ * several series of one stream.
3326
+ *
3327
+ * Omit it and this is the single-plot chart it has always been.
3328
+ */
3329
+ panels?: StreamingChartPanel[];
3330
+ }
3331
+ /**
3332
+ * One extra plot in a streaming stack, declared the same way the primary is.
2856
3333
  *
2857
- * Input order is preserved — slices are not re-sorted by value, so a producer
2858
- * that ordered its categories deliberately (severity, lifecycle stage) keeps
2859
- * that order.
3334
+ * `children` is the same `seriesKey`-naming form the primary takes, for the
3335
+ * same reason: a block carries JSON, so a panel names its streams rather than
3336
+ * holding a render-prop.
2860
3337
  *
2861
- * @example
2862
- * ```tsx
2863
- * <PieChart
2864
- * data={[
2865
- * { label: "Online", value: 127 },
2866
- * { label: "Offline", value: 23 },
2867
- * ]}
2868
- * aria-label="Devices by status"
2869
- * />
2870
- * ```
3338
+ * Module-private: callers reach this shape through
3339
+ * `ChartContainer`'s `streaming.panels`, which derives it from
3340
+ * `ComponentProps<typeof StreamingChart>`. An exported name nothing imports is
3341
+ * what knip fails CI on, and the derivation means there is nothing to import.
2871
3342
  */
2872
- declare const PieChart: React__default.FC<PieChartProps>;
2873
-
2874
- type TiledCameraPreviewDomain = [number, number] | null;
2875
- interface TiledCameraSyncGroup {
2876
- publish(source: object, preview: TiledCameraPreviewDomain): void;
2877
- subscribe(source: object, onPreview: (preview: TiledCameraPreviewDomain) => void): () => void;
3343
+ interface StreamingChartPanel {
3344
+ key: string;
3345
+ title: string;
3346
+ source: StreamingChartSource;
3347
+ children: ReactNode;
3348
+ yFormatter?: React.ComponentProps<typeof TiledTimeSeriesExplorer>["yFormatter"];
3349
+ yDomain?: React.ComponentProps<typeof TiledTimeSeriesExplorer>["yDomain"];
3350
+ referenceLines?: React.ComponentProps<typeof TiledTimeSeriesExplorer>["referenceLines"];
3351
+ height?: number;
2878
3352
  }
2879
3353
  /**
2880
- * Shared camera for a set of TiledTimeSeriesCharts: pass one group to each
2881
- * chart's `cameraSync` prop and an in-progress pan/zoom on any chart previews
2882
- * live on the others, frame-by-frame. Purely imperative — sibling charts apply
2883
- * the previewed domain as a plot-group transform and axis re-tick, so nothing
2884
- * re-renders through React until the gesture settles.
3354
+ * Draws a chart whose data streams in as the reader moves through it.
3355
+ *
3356
+ * ── What this is, and what it is not ──────────────────────────────────────────
3357
+ * This is the streaming BRANCH of `ChartContainer`, not a component callers
3358
+ * reach for directly. `ChartContainer` picks it when handed a streaming source,
3359
+ * which is the whole point: the choice of loading strategy stops being a choice
3360
+ * of import.
3361
+ *
3362
+ * It delegates to `TiledTimeSeriesExplorer` rather than reimplementing it. That
3363
+ * engine already owns the camera, the resolution ladder, the fetch budget and
3364
+ * the slice cache, and all of that is correct — the problem was never its
3365
+ * behaviour, only that it was reachable by one import and not by a prop. So this
3366
+ * file is an adapter, deliberately thin, and the convergence of the two render
3367
+ * engines is a later step that this one does not prejudge.
3368
+ *
3369
+ * ── The one translation it performs ───────────────────────────────────────────
3370
+ * The explorer takes a render-prop (`{series} => ReactNode`) — a function, which
3371
+ * is exactly what a block cannot express. So series children name their stream
3372
+ * with `seriesKey` and this clones them with the resolved points. Declarative in,
3373
+ * render-prop out, with the function living here instead of at every call site.
2885
3374
  */
2886
- declare function createTiledCameraSyncGroup(): TiledCameraSyncGroup;
3375
+ declare function StreamingChart(props: StreamingChartProps): react_jsx_runtime.JSX.Element;
2887
3376
 
2888
- interface TiledTimeSeriesChartViewport {
2889
- startMs: number;
2890
- endMs: number;
2891
- }
2892
- interface TiledTimeSeriesChartProps {
2893
- /** AreaSeries / LineSeries children. */
3377
+ interface ChartContainerProps {
2894
3378
  children: React__default.ReactNode;
3379
+ parentWidth: number;
3380
+ parentHeight: number;
2895
3381
  /**
2896
3382
  * Accessible name for the chart, rendered as the SVG `<title>`. Required so
2897
3383
  * that screen readers announce what each chart shows; every chart needs its
2898
3384
  * own, and there is deliberately no default to fall back to.
2899
3385
  */
2900
3386
  title: string;
2901
- /** Trailing actions rendered in the `ChartHeader`, opposite the title. */
2902
- headerActions?: React__default.ReactNode;
2903
- /** Control cluster rendered in the `ChartHeader` — `TimeControls` today. */
2904
- headerControls?: React__default.ReactNode;
2905
- /** The camera. Drives the x-scale directly, decoupled from the data extent. */
2906
- viewport: TiledTimeSeriesChartViewport;
2907
- /** Optional clamp for pan gestures. New viewports stay within these bounds. */
2908
- panBounds?: TiledTimeSeriesChartViewport;
2909
- /** Resolve current pan bounds at gesture commit without updating the plotted viewport. */
2910
- getPanBounds?: (() => TiledTimeSeriesChartViewport) | undefined;
2911
- /** Committed once per settled gesture (drag/wheel), with the new ms viewport. */
2912
- onViewportChange: (viewport: TiledTimeSeriesChartViewport) => void;
2913
- /** Measured PLOT width (after margins), for level-of-detail / tile resolution. */
2914
- onPlotWidthChange?: (widthPx: number) => void;
3387
+ /**
3388
+ * Y-axis formatter using the main formatting system
3389
+ * Accepts ComponentFormatter types (string shorthand or full options)
3390
+ * @example "energy", "currency", { type: "temperature", unit: "F" }
3391
+ */
2915
3392
  yFormatter?: YFormatType;
2916
- /** Explicit bounds or a domain derived from visible geometry, including connected bracketing samples. */
2917
- yDomain?: [number, number] | ((data: BaseDataPoint[]) => [number, number]);
2918
- /** Horizontal reference lines (regulatory limits, thresholds). */
3393
+ /**
3394
+ * Explicit y-axis domain `[min, max]`. Overrides the default behavior of
3395
+ * anchoring the axis at zero for all-positive data. Use for deviation-style
3396
+ * metrics (voltage ~240V, frequency ~60Hz, power factor ~1.0) where the
3397
+ * signal is variation around a nominal value, not magnitude from zero.
3398
+ */
3399
+ yDomain?: [number, number];
3400
+ /**
3401
+ * Horizontal reference lines drawn across the plot at fixed y-values — e.g.
3402
+ * regulatory limits (ANSI voltage bounds), targets, or thresholds. Rendered
3403
+ * as dashed lines with an optional right-aligned label.
3404
+ */
2919
3405
  referenceLines?: {
2920
3406
  value: number;
2921
3407
  label?: string;
2922
3408
  color?: string;
2923
3409
  }[];
3410
+ isLoading?: boolean;
3411
+ /** Enable scroll-to-zoom and pan on main chart */
3412
+ enableZoom?: boolean;
3413
+ /** Show brush overview chart below */
3414
+ enableBrush?: boolean;
3415
+ /** Height of brush chart (default: 60px) */
3416
+ brushHeight?: number;
2924
3417
  /**
2925
- * Shared camera group (see `createTiledCameraSyncGroup`). While a gesture is
2926
- * in progress on any chart in the group, the others mirror its live camera
2927
- * frame-by-frame; the settled commit still arrives via `onViewportChange`.
3418
+ * Notification callback when the zoom range changes.
3419
+ *
3420
+ * Fires on every transition, including the initial `null` render. Use this
3421
+ * for one-way "observe the zoom" plumbing (e.g. driving an external panel
3422
+ * showing the current window).
3423
+ *
3424
+ * In controlled-zoom mode (when the `zoomDomain` prop is provided), this is
3425
+ * ALSO the change callback the parent uses to update its own state —
3426
+ * mirroring the `onHiddenSeriesChange` pattern. The parent should treat the
3427
+ * incoming `domain` argument as the next value to commit to its state.
2928
3428
  */
2929
- cameraSync?: TiledCameraSyncGroup;
2930
- parentWidth?: number;
2931
- parentHeight?: number;
2932
- }
2933
- /**
2934
- * TiledTimeSeriesChart
2935
- *
2936
- * Camera-mode time-series chart for the meter telemetry explorer. A parent-owned
2937
- * `viewport` (ms) drives the x-scale directly — decoupled from the loaded data
2938
- * extent — and pan/zoom gestures commit a new viewport once per settled gesture.
2939
- * The data is assumed pre-bounded to the viewport (± overscan) upstream, so the
2940
- * series group is wrapped in a plot-area clip and series animation is disabled.
2941
- */
2942
- declare const TiledTimeSeriesChart: React__default.FC<Omit<TiledTimeSeriesChartProps, "parentWidth" | "parentHeight"> & {
2943
- parentWidth?: number;
2944
- parentHeight?: number;
2945
- }>;
2946
-
2947
- interface TiledTimeSeriesLiveControl {
2948
- label: string;
2949
- checked: boolean;
2950
- onChange: (checked: boolean) => void;
2951
- /** Healthy requires a delivered signal and current measurement evidence where available. */
2952
- status: "live" | "connecting" | "reconnecting" | "stale" | "delayed" | "refresh-failed";
2953
- disabledReason?: string | undefined;
2954
- /** Optional cadence context owned by the consumer, shown while waiting for an update. */
2955
- waitingDescription?: string | undefined;
2956
- }
2957
-
2958
- /** The camera: the visible time window, absolute epoch ms. */
2959
- type Viewport = {
2960
- startMs: number;
2961
- endMs: number;
2962
- };
2963
- /** One rung of the resolution ladder. */
2964
- type Tier = {
2965
- id: string;
2966
- bucketMs: number;
2967
- tileSpanMs: number;
2968
- };
2969
- type ResolutionLadder = Tier[];
2970
- /** A fixed-grid data slice: tile `index` at `tierId`, covering [startMs, endMs). */
2971
- type TileRef = {
2972
- tierId: string;
2973
- index: number;
2974
- startMs: number;
2975
- endMs: number;
2976
- };
2977
- /** Data a tile carries. `band` optional → engine is metric-agnostic.
2978
- * `lines` carries additional named series (e.g. export/net flows) that
2979
- * stitch with the same dedup-by-timestamp semantics as `line`. */
2980
- type TileData = {
2981
- line: BaseDataPoint[];
2982
- band?: BaseDataPoint[];
2983
- lines?: Record<string, BaseDataPoint[]>;
2984
- };
2985
- /** Injected loader: one tile = one bounded fetch. */
2986
- type FetchTileContext = {
2987
- reason: "load" | "refresh";
2988
- /** Check before adapter side effects such as shared-cache writes. */
2989
- isCurrent?: () => boolean;
2990
- };
2991
- type FetchTile = (tier: Tier, startMs: number, endMs: number, signal: AbortSignal, context?: FetchTileContext) => Promise<TileData>;
2992
- declare const tileKey: (tierId: string, index: number) => string;
2993
- declare const hasTileData: (data?: TileData) => boolean;
2994
-
3429
+ onZoomChange?: (domain: [Date, Date] | null) => void;
3430
+ /**
3431
+ * Controlled zoom domain. When provided, ChartContainer uses this value
3432
+ * instead of its internal useState (controlled mode). Mirrors the
3433
+ * `hiddenSeriesLabels` pattern — useful when an inline + dialog instance
3434
+ * pair need to share zoom state (see BOLT-1160 Phase 3 / SiteEnergyCharts).
3435
+ *
3436
+ * Pass `null` for "full domain, no zoom". Omit entirely to use the default
3437
+ * uncontrolled behaviour (ChartContainer manages its own zoom state).
3438
+ *
3439
+ * When controlled, the visx Zoom transform is kept in sync with the
3440
+ * incoming prop via an internal effect, so brush + scroll-zoom + reset
3441
+ * all continue to work — they just route the new domain through
3442
+ * `onZoomChange` to the parent, which echoes it back via the prop.
3443
+ */
3444
+ zoomDomain?: [Date, Date] | null;
3445
+ /**
3446
+ * Controlled set of hidden series labels. When provided, ChartContainer
3447
+ * uses this value instead of its internal useState (controlled mode).
3448
+ * Omit to use the default uncontrolled behaviour.
3449
+ */
3450
+ hiddenSeriesLabels?: Set<string>;
3451
+ /**
3452
+ * Called when the user toggles a legend item in controlled mode.
3453
+ * Accepts either the next Set directly or a functional updater
3454
+ * `(prev: Set<string>) => Set<string>` — the latter lets parents compose
3455
+ * rapid sequential toggles correctly (each sees the latest prev rather than
3456
+ * the stale render-closure value). Only called when `hiddenSeriesLabels`
3457
+ * prop is provided.
3458
+ */
3459
+ onHiddenSeriesChange?: (updater: Set<string> | ((prev: Set<string>) => Set<string>)) => void;
3460
+ /**
3461
+ * Hide the bottom bar (legend + export button). Useful for small/embedded
3462
+ * charts — e.g. inline sparklines — where the legend and export affordance
3463
+ * add unwanted chrome. Defaults to false (bottom bar shown) to preserve
3464
+ * existing behavior for all current consumers.
3465
+ */
3466
+ hideBottomBar?: boolean;
3467
+ /** Trailing actions rendered in the `ChartHeader`, opposite the title. */
3468
+ headerActions?: React__default.ReactNode;
3469
+ /** Control cluster rendered in the `ChartHeader` — `TimeControls` today. */
3470
+ headerControls?: React__default.ReactNode;
3471
+ }
2995
3472
  /**
2996
- * Pick the finest tier whose bucket is coarse enough to hit ~targetPointsPerPx
2997
- * across the chart and is not finer than the series' native cadence.
3473
+ * Default plot-body height for a chart block, in px. Pairs with `CHART_HEADER_HEIGHT`.
3474
+ *
3475
+ * It lives here rather than in each block because four blocks had four private copies of `280`
3476
+ * that happened to agree, with nothing enforcing the agreement — a design change to chart height
3477
+ * was a four-file diff where three files could be forgotten and nothing failed. This is `P10 R-23`.
3478
+ *
3479
+ * A block that needs a different body height passes its own; this is the value it starts from.
2998
3480
  */
2999
- declare function tierForViewport(spanMs: number, widthPx: number, ladder: ResolutionLadder, opts: {
3000
- targetPointsPerPx: number;
3001
- nativeMs: number;
3002
- }): Tier;
3003
-
3004
- type TileStatus = "loading" | "loaded" | "empty" | "error";
3005
- type TileEntry = {
3006
- status: TileStatus;
3007
- data?: TileData;
3008
- error?: Error;
3009
- refreshing?: boolean;
3010
- revision?: number;
3011
- revalidated?: boolean;
3012
- };
3013
- type TileStore = ReadonlyMap<string, TileEntry>;
3014
- type TileAction = {
3015
- type: "request";
3016
- ids: string[];
3017
- refresh?: boolean;
3018
- } | {
3019
- type: "cancel";
3020
- ids: string[];
3021
- } | {
3022
- type: "fulfilled";
3023
- id: string;
3024
- data: TileData;
3025
- refresh?: boolean;
3026
- } | {
3027
- type: "failed";
3028
- id: string;
3029
- error: Error;
3030
- } | {
3031
- type: "reset";
3032
- };
3033
- declare const emptyStore: TileStore;
3034
- declare function tileReducer(store: TileStore, action: TileAction): TileStore;
3035
-
3036
- type Coverage = {
3037
- earliestMs?: number;
3038
- latestMs?: number;
3039
- erroredTiles: number;
3040
- };
3041
- type AssembledSeries = {
3042
- line: BaseDataPoint[];
3043
- band: BaseDataPoint[];
3044
- lines: Record<string, BaseDataPoint[]>;
3045
- renderTier: Tier | null;
3046
- targetTier: Tier;
3047
- isFallback: boolean;
3048
- isStale: boolean;
3049
- coverage: Coverage;
3481
+ declare const DEFAULT_CHART_HEIGHT = 280;
3482
+ type ChartContainerWithSourceProps = Omit<ChartContainerProps, "parentWidth" | "parentHeight" | "yDomain"> & {
3483
+ parentWidth?: number;
3484
+ parentHeight?: number;
3485
+ /**
3486
+ * Explicit y-axis domain — a fixed `[min, max]`, or, while STREAMING, a
3487
+ * function of the points currently loaded.
3488
+ *
3489
+ * ── 🔴 Why streaming needs the callback form ──────────────────────────────
3490
+ * A fed chart's caller knows every value it is about to draw, so a tuple is
3491
+ * a complete answer. A streaming chart's caller knows NONE of them: its
3492
+ * points do not exist until the reader looks at a window. A tuple computed
3493
+ * from what the declaration could see — thresholds and bounds, since
3494
+ * `series` is empty by construction — is then treated as authoritative by
3495
+ * `TiledTimeSeriesChart`, and every fetched value outside it is clipped to
3496
+ * the plot edge rather than widening the axis.
3497
+ *
3498
+ * That failure is the quiet kind: the chart draws, the threshold line sits
3499
+ * where it should, and an overload above it is simply not visible. Which is
3500
+ * the exact reading a threshold exists to prevent.
3501
+ *
3502
+ * `TiledTimeSeriesChart` has always accepted the callback; only this type
3503
+ * kept it out of reach. The fed engine below still takes the tuple alone —
3504
+ * see the guard in `ChartContainer` — because its own scaling already sees
3505
+ * all of the data.
3506
+ */
3507
+ yDomain?: [number, number] | ((data: BaseDataPoint[]) => [number, number]);
3508
+ /**
3509
+ * Where the data comes from. Omit it — or pass `{ kind: "inline" }` — and this
3510
+ * is the chart it has always been, drawing the `data` its series children
3511
+ * carry. Pass a streaming source and the same children instead name which
3512
+ * stream each draws, and the chart fetches history as the reader moves.
3513
+ *
3514
+ * See `ChartSource`. The declaration is JSON, so a BLOCK can carry it; the
3515
+ * fetcher comes from `ChartSourceProvider` at the render site.
3516
+ */
3517
+ source?: ChartSource;
3518
+ /**
3519
+ * Chart configuration that only means anything while streaming.
3520
+ *
3521
+ * ── 🔴 Why these are grouped rather than flattened ────────────────────────────
3522
+ * A resolution ladder, a window-size picker and a preset list describe a chart
3523
+ * that GOES AND GETS more data as you move. A fed chart has one window — the
3524
+ * one its caller handed it — so on the inline path these props have no
3525
+ * meaning at all, not merely no effect. Hoisting them onto
3526
+ * `ChartContainerProps` would put six inert options on every chart in the
3527
+ * platform and invite exactly the bug this grouping prevents: setting
3528
+ * `windowSizeOptions` on a fed chart and wondering why the picker never
3529
+ * appears.
3530
+ *
3531
+ * Grouping also keeps the split honest in the other direction. `hint` and
3532
+ * `height` DO have inline meanings elsewhere in the codebase (a block's
3533
+ * caption, a reserved box), and flattening them here would silently overload
3534
+ * one name with two behaviours depending on a sibling prop. Under `streaming`
3535
+ * they are unambiguous: `streaming.hint` is the explorer's how-to-drive line,
3536
+ * `streaming.height` is the explorer's plot height.
3537
+ *
3538
+ * Everything here is JSON-safe, so a block can declare it — which is the
3539
+ * point. Without it a streaming block draws with a generic window ladder and
3540
+ * no meaningful presets: a chart that renders, looks plausible, and is wrong
3541
+ * at exactly the zoom levels people use.
3542
+ */
3543
+ streaming?: StreamingChartConfig;
3050
3544
  };
3051
- type AssembleSeriesArgs = {
3052
- viewport: Viewport;
3053
- targetTier: Tier;
3054
- ladder: ResolutionLadder;
3055
- store: TileStore;
3056
- overscanTiles: number;
3057
- prev?: AssembledSeries | null;
3058
- prevViewport?: Viewport | null;
3059
- maxFutureMs?: number;
3545
+ /**
3546
+ * The streaming-only half of a chart's configuration.
3547
+ *
3548
+ * Every field is optional and JSON-safe. `StreamingChart` already accepts all
3549
+ * of them; this type is what lets a caller — and therefore a block — express
3550
+ * them through `ChartContainer` rather than by importing the tiled engine
3551
+ * directly.
3552
+ */
3553
+ type StreamingChartConfig = {
3554
+ /** Which window size each resolution tier maps to, e.g. `{ "5m": "FIVE_MINUTES" }`. */
3555
+ tierToWindow?: React__default.ComponentProps<typeof StreamingChart>["tierToWindow"];
3556
+ /** The window sizes offered in the picker, in ladder order. */
3557
+ windowSizeOptions?: React__default.ComponentProps<typeof StreamingChart>["windowSizeOptions"];
3558
+ /** Jump-to-window presets, e.g. Last 24 hours / Last 7 days. */
3559
+ presetRanges?: React__default.ComponentProps<typeof StreamingChart>["presetRanges"];
3560
+ /**
3561
+ * How to DRIVE the chart, shown under the plot — panning, zooming, presets.
3562
+ * Distinct from a block's `description`, which says what is plotted.
3563
+ */
3564
+ hint?: string;
3565
+ /** Shown when the source returns no readings for the visible window. */
3566
+ emptyState?: {
3567
+ title: string;
3568
+ description: string;
3569
+ };
3570
+ /**
3571
+ * Plot height in px. Omit to fill the box the caller reserved, which is what
3572
+ * a block inside a card wants; see the `fitParent` note in `StreamingChart`.
3573
+ */
3574
+ height?: number;
3575
+ /**
3576
+ * Show a built-in "latest data in view" readout beside the resolution line.
3577
+ *
3578
+ * Named rather than rendered, so a chart driven from stored JSON can have it:
3579
+ * `single` reads the primary stream, `band` a net band plus its average line,
3580
+ * `pair` an import/export pair.
3581
+ */
3582
+ latestDataReadout?: React__default.ComponentProps<typeof StreamingChart>["latestDataReadout"];
3583
+ /** Which streams that readout inspects, when the per-kind defaults do not fit. */
3584
+ latestDataSeriesKeys?: string[];
3585
+ /**
3586
+ * Extra plots stacked below this chart, on its camera and its controls.
3587
+ *
3588
+ * For a view that is several streams of ONE thing — a node's SCADA metric
3589
+ * groups, say — where the reader picks a window once and every metric answers
3590
+ * for that window. Each panel names its own source and its own series; the
3591
+ * window, presets, resolution and reset stay singular above them.
3592
+ *
3593
+ * Streaming only, like everything else in this group: a fed chart has one
3594
+ * window handed to it, so there is no shared camera for panels to share.
3595
+ */
3596
+ panels?: React__default.ComponentProps<typeof StreamingChart>["panels"];
3060
3597
  };
3061
- declare function assembleSeries({ viewport, targetTier, ladder, store, overscanTiles, prev, prevViewport, maxFutureMs, }: AssembleSeriesArgs): AssembledSeries;
3062
-
3063
- declare function tileIndexAt(tsMs: number, tier: Tier): number;
3064
- declare function tilesForViewport(viewport: Viewport, tier: Tier, overscanTiles: number): TileRef[];
3598
+ /**
3599
+ * Main chart wrapper. Provides context and layout for chart visualizations, and
3600
+ * — since the `source` prop — owns the choice between holding data and
3601
+ * streaming it.
3602
+ *
3603
+ * ── 🔴 Why the streaming branch is a sibling, not a mode ──────────────────────
3604
+ * `VisXChartContainer` below reads `child.props.data` synchronously while it
3605
+ * renders, and its whole 1,300 lines are built on the data already being there.
3606
+ * Threading async loading THROUGH that would put every chart in the platform on
3607
+ * a changed code path to serve the few that stream — and the failure that
3608
+ * invites is the quiet kind: charts still render, just subtly wrong.
3609
+ *
3610
+ * So the branch is here, ABOVE the measured component, and it is exhaustive: a
3611
+ * chart with no streaming source never reaches a line of new code. That is a
3612
+ * property a reviewer can check by reading this function rather than trusting a
3613
+ * test, and it is deliberately structural rather than conventional.
3614
+ *
3615
+ * Folding the two engines together is worth doing, but it is a separate change
3616
+ * with its own risk; this one only makes both reachable through one prop.
3617
+ */
3618
+ declare const ChartContainer: React__default.FC<ChartContainerWithSourceProps>;
3065
3619
 
3066
3620
  /**
3067
- * Window size for data aggregation
3068
- * Matches GraphQL WindowSize enum
3621
+ * Event marker type — shared by ChartEventMarkers and ChartEventSpans.
3069
3622
  */
3070
- type WindowSize = "FIVE_MINUTES" | "FIFTEEN_MINUTES" | "HOUR" | "DAY" | "WEEK" | "MONTH" | "YEAR";
3623
+ type EventMarkerType = "command" | "alert" | "info" | "success" | "warning" | "error";
3071
3624
  /**
3072
- * Date range with native Date objects
3625
+ * Get the resolved color for a given event marker type.
3626
+ * Uses getResolvedColor to ensure CSS variables work in SVG context.
3073
3627
  */
3074
- interface TimeRange {
3075
- after: Date;
3076
- before: Date;
3077
- }
3628
+ declare function getEventColor(type: EventMarkerType | undefined): string;
3629
+
3078
3630
  /**
3079
- * Preset range option
3631
+ * Event marker data point
3080
3632
  */
3081
- interface PresetRange {
3082
- id: string;
3633
+ interface EventMarker {
3634
+ /**
3635
+ * Event timestamp
3636
+ */
3637
+ timestamp: Date;
3638
+ /**
3639
+ * Event label/name
3640
+ */
3083
3641
  label: string;
3084
- getRange: () => TimeRange;
3642
+ /**
3643
+ * Optional event type for styling
3644
+ */
3645
+ type?: EventMarkerType;
3646
+ /**
3647
+ * Optional per-marker color override; takes precedence over the component-level color prop
3648
+ */
3649
+ color?: string;
3650
+ /**
3651
+ * Optional metadata to display in tooltip
3652
+ */
3653
+ metadata?: Record<string, string | number>;
3654
+ }
3655
+ interface ChartEventMarkersProps {
3656
+ /**
3657
+ * Array of event markers to display
3658
+ */
3659
+ events: EventMarker[];
3660
+ /**
3661
+ * Marker color for every event that does not carry its own `color`
3662
+ * (defaults to a theme-aware color per event `type`)
3663
+ */
3664
+ color?: string;
3665
+ /**
3666
+ * Whether to show labels above markers
3667
+ * @default false
3668
+ */
3669
+ showLabels?: boolean;
3085
3670
  }
3086
3671
  /**
3087
- * Window size option
3672
+ * ChartEventMarkers
3673
+ *
3674
+ * Renders vertical lines with markers for events (e.g., commands) on a chart.
3675
+ * Must be used as a child of ChartContainer to access chart context.
3676
+ *
3677
+ * @example
3678
+ * ```tsx
3679
+ * <ChartContainer title="Device power">
3680
+ * <AreaSeries data={data} label="Power" />
3681
+ * <ChartEventMarkers
3682
+ * events={[
3683
+ * { timestamp: new Date('2024-01-01T10:00:00Z'), label: 'Command sent', type: 'command' },
3684
+ * { timestamp: new Date('2024-01-01T12:00:00Z'), label: 'Alert triggered', type: 'alert' }
3685
+ * ]}
3686
+ * />
3687
+ * </ChartContainer>
3688
+ * ```
3088
3689
  */
3089
- interface WindowSizeOption {
3090
- id: WindowSize;
3091
- label: string;
3092
- }
3690
+ declare function ChartEventMarkers({ events, color, showLabels }: ChartEventMarkersProps): react_jsx_runtime.JSX.Element | null;
3691
+
3093
3692
  /**
3094
- * Props for TimeControls component
3693
+ * A time span to render as a translucent highlight band on a chart.
3095
3694
  */
3096
- interface TimeControlsProps {
3695
+ interface EventSpan {
3696
+ /** Start of the span */
3697
+ start: Date;
3698
+ /** End of the span */
3699
+ end: Date;
3700
+ /** Human-readable label shown in tooltip */
3701
+ label: string;
3702
+ /** Optional type for color coding */
3703
+ type?: EventMarkerType;
3704
+ /** Optional per-span color override; takes precedence over the component-level color prop */
3705
+ color?: string;
3706
+ /** Optional metadata to display in tooltip */
3707
+ metadata?: Record<string, string | number>;
3708
+ }
3709
+ interface ChartEventSpansProps {
3097
3710
  /**
3098
- * Current date range
3711
+ * Array of event spans to render as translucent bands.
3099
3712
  */
3100
- dateRange: TimeRange;
3713
+ spans: EventSpan[];
3101
3714
  /**
3102
- * Callback when date range changes. `meta.presetId` is set when the change
3103
- * came from choosing a preset (vs. the calendar picker).
3715
+ * Override fill opacity (default 0.25). Hover state doubles this up to a cap.
3104
3716
  */
3105
- onDateRangeChange: (range: TimeRange, meta?: {
3106
- presetId?: string;
3107
- }) => void;
3717
+ opacity?: number;
3108
3718
  /**
3109
- * Current window size (optional)
3719
+ * Override fill color for all spans (defaults to getEventColor(span.type)).
3110
3720
  */
3111
- windowSize?: WindowSize;
3721
+ color?: string;
3722
+ }
3723
+ /**
3724
+ * ChartEventSpans
3725
+ *
3726
+ * Renders translucent rectangular bands representing time spans (e.g., scheduled command windows)
3727
+ * on a chart. Must be used as a child of ChartContainer to access chart context.
3728
+ *
3729
+ * Renders BEFORE ChartEventMarkers so the vertical marker lines appear on top of the span bands.
3730
+ *
3731
+ * @example
3732
+ * ```tsx
3733
+ * <ChartContainer title="Device power">
3734
+ * <LineSeries data={data} label="Power" />
3735
+ * <ChartEventSpans
3736
+ * spans={[
3737
+ * { start: new Date('2024-01-01T12:00:00Z'), end: new Date('2024-01-01T14:00:00Z'), label: 'Scheduled window', type: 'command' }
3738
+ * ]}
3739
+ * />
3740
+ * <ChartEventMarkers events={markers} />
3741
+ * </ChartContainer>
3742
+ * ```
3743
+ */
3744
+ declare function ChartEventSpans({ spans, opacity, color }: ChartEventSpansProps): react_jsx_runtime.JSX.Element | null;
3745
+
3746
+ /**
3747
+ * The height the header is assumed to claim before it has been measured, in px.
3748
+ *
3749
+ * This was once the whole story — a constant both engines subtracted from the
3750
+ * measured parent height. `TimeControls` ended that: it is `w-full flex-wrap`,
3751
+ * so a header hosting it is two rows at narrow widths and one row at wide ones.
3752
+ * No constant describes that, and a constant that disagrees with the render is
3753
+ * exactly the drift this component exists to remove.
3754
+ *
3755
+ * It survives as the first-paint estimate. Without it the header reserves zero
3756
+ * until the observer fires and every chart on the page visibly reflows.
3757
+ */
3758
+ declare const CHART_HEADER_HEIGHT = 48;
3759
+ /**
3760
+ * Width of the enclosing `ChartHeader`, or `null` outside one / before it is
3761
+ * measured. See {@link ChartHeaderWidthContext}.
3762
+ */
3763
+ declare function useChartHeaderWidth(): number | null;
3764
+ /**
3765
+ * Marks a subtree as already carrying a visible label, so charts inside it do
3766
+ * not render their own title. Wrap the body of a titled section or card.
3767
+ */
3768
+ declare function ChartLabelledBy({ children }: {
3769
+ children: ReactNode;
3770
+ }): react_jsx_runtime.JSX.Element;
3771
+ /**
3772
+ * Marks a subtree as unlabelled, so charts inside it own their title. Use where
3773
+ * a chart stands on its own with no section or card heading above it.
3774
+ */
3775
+ declare function ChartOwnsItsTitle({ children }: {
3776
+ children: ReactNode;
3777
+ }): react_jsx_runtime.JSX.Element;
3778
+ /**
3779
+ * The height the header claims here, and the ref that establishes it.
3780
+ *
3781
+ * Both engines subtract `headerHeight` from the measured parent height before
3782
+ * sizing the plot, and pass `headerRef` to the `ChartHeader` they render. The
3783
+ * reserve is therefore the render, measured — not a second statement of it that
3784
+ * someone has to keep in agreement.
3785
+ *
3786
+ * Returns 0 when the header will render nothing, so a chart that is already
3787
+ * labelled and has no slots filled loses no plot height to empty chrome.
3788
+ */
3789
+ declare function useChartHeaderMetrics(hasActions: boolean, hasControls: boolean): {
3790
+ headerRef: (node: HTMLDivElement | null) => void;
3791
+ headerHeight: number;
3792
+ };
3793
+ /** Returns `true` when the chart should render its own visible title. */
3794
+ declare function useChartOwnsItsTitle(): boolean;
3795
+ interface ChartHeaderProps {
3112
3796
  /**
3113
- * Callback when window size changes (optional)
3797
+ * The chart's title. Both engines pass the same string they render as the SVG
3798
+ * `<title>`, so the accessible name and the visible heading cannot drift
3799
+ * apart (ALL-2539). Shown only when nothing above already labels the chart.
3114
3800
  */
3115
- onWindowSizeChange?: (size: WindowSize) => void;
3801
+ title: string;
3116
3802
  /**
3117
- * Whether to show window size selector
3118
- * @default true
3803
+ * Control cluster — `TimeControls` today.
3804
+ *
3805
+ * Separate from `actions` because it is not a trailing icon: it is full-width
3806
+ * and it wraps, which is the whole reason this header measures itself rather
3807
+ * than reserving a constant.
3808
+ *
3809
+ * Belongs here when it governs exactly this chart. Controls that govern a
3810
+ * composed panel stay at panel level: `SiteEnergyCharts` pairs them with a KPI
3811
+ * strip and expands the whole body as one unit, `Dnp3TelemetryChartsSection`
3812
+ * drives a grid of charts from one cluster, and `TiledTimeSeriesExplorer`
3813
+ * swaps its chart for an `EmptyState` — moving those controls inside the chart
3814
+ * would reorder them, or make them vanish exactly when the window needs
3815
+ * changing.
3119
3816
  */
3120
- showWindowSize?: boolean;
3817
+ controls?: ReactNode;
3818
+ /** Trailing action slot — expand first, more later. */
3819
+ actions?: ReactNode;
3820
+ /** Measurement ref from `useChartHeaderMetrics`. */
3821
+ containerRef?: (node: HTMLDivElement | null) => void;
3121
3822
  /**
3122
- * Auto-adjust window size based on date range
3123
- * @default false
3823
+ * Horizontal insets, in px. Both default to 0 and no engine passes them.
3824
+ *
3825
+ * They exist for a caller that genuinely needs the header indented, NOT for
3826
+ * aligning with the plot. Both engines used to pass the plot's own
3827
+ * `dynamicMargin.right` here, which put the expand action 8px in from the card
3828
+ * edge while the title stayed flush left — a lopsided header, visible on every
3829
+ * chart in the app. That margin is axis padding, so a point at the domain max
3830
+ * does not sit on the plot border; it describes the PLOT, and the header is
3831
+ * chrome that shares the card's edges with everything else in it.
3124
3832
  */
3125
- autoAdjustWindowSize?: boolean;
3833
+ marginLeft?: number;
3834
+ marginRight?: number;
3835
+ }
3836
+ declare function ChartHeader({ title, controls, actions, containerRef, marginLeft, marginRight, }: ChartHeaderProps): react_jsx_runtime.JSX.Element | null;
3837
+
3838
+ interface ExpandedSize {
3839
+ width: number;
3840
+ height: number;
3841
+ }
3842
+ interface ChartExpand {
3843
+ isExpanded: boolean;
3844
+ /** The expand control, for `ChartHeader`'s action slot. */
3845
+ action: ReactNode;
3126
3846
  /**
3127
- * Whether to show range selector presets
3128
- * @default true
3847
+ * Dimensions to render at. `null` inline, where the `withParentSize` HOC's
3848
+ * own measurements apply.
3129
3849
  */
3130
- showRangeSelector?: boolean;
3850
+ expandedSize: ExpandedSize | null;
3851
+ /** Wraps the chart body: inline it passes through, expanded it opens a Dialog. */
3852
+ present: (body: ReactNode) => ReactNode;
3853
+ }
3854
+ /** Marks a subtree whose expand is owned by an ancestor. */
3855
+ declare function ChartExpandOwnedByAncestor({ children }: {
3856
+ children: ReactNode;
3857
+ }): react_jsx_runtime.JSX.Element;
3858
+ declare function useChartExpand(title: string): ChartExpand;
3859
+
3860
+ interface ChartSourceProviderProps {
3131
3861
  /**
3132
- * Whether to show calendar date picker button
3133
- * @default false
3862
+ * Turns a serializable source descriptor into a fetcher. Keep it stable
3863
+ * (`useCallback`) — a new identity on every render re-resolves every chart
3864
+ * beneath it.
3134
3865
  */
3135
- allowDatePicker?: boolean;
3866
+ resolve?: ChartSourceResolver;
3867
+ /**
3868
+ * The component form of `resolve`, for sources whose resolution needs hooks
3869
+ * (see `ChartSourceHost`). Consulted FIRST when both are installed, because a
3870
+ * host is the more capable half — an app registering both means the host
3871
+ * knows refs the plain resolver cannot answer, and a host that does not
3872
+ * recognise a ref falls through to `resolve` below.
3873
+ */
3874
+ host?: ChartSourceHost;
3875
+ /**
3876
+ * Ceiling on tile fetches in flight across every chart below this provider.
3877
+ *
3878
+ * Omit it for the default. It exists as an override mainly so a test can set
3879
+ * a ceiling small enough to observe — the product has no reason to vary it.
3880
+ */
3881
+ maxConcurrentFetches?: number;
3882
+ children: ReactNode;
3883
+ }
3884
+ /**
3885
+ * Supplies the runtime half of streaming chart sources.
3886
+ *
3887
+ * ── Why a provider and not a prop ─────────────────────────────────────────────
3888
+ * The fetcher is a function, so it cannot ride in a block's props — those are
3889
+ * serialized into `data-composition-schema`, and a function there blanks the
3890
+ * page. But the chart still needs one. A provider resolves that: the block
3891
+ * declares WHICH data it wants in JSON, and the app answers HOW to get it once,
3892
+ * above the whole tree, instead of at every call site.
3893
+ *
3894
+ * This is the same division the maps blocks already use, where a block declares
3895
+ * a tileset in props and the host attaches tile authentication at the map
3896
+ * itself — *"render-time concerns owned by the runtime, not props on this union."*
3897
+ *
3898
+ * ── Why it lives in `edges` ───────────────────────────────────────────────────
3899
+ * So the charts can stay ignorant of where data comes from. `edges` has no
3900
+ * GraphQL client and must not grow one; the app installs a resolver that closes
3901
+ * over its own. That keeps the dependency pointing one way — the app knows
3902
+ * about charts, charts never know about the app.
3903
+ *
3904
+ * Mount it once, near the top:
3905
+ *
3906
+ * ```tsx
3907
+ * <ChartSourceProvider resolve={dashboardChartSources}>
3908
+ * <App />
3909
+ * </ChartSourceProvider>
3910
+ * ```
3911
+ */
3912
+ declare function ChartSourceProvider({ resolve, host, maxConcurrentFetches, children }: ChartSourceProviderProps): react_jsx_runtime.JSX.Element;
3913
+ /**
3914
+ * The installed resolver, or `null` when no provider is mounted.
3915
+ *
3916
+ * `null` is a legitimate state, not an error: a chart with a streaming source
3917
+ * rendered outside a provider shows its empty state. That is what makes a
3918
+ * component library safe to render in a test, a docs page, or a screenshot
3919
+ * harness with no data layer attached — and it is why this returns rather than
3920
+ * throws.
3921
+ */
3922
+ declare function useChartSourceResolver(): ChartSourceResolver | null;
3923
+ /**
3924
+ * The installed host, or `null` when none is mounted.
3925
+ *
3926
+ * Separate hook rather than a merged return so a chart can tell the two apart:
3927
+ * a host has to be RENDERED to answer, and picking that path is a decision about
3928
+ * component structure, not a value to read.
3929
+ */
3930
+ declare function useChartSourceHost(): ChartSourceHost | null;
3931
+
3932
+ interface ChartTooltipProps {
3933
+ data: TooltipData | null;
3934
+ formatter: YFormatType;
3935
+ /** Optional label to display instead of formatting xValue (for categorical charts) */
3936
+ label?: string;
3937
+ /** Optional category labels override (for standalone usage without ChartContext) */
3938
+ categoryLabels?: Record<string, string>;
3939
+ }
3940
+ /**
3941
+ * ChartTooltip
3942
+ *
3943
+ * Interactive tooltip component for charts.
3944
+ * Displays formatted data values at hover position with automatic positioning and animations.
3945
+ * Uses the main formatting system for consistency with Kpi, StatList, and DataTable.
3946
+ *
3947
+ * Can be used standalone (with label prop) or within ChartContext (for time-series charts).
3948
+ */
3949
+ declare const ChartTooltip: React__default.FC<ChartTooltipProps>;
3950
+
3951
+ interface FunnelStage {
3952
+ id: string;
3953
+ /** Label for the stage (e.g., "Product Viewed") */
3954
+ label: string;
3955
+ /** Numeric value for this stage */
3956
+ value: number;
3957
+ /** Optional secondary value (e.g., "+12% MoM") */
3958
+ secondaryValue?: string;
3959
+ /** Optional annotation badge */
3960
+ annotation?: string;
3961
+ /** Override color for this stage */
3962
+ color?: string;
3963
+ }
3964
+ interface FunnelSeriesProps {
3965
+ /** Array of funnel stages ordered from top to bottom */
3966
+ data: FunnelStage[];
3967
+ /** Width of the chart */
3968
+ width?: number;
3969
+ /** Height of the chart */
3970
+ height?: number;
3971
+ /** Padding around the chart area */
3972
+ padding?: number;
3973
+ /** Gap between bars */
3974
+ barGap?: number;
3975
+ /** Format function for values */
3976
+ formatValue?: (value: number) => string;
3977
+ /** Format function for percentages */
3978
+ formatPercentage?: (value: number) => string;
3979
+ /** Single color to use for all bars (uses theme color if not provided) */
3980
+ color?: string;
3981
+ /** Show percentage scale on left */
3982
+ showScale?: boolean;
3983
+ /** Show overall conversion rate at top */
3984
+ showOverallConversion?: boolean;
3985
+ /** Label text for overall conversion (for internationalization) */
3986
+ overallConversionLabel?: string;
3987
+ /** Optional external active stage identifier */
3988
+ activeStageId?: string | null;
3989
+ /** Callback when a stage is clicked */
3990
+ onStageClick?: (stage: FunnelStage) => void;
3991
+ /** Callback when a stage is hovered */
3992
+ onStageHover?: (stage: FunnelStage | null) => void;
3993
+ /** Additional className */
3994
+ className?: string;
3995
+ /** Inline styles */
3996
+ style?: React__default.CSSProperties;
3997
+ /** Accessible label */
3998
+ "aria-label"?: string;
3999
+ }
4000
+ declare const FunnelSeries: React__default.FC<FunnelSeriesProps>;
4001
+
4002
+ interface LineSeriesProps {
3136
4003
  /**
3137
- * Whether window size is locked (read-only)
3138
- * @default false
4004
+ * The points to draw.
4005
+ *
4006
+ * Optional ONLY inside a streaming chart, where the points do not exist until
4007
+ * the reader looks at a window: there the child names its stream with
4008
+ * `seriesKey` and the chart supplies `data` before this component renders. In
4009
+ * an ordinary chart it is required in practice — a series with neither is
4010
+ * skipped rather than drawn.
3139
4011
  */
3140
- lockWindowSize?: boolean;
4012
+ data?: BaseDataPoint[];
3141
4013
  /**
3142
- * Whether to show the built-in Reset button beside the calendar picker. It
3143
- * returns to the first preset. Turn off in views that own their own reset
3144
- * with different semantics (e.g. pan/zoom explorers returning to the last
3145
- * explicit selection).
3146
- * @default true
4014
+ * Which stream this series draws, in a chart with a streaming `source`.
4015
+ *
4016
+ * Defaults to `"line"`, the primary stream. Ignored entirely by a chart that
4017
+ * holds its own data, so the same `<AreaSeries>` serves both sources.
3147
4018
  */
3148
- showReset?: boolean;
4019
+ seriesKey?: string;
3149
4020
  /**
3150
- * Restrict to single day selection (uses Calendar instead of RangeCalendar)
3151
- * @default false
4021
+ * Relabel this series once its points arrive, in a streaming chart.
4022
+ *
4023
+ * Declared here rather than only on the chart because the element carrying it
4024
+ * is this one; the streaming branch reads it, resolves it against every
4025
+ * assembled stream, and passes the result down as `label`. This component
4026
+ * never calls it — by the time it renders, `label` is already the answer.
3152
4027
  */
3153
- restrictToSingleDay?: boolean;
4028
+ labelFromData?: (plotted: BaseDataPoint[], series: AssembledSeries) => string;
4029
+ color?: string;
4030
+ label?: string;
4031
+ strokeWidth?: number;
4032
+ /** CSS stroke-dasharray value (e.g. "4 2" for dotted, "8 4" for dashed) */
4033
+ strokeDasharray?: string;
4034
+ categoryColors?: Record<string, string>;
4035
+ categoryLabels?: Record<string, string>;
3154
4036
  /**
3155
- * Available preset range options
4037
+ * When set, break the line wherever consecutive points are spaced more than
4038
+ * this many ms apart (missing buckets / outages). Omit to connect across gaps.
3156
4039
  */
3157
- presetRanges?: PresetRange[];
4040
+ maxGapMs?: number;
4041
+ animate?: boolean;
4042
+ }
4043
+ /**
4044
+ * LineSeries
4045
+ *
4046
+ * Chart component for rendering line charts.
4047
+ * Displays data as a continuous line with customizable stroke width, color, and dash patterns.
4048
+ * When categoryColors are provided, contiguous line segments are colored by each segment
4049
+ * start point category while preserving tooltip and legend metadata from ChartContainer.
4050
+ */
4051
+ declare const LineSeries: React__default.FC<LineSeriesProps>;
4052
+
4053
+ interface PieDataPoint {
4054
+ /** Category label */
4055
+ label: string;
4056
+ /** Numeric value. Non-positive values take no arc — see `shareOf`. */
4057
+ value: number;
4058
+ /** Optional color override for this slice */
4059
+ color?: string;
4060
+ }
4061
+ interface PieChartProps {
4062
+ /** Array of data points with labels and values */
4063
+ data: PieDataPoint[];
4064
+ /** Width of the chart (auto-resizes to container if not provided) */
4065
+ width?: number;
4066
+ /** Height of the chart (auto-resizes to container if not provided) */
4067
+ height?: number;
3158
4068
  /**
3159
- * Available window size options
4069
+ * Hole radius as a fraction of the outer radius. `0` (the default) is a pie;
4070
+ * `0.6` is a donut. Values outside 0–0.95 are clamped.
3160
4071
  */
3161
- windowSizeOptions?: WindowSizeOption[];
4072
+ innerRadiusRatio?: number;
4073
+ /** Formatter for slice values (uses the standard chart formatting system) */
4074
+ yFormatter?: YFormatType;
4075
+ /** Show the label/value/share legend beside the pie (default true) */
4076
+ showLegend?: boolean;
4077
+ /** Show tooltip on hover (default true) */
4078
+ showTooltip?: boolean;
3162
4079
  /**
3163
- * Control size, matching the shared `Button` / `Select` scale.
3164
- *
3165
- * Defaults to `md`, which is what this component always rendered. `sm` exists
3166
- * for a caller placing these beside smaller controls — a chart header, where
3167
- * `md` here stood 39px next to 33px selects and read as a mismatch rather
3168
- * than a hierarchy.
4080
+ * Callback when a slice is clicked. Supplying it turns every slice into a
4081
+ * focusable, named control that answers Enter and Space, and the drawing's
4082
+ * role from `img` to `group` — an `img` hides the controls inside it.
3169
4083
  */
3170
- size?: "sm" | "md";
4084
+ onSliceClick?: (dataPoint: PieDataPoint, index: number) => void;
4085
+ /** Callback when a slice is hovered */
4086
+ onSliceHover?: (dataPoint: PieDataPoint | null, index: number | null) => void;
4087
+ /** Additional className */
4088
+ className?: string;
4089
+ /** Inline styles */
4090
+ style?: React__default.CSSProperties;
3171
4091
  /**
3172
- * Additional CSS classes
4092
+ * The chart's accessible name. Required, not optional-with-a-default, for the
4093
+ * reason `CategoryBarChart` states: a default means every chart of this kind
4094
+ * announces identically to a screen reader (ALL-2539, ALL-2715).
3173
4095
  */
3174
- className?: string;
4096
+ "aria-label": string;
3175
4097
  }
3176
4098
  /**
3177
- * TimeControls
4099
+ * PieChart
3178
4100
  *
3179
- * Sophisticated time control component with responsive behavior and calendar integration.
3180
- * Features preset ranges, custom date picker, and window size selection.
4101
+ * Part-of-whole mark for categorical data: one slice per category, sized by its
4102
+ * share of the total, with a legend carrying the value and the percentage. Pass
4103
+ * `innerRadiusRatio` for a donut.
3181
4104
  *
3182
- * **Responsive Behavior:**
3183
- * - < 600px: Compact mode with Select dropdowns
3184
- * - ≥ 600px: Expanded mode with ToggleButton group for presets
4105
+ * Input order is preserved — slices are not re-sorted by value, so a producer
4106
+ * that ordered its categories deliberately (severity, lifecycle stage) keeps
4107
+ * that order.
3185
4108
  *
3186
4109
  * @example
3187
4110
  * ```tsx
3188
- * const [dateRange, setDateRange] = useState({
3189
- * after: subDays(new Date(), 7),
3190
- * before: new Date()
3191
- * });
3192
- * const [windowSize, setWindowSize] = useState<WindowSize>("HOUR");
3193
- *
3194
- * <TimeControls
3195
- * dateRange={dateRange}
3196
- * onDateRangeChange={setDateRange}
3197
- * windowSize={windowSize}
3198
- * onWindowSizeChange={setWindowSize}
3199
- * presetRanges={presetRanges}
3200
- * allowDatePicker
4111
+ * <PieChart
4112
+ * data={[
4113
+ * { label: "Online", value: 127 },
4114
+ * { label: "Offline", value: 23 },
4115
+ * ]}
4116
+ * aria-label="Devices by status"
3201
4117
  * />
3202
4118
  * ```
3203
4119
  */
3204
- declare function TimeControls({ dateRange, onDateRangeChange, windowSize, onWindowSizeChange, showWindowSize, showRangeSelector, allowDatePicker, lockWindowSize, showReset, restrictToSingleDay, presetRanges, windowSizeOptions, autoAdjustWindowSize, size, className, }: TimeControlsProps): react_jsx_runtime.JSX.Element;
3205
-
3206
- type ClassicPresetId = "day" | "week" | "month";
3207
- /**
3208
- * The standard ladder for classic (non-tiled) charts. Labels are supplied by the
3209
- * caller rather than baked in, because consumers localize them — edges owns the
3210
- * ids and ranges, which is the part that was duplicated per chart and drifted.
3211
- */
3212
- declare function classicPresetRanges(labels: Record<ClassicPresetId, string>, getAnchorEndMs?: () => number): PresetRange[];
3213
- /**
3214
- * The standard telemetry time-range ladder. `getAnchorEndMs` is called at press
3215
- * time, not build time, so a long-lived view jumps to a fresh "now" (or stays
3216
- * pinned to a scrubbed instant under time travel).
3217
- */
3218
- declare function telemetryPresetRanges(getAnchorEndMs?: () => number): PresetRange[];
3219
-
3220
- interface TiledTimeSeriesSource {
3221
- fetchTile: FetchTile;
3222
- ladder: ResolutionLadder;
3223
- nativeMs: number;
3224
- resetKey: string;
3225
- /** Revalidate visible tiles without discarding the plot. */
3226
- refreshKey?: string | undefined;
3227
- /** Cancel automatic refreshes while preserving manual navigation. */
3228
- refreshEnabled?: boolean | undefined;
3229
- tileCostSeriesCount: number;
3230
- }
3231
- interface TiledTimeSeriesView {
3232
- targetTierId: string;
3233
- renderedTierId: string | null;
3234
- viewport: {
3235
- startMs: number;
3236
- endMs: number;
3237
- };
3238
- followingLatest: boolean;
3239
- /** Relative Now navigation intent, independent of whether live updates are enabled. */
3240
- atLiveEdge?: boolean | undefined;
3241
- }
3242
- interface TiledTimeSeriesExplorerProps {
3243
- source: TiledTimeSeriesSource;
3244
- /** Accessible name for the chart. Forwarded to the underlying tiled chart's SVG `<title>`. */
3245
- title: string;
3246
- liveControl?: TiledTimeSeriesLiveControl | undefined;
3247
- initialRange?: {
3248
- days: number;
3249
- } | undefined;
3250
- viewportEnd?: Date | undefined;
3251
- yFormatter?: YFormatType | undefined;
3252
- yDomain?: TiledTimeSeriesChartProps["yDomain"] | undefined;
3253
- referenceLines?: {
3254
- value: number;
3255
- label?: string;
3256
- color?: string;
3257
- }[] | undefined;
3258
- emptyState: {
3259
- title: string;
3260
- description: string;
3261
- };
3262
- presetRanges?: PresetRange[] | undefined;
3263
- tierToWindow: Record<string, WindowSize>;
3264
- windowSizeOptions: WindowSizeOption[];
3265
- height?: number | undefined;
3266
- hint?: string | undefined;
3267
- dataBounds?: {
3268
- startMs?: number;
3269
- endMs?: number;
3270
- } | undefined;
3271
- /** Reports committed camera/tier state, including while rendered tiles fall back. */
3272
- onViewChange?: ((view: TiledTimeSeriesView) => void) | undefined;
3273
- /** Advance unanchored views at Now. Historical navigation pauses following. */
3274
- followLatest?: boolean | undefined;
3275
- /** Change to explicitly resume a navigation-paused view at Now, preserving its span. */
3276
- followLatestKey?: string | number | undefined;
3277
- /** Metadata for the accepted plotted data and visible window, shared with expanded view.
3278
- * Render only; publish state through onViewChange instead. Series may include overscan.
3279
- * maxDataTimeMs is the inclusive fetch cutoff; viewport.endMs is exclusive. */
3280
- renderMetadata?: ((args: {
3281
- series: AssembledSeries;
3282
- viewport: {
3283
- startMs: number;
3284
- endMs: number;
3285
- };
3286
- maxDataTimeMs: number;
3287
- }) => ReactNode) | undefined;
3288
- children: (args: {
3289
- series: AssembledSeries;
3290
- gapMs: number;
3291
- }) => ReactNode;
3292
- }
3293
- declare function TiledTimeSeriesExplorer({ source, title, liveControl, initialRange, viewportEnd, yFormatter, yDomain, referenceLines, emptyState, presetRanges, tierToWindow, windowSizeOptions, height, hint, dataBounds, onViewChange, followLatest, followLatestKey, children, renderMetadata, }: TiledTimeSeriesExplorerProps): react_jsx_runtime.JSX.Element;
4120
+ declare const PieChart: React__default.FC<PieChartProps>;
3294
4121
 
3295
4122
  interface Filter {
3296
4123
  id: string;
@@ -4162,7 +4989,7 @@ declare function DeltaCell<T = any>({ value, row, context, direction, tone, form
4162
4989
  /**
4163
4990
  * Device type classification
4164
4991
  */
4165
- type DeviceType = "battery" | "charger" | "thermostat" | "inverter" | "vehicle" | "water_heater" | "meter" | "gateway" | "other" | "unknown";
4992
+ type DeviceType = "battery" | "charger" | "thermostat" | "inverter" | "vehicle" | "water_heater" | "meter" | "sensor" | "gateway" | "other" | "unknown";
4166
4993
 
4167
4994
  interface DeviceMetaCellProps<T = unknown> extends CellComponentProps<T> {
4168
4995
  /** Device manufacturer name (can be a function to extract from row) */
@@ -4844,7 +5671,7 @@ declare function TextCell<T = any>({ value, row, context, prefix, suffix, emptyT
4844
5671
  * Supports custom cell renderers, column configurations, multiple display densities,
4845
5672
  * and virtualization for large datasets.
4846
5673
  */
4847
- declare function DataTable<T extends Record<string, unknown>>({ columns, data, className, density, width, height, maxHeight, layout, mobileRenderer, customMobileRowRender, mobileBreakpoint, isLoading, loadingState, loadingRowCount, onLoadMore, hasMore, enableVirtualization, estimatedRowHeight, loadingIndicator, stickyHeader, stickyFirstColumn, onRowClick, getRowId, selectedRowIds, onSelectionChange, selectionMode, hideHeader, sortConfig: controlledSortConfig, onSort, sortNote, "aria-label": ariaLabel, enableColumnReorder, columnOrder: controlledColumnOrder, onColumnOrderChange, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
5674
+ declare function DataTable<T extends Record<string, unknown>>({ columns, data: allData, className, density, width, height, maxHeight, layout, mobileRenderer, customMobileRowRender, mobileBreakpoint, isLoading, loadingState, loadingRowCount, onLoadMore, hasMore, enableVirtualization, estimatedRowHeight, loadingIndicator, stickyHeader, stickyFirstColumn, onRowClick, getRowId, selectedRowIds, onSelectionChange, selectionMode, hideHeader, sortConfig: controlledSortConfig, onSort, sortNote, "aria-label": ariaLabel, enableColumnReorder, columnOrder: controlledColumnOrder, onColumnOrderChange, pagination, }: DataTableProps<T>): react_jsx_runtime.JSX.Element;
4848
5675
 
4849
5676
  interface MobileRowProps<T> {
4850
5677
  row: T;
@@ -4863,6 +5690,87 @@ declare function AutoMobileRenderer<T>({ row, columns, density, isLoading, onCli
4863
5690
  */
4864
5691
  declare function CardMobileRenderer<T>({ row, columns, density, isLoading, onClick }: MobileRowProps<T>): react_jsx_runtime.JSX.Element;
4865
5692
 
5693
+ /**
5694
+ * Rows per page when `pagination` is `true` or omits `pageSize`.
5695
+ *
5696
+ * 10 rather than 25: the default exists for tables embedded in a page, and a page
5697
+ * of 10 is about a screen of rows on a laptop without pushing the footer — and the
5698
+ * control that follows it — below the fold. A caller showing a denser table says so.
5699
+ */
5700
+ declare const DEFAULT_PAGE_SIZE = 10;
5701
+ /**
5702
+ * Upper bound on a page, mirroring the row budget a bounded table already honours.
5703
+ *
5704
+ * A page is a viewport's worth of rows, and it renders unvirtualized — so an
5705
+ * unbounded `pageSize` reintroduces exactly the mount cost paging is meant to
5706
+ * avoid. Clamped rather than defaulted, because "show 2,000" is a legible intent
5707
+ * expressed in a field that cannot carry it; the nearest honest answer is the
5708
+ * largest page there is.
5709
+ */
5710
+ declare const MAX_PAGE_SIZE = 200;
5711
+ /** What a render needs once the paging policy has been resolved against the data. */
5712
+ interface ResolvedPagination {
5713
+ /** 0-based page being shown, clamped into range. */
5714
+ page: number;
5715
+ /** Total pages, always at least 1 so an empty table still reads "1 / 1". */
5716
+ pageCount: number;
5717
+ /** Index of the first row on this page, for slicing. */
5718
+ start: number;
5719
+ /** Index past the last row on this page, for slicing. */
5720
+ end: number;
5721
+ /** 1-based inclusive ordinal of the first row shown, or 0 when there are none. */
5722
+ from: number;
5723
+ /** 1-based inclusive ordinal of the last row shown. */
5724
+ to: number;
5725
+ /** Rows across every page. */
5726
+ total: number;
5727
+ }
5728
+ /**
5729
+ * Resolve a paging policy against the row count actually in play.
5730
+ *
5731
+ * `page` is the value to clamp — whichever of the controlled prop or the table's
5732
+ * own state is in force. Clamping here rather than at the call site is what keeps
5733
+ * a shrinking dataset from stranding a live page: a refetch returning fewer rows
5734
+ * under page 4 of 2 renders page 2, not an empty table under a lying footer.
5735
+ */
5736
+ declare function resolvePagination(pagination: DataTablePagination | boolean | undefined, rowCount: number, page: number): ResolvedPagination;
5737
+ interface PaginationFooterProps extends ResolvedPagination {
5738
+ density: TableDensity;
5739
+ onPageChange: (next: number) => void;
5740
+ /** Labels the control for assistive tech, e.g. "Commands pagination". */
5741
+ label?: string;
5742
+ }
5743
+ /**
5744
+ * Page controls, and the range they are moving through.
5745
+ *
5746
+ * ── What the layout is doing ─────────────────────────────────────────────────
5747
+ *
5748
+ * The range ("9–16 of 312") is the load-bearing half and the arrows are the cheap
5749
+ * half: a paged table's real job is telling you how much there IS, which is the
5750
+ * one thing a scrollbar communicates badly.
5751
+ *
5752
+ * ── Mobile ───────────────────────────────────────────────────────────────────
5753
+ *
5754
+ * Three things change below `sm`, and each is a thumb problem rather than a width
5755
+ * problem:
5756
+ *
5757
+ * - The buttons carry their labels ("Previous" / "Next") instead of bare carets.
5758
+ * A 32px caret is under the 44px touch target every mobile guideline asks for,
5759
+ * and it is the only control on the row — there is room to say what it does.
5760
+ * - They sit at the EDGES of the row, thumb-reachable, with the range centred
5761
+ * between them. On desktop the pair stays grouped at the right, where a mouse
5762
+ * is already heading after a sort or a row click.
5763
+ * - The range says "9–16 of 312" on both, but the page counter ("2 / 32") is
5764
+ * desktop-only: on a phone it is a third number competing with the two that
5765
+ * matter, and the arrows already say where you can go.
5766
+ *
5767
+ * Container queries rather than viewport breakpoints (`@sm:` off the table's own
5768
+ * wrapper), because the table is a block that gets placed in panes narrower than
5769
+ * the window — a 380px side panel on a 1440px monitor is mobile for this control
5770
+ * even though the viewport says otherwise.
5771
+ */
5772
+ declare function PaginationFooter({ page, pageCount, from, to, total, density, onPageChange, label, }: PaginationFooterProps): react_jsx_runtime.JSX.Element;
5773
+
4866
5774
  /**
4867
5775
  * DateRangePicker
4868
5776
  *
@@ -7036,6 +7944,11 @@ declare function RangeCalendar<T extends DateValue>({ errorMessage, ...props }:
7036
7944
  * </Section>
7037
7945
  * ```
7038
7946
  */
7947
+ /**
7948
+ * Dispatched on `window` by `SectionNav` before it scrolls to a section, with the target element's DOM id as
7949
+ * `detail.id`. A collapsed `Section` with that id opens itself, so the rail never scrolls to a closed body.
7950
+ */
7951
+ declare const SECTION_NAVIGATE_EVENT = "edges:section-navigate";
7039
7952
  type SectionVariant = "plain" | "contained" | "bordered";
7040
7953
  type SectionSpacing = "none" | "sm" | "md" | "lg";
7041
7954
  interface SectionProps {
@@ -7061,8 +7974,14 @@ interface SectionProps {
7061
7974
  children?: React__default.ReactNode;
7062
7975
  /** Label used by in-page navigation (PageLayout.Content with withSectionNav). Falls back to title when omitted */
7063
7976
  navLabel?: string;
7064
- }
7065
- declare function Section({ id, title, description, actions, variant, spacing, withDivider, headingAs, className, children, }: SectionProps): react_jsx_runtime.JSX.Element;
7977
+ /** Lets the reader fold the body away; the title becomes the toggle */
7978
+ collapsible?: boolean;
7979
+ /** Initial state of a collapsible section. A collapsed body is not mounted */
7980
+ defaultCollapsed?: boolean;
7981
+ /** Short trailing marker beside a collapsible title, e.g. a count */
7982
+ badge?: React__default.ReactNode;
7983
+ }
7984
+ declare function Section({ id, title, description, actions, variant, spacing, withDivider, headingAs, className, children, collapsible, defaultCollapsed, badge, }: SectionProps): react_jsx_runtime.JSX.Element;
7066
7985
  declare namespace Section {
7067
7986
  var displayName: string;
7068
7987
  }
@@ -8084,4 +9003,4 @@ declare function voltageYDomain(data: readonly VoltageValues[], nominalVoltage:
8084
9003
  */
8085
9004
  type LinkComponentType = React.ComponentType<any>;
8086
9005
 
8087
- export { type Action, ActionCell, type ActionCellProps, ActivityFeed, ActivityFeedGroup, type ActivityFeedGroupProps, type ActivityFeedProps, type ActivityFeedSize, type ActivityFeedVariant, ActivityItem, type ActivityItemProps, type ActivityItemSurface, type ActivityItemTone, type AgentCellConfigOf, type AgentCellValueOf, type AgentSerializable, Alert, type AlertProps, type ApplyDataOperationsOptions, type ApplyDataOperationsResult, AreaSeries, type AssembleSeriesArgs, type AssembledSeries, AutoMobileRenderer, BREAKPOINTS, BadgeCell, type BadgeCellProps, BadgeProps, Banner, type BannerAction, type BannerAppearance, type BannerProps, type BannerVariant, BarSeries, BaseDataPoint, BaseInputProps, BooleanCell, type BooleanCellProps, BooleanFormat, BrandProvider, type BrandProviderProps, type BrandVariables, BreadcrumbItem, type BreadcrumbItemProps, Breadcrumbs, type Breakpoint, type BreakpointState, CATEGORICAL_RAMP, CHART_HEADER_HEIGHT, COLOR_RAMPS, Calendar, Card, CardContent, type CardContentProps, CardFooter, type CardFooterProps, CardHeader, type CardHeaderProps, CardMedia, type CardMediaProps, CardMobileRenderer, type CardProps, type CardVariant, CarouselAutoplayTrigger, CarouselControl, type CarouselControlProps, CarouselIndicator, CarouselIndicatorGroup, type CarouselIndicatorProps, CarouselItem, CarouselItemGroup, type CarouselItemGroupProps, type CarouselItemProps, CarouselNextTrigger, CarouselPrevTrigger, CarouselProgressText, CarouselRoot, type CarouselRootProps, type CarouselTriggerProps, CategoryBarChart, type CategoryDataPoint as CategoryBarChartDataPoint, type CategoryBarChartProps, CategoryCell, type CategoryCellProps, type CategoryDataPoint, CellAlignment, CellComponentProps, type CellConfigOf, CellEmphasis, type CellValueOf, ChartAxis, ChartBottomBar, ChartContainer, ChartEventMarkers, type ChartEventMarkersProps, ChartEventSpans, type ChartEventSpansProps, type ChartExpand, ChartExpandOwnedByAncestor, type ChartExportMetadata, ChartHeader, type ChartHeaderProps, ChartLabelledBy, ChartOwnsItsTitle, ChartTooltip, Chip, ChipInputField, type ChipInputFieldProps, type ClassicPresetId, Collapse, CollapseContent, type CollapseContentProps, type CollapseDensity, CollapseHeader, type CollapseHeaderProps, CollapseItem, type CollapseItemProps, type CollapseProps, type CollapseVariant, ColorModeProvider, type ColorRampInput, type ColorRampKind, type ColorRampOption, ColorSpec, Column, CommandPalette, type CommandPaletteProps, ComponentFormatter, Confirm, type ConfirmProps, ConnectionStatusBadge, type ConnectionStatusBadgeProps, ContactCard, type ContactCardProps, ContactMetaCell, type ContactMetaCellProps, ContactMetaDisplay, type ContactMetaDisplayProps, ContainerQueryProvider, CopyToClipboard, type Coverage, CurrencyFormat, CurrentFormat, CustomCell, type CustomCellProps, CustomPinsSpec, DEFAULT_CHART_HEIGHT, DIVERGING_RAMPS, DataControls, type Filter as DataControlsFilter, type DataControlsProps, type SortOption as DataControlsSortOption, DataTable, DataTableProps, DateCell, type DateCellProps, DateFormat, DateRangePicker, DeltaCell, type DeltaCellProps, type DeltaDirection, type DeltaFormat, type DeltaTone, DeviceHealthBadge, type DeviceHealthBadgeProps, DeviceMetaCell, type DeviceMetaCellProps, DeviceMetaDisplay, type DeviceMetaDisplayProps, DeviceState, DeviceStateBadge, type DeviceStateBadgeProps, DeviceStateCell, type DeviceStateCellProps, DeviceStateWithMetric, type DeviceStateWithMetricProps, type DeviceType, DeviceTypeIcon, type DeviceTypeIconProps, DialogAction, DialogFooterConfig, DialogHeader, DialogHeaderConfig, type DialogHeaderProps, DistanceFormat, type ElementSize, EmptyState, type EmptyStateAction, type EmptyStateAlignment, type EmptyStateProps, type EmptyStateSize, EnergyFormat, EnergyUnit, type EnrollmentStatus, EnrollmentStatusBadge, type EnrollmentStatusBadgeProps, ErrorBoundary, type EventMarker, type EventMarkerType, type EventSpan, type ExportType, FacetConfig, FacetCounts, type FetchTile, type FetchTileContext, FieldFormat, FieldValue, FilterChips, type FilterChipsProps, FilterDialog, type FilterDialogProps, FilterState, FirmwareVersionBadge, type FirmwareVersionBadgeProps, Form, FormatRegistry, FormattedCell, type FormattedCellProps, FormattedValue, FormatterFunction, FunnelSeries, type FunnelSeriesProps, type FunnelStage as FunnelSeriesStage, GeoJsonLayerSpec, GlobalSearch, type GlobalSearchProps, Grid, type GridAlign, type GridCols, type GridFlow, type GridGap, type GridItemProps, type GridJustify, type GridProps, type GridSpan, GridState, GridStateBadge, type GridStateBadgeProps, type HealthStatus, HierarchyExplorer, type HierarchyExplorerProps, type HierarchyNode, HorizontalBarCell, type HorizontalBarCellProps, HoverCard, type HoverCardContentProps, type HoverCardRootProps, Icon$1 as Icon, IconName$2 as IconName, IndexCell, type IndexCellProps, InfiniteScrollIndicator, type InfiniteScrollIndicatorProps, Kpi, KpiGroup, type KpiGroupAlign, type KpiGroupCols, type KpiGroupGap, type KpiGroupProps, type KpiOrientation, type KpiProps, type KpiSize, type KpiStatus, LayerSpec, LineSeries, LinkBehavior, type LinkComponentType, List, ListBox, ListBoxItem, ListItem, type ListItemProps, ListPane, type ListPaneProps, type ListProps, LoadingState, MapStyleProvider, MiniBarCell, type MiniBarCellProps, ModalBackdrop, type ModalBackdropProps, type NodeState, type NonSerializableCellProp, Notice, NoticeContainer, type NoticeContainerProps, type NoticeOptions, type NoticeProps, NoticeProvider, type NoticeProviderProps, type NoticeVariant, NumberCell, type NumberCellProps, NumberFormat, type PageAsideProps, PageBanner, type PageBannerProps, type PageBreadcrumbItem, type PageContentProps, type PageHeaderProps, PageLayout, type PageLayoutProps, type PageScrollableContentProps, PhoneFormat, PieChart, type PieChartProps, type PieDataPoint, type Place, PlaceSearch, type PlaceSearchProps, Popover, PowerFormat, type PresetRange, ProgressBar, Prose, type ProseProps, type ProseSize, type ProseTone, RangeCalendar, RangeCell, type RangeCellProps, RasterLayerSpec, type RegisterPhosphorIconOptions, ResistanceFormat, type ResolutionLadder, type ResponsiveValue, ResultsCount, type ResultsCountProps, SEQUENTIAL_RAMPS, SKELETON_SIZES, SOURCE_UNIT_TO_WH, SearchConfig, SearchControl, type SearchControlProps, SearchEmptyState, type SearchEmptyStateProps, SearchLoadingState, type SearchLoadingStateProps, SearchResultGroup, type SearchResultGroupProps, SearchResultItem, type SearchResultItemProps, SearchResultsList, type SearchResultsListProps, SearchTrigger, type SearchTriggerProps, Section, SectionNav, type SectionNavItem, type SectionNavOrientation, type SectionNavProps, type SectionProps, type SectionSpacing, type SectionVariant, SelectCell, type SelectCellProps, type Serializable, SiteCard, type SiteCardProps, SiteContactCard, type SiteContactCardProps, SiteMetaCell, type SiteMetaCellProps, SiteMetaDisplay, type SiteMetaDisplayProps, Skeleton, Slider, SortControl, type SortControlProps, SortState, SparklineCell, type SparklineCellProps, SplitPane, type SplitPaneOrientation, type SplitPanePanelProps, type SplitPaneProps, type StatAlign, type StatFormatter, type StatItem, type StatLayout, StatList, type StatListProps, type StatThreshold, type StatTone$1 as StatTone, type StatValue, Tab, TabList, TabPanel, type TableExportMetadata, type TableExportOptions, Tabs, type TabsProps$1 as TabsProps, TemperatureFormat, TemperatureUnit, TemperatureUnitString, TextAreaWithChips, TextCell, type TextCellProps, TextFormat, type Tier, type TileAction, type TileData, type TileEntry, type TileRef, type TileStatus, type TileStore, type TiledCameraPreviewDomain, type TiledCameraSyncGroup, TiledTimeSeriesChart, type TiledTimeSeriesChartProps, type TiledTimeSeriesChartViewport, TiledTimeSeriesExplorer, type TiledTimeSeriesExplorerProps, type TiledTimeSeriesLiveControl, type TiledTimeSeriesSource, type TiledTimeSeriesView, TimeControls, type TimeControlsProps, type TimeRange, Timeline, TimelineItem, type TimelineItemProps, type TimelineItemVariant, ToggleButton, Tooltip, TooltipData, Tray, type TrayProps, type TrendPoint, type TypographyRole, type UseBreakpointReturn, type UseClientDataControlsOptions, type UseClientDataControlsResult, type UseDataControlsClientOptions, type UseDataControlsOptions, type UseDataControlsResult, type UseDataControlsServerOptions, type UseElementSizeResult, type UseServerDataControlsOptions, type UseTableExportOptions, type UseTableExportReturn, type UseTileWindowArgs, type UseTileWindowResult, type UseTiledTimeSeriesArgs, type UseTiledTimeSeriesResult, VectorLayerSpec, type Viewport, VoltageFormat, type WindowSize, type WindowSizeOption, YFormatType, applyDataOperations, assembleSeries, autoScaleCurrent, autoScaleDistance, autoScaleEnergy, autoScalePower, autoScaleResistance, autoScaleVoltage, camelCaseToWords, capitalize, celsiusToFahrenheit, celsiusToKelvin, centimetersToInches, classicPresetRanges, createFormat, createTextureIcon, createTiledCameraSyncGroup, csvUnitFor, csvValueFor, deltaDirectionFromValue, emptyStore, enumToSentenceCase, exportChart, exportTableAsCSV, fahrenheitToCelsius, fahrenheitToKelvin, feetToMeters, feetToMiles, formatBoolean, formatCapacity, formatCurrency, formatCurrent, formatDate, formatDistance, formatEmptyValue, formatEnergy, formatFieldValue, formatInternationalPhone, formatNumber, formatPercent, formatPhone, formatPhoneNumber, formatPower, formatPowerRating, formatResistance, formatTemperature, formatText, formatUSPhone, formatVoltage, getBadgeClasses, getBooleanBadgeVariant, getCellAlignmentClasses, getCellContainerClasses, getCellTextClasses, getColorRamp, getColorRampsByKind, getDateParts, getEventColor, getExportFormatName, getExportHeaders, getLinkClasses, getNumericColorClasses, getSkeletonSize, getStateTone, hasTileData, inchesToCentimeters, isCustomPinsLayer, isExportSupported, isGeoJsonLayer, isNil, isRasterLayer, isVectorLayer, kelvinToCelsius, kelvinToFahrenheit, kilometersToMiles, layer, metersToFeet, metersToMiles, metersToYards, milesToFeet, milesToKilometers, milesToMeters, parseBoolean, pickEnergyUnit, prepareTableDataForExport, registerPhosphorIcon, resolveValue, snakeCaseToWords, telemetryPresetRanges, temperatureStringToSymbol, tierForViewport, tileIndexAt, tileKey, tileReducer, tilesForViewport, toA, toActiveInactive, toAmps, toBoolean, toCelsius, toCentimeters, toCheckmark, toCompactNumber, toCurrency, toCustomDateFormat, toDateString, toEnabledDisabled, toFahrenheit, toFeet, toFloat, toFormattedNumber, toFullDateTime, toGW, toGWh, toGigawatts, toISOString, toInches, toInteger, toKA, toKV, toKW, toKelvin, toKiloamps, toKilohms, toKilometers, toKilovolts, toKilowatts, toLowerCase, toMA, toMV, toMW, toMWh, toMegawatts, toMegohms, toMeters, toMiles, toMilliamps, toMillimeters, toMilliohms, toMillivolts, toNauticalMiles, toOhms, toOnOff, toPercentage, toRelativeTime, toScientificNotation, toSecret, toSentenceCase, toTemperature, toTitleCase, toTrueFalse, toUpperCase, toV, toVolts, toW, toWatts, toWh, toYards, tokWh, truncateEnd, truncateMiddle, truncateStart, typeRole, typographyRole, ucFirst, useBreakpoint, useChartExpand, useChartHeaderMetrics, useChartHeaderWidth, useChartOwnsItsTitle, useClientDataControls, useColorMode, useContainerBreakpoint, useDataControls, useDebounce, useElementSize, useLocalStorage, useMapStyleOverride, useMediaQuery, useNotice, useServerDataControls, useTableExport, useTileWindow, useTiledTimeSeries, voltageReferenceLines, voltageYDomain, wrapWithLink, yardsToMeters };
9006
+ export { type Action, ActionCell, type ActionCellProps, ActivityFeed, ActivityFeedGroup, type ActivityFeedGroupProps, type ActivityFeedProps, type ActivityFeedSize, type ActivityFeedVariant, ActivityItem, type ActivityItemProps, type ActivityItemSurface, type ActivityItemTone, type AgentCellConfigOf, type AgentCellValueOf, type AgentSerializable, Alert, type AlertProps, type ApplyDataOperationsOptions, type ApplyDataOperationsResult, AreaSeries, type AssembleSeriesArgs, type AssembledSeries, AutoMobileRenderer, BREAKPOINTS, BadgeCell, type BadgeCellProps, BadgeProps, Banner, type BannerAction, type BannerAppearance, type BannerProps, type BannerVariant, BarSeries, BaseDataPoint, BaseInputProps, BooleanCell, type BooleanCellProps, BooleanFormat, BrandProvider, type BrandProviderProps, type BrandVariables, BreadcrumbItem, type BreadcrumbItemProps, Breadcrumbs, type Breakpoint, type BreakpointState, CATEGORICAL_RAMP, CHART_HEADER_HEIGHT, COLOR_RAMPS, Calendar, Card, CardContent, type CardContentProps, CardFooter, type CardFooterProps, CardHeader, type CardHeaderProps, CardMedia, type CardMediaProps, CardMobileRenderer, type CardProps, type CardVariant, CarouselAutoplayTrigger, CarouselControl, type CarouselControlProps, CarouselIndicator, CarouselIndicatorGroup, type CarouselIndicatorProps, CarouselItem, CarouselItemGroup, type CarouselItemGroupProps, type CarouselItemProps, CarouselNextTrigger, CarouselPrevTrigger, CarouselProgressText, CarouselRoot, type CarouselRootProps, type CarouselTriggerProps, CategoryBarChart, type CategoryDataPoint as CategoryBarChartDataPoint, type CategoryBarChartProps, CategoryCell, type CategoryCellProps, type CategoryDataPoint, CellAlignment, CellComponentProps, type CellConfigOf, CellEmphasis, type CellValueOf, ChartAxis, ChartBottomBar, ChartContainer, type ChartContainerWithSourceProps, ChartEventMarkers, type ChartEventMarkersProps, ChartEventSpans, type ChartEventSpansProps, type ChartExpand, ChartExpandOwnedByAncestor, type ChartExportMetadata, ChartHeader, type ChartHeaderProps, ChartLabelledBy, ChartOwnsItsTitle, type ChartSource, type ChartSourceHost, ChartSourceProvider, type ChartSourceProviderProps, type ChartSourceResolver, ChartTooltip, Chip, ChipInputField, type ChipInputFieldProps, type ClassicPresetId, Collapse, CollapseContent, type CollapseContentProps, type CollapseDensity, CollapseHeader, type CollapseHeaderProps, CollapseItem, type CollapseItemProps, type CollapseProps, type CollapseVariant, ColorModeProvider, type ColorRampInput, type ColorRampKind, type ColorRampOption, ColorSpec, Column, CommandPalette, type CommandPaletteProps, ComponentFormatter, Confirm, type ConfirmProps, ConnectionStatusBadge, type ConnectionStatusBadgeProps, ContactCard, type ContactCardProps, ContactMetaCell, type ContactMetaCellProps, ContactMetaDisplay, type ContactMetaDisplayProps, ContainerQueryProvider, CopyToClipboard, type Coverage, CurrencyFormat, CurrentFormat, CustomCell, type CustomCellProps, CustomPinsSpec, DEFAULT_CHART_HEIGHT, DEFAULT_PAGE_SIZE, DIVERGING_RAMPS, DataControls, type Filter as DataControlsFilter, type DataControlsProps, type SortOption as DataControlsSortOption, DataTable, DataTablePagination, DataTableProps, DateCell, type DateCellProps, DateFormat, DateRangePicker, DeltaCell, type DeltaCellProps, type DeltaDirection, type DeltaFormat, type DeltaTone, DeviceHealthBadge, type DeviceHealthBadgeProps, DeviceMetaCell, type DeviceMetaCellProps, DeviceMetaDisplay, type DeviceMetaDisplayProps, DeviceState, DeviceStateBadge, type DeviceStateBadgeProps, DeviceStateCell, type DeviceStateCellProps, DeviceStateWithMetric, type DeviceStateWithMetricProps, type DeviceType, DeviceTypeIcon, type DeviceTypeIconProps, DialogAction, DialogFooterConfig, DialogHeader, DialogHeaderConfig, type DialogHeaderProps, DistanceFormat, type ElementSize, EmptyState, type EmptyStateAction, type EmptyStateAlignment, type EmptyStateProps, type EmptyStateSize, EnergyFormat, EnergyUnit, type EnrollmentStatus, EnrollmentStatusBadge, type EnrollmentStatusBadgeProps, ErrorBoundary, type EventMarker, type EventMarkerType, type EventSpan, type ExportType, FacetConfig, FacetCounts, type FetchTile, type FetchTileContext, FieldFormat, FieldValue, FilterChips, type FilterChipsProps, FilterDialog, type FilterDialogProps, FilterState, FirmwareVersionBadge, type FirmwareVersionBadgeProps, Form, FormatRegistry, FormattedCell, type FormattedCellProps, FormattedValue, FormatterFunction, FunnelSeries, type FunnelSeriesProps, type FunnelStage as FunnelSeriesStage, GeoJsonLayerSpec, GlobalSearch, type GlobalSearchProps, Grid, type GridAlign, type GridCols, type GridFlow, type GridGap, type GridItemProps, type GridJustify, type GridProps, type GridSpan, GridState, GridStateBadge, type GridStateBadgeProps, type HealthStatus, HierarchyExplorer, type HierarchyExplorerProps, type HierarchyNode, HorizontalBarCell, type HorizontalBarCellProps, HoverCard, type HoverCardContentProps, type HoverCardRootProps, Icon$1 as Icon, IconName$2 as IconName, IndexCell, type IndexCellProps, InfiniteScrollIndicator, type InfiniteScrollIndicatorProps, type InlineChartSource, Kpi, KpiGroup, type KpiGroupAlign, type KpiGroupCols, type KpiGroupGap, type KpiGroupProps, type KpiOrientation, type KpiProps, type KpiSize, type KpiStatus, type LatestDataReadoutKind, LayerSpec, LineSeries, LinkBehavior, type LinkComponentType, List, ListBox, ListBoxItem, ListItem, type ListItemProps, ListPane, type ListPaneProps, type ListProps, LoadingState, MAX_PAGE_SIZE, MapStyleProvider, MiniBarCell, type MiniBarCellProps, ModalBackdrop, type ModalBackdropProps, type NodeState, type NonSerializableCellProp, Notice, NoticeContainer, type NoticeContainerProps, type NoticeOptions, type NoticeProps, NoticeProvider, type NoticeProviderProps, type NoticeVariant, NumberCell, type NumberCellProps, NumberFormat, type PageAsideProps, PageBanner, type PageBannerProps, type PageBreadcrumbItem, type PageContentProps, type PageHeaderProps, PageLayout, type PageLayoutProps, type PageScrollableContentProps, PaginationFooter, PhoneFormat, PieChart, type PieChartProps, type PieDataPoint, type Place, PlaceSearch, type PlaceSearchProps, Popover, PowerFormat, type PresetRange, ProgressBar, Prose, type ProseProps, type ProseSize, type ProseTone, RangeCalendar, RangeCell, type RangeCellProps, RasterLayerSpec, type RegisterPhosphorIconOptions, ResistanceFormat, type ResolutionLadder, type ResolvedChartSource, type ResponsiveValue, ResultsCount, type ResultsCountProps, SECTION_NAVIGATE_EVENT, SEQUENTIAL_RAMPS, SKELETON_SIZES, SOURCE_UNIT_TO_WH, SearchConfig, SearchControl, type SearchControlProps, SearchEmptyState, type SearchEmptyStateProps, SearchLoadingState, type SearchLoadingStateProps, SearchResultGroup, type SearchResultGroupProps, SearchResultItem, type SearchResultItemProps, SearchResultsList, type SearchResultsListProps, SearchTrigger, type SearchTriggerProps, Section, SectionNav, type SectionNavItem, type SectionNavOrientation, type SectionNavProps, type SectionProps, type SectionSpacing, type SectionVariant, SelectCell, type SelectCellProps, type Serializable, SiteCard, type SiteCardProps, SiteContactCard, type SiteContactCardProps, SiteMetaCell, type SiteMetaCellProps, SiteMetaDisplay, type SiteMetaDisplayProps, Skeleton, Slider, SortControl, type SortControlProps, SortState, SparklineCell, type SparklineCellProps, SplitPane, type SplitPaneOrientation, type SplitPanePanelProps, type SplitPaneProps, type StatAlign, type StatFormatter, type StatItem, type StatLayout, StatList, type StatListProps, type StatThreshold, type StatTone$1 as StatTone, type StatValue, StreamingChart, type StreamingChartConfig, type StreamingChartProps, type StreamingChartSource, Tab, TabList, TabPanel, TableDensity, type TableExportMetadata, type TableExportOptions, Tabs, type TabsProps$1 as TabsProps, TemperatureFormat, TemperatureUnit, TemperatureUnitString, TextAreaWithChips, TextCell, type TextCellProps, TextFormat, type Tier, type TileAction, type TileData, type TileEntry, type TileRef, type TileStatus, type TileStore, type TiledCameraPreviewDomain, type TiledCameraSyncGroup, TiledTimeSeriesChart, type TiledTimeSeriesChartProps, type TiledTimeSeriesChartViewport, TiledTimeSeriesExplorer, type TiledTimeSeriesExplorerProps, type TiledTimeSeriesLiveControl, type TiledTimeSeriesPanel, type TiledTimeSeriesSource, type TiledTimeSeriesView, TimeControls, type TimeControlsProps, type TimeRange, Timeline, TimelineItem, type TimelineItemProps, type TimelineItemVariant, ToggleButton, Tooltip, TooltipData, Tray, type TrayProps, type TrendPoint, type TypographyRole, type UseBreakpointReturn, type UseClientDataControlsOptions, type UseClientDataControlsResult, type UseDataControlsClientOptions, type UseDataControlsOptions, type UseDataControlsResult, type UseDataControlsServerOptions, type UseElementSizeResult, type UseServerDataControlsOptions, type UseTableExportOptions, type UseTableExportReturn, type UseTileWindowArgs, type UseTileWindowResult, type UseTiledTimeSeriesArgs, type UseTiledTimeSeriesResult, VectorLayerSpec, type Viewport, VoltageFormat, type WindowSize, type WindowSizeOption, YFormatType, applyDataOperations, assembleSeries, autoScaleCurrent, autoScaleDistance, autoScaleEnergy, autoScalePower, autoScaleResistance, autoScaleVoltage, camelCaseToWords, capitalize, celsiusToFahrenheit, celsiusToKelvin, centimetersToInches, classicPresetRanges, createFormat, createTextureIcon, createTiledCameraSyncGroup, csvUnitFor, csvValueFor, deltaDirectionFromValue, emptyStore, enumToSentenceCase, exportChart, exportTableAsCSV, fahrenheitToCelsius, fahrenheitToKelvin, feetToMeters, feetToMiles, formatBoolean, formatCapacity, formatCurrency, formatCurrent, formatDate, formatDistance, formatEmptyValue, formatEnergy, formatFieldValue, formatInternationalPhone, formatNumber, formatPercent, formatPhone, formatPhoneNumber, formatPower, formatPowerRating, formatResistance, formatTemperature, formatText, formatUSPhone, formatVoltage, getBadgeClasses, getBooleanBadgeVariant, getCellAlignmentClasses, getCellContainerClasses, getCellTextClasses, getColorRamp, getColorRampsByKind, getDateParts, getEventColor, getExportFormatName, getExportHeaders, getLinkClasses, getNumericAxisGutter, getNumericColorClasses, getSkeletonSize, getStateTone, hasTileData, inchesToCentimeters, isCustomPinsLayer, isExportSupported, isGeoJsonLayer, isNil, isRasterLayer, isStreamingSource, isVectorLayer, kelvinToCelsius, kelvinToFahrenheit, kilometersToMiles, layer, metersToFeet, metersToMiles, metersToYards, milesToFeet, milesToKilometers, milesToMeters, parseBoolean, parseInstant, pickEnergyUnit, prepareTableDataForExport, registerPhosphorIcon, resolvePagination, resolveValue, snakeCaseToWords, telemetryPresetRanges, temperatureStringToSymbol, tierForViewport, tileIndexAt, tileKey, tileReducer, tilesForViewport, toA, toActiveInactive, toAmps, toBoolean, toCelsius, toCentimeters, toCheckmark, toCompactNumber, toCurrency, toCustomDateFormat, toDateString, toEnabledDisabled, toFahrenheit, toFeet, toFloat, toFormattedNumber, toFullDateTime, toGW, toGWh, toGigawatts, toISOString, toInches, toInteger, toKA, toKV, toKW, toKelvin, toKiloamps, toKilohms, toKilometers, toKilovolts, toKilowatts, toLowerCase, toMA, toMV, toMW, toMWh, toMegawatts, toMegohms, toMeters, toMiles, toMilliamps, toMillimeters, toMilliohms, toMillivolts, toNauticalMiles, toOhms, toOnOff, toPercentage, toRelativeTime, toScientificNotation, toSecret, toSentenceCase, toTemperature, toTitleCase, toTrueFalse, toUpperCase, toV, toVolts, toW, toWatts, toWh, toYards, tokWh, truncateEnd, truncateMiddle, truncateStart, typeRole, typographyRole, ucFirst, useBreakpoint, useChartExpand, useChartHeaderMetrics, useChartHeaderWidth, useChartOwnsItsTitle, useChartSourceHost, useChartSourceResolver, useClientDataControls, useColorMode, useContainerBreakpoint, useDataControls, useDebounce, useElementSize, useLocalStorage, useMapStyleOverride, useMediaQuery, useNotice, useServerDataControls, useTableExport, useTileWindow, useTiledTimeSeries, voltageReferenceLines, voltageYDomain, wrapWithLink, yardsToMeters };