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