Skip to content

Commit f5c7b2c

Browse files
feat(spec): object-grid declares description, emptyState (the list view's own shape) and keyboardNavigation (#20882)
Fixes #20694 Clause-②: yes `ComponentPropsMap['object-grid']` (`ObjectGridPropsSchema`) gains the three members named in triage's direction (`5897622232`). This is a widening. Nothing that parsed before is refused, and the row still refuses every key it does not declare. ## What changes - **`description`**: `I18nLabelSchema.optional()`. At the `.objectui-sha` pin `db11afd4967c`, `plugin-grid/src/ObjectGrid.tsx:5677` resolves it with `resolveInlineI18nLabel(schema.description, displayLocale)` and draws it above the rows at `:5784`, `:6303` and `:6342`. The card calls the function `resolveI18nLabel`; at the pin it is named `resolveInlineI18nLabel`. - **`emptyState`**: the list view's own empty-state shape, taken **by reference**. It used to be an inline `strictObject` at `ListViewShapeSchema.emptyState` (`view.zod.ts`). It is now the exported `EmptyStateSchema` (author type `EmptyState`), and `list-view` and `object-grid` both hold that one schema. At the pin it is read at `ObjectGrid.tsx:6225` and drawn through `DataEmptyState` at `:6233`. - **`keyboardNavigation`**: `z.boolean().optional()`. Its describe is the one triage specified: arrow-key cell navigation on the WAI-ARIA grid pattern, on by default when `editable` is set, and a read-only grid keeps its Tab behaviour unless this is `true`. It is prefixed `[EXPERIMENTAL — not enforced]` because nothing reads it at the pin. Under objectui `packages/` and `apps/`, excluding tests, CHANGELOGs, READMEs and `packages/types` (which holds its type and zod twin), it has 0 hits; the control `schema.editable` has 3 hits in `ObjectGrid.tsx`. - The block docblock records each key's read point at the pin, following its convention, and each member repeats its own. ### The extraction, and the one text change - A parse corpus, run as a scratch script and not committed, covers 28 `emptyState` values on each of the four list-view doors: `ListViewSchema`, `ObjectListViewSchema`, `ViewSchema.list` and the flattened overlay arm of `ViewMetadataSchema`. That is 112 cells, compared between BASE `72f8c38201` and head. - `success` and parsed `data` are identical in 112 of 112 cells. - Issue codes, paths and keys are identical in 112 of 112 cells (every `message` field stripped at every depth). - After substituting only the guidance sentence, the full JSON of each result is byte-identical in 112 of 112 cells. - The 12 cells that differ at all are the `action`, `button` and mixed inputs on each of the four doors. In those cells the `action`/`button` guidance is reworded so that it also reads true on `object-grid`, which has no `addRecord` block. It still points at `addRecord` (`view-strictness-batch18.test.ts` still passes), and it follows the `VIEW_ROW_BOUND_GUIDANCE` precedent for text that two doors share. - The members gain short describes. The list view's reference docs lose the inherited sentence claiming the inline locale map is "resolved at render time"; see Acceptance note 1 for why that claim did not hold. ### Liveness record for `keyboardNavigation` The liveness ledger has no row for any `ComponentPropsMap` key. The page ledger leaves `page/regions` undrilled (it is listed in `undrilled-containers.baseline.json`), and `PageComponent.properties` is an open record, so the walk never reaches `ObjectGridPropsSchema`; a row in `page.json` would be an orphan. The record is therefore the describe marker `[EXPERIMENTAL — not enforced]`, which is the ledger's own spelling for a declared key that is not enforced (`MARKER_RE` in `check-liveness.mts`). The member docblock says to drop the marker in the change that lands the reader. `check:liveness` is green. ### Files outside the claimed surface - `packages/spec/src/type-alias-convention.pin.test.ts`: `gen:docs` refuses to document a schema that has no type alias, so `EmptyState` is exported. ADR-0122 then requires an isomorphism pin (`Iso_ui_view__EmptyStateSchema`), which moves the pin count from 779 to 780. The schema's tree has no default and no transform, so a synonym `EmptyStateParsed` would be wrong. ## Evidence (head `98dad84e21`, which includes a merge of `origin/main` at `07356a6ab0` through `os-regen-merge.sh`) - `object-grid` corpus: 3 of 36 cases parsed at BASE and 14 of 36 parse at head. The newly accepted cases are exactly the valid values of the three members, and no case is newly refused. Both `examples/app-showcase` `object-grid` nodes (command-center `cc_queue_g` and the my-work queue) parse before and after. - **Pins:** `component-object-grid-declared-keys.pin.test.ts` passes 18 of 18. §1 checks that the three members parse byte-identically. §2 checks that an unknown top-level key is refused with `unrecognized_keys` at the row, and that a wrong value in each member is refused (code and path). §3 checks that the grid and the list view hold `EmptyStateSchema` by identity, and that the grid answers exactly what that schema answers. - **Ablations**, run on the committed state through `scripts/ablation-replace.mjs`. Each restore was proven: the blob equals HEAD and `git diff HEAD` is empty. - Renaming the `keyboardNavigation` member: 4 tests fail and 14 pass. - Replacing the grid's `EmptyStateSchema` with a copied `z.strictObject`: only the identity pin fails, and 17 pass. - `pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2`: 581 files, 17154 passed, 1 todo. - `pnpm --filter @objectstack/spec typecheck`: exit 0. This includes `check:test-typecheck`, and the debt ledger is unchanged. - **Consumer `@objectstack/lint`.** Its closure was built upstream with `turbo run build --filter='@objectstack/lint...'` (lint plus its dependencies). - Tests: 117 files, 5437 passed. `typecheck`: exit 0. - Component-props reading through `validateComponentProps` on an `object-grid` node: - The three keys produce 0 findings. - The control `emptyStat` produces `component-props-unknown-key` at `properties.emptyStat`. - The control `emptyState.heading` produces the same rule at `properties.emptyState.heading`. That path exists only through the new declaration, which shows the rule read the rebuilt dist. - `pnpm --filter @objectstack/spec check:generated`: all 15 artifacts are up to date. - **Derived gates** (`dispatch-gates.mjs --commands`, 108 families, run at head): 104 exited 0. Four exited 3 with PREREQUISITE NOT MET, so they are **NOT MEASURED**: - `check:skill-examples`: the client SDK closure is not built. - `check:dual-build-cjs-loads`, `check:lean-entry-closure` and `check:type-check-debt`: each needs the whole-repo package build that CI does. - Reconciled with `--ran`: all 108 accounted for, 104 run, 4 NOT MEASURED. ## Acceptance notes 1. **objectui renderer gap: an inline locale map in `emptyState.title` or `.message`.** At the pin, `ObjectGrid` passes both to `DataEmptyState` unresolved (`:6241-6242`), unlike `description`. React throws on an object child, measured on react 19.2.8: "Objects are not valid as a React child". `ListView` guards with `typeof === 'string'` (`plugin-list/src/ListView.tsx:5112` and `:5114`), so a map there silently falls back to the default text. No producer in `examples/**` or `platform-objects` writes a map there; all of them use strings. So this is not filed here. **Carrier:** the objectui follow-up the seat files at ACCEPT, which lists the three keys in `GRID_QUERY_INPUTS`. Its fix is one resolver, `resolveInlineI18nLabel`, applied at both renderers. Meanwhile the changeset tells authors to write strings on `object-grid`. 2. `origin/main` moved to `9905e61ca2` after the merge; #20868 edits `view.zod.ts` and `view.mdx`. A merge-tree probe from a bare clone with no merge driver shows a clean merge, and the hunks in both files are disjoint from this branch's. CI validates the merge ref. 3. The `object-grid` follow-up in objectui, per triage: after the release is installable, list `description`, `emptyState` and `keyboardNavigation` in `GRID_QUERY_INPUTS` (the reverse direction of the parity gate). --- _Generated by [Claude Code](https://claude.ai/code/session_018fxqvRJW12TaHC7DUQ89Y6)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 4edb614 commit f5c7b2c

13 files changed

Lines changed: 353 additions & 34 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
'@objectstack/spec': minor
3+
---
4+
5+
The `object-grid` page block now declares `description`, `emptyState` and `keyboardNavigation`, so a page that authors them validates clean instead of having each reported as a prop the block does not declare (#20694).
6+
7+
Clause-②: yes (widening)
8+
9+
- **`description`** — an `I18nLabel` (a string, or an inline locale map): one line of help text the grid draws above its rows, resolved against the display locale.
10+
- **`emptyState`** — `{ title?, message?, icon? }`, what the grid draws instead of an empty table. It is the list view's own empty-state shape, now exported as `EmptyStateSchema` (author type `EmptyState`) and taken by reference on both `list-view` and `object-grid`, so the two cannot drift apart.
11+
- **`keyboardNavigation`** — a boolean, marked `[EXPERIMENTAL — not enforced]`: arrow-key cell navigation on the WAI-ARIA grid pattern, on by default when `editable` is set. No renderer reads it yet, so authoring it changes nothing today.
12+
13+
Nothing that parsed before is refused now. The `object-grid` row still refuses every key it does not declare, and the list view's `emptyState` accepts exactly the values it accepted before the shape was extracted. One refusal message is reworded: an `action` or `button` key inside an empty state is still refused and still points at the list view's `addRecord` block, now phrased so that it also reads true on `object-grid`, which has no add-record block.
14+
15+
On `object-grid`, write `emptyState.title` and `emptyState.message` as plain strings for now: the grid renderer draws both as they are and does not yet resolve an inline locale map there the way it resolves `description`, so a map in either member fails to render.
16+
17+
Where it surfaces: the component-props gate (`os validate`, `os build`, `os lint`) no longer reports these three keys on an `object-grid` node, and the published JSON Schema for `ObjectGridProps` describes them.

‎content/docs/references/index.mdx‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Protocol reference — every schema by module
33
navTitle: Protocol Reference
4-
description: Every schema published by @objectstack/spec — 1524 schemas across 14 protocol modules
4+
description: Every schema published by @objectstack/spec — 1525 schemas across 14 protocol modules
55
---
66

77
{/* ⚠️ AUTO-GENERATED — DO NOT EDIT. Run build-docs.ts to regenerate. Hand-written docs live in the module folders under content/docs/. */}
@@ -33,8 +33,8 @@ counts are sums of the rows they head. Regenerate with
3333
| [Shared Protocol](/docs/references/shared) | 10 | 31 | Primitives used across every protocol — identifiers, HTTP, expressions, error maps, enums. |
3434
| [Studio Protocol](/docs/references/studio) | 3 | 35 | Studio designer metadata — the authoring surfaces for the protocols above. |
3535
| [System Protocol](/docs/references/system) | 34 | 275 | The runtime environment — logging, jobs, cache, metrics, notifications, i18n and compliance. |
36-
| [UI Protocol](/docs/references/ui) | 16 | 165 | Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI layer. |
37-
| **Total** | **197** | **1524** | 14 protocol modules |
36+
| [UI Protocol](/docs/references/ui) | 16 | 166 | Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI layer. |
37+
| **Total** | **197** | **1525** | 14 protocol modules |
3838

3939
---
4040

@@ -364,7 +364,7 @@ The runtime environment — logging, jobs, cache, metrics, notifications, i18n a
364364

365365
## UI Protocol
366366

367-
**Source:** `packages/spec/src/ui/` · **Import:** `@objectstack/spec/ui` · **16 pages, 165 schemas**
367+
**Source:** `packages/spec/src/ui/` · **Import:** `@objectstack/spec/ui` · **16 pages, 166 schemas**
368368

369369
Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI layer.
370370

@@ -385,7 +385,7 @@ Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI lay
385385
| [`report.zod.ts`](/docs/references/ui/report) | `JoinedReportBlock`, `Report`, `ReportChart`, `ReportSort`, `ReportType` |
386386
| [`responsive.zod.ts`](/docs/references/ui/responsive) | `ResponsiveStyles`, `StyleMap` |
387387
| [`sharing.zod.ts`](/docs/references/ui/sharing) | `SharingConfig` |
388-
| [`view.zod.ts`](/docs/references/ui/view) | `AddRecordConfig`, `AppearanceConfig`, `CalendarConfig`, `ColumnPrefix`, `ColumnSummary`, `ColumnSummaryConfig`, `FormButtonConfig`, `FormField`, `FormFieldPublicPicker`, `FormSection`, `FormSelectOption`, `FormView`, `GalleryConfig`, `GanttConfig`, `GanttQuickFilter`, `GroupingConfig`, `GroupingField`, `HttpMethodSubset`, `HttpRequest`, `KanbanConfig`, `ListChartConfig`, `ListColumn`, `ListMapConfig`, `ListView`, `NavigationConfig`, `NavigationMode`, `ObjectListView`, `ObjectUserFilters`, `PaginationConfig`, `RowColorConfig`, `RowHeight`, `SelectionConfig`, `TimelineConfig`, `TreeConfig`, `UserActionsConfig`, `UserFilterField`, `UserFilters`, `View`, `ViewData`, `ViewFilterRule`, `ViewItem`, `ViewItemName`, `ViewItemWire`, `ViewKind`, `ViewScope`, `ViewSharing`, `ViewTab`, `VisualizationType` |
388+
| [`view.zod.ts`](/docs/references/ui/view) | `AddRecordConfig`, `AppearanceConfig`, `CalendarConfig`, `ColumnPrefix`, `ColumnSummary`, `ColumnSummaryConfig`, `EmptyState`, `FormButtonConfig`, `FormField`, `FormFieldPublicPicker`, `FormSection`, `FormSelectOption`, `FormView`, `GalleryConfig`, `GanttConfig`, `GanttQuickFilter`, `GroupingConfig`, `GroupingField`, `HttpMethodSubset`, `HttpRequest`, `KanbanConfig`, `ListChartConfig`, `ListColumn`, `ListMapConfig`, `ListView`, `NavigationConfig`, `NavigationMode`, `ObjectListView`, `ObjectUserFilters`, `PaginationConfig`, `RowColorConfig`, `RowHeight`, `SelectionConfig`, `TimelineConfig`, `TreeConfig`, `UserActionsConfig`, `UserFilterField`, `UserFilters`, `View`, `ViewData`, `ViewFilterRule`, `ViewItem`, `ViewItemName`, `ViewItemWire`, `ViewKind`, `ViewScope`, `ViewSharing`, `ViewTab`, `VisualizationType` |
389389

390390
---
391391

‎content/docs/references/ui/component.mdx‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,8 @@ Sort field and direction pair
693693
| **objectName** | `string` | optional | Object this grid binds to. Optional because the component-level `dataSource` binding can supply the object instead |
694694
| **label** | `string \| Record<string, string>` | optional | Grid label — used as the table caption and export file title |
695695
| **title** | `string \| Record<string, string>` | optional | Fallback for `label` (the renderer reads `label \|\| title`) |
696+
| **description** | `string \| Record<string, string>` | optional | One line of help text drawn above the grid's rows — a string, or an inline locale map resolved against the display locale |
697+
| **emptyState** | `{ title?: string \| Record<string, string>; message?: string \| Record<string, string>; icon?: string }` | optional | What the grid draws instead of an empty table: `{ title, message, icon }` — the list view's own empty-state shape |
696698
| **columns** | `any[]` | optional | Columns: field names or column definition objects |
697699
| **fields** | `any[]` | optional | Field list fallback used when `columns` is absent |
698700
| **filter** | `{ field: string; operator: Enum<'equals' \| 'not_equals' \| 'contains' \| 'not_contains' \| 'icontains' \| …>; value?: string \| number \| boolean \| null \| (string \| number)[] }[]` | optional | Base query filter — the ViewFilterRule array form `[{ field, operator, value }, ...]`, the one filter orthography every `filter` door in this map shares; lowered to the wire `$filter`. THE key, singular — not the plural misspelling. The MongoDB-style record form is refused — see migration `element-data-source-and-object-block-filter-rule-array` |
@@ -718,6 +720,7 @@ Sort field and direction pair
718720
| **navigation** | `any` | optional | Row-click navigation config (`{ mode: page \| drawer \| modal \| split \| popover \| new_window \| none }`) — all seven `NavigationModeSchema` values, since the shared `useNavigationOverlay` hook types its own mode union as that schema |
719721
| **editable** | `boolean` | optional | Enable inline cell editing |
720722
| **singleClickEdit** | `boolean` | optional | Enter cell edit on single click (default true when editable) |
723+
| **keyboardNavigation** | `boolean` | optional | [EXPERIMENTAL — not enforced] Arrow-key cell navigation on the WAI-ARIA grid pattern. Defaults to on when `editable` is set; a read-only grid keeps its Tab behaviour unless this is `true`. No renderer reads it yet: it is declared ahead of the grid's keyboard-navigation build, so authoring it changes nothing today |
721724
| **resizable** | `boolean` | optional | Allow column resize (read before `resizableColumns`) |
722725
| **resizableColumns** | `boolean` | optional | Alternate spelling of `resizable` (the renderer reads `resizable ?? resizableColumns`) |
723726
| **reorderableColumns** | `boolean` | optional | Allow column drag-reorder |
@@ -728,6 +731,14 @@ Sort field and direction pair
728731
| **data** | `{ provider: 'object'; object: string } \| { provider: 'api'; read?: object; write?: object } \| { provider: 'value'; items: any[] } \| { provider: 'schema'; schemaId: string; schema?: Record<string, any> }` | optional | Data source binding (ViewDataSchema — discriminated on `provider`: object \| api \| value \| schema). Static inline rows live at `{ provider: 'value', items: [...] }`; the bare-array shortcut is refused — see migration `object-grid-data-view-data-converged` |
729732
| **staticData** | `any[]` | optional | Deprecated bare-array static-rows shortcut the renderer still reads. Prefer `data: { provider: 'value', items: [...] }` |
730733

734+
### Nested Shape: `ObjectGridProps.emptyState`
735+
736+
| Property | Type | Required | Description |
737+
| :--- | :--- | :--- | :--- |
738+
| **title** | `string \| Record<string, string>` | optional | Heading of the empty state |
739+
| **message** | `string \| Record<string, string>` | optional | Line of text below the heading |
740+
| **icon** | `string` | optional | Icon name drawn above the heading; a name that resolves to no icon draws the default empty-state glyph |
741+
731742
### Nested Shape: `ObjectGridProps.filter[number]`
732743

733744
View filter rule

‎content/docs/references/ui/view.mdx‎

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ nothing. The one item-name grammar itself lives in
5959
## TypeScript Usage
6060

6161
```typescript
62-
import { AddRecordConfigSchema, AppearanceConfigSchema, CalendarConfigSchema, ColumnPrefixSchema, ColumnSummarySchema, ColumnSummaryConfigSchema, FormButtonConfigSchema, FormFieldSchema, FormFieldPublicPickerSchema, FormSectionSchema, FormSelectOptionSchema, FormViewSchema, GalleryConfigSchema, GanttConfigSchema, GanttQuickFilterSchema, GroupingConfigSchema, GroupingFieldSchema, HttpMethodSubsetSchema, HttpRequestSchema, KanbanConfigSchema, ListChartConfigSchema, ListColumnSchema, ListMapConfigSchema, ListViewSchema, NavigationConfigSchema, NavigationModeSchema, ObjectListViewSchema, ObjectUserFiltersSchema, PaginationConfigSchema, RowColorConfigSchema, RowHeightSchema, SelectionConfigSchema, TimelineConfigSchema, TreeConfigSchema, UserActionsConfigSchema, UserFilterFieldSchema, UserFiltersSchema, ViewSchema, ViewDataSchema, ViewFilterRuleSchema, ViewItemSchema, ViewItemNameSchema, ViewItemWireSchema, ViewKindSchema, ViewScopeSchema, ViewSharingSchema, ViewTabSchema, VisualizationTypeSchema } from '@objectstack/spec/ui';
63-
import type { AddRecordConfig, AppearanceConfig, CalendarConfig, ColumnPrefix, ColumnSummary, ColumnSummaryConfig, FormButtonConfig, FormField, FormFieldPublicPicker, FormSection, FormSelectOption, FormView, GalleryConfig, GanttConfig, GanttQuickFilter, GroupingConfig, HttpMethodSubset, HttpRequest, KanbanConfig, ListChartConfig, ListColumn, ListMapConfig, ListView, NavigationConfig, NavigationMode, PaginationConfig, RowColorConfig, RowHeight, SelectionConfig, TimelineConfig, TreeConfig, UserActionsConfig, UserFilterField, UserFilters, View, ViewData, ViewFilterRule, ViewItem, ViewItemName, ViewItemWire, ViewKind, ViewScope, ViewSharing, ViewTab, VisualizationType } from '@objectstack/spec/ui';
62+
import { AddRecordConfigSchema, AppearanceConfigSchema, CalendarConfigSchema, ColumnPrefixSchema, ColumnSummarySchema, ColumnSummaryConfigSchema, EmptyStateSchema, FormButtonConfigSchema, FormFieldSchema, FormFieldPublicPickerSchema, FormSectionSchema, FormSelectOptionSchema, FormViewSchema, GalleryConfigSchema, GanttConfigSchema, GanttQuickFilterSchema, GroupingConfigSchema, GroupingFieldSchema, HttpMethodSubsetSchema, HttpRequestSchema, KanbanConfigSchema, ListChartConfigSchema, ListColumnSchema, ListMapConfigSchema, ListViewSchema, NavigationConfigSchema, NavigationModeSchema, ObjectListViewSchema, ObjectUserFiltersSchema, PaginationConfigSchema, RowColorConfigSchema, RowHeightSchema, SelectionConfigSchema, TimelineConfigSchema, TreeConfigSchema, UserActionsConfigSchema, UserFilterFieldSchema, UserFiltersSchema, ViewSchema, ViewDataSchema, ViewFilterRuleSchema, ViewItemSchema, ViewItemNameSchema, ViewItemWireSchema, ViewKindSchema, ViewScopeSchema, ViewSharingSchema, ViewTabSchema, VisualizationTypeSchema } from '@objectstack/spec/ui';
63+
import type { AddRecordConfig, AppearanceConfig, CalendarConfig, ColumnPrefix, ColumnSummary, ColumnSummaryConfig, EmptyState, FormButtonConfig, FormField, FormFieldPublicPicker, FormSection, FormSelectOption, FormView, GalleryConfig, GanttConfig, GanttQuickFilter, GroupingConfig, HttpMethodSubset, HttpRequest, KanbanConfig, ListChartConfig, ListColumn, ListMapConfig, ListView, NavigationConfig, NavigationMode, PaginationConfig, RowColorConfig, RowHeight, SelectionConfig, TimelineConfig, TreeConfig, UserActionsConfig, UserFilterField, UserFilters, View, ViewData, ViewFilterRule, ViewItem, ViewItemName, ViewItemWire, ViewKind, ViewScope, ViewSharing, ViewTab, VisualizationType } from '@objectstack/spec/ui';
6464

6565
// Validate data
6666
const result = AddRecordConfigSchema.parse(data);
@@ -160,6 +160,19 @@ Column footer summary configuration
160160
| **field** | `string` | optional | Field to aggregate (defaults to the column field) |
161161

162162

163+
---
164+
165+
## EmptyState
166+
167+
### Properties
168+
169+
| Property | Type | Required | Description |
170+
| :--- | :--- | :--- | :--- |
171+
| **title** | `string \| Record<string, string>` | optional | Heading of the empty state |
172+
| **message** | `string \| Record<string, string>` | optional | Line of text below the heading |
173+
| **icon** | `string` | optional | Icon name drawn above the heading; a name that resolves to no icon draws the default empty-state glyph |
174+
175+
163176
---
164177

165178
## FormButtonConfig
@@ -1128,9 +1141,9 @@ View filter rule
11281141

11291142
| Property | Type | Required | Description |
11301143
| :--- | :--- | :--- | :--- |
1131-
| **title** | `string \| Record<string, string>` | optional | Display label — the default-language string, or an inline locale map (`{ en, "zh-CN" }`) resolved at render time |
1132-
| **message** | `string \| Record<string, string>` | optional | Display label — the default-language string, or an inline locale map (`{ en, "zh-CN" }`) resolved at render time |
1133-
| **icon** | `string` | optional | |
1144+
| **title** | `string \| Record<string, string>` | optional | Heading of the empty state |
1145+
| **message** | `string \| Record<string, string>` | optional | Line of text below the heading |
1146+
| **icon** | `string` | optional | Icon name drawn above the heading; a name that resolves to no icon draws the default empty-state glyph |
11341147

11351148
### Nested Shape: `ListView.aria`
11361149

@@ -1511,9 +1524,9 @@ View filter rule
15111524

15121525
| Property | Type | Required | Description |
15131526
| :--- | :--- | :--- | :--- |
1514-
| **title** | `string \| Record<string, string>` | optional | Display label — the default-language string, or an inline locale map (`{ en, "zh-CN" }`) resolved at render time |
1515-
| **message** | `string \| Record<string, string>` | optional | Display label — the default-language string, or an inline locale map (`{ en, "zh-CN" }`) resolved at render time |
1516-
| **icon** | `string` | optional | |
1527+
| **title** | `string \| Record<string, string>` | optional | Heading of the empty state |
1528+
| **message** | `string \| Record<string, string>` | optional | Line of text below the heading |
1529+
| **icon** | `string` | optional | Icon name drawn above the heading; a name that resolves to no icon draws the default empty-state glyph |
15171530

15181531
### Nested Shape: `ObjectListView.aria`
15191532

‎packages/spec/api-surface/ui.json‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@
175175
"ElementRepeaterPropsSchema (const)",
176176
"ElementTextInputPropsSchema (const)",
177177
"ElementTextPropsSchema (const)",
178+
"EmptyState (type)",
179+
"EmptyStateSchema (const)",
178180
"ExpandViewResult (interface)",
179181
"ExpandedViewItem (interface)",
180182
"ExpressionBindableTextKey (type)",

‎packages/spec/authorable-surface/ui.json‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,9 @@
515515
"ui/ElementTextProps:aria",
516516
"ui/ElementTextProps:content",
517517
"ui/ElementTextProps:variant",
518+
"ui/EmptyState:icon",
519+
"ui/EmptyState:message",
520+
"ui/EmptyState:title",
518521
"ui/FormButtonConfig:label",
519522
"ui/FormButtonConfig:show",
520523
"ui/FormField:colSpan",
@@ -870,12 +873,15 @@
870873
"ui/ObjectGridProps:data",
871874
"ui/ObjectGridProps:defaultFilters",
872875
"ui/ObjectGridProps:defaultSort [RETIRED]",
876+
"ui/ObjectGridProps:description",
873877
"ui/ObjectGridProps:editable",
878+
"ui/ObjectGridProps:emptyState",
874879
"ui/ObjectGridProps:exportOptions",
875880
"ui/ObjectGridProps:fields",
876881
"ui/ObjectGridProps:filter",
877882
"ui/ObjectGridProps:frozenColumns",
878883
"ui/ObjectGridProps:grouping",
884+
"ui/ObjectGridProps:keyboardNavigation",
879885
"ui/ObjectGridProps:label",
880886
"ui/ObjectGridProps:navigation",
881887
"ui/ObjectGridProps:objectName",

‎packages/spec/declaration-map/ui.json‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@
114114
"ElementRepeaterPropsSchema": "ui/ElementRepeaterProps",
115115
"ElementTextInputPropsSchema": "ui/ElementTextInputProps",
116116
"ElementTextPropsSchema": "ui/ElementTextProps",
117+
"EmptyState": "ui/EmptyState",
118+
"EmptyStateSchema": "ui/EmptyState",
117119
"ExpressionBindableTextKey": "ui/ExpressionBindableTextKey",
118120
"ExpressionBindableTextKeySchema": "ui/ExpressionBindableTextKey",
119121
"FormButtonConfig": "ui/FormButtonConfig",

‎packages/spec/export-origins/ui.json‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@
171171
"ElementRepeaterPropsSchema": "src/ui/component.zod.ts#ElementRepeaterPropsSchema (const)",
172172
"ElementTextInputPropsSchema": "src/ui/component.zod.ts#ElementTextInputPropsSchema (const)",
173173
"ElementTextPropsSchema": "src/ui/component.zod.ts#ElementTextPropsSchema (const)",
174+
"EmptyState": "src/ui/view.zod.ts#EmptyState (type)",
175+
"EmptyStateSchema": "src/ui/view.zod.ts#EmptyStateSchema (const)",
174176
"ExpandViewResult": "src/ui/view.zod.ts#ExpandViewResult (interface)",
175177
"ExpandedViewItem": "src/ui/view.zod.ts#ExpandedViewItem (interface)",
176178
"ExpressionBindableTextKey": "src/ui/expression-bindable-text-keys.zod.ts#ExpressionBindableTextKey (type)",

‎packages/spec/json-schema.manifest/ui.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
"ui/ElementRepeaterProps",
6464
"ui/ElementTextInputProps",
6565
"ui/ElementTextProps",
66+
"ui/EmptyState",
6667
"ui/ExpressionBindableTextKey",
6768
"ui/FormButtonConfig",
6869
"ui/FormField",

0 commit comments

Comments
 (0)