@declarion/react 0.57.0 → 0.59.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 (165) hide show
  1. package/README.md +0 -2
  2. package/dist-lib/AgentChatPanel.impl-DBH1Ff4G.js +1200 -0
  3. package/dist-lib/DetailAuditStrip-GNRA_eP5.js +289 -0
  4. package/dist-lib/{DraggableChildrenTable-BV5sb8Uo.js → DraggableChildrenTable-4RZC351U.js} +87 -86
  5. package/dist-lib/Grid-CQabaBLx.js +405 -0
  6. package/dist-lib/{LayoutRenderer-C9AH9cXf.js → LayoutRenderer-DGKWZKpW.js} +1000 -1114
  7. package/dist-lib/{ListCardsBody-DXcDg536.js → ListCardsBody-DfGmyNIu.js} +84 -84
  8. package/dist-lib/MarkdownRenderer-BDbzDv_y.js +87 -0
  9. package/dist-lib/{RefreshControl-CNtN8zSl.js → RefreshControl-Bhoib0ZA.js} +126 -155
  10. package/dist-lib/SmartDetailPage.impl-Ds2RGg6K.js +1565 -0
  11. package/dist-lib/SmartListPage.impl-BrZLE_Gb.js +3046 -0
  12. package/dist-lib/{SmartRecordListPage.impl-Bkl9aZJ8.js → SmartRecordListPage.impl-C1FJLr80.js} +281 -280
  13. package/dist-lib/SortHeaderMenu-Cijxk4cX.js +107 -0
  14. package/dist-lib/action-dispatch-DY0c8U81.js +1967 -0
  15. package/dist-lib/api/client.d.ts +5 -0
  16. package/dist-lib/api/data.d.ts +2 -4
  17. package/dist-lib/api/entities.d.ts +8 -15
  18. package/dist-lib/api/events.d.ts +3 -3
  19. package/dist-lib/cardProjection-Bkl2SSYz.js +499 -0
  20. package/dist-lib/components/actions/ResponsiveActionBar.d.ts +17 -16
  21. package/dist-lib/components/agents/AgentChatPanel.d.ts +3 -13
  22. package/dist-lib/components/agents/AgentChatPanel.impl.d.ts +14 -0
  23. package/dist-lib/components/agents/AgentPicker.d.ts +1 -2
  24. package/dist-lib/components/chrome/PageShell.d.ts +7 -0
  25. package/dist-lib/components/chrome/RecordHeader.d.ts +1 -2
  26. package/dist-lib/components/detail-layout/DetailAuditStrip.d.ts +1 -2
  27. package/dist-lib/components/detail-layout/DetailHighlights.d.ts +1 -2
  28. package/dist-lib/components/detail-layout/blockMeta.d.ts +2 -1
  29. package/dist-lib/components/fields/BoolField.d.ts +1 -1
  30. package/dist-lib/components/fields/EnumField.d.ts +1 -1
  31. package/dist-lib/components/fields/IntArrayField.d.ts +1 -1
  32. package/dist-lib/components/fields/MultilangArrayField.d.ts +2 -0
  33. package/dist-lib/components/fields/MultilangField.d.ts +1 -1
  34. package/dist-lib/components/fields/MultilangTextField.d.ts +1 -1
  35. package/dist-lib/components/fields/NumberField.d.ts +1 -1
  36. package/dist-lib/components/fields/PasswordField.d.ts +1 -1
  37. package/dist-lib/components/fields/RefCombobox.d.ts +1 -1
  38. package/dist-lib/components/fields/SecretField.d.ts +1 -1
  39. package/dist-lib/components/fields/StringArrayField.d.ts +1 -1
  40. package/dist-lib/components/fields/TimestampField.d.ts +1 -1
  41. package/dist-lib/components/fields/cells/registry.d.ts +2 -1
  42. package/dist-lib/components/fields/index.d.ts +2 -1
  43. package/dist-lib/components/fields/langMap.d.ts +2 -0
  44. package/dist-lib/components/fields/secretValue.d.ts +2 -0
  45. package/dist-lib/components/file-widgets/UnknownFileWidget.d.ts +3 -0
  46. package/dist-lib/components/file-widgets/UploadFailureText.d.ts +4 -0
  47. package/dist-lib/components/file-widgets/helpers.d.ts +1 -1
  48. package/dist-lib/components/file-widgets/host.d.ts +4 -3
  49. package/dist-lib/components/file-widgets/types.d.ts +1 -0
  50. package/dist-lib/components/file-widgets/upload.d.ts +18 -3
  51. package/dist-lib/components/filters/filter-op-label.d.ts +3 -0
  52. package/dist-lib/components/layout/ImpersonationBanner.d.ts +1 -1
  53. package/dist-lib/components/layout/ImpersonationFrame.d.ts +1 -1
  54. package/dist-lib/components/layout/Layout.d.ts +2 -1
  55. package/dist-lib/components/layout/Sidebar.d.ts +2 -1
  56. package/dist-lib/components/layout/TenantChip.d.ts +1 -1
  57. package/dist-lib/components/list/ViewSwitcher.d.ts +4 -2
  58. package/dist-lib/components/pages/DocumentsMenu.d.ts +1 -2
  59. package/dist-lib/components/pages/ExportMenu.d.ts +3 -5
  60. package/dist-lib/components/pages/RecordDocumentsPanel.d.ts +1 -2
  61. package/dist-lib/components/pages/auth/AuthShell.d.ts +4 -31
  62. package/dist-lib/components/pages/exportRequest.d.ts +4 -6
  63. package/dist-lib/components/pages/list/DeleteViewDialog.d.ts +8 -0
  64. package/dist-lib/components/pages/list/ListCardRow.d.ts +1 -2
  65. package/dist-lib/components/pages/list/ListCardsBody.d.ts +0 -1
  66. package/dist-lib/components/pages/list/ListFloatbar.d.ts +2 -2
  67. package/dist-lib/components/pages/list/ListHeader.d.ts +2 -2
  68. package/dist-lib/components/pages/list/ListNoRows.d.ts +4 -5
  69. package/dist-lib/components/pages/list/ListToolbar.d.ts +3 -2
  70. package/dist-lib/components/pages/list/ListUrlBanner.d.ts +10 -0
  71. package/dist-lib/components/pages/list/RowActionsCell.d.ts +2 -4
  72. package/dist-lib/components/pages/list/RowContextMenu.d.ts +1 -2
  73. package/dist-lib/components/pages/list/columns.d.ts +2 -1
  74. package/dist-lib/components/pages/list/filter-meta.d.ts +2 -1
  75. package/dist-lib/components/pages/list/useActiveView.d.ts +38 -0
  76. package/dist-lib/components/pages/list/useListColumnLayout.d.ts +6 -5
  77. package/dist-lib/components/pages/list/useListQuery.d.ts +4 -4
  78. package/dist-lib/components/pages/list/useListSort.d.ts +5 -4
  79. package/dist-lib/components/pages/list/useListViews.d.ts +18 -8
  80. package/dist-lib/components/pages/list/useRowMenu.d.ts +2 -3
  81. package/dist-lib/components/pages/profile/Profile.d.ts +3 -0
  82. package/dist-lib/components/params/ParamsBlock.d.ts +1 -13
  83. package/dist-lib/components/params/param-editors.d.ts +3 -11
  84. package/dist-lib/components/primitives/ClassifiedFieldLocked.d.ts +1 -2
  85. package/dist-lib/components/shared/DynamicIcon.d.ts +2 -2
  86. package/dist-lib/components/shared/LoadingSkeleton.d.ts +1 -0
  87. package/dist-lib/components/shared/LucideIcon.d.ts +1 -1
  88. package/dist-lib/components/shared/useOwnRefresh.d.ts +1 -1
  89. package/dist-lib/declarion-react.css +1 -1
  90. package/dist-lib/embed/theme.d.ts +1 -1
  91. package/dist-lib/embed/useEmbedNavigate.d.ts +1 -1
  92. package/dist-lib/failure-v-uGSpbX.js +158 -0
  93. package/dist-lib/{field-classification-D6xQYn-h.js → field-classification-C28XE-_P.js} +514 -307
  94. package/dist-lib/format-count-DA4wmmWR.js +1771 -0
  95. package/dist-lib/hooks/useEntityData.d.ts +1 -1
  96. package/dist-lib/hooks/useFilters.d.ts +7 -5
  97. package/dist-lib/hooks/useLanguage.d.ts +4 -0
  98. package/dist-lib/hooks/useParams.d.ts +4 -51
  99. package/dist-lib/hooks/useRegisterScreenTab.d.ts +1 -1
  100. package/dist-lib/hooks/useSSE.d.ts +3 -3
  101. package/dist-lib/hooks/useTabTitle.d.ts +2 -0
  102. package/dist-lib/hooks/useText.d.ts +3 -3
  103. package/dist-lib/hooks/useVersionWatcher.d.ts +1 -1
  104. package/dist-lib/hooks/useViews.d.ts +20 -0
  105. package/dist-lib/index.d.ts +8 -7
  106. package/dist-lib/index.js +2716 -5795
  107. package/dist-lib/lib/action-dispatch.d.ts +2 -1
  108. package/dist-lib/lib/actions.d.ts +30 -42
  109. package/dist-lib/lib/anchor.d.ts +3 -4
  110. package/dist-lib/lib/decimal-text.d.ts +1 -0
  111. package/dist-lib/lib/document-templates.d.ts +1 -2
  112. package/dist-lib/lib/download.d.ts +2 -1
  113. package/dist-lib/lib/evidence-verdict.d.ts +2 -1
  114. package/dist-lib/lib/failure.d.ts +2 -0
  115. package/dist-lib/lib/field-classification.d.ts +3 -3
  116. package/dist-lib/lib/filters.d.ts +18 -2
  117. package/dist-lib/lib/format-count.d.ts +8 -7
  118. package/dist-lib/lib/language.d.ts +19 -0
  119. package/dist-lib/lib/mass-edit.d.ts +2 -1
  120. package/dist-lib/lib/realtime-query-keys.d.ts +1 -1
  121. package/dist-lib/lib/realtime-reconcile.d.ts +3 -4
  122. package/dist-lib/lib/screen-back.d.ts +4 -6
  123. package/dist-lib/lib/sort.d.ts +9 -9
  124. package/dist-lib/lib/timestamp.d.ts +5 -7
  125. package/dist-lib/lib/ui-actions.d.ts +2 -1
  126. package/dist-lib/peekDraftStore-D-cTbiIr.js +199 -0
  127. package/dist-lib/registry-Cb3W-czW.js +1950 -0
  128. package/dist-lib/safe-url-oSJw5pzO.js +34 -0
  129. package/dist-lib/stores/icon-registry.d.ts +2 -2
  130. package/dist-lib/stores/list-layout.d.ts +3 -4
  131. package/dist-lib/stores/realtime.d.ts +1 -1
  132. package/dist-lib/stores/tabs.d.ts +3 -2
  133. package/dist-lib/testing.d.ts +6 -0
  134. package/dist-lib/testing.js +98 -76
  135. package/dist-lib/types/api.d.ts +7 -8
  136. package/dist-lib/types/fieldType.d.ts +1 -1
  137. package/dist-lib/types/files.d.ts +4 -4
  138. package/dist-lib/types/schema.d.ts +44 -50
  139. package/dist-lib/useAgentConversation-D97IqE-J.js +623 -0
  140. package/dist-lib/{useCurrentScreen-CzwzQpoW.js → useCurrentScreen-BL5NZFCw.js} +2777 -3768
  141. package/dist-lib/useListQuery-BG1GyKtJ.js +103 -0
  142. package/dist-lib/useProperties-4Lg3odrt.js +83 -0
  143. package/dist-lib/{useTabSearchMirror-C39U85cg.js → useTabSearchMirror-ZVLlINBX.js} +49 -51
  144. package/dist-lib/useText-BFDCTUSo.js +952 -0
  145. package/dist-lib/{value-Bo8C8WMU.js → value-By1-WJ8J.js} +74 -76
  146. package/dist-lib/vite/fingerprint-plugin.d.ts +2 -3
  147. package/package.json +9 -9
  148. package/dist-lib/Grid-DWgUPuZ3.js +0 -404
  149. package/dist-lib/MarkdownRenderer-CcSFc2N3.js +0 -85
  150. package/dist-lib/RecordIdBadge-CGxPR-8q.js +0 -24
  151. package/dist-lib/SmartDetailPage.impl-lskCd-WG.js +0 -1846
  152. package/dist-lib/SmartListPage.impl-CrGbdzyK.js +0 -2854
  153. package/dist-lib/SortHeaderMenu-SYSAaqQJ.js +0 -106
  154. package/dist-lib/action-dispatch-CR4ajBtT.js +0 -1985
  155. package/dist-lib/cardProjection-CW5RIMko.js +0 -699
  156. package/dist-lib/components/pages/home/HomeStub.d.ts +0 -6
  157. package/dist-lib/components/pages/jobs/Jobs.d.ts +0 -1
  158. package/dist-lib/components/pages/pipeline/Pipeline.d.ts +0 -1
  159. package/dist-lib/format-count-Dobmi-Ji.js +0 -1551
  160. package/dist-lib/hooks/useUserLocale.d.ts +0 -1
  161. package/dist-lib/lib/messages.d.ts +0 -12
  162. package/dist-lib/peekDraftStore-5wQ7lq_V.js +0 -194
  163. package/dist-lib/registry-CjgUaF7C.js +0 -1768
  164. package/dist-lib/useListQuery-D7Hr5WM1.js +0 -96
  165. package/dist-lib/useProperties-CqtCzFCr.js +0 -81
@@ -2,10 +2,10 @@
2
2
  * ResponsiveActionBar - placement-agnostic action toolbar.
3
3
  *
4
4
  * Consumes a resolved + RBAC-pruned ResolvedActionLayoutNode[] from the server
5
- * (plan §8) and renders it as an inline bar with overflow "More" dropdown
5
+ * and renders it as an inline bar with overflow "More" dropdown
6
6
  * (kind="detail"/"toolbar") or as a single kebab "⋮" (kind="row").
7
7
  *
8
- * Measurement algorithm (plan §9):
8
+ * Measurement algorithm:
9
9
  * 1. Off-screen layer renders every leaf + group trigger invisibly.
10
10
  * 2. ResizeObserver tracks container width.
11
11
  * 3. On layout or container-width change, greedy-fill in position-ascending
@@ -14,7 +14,7 @@
14
14
  * 4. visibility:hidden until first measurement completes (avoids FOUC).
15
15
  * 16ms timeout fallback in case ResizeObserver fires late.
16
16
  *
17
- * Selection-state performance (plan §9 "Selection-state performance"):
17
+ * Selection-state performance:
18
18
  * kind="toolbar" pre-resolves and pre-measures BOTH static (no selection)
19
19
  * and bulk (selection > 0) variants at initial mount. The rowSelection toggle
20
20
  * swaps which variant renders WITHOUT re-measuring.
@@ -25,6 +25,7 @@
25
25
  */
26
26
  import type { Action, Entity, Screen } from "../../types/schema.d.ts";
27
27
  import type { ResolvedActionLayoutNode, ResolvedActionLeaf } from "../../lib/actions.d.ts";
28
+ import { type TextFn } from "../../hooks/useText.d.ts";
28
29
  /**
29
30
  * Action-trigger callback. Returns a promise when the caller dispatches an
30
31
  * awaitable action (direct-run via ActionRunner); the bar awaits it so the
@@ -48,12 +49,12 @@ export interface TabMeta {
48
49
  }
49
50
  /**
50
51
  * Minimal dispatch surface assembled by SmartListPage/DetailLayout and passed
51
- * to ResponsiveActionBar. Phase 1 only consumes what `href` dispatch needs
52
- * plus the seat for the Phase 2 widget registry mount.
52
+ * to ResponsiveActionBar. It carries what `href` dispatch needs plus the seat
53
+ * for a future widget registry mount.
53
54
  *
54
55
  * Reason: defining the full WidgetContext now would freeze a surface before
55
- * the widget registry has a real consumer. Phase 1 ships exactly the fields
56
- * the href dispatch reads; Phase 2 will extend without breaking callers.
56
+ * the widget registry has a real consumer. It holds exactly the fields the
57
+ * href dispatch reads and extends without breaking callers.
57
58
  */
58
59
  export interface WidgetContext {
59
60
  /** Resolved entity for the current page; widget code reads schema metadata. */
@@ -68,8 +69,8 @@ export interface WidgetContext {
68
69
  selectedRows: Record<string, unknown>[];
69
70
  /** PK values of the currently selected rows, in selection order. */
70
71
  selectedIds: string[];
71
- /** Active UI locale (e.g. "en", "ru"). */
72
- locale: string;
72
+ /** Reads declared words in the reader's language; `t.language` formats values. */
73
+ t: TextFn;
73
74
  /** Opens or switches to a tab in the SDK shell. */
74
75
  tabNavigate: (url: string, meta?: TabMeta) => void;
75
76
  /** Invokes a server action and returns its response envelope. */
@@ -85,7 +86,7 @@ export interface WidgetContext {
85
86
  }
86
87
  /**
87
88
  * Telemetry payload emitted on every action click. Stays scalar by design -
88
- * no Action reference or i18n strings (plan §8 last paragraph).
89
+ * no Action reference or i18n strings.
89
90
  *
90
91
  * Reason: display.name may carry tenant-customized strings with PII; the
91
92
  * payload feeds analytics pipelines and MUST NOT leak them.
@@ -160,8 +161,9 @@ export interface ResponsiveActionBarProps {
160
161
  /** aria-label for the toolbar root. Defaults to "Actions". */
161
162
  ariaLabel?: string;
162
163
  /**
163
- * Dispatch surface for client-side action modes (`href` today, `widget` in
164
- * Phase 2). When omitted, every action falls through to `onRun`.
164
+ * Dispatch surface for client-side action modes (`href` today, `widget` once
165
+ * the widget registry exists). When omitted, every action falls through to
166
+ * `onRun`.
165
167
  *
166
168
  * Reason: keeps the bar usable from contexts that have no router or schema
167
169
  * runtime (test fixtures, storybook) while letting production callers wire
@@ -169,7 +171,7 @@ export interface ResponsiveActionBarProps {
169
171
  */
170
172
  widgetContext?: WidgetContext;
171
173
  /**
172
- * Telemetry sink fired on every action click (plan §8). Payload stays
174
+ * Telemetry sink fired on every action click. Payload stays
173
175
  * scalar - no Action reference or i18n strings.
174
176
  *
175
177
  * Reason: feeds analytics without leaking tenant-customized labels.
@@ -180,7 +182,7 @@ export interface RowMenuContentProps {
180
182
  /**
181
183
  * Row-stated + nav-suppressed layout. BOTH triggers pass the identical shape:
182
184
  * the kebab (anchored) and the right-click menu (at the cursor) compose the
183
- * same leaves so their menus are structurally identical (Invariant 1).
185
+ * same leaves so their menus are structurally identical.
184
186
  */
185
187
  layout: ResolvedActionLayoutNode[];
186
188
  entityActions: Record<string, Action> | undefined;
@@ -201,8 +203,7 @@ export interface RowMenuContentProps {
201
203
  }
202
204
  /**
203
205
  * RowMenuContent is the ONE renderer of Row Menu body content, shared by the
204
- * kebab and the right-click menu (plan 2026-07-19-unified-row-menu, Invariant
205
- * 1). It partitions destructive-last, draws a divider after the leading
206
+ * kebab and the right-click menu. It partitions destructive-last, draws a divider after the leading
206
207
  * navigation run (__peek / __open), and renders every leaf through the same
207
208
  * DropdownLeafItem / DropdownGroupSection path used everywhere else - so the two
208
209
  * triggers cannot structurally diverge. It renders no chrome and owns no
@@ -1,13 +1,3 @@
1
- export interface AgentChatPanelProps {
2
- open: boolean;
3
- onClose: () => void;
4
- /** Reserved for conversation context; the current action does not persist it. */
5
- context?: string;
6
- title?: string;
7
- /** A question typed somewhere else - the command palette - to send once
8
- * the panel opens. The palette promises "Press Enter to ask"; without
9
- * this it opened the panel and threw the question away. */
10
- askOnOpen?: string;
11
- }
12
- export declare function AgentChatPanel({ open, onClose, context, title, askOnOpen }: AgentChatPanelProps): import("react").JSX.Element | null;
13
- export declare function proposalFallback(code: string): string;
1
+ import type { AgentChatPanelProps } from "./AgentChatPanel.impl";
2
+ export type { AgentChatPanelProps } from "./AgentChatPanel.impl";
3
+ export declare function AgentChatPanel(props: AgentChatPanelProps): import("react").JSX.Element | null;
@@ -0,0 +1,14 @@
1
+ import { type TextFn } from "../../lib/language.d.ts";
2
+ export interface AgentChatPanelProps {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ /** Reserved for conversation context; the current action does not persist it. */
6
+ context?: string;
7
+ title?: string;
8
+ /** A question typed somewhere else - the command palette - to send once
9
+ * the panel opens. The palette promises "Press Enter to ask"; without
10
+ * this it opened the panel and threw the question away. */
11
+ askOnOpen?: string;
12
+ }
13
+ export declare function AgentChatPanel({ open, onClose, context, title, askOnOpen }: AgentChatPanelProps): import("react").JSX.Element | null;
14
+ export declare function proposalFallback(t: TextFn, code: string): string;
@@ -3,7 +3,6 @@ export interface AgentPickerProps {
3
3
  agents: AvailableAgent[];
4
4
  selectedId?: string;
5
5
  onSelect: (id: string) => void;
6
- locale: string;
7
6
  label: string;
8
7
  }
9
- export declare function AgentPicker({ agents, selectedId, onSelect, locale, label }: AgentPickerProps): import("react").JSX.Element | null;
8
+ export declare function AgentPicker({ agents, selectedId, onSelect, label }: AgentPickerProps): import("react").JSX.Element | null;
@@ -0,0 +1,7 @@
1
+ import type { ReactNode, Ref } from "react";
2
+ export interface PageShellProps {
3
+ header: ReactNode;
4
+ children: ReactNode;
5
+ scrollRef?: Ref<HTMLDivElement>;
6
+ }
7
+ export declare function PageShell({ header, children, scrollRef }: PageShellProps): import("react").JSX.Element;
@@ -1,7 +1,6 @@
1
1
  import type { ReactNode } from "react";
2
2
  interface RecordHeaderProps {
3
3
  icon?: ReactNode;
4
- avatarName?: string;
5
4
  title: string;
6
5
  recordId?: string;
7
6
  description?: string;
@@ -14,5 +13,5 @@ interface RecordHeaderProps {
14
13
  identityControls?: ReactNode;
15
14
  showTitle?: boolean;
16
15
  }
17
- export declare function RecordHeader({ icon, avatarName, title, recordId, description, highlights, mode, dirty, showBack, onBack, right, identityControls, showTitle, }: RecordHeaderProps): import("react").JSX.Element;
16
+ export declare function RecordHeader({ icon, title, recordId, description, highlights, mode, dirty, showBack, onBack, right, identityControls, showTitle, }: RecordHeaderProps): import("react").JSX.Element;
18
17
  export {};
@@ -7,7 +7,6 @@ interface DetailAuditStripProps {
7
7
  record: Record<string, unknown>;
8
8
  refs?: Refs;
9
9
  schema: Schema;
10
- locale: string;
11
10
  }
12
- export declare function DetailAuditStrip({ screen, entity, entityCode, record, refs, schema, locale, }: DetailAuditStripProps): import("react").JSX.Element | null;
11
+ export declare function DetailAuditStrip({ screen, entity, entityCode, record, refs, schema, }: DetailAuditStripProps): import("react").JSX.Element | null;
13
12
  export {};
@@ -9,7 +9,6 @@ interface DetailHighlightsProps {
9
9
  refs?: Refs;
10
10
  objectStatuses?: StatusInfo[];
11
11
  schema: Schema;
12
- locale: string;
13
12
  }
14
- export declare function DetailHighlights({ screen, entity, entityCode, record, refs, objectStatuses, schema, locale, }: DetailHighlightsProps): import("react").JSX.Element | null;
13
+ export declare function DetailHighlights({ screen, entity, entityCode, record, refs, objectStatuses, schema, }: DetailHighlightsProps): import("react").JSX.Element | null;
15
14
  export {};
@@ -1,4 +1,5 @@
1
1
  import type { LayoutNode } from "../../types/schema.d.ts";
2
2
  import type { LayoutContext } from "./LayoutRenderer";
3
- export declare function resolveBlockLabel(node: LayoutNode, ctx: LayoutContext): string;
3
+ import type { TextFn } from "../../lib/language.d.ts";
4
+ export declare function resolveBlockLabel(node: LayoutNode, ctx: LayoutContext, t: TextFn): string;
4
5
  export declare function resolveBlockIcon(node: LayoutNode, ctx: LayoutContext): string | undefined;
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function BoolField({ value, mode, onChange, fieldId, labelId }: FieldRendererProps): import("react").JSX.Element;
2
+ export declare function BoolField({ value, onChange, fieldId, labelId }: FieldRendererProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function EnumField({ field, value, mode, onChange, fieldId, labelId }: FieldRendererProps): import("react").JSX.Element;
2
+ export declare function EnumField({ field, value, mode, onChange, fieldId, labelId, t }: FieldRendererProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function IntArrayField({ field, fieldName, value, mode, onChange, fieldId }: FieldRendererProps): import("react").JSX.Element;
2
+ export declare function IntArrayField({ field, fieldName, value, mode, onChange, fieldId, t }: FieldRendererProps): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function MultilangArrayField(props: FieldRendererProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function MultilangField({ field, fieldName, value, mode, onChange, fieldId }: FieldRendererProps): import("react").JSX.Element;
2
+ export declare function MultilangField({ field, fieldName, value, mode, onChange, fieldId, t }: FieldRendererProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function MultilangTextField({ field, fieldName, value, mode, onChange, fieldId }: FieldRendererProps): import("react").JSX.Element;
2
+ export declare function MultilangTextField({ field, fieldName, value, mode, onChange, fieldId, t }: FieldRendererProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function NumberField({ field, fieldName, value, mode, onChange, record, fieldId }: FieldRendererProps): import("react").JSX.Element;
2
+ export declare function NumberField({ field, fieldName, value, mode, onChange, record, fieldId, t }: FieldRendererProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function PasswordField({ field, fieldName, value, mode, onChange, record, fieldId }: FieldRendererProps): import("react").JSX.Element;
2
+ export declare function PasswordField({ field, fieldName, value, mode, onChange, record, fieldId, t }: FieldRendererProps): import("react").JSX.Element;
@@ -42,4 +42,4 @@ export interface RefComboboxProps {
42
42
  * returned options without re-filtering them client-side. An empty search loads
43
43
  * the default sorted page.
44
44
  */
45
- export declare function RefCombobox({ ref: refConfig, value, onChange, refs, displayFieldOverride, id, labelId, ariaLabel, required, placeholder, specialValues, }: RefComboboxProps): import("react").JSX.Element;
45
+ export declare function RefCombobox({ ref: refConfig, value, onChange, refs, displayFieldOverride, id, labelId, ariaLabel, required, placeholder: placeholderOverride, specialValues, }: RefComboboxProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function SecretField({ field, fieldName, value, mode, onChange, record, fieldId }: FieldRendererProps): import("react").JSX.Element;
2
+ export declare function SecretField({ field, fieldName, value, mode, onChange, record, fieldId, t }: FieldRendererProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function StringArrayField({ field, fieldName, value, mode, onChange, fieldId }: FieldRendererProps): import("react").JSX.Element;
2
+ export declare function StringArrayField({ field, fieldName, value, mode, onChange, fieldId, t }: FieldRendererProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { FieldRendererProps } from "./index";
2
- export declare function TimestampField({ field, fieldName, value, mode, onChange, fieldId }: FieldRendererProps): import("react").JSX.Element;
2
+ export declare function TimestampField({ field, fieldName, value, mode, onChange, fieldId, t }: FieldRendererProps): import("react").JSX.Element;
@@ -12,9 +12,10 @@ export interface CellResolveCtx {
12
12
  entities?: Record<string, Entity>;
13
13
  screens?: Record<string, Screen>;
14
14
  refs?: Refs | (() => Refs | undefined);
15
- locale: string;
15
+ t: TextFn;
16
16
  detailScreen?: string;
17
17
  }
18
18
  export type CellFactory = (ctx: CellResolveCtx) => CellRenderer;
19
+ import type { TextFn } from "../../../lib/language.d.ts";
19
20
  export declare const REGISTRY_WIDGETS: readonly string[];
20
21
  export declare function resolveCellRenderer(ctx: CellResolveCtx): CellRenderer;
@@ -1,6 +1,7 @@
1
1
  import type { EntityField, Entity, Screen } from "../../types/schema.d.ts";
2
2
  import { type FieldType } from "../../types/fieldType.d.ts";
3
3
  import type { Refs } from "../../types/api.d.ts";
4
+ import type { TextFn } from "../../lib/language.d.ts";
4
5
  export type { Refs };
5
6
  export interface FieldRendererProps {
6
7
  field: EntityField;
@@ -19,7 +20,7 @@ export interface FieldRendererProps {
19
20
  entity?: Entity;
20
21
  entities?: Record<string, Entity>;
21
22
  screens?: Record<string, Screen>;
22
- locale: string;
23
+ t: TextFn;
23
24
  detailScreen?: string;
24
25
  }
25
26
  type FieldRenderer = React.ComponentType<FieldRendererProps>;
@@ -0,0 +1,2 @@
1
+ export type LangMap = Record<string, string>;
2
+ export declare function parseLangMap(value: unknown): LangMap;
@@ -0,0 +1,2 @@
1
+ export declare const SECRET_SENTINEL = "[SET]";
2
+ export declare function holdsSecret(value: unknown): boolean;
@@ -0,0 +1,3 @@
1
+ export declare function UnknownFileWidget({ widgetCode }: {
2
+ widgetCode: string;
3
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { UploadFailure } from "./upload";
2
+ export declare function UploadFailureText({ failure }: {
3
+ failure: UploadFailure;
4
+ }): import("react").JSX.Element;
@@ -4,7 +4,7 @@ export interface FocalPoint {
4
4
  x: number;
5
5
  y: number;
6
6
  }
7
- export declare function resolveFileAltText(file: HydratedFile | null, alt: string | undefined, fallback: string): string;
7
+ export declare function resolveFileAltText(file: HydratedFile | null, alt: string | undefined, fallback: string, language: string, deploymentLanguage: string): string;
8
8
  export declare function canPreviewFile(file: HydratedFile): boolean;
9
9
  export declare function previewFileURL(file: HydratedFile): string | undefined;
10
10
  export declare function downloadFileURL(file: HydratedFile): string | undefined;
@@ -2,13 +2,14 @@ import type { ReactNode } from "react";
2
2
  import type { Entity, Screen } from "../../types/schema.d.ts";
3
3
  import type { FileFieldDef, FileFieldValue } from "../../types/files.d.ts";
4
4
  import type { Refs } from "../fields/index.d.ts";
5
+ import type { TextFn } from "../../lib/language.d.ts";
5
6
  export declare function getEntityFileField(entity: Pick<Entity, "files">, fieldName: string): FileFieldDef | undefined;
6
7
  export declare function getFileFieldValue(record: Record<string, unknown>, fieldName: string): FileFieldValue;
7
8
  export declare function getSchemaFieldValue(entity: Pick<Entity, "fields" | "files">, record: Record<string, unknown>, fieldName: string): unknown;
8
9
  export declare function serializeSchemaFieldValue(entity: Pick<Entity, "fields" | "files">, fieldName: string, value: unknown): unknown;
9
- export declare function resolveSchemaFieldLabel(entity: Pick<Entity, "fields" | "files">, fieldName: string, entities?: Record<string, Entity>): string;
10
+ export declare function resolveSchemaFieldLabel(t: TextFn, entity: Pick<Entity, "fields" | "files">, fieldName: string, entities?: Record<string, Entity>): string;
10
11
  export declare function renderSchemaField(props: {
11
- entity: Pick<Entity, "fields" | "files">;
12
+ entity: Pick<Entity, "fields" | "files"> & Partial<Pick<Entity, "display">>;
12
13
  entityCode?: string;
13
14
  fieldName: string;
14
15
  record: Record<string, unknown>;
@@ -19,7 +20,7 @@ export declare function renderSchemaField(props: {
19
20
  surface?: "list" | "detail";
20
21
  entities?: Record<string, Entity>;
21
22
  screens?: Record<string, Screen>;
22
- locale: string;
23
+ t: TextFn;
23
24
  fieldId?: string;
24
25
  labelId?: string;
25
26
  structure?: string;
@@ -9,6 +9,7 @@ export interface FileWidgetProps {
9
9
  onChange?: (next: FileFieldValue) => void;
10
10
  disabled?: boolean;
11
11
  alt?: string;
12
+ recordTitle?: string;
12
13
  uploadFieldCode?: string;
13
14
  uploadSlotCode?: string;
14
15
  fieldId?: string;
@@ -1,3 +1,4 @@
1
+ import type { TextFn } from "../../lib/language.d.ts";
1
2
  import type { UploadProgress, UploadedFile } from "./types";
2
3
  export interface UploadOptions {
3
4
  file: File;
@@ -17,14 +18,28 @@ export declare class UploadError extends Error {
17
18
  /** A declared member of this error's type, read the one way. */
18
19
  ext<T = unknown>(member: string): T | undefined;
19
20
  }
21
+ export interface UploadFailure {
22
+ code: string;
23
+ message: string;
24
+ detail?: string;
25
+ }
26
+ export declare function uploadFailure(t: TextFn, errorTitle: TextFn, err: unknown): UploadFailure;
20
27
  export interface UploadEnvelope {
21
28
  status: string;
22
29
  result: UploadedFile;
23
30
  }
24
31
  export declare function uploadFile(opts: UploadOptions): Promise<UploadedFile>;
25
32
  export declare function discardFile(fileId: string): Promise<void>;
26
- export declare function validateClientSide(file: File, accepts: string[] | undefined, maxBytes: number | undefined): {
27
- code: string;
33
+ export type UploadCheck = {
34
+ code: "file.too_large";
35
+ message: string;
36
+ size: number;
37
+ max: number;
38
+ } | {
39
+ code: "file.field_violation";
28
40
  message: string;
29
- } | null;
41
+ type: string;
42
+ };
43
+ export declare function validateClientSide(file: File, accepts: string[] | undefined, maxBytes: number | undefined): UploadCheck | null;
44
+ export declare function uploadCheckFailure(t: TextFn, errorTitle: TextFn, check: UploadCheck): UploadFailure;
30
45
  export declare function formatBytes(n: number): string;
@@ -0,0 +1,3 @@
1
+ import { type FilterOp } from "../../lib/filters.d.ts";
2
+ import type { TextFn } from "../../lib/language.d.ts";
3
+ export declare function filterOpLabel(t: TextFn, op: FilterOp): string;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Sticky top-of-viewport banner shown for the entire duration of an
3
- * impersonation session (principle 8: "UI signals impersonation loudly").
3
+ * impersonation session: the UI signals impersonation loudly.
4
4
  * Never dismissable. Real user, target identity, expiry countdown, and
5
5
  * an explicit "End session" button are always visible.
6
6
  *
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Fixed 4px viewport overlay frame that surrounds every route. Visible
3
- * for the duration of an impersonation session (principle 8). The
3
+ * for the duration of an impersonation session. The
4
4
  * pointer-events:none guarantees the frame never blocks clicks.
5
5
  *
6
6
  * Color comes from --impersonation-accent (amber by default). When
@@ -1,5 +1,6 @@
1
1
  import { useTabStore } from "../../stores/tabs.d.ts";
2
2
  import { type NavNode, type Screen } from "../../types/schema.d.ts";
3
3
  import type { Crumb } from "../chrome/Breadcrumbs.d.ts";
4
+ import type { TextFn } from "../../lib/language.d.ts";
4
5
  export declare function Layout(): import("react").JSX.Element | null;
5
- export declare function buildCrumbs(nodes: NavNode[], screens: Record<string, Screen>, pathname: string, tabs: ReturnType<typeof useTabStore.getState>["tabs"], activeTabId: string | null, topLevelNavigate: (to: string) => void): Crumb[];
6
+ export declare function buildCrumbs(t: TextFn, nodes: NavNode[], screens: Record<string, Screen>, pathname: string, tabs: ReturnType<typeof useTabStore.getState>["tabs"], activeTabId: string | null, topLevelNavigate: (to: string) => void): Crumb[];
@@ -1,4 +1,5 @@
1
1
  import { type NavNode } from "../../types/schema.d.ts";
2
+ import type { TextFn } from "../../lib/language.d.ts";
2
3
  export interface SidebarProps {
3
4
  activeArea: string;
4
5
  }
@@ -7,5 +8,5 @@ interface SidebarSection {
7
8
  title: string;
8
9
  items: NavNode[];
9
10
  }
10
- export declare function buildSections(nodes: NavNode[], activeArea: string): SidebarSection[];
11
+ export declare function buildSections(t: TextFn, nodes: NavNode[], activeArea: string): SidebarSection[];
11
12
  export {};
@@ -9,7 +9,7 @@ export interface TenantChipProps {
9
9
  * When true, the chip is disabled with a tooltip explaining why.
10
10
  * Used during impersonation: cross-tenant targeting at start is
11
11
  * supported, but mid-session tenant switching is undefined and
12
- * locked (plan §"Cross-tenant impersonation").
12
+ * locked.
13
13
  */
14
14
  locked?: boolean;
15
15
  lockedReason?: string;
@@ -16,7 +16,9 @@ interface ViewSwitcherProps {
16
16
  onSelect: (view: ViewItem) => void;
17
17
  onSave?: () => void;
18
18
  onSaveAs?: () => void;
19
- onSetDefault?: (viewId: string) => void;
19
+ onDiscard?: () => void;
20
+ onDelete?: (view: ViewItem) => void;
21
+ deletePending?: boolean;
20
22
  }
21
- export declare function ViewSwitcher({ views, activeViewId, isDirty, onSelect, onSave, onSaveAs, }: ViewSwitcherProps): import("react").JSX.Element;
23
+ export declare function ViewSwitcher({ views, activeViewId, isDirty, onSelect, onSave, onSaveAs, onDiscard, onDelete, deletePending, }: ViewSwitcherProps): import("react").JSX.Element;
22
24
  export {};
@@ -6,7 +6,6 @@ export interface DocumentsMenuProps {
6
6
  objectIds?: string[];
7
7
  viewState?: ListViewState;
8
8
  selectedIds?: string[];
9
- locale?: string;
10
9
  /** Static system-template capability from the schema projection
11
10
  * (`entity.documents`). Absent/both-falsy means no SYSTEM template
12
11
  * applies for this caller/tenant/entity - the button still renders if
@@ -16,7 +15,7 @@ export interface DocumentsMenuProps {
16
15
  * `document_template` is present & readable in `schema.entities`). Gates
17
16
  * the lazy `document.templates.available` visibility probe so a
18
17
  * template-less, non-manager caller - the default - makes ZERO extra
19
- * network calls - Business Case 6. */
18
+ * network calls. */
20
19
  canManageTemplates?: boolean;
21
20
  }
22
21
  export declare function DocumentsMenu({ entityCode, scope, objectIds, viewState, selectedIds, capability, canManageTemplates, }: DocumentsMenuProps): import("react").JSX.Element | null;
@@ -17,13 +17,11 @@ export interface ExportMenuProps {
17
17
  totalRows?: number;
18
18
  /** Per-page size of the current view (for the Current page label). */
19
19
  pageSize?: number;
20
- /** Caller's UI locale (e.g. "en"). Server falls back to ui_language when omitted. */
21
- locale?: string;
20
+ /** The language the file is written in: the window's, so the CSV reads as the screen does. */
21
+ language?: string;
22
22
  /** Optional placement override for the popover. */
23
23
  align?: "start" | "end";
24
- /** When true, render only as a single MenuItem suitable for embedding inside
25
- * the existing selection menu (replaces the placeholder at :2007-2015).
26
- * Defaults to a full Btn + Dropdown toolbar item. */
24
+ /** A single MenuItem for embedding in a selection menu, instead of the toolbar Btn + Dropdown. */
27
25
  variant?: "toolbar" | "selection-menu-item";
28
26
  /** Optional click-handler ran before scope dispatch — e.g. to close a
29
27
  * parent menu so the export popover doesn't stack underneath. */
@@ -16,8 +16,7 @@ interface RecordDocumentsPanelProps {
16
16
  * template-less, non-manager caller - the default - makes ZERO
17
17
  * document.object_links calls per record view. The rare orphaned-attachment
18
18
  * case (a template was removed but its current-attached docs remain) then
19
- * surfaces only to managers on the record and to everyone via My Documents,
20
- * which is the right trade for the stakeholder's "no gratuitous cost" bar. */
19
+ * surfaces only to managers on the record and to everyone via My Documents. */
21
20
  canManageTemplates?: boolean;
22
21
  }
23
22
  interface RecordDocument {
@@ -2,21 +2,8 @@ import { type ReactNode } from "react";
2
2
  import { Icon } from "../../primitives/Icons.d.ts";
3
3
  export type AuthShellProps = {
4
4
  children: ReactNode;
5
- /**
6
- * Tenant slug used to compose the workspace pill. The pill renders
7
- * `<tenantSlug>.<branding.identity.workspace_domain>` only when both pieces
8
- * are set; otherwise it is hidden. Callers are not required to
9
- * provide a slug — the auth shell fails closed (no pill) rather
10
- * than display a placeholder host.
11
- *
12
- * Currently unwired in v1: no SDK caller passes this prop because
13
- * frontend tenant-from-host resolution does not exist yet (see
14
- * `docs/gotchas.md` "Tenant Resolution" — the deferred multi-tenant-
15
- * via-host work). When that lands, callers will source the slug from
16
- * `window.location.hostname` (or an equivalent middleware-supplied
17
- * context) and thread it through. Until then the pill stays hidden;
18
- * the prop is kept so the contract is in place for the follow-up.
19
- */
5
+ /** With `branding.identity.workspace_domain`, shows the `<tenantSlug>.<domain>` pill. No SDK caller
6
+ * passes it until tenant-from-host resolution exists. */
20
7
  tenantSlug?: string;
21
8
  tagline?: string;
22
9
  subTagline?: string;
@@ -25,21 +12,7 @@ export type AuthShellProps = {
25
12
  /** Optional override for the wordmark / app name shown in topbar + brand panel. */
26
13
  brandName?: string;
27
14
  };
28
- /**
29
- * The `Build …` half of the deploy-identity pill.
30
- *
31
- * - release build: `<tag>+<short-revision>`, e.g. "1.4.2+a9b2c0d"
32
- * - dev build: VERSION is itself an abbreviation of the SAME commit (the
33
- * Makefile falls back to `git rev-parse --short HEAD` when there is no
34
- * tag), so a `+<short-rev>` suffix would print one commit twice.
35
- *
36
- * The two strings abbreviate that commit to DIFFERENT lengths - git sizes
37
- * `--short` per repository (8 chars in this one) while the pill truncates the
38
- * revision to 7 - so they are compared on their common prefix. Comparing them
39
- * for equality reads as correct and never fires: it shipped the pill
40
- * "Build 01385f9a+01385f9", the same commit rendered twice.
41
- *
42
- * Exported for tests.
43
- */
15
+ /** `<tag>+<short-revision>`, or the version alone when a dev build's VERSION already abbreviates the
16
+ * same commit. git and the pill abbreviate to different lengths, so they compare on the common prefix. */
44
17
  export declare function formatBuildLabel(version?: string, revision?: string): string;
45
18
  export declare function AuthShell({ children, tenantSlug, tagline, subTagline, version, badges, brandName, }: AuthShellProps): import("react").JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import type { FilterNode } from "../../lib/filters.d.ts";
2
- /** ExportQuery mirrors the Go ExportQuery struct (server/handlers/data_export.go).
3
- * Field order matches; semantics match parseListParams 1:1. */
2
+ /** ExportQuery is the list-query body the export endpoint accepts. Its
3
+ * semantics match the server's list URL parameters 1:1. */
4
4
  export interface ExportQuery {
5
5
  screen?: string;
6
6
  filters?: FilterNode[];
@@ -20,7 +20,7 @@ export interface ExportRequest {
20
20
  query: ExportQuery;
21
21
  columns: string[];
22
22
  selection?: Array<Record<string, string>>;
23
- locale?: string;
23
+ language?: string;
24
24
  /** v1 wire defaults: `header_style="label"`, `ref_mode="display"`. v2 will
25
25
  * add `code` / `stable_key`. Omitted = server defaults. */
26
26
  header_style?: "label";
@@ -45,8 +45,6 @@ export interface ListViewState {
45
45
  page?: number;
46
46
  perPage?: number;
47
47
  }
48
- /** Locale resolver hook input — typically a string from the SDK ctx
49
- * (e.g. `useLocale()`); empty/undefined defers to the server default. */
50
48
  export interface ExportIntent {
51
49
  scope: ExportScope;
52
50
  /** All visible columns in display order. _select / _actions are stripped
@@ -55,7 +53,7 @@ export interface ExportIntent {
55
53
  /** PK objects of the currently-selected rows. Non-empty only for
56
54
  * `selected_rows` scope. */
57
55
  selectedRowPKs?: Array<Record<string, string>>;
58
- locale?: string;
56
+ language?: string;
59
57
  filename?: string;
60
58
  }
61
59
  /** buildListQuery returns the canonical list-query JSON shape from the
@@ -0,0 +1,8 @@
1
+ import type { ViewItem } from "../../list/ViewSwitcher.d.ts";
2
+ interface DeleteViewDialogProps {
3
+ view: ViewItem | null;
4
+ onCancel: () => void;
5
+ onConfirm: (view: ViewItem) => void;
6
+ }
7
+ export declare function DeleteViewDialog({ view, onCancel, onConfirm }: DeleteViewDialogProps): import("react").JSX.Element;
8
+ export {};