@object-ui/plugin-timeline 17.6.0 → 18.0.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,2744 @@
1
1
  # @object-ui/plugin-timeline
2
2
 
3
+ ## 18.0.0
4
+
5
+ ### Dependency floors
6
+
7
+ Computed from `.objectstack-sha` `06cab4849a8a`: the earliest published `@objectstack/spec` that contains it is `18.0.0`.
8
+
9
+ - `@objectstack/spec` (`dependencies`): `^18.0.0-next.1` → `^18.0.0`
10
+
11
+ ### Major Changes
12
+
13
+ - 6f3299f: objectui moves to major 18, following `@objectstack/*` from 17 to 18 (objectui#12334). objectui's major is not a count of its own breaking changes: it tracks the major of the `@objectstack/spec` its packages depend on, so that the same major means compatible across the two projects. These packages already declare `@objectstack/*` on the 18 line (objectui#12030), so every package in the fixed release group crosses to 18 together. It is the one `major` that rule admits: objectui's own breaking changes ship as `minor`, described in their entries.
14
+
15
+ The 18 line is released from Changesets pre mode on the `next` tag (`.changeset/pre.json`), as `@objectstack/*` 18 is: these releases are `18.0.0-next.N` on the npm `next` dist-tag, and they do not move `latest`. The first `18.0.0` on `latest` comes when `@objectstack` 18 is generally available and this repository leaves pre mode.
16
+
17
+ What a consumer must do to take it is in the `@objectstack/*` 18 entry of this release (objectui#12030): move its own `@objectstack/*` packages to the 18 line at the same time.
18
+
19
+ ### Minor Changes
20
+
21
+ - 9ca3cac: The calendar and the timeline start the week on the first day of the week of the user's locale (objectui#11675), instead of a fixed Sunday (calendar) and a fixed Monday (timeline). Under `en-US` both start on Sunday; under `en-GB` or `zh-CN` both start on Monday; under `ar-EG` both start on Saturday. There is no separate week-start setting: the first day comes from the locale the dates are already formatted with.
22
+
23
+ - **`@object-ui/i18n` exports `firstDayOfWeek(locale)` and its `WeekdayIndex` type.** It returns the first day of the week for a BCP-47 tag, numbered as `Date.prototype.getDay` numbers weekdays (0 is Sunday), which is also what react-day-picker's `weekStartsOn` takes. It reads the engine's `Intl.Locale` week info (`getWeekInfo()`, else the `weekInfo` accessor), including a `-u-fw-` keyword on the tag. Where the engine has neither, it reads CLDR's first-day table by the tag's region, or the region CLDR's likely subtags give it (`en` reads `US`, `zh` reads `CN`), and a region the table does not list reads Monday, CLDR's world default. A malformed tag throws the same `RangeError` that formatting a date with it would.
24
+ - **The calendar's weeks start on the locale's first day.** `CalendarView` (and `object-calendar` through it) reads the first day from its `locale` prop, else the display locale, and the month grid's rows, its weekday heads, the week view's columns, the header's week range, the day a span that wraps into a new row shows its title on, and the header's date popover all start there. The popover used to take date-fns's own week start for the tag, which is not CLDR's for every tag (date-fns reads `es-MX` as `es`, a Monday start, where CLDR starts Mexico's week on Sunday) and which read Sunday until the date-fns locale had loaded.
25
+ - **The object timeline's "This week" and "Next week" start on the display locale's first day.** The bucket bounds are also stepped on the local calendar now, so across a DST change the day after it is "Tomorrow" again, and the first day of next week no longer falls into "This week".
26
+
27
+ A host that relied on the calendar always starting on Sunday, or on the timeline's week always starting on Monday, now sees the locale's first day. The gantt variant's `week` axis is unchanged: it still counts plan weeks from the axis's first day.
28
+ - c910630: The timeline's unused "Overdue" bucket label is removed: `timeline.bucket.overdue` is gone from all ten language packs and from the timeline's built-in English defaults (objectui#11676).
29
+
30
+ Nothing has read the key since a past date on a timeline went under "Earlier". No timeline heads a group "Overdue": a date is overdue only when it is a due date and the record is still open, and a timeline declares neither fact. Overdue records are still marked where record state lives: the date cell's due treatment, the gantt's alert colour and conditional formatting.
31
+
32
+ **Narrowed public surface (`@object-ui/i18n`).** The exported `en` pack and the `TranslationKeys` type derived from it lose one member, `timeline.bucket.overdue`. Code that reads `en.timeline.bucket.overdue`, or passes that key to `t()` expecting a translation, has to drop it. This is released as `minor` under objectui's version policy, which keeps the major aligned with `@objectstack`. The date cell's "Overdue 3d" phrase is a different key, `fields.relativeDate.overdue`, and stays in every pack.
33
+ - ce464d9: An object-bound timeline no longer heads every past date "Overdue": a day before today goes under a neutral "Earlier" bucket, translated in every language (objectui#11676).
34
+
35
+ Without a `groupByField`, `ObjectTimeline` groups its entries into date buckets, and every day before today went under "Overdue", whatever the date meant. The showcase's Activity Timeline, bound to `created_at`, put all ten tasks under "Overdue", the two Done ones included. A creation date cannot be overdue, and a closed record cannot be either.
36
+
37
+ "Overdue" needs two facts: that the date is a due date, and that the record is still open. Nothing the timeline reads declares either one. The timeline configuration (`startDateField`, `endDateField`, `titleField`, `groupByField`, `colorField`, `scale`) names no due-date role, and no field option marks a closed state. So a past day is now "Earlier", and the timeline does not guess either fact from a field name or a status value. Today, Tomorrow, This week, Next week, Later and No date are unchanged.
38
+
39
+ **Widened public surface (`@object-ui/i18n`).** One new key in all ten language packs, `timeline.bucket.earlier`, so the exported `en` pack and the `TranslationKeys` type derived from it gain one member. The timeline no longer reads `timeline.bucket.overdue`, and this release also removes that key from every pack (the "Overdue" bucket label retirement entry). No component prop or exported type changes.
40
+ - c5406c2: Depend on the `@objectstack/*` 18 prerelease line (objectui#12030).
41
+
42
+ Every `@objectstack/*` range these packages declare in `dependencies` or `peerDependencies` moves from `^17.x` to `^18.0.0-next.0`, the `next` prerelease of `@objectstack/*` 18 (raised to `^18.0.0-next.1` by objectui#12370 before release).
43
+
44
+ **Breaking for consumers:** an install that resolves `@objectstack/spec` (or `@objectstack/client`, `@objectstack/formula`, `@objectstack/lint`) 17.x no longer satisfies these ranges. A consumer must move its own `@objectstack/*` packages to the 18 line, starting with `18.0.0-next.1` (objectui#12370), at the same time as it takes this release.
45
+
46
+ **objectui's own surface moves with it:**
47
+
48
+ - `element:record_picker`'s registration stops publishing the `object`, `filter`, `sort` and `limit` inputs, which spec 18 retires; a JSX page that writes one now gets `unknown-prop`.
49
+ - The `CapabilityMultiSelectField` widget's curated capability set (`@object-ui/fields`) follows spec 18: `manage_mailboxes` in, `manage_org_presentation` out.
50
+ - `element:number` and `element:repeater` nodes that bind no object are accepted, as spec 18's row and `PageComponentSchema` accept them; the two `ELEMENT_*_OBJECT_REQUIRED` refusals are gone.
51
+
52
+ **Retired with the spec:** `@objectstack/spec` 18 tombstones `object-grid`'s `defaultFilters` and refuses it by name, and `ObjectGrid` and `ObjectView` stop reading it (`table.defaultFilters` on an `object-view` included). A view that still carries it renders unfiltered: rename the key to `filter`, whose value is the same rule array.
53
+ - ff9df88: Depend on `@objectstack/*` `18.0.0-next.1` (objectui#12370).
54
+
55
+ Every `@objectstack/*` range these packages declare moves from `^18.0.0-next.0` to `^18.0.0-next.1`; the console and the runner bundle `18.0.0-next.1`. A consumer moves its own `@objectstack/*` packages to `18.0.0-next.1` with this release.
56
+
57
+ **Accept sets that narrow with it.** `@object-ui/types` validates page action rows and view data bindings through the spec's own rows, so its faces (`safeValidateSchema` and `StrictAnyComponentSchema`) now refuse what `18.0.0-next.1` refuses. Each was accepted on `18.0.0-next.0`:
58
+
59
+ - `onSuccess` on an `action:button` / `action:icon` row, or an `action:group` / `action:menu` member, whose executor is the `url`, `navigation`, `modal`, `flow` or `form` built-in, or that has no executor at all. Write the hop on an `api` or `script` action (or a host handler name), or drop it.
60
+ - `onSuccess` beside `operation: 'update'`, and an `onSuccess` block carrying a key outside `{ navigate, openIn }`.
61
+ - `actionType: 'navigation'` on a row (and `type: 'navigation'` on a container member): write `'url'`.
62
+ - A `url` executor's `target` that is not openable, judged on the executor the runner runs, including a row whose `name` selects it.
63
+ - A view `data` binding with `provider: 'api'`: bind the object or static rows; an API call is the page element's binding.
64
+ - 3fd8625: feat(plugin-list)!: the renderers stop reading the list-view keys every door refuses: the pre-#2231 aliases, `calendar.defaultView`, and the undeclared keys a per-kind block carries (objectui#6152, round 14)
65
+
66
+ Clause-②: no
67
+
68
+ **Changed (breaking for a stored view that carries a refused key).** Rounds 11 and 12 of
69
+ objectui#6152 closed the doors: `@object-ui/types`, `objectui validate` and `@objectstack/spec`'s
70
+ view write door refuse these keys on a list view's per-kind blocks, top-level and under the legacy
71
+ `options` bag. The renderers kept reading them, so a view stored before the doors closed still
72
+ rendered as written. They no longer read them, on every route that did: `normalizeListViewSchema`
73
+ (`@object-ui/core`), which folded the four aliases onto their spec keys before anything else read
74
+ the view, `ListView`, the object page's relay (`@object-ui/app-shell`), `ObjectView`'s own views
75
+ (`@object-ui/plugin-view`) and `ObjectTimeline`. A stored view that carries one of these keys still renders, without what the key
76
+ used to bind. Write the spec's key instead:
77
+
78
+ | stored key (either nesting) | what renders now | write instead |
79
+ | :--- | :--- | :--- |
80
+ | `kanban.groupField` | lanes as for a view that names none: the object's declared lifecycle field (`status` on an `object-view` element's own views) | `kanban.groupByField` |
81
+ | `kanban.cardFields` | cards show `kanban.columns`, or the view's own fields | `kanban.columns` |
82
+ | `gallery.imageField` | no cover binding: `ObjectGallery` tries `image`, and the Gallery view is not offered | `gallery.coverField` |
83
+ | `timeline.dateField`, and `calendar.dateField` read as a timeline axis | no timeline axis: the timeline's refusal names the keys to write, and the Timeline view is not offered | `timeline.startDateField` (or `calendar.startDateField`) |
84
+ | `calendar.defaultView` | the calendar opens on its own default view | nothing on a list view: the initial mode is the `object-calendar` element's flat `defaultView` |
85
+ | `kanban.swimlaneField` and any other undeclared kanban key | not drawn | nothing: the spec's kanban block has no swimlane |
86
+ | `tree.titleField` | the tree labels by `name` | `tree.labelField` |
87
+ | an undeclared key under `calendar`, `tree` or `gantt`, or anything under `options.grid` | not forwarded to the view | the block's declared key, or a top-level key of the view for a grid |
88
+
89
+ The declared keys keep their route: `kanban.summarizeField`, `calendar.colorField` and
90
+ `calendar.allDayField` are now read by name where the removed spreads used to carry them, and every
91
+ `gantt` key the spec declares reaches the gantt through a typed table that `tsc` keeps total. A
92
+ block key named like a node key (`objectName`, `filter`) can no longer override the node's own
93
+ value. `ListView`'s projection collectors stop asking the server for the fields these keys named.
94
+
95
+ **Not measured: production.** The census before this change (objectui#6152 round 13) found no
96
+ writer and no stored row carrying these keys in any repository corpus a seat can reach, with
97
+ positive controls; stored view and page metadata in deployments was not measured. A row that
98
+ carries one of these keys renders as the table says until it is re-saved with the key on the
99
+ right.
100
+
101
+ Not in this change: the legacy chart axes (`chart.xAxisField`, `yAxisFields`, `categoryField`,
102
+ `valueField`, `aggregation`), which `ListView` still reads until the next round on objectui#6152.
103
+
104
+ - `@object-ui/core`: `normalizeListViewSchema` returns a view whose only legacy vocabulary is one of
105
+ these nested aliases by reference, with the alias in place; it no longer removes it either.
106
+ - `@object-ui/types`: the refusal messages of these keys no longer say a stored view still renders
107
+ through the alias, and the kanban `groupBy` refusal no longer suggests the refused `groupField`.
108
+
109
+ **Note added 2026-10-09 (objectui#6152 round 15):** the legacy chart axes are no longer read either.
110
+ `ListView`, the object page and `ObjectView`'s own views read no `xAxisField`, `yAxisFields`,
111
+ `categoryField`, `valueField` or `aggregation` on a chart block, so a chart view that names no
112
+ `dataset` binds nothing and `ObjectChart` refuses it on screen; see
113
+ `.changeset/6152-list-view-legacy-chart-retired.md`.
114
+ - b403bb3: **`BaseSchema` no longer declares `[key: string]: any`** (objectui#8347, executing the objectui#7927 ruling: the TypeScript face is a contract). Every node type extends `BaseSchema`, so a node literal annotated with its node type now refuses a key that no declaration names, a misspelled key included, where it used to type it `any`. The correct spelling compiles as before.
115
+
116
+ **Clause-②: yes (narrowing)**, shipped as `minor` per this repository's version policy. The removal narrows the TypeScript authoring face of every node type; the `visibleWhen` change below widens both faces to the envelope the spec's own parse writes.
117
+
118
+ - **What does not move.** The zod faces keep their accept sets for every key but `visibleWhen`: the tolerant mirror is still `.passthrough()`, so `safeValidateSchema` keeps an undeclared key, and the derived strict face refuses it as before. `ComponentRendererProps`, the renderer props type, keeps its own index signature. Nothing a renderer draws changes.
119
+ - **The bound.** TypeScript runs its excess-property check only on a fresh object literal. A value that reached its annotation through a variable of a wider type is not re-checked.
120
+ - **`PartialSchema<T>` works as written.** With the signature gone, `keyof T` is the literal member union again, so the alias keeps `T`'s declared members, optional, with `type` required. While the signature stood it declared `type` alone (objectui#6397).
121
+ - **`BaseSchema.visibleWhen` is the spec's `EvaluatedExpressionInput`**, by reference: a predicate string, or the `{ dialect, source }` envelope. The zod twin takes `EvaluatedExpressionInputSchema`'s verdict without its transform, so a string parses to itself. A dialect-less envelope, an unknown dialect and a blank predicate are refused, as the spec refuses them. Both faces read `string` before, which refused the envelope a spec parse writes into this key.
122
+ - **`@object-ui/plugin-kanban`.** `ObjectKanban` reads the `sort` the element data-source gate writes through a read type private to the package. `ObjectKanbanSchema` still declares no `sort` (objectui#8174). Nothing drawn changes.
123
+ - **`@object-ui/plugin-timeline`.** `TimelineRenderSchema`, the `schema` prop type of the exported `TimelineRenderer`, gains one optional member: the `onItemClick` slot `ObjectTimeline` composes. That is a one-member optional widening of an exported prop type. `TimelineSchema`, the authoring face, still declares no `onItemClick`. Nothing drawn changes.
124
+
125
+ **Migration.** Where a literal stops compiling, the key is misspelled (fix it) or not declared on that node type (declare it on the type that reads it, by reference to the `@objectstack/spec` row, or remove it). Do not cast past the error. `props`, the legacy alias of `properties`, is not declared on the TypeScript face; the renderer still reads it, so write `properties`.
126
+
127
+ ### Patch Changes
128
+
129
+ - c0862c1: The `object-gantt` `markers` input and the `object-timeline` `items` and `mapping` inputs open their descriptions with the `@objectstack/spec` 17.7.0 row's own describe text, which is true of these renderers (objectui#11168's rule, followed at objectui#11717). The renderer-specific sentences after it are unchanged.
130
+ - 206505c: An object timeline with a `groupByField` draws one group per value, headed by the value's display name (objectui#12104).
131
+
132
+ - **A lookup groups by the referenced record's name.** The timeline's own query expands every declared relation, so a lookup value arrives as the related record, and the group header used to read "[object Object]" for every row: a timeline grouped by an owner or an account drew one group. The group key now reads the field's display value through the same resolver the entry title and description use. A select field still groups by its option's label. An empty value groups under "Unassigned", and when no row has a display value the timeline keeps its date buckets. A lookup that arrives unexpanded groups under its id, which is what the title shows for it too.
133
+ - **A key's rows are gathered into one group.** Entries are sorted by start date, and a group used to end wherever the next entry had another value, so a field whose values alternate in date order (a channel, say) drew the same header many times. Each value now heads exactly one group. Groups appear in the order of their earliest entry, and entries stay in date order inside each group, so a timeline whose values were already contiguous renders as before.
134
+
135
+ Unchanged: a timeline with no `groupByField` (its date buckets), the horizontal timeline, which draws no groups and keeps its date order, and the group key of a multi-valued field (a multiselect, tags, or a lookup with `multiple`), which reads as before. Nothing is added to the package entry: no export, prop or language-pack key.
136
+ - 1e6d83b: Data-bound blocks title their "data source could not be resolved" panel in the page's language (objectui#12920, the family of objectui#12910). The panel shows when a block's `dataSource.view` names a view its object does not have. Each block's title now reads `@object-ui/i18n` through `useObjectTranslation`, with the `en` pack's value as the inline default, so a page with no `I18nProvider` draws the same English it drew before.
137
+
138
+ - **Plugin blocks.** `object-calendar`, `object-chart`, `object-metric`, `object-pivot`, `detail-view`, `record:related_list`, `object-form`, `embeddable-form`, `object-master-detail-form`, `record:line_items`, `object-gantt`, `object-grid`, `object-kanban`, `list-view`, `object-map` and `object-timeline` read one `element.KIND.sourceUnresolved` key per block kind. `object-metric` reads `element.number.sourceUnresolved`, the key `element:number` already reads for the same sentence. The three forms share `element.form.sourceUnresolved`. `record:related_list`'s panel for a failed `parentDataSource` read reads `element.relatedList.parentUnreadable` ("This related list’s parent record could not be read").
139
+ - **`@object-ui/react` panel defaults.** `ElementDataSourceErrorPanel` with no `title` reads `element.component.sourceUnresolved`, and `NoDataSourcePanel` with no `title` reads `element.component.noDataSource`. A passed `title` still wins, an empty string included. Props and markup do not change.
140
+
141
+ Clause-②: yes
142
+
143
+ The new keys in `@object-ui/i18n` widen its exported `TranslationKeys`. No prop, input or export of these packages changes.
144
+ - 5d77c09: feat(types)!: a list view's legacy `options` bag is the `@objectstack/spec` list overlay's bag by reference, `ListViewTimelineConfig` is the list view's own `timeline` block, and `ListViewGalleryConfig` is retired (objectui#6152, round 12)
145
+
146
+ Clause-②: no
147
+
148
+ **Narrowed (breaking), `@object-ui/types`.** `@objectstack/spec`'s authoring list view declares no
149
+ `options` bag. Its one home is the flattened list overlay on the view write door
150
+ (`VIEW_METADATA_MEMBERS.listOverlay`), where it is a strict object of the eight kinds that name a
151
+ block, each judged by its own list-view block with every key optional. `ListViewSchema.options` was
152
+ a record of `any` with three named refusals, so `ListViewSchema`, `AnyComponentSchema`,
153
+ `safeValidateSchema` (`objectui validate`), `StrictAnyComponentSchema` and the TypeScript
154
+ `ListViewSchema['options']` accepted what that door refuses. It is now that member's own bag, taken
155
+ by reference, with this package's `kanban`, `calendar`, `gallery` and `timeline` blocks in it, so
156
+ each named refusal gives the same message under `options.KIND` as under the top-level `KIND`. What is
157
+ refused now, and what to write instead:
158
+
159
+ - A key that is not one of the eight kinds is refused with the spec's own `unrecognized_keys` at
160
+ `options`. `options.grid` gets the spec's guidance: a grid has no per-kind block, so its settings
161
+ (`columns`, `sort`, `filter`, …) are top-level keys of the view. Remove it.
162
+ - An undeclared key in any kind (for example `options.kanban.swimlaneField`,
163
+ `options.timeline.descriptionField`, `options.tree.titleField`, `options.chart.xAxisField`) is
164
+ refused with the spec's own `unrecognized_keys` at that kind. Before this change it was kept and
165
+ never examined.
166
+ - `options.kanban.groupField` is refused by name: write `groupByField`.
167
+ - `options.kanban.cardFields` is refused by name: write `columns`.
168
+ - `options.gallery.imageField` is refused by name: write `coverField`.
169
+ - `options.timeline.dateField` is refused by name: write `startDateField`.
170
+ - `options.calendar.defaultView` is refused by name: the initial view mode is a member of the
171
+ `object-calendar` element (its flat `defaultView`), not of a list view's calendar block.
172
+ - `options.chart`'s legacy axes (`xAxisField`, `yAxisFields`, `categoryField`, `valueField`,
173
+ `aggregation`) are refused: write the dataset-bound block, `chart: { dataset, dimensions, values }`.
174
+ - A value of the wrong type (for example `options.kanban: 42`, or a number where a field name
175
+ belongs) is refused at its path.
176
+
177
+ The three refusals already in place (`options.kanban.groupBy`, objectui#8365;
178
+ `options.calendar.dateField` / `endField`, objectui#8355) keep their messages, and now report
179
+ `invalid_type` at the key, as the top-level blocks do, where they reported `custom`. Each kind is
180
+ `.partial()`, as the spec's bag is: the renderer reads the bag as a per-key underlay of the top-level
181
+ block, so a required member is not asked of it.
182
+
183
+ **Changed, `@object-ui/types`.** `ListViewTimelineConfig` is `NonNullable<ListViewSchema['timeline']>`:
184
+ the spec's list-view slot, strict and `.partial()`, with the legacy `dateField` refused by name
185
+ (write `startDateField`). It was the spec's `TimelineConfig` plus `dateField?: string` and a string
186
+ index signature of `any`, so a block with any key compiled.
187
+
188
+ **Retired, `@object-ui/types`.** The `ListViewGalleryConfig` type export is gone. Nothing in this
189
+ repository used it, and the spec has no element of that shape. Write the spec's `GalleryConfig`,
190
+ which this package re-exports.
191
+
192
+ **`@object-ui/app-shell`.** The object page's relay writes the spec's spellings into the bag it hands
193
+ `ListView`: `options.kanban.columns` where it wrote `cardFields`, no `options.gallery.imageField`
194
+ beside `coverField`, and no `options.timeline.descriptionField`. What renders does not change: the
195
+ board reads `columns` for its cards, the gallery reads `coverField` first, and nothing drew the
196
+ timeline's nested `descriptionField`.
197
+
198
+ **`@object-ui/plugin-list`.** `ListView`'s capability gate also reads `options.gallery.coverField`, so
199
+ a bag binding its cover under the spec's key offers the Gallery view; it read only the legacy
200
+ `imageField` there. The README's examples author the top-level per-kind blocks and a dataset-bound
201
+ chart, and no longer show the bag.
202
+
203
+ **`@object-ui/plugin-timeline`.** `ObjectTimeline`'s nested `schema.timeline` prop takes the new
204
+ `ListViewTimelineConfig`.
205
+
206
+ What did not move: the renderers' reads. `ListView` still merges each `options.KIND` under the
207
+ top-level block and still reads the legacy spellings, so a view stored before these doors closed
208
+ renders as before; only authored metadata meets the refusal.
209
+
210
+ **Note added 2026-10-09 (objectui#6152 round 14):** the renderers' reads have moved. `ListView`
211
+ still merges each `options.KIND` under the top-level block, but it reads each kind's declared keys
212
+ only: the legacy spellings, `options.grid` and the undeclared keys a bag carries are no longer read,
213
+ so a view stored with one of them renders without what that key used to bind; see
214
+ `.changeset/6152-list-view-readers-retired.md`. The legacy chart axes (`options.chart.xAxisField`
215
+ and the rest) are still read until the next round on objectui#6152.
216
+
217
+ **Note added 2026-10-09 (objectui#6152 round 15):** the legacy chart axes are no longer read, in the
218
+ bag or at the top level: a chart block that names no `dataset` binds nothing, and `ObjectChart`
219
+ refuses it on screen; see `.changeset/6152-list-view-legacy-chart-retired.md`.
220
+ - Updated dependencies [18d7b48]
221
+ - Updated dependencies [172acc3]
222
+ - Updated dependencies [f0496bd]
223
+ - Updated dependencies [c4c506b]
224
+ - Updated dependencies [9db9ff3]
225
+ - Updated dependencies [c096f03]
226
+ - Updated dependencies [d92b2a1]
227
+ - Updated dependencies [92f4e2b]
228
+ - Updated dependencies [b10c68e]
229
+ - Updated dependencies [bdc9049]
230
+ - Updated dependencies [e8c0b96]
231
+ - Updated dependencies [b92329c]
232
+ - Updated dependencies [2e818d0]
233
+ - Updated dependencies [fd060f0]
234
+ - Updated dependencies [fd060f0]
235
+ - Updated dependencies [8b14aec]
236
+ - Updated dependencies [2abec3a]
237
+ - Updated dependencies [9dfaca6]
238
+ - Updated dependencies [c000398]
239
+ - Updated dependencies [73b5d77]
240
+ - Updated dependencies [7b17705]
241
+ - Updated dependencies [fc3c2cc]
242
+ - Updated dependencies [f9f4a62]
243
+ - Updated dependencies [848ba0e]
244
+ - Updated dependencies [57d82cb]
245
+ - Updated dependencies [de96f3d]
246
+ - Updated dependencies [9ca3cac]
247
+ - Updated dependencies [c910630]
248
+ - Updated dependencies [ce464d9]
249
+ - Updated dependencies [e6dcd85]
250
+ - Updated dependencies [96fcf30]
251
+ - Updated dependencies [7a2c60b]
252
+ - Updated dependencies [834c559]
253
+ - Updated dependencies [22b503c]
254
+ - Updated dependencies [9fc68aa]
255
+ - Updated dependencies [d50f724]
256
+ - Updated dependencies [17acfbb]
257
+ - Updated dependencies [6be0f7a]
258
+ - Updated dependencies [89cc738]
259
+ - Updated dependencies [c0862c1]
260
+ - Updated dependencies [c0862c1]
261
+ - Updated dependencies [c0862c1]
262
+ - Updated dependencies [c0862c1]
263
+ - Updated dependencies [c0862c1]
264
+ - Updated dependencies [c0862c1]
265
+ - Updated dependencies [ded4494]
266
+ - Updated dependencies [d172f63]
267
+ - Updated dependencies [4c0de52]
268
+ - Updated dependencies [a80fef7]
269
+ - Updated dependencies [3bf8894]
270
+ - Updated dependencies [e06365c]
271
+ - Updated dependencies [1e1f09e]
272
+ - Updated dependencies [455c646]
273
+ - Updated dependencies [f34e877]
274
+ - Updated dependencies [f34e877]
275
+ - Updated dependencies [9844bbf]
276
+ - Updated dependencies [cef0eee]
277
+ - Updated dependencies [7ebff39]
278
+ - Updated dependencies [054fd84]
279
+ - Updated dependencies [5275d1f]
280
+ - Updated dependencies [7241a81]
281
+ - Updated dependencies [74add0c]
282
+ - Updated dependencies [aaba865]
283
+ - Updated dependencies [f1781be]
284
+ - Updated dependencies [fbad078]
285
+ - Updated dependencies [45d5853]
286
+ - Updated dependencies [4f4fc03]
287
+ - Updated dependencies [2312bd9]
288
+ - Updated dependencies [6d5eb34]
289
+ - Updated dependencies [c5406c2]
290
+ - Updated dependencies [c5406c2]
291
+ - Updated dependencies [d99b731]
292
+ - Updated dependencies [2571a3e]
293
+ - Updated dependencies [2a48bd4]
294
+ - Updated dependencies [8a55f0c]
295
+ - Updated dependencies [c7b30bd]
296
+ - Updated dependencies [20c6d35]
297
+ - Updated dependencies [417e245]
298
+ - Updated dependencies [69bca0a]
299
+ - Updated dependencies [023f00d]
300
+ - Updated dependencies [158c75d]
301
+ - Updated dependencies [7525045]
302
+ - Updated dependencies [5af42db]
303
+ - Updated dependencies [ce991bd]
304
+ - Updated dependencies [3c0f806]
305
+ - Updated dependencies [1071393]
306
+ - Updated dependencies [5f75cfa]
307
+ - Updated dependencies [6757a93]
308
+ - Updated dependencies [b7cd5c8]
309
+ - Updated dependencies [5330038]
310
+ - Updated dependencies [c9fc10b]
311
+ - Updated dependencies [dc6d28e]
312
+ - Updated dependencies [c0c2f79]
313
+ - Updated dependencies [0665c3b]
314
+ - Updated dependencies [d2500d8]
315
+ - Updated dependencies [e723f58]
316
+ - Updated dependencies [82bb1d5]
317
+ - Updated dependencies [f3d5408]
318
+ - Updated dependencies [b231607]
319
+ - Updated dependencies [b231607]
320
+ - Updated dependencies [466a219]
321
+ - Updated dependencies [6fb281d]
322
+ - Updated dependencies [54159d3]
323
+ - Updated dependencies [fa778e6]
324
+ - Updated dependencies [334f0cf]
325
+ - Updated dependencies [c08c933]
326
+ - Updated dependencies [92f979d]
327
+ - Updated dependencies [c4dd707]
328
+ - Updated dependencies [c4dd707]
329
+ - Updated dependencies [7578323]
330
+ - Updated dependencies [38bb373]
331
+ - Updated dependencies [923504f]
332
+ - Updated dependencies [5c2982a]
333
+ - Updated dependencies [97e7d4e]
334
+ - Updated dependencies [10aba37]
335
+ - Updated dependencies [5d3f437]
336
+ - Updated dependencies [51c661e]
337
+ - Updated dependencies [7af0ab3]
338
+ - Updated dependencies [b434f5f]
339
+ - Updated dependencies [9f282ef]
340
+ - Updated dependencies [fd4872f]
341
+ - Updated dependencies [f0532d8]
342
+ - Updated dependencies [cea429b]
343
+ - Updated dependencies [3092aca]
344
+ - Updated dependencies [82e5f53]
345
+ - Updated dependencies [d81e460]
346
+ - Updated dependencies [8106db1]
347
+ - Updated dependencies [068a540]
348
+ - Updated dependencies [ca45c6d]
349
+ - Updated dependencies [093d55b]
350
+ - Updated dependencies [b64fda3]
351
+ - Updated dependencies [a8051d6]
352
+ - Updated dependencies [72594f2]
353
+ - Updated dependencies [524136e]
354
+ - Updated dependencies [2b06a91]
355
+ - Updated dependencies [6f3299f]
356
+ - Updated dependencies [065a1cf]
357
+ - Updated dependencies [f2b17c6]
358
+ - Updated dependencies [52d6194]
359
+ - Updated dependencies [23bf859]
360
+ - Updated dependencies [1c72d77]
361
+ - Updated dependencies [2b4d3f1]
362
+ - Updated dependencies [d75f212]
363
+ - Updated dependencies [37db09f]
364
+ - Updated dependencies [ff9df88]
365
+ - Updated dependencies [70e843f]
366
+ - Updated dependencies [caac3b2]
367
+ - Updated dependencies [a2225f9]
368
+ - Updated dependencies [5c4deb5]
369
+ - Updated dependencies [a8e5b73]
370
+ - Updated dependencies [d9d9d98]
371
+ - Updated dependencies [c950345]
372
+ - Updated dependencies [21f9577]
373
+ - Updated dependencies [044f231]
374
+ - Updated dependencies [f8267df]
375
+ - Updated dependencies [9b82ced]
376
+ - Updated dependencies [3821a3a]
377
+ - Updated dependencies [3eb3ec1]
378
+ - Updated dependencies [92c2a69]
379
+ - Updated dependencies [646caea]
380
+ - Updated dependencies [1ffd6a2]
381
+ - Updated dependencies [5f8ecf6]
382
+ - Updated dependencies [8ed7e5a]
383
+ - Updated dependencies [6c4d00d]
384
+ - Updated dependencies [db8ce2f]
385
+ - Updated dependencies [726d8c9]
386
+ - Updated dependencies [f0e760a]
387
+ - Updated dependencies [a5bb7ac]
388
+ - Updated dependencies [f78efdd]
389
+ - Updated dependencies [8a8bcf3]
390
+ - Updated dependencies [f74638c]
391
+ - Updated dependencies [ef71a09]
392
+ - Updated dependencies [8614705]
393
+ - Updated dependencies [619e3f7]
394
+ - Updated dependencies [ca7a4c3]
395
+ - Updated dependencies [c9e6742]
396
+ - Updated dependencies [f62b6ff]
397
+ - Updated dependencies [608033b]
398
+ - Updated dependencies [611566b]
399
+ - Updated dependencies [efa9cb4]
400
+ - Updated dependencies [d66d7e8]
401
+ - Updated dependencies [15d8ca6]
402
+ - Updated dependencies [378896d]
403
+ - Updated dependencies [9d857c9]
404
+ - Updated dependencies [670ea10]
405
+ - Updated dependencies [ff215d9]
406
+ - Updated dependencies [71243db]
407
+ - Updated dependencies [a8add5c]
408
+ - Updated dependencies [33ee9de]
409
+ - Updated dependencies [4839f5c]
410
+ - Updated dependencies [a23e804]
411
+ - Updated dependencies [c7462e7]
412
+ - Updated dependencies [36e2f7b]
413
+ - Updated dependencies [ac59073]
414
+ - Updated dependencies [44cb469]
415
+ - Updated dependencies [e058d76]
416
+ - Updated dependencies [c999d4c]
417
+ - Updated dependencies [8df2608]
418
+ - Updated dependencies [5483297]
419
+ - Updated dependencies [ed43c79]
420
+ - Updated dependencies [260ef71]
421
+ - Updated dependencies [655e897]
422
+ - Updated dependencies [655e897]
423
+ - Updated dependencies [8d80845]
424
+ - Updated dependencies [69a408f]
425
+ - Updated dependencies [d2b21a1]
426
+ - Updated dependencies [5ff64ef]
427
+ - Updated dependencies [64acb7e]
428
+ - Updated dependencies [4ff5b6b]
429
+ - Updated dependencies [473e5a0]
430
+ - Updated dependencies [b279016]
431
+ - Updated dependencies [bb6c38c]
432
+ - Updated dependencies [26323c4]
433
+ - Updated dependencies [9753811]
434
+ - Updated dependencies [2727527]
435
+ - Updated dependencies [3da39ae]
436
+ - Updated dependencies [bc281f4]
437
+ - Updated dependencies [d637be3]
438
+ - Updated dependencies [2cfdc99]
439
+ - Updated dependencies [2cfdc99]
440
+ - Updated dependencies [1e6d83b]
441
+ - Updated dependencies [1e6d83b]
442
+ - Updated dependencies [6058bf8]
443
+ - Updated dependencies [c219165]
444
+ - Updated dependencies [a7ae252]
445
+ - Updated dependencies [fb501bc]
446
+ - Updated dependencies [30083da]
447
+ - Updated dependencies [7f9cc37]
448
+ - Updated dependencies [025130c]
449
+ - Updated dependencies [76f91f8]
450
+ - Updated dependencies [ea34d9b]
451
+ - Updated dependencies [8aa8e3e]
452
+ - Updated dependencies [024b7b6]
453
+ - Updated dependencies [cb80001]
454
+ - Updated dependencies [909c64e]
455
+ - Updated dependencies [9e7e1a5]
456
+ - Updated dependencies [2493e85]
457
+ - Updated dependencies [d0b9648]
458
+ - Updated dependencies [46dbf32]
459
+ - Updated dependencies [a928aaa]
460
+ - Updated dependencies [47508f3]
461
+ - Updated dependencies [61ed5ad]
462
+ - Updated dependencies [1b94d50]
463
+ - Updated dependencies [6f877f1]
464
+ - Updated dependencies [988aa9f]
465
+ - Updated dependencies [1ce0711]
466
+ - Updated dependencies [fb85637]
467
+ - Updated dependencies [9f1dd79]
468
+ - Updated dependencies [df71568]
469
+ - Updated dependencies [d11174a]
470
+ - Updated dependencies [2d8a8b7]
471
+ - Updated dependencies [cbac9d7]
472
+ - Updated dependencies [9eb1479]
473
+ - Updated dependencies [74e37aa]
474
+ - Updated dependencies [961b69f]
475
+ - Updated dependencies [52907d7]
476
+ - Updated dependencies [f466b0a]
477
+ - Updated dependencies [673a71c]
478
+ - Updated dependencies [616df65]
479
+ - Updated dependencies [58798ec]
480
+ - Updated dependencies [8803ca5]
481
+ - Updated dependencies [e70c21d]
482
+ - Updated dependencies [4b92c5a]
483
+ - Updated dependencies [06be396]
484
+ - Updated dependencies [3650d94]
485
+ - Updated dependencies [7c05f21]
486
+ - Updated dependencies [8cd4db4]
487
+ - Updated dependencies [daeb77f]
488
+ - Updated dependencies [eb4552e]
489
+ - Updated dependencies [3c3115e]
490
+ - Updated dependencies [55e90fd]
491
+ - Updated dependencies [9b75509]
492
+ - Updated dependencies [b13ea3c]
493
+ - Updated dependencies [d7e9e9a]
494
+ - Updated dependencies [cf62edf]
495
+ - Updated dependencies [0253416]
496
+ - Updated dependencies [5d77c09]
497
+ - Updated dependencies [3fd8625]
498
+ - Updated dependencies [1473757]
499
+ - Updated dependencies [d73d987]
500
+ - Updated dependencies [12ff256]
501
+ - Updated dependencies [26b0bd2]
502
+ - Updated dependencies [26b0bd2]
503
+ - Updated dependencies [d328698]
504
+ - Updated dependencies [d328698]
505
+ - Updated dependencies [b4e0787]
506
+ - Updated dependencies [088e0f7]
507
+ - Updated dependencies [78b07f4]
508
+ - Updated dependencies [f962cdc]
509
+ - Updated dependencies [b403bb3]
510
+ - Updated dependencies [8a25fee]
511
+ - Updated dependencies [4016370]
512
+ - Updated dependencies [12dc7b4]
513
+ - @object-ui/types@18.0.0
514
+ - @object-ui/components@18.0.0
515
+ - @object-ui/core@18.0.0
516
+ - @object-ui/i18n@18.0.0
517
+ - @object-ui/react@18.0.0
518
+ - @object-ui/permissions@18.0.0
519
+ - @object-ui/mobile@18.0.0
520
+
521
+ ## 17.7.0
522
+
523
+ ### Minor Changes
524
+
525
+ - 57a2bc2: Retire the undeclared timeline `metaFields` reads in both packages (objectui#10222).
526
+
527
+ The spec's `TimelineConfigSchema` is a strict object that declares no `metaFields` member and
528
+ refuses one, yet `ObjectTimeline` read it (through an `as any` cast) to pick the chip fields
529
+ beside each title, and `ListView` read it three times: two field collectors put the listed
530
+ fields into `$expand` / `$select`, and the status / priority auto-projection was skipped when
531
+ the list was present. All four reads are deleted.
532
+
533
+ **Behaviour change:** a stored interface-page view carrying `options.timeline.metaFields` falls
534
+ back to the default card labels (the built-in `status` / `priority` chips, limited to the fields
535
+ the object declares), and the fields that list named are no longer fetched for it. No such view
536
+ has been found; the stored rows are not censused. A timeline without the key renders and fetches
537
+ exactly what it did before, because `ListView` now projects `status` / `priority` for every
538
+ timeline view.
539
+
540
+ `cardFields` stays the reserved spelling if authored timeline chip fields are ever asked for;
541
+ nothing is declared.
542
+ - 6cd5ae3: `object-timeline` and `view:timeline` publish the ten `@objectstack/spec` 17.5.0 row keys their renderer honours, and `objectName` is no longer required (objectui#11168 slice 5, under objectui#11111 decision 3 = B).
543
+
544
+ - Both registrations in `src/index.tsx` now share one list, `OBJECT_TIMELINE_INPUTS`, which adds `timeline`, `limit`, `data`, `items`, `dateFormat`, `rowLabel`, `minDate`, `maxDate`, `descriptionField` and `mapping`. The page validator (`validateTree` in `@object-ui/sdui-parser`) reported each as `unknown-prop` while `ObjectTimeline` read it. It now accepts them.
545
+ - `objectName` drops `required: true`. A timeline drawn from `items`, `data` or a `bind` path issues no query, and the validator raised `missing-required-prop`, an error, on such a timeline, though the spec row declares `objectName` optional. Entry-click navigation still reads it, and the `objectName` and `navigation` descriptions say so: on a timeline that names no `objectName`, `page` opens nothing and `new_window` / `openNewTab: true` open a tab at a slash and the entry's `id` alone, not the record page (`src/__tests__/timelineNavigationMembers-8654.test.tsx`).
546
+ - Two values the spec row refuses are now reported where they were not: a `dateFormat` outside `short` / `long` / `iso` is an `invalid-enum` error (it was an `unknown-prop` warning), and a `data` that is not an array is a `type-mismatch` warning (it drew nothing).
547
+ - Each new description says what the renderer does with the key, as measured through `SchemaRenderer` in `src/__tests__/objectTimelineInputs-11168.test.tsx`. Where the spec row's own describe is true of the renderer, the description starts with it word for word.
548
+ - The `sort` description no longer opens with "Entry order". `ObjectTimeline` draws entries composed from records by their start date, so the key orders the query, not the rail.
549
+ - The JSDoc on `ObjectTimelineProps`'s `navigation` member states the mechanism as measured: an absent key takes `useNavigationOverlay`'s no-config branch, which calls only an `onNavigate` the timeline never passes, so it never reaches the host's record navigator. A block written without `mode` takes the `page` branch instead.
550
+
551
+ No renderer code changes, so nothing changes at render time. The README and the docs page describe the record source order and each key.
552
+ - e4559d1: `TimelineSchema` now declares the presentational keys the timeline renderer actually reads
553
+ (objectui#6170, maintainer ruling 2026-08-25 — the same family rule adopted on
554
+ objectui#6172: the exported type aligns to the measured authored + read set).
555
+
556
+ Before this, `TimelineSchema` declared `events` (required), `orientation` and `position`,
557
+ and nothing else. `TimelineRenderer` is annotated `schema: TimelineSchema` and reads nine
558
+ keys off that node — `variant`, `items`, `dateFormat`, `onItemClick`, `minDate`, `maxDate`,
559
+ `rowLabel`, `scale`, `timeScale` — and **none** of the three that were declared. The docs
560
+ property table and the registration's own designer `inputs` had agreed with the renderer
561
+ all along; only the exported type disagreed. It was invisible to `tsc` because `BaseSchema`
562
+ carries `[key: string]: any`, so every undeclared key resolved as `any` and the annotation
563
+ constrained nothing.
564
+
565
+ The most visible casualty was the docs page's own TypeScript example, which did not
566
+ compile: `Property 'events' is missing in type '{ type: "timeline"; variant: string; items:
567
+ … }' but required in type 'TimelineSchema'`. The page taught an authoring form its own
568
+ published type refused.
569
+
570
+ **Declared now** (TS interface and the `@object-ui/types/zod` mirror together): `variant`,
571
+ `items`, `dateFormat`, `scale`, `timeScale`, `rowLabel`, `minDate`, `maxDate`. `onItemClick`
572
+ is deliberately left undeclared — it is a runtime slot `ObjectTimeline` installs, and this
573
+ package keeps callback-shaped keys off the authored surface.
574
+
575
+ **`scale` is the canonical axis key.** It is `@objectstack/spec`'s `ui/TimelineConfig.json`
576
+ spelling and the one `resolveTimelineScale` reads first (`scale ?? timeScale`). The designer
577
+ now offers it, with all six buckets: `hour` / `quarter` / `year` have rendered correctly
578
+ since objectui#2942 but were offered by neither the designer (which listed three) nor the
579
+ exported type (which listed none), so they were authorable and undiscoverable. `timeScale`
580
+ stays as a deprecated alias so stored JSON keeps working; retiring it is routed separately.
581
+
582
+ **`events` is now optional.** It was required, which is why the documented authoring form
583
+ did not type-check. That widening is the only non-additive change here — strictly more
584
+ programs compile and strictly more input parses than before. `events`, `orientation` and
585
+ `position` remain declared and remain read by nothing; a timeline authored with `events`
586
+ still renders an empty rail. Their removal is a breaking narrowing of a published type and
587
+ is routed through ADR-0049 enforce-or-remove as its own change, not smuggled into this one.
588
+
589
+ Accept-set note for consumers: keys that previously resolved as `any` are now typed, so a
590
+ value the renderer never implemented — `variant: 'diagonal'`, `dateFormat: 'medieval'`,
591
+ `scale: 'fortnight'` — is a type error and a Zod rejection where it used to pass silently.
592
+ Nothing that renders today stops rendering. `BaseSchema`'s index signature is untouched, so
593
+ an undeclared key is still accepted by both halves (objectui#5155 / objectui#6269 own that
594
+ ceiling).
595
+ - 9d86e1d: Retire the `timeScale` alias on the timeline node — `scale` is the only axis spelling
596
+ (objectui#6355, maintainer ruling 2026-08-27).
597
+
598
+ **BREAKING for authored metadata.** `timeScale` was this renderer's pre-spec spelling of the
599
+ Gantt axis bucket. `scale` is canonical — it is `@objectstack/spec` `ui/TimelineConfig.json`'s
600
+ axis key and the key the renderer preferred (objectui#6170 ruling, 2026-08-25: `timeScale`
601
+ goes the alias-retirement route, not a silent second spelling). objectui#6355's ruling
602
+ retires it immediately, with no phased window, while the project is at startup stage.
603
+
604
+ **What breaks, and how you will find out.** A timeline document that spells `timeScale` is
605
+ now **refused**, loudly, at the authoring boundary:
606
+
607
+ - `TimelineSchema.timeScale` is declared `?: never` — writing it is a type error;
608
+ - the Zod twin declares `z.never().optional()` — parsing a document that carries the key
609
+ fails with `invalid_type` / `expected: never` on the `timeScale` path.
610
+
611
+ The fix is a rename: `timeScale` → `scale`. The accepted values are unchanged (`hour`,
612
+ `day`, `week`, `month`, `quarter`, `year`), so no value needs rewriting.
613
+
614
+ **Why a tombstone rather than deleting the key.** `BaseSchema` is `.passthrough()` on the
615
+ Zod side and carries `[key: string]: any` on the TS side, so an *undeclared* key is accepted
616
+ unvalidated by both halves. Deleting `timeScale` outright would have let the retired spelling
617
+ parse green and type-check green while the renderer no longer read it — the Gantt axis would
618
+ silently fall back to the `month` default, the chart would change bucket, and nothing would
619
+ error. That is the silent axis breakage objectui#2942 closed, running in the other direction,
620
+ and it is the specific outcome this retirement is shaped to prevent. Keeping the key declared
621
+ as `never` on both halves is what makes the removal audible. Absent stays valid on both, so a
622
+ document that never wrote the alias is untouched.
623
+
624
+ Also in this change:
625
+
626
+ - `resolveTimelineScale` drops the `?? schema.timeScale` fallback read; its parameter narrows
627
+ to `{ scale?: unknown }`.
628
+ - The designer drops its deprecated `timeScale` input. The `scale` input already offers all
629
+ six buckets.
630
+ - `ObjectTimeline` now emits the resolved axis under `scale` when it composes the schema it
631
+ hands to the renderer. It previously wrote the alias, which would have made **every**
632
+ object-bound Gantt fall through to the `month` default the moment the fallback read went —
633
+ silently, since that is a composed schema no author ever sees. Writing `scale` after the
634
+ spread also restores the precedence the surrounding code intends: a `timelineConfig.scale`
635
+ now actually beats a flat `schema.scale`, where under the alias the resolver's
636
+ `scale ?? timeScale` ordering let the flat key win.
637
+ - The two in-repo authors are migrated in the same change: the schema-catalog
638
+ `gantt-style-timeline.json` fixture and the registration's own `examples.gantt` block.
639
+ - Docs drop the `timeScale` row and gain a retirement callout;
640
+ `packages/components/.../TIMELINE.md`'s Gantt table now documents `scale` with the full
641
+ six-value vocabulary it has accepted since objectui#2942 (its row still claimed three).
642
+
643
+ Version note: `minor`, not `major`, per AGENTS.md §版本号策略 — objectui's major tracks the
644
+ `@objectstack` major and all publishable packages share one `fixed` group, so a breaking
645
+ narrowing is declared `minor` with the break spelled out here.
646
+ - 3a5817f: feat(types)!: a timeline item is a declared feed item or gantt row, judged against the shape `variant` selects
647
+
648
+ `TimelineSchema.items` declared an object whose keys were all open, on both the
649
+ TypeScript type and the zod mirror. An item written `{ title, date }` therefore
650
+ type-checked and validated, and its `date` was dropped without a word — a feed
651
+ item's date is `time`. A gantt row on a vertical timeline, or a timeline item on
652
+ a gantt timeline, validated too and drew an empty entry with no diagnostic. And
653
+ the strict authoring schema refused every real timeline item, the schema
654
+ catalog's own included, because an item that declares no keys closes to nothing.
655
+
656
+ The item is now declared (objectui#6356, maintainer ruling Q1 = A, Q2 = C):
657
+
658
+ - **Timeline item** (`variant` `vertical`, the default, or `horizontal`) — new
659
+ exported type `TimelineFeedItem`: `time`, `title`, `description`, `variant`,
660
+ `icon`, `content`, `className`. `title` is **required**.
661
+ - **Gantt row** (`variant: 'gantt'`) — new exported types `TimelineGanttItem`
662
+ (`label`, **required**, and optional `items`) and `TimelineGanttItemBar`
663
+ (`title`, `startDate`, `endDate`, `variant`, all optional; a bar date is a
664
+ string, a finite number or a `Date`).
665
+ - Item and bar `variant` is one of `default`, `success`, `warning`, `danger`,
666
+ `info` — new exported type `TimelineItemVariant`.
667
+ - The zod faces gain `TimelineFeedItemSchema`, `TimelineGanttItemSchema` and
668
+ `TimelineGanttItemBarSchema` on `@object-ui/types/zod`.
669
+
670
+ **Breaking, for authors (minor per this repository's version policy):**
671
+
672
+ - `TimelineSchema` validation now judges every item against the shape its
673
+ `variant` selects. A gantt row on a vertical or horizontal timeline, or a
674
+ timeline item on a gantt timeline, is refused, naming the missing `title` or
675
+ `label` and each key that belongs to the other shape. A timeline item with no
676
+ `title`, or a gantt row with no `label`, is refused.
677
+ - An item or bar `variant` outside the five is refused, and so is a bar date
678
+ that is not a string, a finite number or a `Date`.
679
+ - In TypeScript, an item literal carrying a key neither shape declares (for
680
+ example `date`, or `meta`) is an excess-property error. TypeScript cannot see
681
+ the parent's `variant`, so a gantt row on a feed timeline still type-checks;
682
+ validation is where that is refused.
683
+ - In TypeScript, an element of `TimelineSchema.items` is now the union
684
+ `TimelineFeedItem | TimelineGanttItem`, where it was an object with `unknown`
685
+ keys. Reading a key that only one shape declares needs the element narrowed
686
+ first — for example `'label' in item`.
687
+ - `color`, `group`, `meta`, `startDate` and `endDate` on a timeline item are
688
+ **not** authorable. `ObjectTimeline` composes them onto the items it maps from
689
+ records and the renderer still draws them; they are typed inside
690
+ `@object-ui/plugin-timeline` only, and the strict authoring schema refuses
691
+ them by name.
692
+
693
+ This supersedes two statements elsewhere in these release notes: the
694
+ objectui#7164 and objectui#7365 entries say a row's and a bar's own keys stay
695
+ undeclared and open and that feed timelines are untouched. Their refusals still
696
+ hold, at the same paths — a non-object item at `items[i]`, a non-array row
697
+ `items` at `items[i].items`, a non-object bar at `items[i].items[j]` — and on
698
+ the tolerant `TimelineSchema` a bar still accepts keys it does not declare (the
699
+ strict authoring schema refuses them by name), but the keys above are now
700
+ declared, and feed timelines are judged too.
701
+
702
+ `TimelineSchema` stays a zod object: its `.shape`, its place in
703
+ `DataDisplaySchema` and the `timeScale` / `body` / `children` refusals are
704
+ unchanged. Deriving from it with `.extend()` over an existing key now throws in
705
+ zod 4 (the node carries a refinement); use `.safeExtend()`, which keeps it.
706
+
707
+ `@object-ui/plugin-timeline` (**breaking at compile time, shipped as a
708
+ `minor`**): `TimelineRenderer` is a public export, and its `schema` prop is now
709
+ typed as the renderer's own input — the two declared item shapes above, plus the
710
+ item keys `ObjectTimeline` composes (`color`, `group`, `meta`, `startDate`,
711
+ `endDate`, `_data`, and any string as a composed item's `variant`) — rather than
712
+ as the authored `TimelineSchema` of before, whose items accepted any key. So an
713
+ object literal passed to the prop whose item carries a key neither shape
714
+ declares is now an excess-property error (TS2353), exactly as it is against
715
+ `TimelineSchema`: `schema={{ type: 'timeline', items: [{ title: 'T', date: 'x' }] }}`
716
+ type-checked before and does not now. Fix it at the item — a feed item's date is
717
+ `time`. What still type-checks against the prop: any value typed
718
+ `TimelineSchema`, an `items` array that is not written as a fresh literal (for
719
+ example an array of string-keyed records held in a variable), items that are
720
+ empty objects, and the composed keys above.
721
+ - 20cb8db: `ObjectTimeline` refuses an undeclared date axis instead of inventing one
722
+ (objectui#7459).
723
+
724
+ Steps ① and ② of the three-step sequence the maintainer ruled on 2026-09-01
725
+ (总监批 #28). House posture, on record with that ruling:
726
+ 日期轴永不虚构 — a date axis is never fabricated.
727
+
728
+ `ObjectTimeline` resolved its date axis through five declared bindings and then
729
+ closed the chain with a sixth rung that was a bare literal field name nobody
730
+ has ever declared. A name therefore ALWAYS resolved: for a view that declared
731
+ no axis, every record read a key its object does not carry, every event landed
732
+ in the "No date" bucket, and the screen read as a timeline that had been built
733
+ and simply had nothing in it.
734
+
735
+ Two changes, shipped together because neither is observable alone:
736
+
737
+ - **The renderer now refuses.** An object-bound timeline with no declared date
738
+ axis renders a diagnostic naming every binding it accepts —
739
+ `timeline.startDateField`, `timeline.dateField`, `mapping.date`, and the two
740
+ deprecated flat spellings — instead of a chart. The twin of `ObjectGantt`'s
741
+ "Gantt configuration required" screen, in the shape `5f4514f7b` settled.
742
+ - **The invented sixth rung is gone**, which is the only thing that makes the
743
+ refusal reachable. Added while the floor stood, it would have been dead code;
744
+ retired without the refusal, it would have produced exactly the silent
745
+ "No date" outcome the ruling rejects.
746
+
747
+ **What changes for an author.** A view that declares a date axis is completely
748
+ unaffected — all five declared spellings resolve exactly as before, and a
749
+ timeline authored from literal `items` is never refused, since its items carry
750
+ their own dates and no field name is read for them. A view that declared no
751
+ axis anywhere, and was rendering an empty-looking timeline, now says so.
752
+
753
+ ⚠️ Both premises were RE-MEASURED on the current tree before anything was
754
+ edited, rather than taken from the card: the renderer had no absent-axis
755
+ refusal (against a live control term that fires in the same file), and the
756
+ floor was still present and still spelled as reported. The pairing itself is
757
+ pinned — the refusal cases go red the moment the floor returns, including one
758
+ whose records carry a column that happens to be named `date`, where a returned
759
+ floor renders a convincing timeline rather than an empty one.
760
+
761
+ Refusal is distinguished from "renders an empty timeline" by asserting the
762
+ canvas is ABSENT, not merely event-free. The component's success surface is now
763
+ named (`data-testid="timeline-canvas"`) so that distinction can be measured;
764
+ every other terminal state of the component already named itself.
765
+
766
+ Step ③ of the ruling — the `'created_at'` floors on the two plugin faces —
767
+ stays for a later change (it landed as `04a67b9dc`) and is deliberately NOT in this change.
768
+ - 233a1b3: Declare the `filter` and `sort` inputs on the `object-map`, `object-gantt`,
769
+ `object-timeline` and `view:timeline` registrations (objectui#8220) — the html
770
+ tier stops reporting `unknown-prop` on two keys the spec declares and all three
771
+ renderers read.
772
+
773
+ objectui#7712's and objectui#8171's defect, three blocks over. `ObjectMap`,
774
+ `ObjectGantt` and `ObjectTimeline` each lower the authored keys onto their own
775
+ query — `$filter` (the authored `filter`, its context tokens resolved first) and
776
+ `$orderby: convertSortToQueryParams(schema.sort)` — but none of the four
777
+ registrations publishing those renderers listed either key in `inputs`, and
778
+ `sdui-parser`'s `validateTree` reports `unknown-prop` for every key no `inputs`
779
+ entry claims. An author writing the spelling that works was told it was unknown.
780
+
781
+ Unlike the kanban and calendar cases, these three blocks had no spec row when the
782
+ defect was filed, so declaring the keys then would have published an authoring
783
+ surface no contract backed. That order is now met on the installed package:
784
+ `@objectstack/spec` 17.5.0 maps `object-map`, `object-gantt` and `object-timeline`
785
+ in `ComponentPropsMap`, each row declaring `filter` as the `ViewFilterRule` array
786
+ and `sort` as the `SortItem` array. ADR-0049 enforce-or-remove therefore resolves
787
+ toward **declare**: both keys have live readers on both ends.
788
+
789
+ Both keys are declared `type: 'array'`. For `filter` that is the rule-array arm
790
+ `[{ field, operator, value }, ...]` and nothing else: the spec refuses the
791
+ MongoDB-style record form at all three doors, and with the key declared as an
792
+ array the html tier now refuses it too, as a `type-mismatch`, instead of passing
793
+ it as an unknown key. `sort` takes `[{ field, order }]`.
794
+
795
+ `view:timeline` declares the same pair as `object-timeline`: it is the same
796
+ renderer under a second tag, the `view:calendar` precedent. The map's and the
797
+ gantt's bare `view:` twins are already retired (objectui#10393, objectui#8008),
798
+ so four registrations carry the declaration, not six.
799
+
800
+ Pinned per plugin in `__tests__/queryKeysDeclared-8220.test.tsx`: the real
801
+ validator over a manifest built from the live registry, with an undeclared-key
802
+ control; the installed spec row's verdict on the same values; and a mount through
803
+ `SchemaRenderer` showing the rule array reach `$filter` and the sort items reach
804
+ `$orderby` on every tag.
805
+
806
+ Not changed here: the console's `registry-inputs-spec-parity` ledger. It does not
807
+ load these three plugins yet and books the blocks as unjudged, owed to
808
+ objectui#11168, so this change moves none of its rows.
809
+
810
+ **Note, 2026-10-02 (objectui#11168 slice 5, shipping in this same release).**
811
+ The last paragraph above says the console's `registry-inputs-spec-parity` gate
812
+ does not load these three plugins yet and books the blocks as unjudged. That no
813
+ longer holds for the release: objectui#11168 loaded all three in this same
814
+ release (`object-map` in slice 3, `object-gantt` in slice 4, `object-timeline`
815
+ in slice 5), so the gate judges each registration in both directions, and its
816
+ unjudged-block ledger books none of them. This change itself still moved none
817
+ of those rows.
818
+ - 9a853f2: Retire the legacy string `sort` clause: one spelling, the array
819
+ (objectui#8221) — `convertSortToQueryParams` now REFUSES `"name desc"` with a
820
+ diagnostic naming `[{ field: 'name', order: 'desc' }]`, instead of lowering it.
821
+
822
+ **BREAKING for `@object-ui/core` consumers — scored `minor`, not `major`, per
823
+ AGENTS.md 版本号策略** (every package is in one fixed group, so a `major` here
824
+ would carry all 39 off the `@objectstack` major this repo is pinned to). The
825
+ breaking semantics are stated below rather than encoded in the version.
826
+
827
+ Director ruling, decision batch #77 (2026-09-07), option B. Three faces
828
+ disagreed about one key: `@object-ui/core` implemented the string clause
829
+ on purpose (`sort-query.ts`, docblock and all), `content/docs/plugins/plugin-map.mdx`
830
+ taught it as `sort?: string | SortConfig[]`, and the html tier answered
831
+ `type-mismatch` for it because all seven `sort` registrations publish
832
+ `type: 'array'` alone — while `@objectstack/spec` refuses the string outright on
833
+ `element-record-picker`. Option A (per-block string arms) was rejected by name:
834
+ it would make one key mean different things on different blocks.
835
+
836
+ **What moves.** `convertSortToQueryParams(sort)` narrows from
837
+ `string | QuerySortEntry[]` to `QuerySortEntry[]`, and the three declarations
838
+ that published a string arm narrow with it — `ObjectGridSchema.sort`,
839
+ `ObjectMapSchema.sort` and `ObjectGanttSchema.sort`, in the TypeScript face AND
840
+ in the zod mirror, together, because a narrowing that left `z.string()` in the
841
+ mirror is the declared-vs-enforced split this change exists to close. The local
842
+ `sort` declarations on `LineItemsPanel`, `ObjectTimeline` and
843
+ `deriveRelatedLists`'s ListView input narrow the same way.
844
+
845
+ **What a string does now.** Types are erased, so the signature stops a string
846
+ only at compile time; authored JSON and stored `sys_metadata` rows still reach
847
+ the sink carrying `"name desc"`. Such a value is REFUSED — the query carries no
848
+ `$orderby` — and `console.error` names the array form, quotes what arrived and
849
+ states the consequence, once per spelling. A silent `undefined` was the one
850
+ outcome the ruling ruled out.
851
+
852
+ **Measured consequences you may see.** A related list that inherited its child
853
+ object's default list-view sort in the legacy spelling stops inheriting it (the
854
+ console says so). `@objectstack/spec@17.3.0` still ACCEPTS the string on
855
+ `ListViewSchema.sort` and on `RecordRelatedListProps.sort`, so such metadata is
856
+ still spec-legal today; the spec-side pull-back is its own card. Two surfaces
857
+ are deliberately untouched, because they are a DIFFERENT string dialect that
858
+ never reaches this sink: `record:related_list`'s `'field'` / `'-field'` form,
859
+ normalized by `RelatedList.normalizeSortSpec`, and `ListView.parseSortConfig`,
860
+ which reads the platform view record the spec still blesses.
861
+
862
+ Docs teach the array only: `content/docs/plugins/plugin-map.mdx`,
863
+ `content/docs/plugins/plugin-view.mdx` and `packages/plugin-view/README.md`.
864
+ - 95bd23c: `navigation` is declared on the `object-timeline` block, by reference to `@objectstack/spec` (objectui#8654). This is the timeline arm of the objectui#8652 maintainer ruling: the spec declares the key on the `object-timeline` element from 17.5.0, for the block standalone, and objectui now mirrors it.
865
+
866
+ - `ObjectTimelineProps['schema']` declares `navigation` with the spec's `NavigationConfig` type (`ViewNavigationConfig`), the type the grid, kanban and calendar schemas use. `ObjectTimeline` reads the key without a cast. `TimelineSchema` in `@object-ui/types` is unchanged: it describes the presentational rail, which does not read the key.
867
+ - The `object-timeline` and `view:timeline` registrations publish `navigation` in their `inputs`, so the designer offers it.
868
+ - An authored `{ "type": "object-timeline", "properties": { … } }` document was already judged by the spec row: a bad `mode` is refused at `properties.navigation.mode`, and a member the spec does not declare inside the block is refused. That is unchanged and now pinned.
869
+
870
+ What a click does with each member is unchanged. `drawer`, `modal` and `popover` open the entry's record in that overlay, and `new_window` or `openNewTab: true` opens the record page in a new tab. Three things open nothing on a timeline that no parent view navigates for: an absent key, `page` (also what a block without `mode` resolves to), and `split`. The published input description says so.
871
+
872
+ **Note, 2026-10-01 (objectui#11168 slice 3, shipping in this same release).**
873
+ The last paragraph above says `page`, and a block without `mode`, open nothing
874
+ on a timeline that no parent view navigates for, and that the published input
875
+ description says so. objectui#11293 changed that in this same release: a
876
+ `page` click with no `onNavigate` now goes to the record navigator the host
877
+ publishes, which the console publishes on its custom pages, record pages and
878
+ list views. Under such a host `page` and a block without `mode` open the record
879
+ page. They open nothing only under a host that publishes none, such as an
880
+ embedded renderer. The input description now says so (objectui#11168). An
881
+ absent key and `split` still open nothing.
882
+
883
+ **Note, 2026-10-02 (objectui#11168 slice 5, shipping in this same release).**
884
+ `objectName` is no longer required on `object-timeline` / `view:timeline`: a
885
+ timeline drawn from `items`, `data` or a `bind` path names none. On such a
886
+ timeline there is no record page. `page`, and a block without `mode`, open
887
+ nothing even under a host that publishes its record navigator, and
888
+ `new_window` or `openNewTab: true` open a tab at a slash and the entry's `id`
889
+ alone, not the record page. So "opens the record page in a new tab" above, and
890
+ "they open nothing only under a host that publishes none" in the earlier note,
891
+ hold for a timeline that names its `objectName`. The input description says
892
+ so.
893
+ - a9d97be: Close the numeric-falsy `SchemaNode` slot class: a slot may no longer guard itself
894
+ (objectui#9162, triage ruling 2026-09-12).
895
+
896
+ **What leaked.** `{schema.footer && <CardFooter>…</CardFooter>}` does not evaluate to
897
+ `false` when the slot is falsy — it evaluates to the **slot**, and React renders
898
+ numbers. A node slot's published zod face carries a `z.number()` arm
899
+ (`nodeUnionOptions`, `packages/types/src/zod/base.zod.ts`), so `footer: 0` is **legal
900
+ authored input**, and it painted a stray `0` into the DOM. `NaN` painted three
901
+ characters. The `&&` also short-circuits, so `renderChildren`'s own
902
+ `if (!children) return null` first leg was never reached — which is why the
903
+ objectui#8908 bridge repair could not cover any of these sites.
904
+
905
+ **Why a class fix and not N instance fixes.** This class was patched one instance at a
906
+ time three times — objectui#8331 (`DataTableSchema.emptyAction`), objectui#9033
907
+ (`header-bar`'s `rightContent`), and then objectui#9162's census found eleven more,
908
+ because objectui#9033's grep was keyed on the spelling of the **right** operand while
909
+ the trap depends only on the **left** one. Nineteen guards across eight files are
910
+ repaired here, and the construct that permits them is now refused mechanically.
911
+
912
+ **The one spelling, and the gate.** `renderChildren(slot)` is the guard for a bare
913
+ slot; the new `renderNodeSlot(slot, render)` is the guard for a slot wrapped in chrome
914
+ that must disappear with it. Both route through one exported predicate,
915
+ `isEmptyNodeSlot`. The new lint rule `object-ui/no-bare-node-slot-guard` refuses the
916
+ `&&` spelling, deriving its slot set per file from the file's own text — an expression
917
+ is a node slot there if that file hands it to `renderChildren`, `renderNodeSlot`,
918
+ `toRenderableSchema` or `<SchemaRenderer schema={…}>`. A twelfth slot is rendered
919
+ through one of those, so it is covered the moment it is written, with no list to keep
920
+ up to date.
921
+
922
+ **Why `minor`.** Two reasons, and neither is a contract break.
923
+
924
+ 1. `@object-ui/components` gains public API: `renderNodeSlot` and `isEmptyNodeSlot` are
925
+ new exports. A new export is a `minor` on its own.
926
+ 2. Published renderers change what they emit for two authored inputs. A node slot
927
+ authored `0` / `-0` / `NaN` stops painting that character — that is the defect, and
928
+ no author asked for it. A node slot authored `[]` no longer renders its empty chrome
929
+ (an empty `CardHeader` / `CardContent` / `CardFooter` / `DialogFooter` /
930
+ `SheetFooter` / `DrawerFooter` / `TableFooter`, or `plugin-detail`'s wrapping
931
+ `div`); the chrome now appears and disappears with its content. Measured across
932
+ `examples/`, `content/` and `apps/`: **zero** authored node slots carry a numeric
933
+ value, and the single authored `"children": []` is on `div`, which never had the
934
+ `&&` guard and is unaffected.
935
+
936
+ ⛔ Deliberately **not** marked `**BREAKING**`: no authored input stops being accepted,
937
+ no export is removed, no key stops being read, and objectui#7105 is respected — the
938
+ declarations are untouched and node slots still relax the renderer. An author who
939
+ genuinely wants the character `0` writes `"0"` or a `text` node, both unchanged.
940
+ - 502eb58: The row/card click props on the view components now declare the modifier
941
+ payload they have always been invoked with (objectui#9357).
942
+
943
+ `useNavigationOverlay`'s `handleClick` invokes the handler it is given with two
944
+ arguments — the record, and an optional modifier payload (`metaKey` / `ctrlKey`
945
+ / `button`) a host needs to implement Cmd/Ctrl/middle-click. objectui#9360 made
946
+ the hook's own option say so. These components pass a host-supplied prop
947
+ straight into that option, so the value a host writes against them is invoked
948
+ with two arguments too — and every one of these props declared only the record.
949
+ The payload was therefore invisible on the one line a host reads, exactly as it
950
+ had been on the hook.
951
+
952
+ Thirteen declarations across nine packages now name both parameters:
953
+
954
+ - `ObjectGridComponentProps.onRowClick`
955
+ - `ObjectKanbanComponentProps.onRowClick` (its sibling `onCardClick`, the other
956
+ arm of the same fallback, already declared both)
957
+ - `KanbanRendererProps.schema.onCardClick`
958
+ - `ObjectCalendar`, `ObjectGantt`, `ObjectMap`, `ObjectTree`: `onRowClick`
959
+ - `ObjectTimeline`: `onRowClick` and `onItemClick`, the two arms of one fallback
960
+ - `ListView.onRowClick`
961
+ - `ObjectGallery`: `onRowClick` and `onCardClick`, likewise two arms of one
962
+ - `RelatedList.onRowClick`
963
+
964
+ **Source-compatible, and with no refused class.** A one-parameter handler is
965
+ still assignable to the widened signature, and a handler written against the
966
+ widened signature was already assignable to the narrow one — its minimum
967
+ argument count is still one. The second parameter is spelled `any` rather than
968
+ `HandleClickModifiers`, which is the difference that matters for callers: the
969
+ hook's own option names that interface and therefore refuses a handler whose
970
+ second parameter is annotated narrower (objectui#9360 documents that class and
971
+ the one-line remedy). These faces refuse nothing. A host that discovered the
972
+ payload from the implementation and annotated it `React.MouseEvent` — which is
973
+ what actually arrives — keeps compiling. `any` is also the spelling
974
+ `ObjectKanbanSchema.onCardClick` already carries for this same payload
975
+ (objectui#9341) and the one `BaseSchema`'s own `onClick` / `onChange` /
976
+ `onSubmit` use, and it is forced on the published twins in `@object-ui/types`,
977
+ which may not name a type that lives in a package depending on them.
978
+
979
+ **Runtime behaviour is unchanged.** Nothing is newly called and nothing newly
980
+ passes an argument; only the declarations move.
981
+
982
+ Three declarations that share the name and the shape are deliberately NOT
983
+ widened, because the value flowing through them is not invoked with the
984
+ payload: `VirtualGrid.onRowClick`, whose second parameter is a row index;
985
+ `ManageViewsDialog.onRowClick`, which receives a view id; and the `data-table`
986
+ family (`DataTableSchema.onRowClick`, `ObjectDataTableSchema.onRowClick`),
987
+ whose renderer invokes with one argument. Widening those would have declared a
988
+ payload that never arrives.
989
+
990
+ ### Patch Changes
991
+
992
+ - aa38e19: A timeline no longer crashes when its `titleField` or `descriptionField` names a lookup.
993
+
994
+ `ObjectTimeline` copied the raw `titleField` and `descriptionField` values onto each
995
+ item, and the renderer puts both in JSX. A lookup is a field like any other, and
996
+ `ObjectTimeline`'s own object fetch expands every declared relation, so a
997
+ lookup-typed title or description arrived as `{ id, name }`. React then threw
998
+ `Objects are not valid as a React child` as soon as the rows landed, and the whole
999
+ timeline failed to render.
1000
+
1001
+ The item mapping now derives the title and the description once, as display
1002
+ strings, through `@object-ui/core`'s `recordDisplayValueAt`, the resolver
1003
+ `ObjectMap` uses for the same two slots:
1004
+
1005
+ - an expanded lookup shows its display name;
1006
+ - a plain string, a number or a bare id shows as before;
1007
+ - a boolean shows as its string, where the old truthiness gate dropped `false` and
1008
+ drew an empty line for `true`;
1009
+ - a `0` shows inside its title or description line, where it used to be painted as
1010
+ a bare character beside it;
1011
+ - an empty or whitespace-only value, or an expanded record with no display name,
1012
+ shows no line, and surrounding whitespace is trimmed.
1013
+
1014
+ No schema or spec key changes. `ObjectTimeline.lookupDisplay-10530.test.tsx` pins
1015
+ each case above.
1016
+ - 02e6d36: Five more page blocks re-read when the data-invalidation bus (`notifyDataChanged` from `@object-ui/react`) reports a write to the object they read (objectui#10623). These blocks read neither `onMutation` nor the bus, so any write — through the data source or past it (a page action over raw HTTP, a flow, a server action) — showed only when something remounted them. Each fetch effect now names the `useDataInvalidation` nonce for its object; an unscoped change (`'*'`) matches too, and a change to another object does not.
1017
+
1018
+ - `@object-ui/plugin-timeline`: `object-timeline` re-reads its rows; a canvas that already shows rows stays mounted while the re-read runs.
1019
+ - `@object-ui/plugin-list`: `object-gallery` re-reads its cards; collapsed groups stay collapsed.
1020
+ - `@object-ui/plugin-map`: `object-map` re-reads the markers it is showing without its loading placeholder, so the map stays mounted and the camera stays where the user left it. If that re-read fails, the last markers stay on the map and the failure is logged to the console, as `ObjectGantt`'s background refresh does. A changed query still shows the placeholder and re-fits the camera, even when a bus event arrives with it. Two older faults in the same fetch are fixed as well: a slow earlier answer can no longer overwrite a newer one, and a load that succeeds now takes the map off an earlier error screen.
1021
+ - `@object-ui/components`: `element:number` re-reads its aggregate and `element:repeater` its rows.
1022
+
1023
+ Rows a host hands these blocks (`data`, `bind`, authored `items`, an inline `value` set) are still the host's to refresh; only the blocks' own queries follow the bus.
1024
+ - d435e96: fix(plugin-timeline): a failed load no longer keeps `ObjectTimeline` on its error screen after a later load succeeds (objectui#10663)
1025
+
1026
+ `ObjectTimeline` set `error` when its fetch failed, and the render returns the
1027
+ error screen early whenever `error` is set. Nothing ever cleared it. Every later
1028
+ load that succeeded still wrote its rows, but the timeline stayed on the error
1029
+ screen until it remounted. Since objectui#10623 the timeline re-reads on every
1030
+ data-invalidation event, so one failed background re-read was enough.
1031
+
1032
+ The current run of the fetch now clears the error when it commits rows: those
1033
+ rows answer the current query, so the earlier failure no longer describes the
1034
+ screen. This is the rule objectui#10578 set for `ObjectGantt`. The error is not
1035
+ cleared when a run starts; it stays until rows land.
1036
+
1037
+ Only the current run writes the error at all. A run that a newer one has
1038
+ superseded can no longer clear the current run's error, or put the error screen
1039
+ over the current run's rows.
1040
+
1041
+ A failed background re-read is still reported: the timeline has no silent mode,
1042
+ so it shows the error screen rather than keeping the last good rows, and the
1043
+ next re-read that succeeds takes the screen back.
1044
+ - f9c06ef: Every data node that sends its own authored `filter` into a query now resolves the spec's context tokens first (objectui#10666). With `filter: [['owner', '=', '{current_user_id}']]` these nodes used to send the literal token; they now send the signed-in user's id, and `{current_org_id}` resolves to the active organization:
1045
+
1046
+ - `object-calendar`, `object-map` and `object-tree`, on both the object query and the inline (`provider: 'value'`) query;
1047
+ - `object-gantt`, `object-kanban` and `object-timeline`;
1048
+ - `record:related_list` and `record:line_items`, where the node's own filter is combined with the parent-record condition;
1049
+ - the `element:repeater`, `element:number` (both the `aggregate` filter and the `find` fallback) and `element:record_picker` page elements.
1050
+
1051
+ `list-view`, `object-grid` and `object-gallery` already did this, and are unchanged.
1052
+
1053
+ **New in `@object-ui/react`: `useResolvedFilter(filter, scope)`.** Pass it a node's authored filter and `useFilterScope()`. It resolves the filter through `@object-ui/core`'s shared `resolveFilterPlaceholders` and holds the result: re-rendering with an equal filter (even one rebuilt inline on every render) hands back the same value, so a fetch effect keyed on it does not run again, while a structurally different filter or a change of signed-in user or organization resolves again. A filter with no token to resolve is handed back as the value you passed in. The hold is the one `list-view` and `object-gallery` used privately; `plugin-list` now imports it from here, and no second copy remains in that package.
1054
+
1055
+ What changes for an app:
1056
+
1057
+ - A filter with no placeholders reaches the query as before, unchanged.
1058
+ - Nodes that re-queried whenever the host rebuilt an equal filter inline (`object-calendar`, `object-gantt`, `object-kanban`, `object-map`, `object-tree`) no longer issue those redundant queries.
1059
+ - Date macros such as `{today}` in these nodes' own filters are now resolved in the browser's local time, as they already are for `list-view`, `object-grid` and `object-view`. Before, they reached the server as literals, and the server resolved them in the tenant's time zone.
1060
+
1061
+ `@object-ui/types`: the `filter` docblocks on `ObjectMapSchema`, `ObjectTreeSchema`, `ObjectGanttSchema`, `ObjectCalendarSchema`, `ObjectKanbanSchema`, `ObjectChartSchema` and `ObjectGallerySchema` (and the matching zod descriptions) no longer say the filter is forwarded verbatim; they say its context tokens are resolved first. No type changes.
1062
+ - 93a5585: fix(plugin-timeline): an `object-timeline` block shows the rows of its current query, not an earlier answer that arrived late (objectui#10684)
1063
+
1064
+ `ObjectTimeline` numbers the runs of its fetch, but only its `error` writes read
1065
+ that number (objectui#10663). The rows and the loading flag were written by every
1066
+ run. When the query changed while a read was in flight (a new filter, sort or
1067
+ object, or a data-invalidation re-read), the earlier answer could arrive after
1068
+ the current one and replace the current rows. An earlier read that settled first
1069
+ also cleared the loading skeleton while the current read was still in flight.
1070
+
1071
+ Only the current run writes the rows and clears the loading flag now. An answer
1072
+ from a superseded run is dropped when it arrives. The current run still clears
1073
+ the loading flag on every exit, including a failed read.
1074
+ - e239161: docs(plugin-timeline): the README's "Schema-Driven Usage" example is now a document the validator accepts
1075
+
1076
+ The example spelled its node `component: 'timeline'`. Every node in the protocol
1077
+ is keyed by `type`, so `safeValidateSchema` — the call `objectui validate` makes —
1078
+ refused the document exactly as a reader would copy it (`invalid_union` at
1079
+ `type`), and rendering it painted the registry's "Unknown component type" panel
1080
+ instead of a timeline. The README ships in this package's tarball, so the wrong
1081
+ spelling was on the npm landing page (objectui#10824).
1082
+
1083
+ The node is now `type: 'timeline'`. The rest of the example already fits the item
1084
+ element objectui#6356 declared — a feed item with `time`, `title`, `description`
1085
+ and `variant` — so nothing else in it moves.
1086
+
1087
+ A new pin extracts that block from the README on every run and feeds it to
1088
+ `safeValidateSchema` and to the strict authoring face, so the example cannot drift
1089
+ from the schema again without a test going red. No source or behaviour change.
1090
+ - 200ceef: A `plugin-timeline:timeline` node no longer writes its own schema onto the
1091
+ page as HTML attributes (objectui#10841).
1092
+
1093
+ `TimelineRenderer` collected every prop it did not name and spread them onto
1094
+ the root element of each variant. Created through `SchemaRenderer`, that bag
1095
+ holds every node key left after `SchemaRenderer` strips its metadata keys, so
1096
+ the rendered timeline carried `items="[object Object]"`, `variant="vertical"`,
1097
+ `dateformat="long"` and, on a gantt, `scale` / `rowlabel` / `mindate` /
1098
+ `maxdate`. React also logged an unknown-prop warning for each camelCase key.
1099
+ The renderer reads all of those keys off `schema`, so nothing it draws
1100
+ changes.
1101
+
1102
+ The root now takes the same route as the converged renderers in
1103
+ `@object-ui/components`: the bag goes through `toDomProps`, the SDUI widget
1104
+ contract's DOM pass-through in `@object-ui/core`, and `style` is forwarded by
1105
+ name. That keeps the `data-obj-id` / `data-obj-type` locator, the
1106
+ `data-testid` an authored `testId` promises, the resolved `aria-*` / `role`,
1107
+ `id`, `tabIndex`, and the host event handlers that contract forwards
1108
+ (`dom-props.ts` declares the full set).
1109
+
1110
+ Dropped, and no longer on the root:
1111
+
1112
+ - every authored schema key;
1113
+ - the `disabled` attribute a disabled node used to put on the `ol` / `div`
1114
+ root, where it had no effect;
1115
+ - `name` / `label`, which `BaseSchema` declares but which have no effect on an
1116
+ `ol` / `div`;
1117
+ - an authored `title`, which the timeline node does not declare. It is a
1118
+ global HTML attribute, so dropping it removes the native tooltip it used to
1119
+ put on the root.
1120
+
1121
+ `ObjectTimeline` hands `TimelineRenderer` its schema alone, so the object-bound
1122
+ timeline is unchanged. The prop type is unchanged.
1123
+ - 9e6619f: fix(plugin-timeline,core): the timeline's gantt axis draws a stored date-only day on that day in every viewer zone, and the formula date functions do their day arithmetic on the UTC calendar, as the server does (objectui#10866, slice 3)
1124
+
1125
+ - **Timeline, gantt variant.** Every date string the gantt branch reads now goes through `toDisplayDate` from `@object-ui/core`, the step its bar tooltip already takes: in the axis headers, the extent computed from the rows, the bar positions, the validity check and the check that the start is not after the end. A date-only value is local midnight of the day it names, and a value with a time part keeps its instant, which the axis places at its local hour in the viewer's day. A number or a `Date` is an instant and is read as before. West of UTC the headers no longer read the day before: a day axis over October 5th to 7th reads Oct 5, Oct 6, Oct 7, and the schema catalog's `gantt-style-timeline.json` reads Jan 2024 to Apr 2024, where it read Dec 2023, Jan 2024, Mar 2024, Apr 2024 in Los Angeles. So the axis now agrees with the bar tooltip. The computed extent is printed as the viewer's calendar day. An empty plan's one-day axis is the viewer's today, where it was the UTC day. A bar date naming a day its month does not have, such as `2026-02-30`, is now refused by the render-time "not a valid date" message, where it was rolled into March and drawn there. `generateTimeScaleHeaders`, which the package exports, reads a date-only `minDate` / `maxDate` the same way.
1126
+ - **Formula date functions.** `DATEADD`, `DATEDIFF` and `DATEFORMAT` in `@object-ui/core` now do a calendar day's arithmetic on the UTC calendar. A date-only value naming a day its month has is read as UTC midnight of that day, as before, and is now moved and read with UTC setters and getters, so what the three answer for a day no longer depends on the viewer's zone. `DATEADD` hands such a day moved by days, months or years back as `YYYY-MM-DD`, where it gave an instant string. Its months clamp to the target month's last day, as the server's `addMonths` does: `DATEADD('2026-01-31', 1, 'month')` is `2026-02-28`, where it was `2026-03-03T00:00:00.000Z` in every zone, and a year from February 29th is February 28th. West of UTC, `DATEFORMAT('2026-09-01', 'YYYY-MM-DD')` no longer prints `2026-08-31`, `DATEDIFF` in months or years counts between the stored days rather than the days before them (`DATEDIFF('2026-08-31', '2026-09-01', 'month')` read 0), and a day added across a DST change no longer lands an hour off midnight. A value with a time part is unchanged: it is still moved and read in the viewer's zone and comes back as an instant, so `DATEFORMAT` still prints an instant's clock in the viewer's zone. So is a date-only value naming a day its month does not have, which the engine rolls forward as before. `TODAY()` is unchanged.
1127
+ - eb97ce6: fix(plugin-timeline,plugin-charts,i18n): a stored date-only day reads as that day in every viewer zone on the timeline, on a chart's date axis and in the published date helpers (objectui#10866, slice 2)
1128
+
1129
+ These readers parsed a `YYYY-MM-DD` value with the engine's own `Date` parse, which reads it as UTC midnight, so every viewer west of UTC saw the day before. Each now reads the value through `toDisplayDate` from `@object-ui/core`, which rebuilds a date-only value at local midnight of the day it names. A value with a time part keeps its instant.
1130
+
1131
+ - **Timeline.** The object timeline's date bucket, its sort and the item date the renderer prints read the value that way. West of UTC an item due today no longer sits under "Overdue", one due tomorrow no longer sits under "Today", and the `short` and `long` item faces print the stored day. The `iso` face prints a date-only value's day from local getters, and an instant's UTC day as before. A day its month does not have, such as `2026-02-30`, is no longer rolled into March: the item sits under "No date", sorts with the dateless items, and its `short` and `long` faces are the ones an unparsable value already had. An unparsable value now sorts with the dateless items too, and the `iso` face prints such a value as written where it used to throw. The gantt variant's axis headers, extent and bar positions are not changed here, so west of UTC its bar tooltip, which prints through the same item-date function, now names the stored day while the axis above it still reads the day before, until a later slice of objectui#10866.
1132
+ - **Charts.** A date-only category on the x axis reads `Sep 1` for `2026-09-01`, and `Sep 2026` on a month-grained axis, in every zone. When the display locale is a tag `Intl` refuses, the tick still prints the stored day: it reads the local-midnight value with local getters, because its `toISOString()` would name the day before east of UTC. An instant's fallback keeps its UTC day. A date-only category naming a day its month does not have falls back to the raw category, the face any other non-date category gets, instead of the rolled day.
1133
+ - **i18n helpers.** `formatDate`, `formatDateTime`, `formatRelativeTime` and `formatDateSpec` read a date-only string as the day it names: `formatDateTime` shows midnight of that day, and `formatRelativeTime` counts to the start of it. `formatDateSpec` applies its `timeZone` to an instant only, and formats a date-only value in the local zone, where the shared step's local midnight reads back as its day; a `timeZone` west of UTC no longer turns `2026-09-01` into August 31st for every viewer. All four return a day its month does not have as the raw string. `formatRelativeTime` now returns an unparsable value as its string, the face the other three already gave one, where it used to throw a `RangeError`.
1134
+ - 2fb0f9a: fix(plugin-timeline): a gantt-variant timeline draws its headers and bars on one continuous axis, so each bar lines up under its header (objectui#11079)
1135
+
1136
+ - **Bars now sit under their headers.** The header row was one equal-width column per unit from the first date to the last date inclusive, while the bars were measured on the span from the first date to the last date, one unit shorter. So every bar after the first sat off its column: on a day axis over October 5th to 7th, the bar starting on the 6th was drawn halfway across the chart under a column that starts at one third. Both are now drawn on one axis, from the start of the first unit to the end of the last. A bar that starts on a day, a month or a quarter begins exactly where that unit's header begins.
1137
+ - **Each header is as wide as its unit is long.** Hour, day and week columns are equal. A month column is as wide as its days, so February is narrower than January, and a quarter or a year is as wide as its days. Across a daylight-saving change a day column is 23 or 25 hours wide, as the day is.
1138
+ - **Each unit starts on its boundary.** A month axis from January 15th to April 10th now has an April column, and one from January 31st no longer skips February. `generateTimeScaleHeaders`, which the package exports, returns these labels.
1139
+ - A task that starts and ends at the same instant is a zero-width bar at that instant, as it already was on any plan with two distinct dates. A plan whose only dates were one such day used to draw that bar across the whole chart.
1140
+ - c27b575: fix(plugin-timeline,types): a gantt-variant timeline draws a date-only end through the end of that day (objectui#11112)
1141
+
1142
+ - **A date-only `endDate` is inclusive.** A bar authored `2024-01-01` to `2024-01-31` now fills January and ends exactly where the February column begins. It used to end at the start of January 31st, one day short of its column. A bar that starts and ends on the same day is now one day wide, where it was zero wide. An end with a time part, or given as a number or a `Date`, is still an instant, and the bar ends exactly there, so a task that starts and ends at the same instant is still a zero-width bar at that instant.
1143
+ - **The computed axis reaches the end of every bar.** On an `hour` axis, the axis a gantt computes from its bars now runs through the last day of a date-only end, and to the hour of an instant end. It used to stop after the first hour of the last day, so those bars ran off the chart. A `minDate` / `maxDate` the author pins is still exactly the author's range, and the other scales gain no column.
1144
+ - The bar tooltip still prints the end as authored.
1145
+ - `TimelineGanttItemBar.endDate` in `@object-ui/types` now documents the inclusive reading, on both the TypeScript type and its zod description. What it accepts is unchanged.
1146
+ - 858eafb: fix(plugin-gantt,core,plugin-timeline): both gantt surfaces read a date-only end inclusively through one core rule, and a drag writes the same day back (objectui#11141)
1147
+
1148
+ **A widening: `@object-ui/core` gains two exports**, `toDisplayEndDate(value)` and `toInclusiveEndDay(end)`, on its published entry beside `toDisplayDate` (the same file, `utils/date-display.ts`, re-exported by `export *`). Nothing else in `@object-ui/core` is added, removed, renamed or retyped.
1149
+
1150
+ - **A date-only end is inclusive on the object gantt too.** `ObjectGantt` read a stored end like a start, as the named day's local midnight, so every bar was drawn one day short and a successor starting the next day stood one day after its predecessor. The schema catalog's own plans drew that way. A task from `2024-01-01` to `2024-01-15` now runs through January 15th, and a successor starting `2024-01-16` begins exactly where it ends, as the timeline's gantt already drew it (objectui#11112). A task whose date-only start and end name the same day is now one day long, where it was a zero-length milestone. An end with a time part is still an instant, and the bar ends exactly there. Baseline ends read the same way.
1151
+ - **One rule, in `@object-ui/core`.** `toDisplayEndDate` reads an end: a date-only value becomes the start of the next day (a calendar day, so 23 or 25 hours across a DST change), and anything else is read as `toDisplayDate` reads it. `toInclusiveEndDay` is its exact inverse: it names the last day a span ending at an instant runs through. The timeline's gantt and `ObjectGantt` both read their ends through the first, so they cannot drift apart again. A day whose OWN midnight does not exist in the viewer's zone (`America/Santiago` on 2026-09-06, which starts at 01:00) now ends at the next day's midnight; the timeline used to end it at 01:00 of that next day. A day whose NEXT midnight does not exist (2026-09-05 there) still ends at the next day's first hour, as it did.
1152
+ - **A drag writes the day the bar runs through.** A dragged or resized bar whose end lands on a day's midnight writes the day before it into a date-only end field, so reading, dragging and writing a stored `2024-01-15` leaves `2024-01-15`. This also holds under a business `timeZone` whose clock skips a midnight. A `datetime` end still writes its instant.
1153
+ - **The view names that day.** `GanttView`'s End column, row date line, tooltip, drag preview and inline editor now name the last day a bar runs through, and the tooltip's day count includes it. Pressing Enter on an untouched row in the inline editor commits the end it started with. An end inside a day still names that day, and a zero-length task still names its own day. An embedder that passes `GanttView` a `Date` end directly now sees that end named as the last day the bar covers. A local-midnight end is named as the day before, which is where its bar already stopped.
1154
+ - With `autoZoomToFilter: false`, the pinned range ends on the last day any task runs through, and no longer adds an empty day column after it.
1155
+ - 20d23be: The `object-timeline` / `view:timeline` `navigation` input description had three wording errors, and all three are corrected (objectui#11168 slice 3, from the contract record on objectui#8654 and the one on PR #11335).
1156
+
1157
+ - The reason `split` opens nothing (the timeline hands the split shell no main panel) was attached to `page` and `none` as well. It now applies to `split` alone.
1158
+ - The description said `openNewTab: true` "outranks the mode". That does not hold for `none`, which is checked first, as `preventNavigation` is. The description now says `openNewTab` outranks every mode except `none`.
1159
+ - The description said `page`, and a block without `mode`, open nothing on a timeline no parent view navigates for. Since objectui#11293 they open the record page through the record navigator the host publishes (the console publishes one on its custom pages, record pages and list views), and they open nothing only under a host that publishes none. The description now says so. An absent key still opens nothing.
1160
+
1161
+ The README and the docs page's navigation table and callout are corrected the same way. Behaviour is unchanged.
1162
+
1163
+ **Note, 2026-10-02 (objectui#11168 slice 5, shipping in this same release).**
1164
+ "They open nothing only under a host that publishes none" above holds for a
1165
+ timeline that names its `objectName`. Slice 5 made `objectName` optional, and
1166
+ on a timeline that names none, `page` and a block without `mode` open nothing
1167
+ under any host, while `new_window` and `openNewTab: true` open a tab at a slash
1168
+ and the entry's `id` alone, not the record page. The description now says both.
1169
+ - 39f4309: Published typings from every `vite-plugin-dts` package now carry an explicit extension on
1170
+ every relative specifier, and a type error in the declaration build now fails the build
1171
+ instead of being printed and ignored (objectui#5439, objectui#5483).
1172
+
1173
+ **Consumers on `moduleResolution: nodenext` or `node16` may see NEW type errors, and that
1174
+ is the fix working.** These packages re-export mostly through NAMED re-exports —
1175
+ `export { useObjectChat } from './useObjectChat'`. TypeScript could not follow the
1176
+ extensionless hop, but it still DECLARED the name, so the symbol resolved to a silent
1177
+ `any`. Nothing errored; consumers simply got no types. With the extension emitted, the
1178
+ symbol carries its real type, and any call site that was relying on the `any` now type
1179
+ checks for the first time. This is the mode that produced the 21 residual `TS7006` on
1180
+ `@object-ui/app-shell` reported against objectui#5365 — a type hole that opened quietly,
1181
+ unlike objectui#5365's own `export * from './ui'` packages where the same defect surfaced
1182
+ immediately as `TS2305: has no exported member`.
1183
+
1184
+ 410 extensionless relative specifiers across 19 packages were emitted before this change;
1185
+ the count is now 0 in all 22 packages that build typings through `vite-plugin-dts`.
1186
+ `@object-ui/fields` was already clean — its sources write explicit `.js` specifiers — and
1187
+ is wired so it stays that way.
1188
+
1189
+ The second half changes no emitted output today: 22/22 packages built green unmodified, so
1190
+ making the declaration step's exit code honest turns nothing red. It changes what a FUTURE
1191
+ regression does — print and exit 0, versus fail the build.
1192
+ - d813e8b: The bare `timeline` component key is now owned by DECLARATION rather than by
1193
+ module-evaluation order (objectui#6353).
1194
+
1195
+ `packages/plugin-timeline` registers the same short name twice —
1196
+ `plugin-timeline:timeline` (`src/renderer.tsx`, the presentational renderer) and
1197
+ `view:timeline` (`src/index.tsx`, the object-bound `ObjectTimelineRenderer`). Neither
1198
+ passed `skipFallback`, so under `Registry.register` both also claimed the **bare**
1199
+ `timeline` key and the last module to evaluate won it. `src/index.tsx` re-exports
1200
+ `./renderer` (line 300) before its own `import` (line 307), so the presentational one
1201
+ registered first and the object-bound one overwrote it.
1202
+
1203
+ The resolved outcome was the intended one and **does not change here**: `type:
1204
+ 'timeline'` still renders `ObjectTimelineRenderer`, which delegates inward to the
1205
+ presentational renderer. What changes is that it is now decided rather than inherited.
1206
+ Reordering those two lines would previously have handed `type: 'timeline'` to the
1207
+ presentational renderer, which reads none of the object-bound keys (`object`, `filter`,
1208
+ `sort`, `limit`) — an authored timeline would have stopped fetching, with no error and
1209
+ no failing test. The registry's own collision guard names this remedy in its warning
1210
+ text; this applies it.
1211
+
1212
+ `src/renderer.tsx` now registers with `skipFallback: true`, so only `view:timeline`
1213
+ claims the bare key, in any evaluation order. The presentational renderer stays
1214
+ reachable under its explicit `plugin-timeline:timeline` key, which is the lookup a
1215
+ presentational host already uses — no consumer-visible resolution changes.
1216
+
1217
+ `src/__tests__/timeline-bare-key-ownership.test.ts` is the half that outlives the fix:
1218
+ it fails if the declaration is dropped, if a third registration starts claiming the bare
1219
+ key, or if resolution becomes order-dependent again. It reads both registrations' real
1220
+ declared metadata back out of the registry and replays them into a fresh `Registry` in
1221
+ **both** orders, so order-independence is a property under test rather than a property
1222
+ of the file the test happens to import.
1223
+ - f7ea89b: An object-bound timeline with `variant: 'gantt'` refuses loudly instead of
1224
+ throwing (objectui#6655).
1225
+
1226
+ The two timeline item shapes are not interchangeable, and this path crossed
1227
+ them. `ObjectTimeline` maps each record to a flat FEED item — one per record,
1228
+ no nested `items` — while the renderer's gantt branch reads a gantt ROW
1229
+ (`row.items[].startDate`). Every `row.items` was therefore `undefined`,
1230
+ `calculateDateRange` reduced an empty list, `Math.min()` over it was `Infinity`,
1231
+ and `new Date(Infinity).toISOString()` threw `RangeError: Invalid time value`
1232
+ mid-render. There was no guard and no diagnostic — the component simply threw.
1233
+
1234
+ Per the maintainer ruling of 2026-08-29, the object-bound path now rejects
1235
+ `variant: 'gantt'` with an author-facing diagnostic naming the limitation
1236
+ (object-bound timelines render the feed variants; gantt needs literal rows, each
1237
+ carrying its own nested items). Composing real gantt rows from records was
1238
+ considered and NOT adopted; that capability stays open and unruled.
1239
+
1240
+ The refusal keys on whether the items were AUTHORED, not on the variant alone,
1241
+ so a literal gantt is untouched — including the bare `timeline` key that this
1242
+ component answers, which is what the in-repo catalog fixture
1243
+ `plugin-timeline/gantt-style-timeline.json` uses. The feed variants
1244
+ (`vertical` / `horizontal`) and the presentational `TimelineRenderer` are
1245
+ unchanged.
1246
+
1247
+ Side effect the ruling asked for: the gantt-only axis this path composes
1248
+ (`timeline.scale ?? scale`) is no longer silently inert on the gantt variant —
1249
+ an author who set it is now told why it has no effect, rather than getting a
1250
+ crash.
1251
+ - 3beef6d: The spec's `dataSource` element binding is now DECLARED by the blocks that read
1252
+ it, so the html tier stops reporting the one working saved-view spelling as
1253
+ `unknown-prop` (objectui#6678).
1254
+
1255
+ `PageComponentSchema.dataSource` — `{ object, view, filter, sort, limit }` — is
1256
+ the one spelling that resolves a saved view for an object-bound block. It works,
1257
+ and it drew the identical `unknown-prop` warning as the two spellings that do
1258
+ nothing (`viewName`, `view`), because `validateTree` looks a prop up in the
1259
+ block's declared `inputs` and no registration declared this key. On the tier
1260
+ built to accept AI-authored pages, where the diagnostic IS the contract, the
1261
+ only signal pointed away from the key that works.
1262
+
1263
+ Adopting the maintainer ruling of 2026-08-29 — option B **in the injection
1264
+ form**:
1265
+
1266
+ - `ELEMENT_DATA_SOURCE_INPUT` is the single declaration, in `@object-ui/core`
1267
+ beside the binding's own semantics; `Registry.register` emits it for any
1268
+ registration whose renderer passed through the new `elementDataSourceBlock()`
1269
+ seam. One mechanism, one copy — not a hand-kept declaration per block, which is
1270
+ the shape that drifts and that a new block forgets. The seam lives in
1271
+ `@object-ui/core` and is re-exported by `@object-ui/react` beside
1272
+ `ElementDataSourceGate` for discoverability; call sites take the core import,
1273
+ because a registration runs at module scope and this repo's suites partially
1274
+ mock `@object-ui/react`.
1275
+ - Seventeen renderers, in thirteen files across twelve packages, reach the seam
1276
+ and now publish the key to the save gate, the parser whitelist, the generated
1277
+ JSX authoring types and the block list. The card named nine blocks; the tree
1278
+ also has `plugin-grid`, `plugin-timeline`, two further `plugin-form` blocks and
1279
+ `element:record_picker` — nothing was hand-listed, so the mechanism covered
1280
+ them. `element:record_picker` consumes the gate's HOOK and status panels rather
1281
+ than the wrapper tag (its object lives under `properties`), and was found by a
1282
+ render probe rather than by reading sources.
1283
+ - `dataSource` on a block that does NOT read it (`flex`, `card`) still reports
1284
+ `unknown-prop`. Adding the key to `sdui-parser`'s `BASE_PROPS` was refused for
1285
+ exactly this reason — that set mirrors `BaseSchema`, and silencing the key
1286
+ everywhere would make the diagnostic lie in the other direction.
1287
+ - New `check:element-data-source-declaration` fails any source that consumes the
1288
+ gate without reaching the seam, so a block added tomorrow cannot forget.
1289
+
1290
+ Behaviour of the binding itself is unchanged — this is a declaration, not a
1291
+ resolution change. The saved view still resolves its columns, and an
1292
+ unresolvable `view` still fails loudly rather than widening to the object's full
1293
+ scope.
1294
+
1295
+ The spec/registry parity gates (repo-wide and the `record:related_list` per-block
1296
+ pin) now derive their accepted set from the WHOLE node contract rather than from
1297
+ `ComponentPropsMap[type]` alone. `PageComponentSchema` accepts and keeps
1298
+ `dataSource` on a page-component node — it is a node-level key, a sibling of
1299
+ `type` and `className`, not a per-block prop — so the gates' previous complaint
1300
+ was measurably wrong. Derived from the spec, not exempted, and both still
1301
+ discriminate against an invented key.
1302
+ - 15b1776: A gantt timeline with an EMPTY literal `items` array renders a zero-row grid instead of
1303
+ throwing (objectui#6750).
1304
+
1305
+ `calculateDateRange` reduced the empty list with no guard: `allDates` is `[]`, `Math.min()`
1306
+ over no arguments is `Infinity`, and `new Date(Infinity).toISOString()` throws `RangeError:
1307
+ Invalid time value` during render. Both entry points crashed identically — `TimelineRenderer`
1308
+ given `{ variant: 'gantt', items: [] }`, and `ObjectTimeline` given the same schema (an
1309
+ authored empty array is truthy, so it passes straight through as authored items).
1310
+
1311
+ An empty gantt is the **ordinary empty state of a valid schema**, not a malformed document.
1312
+ Any author or generator that builds `items` from a collection emits `items: []` the moment
1313
+ the collection is empty — a filtered project list with no matches, a fresh workspace, a plan
1314
+ whose rows are yet to be added.
1315
+
1316
+ The fix covers the whole gantt branch in one pass rather than the one `throw`, because
1317
+ patching only the crash site moves it two stops down the same branch:
1318
+
1319
+ - `calculateDateRange` returns a one-day sentinel range anchored on today when the rows carry
1320
+ no dates at all. The span is one day — the smallest coherent range — because how much time
1321
+ an empty gantt should show is a question about what an empty gantt should look like, which
1322
+ this change deliberately does not answer.
1323
+ - `generateTimeScaleHeaders` needed no change, and that is a measured verdict rather than an
1324
+ assumption: a degenerate `min === max` range is not inverted, so the loop runs once and
1325
+ every scale emits exactly one bucket. The empty gantt therefore gets a real one-column axis,
1326
+ not a header row with zero cells.
1327
+ - `calculateBarDimensions` gains a `totalDuration === 0` guard. A zero-width axis — every task
1328
+ starting and ending on the same day, or an author pinning `minDate === maxDate` — divided
1329
+ `0 / 0` into `NaN`, and the bar was handed `left: NaN%; width: NaN%`. That is not a crash
1330
+ and not a visible error: the CSSOM rejects both declarations, so React left the element with
1331
+ no `style` attribute at all and the bar rendered unpositioned and zero-width. On a zero-width
1332
+ axis every task covers the whole of it by definition, so the guard returns `{ start: 0,
1333
+ width: 100 }`.
1334
+
1335
+ An author-pinned `minDate` / `maxDate` is untouched by the sentinel: the gantt branch resolves
1336
+ `schema.minDate || dateRange.minDate`, so a pinned range with `items: []` renders exactly that
1337
+ range with no rows in it — most likely what the author wanted, and free.
1338
+
1339
+ **No product judgment about what an empty gantt should look like.** "Do not crash" is a
1340
+ correctness floor; whether the empty case should become the repo's standard empty-state panel
1341
+ instead of a zero-row grid is a separate, still-open question, and substituting one here would
1342
+ have been taking a decision that was left open on purpose. objectui#6655's object-bound gantt
1343
+ refusal is also untouched and stays keyed on whether items were authored, which is precisely
1344
+ why it does not fire on this case.
1345
+ - 4f3a1e2: fix(plugin-timeline): refuse an unusable gantt date range with a diagnostic that names the offending value
1346
+
1347
+ A gantt whose date range cannot be used now renders a `role="alert"` diagnostic
1348
+ naming the value that made it unusable, instead of crashing or drawing a chart
1349
+ that is confidently wrong. Two input classes, which failed in opposite
1350
+ directions:
1351
+
1352
+ - A date that does not parse threw `RangeError: Invalid time value` mid-render —
1353
+ the same crash site objectui#6750 guarded for the empty list, on a different
1354
+ input. This covers a malformed value (`startDate: 'not-a-date'`), an absent
1355
+ one, and an unparseable `minDate` / `maxDate` pinned on the schema.
1356
+ - An inverted pinned range (`minDate` after `maxDate`) drew a bar at
1357
+ `left: 157.9%; width: -4.3%` under a header row with zero cells, with no
1358
+ error and no diagnostic.
1359
+
1360
+ Valid gantts, the empty-list sentinel from objectui#6750 and the degenerate
1361
+ `minDate === maxDate` axis are unchanged.
1362
+ - e661d63: fix(plugin-timeline): refuse a `null` gantt date instead of drawing it at the epoch
1363
+
1364
+ `new Date(null).getTime()` is `0`, not `NaN` — the Unix epoch, not an invalid
1365
+ date — so a `null` `startDate` / `endDate` passed the objectui#6759 parse guard
1366
+ and reached the arithmetic as `1970-01-01`. One row item with `endDate: null`
1367
+ drew a 649-column axis spanning 1970 to 2024 and a bar at
1368
+ `left: 100%; width: -100%`, with no error and no diagnostic; a `null`
1369
+ `startDate`, or both null, drew a bar with entirely plausible geometry on an
1370
+ axis anchored in 1970 — a chart a reader would believe.
1371
+
1372
+ A `null` row date now renders the same `role="alert"` diagnostic objectui#6759
1373
+ established, naming the authored path and spelling the value as `null`. This is
1374
+ consistency with that card rather than a new policy: it already refuses the same
1375
+ absence spelled `undefined` (an omitted `endDate`), and which of the two a
1376
+ document carries is decided by the record mapping upstream, not by the author.
1377
+
1378
+ Unchanged: a `minDate` / `maxDate` pinned as `null` is falsy, so the caller
1379
+ discards it and the rows' own range still renders; numeric timestamps and `Date`
1380
+ instances still render; objectui#6750's empty-list sentinel and every valid
1381
+ gantt are untouched.
1382
+ - 85f6a60: Gantt dates are now judged by TYPE: a `string`, a finite `number`, or a `Date`
1383
+ — anything else is refused (objectui#6781, maintainer ruling 2026-08-30).
1384
+
1385
+ **This is a reject-direction change. Metadata that renders a chart today can
1386
+ stop rendering one.** `new Date(x)` runs ToPrimitive on anything, so values that
1387
+ are not dates at all used to become instants silently. These now produce the
1388
+ same loud diagnostic #6759 and #6770 already use — an alert naming the authored
1389
+ path and the offending value — instead of a chart:
1390
+
1391
+ | authored gantt date — a row item's `startDate` / `endDate`, or a **truthy** `minDate` / `maxDate` pin | before | after |
1392
+ | --- | --- | --- |
1393
+ | `false` | a 649-column axis starting Jan 1970, bar `width: -100%`, no warning | refused, named |
1394
+ | `true` | the same 1970 axis | refused, named |
1395
+ | `['2024-01-01']` | drew a normal-looking chart | refused, named |
1396
+ | `[0]` | drew a chart dated to the **year 2000** | refused, named |
1397
+ | `{ toString() { return '2024-01-01' } }` | drew a normal-looking chart | refused, named |
1398
+ | a `bigint` or a `symbol` | threw an uncaught `TypeError` mid-render | refused, named |
1399
+
1400
+ **Falsy pins are not affected, and never were.** A `minDate` / `maxDate` of
1401
+ `false`, `0` or `''` is discarded by the renderer's existing truthy-only `||`
1402
+ before anything judges it: such a pin never produced a 1970 axis and it is not
1403
+ refused now — the chart simply uses the range computed from the rows, exactly as
1404
+ it did before. The before/after readings above are row-date readings.
1405
+
1406
+ **If your gantt stops drawing after this upgrade, the diagnostic names the exact
1407
+ authored path** (e.g. `items[0].items[0].endDate`). Fix it at the producer: emit
1408
+ a date string (`'2024-01-01'`), a millisecond timestamp (`1704067200000`), or a
1409
+ `Date`. A boolean or an object arriving in a date field means an upstream
1410
+ mapping picked the wrong column — the chart was drawing 1970 from it before, and
1411
+ that render was never right.
1412
+
1413
+ **`0` keeps working, deliberately.** It is a legitimate epoch timestamp — under
1414
+ a millisecond encoding an author who writes `0` means 1970-01-01 — so it is
1415
+ accepted and renders exactly as it did before. `NaN` and `Infinity` are refused,
1416
+ as they already were.
1417
+
1418
+ Unchanged for everyone else: valid string / numeric / `Date` dates draw the same
1419
+ axis and the same bar geometry, an empty gantt keeps its one-bucket sentinel,
1420
+ and `null` / absent dates keep the identical diagnostic they got before.
1421
+ - 7fc5c3c: Spell a refused gantt date by a RULE, not by `String`
1422
+
1423
+ `spellGanttDateValue` fills the `{{value}}` hole of the unusable-gantt-date
1424
+ alert, whose job is to name the value the author wrote. Its `String(value)`
1425
+ fallback was written when nothing but `[object Object]`-shaped values could
1426
+ reach it; `85f6a6097`'s type rule routes the whole non-date type space
1427
+ through it, and it failed three ways — measured on `b458300ca`:
1428
+
1429
+ - it **VANISHES**: `endDate: []` rendered "endDate is , which is not a valid
1430
+ date", the value gone from its own sentence;
1431
+ - it **LIES**: `['2024-01-01']` read as `2024-01-01` and `[0]` / `0n` as `0` —
1432
+ a text that IS a valid date, and a number that IS an accepted one (`0` is a
1433
+ kept gantt date), so the author was told a correct-looking value was invalid
1434
+ with no hint the wrapper was at fault;
1435
+ - it **THROWS**: `{ toString() { throw } }`, a throwing `Symbol.toStringTag`
1436
+ getter and `Object.create(null)` each crashed the render outright. #6759 built
1437
+ this helper "total by construction" and `85f6a6097` made that load-bearing, but the
1438
+ type gate only stopped `new Date` from throwing — `String(value)` handed
1439
+ control to author code one line later, so the crash class moved into the
1440
+ speller instead of going away.
1441
+
1442
+ The rule now recorded on the helper:
1443
+
1444
+ Spell the value when the LANGUAGE owns its spelling.
1445
+ Name its TYPE when producing text would run AUTHOR code.
1446
+
1447
+ Every primitive keeps a spelling fixed by the grammar, so it is spelled as the
1448
+ author typed it — including `bigint`, which gains its `n` (`0n`, no longer the
1449
+ accepted `0`). A `Date` uses `Date.prototype.toString.call`, byte-identical to
1450
+ `String` but not hijackable by a subclass. Everything else is named:
1451
+ `an array`, `a function`, `an object`, chosen with `Array.isArray` and `typeof`,
1452
+ which read no author-controlled property.
1453
+
1454
+ `JSON.stringify` is refuted, not overlooked: it throws on a `bigint` and on a
1455
+ cycle, which would put the crash class straight back. A bounded rendering is
1456
+ refused on the same ground — even an element count is not total, because
1457
+ `Array.isArray` is true of a Proxy whose `length` trap throws.
1458
+
1459
+ Which values are refused is unchanged (that is objectui#6781's ruling), the
1460
+ `undefined` / `null` / quoted-string spellings pinned by #6759 and #6770 do not
1461
+ move, the shared inverted-range diagnostic reads identically, and no new i18n
1462
+ key is added — the article rides in the existing `{{value}}` hole.
1463
+ - c17446a: Gantt date type gate: judge the `[[DateValue]]` slot, not the prototype chain
1464
+ (objectui#7027).
1465
+
1466
+ `isGanttDateType` asked `value instanceof Date`, which answers "does this
1467
+ inherit from `Date.prototype`?" and not "is this a `Date`?". An object that
1468
+ inherits the prototype without owning the internal slot passed the gate,
1469
+ reached `new Date(value)`, ran ToPrimitive, and threw
1470
+ `TypeError: Method Date.prototype.toString called on incompatible receiver` —
1471
+ uncaught, mid-render, so the author got a blank screen where #6781's named
1472
+ diagnostic belongs. Three spellings crashed on `main`, measured:
1473
+ `Object.create(Date.prototype)`, that impostor behind a `Proxy` that throws on
1474
+ every get, and a `Proxy` with a throwing `getPrototypeOf` trap (`instanceof` is
1475
+ not total on its own terms either).
1476
+
1477
+ Both sites now ask a total brand test that invokes the builtin
1478
+ `Date.prototype.getTime` with `.call`: it reads the receiver's `[[DateValue]]`
1479
+ slot and nothing else, so no author getter runs, no `Symbol.toStringTag` is
1480
+ consulted, and no proxy trap fires. The two brand tests the finding suggested
1481
+ were measured and rejected — `Object.prototype.toString.call` performs
1482
+ `Get(O, @@toStringTag)` unconditionally, and `Number.isFinite(value.getTime())`
1483
+ calls the author's `getTime`, which would refuse a real `Date` subclass by
1484
+ dying on it. Both are pinned as red rows.
1485
+
1486
+ No change to which values are accepted: #6781's accept set
1487
+ (`string | finite number | Date`) is untouched, `new Date(NaN)` still passes
1488
+ the type gate and is still refused by the parse check with its `Invalid Date`
1489
+ spelling, and every newly-refused value is one no authored document can carry
1490
+ (ObjectUI metadata is JSON, which cannot spell a prototype).
1491
+ - 20c04b2: A gantt timeline whose rows are malformed now refuses to draw, naming the row,
1492
+ instead of crashing the render (objectui#7164, maintainer ruling A+).
1493
+
1494
+ `TimelineRenderer`'s gantt branch used to read the authored rows twice — once
1495
+ defensively in `findUnusableGanttDate`, once bare in `calculateDateRange` — and
1496
+ every input in the gap threw a `TypeError` mid-render from ordinary JSON:
1497
+ `items: [null]`, a row whose `items` is `5` / `true` / `{}` / an array-like
1498
+ object, or `items` itself not an array. The three readers (the date scan, the
1499
+ range computation and the render loop) now consume ONE verdict from
1500
+ `classifyGanttRows`, and a malformed shape renders the existing `role="alert"`
1501
+ refusal through a new diagnostic key,
1502
+ `timeline.gantt.unusableRange.malformedRow` — "items[0] is null, which is not
1503
+ a row shape" — never the `malformedDate` copy, which named the wrong fault.
1504
+ The key lands in `en` and the nine sibling locale packs.
1505
+
1506
+ `@object-ui/types` (minor — the accept set narrows): `TimelineSchema.items` no
1507
+ longer declares `z.array(z.any())`. Every element must be an object, and a
1508
+ gantt row's own `items`, when present, must be an array, so `validate` refuses
1509
+ `items: [null]` and `items: [{ items: 5 }]` at authoring time — before they
1510
+ reach a renderer. Feed items (`vertical` / `horizontal`) carry no `items` key
1511
+ and parse exactly as before; every in-repo `type: 'timeline'` fixture parses
1512
+ green on both sides of the change. Rows with no bars (`items: []`, a row
1513
+ without `items`) stay the ordinary empty state and still draw.
1514
+ - e75f4c9: `colorField` now means the same thing in the gantt, the calendar and the timeline
1515
+ (objectui#7243).
1516
+
1517
+ **The inversion this fixes.** `gantt.colorField` is documented as "field that drives the
1518
+ bar color", and the renderer passed the stored value straight into the bar's
1519
+ `backgroundColor`. Pointing the key at a select field therefore emitted
1520
+ `backgroundColor: "open"` — not a colour, so the browser dropped the declaration and
1521
+ every bar rendered identically. OMITTING the key was strictly better: the absent-key
1522
+ branch derived a real colour per status. Declaring the documented key was worse than not
1523
+ declaring it, with no error, warning or console message either way.
1524
+
1525
+ The same key also meant three different things across the three lenses: the timeline
1526
+ resolved the field's authored option `color`, the calendar hashed the raw value onto a
1527
+ fixed palette, and the gantt emitted the raw value. An author colouring three views by
1528
+ one field got three unrelated results, one of which was no colour at all.
1529
+
1530
+ **The ladder.** `@object-ui/core` gains `createFieldColorResolver` — the timeline's
1531
+ resolver, lifted so all three call it:
1532
+
1533
+ 1. the field's own option `color` for the record's value;
1534
+ 2. else the value itself when it already IS a colour literal (`#rgb`, `#rrggbb`,
1535
+ `#rrggbbaa`, `rgb(...)`, `hsl(...)`);
1536
+ 3. else each renderer's own last rung, which is deliberately NOT shared — the gantt
1537
+ derives a semantic-token hex (a bar must be painted), the calendar keeps its
1538
+ theme-aware 8-stop hash (a soft tint, not a solid fill), the timeline draws its
1539
+ default marker.
1540
+
1541
+ **What changes for authors.** A gantt or calendar whose `colorField` points at a select
1542
+ field with authored option colours now paints those colours. A gantt value that is
1543
+ neither an option colour nor a colour literal now derives a colour instead of emitting
1544
+ an invalid CSS value — including a palette NAME (`red`), which now resolves to that
1545
+ palette's hex, the behaviour the key's own contract has always promised ("hex or
1546
+ semantic name") and the one `borderColorField` already had. `gantt.borderColorField`
1547
+ takes rung 1 as well, so an authored option colour reaches the alert stroke; it keeps
1548
+ today's behaviour otherwise and deliberately gains no derivation rung, since the stroke
1549
+ is opt-in and deriving one for every record would draw an alert on records that have
1550
+ none.
1551
+
1552
+ Calendars whose `colorField` points at a plain categorical field are unchanged: that
1553
+ value still reaches `CalendarView`'s deterministic hash exactly as before. The timeline
1554
+ is unchanged apart from accepting the 8-digit `#rrggbbaa` hex spelling the calendar
1555
+ already accepted.
1556
+ - 0b6b295: Gantt: a row that is not an object is now refused instead of drawn as an empty,
1557
+ unlabelled row (objectui#7364). `items: [0]`, `items: ['x']`, `items: [true]`
1558
+ and `items: [[]]` used to render a blank row with no word to the author, while
1559
+ `validate` already refused every one of them at authoring time. The renderer now
1560
+ agrees with `validate`: the chart shows the existing
1561
+ `timeline.gantt.unusableRange.malformedRow` diagnostic, naming the row's path
1562
+ and value (for example `items[0] is 0, which is not a row shape`). No new i18n
1563
+ key and no locale pack change. Well-formed object rows, a row with no `items`
1564
+ key and a row whose `items` is `null` draw exactly as before.
1565
+ - d327b9c: FLS-gate the `$expand` projection at the seven remaining `buildExpandFields`
1566
+ call sites (objectui#7429).
1567
+
1568
+ objectui#7215 / PR #7229 gated the two projection sites in its scope
1569
+ (`ObjectGrid`, `ListView`). objectui#7230 / PR #7428 gated four more
1570
+ (`ObjectCalendar`, `ObjectGantt`, `RecordDetailView`, `DetailView`). This
1571
+ closes the seven that were left: `ObjectKanban`, `ObjectTree`, `ObjectView`
1572
+ (the non-grid record-fetch effect), `ObjectMap`, `ObjectGallery`,
1573
+ `ObjectTimeline`, and the metadata-admin `PagePreview`'s record-binding fetch.
1574
+
1575
+ **All seven pass no column list at all**, which makes every one of them the
1576
+ sharp shape: `buildExpandFields` reads an absent column list as "no column
1577
+ restriction" and falls back to **every declared relation on the object**,
1578
+ denied ones included. So each of these components asked the server to resolve
1579
+ the object's full relation set by default, not by configuration — the
1580
+ ordinary shape of each surface, not a corner of it.
1581
+
1582
+ **`PagePreview` is the one site where the judged principal is not the page's
1583
+ eventual audience.** It calls the browser's own `fetch` with
1584
+ `credentials: 'include'` rather than `DataSource.find`, so it runs under
1585
+ whichever session is loading the Studio preview. Gating on that same session's
1586
+ `usePermissions()` is still the correct principal: it is exactly the request
1587
+ the browser is about to make, on its own credentials, regardless of who later
1588
+ opens the published page.
1589
+
1590
+ **Reproduced before it was fixed**, as a failing test per site (and, for the
1591
+ two sites — `ObjectView`, `PagePreview` — where the gate was implemented
1592
+ before its test was run red, a reverse-verification: the gate was reverted,
1593
+ all four denial-and-set pins on each went red, and the two deferral/positive
1594
+ control pins stayed green, before the gate was restored).
1595
+
1596
+ **Grading, measured rather than assumed** — the same reading objectui#6898,
1597
+ #7215 and #7230 recorded: against ObjectStack's own server this is
1598
+ defence-in-depth, not a live disclosure. `plugin-security`'s
1599
+ `FieldMasker.maskRecord` deletes every unreadable key from each returned row
1600
+ and objectql's expand path writes the resolved record back under that same
1601
+ key, so one statement removes the expanded object and the bare id alike; the
1602
+ expansion sub-read is itself gated (the referenced object's full CRUD + RLS +
1603
+ FLS treatment, objectstack#7626). It is load-bearing for any backend that does
1604
+ not strip, and the client-request side is real regardless.
1605
+
1606
+ **Nothing a permitted view did stops working.** The gate judges each site's
1607
+ `buildExpandFields` OUTPUT, which contains only the object's declared
1608
+ reference-bearing fields, so the "`checkField` answers false for an
1609
+ undeclared key" trap cannot be reached. An unanswered permission policy
1610
+ filters nothing. `buildExpandFields` itself is unchanged.
1611
+
1612
+ `@object-ui/permissions` is added to `dependencies` for `plugin-kanban`,
1613
+ `plugin-tree`, `plugin-map`, `plugin-timeline`, and `plugin-view` — the fifth
1614
+ one objectui#7429's own dependency count missed (it named four); `plugin-list`
1615
+ and `app-shell` already had it.
1616
+ - c6198c2: **Breaking for authored metadata:** `ComponentInput.label`, `ComponentInput.defaultValue` and
1617
+ `ComponentInput.advanced` are RETIRED on both faces (objectui#7493 item ① and objectui#7781;
1618
+ maintainer ruling A of 2026-09-06, immediate, no deprecation window; ADR-0049 enforce-or-remove).
1619
+ They are the three keys the manifest serializer does not forward, and nothing read them on any
1620
+ publication or consumption path.
1621
+
1622
+ No manifest ever published them, so no consumer could ever have read them. `sdui-parser`'s
1623
+ serializer (`packages/sdui-parser/src/index.ts`) forwards exactly seven keys per input — `name`,
1624
+ `type`, `of`, `required`, `enum`, `binding`, `description` — so a value authored under any of the three
1625
+ never reached `sdui.manifest.json`, the generated JSX `.d.ts`, or a diagnostic; its boundary type
1626
+ has no slot for them; the registry's data-source seam reads `name` only; and neither the designer
1627
+ nor the app-shell inspectors consult registry `inputs` at all. A structural census over every
1628
+ `inputs:` array in the repository (re-measured on this change's merge-base, `name` 951 and `type`
1629
+ 951 as the controls) counted the writes: `label` 908, `defaultValue` 245, `advanced` 9 — written on
1630
+ nearly every registration, read by nothing.
1631
+
1632
+ FROM → TO, per key — all three **TOMBSTONED, not removed**, because the route was measured on
1633
+ the built face before it was chosen: `ComponentInputSchema` is a non-strict `z.object`, and an
1634
+ undeclared key parses GREEN and is silently STRIPPED, so a deletion would have swallowed 1,162
1635
+ authored values in silence. The tombstone is what makes the refusal loud and by name.
1636
+
1637
+ - `label?: string` → `label?: never` on the interface, `retirementTombstone()` on the Zod mirror.
1638
+ Migration: delete the key. An input is identified by its `name` on every path that reaches it;
1639
+ nothing ever rendered a label for it.
1640
+ - `defaultValue?: any` → `defaultValue?: never` / `retirementTombstone()`. Migration: delete the
1641
+ key. The renderer's own fallback read IS the default; tell the author about it in `description`,
1642
+ which IS published. (Tightening the type to `unknown` was ruled out: it closes no error class,
1643
+ since nothing reads the value.)
1644
+ - `advanced?: boolean` → `advanced?: never` / `retirementTombstone()`. Migration: delete the key.
1645
+ No designer surface ever hid an "advanced" input; there is nothing to write instead.
1646
+
1647
+ The retirement kit: `?: never` on `ComponentInput` (`packages/types/src/base.ts`), so authoring one
1648
+ is a `tsc` error at the registration site; `retirementTombstone()` on `ComponentInputSchema`
1649
+ (`packages/types/src/zod/base.zod.ts`), so an authored value is REFUSED at parse time with
1650
+ `code: 'invalid_type'`, the key named in the issue `path`, and the migration note as the message
1651
+ (one string, both channels). Pinned in
1652
+ `packages/types/src/__tests__/component-input-retired-keys-7493.test.ts`, which also holds a
1653
+ tree-scoped absence census over every `inputs:` array under `packages/**` and `apps/**`.
1654
+
1655
+ Accept-set change, stated plainly for reviewers: a document that sets any of the three keys on a
1656
+ `ComponentInput` used to parse GREEN (the value was then dropped by the serializer) and now parses
1657
+ RED. Every in-repo authoring site — 1,199 keys across 110 registration files, the three standalone
1658
+ `ComponentInput[]` arrays and the two named input arrays `tsc` found included — is deleted in the same change, as the ruling's split rule
1659
+ requires; the `WidgetRegistry` seam no longer copies the widget-manifest values onto the synthesized
1660
+ `ComponentInput` (they fed nothing), and the data-source declaration `ELEMENT_DATA_SOURCE_INPUT`
1661
+ drops its `label`. The patch entries on the other packages record exactly that: their registrations
1662
+ stop authoring inert keys, with no runtime or published-manifest change.
1663
+
1664
+ The nine test files that read `defaultValue` off a registration were re-pinned against the
1665
+ renderer's ACTUAL default (its own fallback read, or the `defaultProps` it ships) instead of the
1666
+ declaration that went away; two assertions that only restated the shadow default were dropped with
1667
+ the reason on the line.
1668
+
1669
+ The in-repo zero is what was measured. Whether anything OUTSIDE this repository writes these keys
1670
+ is not measurable from here (the objectui#5674 limit); converting such a write from a silent drop
1671
+ into a named refusal is exactly what the tombstones buy. `WidgetInput`'s own `label` /
1672
+ `defaultValue` / `advanced` (the widget-manifest face) stay declared and writable — nothing has
1673
+ ruled on that face; that it now has no reader either is recorded as objectui#7911.
1674
+ - 37043cf: `ObjectTimeline` waits for the object definition instead of querying twice
1675
+ (objectui#7895).
1676
+
1677
+ It was the last member of the set objectui#6482 converged on the shared
1678
+ settled-schema gate — `ObjectKanban`, `ObjectView`, `ObjectCalendar` and
1679
+ `ObjectTree` were named there, `ObjectGantt` was ask 2 of objectui#7225 — and
1680
+ nothing marked it a deliberate exclusion. It still held the object definition in
1681
+ a local `useState` fed by its own metadata effect, and listed that definition in
1682
+ the record-fetch effect's dependency array.
1683
+
1684
+ **User-visible.** Every object-bound timeline load issued **two** `find` calls
1685
+ instead of one: the first before the definition landed, with `buildExpandFields`
1686
+ seeing no fields and therefore carrying no `$expand` at all, and a second one
1687
+ after. Whenever the metadata read is the slower of the two — the common case on
1688
+ a cold metadata cache — the second call is not merely a wasted round trip but a
1689
+ **three-step paint**: raw foreign-key ids, back to the loading skeleton (the
1690
+ effect's re-run calls `setLoading(true)` and `loading` is an early return), then
1691
+ the expanded rows. After this change the timeline paints once, from a query that
1692
+ already carries its expansion.
1693
+
1694
+ Measured on the component with an instrumented renderer, one mount per hold,
1695
+ `getObjectSchema` held 0/1/2/3/4/5/6/7/8/9/10/15/25/50/100 ms, with
1696
+ `ObjectCalendar` and `ObjectGantt` as positive controls in the same run: before,
1697
+ 2 `find` calls with expand sets `[null, ['owner']]`, 1 paint at the readiness
1698
+ predicate and 3 late writes after it at every hold from +3 ms up; after, 1 `find`
1699
+ carrying `['owner']`, 1 paint, 0 late writes, and a first-paint time that tracks
1700
+ the hold (8 ms at +3, 30 ms at +25, 105 ms at +100) where before it was a flat
1701
+ 3-7 ms at every hold. Both controls read 1 paint / 0 late writes before and
1702
+ after.
1703
+
1704
+ The resolution half is now `useSettledSchema` from `@object-ui/react`, which
1705
+ settles on **every** exit — no source, no `getObjectSchema`, no object name, and
1706
+ a read that threw alike. That is what makes the gate safe: the replaced effect
1707
+ returned without settling on all four, which cost nothing while nothing waited on
1708
+ it and would have held a gated query open forever. Pinned by
1709
+ `ObjectTimeline.fetchGate-7895.test.tsx`, including a timeline whose adapter
1710
+ exposes no `getObjectSchema` and one whose definition read rejects — both still
1711
+ query, unexpanded.
1712
+
1713
+ Unlike the two sibling conversions, the metadata read is **not** disabled for a
1714
+ timeline whose items were authored inline: this component also reads the
1715
+ definition's fields for option colours and field labels on that path, where no
1716
+ record query is issued at all.
1717
+ - dc49246: Refuse a row cap the contract already refuses before it reaches `$top`, at the
1718
+ three read points that still forwarded one — `object-kanban`, `object-timeline`
1719
+ and each `record:reference_rail` entry (objectui#9925).
1720
+
1721
+ Each of these blocks spelled its row cap as a bare `?? DEFAULT`. `??` rejects
1722
+ only `null` and `undefined`, so a value the contract refuses was not nullish and
1723
+ survived as a real fetch window: it reached the adapter as `$top: 0`, the block
1724
+ asked the server for nothing, and the empty board / empty rail / empty card
1725
+ named no cause. A negative went out the same way, and a non-integer became a
1726
+ fractional window.
1727
+
1728
+ All three now go through one resolver per site, mirroring the shape objectui#9853
1729
+ landed on `ObjectGrid` and objectui#9897 repeated on `ListView` — one resolver at
1730
+ every entry is what keeps the answer single. A refused value is dropped, the
1731
+ site's own default is used, and one `console.warn` names the block, the object
1732
+ and the value. The warning is conditional and deduped: an absent `limit` and a
1733
+ usable one both stay silent, and one declaration warns once rather than once per
1734
+ render.
1735
+
1736
+ This closes BOTH entrances into these blocks, which is why the repair is at the
1737
+ read point. Each block reads one key, and two authoring shapes fill it: a
1738
+ `dataSource` binding lowers a named view's `pagination.pageSize` into it, and a
1739
+ block with no binding at all carries the authored `limit` straight through. A
1740
+ repair at the lowering layer would close only the first.
1741
+
1742
+ Refusing these is not a renderer choosing a meaning. `@objectstack/spec` declares
1743
+ every one of these members a positive integer — `object-kanban`'s `limit`, the
1744
+ element data source `limit` a binding lowers into `object-timeline`'s, and the
1745
+ rail entry's own `limit` on `ReferenceRailEntrySchema`.
1746
+
1747
+ ⛔ No fallback literal changed. Each site keeps the default it already
1748
+ documented; the rail's was spelled inline twice and is now one named constant so
1749
+ its two read points cannot drift.
1750
+ - Updated dependencies [7b10bef]
1751
+ - Updated dependencies [97abedc]
1752
+ - Updated dependencies [b46c58f]
1753
+ - Updated dependencies [a507334]
1754
+ - Updated dependencies [ad694ac]
1755
+ - Updated dependencies [6f96fca]
1756
+ - Updated dependencies [afb2284]
1757
+ - Updated dependencies [3ac2de8]
1758
+ - Updated dependencies [0aacecc]
1759
+ - Updated dependencies [63f4f92]
1760
+ - Updated dependencies [777fca2]
1761
+ - Updated dependencies [c131d9e]
1762
+ - Updated dependencies [5f00ff4]
1763
+ - Updated dependencies [c9e073a]
1764
+ - Updated dependencies [7b395d8]
1765
+ - Updated dependencies [0879812]
1766
+ - Updated dependencies [8cedb0d]
1767
+ - Updated dependencies [6ce001a]
1768
+ - Updated dependencies [162621b]
1769
+ - Updated dependencies [4c6f549]
1770
+ - Updated dependencies [6cc910b]
1771
+ - Updated dependencies [061f5e8]
1772
+ - Updated dependencies [2dd4d3f]
1773
+ - Updated dependencies [e686f4d]
1774
+ - Updated dependencies [4ab4f1b]
1775
+ - Updated dependencies [b57107d]
1776
+ - Updated dependencies [e3ea4f9]
1777
+ - Updated dependencies [bb5d4ee]
1778
+ - Updated dependencies [dc666f7]
1779
+ - Updated dependencies [3335767]
1780
+ - Updated dependencies [8b1f066]
1781
+ - Updated dependencies [af243c1]
1782
+ - Updated dependencies [cff4b77]
1783
+ - Updated dependencies [961ceaa]
1784
+ - Updated dependencies [f3f4e4c]
1785
+ - Updated dependencies [a05c350]
1786
+ - Updated dependencies [1dbb993]
1787
+ - Updated dependencies [2b5f509]
1788
+ - Updated dependencies [808f339]
1789
+ - Updated dependencies [6cf5999]
1790
+ - Updated dependencies [274e14a]
1791
+ - Updated dependencies [8c10f4f]
1792
+ - Updated dependencies [90dac98]
1793
+ - Updated dependencies [6096f20]
1794
+ - Updated dependencies [544aca2]
1795
+ - Updated dependencies [ea02938]
1796
+ - Updated dependencies [a14fb23]
1797
+ - Updated dependencies [ae98f1d]
1798
+ - Updated dependencies [f98eddf]
1799
+ - Updated dependencies [ce6bd99]
1800
+ - Updated dependencies [a5b08c9]
1801
+ - Updated dependencies [86982ac]
1802
+ - Updated dependencies [cdefa2a]
1803
+ - Updated dependencies [0961d5e]
1804
+ - Updated dependencies [6276478]
1805
+ - Updated dependencies [5e67837]
1806
+ - Updated dependencies [ff14e29]
1807
+ - Updated dependencies [9b28151]
1808
+ - Updated dependencies [64563a9]
1809
+ - Updated dependencies [1a5003f]
1810
+ - Updated dependencies [09ab32b]
1811
+ - Updated dependencies [8acc51b]
1812
+ - Updated dependencies [ea9d17f]
1813
+ - Updated dependencies [45362a3]
1814
+ - Updated dependencies [2a943bf]
1815
+ - Updated dependencies [93a689d]
1816
+ - Updated dependencies [4357a27]
1817
+ - Updated dependencies [e5f4343]
1818
+ - Updated dependencies [3261e64]
1819
+ - Updated dependencies [f5178a2]
1820
+ - Updated dependencies [2ad3671]
1821
+ - Updated dependencies [8740e86]
1822
+ - Updated dependencies [d22b37b]
1823
+ - Updated dependencies [1daf477]
1824
+ - Updated dependencies [3d614ea]
1825
+ - Updated dependencies [6c2f3c5]
1826
+ - Updated dependencies [fb13e85]
1827
+ - Updated dependencies [c2d8659]
1828
+ - Updated dependencies [e0f8202]
1829
+ - Updated dependencies [ac2d6f1]
1830
+ - Updated dependencies [9fbbb17]
1831
+ - Updated dependencies [c3a26cc]
1832
+ - Updated dependencies [a66e58e]
1833
+ - Updated dependencies [d89492c]
1834
+ - Updated dependencies [9a5f998]
1835
+ - Updated dependencies [9327397]
1836
+ - Updated dependencies [17cc3a3]
1837
+ - Updated dependencies [02e6d36]
1838
+ - Updated dependencies [4758b33]
1839
+ - Updated dependencies [4758b33]
1840
+ - Updated dependencies [f905090]
1841
+ - Updated dependencies [9c78ebe]
1842
+ - Updated dependencies [9c78ebe]
1843
+ - Updated dependencies [12809a5]
1844
+ - Updated dependencies [7afc81d]
1845
+ - Updated dependencies [f9c06ef]
1846
+ - Updated dependencies [5ad3b88]
1847
+ - Updated dependencies [f9d772b]
1848
+ - Updated dependencies [97b6c21]
1849
+ - Updated dependencies [26ca2ad]
1850
+ - Updated dependencies [41ae65b]
1851
+ - Updated dependencies [baac95a]
1852
+ - Updated dependencies [13220af]
1853
+ - Updated dependencies [29b45f6]
1854
+ - Updated dependencies [39b8d51]
1855
+ - Updated dependencies [17b323e]
1856
+ - Updated dependencies [b956e69]
1857
+ - Updated dependencies [33e58d8]
1858
+ - Updated dependencies [256b4c9]
1859
+ - Updated dependencies [c5ec15c]
1860
+ - Updated dependencies [fec3b1a]
1861
+ - Updated dependencies [b8e0941]
1862
+ - Updated dependencies [0c50f18]
1863
+ - Updated dependencies [1dae95a]
1864
+ - Updated dependencies [e32dae1]
1865
+ - Updated dependencies [30b11ad]
1866
+ - Updated dependencies [4aebea0]
1867
+ - Updated dependencies [f976774]
1868
+ - Updated dependencies [3d6badf]
1869
+ - Updated dependencies [25cb364]
1870
+ - Updated dependencies [a60539b]
1871
+ - Updated dependencies [de1b879]
1872
+ - Updated dependencies [c6678b1]
1873
+ - Updated dependencies [0638322]
1874
+ - Updated dependencies [e3782d2]
1875
+ - Updated dependencies [db0beb2]
1876
+ - Updated dependencies [997ce38]
1877
+ - Updated dependencies [ae0b9d3]
1878
+ - Updated dependencies [ad1785c]
1879
+ - Updated dependencies [3b469c8]
1880
+ - Updated dependencies [990a2d6]
1881
+ - Updated dependencies [1c84036]
1882
+ - Updated dependencies [1c84036]
1883
+ - Updated dependencies [6650259]
1884
+ - Updated dependencies [4f8b7f8]
1885
+ - Updated dependencies [9e6619f]
1886
+ - Updated dependencies [f6ae5e2]
1887
+ - Updated dependencies [eb97ce6]
1888
+ - Updated dependencies [7343376]
1889
+ - Updated dependencies [b2683a2]
1890
+ - Updated dependencies [dded788]
1891
+ - Updated dependencies [b45d463]
1892
+ - Updated dependencies [54a7830]
1893
+ - Updated dependencies [f3135a4]
1894
+ - Updated dependencies [b5696d3]
1895
+ - Updated dependencies [3f9d926]
1896
+ - Updated dependencies [e978ed5]
1897
+ - Updated dependencies [6a7f24e]
1898
+ - Updated dependencies [b3c96d6]
1899
+ - Updated dependencies [8d0ca91]
1900
+ - Updated dependencies [c30c8dd]
1901
+ - Updated dependencies [244d516]
1902
+ - Updated dependencies [deca847]
1903
+ - Updated dependencies [ac15833]
1904
+ - Updated dependencies [ac15833]
1905
+ - Updated dependencies [e2dffc9]
1906
+ - Updated dependencies [328abeb]
1907
+ - Updated dependencies [dd0d78f]
1908
+ - Updated dependencies [24d3e65]
1909
+ - Updated dependencies [95a7c8d]
1910
+ - Updated dependencies [e227156]
1911
+ - Updated dependencies [cc4e476]
1912
+ - Updated dependencies [92970c4]
1913
+ - Updated dependencies [d570eaa]
1914
+ - Updated dependencies [4b742f4]
1915
+ - Updated dependencies [42687ba]
1916
+ - Updated dependencies [6cd8f66]
1917
+ - Updated dependencies [24a0f14]
1918
+ - Updated dependencies [797a30f]
1919
+ - Updated dependencies [b4075c0]
1920
+ - Updated dependencies [9b85600]
1921
+ - Updated dependencies [e327c89]
1922
+ - Updated dependencies [2eaf5be]
1923
+ - Updated dependencies [bf7ab35]
1924
+ - Updated dependencies [99878d8]
1925
+ - Updated dependencies [3c13675]
1926
+ - Updated dependencies [63ab761]
1927
+ - Updated dependencies [0eb9f36]
1928
+ - Updated dependencies [ae582b7]
1929
+ - Updated dependencies [51c2949]
1930
+ - Updated dependencies [a4b017e]
1931
+ - Updated dependencies [8732846]
1932
+ - Updated dependencies [559a2e2]
1933
+ - Updated dependencies [db11afd]
1934
+ - Updated dependencies [154075a]
1935
+ - Updated dependencies [582edef]
1936
+ - Updated dependencies [19f484f]
1937
+ - Updated dependencies [0a78a20]
1938
+ - Updated dependencies [615346d]
1939
+ - Updated dependencies [75dcc81]
1940
+ - Updated dependencies [55a12a8]
1941
+ - Updated dependencies [edfcf5a]
1942
+ - Updated dependencies [0a3e540]
1943
+ - Updated dependencies [c021b35]
1944
+ - Updated dependencies [f61dab1]
1945
+ - Updated dependencies [b0a05dd]
1946
+ - Updated dependencies [dd5ff19]
1947
+ - Updated dependencies [54997ff]
1948
+ - Updated dependencies [81f8498]
1949
+ - Updated dependencies [a782fa7]
1950
+ - Updated dependencies [1d6a23d]
1951
+ - Updated dependencies [0645133]
1952
+ - Updated dependencies [76e9df0]
1953
+ - Updated dependencies [0ecaa7d]
1954
+ - Updated dependencies [b24f93a]
1955
+ - Updated dependencies [6158e4c]
1956
+ - Updated dependencies [cff8641]
1957
+ - Updated dependencies [c27b575]
1958
+ - Updated dependencies [84b275c]
1959
+ - Updated dependencies [0e6e76b]
1960
+ - Updated dependencies [bf43afa]
1961
+ - Updated dependencies [385ebc5]
1962
+ - Updated dependencies [858eafb]
1963
+ - Updated dependencies [a8c5509]
1964
+ - Updated dependencies [c2a8d23]
1965
+ - Updated dependencies [0ffc423]
1966
+ - Updated dependencies [3cc4fe5]
1967
+ - Updated dependencies [cd5b19a]
1968
+ - Updated dependencies [cd5b19a]
1969
+ - Updated dependencies [17dc167]
1970
+ - Updated dependencies [20d23be]
1971
+ - Updated dependencies [20d23be]
1972
+ - Updated dependencies [2e3da72]
1973
+ - Updated dependencies [1263e40]
1974
+ - Updated dependencies [e6bc087]
1975
+ - Updated dependencies [9419df1]
1976
+ - Updated dependencies [8bab157]
1977
+ - Updated dependencies [a7557a7]
1978
+ - Updated dependencies [7d074ba]
1979
+ - Updated dependencies [6158e4c]
1980
+ - Updated dependencies [6158e4c]
1981
+ - Updated dependencies [52aad5c]
1982
+ - Updated dependencies [18d1a0a]
1983
+ - Updated dependencies [7fed09d]
1984
+ - Updated dependencies [58da8ae]
1985
+ - Updated dependencies [a8b9889]
1986
+ - Updated dependencies [138ad45]
1987
+ - Updated dependencies [138ad45]
1988
+ - Updated dependencies [5262f7d]
1989
+ - Updated dependencies [6aa029b]
1990
+ - Updated dependencies [2124d04]
1991
+ - Updated dependencies [be52115]
1992
+ - Updated dependencies [770cc5b]
1993
+ - Updated dependencies [1a88ce2]
1994
+ - Updated dependencies [a1a44d6]
1995
+ - Updated dependencies [e0a9c67]
1996
+ - Updated dependencies [5638529]
1997
+ - Updated dependencies [5638529]
1998
+ - Updated dependencies [d0fba91]
1999
+ - Updated dependencies [c476be0]
2000
+ - Updated dependencies [c82ff39]
2001
+ - Updated dependencies [6c3da53]
2002
+ - Updated dependencies [31987bd]
2003
+ - Updated dependencies [3c3ce15]
2004
+ - Updated dependencies [063119f]
2005
+ - Updated dependencies [e100589]
2006
+ - Updated dependencies [304f611]
2007
+ - Updated dependencies [e46ee77]
2008
+ - Updated dependencies [f9c8c4e]
2009
+ - Updated dependencies [6e9c8d2]
2010
+ - Updated dependencies [9547063]
2011
+ - Updated dependencies [3f6efd6]
2012
+ - Updated dependencies [55d18c6]
2013
+ - Updated dependencies [c4ab6d0]
2014
+ - Updated dependencies [0e9058b]
2015
+ - Updated dependencies [c4ab6d0]
2016
+ - Updated dependencies [5988b6b]
2017
+ - Updated dependencies [6158e4c]
2018
+ - Updated dependencies [00ccdf7]
2019
+ - Updated dependencies [9d9ed54]
2020
+ - Updated dependencies [4a1adb7]
2021
+ - Updated dependencies [4a1adb7]
2022
+ - Updated dependencies [50c73fe]
2023
+ - Updated dependencies [ca3de72]
2024
+ - Updated dependencies [83e3f83]
2025
+ - Updated dependencies [401611b]
2026
+ - Updated dependencies [2c0ddf2]
2027
+ - Updated dependencies [4abc0aa]
2028
+ - Updated dependencies [f560ded]
2029
+ - Updated dependencies [2b188fa]
2030
+ - Updated dependencies [b654d4e]
2031
+ - Updated dependencies [f68e0a0]
2032
+ - Updated dependencies [aea682a]
2033
+ - Updated dependencies [fcdc8ec]
2034
+ - Updated dependencies [2d576e4]
2035
+ - Updated dependencies [8366acc]
2036
+ - Updated dependencies [95e58a3]
2037
+ - Updated dependencies [9d7419b]
2038
+ - Updated dependencies [fc7db05]
2039
+ - Updated dependencies [9ed8d0f]
2040
+ - Updated dependencies [c73cdb5]
2041
+ - Updated dependencies [6f5719e]
2042
+ - Updated dependencies [d0097af]
2043
+ - Updated dependencies [432882b]
2044
+ - Updated dependencies [64dae8e]
2045
+ - Updated dependencies [b06e374]
2046
+ - Updated dependencies [06a8af5]
2047
+ - Updated dependencies [6a91586]
2048
+ - Updated dependencies [a04d7c6]
2049
+ - Updated dependencies [5ccc500]
2050
+ - Updated dependencies [f3c2bb0]
2051
+ - Updated dependencies [978507b]
2052
+ - Updated dependencies [778138e]
2053
+ - Updated dependencies [9801765]
2054
+ - Updated dependencies [9cebfca]
2055
+ - Updated dependencies [460575f]
2056
+ - Updated dependencies [d796c8d]
2057
+ - Updated dependencies [594704f]
2058
+ - Updated dependencies [d3995fe]
2059
+ - Updated dependencies [1b1d772]
2060
+ - Updated dependencies [d88e20f]
2061
+ - Updated dependencies [2d7304d]
2062
+ - Updated dependencies [636b236]
2063
+ - Updated dependencies [4172589]
2064
+ - Updated dependencies [d6d8fb9]
2065
+ - Updated dependencies [64d624d]
2066
+ - Updated dependencies [053fdc8]
2067
+ - Updated dependencies [41b7ce3]
2068
+ - Updated dependencies [ae476b8]
2069
+ - Updated dependencies [39f4309]
2070
+ - Updated dependencies [95bad12]
2071
+ - Updated dependencies [d2fb6ef]
2072
+ - Updated dependencies [7cd3987]
2073
+ - Updated dependencies [ee3b878]
2074
+ - Updated dependencies [e304a4e]
2075
+ - Updated dependencies [fda49e5]
2076
+ - Updated dependencies [490d9a9]
2077
+ - Updated dependencies [fc62bb4]
2078
+ - Updated dependencies [41df893]
2079
+ - Updated dependencies [0cba1b7]
2080
+ - Updated dependencies [00f3eb5]
2081
+ - Updated dependencies [1ec291c]
2082
+ - Updated dependencies [453dbaa]
2083
+ - Updated dependencies [95f8704]
2084
+ - Updated dependencies [f8cdbf2]
2085
+ - Updated dependencies [69a2163]
2086
+ - Updated dependencies [24e027e]
2087
+ - Updated dependencies [2c3cd1b]
2088
+ - Updated dependencies [e176053]
2089
+ - Updated dependencies [e30ed15]
2090
+ - Updated dependencies [90665e0]
2091
+ - Updated dependencies [8d3a529]
2092
+ - Updated dependencies [5ac2e2c]
2093
+ - Updated dependencies [194fae1]
2094
+ - Updated dependencies [7e19d03]
2095
+ - Updated dependencies [b08b7eb]
2096
+ - Updated dependencies [1e946c9]
2097
+ - Updated dependencies [546ddf7]
2098
+ - Updated dependencies [864154e]
2099
+ - Updated dependencies [b023625]
2100
+ - Updated dependencies [75bd83d]
2101
+ - Updated dependencies [44d075b]
2102
+ - Updated dependencies [40c479a]
2103
+ - Updated dependencies [971d387]
2104
+ - Updated dependencies [ee851c3]
2105
+ - Updated dependencies [6414dfd]
2106
+ - Updated dependencies [a8d5c71]
2107
+ - Updated dependencies [905b21f]
2108
+ - Updated dependencies [88e9109]
2109
+ - Updated dependencies [2c45966]
2110
+ - Updated dependencies [db3a600]
2111
+ - Updated dependencies [3a3db76]
2112
+ - Updated dependencies [0d723a3]
2113
+ - Updated dependencies [0c95d3d]
2114
+ - Updated dependencies [3e4fa2c]
2115
+ - Updated dependencies [b5b928a]
2116
+ - Updated dependencies [6fd2cf7]
2117
+ - Updated dependencies [5fa06c4]
2118
+ - Updated dependencies [52a43de]
2119
+ - Updated dependencies [195052f]
2120
+ - Updated dependencies [e4559d1]
2121
+ - Updated dependencies [2c71482]
2122
+ - Updated dependencies [129bcc5]
2123
+ - Updated dependencies [a26b9e4]
2124
+ - Updated dependencies [5ef9c4f]
2125
+ - Updated dependencies [46f0bb4]
2126
+ - Updated dependencies [06b82b8]
2127
+ - Updated dependencies [8ec11e1]
2128
+ - Updated dependencies [6f81384]
2129
+ - Updated dependencies [22ba927]
2130
+ - Updated dependencies [f8c70f4]
2131
+ - Updated dependencies [5d3a2d1]
2132
+ - Updated dependencies [8f1d995]
2133
+ - Updated dependencies [b362c1b]
2134
+ - Updated dependencies [f9c34df]
2135
+ - Updated dependencies [dddb942]
2136
+ - Updated dependencies [00c665e]
2137
+ - Updated dependencies [29754cf]
2138
+ - Updated dependencies [d7de534]
2139
+ - Updated dependencies [3c2b6f7]
2140
+ - Updated dependencies [6e88630]
2141
+ - Updated dependencies [b84dc18]
2142
+ - Updated dependencies [ac8abb0]
2143
+ - Updated dependencies [9d86e1d]
2144
+ - Updated dependencies [3a5817f]
2145
+ - Updated dependencies [99a3c2d]
2146
+ - Updated dependencies [5961030]
2147
+ - Updated dependencies [f24de8b]
2148
+ - Updated dependencies [c8ea8af]
2149
+ - Updated dependencies [9602dc8]
2150
+ - Updated dependencies [3190414]
2151
+ - Updated dependencies [4e480f5]
2152
+ - Updated dependencies [38a123c]
2153
+ - Updated dependencies [299102e]
2154
+ - Updated dependencies [30c73cd]
2155
+ - Updated dependencies [830ed58]
2156
+ - Updated dependencies [d7acad6]
2157
+ - Updated dependencies [45a9aeb]
2158
+ - Updated dependencies [713db46]
2159
+ - Updated dependencies [c71e14d]
2160
+ - Updated dependencies [bf3a03c]
2161
+ - Updated dependencies [cb55718]
2162
+ - Updated dependencies [748494b]
2163
+ - Updated dependencies [5967be0]
2164
+ - Updated dependencies [831be72]
2165
+ - Updated dependencies [29cb85b]
2166
+ - Updated dependencies [3e028c8]
2167
+ - Updated dependencies [d0889e2]
2168
+ - Updated dependencies [ce503e5]
2169
+ - Updated dependencies [f20dcf0]
2170
+ - Updated dependencies [12402a9]
2171
+ - Updated dependencies [aff3d7a]
2172
+ - Updated dependencies [4ca30d0]
2173
+ - Updated dependencies [7a5da14]
2174
+ - Updated dependencies [fff9645]
2175
+ - Updated dependencies [9c3b7ce]
2176
+ - Updated dependencies [2c1c967]
2177
+ - Updated dependencies [9486ac6]
2178
+ - Updated dependencies [9486ac6]
2179
+ - Updated dependencies [4d5f9b4]
2180
+ - Updated dependencies [d6ceb8d]
2181
+ - Updated dependencies [dc4365c]
2182
+ - Updated dependencies [e321d52]
2183
+ - Updated dependencies [969ba84]
2184
+ - Updated dependencies [4c68077]
2185
+ - Updated dependencies [7977ff9]
2186
+ - Updated dependencies [3beef6d]
2187
+ - Updated dependencies [06b8c42]
2188
+ - Updated dependencies [46b9bc9]
2189
+ - Updated dependencies [45ac2cb]
2190
+ - Updated dependencies [b97790a]
2191
+ - Updated dependencies [dbd5194]
2192
+ - Updated dependencies [7c9b044]
2193
+ - Updated dependencies [d47de51]
2194
+ - Updated dependencies [3fe6463]
2195
+ - Updated dependencies [b392674]
2196
+ - Updated dependencies [4f3a1e2]
2197
+ - Updated dependencies [31ab372]
2198
+ - Updated dependencies [846889b]
2199
+ - Updated dependencies [2acd8e1]
2200
+ - Updated dependencies [26896c6]
2201
+ - Updated dependencies [67fc3b0]
2202
+ - Updated dependencies [33a3b3c]
2203
+ - Updated dependencies [b87f15b]
2204
+ - Updated dependencies [045d20b]
2205
+ - Updated dependencies [a2d2515]
2206
+ - Updated dependencies [c18d099]
2207
+ - Updated dependencies [adb2a86]
2208
+ - Updated dependencies [03380aa]
2209
+ - Updated dependencies [4562ea5]
2210
+ - Updated dependencies [3619792]
2211
+ - Updated dependencies [3561bd2]
2212
+ - Updated dependencies [bf97b98]
2213
+ - Updated dependencies [320374d]
2214
+ - Updated dependencies [b0d308d]
2215
+ - Updated dependencies [40f34b4]
2216
+ - Updated dependencies [8063bcb]
2217
+ - Updated dependencies [b74a859]
2218
+ - Updated dependencies [d4493fd]
2219
+ - Updated dependencies [240b80f]
2220
+ - Updated dependencies [77cb489]
2221
+ - Updated dependencies [bfaa158]
2222
+ - Updated dependencies [777e5c6]
2223
+ - Updated dependencies [0c386dd]
2224
+ - Updated dependencies [9e37d9b]
2225
+ - Updated dependencies [5ad86dd]
2226
+ - Updated dependencies [16a725f]
2227
+ - Updated dependencies [4dfdcc3]
2228
+ - Updated dependencies [6a449fc]
2229
+ - Updated dependencies [446d93d]
2230
+ - Updated dependencies [ecd9cb2]
2231
+ - Updated dependencies [98d4108]
2232
+ - Updated dependencies [0e3b3be]
2233
+ - Updated dependencies [a29ae2d]
2234
+ - Updated dependencies [220c18d]
2235
+ - Updated dependencies [00d3f09]
2236
+ - Updated dependencies [4388f71]
2237
+ - Updated dependencies [0b1ac58]
2238
+ - Updated dependencies [c93b4d5]
2239
+ - Updated dependencies [c1fe272]
2240
+ - Updated dependencies [3cab570]
2241
+ - Updated dependencies [8ad218d]
2242
+ - Updated dependencies [3e41187]
2243
+ - Updated dependencies [5f78953]
2244
+ - Updated dependencies [639114c]
2245
+ - Updated dependencies [639114c]
2246
+ - Updated dependencies [1490691]
2247
+ - Updated dependencies [1f31d3a]
2248
+ - Updated dependencies [d1842ab]
2249
+ - Updated dependencies [78ca238]
2250
+ - Updated dependencies [d8ec8d6]
2251
+ - Updated dependencies [351eb31]
2252
+ - Updated dependencies [866cd1d]
2253
+ - Updated dependencies [20c04b2]
2254
+ - Updated dependencies [01c9023]
2255
+ - Updated dependencies [48c19bd]
2256
+ - Updated dependencies [a6d8b8d]
2257
+ - Updated dependencies [4b5bb95]
2258
+ - Updated dependencies [b652514]
2259
+ - Updated dependencies [adbda1b]
2260
+ - Updated dependencies [adbda1b]
2261
+ - Updated dependencies [8952395]
2262
+ - Updated dependencies [e2b3826]
2263
+ - Updated dependencies [0348bc9]
2264
+ - Updated dependencies [e8c553b]
2265
+ - Updated dependencies [2e32ed4]
2266
+ - Updated dependencies [3ed3eec]
2267
+ - Updated dependencies [7c3df8f]
2268
+ - Updated dependencies [a4514e8]
2269
+ - Updated dependencies [db3896c]
2270
+ - Updated dependencies [b9f5ff1]
2271
+ - Updated dependencies [e75f4c9]
2272
+ - Updated dependencies [19f1639]
2273
+ - Updated dependencies [4704aa4]
2274
+ - Updated dependencies [47547d0]
2275
+ - Updated dependencies [1bee5d0]
2276
+ - Updated dependencies [858cd72]
2277
+ - Updated dependencies [cfc9b6d]
2278
+ - Updated dependencies [554f2b6]
2279
+ - Updated dependencies [72f55c9]
2280
+ - Updated dependencies [26e06d7]
2281
+ - Updated dependencies [669d71b]
2282
+ - Updated dependencies [ed27d7c]
2283
+ - Updated dependencies [52c8cf7]
2284
+ - Updated dependencies [2ceb43a]
2285
+ - Updated dependencies [7cdd2b9]
2286
+ - Updated dependencies [52c8cf7]
2287
+ - Updated dependencies [3399704]
2288
+ - Updated dependencies [71a4a53]
2289
+ - Updated dependencies [7bf244b]
2290
+ - Updated dependencies [f0bb9fa]
2291
+ - Updated dependencies [81a2eb1]
2292
+ - Updated dependencies [caa0cd3]
2293
+ - Updated dependencies [caa0cd3]
2294
+ - Updated dependencies [20cb8db]
2295
+ - Updated dependencies [25c7d58]
2296
+ - Updated dependencies [00d2fa6]
2297
+ - Updated dependencies [77b2a18]
2298
+ - Updated dependencies [c6198c2]
2299
+ - Updated dependencies [721d1e0]
2300
+ - Updated dependencies [c2f0f48]
2301
+ - Updated dependencies [1237ae4]
2302
+ - Updated dependencies [2f61238]
2303
+ - Updated dependencies [51eb515]
2304
+ - Updated dependencies [c354ce5]
2305
+ - Updated dependencies [8fe8e5c]
2306
+ - Updated dependencies [feac439]
2307
+ - Updated dependencies [9ae871d]
2308
+ - Updated dependencies [efbd566]
2309
+ - Updated dependencies [2a5bf45]
2310
+ - Updated dependencies [9587fc9]
2311
+ - Updated dependencies [e62c44e]
2312
+ - Updated dependencies [daf9d57]
2313
+ - Updated dependencies [23b9958]
2314
+ - Updated dependencies [c15d7ec]
2315
+ - Updated dependencies [5d0876c]
2316
+ - Updated dependencies [f7ace0a]
2317
+ - Updated dependencies [b041b9c]
2318
+ - Updated dependencies [ce2aaef]
2319
+ - Updated dependencies [544ecba]
2320
+ - Updated dependencies [2ce2612]
2321
+ - Updated dependencies [bc640ec]
2322
+ - Updated dependencies [1e215c4]
2323
+ - Updated dependencies [da6e191]
2324
+ - Updated dependencies [3e377c9]
2325
+ - Updated dependencies [a3eb5d0]
2326
+ - Updated dependencies [4ce14f1]
2327
+ - Updated dependencies [aef97e5]
2328
+ - Updated dependencies [2af1fa7]
2329
+ - Updated dependencies [c14d3a0]
2330
+ - Updated dependencies [a137d0c]
2331
+ - Updated dependencies [caf477f]
2332
+ - Updated dependencies [f6375da]
2333
+ - Updated dependencies [967e5d8]
2334
+ - Updated dependencies [c907a9c]
2335
+ - Updated dependencies [a4611b3]
2336
+ - Updated dependencies [20316ba]
2337
+ - Updated dependencies [d3499b3]
2338
+ - Updated dependencies [91f9276]
2339
+ - Updated dependencies [309c75e]
2340
+ - Updated dependencies [c9f9bae]
2341
+ - Updated dependencies [18897a4]
2342
+ - Updated dependencies [8b7ea39]
2343
+ - Updated dependencies [a915064]
2344
+ - Updated dependencies [dcbf0b2]
2345
+ - Updated dependencies [52cac38]
2346
+ - Updated dependencies [93fea2e]
2347
+ - Updated dependencies [1422a92]
2348
+ - Updated dependencies [d05fe17]
2349
+ - Updated dependencies [a480f79]
2350
+ - Updated dependencies [f08d1a8]
2351
+ - Updated dependencies [64a252d]
2352
+ - Updated dependencies [786bc91]
2353
+ - Updated dependencies [75fca96]
2354
+ - Updated dependencies [7ca6ddd]
2355
+ - Updated dependencies [f1cd290]
2356
+ - Updated dependencies [5a41ce7]
2357
+ - Updated dependencies [8d50bc2]
2358
+ - Updated dependencies [604476d]
2359
+ - Updated dependencies [d1bebb0]
2360
+ - Updated dependencies [95bf128]
2361
+ - Updated dependencies [335abea]
2362
+ - Updated dependencies [edea22a]
2363
+ - Updated dependencies [0f5cadf]
2364
+ - Updated dependencies [4f9f1ee]
2365
+ - Updated dependencies [66e8b2a]
2366
+ - Updated dependencies [aa083cd]
2367
+ - Updated dependencies [12b5992]
2368
+ - Updated dependencies [b93e245]
2369
+ - Updated dependencies [c842594]
2370
+ - Updated dependencies [290de37]
2371
+ - Updated dependencies [1cfdff8]
2372
+ - Updated dependencies [e1c27e4]
2373
+ - Updated dependencies [8c8da45]
2374
+ - Updated dependencies [8cd8eb5]
2375
+ - Updated dependencies [cf1d29e]
2376
+ - Updated dependencies [1bd79c8]
2377
+ - Updated dependencies [af9e957]
2378
+ - Updated dependencies [b1030c7]
2379
+ - Updated dependencies [c974edf]
2380
+ - Updated dependencies [ad852b6]
2381
+ - Updated dependencies [6778809]
2382
+ - Updated dependencies [7fb22a1]
2383
+ - Updated dependencies [ad66d79]
2384
+ - Updated dependencies [0758bd8]
2385
+ - Updated dependencies [ee4d19f]
2386
+ - Updated dependencies [496d31d]
2387
+ - Updated dependencies [0ea7054]
2388
+ - Updated dependencies [9a853f2]
2389
+ - Updated dependencies [cb847fd]
2390
+ - Updated dependencies [ee70287]
2391
+ - Updated dependencies [3e98e13]
2392
+ - Updated dependencies [a695f50]
2393
+ - Updated dependencies [fc32921]
2394
+ - Updated dependencies [4eaa835]
2395
+ - Updated dependencies [8f9d87a]
2396
+ - Updated dependencies [b1777ae]
2397
+ - Updated dependencies [24845c4]
2398
+ - Updated dependencies [6f864cf]
2399
+ - Updated dependencies [24d1edd]
2400
+ - Updated dependencies [645087c]
2401
+ - Updated dependencies [33f4a19]
2402
+ - Updated dependencies [6e9a3d4]
2403
+ - Updated dependencies [4a292d2]
2404
+ - Updated dependencies [5323168]
2405
+ - Updated dependencies [841dd2b]
2406
+ - Updated dependencies [3014fc0]
2407
+ - Updated dependencies [dacb402]
2408
+ - Updated dependencies [846cec0]
2409
+ - Updated dependencies [91facae]
2410
+ - Updated dependencies [b38014e]
2411
+ - Updated dependencies [474797d]
2412
+ - Updated dependencies [704e695]
2413
+ - Updated dependencies [a407bd6]
2414
+ - Updated dependencies [317dbce]
2415
+ - Updated dependencies [309728c]
2416
+ - Updated dependencies [aa08d7e]
2417
+ - Updated dependencies [3a43a15]
2418
+ - Updated dependencies [868e825]
2419
+ - Updated dependencies [f76f436]
2420
+ - Updated dependencies [ce45a03]
2421
+ - Updated dependencies [421544b]
2422
+ - Updated dependencies [fb01022]
2423
+ - Updated dependencies [e9d9212]
2424
+ - Updated dependencies [ecfb693]
2425
+ - Updated dependencies [abc1b18]
2426
+ - Updated dependencies [81a51db]
2427
+ - Updated dependencies [67749c7]
2428
+ - Updated dependencies [507b61b]
2429
+ - Updated dependencies [512c84b]
2430
+ - Updated dependencies [c300267]
2431
+ - Updated dependencies [fb3a101]
2432
+ - Updated dependencies [d4733f2]
2433
+ - Updated dependencies [7c9145f]
2434
+ - Updated dependencies [1570eac]
2435
+ - Updated dependencies [f391ede]
2436
+ - Updated dependencies [f5cfbbd]
2437
+ - Updated dependencies [f5cfbbd]
2438
+ - Updated dependencies [8b532cb]
2439
+ - Updated dependencies [64c3cdd]
2440
+ - Updated dependencies [4d65991]
2441
+ - Updated dependencies [c42554e]
2442
+ - Updated dependencies [555b4ec]
2443
+ - Updated dependencies [1ccfc23]
2444
+ - Updated dependencies [542718f]
2445
+ - Updated dependencies [7f27bc5]
2446
+ - Updated dependencies [0a174f3]
2447
+ - Updated dependencies [676f677]
2448
+ - Updated dependencies [f95b140]
2449
+ - Updated dependencies [541ce4e]
2450
+ - Updated dependencies [6479086]
2451
+ - Updated dependencies [d79f525]
2452
+ - Updated dependencies [d1865d2]
2453
+ - Updated dependencies [55ba3ff]
2454
+ - Updated dependencies [f1190b0]
2455
+ - Updated dependencies [561abef]
2456
+ - Updated dependencies [ef52001]
2457
+ - Updated dependencies [6a4680b]
2458
+ - Updated dependencies [c3a4273]
2459
+ - Updated dependencies [abf710d]
2460
+ - Updated dependencies [093af32]
2461
+ - Updated dependencies [1bd1be7]
2462
+ - Updated dependencies [d234fa9]
2463
+ - Updated dependencies [adf5812]
2464
+ - Updated dependencies [e36acd4]
2465
+ - Updated dependencies [5058336]
2466
+ - Updated dependencies [2f6b2bf]
2467
+ - Updated dependencies [2028b31]
2468
+ - Updated dependencies [63601ab]
2469
+ - Updated dependencies [c372b29]
2470
+ - Updated dependencies [152f0a7]
2471
+ - Updated dependencies [8693b85]
2472
+ - Updated dependencies [e82dad1]
2473
+ - Updated dependencies [58b7b3d]
2474
+ - Updated dependencies [84defab]
2475
+ - Updated dependencies [681d3f1]
2476
+ - Updated dependencies [969d4f2]
2477
+ - Updated dependencies [f3bc481]
2478
+ - Updated dependencies [b79aac2]
2479
+ - Updated dependencies [93fc0e7]
2480
+ - Updated dependencies [a4b723f]
2481
+ - Updated dependencies [2b10ca0]
2482
+ - Updated dependencies [7db4a81]
2483
+ - Updated dependencies [19a0b0e]
2484
+ - Updated dependencies [526fc11]
2485
+ - Updated dependencies [f8e3e9a]
2486
+ - Updated dependencies [b9d47ec]
2487
+ - Updated dependencies [3b6bc69]
2488
+ - Updated dependencies [6214db6]
2489
+ - Updated dependencies [6732df4]
2490
+ - Updated dependencies [fe9e0d0]
2491
+ - Updated dependencies [63fb72c]
2492
+ - Updated dependencies [804831c]
2493
+ - Updated dependencies [279e48e]
2494
+ - Updated dependencies [8700d6d]
2495
+ - Updated dependencies [8db2a0f]
2496
+ - Updated dependencies [689953a]
2497
+ - Updated dependencies [30443fb]
2498
+ - Updated dependencies [8d3dbb2]
2499
+ - Updated dependencies [efc1c9c]
2500
+ - Updated dependencies [da45e6b]
2501
+ - Updated dependencies [7533465]
2502
+ - Updated dependencies [835f0f3]
2503
+ - Updated dependencies [a9d97be]
2504
+ - Updated dependencies [ed35b44]
2505
+ - Updated dependencies [9ba7e9c]
2506
+ - Updated dependencies [729e851]
2507
+ - Updated dependencies [96919a4]
2508
+ - Updated dependencies [345e24a]
2509
+ - Updated dependencies [20b507a]
2510
+ - Updated dependencies [2e471dc]
2511
+ - Updated dependencies [6748587]
2512
+ - Updated dependencies [be50942]
2513
+ - Updated dependencies [775e079]
2514
+ - Updated dependencies [7e8b3c0]
2515
+ - Updated dependencies [53374dc]
2516
+ - Updated dependencies [f6fb83f]
2517
+ - Updated dependencies [2049b03]
2518
+ - Updated dependencies [2bf34f7]
2519
+ - Updated dependencies [15b33ae]
2520
+ - Updated dependencies [7cbc724]
2521
+ - Updated dependencies [7098eed]
2522
+ - Updated dependencies [3df7c5c]
2523
+ - Updated dependencies [fb91ac9]
2524
+ - Updated dependencies [fb91ac9]
2525
+ - Updated dependencies [641fb55]
2526
+ - Updated dependencies [8524372]
2527
+ - Updated dependencies [7cbefa5]
2528
+ - Updated dependencies [72d6587]
2529
+ - Updated dependencies [a272a4f]
2530
+ - Updated dependencies [55f39ee]
2531
+ - Updated dependencies [0ce32d5]
2532
+ - Updated dependencies [0970a0e]
2533
+ - Updated dependencies [e427e9c]
2534
+ - Updated dependencies [bbc9dc3]
2535
+ - Updated dependencies [02f1813]
2536
+ - Updated dependencies [1ef89c0]
2537
+ - Updated dependencies [ba0b61a]
2538
+ - Updated dependencies [ba0b61a]
2539
+ - Updated dependencies [ac716ff]
2540
+ - Updated dependencies [f0f3cd5]
2541
+ - Updated dependencies [ab856ed]
2542
+ - Updated dependencies [20f3e65]
2543
+ - Updated dependencies [bbba098]
2544
+ - Updated dependencies [87af769]
2545
+ - Updated dependencies [3be720e]
2546
+ - Updated dependencies [43c0d17]
2547
+ - Updated dependencies [c3df43a]
2548
+ - Updated dependencies [d16d0e9]
2549
+ - Updated dependencies [bbe57fd]
2550
+ - Updated dependencies [272a530]
2551
+ - Updated dependencies [1779e8d]
2552
+ - Updated dependencies [f7fcc2c]
2553
+ - Updated dependencies [f0f4d6c]
2554
+ - Updated dependencies [4128188]
2555
+ - Updated dependencies [b253c4e]
2556
+ - Updated dependencies [78a9c67]
2557
+ - Updated dependencies [4a7ef0d]
2558
+ - Updated dependencies [4598f6d]
2559
+ - Updated dependencies [dea17b4]
2560
+ - Updated dependencies [89bb77a]
2561
+ - Updated dependencies [06611e4]
2562
+ - Updated dependencies [44152c4]
2563
+ - Updated dependencies [3939545]
2564
+ - Updated dependencies [0ee6e31]
2565
+ - Updated dependencies [66abbde]
2566
+ - Updated dependencies [dc3893d]
2567
+ - Updated dependencies [1bbaa16]
2568
+ - Updated dependencies [6ee259a]
2569
+ - Updated dependencies [7649f43]
2570
+ - Updated dependencies [e708426]
2571
+ - Updated dependencies [3b6d53b]
2572
+ - Updated dependencies [276d174]
2573
+ - Updated dependencies [2982ed9]
2574
+ - Updated dependencies [a8198de]
2575
+ - Updated dependencies [0c789a4]
2576
+ - Updated dependencies [05a49f2]
2577
+ - Updated dependencies [b234a84]
2578
+ - Updated dependencies [a78cd37]
2579
+ - Updated dependencies [5ea623e]
2580
+ - Updated dependencies [5eabe86]
2581
+ - Updated dependencies [ca5d671]
2582
+ - Updated dependencies [32bf2d6]
2583
+ - Updated dependencies [ff0c384]
2584
+ - Updated dependencies [af4fb29]
2585
+ - Updated dependencies [c698a81]
2586
+ - Updated dependencies [ff5ef1c]
2587
+ - Updated dependencies [befd40c]
2588
+ - Updated dependencies [9a97800]
2589
+ - Updated dependencies [6bca0e4]
2590
+ - Updated dependencies [81c0bc4]
2591
+ - Updated dependencies [3c76801]
2592
+ - Updated dependencies [60500cb]
2593
+ - Updated dependencies [2fcefb9]
2594
+ - Updated dependencies [77f846a]
2595
+ - Updated dependencies [bc5870c]
2596
+ - Updated dependencies [b55a346]
2597
+ - Updated dependencies [065bba7]
2598
+ - Updated dependencies [f760064]
2599
+ - Updated dependencies [dd19463]
2600
+ - Updated dependencies [6791717]
2601
+ - Updated dependencies [8ea3bee]
2602
+ - Updated dependencies [100547e]
2603
+ - Updated dependencies [3a58149]
2604
+ - Updated dependencies [6d1c155]
2605
+ - Updated dependencies [d7573b3]
2606
+ - Updated dependencies [bf3edfe]
2607
+ - Updated dependencies [2c8474c]
2608
+ - Updated dependencies [6ce89da]
2609
+ - Updated dependencies [0e05aac]
2610
+ - Updated dependencies [ae61ad4]
2611
+ - Updated dependencies [5aed9e4]
2612
+ - Updated dependencies [83c77dc]
2613
+ - Updated dependencies [3c9fca3]
2614
+ - Updated dependencies [18a8e7d]
2615
+ - Updated dependencies [e7957ab]
2616
+ - Updated dependencies [f7e34ca]
2617
+ - Updated dependencies [e719ebd]
2618
+ - Updated dependencies [516583b]
2619
+ - Updated dependencies [f9e4f91]
2620
+ - Updated dependencies [6ef48b1]
2621
+ - Updated dependencies [fa429cf]
2622
+ - Updated dependencies [ed8df3e]
2623
+ - Updated dependencies [fe76ece]
2624
+ - Updated dependencies [8b446f5]
2625
+ - Updated dependencies [8e74b27]
2626
+ - Updated dependencies [7102b20]
2627
+ - Updated dependencies [8ebd57f]
2628
+ - Updated dependencies [617707a]
2629
+ - Updated dependencies [c40f3b8]
2630
+ - Updated dependencies [58770f3]
2631
+ - Updated dependencies [aefe428]
2632
+ - Updated dependencies [485f096]
2633
+ - Updated dependencies [7357447]
2634
+ - Updated dependencies [199d31b]
2635
+ - Updated dependencies [b655a9d]
2636
+ - Updated dependencies [3e01cb5]
2637
+ - Updated dependencies [7138bc1]
2638
+ - Updated dependencies [cef27e2]
2639
+ - Updated dependencies [4e8622b]
2640
+ - Updated dependencies [dffd752]
2641
+ - Updated dependencies [06973aa]
2642
+ - Updated dependencies [50798f3]
2643
+ - Updated dependencies [6a576c9]
2644
+ - Updated dependencies [105f3c5]
2645
+ - Updated dependencies [3ccd9e8]
2646
+ - Updated dependencies [689b979]
2647
+ - Updated dependencies [c70f865]
2648
+ - Updated dependencies [e546222]
2649
+ - Updated dependencies [fd13f52]
2650
+ - Updated dependencies [d7bd274]
2651
+ - Updated dependencies [98c3a74]
2652
+ - Updated dependencies [fffa30d]
2653
+ - Updated dependencies [ebce5a3]
2654
+ - Updated dependencies [fb336df]
2655
+ - Updated dependencies [4dc80d0]
2656
+ - Updated dependencies [9d9040d]
2657
+ - Updated dependencies [20e317c]
2658
+ - Updated dependencies [0fce2ef]
2659
+ - Updated dependencies [42df928]
2660
+ - Updated dependencies [0e2ddd4]
2661
+ - Updated dependencies [b7479ab]
2662
+ - Updated dependencies [9850c6e]
2663
+ - Updated dependencies [de570cc]
2664
+ - Updated dependencies [b2ea297]
2665
+ - Updated dependencies [5b5a5c3]
2666
+ - Updated dependencies [14582b8]
2667
+ - Updated dependencies [51e144e]
2668
+ - Updated dependencies [19cbf10]
2669
+ - Updated dependencies [ab92940]
2670
+ - Updated dependencies [a691c0b]
2671
+ - Updated dependencies [0b1326d]
2672
+ - Updated dependencies [1e66879]
2673
+ - Updated dependencies [c5200f0]
2674
+ - Updated dependencies [af3861f]
2675
+ - Updated dependencies [2609812]
2676
+ - Updated dependencies [515f171]
2677
+ - Updated dependencies [1f4e029]
2678
+ - Updated dependencies [4f14ad7]
2679
+ - Updated dependencies [258d264]
2680
+ - Updated dependencies [cac64b3]
2681
+ - Updated dependencies [8033ad1]
2682
+ - Updated dependencies [fa140b8]
2683
+ - Updated dependencies [71cba28]
2684
+ - Updated dependencies [190fbd0]
2685
+ - Updated dependencies [c00bf28]
2686
+ - Updated dependencies [93127bd]
2687
+ - Updated dependencies [f2158ec]
2688
+ - Updated dependencies [759606e]
2689
+ - Updated dependencies [fd8dace]
2690
+ - Updated dependencies [72ffc34]
2691
+ - Updated dependencies [a51fa0c]
2692
+ - Updated dependencies [51f3d8d]
2693
+ - Updated dependencies [bf28341]
2694
+ - Updated dependencies [78cbdb5]
2695
+ - Updated dependencies [b7543a9]
2696
+ - Updated dependencies [6c6cee7]
2697
+ - Updated dependencies [42887e0]
2698
+ - Updated dependencies [83fe6e7]
2699
+ - Updated dependencies [d1ab06f]
2700
+ - Updated dependencies [38a9568]
2701
+ - Updated dependencies [f90b8fb]
2702
+ - Updated dependencies [91783c4]
2703
+ - Updated dependencies [982885d]
2704
+ - Updated dependencies [dba7d84]
2705
+ - Updated dependencies [ca39427]
2706
+ - Updated dependencies [bd09957]
2707
+ - Updated dependencies [5a07e67]
2708
+ - Updated dependencies [2d36552]
2709
+ - Updated dependencies [45d8288]
2710
+ - Updated dependencies [b2437a7]
2711
+ - Updated dependencies [f157423]
2712
+ - Updated dependencies [7a90afd]
2713
+ - Updated dependencies [eddc1dd]
2714
+ - Updated dependencies [490f482]
2715
+ - Updated dependencies [27308c5]
2716
+ - Updated dependencies [8689166]
2717
+ - Updated dependencies [c9327c9]
2718
+ - Updated dependencies [920165d]
2719
+ - Updated dependencies [9101be5]
2720
+ - Updated dependencies [f53a8d0]
2721
+ - Updated dependencies [30266cf]
2722
+ - Updated dependencies [968dc1e]
2723
+ - Updated dependencies [57f9b07]
2724
+ - Updated dependencies [3c73d99]
2725
+ - Updated dependencies [d91aed9]
2726
+ - Updated dependencies [ed71d9e]
2727
+ - Updated dependencies [7776fc2]
2728
+ - Updated dependencies [e76634c]
2729
+ - Updated dependencies [c86185e]
2730
+ - Updated dependencies [fb96ecb]
2731
+ - Updated dependencies [1170ed1]
2732
+ - Updated dependencies [92814db]
2733
+ - Updated dependencies [4d73b07]
2734
+ - @object-ui/react@17.7.0
2735
+ - @object-ui/core@17.7.0
2736
+ - @object-ui/types@17.7.0
2737
+ - @object-ui/i18n@17.7.0
2738
+ - @object-ui/components@17.7.0
2739
+ - @object-ui/mobile@17.7.0
2740
+ - @object-ui/permissions@17.7.0
2741
+
3
2742
  ## 17.6.0
4
2743
 
5
2744
  ### Patch Changes