@altertable/data-app 0.65.0 → 0.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/AGENTS.md +38 -1
  2. package/CONTRIBUTING.md +54 -14
  3. package/README.md +1 -1
  4. package/dist/chunks/index-23dktynd.js +80 -0
  5. package/dist/chunks/index-23dktynd.js.map +10 -0
  6. package/dist/chunks/index-8qfxv0h5.js +14160 -0
  7. package/dist/chunks/index-8qfxv0h5.js.map +108 -0
  8. package/dist/chunks/index-ag0cgnvq.js +639 -0
  9. package/dist/chunks/index-ag0cgnvq.js.map +13 -0
  10. package/dist/chunks/index-dq7b35fn.js +307 -0
  11. package/dist/chunks/index-dq7b35fn.js.map +13 -0
  12. package/dist/chunks/{contract-a061yj6r.js → index-ev2b5aaf.js} +41 -72
  13. package/dist/chunks/index-ev2b5aaf.js.map +12 -0
  14. package/dist/chunks/{contract-awa2d5b1.js → index-f5cnbrjz.js} +19 -2
  15. package/dist/chunks/{contract-awa2d5b1.js.map → index-f5cnbrjz.js.map} +4 -3
  16. package/dist/chunks/{contract-sm7j7k95.js → index-ktmvs916.js} +9 -150
  17. package/dist/chunks/index-ktmvs916.js.map +13 -0
  18. package/dist/chunks/{contract-txjy0en2.js → index-m6n8ctfc.js} +64 -72
  19. package/dist/chunks/index-m6n8ctfc.js.map +10 -0
  20. package/dist/chunks/index-mt93ff2b.js +28 -0
  21. package/dist/chunks/index-mt93ff2b.js.map +10 -0
  22. package/dist/chunks/{contract-tf8c3qpv.js → index-qd5xgx6y.js} +46 -5
  23. package/dist/chunks/index-qd5xgx6y.js.map +13 -0
  24. package/dist/chunks/index-x69p7cv7.js +149 -0
  25. package/dist/chunks/index-x69p7cv7.js.map +10 -0
  26. package/dist/client/index.js +12 -7
  27. package/dist/client/index.js.map +1 -1
  28. package/dist/core/appearance.js +1 -1
  29. package/dist/core/config.js +7 -3
  30. package/dist/core/config.js.map +1 -1
  31. package/dist/core/contract.js +24 -6
  32. package/dist/core/contract.js.map +1 -1
  33. package/dist/core/format.js +1 -1
  34. package/dist/embed/index.js +16 -12
  35. package/dist/embed/index.js.map +4 -4
  36. package/dist/index.js +12 -0
  37. package/dist/index.js.map +9 -0
  38. package/dist/local.js +20 -30
  39. package/dist/local.js.map +7 -8
  40. package/dist/react/embed/index.js +1 -1
  41. package/dist/react/embed/index.js.map +2 -2
  42. package/dist/react/index.js +2567 -11542
  43. package/dist/react/index.js.map +16 -91
  44. package/dist/react/ui/index.js +2272 -0
  45. package/dist/react/ui/index.js.map +28 -0
  46. package/dist/server.js +13 -26
  47. package/dist/server.js.map +6 -7
  48. package/dist/types/client/annotations.d.ts +27 -0
  49. package/dist/types/client/data-client.d.ts +1 -2
  50. package/dist/types/client/iframe.d.ts +4 -2
  51. package/dist/types/client/index.d.ts +1 -0
  52. package/dist/types/core/annotations.d.ts +94 -0
  53. package/dist/types/core/appearance.d.ts +2 -2
  54. package/dist/types/core/config.d.ts +48 -4
  55. package/dist/types/core/contract.d.ts +21 -11
  56. package/dist/types/core/dimension.d.ts +6 -4
  57. package/dist/types/core/filters.d.ts +44 -0
  58. package/dist/types/core/messages.d.ts +2 -0
  59. package/dist/types/core/operation-types.d.ts +5 -2
  60. package/dist/types/core/operation.d.ts +3 -4
  61. package/dist/types/core/presentation.d.ts +2 -0
  62. package/dist/types/core/queries.d.ts +16 -0
  63. package/dist/types/core/uuid.d.ts +2 -0
  64. package/dist/types/core/variables.d.ts +34 -18
  65. package/dist/types/embed/runtime-html.d.ts +2 -0
  66. package/dist/types/embed/source.d.ts +2 -1
  67. package/dist/types/index.d.ts +3 -0
  68. package/dist/types/react/annotations/AnnotationBar.d.ts +30 -0
  69. package/dist/types/react/annotations/AnnotationControls.d.ts +10 -0
  70. package/dist/types/react/annotations/AnnotationEditor.d.ts +16 -0
  71. package/dist/types/react/annotations/AnnotationMarkers.d.ts +19 -0
  72. package/dist/types/react/annotations/AnnotationSelectionLayer.d.ts +12 -0
  73. package/dist/types/react/annotations/AnnotationTarget.d.ts +9 -0
  74. package/dist/types/react/annotations/AnnotationTooltip.d.ts +9 -0
  75. package/dist/types/react/annotations/AnnotationTrigger.d.ts +10 -0
  76. package/dist/types/react/annotations/annotation-editor-state.d.ts +56 -0
  77. package/dist/types/react/annotations/annotation-screenshot.d.ts +4 -0
  78. package/dist/types/react/annotations/annotation-targets.d.ts +33 -0
  79. package/dist/types/react/annotations/getAnnotationProps.d.ts +15 -0
  80. package/dist/types/react/annotations/styles.d.ts +3 -0
  81. package/dist/types/react/annotations/useAnnotationGeometry.d.ts +22 -0
  82. package/dist/types/react/annotations/useDataAppAnnotations.d.ts +22 -0
  83. package/dist/types/react/app-context.d.ts +3 -0
  84. package/dist/types/react/bindings.d.ts +110 -0
  85. package/dist/types/react/content.d.ts +24 -11
  86. package/dist/types/react/hooks.d.ts +29 -787
  87. package/dist/types/react/index.d.ts +31 -106
  88. package/dist/types/react/mount.d.ts +6 -4
  89. package/dist/types/react/source-owner.d.ts +2 -0
  90. package/dist/types/react/style-contract.d.ts +80 -0
  91. package/dist/types/react/style-validation.d.ts +2 -0
  92. package/dist/types/react/ui/AboutData.d.ts +9 -1
  93. package/dist/types/react/ui/AppHeader.d.ts +1 -2
  94. package/dist/types/react/ui/AppLayout.d.ts +3 -9
  95. package/dist/types/react/ui/AppToolbar.d.ts +5 -8
  96. package/dist/types/react/ui/AreaChart.d.ts +7 -0
  97. package/dist/types/react/ui/BarChart.d.ts +6 -0
  98. package/dist/types/react/ui/Button.d.ts +3 -3
  99. package/dist/types/react/ui/ChartLegend.d.ts +31 -0
  100. package/dist/types/react/ui/Checkbox.d.ts +15 -4
  101. package/dist/types/react/ui/CheckboxGroup.d.ts +7 -0
  102. package/dist/types/react/ui/{Combobox.d.ts → ChoicePicker.d.ts} +10 -15
  103. package/dist/types/react/ui/{ComparisonVisual.d.ts → Comparison.d.ts} +3 -3
  104. package/dist/types/react/ui/ComposedChart.d.ts +41 -0
  105. package/dist/types/react/ui/ComposedChartLegend.d.ts +8 -0
  106. package/dist/types/react/ui/ContentSkeleton.d.ts +2 -0
  107. package/dist/types/react/ui/DataApp.d.ts +17 -58
  108. package/dist/types/react/ui/DataAppFrame.d.ts +41 -0
  109. package/dist/types/react/ui/DataBoundary.d.ts +4 -5
  110. package/dist/types/react/ui/DataSection.d.ts +6 -18
  111. package/dist/types/react/ui/DataSectionBoundary.d.ts +30 -0
  112. package/dist/types/react/ui/DataValue.d.ts +9 -0
  113. package/dist/types/react/ui/DataWidget.d.ts +2 -1
  114. package/dist/types/react/ui/DateTimeTooltip.d.ts +1 -1
  115. package/dist/types/react/ui/DimensionPicker.d.ts +1 -1
  116. package/dist/types/react/ui/ExportControl.d.ts +1 -1
  117. package/dist/types/react/ui/FilterActions.d.ts +10 -0
  118. package/dist/types/react/ui/FilterBar.d.ts +3 -0
  119. package/dist/types/react/ui/GettingStarted.d.ts +2 -4
  120. package/dist/types/react/ui/HelpPopover.d.ts +3 -4
  121. package/dist/types/react/ui/InspectionContext.d.ts +2 -0
  122. package/dist/types/react/ui/InspectionProvider.d.ts +29 -0
  123. package/dist/types/react/ui/LineChart.d.ts +7 -0
  124. package/dist/types/react/ui/Menu.d.ts +12 -0
  125. package/dist/types/react/ui/MetricWidget.d.ts +4 -3
  126. package/dist/types/react/ui/NumberField.d.ts +27 -0
  127. package/dist/types/react/ui/NumberFilterPicker.d.ts +9 -0
  128. package/dist/types/react/ui/PieChart.d.ts +11 -0
  129. package/dist/types/react/ui/PresentStory.d.ts +2 -5
  130. package/dist/types/react/ui/RadioGroup.d.ts +18 -0
  131. package/dist/types/react/ui/RefreshControl.d.ts +1 -2
  132. package/dist/types/react/ui/ScatterChart.d.ts +17 -0
  133. package/dist/types/react/ui/SearchField.d.ts +1 -2
  134. package/dist/types/react/ui/SearchInput.d.ts +3 -1
  135. package/dist/types/react/ui/Select.d.ts +14 -0
  136. package/dist/types/react/ui/SelectionMark.d.ts +2 -1
  137. package/dist/types/react/ui/Sheet.d.ts +2 -1
  138. package/dist/types/react/ui/Skeleton.d.ts +5 -2
  139. package/dist/types/react/ui/StaticDataApp.d.ts +4 -0
  140. package/dist/types/react/ui/TableWidget.d.ts +19 -16
  141. package/dist/types/react/ui/Tabs.d.ts +6 -2
  142. package/dist/types/react/ui/TextWidget.d.ts +2 -1
  143. package/dist/types/react/ui/Tooltip.d.ts +4 -3
  144. package/dist/types/react/ui/TooltipSurface.d.ts +3 -0
  145. package/dist/types/react/ui/TrendChart.d.ts +5 -0
  146. package/dist/types/react/ui/UpdatedAt.d.ts +1 -1
  147. package/dist/types/react/ui/VisualizationWidget.d.ts +12 -13
  148. package/dist/types/react/ui/WidgetViewTabs.d.ts +1 -1
  149. package/dist/types/react/ui/chart-data.d.ts +25 -0
  150. package/dist/types/react/ui/chart-primitives.d.ts +20 -0
  151. package/dist/types/react/ui/data-context.d.ts +18 -7
  152. package/dist/types/react/ui/icons.d.ts +2 -0
  153. package/dist/types/react/ui/index.d.ts +98 -0
  154. package/dist/types/react/ui/keyboard.d.ts +6 -0
  155. package/dist/types/react/ui/metric.d.ts +1 -1
  156. package/dist/types/react/ui/presentation.d.ts +5 -1
  157. package/dist/types/react/ui/shortcuts.d.ts +14 -1
  158. package/dist/types/react/ui/useAppAppearance.d.ts +1 -1
  159. package/dist/types/react/ui/variables.d.ts +4 -2
  160. package/dist/types/react/view-controls.d.ts +3 -1
  161. package/dist/types/react/view-runtime.d.ts +29 -0
  162. package/dist/types/react/view.d.ts +21 -4
  163. package/dist/types/react/widgets.d.ts +79 -0
  164. package/dist/types/server/handler.d.ts +4 -4
  165. package/dist/worker.js +20 -737
  166. package/docs/app-authoring.md +72 -50
  167. package/docs/client.md +8 -8
  168. package/docs/contract.md +42 -20
  169. package/docs/data-context.md +91 -0
  170. package/docs/embed.md +10 -2
  171. package/docs/formatting-and-appearance.md +68 -0
  172. package/docs/hosted-apps.md +9 -15
  173. package/docs/layout.md +5 -3
  174. package/docs/react-embed.md +5 -4
  175. package/docs/react.md +22 -317
  176. package/docs/server-bun.md +1 -1
  177. package/docs/server.md +4 -4
  178. package/docs/stories-and-export.md +52 -0
  179. package/docs/styling.md +62 -0
  180. package/docs/ui-quality.md +20 -0
  181. package/docs/ui.md +196 -0
  182. package/docs/variables.md +171 -0
  183. package/docs/views.md +123 -0
  184. package/docs/widgets.md +145 -0
  185. package/examples/starter-data-app/index.tsx +115 -86
  186. package/package.json +25 -12
  187. package/dist/chunks/contract-a061yj6r.js.map +0 -12
  188. package/dist/chunks/contract-g6hky7x6.js +0 -282
  189. package/dist/chunks/contract-g6hky7x6.js.map +0 -12
  190. package/dist/chunks/contract-sm7j7k95.js.map +0 -14
  191. package/dist/chunks/contract-tf8c3qpv.js.map +0 -11
  192. package/dist/chunks/contract-txjy0en2.js.map +0 -10
  193. package/dist/chunks/contract-wz59z8pq.js +0 -8
  194. package/dist/chunks/contract-wz59z8pq.js.map +0 -10
  195. package/dist/chunks/contract-yxbjea23.js +0 -328
  196. package/dist/chunks/contract-yxbjea23.js.map +0 -12
  197. package/dist/types/react/ui/RefreshRegion.d.ts +0 -9
  198. package/dist/types/react/ui/SelectableBarChart.d.ts +0 -15
  199. package/docs/releasing.md +0 -79
  200. /package/dist/chunks/{contract-mev09s5v.js → index-mev09s5v.js} +0 -0
  201. /package/dist/chunks/{contract-mev09s5v.js.map → index-mev09s5v.js.map} +0 -0
  202. /package/dist/types/react/ui/{comparison.d.ts → metric-comparison.d.ts} +0 -0
@@ -14,34 +14,37 @@ export type TableWidgetColumn<Row> = {
14
14
  cell: (row: Row, hit?: SearchHit<Row>) => ReactNode;
15
15
  };
16
16
  export type TableWidgetSearch<Row> = Omit<DataTableSearch, 'itemCount'> & Pick<SearchItemsOptions<Row>, 'attributes' | 'mode' | 'fuzzyThreshold'>;
17
+ export type TableDisplayMode = {
18
+ /** Positive integer preview cap after search; disables pagination. */
19
+ limit: number;
20
+ pagination?: never;
21
+ } | {
22
+ /** Local pagination after search: 10 rows by default, false shows all supplied rows.
23
+ * pageSize must be a positive integer. Counts refer only to supplied rows.
24
+ * The widget owns bottom-footer controls and shares the current page with inspection. */
25
+ pagination?: {
26
+ pageSize: number;
27
+ } | false;
28
+ limit?: never;
29
+ };
17
30
  type TableWidgetBaseProps<Row> = {
18
31
  title: ReactNode;
32
+ annotationId?: string;
19
33
  count?: number;
20
34
  description?: ReactNode;
21
35
  columns: readonly [TableWidgetColumn<Row>, ...TableWidgetColumn<Row>[]];
22
36
  /** Unique, nonempty row identity. Numeric keys must be finite; 1 and "1" collide. */
23
37
  rowKey: (row: Row) => string | number;
24
- insight?: ReactNode;
25
38
  status?: WidgetStatus;
26
39
  action?: ReactNode;
27
40
  evidence?: WidgetEvidence;
28
41
  search?: TableWidgetSearch<Row>;
29
42
  /** Valid result with no rows; the header remains visible. */
30
- empty: EmptyContent;
31
- } & ({
32
- /** Positive integer preview cap after search; disables pagination. */
33
- limit: number;
34
- pagination?: never;
35
- } | {
36
- /** Local pagination after search: 10 rows by default, false shows all supplied rows.
37
- * pageSize must be a positive integer. Counts refer only to supplied rows.
38
- * The widget owns bottom-footer controls and shares the current page with inspection. */
39
- pagination?: {
40
- pageSize: number;
41
- } | false;
42
- limit?: never;
43
- }) & Omit<ComponentPropsWithRef<'section'>, 'about' | 'title' | 'children'>;
44
- /** Column definitions own both header and body semantics; the first column is the row header. */
43
+ emptyFallback: EmptyContent;
44
+ } & TableDisplayMode & Omit<ComponentPropsWithRef<'section'>, 'about' | 'title' | 'children'>;
45
+ /** Composes VisualizationWidget with DataTable, search, and local pagination.
46
+ * Columns own header and body semantics; the first column is the row header.
47
+ * Use DataTable inside VisualizationWidget directly for custom table markup. */
45
48
  export type TableWidgetProps<Row> = TableWidgetBaseProps<Row> & ({
46
49
  rows: readonly Row[];
47
50
  reading?: never;
@@ -1,5 +1,9 @@
1
- import { Tabs, TabList, Tab, TabPanels, TabPanel } from 'react-aria-components/Tabs';
1
+ import { type ComponentPropsWithRef } from 'react';
2
+ import { Tabs as AriaTabs, TabList, Tab as AriaTab, TabPanels, TabPanel as AriaTabPanel } from 'react-aria-components/Tabs';
2
3
  /** React Aria tabs with keyboard and ARIA behavior; pair each Tab and TabPanel by stable id. */
3
- export { Tabs, TabList, Tab, TabPanels, TabPanel };
4
+ export { TabList, TabPanels };
5
+ export declare function Tab(props: ComponentPropsWithRef<typeof AriaTab>): import("react").JSX.Element;
6
+ export declare function TabPanel(props: ComponentPropsWithRef<typeof AriaTabPanel>): import("react").JSX.Element;
7
+ export declare function Tabs({ className, ...props }: ComponentPropsWithRef<typeof AriaTabs>): import("react").JSX.Element;
4
8
  /** Keep a page-level tab in `?view=`; reserve `?tab=` for the inspect sheet. */
5
9
  export declare function useViewTab<View extends string>(views: readonly View[], fallback: View): [View, (key: string | number) => void];
@@ -5,7 +5,8 @@ import type { WidgetEvidence } from './WidgetEvidence.js';
5
5
  type TextWidgetBaseProps = Omit<Extract<DataWidgetProps, {
6
6
  reading?: never;
7
7
  }>, 'reading' | 'children' | 'isEmpty' | 'empty' | 'skeleton' | 'bodyPadding'>;
8
- /** Framed narrative context. Bind claims and scope to the same displayed reading.
8
+ /** Narrative sibling of VisualizationWidget, composing DataWidget with TextContent.
9
+ * Use TextContent directly for borderless prose. Bind claims and scope to the same displayed reading.
9
10
  * The renderer handles every ready value, including zero and empty collections. */
10
11
  export type TextWidgetProps<Data = unknown> = TextWidgetBaseProps & ({
11
12
  reading: DataReading<Data>;
@@ -11,12 +11,13 @@ export type TooltipProps = {
11
11
  content: ReactNode;
12
12
  children: ReactNode;
13
13
  variant?: 'hint' | 'chart';
14
+ onOpenChange?: (open: boolean) => void;
14
15
  align?: 'start' | 'center' | 'end';
15
16
  placement?: 'top' | 'bottom';
16
17
  portalRoot?: RefObject<HTMLElement | null>;
17
- tooltipProps?: Omit<ComponentPropsWithRef<'span'>, 'children' | 'role'>;
18
18
  } & Omit<ComponentPropsWithRef<'span'>, 'children' | 'content'>;
19
19
  /** Short visual hint for an already labeled control. variant="chart" follows the cursor
20
- * on hover and toggles on tap so a bar or point can show the period and value. Hint
20
+ * on hover and toggles on tap so a bar or point can show the period and value. Chart
21
+ * tooltips dismiss on scroll and do not open on keyboard focus. Hint
21
22
  * tooltips hide once the control is pressed. Escape closes either. */
22
- export declare function Tooltip({ content, children, variant, align, placement, portalRoot, tooltipProps, className, ref, onPointerEnter, onPointerMove, onPointerLeave, onPointerDown, onFocusCapture, onBlurCapture, ...props }: TooltipProps): import("react").JSX.Element;
23
+ export declare function Tooltip({ content, children, onOpenChange, variant, align, placement, portalRoot, className, ref, onPointerEnter, onPointerMove, onPointerLeave, onPointerDown, onFocusCapture, onBlurCapture, ...props }: TooltipProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { ComponentPropsWithRef } from 'react';
2
+ /** Shared surface for floating hints and chart value inspection. */
3
+ export declare function TooltipSurface({ className, ...props }: ComponentPropsWithRef<'span'>): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { ValueChartProps } from './chart-data.js';
2
+ /** Ordered, equally spaced samples; negative values share an explicit zero baseline. */
3
+ export declare function TrendChart({ items, unit, ariaLabel, formatValue, area, }: ValueChartProps & {
4
+ area?: boolean;
5
+ }): import("react").JSX.Element;
@@ -6,4 +6,4 @@ export type UpdatedAtProps = {
6
6
  label?: string;
7
7
  children?: ReactNode;
8
8
  } & Omit<DateTimeTooltipProps, 'date' | 'children'>;
9
- export declare function UpdatedAt({ timestamp, locale, label, children, triggerClassName, ...props }: UpdatedAtProps): import("react").JSX.Element;
9
+ export declare function UpdatedAt({ timestamp, locale, label, children, triggerProps, ...props }: UpdatedAtProps): import("react").JSX.Element;
@@ -1,22 +1,18 @@
1
1
  import { type ComponentPropsWithRef, type ReactNode } from 'react';
2
- import type { WidgetEvidence } from './WidgetEvidence.js';
3
- import type { WidgetStatus } from './RequestHint.js';
4
- import type { EmptyContent, BoundWidgetReading } from './presentation.js';
5
- type VisualizationWidgetBaseProps = {
6
- title: ReactNode;
7
- description?: ReactNode;
8
- insight?: ReactNode;
9
- action?: ReactNode;
10
- evidence?: WidgetEvidence;
11
- status?: WidgetStatus;
12
- empty?: EmptyContent;
2
+ import { type DataWidgetProps } from './DataWidget.js';
3
+ import type { BoundWidgetReading } from './presentation.js';
4
+ type VisualizationWidgetBaseProps = Pick<DataWidgetProps, 'title' | 'annotationId' | 'description' | 'count' | 'action' | 'evidence' | 'status' | 'emptyFallback'> & {
5
+ /** Footer controls, such as table pagination. */
6
+ footer?: ReactNode;
13
7
  } & Omit<ComponentPropsWithRef<'section'>, 'about' | 'title' | 'children'>;
14
8
  type UnboundVisualizationWidgetProps = VisualizationWidgetBaseProps & ({
15
9
  loading: true;
10
+ loadingContent?: ReactNode;
16
11
  visual?: never;
17
12
  } | {
18
13
  loading?: false;
19
14
  visual: ReactNode;
15
+ loadingContent?: never;
20
16
  });
21
17
  export type VisualizationWidgetView<Data> = {
22
18
  /** Stable, nonempty identity; unique within this widget. */
@@ -28,8 +24,10 @@ type BoundVisualizationWidgetBase<Data> = VisualizationWidgetBaseProps & BoundWi
28
24
  visual?: never;
29
25
  loading?: never;
30
26
  };
31
- /** The widget owns alternate-view selection and shares it with inspection.
32
- * Custom chart interactions remain controlled by the caller, above both mounts. */
27
+ /** DataWidget frame for charts, DataTable, metrics, or a custom data display.
28
+ * Owns alternate-view selection and shares it with inspection. Built-in charts own
29
+ * transient tooltips; lift persistent custom interactions above both mounts.
30
+ * For narrative prose use the sibling TextWidget, which composes DataWidget directly. */
33
31
  export type VisualizationWidgetProps<Data = unknown> = UnboundVisualizationWidgetProps | (BoundVisualizationWidgetBase<Data> & {
34
32
  children: (data: Data) => ReactNode;
35
33
  views?: never;
@@ -40,5 +38,6 @@ export type VisualizationWidgetProps<Data = unknown> = UnboundVisualizationWidge
40
38
  initialView?: string;
41
39
  children?: never;
42
40
  });
41
+ /** Compose an unframed visual with the shared heading and inspection. */
43
42
  export declare function VisualizationWidget<Data>(props: VisualizationWidgetProps<Data>): import("react").JSX.Element;
44
43
  export {};
@@ -4,7 +4,7 @@ export type WidgetView = {
4
4
  id: string;
5
5
  label: ReactNode;
6
6
  content: ReactNode;
7
- empty: EmptyContent;
7
+ emptyFallback: EmptyContent;
8
8
  isEmpty: boolean;
9
9
  };
10
10
  export type WidgetViewTabsProps<Views extends readonly WidgetView[] = readonly WidgetView[]> = {
@@ -0,0 +1,25 @@
1
+ /** Ordered category or time-series sample. IDs are unique and nonblank; values are finite. */
2
+ export type ChartItem = {
3
+ id: string;
4
+ label: string;
5
+ value: number;
6
+ };
7
+ export type ValueChartProps = {
8
+ /** Ordered samples; the chart validates IDs and values when rendering. */
9
+ items: readonly ChartItem[];
10
+ unit: string;
11
+ ariaLabel: string;
12
+ formatValue?: (value: number) => string;
13
+ };
14
+ /** Independent observation on two finite numeric axes. */
15
+ export type ScatterChartItem = {
16
+ id: string;
17
+ label: string;
18
+ x: number;
19
+ y: number;
20
+ };
21
+ type ChartKind = 'bar' | 'line' | 'area' | 'pie' | 'scatter';
22
+ type ItemFor<Kind extends ChartKind> = Kind extends 'scatter' ? ScatterChartItem : ChartItem;
23
+ /** Validate standalone item-based chart inputs. */
24
+ export declare function validateChartItems<Kind extends ChartKind>(kind: Kind, items: readonly ItemFor<Kind>[]): void;
25
+ export {};
@@ -0,0 +1,20 @@
1
+ import type { ComponentProps } from 'react';
2
+ import { type DotProps, Scatter, XAxis, YAxis, CartesianGrid, Tooltip, type BarProps, type LineProps, type AreaProps } from 'recharts';
3
+ export declare const chartBarFill = "var(--atbl-chart-fill, color-mix(in srgb, var(--atbl-accent) 75%, var(--atbl-surface)))";
4
+ /** Hollow sample marker shared by standalone and composed series. */
5
+ export declare function ChartDot({ active, stroke, fill, r, ...props }: DotProps & {
6
+ active?: boolean;
7
+ }): import("react").JSX.Element;
8
+ /** Shared series defaults; native props override every authored choice. */
9
+ export declare function ChartBar<Row = unknown, Value = number | null>(props: BarProps<Row, Value>): import("react").JSX.Element;
10
+ /** Themed hollow sample dots are enabled by default; dot=false hides them.
11
+ * activeDot independently controls the hovered point. Native dot props and renderers remain available. */
12
+ export declare function ChartLine<Row = unknown, Value = number | null>({ stroke, dot, activeDot, ...props }: LineProps<Row, Value>): import("react").JSX.Element;
13
+ /** Filled series with the same sample-dot and activeDot options as ChartLine. */
14
+ export declare function ChartArea<Row = unknown, Value = number | null>({ stroke, dot, activeDot, ...props }: AreaProps<Row, Value>): import("react").JSX.Element;
15
+ export declare function ChartScatter<Row = unknown, Value = number>(props: ComponentProps<typeof Scatter<Row, Value>>): import("react").JSX.Element;
16
+ export declare function ChartXAxis<Row = unknown, Value = string | number>(props: ComponentProps<typeof XAxis<Row, Value>>): import("react").JSX.Element;
17
+ export declare function ChartYAxis<Row = unknown, Value = number>(props: ComponentProps<typeof YAxis<Row, Value>>): import("react").JSX.Element;
18
+ export declare function ChartGrid(props: ComponentProps<typeof CartesianGrid>): import("react").JSX.Element;
19
+ /** Uses the same surface as single-series inspection; Recharts owns interaction. */
20
+ export declare function ChartTooltip(props: ComponentProps<typeof Tooltip>): import("react").JSX.Element;
@@ -15,15 +15,26 @@ export type DataContext = {
15
15
  identifiers?: Readonly<Record<string, DataIdentifierDefinition>>;
16
16
  queryNames?: Readonly<Record<string, string>>;
17
17
  };
18
- export declare function defineDataContext<const Context extends DataContext>(context: Context): Context;
19
- export declare function evidenceFor<const Context extends DataContext, const Names extends Record<string, string> = Record<string, string>>(context: Context, names?: Names): (evidence: {
18
+ export type MetricDeclaration = {
20
19
  id: string;
21
- glossaryIds?: readonly (keyof Context['glossary'] & string)[];
22
- queryNames?: readonly Names[keyof Names][];
23
- }) => {
20
+ glossaryId: string;
21
+ label?: string;
22
+ format: MetricFormat;
23
+ favorableDirection?: 'up' | 'down';
24
+ queryNames?: readonly string[];
25
+ };
26
+ export type EvidenceDeclaration = {
24
27
  id: string;
25
- glossaryIds: (keyof Context["glossary"] & string)[] | undefined;
26
- queryNames: Names[keyof Names][] | undefined;
28
+ } & ({
29
+ glossaryIds: readonly [string, ...string[]];
30
+ queryNames?: readonly string[];
31
+ } | {
32
+ queryNames: readonly [string, ...string[]];
33
+ glossaryIds?: readonly string[];
34
+ });
35
+ export type AuthoringDataContext = DataContext & {
36
+ metric(definition: MetricDeclaration): MetricDefinition;
37
+ evidence(definition: EvidenceDeclaration): WidgetEvidence;
27
38
  };
28
39
  /** Bind glossary query references and card evidence to the same registry. */
29
40
  export declare function createDataContext<const Names extends Record<string, string>>(queryNames: Names): <const Context extends Omit<DataContext, 'glossary'> & {
@@ -1,6 +1,7 @@
1
1
  import { type LucideProps } from 'lucide-react';
2
2
  /** Use semantic names to keep icon meaning and optical size consistent across controls. */
3
3
  declare const brandedIcons: {
4
+ readonly annotate: import("lucide-react").LucideIcon;
4
5
  readonly cancel: import("lucide-react").LucideIcon;
5
6
  readonly calendar: import("lucide-react").LucideIcon;
6
7
  readonly clock: import("lucide-react").LucideIcon;
@@ -17,6 +18,7 @@ declare const brandedIcons: {
17
18
  readonly export: import("lucide-react").LucideIcon;
18
19
  readonly error: import("lucide-react").LucideIcon;
19
20
  readonly close: import("lucide-react").LucideIcon;
21
+ readonly clearFilters: import("lucide-react").LucideIcon;
20
22
  readonly previous: import("lucide-react").LucideIcon;
21
23
  readonly next: import("lucide-react").LucideIcon;
22
24
  readonly lightTheme: import("lucide-react").LucideIcon;
@@ -0,0 +1,98 @@
1
+ /** Direct UI composition and static screens. Requests use declared views from /react. */
2
+ export { injectDataAppShellStyles } from '../shellStyles.js';
3
+ export { DataAppProvider } from '../mount.js';
4
+ export { isPlainKeyEvent } from './keyboard.js';
5
+ export { GettingStarted } from './GettingStarted.js';
6
+ export { DataWidget } from './DataWidget.js';
7
+ export type { WidgetStatus } from './RequestHint.js';
8
+ export type { DataWidgetProps } from './DataWidget.js';
9
+ export { TextWidget } from './TextWidget.js';
10
+ export type { TextWidgetProps } from './TextWidget.js';
11
+ export { VisualizationWidget } from './VisualizationWidget.js';
12
+ export type { VisualizationWidgetProps } from './VisualizationWidget.js';
13
+ export { TableWidget } from './TableWidget.js';
14
+ export type { TableWidgetProps } from './TableWidget.js';
15
+ export { DataTable, DataTableEmptyRow, DataTableTimestamp, DataTableShare, } from './DataTable.js';
16
+ export type { DataTableProps, DataTableSearch, DataTableEmptyRowProps, DataTableTimestampProps, } from './DataTable.js';
17
+ export { MetricWidget } from './MetricWidget.js';
18
+ export type { MetricWidgetProps } from './MetricWidget.js';
19
+ export { DimensionPicker } from './DimensionPicker.js';
20
+ export { DataAppSkeleton } from './DataAppSkeleton.js';
21
+ export type { DataAppSkeletonProps } from './DataAppSkeleton.js';
22
+ export { LiveControl } from './LiveControl.js';
23
+ export type { LiveControlProps, LiveIntervalSeconds, } from './LiveControl.js';
24
+ export { DateRangePicker } from './DateRangePicker.js';
25
+ export type { DatePresetId, DateRange, DateRangePickerProps, } from './DateRangePicker.js';
26
+ export { useAppVariables } from './variables.js';
27
+ export { SearchField } from './SearchField.js';
28
+ export type { SearchFieldProps } from './SearchField.js';
29
+ export { searchItems } from './searchItems.js';
30
+ export type { SearchAttribute, SearchHit, SearchItemsOptions, SearchMatchValue, SearchRange, } from './searchItems.js';
31
+ export { SearchMatch } from './SearchMatch.js';
32
+ export type { SearchMatchProps } from './SearchMatch.js';
33
+ export { ChoicePicker } from './ChoicePicker.js';
34
+ export type { ChoiceOption, ChoicePickerProps, } from './ChoicePicker.js';
35
+ export { MenuTrigger, MenuButton, MenuPopover, Menu, MenuItem, MenuSection, MenuSeparator, } from './Menu.js';
36
+ export type { MenuTriggerProps, MenuPopoverProps, MenuProps, MenuItemProps, } from './Menu.js';
37
+ export { GradientScroll } from './GradientScroll.js';
38
+ export type { GradientScrollProps } from './GradientScroll.js';
39
+ export { Tabs, TabList, Tab, TabPanels, TabPanel, useViewTab, } from './Tabs.js';
40
+ export { GlossaryExplanation } from './GlossaryExplanation.js';
41
+ export type { GlossaryExplanationProps } from './GlossaryExplanation.js';
42
+ export { GlossaryDefinition } from './GlossaryDefinition.js';
43
+ export type { GlossaryDefinitionProps } from './GlossaryDefinition.js';
44
+ export { AboutData } from './AboutData.js';
45
+ export type { AboutDataProps, AboutEmpty, AboutSubject, AboutTab, } from './AboutData.js';
46
+ export { PresentStory } from './PresentStory.js';
47
+ export type { PresentStoryProps } from './PresentStory.js';
48
+ export type { StoryFinding, BoundStory } from './story.js';
49
+ export { Checkbox } from './Checkbox.js';
50
+ export type { CheckboxProps } from './Checkbox.js';
51
+ export { AppIcon } from './icons.js';
52
+ export type { AppIconName, AppIconProps } from './icons.js';
53
+ export { Sheet } from './Sheet.js';
54
+ export type { SheetProps } from './Sheet.js';
55
+ export { HelpPopover } from './HelpPopover.js';
56
+ export type { HelpPopoverProps } from './HelpPopover.js';
57
+ export { DataApp } from './StaticDataApp.js';
58
+ export type { DataAppProps } from './StaticDataApp.js';
59
+ export { injectDataAppStyles } from '../styles.js';
60
+ export { Tooltip, TooltipProvider } from './Tooltip.js';
61
+ export type { TooltipProps, TooltipProviderProps, } from './Tooltip.js';
62
+ export { LineChart } from './LineChart.js';
63
+ export type { LineChartProps, LineChartItem } from './LineChart.js';
64
+ export { AreaChart } from './AreaChart.js';
65
+ export type { AreaChartProps, AreaChartItem } from './AreaChart.js';
66
+ export { PieChart } from './PieChart.js';
67
+ export type { PieChartProps, PieChartItem } from './PieChart.js';
68
+ export { ScatterChart } from './ScatterChart.js';
69
+ export type { ScatterChartProps, ScatterChartItem, } from './ScatterChart.js';
70
+ export { BarChart } from './BarChart.js';
71
+ export type { BarChartProps, BarChartItem } from './BarChart.js';
72
+ export { DataValue } from './DataValue.js';
73
+ export type { DataValueProps } from './DataValue.js';
74
+ export type { CsvExport, CsvTable } from './csv-export.js';
75
+ export type { TableWidgetColumn } from './TableWidget.js';
76
+ export type { DataReading, MetricReading } from '../../core/reading.js';
77
+ export type { DataAppStyle, DataAppStyleToken, DataAppStyleHooks, } from '../style-contract.js';
78
+ export { Select } from './Select.js';
79
+ export type { SelectProps } from './Select.js';
80
+ export { RadioGroup, Radio, SegmentedControl } from './RadioGroup.js';
81
+ export type { RadioGroupProps, RadioProps, SegmentedControlProps, } from './RadioGroup.js';
82
+ export { CheckboxGroup } from './CheckboxGroup.js';
83
+ export type { CheckboxGroupProps } from './CheckboxGroup.js';
84
+ export { NumberField, NumberRangeField } from './NumberField.js';
85
+ export type { NumberFieldProps, NumberRangeFieldProps, NumberRange, } from './NumberField.js';
86
+ export { FilterBar } from './FilterBar.js';
87
+ export type { FilterBarProps } from './FilterBar.js';
88
+ export { VariableBar } from './VariableBar.js';
89
+ export type { VariableBarProps } from './VariableBar.js';
90
+ export { FilterActions } from './FilterActions.js';
91
+ export type { FilterActionsProps } from './FilterActions.js';
92
+ export { NumberFilterPicker } from './NumberFilterPicker.js';
93
+ export type { NumberFilterPickerProps } from './NumberFilterPicker.js';
94
+ export { ComposedChart } from './ComposedChart.js';
95
+ export type { ComposedChartProps } from './ComposedChart.js';
96
+ export { ChartLegend } from './ChartLegend.js';
97
+ export type { ChartLegendProps, ChartLegendItemProps, ChartLegendMarkerProps, ChartLegendLabelProps, ChartLegendMarkerKind, } from './ChartLegend.js';
98
+ export type { ComposedChartLegendProps } from './ComposedChartLegend.js';
@@ -0,0 +1,6 @@
1
+ type KeyEvent = Pick<KeyboardEvent, 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey' | 'isComposing'>;
2
+ /** Keep local key actions separate from shortcuts and IME composition. Pass React's nativeEvent. */
3
+ export declare function isPlainKeyEvent(event: KeyEvent, { allowShift }?: {
4
+ allowShift?: boolean;
5
+ }): boolean;
6
+ export {};
@@ -8,4 +8,4 @@ export type MetricDefinition = {
8
8
  favorableDirection?: 'up' | 'down';
9
9
  evidence: WidgetEvidence;
10
10
  };
11
- export declare function metricComparison(metric: MetricDefinition, reading: MetricReading): import("./comparison.js").MetricComparison | undefined;
11
+ export declare function metricComparison(metric: MetricDefinition, reading: MetricReading): import("./metric-comparison.js").MetricComparison | undefined;
@@ -7,13 +7,17 @@ export type EmptyContent = {
7
7
  };
8
8
  export type SkeletonContent = {
9
9
  variant: 'metric' | 'panel' | 'ranking';
10
+ /**
11
+ * Placeholder rows, clamped to 0–100.
12
+ * @default 4
13
+ */
10
14
  rows?: number;
11
15
  };
12
16
  /** A bound widget must explain empty results and link the reading to its evidence. */
13
17
  export type BoundWidgetReading<Data> = {
14
18
  reading: DataReading<Data>;
15
19
  isEmpty: (data: Data) => boolean;
16
- empty: EmptyContent;
20
+ emptyFallback: EmptyContent;
17
21
  evidence: WidgetEvidence;
18
22
  skeleton?: SkeletonContent;
19
23
  };
@@ -9,6 +9,17 @@ export type Shortcut = {
9
9
  key: string;
10
10
  };
11
11
  export declare const shortcuts: {
12
+ readonly annotate: {
13
+ readonly modifier: 'mod';
14
+ readonly shift: true;
15
+ readonly code: 'Period';
16
+ readonly key: '.';
17
+ };
18
+ readonly sendAnnotations: {
19
+ readonly modifier: 'mod';
20
+ readonly code: 'Enter';
21
+ readonly key: 'Enter';
22
+ };
12
23
  readonly refresh: {
13
24
  readonly modifier: 'alt';
14
25
  readonly code: 'KeyR';
@@ -21,6 +32,7 @@ export declare const shortcuts: {
21
32
  };
22
33
  readonly playStory: {
23
34
  readonly modifier: 'mod';
35
+ readonly shift: true;
24
36
  readonly code: 'Enter';
25
37
  readonly key: 'Enter';
26
38
  };
@@ -28,5 +40,6 @@ export declare const shortcuts: {
28
40
  export declare function shortcutLabel({ modifier, shift, key }: Shortcut): string;
29
41
  export declare function ariaKeyShortcuts({ modifier, shift, key }: Shortcut): string;
30
42
  export declare function isEditingTarget(target: EventTarget | null): boolean;
43
+ export declare function matchesShortcut(event: KeyboardEvent, shortcut: Shortcut): boolean;
31
44
  /** Bind a page-level shortcut. Ignored while typing or while a modal layer is open. */
32
- export declare function useShortcut(shortcut: Shortcut, action: () => void, enabled?: boolean): void;
45
+ export declare function useShortcut(shortcut: Shortcut, action: () => void, enabled?: boolean, allowWhileEditing?: boolean): void;
@@ -1,3 +1,3 @@
1
1
  import { type Theme, type AppearanceOptions } from '../../core/appearance.js';
2
2
  /** The parent theme takes precedence; only standalone viewers receive controls. */
3
- export declare function useAppAppearance(appearance: AppearanceOptions, hostTheme?: Theme): import("../../core/appearance.js").ThemeController | undefined;
3
+ export declare function useAppAppearance(appearance: AppearanceOptions | undefined, hostTheme?: Theme): import("../../core/appearance.js").ThemeController | undefined;
@@ -1,7 +1,7 @@
1
1
  import type { DatePresetId, DateRange } from '../../core/date-range.js';
2
2
  import { type AppVariableValues, type DateRangeSelection, type DateRangeVariable, type HistoryMode, type VariableCollection } from '../../core/variables.js';
3
- export { defineAppVariables, textVariable, selectVariable, dateRangeVariable, } from '../../core/variables.js';
4
- export type { AppVariable, AppVariableValues, DateRangeSelection, DateRangeVariable, DateRangeVariableOptions, VariableCollection, } from '../../core/variables.js';
3
+ export { defineAppVariables, searchVariable, choiceVariable, multiChoiceVariable, dateRangeVariable, } from '../../core/variables.js';
4
+ export type { AppVariable, AppVariableValues, ChoiceOption, ChoiceVariable, MultiChoiceVariable, SearchVariable, DateRangeSelection, DateRangeVariable, DateRangeVariableOptions, VariableCollection, } from '../../core/variables.js';
5
5
  /** Adapt one date variable to the controlled picker without giving the picker URL ownership. */
6
6
  export declare function dateRangeControl(variable: DateRangeVariable, selection: DateRangeSelection, onChange: (selection: DateRangeSelection) => void): {
7
7
  minDate?: string;
@@ -27,6 +27,8 @@ export declare function useAppVariables<const Variables extends VariableCollecti
27
27
  values: AppVariableValues<Variables>;
28
28
  set: <Key extends keyof Variables & string>(name: Key, value: AppVariableValues<Variables>[Key]) => void;
29
29
  reset: <Key extends keyof Variables & string>(name: Key) => void;
30
+ resetAll: () => void;
31
+ clearAll: () => void;
30
32
  update: (next: Partial<AppVariableValues<Variables>>, history?: HistoryMode) => void;
31
33
  bind: <Key extends keyof Variables & string>(name: Key) => {
32
34
  value: AppVariableValues<Variables>[Key];
@@ -6,7 +6,9 @@ export declare function useViewVariables<Variables extends VariableCollection>(d
6
6
  values: AppVariableValues<Variables>;
7
7
  set: <Key extends keyof Variables & string>(name: Key, value: AppVariableValues<Variables>[Key]) => void;
8
8
  reset: <Key extends keyof Variables & string>(name: Key) => void;
9
- update: (next: Partial<AppVariableValues<Variables>>, history?: import("../core/navigation.js").HistoryMode) => void;
9
+ resetAll: () => void;
10
+ clearAll: () => void;
11
+ update: (next: Partial<AppVariableValues<Variables>>, history?: import("../core/variables.js").HistoryMode) => void;
10
12
  bind: <Key extends keyof Variables & string>(name: Key) => {
11
13
  value: AppVariableValues<Variables>[Key];
12
14
  onChange(value: AppVariableValues<Variables>[Key]): void;
@@ -0,0 +1,29 @@
1
+ import type { DataContext } from './ui/data-context.js';
2
+ import type { ReactNode } from 'react';
3
+ import type { DataView, DisplayedSnapshot } from '../core/data-view.js';
4
+ import type { DisclosedQuery } from '../core/contract.js';
5
+ import type { EmptyContent } from './ui/presentation.js';
6
+ export type ViewResult<Data, Input> = {
7
+ dataContext: DataContext;
8
+ view: DataView<Data, Input>;
9
+ snapshot?: DisplayedSnapshot<Data, Input>;
10
+ refetch: () => unknown;
11
+ cancel: () => unknown;
12
+ refreshing: boolean;
13
+ queries?: DisclosedQuery[];
14
+ controls?: ReactNode;
15
+ emptyFallback: EmptyContent;
16
+ };
17
+ /** The executor is private; declarations expose data composition, not subscription hooks. */
18
+ export declare class DeclaredView<Data, Input, Definition = unknown> {
19
+ #private;
20
+ constructor(useResult: () => ViewResult<Data, Input>, definition?: Definition);
21
+ static definition<Data, Input, Definition>(view: DeclaredView<Data, Input, Definition>): Definition;
22
+ static useResult<Data, Input>(view: DeclaredView<Data, Input>): ViewResult<Data, Input>;
23
+ }
24
+ export declare function useDeclaredResult<Data, Input>(view: DeclaredView<Data, Input>): ViewResult<Data, Input>;
25
+ export declare const PrimaryViewContext: import("react").Context<{
26
+ declaration: object;
27
+ result: ViewResult<unknown, unknown>;
28
+ } | null>;
29
+ export declare function getViewDefinition<Data, Input, Definition>(view: DeclaredView<Data, Input, Definition>): Definition;
@@ -1,3 +1,4 @@
1
+ import type { DataContext } from './ui/data-context.js';
1
2
  import type { EmptyContent } from './ui/presentation.js';
2
3
  import type { AppVariableValues, DateRangeVariable, VariableCollection } from '../core/variables.js';
3
4
  import type { DateRangeRequest } from '../core/contract.js';
@@ -16,21 +17,37 @@ export type ViewDate<Variables extends VariableCollection, Input> = {
16
17
  export type ViewBindings<Variables extends VariableCollection, Input> = Partial<{
17
18
  [Key in keyof Variables]: (input: Input) => ResolvedVariables<Variables>[Key];
18
19
  }>;
20
+ type SameViewInput<Variables extends VariableCollection, Input> = [
21
+ ResolvedVariables<Variables>
22
+ ] extends [Input] ? [Input] extends [ResolvedVariables<Variables>] ? [Input] extends [Record<string, never>] ? true : [keyof Input] extends [keyof Variables] ? true : false : false : false;
23
+ type ViewInputMapping<Variables extends VariableCollection, Input> = SameViewInput<Variables, Input> extends true ? {
24
+ input?: (values: ResolvedVariables<Variables>) => Input;
25
+ } : {
26
+ input: (values: ResolvedVariables<Variables>) => Input;
27
+ };
19
28
  export type DataViewDefinition<Name extends string, Variables extends VariableCollection, Input, Data> = {
20
29
  operation: Name;
21
- variables: Variables;
22
- input: (values: ResolvedVariables<Variables>) => Input;
30
+ dataContext: DataContext;
23
31
  bindings?: ViewBindings<Variables, Input>;
24
32
  /** App-owned semantics: measured zero need not mean an empty result. */
25
33
  isEmpty: (data: Data) => boolean;
26
- empty: EmptyContent;
27
- } & ({
34
+ /** Inherited by DataSection unless it supplies its own copy. */
35
+ emptyFallback: EmptyContent;
36
+ } & (keyof Variables extends never ? {
37
+ variables?: Variables;
38
+ } : {
39
+ variables: Variables;
40
+ }) & ViewInputMapping<NoInfer<Variables>, Input> & ({
28
41
  date: ViewDate<Variables, Input>;
29
42
  describeInput?: (input: Input) => string;
30
43
  } | {
31
44
  date?: never;
32
45
  describeInput: (input: Input) => string;
33
46
  });
47
+ export type ResolvedDataViewDefinition<Name extends string, Variables extends VariableCollection, Input, Data> = Omit<DataViewDefinition<Name, Variables, Input, Data>, 'variables' | 'input'> & {
48
+ variables: Variables;
49
+ input: (values: ResolvedVariables<Variables>) => Input;
50
+ };
34
51
  export declare function describeViewInput<Input>(definition: {
35
52
  variables: VariableCollection;
36
53
  bindings?: Partial<Record<string, (input: Input) => unknown>>;