@ksp-gonogo/ui-kit 1.0.0-rc.21 → 1.0.0-rc.25

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,10 +1,10 @@
1
- import { AugmentDefinition, NamespacedAugmentSettings, SlotProps, Tone, Value, Reading, UncertaintyBand, BadgeEntry, BandKind, RailTags, RailDirection, RailContinuity, RailDelivery, CommandErrorCode, LimitBreach, ContributionSlotId, Contributed, ContributionEntry, ComponentSlotSegment, ComponentSlotRegistry, CelestialFacts, CelestialBody, HeldGrade, SeriesReckonedSpan, LockedValue, StreamStatusValue, ReckoningBasis, ComponentDefinition, TinyEssential, ComponentProps, PointUnit, WidgetScope } from '@ksp-gonogo/sitrep-sdk';
2
- export { AlertTone, AugmentDefinition, AugmentSettingField, BadgeEntry, ComponentSlotRegistry, ComponentSlotSegment, Contributed, ContributionEntry, ContributionRegistry, ContributionSlotId, KspCalendar, NamespacedAugmentSettings, Quantityish, RailContinuity, RailDelivery, RailDirection, RailTags, STANDARD_GRAVITY, STOCK_KERBIN_CALENDAR, SlotId, SlotProps, SlotRegistry, TINY_SIZE, Tone, UplinkClientIdentity, WidgetScope, WidgetScopeRegistry, asQuantityish, kspCalendar, kspYearDays, magnitudeOf, magnitudeOr, setKspCalendar } from '@ksp-gonogo/sitrep-sdk';
1
+ import { AugmentDefinition, NamespacedAugmentSettings, SlotProps, Tone, Value, Reading, UncertaintyBand, HeldGrade, BadgeEntry, RailTags, RailDirection, SampleKind, RailDelivery, CommandErrorCode, LimitBreach, ContributionSlotId, Contributed, ContributionEntry, ComponentSlotSegment, ComponentSlotRegistry, SystemPoses, CelestialBody, SeriesReckonedSpan, LockedValue, StreamStatusValue, ReckoningBasis, ComponentDefinition, TinyEssential, ComponentProps, PointUnit, WidgetScope } from '@ksp-gonogo/sitrep-sdk';
2
+ export { AlertTone, AugmentDefinition, AugmentSettingField, BadgeEntry, ComponentSlotRegistry, ComponentSlotSegment, Contributed, ContributionEntry, ContributionRegistry, ContributionSlotId, KspCalendar, NamespacedAugmentSettings, Quantityish, RailDelivery, RailDirection, RailTags, STANDARD_GRAVITY, STOCK_KERBIN_CALENDAR, SlotId, SlotProps, SlotRegistry, TINY_SIZE, Tone, UplinkClientIdentity, WidgetScope, WidgetScopeRegistry, asQuantityish, kspCalendar, kspYearDays, magnitudeOf, magnitudeOr, setKspCalendar } from '@ksp-gonogo/sitrep-sdk';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as react from 'react';
5
5
  import { ReactNode, CSSProperties, ComponentType, ReactElement, HTMLAttributes, ButtonHTMLAttributes, ComponentPropsWithoutRef, RefAttributes, SVGProps, ElementType, InputHTMLAttributes, FocusEvent, RefObject } from 'react';
6
- import { F as FormatQuantityOptions, a as FormatsFor, P as PresentableAs, U as UnitGroupKey, b as FormatsForKind, K as KindOfGroup, c as PresentableAsKind } from './units-Cl-8ZdJc.js';
7
- export { d as KnownQuantityKind, L as LadderName, Q as QuantityKind, e as QuantityScale, R as Rung, q as quantityScale, s as setQuantityLocale, f as speakQuantity, w as writeQuantity } from './units-Cl-8ZdJc.js';
6
+ import { F as FormatQuantityOptions, a as FormatsFor, P as PresentableAs, U as UnitGroupKey, b as FormatsForKind, K as KindOfGroup, c as PresentableAsKind } from './units-DZYIWBWP.js';
7
+ export { C as ConversionTargetsOfKind, d as KindOfSymbol, e as KnownQuantityKind, L as LadderName, f as LadderOfSymbol, Q as QuantityKind, g as QuantityScale, R as Rung, S as SymbolsOfKind, q as quantityScale, s as setQuantityLocale, h as speakQuantity, w as writeQuantity } from './units-DZYIWBWP.js';
8
8
  import * as styled_components_dist_types from 'styled-components/dist/types.js';
9
9
  import * as styled_components from 'styled-components';
10
10
  export { COL_WIDTH, GRID_MARGIN, ROW_HEIGHT, gridToPixels } from './gridUnits.js';
@@ -201,14 +201,14 @@ declare module "styled-components" {
201
201
  interface ActionMenuItem {
202
202
  /** Stable id handed back to `onSelect`. */
203
203
  key: string;
204
- /** The item's visible text, and its accessible name unless `ariaLabel` is set. */
204
+ /** The item's visible text, and its accessible name unless `aria-label` is set. */
205
205
  label: string;
206
206
  /** Optional grouping header; ungrouped items collapse into one flat list. */
207
207
  group?: string;
208
208
  /** Present but not currently firable: rendered dimmed and inert, still reachable. */
209
209
  disabled?: boolean;
210
210
  /** Overrides the accessible name when `label` alone is ambiguous out of context. */
211
- ariaLabel?: string;
211
+ "aria-label"?: string;
212
212
  }
213
213
  /**
214
214
  * Props for {@link ActionMenu}.
@@ -223,7 +223,7 @@ interface ActionMenuProps {
223
223
  /** Escape, Tab, or an outside pointer press. The caller restores trigger focus. */
224
224
  onDismiss: () => void;
225
225
  /** Accessible name for the menu itself: `role="menu"` needs one. */
226
- ariaLabel: string;
226
+ "aria-label": string;
227
227
  /** Positioning (the caller owns anchoring); merged over the menu's own frame styles. */
228
228
  style?: CSSProperties;
229
229
  /** Rendered above the items: a title row, a pending indicator, a delay readout. */
@@ -262,7 +262,7 @@ interface ActionMenuProps {
262
262
  * { key: "deploy", label: "Deploy chute" },
263
263
  * { key: "cut", label: "Cut chute", disabled: !deployed },
264
264
  * ]}
265
- * ariaLabel="Parachute actions"
265
+ * aria-label="Parachute actions"
266
266
  * style={{ position: "static" }}
267
267
  * onSelect={(key) => {
268
268
  * fire(key);
@@ -276,7 +276,7 @@ interface ActionMenuProps {
276
276
  *
277
277
  * @category Floating
278
278
  */
279
- declare function ActionMenu({ items, onSelect, onDismiss, ariaLabel, style, header, footer, emptyLabel, otherLabel, }: Readonly<ActionMenuProps>): react_jsx_runtime.JSX.Element;
279
+ declare function ActionMenu({ items, onSelect, onDismiss, "aria-label": ariaLabel, style, header, footer, emptyLabel, otherLabel, }: Readonly<ActionMenuProps>): react_jsx_runtime.JSX.Element;
280
280
 
281
281
  /**
282
282
  * One selectable capture device.
@@ -747,25 +747,34 @@ declare function useAugmentAvailable(augment: AnyAugment): boolean;
747
747
  * accepts. Each names what the space is for, and resolves to the `--gap-*`
748
748
  * CSS variable of the same name.
749
749
  *
750
- * - `related` and `section`: between related items, and between sections.
751
- * Both are smaller inside a {@link Card} than on a panel
752
- * - `related-comfortable`, `related-compact`, `related-dense`,
753
- * `related-packed`, `section-comfortable` and `section-compact`: the same
754
- * two spacings at one fixed density, whatever the container
755
- * - `rows`: between stacked rows that carry their own padding
756
- * - `caption`: under the line a caption belongs to
757
- * - `readout-row` and `label-value`: between the rows and between the columns
758
- * of a label/value grid
750
+ * - `related` and `section`: between related items, and between sections:
751
+ * 8px and 16px on a panel, 6px and 12px inside a {@link Card}
752
+ * - `related-comfortable` (8px), `related-compact` (6px), `related-dense`
753
+ * (4px), `related-packed` (2px), `section-comfortable` (16px) and
754
+ * `section-compact` (12px): the same two spacings at one fixed density,
755
+ * whatever the container
756
+ * - `rows` (2px): between stacked rows that carry their own padding
757
+ * - `caption` (2px): under the line a caption belongs to
758
+ * - `readout-row` (2px) and `label-value` (8px): between the rows and between
759
+ * the columns of a label/value grid
760
+ *
761
+ * The pixel values are the default sheet's; a host that mounts its own sheet
762
+ * may change them.
759
763
  *
760
764
  * @category Layout
761
765
  */
762
766
  type GapToken = "related" | "section" | "related-comfortable" | "related-compact" | "related-dense" | "related-packed" | "section-comfortable" | "section-compact" | "rows" | "caption" | "readout-row" | "label-value";
763
767
  /**
764
768
  * The padding names {@link Box}'s `pad` prop accepts, each resolving to the
765
- * `--inset-*` CSS variable of the same name: `chip`, `chip-roomy` and
766
- * `chip-readout` for small pills, `pill` for a stadium, `surface` and
767
- * `surface-standalone` for a block's own padding, `popover` for a floating
768
- * card.
769
+ * `--inset-*` CSS variable of the same name, given here as vertical then
770
+ * horizontal padding in the default sheet:
771
+ *
772
+ * - `chip` (1px 6px), `chip-roomy` (1px 8px) and `chip-readout` (2px 8px):
773
+ * small pills
774
+ * - `pill` (6px 12px): a stadium
775
+ * - `surface` (6px 8px) and `surface-standalone` (10px 12px): a block's own
776
+ * padding
777
+ * - `popover` (8px all round): a floating card
769
778
  *
770
779
  * @category Layout
771
780
  */
@@ -786,6 +795,7 @@ interface AutoEmptyStateProps extends HTMLAttributes<HTMLDivElement> {
786
795
  fallback: ReactNode;
787
796
  /** Gap between rendered children. Defaults to `related-dense`. */
788
797
  gap?: GapToken;
798
+ /** The content that may render nothing; when every child renders nothing, `fallback` shows instead. */
789
799
  children?: ReactNode;
790
800
  }
791
801
  /**
@@ -796,18 +806,94 @@ interface AutoEmptyStateProps extends HTMLAttributes<HTMLDivElement> {
796
806
  *
797
807
  * @example
798
808
  * ```tsx
799
- * // Each SensorRow renders null for a sensor that is switched off.
800
- * <AutoEmptyState fallback={<EmptyState>No sensors active</EmptyState>}>
801
- * {sensors.map((s) => (
802
- * <SensorRow key={s.id} sensor={s} />
803
- * ))}
804
- * </AutoEmptyState>
809
+ * import { AutoEmptyState, EmptyState, Text } from "@ksp-gonogo/ui-kit";
810
+ *
811
+ * interface Sensor {
812
+ * id: string;
813
+ * name: string;
814
+ * on: boolean;
815
+ * }
816
+ *
817
+ * // Renders nothing for a sensor that is switched off.
818
+ * function SensorRow({ sensor }: { sensor: Sensor }) {
819
+ * return sensor.on ? <Text>{sensor.name}</Text> : null;
820
+ * }
821
+ *
822
+ * function Sensors({ sensors }: { sensors: readonly Sensor[] }) {
823
+ * return (
824
+ * <AutoEmptyState fallback={<EmptyState>No sensors active</EmptyState>}>
825
+ * {sensors.map((s) => (
826
+ * <SensorRow key={s.id} sensor={s} />
827
+ * ))}
828
+ * </AutoEmptyState>
829
+ * );
830
+ * }
805
831
  * ```
806
832
  *
807
833
  * @category EmptyState
808
834
  */
809
835
  declare function AutoEmptyState({ fallback, gap, children, ...rest }: AutoEmptyStateProps): react_jsx_runtime.JSX.Element;
810
836
 
837
+ /**
838
+ * One person in an {@link AvatarStack}.
839
+ *
840
+ * @category Badge
841
+ */
842
+ interface AvatarStackItem {
843
+ /** Stable key. */
844
+ id: string;
845
+ /** The full name: the avatar's tooltip and accessible name. The initials are drawn from it. */
846
+ name: string;
847
+ /** Colours the avatar's edge and initials. Absent, neutral. */
848
+ tone?: Tone;
849
+ /** Makes this avatar a button that calls this when pressed. Absent, the avatar is not a control. */
850
+ onSelect?: () => void;
851
+ }
852
+ /**
853
+ * Props for {@link AvatarStack}.
854
+ *
855
+ * @category Badge
856
+ */
857
+ interface AvatarStackProps {
858
+ /** Everyone to show, in order. The first ones are drawn and the rest fold into the overflow count. */
859
+ items: readonly AvatarStackItem[];
860
+ /**
861
+ * How many places the stack has, the overflow count included. The stack
862
+ * reserves this many places whatever `items` holds, so it never changes size.
863
+ * Absent, 3.
864
+ */
865
+ max?: number;
866
+ /** Names the group for assistive technology, when it is not already labelled by its surroundings. */
867
+ label?: string;
868
+ }
869
+ /**
870
+ * Up to two letters standing for a name: the first letters of its first two
871
+ * words, or the first two letters of a single word.
872
+ *
873
+ * @category Badge
874
+ */
875
+ declare function initialsOf(name: string): string;
876
+ /**
877
+ * A row of small round initials badges, overlapped, for showing who is
878
+ * involved in something without room for their names. Each avatar's tooltip
879
+ * and accessible name is the full name.
880
+ *
881
+ * Its footprint is fixed by `max` and never by the number of items: with more
882
+ * people than places, the last place becomes a "+k" count whose tooltip lists
883
+ * the names it hides, and with fewer the unused places stay empty.
884
+ *
885
+ * @example
886
+ * ```tsx
887
+ * <AvatarStack
888
+ * label="Speaking"
889
+ * items={[{ id: "a", name: "Ares 4" }, { id: "w", name: "Woomera Range" }]}
890
+ * />
891
+ * ```
892
+ *
893
+ * @category Badge
894
+ */
895
+ declare function AvatarStack({ items, max, label, }: AvatarStackProps): react_jsx_runtime.JSX.Element;
896
+
811
897
  /**
812
898
  * A point in viewport (client) coordinates.
813
899
  *
@@ -909,7 +995,9 @@ interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
909
995
  * can summarise it. `id` must be stable for the badge's lifetime. `label`
910
996
  * defaults to the badge's text content when `children` is a plain string; pass
911
997
  * it explicitly otherwise. A `go` badge with `report` still registers, but
912
- * any worse state in the panel wins the summary over it.
998
+ * any worse state in the panel wins the summary over it. Outside a panel
999
+ * there is no store to register into, so `report` does nothing and the badge
1000
+ * draws as usual.
913
1001
  */
914
1002
  report?: {
915
1003
  id: string;
@@ -920,7 +1008,8 @@ interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
920
1008
  }
921
1009
  /**
922
1010
  * A compact uppercase pill that shows a label in one `Tone`. A stateful tone
923
- * (`info`, `go`, `caution`, `warn`, `nogo` or `offline`) draws an outlined
1011
+ * (`info`, `go`, `caution`, `warn`, `nogo` or `offline`; `Tone` has the full
1012
+ * set and `Button` takes a narrower one) draws an outlined
924
1013
  * pill in that tone's colour, with a glow that grows with severity; no tone, or `neutral`, draws
925
1014
  * a grey rounded chip for a kind tag or a count. The panel's summary badge and
926
1015
  * {@link StreamStatusBadge} are both drawn with it.
@@ -1063,13 +1152,14 @@ interface Resolved<Unit extends string> {
1063
1152
  */
1064
1153
  mark: ReckoningKind | null;
1065
1154
  /**
1066
- * Whether the number is a fact the contract declares static, which is never
1155
+ * Whether the number is a fact the contract declares static (one that never
1156
+ * changes, such as a body's radius), which is never
1067
1157
  * old and so is never marked held, whatever the reading's state.
1068
1158
  */
1069
1159
  isStatic: boolean;
1070
1160
  /**
1071
1161
  * Whether the number is exact at any instant: computed from fixed inputs and
1072
- * the clock, as a figure between two bodies on fixed conics is. It moves, so
1162
+ * the clock, as a figure between two bodies on fixed conics (orbits that never change) is. It moves, so
1073
1163
  * it is not static, and it is never a guess, so it takes no held or modelled
1074
1164
  * mark whatever the reading's state.
1075
1165
  */
@@ -1098,7 +1188,8 @@ interface CurrencyOptions {
1098
1188
  * than its observation: a countdown, or a figure a widget solves forward.
1099
1189
  * The modelled figure is then marked wherever it is not a reading of now,
1100
1190
  * which under signal delay includes a current reading carried forward to the
1101
- * craft's own present (SCET, spacecraft event time).
1191
+ * craft's own present (SCET, spacecraft event time: when the event happens
1192
+ * at the craft, rather than when its telemetry reaches the command centre).
1102
1193
  */
1103
1194
  readonly drawsReckoning?: boolean;
1104
1195
  }
@@ -1143,9 +1234,38 @@ interface ReckoningMarking {
1143
1234
  *
1144
1235
  * @category Unit
1145
1236
  */
1146
- declare function derivedMarking(reading: Reading<unknown> | null | undefined,
1237
+ declare function derivedMarking(
1238
+ /** The reading the figure was computed from. Null or undefined gives no mark. */
1239
+ reading: Reading<unknown> | null | undefined,
1147
1240
  /** The figure is carried by a model that the reading itself does not name, such as a position the map models from the orbit. */
1148
1241
  carried?: boolean): ReckoningMarking | null;
1242
+ /**
1243
+ * How a figure is marked from a `held` field: the reading the figure was drawn
1244
+ * from, or just its grade, as a contributed entry or an augment slot's props
1245
+ * carry it. `null` unless that reading is held or modelled, so the reading can
1246
+ * be passed unconditionally. The same marking {@link derivedMarking} gives.
1247
+ *
1248
+ * @category Unit
1249
+ */
1250
+ declare function heldMarking(held: HeldGrade | Reading<unknown> | undefined): ReckoningMarking | null;
1251
+ /**
1252
+ * The held grade of a `held` field, for something drawn as a verdict (a tone,
1253
+ * a badge) rather than a figure: `undefined` unless the reading it names is
1254
+ * held. A held reading derived from several, which may carry no single grade,
1255
+ * reads as plain `"held"`.
1256
+ *
1257
+ * @category Unit
1258
+ */
1259
+ declare function heldGradeOf(held: HeldGrade | Reading<unknown> | undefined): HeldGrade | undefined;
1260
+ /**
1261
+ * A figure as the reading its `held` field says it came from: the figure
1262
+ * itself while that reading is current, and a held reading of it, dated by the
1263
+ * reading's `asOfUt` where it has one, while it is held. Hand the result to
1264
+ * any primitive that takes a {@link UnitValue}.
1265
+ *
1266
+ * @category Unit
1267
+ */
1268
+ declare function heldFigureOf<Unit extends string>(figure: Value<Unit>, held: HeldGrade | Reading<unknown> | undefined): UnitValue<Unit>;
1149
1269
 
1150
1270
  /**
1151
1271
  * Props for {@link Unit}. The formatter options it extends (`decimals`, `scale` and the rest) apply to the number drawn.
@@ -1205,6 +1325,7 @@ interface UnitProps<UnitSymbol extends string = string> extends Omit<FormatQuant
1205
1325
  elsewhere?: string | null;
1206
1326
  /** A bare unit token, rendered as a symbol with no number. Used only when `value` is not passed; prefer passing a value. */
1207
1327
  children?: ReactNode;
1328
+ /** A class for the outer element, so a styled-component can extend it. */
1208
1329
  className?: string;
1209
1330
  }
1210
1331
  /**
@@ -1219,13 +1340,13 @@ interface UnitProps<UnitSymbol extends string = string> extends Omit<FormatQuant
1219
1340
  *
1220
1341
  * With `reckoned`, a reading with a model draws the model's figure and marks it modelled (a blue triangle) wherever it is not a reading of now.
1221
1342
  *
1222
- * The mark is out of flow, so a column never reflows when a channel goes quiet, and it is not a live region: a widget that wants the change announced wraps its readout in `role="status"`. Without `reckoned` it never draws a reckoned figure.
1343
+ * The mark is out of flow, so a column never reflows when a channel goes quiet, and it is not a live region: a widget that wants the change announced wraps its readout in `role="status"`. Without `reckoned` it never draws a reckoned figure, so a modelled value never passes for an observed one; do not pull a figure out of a reading's reckoning and hand it to a plain `Unit`.
1223
1344
  *
1224
1345
  * A held reading whose model publishes an {@link UncertaintyBand} also shows the interval (`1 km ± 0.025 km`, `1 km (0.97 to 1.03 km)`, `1 km (~1.2 km)`). A current reading shows none, and a band in another unit draws nothing.
1225
1346
  *
1226
- * The symbol is sized relative to the text around it (never below 10px) and takes its colour, so it needs no size or tone prop and keeps the value's tone at the value's contrast. Plane angles attach to the number and keep full size. Every symbol is replaced in the accessibility tree by its spoken word.
1347
+ * The symbol is sized relative to the text around it (never below 10px) and takes its colour, so it needs no size or tone prop and keeps the value's tone at the value's contrast. A symbol that attaches to the number (`22°`, but `22 °C`) is set with no space and keeps full size: the plane-angle marks and the currency marks. Every symbol is replaced in the accessibility tree by its spoken word.
1227
1348
  *
1228
- * `<Unit>` is the one way to put a quantity on screen. Hand it the value as it arrived (SI, never pre-scaled) and let it choose the unit; pin one with `format` or convert with `as` only where convention calls for it.
1349
+ * `<Unit>` is the way to put a quantity on screen as a React node. Where only text is accepted (an SVG `<text>`, a tooltip, a canvas), write it with {@link writeQuantity} instead. Hand it the value as it arrived (SI, never pre-scaled) and let it choose the unit; pin one with `format` or convert with `as` only where convention calls for it.
1229
1350
  *
1230
1351
  * @example
1231
1352
  * ```tsx
@@ -1250,10 +1371,12 @@ interface UnitProps<UnitSymbol extends string = string> extends Omit<FormatQuant
1250
1371
  *
1251
1372
  * @category Unit
1252
1373
  * @categoryDescription Unit
1253
- * Drawing a quantity: a value with its unit, formatted the same way everywhere,
1254
- * marked when it is held or reckoned instead of current, with bands for a
1255
- * figure known only within limits and the null token for no value. Every number
1256
- * with a unit is drawn through a {@link Unit}.
1374
+ * Drawing a quantity. A {@link Unit} puts a value with its unit on screen,
1375
+ * formatted the same way everywhere, and every number with a unit is drawn
1376
+ * through one. Around it sit the marks for a figure that is held or modelled
1377
+ * instead of current, the bands for a figure known only within limits, the
1378
+ * null token for no value, and the helpers that write a quantity as text where
1379
+ * a node will not do.
1257
1380
  */
1258
1381
  declare function Unit<UnitSymbol extends string = string>({ value, children, className, hideUnitInGroup, reckoned, marked, elsewhere, ...opts }: UnitProps<UnitSymbol>): react_jsx_runtime.JSX.Element;
1259
1382
 
@@ -1281,6 +1404,7 @@ interface BandProps<UnitSymbol extends string = string> extends Pick<UnitProps<U
1281
1404
  * the way round instead of printing a meaningless width.
1282
1405
  */
1283
1406
  wrapsAt?: number;
1407
+ /** A class for the outer element, so a styled-component can extend it. */
1284
1408
  className?: string;
1285
1409
  }
1286
1410
  /**
@@ -1390,9 +1514,14 @@ declare function BlockRoot({ ...props }: BlockProps): ReactNode;
1390
1514
  *
1391
1515
  * `titleRight` is not `right`: `titleRight` holds badges on the name's line and
1392
1516
  * wraps under the name when narrow, while `right` sits beside the whole body
1393
- * and drops below it when narrow. The parts (`Block.Title`, `Block.TitleRow`,
1394
- * `Block.Body`, `Block.Aside`, `Block.Footer`) are there for a record that
1395
- * needs its own composition but the same type and spacing.
1517
+ * and drops below it when narrow. The parts are there for a record that needs
1518
+ * its own composition but the same type and spacing:
1519
+ *
1520
+ * - `Block.Title`: the heading text, sized and weighted as the `title` prop is
1521
+ * - `Block.TitleRow`: the title's line, holding `left`, the title and `right` badges
1522
+ * - `Block.Body`: the figures under the title
1523
+ * - `Block.Aside`: content beside or below the body (the `left`, `right`, `top` and `bottom` props)
1524
+ * - `Block.Footer`: the line of actions at the foot
1396
1525
  *
1397
1526
  * @example
1398
1527
  * ```tsx
@@ -1431,8 +1560,8 @@ type BoxSurface = "app" | "panel" | "raised" | "sunken";
1431
1560
  /**
1432
1561
  * The corner radii {@link Box} accepts: `regular` for ordinary controls, rows
1433
1562
  * and cards, `floating` for something that sits above the app (a dialog, a
1434
- * menu), and `pill` for a fully rounded stadium. The display-frame corner is
1435
- * reserved for {@link FramedDisplay}.
1563
+ * menu), and `pill` for a fully rounded stadium. {@link FramedDisplay} has a corner
1564
+ * of its own that a `Box` cannot take.
1436
1565
  *
1437
1566
  * @category Layout
1438
1567
  */
@@ -1458,6 +1587,7 @@ interface BoxProps extends HTMLAttributes<HTMLDivElement> {
1458
1587
  bordered?: boolean;
1459
1588
  /** Corner radius. Omit for square corners. */
1460
1589
  radius?: BoxRadius;
1590
+ /** The content inside the padding and border. */
1461
1591
  children?: ReactNode;
1462
1592
  }
1463
1593
  /**
@@ -1549,17 +1679,29 @@ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
1549
1679
  declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAttributes<HTMLButtonElement>>;
1550
1680
  /**
1551
1681
  * A subtle, underlined link-style `button` for a tertiary action inside copy
1552
- * (such as "Clear all" in a list row). For a paired Cancel and Confirm row,
1553
- * use a ghost {@link Button} beside a primary one.
1682
+ * (such as "Clear all" in a list row). It renders a native `button` and takes
1683
+ * every prop that element does. For a paired Cancel and Confirm row, use a
1684
+ * ghost {@link Button} beside a primary one. For words that are themselves the
1685
+ * control and should keep the surrounding text's colour and type, use a
1686
+ * {@link Button} with `variant="text"` instead.
1554
1687
  *
1555
1688
  * @category Button
1556
1689
  */
1557
1690
  declare const TextButton: styled_components_dist_types.IStyledComponentBase<"web", styled_components.FastOmit<react.DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, never> & Partial<Pick<react.DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, never>>> & string;
1691
+ /**
1692
+ * Props for {@link IconButton}. Any other `button` attribute passes through.
1693
+ *
1694
+ * @category Button
1695
+ */
1696
+ interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
1697
+ /** Makes the button a toggle: sets `aria-pressed` and, while true, draws the pressed look. */
1698
+ pressed?: boolean;
1699
+ }
1558
1700
  /**
1559
1701
  * An icon-only `button` with no chrome, just the glyph. Give it an
1560
1702
  * `aria-label`, since the icon inside is decorative. As a toggle, with
1561
- * `aria-pressed`, it takes the filled pressed look while pressed. Under a
1562
- * coarse pointer it grows to a 44px touch target.
1703
+ * `pressed`, it sets `aria-pressed` and takes the filled pressed look while
1704
+ * pressed. The ref reaches the `button` element. Under a coarse pointer it grows to a 44px touch target.
1563
1705
  *
1564
1706
  * @example
1565
1707
  * ```tsx
@@ -1576,7 +1718,7 @@ declare const TextButton: styled_components_dist_types.IStyledComponentBase<"web
1576
1718
  *
1577
1719
  * @category Button
1578
1720
  */
1579
- declare const IconButton: styled_components_dist_types.IStyledComponentBase<"web", styled_components.FastOmit<react.DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, never> & Partial<Pick<react.DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, never>>> & string;
1721
+ declare const IconButton: react.ForwardRefExoticComponent<IconButtonProps & react.RefAttributes<HTMLButtonElement>>;
1580
1722
 
1581
1723
  /**
1582
1724
  * Props for {@link ButtonGroup}. Any other `div` attribute passes through, and
@@ -1593,6 +1735,7 @@ interface ButtonGroupProps extends HTMLAttributes<HTMLDivElement> {
1593
1735
  equalWidth?: boolean;
1594
1736
  /** Gap between buttons, one of the {@link GapToken} names. Omitted, it is the container's `related` gap. */
1595
1737
  gap?: GapToken;
1738
+ /** The buttons to lay out together. */
1596
1739
  children?: ReactNode;
1597
1740
  }
1598
1741
  /**
@@ -1641,20 +1784,6 @@ declare function badgeFace(entry: BadgeEntry & {
1641
1784
  title?: string;
1642
1785
  }): BadgeFace;
1643
1786
 
1644
- /**
1645
- * What a band claims, in plain language, for a surface that speaks it rather
1646
- * than draws it. A hard bound and a one-sigma interval are both said as plain
1647
- * containment, with no statistics vocabulary, so `claimed` is returned
1648
- * unchanged for every `kind`.
1649
- *
1650
- * `claimed` is the containment statement in the calling surface's own grammar:
1651
- * an interval for a meter (`"with bands at 30 percent and 44 percent"`), a
1652
- * whole clause for a chart whose shaded region varies per sample.
1653
- *
1654
- * @category Unit
1655
- */
1656
- declare function bandClaim(_kind: BandKind, claimed: string): string;
1657
-
1658
1787
  /**
1659
1788
  * Props for {@link Card}: everything {@link BlockProps} takes, plus the
1660
1789
  * surface's own marks.
@@ -1688,6 +1817,7 @@ interface CardProps extends BlockProps {
1688
1817
  * this card's padding changes, not the spacing of what it holds.
1689
1818
  */
1690
1819
  standalone?: boolean;
1820
+ /** What the card holds. */
1691
1821
  children?: ReactNode;
1692
1822
  }
1693
1823
  declare function CardRoot({ tone, dimmed, identityColor, standalone, ...props }: CardProps): ReactNode;
@@ -1767,6 +1897,7 @@ interface ClusterProps extends HTMLAttributes<HTMLDivElement> {
1767
1897
  * never silently turns into a ragged block; chip strips and tag lists opt in.
1768
1898
  */
1769
1899
  wrap?: boolean;
1900
+ /** The items, laid out in a row. */
1770
1901
  children?: ReactNode;
1771
1902
  }
1772
1903
  /**
@@ -1852,7 +1983,7 @@ interface ComboboxListboxProps<Option extends ComboboxOption> {
1852
1983
  * control is not a literal `<input role="combobox">`, since an unnamed
1853
1984
  * `role="listbox"` is an accessibility violation.
1854
1985
  */
1855
- ariaLabel?: string;
1986
+ "aria-label"?: string;
1856
1987
  /**
1857
1988
  * Which side of the control the list opens on. Defaults to `"below"`.
1858
1989
  * `"above"` is for a control at the foot of a clipping container, such as a
@@ -1909,6 +2040,7 @@ interface ComboboxListboxProps<Option extends ComboboxOption> {
1909
2040
  * aria-activedescendant={activeOption ? optionId(activeOption.key) : undefined}
1910
2041
  * value={query}
1911
2042
  * onFocus={() => setOpen(true)}
2043
+ * // Safe to close on blur: pressing an option does not take focus from the input.
1912
2044
  * onBlur={() => setOpen(false)}
1913
2045
  * onChange={(e) => {
1914
2046
  * setQuery(e.target.value);
@@ -1940,7 +2072,7 @@ interface ComboboxListboxProps<Option extends ComboboxOption> {
1940
2072
  *
1941
2073
  * @category Form
1942
2074
  */
1943
- declare function ComboboxListbox<Option extends ComboboxOption>({ id, groups, flatOptions, activeIndex, selectedKey, getOptionId, onHoverIndex, onSelectKey, renderItem, emptyLabel, ariaLabel, placement, }: Readonly<ComboboxListboxProps<Option>>): react_jsx_runtime.JSX.Element;
2075
+ declare function ComboboxListbox<Option extends ComboboxOption>({ id, groups, flatOptions, activeIndex, selectedKey, getOptionId, onHoverIndex, onSelectKey, renderItem, emptyLabel, "aria-label": ariaLabel, placement, }: Readonly<ComboboxListboxProps<Option>>): react_jsx_runtime.JSX.Element;
1944
2076
 
1945
2077
  /**
1946
2078
  * How the rail DRAWS an entry, given what the entry says it is.
@@ -1950,12 +2082,14 @@ declare function ComboboxListbox<Option extends ComboboxOption>({ id, groups, fl
1950
2082
  * the mod declares. This file is the other half: one accessor per axis, and a
1951
2083
  * TABLE saying which combination each renderer draws.
1952
2084
  *
1953
- * | direction | continuity | delivery | a real example | drawn by |
2085
+ * | direction | kind | delivery | a real example | drawn by |
1954
2086
  * |-----------|------------|------------------|---------------------------------|--------------------|
1955
- * | command | discrete | acked | staging, an action group | `in-flight-row` |
2087
+ * | command | event | acked | staging, an action group | `in-flight-row` |
2088
+ * | command | discrete | acked | a mode held until changed | `in-flight-row` |
1956
2089
  * | command | continuous | acked | fly-by-wire, ack = the readback | `continuous-strip` |
1957
2090
  * | telemetry | continuous | fire-and-forget | radio voice | `continuous-strip` |
1958
- * | telemetry | discrete | fire-and-forget | a science result sent home | `in-flight-row` |
2091
+ * | telemetry | event | fire-and-forget | a science result sent home | `in-flight-row` |
2092
+ * | telemetry | discrete | fire-and-forget | a state reported as it changes | `in-flight-row` |
1959
2093
  *
1960
2094
  * The table names a RENDERER (a component). WHICH MARK it draws follows from
1961
2095
  * the data: both continuous rows share one strip, lines for a value against a
@@ -1969,10 +2103,11 @@ declare function ComboboxListbox<Option extends ComboboxOption>({ id, groups, fl
1969
2103
  */
1970
2104
 
1971
2105
  /** One combination, spelled as the table's key; a template-literal type, so the table cannot hold a typo. */
1972
- type RailTagKey = `${RailDirection}/${RailContinuity}/${RailDelivery}`;
2106
+ type RailTagKey = `${RailDirection}/${SampleKind}/${RailDelivery}`;
1973
2107
  /**
1974
- * A handle's three rail axes as one `direction/continuity/delivery` string, e.g. `command/discrete/acked`.
2108
+ * A handle's three rail axes as one `direction/kind/delivery` string, e.g. `command/event/acked`.
1975
2109
  *
2110
+ * @intent Published so a representation of the rail of a third party can key its entries by the same tag combination the kit does.
1976
2111
  * @category CommandDelay
1977
2112
  */
1978
2113
  declare function railTagKey(tags: RailTags): RailTagKey;
@@ -2043,7 +2178,7 @@ interface ControlRibbonDatum {
2043
2178
  /**
2044
2179
  * What this entry IS on the three axes, in full, and NOT optional. A
2045
2180
  * producer builds them with {@link railTagsForTelemetry}, passing its
2046
- * continuity.
2181
+ * sample kind.
2047
2182
  */
2048
2183
  tags: RailTags;
2049
2184
  }
@@ -2067,7 +2202,7 @@ interface ControlDelayStreamProps {
2067
2202
  */
2068
2203
  ribbons?: ControlRibbonDatum[];
2069
2204
  /** Accessible label for the graph. Defaults to "Controls in flight". */
2070
- ariaLabel?: string;
2205
+ "aria-label"?: string;
2071
2206
  /**
2072
2207
  * `"inline"` (default, 40px) is the in-widget rendering; `"rail"` (16px, no
2073
2208
  * labels) is the collapsed drag-bar strip; `"expanded"` is the full-bleed,
@@ -2084,6 +2219,7 @@ interface ControlDelayStreamProps {
2084
2219
  * The one-way delay, in seconds, under which {@link ControlDelayStream} draws no
2085
2220
  * command streams. Ribbons draw at any positive delay.
2086
2221
  *
2222
+ * @intent Published so a representation of the rail of a third party can agree with ControlDelayStream on when streams are drawn.
2087
2223
  * @category CommandDelay
2088
2224
  */
2089
2225
  declare const STREAM_MIN_DELAY_SECONDS = 0.05;
@@ -2092,6 +2228,7 @@ declare const STREAM_MIN_DELAY_SECONDS = 0.05;
2092
2228
  * wide): the T divider, a third of the plot. It never moves with delivery;
2093
2229
  * delivery only decides whether anything is drawn past it.
2094
2230
  *
2231
+ * @intent Published so a representation of the rail of a third party can place its divider where ControlDelayStream places the T.
2095
2232
  * @category CommandDelay
2096
2233
  */
2097
2234
  declare function ribbonBoundaryX(variant?: ControlDelayStreamVariant): number;
@@ -2111,7 +2248,7 @@ declare function ribbonBoundaryX(variant?: ControlDelayStreamVariant): number;
2111
2248
  *
2112
2249
  * @category CommandDelay
2113
2250
  */
2114
- declare function ControlDelayStream({ streams, ribbons, ariaLabel, variant, delayReading, }: ControlDelayStreamProps): react_jsx_runtime.JSX.Element | null;
2251
+ declare function ControlDelayStream({ streams, ribbons, "aria-label": ariaLabel, variant, delayReading, }: ControlDelayStreamProps): react_jsx_runtime.JSX.Element | null;
2115
2252
 
2116
2253
  /**
2117
2254
  * One dispatch that got no reply, as much of it as the sentence needs. The entries in `useCommand`'s `losses` satisfy it.
@@ -2263,8 +2400,16 @@ declare function commandFoundSentence(found: CommandFoundLike): string;
2263
2400
  * @category CommandDelay
2264
2401
  */
2265
2402
  interface CommandRefusalLike {
2403
+ /** Why the command was refused, as one of the root codes every Uplink shares, such as
2404
+ * `CommandErrorCode.InsufficientFunds`, whose string value (the one on the
2405
+ * wire) is `"insufficientFunds"`. */
2266
2406
  errorCode: CommandErrorCode;
2267
- /** The refinement's id, when the refusal was more specific than its root `errorCode`. */
2407
+ /**
2408
+ * The refinement's id, when the refusal was more specific than its root
2409
+ * `errorCode`. A refinement is a narrower reason an Uplink declares under a
2410
+ * root code, such as a particular kind of `wrongState`; a client that does
2411
+ * not know it still reads the root.
2412
+ */
2268
2413
  reason?: string;
2269
2414
  /** The command id that was dispatched, e.g. `career.facility.upgrade`. */
2270
2415
  command?: string;
@@ -2435,7 +2580,7 @@ interface InFlightListProps {
2435
2580
  */
2436
2581
  orientation?: "column" | "row";
2437
2582
  /** Accessible label for the list region. Defaults to "In-flight commands". */
2438
- ariaLabel?: string;
2583
+ "aria-label"?: string;
2439
2584
  /**
2440
2585
  * `"inline"` (default) is the monospace row/badge list. `"rail"` is the
2441
2586
  * Panel rail's 16px strip: each command is a soft glow grazing the top edge,
@@ -2458,9 +2603,13 @@ interface InFlightListProps {
2458
2603
  *
2459
2604
  * @category CommandDelay
2460
2605
  */
2461
- declare function InFlightList({ items, mode, density, orientation, ariaLabel, variant, onDismiss, }: InFlightListProps): react_jsx_runtime.JSX.Element | null;
2606
+ declare function InFlightList({ items, mode, density, orientation, "aria-label": ariaLabel, variant, onDismiss, }: InFlightListProps): react_jsx_runtime.JSX.Element | null;
2462
2607
 
2463
- /** The structural subset of an in-flight command that this mapping reads. */
2608
+ /**
2609
+ * The structural subset of an in-flight command that this mapping reads.
2610
+ *
2611
+ * @category CommandDelay
2612
+ */
2464
2613
  interface InFlightCommandLike {
2465
2614
  /** Stable for the entry's lifetime, so the list keeps its row as it moves. */
2466
2615
  id: string;
@@ -2492,7 +2641,8 @@ interface InFlightCommandLike {
2492
2641
  declare function toInFlightListItems(items: readonly InFlightCommandLike[]): InFlightListItem[];
2493
2642
 
2494
2643
  /**
2495
- * What {@link CommandDelay} and the Panel delay rail read from a command: its
2644
+ * What {@link CommandDelay} and the Panel delay rail (the strip at the top of a
2645
+ * panel showing commands still crossing to the craft) read from a command: its
2496
2646
  * in-flight rows, its delay, and what became of its dispatches. Declared
2497
2647
  * structurally; {@link useCommand}'s return value satisfies it.
2498
2648
  *
@@ -2505,7 +2655,11 @@ interface CommandDelayHandle {
2505
2655
  */
2506
2656
  inFlight: InFlightCommandLike[];
2507
2657
  /**
2508
- * What this entry IS on the rail's three axes, in full. The renderer follows
2658
+ * What this entry IS on the delay rail's three axes, in full: `direction`
2659
+ * (a `command` leaving or `telemetry` arriving), `kind` (`event` or
2660
+ * `discrete`, one point, or `continuous`, a span) and `delivery` (`acked`, answered, or
2661
+ * `fire-and-forget`). The delay rail is the strip a panel draws above its
2662
+ * header to show what is crossing the signal delay. The renderer follows
2509
2663
  * from these, so no consumer branches on what kind of command this is. A
2510
2664
  * command handle gets them from {@link useCommand}; a producer that is not a
2511
2665
  * command (an open microphone) states them with {@link railTagsForTelemetry}.
@@ -2540,7 +2694,7 @@ interface CommandDelayHandle {
2540
2694
  * what it is. A voice ribbon names the transmission it is drawing; a control
2541
2695
  * axis is happy with the default.
2542
2696
  */
2543
- ariaLabel?: string;
2697
+ "aria-label"?: string;
2544
2698
  /**
2545
2699
  * Dispatches from this command the GAME REFUSED, until dismissed. Rendered by
2546
2700
  * the Panel rail under both queues, never by `<CommandDelay>`: a refusal is
@@ -2597,7 +2751,7 @@ interface CommandDelayProps {
2597
2751
  * Accessible label for the rendered region. Left undefined, each branch
2598
2752
  * keeps its own default ("In-flight commands" / "Controls in flight").
2599
2753
  */
2600
- ariaLabel?: string;
2754
+ "aria-label"?: string;
2601
2755
  /** Discrete-branch passthrough to `InFlightList`. Ignored for stream. */
2602
2756
  mode?: InFlightListMode;
2603
2757
  /** Discrete-branch passthrough to `InFlightList`. Ignored for stream. */
@@ -2636,7 +2790,7 @@ interface CommandDelayProps {
2636
2790
  * sentence for a command that failed. The panel's delay rail already shows the
2637
2791
  * same commands above the widget.
2638
2792
  */
2639
- declare function CommandDelay({ handle, handles, ariaLabel, mode, density, orientation, variant, }: Readonly<CommandDelayProps>): react_jsx_runtime.JSX.Element | null;
2793
+ declare function CommandDelay({ handle, handles, "aria-label": ariaLabel, mode, density, orientation, variant, }: Readonly<CommandDelayProps>): react_jsx_runtime.JSX.Element | null;
2640
2794
 
2641
2795
  /**
2642
2796
  * How long, in milliseconds, an armed {@link CommandButton} waits for its confirming press before it returns to rest.
@@ -2653,8 +2807,9 @@ interface CommandGateLike extends CommandRefusalLike {
2653
2807
  /** The game EVALUATED this and said no. */
2654
2808
  blocked: boolean;
2655
2809
  /**
2656
- * The mod could not evaluate this command's gates at all, as in a sandbox
2657
- * save. The control is drawn as ordinary, not darkened, and carries
2810
+ * The mod could not evaluate this command's gates (the checks it runs
2811
+ * before a command is pressed) at all, as in a sandbox save, which has no
2812
+ * career to check against. The control is drawn as ordinary, not darkened, and carries
2658
2813
  * `data-gate` to say so.
2659
2814
  */
2660
2815
  undetermined?: boolean;
@@ -2683,7 +2838,9 @@ interface CommandButtonHandle<Result = CommandReplyLike, Args = unknown> extends
2683
2838
  /**
2684
2839
  * Dispatch. The promise resolves when the command is confirmed and rejects
2685
2840
  * when it is refused, lost, or the machinery failed, so the control clears its
2686
- * own pending state with no per-command telemetry predicate.
2841
+ * own pending state with no per-command telemetry predicate. A refusal
2842
+ * rejects with an error carrying its `CommandErrorCode`: read it with
2843
+ * `classifyCommandRejection` from `@ksp-gonogo/sitrep-sdk`.
2687
2844
  *
2688
2845
  * `Result` carries the reply's real type to
2689
2846
  * {@link CommandButtonProps.onConfirmed}; a handle from `useCommand("...")`
@@ -2823,6 +2980,9 @@ interface CommandButtonState {
2823
2980
  *
2824
2981
  * @example
2825
2982
  * ```tsx
2983
+ * import { useCommand } from "@ksp-gonogo/sitrep-sdk";
2984
+ * import { useCommandButton } from "@ksp-gonogo/ui-kit";
2985
+ *
2826
2986
  * function RecoverButton() {
2827
2987
  * const recover = useCommand("ksp.recover");
2828
2988
  * const { isArmed, isPending, isRefused, refusalText, press } =
@@ -2839,6 +2999,7 @@ interface CommandButtonState {
2839
2999
  * type="button"
2840
3000
  * aria-busy={isPending || undefined}
2841
3001
  * title={refusalText ?? undefined}
3002
+ * // `true` asks for a confirm step: the first press arms, the second sends.
2842
3003
  * onClick={() => press(true)}
2843
3004
  * >
2844
3005
  * {word}
@@ -2955,7 +3116,8 @@ interface CommandButtonProps<Result = CommandReplyLike, Args = unknown> extends
2955
3116
  /**
2956
3117
  * Called with the control's press while a click on it would do something
2957
3118
  * (not while it is in flight) and with `null` when it would not, for a
2958
- * caller that lets an input press the control from elsewhere. The press
3119
+ * caller that lets an input (a key, a gamepad button or a serial device
3120
+ * bound to this control) press it from elsewhere. The press
2959
3121
  * takes whether the control has a confirm step.
2960
3122
  */
2961
3123
  onPressReady?: (press: ((armable: boolean) => void) | null) => void;
@@ -2969,7 +3131,8 @@ interface CommandButtonProps<Result = CommandReplyLike, Args = unknown> extends
2969
3131
  *
2970
3132
  * Receives what the dispatch resolved with, typed off the handle. A confirmed
2971
3133
  * command did not necessarily do something: a mod that de-duplicates on
2972
- * request id replies to a repeat with the receipt it stored the first time. The
3134
+ * request id (the id each dispatch carries) replies to a repeat of the same
3135
+ * dispatch with the receipt it stored the first time. The
2973
3136
  * value is the reply envelope; the command's own value is on `payload`.
2974
3137
  */
2975
3138
  onConfirmed?: (result: Result) => void;
@@ -3121,7 +3284,7 @@ interface CommandListCommonProps {
3121
3284
  */
3122
3285
  live?: boolean;
3123
3286
  /** Names the list for assistive tech. Each kind has its own default. */
3124
- ariaLabel?: string;
3287
+ "aria-label"?: string;
3125
3288
  }
3126
3289
  /**
3127
3290
  * Props for {@link CommandList}: the entries it draws, keyed by what became of them. Each entry
@@ -3237,6 +3400,7 @@ interface DelayRailStore {
3237
3400
  /**
3238
3401
  * Create an empty delay-rail store, for a caller that owns its lifetime and provides it through {@link DelayRailContext}.
3239
3402
  *
3403
+ * @intent Published so a third party can own the lifetime of a rail store behind a representation of its own, as Console does.
3240
3404
  * @category CommandDelay
3241
3405
  */
3242
3406
  declare function createDelayRailStore(): DelayRailStore;
@@ -3245,6 +3409,7 @@ declare function createDelayRailStore(): DelayRailStore;
3245
3409
  * a `Panel`, where `useRailEntry` and `useActiveHandles` degrade to no-ops.
3246
3410
  * Exported raw for a caller that owns the store's lifetime.
3247
3411
  *
3412
+ * @intent Published so a third party can provide a rail store it owns to a representation of its own, as Console does.
3248
3413
  * @category CommandDelay
3249
3414
  */
3250
3415
  declare const DelayRailContext: react.Context<DelayRailStore | null>;
@@ -3272,6 +3437,7 @@ declare const useDelayRailStore: () => DelayRailStore | null;
3272
3437
  * is no store in the tree. A subscriber (`Panel.Delay`) re-renders only when
3273
3438
  * the active handle set changes.
3274
3439
  *
3440
+ * @intent Published so a third party can read the active handles to draw a representation of the rail of its own, as Console does.
3275
3441
  * @category CommandDelay
3276
3442
  */
3277
3443
  declare function useActiveHandles(): readonly CommandHandle[];
@@ -3323,12 +3489,14 @@ declare function useRailEntry(entry: RailEntry | null): void;
3323
3489
  /**
3324
3490
  * The centre line of the ribbon mark's box, in box units.
3325
3491
  *
3492
+ * @intent Published so a caller can read the trace waveformPath draws back against its centre line.
3326
3493
  * @category CommandDelay
3327
3494
  */
3328
3495
  declare const WAVE_MID_Y: number;
3329
3496
  /**
3330
3497
  * How far a full-scale sample reaches either side of the centre line, in box units. Short: the rail is a band, not a meter.
3331
3498
  *
3499
+ * @intent Published so a caller can read the trace waveformPath draws back as an amplitude.
3332
3500
  * @category CommandDelay
3333
3501
  */
3334
3502
  declare const WAVE_HALF_H = 5.5;
@@ -3358,10 +3526,10 @@ interface ComposerBarProps extends ComponentPropsWithoutRef<"div"> {
3358
3526
  */
3359
3527
  blocked?: boolean;
3360
3528
  /**
3361
- * A short chip straddling the LEFT end of the row's top border, saying WHY
3529
+ * A short label straddling the LEFT end of the row's top border, saying WHY
3362
3530
  * the outline turned red. The right end belongs to the console's delay
3363
- * reading. A few upper-case words, pinned so it never changes the row's
3364
- * height.
3531
+ * reading. A few upper-case words, such as `READ ONLY`, pinned so it never
3532
+ * changes the row's height.
3365
3533
  */
3366
3534
  flag?: string;
3367
3535
  /**
@@ -3404,6 +3572,7 @@ interface ComposerBarProps extends ComponentPropsWithoutRef<"div"> {
3404
3572
  * operator's choice.
3405
3573
  */
3406
3574
  sendTooltip?: string;
3575
+ /** The input the operator types into, drawn between the prompt and the send button. */
3407
3576
  children?: ReactNode;
3408
3577
  }
3409
3578
  /**
@@ -3444,12 +3613,12 @@ interface ConsoleProps extends ComponentPropsWithoutRef<"div"> {
3444
3613
  tone?: ConsoleTone;
3445
3614
  /**
3446
3615
  * How long it takes to reach the other end, in seconds. `null` when there is
3447
- * no measurable path. Neither `null` nor zero gets a chip.
3616
+ * no measurable path. Neither `null` nor zero gets a {@link SignalDelayBadge}.
3448
3617
  */
3449
3618
  oneWaySeconds?: number | null;
3450
3619
  /**
3451
3620
  * The same delay as the reading it arrived in (`useCommand`'s
3452
- * `delayReading`), so the chip's figure draws held while `comms.delay` is
3621
+ * `delayReading`), so the badge's figure draws held while `comms.delay` is
3453
3622
  * quiet. Omitted, it draws as current.
3454
3623
  */
3455
3624
  delayReading?: Reading<Value<"s">> | null;
@@ -3459,8 +3628,9 @@ interface ConsoleProps extends ComponentPropsWithoutRef<"div"> {
3459
3628
  */
3460
3629
  canQueue?: boolean;
3461
3630
  /**
3462
- * Force the chip whatever the separation, for a terminal in CHARACTER mode,
3463
- * which has no composed line to queue.
3631
+ * Force the {@link SignalDelayBadge} whatever the separation, for a terminal in
3632
+ * character mode (every keystroke goes on its own), which has no composed
3633
+ * line to queue.
3464
3634
  */
3465
3635
  alwaysBadge?: boolean;
3466
3636
  /**
@@ -3471,7 +3641,7 @@ interface ConsoleProps extends ComponentPropsWithoutRef<"div"> {
3471
3641
  /**
3472
3642
  * Set when each `inFlight` entry carries the delay it was sent under, so the
3473
3643
  * queue stays after the live delay reading is gone: words sent at four
3474
- * light-minutes are still crossing after the path drops. The chip and the
3644
+ * light-minutes are still crossing after the path drops. The badge and the
3475
3645
  * queue are still never drawn together.
3476
3646
  */
3477
3647
  inFlightFrozenAtDispatch?: boolean;
@@ -3479,7 +3649,7 @@ interface ConsoleProps extends ComponentPropsWithoutRef<"div"> {
3479
3649
  * The line the operator types on, at the foot and inside the frame. Omitted,
3480
3650
  * the console grows no foot. Given but currently absent (a terminal in
3481
3651
  * character mode), the foot stays, so the surface does not change height
3482
- * with the mode. A standing chip grows a foot for itself either way.
3652
+ * with the mode. A standing badge grows a foot for itself either way.
3483
3653
  */
3484
3654
  composer?: ReactNode;
3485
3655
  /** The scrollback: an emulator screen, a log, a list of rows. */
@@ -3487,11 +3657,13 @@ interface ConsoleProps extends ComponentPropsWithoutRef<"div"> {
3487
3657
  }
3488
3658
  /**
3489
3659
  * A console: a scrolling surface, what is still crossing on the link, the line
3490
- * the operator is typing, and one reading of how far away the other end is.
3660
+ * the operator is typing, and one reading of how far away the other end is
3661
+ * (the craft or device the console talks to, whose distance `oneWaySeconds`
3662
+ * gives).
3491
3663
  *
3492
3664
  * The delay reading is chosen here, not by the widget: a standing
3493
- * {@link SignalDelayBadge} when the other end is close enough that a countdown
3494
- * would be over before it could be read, an {@link InFlightList} queue of what
3665
+ * {@link SignalDelayBadge} when the one-way delay is a second or less, so a
3666
+ * countdown would be over before it could be read, an {@link InFlightList} queue of what
3495
3667
  * is crossing when it is not, never both. Both sit at the foot. A widget says
3496
3668
  * only how far away the other end is (`oneWaySeconds`), whether it can queue
3497
3669
  * (`canQueue`) and what is queued (`inFlight`).
@@ -3503,7 +3675,7 @@ interface ConsoleProps extends ComponentPropsWithoutRef<"div"> {
3503
3675
  * @categoryDescription Console
3504
3676
  * A two-way text console over a delayed link: the scrollback, the line being
3505
3677
  * typed, and what is still crossing, framed with one reading of how far away
3506
- * the other end is.
3678
+ * the other end (the craft the console talks to) is.
3507
3679
  */
3508
3680
  declare function Console({ tone, oneWaySeconds, delayReading, canQueue, alwaysBadge, inFlight, inFlightFrozenAtDispatch, composer, children, ...rest }: ConsoleProps): react_jsx_runtime.JSX.Element;
3509
3681
 
@@ -3519,6 +3691,7 @@ interface ContainerBreakProps extends HTMLAttributes<HTMLDivElement> {
3519
3691
  narrow?: CSSProperties;
3520
3692
  /** Styles applied once the container is at least `at` px wide, layered over `narrow`. */
3521
3693
  wide?: CSSProperties;
3694
+ /** The content the styles lay out. */
3522
3695
  children?: ReactNode;
3523
3696
  }
3524
3697
  /**
@@ -3597,7 +3770,8 @@ declare function Countdown({ value, clock, precise, }: CountdownProps): react_js
3597
3770
 
3598
3771
  /**
3599
3772
  * Value equality for widget config objects, as {@link useModalSaveBar} uses
3600
- * it to decide whether a draft differs from the saved config.
3773
+ * it to decide whether a draft differs from the saved config. Call it yourself
3774
+ * only to build a dirty check of your own.
3601
3775
  *
3602
3776
  * - `undefined` and a missing key are treated the same
3603
3777
  * - object key order is ignored
@@ -3683,6 +3857,7 @@ declare const FRAMEWORK_CONTRIBUTION_SEGMENTS: readonly ["badges"];
3683
3857
  * ({@link useContributions}, {@link useContributionsBySlotId}) read it. A
3684
3858
  * widget reads through those hooks rather than the store.
3685
3859
  *
3860
+ * @intent Published so a test, or a host of its own, can mount the per-widget contribution store a widget reads through useContributions.
3686
3861
  * @category Extensions
3687
3862
  */
3688
3863
  declare const ContributionsPanelStore: PanelStore<Store<ContributionSlotEntry>>;
@@ -3838,6 +4013,11 @@ interface DataLineProps extends HTMLAttributes<HTMLDivElement> {
3838
4013
  */
3839
4014
  declare function DataLine({ label, lead, children, tone, aligned, ...rest }: DataLineProps): react_jsx_runtime.JSX.Element;
3840
4015
 
4016
+ /**
4017
+ * The fields every {@link DataTable} column carries, whatever it draws.
4018
+ *
4019
+ * @category DataTable
4020
+ */
3841
4021
  interface DataTableColumnBase {
3842
4022
  /** Stable identity for the column, and its React key. */
3843
4023
  key: string;
@@ -3875,9 +4055,14 @@ interface DataTableColumnBase {
3875
4055
  * @category DataTable
3876
4056
  */
3877
4057
  type DataTableColumn<Row> = DataTableColumnBase & ({
4058
+ /** Draws the cell yourself. Give this or `value`, never both. */
3878
4059
  render: (row: Row) => ReactNode;
3879
4060
  value?: never;
3880
4061
  } | {
4062
+ /**
4063
+ * The cell's figure, drawn through {@link Unit}: a whole `Reading`, or
4064
+ * a `value()` of a unit and a number. Give this or `render`, never both.
4065
+ */
3881
4066
  value: (row: Row) => UnitValue | null | undefined;
3882
4067
  render?: never;
3883
4068
  });
@@ -3921,6 +4106,7 @@ interface DataTableProps<Row> {
3921
4106
  * where per-row controls and augment slots go, so the columns stay aligned.
3922
4107
  */
3923
4108
  rowDetail?: (row: Row) => ReactNode;
4109
+ /** A class for the table's outer wrapper, so a styled-component can extend it. */
3924
4110
  className?: string;
3925
4111
  }
3926
4112
  /**
@@ -3934,6 +4120,18 @@ interface DataTableProps<Row> {
3934
4120
  *
3935
4121
  * @example
3936
4122
  * ```tsx
4123
+ * // `"Mit"` is the unit KSP measures science data in, and `"science"` is
4124
+ * // science points; any unit symbol `value()` accepts works the same way.
4125
+ * import { type DataTableColumn, DataTable } from "@ksp-gonogo/ui-kit";
4126
+ * import { value } from "@ksp-gonogo/sitrep-sdk";
4127
+ *
4128
+ * interface Subject {
4129
+ * subjectId: string;
4130
+ * title: string;
4131
+ * dataMits: number;
4132
+ * remaining: number;
4133
+ * }
4134
+ *
3937
4135
  * const columns: ReadonlyArray<DataTableColumn<Subject>> = [
3938
4136
  * { key: "subject", header: "Subject", rowHeader: true, width: "1fr", minWidth: "22ch", render: (s) => s.title },
3939
4137
  * { key: "data", header: "Data", align: "end", width: "9ch", value: (s) => value("Mit", s.dataMits) },
@@ -4045,8 +4243,8 @@ interface DialProps<Unit extends string = string> {
4045
4243
  needleColor?: string;
4046
4244
  /** Arc track colour. Defaults to `var(--color-border-subtle)`. */
4047
4245
  trackColor?: string;
4048
- /** Accessible name. Defaults to `"Dial"`; the value is spoken as `aria-valuetext`. */
4049
- ariaLabel?: string;
4246
+ /** Accessible name naming what the dial measures; the value is spoken as `aria-valuetext`. */
4247
+ "aria-label": string;
4050
4248
  }
4051
4249
  /**
4052
4250
  * A round instrument whose needle sweeps a configurable arc (by default a full
@@ -4059,7 +4257,8 @@ interface DialProps<Unit extends string = string> {
4059
4257
  * The whole axis is one kind: `value`, `min`, `max`, every zone bound and
4060
4258
  * every tick are `Value<Unit>` of the same unit, and the centre readout writes
4061
4259
  * that unit itself. Handed a whole `Reading`, a held figure is marked as held
4062
- * and a model's interval puts two bounds on the arc.
4260
+ * and the {@link UncertaintyBand} of a figure a model carried forward (see
4261
+ * {@link TopicReckoning}) puts two bounds on the arc.
4063
4262
  *
4064
4263
  * The dial is a `role="meter"` with the value as `aria-valuetext`. With no
4065
4264
  * value it draws no needle and is announced as an image naming the missing
@@ -4084,7 +4283,7 @@ interface DialProps<Unit extends string = string> {
4084
4283
  * { value: value("°", 180), label: "S" },
4085
4284
  * { value: value("°", 270), label: "W" },
4086
4285
  * ]}
4087
- * ariaLabel="Heading"
4286
+ * aria-label="Heading"
4088
4287
  * />
4089
4288
  * );
4090
4289
  * }
@@ -4095,7 +4294,7 @@ interface DialProps<Unit extends string = string> {
4095
4294
  * Instruments for a value against a scale: a dial and a tape, each with ticks
4096
4295
  * and coloured zones.
4097
4296
  */
4098
- declare function Dial<Unit extends string = string>({ value, min, max, width, height, startAngle, sweep, wrap, zones, ticks, valueLabel, readout, format, needleColor, trackColor, ariaLabel, }: Readonly<DialProps<Unit>>): react_jsx_runtime.JSX.Element;
4297
+ declare function Dial<Unit extends string = string>({ value, min, max, width, height, startAngle, sweep, wrap, zones, ticks, valueLabel, readout, format, needleColor, trackColor, "aria-label": ariaLabel, }: Readonly<DialProps<Unit>>): react_jsx_runtime.JSX.Element;
4099
4298
 
4100
4299
  /**
4101
4300
  * Props for {@link Disclosure}.
@@ -4115,7 +4314,7 @@ interface DisclosureProps {
4115
4314
  * Accessible name for the trigger. Required when `label` is a non-text node
4116
4315
  * (an icon or glyph) so the button is not unlabelled to a screen reader.
4117
4316
  */
4118
- ariaLabel?: string;
4317
+ "aria-label"?: string;
4119
4318
  /** A class for the outer element, so a styled-component can extend it. */
4120
4319
  className?: string;
4121
4320
  /**
@@ -4168,12 +4367,19 @@ interface DisclosureProps {
4168
4367
  *
4169
4368
  * @example
4170
4369
  * ```tsx
4171
- * <Disclosure
4172
- * variant="inline"
4173
- * chevron={false}
4174
- * label={(open) => (open ? "Hide detail" : "Show detail")}
4175
- * >
4176
- * <StageBreakdown stages={stages} />
4370
+ * import { value } from "@ksp-gonogo/sitrep-sdk";
4371
+ * import { Disclosure, Text, Unit } from "@ksp-gonogo/ui-kit";
4372
+ *
4373
+ * // The default: the detail pops out over what follows.
4374
+ * <Disclosure label="Why held?">
4375
+ * <Text>
4376
+ * The last update arrived <Unit value={value("s", 40)} /> ago.
4377
+ * </Text>
4378
+ * </Disclosure>
4379
+ *
4380
+ * // Inline: the detail opens in the flow of the page, with no chevron.
4381
+ * <Disclosure label="Details" variant="inline" chevron={false}>
4382
+ * <Text>Fuel is drawn from the lowest stage first.</Text>
4177
4383
  * </Disclosure>
4178
4384
  * ```
4179
4385
  *
@@ -4182,7 +4388,7 @@ interface DisclosureProps {
4182
4388
  * Detail on demand: a button that shows and hides a panel, reachable from the
4183
4389
  * keyboard where a hover reveal would not be.
4184
4390
  */
4185
- declare function Disclosure({ label, children, ariaLabel, className, variant, panelHeight, chevron, asButton, buttonSize, defaultOpen, }: DisclosureProps): react_jsx_runtime.JSX.Element;
4391
+ declare function Disclosure({ label, children, "aria-label": ariaLabel, className, variant, panelHeight, chevron, asButton, buttonSize, defaultOpen, }: DisclosureProps): react_jsx_runtime.JSX.Element;
4186
4392
 
4187
4393
  /**
4188
4394
  * Props for {@link DivergingBar}.
@@ -4203,6 +4409,7 @@ interface DivergingBarProps<Unit extends string = string> {
4203
4409
  * an empty track.
4204
4410
  */
4205
4411
  maxAbs: Value<Unit>;
4412
+ /** A class for the outer element, so a styled-component can extend it. */
4206
4413
  className?: string;
4207
4414
  }
4208
4415
  /**
@@ -4213,8 +4420,10 @@ interface DivergingBarProps<Unit extends string = string> {
4213
4420
  * A held figure fades the bar and nothing more; the number beside it says how
4214
4421
  * current it is.
4215
4422
  *
4216
- * Hides itself when the nearest `inline-size` container (such as `Panel`) is
4217
- * narrower than 300px, where the number alone is the reading that matters.
4423
+ * Hides itself when the nearest `inline-size` container is narrower than 300px,
4424
+ * where the number alone is the reading that matters. A {@link Panel} is such a
4425
+ * container, so a bar inside a widget needs none of its own; outside a panel,
4426
+ * wrap it in an element with `container-type: inline-size`.
4218
4427
  *
4219
4428
  * @category Meter
4220
4429
  */
@@ -4270,6 +4479,7 @@ declare function createDomainAvailabilityStore(): DomainAvailabilityStore;
4270
4479
  * from {@link createDomainAvailabilityStore} through it to seed presence in a
4271
4480
  * test; otherwise use {@link DomainAvailabilityProvider}.
4272
4481
  *
4482
+ * @intent Published so a test can seed which Domains are present for the widget under test.
4273
4483
  * @category Extensions
4274
4484
  */
4275
4485
  declare const DomainAvailabilityContext: react.Context<DomainAvailabilityStore | null>;
@@ -4305,7 +4515,10 @@ type EmptyStateLayout = "inline" | "fill";
4305
4515
  interface EmptyStateProps extends HTMLAttributes<HTMLDivElement> {
4306
4516
  /** The placeholder text. */
4307
4517
  children?: ReactNode;
4308
- /** Defaults to `inline`. */
4518
+ /**
4519
+ * `inline`, the default, sits where it is mounted with no inset of its own;
4520
+ * `fill` centres the text in all the space its container gives it.
4521
+ */
4309
4522
  layout?: EmptyStateLayout;
4310
4523
  }
4311
4524
  /**
@@ -4316,20 +4529,11 @@ interface EmptyStateProps extends HTMLAttributes<HTMLDivElement> {
4316
4529
  * with the content it stands in for. `fill` centres in the available space and
4317
4530
  * suits a panel's sole child.
4318
4531
  *
4319
- * @example
4320
- * ```tsx
4321
- * function VesselsBody({ vessels }: { vessels: readonly string[] }) {
4322
- * if (vessels.length === 0) {
4323
- * return <EmptyState layout="fill">No vessels in flight</EmptyState>;
4324
- * }
4325
- * return <VesselList vessels={vessels} />;
4326
- * }
4327
- * ```
4328
- *
4329
4532
  * @category EmptyState
4330
4533
  * @categoryDescription EmptyState
4331
- * What a widget shows in place of content: nothing to show, a notice, a spinner
4332
- * while it waits, and the note for a trajectory that is withheld.
4534
+ * What a widget shows where there is no content to draw: a placeholder for an
4535
+ * empty panel or list, a notice, a spinner while it waits, and the note for a
4536
+ * trajectory that is withheld.
4333
4537
  */
4334
4538
  declare function EmptyState({ children, layout, ...rest }: EmptyStateProps): react_jsx_runtime.JSX.Element;
4335
4539
 
@@ -4352,7 +4556,8 @@ interface ExpandableTextProps {
4352
4556
  className?: string;
4353
4557
  }
4354
4558
  /**
4355
- * Game-authored prose, cut to a readable length with the rest behind a
4559
+ * Prose written by the game or a mod (a contract's description, a part's
4560
+ * blurb), cut to a readable length with the rest behind a
4356
4561
  * "Show more" button.
4357
4562
  *
4358
4563
  * The cut is a prefix of the string ending on a whole word, followed by
@@ -4375,15 +4580,16 @@ type EphemerisFigure = <Unit extends string>(figure: Value<Unit>) => UnitValue<U
4375
4580
  /**
4376
4581
  * The figure-maker for quantities computed from `bodies`' orbits and the clock
4377
4582
  * alone: a phase angle between two planets, a transfer window between them, a
4378
- * pair's separation. Pass the catalogue reading and the bodies the figure rests
4379
- * on.
4583
+ * pair's separation. Pass the poses `useSystemInstant` returns and the bodies
4584
+ * the figure rests on.
4380
4585
  *
4381
- * Where every one of those bodies is deterministic (a fixed conic, which is
4382
- * every body of a stock install) the figure is stamped deterministic and takes
4383
- * no mark, however long ago the catalogue last arrived: it is exact at the
4384
- * instant it is drawn for. Where any is not (an n-body install, whose bodies
4385
- * drift like craft) the figure is only as current as the catalogue, and a held
4386
- * catalogue hands it over as held.
4586
+ * The figure is as current as the least current pose it rests on. Where every
4587
+ * one of those poses is `exact` (on a fixed conic, an orbit that never changes, as every body of a stock
4588
+ * install is) the figure is stamped deterministic and takes no mark, however long
4589
+ * ago the catalogue last arrived. Where any is `held`, because the instant is
4590
+ * past its provider's horizon or the catalogue stopped arriving under a body
4591
+ * that drifts, the figure comes back held as of the oldest of them. A `modelled`
4592
+ * pose claims no exactness and takes no mark.
4387
4593
  *
4388
4594
  * A figure that also rests on the craft does not come through here: give it
4389
4595
  * the craft's mark with {@link derivedMarking}, since one inexact input makes
@@ -4391,7 +4597,7 @@ type EphemerisFigure = <Unit extends string>(figure: Value<Unit>) => UnitValue<U
4391
4597
  *
4392
4598
  * @category Unit
4393
4599
  */
4394
- declare function ephemerisFigureOf(catalogue: Reading<CelestialFacts> | undefined, bodies: readonly (CelestialBody | null | undefined)[]): EphemerisFigure;
4600
+ declare function ephemerisFigureOf(poses: SystemPoses | undefined, bodies: readonly (CelestialBody | null | undefined)[]): EphemerisFigure;
4395
4601
 
4396
4602
  /**
4397
4603
  * Props for {@link Fill}.
@@ -4406,6 +4612,7 @@ interface FillProps extends HTMLAttributes<HTMLDivElement> {
4406
4612
  * fills the dashboard grid cell.
4407
4613
  */
4408
4614
  grow?: boolean;
4615
+ /** The content that takes the space. */
4409
4616
  children?: ReactNode;
4410
4617
  }
4411
4618
  /**
@@ -4442,17 +4649,33 @@ interface FilterChipProps {
4442
4649
  *
4443
4650
  * @example
4444
4651
  * ```tsx
4445
- * <Cluster justify="start" wrap role="group" aria-label="Filters">
4446
- * {BODIES.map((body) => (
4447
- * <FilterChip
4448
- * key={body}
4449
- * label={body}
4450
- * selected={shown.has(body)}
4451
- * count={countFor(body)}
4452
- * onToggle={() => toggle(body)}
4453
- * />
4454
- * ))}
4455
- * </Cluster>
4652
+ * import { useState } from "react";
4653
+ * import { Cluster, FilterChip } from "@ksp-gonogo/ui-kit";
4654
+ *
4655
+ * const BODIES = ["Kerbin", "Mun", "Minmus"] as const;
4656
+ *
4657
+ * function BodyFilter({ countFor }: { countFor: (body: string) => number }) {
4658
+ * const [shown, setShown] = useState<ReadonlySet<string>>(new Set());
4659
+ * const toggle = (body: string) =>
4660
+ * setShown((prev) => {
4661
+ * const next = new Set(prev);
4662
+ * if (!next.delete(body)) next.add(body);
4663
+ * return next;
4664
+ * });
4665
+ * return (
4666
+ * <Cluster justify="start" wrap role="group" aria-label="Filters">
4667
+ * {BODIES.map((body) => (
4668
+ * <FilterChip
4669
+ * key={body}
4670
+ * label={body}
4671
+ * selected={shown.has(body)}
4672
+ * count={countFor(body)}
4673
+ * onToggle={() => toggle(body)}
4674
+ * />
4675
+ * ))}
4676
+ * </Cluster>
4677
+ * );
4678
+ * }
4456
4679
  * ```
4457
4680
  *
4458
4681
  * @category FilterList
@@ -4510,20 +4733,42 @@ interface UseRowFilterOptions {
4510
4733
  *
4511
4734
  * @example
4512
4735
  * ```tsx
4513
- * const filter = useRowFilter({ placeholder: "Filter subjects..." });
4514
- * const shown = subjects.filter((s) => filter.matches(`${s.title} ${s.biome}`));
4515
- *
4516
- * return (
4517
- * <FilterRegion filter={filter} fill>
4518
- * {shown.length > 0 ? (
4519
- * <SubjectTable rows={shown} />
4520
- * ) : (
4521
- * <EmptyState>
4522
- * {filter.active ? "Nothing matches the filter" : "No subjects yet"}
4523
- * </EmptyState>
4524
- * )}
4525
- * </FilterRegion>
4526
- * );
4736
+ * import {
4737
+ * EmptyState,
4738
+ * FilterRegion,
4739
+ * Stack,
4740
+ * Text,
4741
+ * useRowFilter,
4742
+ * } from "@ksp-gonogo/ui-kit";
4743
+ *
4744
+ * interface Subject {
4745
+ * id: string;
4746
+ * title: string;
4747
+ * biome: string;
4748
+ * }
4749
+ *
4750
+ * function SubjectList({ subjects }: { subjects: readonly Subject[] }) {
4751
+ * const filter = useRowFilter({ placeholder: "Filter subjects..." });
4752
+ * const shown = subjects.filter((s) =>
4753
+ * filter.matches(`${s.title} ${s.biome}`),
4754
+ * );
4755
+ *
4756
+ * return (
4757
+ * <FilterRegion filter={filter} fill>
4758
+ * {shown.length > 0 ? (
4759
+ * <Stack>
4760
+ * {shown.map((s) => (
4761
+ * <Text key={s.id}>{s.title}</Text>
4762
+ * ))}
4763
+ * </Stack>
4764
+ * ) : (
4765
+ * <EmptyState>
4766
+ * {filter.active ? "Nothing matches the filter" : "No subjects yet"}
4767
+ * </EmptyState>
4768
+ * )}
4769
+ * </FilterRegion>
4770
+ * );
4771
+ * }
4527
4772
  * ```
4528
4773
  *
4529
4774
  * @category FilterList
@@ -4628,7 +4873,8 @@ interface FitLabelButtonProps extends Omit<ComponentPropsWithoutRef<"button">, "
4628
4873
  * A `button` that shows its label while the label fits and its icon when it
4629
4874
  * does not. The switch is measured against the button's own width, not a
4630
4875
  * breakpoint, and follows resizes. It is an unstyled native button
4631
- * (`type="button"` by default), so style it or wrap it as the layout needs.
4876
+ * (`type="button"` by default), so it has no border, fill or padding until you give it some: style it with
4877
+ * `styled(FitLabelButton)` or wrap it as the layout needs.
4632
4878
  *
4633
4879
  * The accessible name is always `label`, carried in `aria-label` in both
4634
4880
  * states. Put anything explaining a disabled state in `title`, since it is the
@@ -4754,14 +5000,19 @@ declare function Floating({ anchor, style, children, ...rest }: FloatingProps):
4754
5000
  * jog wheel and read-only fields. A widget's config form is built from these.
4755
5001
  */
4756
5002
  declare const ConfigForm: styled_components_dist_types.IStyledComponentBase<"web", styled_components.FastOmit<styled_components.FastOmit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "$boxed"> & {
5003
+ /** Puts the form on a bordered panel surface with its own padding and a tighter gap. */
4757
5004
  $boxed?: boolean;
4758
5005
  }, never> & Partial<Pick<styled_components.FastOmit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "$boxed"> & {
5006
+ /** Puts the form on a bordered panel surface with its own padding and a tighter gap. */
4759
5007
  $boxed?: boolean;
4760
5008
  }, never>>> & string;
4761
5009
  /**
4762
5010
  * One labelled control in a {@link ConfigForm}, stacked: {@link FieldLabel} on
4763
5011
  * top, the control below, an optional {@link FieldHint} under it. Tie the label
4764
- * to the control with `htmlFor` and `id`.
5012
+ * to the control with `htmlFor` and `id`. For a single line of text with no hint,
5013
+ * prefer {@link TextField}, which does all of this in one; build with `Field`
5014
+ * and {@link Input} for a control it does not cover or a field that needs a
5015
+ * {@link FieldHint}.
4765
5016
  *
4766
5017
  * @example
4767
5018
  * ```tsx
@@ -4824,6 +5075,7 @@ declare const Textarea: styled_components_dist_types.IStyledComponentBase<"web",
4824
5075
  * @category Layout
4825
5076
  */
4826
5077
  interface FramedDisplayProps extends ComponentPropsWithoutRef<"div"> {
5078
+ /** The drawing the frame surrounds. */
4827
5079
  children?: ReactNode;
4828
5080
  /**
4829
5081
  * Adds an inner gutter between the frame and its contents, for content that
@@ -4944,7 +5196,7 @@ interface GraphNoticeProps extends HTMLAttributes<HTMLDivElement> {
4944
5196
  * @example Over a graph in a `Fill`
4945
5197
  * ```tsx
4946
5198
  * <Fill>
4947
- * <LineGraph series={series} ariaLabel="Altitude trend" />
5199
+ * <LineGraph series={series} aria-label="Altitude trend" />
4948
5200
  * {series.length === 0 && (
4949
5201
  * <GraphNotice placement="overlay">no reference data</GraphNotice>
4950
5202
  * )}
@@ -4998,6 +5250,7 @@ interface GridProps extends HTMLAttributes<HTMLDivElement> {
4998
5250
  * wants its rows tighter than its columns.
4999
5251
  */
5000
5252
  rowGap?: GapToken;
5253
+ /** The cells, filled in reading order. */
5001
5254
  children?: ReactNode;
5002
5255
  }
5003
5256
  /**
@@ -5015,7 +5268,11 @@ declare function Grid({ cols, minColWidth, fit, gap, rowGap, align, children, ..
5015
5268
  * @category Badge
5016
5269
  */
5017
5270
  interface HeldBadgeProps {
5018
- /** Why the reading behind this part of the widget stopped updating. */
5271
+ /**
5272
+ * Why the reading behind this part of the widget stopped updating: `held`,
5273
+ * `disconnected`, `last-before-blackout`, `recorded`, `loading` or `no-game`.
5274
+ * Its word is the one {@link formatStreamStatus} gives the status of that name.
5275
+ */
5019
5276
  grade: HeldGrade;
5020
5277
  /** What is held, in the operator's terms, for the hover text: "Contract board", a part's title. */
5021
5278
  subject?: string;
@@ -5023,7 +5280,7 @@ interface HeldBadgeProps {
5023
5280
  size?: BadgeSize;
5024
5281
  }
5025
5282
  /**
5026
- * The chip a widget draws beside one part of itself whose reading is held: a
5283
+ * The badge a widget draws beside one part of itself whose reading is held: a
5027
5284
  * row, a card, a totals cell. It prints the grade's word and severity, so it
5028
5285
  * always agrees with the panel's own badge.
5029
5286
  *
@@ -5061,6 +5318,7 @@ interface HeldFigureProps extends HTMLAttributes<HTMLSpanElement> {
5061
5318
  kind?: MarkKind;
5062
5319
  /** The figure is of something other than what its label names, so its mark is drawn hollow: a ring for a current figure, the square or triangle emptied otherwise. */
5063
5320
  elsewhere?: boolean;
5321
+ /** The figure the mark follows. */
5064
5322
  children: ReactNode;
5065
5323
  }
5066
5324
  /**
@@ -5081,7 +5339,7 @@ interface HoverCardProps {
5081
5339
  /** The always-visible trigger content: a glyph, a tag, a short label. */
5082
5340
  trigger: ReactNode;
5083
5341
  /** Accessible name for the trigger, required since the trigger is usually a glyph. */
5084
- ariaLabel: string;
5342
+ "aria-label": string;
5085
5343
  /** What the card says. Read-only facts: a hover card holds no controls. */
5086
5344
  children: ReactNode;
5087
5345
  }
@@ -5094,14 +5352,14 @@ interface HoverCardProps {
5094
5352
  *
5095
5353
  * @example
5096
5354
  * ```tsx
5097
- * <HoverCard trigger={<InfoIcon />} ariaLabel="Signal path">
5355
+ * <HoverCard trigger={<InfoIcon />} aria-label="Signal path">
5098
5356
  * <Text>Relayed through {relayName}</Text>
5099
5357
  * </HoverCard>
5100
5358
  * ```
5101
5359
  *
5102
5360
  * @category Floating
5103
5361
  */
5104
- declare function HoverCard({ trigger, ariaLabel, children }: HoverCardProps): react_jsx_runtime.JSX.Element;
5362
+ declare function HoverCard({ trigger, "aria-label": ariaLabel, children, }: HoverCardProps): react_jsx_runtime.JSX.Element;
5105
5363
 
5106
5364
  type SVGAttributes = Partial<SVGProps<SVGSVGElement>>;
5107
5365
  type ElementAttributes = RefAttributes<SVGSVGElement> & SVGAttributes;
@@ -5418,6 +5676,7 @@ interface InlineProps extends HTMLAttributes<HTMLSpanElement> {
5418
5676
  * that cannot break overflows a narrow column.
5419
5677
  */
5420
5678
  wrap?: boolean;
5679
+ /** The runs of text and inline items, laid out in a line. */
5421
5680
  children?: ReactNode;
5422
5681
  }
5423
5682
  /**
@@ -5456,6 +5715,11 @@ declare function InstrumentHeldMark({ size, kind, figureSize, }: {
5456
5715
  */
5457
5716
  declare function sayHeld(name: string, caption: string | null): string;
5458
5717
 
5718
+ /**
5719
+ * The props every {@link JogWheel} takes, whichever its mode.
5720
+ *
5721
+ * @category Form
5722
+ */
5459
5723
  interface JogWheelCommon {
5460
5724
  value: number;
5461
5725
  step: number;
@@ -5464,23 +5728,23 @@ interface JogWheelCommon {
5464
5728
  onChange: (next: number) => void;
5465
5729
  /** Caret label formatter, also used as `aria-valuetext`. Default `String(Math.round(v))`; for a quantity, write it with {@link writeQuantity}. */
5466
5730
  format?: (v: number) => string;
5467
- ariaLabel: string;
5731
+ "aria-label": string;
5468
5732
  /**
5469
- * The name drawn above the wheel. Defaults to `ariaLabel`; `false` draws
5733
+ * The name drawn above the wheel. Defaults to `aria-label`; `false` draws
5470
5734
  * none, for a wheel the caller already names beside it.
5471
5735
  */
5472
5736
  label?: string | false;
5473
5737
  disabled?: boolean;
5474
5738
  /**
5475
5739
  * Box width in CSS px. Defaults to 56 horizontal / 24 vertical. Clamped up
5476
- * to {@link JOG_WHEEL_MIN_TARGET_PX}. A `format` longer than a few
5740
+ * to the smallest touch target. A `format` longer than a few
5477
5741
  * characters needs more than the default, as the caret label is clipped to
5478
5742
  * the box.
5479
5743
  */
5480
5744
  width?: number;
5481
5745
  /**
5482
5746
  * Box height in CSS px. Defaults to 24 horizontal / 56 vertical. Clamped up
5483
- * to {@link JOG_WHEEL_MIN_TARGET_PX}.
5747
+ * to the smallest touch target.
5484
5748
  */
5485
5749
  height?: number;
5486
5750
  }
@@ -5523,7 +5787,7 @@ type JogWheelProps = (JogWheelCommon & {
5523
5787
  * @example
5524
5788
  * ```tsx
5525
5789
  * <JogWheel
5526
- * ariaLabel="Gain"
5790
+ * aria-label="Gain"
5527
5791
  * value={gain}
5528
5792
  * min={0}
5529
5793
  * max={100}
@@ -5603,6 +5867,14 @@ interface LineGraphSeries {
5603
5867
  * grows to include the bounds.
5604
5868
  */
5605
5869
  reckoned?: readonly SeriesReckonedSpan[];
5870
+ /**
5871
+ * How to draw between two points, from the plotted value's sample kind:
5872
+ * `"linear"` (the default) joins them with a line, `"step"` holds each value
5873
+ * until the next point and then steps, for a value that stands until it
5874
+ * changes, and `"none"` marks each point on its own and joins nothing, for a
5875
+ * series of separate occurrences.
5876
+ */
5877
+ interpolation?: "linear" | "step" | "none";
5606
5878
  }
5607
5879
  /**
5608
5880
  * A horizontal reference level on a {@link LineGraph}, such as a safe limit.
@@ -5651,7 +5923,7 @@ interface LineGraphProps {
5651
5923
  * decorative beside a readout that already carries the reading, and the chart
5652
5924
  * renders `aria-hidden`.
5653
5925
  */
5654
- ariaLabel?: string;
5926
+ "aria-label"?: string;
5655
5927
  /** Placed on the chart's root element, for a caller's own sizing or layout. */
5656
5928
  className?: string;
5657
5929
  /**
@@ -5683,7 +5955,7 @@ interface LineGraphProps {
5683
5955
  * <LineGraph
5684
5956
  * variant="sparkline"
5685
5957
  * height={96}
5686
- * ariaLabel="Radiation dose rate, last 10 minutes"
5958
+ * aria-label="Radiation dose rate, last 10 minutes"
5687
5959
  * series={[
5688
5960
  * {
5689
5961
  * id: "ambient",
@@ -5702,7 +5974,7 @@ interface LineGraphProps {
5702
5974
  * A value over time: a line graph with series and thresholds, and the notice a
5703
5975
  * graph shows when it has nothing, or not enough, to draw.
5704
5976
  */
5705
- declare function LineGraph({ series, thresholds, yDomain, height, ariaLabel, className, variant, thresholdStyle, }: LineGraphProps): react_jsx_runtime.JSX.Element;
5977
+ declare function LineGraph({ series, thresholds, yDomain, height, "aria-label": ariaLabel, className, variant, thresholdStyle, }: LineGraphProps): react_jsx_runtime.JSX.Element;
5706
5978
 
5707
5979
  /**
5708
5980
  * Props of {@link LiveRegion}.
@@ -5727,7 +5999,8 @@ interface LiveRegionProps {
5727
5999
  additionsOnly?: boolean;
5728
6000
  /**
5729
6001
  * Interrupt rather than announce: `aria-live="assertive"`, and `role="alert"`
5730
- * where the region is on screen. For ABORT-class states and nothing softer.
6002
+ * where the region is on screen. Only for states that must interrupt
6003
+ * whatever the operator is doing, such as a mission abort, and nothing softer.
5731
6004
  */
5732
6005
  assertive?: boolean;
5733
6006
  /** The element the region renders as. */
@@ -5742,7 +6015,8 @@ interface LiveRegionProps {
5742
6015
  * its message is often never announced. Mount this for as long as the thing it
5743
6016
  * reports on is on screen, and put the words in when there is something to say.
5744
6017
  *
5745
- * Polite unless `assertive`, which interrupts and is kept for ABORT-class states.
6018
+ * Polite unless `assertive`, which interrupts and is kept for states that must
6019
+ * interrupt, such as a mission abort.
5746
6020
  *
5747
6021
  * @example Mounted with the control, empty until there is an outcome to say
5748
6022
  * ```tsx
@@ -5789,6 +6063,7 @@ interface LockSummary {
5789
6063
  * @category Panel
5790
6064
  */
5791
6065
  interface LockScopeProps {
6066
+ /** The content the scope guards, drawn while nothing used inside it is locked. */
5792
6067
  children?: ReactNode;
5793
6068
  /**
5794
6069
  * What draws in place of `children` while something used inside the scope
@@ -5801,8 +6076,9 @@ interface LockScopeProps {
5801
6076
  /**
5802
6077
  * Marks a part of the tree that stands or falls together. When anything
5803
6078
  * inside it reads a Topic (with `useTelemetry` or `useStream`) or uses a
5804
- * command (with `useCommand`) that this save has not unlocked, the whole scope
5805
- * is replaced by its `fallback`. The innermost scope wins, so a scope inside a
6079
+ * command (with `useCommand`) that this save has not unlocked (a technology
6080
+ * not yet researched, or a building not yet upgraded, in a career save), the
6081
+ * whole scope is replaced by its `fallback`. The innermost scope wins, so a scope inside a
5806
6082
  * section is replaced while the section stays.
5807
6083
  *
5808
6084
  * It draws no element of its own. A {@link Section}, each augment an
@@ -6156,10 +6432,11 @@ interface MeterProps<UnitSymbol extends string = string> extends MeterCommonProp
6156
6432
  *
6157
6433
  * ## Bands
6158
6434
  *
6159
- * Where a reading carries an uncertainty band, the meter draws a tick at each
6160
- * end of it on the track: two marks, never a shaded interval. The bar still
6161
- * shows the observed value, and the ticks sit where the forward model puts the
6162
- * value now. A band on the capacity is ticked near the track's end, as a
6435
+ * Where a reading carries an {@link UncertaintyBand} (how far its forward
6436
+ * model, see {@link TopicReckoning}, would defend the figure), the meter draws
6437
+ * a tick at each end of it on the track: two marks, never a shaded interval.
6438
+ * The bar still shows the observed value, and the ticks sit where the model
6439
+ * puts the value now. A band on the capacity is ticked near the track's end, as a
6163
6440
  * fraction of the capacity drawn. A band in a different unit from the value or
6164
6441
  * capacity it belongs to draws nothing.
6165
6442
  *
@@ -6210,16 +6487,17 @@ declare function Meter<UnitSymbol extends string = string>({ label, value, capac
6210
6487
  */
6211
6488
  declare function MeterStack({ children, ...rest }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
6212
6489
  /**
6213
- * Keeps a row meter on its `MeterStack`'s columns while it shares a slot with
6214
- * other lines, such as a caption under the bar.
6490
+ * Keeps a row meter on its `MeterStack`'s columns while it shares one cell of
6491
+ * the stack with other lines, such as a caption under the bar. Wrap the meter
6492
+ * and the extra lines in one group.
6215
6493
  *
6216
6494
  * @category Meter
6217
6495
  */
6218
- declare const MeterRowGroup: styled_components_dist_types.IStyledComponentBase<"web", styled_components.FastOmit<styled_components.FastOmit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref" | "key" | keyof HTMLAttributes<HTMLDivElement>> & Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
6496
+ declare const MeterRowGroup: styled_components_dist_types.IStyledComponentBase<"web", styled_components.FastOmit<styled_components.FastOmit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | "ref" | keyof HTMLAttributes<HTMLDivElement>> & Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
6219
6497
  ref?: ((instance: HTMLDivElement | null) => void | react.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof react.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | react.RefObject<HTMLDivElement> | null | undefined;
6220
- }, "id" | "title" | "about" | "resource" | "nonce" | "children" | "results" | "slot" | "style" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "autoCapitalize" | "autoFocus" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "enterKeyHint" | "hidden" | "lang" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "content" | "datatype" | "inlist" | "prefix" | "property" | "rel" | "rev" | "typeof" | "vocab" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "security" | "unselectable" | "inputMode" | "is" | "exportparts" | "part" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture"> & Partial<Pick<styled_components.FastOmit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref" | "key" | keyof HTMLAttributes<HTMLDivElement>> & Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
6498
+ }, "slot" | "style" | "title" | "dir" | "id" | "about" | "resource" | "nonce" | "prefix" | "results" | "children" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "autoCapitalize" | "autoFocus" | "className" | "contentEditable" | "contextMenu" | "draggable" | "enterKeyHint" | "hidden" | "lang" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "content" | "datatype" | "inlist" | "property" | "rel" | "rev" | "typeof" | "vocab" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "security" | "unselectable" | "inputMode" | "is" | "exportparts" | "part" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture"> & Partial<Pick<styled_components.FastOmit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | "ref" | keyof HTMLAttributes<HTMLDivElement>> & Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
6221
6499
  ref?: ((instance: HTMLDivElement | null) => void | react.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof react.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | react.RefObject<HTMLDivElement> | null | undefined;
6222
- }, "id" | "title" | "about" | "resource" | "nonce" | "children" | "results" | "slot" | "style" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "autoCapitalize" | "autoFocus" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "enterKeyHint" | "hidden" | "lang" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "content" | "datatype" | "inlist" | "prefix" | "property" | "rel" | "rev" | "typeof" | "vocab" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "security" | "unselectable" | "inputMode" | "is" | "exportparts" | "part" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture">>> & string;
6500
+ }, "slot" | "style" | "title" | "dir" | "id" | "about" | "resource" | "nonce" | "prefix" | "results" | "children" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "autoCapitalize" | "autoFocus" | "className" | "contentEditable" | "contextMenu" | "draggable" | "enterKeyHint" | "hidden" | "lang" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "content" | "datatype" | "inlist" | "property" | "rel" | "rev" | "typeof" | "vocab" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "security" | "unselectable" | "inputMode" | "is" | "exportparts" | "part" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture">>> & string;
6223
6501
 
6224
6502
  /**
6225
6503
  * Which clock an instant is on. Under signal delay they differ for the same
@@ -6314,6 +6592,7 @@ interface MissionDateFieldProps {
6314
6592
  onChange: (ut: number) => void;
6315
6593
  /** Names the whole group for a screen reader: "Ignition", "Plan end". */
6316
6594
  label: string;
6595
+ /** Greys the field and its buttons out and ignores input. */
6317
6596
  disabled?: boolean;
6318
6597
  /**
6319
6598
  * The coarse steps offered, in seconds, smallest first. Rendered as a minus
@@ -6360,8 +6639,9 @@ declare function utOfParts(parts: MissionDateParts): number;
6360
6639
  * what the game's own clock calls day 300. Edits round to the second, so the
6361
6640
  * field never shows one instant and holds another.
6362
6641
  *
6363
- * An instant nobody stated is not the epoch: `null` comes up empty with the
6364
- * absent token, and nothing is committed until a component is typed.
6642
+ * An instant nobody stated is not the epoch (UT 0, the start of the game's
6643
+ * calendar): `null` comes up empty with {@link NULL_DISPLAY}, the dash that
6644
+ * stands for no value, and nothing is committed until a component is typed.
6365
6645
  *
6366
6646
  * {@link UnitInput} with a `ut` unit renders this for you and emits a `Value`;
6367
6647
  * use this directly when you hold the instant as a bare number of seconds.
@@ -6370,13 +6650,24 @@ declare function utOfParts(parts: MissionDateParts): number;
6370
6650
  */
6371
6651
  declare function MissionDateField({ value, onChange, label, disabled, steps, }: MissionDateFieldProps): react_jsx_runtime.JSX.Element;
6372
6652
 
6653
+ /**
6654
+ * What {@link useModal}'s `open` takes beside the content.
6655
+ *
6656
+ * @category Modal
6657
+ */
6373
6658
  interface ModalOpenOptions {
6659
+ /** The dialog's visible heading, which also names it for assistive technology. Without one, give `aria-label`. */
6374
6660
  title?: string;
6375
6661
  /** Names a dialog that has no visible `title`. Ignored when `title` is given. */
6376
- ariaLabel?: string;
6662
+ "aria-label"?: string;
6377
6663
  /** CSS length for the dialog max-width. Defaults to 560px. */
6378
6664
  width?: string;
6379
6665
  }
6666
+ /**
6667
+ * What {@link useModal} returns: open and close dialogs.
6668
+ *
6669
+ * @category Modal
6670
+ */
6380
6671
  interface ModalContextValue {
6381
6672
  /** Opens a dialog showing `content` on top of any already open, and returns its id. */
6382
6673
  open: (content: ReactNode, options?: ModalOpenOptions) => string;
@@ -6386,8 +6677,8 @@ interface ModalContextValue {
6386
6677
  /**
6387
6678
  * Holds the stack of open modal dialogs and renders them into `document.body`.
6388
6679
  * The dashboard mounts one at its root, so a widget on the dashboard calls
6389
- * {@link useModal} without mounting its own. Anywhere else, such as a test or
6390
- * a page of your own, wrap the tree in one: `useModal` needs it above it.
6680
+ * {@link useModal} without mounting its own. Anywhere else, such as a test that
6681
+ * renders a widget with a config form, wrap the tree in one: `useModal` needs it above it.
6391
6682
  *
6392
6683
  * Each dialog has a title bar with a close button, a scrolling body, and an
6393
6684
  * optional sticky footer set with {@link useModalSaveBar} or
@@ -6407,7 +6698,7 @@ declare function ModalProvider({ children }: Readonly<{
6407
6698
  /**
6408
6699
  * Opens and closes modal dialogs. `open(content, options)` pushes a dialog
6409
6700
  * showing `content` and returns its id; `options` takes a `title`, an
6410
- * `ariaLabel` for a dialog with no visible title, and a CSS `width` for the
6701
+ * `aria-label` for a dialog with no visible title, and a CSS `width` for the
6411
6702
  * dialog's max-width (560px by default). `close(id)` removes that dialog.
6412
6703
  * Throws when called outside a {@link ModalProvider}.
6413
6704
  *
@@ -6441,6 +6732,7 @@ interface ModalChromeValue {
6441
6732
  * a modal. Content uses {@link useModalChrome} or {@link useModalSaveBar}
6442
6733
  * rather than reading it.
6443
6734
  *
6735
+ * @intent Published so content that calls useModalChrome can be rendered under a stand-in modal in a test.
6444
6736
  * @category Modal
6445
6737
  */
6446
6738
  declare const ModalChromeContext: react.Context<ModalChromeValue | null>;
@@ -6493,6 +6785,10 @@ interface ModalSaveBarOptions<Draft> {
6493
6785
  * from both its value when the modal opened and `saved`. The hook renders
6494
6786
  * nothing where it is called and does nothing outside a modal.
6495
6787
  *
6788
+ * The form is a widget's `configComponent`: register it beside the widget with
6789
+ * `registerComponent({ ..., configComponent: NavballConfigForm })`, and the
6790
+ * dashboard opens it in a modal with the saved `config` and an `onSave`.
6791
+ *
6496
6792
  * @example
6497
6793
  * ```tsx
6498
6794
  * import { useMemo, useState } from "react";
@@ -6533,6 +6829,7 @@ interface ModelledQuantityAlongsideProps<UnitSymbol extends string> {
6533
6829
  observed: Value<UnitSymbol> | null | undefined;
6534
6830
  /** The model's figure; nothing is drawn without one. */
6535
6831
  modelled: Value<UnitSymbol> | null | undefined;
6832
+ /** Absent in this form: a `Value` pair is written by {@link Unit}, so no writer is given. */
6536
6833
  write?: undefined;
6537
6834
  }
6538
6835
  /**
@@ -6587,8 +6884,8 @@ interface NoticeProps extends BlockProps {
6587
6884
  tone?: Tone;
6588
6885
  /**
6589
6886
  * Interrupt rather than announce politely: the banner becomes
6590
- * `role="alert"` with `aria-live="assertive"`. Keep it for an abort and
6591
- * nothing softer.
6887
+ * `role="alert"` with `aria-live="assertive"`. Keep it for a state that
6888
+ * must interrupt, such as a mission abort, and nothing softer.
6592
6889
  */
6593
6890
  assertive?: boolean;
6594
6891
  /** What the banner says. */
@@ -6597,7 +6894,9 @@ interface NoticeProps extends BlockProps {
6597
6894
  /**
6598
6895
  * A banner stating something about the widget rather than a record inside it,
6599
6896
  * such as what is limiting the ship. It takes {@link Block}'s anatomy (title,
6600
- * asides, footer) on a sunken surface bordered in its tone.
6897
+ * asides, footer) on a sunken surface bordered in its tone. Most banners need
6898
+ * only `title`, `tone` and their text; the other anatomy props are for a banner
6899
+ * that also carries a figure beside it or a footer of actions.
6601
6900
  *
6602
6901
  * Unlike a toned {@link Card}, a notice is announced to screen readers. By
6603
6902
  * default it is `role="note"` and its text is read out politely when it
@@ -6716,12 +7015,14 @@ interface SectionProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
6716
7015
  * Take the panel body's leftover height rather than the section's natural
6717
7016
  * one, for a section that is a drawing (a map, a plot, a dial).
6718
7017
  *
6719
- * A filling section is lifted out of the section grid, so it always spans the
6720
- * panel's full width; ordinary sections around it still columnise. Two filling
6721
- * sections each keep their content height and share the leftover equally.
6722
- * Ignored under `fitToSize`, and inert outside a panel body.
7018
+ * A filling section is lifted out of the section grid (the columns a wide
7019
+ * panel lays its sections out in), so it always spans the panel's full
7020
+ * width; ordinary sections around it still form columns. Two filling sections
7021
+ * each keep their content height and share the leftover equally. Ignored
7022
+ * when the panel's `fitToSize` prop is set, and inert outside a panel body.
6723
7023
  */
6724
7024
  fill?: boolean;
7025
+ /** The section's content, under its title. */
6725
7026
  children?: ReactNode;
6726
7027
  }
6727
7028
  /**
@@ -6731,8 +7032,8 @@ interface SectionProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
6731
7032
  * leftover height.
6732
7033
  *
6733
7034
  * A section is also a {@link LockScope}: when anything inside it reads a Topic
6734
- * or uses a command this save has not unlocked, the section keeps its title
6735
- * and shows what is missing in place of its content.
7035
+ * or uses a command this save has not unlocked (see {@link LockScope}), the
7036
+ * section keeps its title and shows what is missing in place of its content.
6736
7037
  *
6737
7038
  * @category Layout
6738
7039
  */
@@ -6745,8 +7046,10 @@ declare function Section({ children, gap, title, titleAs, full, fill, ...rest }:
6745
7046
  * @category Layout
6746
7047
  */
6747
7048
  declare const SectionTitle: styled_components_dist_types.IStyledComponentBase<"web", styled_components.FastOmit<styled_components.FastOmit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "$rule"> & {
7049
+ /** Draws a hairline under the heading. */
6748
7050
  $rule?: boolean;
6749
7051
  }, never> & Partial<Pick<styled_components.FastOmit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "$rule"> & {
7052
+ /** Draws a hairline under the heading. */
6750
7053
  $rule?: boolean;
6751
7054
  }, never>>> & string;
6752
7055
 
@@ -6824,26 +7127,6 @@ declare const ScrollArea: react.ForwardRefExoticComponent<Omit<react.DetailedHTM
6824
7127
  * @category Panel
6825
7128
  */
6826
7129
  type PanelSidebarSide = "start" | "end";
6827
- /**
6828
- * Props for the grid that holds a panel's body and sidebar. {@link Panel}
6829
- * draws this grid itself when `panelSidebar` is set, taking `sidebarSide` and
6830
- * `sidebarSize` as `side` and `size`.
6831
- *
6832
- * @category Panel
6833
- */
6834
- interface PanelSplitProps extends ComponentPropsWithoutRef<"div"> {
6835
- /** Which edge the sidebar sits against. See {@link PanelSidebarSide}. Defaults to `end`. */
6836
- side?: PanelSidebarSide;
6837
- /**
6838
- * Size of the sidebar track: a width on the inline axis, a height on the
6839
- * block axis. Defaults to `14rem`, and to a fixed five grid rows under the
6840
- * body (capped at 45% of a very short tile), so the body takes the rest and
6841
- * content never grows the sidebar. Overflow scrolls inside it.
6842
- */
6843
- size?: string;
6844
- /** Gives the sidebar a top inset matching the delay rail's band, which the body track holds inside its scroller. */
6845
- railBand?: boolean;
6846
- }
6847
7130
  /**
6848
7131
  * Secondary content beside or below the body: an almanac for the diagram, a
6849
7132
  * legend for the plot, a detail pane for the selected row.
@@ -6901,8 +7184,8 @@ interface PanelProps extends ComponentPropsWithoutRef<"div"> {
6901
7184
  sections?: Exclude<ReactNode, boolean> | readonly ReactNode[];
6902
7185
  /**
6903
7186
  * Narrowest a section column may be before the panel stops offering a
6904
- * second one. Defaults to `13rem`, which gives two columns in a panel about
6905
- * 470px wide.
7187
+ * second one. Defaults to `13rem` (208px at the default font size), which gives two
7188
+ * columns in a panel about 470px wide.
6906
7189
  *
6907
7190
  * Raise it for a widget whose sections carry long rows and read badly at the
6908
7191
  * default width; set it to `100%` for one that should never columnise at all.
@@ -6934,8 +7217,11 @@ interface PanelProps extends ComponentPropsWithoutRef<"div"> {
6934
7217
  * announced when it changes. `live` shows nothing, and `"none"` suppresses
6935
7218
  * the badge.
6936
7219
  *
6937
- * The dashboard sets the blackout grades (`recorded`,
6938
- * `last-before-blackout`) itself, from the widget's declared channels. Any
7220
+ * The dashboard sets the blackout grades itself, from the widget's declared
7221
+ * channels (the Topics it reads). A blackout is a stretch when the craft's
7222
+ * signal cannot reach the command centre: the last value sent before it is
7223
+ * `last-before-blackout`, and a value the craft sent once contact came back
7224
+ * is `recorded`. The grades are listed on {@link StreamStatusValue}. Any
6939
7225
  * other grade shows only when set here, so set it for a panel that reads one
6940
7226
  * specific Topic. It is merged, worst first, with the dashboard's status and
6941
7227
  * any badge drawn with `report`.
@@ -7134,7 +7420,8 @@ declare function PanelRoot(props: PanelProps): ReactElement;
7134
7420
  * a widget can compose a variant by hand from them:
7135
7421
  *
7136
7422
  * - `Panel.Container`: the bordered frame
7137
- * - `Panel.Context`: links the body's scroller to the glow
7423
+ * - `Panel.Context`: the provider that links the body's scroller to the glow;
7424
+ * take no props but `children`
7138
7425
  * - `Panel.Delay`: the delay rail above the header
7139
7426
  * - `Panel.Header`: the title and its aside on one row, collapsing the aside
7140
7427
  * to status dots when they no longer fit
@@ -7185,6 +7472,9 @@ declare function PanelRoot(props: PanelProps): ReactElement;
7185
7472
  * } from "@ksp-gonogo/sitrep-sdk";
7186
7473
  * import { Section, Text, Unit } from "@ksp-gonogo/ui-kit";
7187
7474
  *
7475
+ * // In a real Uplink this block is in `src/topics.ts`, with the payload type
7476
+ * // `uplink-tools codegen` writes from the contract; it is spelled out here so
7477
+ * // the example stands alone.
7188
7478
  * declare module "@ksp-gonogo/sitrep-sdk" {
7189
7479
  * interface TopicPayloadMap {
7190
7480
  * "example.heartbeat": { ut: Value<"ut"> };
@@ -7195,15 +7485,17 @@ declare function PanelRoot(props: PanelProps): ReactElement;
7195
7485
  * id: "example",
7196
7486
  * version: "0.0.1",
7197
7487
  * name: "Example",
7488
+ * description: "Shows an example section in a widget panel.",
7198
7489
  * });
7199
7490
  *
7200
7491
  * function CadenceSection() {
7201
7492
  * const heartbeat = useTelemetry("example.heartbeat");
7202
- * if (heartbeat.state !== "observed") return null;
7493
+ * // A held heartbeat is still drawn: `Unit` marks the figure as held.
7494
+ * if (heartbeat.state !== "observed" && heartbeat.state !== "held") return null;
7203
7495
  * return (
7204
7496
  * <Section title="Example">
7205
7497
  * <Text>
7206
- * Last beat at UT <Unit value={heartbeat.value.ut} />
7498
+ * Last beat at UT <Unit value={heartbeat.ut} />
7207
7499
  * </Text>
7208
7500
  * </Section>
7209
7501
  * );
@@ -7221,10 +7513,20 @@ declare function PanelRoot(props: PanelProps): ReactElement;
7221
7513
  * id: "cadence-badge",
7222
7514
  * contributes: "space-center-status.badges",
7223
7515
  * deps: ["example.heartbeat"],
7224
- * compute: (topics) =>
7225
- * topics["example.heartbeat"]
7226
- * ? [{ id: "cadence", label: "Publishing", tone: "info" as const }]
7227
- * : null,
7516
+ * // A held heartbeat still draws the badge, carrying its reading so the panel shows it as held.
7517
+ * compute: (topics) => {
7518
+ * const heartbeat = topics["example.heartbeat"];
7519
+ * return heartbeat.state === "observed" || heartbeat.state === "held"
7520
+ * ? [
7521
+ * {
7522
+ * id: "cadence",
7523
+ * label: "Publishing",
7524
+ * tone: "info" as const,
7525
+ * held: heartbeat,
7526
+ * },
7527
+ * ]
7528
+ * : null;
7529
+ * },
7228
7530
  * });
7229
7531
  * ```
7230
7532
  *
@@ -7255,13 +7557,136 @@ declare const Panel: typeof PanelRoot & {
7255
7557
  Sidebar: typeof PanelSidebar;
7256
7558
  };
7257
7559
 
7560
+ /**
7561
+ * One line of a {@link PlotCrosshair} readout.
7562
+ *
7563
+ * @category LineGraph
7564
+ */
7565
+ interface PlotCrosshairRow {
7566
+ id: string;
7567
+ label: string;
7568
+ /** The colour of the thing the row reads, so the row ties back to its trace. */
7569
+ color: string;
7570
+ /** The reading, unit included. `null` is an absent sample and is drawn as the null token, never as a number. */
7571
+ value: string | null;
7572
+ /** How current the reading is ("measured", "modelled"), written after the value when there is room. */
7573
+ currency?: string;
7574
+ /** A model's figure: drawn with the kit's modelled mark. */
7575
+ modelled?: boolean;
7576
+ /** Dropped from the compact card of a small plot, where only the figures on the traces fit. */
7577
+ detail?: boolean;
7578
+ /** Where the row's marker stands on the plot, in pixels. Omitted for a row with no point on the plot, such as a limit. */
7579
+ y?: number | null;
7580
+ }
7581
+ /**
7582
+ * What a {@link PlotCrosshair} draws: where the line stands, the plot it
7583
+ * spans, the instant it names and the rows it reads.
7584
+ *
7585
+ * @category LineGraph
7586
+ */
7587
+ interface PlotCrosshairProps {
7588
+ /** Where the line stands, in pixels. */
7589
+ x: number;
7590
+ /** The plot's box, in pixels. The line spans it and the readout stays inside it. */
7591
+ plot: {
7592
+ x0: number;
7593
+ y0: number;
7594
+ x1: number;
7595
+ y1: number;
7596
+ };
7597
+ /** Names the instant, written once above the rows. */
7598
+ heading: string;
7599
+ rows: readonly PlotCrosshairRow[];
7600
+ /**
7601
+ * A column outside the plot where the readout stands, when the chart has
7602
+ * given the card one (see `placePlotReadouts`). The card then sits at the
7603
+ * column's top and names the instant even when compact, and nothing it draws
7604
+ * covers the plot. Omitted, the card is drawn over the plot where it covers no dot.
7605
+ */
7606
+ column?: {
7607
+ x0: number;
7608
+ y0: number;
7609
+ x1: number;
7610
+ y1: number;
7611
+ };
7612
+ /** The traces as drawn, one pixel point per sample with a non-finite `cy` for a hole. Over the plot, the card prefers a corner none of them crosses. */
7613
+ traces?: ReadonlyArray<{
7614
+ cx: readonly number[];
7615
+ cy: readonly number[];
7616
+ }>;
7617
+ }
7618
+ /**
7619
+ * Whether {@link PlotCrosshair} draws its readout card for these props: the
7620
+ * card fits, and over the plot there is a corner that covers no dot. A chart
7621
+ * that drew a legend in the same place hides it while the card is up, since
7622
+ * each row names its series in its colour.
7623
+ *
7624
+ * @category LineGraph
7625
+ */
7626
+ declare function plotCrosshairShowsCard(props: Pick<PlotCrosshairProps, "x" | "plot" | "heading" | "rows" | "column" | "traces">): boolean;
7627
+ /**
7628
+ * A crosshair for an SVG plot: a vertical line at an instant, a dot on each
7629
+ * trace where it is read, and a readout of every row's exact value.
7630
+ *
7631
+ * The readout is drawn over the plot at a fixed corner on whichever side of
7632
+ * the line has room, so moving the line never resizes or reflows the chart. A
7633
+ * plot too small for the full card gets a compact one: a swatch, as much of
7634
+ * the label as fits, and the value, so an absent row still says whose it is.
7635
+ * An absent reading is the null token. Place it as the last child of the
7636
+ * plot's `<svg>`; it takes no pointer events, so the plot keeps them.
7637
+ *
7638
+ * @category LineGraph
7639
+ */
7640
+ declare function PlotCrosshair({ x, plot, heading, rows: allRows, column, }: PlotCrosshairProps): react_jsx_runtime.JSX.Element;
7641
+
7642
+ /**
7643
+ * What {@link placePlotReadouts} reads: the chart's measured size.
7644
+ *
7645
+ * @category LineGraph
7646
+ */
7647
+ interface PlotReadoutSpace {
7648
+ /** Width of the whole chart, in CSS pixels. */
7649
+ width: number;
7650
+ /** Height of the whole chart, in CSS pixels. */
7651
+ height: number;
7652
+ /** Width the column's widest line needs to be read whole: a legend chip, a caption, a card row, in CSS pixels. */
7653
+ contentWidth: number;
7654
+ }
7655
+ /**
7656
+ * Where a chart's reading furniture stands: the crosshair card, the legend and
7657
+ * the limit or target captions.
7658
+ *
7659
+ * `beside` gives them a column to the right of the plot, so none covers a
7660
+ * trace or a dot. `overlay` keeps them inside the plot, drawn only where they
7661
+ * cover no data.
7662
+ *
7663
+ * @category LineGraph
7664
+ */
7665
+ type PlotReadoutPlacement = {
7666
+ placement: "overlay";
7667
+ } | {
7668
+ placement: "beside";
7669
+ columnWidth: number;
7670
+ };
7671
+ /**
7672
+ * Where the kit puts a chart's card, legend and captions, decided from
7673
+ * measured space. A chart with room gives them a column beside the plot, as
7674
+ * wide as its widest line needs so nothing is cut; one that cannot spare that
7675
+ * width, or is smaller, keeps them over the plot.
7676
+ *
7677
+ * @category LineGraph
7678
+ */
7679
+ declare function placePlotReadouts({ width, height, contentWidth, }: PlotReadoutSpace): PlotReadoutPlacement;
7680
+
7258
7681
  /**
7259
7682
  * One frame a {@link ReadFrameControl} can offer, and what an operator calls it.
7260
7683
  *
7261
7684
  * @category Form
7262
7685
  */
7263
7686
  interface ReadFrameOption {
7687
+ /** The frame this option selects. */
7264
7688
  choice: ReadFrameChoice;
7689
+ /** The option's text in the list, as the operator reads it. */
7265
7690
  label: string;
7266
7691
  }
7267
7692
  /**
@@ -7272,16 +7697,23 @@ interface ReadFrameOption {
7272
7697
  interface ReadFrameControlProps {
7273
7698
  /** Put on the `<select>`, so `label` (as `htmlFor`) names it. */
7274
7699
  id: string;
7700
+ /** The control's visible label, such as "Frame". */
7275
7701
  label: string;
7276
7702
  /** The widget's current read frame. Shown as a blank, disabled placeholder when it matches nothing on `options`, e.g. before the widget's catalogue has arrived. */
7277
7703
  value: ReadFrameChoice;
7704
+ /** The frames offered, in the order listed. */
7278
7705
  options: readonly ReadFrameOption[];
7706
+ /** Called with the frame the operator picked. */
7279
7707
  onChange: (choice: ReadFrameChoice) => void;
7708
+ /** A line of help under the control. Omit for none. */
7280
7709
  hint?: string;
7281
7710
  }
7282
7711
  /**
7283
7712
  * The control a frame-dependent widget picks its read frame with: a labelled,
7284
- * keyboard-operable `<select>` over `options`, with an optional hint below.
7713
+ * keyboard-operable `<select>` over `options`, with an optional hint below. A
7714
+ * read frame is the frame of reference a widget draws positions in, such as
7715
+ * centred on a body; it changes only the drawing. The Control Frame is the
7716
+ * frame the game itself is set to, reported on the `system.frame` Topic.
7285
7717
  * The selected option is found by frame equality with `value`
7286
7718
  * (`readFrameChoicesEqual` from `@ksp-gonogo/sitrep-sdk/frames`), so options
7287
7719
  * need no ids of their own.
@@ -7301,7 +7733,8 @@ declare function ReadFrameControl({ id, label, value, options, onChange, hint, }
7301
7733
  * A quantity, or the whole `Reading` it arrived in, goes through {@link Unit},
7302
7734
  * so a held reading keeps its held mark. Not a bare number, which has lost the
7303
7735
  * unit that says how to write it: hand over `value("m", 1)`,
7304
- * `value("count", 3)`, or `value("1", x)` for a dimensionless reading.
7736
+ * `value("count", 3)`, or `value("1", x)` for a dimensionless reading (`"1"`
7737
+ * is the unit of a plain ratio or factor).
7305
7738
  *
7306
7739
  * @category Form
7307
7740
  */
@@ -7316,7 +7749,9 @@ interface ReadOnlyFieldProps {
7316
7749
  label: ReactNode;
7317
7750
  /** Why it matters, or where it comes from. Announced with the label. */
7318
7751
  description?: ReactNode;
7752
+ /** The value shown. See {@link ReadOnlyFieldValue} for what it can be. */
7319
7753
  value: ReadOnlyFieldValue;
7754
+ /** A class for the outer element, so a styled-component can extend it. */
7320
7755
  className?: string;
7321
7756
  }
7322
7757
  /**
@@ -7337,11 +7772,27 @@ declare function ReadOnlyField({ label, description, value, className, }: ReadOn
7337
7772
  * @category Readout
7338
7773
  */
7339
7774
  type ReadoutSize = "hero" | "inline";
7775
+ /**
7776
+ * Props for {@link Readout}. Any other `div` attribute passes through.
7777
+ *
7778
+ * @category Readout
7779
+ */
7780
+ interface ReadoutProps extends ComponentPropsWithoutRef<"div"> {
7781
+ /** Where it sits: `hero` fills the remaining panel space, `inline` sits beside other content. Defaults to `inline`. */
7782
+ size?: ReadoutSize;
7783
+ /**
7784
+ * Colours the figure with a {@link Tone}: `go`, `caution`, `warn` or `nogo`
7785
+ * for a state from best to worst, `offline` for data that is gone, `info` for
7786
+ * a note and `neutral` for a figure with no verdict. Defaults to `neutral`.
7787
+ * Set it from the state the figure reports, never for decoration.
7788
+ */
7789
+ tone?: Tone;
7790
+ }
7340
7791
  /**
7341
7792
  * The display-tier figure: bold, tracked, coloured by tone.
7342
7793
  *
7343
- * `size="hero"` is the dominant value of a widget's tiny form (ΔV, time to
7344
- * impact, warp rate): it fills the remaining panel space and centres. The
7794
+ * `size="hero"` is the dominant value of a widget's tiny form (see
7795
+ * {@link TinyEssentials}; ΔV, time to impact and warp rate are examples): it fills the remaining panel space and centres. The
7345
7796
  * default `size="inline"` is the same treatment smaller, sitting beside other
7346
7797
  * content.
7347
7798
  *
@@ -7352,15 +7803,11 @@ type ReadoutSize = "hero" | "inline";
7352
7803
  * Figures that stand on their own: the bold display readout, a labelled stat, a
7353
7804
  * data line, and the stats contributed to a widget.
7354
7805
  */
7355
- declare function Readout({ size, tone, ...rest }: ComponentPropsWithoutRef<"div"> & {
7356
- /** Where it sits. Defaults to `inline`. */
7357
- size?: ReadoutSize;
7358
- /** Colour-codes the figure for state-driven widgets. Defaults to `neutral`. */
7359
- tone?: Tone;
7360
- }): react_jsx_runtime.JSX.Element;
7806
+ declare function Readout({ size, tone, ...rest }: ReadoutProps): react_jsx_runtime.JSX.Element;
7361
7807
  /**
7362
7808
  * Muted uppercase secondary line for a {@link Readout}
7363
- * (e.g. a mode tag).
7809
+ * (e.g. a mode tag), placed inside it after the figure. It renders a `span` and
7810
+ * takes every prop that element does.
7364
7811
  *
7365
7812
  * @category Readout
7366
7813
  */
@@ -7403,6 +7850,7 @@ interface RowProps extends HTMLAttributes<HTMLElement> {
7403
7850
  * one level of nesting.
7404
7851
  */
7405
7852
  nested?: boolean;
7853
+ /** The row's content: its label and value, or whatever the row lays out. */
7406
7854
  children?: ReactNode;
7407
7855
  }
7408
7856
  /**
@@ -7540,7 +7988,9 @@ declare function resourceColor(name: string): string;
7540
7988
  * @category Form
7541
7989
  */
7542
7990
  interface SearchBoxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "onChange"> {
7991
+ /** The text in the box. */
7543
7992
  value: string;
7993
+ /** Called with the new text on each keystroke, and with `""` when cleared. */
7544
7994
  onChange: (next: string) => void;
7545
7995
  /** The clear control's accessible name. Defaults to "Clear search". */
7546
7996
  clearLabel?: string;
@@ -7595,18 +8045,34 @@ interface SelectableRowProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement
7595
8045
  *
7596
8046
  * @example
7597
8047
  * ```tsx
7598
- * <Stack gap="rows">
7599
- * {servos.map((s) => (
7600
- * <SelectableRow
7601
- * key={s.id}
7602
- * selected={s.id === selectedId}
7603
- * onClick={() => select(s.id)}
7604
- * >
7605
- * <span>{s.name}</span>
7606
- * <Text level="muted" size="xs">{s.group}</Text>
7607
- * </SelectableRow>
7608
- * ))}
7609
- * </Stack>
8048
+ * import { SelectableRow, Stack, Text } from "@ksp-gonogo/ui-kit";
8049
+ *
8050
+ * interface Servo {
8051
+ * id: string;
8052
+ * name: string;
8053
+ * group: string;
8054
+ * }
8055
+ *
8056
+ * function ServoList(props: {
8057
+ * servos: readonly Servo[];
8058
+ * selectedId: string | null;
8059
+ * select: (id: string) => void;
8060
+ * }) {
8061
+ * return (
8062
+ * <Stack gap="rows">
8063
+ * {props.servos.map((s) => (
8064
+ * <SelectableRow
8065
+ * key={s.id}
8066
+ * selected={s.id === props.selectedId}
8067
+ * onClick={() => props.select(s.id)}
8068
+ * >
8069
+ * <span>{s.name}</span>
8070
+ * <Text level="muted" size="xs">{s.group}</Text>
8071
+ * </SelectableRow>
8072
+ * ))}
8073
+ * </Stack>
8074
+ * );
8075
+ * }
7610
8076
  * ```
7611
8077
  *
7612
8078
  * @category FilterList
@@ -7643,7 +8109,7 @@ interface SpinnerProps extends Omit<HTMLAttributes<HTMLSpanElement>, "color" | "
7643
8109
  /** Active arc colour. Defaults to the accent foreground. */
7644
8110
  color?: string;
7645
8111
  /** Accessible name for screen readers. Defaults to "Loading". */
7646
- ariaLabel?: string;
8112
+ "aria-label"?: string;
7647
8113
  }
7648
8114
  /**
7649
8115
  * A small inline pending indicator: a ring with a coloured arc, sized to sit
@@ -7653,7 +8119,7 @@ interface SpinnerProps extends Omit<HTMLAttributes<HTMLSpanElement>, "color" | "
7653
8119
  *
7654
8120
  * @category EmptyState
7655
8121
  */
7656
- declare function Spinner({ size, thickness, color, ariaLabel, ...rest }: Readonly<SpinnerProps>): react_jsx_runtime.JSX.Element;
8122
+ declare function Spinner({ size, thickness, color, "aria-label": ariaLabel, ...rest }: Readonly<SpinnerProps>): react_jsx_runtime.JSX.Element;
7657
8123
 
7658
8124
  /**
7659
8125
  * Props for {@link Stack}. Any other `div` attribute passes through.
@@ -7676,12 +8142,15 @@ interface StackProps extends HTMLAttributes<HTMLDivElement> {
7676
8142
  * rather than growing the whole column.
7677
8143
  */
7678
8144
  fill?: boolean;
8145
+ /** The items, laid out top to bottom. */
7679
8146
  children?: ReactNode;
7680
8147
  }
7681
8148
  /**
7682
8149
  * A vertical flex column, the most common container shape in a widget body.
7683
8150
  * Children sit one above the other with the container's related gap between
7684
- * them unless `gap` names another.
8151
+ * them unless `gap` names another. A row that spans the container is a
8152
+ * {@link Cluster}; a compact run of badges or buttons that sits within a line is
8153
+ * an {@link Inline}.
7685
8154
  *
7686
8155
  * The layout primitives compose: a {@link Stack} of sections, a
7687
8156
  * {@link Cluster} for a label beside its controls, a {@link Grid} for a
@@ -7743,11 +8212,11 @@ interface StatProps extends Omit<HTMLAttributes<HTMLDListElement>, "title"> {
7743
8212
  tone?: Tone;
7744
8213
  }
7745
8214
  /**
7746
- * One cell of a core-stat strip (a {@link Grid} of `minColWidth="7rem" fit align="stretch"`): a label, a figure, and at most one line under
8215
+ * One cell of a stat strip, the row of key figures a widget keeps at the top of its body: a label, a figure, and at most one line under
7747
8216
  * it. A `<dl>` per cell, so the label is associated with the figure
7748
8217
  * programmatically and a cell stays valid wherever it is dropped.
7749
8218
  *
7750
- * A strip of stats is a `Grid` with `minColWidth="7rem" fit align="stretch"
8219
+ * The strip is a {@link Grid} with `minColWidth="7rem" fit align="stretch"
7751
8220
  * gap="related-compact"`, so every stat gets the same room and the row reflows
7752
8221
  * to fewer columns as the tile narrows. The strip is not a live region: add
7753
8222
  * `role="status"` yourself only when its figures change rarely, since figures
@@ -7787,7 +8256,8 @@ interface StatContributionsProps {
7787
8256
  * A fragment, not a wrapper: the cells land in the host's own `Grid` of stats
7788
8257
  * as siblings of its built-in ones. Renders nothing when
7789
8258
  * nothing is contributed, so a host can place it unconditionally. An entry's
7790
- * quantity is drawn through {@link Unit}, else its text, else the null token.
8259
+ * quantity is drawn through {@link Unit}, else its text, else the null token;
8260
+ * a held figure is drawn with the held mark either way.
7791
8261
  *
7792
8262
  * @example
7793
8263
  * ```tsx
@@ -7950,12 +8420,14 @@ interface SubjectHeadingProps {
7950
8420
  *
7951
8421
  * @example
7952
8422
  * ```tsx
8423
+ * import { Badge, SubjectHeading, Text } from "@ksp-gonogo/ui-kit";
8424
+ *
7953
8425
  * <SubjectHeading
7954
8426
  * status={
7955
8427
  * <Badge tone="go">Active</Badge>
7956
8428
  * }
7957
8429
  * >
7958
- * <Text weight="semibold">{program.title}</Text>
8430
+ * <Text weight="semibold">Kerbin Science Program</Text>
7959
8431
  * </SubjectHeading>
7960
8432
  * ```
7961
8433
  *
@@ -7963,8 +8435,15 @@ interface SubjectHeadingProps {
7963
8435
  */
7964
8436
  declare function SubjectHeading({ children, status, gap, align, }: Readonly<SubjectHeadingProps>): react_jsx_runtime.JSX.Element;
7965
8437
 
8438
+ /**
8439
+ * The props every {@link Switch} takes.
8440
+ *
8441
+ * @category Form
8442
+ */
7966
8443
  interface SwitchBaseProps {
8444
+ /** Whether the switch is on. The switch is controlled: it shows this value and changes only when the caller changes it. */
7967
8445
  checked: boolean;
8446
+ /** Called with the new state when the operator flips the switch. */
7968
8447
  onChange: (value: boolean) => void;
7969
8448
  /** Renders dimmed and non-interactive; `onChange` never fires. For a toggle whose effective state is controlled elsewhere, such as a sub-setting inert while its parent setting is off. */
7970
8449
  disabled?: boolean;
@@ -7980,16 +8459,19 @@ interface SwitchBaseProps {
7980
8459
  * @category Form
7981
8460
  */
7982
8461
  type SwitchProps = SwitchBaseProps & ({
8462
+ /** The visible name, drawn beside the track. Give this or `aria-label`, never both. */
7983
8463
  label: string;
7984
8464
  "aria-label"?: never;
7985
8465
  } | {
7986
8466
  label?: never;
8467
+ /** The accessible name, for a switch whose row already shows its label text. Give this or `label`, never both. */
7987
8468
  "aria-label": string;
7988
8469
  });
7989
8470
  /**
7990
- * An on/off toggle for a setting that takes effect at once: a native checkbox
7991
- * drawn as a sliding track, keyboard-operable with Space and with the focus
7992
- * ring drawn on the track.
8471
+ * An on/off toggle for one setting, which takes effect as it is flipped; inside
8472
+ * a form with a save bar the change waits for Save like any other field. It is
8473
+ * a native checkbox drawn as a sliding track, keyboard-operable with Space and
8474
+ * with the focus ring drawn on the track.
7993
8475
  *
7994
8476
  * @category Form
7995
8477
  */
@@ -8179,7 +8661,8 @@ interface PanelStatusStore {
8179
8661
  /**
8180
8662
  * Creates one {@link PanelStatusStore} and provides it for as long as it is
8181
8663
  * mounted, so the widget body and the tile's chrome share it. The dashboard
8182
- * mounts one per tile.
8664
+ * mounts one per tile, so a widget does not mount this itself; it is for a
8665
+ * test or a harness that renders a {@link Panel} outside the dashboard.
8183
8666
  *
8184
8667
  * @category Panel
8185
8668
  */
@@ -8188,6 +8671,8 @@ declare const PanelStatusStoreProvider: (props: {
8188
8671
  }) => react.ReactNode;
8189
8672
  /**
8190
8673
  * The nearest {@link PanelStatusStore}, or `null` outside a dashboard tile.
8674
+ * {@link Badge}'s `report` and {@link Panel} read it for you, so a widget
8675
+ * rarely calls this directly.
8191
8676
  *
8192
8677
  * @category Panel
8193
8678
  */
@@ -8199,7 +8684,9 @@ declare const usePanelStatusStore: () => PanelStatusStore | null;
8199
8684
  *
8200
8685
  * - `"held"`: HELD
8201
8686
  * - `"disconnected"`: OFFLINE
8202
- * - `"last-before-blackout"`: BLACKOUT
8687
+ * - `"last-before-blackout"`: BLACKOUT, the last value sent before a known
8688
+ * loss of signal (a blackout is a stretch when the craft's signal cannot
8689
+ * reach the command centre)
8203
8690
  * - `"recorded"`: RECORDED
8204
8691
  * - `"loading"`: LOADING
8205
8692
  * - `"no-game"`: NO GAME
@@ -8267,7 +8754,12 @@ declare function useStatusSummary(): StatusSummary | null;
8267
8754
  * @category Tabs
8268
8755
  */
8269
8756
  interface TabDescriptor {
8270
- /** Stable identity for the tab. Falls back to the tab's position in the array. */
8757
+ /**
8758
+ * Stable identity for the tab, the value `activeId` and `onChange` carry.
8759
+ * Falls back to `tab-` and the tab's position in the array (`tab-0`), which
8760
+ * moves if the tabs are reordered, so give every tab an `id` when the
8761
+ * selection is controlled.
8762
+ */
8271
8763
  id?: string;
8272
8764
  /** The tab's name in the strip, and its panel's accessible name. */
8273
8765
  label: string;
@@ -8318,27 +8810,29 @@ interface TabsProps {
8318
8810
  */
8319
8811
  declare const TABS_PANEL_MIN_WIDTH = 240;
8320
8812
  /**
8321
- * True when a container `containerWidth` pixels wide fits `panelCount` panels side by side at {@link TABS_PANEL_MIN_WIDTH} each, with the gaps between them. Always false for fewer than two panels.
8813
+ * True when a container `containerWidth` pixels wide fits `panelCount` panels side by side at {@link TABS_PANEL_MIN_WIDTH} each, with an 8px gap between neighbours: two panels need 2 × 240 + 8 = 488px. Always false for fewer than two panels.
8322
8814
  *
8323
8815
  * @category Tabs
8324
8816
  */
8325
8817
  declare function shouldExpandTabs(containerWidth: number, panelCount: number): boolean;
8326
8818
  /**
8327
- * A tab strip with one panel shown below it, following the APG tabs pattern:
8819
+ * A tab strip with one panel shown below it, following the
8820
+ * [WAI-ARIA Authoring Practices (APG) tabs pattern](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/):
8328
8821
  * arrow keys move between tabs, Home and End jump to the ends, and disabled
8329
8822
  * tabs are skipped. The strip tightens its spacing, then scrolls, when the
8330
8823
  * labels do not fit. With `expandWhenRoomy`, a container wide enough for every
8331
8824
  * enabled tab drops the strip and shows each panel side by side under its own
8332
- * heading.
8825
+ * `h3` heading.
8333
8826
  *
8334
8827
  * @example
8335
8828
  * ```tsx
8829
+ * // Side by side when the tile is wide enough for both, tabs otherwise.
8336
8830
  * <Tabs
8337
8831
  * aria-label="Vessel systems"
8832
+ * expandWhenRoomy
8338
8833
  * tabs={[
8339
8834
  * { id: "power", label: "Power", content: <PowerView /> },
8340
- * { id: "comms", label: "Comms", content: <CommsView />, indicator: commsAlarm },
8341
- * { id: "target", label: "Target", content: <TargetView />, disabled: !hasTarget },
8835
+ * { id: "comms", label: "Comms", content: <CommsView /> },
8342
8836
  * ]}
8343
8837
  * />
8344
8838
  * ```
@@ -8376,7 +8870,7 @@ interface TapeMarker<Unit extends string = string> {
8376
8870
  color?: string;
8377
8871
  /** Names the marker in the meter's spoken value. Never drawn, so a marker never competes with the scale for room. */
8378
8872
  label?: string;
8379
- /** The model's interval around `value`, drawn as the same two bounds a {@link Meter} draws. */
8873
+ /** The low and high ends of an {@link UncertaintyBand} around `value`, drawn as the same two ticks a {@link Meter} draws. */
8380
8874
  bounds?: {
8381
8875
  lo: Value<Unit>;
8382
8876
  hi: Value<Unit>;
@@ -8435,7 +8929,7 @@ interface TapeProps<Unit extends string = string> {
8435
8929
  */
8436
8930
  format?: FormatsFor<Unit>;
8437
8931
  /** Accessible label naming what the scale measures (e.g. "Altitude above terrain"). */
8438
- ariaLabel: string;
8932
+ "aria-label": string;
8439
8933
  }
8440
8934
  /**
8441
8935
  * A vertical linear scale with a moving pointer, the altimeter or airspeed
@@ -8453,7 +8947,7 @@ interface TapeProps<Unit extends string = string> {
8453
8947
  *
8454
8948
  * @category Gauge
8455
8949
  */
8456
- declare function Tape<Unit extends string = string>({ labelSide, value, min, max, width, height, fillHeight, tickStep, zones, markers, groundLine, seaLevel, format, ariaLabel, }: Readonly<TapeProps<Unit>>): react_jsx_runtime.JSX.Element;
8950
+ declare function Tape<Unit extends string = string>({ labelSide, value, min, max, width, height, fillHeight, tickStep, zones, markers, groundLine, seaLevel, format, "aria-label": ariaLabel, }: Readonly<TapeProps<Unit>>): react_jsx_runtime.JSX.Element;
8457
8951
 
8458
8952
  /**
8459
8953
  * How far plain text recedes: `muted` for secondary text, `faint` the quietest
@@ -8508,8 +9002,9 @@ interface TextProps extends HTMLAttributes<HTMLSpanElement> {
8508
9002
  }
8509
9003
  /**
8510
9004
  * Inline style declarations that recede every neutral word inside a box to the
8511
- * faint text level, which still meets WCAG AA contrast on a panel. Use it to
8512
- * quiet a block of words; opacity would drop them below contrast, so keep
9005
+ * faint text level, which still meets WCAG AA contrast on a panel. It sets `color` and the
9006
+ * neutral, primary, muted and dim text variables to that faint colour, so
9007
+ * nested kit text recedes with it. Use it to quiet a block of words; opacity would drop them below contrast, so keep
8513
9008
  * opacity for marks that carry no text. A word in a tone keeps its tone. The
8514
9009
  * same declarations as {@link faintText}, for a `style` prop.
8515
9010
  *
@@ -8517,8 +9012,8 @@ interface TextProps extends HTMLAttributes<HTMLSpanElement> {
8517
9012
  */
8518
9013
  declare const FAINT_TEXT_STYLE: Readonly<Record<string, string>>;
8519
9014
  /**
8520
- * {@link FAINT_TEXT_STYLE} as a CSS declaration string, for a styled-components
8521
- * rule.
9015
+ * The same declarations as {@link FAINT_TEXT_STYLE}, written as
9016
+ * `property: value;` lines for a styled-components rule.
8522
9017
  *
8523
9018
  * @category Typography
8524
9019
  */
@@ -8534,12 +9029,20 @@ declare function faintText(): string;
8534
9029
  *
8535
9030
  * @example
8536
9031
  * ```tsx
8537
- * <Cluster>
8538
- * <Text level="muted" size="xs">Altitude</Text>
8539
- * <Text tone="go" weight="semibold">
8540
- * <Unit value={altitude} />
8541
- * </Text>
8542
- * </Cluster>
9032
+ * import { useTelemetry } from "@ksp-gonogo/sitrep-sdk";
9033
+ * import { Cluster, Text, Unit } from "@ksp-gonogo/ui-kit";
9034
+ *
9035
+ * function AltitudeLine() {
9036
+ * const flight = useTelemetry("vessel.flight");
9037
+ * return (
9038
+ * <Cluster>
9039
+ * <Text level="muted" size="xs">Altitude</Text>
9040
+ * <Text weight="semibold">
9041
+ * <Unit value={flight.altitudeAsl} />
9042
+ * </Text>
9043
+ * </Cluster>
9044
+ * );
9045
+ * }
8543
9046
  * ```
8544
9047
  *
8545
9048
  * @category Typography
@@ -8656,7 +9159,7 @@ declare function gridFloor(def: Pick<ComponentDefinition, "tiny" | "minSize">):
8656
9159
  } | undefined;
8657
9160
 
8658
9161
  /**
8659
- * The fill an active {@link ToggleButton} takes: `go`, or `nogo` / `warn` when
9162
+ * The fill a pressed {@link ToggleButton} takes: `go`, or `nogo` / `warn` when
8660
9163
  * being on is destructive or needs attention.
8661
9164
  *
8662
9165
  * @category Button
@@ -8675,16 +9178,16 @@ type ToggleButtonSize = "sm" | "md";
8675
9178
  */
8676
9179
  interface ToggleButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
8677
9180
  /** Whether the toggle is on. Drives `aria-pressed` and the filled look. Defaults to `false`. */
8678
- active?: boolean;
8679
- /** The fill while active. Defaults to `go`. */
9181
+ pressed?: boolean;
9182
+ /** The fill while pressed. Defaults to `go`. */
8680
9183
  tone?: ToggleButtonTone;
8681
9184
  /** Defaults to `md`. */
8682
9185
  size?: ToggleButtonSize;
8683
9186
  }
8684
9187
  /**
8685
- * A two-state toggle: a real `<button>` whose `aria-pressed` follows `active`,
9188
+ * A two-state toggle: a real `<button>` whose `aria-pressed` follows `pressed`,
8686
9189
  * for controls that switch between on and off (mode pickers, filter toggles,
8687
- * rate pickers). It draws as a {@link Button}, filled in `tone` while active
9190
+ * rate pickers). It draws as a {@link Button}, filled in `tone` while pressed
8688
9191
  * and plain while not.
8689
9192
  *
8690
9193
  * ToggleButton or {@link Switch}? They are different ARIA patterns:
@@ -8700,18 +9203,29 @@ interface ToggleButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
8700
9203
  *
8701
9204
  * @example
8702
9205
  * ```tsx
8703
- * <Inline>
8704
- * {RATES.map((rate) => (
8705
- * <ToggleButton
8706
- * key={rate}
8707
- * size="sm"
8708
- * active={rate === current}
8709
- * onClick={() => setRate(rate)}
8710
- * >
8711
- * {rate}x
8712
- * </ToggleButton>
8713
- * ))}
8714
- * </Inline>
9206
+ * import { Inline, ToggleButton } from "@ksp-gonogo/ui-kit";
9207
+ *
9208
+ * const RATES = [1, 2, 3, 4] as const;
9209
+ *
9210
+ * function RatePicker(props: {
9211
+ * current: number;
9212
+ * setRate: (rate: number) => void;
9213
+ * }) {
9214
+ * return (
9215
+ * <Inline>
9216
+ * {RATES.map((rate) => (
9217
+ * <ToggleButton
9218
+ * key={rate}
9219
+ * size="sm"
9220
+ * pressed={rate === props.current}
9221
+ * onClick={() => props.setRate(rate)}
9222
+ * >
9223
+ * {rate}x
9224
+ * </ToggleButton>
9225
+ * ))}
9226
+ * </Inline>
9227
+ * );
9228
+ * }
8715
9229
  * ```
8716
9230
  *
8717
9231
  * @category Button
@@ -8827,9 +9341,13 @@ interface TooltipProps {
8827
9341
  declare function Tooltip({ text, children, focusable, announce, }: TooltipProps): react_jsx_runtime.JSX.Element;
8828
9342
 
8829
9343
  /**
8830
- * An orbit path that may not be drawn, and the reason: no horizon was stated
8831
- * for it, the instant on screen is past its horizon, its shape was not stated,
8832
- * the frame asked for cannot be built, or it could not be sampled. It is the
9344
+ * An orbit path that may not be drawn, and the reason. An orbit's elements are
9345
+ * the numbers that define its curve, and its horizon is how far ahead in game
9346
+ * time they can be trusted. The path is withheld when no horizon was stated for
9347
+ * it, the instant on screen is past its horizon, its shape (a conic drawn from
9348
+ * the elements, or an arc sampled by the provider) was not stated, the frame
9349
+ * asked for cannot be built (a body not yet received, say), or it could not be
9350
+ * sampled. It is the
8833
9351
  * `withheld` member of `OrbitTrajectory`, which `useOrbitTrajectory` from
8834
9352
  * `@ksp-gonogo/sitrep-sdk/frames` returns.
8835
9353
  *
@@ -8966,6 +9484,7 @@ interface UnitInputProps<Unit extends string = string> {
8966
9484
  range?: SlidableRange<Unit>;
8967
9485
  /** Supplying a notch size adds a rate wheel beside the field. See {@link RateControl}. */
8968
9486
  rate?: RateControl;
9487
+ /** Greys the field, and any slider or wheel, out and ignores input. */
8969
9488
  disabled?: boolean;
8970
9489
  }
8971
9490
  /**
@@ -9075,6 +9594,7 @@ type UnitPinsByGroup = {
9075
9594
  };
9076
9595
  /** What every spelling of the props below shares. */
9077
9596
  interface UnitSharedFormatBaseProps {
9597
+ /** The tree whose figures share the format. */
9078
9598
  children?: ReactNode;
9079
9599
  /**
9080
9600
  * Widen the digit count until the members stop printing the same figure as each other. What an interval wants (6 700 km and 6 710 km both print `6.7 Mm` otherwise) and a column does not. Applies to the whole scope.
@@ -9382,6 +9902,7 @@ interface WidgetMetaContextValue {
9382
9902
  * `null` outside one. The dashboard provides it for every widget; a test
9383
9903
  * rendering a widget bare provides it to get the widget's slots working.
9384
9904
  *
9905
+ * @intent Published so a test or a host of its own can give a widget the identity and slots the dashboard provides.
9385
9906
  * @category Extensions
9386
9907
  */
9387
9908
  declare const WidgetMetaContext: react.Context<WidgetMetaContextValue | null>;
@@ -9482,34 +10003,53 @@ declare function useWidgetScope<Widget extends string>(componentId: Widget): Wid
9482
10003
  interface WidgetTopicDeclaration {
9483
10004
  channels?: readonly string[];
9484
10005
  optionalChannels?: readonly string[];
10006
+ channelFamilies?: readonly string[];
10007
+ optionalChannelFamilies?: readonly string[];
10008
+ channelsFromConfig?: (config: never) => readonly string[];
9485
10009
  fields?: readonly string[];
9486
10010
  dataRequirements?: readonly string[];
9487
10011
  }
9488
10012
  /**
9489
- * Every channel a widget declares it mounts on: its `channels`,
9490
- * `optionalChannels` and `dataRequirements` joined, without duplicates. The
9491
- * dashboard derives a widget's blackout badge from these. Empty for an
9492
- * undefined definition.
10013
+ * Every concrete channel a widget declares it mounts on: its `channels`,
10014
+ * `optionalChannels` and `dataRequirements` joined, plus the Topics its
10015
+ * `channelsFromConfig` names for `config`, without duplicates. The dashboard
10016
+ * derives a widget's blackout badge from these. Empty for an undefined
10017
+ * definition.
10018
+ *
10019
+ * Families (`channelFamilies`, `optionalChannelFamilies`) are left out on
10020
+ * purpose: blackout is per craft and a family has no single craft, so see
10021
+ * {@link widgetDrawnFamilies} for them.
9493
10022
  *
9494
10023
  * @category Extensions
9495
10024
  */
9496
- declare function widgetDeclaredTopics(def: WidgetTopicDeclaration | undefined): readonly string[];
10025
+ declare function widgetDeclaredTopics(def: WidgetTopicDeclaration | undefined, config?: unknown): readonly string[];
9497
10026
  /**
9498
10027
  * Every field a widget declares it draws, as opposed to the channels it needs
9499
10028
  * live to render at all: its `fields` without duplicates, or, when it
9500
- * declares none, its {@link widgetDeclaredTopics}. The dashboard matches alarms
9501
- * to widgets against this list.
10029
+ * declares none, its {@link widgetDeclaredTopics}. Topics from
10030
+ * `channelsFromConfig` are always included. The dashboard matches alarms to
10031
+ * widgets against this list.
9502
10032
  *
9503
10033
  * @category Extensions
9504
10034
  */
9505
- declare function widgetDrawnFields(def: WidgetTopicDeclaration | undefined): readonly string[];
10035
+ declare function widgetDrawnFields(def: WidgetTopicDeclaration | undefined, config?: unknown): readonly string[];
10036
+ /**
10037
+ * Every family of runtime-built Topic ids a widget declares, required and
10038
+ * optional joined, without duplicates, such as `"fleet.<vessel>.contact"`. The
10039
+ * dashboard matches alarms against these with `topicMatchesFamily`.
10040
+ *
10041
+ * @category Extensions
10042
+ */
10043
+ declare function widgetDrawnFamilies(def: WidgetTopicDeclaration | undefined): readonly string[];
9506
10044
 
9507
10045
  /**
9508
10046
  * How much room a widget tile has, derived from its `w` and `h` grid units by
9509
10047
  * {@link getSizeBucket} so every widget uses the same boundaries.
9510
10048
  *
9511
- * - `tiny`: a single-glance status or one key readout
9512
- * - `small`: essential numbers, minimal chrome
10049
+ * - `tiny`: a single-glance status or one key readout; under 5 columns wide or
10050
+ * 4 rows tall
10051
+ * - `small`: essential numbers, minimal chrome; under 8 columns wide or 7 rows
10052
+ * tall
9513
10053
  * - `normal`: the full widget UI
9514
10054
  *
9515
10055
  * A widget that declares a tiny mode is drawn by the kit in `tiny`; every other
@@ -9526,12 +10066,14 @@ type SizeBucket = "tiny" | "small" | "normal";
9526
10066
  * @category Layout
9527
10067
  */
9528
10068
  declare const TINY_BELOW: {
10069
+ /** Width in grid columns: a tile under 5 columns wide is `tiny`. */
9529
10070
  readonly w: 5;
10071
+ /** Height in grid rows: a tile under 4 rows tall is `tiny`. */
9530
10072
  readonly h: 4;
9531
10073
  };
9532
10074
  /**
9533
10075
  * The {@link SizeBucket} a `w` by `h` tile falls in: `tiny` below
9534
- * {@link TINY_BELOW} on either axis, `small` below 8 wide or 7 tall, `normal`
10076
+ * {@link TINY_BELOW} on either axis, `small` below 8 columns wide or 7 rows tall, `normal`
9535
10077
  * otherwise. Returns `normal` while either dimension is `undefined`.
9536
10078
  *
9537
10079
  * This is the bucket by size alone, for a widget arranging its own body.
@@ -9562,6 +10104,7 @@ type WidgetShape = "portrait" | "landscape" | "square";
9562
10104
  * @category Layout
9563
10105
  */
9564
10106
  interface WidgetShapeInfo {
10107
+ /** Whether the tile is tall, wide or roughly square. */
9565
10108
  shape: WidgetShape;
9566
10109
  /**
9567
10110
  * Raw grid aspect ratio, `w / h`. > 1 is wider-than-tall, < 1 is
@@ -9581,4 +10124,71 @@ interface WidgetShapeInfo {
9581
10124
  */
9582
10125
  declare function getWidgetShape(w: number | undefined, h: number | undefined): WidgetShapeInfo;
9583
10126
 
9584
- export { ARM_TIMEOUT_MS, ActionMenu, type ActionMenuItem, type ActionMenuProps, type AnchorPoint, type AnchoredPosition, AntiNormalIcon, AntiTargetIcon, type AnyAugment, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, type AudioCaptureSupport, type AudioCaptureUnsupportedReason, type AudioInputControls, type AudioInputDevice, type AudioInputFailure, AudioInputPicker, type AudioInputPickerProps, type AudioInputState, type AudioInputStatus, type AugmentSegmentProps, type AugmentSegmentRegistry, type AugmentSettingsContextValue, AugmentSettingsPanel, type AugmentSettingsPanelProps, AugmentSettingsProvider, AugmentSlot, AutoEmptyState, type AutoEmptyStateProps, Badge, type BadgeFace, type BadgeProps, type BadgeSize, Band, type BandProps, BellIcon, BinormalIcon, Block, type BlockProps, type BlockTitleRowProps, Box, type BoxPad, type BoxProps, type BoxRadius, type BoxSurface, BroadcastIcon, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonTone, type ButtonVariant, Card, type CardProps, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CloseIcon, Cluster, type ClusterAlign, type ClusterJustify, type ClusterProps, ComboboxListbox, type ComboboxListboxProps, type ComboboxOption, CommandButton, type CommandButtonHandle, type CommandButtonPhase, type CommandButtonProps, type CommandButtonSize, type CommandButtonState, type CommandButtonTone, CommandDelay, type CommandDelayHandle, type CommandDelayProps, type CommandFailedEntry, type CommandFailedLike, type CommandFoundEntry, type CommandFoundLike, type CommandGateLike, CommandGroup, type CommandGroupProps, type CommandHandle, CommandList, type CommandListKind, type CommandListProps, type CommandLossEntry, type CommandLossLike, type CommandOutcomes, type CommandRefusalEntry, type CommandRefusalLike, type CommandReplyLike, type CommandUndeliveredEntry, type CommandUndeliveredLike, ComposerBar, type ComposerBarProps, ComputerIcon, ConfigForm, Console, type ConsoleProps, type ConsoleTone, ContainerBreak, type ContainerBreakProps, type ContributionSlotEntry, ContributionsPanelStore, ContributionsProvider, ControlDelayStream, type ControlDelayStreamProps, type ControlDelayStreamVariant, type ControlRibbonDatum, type ControlStreamDatum, type ControlStreamSample, Countdown, type CountdownProps, DataKeyPicker, type DataKeyPickerProps, DataLine, type DataLineProps, DataTable, type DataTableColumn, type DataTableProps, type DataTableSection, DatabaseIcon, DefaultThemeProvider, DelayRailContext, DelayRailProvider, DiagnosticsIcon, Dial, type DialProps, type DialTick, type DialZone, Disclosure, type DisclosureProps, DivergingBar, type DivergingBarProps, Divider, type DividerProps, DomainAvailabilityContext, DomainAvailabilityProvider, type DomainAvailabilityStore, type DrawnPrecision, type ElementSize, EmptyState, type EmptyStateLayout, type EmptyStateProps, type EphemerisFigure, ExpandableText, type ExpandableTextProps, FAINT_TEXT_STYLE, FRAMEWORK_AUGMENT_SEGMENTS, FRAMEWORK_CONTRIBUTION_SEGMENTS, Field, FieldHint, FieldLabel, FieldRow, Fill, type FillProps, type FillQuantity, FilterChip, type FilterChipProps, FilterList, type FilterListProps, FilterRegion, type FilterRegionProps, type FilterRow, FitLabelButton, type FitLabelButtonProps, Floating, type FloatingProps, FormActions, FormatsFor, FormatsForKind, FramedDisplay, type FramedDisplayProps, FrenetNormalIcon, FullHeightIcon, FullWidthIcon, FullscreenEnterIcon, FullscreenExitIcon, type GapToken, GraphNotice, type GraphNoticePlacement, type GraphNoticeProps, type GraphNoticeSpace, Grid, type GridAlign, type GridProps, HalfHeightIcon, HalfWidthIcon, HeartIcon, HeldBadge, type HeldBadgeProps, HeldFigure, type HeldFigureProps, HistoryIcon, HomeIcon, HoverCard, type HoverCardProps, INTERVAL_DASH, IconButton, type IconProps, InFlightFace, type InFlightFaceProps, InFlightList, type InFlightListDensity, type InFlightListItem, type InFlightListMode, type InFlightListProps, InfoIcon, Inline, type InlineProps, Input, type InsetToken, InstrumentHeldMark, JogWheel, type JogWheelProps, JoystickIcon, type KeyOption, KindOfGroup, LayersIcon, LevelBars, type LevelBarsProps, LineGraph, type LineGraphProps, type LineGraphSeries, type LineGraphThreshold, type LineGraphThresholdStyle, LiveRegion, type LiveRegionProps, LockIcon, LockMark, type LockMarkProps, LockScope, type LockScopeProps, type LockSummary, MARKER_ICONS, MARKER_IDS, ManeuverIcon, type MarkKind, type MarkerIconProps, type MarkerId, Meter, type MeterLayout, type MeterProps, MeterRowGroup, MeterStack, MicroscopeIcon, MissionDate, MissionDateField, type MissionDateFieldProps, type MissionDateParts, type MissionDateProps, ModalChromeContext, type ModalChromeValue, ModalProvider, type ModalSaveBarOptions, ModelledAlongside, type ModelledFigureAlongsideProps, type ModelledQuantityAlongsideProps, MutedIcon, NULL_DISPLAY, NormalIcon, Notice, type NoticeProps, NullValue, type PaintReckoningMarkOptions, type PaintVesselMarkOptions, Panel, type PanelAsideSize, type PanelBadge, PanelBadgesProvider, type PanelInactiveReason, type PanelProps, type PanelSidebarSide, type PanelSplitProps, type PanelStatusStore, PanelStatusStoreProvider, type PanelTitleProps, ParallelMinusIcon, ParallelPlusIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, PresentableAs, PresentableAsKind, ProgradeIcon, PushUpIcon, RECKONING_MARK, RETIRED_SLOT_IDS, RadialInIcon, RadialOutIcon, type RailEntry, type RailFailed, type RailFound, type RailLoss, type RailRefusal, type RailUndelivered, type RateControl, ReadFrameControl, type ReadFrameControlProps, type ReadFrameOption, ReadOnlyField, type ReadOnlyFieldProps, type ReadOnlyFieldValue, Readout, ReadoutCaption, type ReadoutSize, RecallIcon, type ReckonedPosition, ReckonedUnit, type ReckoningKind, ReckoningMark, ReckoningMarkSvg, type ReckoningMarking, RelativeMinusIcon, RelativePlusIcon, type Resolved, RetrogradeIcon, Row, type RowFilter, RowName, type RowProps, STREAM_MIN_DELAY_SECONDS, SatelliteIcon, ScrollArea, SearchBox, type SearchBoxProps, Section, type SectionProps, SectionTitle, Select, SelectableRow, type SelectableRowProps, SendIcon, SettingsIcon, type Severity, type SharedFormat, SignalDelayBadge, type SignalDelayBadgeProps, type SizeBucket, type SlidableRange, Slider, type SliderProps, SpeakerIcon, Spinner, type SpinnerProps, Stack, type StackProps, StarIcon, Stat, StatContributions, type StatContributionsProps, type StatProps, type StaticElement, type StatusBreakdownEntry, type StatusContribution, StatusIndicator, type StatusIndicatorProps, type StatusSummary, Stepper, type StepperProps, StopIcon, StreamStatusBadge, type StreamStatusBadgeProps, SubjectHeading, type SubjectHeadingProps, Switch, type SwitchProps, TABS_PANEL_MIN_WIDTH, TINY_BELOW, TONE_LABEL, TONE_MARK, TONE_ON_STATUS, TONE_STATUS, TONE_TEXT, type TabDescriptor, Tabs, type TabsProps, TangentIcon, Tape, type TapeMarker, type TapeProps, type TapeZone, TargetIcon, Text, TextButton, TextField, type TextFieldProps, type TextLevel, type TextProps, type TextSize, type TextWeight, Textarea, type ThemeBorders, type ThemeColors, type ThemeTypography, type TimeContext, TinyEssentials, type TinyEssentialsProps, ToggleButton, type ToggleButtonProps, type ToggleButtonSize, type ToggleButtonTone, Tooltip, type TooltipAnchorProps, type TooltipProps, TrajectoryWithheldNote, Truncate, type UiKitTheme, Unit, UnitGroupKey, type UnitGroupPins, UnitInput, type UnitInputProps, type UnitPins, type UnitPinsByGroup, type UnitProps, UnitSharedFormat, type UnitSharedFormatMixedProps, type UnitSharedFormatProps, type UnitValue, type UseAudioInputOptions, type UseCommandButtonOptions, type UseRowFilterOptions, type UseTooltipResult, VESSEL_MARK, type VesselMarkState, VesselMarkSvg, type VesselMarkSvgProps, type VesselPositions, VisuallyHidden, WAVE_HALF_H, WAVE_MID_Y, WidgetBody, WidgetMetaContext, type WidgetMetaContextValue, WidgetMeters, type WidgetMetersProps, WidgetScopeProvider, WidgetSections, type WidgetShape, type WidgetShapeInfo, type WidgetTopicDeclaration, type WithheldTrajectory, anchoredPosition, audioCaptureSupport, badgeFace, bandClaim, clearAugments, commandFailedSentence, commandFoundSentence, commandGateSentence, commandLossSentence, commandOutcomes, commandRefusalSentence, commandUndeliveredSentence, configEqual, createDelayRailStore, createDomainAvailabilityStore, defaultDarkTheme, derivedMarking, describeAudioInput, ephemerisFigureOf, faintText, filterComboboxOptions, flattenComboboxGroups, formatStreamStatus, getAugmentSettings, getAugments, getAugmentsForSlot, getSizeBucket, getWidgetShape, gridFloor, groupComboboxOptions, heldWord, modelledBeyondReceived, moveComboboxActiveIndex, onAugmentsChange, paintReckonedPosition, paintReckoningMark, paintVesselMark, paintVesselPositions, placeGraphNotice, placedOnScale, railTagKey, reckoningBasisPhrase, registerAugment, resolveCurrency, resourceColor, ribbonBoundaryX, sayHeld, severityFromStreamStatus, shouldExpandTabs, showsTiny, sizeDeltaFor, standsApart, toInFlightListItems, toneEdge, trajectoryWithheldCopy, useActiveHandles, useAllAugmentSettings, useAudioInput, useAugmentAvailable, useAugmentSettings, useCommandButton, useContributions, useContributionsBySlotId, useDelayRailStore, useDomainAvailabilityStore, useElementSize, useModal, useModalChrome, useModalSaveBar, usePanelAsideSize, usePanelStatusStore, usePrefersReducedMotion, useRailEntry, useRowFilter, useSizeDeltaFor, useSlotBound, useSlotLabel, useStatusBreakdown, useStatusContribution, useStatusSummary, useTooltip, useWidgetBadges, useWidgetMeta, useWidgetScope, useWidgetSegmentBound, utOfParts, waveformPath, widgetDeclaredTopics, widgetDrawnFields, withSizeDelta, worstSeverity, writtenAs, writtenQuantity };
10127
+ /**
10128
+ * Geometry for a flat map that repeats east and west: a ground track drawn as
10129
+ * one continuous line however often it crosses the antimeridian, and every
10130
+ * mark drawn in whichever copy of the world is in view.
10131
+ */
10132
+ /**
10133
+ * A point on the body, in degrees.
10134
+ *
10135
+ * @category Map
10136
+ */
10137
+ interface GroundPoint {
10138
+ /** Degrees north, from -90 at the south pole to 90 at the north. */
10139
+ lat: number;
10140
+ /** Degrees east. */
10141
+ lon: number;
10142
+ }
10143
+ /**
10144
+ * Break a ground track wherever it flies over a pole, where its longitude
10145
+ * flips by half a turn and a line joining the pair would run along the map's
10146
+ * top or bottom edge. Crossing the antimeridian is not a break: draw each run
10147
+ * with {@link wrapPath}, which carries it on into the next copy of the world.
10148
+ *
10149
+ * Geometric, not a tuned constant: a pair straddles a pole when the shorter
10150
+ * great-circle arc between them passes closer to it than the samples are to
10151
+ * each other. "Passes" means the arc's closest point to the pole lies between
10152
+ * them, which rules out a pair climbing on one leg; "closer than each other"
10153
+ * ties the test to the sampling, so a near miss the sampling resolves still
10154
+ * draws its jog.
10155
+ *
10156
+ * @category Map
10157
+ */
10158
+ declare function splitAtPoleCrossings<Point extends GroundPoint>(points: readonly Point[]): Point[][];
10159
+ /**
10160
+ * The copies of a projected path that cross a view of a map repeating every
10161
+ * `period` pixels across. The path is first made continuous, each point moved
10162
+ * by whole periods to lie within half a period of the one before, so a track
10163
+ * that leaves one edge of the world carries on past it rather than jumping
10164
+ * back across the map. Then it is shifted by every whole period that brings
10165
+ * some of it between `viewMin` and `viewMax`.
10166
+ *
10167
+ * Points may come from any copy of the world, such as a projection that wraps
10168
+ * longitude. The path must already be split where it crosses a pole (see
10169
+ * {@link splitAtPoleCrossings}), since half a turn of longitude is no jump a
10170
+ * continuous line can be told apart from.
10171
+ *
10172
+ * @category Map
10173
+ * @categoryDescription Map
10174
+ * Drawing on a flat map of a body that repeats east and west, such as a
10175
+ * `map-view.overlay`. A ground track is split only where it flies over a pole,
10176
+ * carried on across the antimeridian rather than drawn back across the map,
10177
+ * and drawn again in every repeat of the world in view.
10178
+ */
10179
+ declare function wrapPath<Point extends {
10180
+ x: number;
10181
+ }>(points: readonly Point[], period: number, viewMin: number, viewMax: number): Point[][];
10182
+ /**
10183
+ * Every whole multiple of `period` that, added to the span `min` to `max`,
10184
+ * puts some of it between `viewMin` and `viewMax`, west to east. On a
10185
+ * map repeating every `period` pixels, these are the shifts at which to draw
10186
+ * a mark or a region so it appears in every copy of the world in view. A
10187
+ * single point is a span with `min` equal to `max`; widen the view by the
10188
+ * mark's own size so one straddling the edge is not dropped.
10189
+ *
10190
+ * @category Map
10191
+ */
10192
+ declare function repeatsInView(min: number, max: number, viewMin: number, viewMax: number, period: number): number[];
10193
+
10194
+ export { ARM_TIMEOUT_MS, ActionMenu, type ActionMenuItem, type ActionMenuProps, type AnchorPoint, type AnchoredPosition, AntiNormalIcon, AntiTargetIcon, type AnyAugment, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, type AudioCaptureSupport, type AudioCaptureUnsupportedReason, type AudioInputControls, type AudioInputDevice, type AudioInputFailure, AudioInputPicker, type AudioInputPickerProps, type AudioInputState, type AudioInputStatus, type AugmentSegmentProps, type AugmentSegmentRegistry, type AugmentSettingsContextValue, AugmentSettingsPanel, type AugmentSettingsPanelProps, AugmentSettingsProvider, AugmentSlot, AutoEmptyState, type AutoEmptyStateProps, AvatarStack, type AvatarStackItem, type AvatarStackProps, Badge, type BadgeFace, type BadgeProps, type BadgeSize, Band, type BandProps, BellIcon, BinormalIcon, Block, type BlockProps, type BlockTitleRowProps, Box, type BoxPad, type BoxProps, type BoxRadius, type BoxSurface, BroadcastIcon, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, type ButtonSize, type ButtonTone, type ButtonVariant, Card, type CardProps, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, CloseIcon, Cluster, type ClusterAlign, type ClusterJustify, type ClusterProps, ComboboxListbox, type ComboboxListboxProps, type ComboboxOption, CommandButton, type CommandButtonHandle, type CommandButtonPhase, type CommandButtonProps, type CommandButtonSize, type CommandButtonState, type CommandButtonTone, CommandDelay, type CommandDelayHandle, type CommandDelayProps, type CommandFailedEntry, type CommandFailedLike, type CommandFoundEntry, type CommandFoundLike, type CommandGateLike, CommandGroup, type CommandGroupProps, type CommandHandle, CommandList, type CommandListKind, type CommandListProps, type CommandLossEntry, type CommandLossLike, type CommandOutcomes, type CommandRefusalEntry, type CommandRefusalLike, type CommandReplyLike, type CommandUndeliveredEntry, type CommandUndeliveredLike, ComposerBar, type ComposerBarProps, ComputerIcon, ConfigForm, Console, type ConsoleProps, type ConsoleTone, ContainerBreak, type ContainerBreakProps, type ContributionSlotEntry, ContributionsPanelStore, ContributionsProvider, ControlDelayStream, type ControlDelayStreamProps, type ControlDelayStreamVariant, type ControlRibbonDatum, type ControlStreamDatum, type ControlStreamSample, Countdown, type CountdownProps, type CurrencyOptions, DataKeyPicker, type DataKeyPickerProps, DataLine, type DataLineProps, DataTable, type DataTableColumn, type DataTableColumnBase, type DataTableProps, type DataTableSection, DatabaseIcon, DefaultThemeProvider, DelayRailContext, DelayRailProvider, DiagnosticsIcon, Dial, type DialProps, type DialTick, type DialZone, Disclosure, type DisclosureProps, DivergingBar, type DivergingBarProps, Divider, type DividerProps, DomainAvailabilityContext, DomainAvailabilityProvider, type DomainAvailabilityStore, type DrawnPrecision, type ElementSize, EmptyState, type EmptyStateLayout, type EmptyStateProps, type EphemerisFigure, ExpandableText, type ExpandableTextProps, FAINT_TEXT_STYLE, FRAMEWORK_AUGMENT_SEGMENTS, FRAMEWORK_CONTRIBUTION_SEGMENTS, Field, FieldHint, FieldLabel, FieldRow, Fill, type FillProps, type FillQuantity, FilterChip, type FilterChipProps, FilterList, type FilterListProps, FilterRegion, type FilterRegionProps, type FilterRow, FitLabelButton, type FitLabelButtonProps, Floating, type FloatingProps, FormActions, FormatQuantityOptions, FormatsFor, FormatsForKind, FramedDisplay, type FramedDisplayProps, FrenetNormalIcon, FullHeightIcon, FullWidthIcon, FullscreenEnterIcon, FullscreenExitIcon, type GapToken, GraphNotice, type GraphNoticePlacement, type GraphNoticeProps, type GraphNoticeSpace, Grid, type GridAlign, type GridProps, type GroundPoint, HalfHeightIcon, HalfWidthIcon, HeartIcon, HeldBadge, type HeldBadgeProps, HeldFigure, type HeldFigureProps, HistoryIcon, HomeIcon, HoverCard, type HoverCardProps, INTERVAL_DASH, IconButton, type IconButtonProps, type IconProps, type InFlightCommandLike, InFlightFace, type InFlightFaceProps, InFlightList, type InFlightListDensity, type InFlightListItem, type InFlightListMode, type InFlightListProps, InfoIcon, Inline, type InlineProps, Input, type InsetToken, InstrumentHeldMark, JogWheel, type JogWheelCommon, type JogWheelProps, JoystickIcon, type KeyOption, KindOfGroup, LayersIcon, LevelBars, type LevelBarsProps, LineGraph, type LineGraphProps, type LineGraphSeries, type LineGraphThreshold, type LineGraphThresholdStyle, LiveRegion, type LiveRegionProps, LockIcon, LockMark, type LockMarkProps, LockScope, type LockScopeProps, type LockSummary, MARKER_ICONS, MARKER_IDS, ManeuverIcon, type MarkKind, type MarkerIconProps, type MarkerId, Meter, type MeterLayout, type MeterProps, MeterRowGroup, MeterStack, MicroscopeIcon, MissionDate, MissionDateField, type MissionDateFieldProps, type MissionDateParts, type MissionDateProps, ModalChromeContext, type ModalChromeValue, type ModalContextValue, type ModalOpenOptions, ModalProvider, type ModalSaveBarOptions, ModelledAlongside, type ModelledFigureAlongsideProps, type ModelledQuantityAlongsideProps, MutedIcon, NULL_DISPLAY, NormalIcon, Notice, type NoticeProps, NullValue, type PaintReckoningMarkOptions, type PaintVesselMarkOptions, Panel, type PanelAsideSize, type PanelBadge, PanelBadgesProvider, type PanelInactiveReason, type PanelProps, type PanelSidebarSide, type PanelStatusStore, PanelStatusStoreProvider, type PanelTitleProps, ParallelMinusIcon, ParallelPlusIcon, PauseIcon, PencilIcon, PlayIcon, PlotCrosshair, type PlotCrosshairProps, type PlotCrosshairRow, type PlotReadoutPlacement, type PlotReadoutSpace, PlusIcon, PresentableAs, PresentableAsKind, ProgradeIcon, PushUpIcon, RECKONING_MARK, RETIRED_SLOT_IDS, RadialInIcon, RadialOutIcon, type RailEntry, type RailFailed, type RailFound, type RailLoss, type RailRefusal, type RailUndelivered, type RateControl, ReadFrameControl, type ReadFrameControlProps, type ReadFrameOption, ReadOnlyField, type ReadOnlyFieldProps, type ReadOnlyFieldValue, Readout, ReadoutCaption, type ReadoutProps, type ReadoutSize, RecallIcon, type ReckonedPosition, ReckonedUnit, type ReckoningKind, ReckoningMark, ReckoningMarkSvg, type ReckoningMarking, RelativeMinusIcon, RelativePlusIcon, type Resolved, RetrogradeIcon, Row, type RowFilter, RowName, type RowProps, STREAM_MIN_DELAY_SECONDS, SatelliteIcon, ScrollArea, SearchBox, type SearchBoxProps, Section, type SectionProps, SectionTitle, Select, SelectableRow, type SelectableRowProps, SendIcon, SettingsIcon, type Severity, type SharedFormat, SignalDelayBadge, type SignalDelayBadgeProps, type SizeBucket, type SlidableRange, Slider, type SliderProps, SpeakerIcon, Spinner, type SpinnerProps, Stack, type StackProps, StarIcon, Stat, StatContributions, type StatContributionsProps, type StatProps, type StaticElement, type StatusBreakdownEntry, type StatusContribution, StatusIndicator, type StatusIndicatorProps, type StatusSummary, Stepper, type StepperProps, StopIcon, StreamStatusBadge, type StreamStatusBadgeProps, SubjectHeading, type SubjectHeadingProps, Switch, type SwitchBaseProps, type SwitchProps, TABS_PANEL_MIN_WIDTH, TINY_BELOW, TONE_LABEL, TONE_MARK, TONE_ON_STATUS, TONE_STATUS, TONE_TEXT, type TabDescriptor, Tabs, type TabsProps, TangentIcon, Tape, type TapeMarker, type TapeProps, type TapeZone, TargetIcon, Text, TextButton, TextField, type TextFieldProps, type TextLevel, type TextProps, type TextSize, type TextWeight, Textarea, type ThemeBorders, type ThemeColors, type ThemeTypography, type TimeContext, TinyEssentials, type TinyEssentialsProps, ToggleButton, type ToggleButtonProps, type ToggleButtonSize, type ToggleButtonTone, Tooltip, type TooltipAnchorProps, type TooltipProps, TrajectoryWithheldNote, Truncate, type UiKitTheme, Unit, UnitGroupKey, type UnitGroupPins, UnitInput, type UnitInputProps, type UnitPins, type UnitPinsByGroup, type UnitProps, UnitSharedFormat, type UnitSharedFormatMixedProps, type UnitSharedFormatProps, type UnitValue, type UseAudioInputOptions, type UseCommandButtonOptions, type UseRowFilterOptions, type UseTooltipResult, VESSEL_MARK, type VesselMarkState, VesselMarkSvg, type VesselMarkSvgProps, type VesselPositions, VisuallyHidden, WAVE_HALF_H, WAVE_MID_Y, WidgetBody, WidgetMetaContext, type WidgetMetaContextValue, WidgetMeters, type WidgetMetersProps, WidgetScopeProvider, WidgetSections, type WidgetShape, type WidgetShapeInfo, type WidgetTopicDeclaration, type WithheldTrajectory, anchoredPosition, audioCaptureSupport, badgeFace, clearAugments, commandFailedSentence, commandFoundSentence, commandGateSentence, commandLossSentence, commandOutcomes, commandRefusalSentence, commandUndeliveredSentence, configEqual, createDelayRailStore, createDomainAvailabilityStore, defaultDarkTheme, derivedMarking, describeAudioInput, ephemerisFigureOf, faintText, filterComboboxOptions, flattenComboboxGroups, formatStreamStatus, getAugmentSettings, getAugments, getAugmentsForSlot, getSizeBucket, getWidgetShape, gridFloor, groupComboboxOptions, heldFigureOf, heldGradeOf, heldMarking, heldWord, initialsOf, modelledBeyondReceived, moveComboboxActiveIndex, onAugmentsChange, paintReckonedPosition, paintReckoningMark, paintVesselMark, paintVesselPositions, placeGraphNotice, placePlotReadouts, placedOnScale, plotCrosshairShowsCard, railTagKey, reckoningBasisPhrase, registerAugment, repeatsInView, resolveCurrency, resourceColor, ribbonBoundaryX, sayHeld, severityFromStreamStatus, shouldExpandTabs, showsTiny, sizeDeltaFor, splitAtPoleCrossings, standsApart, toInFlightListItems, toneEdge, trajectoryWithheldCopy, useActiveHandles, useAllAugmentSettings, useAudioInput, useAugmentAvailable, useAugmentSettings, useCommandButton, useContributions, useContributionsBySlotId, useDelayRailStore, useDomainAvailabilityStore, useElementSize, useModal, useModalChrome, useModalSaveBar, usePanelAsideSize, usePanelStatusStore, usePrefersReducedMotion, useRailEntry, useRowFilter, useSizeDeltaFor, useSlotBound, useSlotLabel, useStatusBreakdown, useStatusContribution, useStatusSummary, useTooltip, useWidgetBadges, useWidgetMeta, useWidgetScope, useWidgetSegmentBound, utOfParts, waveformPath, widgetDeclaredTopics, widgetDrawnFamilies, widgetDrawnFields, withSizeDelta, worstSeverity, wrapPath, writtenAs, writtenQuantity };