Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .changeset/tall-maps-declare.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
---
'@objectstack/spec': minor
---

Add the `map` visualization config block to `ListViewSchema` — the eighth
per-visualization block, alongside kanban / calendar / gantt / gallery /
timeline / chart / tree. `ListMapConfigSchema` (named like
`ListChartConfigSchema`, because the automation `map` flow node already exports
`MapConfigSchema`) declares the map renderer's documented read surface:
`latitudeField`, `longitudeField`, `locationField`, `titleField`,
`descriptionField`, `zoom` (1-20), `center` (`[latitude, longitude]`). All keys
are optional and none carries a default — when no camera is declared the
renderer fits the camera to the queried records. Before this block a
`type: 'map'` list view could not declare its field mapping at all
(`ListViewSchema` is strict), so a marker title field other than the renderer
default `name` was unreachable — the showcase task map rendered every marker
title as `undefined`. The showcase task map view now declares
`map: { titleField: 'title', locationField: 'location' }`.
10 changes: 5 additions & 5 deletions content/docs/references/index.mdx
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
---
title: Protocol Reference
description: Every schema published by @objectstack/spec — 1584 schemas across 14 protocol modules
description: Every schema published by @objectstack/spec — 1585 schemas across 14 protocol modules
---

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

---

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

## UI Protocol

**Source:** `packages/spec/src/ui/` · **Import:** `@objectstack/spec/ui` · **16 pages, 160 schemas**
**Source:** `packages/spec/src/ui/` · **Import:** `@objectstack/spec/ui` · **16 pages, 161 schemas**

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

Expand All@@ -385,7 +385,7 @@ Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI lay
| [`responsive.zod.ts`](/docs/references/ui/responsive) | `BreakpointColumnMap`, `BreakpointName`, `BreakpointOrderMap`, `ResponsiveConfig`, `ResponsiveStyles`, `StyleMap` |
| [`sharing.zod.ts`](/docs/references/ui/sharing) | `SharingConfig` |
| [`theme.zod.ts`](/docs/references/ui/theme) | `BorderRadius`, `ColorPalette`, `Shadow`, `Theme`, `ThemeMode`, `Typography` |
| [`view.zod.ts`](/docs/references/ui/view) | `AddRecordConfig`, `AppearanceConfig`, `CalendarConfig`, `ColumnPrefix`, `ColumnSummary`, `ColumnSummaryConfig`, `FormButtonConfig`, `FormField`, `FormFieldPublicPicker`, `FormSection`, `FormView`, `GalleryConfig`, `GanttConfig`, `GanttQuickFilter`, `GroupingConfig`, `GroupingField`, `HttpMethodSubset`, `HttpRequest`, `KanbanConfig`, `ListChartConfig`, `ListColumn`, `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` |
| [`view.zod.ts`](/docs/references/ui/view) | `AddRecordConfig`, `AppearanceConfig`, `CalendarConfig`, `ColumnPrefix`, `ColumnSummary`, `ColumnSummaryConfig`, `FormButtonConfig`, `FormField`, `FormFieldPublicPicker`, `FormSection`, `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` |

---

Expand Down
25 changes: 23 additions & 2 deletions content/docs/references/ui/view.mdx
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,8 +15,8 @@ Migrated to [shared/http.zod.ts](/docs/references/shared/http). Re-exported here
## TypeScript Usage

```typescript
import { AddRecordConfigSchema, AppearanceConfigSchema, CalendarConfigSchema, ColumnPrefixSchema, ColumnSummarySchema, ColumnSummaryConfigSchema, FormButtonConfigSchema, FormFieldSchema, FormFieldPublicPickerSchema, FormSectionSchema, FormViewSchema, GalleryConfigSchema, GanttConfigSchema, GanttQuickFilterSchema, GroupingConfigSchema, GroupingFieldSchema, HttpMethodSubsetSchema, HttpRequestSchema, KanbanConfigSchema, ListChartConfigSchema, ListColumnSchema, 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';
import type { AddRecordConfig, AppearanceConfig, CalendarConfig, ColumnPrefix, ColumnSummary, ColumnSummaryConfig, FormButtonConfig, FormField, FormFieldPublicPicker, FormSection, FormView, GalleryConfig, GanttConfig, GanttQuickFilter, GroupingConfig, HttpMethodSubset, HttpRequest, KanbanConfig, ListChartConfig, ListColumn, 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';
import { AddRecordConfigSchema, AppearanceConfigSchema, CalendarConfigSchema, ColumnPrefixSchema, ColumnSummarySchema, ColumnSummaryConfigSchema, FormButtonConfigSchema, FormFieldSchema, FormFieldPublicPickerSchema, FormSectionSchema, 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';
import type { AddRecordConfig, AppearanceConfig, CalendarConfig, ColumnPrefix, ColumnSummary, ColumnSummaryConfig, FormButtonConfig, FormField, FormFieldPublicPicker, FormSection, 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';

// Validate data
const result = AddRecordConfigSchema.parse(data);
Expand DownExpand Up@@ -456,6 +456,25 @@ List chart view configuration
| **action** | `string` | optional | Registered Action ID to execute when clicked |


---

## ListMapConfig

Map view configuration

### Properties

| Property | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| **latitudeField** | `string` | optional | Field providing the marker latitude (used with longitudeField) |
| **longitudeField** | `string` | optional | Field providing the marker longitude (used with latitudeField) |
| **locationField** | `string` | optional | Field providing a combined location — a "lat,lng" string or a `{ lat, lng }` object — as the alternative to the latitudeField/longitudeField pair |
| **titleField** | `string` | optional | Field displayed as the marker title (popup heading, mobile record card, and what the map search box matches on) |
| **descriptionField** | `string` | optional | Field displayed as the marker description |
| **zoom** | `number` | optional | Initial zoom level (1-20). Omit to let the renderer fit the camera to the queried records |
| **center** | `any[]` | optional | Initial camera center as [latitude, longitude]. Omit to let the renderer fit the camera to the queried records |


---

## ListView
Expand DownExpand Up@@ -485,6 +504,7 @@ List chart view configuration
| **gallery** | `{ coverField?: string; coverFit?: Enum<'cover' \| 'contain'>; cardSize?: Enum<'small' \| 'medium' \| 'large'>; titleField?: string; … }` | optional | Gallery/card view configuration |
| **timeline** | `{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … }` | optional | Timeline view configuration |
| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | List chart view configuration |
| **map** | `{ latitudeField?: string; longitudeField?: string; locationField?: string; titleField?: string; … }` | optional | Map configuration — applies when the view renders as a map layout |
| **tree** | `{ parentField?: string; labelField?: string; fields?: string[]; defaultExpandedDepth?: integer } & Record<string, any>` | optional | Tree/hierarchy configuration — applies when the view renders as a tree layout |
| **description** | `string \| Record<string, string>` | optional | View description for documentation/tooltips |
| **sharing** | `{ type?: Enum<'personal' \| 'collaborative'>; lockedBy?: string }` | optional | View sharing and access configuration |
Expand DownExpand Up@@ -573,6 +593,7 @@ List chart view configuration
| **gallery** | `{ coverField?: string; coverFit?: Enum<'cover' \| 'contain'>; cardSize?: Enum<'small' \| 'medium' \| 'large'>; titleField?: string; … }` | optional | Gallery/card view configuration |
| **timeline** | `{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … }` | optional | Timeline view configuration |
| **chart** | `{ chartType?: Enum<'bar' \| 'line' \| 'pie' \| 'area' \| 'scatter'>; dataset: string; dimensions?: string[]; values: string[] }` | optional | List chart view configuration |
| **map** | `{ latitudeField?: string; longitudeField?: string; locationField?: string; titleField?: string; … }` | optional | Map configuration — applies when the view renders as a map layout |
| **tree** | `{ parentField?: string; labelField?: string; fields?: string[]; defaultExpandedDepth?: integer } & Record<string, any>` | optional | Tree/hierarchy configuration — applies when the view renders as a tree layout |
| **description** | `string \| Record<string, string>` | optional | View description for documentation/tooltips |
| **sharing** | `{ type?: Enum<'personal' \| 'collaborative'>; lockedBy?: string }` | optional | View sharing and access configuration |
Expand Down
16 changes: 8 additions & 8 deletions docs/audits/2026-07-unknown-key-strictness-ledger.counts.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,7 +21,7 @@ regenerate.
| Measure | Value |
|---|---|
| Triaged directories | 5 |
| Object sites in them | 440 |
| Object sites in them | 441 |
| Still-open (strip) sites | 123 |
| Files carrying at least one | 22 |

Expand All@@ -44,12 +44,12 @@ The `strict` column is the one the campaign schedules against; it counts both th

| Dir | Sites | strict | passthrough | catchall | strip |
|---|---|---|---|---|---|
| `ui/` | 174 | 163 | 5 | 0 | 6 |
| `ui/` | 175 | 164 | 5 | 0 | 6 |
| `data/` | 154 | 72 | 1 | 0 | 81 |
| `automation/` | 65 | 42 | 0 | 0 | 23 |
| `security/` | 20 | 7 | 0 | 0 | 13 |
| `studio/` | 27 | 27 | 0 | 0 | 0 |
| **total** | **440** | **311** | **6** | **0** | **123** |
| **total** | **441** | **312** | **6** | **0** | **123** |

## File-level triage — site counts

Expand All@@ -75,9 +75,9 @@ classify and is not listed (it becomes reportable the day it grows its first sit
| `responsive.zod.ts` | 4 |
| `sharing.zod.ts` | 1 |
| `theme.zod.ts` | 6 |
| `view.zod.ts` | 55 |
| `view.zod.ts` | 56 |
| `widget.zod.ts` | 1 |
| **total** | **174** |
| **total** | **175** |

### `data/` — sites

Expand DownExpand Up@@ -156,15 +156,15 @@ over it is here.

### `ui/` — open

**6 strip of 174**, in 4 file(s).
**6 strip of 175**, in 4 file(s).

| File | Strip | Sites |
|---|---|---|
| `action-params.zod.ts` | 1 | 1 |
| `app.zod.ts` | 1 | 18 |
| `view.zod.ts` | 3 | 55 |
| `view.zod.ts` | 3 | 56 |
| `widget.zod.ts` | 1 | 1 |
| **total** | **6** | **174** |
| **total** | **6** | **175** |

| Bucket | Sites |
|---|---|
Expand Down
16 changes: 12 additions & 4 deletions examples/app-showcase/src/ui/views/task.view.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -41,10 +41,12 @@ export const TaskViews = defineView({
// and lives as its own named view + dashboard element).
appearance: {
// The six record-based visualizations the spec + runtime switcher support
// out of the box: the SAME task records re-shaped on demand. (map needs a
// spec MapConfigSchema the ListViewSchema doesn't yet have, and chart
// aggregates a dataset rather than records — both live as their own named
// views below instead of in this switcher.)
// out of the box: the SAME task records re-shaped on demand. (map has a
// spec block since #9340 — `ListMapConfigSchema`, declared on the named
// map view below — but stays out of this switcher until the objectui
// renderer consumes the declared `view.map` surface (its follow-up card);
// chart aggregates a dataset rather than records — both live as their own
// named views below instead of in this switcher.)
allowedVisualizations: ['grid', 'kanban', 'gallery', 'calendar', 'timeline', 'gantt'],
},

Expand DownExpand Up@@ -308,6 +310,12 @@ export const TaskViews = defineView({
type: 'map',
data,
columns: ['title', 'location', 'assignee'],
// #9340: showcase_task has `title`, not `name` — without this declared
// block the renderer's titleField default of 'name' left every marker
// title undefined (empty popup heading / mobile card, search matched
// nothing). locationField matches the renderer default; declared anyway
// so the binding is explicit rather than coincidental.
map: { titleField: 'title', locationField: 'location' },
},

// 8 ── Chart ────────────────────────────────────────────────────────
Expand Down
2 changes: 2 additions & 0 deletions packages/spec/api-surface/ui.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -209,6 +209,8 @@
"ListColumn (type)",
"ListColumnParsed (type)",
"ListColumnSchema (const)",
"ListMapConfig (type)",
"ListMapConfigSchema (const)",
"ListView (type)",
"ListViewParsed (type)",
"ListViewSchema (const)",
Expand Down
9 changes: 9 additions & 0 deletions packages/spec/authorable-surface/ui.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -627,6 +627,13 @@
"ui/ListColumn:type",
"ui/ListColumn:width",
"ui/ListColumn:wrap",
"ui/ListMapConfig:center",
"ui/ListMapConfig:descriptionField",
"ui/ListMapConfig:latitudeField",
"ui/ListMapConfig:locationField",
"ui/ListMapConfig:longitudeField",
"ui/ListMapConfig:titleField",
"ui/ListMapConfig:zoom",
"ui/ListView:addRecord",
"ui/ListView:allowPrinting",
"ui/ListView:appearance",
Expand All@@ -653,6 +660,7 @@
"ui/ListView:inlineEdit",
"ui/ListView:kanban",
"ui/ListView:label",
"ui/ListView:map",
"ui/ListView:name",
"ui/ListView:navigation",
"ui/ListView:pagination",
Expand DownExpand Up@@ -814,6 +822,7 @@
"ui/ObjectListView:inlineEdit",
"ui/ObjectListView:kanban",
"ui/ObjectListView:label",
"ui/ObjectListView:map",
"ui/ObjectListView:name",
"ui/ObjectListView:navigation",
"ui/ObjectListView:pagination",
Expand Down
2 changes: 2 additions & 0 deletions packages/spec/export-origins/ui.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -209,6 +209,8 @@
"ListColumn": "src/ui/view.zod.ts#ListColumn (type)",
"ListColumnParsed": "src/ui/view.zod.ts#ListColumnParsed (type)",
"ListColumnSchema": "src/ui/view.zod.ts#ListColumnSchema (const)",
"ListMapConfig": "src/ui/view.zod.ts#ListMapConfig (type)",
"ListMapConfigSchema": "src/ui/view.zod.ts#ListMapConfigSchema (const)",
"ListView": "src/ui/view.zod.ts#ListView (type)",
"ListViewParsed": "src/ui/view.zod.ts#ListViewParsed (type)",
"ListViewSchema": "src/ui/view.zod.ts#ListViewSchema (const)",
Expand Down
1 change: 1 addition & 0 deletions packages/spec/json-schema.manifest/ui.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -83,6 +83,7 @@
"ui/KanbanConfig",
"ui/ListChartConfig",
"ui/ListColumn",
"ui/ListMapConfig",
"ui/ListView",
"ui/NavigationArea",
"ui/NavigationConfig",
Expand Down
Loading
Loading