@object-ui/plugin-calendar 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,2796 @@
1
1
  # @object-ui/plugin-calendar
2
2
 
3
+ ## 17.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 2124d04: A standalone `object-calendar` honours `navigation: { mode: 'page' }`, and a `navigation` block written without `mode`, by opening the record page (objectui#11293).
8
+
9
+ An event click under either spelling used to open nothing on a calendar no parent view navigates for, and the `navigation` input description of the `object-calendar` and `calendar` registrations warned about it. The shared `useNavigationOverlay` now hands that click to the record navigator the host publishes, and the console publishes one on its custom pages, record pages and list views. The description drops the warning and says where `page` goes: through the host's record navigator, and nowhere under a host that publishes none. An overlay mode still keeps the click from a parent view's handlers, and any other mode still hands it to them.
10
+ - 7c3df8f: A non-grid view's fetch now carries a platform row ceiling, and crossing it is
11
+ never silent (objectui#7210, maintainer ruling a′, 2026-09-02).
12
+
13
+ Before this, `ObjectGantt`, `ObjectCalendar`, `ObjectMap` and `ObjectTree` each
14
+ issued a `find` with **no `$top` at all**, so the request returned the entire
15
+ filtered result set. At the 186 rows the card was filed from that is invisible;
16
+ on an object with 100k scheduled rows it is the whole table into the browser,
17
+ and nothing an author could write — `pagination.pageSize` included — could
18
+ bound a request that never carried a cap to begin with.
19
+
20
+ **What changed.** Those four fetches now ask for `NON_GRID_ROW_CEILING_TOP`
21
+ rows, draw at most `NON_GRID_ROW_CEILING` of them, and when the result set was
22
+ larger they render a footnote naming both numbers, verbatim as it renders:
23
+ *"Showing the first 2000 of 41234 records. Narrow the filter."* Below the
24
+ ceiling nothing changes: the full set draws and no footnote appears.
25
+
26
+ The four view packages take a **minor**, not a patch: a result set above the
27
+ ceiling is no longer drawn in full, which is a behaviour break whatever the
28
+ fixed group does to the released version number.
29
+
30
+ **The ceiling is a platform constant, not an authorable key** — `2000`, exported
31
+ from `@object-ui/react` as `NON_GRID_ROW_CEILING`. An authored `limit` or
32
+ `dataSource: { limit }` still does not reach these queries, by the same ruling;
33
+ three alternatives were rejected with it (a documentation note only — still the
34
+ whole table; truncating at `pageSize` — silent, and a complete schedule capped
35
+ at one page; an authorable `maxRows` — a new permanent key every author sets).
36
+
37
+ **Why 2,000.** One constant for all four, so the binding view sets it. Measured
38
+ in this repo's jsdom lane: gantt, calendar and map hold their DOM flat as rows
39
+ grow (virtualised task list; four events per day cell; auto-clustering above
40
+ 100 markers), while `ObjectTree` flattens every expanded node into the document
41
+ at a linear **5.2 DOM elements per record** with no virtualisation. 2,000 rows
42
+ is where the worst of the four lands at ~10,400 elements — an order of
43
+ magnitude above Lighthouse's "excessive DOM size" warning, and still ~10x the
44
+ real application result set this card came from.
45
+
46
+ New exports on `@object-ui/react`: `NON_GRID_ROW_CEILING`,
47
+ `NON_GRID_ROW_CEILING_TOP`, `applyNonGridRowCeiling`, `NonGridRowCeilingNote`
48
+ and the type `NonGridCeilingResult`. Two new `common.*` i18n keys carry the
49
+ footnote copy in all ten packs.
50
+ - b041b9c: `@object-ui/core` publishes `resolveRecordSourceObjectName`, the ONE reader for "which
51
+ object is this block bound to".
52
+
53
+ Six view plugins each spelled that resolution locally — `ObjectCalendar` twice,
54
+ `ObjectGantt`, `ObjectTree` twice, `ObjectMap`, `ObjectGrid` — and had drifted: three
55
+ wrote `?? schema.objectName`, one `|| ''`, one `: undefined`, one an `'object' in
56
+ dataConfig` test. They now delegate to one function that states the published
57
+ record-source ladder `77cb489b4` declared (`data`, then `staticData`, then `objectName`) once.
58
+
59
+ **No behaviour changes.** Each site's pre-collapse expression is transcribed verbatim
60
+ into `record-source.behaviourNeutrality-7627.test.ts` and asserted equal to its
61
+ post-collapse spelling across the whole contract-valid input matrix — both bindings
62
+ present, data only, `objectName` only, empty `objectName`, empty `data.object`, the
63
+ `api` / `value` / `staticData` / array-shorthand providers, and nothing bound.
64
+
65
+ **Two questions stay two questions.** `normalizeListViewSchema`'s gap-fill (#7477,
66
+ ruling B, landed as `00d2fa682`) is untouched and is NOT re-pointed at the new reader: it answers
67
+ how `objectName` gets POPULATED when absent, where an already-present `objectName` wins.
68
+ The new reader answers which object a block RESOLVES, where the `data` block wins — the
69
+ order declared on both published faces in `@object-ui/types` and pinned by
70
+ `objectql-record-source-refinement-6939.test.ts`. Merging them would silently override
71
+ one standing ruling or the other.
72
+
73
+ **`ObjectGantt`'s `persistLayoutKey` is deliberately excluded** and keeps its inverted
74
+ order, with an in-place comment saying why: its receiver is a localStorage key
75
+ (`gantt-layout:KEY:filters`), not a record source, so re-pointing it would orphan every
76
+ saved layout and filter-chip set of a view carrying both bindings. Two more sites the
77
+ finding listed are not object-name readers at all and were struck: `ObjectGantt`'s
78
+ refresh-handler predicate (`object` OR `api`) and `plugin-dashboard`'s `isObjectProvider`
79
+ type-guard over a widget's `data`.
80
+
81
+ `useSettledSchema`'s doc comment stops prescribing the hand-written ladder at all four
82
+ lines that taught it, so the copies cannot re-seed from the hook that replaced them.
83
+ - 7ef3867: Retire the `filter.calendar` configuration spelling on `object-calendar` (objectui#7711).
84
+
85
+ **Breaking, deliberately.** `getCalendarConfig` no longer probes `schema.filter` for a
86
+ `calendar` key. A calendar whose configuration was written as
87
+ `filter: { calendar: { startDateField: … } }` no longer resolves a configuration at all
88
+ and now renders the component's existing "Calendar configuration required" refusal
89
+ screen. Write the configuration under
90
+ the declared `calendar` container instead — the read for it already existed, directly
91
+ below the retired arm.
92
+
93
+ `filter` is the query filter and nothing else. `@objectstack/spec`'s
94
+ `ComponentPropsMap['object-calendar']` declares `calendar` as the configuration
95
+ container and `filter` as the base query filter, and admits no `filter.calendar`
96
+ spelling; the renderer nevertheless read the config out of the filter FIRST, and the
97
+ comment on the canonical read below called *that* one the "backward compatibility"
98
+ branch — the contract inverted in a source comment. The arm and the comment are both
99
+ gone. No compatibility rung and no deprecation window, per AGENTS.md #0.1: a tolerant
100
+ fallback fossilizes the wrong convention into a second de-facto contract.
101
+
102
+ **The bug this closes is not only the retired spelling.** One authored key was being
103
+ read twice with two incompatible meanings. `filter: { calendar: 'team' }` — a
104
+ legitimate condition on a field literally named `calendar` — was returned as the
105
+ `CalendarConfig` while the same object still went to `$filter` on the wire. `'team'` is
106
+ truthy, so the refusal screen did not fire either: `startDateField` destructured off a
107
+ string is `undefined`, every record fell into "unscheduled", and the grid rendered empty
108
+ while the author's declared `calendar` block sat unread. Such a filter now reaches
109
+ `$filter` untouched and the declared container is what configures the calendar.
110
+
111
+ The calendar twin of the `filter.map` retirement in objectui#4034, with one measured
112
+ difference: there is no `Array.prototype.calendar`, so `'calendar' in schema.filter` was
113
+ never true for an array-shaped filter the way `'map' in schema.filter` was true for
114
+ every one of them. Only an object-shaped filter with an own `calendar` key ever reached
115
+ the retired arm, and the calendar answers the loss of a configuration with a named
116
+ refusal on screen rather than the map's silent fallback to default field names — so this
117
+ retirement carries no dev-time diagnostic rider.
118
+
119
+ **Migration.** A census of this repo found **zero** authored `filter: { calendar: … }`
120
+ sites (both the object-literal and JSON spellings, with positive controls and a planted
121
+ fixture proving the search fires).
122
+
123
+ Also in this change: the `calendarConfig` memo's dependency list drops `schema.filter`,
124
+ which the function no longer reads, and gains the three flat keys it does read but the
125
+ list never named — `startDateField`, `endDateField` and `allDayField`. Dropping `filter`
126
+ removed an accidental co-trigger that used to pick those up whenever a filter changed
127
+ alongside them.
128
+ - 0ead1f6: Declare the `filter` input on every `object-kanban` / `object-calendar`
129
+ registration (objectui#7712) — the html tier stops reporting `unknown-prop` on a
130
+ key the spec declares and both renderers read.
131
+
132
+ `ObjectKanban.tsx` sends the authored key to the query as `$filter: schema.filter`
133
+ and `ObjectCalendar.tsx` does the same, and `@objectstack/spec`'s
134
+ `ComponentPropsMap` declares `filter` on both blocks (measured: `safeParse`
135
+ accepts it, and refuses an undeclared key by name on the same call). But none of
136
+ the four registrations that publish those two renderers listed `filter` in
137
+ `inputs`, and `sdui-parser`'s `validateTree` reports `unknown-prop` for every key
138
+ no `inputs` entry claims. So an author writing the one spelling that WORKS was
139
+ told it was unknown — objectui#6678's shape, where a correct write draws the same
140
+ diagnostic as a write that does nothing. That is worse than an inert key: it
141
+ actively punishes the correct behaviour, and the honest response to it is to
142
+ delete working metadata.
143
+
144
+ ADR-0049 enforce-or-remove resolves toward **declare**, not remove: the key has
145
+ live readers on both ends, so the registrations were the side that was wrong. The
146
+ declaration is `type: 'array'` on all four, matching the `filter` that
147
+ `object-grid`'s `GRID_QUERY_INPUTS` and `object-metric` already publish, and it is
148
+ writable as one shape only because objectui#7711 landed first and retired the
149
+ object-shaped `filter.calendar` spelling — `filter` is the query filter and
150
+ nothing else.
151
+
152
+ Declared per key against the spec rather than derived from the
153
+ `ElementDataSourceMapping` sitting beside these registrations, even though that
154
+ mapping already asserts `filter` is a live query key. Measured, that derivation
155
+ would be wrong: the kanban mapping also carries `limit`, and the spec's strict
156
+ `ComponentPropsMap['object-kanban']` **rejects** `limit` by name, so emitting it
157
+ would publish a key the save gate refuses.
158
+
159
+ ⚠️ Note for whoever meets this class next: `check:react-blocks-declaration-parity`
160
+ runs manifest → spec, one direction. A key the SPEC declares and the manifest
161
+ omits is structurally outside what that ratchet measures, so fixing these four
162
+ registrations does **not** make the next omission loud. Making that ratchet
163
+ bidirectional is its own card.
164
+ - edea22a: **BREAKING** — `SchemaRendererProvider`'s `dataSource` prop, and the context
165
+ type every `useSchemaContext()` consumer reads back, are the published
166
+ `DataSource` contract instead of `any`.
167
+
168
+ **FROM** `dataSource={anything}` **TO** `dataSource={adapter}` — a `DataSource`
169
+ from `@object-ui/types`, or `null` / `undefined` when the host has no adapter
170
+ bound.
171
+
172
+ ```ts
173
+ // before — compiled, and failed at runtime on the first find()
174
+ <SchemaRendererProvider dataSource={'not-an-adapter'}>
175
+ // before — compiled, and no reader can do anything with it
176
+ <SchemaRendererProvider dataSource={{}}>
177
+ // after
178
+ <SchemaRendererProvider dataSource={adapter}> // a DataSource
179
+ <SchemaRendererProvider dataSource={undefined}> // "I have no adapter"
180
+ ```
181
+
182
+ Both sites are typed `DataSource | null | undefined` — the spelling
183
+ `useSettledSchema` in this same package already used. The two absences are part
184
+ of the contract, not a weakening of it: a Studio preview, a `kind:'react'` page
185
+ rendered before the host's adapter connects, and a widget probe driving
186
+ `apiFetch` alone all render with nothing bound, and every reader in the tree
187
+ already guards for it. What the union refuses is everything that is not an
188
+ adapter: a string, an empty object, a plain data bag, a partial adapter missing
189
+ a required member.
190
+
191
+ The measured cost, both halves, because the two `any`s have different blast
192
+ radii (measured separately on `origin/main`, whole-repo type-check over the 33
193
+ packages that depend on `@object-ui/react`):
194
+
195
+ - the **context type** — the `any` that reaches every `useSchemaContext()`
196
+ reader — reds **7 diagnostics at 7 sites in 4 packages**, all of them
197
+ production code or a mocked module factory.
198
+ - the **provider prop** — the injection points — reds **52 diagnostics at 27
199
+ sites in 11 packages**, all but one of them test doubles.
200
+
201
+ That ordering is the reverse of the prediction on the card: the context `any`
202
+ was expected to be the expensive one because it infects the whole tree, and it
203
+ is the cheap one, because every reader in the tree already guarded and none of
204
+ them ever reached past `find` / `getObjectSchema`. The prop is the expensive
205
+ one, because the injection points are overwhelmingly test doubles that were
206
+ never complete adapters. The full accounting is on objectui#7912.
207
+
208
+ Two runtime behaviours change, both in the "no adapter" direction and both
209
+ strictly closer to what the surrounding code already intended:
210
+
211
+ - `@object-ui/components`' `kind:'react'` page passed an empty object as its
212
+ "no adapter yet" stand-in. An empty object is TRUTHY, so it walked past every
213
+ `if (!dataSource)` guard written to catch exactly that state and failed later,
214
+ at the call. It now passes the absent adapter itself, so the guard fires where
215
+ it was meant to. The module-constant identity that stand-in existed for is
216
+ preserved: `null` is a primitive, so the provider's memo is unaffected.
217
+ - `@object-ui/plugin-calendar`, `@object-ui/plugin-gantt` and
218
+ `@object-ui/plugin-kanban` collapse a `null` adapter from the context to
219
+ `undefined` before handing it to their widget, whose prop declares the single
220
+ spelling `dataSource?: DataSource`.
221
+
222
+ Nothing else moves at runtime: no value flowing through this key changes, and
223
+ no data path is touched. A TypeScript consumer outside this repo that handed
224
+ this prop something other than an adapter now gets a compile error naming the
225
+ key (TS2322 / TS2739 / TS2740), which is why the FROM/TO is spelled out above.
226
+
227
+ Five `as any` reads of this context in `@object-ui/fields` are gone — they were
228
+ redundant the moment the seam became honest — and `LookupField`'s local
229
+ re-declaration of the imported context as a `Context` of `any`, which laundered
230
+ its `dataSource` read while looking typed, is gone with them. Both directions of
231
+ the contract are pinned against the real compiler in
232
+ `SchemaRendererContext.dataSourceType.pin.test.ts`, and the card's planted
233
+ documentation probe (a bare string in `packages/react/README.md`'s provider
234
+ example) now fails `pnpm check:doc-snippets`, where it used to exit 0 with zero
235
+ diagnostics.
236
+
237
+ objectui#7912.
238
+ - f84760f: `object-calendar` now READS the `allDayField` it already resolved (objectui#8026).
239
+
240
+ **The defect.** `getCalendarConfig` put `allDayField` into the `CalendarConfig` it
241
+ returns, and the memo that builds that config named the key among its dependencies —
242
+ but the events pass destructured four keys and computed the flag as `!endDate`. An
243
+ author who wrote `calendar: { allDayField: 'is_all_day' }` therefore got the flag
244
+ derived from whether the record happened to carry an end date, and a record with a
245
+ real end date that IS flagged all-day rendered as an ordinary timed event, with no
246
+ diagnostic. The value was arriving: `ListView`'s `collectViewFields` already collects
247
+ this field into the fetch, and `ObjectView`'s `calendarViewOptions` forwards the
248
+ authored `calendar` block verbatim.
249
+
250
+ **No default field name — the deliberate divergence from `calendar-view`.** The
251
+ sibling `calendar-view` renderer spells `schema.allDayField || 'allDay'`.
252
+ `object-calendar` does **not** take that default, and an unauthored `allDayField`
253
+ changes nothing: the existing `!endDate` inference stands, so every calendar that
254
+ never declared the key renders exactly as before. The sibling's five field-name
255
+ defaults describe the canonical authored EVENT shape a `calendar-view` node carries
256
+ in its `data`; `object-calendar` draws ObjectQL records of a business object, where
257
+ nothing makes `allDay` a field name — and this renderer honours none of those five
258
+ defaults, refusing rather than guessing when `startDateField` is absent
259
+ (objectui#7029). Importing one of the five would put the last fabricated field
260
+ binding back into the renderer whose refusal screen exists to refuse guessing.
261
+
262
+ **Behaviour change, scoped.** Only calendars that DID author `allDayField` change,
263
+ and they change in the direction the declaration asked for. Where the key is
264
+ declared it is now the whole answer: a record whose flag is absent or false is not
265
+ all-day, because letting the inference run behind a declared key would silently
266
+ overrule the author.
267
+
268
+ **Not spec surface.** `@objectstack/spec`'s `CalendarConfigSchema` is a strict object
269
+ of four keys and refuses `allDayField` by name — the same way it refuses objectui's
270
+ own sanctioned `defaultView`. The key rides objectui's deliberate `.passthrough()` on
271
+ the `CalendarConfig` mirror in `@object-ui/types`, whose comment names it: "the
272
+ renderers grow config knobs ahead of the protocol (calendar's `allDayField`, for
273
+ one), and stripping them here would silently disable a shipped capability." Nothing
274
+ in this change widens any accept set.
275
+
276
+ **Correction, 2026-10-01 (objectui#8831).** The "Not spec surface" paragraph above is false against `@objectstack/spec` 17.5.0, which this same release installs. That release's `CalendarConfigSchema` declares five keys, `allDayField` among them, and accepts it. It still refuses `defaultView`. The key no longer rides the `.passthrough()` of the `CalendarConfig` mirror in `@object-ui/types`: that mirror derives from the spec schema, so `allDayField` is now a declared member of it. objectui#11073's bump to 17.5.0 made the paragraph false, not this entry and not objectui#8831. The paragraphs about the renderer still hold: `object-calendar` takes no default field name for `allDayField`, and a declared one is the whole answer.
277
+ - 35e6366: Declare the `sort` input on both `object-calendar` registrations
278
+ (objectui#8171) — the html tier stops reporting `unknown-prop` on a key the spec
279
+ declares and `ObjectCalendar` already reads.
280
+
281
+ objectui#7712's defect, one key over. `ObjectCalendar.tsx` lowers the authored
282
+ key onto its own query as `$orderby: convertSortToQueryParams(schema.sort)`, and
283
+ `@objectstack/spec`'s `ComponentPropsMap['object-calendar']` declares `sort`
284
+ (measured on 17.2.0: `safeParse({ objectName, sort })` returns `success: true`,
285
+ while the same strict schema on the same call refuses `bogusProp` by name — that
286
+ control is what makes the acceptance a verdict). But neither of the two
287
+ registrations that publish this renderer — `plugin-calendar:object-calendar` and
288
+ `view:calendar` — listed `sort` in `inputs`, and `sdui-parser`'s `validateTree`
289
+ reports `unknown-prop` for every key no `inputs` entry claims. So an author
290
+ writing the one spelling that WORKS was told it was unknown — objectui#6678's
291
+ shape, where a correct write draws the same diagnostic as a write that does
292
+ nothing.
293
+
294
+ ADR-0049 enforce-or-remove resolves toward **declare**, not remove: the key has
295
+ live readers on both ends, so the registrations were the side that was wrong.
296
+ Declared `type: 'array'`, matching the `filter` entry objectui#7712 put beside
297
+ it and the `sort` that `object-grid`'s `GRID_QUERY_INPUTS` publishes — measured,
298
+ that arm is the repo-wide convention for this key, all seven existing `sort`
299
+ declarations write it.
300
+
301
+ ⛔ Not derived from the `ElementDataSourceMapping` sitting six lines above,
302
+ which already asserts `sort: true`. That structure maps query keys for
303
+ `ElementDataSourceGate`; it is not an authoring declaration, and objectui#7712
304
+ measured why a mechanical derivation would be wrong — kanban's mapping also
305
+ carries `limit`, which the spec refuses by name.
306
+
307
+ ⚠️ Carried forward from objectui#7712, because it stays true here:
308
+ `check:react-blocks-declaration-parity` runs manifest → spec, one direction. A
309
+ key the SPEC declares and the manifest omits is structurally outside what that
310
+ ratchet measures, so declaring this key does **not** make the next omission
311
+ loud. Making that ratchet bidirectional is objectui#8176.
312
+
313
+ Rider carried by the same change, because objectui#8212 landed first: the
314
+ console's `registry-inputs-spec-parity` ledger is updated in step with the
315
+ declaration — the `object-calendar.sort` unpublished-key exemption is deleted
316
+ (its cover expires the moment the key is declared), the shrink-only objectui#8176
317
+ backlog ceiling drops 16 to 15, and `sort` gets a `MEMBER_PINS` entry rather than
318
+ a member-pin exemption. `MEMBER_PIN_EXEMPTION_CEILING` is untouched by this
319
+ change; it read 62 at the commit that wrote this paragraph (`35e63669d6`,
320
+ 2026-09-07), and that reading is dated on purpose — see the closing note.
321
+
322
+ ⚠️ That member pin is deliberately NOT the identity-forwarding shape the two
323
+ `filter` pins use. `ObjectCalendar.tsx` writes
324
+ `$orderby: convertSortToQueryParams(schema.sort)`, which builds a new
325
+ `field -> direction` map, so this key is lowered rather than passed through and
326
+ `toBe` on `$orderby` is false about it. The pin asserts what is READ inside a
327
+ member instead — `field`, `order`, an omitted `order` meaning ascending, and a
328
+ member with no usable `field` dropped rather than invented.
329
+
330
+ No version bump is declared for `@object-ui/console`: its only edit here is that
331
+ test file's ledger data, which publishes nothing.
332
+
333
+ ⚠️ Closing note, written while this declaration was still pending
334
+ (objectui#9781) — why the `MEMBER_PIN_EXEMPTION_CEILING` reading above is DATED
335
+ rather than corrected. The sentence was authored as
336
+ "`MEMBER_PIN_EXEMPTION_CEILING` is untouched at 62", and both of its halves
337
+ were true at `35e63669d6`: this change did not touch that constant, and 62 was
338
+ its value there. "Is untouched" is a closed statement about THIS change and
339
+ cannot rot, so it is kept as written. "At 62" is an absolute reading of a
340
+ SHARED constant, which somebody ELSE's change falsifies — objectui#8071 slice 1
341
+ (`240c605939`, 2026-09-09) lowered it 62 -> 58, and later slices of that issue
342
+ moved it again while this declaration sat pending.
343
+
344
+ ⛔ The reading is deliberately NOT restated at whatever that constant reads
345
+ today: today's number is true today and false again at the next slice, so
346
+ writing it would be this same defect authored a second time. ⇒ The rule this
347
+ repair carries, and the line between this paragraph and every sibling changeset
348
+ in the family: state your OWN change's bounded transition ("lowers 62 to 58",
349
+ "follows 31 to 28 in the same change", "drops 37 to 33") or state that you did
350
+ not touch the constant, and ⛔ never state what its value currently is. The
351
+ first is a finished fact about something the author controlled; the second is a
352
+ live claim about a world the author does not.
353
+ - 0ea7054: Remove 37 runtime dependencies that no file in the declaring package consumes, and gate
354
+ the direction so the next one cannot land (objectui#8198).
355
+
356
+ `check:phantom-deps` judges imports that are not declared; nothing judged the reverse,
357
+ so a declaration could outlive its last consumer indefinitely. That is what happened to
358
+ `recharts` in `@object-ui/components` after objectui#7397 deleted its only importer — it
359
+ was removed by hand on objectui#7625, and nothing would have reported the next one. The
360
+ new `pnpm check:unused-deps` asks the reverse question over `dependencies` and
361
+ `optionalDependencies` of every released package.
362
+
363
+ **Potentially breaking, for consumers relying on hoisting.** Nothing these packages ship
364
+ changes: their Vite `external` predicates are path-based and never read `dependencies`,
365
+ so no built artifact moves. What changes is the install graph — a project that imports
366
+ one of the removed packages while depending only on the ObjectUI package that used to
367
+ drag it in will no longer resolve it. Declare it directly; that is the correct
368
+ dependency edge in either case. The removals, by package:
369
+
370
+ - `@object-ui/plugin-designer`: `@dnd-kit/core`, `@dnd-kit/sortable`, `@dnd-kit/utilities`, `@object-ui/fields`
371
+ - `@object-ui/plugin-chatbot`: `react-markdown`, `react-syntax-highlighter`, `remark-gfm` (and the orphaned `@types/react-syntax-highlighter`)
372
+ - `@object-ui/plugin-report`: `@object-ui/plugin-grid`, `clsx`, `react-i18next`, `tailwind-merge`
373
+ - `@object-ui/plugin-map`: `@objectstack/spec`, `lucide-react`, `zod`
374
+ - `@object-ui/runner`: `class-variance-authority`, `clsx`, `tailwind-merge`
375
+ - `@object-ui/core`: `lodash`, `zod`
376
+ - `@object-ui/layout`: `clsx`, `tailwind-merge`, and `react-dom` — which it pinned at an exact version in `dependencies` while also declaring it as a peer range, i.e. a library hard-depending on the renderer it asks its host to supply
377
+ - `@object-ui/plugin-dashboard`: `clsx`, `tailwind-merge`, and the same `react-dom` defect
378
+ - `@object-ui/plugin-ai`: `@object-ui/react`, `clsx`, `tailwind-merge`
379
+ - `@object-ui/fields`: `clsx`, `tailwind-merge`
380
+ - `@object-ui/console`: `@object-ui/react-runtime`, `sucrase`
381
+ - `@object-ui/auth`: `@object-ui/types`
382
+ - `@object-ui/plugin-calendar`: `@object-ui/fields`
383
+ - `@object-ui/plugin-editor`, `@object-ui/plugin-markdown`: `@object-ui/react`
384
+ - `@object-ui/react`: `react-hook-form`
385
+
386
+ Every one was verified by a whole-package grep before removal — the name appeared nowhere
387
+ under the package but its own manifest and CHANGELOG — and the whole workspace builds,
388
+ type-checks and tests green afterwards.
389
+ - 91facae: **Breaking behaviour change — a view block now honours only the `data` spelling its published row declares.**
390
+
391
+ Maintainer ruling, decision batch #83 (2026-09-08), verbatim 「8348 以协议为准」: the contract decides. What `os validate` and the save gate refuse under `data`, the renderer refuses too. The shared record-source ladder (`resolveRecordSourceConfig` in `@object-ui/core`) now takes the arm the calling block's row declares, and rung 1 applies only on that arm.
392
+
393
+ ⚠️ **`object-calendar` documents authored against the tolerated spelling stop rendering those rows.** The ladder falls past `data` to `staticData`, then to `objectName` — so such a calendar queries its object instead, or draws nothing when it names neither. This is accepted, with no transition window and no staged deprecation (the standing 2026-08-27 posture).
394
+
395
+ **Per block — what the published row says, and what actually moves:**
396
+
397
+ - **`object-calendar`** — row: `ComponentPropsMap['object-calendar'].data` is `z.array(z.unknown())` ("Pre-fetched records — skips the internal fetch"). A record-source **config object** under `data` — `{ provider: 'value', items }`, `{ provider: 'object', object }`, `{ provider: 'api', … }` — is no longer honoured, and this is a real end-to-end change: that object had exactly one carrier into the block, so an authored calendar written that way now queries its object (or draws nothing) instead of drawing the authored rows. There is no longer an api-provider branch to reach here. An **array** under `data` is unchanged, as are `staticData` and `objectName`.
398
+ - **`object-grid`** — row: the `ViewData` union, whose own description says "the bare-array shortcut is refused". `getDataConfig`'s `Array.isArray(schema.data)` head is removed, so the array is no longer a record source at the ladder. ⛔ Measured: this is **not** an end-to-end change for a node rendered through `SchemaRenderer`. An authored `data` array also arrives on the **props channel** (`SchemaRenderer` spreads node keys as props; `ObjectGrid`'s `passedData` lifts an array at higher priority), so such a grid still drew its rows when this landed. The removal took the second read, not the last one; objectui#9571 closed the props carrier afterwards.
399
+ - **`object-map`** — no `ComponentPropsMap` row existed when this landed; the governing row was this repo's own `ObjectMapSchema.data`, `ViewDataSchema.optional()` (the protocol row has since been published, and is the `ViewData` union too). Its array-shorthand head is removed on the same terms, with the same measured caveat at the time: through `SchemaRenderer` the props channel still drew an authored array, until objectui#9571. `data: { provider: 'value', items }` and `staticData` are unchanged.
400
+ - **`object-gantt`** — no `ComponentPropsMap` row when this landed; the governing row was `ObjectGanttSchema.data`, `ViewDataSchema.optional()` (the protocol row has since been published, and is the `ViewData` union too). A bare array under `data` is no longer a record source. Nothing observable moves: this block never lifted one, the array carried no `provider` and matched no fetch branch, and its renderer forwards no host props.
401
+ - **`object-tree`** — **unchanged by this change.** When it landed, no published face declared a `data` row for this block: not `ComponentPropsMap`, not `ObjectTreeSchema` (which declares `objectName` required and no `data`), not its registration `inputs`. Neither arm of the ruling reached it, so its rung 1 kept its previous behaviour and the block was reported rather than guessed at. Once the protocol published `ComponentPropsMap['object-tree']`, the tree moved to the `ViewData` arm too — see the separate `object-tree` entry for objectui#8348.
402
+
403
+ The `data` **prop** — the pre-fetched rows a host such as `ObjectView` or `ListView` passes down — is a different carrier and is untouched on every block. That it is also reachable from an authored node key, because `SchemaRenderer` spreads node keys as props, is what limits the grid and map halves above; it is reported on objectui#8348 rather than changed here.
404
+ - 474797d: **BREAKING** — the calendar date aliases `dateField` and `endField` are retired
405
+ at both faces (objectui#8355). They are now **declared refusals**: an authored
406
+ value is rejected **by name**, at its own key path, pointed at `startDateField` /
407
+ `endDateField`.
408
+
409
+ **FROM** `calendar: { dateField, endField }` — accepted in silence, read by
410
+ `ObjectCalendar`'s alias ladder — **TO** a by-name refusal at validation, with
411
+ `startDateField` / `endDateField` as the only spellings that bind the axis.
412
+
413
+ ```ts
414
+ // before — parsed green, drew a calendar
415
+ { type: 'list-view', objectName: 'task', calendar: { dateField: 'kickoff', endField: 'wrapup' } }
416
+ // after — refused at validation, naming the canonical keys
417
+ { type: 'list-view', objectName: 'task', calendar: { startDateField: 'kickoff', endDateField: 'wrapup' } }
418
+ ```
419
+
420
+ **The refusal an author now meets**, verbatim from the arms' own messages (one
421
+ string per arm feeds both the parse-time issue and the `.describe()` metadata):
422
+
423
+ ```text
424
+ Unrecognized key(s) on this calendar configuration: `dateField`. Did you mean
425
+ `dateField` → `startDateField`? `dateField` and `endField` are the pre-#2231
426
+ objectui spellings of the calendar date axis, retired at both faces by
427
+ objectui#8355. `@objectstack/spec` spells the axis `startDateField` and
428
+ `endDateField` only. ⚠️ This package accepted BOTH legacy spellings green until
429
+ that retirement — they rode a `.passthrough()` straight through
430
+ `safeValidateSchema` into `ListView`'s calendar branch, which flattened them onto
431
+ the generated `object-calendar` node where the renderer's alias ladder read them.
432
+ That ladder is gone, so the key is refused here instead of being kept and then
433
+ ignored. Write `startDateField` for the event start. Kept rather than refused, an
434
+ authored `dateField` binds nothing: the calendar falls through to "Calendar
435
+ configuration required", a screen that names the canonical keys and never the key
436
+ you wrote.
437
+ ```
438
+
439
+ ⚠️ **The consequence clause is per key, because the two spellings fail
440
+ differently.** `endField` gets the same stem and this tail instead — measured on
441
+ the renderer, not assumed:
442
+
443
+ ```text
444
+ …Write `endDateField` for the event end. Kept rather than refused, an authored
445
+ `endField` fails even more quietly than its sibling: a calendar that also carries
446
+ a start binding still DRAWS, and only the end of every event is silently dropped.
447
+ ```
448
+
449
+ On the flat node face the surface noun is `this object-calendar node`. ⚠️ **The
450
+ element's own `calendar` container carries a different tail for `dateField`**,
451
+ because it fails differently and was measured doing so: `getCalendarConfig` reads
452
+ that container WHOLE, so a retired spelling there never reaches the refusal
453
+ screen — the calendar mounts and simply places nothing, every record landing
454
+ under "Unscheduled". `endField` keeps one clause, because it reads the same on
455
+ both.
456
+
457
+ ```text
458
+ …Write `startDateField` for the event start. Kept rather than refused, an
459
+ authored `dateField` fails without even reaching that refusal screen: this
460
+ container is read WHOLE, so the calendar still mounts and simply places nothing —
461
+ every record ends up under "Unscheduled" with no date to draw it on.
462
+ ```
463
+
464
+ **ADR-0087 disposition — D2 tombstone, no conversion entry and no migration
465
+ prescription.** The keys stay DECLARED and unwritable rather than being deleted,
466
+ which is the whole of the ruling: every calendar block here ends `.passthrough()`
467
+ and `BaseSchema` does too, so a deleted key is not refused — it is KEPT
468
+ unexamined and then ignored. Nothing in `@objectstack/spec` converts these two
469
+ (the protocol never declared either: `CalendarConfigSchema` is a strict object of
470
+ `startDateField` / `endDateField` / `titleField` / `colorField`, measured on the
471
+ installed pin 17.4.0 with a nonsense-key control on the same call), so there is
472
+ no ledger entry to register and no `objectstack migrate meta` step to ship. The
473
+ channel that reaches an author is the validator, and it now names the key and the
474
+ remedy on all five authoring surfaces this vocabulary has: a list view's
475
+ `calendar` block and its legacy `options.calendar` twin, a named view's two
476
+ nestings under `listViews`, the flat `object-calendar` node face, and that
477
+ element's own `calendar` container. ⚠️ Stated as five surfaces rather than
478
+ "every author" on purpose: a host that builds the node in TypeScript and hands it
479
+ to `SchemaRenderer` never parses the mirror at all — `SchemaRenderer` runs the
480
+ structural core validator, which is dev-only and names no key — so the compiler
481
+ is that population's channel, not this one.
482
+
483
+ ⚠️ **Dated note, 2026-09-28 — a named view's `options.calendar` nesting is no longer
484
+ judged inside — objectui#7928.** Later in this same release `ObjectViewSchema.listViews`
485
+ became the protocol's strict `ObjectListViewSchema` record, by reference, and that
486
+ record refuses a named view's `options` bag whole (`unrecognized_keys` at
487
+ `listViews.KEY`, naming `options`). So an alias written under
488
+ `listViews.KEY.options.calendar` no longer draws an issue naming the key or the remedy.
489
+ The named view's `calendar` block still does: the protocol refuses the alias there as an
490
+ unrecognized key, and this entry's check adds the pointer at the key beside it. A stored
491
+ body that `@object-ui/app-shell`'s `ViewPreview` relays has its `options.calendar` folded
492
+ onto the `calendar` block first (`foldStoredListOptions`). The list view's two nestings
493
+ and both `object-calendar` surfaces are unchanged; `calendar-date-alias-refusal-8355.test.ts`
494
+ in `@object-ui/types` re-derives each surface. `.changeset/7928-listviews-by-reference-fold.md`
495
+ (PR objectui#10821) states what ships; the text above is kept as the reading of this change.
496
+
497
+ ⚠️ **Why this is `minor` and not `major`.** This repository forbids `major` in a
498
+ changeset: the fixed release group's major tracks `@objectstack`'s, so any
499
+ `major` here would push all of it off that cadence
500
+ (`scripts/check-changeset-no-major.mjs` enforces it). objectui's own breaking
501
+ changes ship as `minor` with the break spelled out, which is what this entry is.
502
+
503
+ **What broke silently before, and why the two halves ship together.** An earlier
504
+ attempt removed the renderer's alias ladder on its own. The producer kept
505
+ spreading the authored block flat onto the generated `object-calendar` node, so
506
+ the alias still arrived, nothing read it, and the author met a generic "Calendar
507
+ configuration required" screen naming keys they had not written. A live authoring
508
+ path stopped rendering with every gate green (recorded on objectui#8651). The
509
+ refusal at the declaration is what turns that silence into a loud, by-name
510
+ failure — so the ladder removal, the producer strip and the tombstones are one
511
+ change and must stay one.
512
+
513
+ **The four moving parts:**
514
+
515
+ - `@object-ui/types` — `aliasKeyRefusal()` arms on the view-level `calendar`
516
+ block, on the legacy `options.calendar` nesting (a check, since an open record
517
+ declares no member — `custom` there, `invalid_type` at the declared slot), on
518
+ the flat `object-calendar` node face, and on that element's own `calendar`
519
+ container; plus a `.check()` on `ObjectViewSchema` for a named view's two
520
+ nestings. `z.input` of each arm is `undefined`, so the TypeScript face carries
521
+ `dateField?: never` / `endField?: never` and `tsc` refuses the key at the
522
+ authoring site as well.
523
+ - `@object-ui/plugin-calendar` — `getCalendarConfig` reads the declared
524
+ spellings only; the `CalendarAliasRungs` cast target and both read sites are
525
+ gone, and the config memo's dependency list loses the two entries with them.
526
+ - `@object-ui/plugin-list` — the `calendar` branch destructures the two
527
+ spellings out of the merged block and spreads only the remainder onto the node,
528
+ exactly as the kanban branch strips its own stray `groupBy` (objectui#8365).
529
+ - `@object-ui/plugin-view` — **the SECOND route**, and the reason this entry
530
+ moved four packages rather than three. `generateViewSchema` runs when no host
531
+ supplied `renderListView` — the authored `object-view` element — so a named
532
+ view never passes through `ListView`. Its calendar branch spread the authored
533
+ block raw, so removing the renderer's ladder turned a document that DREW into
534
+ one that shows "Calendar configuration required" and nothing else. Measured end
535
+ to end before the fix was written. It now strips the two spellings like its
536
+ sibling, and the `ObjectViewSchema` check is what makes an authored alias loud
537
+ there instead of mute.
538
+
539
+ ⚠️ **`ObjectViewSchema.listViews` stays UNMIRRORED, and this entry does not
540
+ change that.** That key waits on a maintainer decision about its VALUE TYPE —
541
+ neither the spec's strict `ObjectListViewSchema` nor the local `NamedListView`
542
+ can be the declared value without losing documented behaviour or enforcing 43
543
+ unread members. A `.check()` decides none of it: it declares no value type, puts
544
+ no key in the object's `shape`, requires no `columns`, and refuses neither an
545
+ undeclared key nor the legacy `options` bag. It judges exactly the two spellings
546
+ this entry retires, at the two nestings the producer merges — with pins on each
547
+ of those non-effects.
548
+
549
+ ⚠️ **Dated note, 2026-09-28 — `listViews` has since been mirrored — objectui#7928.** Later
550
+ in this same release the maintainer's ruling A chose the value type this paragraph waits
551
+ on: `ObjectViewSchema.listViews` is now `@objectstack/spec`'s own
552
+ `ViewSchema.shape.listViews`, a record of the strict `ObjectListViewSchema`, by reference
553
+ on both faces. It is in the object's `shape`, a named view needs `columns`, and the
554
+ record refuses an undeclared key and the legacy `options` bag whole. The named-view check
555
+ described here and in the `@object-ui/types` bullet above now reads the protocol's own
556
+ refusal at `listViews.KEY.calendar` and adds the pointer at the key; it no longer walks
557
+ the `options.calendar` nesting, so "a named view's two nestings" and "at the two nestings
558
+ the producer merges" now hold for the `calendar` block only.
559
+ `.changeset/7928-listviews-by-reference-fold.md` (PR objectui#10821) states what ships;
560
+ the text above is kept as the reading of this change.
561
+
562
+ ⛔ **Not a producer-side fold.** Normalising `dateField` to `startDateField` in
563
+ `ListView` (option A) was put to the director seat and refused as the end state:
564
+ it keeps a second spelling alive at the producer, which is the lenient alias
565
+ AGENTS.md #0.1 names. The aliased view therefore produces **no** date binding,
566
+ and the author is told why at the door instead.
567
+
568
+ ⚠️ **Upstream's refusal suggests the wrong canonical key for `dateField`, and it
569
+ is a typo-distance suggester rather than a declaration.** Re-derived by running
570
+ the installed pin (`@objectstack/spec` 17.4.0), with controls in the same pass:
571
+ `CalendarConfigSchema`'s `strictObject` options carry `surface` and `history` and
572
+ no `aliases` entry, so the protocol declares nothing about either spelling. The
573
+ "Did you mean `dateField` → `endDateField`?" an author meets is a fallback
574
+ `findClosestMatches` Levenshtein suggestion budgeted `max(2, floor(len/3))`:
575
+ `endDateField` is 3 edits from `dateField` and inside its budget of 3, while
576
+ `startDateField` is 5 and outside it — and `endField`, budgeted 2, reaches
577
+ nothing, which is why it and a nonsense control key both draw no suggestion at
578
+ all. A one-character typo of the canonical key does resolve to `startDateField`,
579
+ so the suggester is working as designed; it simply has no opinion to offer about
580
+ a legacy alias.
581
+
582
+ ⇒ **nothing upstream says `dateField` means the end of an event.** The hazard is
583
+ author-facing rather than contractual: someone who copies that suggestion writes
584
+ `endDateField` and binds the END of an event to the date they meant as the START,
585
+ which every layer accepts. Every objectui read site folds this spelling onto the
586
+ **start** — the retired ladder did, `normalizeListViewSchema`'s `timeline` fold
587
+ does, `resolveTimelineDateBinding` documents it as "the pre-#2231 alias for
588
+ `startDateField`", and this package has published "Deprecated alias for
589
+ startDateField" for releases. So these arms name `startDateField` and a control
590
+ pin holds that line. The remedy upstream needs is an explicit `aliases` (or
591
+ `guidance`) entry for the two spellings so the suggester never answers for them;
592
+ that is upstream's formatter, on upstream's card, and is not fixed here.
593
+
594
+ ⛔ **The timeline alias is NOT retired by this change.** `timeline.dateField`
595
+ stays a live, accepted alias with live consumers (`normalizeListViewSchema` folds
596
+ it onto `startDateField`, `ObjectView` reads it, and app-shell pins that it still
597
+ renders). The card's own boundaries put the map / gantt / timeline / kanban
598
+ ladders on their own cards; a pin in `@object-ui/types` asserts the timeline
599
+ spelling still parses green, so a later sweep has to say so rather than carrying
600
+ it in silently.
601
+
602
+ **Pinned** by `calendar-date-alias-refusal-8355.test.ts` (`@object-ui/types`, all
603
+ five surfaces, the per-surface consequence split, the compile-time face, and the
604
+ structural guard that `listViews` stays out of the object's `shape`),
605
+ `ListView.calendarAliasRefused-8355.test.tsx` (`@object-ui/plugin-list`) and
606
+ `ObjectView.calendarAliasRefused-8355.test.tsx` (`@object-ui/plugin-view`) — both
607
+ reading the node their producer really emits through a spy registration, which is
608
+ the only census that can see a key arriving through a spread — and the inverted
609
+ ledger rows in `calendarUnionReads-8651.test.tsx` (`@object-ui/plugin-calendar`).
610
+
611
+ ⚠️ **Dated note, 2026-09-28 — a named view now refuses `timeline.dateField`, and the
612
+ shape guard is inverted — objectui#7928.** Later in this same release the protocol's
613
+ strict named-view record refuses `timeline.dateField` on a named view as an unrecognized
614
+ key; the `list-view` route still accepts it, and that route is the one the timeline pin
615
+ reads. The structural guard in `calendar-date-alias-refusal-8355.test.ts` now asserts
616
+ the opposite of "`listViews` stays out of the object's shape": `listViews` is a member
617
+ of `ObjectViewSchema.shape`. `.changeset/7928-listviews-by-reference-fold.md` (PR
618
+ objectui#10821) states what ships; the text above is kept as the reading of this change.
619
+ - d79f525: `navigation` is declared on the `object-kanban` and `object-calendar` blocks, by reference to `@objectstack/spec` (objectui#8652). This is the objectui half of the maintainer ruling on that card: the spec declares the key on both element entries from 17.5.0, and objectui now mirrors it.
620
+
621
+ - `@object-ui/types`: `ObjectKanbanSchema.navigation` and `ObjectCalendarSchema.navigation` are declared on both published faces with the spec's `NavigationConfig` type — the same type the grid, view, gantt and map schemas use. Until now the key was admitted and never examined: `navigation: { mode: 'not-a-mode' }` passed both faces while the spec refused it. It is now refused at `navigation.mode`, and a member the spec does not declare inside the block is refused too. A parse adds no default to the block, so a board or calendar without the key still opens a record in a drawer.
622
+ - `@object-ui/plugin-kanban`: the `object-kanban` registration publishes `navigation` in its `inputs`, so the designer offers it.
623
+ - `@object-ui/plugin-calendar`: the `object-calendar` and `calendar` registrations publish `navigation` in their `inputs`, and `ObjectCalendar` reads the key without a cast.
624
+
625
+ What a click does with each member is unchanged. `page`, and a block written without `mode` (which resolves to `page`), open the record page through the record navigator the host publishes (objectui#11293); under a host that publishes none, such as an embedded renderer, they still open nothing. The published input descriptions say so.
626
+ - a984600: Honour `filter`, `sort` and the platform row ceiling on a calendar's and a map's
627
+ inline (`provider: 'value'`) data (objectui#9061) — the port of objectui#8769's
628
+ repair off `ObjectGantt`.
629
+
630
+ **The defect was fail-open.** Both renderers' fetch effect short-circuited the
631
+ inline provider: it set the authored rows and returned BEFORE the adapter query,
632
+ which is the one site in each file that lowers `schema.filter` to `$filter`,
633
+ `schema.sort` to `$orderby` and the objectui#7210 ceiling to `$top`. So an
634
+ inline calendar or map that declared a `filter` drew **every** authored row, with
635
+ no diagnostic. The key that was dropped is the key that NARROWS, which is why
636
+ this matters: the view answered a wider question than the author asked. Nothing
637
+ was exposed that was not already in the authored schema — this is a correctness
638
+ defect, not a data-access one.
639
+
640
+ **What changed.** Each renderer resolves a `ValueDataSource` for the inline
641
+ provider and issues the same query the `object` arm issues. The `api` arm is
642
+ untouched, and no dependency array moves. `ValueDataSource` already implements
643
+ `$filter` / `$orderby` / `$skip` / `$top` / `$select` over its own array, so no
644
+ filter combinator was written for this change.
645
+
646
+ **Behaviour you may notice.**
647
+
648
+ - An authored `filter` / `sort` now narrows and orders inline rows. Every
649
+ spelling reaches it: `data: { provider: 'value', items }` and `staticData` on
650
+ both renderers, plus the map's bare-array `data` shorthand.
651
+ - The row ceiling now applies to inline rows: past 2,000 drawn rows the view
652
+ draws 2,000 and shows the footnote naming both numbers, as it already did for
653
+ fetched rows. It is applied to the **filtered** set, so a large inline array
654
+ that a `filter` cuts below the ceiling draws every matching row and stays
655
+ quiet. Rows a host passes down through the `data` React prop are still never
656
+ capped — those are not ours to cap.
657
+ - Inline rows now reach the view as the adapter's own deep copy rather than as
658
+ the authored array's object identities. Code comparing a row handed to
659
+ `onEventClick` / `onMarkerClick` against the authored array with `===` needs
660
+ `id` equality instead.
661
+ - That copy is a JSON round-trip, so inline rows must be JSON-serializable.
662
+ A record graph carrying a back-reference, or a `BigInt` id, now renders an
663
+ error panel instead of the view. `ObjectGantt` has refused the same input
664
+ since before objectui#8769; `ObjectMap` did not, and pinned that it need not
665
+ (objectui#6018). ⚠️ That pin is left RED and untouched in this change — see
666
+ the pull request body.
667
+ - 7098eed: One record-overlay shell: all five list-type renderers honour all four overlay
668
+ `navigation.mode` values (objectui#9299, director seat decision batch #128 item
669
+ 1, 2026-09-13).
670
+
671
+ `ObjectGantt`, `ObjectKanban` and `ObjectCalendar` rendered one drawer for every
672
+ authored mode — `modal`, `split` and `popover` silently WERE the drawer, with no
673
+ diagnostic. `RecordDetailDrawer`'s payload is extracted into the new
674
+ `RecordDetailPanel` (shell-free by construction) and mounted through the shared
675
+ `NavigationOverlay`, which is what `ObjectGrid` and `ObjectTree` already used.
676
+
677
+ User-visible on published surfaces:
678
+
679
+ - **`modal` / `split` / `popover` now do what they say** on the gantt, the
680
+ kanban and the calendar.
681
+ - **`split` renders.** Each renderer passes its own view as `mainContent`, so
682
+ the board / calendar / chart / tree / grid sits beside the record panel.
683
+ Authored `split` used to render NOTHING on `ObjectTree` — and, measured while
684
+ fixing this, on `ObjectGrid` too.
685
+ - **`popover` is anchored to the element the user clicked** — row, node, bar,
686
+ card, event — instead of degrading to a centred dialog. It was honoured on no
687
+ surface before.
688
+ - **Drawer chrome converges** on the shared shell's header (breadcrumb title,
689
+ close, optional expand) for the three renderers that brought their own.
690
+ - **Drawer widths carry over, they are not reset.** The two drag-resize
691
+ implementations become one: a width persisted under the retired
692
+ `objectui.drawerWidth.OBJECT` is read once, written forward to
693
+ `ov:drawer-width:OBJECT` and removed. One key per object across every view
694
+ type. The default width is unchanged at every viewport (objectui#6584); an
695
+ authored width below `min(60vw, 880px)` now widens to it, which is the shell's
696
+ long-standing policy on grid and tree.
697
+ - **Richer record body on grid and tree** — typed widgets, declared labels,
698
+ honoured `hidden` — wherever the object declares its fields. With nothing
699
+ declared those two renderers keep their own value-inference reading, which is
700
+ what preserves the locale-aware date fallback (objectui#4541), the localized
701
+ empty placeholder (objectui#8491) and the `format` hint (objectui#8920); the
702
+ overlay shell is the shared one on that path too.
703
+
704
+ New published API: `RecordDetailPanel`, `buildRecordDetailFields`,
705
+ `RECORD_OVERLAY_DEFAULT_WIDTH` (`@object-ui/plugin-detail`);
706
+ `useOverlayAnchor`, `recordOverlayWidthStorageKey`,
707
+ `legacyRecordDrawerWidthKey` and the `popoverAnchorRef` / `legacyStorageKey`
708
+ props on `NavigationOverlay` (`@object-ui/components`). `RecordDetailDrawer`
709
+ keeps its props and is now a thin wrapper over the shared shell. ⛔ No spec
710
+ change.
711
+ - 502eb58: The row/card click props on the view components now declare the modifier
712
+ payload they have always been invoked with (objectui#9357).
713
+
714
+ `useNavigationOverlay`'s `handleClick` invokes the handler it is given with two
715
+ arguments — the record, and an optional modifier payload (`metaKey` / `ctrlKey`
716
+ / `button`) a host needs to implement Cmd/Ctrl/middle-click. objectui#9360 made
717
+ the hook's own option say so. These components pass a host-supplied prop
718
+ straight into that option, so the value a host writes against them is invoked
719
+ with two arguments too — and every one of these props declared only the record.
720
+ The payload was therefore invisible on the one line a host reads, exactly as it
721
+ had been on the hook.
722
+
723
+ Thirteen declarations across nine packages now name both parameters:
724
+
725
+ - `ObjectGridComponentProps.onRowClick`
726
+ - `ObjectKanbanComponentProps.onRowClick` (its sibling `onCardClick`, the other
727
+ arm of the same fallback, already declared both)
728
+ - `KanbanRendererProps.schema.onCardClick`
729
+ - `ObjectCalendar`, `ObjectGantt`, `ObjectMap`, `ObjectTree`: `onRowClick`
730
+ - `ObjectTimeline`: `onRowClick` and `onItemClick`, the two arms of one fallback
731
+ - `ListView.onRowClick`
732
+ - `ObjectGallery`: `onRowClick` and `onCardClick`, likewise two arms of one
733
+ - `RelatedList.onRowClick`
734
+
735
+ **Source-compatible, and with no refused class.** A one-parameter handler is
736
+ still assignable to the widened signature, and a handler written against the
737
+ widened signature was already assignable to the narrow one — its minimum
738
+ argument count is still one. The second parameter is spelled `any` rather than
739
+ `HandleClickModifiers`, which is the difference that matters for callers: the
740
+ hook's own option names that interface and therefore refuses a handler whose
741
+ second parameter is annotated narrower (objectui#9360 documents that class and
742
+ the one-line remedy). These faces refuse nothing. A host that discovered the
743
+ payload from the implementation and annotated it `React.MouseEvent` — which is
744
+ what actually arrives — keeps compiling. `any` is also the spelling
745
+ `ObjectKanbanSchema.onCardClick` already carries for this same payload
746
+ (objectui#9341) and the one `BaseSchema`'s own `onClick` / `onChange` /
747
+ `onSubmit` use, and it is forced on the published twins in `@object-ui/types`,
748
+ which may not name a type that lives in a package depending on them.
749
+
750
+ **Runtime behaviour is unchanged.** Nothing is newly called and nothing newly
751
+ passes an argument; only the declarations move.
752
+
753
+ Three declarations that share the name and the shape are deliberately NOT
754
+ widened, because the value flowing through them is not invoked with the
755
+ payload: `VirtualGrid.onRowClick`, whose second parameter is a row index;
756
+ `ManageViewsDialog.onRowClick`, which receives a view id; and the `data-table`
757
+ family (`DataTableSchema.onRowClick`, `ObjectDataTableSchema.onRowClick`),
758
+ whose renderer invokes with one argument. Widening those would have declared a
759
+ payload that never arrives.
760
+ - ab856ed: **`resolveRecordSourceConfig`'s `data` parameter now follows the arm it is already told, instead of contradicting it.**
761
+
762
+ The shared record-source ladder in `@object-ui/core` takes a REQUIRED `dataArm` argument precisely because blocks declare `data` differently — its own docblock says there is no repo-wide default, "because the answer differs per block and a default is how the second de-facto contract got in" (ruling objectui#8348, decision batch #83, 「8348 以协议为准」). Its parameter nevertheless declared a flat `data?: ViewData` — a discriminated union over four strict OBJECT arms, with no array member — while its rung-1 predicate `authoredDataIsOnTheDeclaredArm` takes `unknown` and admits an ARRAY on the `'array'` arm. The declaration contradicted the contract the same function documents and implements.
763
+
764
+ The `data` member is now `AuthoredRecordSourceData<Arm>`, a new exported conditional type keyed on the arm:
765
+
766
+ - `'view-data'` → `ViewData`. **Unchanged** — this is what the flat declaration said, and it was right for the three blocks on this arm (`object-grid`, `object-map`, `object-gantt`).
767
+ - `'array'` → `unknown[]`, the shape `ComponentPropsMap['object-calendar'].data` declares (`z.array(z.unknown()).optional()`, "Pre-fetched records").
768
+ - `'undeclared'` → `unknown`, since no published face declares a `data` row for such a block and rung 1 keeps its pre-8348 verbatim behaviour there.
769
+
770
+ ⚠️ **Type-level only — no runtime accept set moves.** Nothing in the ladder's body changed: `authoredDataIsOnTheDeclaredArm` still takes `unknown` and still decides rung 1 on the value's KIND, so every resolved config — including the off-arm ones that fall through to `staticData` and then `objectName` — is what it was. The emitted JavaScript of both packages is unchanged by this card.
771
+
772
+ ⚠️ **One compile-time refusal is new**, and it is the half that keeps this from being a mere widening: a caller that declares a `ViewData` provider block under `data` while passing `'array'` no longer type-checks. That document was already refused at runtime by objectui#8348, and by `os validate` and the save gate before that; only the signature still accepted it. A caller that holds the arm as a `RecordSourceDataArm` variable rather than a literal is unaffected — the conditional type distributes to `unknown` there, which a set of literal-armed overloads would not have done.
773
+
774
+ `@object-ui/plugin-calendar` loses the cast that stood in for the missing declaration: `ObjectCalendar`'s ladder call passed `data: schema.data as ViewData | undefined`, in a comment reporting an upstream defect in `@object-ui/core`. The three members are still passed one by one — they are what the ladder documents itself as reading — but the member is now `data: schema.data`, and `packages/plugin-calendar` type-checks green without the assertion.
775
+
776
+ Two stale docblock passages in `record-source.ts` and `record-source-config.behaviourNeutrality-7632.test.ts` explained `ObjectCalendar`'s retired `'data' in schema` guard by the props union `ObjectGridSchema | CalendarSchema`, which objectui#8651 retired — `ObjectCalendarComponentProps.schema` is the published `ObjectCalendarSchema` today. Both now say that the clause is history rather than a reading anyone can re-derive from `main`.
777
+ - 51e144e: fix(plugin-calendar): type `ObjectCalendar` at the published `object-calendar` schema, and declare the `calendar` container
778
+
779
+ `ObjectCalendarComponentProps.schema` was the union `ObjectGridSchema | CalendarSchema` — a grid's schema, plus a plugin-local interface absent from this package's barrel. Neither arm is the schema of the element this renderer is registered as. Measured with the TypeScript checker: of the fifteen keys the renderer reads off the node, seven were undeclared on that union and had to be read through a cast, while five more resolved only through `ObjectGridSchema`'s index signature and were therefore typed `any` — admitted, never examined. `ObjectCalendarSchema` already declared eleven of the fifteen.
780
+
781
+ - `ObjectCalendarComponentProps.schema` is now `ObjectCalendarSchema`. **Breaking for a React host that passed an `object-grid` node or a `type: 'calendar'` literal to `ObjectCalendar`** — neither was ever a node this renderer is registered for. `ObjectCalendarProps`, the deprecated alias, follows it.
782
+ - `ObjectCalendarSchema.calendar` is declared on both published faces. The spec declares the KEY; it does **not** declare its shape — `ComponentPropsMap['object-calendar'].calendar` is `z.unknown().optional()` and accepts anything at that position — so the member list is objectui's own: the four `CalendarConfigSchema` names plus objectui's `allDayField`, which is what the renderer reads out of the block. The container keeps `.passthrough()`, so no KEY that parsed before is refused — an unexamined key inside the block still parses, and so do `calendar.dateField` and `calendar.defaultView`. What is new is VALUE validation: `calendar: 42` and `calendar: { startDateField: 42 }` are refused where both were admitted unexamined.
783
+ - `@object-ui/types` now exports the type `ObjectCalendarBlockConfig`, so that published member has a name an importer can write.
784
+ - ⚠️ The `dateField` / `endField` alias rungs in `getCalendarConfig` are **kept**, and routed to the producer. An earlier revision of this change retired them on a census that was false: `ListView` flattens an authored `calendar` block onto the node it emits, and `resolveTimelineDateBinding` in that same file documents `dateField` as the pre-#2231 alias for `startDateField` and honours it — so a view authored that way renders today and would have drawn "Calendar configuration required". (objectui's own `ListViewSchema` also accepts `calendar.dateField`, but only weakly: that block is `.passthrough()` and admits nonsense too, so the load-bearing half is the producer and the read site, not the accept.) No behaviour changes for either spelling. The alias question already has a carrier — objectui#8355, open and undecided — and the producer-side remedy belongs in `ListView`'s calendar branch.
785
+
786
+ **Correction, 2026-10-01 (objectui#8831).** Two statements in this entry are false against the tree this release ships, for two different reasons.
787
+
788
+ - "the four `CalendarConfigSchema` names plus objectui's `allDayField`": `@objectstack/spec` 17.5.0, which this same release installs, declares all five on `CalendarConfigSchema`, so the container's members are the spec's five. objectui#11073's bump made this false, not this entry and not objectui#8831. What the same bullet says about the spec at this position still holds on 17.5.0: `ComponentPropsMap['object-calendar'].calendar` declares the key but not its shape, and accepts `calendar: 42`.
789
+ - "and so do `calendar.dateField`", and the ⚠️ bullet's "The `dateField` / `endField` alias rungs in `getCalendarConfig` are **kept**": objectui#8355 retired both rungs in this same release. `getCalendarConfig` no longer reads either spelling, and the container refuses `calendar.dateField` and `calendar.endField` by name (see objectui#8355's own entry). objectui#8355 made these false, not objectui#11073 and not objectui#8831. An unexamined key and `calendar.defaultView` still parse inside the block, and the value validation this entry adds (`calendar: 42` and `calendar: { startDateField: 42 }` are refused) still holds.
790
+
791
+ ### Patch Changes
792
+
793
+ - afb2284: `ObjectCalendar`'s user-visible copy now reaches the locale packs. The component
794
+ was already i18n-aware — it imports and calls both translation hooks — and a set
795
+ of English sentences sat beside those calls as literals, so a non-English session
796
+ read a half-translated calendar: the unscheduled label and the two write-failure
797
+ toasts in its own language, and the loading screen, the error screen, the refusal
798
+ screen, the pull-to-refresh affordance, the whole quick-create dialog and the
799
+ record overlay's fallback title in English (objectui#10031).
800
+
801
+ Every one of those now reads a key. Two of them reuse keys the packs already
802
+ carried (`common.cancel`, `common.create`), one reuses `calendar.newEvent`, and
803
+ twelve are new under `calendar.`.
804
+
805
+ **The hook is chosen per site by one criterion, which the file already stated for
806
+ its existing call:** `useSafeTranslate`'s `tt(key, fallback)` passes no options to
807
+ i18next and therefore cannot fill a hole, so the two sentences that carry one —
808
+ the error prefix and the quick-create date line — read their key through
809
+ `useObjectTranslation`'s `t()` with an inline default, and every hole-free string
810
+ uses `tt()`.
811
+
812
+ **⚠️ A key added to `en` is not an `en`-only change in this repo**, and that is
813
+ worth stating because the cheap route looks available: the English fallback does
814
+ carry the English text at the call site, but the key-set invariant is a
815
+ pack-vs-pack one — every pack defines every `en` key — so it is answered by the
816
+ locale packs, not by the call site. All ten packs therefore carry the twelve new
817
+ keys, with real translations rather than the English value. The instrument that
818
+ says so is `all-locales-key-parity.test.ts`; `pnpm check:i18n-drift` prints which
819
+ of the two owns an addition.
820
+
821
+ **One rendered English string moved**: the loading placeholder's three ASCII full
822
+ stops became the typographic ellipsis, because its sentence is now a pack value
823
+ and `ellipsis-glyph-3878.test.ts` holds every pack value to U+2026. The refusal
824
+ screen's copy is byte-identical to what it rendered before, which is what keeps
825
+ the five suites that pin it green.
826
+ - 875ee61: fix(plugin-calendar, plugin-map, plugin-gantt): the registrations' `inputs` agree with the record-source rule
827
+
828
+ All three blocks read their records from one of `data`, `staticData` and
829
+ `objectName` (in that order), and their `@object-ui/types` zod schemas enforce
830
+ "one of the three" through `requireRecordSource`. The designer-facing `inputs`
831
+ on the registrations disagreed with that rule in two ways:
832
+
833
+ - `object-calendar` and `calendar` still declared `objectName` as required, so
834
+ the html tier's validator reported a `missing-required-prop` error on a
835
+ calendar authored on `staticData` or `data`, which the schema accepts and the
836
+ renderer draws. `objectName` is now declared without `required`, and its
837
+ description states the rule, as objectui#7470 did for map and gantt
838
+ (objectui#10392).
839
+ - `object-map`, `map` and `object-gantt` did not declare `data` or
840
+ `staticData`, so the validator reported a block authored on either as an
841
+ unknown prop. At this change both were declared on all three, on the schema's
842
+ own arms: `data` is a `{ provider, … }` data-source configuration (an object,
843
+ so a bare array there draws a type diagnostic, matching the schema), and
844
+ `staticData` is an array of records. Each description says what the renderer
845
+ does with the key, including that the map does not implement the `api`
846
+ provider (objectui#10394).
847
+
848
+ ⚠️ **Dated note, 2026-09-25 — the bare `map` registration has since been
849
+ retired — objectui#10393.** Later in this same release `@object-ui/plugin-map`
850
+ stopped registering the bare `map` key (and its namespaced twin `view:map`),
851
+ so `map` declares nothing: a node authored `"type": "map"` resolves no
852
+ renderer, and the html tier reports it as `unknown-component`. The
853
+ `object-map` and `object-gantt` registrations keep both inputs exactly as
854
+ described above. The rest of this entry is kept as the reading of this
855
+ change; the objectui#10393 entry states what ships.
856
+
857
+ The renderers' read order and the zod schemas are unchanged. The
858
+ `@object-ui/plugin-gantt` README sentence that listed the registration's inputs
859
+ is updated.
860
+
861
+ **Correction, 2026-10-01 (objectui#11117).** "One of the three" now has an exception on all
862
+ three blocks: a block that declares none of them is accepted when its `dataSource.object` names
863
+ the object, because the registration's `ElementDataSourceGate` lands that name on `objectName`.
864
+ The `objectName` input description now says so.
865
+ - e5f4343: Four more date faces now follow the display locale, not the UI language (objectui#10442).
866
+
867
+ Each one takes its locale from `useDisplayLocale()` instead of the UI language. With an English UI and
868
+ a `de-CH` display locale, a date that used to read `3/4/2020` now reads `4.3.2020`. With no display
869
+ locale declared, the display locale falls back to the UI language, so these dates render as before.
870
+
871
+ - `data-table` (`@object-ui/components`): the ISO date and datetime cells.
872
+ - The record page's History tab (`@object-ui/app-shell`): the `date` and `datetime` values in each
873
+ field diff.
874
+ - `ResourceWorkload` (`@object-ui/plugin-gantt`): the column labels and the cell tooltips. With no
875
+ language at all it used to fall through to the machine's locale; it now gets the display locale's
876
+ own last resort.
877
+ - `CalendarView` (`@object-ui/plugin-calendar`): the default locale for the header, the weekday
878
+ columns and the day cells. An explicit `locale` prop still wins over the display locale.
879
+ - 4a3d500: `object-calendar` re-reads its events when the data-invalidation bus (`notifyDataChanged` from `@object-ui/react`) reports a change to the object it queries (objectui#10572). A write that bypasses the data source — a page action over raw HTTP, a flow, a server action — fires no `onMutation`, so a calendar on a page used to show it only when the whole page was remounted. Inline and external events are still the host's to refresh.
880
+ - d435e96: fix(plugin-calendar): a failed load no longer keeps `ObjectCalendar` on its error screen after a later load succeeds (objectui#10663)
881
+
882
+ `ObjectCalendar` set `error` when its fetch failed, and the render returns the
883
+ error screen early whenever `error` is set. Nothing ever cleared it. Every later
884
+ load that succeeded still wrote its events, but the calendar stayed on the error
885
+ screen until it remounted. Since objectui#10572 the calendar re-reads on every
886
+ data-invalidation event, so one failed background re-read was enough.
887
+
888
+ The current run of the fetch now clears the error when it commits rows, on each
889
+ of its commit branches: those rows answer the current query, so the earlier
890
+ failure no longer describes the screen. This is the rule objectui#10578 set for
891
+ `ObjectGantt`. The clear sits inside the run's existing `isMounted` guard, so a
892
+ superseded run cannot clear the current run's error. The error is not cleared
893
+ when a run starts; it stays until rows land.
894
+
895
+ Rows a parent hands over through `data` clear it too, beside the row-ceiling
896
+ reset that already sits there for the same reason: those rows are not the query
897
+ that failed.
898
+
899
+ A failed background re-read is still reported: the calendar has no silent mode,
900
+ so it shows the error screen rather than keeping the last good events, and the
901
+ next re-read that succeeds takes the screen back.
902
+ - 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:
903
+
904
+ - `object-calendar`, `object-map` and `object-tree`, on both the object query and the inline (`provider: 'value'`) query;
905
+ - `object-gantt`, `object-kanban` and `object-timeline`;
906
+ - `record:related_list` and `record:line_items`, where the node's own filter is combined with the parent-record condition;
907
+ - the `element:repeater`, `element:number` (both the `aggregate` filter and the `find` fallback) and `element:record_picker` page elements.
908
+
909
+ `list-view`, `object-grid` and `object-gallery` already did this, and are unchanged.
910
+
911
+ **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.
912
+
913
+ What changes for an app:
914
+
915
+ - A filter with no placeholders reaches the query as before, unchanged.
916
+ - 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.
917
+ - 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.
918
+
919
+ `@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.
920
+ - 1659f14: The calendar's quick-create dialog now formats its date with the same locale as the month grid (objectui#10668).
921
+
922
+ `ObjectCalendar`'s quick-create dialog used its `locale` prop as is. When no host passed one, that was
923
+ `undefined`, so the dialog's date and time followed the machine's locale while the grid beside it
924
+ followed the display locale. The dialog now uses the grid's rule: an explicit `locale` prop still wins,
925
+ and otherwise the dialog reads `useDisplayLocale()`. With an English UI and a `de-CH` display locale,
926
+ clicking 18 March now opens a dialog reading `On 18. März 2020`.
927
+ - 13220af: fix(plugin-calendar): `CalendarView`'s header date popover reads the same locale as its grids (objectui#10747)
928
+
929
+ `CalendarView` formats its header and its month, week and day grids with one
930
+ locale: an explicit `locale` (an `object-calendar` node's authored `locale`
931
+ arrives this way), else the display locale. The header's date popover mounted
932
+ `Calendar` with no locale, so it read the display locale even when the grids
933
+ read another one. Under an `en-US` display locale with `locale: 'de-CH'`, the
934
+ header read `März 2020` and the popover under it read `March 2020` over
935
+ `Su Mo Tu …`.
936
+
937
+ The popover now passes its grids' locale to `Calendar` as `localeTag`, so both
938
+ faces read `März 2020`, and the popover's week starts on Monday. With no
939
+ `locale`, both read the display locale, as before. This package takes no
940
+ date-fns dependency: the tag is resolved inside `@object-ui/components`.
941
+ - c5ec15c: fix: every `Calendar` picker opens on its selected date's month, not today's (objectui#10799)
942
+
943
+ react-day-picker opens on `month`, else `defaultMonth`, else today, and
944
+ `selected` does not move it. Five `Calendar` mounts passed `selected` only, so
945
+ a value outside the current month opened the picker on today's month: with
946
+ the calendar on 4 March 2020 and today in September 2026, the header of
947
+ `CalendarView` read `March 2020` while the popover under it opened on
948
+ `September 2026`, with no selected day in view.
949
+
950
+ Each mount now passes its first selected day as `defaultMonth`:
951
+
952
+ - `CalendarView`'s header date popover (`@object-ui/plugin-calendar`) opens on
953
+ the date the header names, and follows Previous / Next between opens;
954
+ - `ui:calendar` opens on its day in `single` mode, on the first valid listed
955
+ day in `multiple` mode (an entry that is not a date is skipped) and on `from`
956
+ in `range` mode. It reads that month once, when it mounts: a value that
957
+ changes afterwards does not move the month it shows;
958
+ - the form date picker (`date-picker`) and `DatePicker` open on their value;
959
+ - the dashboard date filter's custom-range calendar
960
+ (`@object-ui/plugin-dashboard`) opens on the range's `from`.
961
+
962
+ With no value, each still opens on today. react-day-picker throws on an
963
+ invalid `defaultMonth`, so a day that names no instant is not passed as one: an
964
+ unparseable `ui:calendar` day, a range `from` that does not parse, and an
965
+ invalid `Date` a host hands `CalendarView` each open on today, as before. The
966
+ two date pickers are unchanged in this respect: an invalid value already fails
967
+ in their trigger's label, before any calendar mounts. The `Calendar` primitive
968
+ itself is unchanged.
969
+ - 6650259: fix(plugin-calendar): a day event moved across a DST change writes the days it was dropped on (objectui#10866, slice 4)
970
+
971
+ - **plugin-calendar.** At this change the month grid moved each date of an event by the milliseconds between two local midnights, the grabbed cell's and the drop cell's, and a date-only value is read at local midnight of its day. So when a DST change lay between one of an event's dates and where it landed, but not between the two cells (or the other way round), that date came back an hour off local midnight; at 23:00 of the day before, the write took the day before. Under `America/Los_Angeles` a span of `date` fields moved across November 1st or March 8th could be written a day short at its start or its end. A move of an event whose start, and end when it has one, are both stored calendar days now writes each `date` field as its stored day moved by the whole days the grid moved it. Every other write is unchanged: a `datetime` field still writes the instant the grid hands back, and at this change the grid's own arithmetic does not change.
972
+
973
+ ⚠️ **Dated note, 2026-09-29 — the month grid now moves by calendar days — objectui#11005.** Later in this same release the month grid moves a value by the calendar days between the grabbed cell and the drop cell and keeps its time of day, for a move and for a drag of a span's end, so a 10:00 `datetime` stays at 10:00 across a DST change. A `date` value read at local midnight of its day then comes back at local midnight of the day it was dropped on, so the repair described above is removed and a moved `date` field is written as that local day, which is the same day the repair wrote. The rest of this entry is kept as the reading of this change; the objectui#11005 entry states what ships.
974
+ - **plugin-gantt, types.** The business `timeZone` prose (`GanttConfig.timeZone`, `GanttViewProps.timeZone` and `makeTzShift`) said persisted data stays real instants. A `date` field under a zoned chart has been written as a calendar day since this card's first slice; at this change the prose says so, and says that near a DST change of the chart's zone or the viewer's the shim can place a day's midnight an hour early, onto the day before. Documentation only.
975
+
976
+ ⚠️ **Dated note, 2026-09-29 — a zoned chart reads and writes a day exactly on a DST change — objectui#10866, slice 5.** Later in this same release `ObjectGantt` inverts the shim exactly for a date-only day, so a stored day is drawn from its own midnight and a drop writes the day it was dropped on, on a DST change of the chart's zone or the viewer's too. The `GanttConfig.timeZone` and `GanttViewProps.timeZone` prose no longer says a day can land on the day before, and `makeTzShift`'s says a day does not take the shim's round trip. The rest of this entry is kept as the reading of this change; the slice-5 entry states what ships.
977
+ - **core.** The `DATEADD` / `DATEDIFF` / `DATEFORMAT` docblock names how a mixed `DATEDIFF`, one day and one instant, reads each argument when it counts months or years. Comment only.
978
+ - 4f8b7f8: fix(plugin-calendar,plugin-gantt): a stored date-only day shows on that day in every viewer zone, and a `date` field is written back as a calendar day (objectui#10866, slice 1)
979
+
980
+ The calendar and the gantt read a record's `YYYY-MM-DD` value with the engine's own `Date` parse, which reads it as UTC midnight. West of UTC a task due on the 5th therefore showed on the 4th, in both views. Moving it then wrote `toISOString()` into the field: a UTC instant stored in a `Field.date`.
981
+
982
+ - **Reads.** Every date-only read in the two plugins now goes through `toDisplayDate` from `@object-ui/core`, which reads the value at local midnight of the day it names. In the calendar these are the object calendar's event start and end, and the `calendar-view` node's events and its authored `currentDate`. In the gantt they are the task start, end and baselines, a marker authored as a day, and the day typed into the inline editor. A value with a time keeps its instant.
983
+ - **Writes.** A calendar drop, a calendar quick-create and a gantt drag now write a field declared `date` as the local calendar day, `yyyy-MM-dd`. A `datetime` field keeps its instant. When no object schema is available to say which type a field is, the stored value's own shape decides, which is the same split the read makes; a calendar quick-create has no stored value, so there it still writes the instant.
984
+ - **Gantt `timeZone`.** A chart with a business `timeZone` re-bases every instant into that zone. A date-only day is not re-based: its bar and its marker stand on that day of the chart's calendar for every viewer, and a drop writes the day of the chart's calendar that the bar was dropped on.
985
+ - **Gantt working calendar.** `skipWeekends` / `holidays` now count the chart's own calendar days (local midnight, the same keys the day columns already folded by) rather than UTC days. The UTC floor put a rescheduled successor on the previous day in every zone except UTC once date-only values read as local days. `@object-ui/types` updates the `holidays` description to match.
986
+
987
+ The timeline, charts, formula date functions and i18n helpers are later slices of objectui#10866.
988
+ - f9b6dfe: fix(plugin-calendar): a month-grid move keeps the wall-clock time across a DST change (objectui#11005)
989
+
990
+ The month grid moved an event by the milliseconds between the grabbed cell's local midnight and the drop cell's. Across a DST change that span is 23 or 25 hours. Under `America/Los_Angeles`, a 10:00 event moved onto or off November 1st or March 8th landed at 09:00 or 11:00. A span starting at local midnight, grabbed on a later day and moved, started at 23:00 of the day before the one it was dropped on. The calendar's own month-view quick-create writes such local-midnight instants.
991
+
992
+ - **Move.** The grid now counts the calendar days between the grabbed cell and the drop cell and moves the start and the end by that many days on the local calendar. Each keeps its hours, minutes, seconds and milliseconds, so a 10:00 event stays at 10:00 on the day it is dropped on, whatever DST change lies between. This deliberately changes the instant a drag writes into a `datetime` field; what a `datetime` field stores and how it is read are unchanged. In a zone without DST every day is 24 hours, so a move writes what it wrote before.
993
+ - **Drag of a span's end.** The right-edge handle moves the end by calendar days the same way. It already kept the end's hours, minutes and seconds; it now keeps its milliseconds too.
994
+ - **`date` fields.** A `date` value is read at local midnight of its day, so it now comes back at local midnight of the day it was dropped on, and `ObjectCalendar` writes that local day. The `ObjectCalendar` repair from objectui#10866, which moved a day event's stored day by the whole days the grid moved it, is removed: every day move it pinned writes the same day without it.
995
+ - The week and day views are unchanged. Their time grid places a moved event at its snapped time on the drop day's own clock, not by a day delta.
996
+ - 2a1779f: fix(plugin-calendar): a week or day view move keeps the event's own length and grab point (objectui#11037)
997
+
998
+ The week and day views draw an event that crosses midnight as one piece per day, clipped at midnight, and a short event as a piece at least 15 minutes tall. A move took its length and its grab offset from the grabbed piece. So a 22:00 to 02:00 event dragged by its first piece to 10:00 was handed to `onEventDrop` as 10:00 to 12:00, and `ObjectCalendar`'s default drop handler writes what it is handed. Grabbed by its second piece, the event's start went where its midnight had been grabbed. A 5-minute event came back 15 minutes long.
999
+
1000
+ - **Length.** A move now keeps the event's own `end - start`, as elapsed time, so a `datetime` event keeps its real length. On the night a DST change falls in, the wall clock shows that length an hour longer or shorter: a 4-hour event placed at 22:00 on the night the clocks fall back reads 22:00 to 01:00.
1001
+ - **Grab point.** The grabbed point's offset is measured from the event's own start, so the point under the pointer stays under the pointer. A 22:00 to 02:00 event grabbed at its own 00:00 and dropped at 10:00 is written 08:00 to 12:00.
1002
+ - **Crossing midnight.** An event that crosses midnight is placed where it is dropped, so it can stay overnight; before, it was held to end by midnight of the drop day. An event drawn wholly inside one day is still held inside the drop day, as before.
1003
+ - The drag preview is labelled with the whole event's times and drawn over the part of it that falls on the drop day.
1004
+ - An event with no end is still handed an end one hour after its new start. All-day and date-only events sit in the all-day row, which has no drag, so nothing about them changes. The month grid and the resize handles are unchanged.
1005
+ - 3e71a98: fix(plugin-calendar): a week or day resize of an overnight event keeps its other edge (objectui#11060)
1006
+
1007
+ The week and day views draw an event that crosses midnight as one piece per
1008
+ day, clipped at midnight, and a short event as a piece at least 15 minutes
1009
+ tall. The top resize handle sits on the event's first piece and the bottom
1010
+ handle on its last. A resize rebuilt both edges on the grabbed piece's day,
1011
+ the untouched one from that piece's clipped bound. So a 22:00 to 02:00 event
1012
+ resized by its top handle to 21:00 was written 21:00 to 00:00, losing the two
1013
+ hours past midnight, and resized by its bottom handle to 03:00 was written
1014
+ 00:00 to 03:00, its start moved to midnight. A press and release on the top
1015
+ handle without moving cut the end to midnight too, and a 5-minute event resized
1016
+ by its top handle came back ending 15 minutes after its old start.
1017
+
1018
+ The top handle now changes only the start and the bottom handle only the end.
1019
+ The other edge is the event's own instant, handed to `onEventDrop` unchanged.
1020
+ The dragged edge is placed as before, at the pointer's row on the grabbed
1021
+ piece's day, snapped, and held one slot away from the kept edge wherever that
1022
+ edge falls. The preview while dragging is labelled with the whole event's
1023
+ times. A same-day event resizes exactly as before.
1024
+ - 0e6e76b: fix(plugin-gantt, plugin-calendar): the `objectName` input description names the `dataSource.object` binding (objectui#11117)
1025
+
1026
+ The designer-facing `objectName` input on `object-gantt` and `object-calendar` (and
1027
+ `view:calendar`, which shares the calendar's list) said the block's schema refuses a block that
1028
+ declares none of `data`, `staticData` and `objectName`. Since objectui#11117 the schema also
1029
+ accepts a block whose `dataSource.object` names the object, because the registration's
1030
+ `ElementDataSourceGate` lands that name on `objectName` before the renderer reads the node. The
1031
+ sentence now says so. No input's name, type, `required` flag or shape changed. (`object-map`'s
1032
+ input already names the binding: objectui#10859 batch 5 rewrote it.)
1033
+
1034
+ The `plugin-gantt` and `plugin-kanban` READMEs carry the same correction.
1035
+ - 6cd5ae3: The `object-calendar` / `calendar` `navigation` input description said `openNewTab: true` "outranks the mode". That does not hold for `none`: `useNavigationOverlay` checks `mode === 'none'` before `openNewTab`, so `{ mode: 'none', openNewTab: true }` opens nothing. The description in `src/index.tsx` now says `openNewTab` outranks every mode except `none` (objectui#11168 slice 5, from objectui#8652).
1036
+
1037
+ `src/__tests__/calendarNavigationMembers-8652.test.tsx` pins both halves: `openNewTab` beside each overlay mode opens a new tab and no overlay, and beside `none` it opens nothing. Behaviour is unchanged.
1038
+ - 39f4309: Published typings from every `vite-plugin-dts` package now carry an explicit extension on
1039
+ every relative specifier, and a type error in the declaration build now fails the build
1040
+ instead of being printed and ignored (objectui#5439, objectui#5483).
1041
+
1042
+ **Consumers on `moduleResolution: nodenext` or `node16` may see NEW type errors, and that
1043
+ is the fix working.** These packages re-export mostly through NAMED re-exports —
1044
+ `export { useObjectChat } from './useObjectChat'`. TypeScript could not follow the
1045
+ extensionless hop, but it still DECLARED the name, so the symbol resolved to a silent
1046
+ `any`. Nothing errored; consumers simply got no types. With the extension emitted, the
1047
+ symbol carries its real type, and any call site that was relying on the `any` now type
1048
+ checks for the first time. This is the mode that produced the 21 residual `TS7006` on
1049
+ `@object-ui/app-shell` reported against objectui#5365 — a type hole that opened quietly,
1050
+ unlike objectui#5365's own `export * from './ui'` packages where the same defect surfaced
1051
+ immediately as `TS2305: has no exported member`.
1052
+
1053
+ 410 extensionless relative specifiers across 19 packages were emitted before this change;
1054
+ the count is now 0 in all 22 packages that build typings through `vite-plugin-dts`.
1055
+ `@object-ui/fields` was already clean — its sources write explicit `.js` specifiers — and
1056
+ is wired so it stays that way.
1057
+
1058
+ The second half changes no emitted output today: 22/22 packages built green unmodified, so
1059
+ making the declaration step's exit code honest turns nothing red. It changes what a FUTURE
1060
+ regression does — print and exit 0, versus fail the build.
1061
+ - 3e853c9: Let a producer-marked refusal reach the drag-write surfaces (objectui#5902).
1062
+
1063
+ The kanban card-move toast, the calendar drag-to-reschedule toast and the OCC
1064
+ conflict dialog each substituted a generic string for a refusal the producer had
1065
+ marked as user-facing (`userMessage`), so a user was told "Save failed" where the
1066
+ application author had written a sentence addressed to them. All three now read
1067
+ the marking through the shared `declaredUserMessage` reader, which covers both
1068
+ places the adapter boundary parks it — the typed member on
1069
+ `ConcurrentUpdateError` and the details bag on `DataApiValidationError`.
1070
+
1071
+ Nothing unmarked changes: the reader answers `null` for it, so every existing
1072
+ generic substitution — including the localized "not authorized" message that
1073
+ keeps raw server diagnostics away from end users — still governs unmarked
1074
+ refusals exactly as before.
1075
+
1076
+ The two toasts substitute; the conflict dialog augments. Its description also
1077
+ explains what the destructive "Overwrite" button does, which is affordance copy
1078
+ that surface owns rather than a refusal message, so the marking leads and that
1079
+ paragraph stays.
1080
+ - 7975f2d: A standalone `object-calendar` bound to an object now queries WITH its `$expand`, so
1081
+ lookup / master_detail / user / tree fields render the related record instead of a raw
1082
+ foreign-key id (objectui#6453).
1083
+
1084
+ `ObjectCalendar`'s fetch effect built its expand set from a ref assigned in the render body
1085
+ (`objectSchemaRef.current = objectSchema`) and left `objectSchema` out of its dependency
1086
+ list. That bought the effect exactly one run per mount and paid for it with the expansion,
1087
+ permanently: on that one run the ref was still `null`, `buildExpandFields` saw no fields,
1088
+ the query went out with no `$expand` at all, and nothing re-ran the effect when the schema
1089
+ landed. Only the standalone calendar reached this path — one hosted by `ObjectView` or
1090
+ `ListView` receives its rows as `data`, which objectui#6419 already covers.
1091
+
1092
+ The ref is replaced by a settled-and-keyed resolution (`{ key, def } | null`) that GATES the
1093
+ record query, the third member of the family after objectui#6271 (`ObjectKanban`) and
1094
+ objectui#6419 (`ObjectView`). Measured on this component rather than inherited: gated, the
1095
+ calendar issues one query carrying `$expand` in every latency profile; the alternative of
1096
+ adding `objectSchema` to the dependency list issued two, and when the schema read was the
1097
+ slower of the two it painted raw ids, reverted to the "Loading calendar..." placeholder,
1098
+ then swapped — a three-step paint the correct rows do not arrive any later than.
1099
+
1100
+ The gate is on the schema read having SETTLED, never on a truthy schema: an adapter that
1101
+ exposes no `getObjectSchema`, and a read that throws, both settle with nothing and the
1102
+ calendar still queries (unexpanded) rather than waiting forever. An inline `value` data set
1103
+ is deliberately not gated — it issues no metadata read, so there would be no resolution to
1104
+ wait for.
1105
+ - f9653ae: Re-key the load-bearing fetch effects in `ObjectMap`, `ObjectCalendar` and
1106
+ `ObjectGantt` onto the primitive fields they actually read off `dataConfig`
1107
+ (`provider` / `object` / `items`) instead of the whole memoised `dataConfig`
1108
+ object (objectui#6592, the deferred half of objectui#6270/PR #6591).
1109
+ `ObjectTree` is a census member too but is deferred out of this change — see
1110
+ the PR body — because its own fetch effects are the surface of PR #6696
1111
+ (objectui#6481), open at the same time.
1112
+
1113
+ `useMemo` carries no semantic guarantee — React is permitted to discard a
1114
+ memo cache and recompute even when its dependency array compares equal to
1115
+ the previous render, and the local `getDataConfig(schema)` helper each of
1116
+ these renderers carries builds a fresh `{ provider, object }` /
1117
+ `{ provider, items }` wrapper object on every call. So a fetch effect keyed
1118
+ on `dataConfig` itself was correct only for as long as that identity
1119
+ happened to survive a discard: a recompute alone (no author or caller
1120
+ action) was enough to re-run the effect and issue an extra
1121
+ `dataSource.find` / `dataSource.getObjectSchema` call. Keying the effects
1122
+ on the primitives instead makes a cache discard a no-op, restoring
1123
+ `useMemo` to a pure optimisation.
1124
+
1125
+ `ObjectGantt`'s `effectiveDataSource` memo deliberately keeps `dataConfig`
1126
+ as a dependency (`resolveDataSource` needs the whole provider-shaped
1127
+ value — the `api` provider's `read`/`write` request config cannot be
1128
+ flattened to a fixed primitive list the way `object`/`value` can), so its
1129
+ `reload()` fetch is decoupled from the redundant direct `dataConfig`
1130
+ dependency but not from `effectiveDataSource`'s own; for the `object`/`value`
1131
+ providers `resolveDataSource` returns its `fallback`/a fresh
1132
+ `ValueDataSource` respectively rather than reading further into the config,
1133
+ which is enough for the two fetch effects to observe no extra call under a
1134
+ recomputed-but-equivalent `dataConfig` in the common case.
1135
+
1136
+ No behaviour change for a schema whose `useMemo` caches survive normally;
1137
+ the effects are unaffected by React discarding one.
1138
+ - 3beef6d: The spec's `dataSource` element binding is now DECLARED by the blocks that read
1139
+ it, so the html tier stops reporting the one working saved-view spelling as
1140
+ `unknown-prop` (objectui#6678).
1141
+
1142
+ `PageComponentSchema.dataSource` — `{ object, view, filter, sort, limit }` — is
1143
+ the one spelling that resolves a saved view for an object-bound block. It works,
1144
+ and it drew the identical `unknown-prop` warning as the two spellings that do
1145
+ nothing (`viewName`, `view`), because `validateTree` looks a prop up in the
1146
+ block's declared `inputs` and no registration declared this key. On the tier
1147
+ built to accept AI-authored pages, where the diagnostic IS the contract, the
1148
+ only signal pointed away from the key that works.
1149
+
1150
+ Adopting the maintainer ruling of 2026-08-29 — option B **in the injection
1151
+ form**:
1152
+
1153
+ - `ELEMENT_DATA_SOURCE_INPUT` is the single declaration, in `@object-ui/core`
1154
+ beside the binding's own semantics; `Registry.register` emits it for any
1155
+ registration whose renderer passed through the new `elementDataSourceBlock()`
1156
+ seam. One mechanism, one copy — not a hand-kept declaration per block, which is
1157
+ the shape that drifts and that a new block forgets. The seam lives in
1158
+ `@object-ui/core` and is re-exported by `@object-ui/react` beside
1159
+ `ElementDataSourceGate` for discoverability; call sites take the core import,
1160
+ because a registration runs at module scope and this repo's suites partially
1161
+ mock `@object-ui/react`.
1162
+ - Seventeen renderers, in thirteen files across twelve packages, reach the seam
1163
+ and now publish the key to the save gate, the parser whitelist, the generated
1164
+ JSX authoring types and the block list. The card named nine blocks; the tree
1165
+ also has `plugin-grid`, `plugin-timeline`, two further `plugin-form` blocks and
1166
+ `element:record_picker` — nothing was hand-listed, so the mechanism covered
1167
+ them. `element:record_picker` consumes the gate's HOOK and status panels rather
1168
+ than the wrapper tag (its object lives under `properties`), and was found by a
1169
+ render probe rather than by reading sources.
1170
+ - `dataSource` on a block that does NOT read it (`flex`, `card`) still reports
1171
+ `unknown-prop`. Adding the key to `sdui-parser`'s `BASE_PROPS` was refused for
1172
+ exactly this reason — that set mirrors `BaseSchema`, and silencing the key
1173
+ everywhere would make the diagnostic lie in the other direction.
1174
+ - New `check:element-data-source-declaration` fails any source that consumes the
1175
+ gate without reaching the seam, so a block added tomorrow cannot forget.
1176
+
1177
+ Behaviour of the binding itself is unchanged — this is a declaration, not a
1178
+ resolution change. The saved view still resolves its columns, and an
1179
+ unresolvable `view` still fails loudly rather than widening to the object's full
1180
+ scope.
1181
+
1182
+ The spec/registry parity gates (repo-wide and the `record:related_list` per-block
1183
+ pin) now derive their accepted set from the WHOLE node contract rather than from
1184
+ `ComponentPropsMap[type]` alone. `PageComponentSchema` accepts and keeps
1185
+ `dataSource` on a page-component node — it is a node-level key, a sibling of
1186
+ `type` and `className`, not a per-block prop — so the gates' previous complaint
1187
+ was measurably wrong. Derived from the spec, not exempted, and both still
1188
+ discriminate against an invented key.
1189
+ - 7c3df8f: The settled-schema convergence, and the gantt's duplicate query gated
1190
+ (objectui#7225, maintainer ruling B, 2026-09-02).
1191
+
1192
+ `useSettledSchema` was extracted and published in PR #6690 with exactly **one**
1193
+ non-test adopter (`ObjectTree`, the component that had an actual defect —
1194
+ objectui#6481's unkeyed latch). `ObjectKanban`, `plugin-view/ObjectView` and
1195
+ `ObjectCalendar` kept their own hand copies of the same shape, so a published
1196
+ export was owed compatibility forever **and** the duplication it was named for
1197
+ stayed. All three now call the hook.
1198
+
1199
+ The migration is a pure deduplication with no behaviour delta — the hook was
1200
+ extracted *from* these three shapes, so each becomes a one-line call.
1201
+ `ObjectCalendar`, which objectui#6482 named as the obstacle, fits via the
1202
+ recipe the hook's own doc comment prescribes for it by name: pass the data
1203
+ source as `undefined` for a render that must not read metadata
1204
+ (`hasInlineData ? undefined : dataSource`), so "inline value data set" is
1205
+ expressed as "there is no source to read from" rather than as a second enable
1206
+ flag. GATE PLACEMENT stays local in all three, which is what #6482 ruled and
1207
+ what made the calendar's obstacle a non-obstacle: it was about the gate half.
1208
+
1209
+ **One observable change:** `ObjectKanban`'s rejected definition read now logs
1210
+ on `console.error` with a `[useSettledSchema]` prefix instead of
1211
+ `console.warn`. Its test spy moves with it, and now asserts on the channel
1212
+ rather than merely silencing it.
1213
+
1214
+ **The gantt's duplicate query is gated** (ask 2 of the card; #6482's
1215
+ undischarged half). `ObjectGantt` listed `objectSchema` in `reload`'s
1216
+ dependency list, so every load issued two unbounded queries — the first with no
1217
+ `$expand` at all. Measured on this component across three latency profiles, the
1218
+ cost is not the mild "round trip bought and thrown away": when the metadata
1219
+ read is the slower of the two, which is the common case on a cold
1220
+ `MetadataCache`, the user sees the full three-step paint — raw foreign-key ids,
1221
+ back to the loading placeholder, then the expanded rows. It now issues one
1222
+ query, already expanded.
1223
+
1224
+ Gating the gantt required its schema resolution to settle on EVERY exit
1225
+ (objectui#7232): the hand-rolled effect returned without settling on
1226
+ `!effectiveDataSource`, on `!resource` and in its `catch` — harmless while
1227
+ nothing waited on it, and a chart that never loads once something does.
1228
+ `useSettledSchema` settles on all three by construction, which is what makes
1229
+ the gate safe; both exits are pinned.
1230
+
1231
+ ⛔ Gating is not capping. The row ceiling on these fetches is objectui#7210's
1232
+ separate ruling, in its own commit on the same branch.
1233
+ - 6411def: FLS-gate the `$expand` projection at the five remaining build sites (objectui#7230).
1234
+
1235
+ objectui#7215 / PR #7229 gated `$expand` at the two projection sites in its scope
1236
+ (`ObjectGrid`, `ListView`). The helper is reached from more places than that. This
1237
+ closes the five that were left: `ObjectCalendar`, `ObjectGantt`, `RecordDetailView`,
1238
+ `DetailView`, and `ObjectDataTable` (which builds its own whitelist in
1239
+ `computeLookupExpand` rather than calling `buildExpandFields`).
1240
+
1241
+ **Three of them pass no column list at all**, which makes them the sharp ones:
1242
+ `buildExpandFields` reads an absent column list as "no column restriction" and falls
1243
+ back to **every declared relation on the object**, denied ones included. So a standalone
1244
+ calendar, a gantt, and every record page in the console asked the server to resolve the
1245
+ object's full relation set by default rather than by configuration.
1246
+
1247
+ **`DetailView` was input-gated, and that is the defect rather than the fix.** Its column
1248
+ list is already FLS-filtered field by field, which is exactly the route PR #7229 measured
1249
+ as unsound: an emptied column list reads as "no column restriction", so a detail view
1250
+ whose authored fields are all denied had its `$expand` **widened** from the relations it
1251
+ asked for to every relation the object declares. The principal who may read least was
1252
+ asking for the most.
1253
+
1254
+ **Reproduced before it was fixed**, as a failing test per site.
1255
+
1256
+ **Grading, measured rather than assumed.** Against ObjectStack's own server this is
1257
+ defence-in-depth, exactly as objectui#6898 and #7215 are: `plugin-security`'s
1258
+ `FieldMasker.maskRecord` deletes every unreadable key from each returned row and
1259
+ objectql's expand path writes the resolved record back under that same key, so one
1260
+ statement removes the expanded object and the bare id alike; the expansion sub-read is
1261
+ itself gated (`__expandRead` takes the referenced object's full CRUD + RLS + FLS
1262
+ treatment). It is load-bearing for any backend that does not strip, and the
1263
+ client-request side is real regardless.
1264
+
1265
+ **Nothing a permitted view did stops working.** The gate judges each helper's OUTPUT,
1266
+ which contains only the object's declared reference-bearing fields, so the "`checkField`
1267
+ answers false for an undeclared key" trap cannot be reached and derived / host-joined
1268
+ columns are untouched. An unanswered permission policy filters nothing. Neither
1269
+ `buildExpandFields` nor `computeLookupExpand` is changed.
1270
+ - e75f4c9: `colorField` now means the same thing in the gantt, the calendar and the timeline
1271
+ (objectui#7243).
1272
+
1273
+ **The inversion this fixes.** `gantt.colorField` is documented as "field that drives the
1274
+ bar color", and the renderer passed the stored value straight into the bar's
1275
+ `backgroundColor`. Pointing the key at a select field therefore emitted
1276
+ `backgroundColor: "open"` — not a colour, so the browser dropped the declaration and
1277
+ every bar rendered identically. OMITTING the key was strictly better: the absent-key
1278
+ branch derived a real colour per status. Declaring the documented key was worse than not
1279
+ declaring it, with no error, warning or console message either way.
1280
+
1281
+ The same key also meant three different things across the three lenses: the timeline
1282
+ resolved the field's authored option `color`, the calendar hashed the raw value onto a
1283
+ fixed palette, and the gantt emitted the raw value. An author colouring three views by
1284
+ one field got three unrelated results, one of which was no colour at all.
1285
+
1286
+ **The ladder.** `@object-ui/core` gains `createFieldColorResolver` — the timeline's
1287
+ resolver, lifted so all three call it:
1288
+
1289
+ 1. the field's own option `color` for the record's value;
1290
+ 2. else the value itself when it already IS a colour literal (`#rgb`, `#rrggbb`,
1291
+ `#rrggbbaa`, `rgb(...)`, `hsl(...)`);
1292
+ 3. else each renderer's own last rung, which is deliberately NOT shared — the gantt
1293
+ derives a semantic-token hex (a bar must be painted), the calendar keeps its
1294
+ theme-aware 8-stop hash (a soft tint, not a solid fill), the timeline draws its
1295
+ default marker.
1296
+
1297
+ **What changes for authors.** A gantt or calendar whose `colorField` points at a select
1298
+ field with authored option colours now paints those colours. A gantt value that is
1299
+ neither an option colour nor a colour literal now derives a colour instead of emitting
1300
+ an invalid CSS value — including a palette NAME (`red`), which now resolves to that
1301
+ palette's hex, the behaviour the key's own contract has always promised ("hex or
1302
+ semantic name") and the one `borderColorField` already had. `gantt.borderColorField`
1303
+ takes rung 1 as well, so an authored option colour reaches the alert stroke; it keeps
1304
+ today's behaviour otherwise and deliberately gains no derivation rung, since the stroke
1305
+ is opt-in and deriving one for every record would draw an alert on records that have
1306
+ none.
1307
+
1308
+ Calendars whose `colorField` points at a plain categorical field are unchanged: that
1309
+ value still reaches `CalendarView`'s deterministic hash exactly as before. The timeline
1310
+ is unchanged apart from accepting the 8-digit `#rrggbbaa` hex spelling the calendar
1311
+ already accepted.
1312
+ - b8fc1e2: fix(plugin-calendar): the all-day lane header reads the same string with or without an I18nProvider
1313
+
1314
+ `CalendarView`'s `DEFAULT_TRANSLATIONS` table — the `defaults` map behind its
1315
+ `createSafeTranslation` factory — spelled `calendar.allDay` as `all-day`, while
1316
+ all ten locale packs carry the key and `en` spells it `All Day`. Since
1317
+ `createSafeTranslation` serves that table only when no `I18nProvider` is
1318
+ mounted, the same lane header rendered `all-day` in a standalone embed and
1319
+ `All Day` inside the console. The table now matches the pack, so both paths
1320
+ render one string.
1321
+
1322
+ The table entry was the only one of the seven that disagreed with its `en`
1323
+ value, and the packs predate it by three months — the drift was an oversight,
1324
+ not a compact spelling chosen for the 56px gutter (both strings are seven
1325
+ characters wide).
1326
+
1327
+ Also removes the dead `t('calendar.allDay') === 'calendar.allDay'` ternary that
1328
+ guarded the lane header: the factory's provider-less arm returns `defaults[key]`
1329
+ before it could ever return the bare key, and with a provider the merged
1330
+ resources always carry `calendar.allDay`, so its lowercase branch was
1331
+ unreachable from either side.
1332
+ - c6198c2: **Breaking for authored metadata:** `ComponentInput.label`, `ComponentInput.defaultValue` and
1333
+ `ComponentInput.advanced` are RETIRED on both faces (objectui#7493 item ① and objectui#7781;
1334
+ maintainer ruling A of 2026-09-06, immediate, no deprecation window; ADR-0049 enforce-or-remove).
1335
+ They are the three keys the manifest serializer does not forward, and nothing read them on any
1336
+ publication or consumption path.
1337
+
1338
+ No manifest ever published them, so no consumer could ever have read them. `sdui-parser`'s
1339
+ serializer (`packages/sdui-parser/src/index.ts`) forwards exactly seven keys per input — `name`,
1340
+ `type`, `of`, `required`, `enum`, `binding`, `description` — so a value authored under any of the three
1341
+ never reached `sdui.manifest.json`, the generated JSX `.d.ts`, or a diagnostic; its boundary type
1342
+ has no slot for them; the registry's data-source seam reads `name` only; and neither the designer
1343
+ nor the app-shell inspectors consult registry `inputs` at all. A structural census over every
1344
+ `inputs:` array in the repository (re-measured on this change's merge-base, `name` 951 and `type`
1345
+ 951 as the controls) counted the writes: `label` 908, `defaultValue` 245, `advanced` 9 — written on
1346
+ nearly every registration, read by nothing.
1347
+
1348
+ FROM → TO, per key — all three **TOMBSTONED, not removed**, because the route was measured on
1349
+ the built face before it was chosen: `ComponentInputSchema` is a non-strict `z.object`, and an
1350
+ undeclared key parses GREEN and is silently STRIPPED, so a deletion would have swallowed 1,162
1351
+ authored values in silence. The tombstone is what makes the refusal loud and by name.
1352
+
1353
+ - `label?: string` → `label?: never` on the interface, `retirementTombstone()` on the Zod mirror.
1354
+ Migration: delete the key. An input is identified by its `name` on every path that reaches it;
1355
+ nothing ever rendered a label for it.
1356
+ - `defaultValue?: any` → `defaultValue?: never` / `retirementTombstone()`. Migration: delete the
1357
+ key. The renderer's own fallback read IS the default; tell the author about it in `description`,
1358
+ which IS published. (Tightening the type to `unknown` was ruled out: it closes no error class,
1359
+ since nothing reads the value.)
1360
+ - `advanced?: boolean` → `advanced?: never` / `retirementTombstone()`. Migration: delete the key.
1361
+ No designer surface ever hid an "advanced" input; there is nothing to write instead.
1362
+
1363
+ The retirement kit: `?: never` on `ComponentInput` (`packages/types/src/base.ts`), so authoring one
1364
+ is a `tsc` error at the registration site; `retirementTombstone()` on `ComponentInputSchema`
1365
+ (`packages/types/src/zod/base.zod.ts`), so an authored value is REFUSED at parse time with
1366
+ `code: 'invalid_type'`, the key named in the issue `path`, and the migration note as the message
1367
+ (one string, both channels). Pinned in
1368
+ `packages/types/src/__tests__/component-input-retired-keys-7493.test.ts`, which also holds a
1369
+ tree-scoped absence census over every `inputs:` array under `packages/**` and `apps/**`.
1370
+
1371
+ Accept-set change, stated plainly for reviewers: a document that sets any of the three keys on a
1372
+ `ComponentInput` used to parse GREEN (the value was then dropped by the serializer) and now parses
1373
+ RED. Every in-repo authoring site — 1,199 keys across 110 registration files, the three standalone
1374
+ `ComponentInput[]` arrays and the two named input arrays `tsc` found included — is deleted in the same change, as the ruling's split rule
1375
+ requires; the `WidgetRegistry` seam no longer copies the widget-manifest values onto the synthesized
1376
+ `ComponentInput` (they fed nothing), and the data-source declaration `ELEMENT_DATA_SOURCE_INPUT`
1377
+ drops its `label`. The patch entries on the other packages record exactly that: their registrations
1378
+ stop authoring inert keys, with no runtime or published-manifest change.
1379
+
1380
+ The nine test files that read `defaultValue` off a registration were re-pinned against the
1381
+ renderer's ACTUAL default (its own fallback read, or the `defaultProps` it ships) instead of the
1382
+ declaration that went away; two assertions that only restated the shadow default were dropped with
1383
+ the reason on the line.
1384
+
1385
+ The in-repo zero is what was measured. Whether anything OUTSIDE this repository writes these keys
1386
+ is not measurable from here (the objectui#5674 limit); converting such a write from a silent drop
1387
+ into a named refusal is exactly what the tombstones buy. `WidgetInput`'s own `label` /
1388
+ `defaultValue` / `advanced` (the widget-manifest face) stay declared and writable — nothing has
1389
+ ruled on that face; that it now has no reader either is recorded as objectui#7911.
1390
+ - ce2aaef: One shared record-source ladder, five plugins delegate.
1391
+
1392
+ `@object-ui/core` publishes `resolveRecordSourceConfig(schema)` — the ONE implementation
1393
+ of the ruled three-rung record source ladder: `data` first, then `staticData` wrapped as
1394
+ `{ provider: 'value', items }`, then `objectName` folded to `{ provider: 'object' }`, and
1395
+ `null` when nothing is bound. It is the PRODUCER whose output the reader
1396
+ `resolveRecordSourceObjectName` (`b041b9c0c`) consumes, and it now sits beside it in the same module.
1397
+
1398
+ That ladder is published contract on both faces — `packages/types/src/objectql.ts` and its
1399
+ zod mirror both ship `.describe()` strings naming `getDataConfig`'s order (`77cb489b4`,
1400
+ maintainer ruling 2026-09-02), pinned by `objectql-record-source-refinement-6939.test.ts` —
1401
+ and it was hand-copied into five plugin components with no gate holding them together. A
1402
+ change to the ruled order had five edit sites and nothing that noticed a missed one; that
1403
+ is the AGENTS.md #0.1 drift class.
1404
+
1405
+ **No behaviour changes.** `ObjectCalendar`, `ObjectGantt` and `ObjectTree` now call the
1406
+ shared reader directly. `ObjectGrid` and `ObjectMap` keep their own bare-array `data`
1407
+ shorthand as a documented head above the shared call and are otherwise unchanged.
1408
+ `record-source-config.behaviourNeutrality-7632.test.ts` transcribes all five pre-collapse
1409
+ bodies verbatim and asserts the post-collapse spelling agrees with each across the whole
1410
+ input matrix, so a later edit to the shared reader that moves any site turns red.
1411
+
1412
+ **Two divergences were measured rather than assumed, and both are preserved.**
1413
+
1414
+ `ObjectCalendar`'s `'data' in schema && schema.data` guards existed because its parameter was
1415
+ at that time the union `ObjectGridSchema | CalendarSchema`, whose `CalendarSchema` arm declared
1416
+ neither key. (objectui#8651 has since re-pointed that parameter at the published
1417
+ `ObjectCalendarSchema`, so the union is gone; the CONCLUSION below — that the guard had no
1418
+ runtime effect and removing it is behaviour-neutral — is unaffected.)
1419
+ That is a TypeScript narrowing device with no runtime effect — an absent property reads
1420
+ `undefined`, falsy either way — so the guard could never change which rung is taken. The
1421
+ shared reader's optional-property parameter accepts the union directly, and the
1422
+ equivalence is pinned on a fixture that really lacks both keys rather than argued.
1423
+
1424
+ `ObjectGrid` and `ObjectMap` normalize a bare-array `data` to `{ provider: 'value', items }`;
1425
+ `ObjectCalendar`, `ObjectGantt` and `ObjectTree` do not, and return the array verbatim. That
1426
+ is a real divergence on off-contract input — `ViewData` is a discriminated union over object
1427
+ variants, so an array under `data` cannot be published. It is NOT unified here: the shared
1428
+ rung stays contract-strict and the two sites keep the head locally, the same way `b041b9c0c`
1429
+ left the off-contract `{ provider: 'object' }` tails at their sites. Both sides of the fork are
1430
+ pinned, so neither folding the head in nor deleting it as redundant can happen silently.
1431
+
1432
+ `ObjectTree`'s copy took `schema: any`; it now goes through the shared reader's typed
1433
+ parameter. Types are erased at runtime, so nothing it resolves moves.
1434
+ - 2ce2612: A record-page URL now names the object the clicked rows actually came from, in
1435
+ `ObjectTree` and `ObjectCalendar`.
1436
+
1437
+ `useNavigationOverlay` builds `/{objectName}/record/{id}` out of whatever it is handed,
1438
+ and both components handed it the bare top-level `schema.objectName` while resolving
1439
+ their own rows through the ruled record-source ladder (`data`, then
1440
+ `staticData`, then `objectName`). `77cb489b4` published `objectName` as that ladder's
1441
+ THIRD RUNG and not as a parallel "page object" concept, so a block has exactly one
1442
+ record source — and a row fetched through `data.object` whose click built
1443
+ `/{schema.objectName}/record/{id}` named a record that the URL's own object does not
1444
+ contain.
1445
+
1446
+ Two shapes change, both toward the object the rows came from:
1447
+
1448
+ - a block carrying **both** bindings navigated to the top-level key and now navigates to
1449
+ `data.object`;
1450
+ - a **data-only** block had no name to build a URL from at all, so the hook took its
1451
+ `/{id}` leg — an unrouted path that paints a blank page — and now builds the routed
1452
+ record URL.
1453
+
1454
+ `ObjectCalendar` is where the divergence was plainest: on one click it resolved the
1455
+ detail drawer through the ladder and the navigation URL through the top-level key. The
1456
+ URL now reuses the very `schemaObjectName` that already keys the calendar's record query
1457
+ and its `$expand` derivation, so query, drawer and URL agree by construction.
1458
+
1459
+ **Nothing else moves.** Both converted sites keep a site-local `?? schema.objectName`
1460
+ tail for the off-contract `data: { provider: 'object' }` that carries no `object`
1461
+ (`ViewDataSchema` declares it required) — the same tail `ObjectTree`'s `headerObjectName`
1462
+ already carries, and the same conservatism `b041b9c0c` applied when it published the
1463
+ shared reader. `useNavigationOverlay`'s own signature is unchanged: it still takes an
1464
+ `objectName`, and only what callers hand it has changed.
1465
+
1466
+ The hook's `@example` stops prescribing `objectName: schema.objectName`. That prose is
1467
+ why there were copies to convert at all — component authors copied the divergence out of
1468
+ the documentation, correctly, as written — so it now points at
1469
+ `resolveRecordSourceObjectName` and says explicitly that a caller with no data config
1470
+ has nothing above rung three and should keep passing `schema.objectName`.
1471
+
1472
+ `ObjectKanban` is deliberately **not** converted: it has no data config, no
1473
+ `getDataConfig`, and its `data` is a raw row array rather than a `ViewData` binding, so
1474
+ `schema.objectName` already IS its record source and its board, drawer and URL already
1475
+ agree.
1476
+ - 5e5d6b2: `ObjectCalendar`'s refusal screen now states a remedy an author can act on, on every
1477
+ door it is reachable from (objectui#8170).
1478
+
1479
+ It used to read "Calendar configuration required. Please specify startDateField and
1480
+ titleField." The first clause was right and is unchanged. The second was wrong twice:
1481
+
1482
+ **It demanded an optional key.** `@objectstack/spec`'s `CalendarConfigSchema` is a
1483
+ strict object whose ONE required key is `startDateField`. Re-measured on the installed
1484
+ 17.4.0, three legs via `CalendarConfigSchema.safeParse` from `@objectstack/spec/ui`:
1485
+ `{}` and `{ titleField: 't' }` both fail `invalid_type` at `startDateField`, and
1486
+ `{ startDateField: 'd' }` parses clean. The spec's own note on that schema names this
1487
+ renderer as the reason — `resolveTitle` takes an explicit `titleField` when present and
1488
+ otherwise resolves through the ADR-0079 record display-name chain, so the screen was
1489
+ asking for a key the component neither needs nor reads.
1490
+
1491
+ **It named keys without saying where they go, which is unactionable on an interface
1492
+ page.** That surface's `interfaceConfig` has no calendar slot at all — it reads
1493
+ `columns`, `sort`, `filterBy`, `userFilters`, `appearance`, `addRecord`, `userActions`,
1494
+ `showRecordCount`, `source`, `sourceView`, `buttons` and `recordAction`, and no calendar
1495
+ key — so the only lever there is `sourceView`, which the screen never mentioned. The
1496
+ refusal was honest about the binding and dishonest about the remedy.
1497
+
1498
+ The new copy names the one required key, says the title resolves without `titleField`,
1499
+ points at the view's `calendar` block as the place both doors read the binding from, and
1500
+ states the interface page's indirection outright.
1501
+
1502
+ **Why the wording is door-COMPLETE rather than door-AWARE.** Two producers emit an
1503
+ `object-calendar` node — the calendar branches of `plugin-list`'s `ListView` and
1504
+ `plugin-view`'s `ObjectView` — and app-shell reaches the first from both its `ObjectView`
1505
+ (object-view door) and `InterfaceListPage` (interface-page door). Every one of them hands
1506
+ the component the same shared `baseProps` bag plus whichever declared binding keys exist:
1507
+ nothing on the node names the door. A door-aware screen therefore needs a newly declared
1508
+ prop threaded through four packages, and inferring the door from whether the object
1509
+ carries a date field only correlates with it — `InterfaceListPage`'s deriver runs solely
1510
+ when `calendar` is whitelisted in `appearance.allowedVisualizations` — which is the
1511
+ "the gate and the seam must answer one question" failure this repo has recorded on `map`,
1512
+ `chart` and `kanban` already.
1513
+
1514
+ The first clause is unchanged on purpose: five suites pin this screen with
1515
+ `/Calendar configuration required/i`, and `@object-ui/types`' calendar alias tombstones
1516
+ assert on the same phrase. Only the clause that was wrong moves. The new second clause is
1517
+ pinned in `ObjectCalendar.refusalRemedy-8170.test.tsx`, together with the runtime control
1518
+ that makes its claim checkable: a calendar with a date binding and no `titleField` renders
1519
+ real record titles.
1520
+ - 2d80456: `object-kanban` / `view:kanban` and `object-calendar` / `view:calendar` now DECLARE seven
1521
+ spec-carried keys their renderers already honoured, so the html tier stops reporting working
1522
+ metadata as `unknown-prop` (objectui#8201, the backlog objectui#8176 exposed).
1523
+
1524
+ Board: `groupBy`, `cardTitle`, `titleField`, `swimlaneField`, `coverImageField`.
1525
+ Calendar: `defaultView` (the spec's three-member enum) and `locale`.
1526
+
1527
+ No renderer behaviour changes — every one of these keys was already read and already acted on;
1528
+ what changes is that authoring tools can now discover them and the save gate agrees with the
1529
+ validator. Both tags of each block now spread ONE shared `inputs` list, so the two published
1530
+ surfaces cannot drift apart by hand-copy.
1531
+ - 289d146: `object-calendar` / `view:calendar` now DECLARE the last three spec-carried keys the renderer
1532
+ already honoured — `data`, `staticData` and `loading` — so the html tier stops reporting working
1533
+ metadata as `unknown-prop`. Each declared description names the POSITION the key is honoured at:
1534
+ `data` replaces the calendar's own query, `staticData` is read below `data` and above `objectName`,
1535
+ and `loading` is honoured only alongside an array `data` (objectui#8314, slice 2b of
1536
+ objectui#8201). Every `object-calendar` key the spec declares is now discoverable.
1537
+ - 5058336: `object-calendar` is taught with its `calendar` block, not with flat field-name keys (objectstack-ai/objectui#8831).
1538
+
1539
+ `@objectstack/spec` refuses `startDateField`, `endDateField`, `titleField`, `colorField` and `allDayField` written flat on an `object-calendar` node, and its diagnostic prescribes `calendar: { startDateField, endDateField, titleField, colorField, allDayField }`. Since 17.5.0 the spec's `CalendarConfigSchema` declares all five, `allDayField` included. objectui's published faces still taught the flat spelling as something to write, so an author who followed them was refused at publish.
1540
+
1541
+ - `@object-ui/plugin-calendar`: both `object-calendar` examples in the README write the five keys inside `calendar`, and the README says what the flat spelling is: the runtime handoff `ObjectView` and `ListView` emit, which `getCalendarConfig` reads only when the node has no `calendar` block. The five-key sentence for `calendar-view` stays and now says it is about that element: `CalendarViewSchema` has no `calendar` block, so the flat keys are its only spelling.
1542
+ - `@object-ui/types`: the `.describe()` text and the TypeScript docblocks of `ObjectCalendarSchema`'s five flat members call them the read-only handoff and point at `calendar.KEY`. The `calendar` member's text calls the block the authored spelling. The `allDayField` member of the `calendar` block no longer calls the key objectui-local, because 17.5.0 declares it.
1543
+
1544
+ Descriptions and documentation only. No accept set moves: the flat members stay declared on both faces, with the same types, because the renderer still reads them.
1545
+ - 708f271: fix(plugin-calendar): the month gridcell's accessible name follows the resolved locale
1546
+
1547
+ `MonthView`'s day gridcell built its `aria-label` with
1548
+ `toLocaleDateString("default", …)` — the literal `"default"` means the *machine's*
1549
+ locale — while the weekday column headers one row above were already formatted with
1550
+ the component's resolved `locale`. A screen-reader user on a non-`en` session
1551
+ therefore heard the column headers in their own language and every date in whatever
1552
+ locale the runtime happened to be set to.
1553
+
1554
+ Both branches of that label (with events and without) now use the same resolved
1555
+ `locale` the headers use. No locale pack, key or translation is involved — this is
1556
+ which tag the `Intl` call is handed.
1557
+ - 76ae729: `README.md`'s "Schema API / CalendarView" block described a `CalendarViewSchema`
1558
+ that does not exist. Measured against the interface itself
1559
+ (`packages/types/src/complex.ts`) and its zod mirror: `events` — the schema's
1560
+ only required key besides `type` — was published as `events?`, so a reader
1561
+ following the README omits it and TypeScript rejects the node; `defaultDate` was
1562
+ `string` where the schema says `string | Date`; and `onDateClick` was listed as a
1563
+ schema key when it is a `CalendarViewProps` **component** prop, sending readers
1564
+ to a different package's surface for a key `calendar-view` does not have (the
1565
+ schema's key is `onDateChange`). The block also listed 6 of the schema's 13 keys
1566
+ with nothing saying it was a summary (objectui#5045).
1567
+
1568
+ The block now carries the requiredness the schema declares, names itself a
1569
+ partial summary of `CalendarViewSchema`, and adds the author-facing
1570
+ `defaultView` / `view` / `views` / `editable` / `date`. It also states plainly
1571
+ what the registered `calendar-view` renderer actually reads — it builds events
1572
+ from the node's `data` array and drops an authored `events` key (objectui#4433) —
1573
+ so the corrected requiredness does not itself become a new wrong instruction.
1574
+
1575
+ This is a documentation fix to a file `plugin-calendar` publishes to npm, which
1576
+ is why it carries a version: the npm landing page only picks up the correction
1577
+ on a release. No behaviour, export, type, or `dist` byte changes. The pin test
1578
+ added alongside it publishes nothing.
1579
+ - bc5870c: fix(plugin-calendar): a record with no date is no longer placed on today
1580
+
1581
+ `ObjectCalendar` mapped a record whose declared `startDateField` carried no
1582
+ value to `new Date()` — the current moment — so it rendered on today's cell as
1583
+ an ordinary event, indistinguishable from a real one. The `isNaN` guard six
1584
+ lines below could not catch it by construction: a no-argument `new Date()` is
1585
+ always valid, so the absent-value case became a well-formed lie *before* the
1586
+ check that would have caught it.
1587
+
1588
+ The fabricating arm is deleted. Such records now leave the grid entirely and
1589
+ appear in a collapsed "Unscheduled (N)" area below the calendar — a visible
1590
+ count and an expandable list, with no invented date and no scheduling UI. The
1591
+ `isNaN` filter keeps its original job for values that are present but
1592
+ unparseable: absent and malformed stay two distinguishable outcomes.
1593
+ `allDay: !endDate` now applies only to records that have a start, so a record
1594
+ with no dates at all is unscheduled rather than silently all-day; a record with
1595
+ a start and no end still renders all-day exactly as before.
1596
+
1597
+ Adds `calendar.unscheduled` to all ten locale packs.
1598
+ - f47d94c: `@object-ui/plugin-calendar` now exports the `CalendarView` component's runtime event
1599
+ type as **`CalendarViewEvent`**, and keeps `CalendarEvent` as a **`@deprecated` alias**
1600
+ of it. **Non-breaking:** the alias is a working re-export denoting the same type, so
1601
+ code importing `CalendarEvent` from this package keeps compiling unchanged — nothing is
1602
+ removed and no behaviour changes.
1603
+
1604
+ Why: `@object-ui/types` exports its own `CalendarEvent`, the AUTHORING event
1605
+ (`id: string`, `start` / `end` accept ISO strings with `end` required, plus
1606
+ `description`), while this package's was the runtime event (`id: string | number`,
1607
+ `start: Date`, `end?: Date`). Neither is assignable to the other, and IDE auto-import
1608
+ chose between the two identical names essentially at random — the wrong pick surfaced as
1609
+ a remote `TS2322` about `Date` rather than as a wrong import, which is how this package's
1610
+ own README example stayed uncompilable through an earlier import-path fix. The authoring
1611
+ type keeps the canonical `CalendarEvent` name; the runtime type gets the self-describing
1612
+ one (objectui#5044, following the `ObjectCalendarProps` -> `ObjectCalendarComponentProps`
1613
+ rename in objectui#4650).
1614
+
1615
+ Write `CalendarViewEvent` in new code.
1616
+ - 065bba7: `CalendarViewSchema` (TS interface and zod mirror) converges on the registered
1617
+ `calendar-view` renderer's measured read set (objectui#5667, maintainer ruling
1618
+ option A — the renderer is authoritative).
1619
+
1620
+ **Breaking for consumers of the published type** (deliberate; per-repo policy
1621
+ breaking changes ship as `minor` — the fixed group's `major` tracks
1622
+ `@objectstack`):
1623
+
1624
+ - Nine inert keys are retired: `events` (the interface's only required key,
1625
+ which the renderer deliberately drops — objectui#4433), `defaultView`,
1626
+ `defaultDate`, `date`, `views`, `editable`, `onEventCreate`,
1627
+ `onEventUpdate`, `onDateChange`. None had a read site on the authored-node
1628
+ path and no measured app authors them (ADR-0049 enforce-or-remove).
1629
+ - The type now declares what the renderer actually reads: `data`, `titleField`,
1630
+ `startDateField`, `endDateField`, `allDayField`, `colorField`, `view`,
1631
+ `currentDate`, `allowCreate`, `className`, plus the two host-only function
1632
+ hatches it forwards (`onEventClick`, `onViewChange`).
1633
+ - Practical radius, measured: `BaseSchema` carries an index signature and the
1634
+ zod `BaseSchema` is `.passthrough()`, so nodes still authoring retired keys
1635
+ neither fail to compile nor get rejected at validation — they are simply no
1636
+ longer declared, documented, or type-checked. The material accept change is
1637
+ that zod no longer **requires** `events`: a `{ "type": "calendar-view" }`
1638
+ node without it now validates (previously the one key validation demanded
1639
+ was the one key guaranteed to do nothing).
1640
+
1641
+ Runtime renderer behaviour is unchanged. `@object-ui/plugin-calendar`'s README
1642
+ and `content/docs/api/schema-reference.md` are repaired to the converged
1643
+ surface in the same change, so no copy of the old contradiction survives.
1644
+ - f760064: Localize every accessible name `CalendarView` authors itself.
1645
+
1646
+ The component hard-coded the accessible names of its own landmarks and controls
1647
+ in English, so no locale pack could reach them. A screen-reader user on a
1648
+ translated console heard "Calendar" and "Calendar grid" — the only names those
1649
+ two landmarks have — plus the toolbar buttons and both resize grips, in English,
1650
+ while every sighted string beside them was translated.
1651
+
1652
+ All of them now resolve through the `createSafeTranslation` hook the component
1653
+ already used for its visible copy, and the keys land in all ten locale packs
1654
+ under `calendar.a11y`. Two of the repaired strings were English frames wrapped
1655
+ around already-localized data (the current-date button and the day gridcell's
1656
+ event count); those are now pack-owned sentences whose translations can put the
1657
+ date and the count where each language's grammar wants them, and the gridcell's
1658
+ count is a plural family with a base key so the categories a pack does not
1659
+ enumerate resolve in its own language rather than falling through to English.
1660
+ - fb336df: Move `lucide-react` from `^1.31.0` to `^1.43.0` in every package that declares it, and
1661
+ repair what the jump breaks, so icons resolved from a STRING keep drawing a glyph.
1662
+
1663
+ Measured once against the installed 1.43.0 artifact when this change was made; nothing in
1664
+ the repository re-derives these readings. Across the jump lucide removes no runtime export,
1665
+ no public type name and no `lucide-react/dynamic.mjs` name, and every name this repository
1666
+ imports from `lucide-react` resolves. Exactly one key leaves the runtime `icons` record:
1667
+ `Trash2`, retired in favour of `trash`.
1668
+
1669
+ What a user sees change:
1670
+
1671
+ - Icons the lazy icon seam draws (`resolveIcon`, objectui#9251) get their path data again.
1672
+ lucide 1.43.0 icon modules export their path data inside `__iconData` and no longer
1673
+ export `__iconNode`; the seam now reads both. Reading only `__iconNode` against 1.43.0
1674
+ leaves every such glyph an empty box, with nothing thrown or logged.
1675
+ - `DetailView`'s delete action and three schema-catalog examples spell their icon
1676
+ `trash`, not `trash-2`, so they keep resolving. The glyph is unchanged: 1.43.0's `trash`
1677
+ path data is byte-identical to the `trash-2` path data of 1.31.0 and 1.35.0. Anything
1678
+ that already authored `trash` now draws that same artwork, because lucide moved it under
1679
+ the `trash` name; a few other glyphs were also redrawn upstream.
1680
+ - Icons imported as COMPONENTS carry lucide 1.43.0's own classes: one class per declared
1681
+ alias (a spinner renders `class="lucide lucide-loader-circle lucide-loader-2 ..."`), and
1682
+ no longer the class lucide used to derive from the PascalCase key where that differs
1683
+ (`ArrowDown01` no longer carries `lucide-arrow-down01`). The canonical
1684
+ `lucide-<icon name>` class is still there, so a `.lucide-loader-circle` selector still
1685
+ matches.
1686
+ - Icons resolved from a STRING through the seam keep the classes they had: `lucide`, the
1687
+ canonical `lucide-<icon name>` class and the key-derived class. They do not carry
1688
+ lucide's per-alias classes. That is a maintainer ruling (objectui#8941, option C): the
1689
+ alias list lives only inside each lazily loaded icon module, and it was not moved into
1690
+ the eager name list. A selector that targets an alias class matches a component-imported
1691
+ icon and not a string-resolved one. This also dates the example in the objectui#9251
1692
+ entry: `trash-2` no longer resolves as a string, so no seam-drawn glyph carries
1693
+ `lucide-trash2 lucide-trash-2`; a digit-bearing name that still resolves, such as
1694
+ `arrow-down-0-1`, carries `lucide-arrow-down01 lucide-arrow-down-0-1`.
1695
+ - Updated dependencies [cd2cb41]
1696
+ - Updated dependencies [7b10bef]
1697
+ - Updated dependencies [97abedc]
1698
+ - Updated dependencies [b46c58f]
1699
+ - Updated dependencies [a507334]
1700
+ - Updated dependencies [ad694ac]
1701
+ - Updated dependencies [6f96fca]
1702
+ - Updated dependencies [afb2284]
1703
+ - Updated dependencies [3ac2de8]
1704
+ - Updated dependencies [0aacecc]
1705
+ - Updated dependencies [28b0658]
1706
+ - Updated dependencies [63f4f92]
1707
+ - Updated dependencies [777fca2]
1708
+ - Updated dependencies [c131d9e]
1709
+ - Updated dependencies [5f00ff4]
1710
+ - Updated dependencies [c9e073a]
1711
+ - Updated dependencies [7b395d8]
1712
+ - Updated dependencies [0879812]
1713
+ - Updated dependencies [588380d]
1714
+ - Updated dependencies [8cedb0d]
1715
+ - Updated dependencies [6ce001a]
1716
+ - Updated dependencies [162621b]
1717
+ - Updated dependencies [b06c3de]
1718
+ - Updated dependencies [0d379f5]
1719
+ - Updated dependencies [4c6f549]
1720
+ - Updated dependencies [6cc910b]
1721
+ - Updated dependencies [061f5e8]
1722
+ - Updated dependencies [879ecac]
1723
+ - Updated dependencies [c2dabf0]
1724
+ - Updated dependencies [2dd4d3f]
1725
+ - Updated dependencies [e686f4d]
1726
+ - Updated dependencies [4ab4f1b]
1727
+ - Updated dependencies [fa5fbd9]
1728
+ - Updated dependencies [5f44cc6]
1729
+ - Updated dependencies [b57107d]
1730
+ - Updated dependencies [e3ea4f9]
1731
+ - Updated dependencies [fd6f5da]
1732
+ - Updated dependencies [bb5d4ee]
1733
+ - Updated dependencies [dc666f7]
1734
+ - Updated dependencies [3335767]
1735
+ - Updated dependencies [8b1f066]
1736
+ - Updated dependencies [af243c1]
1737
+ - Updated dependencies [cff4b77]
1738
+ - Updated dependencies [961ceaa]
1739
+ - Updated dependencies [f3f4e4c]
1740
+ - Updated dependencies [a05c350]
1741
+ - Updated dependencies [1dbb993]
1742
+ - Updated dependencies [2b5f509]
1743
+ - Updated dependencies [808f339]
1744
+ - Updated dependencies [6cf5999]
1745
+ - Updated dependencies [274e14a]
1746
+ - Updated dependencies [8c10f4f]
1747
+ - Updated dependencies [90dac98]
1748
+ - Updated dependencies [6096f20]
1749
+ - Updated dependencies [544aca2]
1750
+ - Updated dependencies [ea02938]
1751
+ - Updated dependencies [a14fb23]
1752
+ - Updated dependencies [ae98f1d]
1753
+ - Updated dependencies [f98eddf]
1754
+ - Updated dependencies [ce6bd99]
1755
+ - Updated dependencies [a5b08c9]
1756
+ - Updated dependencies [86982ac]
1757
+ - Updated dependencies [cdefa2a]
1758
+ - Updated dependencies [cc4366d]
1759
+ - Updated dependencies [0961d5e]
1760
+ - Updated dependencies [6276478]
1761
+ - Updated dependencies [5e67837]
1762
+ - Updated dependencies [ff14e29]
1763
+ - Updated dependencies [9b28151]
1764
+ - Updated dependencies [64563a9]
1765
+ - Updated dependencies [1a5003f]
1766
+ - Updated dependencies [09ab32b]
1767
+ - Updated dependencies [8acc51b]
1768
+ - Updated dependencies [ea9d17f]
1769
+ - Updated dependencies [45362a3]
1770
+ - Updated dependencies [2a943bf]
1771
+ - Updated dependencies [d999617]
1772
+ - Updated dependencies [93a689d]
1773
+ - Updated dependencies [4357a27]
1774
+ - Updated dependencies [e5f4343]
1775
+ - Updated dependencies [3261e64]
1776
+ - Updated dependencies [f5178a2]
1777
+ - Updated dependencies [2ad3671]
1778
+ - Updated dependencies [8740e86]
1779
+ - Updated dependencies [d22b37b]
1780
+ - Updated dependencies [9cbe4db]
1781
+ - Updated dependencies [1daf477]
1782
+ - Updated dependencies [3d614ea]
1783
+ - Updated dependencies [6c2f3c5]
1784
+ - Updated dependencies [fb13e85]
1785
+ - Updated dependencies [c2d8659]
1786
+ - Updated dependencies [e0f8202]
1787
+ - Updated dependencies [ac2d6f1]
1788
+ - Updated dependencies [9fbbb17]
1789
+ - Updated dependencies [c3a26cc]
1790
+ - Updated dependencies [a66e58e]
1791
+ - Updated dependencies [d89492c]
1792
+ - Updated dependencies [9a5f998]
1793
+ - Updated dependencies [9327397]
1794
+ - Updated dependencies [17cc3a3]
1795
+ - Updated dependencies [02e6d36]
1796
+ - Updated dependencies [4758b33]
1797
+ - Updated dependencies [4758b33]
1798
+ - Updated dependencies [8848ce4]
1799
+ - Updated dependencies [f905090]
1800
+ - Updated dependencies [9c78ebe]
1801
+ - Updated dependencies [9c78ebe]
1802
+ - Updated dependencies [12809a5]
1803
+ - Updated dependencies [9c78ebe]
1804
+ - Updated dependencies [12809a5]
1805
+ - Updated dependencies [7afc81d]
1806
+ - Updated dependencies [f9c06ef]
1807
+ - Updated dependencies [93a5585]
1808
+ - Updated dependencies [5ad3b88]
1809
+ - Updated dependencies [21eb61a]
1810
+ - Updated dependencies [f9d772b]
1811
+ - Updated dependencies [97b6c21]
1812
+ - Updated dependencies [26ca2ad]
1813
+ - Updated dependencies [41ae65b]
1814
+ - Updated dependencies [184cfe1]
1815
+ - Updated dependencies [baac95a]
1816
+ - Updated dependencies [13220af]
1817
+ - Updated dependencies [29b45f6]
1818
+ - Updated dependencies [39b8d51]
1819
+ - Updated dependencies [17b323e]
1820
+ - Updated dependencies [b956e69]
1821
+ - Updated dependencies [33e58d8]
1822
+ - Updated dependencies [256b4c9]
1823
+ - Updated dependencies [c5ec15c]
1824
+ - Updated dependencies [fec3b1a]
1825
+ - Updated dependencies [b8e0941]
1826
+ - Updated dependencies [0c50f18]
1827
+ - Updated dependencies [285e36b]
1828
+ - Updated dependencies [1dae95a]
1829
+ - Updated dependencies [e32dae1]
1830
+ - Updated dependencies [30b11ad]
1831
+ - Updated dependencies [4aebea0]
1832
+ - Updated dependencies [f976774]
1833
+ - Updated dependencies [3d6badf]
1834
+ - Updated dependencies [25cb364]
1835
+ - Updated dependencies [a60539b]
1836
+ - Updated dependencies [de1b879]
1837
+ - Updated dependencies [c6678b1]
1838
+ - Updated dependencies [0638322]
1839
+ - Updated dependencies [e3782d2]
1840
+ - Updated dependencies [db0beb2]
1841
+ - Updated dependencies [997ce38]
1842
+ - Updated dependencies [ae0b9d3]
1843
+ - Updated dependencies [ad1785c]
1844
+ - Updated dependencies [3b469c8]
1845
+ - Updated dependencies [990a2d6]
1846
+ - Updated dependencies [37140f4]
1847
+ - Updated dependencies [1c84036]
1848
+ - Updated dependencies [1c84036]
1849
+ - Updated dependencies [6650259]
1850
+ - Updated dependencies [4f8b7f8]
1851
+ - Updated dependencies [9e6619f]
1852
+ - Updated dependencies [f6ae5e2]
1853
+ - Updated dependencies [eb97ce6]
1854
+ - Updated dependencies [7343376]
1855
+ - Updated dependencies [b2683a2]
1856
+ - Updated dependencies [dded788]
1857
+ - Updated dependencies [b45d463]
1858
+ - Updated dependencies [54a7830]
1859
+ - Updated dependencies [f3135a4]
1860
+ - Updated dependencies [b5696d3]
1861
+ - Updated dependencies [3f9d926]
1862
+ - Updated dependencies [e978ed5]
1863
+ - Updated dependencies [6a7f24e]
1864
+ - Updated dependencies [b3c96d6]
1865
+ - Updated dependencies [8d0ca91]
1866
+ - Updated dependencies [c30c8dd]
1867
+ - Updated dependencies [244d516]
1868
+ - Updated dependencies [deca847]
1869
+ - Updated dependencies [ac15833]
1870
+ - Updated dependencies [ac15833]
1871
+ - Updated dependencies [e2dffc9]
1872
+ - Updated dependencies [328abeb]
1873
+ - Updated dependencies [dd0d78f]
1874
+ - Updated dependencies [24d3e65]
1875
+ - Updated dependencies [95a7c8d]
1876
+ - Updated dependencies [e227156]
1877
+ - Updated dependencies [cc4e476]
1878
+ - Updated dependencies [92970c4]
1879
+ - Updated dependencies [d570eaa]
1880
+ - Updated dependencies [4b742f4]
1881
+ - Updated dependencies [42687ba]
1882
+ - Updated dependencies [6cd8f66]
1883
+ - Updated dependencies [24a0f14]
1884
+ - Updated dependencies [797a30f]
1885
+ - Updated dependencies [27ae632]
1886
+ - Updated dependencies [b4075c0]
1887
+ - Updated dependencies [9b85600]
1888
+ - Updated dependencies [e327c89]
1889
+ - Updated dependencies [2eaf5be]
1890
+ - Updated dependencies [bf7ab35]
1891
+ - Updated dependencies [99878d8]
1892
+ - Updated dependencies [3c13675]
1893
+ - Updated dependencies [63ab761]
1894
+ - Updated dependencies [0eb9f36]
1895
+ - Updated dependencies [ae582b7]
1896
+ - Updated dependencies [62d6f56]
1897
+ - Updated dependencies [51c2949]
1898
+ - Updated dependencies [a4b017e]
1899
+ - Updated dependencies [8732846]
1900
+ - Updated dependencies [559a2e2]
1901
+ - Updated dependencies [db11afd]
1902
+ - Updated dependencies [154075a]
1903
+ - Updated dependencies [582edef]
1904
+ - Updated dependencies [19f484f]
1905
+ - Updated dependencies [0a78a20]
1906
+ - Updated dependencies [615346d]
1907
+ - Updated dependencies [75dcc81]
1908
+ - Updated dependencies [55a12a8]
1909
+ - Updated dependencies [edfcf5a]
1910
+ - Updated dependencies [0a3e540]
1911
+ - Updated dependencies [c021b35]
1912
+ - Updated dependencies [f61dab1]
1913
+ - Updated dependencies [b0a05dd]
1914
+ - Updated dependencies [dd5ff19]
1915
+ - Updated dependencies [54997ff]
1916
+ - Updated dependencies [81f8498]
1917
+ - Updated dependencies [a782fa7]
1918
+ - Updated dependencies [1d6a23d]
1919
+ - Updated dependencies [0645133]
1920
+ - Updated dependencies [76e9df0]
1921
+ - Updated dependencies [0ecaa7d]
1922
+ - Updated dependencies [b24f93a]
1923
+ - Updated dependencies [6158e4c]
1924
+ - Updated dependencies [cff8641]
1925
+ - Updated dependencies [3f61eef]
1926
+ - Updated dependencies [c27b575]
1927
+ - Updated dependencies [84b275c]
1928
+ - Updated dependencies [0e6e76b]
1929
+ - Updated dependencies [bf43afa]
1930
+ - Updated dependencies [385ebc5]
1931
+ - Updated dependencies [858eafb]
1932
+ - Updated dependencies [a8c5509]
1933
+ - Updated dependencies [c2a8d23]
1934
+ - Updated dependencies [f4ed238]
1935
+ - Updated dependencies [0ffc423]
1936
+ - Updated dependencies [3cc4fe5]
1937
+ - Updated dependencies [cd5b19a]
1938
+ - Updated dependencies [cd5b19a]
1939
+ - Updated dependencies [17dc167]
1940
+ - Updated dependencies [20d23be]
1941
+ - Updated dependencies [20d23be]
1942
+ - Updated dependencies [2e3da72]
1943
+ - Updated dependencies [1263e40]
1944
+ - Updated dependencies [e6bc087]
1945
+ - Updated dependencies [9419df1]
1946
+ - Updated dependencies [8bab157]
1947
+ - Updated dependencies [a7557a7]
1948
+ - Updated dependencies [7d074ba]
1949
+ - Updated dependencies [6158e4c]
1950
+ - Updated dependencies [6158e4c]
1951
+ - Updated dependencies [52aad5c]
1952
+ - Updated dependencies [18d1a0a]
1953
+ - Updated dependencies [e420df3]
1954
+ - Updated dependencies [7fed09d]
1955
+ - Updated dependencies [58da8ae]
1956
+ - Updated dependencies [a8b9889]
1957
+ - Updated dependencies [138ad45]
1958
+ - Updated dependencies [138ad45]
1959
+ - Updated dependencies [5262f7d]
1960
+ - Updated dependencies [6aa029b]
1961
+ - Updated dependencies [2124d04]
1962
+ - Updated dependencies [be52115]
1963
+ - Updated dependencies [770cc5b]
1964
+ - Updated dependencies [1a88ce2]
1965
+ - Updated dependencies [a1a44d6]
1966
+ - Updated dependencies [e0a9c67]
1967
+ - Updated dependencies [5638529]
1968
+ - Updated dependencies [5638529]
1969
+ - Updated dependencies [d0fba91]
1970
+ - Updated dependencies [c476be0]
1971
+ - Updated dependencies [c82ff39]
1972
+ - Updated dependencies [6c3da53]
1973
+ - Updated dependencies [31987bd]
1974
+ - Updated dependencies [3c3ce15]
1975
+ - Updated dependencies [063119f]
1976
+ - Updated dependencies [e100589]
1977
+ - Updated dependencies [304f611]
1978
+ - Updated dependencies [e46ee77]
1979
+ - Updated dependencies [f9c8c4e]
1980
+ - Updated dependencies [6e9c8d2]
1981
+ - Updated dependencies [9547063]
1982
+ - Updated dependencies [3f6efd6]
1983
+ - Updated dependencies [55d18c6]
1984
+ - Updated dependencies [c4ab6d0]
1985
+ - Updated dependencies [0e9058b]
1986
+ - Updated dependencies [c4ab6d0]
1987
+ - Updated dependencies [5988b6b]
1988
+ - Updated dependencies [6158e4c]
1989
+ - Updated dependencies [00ccdf7]
1990
+ - Updated dependencies [9d9ed54]
1991
+ - Updated dependencies [4a1adb7]
1992
+ - Updated dependencies [4a1adb7]
1993
+ - Updated dependencies [4a1adb7]
1994
+ - Updated dependencies [50c73fe]
1995
+ - Updated dependencies [ca3de72]
1996
+ - Updated dependencies [83e3f83]
1997
+ - Updated dependencies [401611b]
1998
+ - Updated dependencies [2c0ddf2]
1999
+ - Updated dependencies [4abc0aa]
2000
+ - Updated dependencies [f560ded]
2001
+ - Updated dependencies [f560ded]
2002
+ - Updated dependencies [2b188fa]
2003
+ - Updated dependencies [b654d4e]
2004
+ - Updated dependencies [f68e0a0]
2005
+ - Updated dependencies [aea682a]
2006
+ - Updated dependencies [fcdc8ec]
2007
+ - Updated dependencies [2d576e4]
2008
+ - Updated dependencies [8366acc]
2009
+ - Updated dependencies [95e58a3]
2010
+ - Updated dependencies [9d7419b]
2011
+ - Updated dependencies [fc7db05]
2012
+ - Updated dependencies [fc7db05]
2013
+ - Updated dependencies [9ed8d0f]
2014
+ - Updated dependencies [c73cdb5]
2015
+ - Updated dependencies [6f5719e]
2016
+ - Updated dependencies [b34cc14]
2017
+ - Updated dependencies [ab18797]
2018
+ - Updated dependencies [d0097af]
2019
+ - Updated dependencies [432882b]
2020
+ - Updated dependencies [64dae8e]
2021
+ - Updated dependencies [b06e374]
2022
+ - Updated dependencies [06a8af5]
2023
+ - Updated dependencies [6a91586]
2024
+ - Updated dependencies [a04d7c6]
2025
+ - Updated dependencies [5ccc500]
2026
+ - Updated dependencies [f3c2bb0]
2027
+ - Updated dependencies [978507b]
2028
+ - Updated dependencies [778138e]
2029
+ - Updated dependencies [9801765]
2030
+ - Updated dependencies [9cebfca]
2031
+ - Updated dependencies [460575f]
2032
+ - Updated dependencies [d796c8d]
2033
+ - Updated dependencies [594704f]
2034
+ - Updated dependencies [d3995fe]
2035
+ - Updated dependencies [1b1d772]
2036
+ - Updated dependencies [d88e20f]
2037
+ - Updated dependencies [f66072d]
2038
+ - Updated dependencies [2d7304d]
2039
+ - Updated dependencies [636b236]
2040
+ - Updated dependencies [4172589]
2041
+ - Updated dependencies [d6d8fb9]
2042
+ - Updated dependencies [64d624d]
2043
+ - Updated dependencies [053fdc8]
2044
+ - Updated dependencies [41b7ce3]
2045
+ - Updated dependencies [ae476b8]
2046
+ - Updated dependencies [39f4309]
2047
+ - Updated dependencies [95bad12]
2048
+ - Updated dependencies [d2fb6ef]
2049
+ - Updated dependencies [7cd3987]
2050
+ - Updated dependencies [ee3b878]
2051
+ - Updated dependencies [e304a4e]
2052
+ - Updated dependencies [fda49e5]
2053
+ - Updated dependencies [490d9a9]
2054
+ - Updated dependencies [1117414]
2055
+ - Updated dependencies [6d63cd0]
2056
+ - Updated dependencies [fc62bb4]
2057
+ - Updated dependencies [41df893]
2058
+ - Updated dependencies [0cba1b7]
2059
+ - Updated dependencies [7c96c94]
2060
+ - Updated dependencies [4da5109]
2061
+ - Updated dependencies [00f3eb5]
2062
+ - Updated dependencies [1ec291c]
2063
+ - Updated dependencies [453dbaa]
2064
+ - Updated dependencies [95f8704]
2065
+ - Updated dependencies [f8cdbf2]
2066
+ - Updated dependencies [69a2163]
2067
+ - Updated dependencies [24e027e]
2068
+ - Updated dependencies [2c3cd1b]
2069
+ - Updated dependencies [e176053]
2070
+ - Updated dependencies [e30ed15]
2071
+ - Updated dependencies [90665e0]
2072
+ - Updated dependencies [8d3a529]
2073
+ - Updated dependencies [5ac2e2c]
2074
+ - Updated dependencies [194fae1]
2075
+ - Updated dependencies [63d54dd]
2076
+ - Updated dependencies [7e19d03]
2077
+ - Updated dependencies [b08b7eb]
2078
+ - Updated dependencies [1e946c9]
2079
+ - Updated dependencies [546ddf7]
2080
+ - Updated dependencies [864154e]
2081
+ - Updated dependencies [b023625]
2082
+ - Updated dependencies [75bd83d]
2083
+ - Updated dependencies [44d075b]
2084
+ - Updated dependencies [40c479a]
2085
+ - Updated dependencies [b4393e5]
2086
+ - Updated dependencies [971d387]
2087
+ - Updated dependencies [ee851c3]
2088
+ - Updated dependencies [6414dfd]
2089
+ - Updated dependencies [a8d5c71]
2090
+ - Updated dependencies [905b21f]
2091
+ - Updated dependencies [88e9109]
2092
+ - Updated dependencies [2c45966]
2093
+ - Updated dependencies [db3a600]
2094
+ - Updated dependencies [3a3db76]
2095
+ - Updated dependencies [0d723a3]
2096
+ - Updated dependencies [0c95d3d]
2097
+ - Updated dependencies [3e4fa2c]
2098
+ - Updated dependencies [b5b928a]
2099
+ - Updated dependencies [6fd2cf7]
2100
+ - Updated dependencies [5fa06c4]
2101
+ - Updated dependencies [52a43de]
2102
+ - Updated dependencies [195052f]
2103
+ - Updated dependencies [e4559d1]
2104
+ - Updated dependencies [2c71482]
2105
+ - Updated dependencies [129bcc5]
2106
+ - Updated dependencies [d3005f7]
2107
+ - Updated dependencies [1e7fe0a]
2108
+ - Updated dependencies [a26b9e4]
2109
+ - Updated dependencies [5ef9c4f]
2110
+ - Updated dependencies [46f0bb4]
2111
+ - Updated dependencies [06b82b8]
2112
+ - Updated dependencies [8ec11e1]
2113
+ - Updated dependencies [6f81384]
2114
+ - Updated dependencies [22ba927]
2115
+ - Updated dependencies [f8c70f4]
2116
+ - Updated dependencies [5d3a2d1]
2117
+ - Updated dependencies [8f1d995]
2118
+ - Updated dependencies [b362c1b]
2119
+ - Updated dependencies [f9c34df]
2120
+ - Updated dependencies [dddb942]
2121
+ - Updated dependencies [00c665e]
2122
+ - Updated dependencies [29754cf]
2123
+ - Updated dependencies [d7de534]
2124
+ - Updated dependencies [3c2b6f7]
2125
+ - Updated dependencies [6e88630]
2126
+ - Updated dependencies [b84dc18]
2127
+ - Updated dependencies [ac8abb0]
2128
+ - Updated dependencies [9d86e1d]
2129
+ - Updated dependencies [3a5817f]
2130
+ - Updated dependencies [99a3c2d]
2131
+ - Updated dependencies [5961030]
2132
+ - Updated dependencies [f24de8b]
2133
+ - Updated dependencies [c8ea8af]
2134
+ - Updated dependencies [9602dc8]
2135
+ - Updated dependencies [3777538]
2136
+ - Updated dependencies [3190414]
2137
+ - Updated dependencies [4e480f5]
2138
+ - Updated dependencies [38a123c]
2139
+ - Updated dependencies [299102e]
2140
+ - Updated dependencies [30c73cd]
2141
+ - Updated dependencies [830ed58]
2142
+ - Updated dependencies [d7acad6]
2143
+ - Updated dependencies [45a9aeb]
2144
+ - Updated dependencies [713db46]
2145
+ - Updated dependencies [c71e14d]
2146
+ - Updated dependencies [bf3a03c]
2147
+ - Updated dependencies [cb55718]
2148
+ - Updated dependencies [748494b]
2149
+ - Updated dependencies [5967be0]
2150
+ - Updated dependencies [831be72]
2151
+ - Updated dependencies [29cb85b]
2152
+ - Updated dependencies [3e028c8]
2153
+ - Updated dependencies [d0889e2]
2154
+ - Updated dependencies [ce503e5]
2155
+ - Updated dependencies [f20dcf0]
2156
+ - Updated dependencies [12402a9]
2157
+ - Updated dependencies [aff3d7a]
2158
+ - Updated dependencies [4ca30d0]
2159
+ - Updated dependencies [7a5da14]
2160
+ - Updated dependencies [fff9645]
2161
+ - Updated dependencies [9c3b7ce]
2162
+ - Updated dependencies [2c1c967]
2163
+ - Updated dependencies [9486ac6]
2164
+ - Updated dependencies [9486ac6]
2165
+ - Updated dependencies [4d5f9b4]
2166
+ - Updated dependencies [d6ceb8d]
2167
+ - Updated dependencies [dc4365c]
2168
+ - Updated dependencies [e321d52]
2169
+ - Updated dependencies [969ba84]
2170
+ - Updated dependencies [4c68077]
2171
+ - Updated dependencies [7977ff9]
2172
+ - Updated dependencies [3beef6d]
2173
+ - Updated dependencies [06b8c42]
2174
+ - Updated dependencies [46b9bc9]
2175
+ - Updated dependencies [45ac2cb]
2176
+ - Updated dependencies [b97790a]
2177
+ - Updated dependencies [dbd5194]
2178
+ - Updated dependencies [7c9b044]
2179
+ - Updated dependencies [d47de51]
2180
+ - Updated dependencies [3fe6463]
2181
+ - Updated dependencies [b392674]
2182
+ - Updated dependencies [4f3a1e2]
2183
+ - Updated dependencies [31ab372]
2184
+ - Updated dependencies [846889b]
2185
+ - Updated dependencies [2acd8e1]
2186
+ - Updated dependencies [26896c6]
2187
+ - Updated dependencies [a439e16]
2188
+ - Updated dependencies [67fc3b0]
2189
+ - Updated dependencies [33a3b3c]
2190
+ - Updated dependencies [b87f15b]
2191
+ - Updated dependencies [9409eb9]
2192
+ - Updated dependencies [045d20b]
2193
+ - Updated dependencies [a2d2515]
2194
+ - Updated dependencies [c18d099]
2195
+ - Updated dependencies [adb2a86]
2196
+ - Updated dependencies [03380aa]
2197
+ - Updated dependencies [4562ea5]
2198
+ - Updated dependencies [3619792]
2199
+ - Updated dependencies [3561bd2]
2200
+ - Updated dependencies [bf97b98]
2201
+ - Updated dependencies [320374d]
2202
+ - Updated dependencies [b0d308d]
2203
+ - Updated dependencies [40f34b4]
2204
+ - Updated dependencies [bd0376d]
2205
+ - Updated dependencies [8063bcb]
2206
+ - Updated dependencies [b74a859]
2207
+ - Updated dependencies [d4493fd]
2208
+ - Updated dependencies [240b80f]
2209
+ - Updated dependencies [77cb489]
2210
+ - Updated dependencies [bfaa158]
2211
+ - Updated dependencies [777e5c6]
2212
+ - Updated dependencies [0c386dd]
2213
+ - Updated dependencies [9e37d9b]
2214
+ - Updated dependencies [5ad86dd]
2215
+ - Updated dependencies [16a725f]
2216
+ - Updated dependencies [c4326fe]
2217
+ - Updated dependencies [4dfdcc3]
2218
+ - Updated dependencies [6a449fc]
2219
+ - Updated dependencies [446d93d]
2220
+ - Updated dependencies [ecd9cb2]
2221
+ - Updated dependencies [98d4108]
2222
+ - Updated dependencies [0e3b3be]
2223
+ - Updated dependencies [a29ae2d]
2224
+ - Updated dependencies [220c18d]
2225
+ - Updated dependencies [eeb6c2f]
2226
+ - Updated dependencies [00d3f09]
2227
+ - Updated dependencies [4388f71]
2228
+ - Updated dependencies [0b1ac58]
2229
+ - Updated dependencies [c93b4d5]
2230
+ - Updated dependencies [c1fe272]
2231
+ - Updated dependencies [3cab570]
2232
+ - Updated dependencies [8ad218d]
2233
+ - Updated dependencies [3e41187]
2234
+ - Updated dependencies [5f78953]
2235
+ - Updated dependencies [639114c]
2236
+ - Updated dependencies [639114c]
2237
+ - Updated dependencies [1490691]
2238
+ - Updated dependencies [1f31d3a]
2239
+ - Updated dependencies [d1842ab]
2240
+ - Updated dependencies [854cba3]
2241
+ - Updated dependencies [78ca238]
2242
+ - Updated dependencies [d8ec8d6]
2243
+ - Updated dependencies [351eb31]
2244
+ - Updated dependencies [866cd1d]
2245
+ - Updated dependencies [20c04b2]
2246
+ - Updated dependencies [01c9023]
2247
+ - Updated dependencies [48c19bd]
2248
+ - Updated dependencies [a6d8b8d]
2249
+ - Updated dependencies [4b5bb95]
2250
+ - Updated dependencies [b652514]
2251
+ - Updated dependencies [adbda1b]
2252
+ - Updated dependencies [adbda1b]
2253
+ - Updated dependencies [8952395]
2254
+ - Updated dependencies [e2b3826]
2255
+ - Updated dependencies [a338037]
2256
+ - Updated dependencies [0348bc9]
2257
+ - Updated dependencies [e8c553b]
2258
+ - Updated dependencies [2e32ed4]
2259
+ - Updated dependencies [3ed3eec]
2260
+ - Updated dependencies [7c3df8f]
2261
+ - Updated dependencies [a4514e8]
2262
+ - Updated dependencies [6411def]
2263
+ - Updated dependencies [db3896c]
2264
+ - Updated dependencies [b9f5ff1]
2265
+ - Updated dependencies [e75f4c9]
2266
+ - Updated dependencies [19f1639]
2267
+ - Updated dependencies [4704aa4]
2268
+ - Updated dependencies [47547d0]
2269
+ - Updated dependencies [1bee5d0]
2270
+ - Updated dependencies [63a8828]
2271
+ - Updated dependencies [b61d7d8]
2272
+ - Updated dependencies [858cd72]
2273
+ - Updated dependencies [cfc9b6d]
2274
+ - Updated dependencies [dc0a60b]
2275
+ - Updated dependencies [554f2b6]
2276
+ - Updated dependencies [72f55c9]
2277
+ - Updated dependencies [26e06d7]
2278
+ - Updated dependencies [669d71b]
2279
+ - Updated dependencies [ed27d7c]
2280
+ - Updated dependencies [52c8cf7]
2281
+ - Updated dependencies [2ceb43a]
2282
+ - Updated dependencies [7cdd2b9]
2283
+ - Updated dependencies [52c8cf7]
2284
+ - Updated dependencies [3399704]
2285
+ - Updated dependencies [02fe257]
2286
+ - Updated dependencies [71a4a53]
2287
+ - Updated dependencies [7bf244b]
2288
+ - Updated dependencies [f0bb9fa]
2289
+ - Updated dependencies [81a2eb1]
2290
+ - Updated dependencies [caa0cd3]
2291
+ - Updated dependencies [caa0cd3]
2292
+ - Updated dependencies [20cb8db]
2293
+ - Updated dependencies [25c7d58]
2294
+ - Updated dependencies [00d2fa6]
2295
+ - Updated dependencies [77b2a18]
2296
+ - Updated dependencies [c6198c2]
2297
+ - Updated dependencies [721d1e0]
2298
+ - Updated dependencies [c2f0f48]
2299
+ - Updated dependencies [1237ae4]
2300
+ - Updated dependencies [2f61238]
2301
+ - Updated dependencies [51eb515]
2302
+ - Updated dependencies [c354ce5]
2303
+ - Updated dependencies [8fe8e5c]
2304
+ - Updated dependencies [feac439]
2305
+ - Updated dependencies [9ae871d]
2306
+ - Updated dependencies [efbd566]
2307
+ - Updated dependencies [2a5bf45]
2308
+ - Updated dependencies [9587fc9]
2309
+ - Updated dependencies [e62c44e]
2310
+ - Updated dependencies [daf9d57]
2311
+ - Updated dependencies [fe8f451]
2312
+ - Updated dependencies [23b9958]
2313
+ - Updated dependencies [c15d7ec]
2314
+ - Updated dependencies [5d0876c]
2315
+ - Updated dependencies [f7ace0a]
2316
+ - Updated dependencies [b041b9c]
2317
+ - Updated dependencies [ce2aaef]
2318
+ - Updated dependencies [544ecba]
2319
+ - Updated dependencies [2ce2612]
2320
+ - Updated dependencies [bc640ec]
2321
+ - Updated dependencies [1e215c4]
2322
+ - Updated dependencies [da6e191]
2323
+ - Updated dependencies [3e377c9]
2324
+ - Updated dependencies [a3eb5d0]
2325
+ - Updated dependencies [4ce14f1]
2326
+ - Updated dependencies [aef97e5]
2327
+ - Updated dependencies [2af1fa7]
2328
+ - Updated dependencies [c14d3a0]
2329
+ - Updated dependencies [a137d0c]
2330
+ - Updated dependencies [caf477f]
2331
+ - Updated dependencies [f6375da]
2332
+ - Updated dependencies [967e5d8]
2333
+ - Updated dependencies [c907a9c]
2334
+ - Updated dependencies [a4611b3]
2335
+ - Updated dependencies [20316ba]
2336
+ - Updated dependencies [d3499b3]
2337
+ - Updated dependencies [91f9276]
2338
+ - Updated dependencies [309c75e]
2339
+ - Updated dependencies [c9f9bae]
2340
+ - Updated dependencies [18897a4]
2341
+ - Updated dependencies [8b7ea39]
2342
+ - Updated dependencies [a915064]
2343
+ - Updated dependencies [dcbf0b2]
2344
+ - Updated dependencies [52cac38]
2345
+ - Updated dependencies [93fea2e]
2346
+ - Updated dependencies [1422a92]
2347
+ - Updated dependencies [d05fe17]
2348
+ - Updated dependencies [a480f79]
2349
+ - Updated dependencies [f08d1a8]
2350
+ - Updated dependencies [64a252d]
2351
+ - Updated dependencies [786bc91]
2352
+ - Updated dependencies [75fca96]
2353
+ - Updated dependencies [7ca6ddd]
2354
+ - Updated dependencies [f1cd290]
2355
+ - Updated dependencies [5a41ce7]
2356
+ - Updated dependencies [8d50bc2]
2357
+ - Updated dependencies [604476d]
2358
+ - Updated dependencies [d1bebb0]
2359
+ - Updated dependencies [95bf128]
2360
+ - Updated dependencies [335abea]
2361
+ - Updated dependencies [edea22a]
2362
+ - Updated dependencies [0f5cadf]
2363
+ - Updated dependencies [4f9f1ee]
2364
+ - Updated dependencies [66e8b2a]
2365
+ - Updated dependencies [aa083cd]
2366
+ - Updated dependencies [12b5992]
2367
+ - Updated dependencies [b93e245]
2368
+ - Updated dependencies [c842594]
2369
+ - Updated dependencies [290de37]
2370
+ - Updated dependencies [1cfdff8]
2371
+ - Updated dependencies [e1c27e4]
2372
+ - Updated dependencies [8c8da45]
2373
+ - Updated dependencies [8cd8eb5]
2374
+ - Updated dependencies [cf1d29e]
2375
+ - Updated dependencies [1bd79c8]
2376
+ - Updated dependencies [af9e957]
2377
+ - Updated dependencies [b1030c7]
2378
+ - Updated dependencies [c974edf]
2379
+ - Updated dependencies [592402e]
2380
+ - Updated dependencies [ad852b6]
2381
+ - Updated dependencies [6778809]
2382
+ - Updated dependencies [7fb22a1]
2383
+ - Updated dependencies [ad66d79]
2384
+ - Updated dependencies [0758bd8]
2385
+ - Updated dependencies [ee4d19f]
2386
+ - Updated dependencies [37149ec]
2387
+ - Updated dependencies [496d31d]
2388
+ - Updated dependencies [0ea7054]
2389
+ - Updated dependencies [9a853f2]
2390
+ - Updated dependencies [cb847fd]
2391
+ - Updated dependencies [ee70287]
2392
+ - Updated dependencies [3e98e13]
2393
+ - Updated dependencies [a695f50]
2394
+ - Updated dependencies [fc32921]
2395
+ - Updated dependencies [4eaa835]
2396
+ - Updated dependencies [8f9d87a]
2397
+ - Updated dependencies [b1777ae]
2398
+ - Updated dependencies [24845c4]
2399
+ - Updated dependencies [6f864cf]
2400
+ - Updated dependencies [24d1edd]
2401
+ - Updated dependencies [645087c]
2402
+ - Updated dependencies [33f4a19]
2403
+ - Updated dependencies [6e9a3d4]
2404
+ - Updated dependencies [4a292d2]
2405
+ - Updated dependencies [5323168]
2406
+ - Updated dependencies [841dd2b]
2407
+ - Updated dependencies [3014fc0]
2408
+ - Updated dependencies [dacb402]
2409
+ - Updated dependencies [846cec0]
2410
+ - Updated dependencies [91facae]
2411
+ - Updated dependencies [b38014e]
2412
+ - Updated dependencies [e2feb13]
2413
+ - Updated dependencies [474797d]
2414
+ - Updated dependencies [704e695]
2415
+ - Updated dependencies [9dcc545]
2416
+ - Updated dependencies [d7fecfb]
2417
+ - Updated dependencies [c13d39e]
2418
+ - Updated dependencies [a407bd6]
2419
+ - Updated dependencies [317dbce]
2420
+ - Updated dependencies [309728c]
2421
+ - Updated dependencies [e6ec217]
2422
+ - Updated dependencies [aa08d7e]
2423
+ - Updated dependencies [3a43a15]
2424
+ - Updated dependencies [868e825]
2425
+ - Updated dependencies [f76f436]
2426
+ - Updated dependencies [ce45a03]
2427
+ - Updated dependencies [7cf6f38]
2428
+ - Updated dependencies [fd9c50a]
2429
+ - Updated dependencies [421544b]
2430
+ - Updated dependencies [5cc8c28]
2431
+ - Updated dependencies [fb01022]
2432
+ - Updated dependencies [e9d9212]
2433
+ - Updated dependencies [ecfb693]
2434
+ - Updated dependencies [40a7c53]
2435
+ - Updated dependencies [abc1b18]
2436
+ - Updated dependencies [81a51db]
2437
+ - Updated dependencies [67749c7]
2438
+ - Updated dependencies [507b61b]
2439
+ - Updated dependencies [512c84b]
2440
+ - Updated dependencies [c300267]
2441
+ - Updated dependencies [fb3a101]
2442
+ - Updated dependencies [d4733f2]
2443
+ - Updated dependencies [7c9145f]
2444
+ - Updated dependencies [1570eac]
2445
+ - Updated dependencies [f391ede]
2446
+ - Updated dependencies [f5cfbbd]
2447
+ - Updated dependencies [f5cfbbd]
2448
+ - Updated dependencies [8b532cb]
2449
+ - Updated dependencies [64c3cdd]
2450
+ - Updated dependencies [4d65991]
2451
+ - Updated dependencies [c42554e]
2452
+ - Updated dependencies [555b4ec]
2453
+ - Updated dependencies [1ccfc23]
2454
+ - Updated dependencies [542718f]
2455
+ - Updated dependencies [7f27bc5]
2456
+ - Updated dependencies [0a174f3]
2457
+ - Updated dependencies [cc00c59]
2458
+ - Updated dependencies [676f677]
2459
+ - Updated dependencies [f95b140]
2460
+ - Updated dependencies [541ce4e]
2461
+ - Updated dependencies [6479086]
2462
+ - Updated dependencies [d79f525]
2463
+ - Updated dependencies [d1865d2]
2464
+ - Updated dependencies [ab77513]
2465
+ - Updated dependencies [55ba3ff]
2466
+ - Updated dependencies [0b138da]
2467
+ - Updated dependencies [f1190b0]
2468
+ - Updated dependencies [561abef]
2469
+ - Updated dependencies [ef52001]
2470
+ - Updated dependencies [6a4680b]
2471
+ - Updated dependencies [c3a4273]
2472
+ - Updated dependencies [abf710d]
2473
+ - Updated dependencies [093af32]
2474
+ - Updated dependencies [6df26f0]
2475
+ - Updated dependencies [1bd1be7]
2476
+ - Updated dependencies [d234fa9]
2477
+ - Updated dependencies [adf5812]
2478
+ - Updated dependencies [e36acd4]
2479
+ - Updated dependencies [5058336]
2480
+ - Updated dependencies [2f6b2bf]
2481
+ - Updated dependencies [2028b31]
2482
+ - Updated dependencies [16a1a51]
2483
+ - Updated dependencies [63601ab]
2484
+ - Updated dependencies [c372b29]
2485
+ - Updated dependencies [152f0a7]
2486
+ - Updated dependencies [8693b85]
2487
+ - Updated dependencies [e82dad1]
2488
+ - Updated dependencies [58b7b3d]
2489
+ - Updated dependencies [e77a003]
2490
+ - Updated dependencies [84defab]
2491
+ - Updated dependencies [681d3f1]
2492
+ - Updated dependencies [969d4f2]
2493
+ - Updated dependencies [88561fd]
2494
+ - Updated dependencies [f3bc481]
2495
+ - Updated dependencies [b79aac2]
2496
+ - Updated dependencies [93fc0e7]
2497
+ - Updated dependencies [0601af1]
2498
+ - Updated dependencies [a4b723f]
2499
+ - Updated dependencies [2b10ca0]
2500
+ - Updated dependencies [7db4a81]
2501
+ - Updated dependencies [19a0b0e]
2502
+ - Updated dependencies [526fc11]
2503
+ - Updated dependencies [f8e3e9a]
2504
+ - Updated dependencies [b9d47ec]
2505
+ - Updated dependencies [3b6bc69]
2506
+ - Updated dependencies [6214db6]
2507
+ - Updated dependencies [6732df4]
2508
+ - Updated dependencies [fe9e0d0]
2509
+ - Updated dependencies [63fb72c]
2510
+ - Updated dependencies [804831c]
2511
+ - Updated dependencies [9f5c017]
2512
+ - Updated dependencies [c271413]
2513
+ - Updated dependencies [279e48e]
2514
+ - Updated dependencies [4784bb3]
2515
+ - Updated dependencies [8700d6d]
2516
+ - Updated dependencies [8db2a0f]
2517
+ - Updated dependencies [689953a]
2518
+ - Updated dependencies [30443fb]
2519
+ - Updated dependencies [8d3dbb2]
2520
+ - Updated dependencies [efc1c9c]
2521
+ - Updated dependencies [7d6439c]
2522
+ - Updated dependencies [da45e6b]
2523
+ - Updated dependencies [7533465]
2524
+ - Updated dependencies [835f0f3]
2525
+ - Updated dependencies [6d5db7b]
2526
+ - Updated dependencies [a9d97be]
2527
+ - Updated dependencies [ed35b44]
2528
+ - Updated dependencies [e6040ef]
2529
+ - Updated dependencies [9ba7e9c]
2530
+ - Updated dependencies [729e851]
2531
+ - Updated dependencies [96919a4]
2532
+ - Updated dependencies [345e24a]
2533
+ - Updated dependencies [3bc1bb4]
2534
+ - Updated dependencies [20b507a]
2535
+ - Updated dependencies [2e471dc]
2536
+ - Updated dependencies [6748587]
2537
+ - Updated dependencies [be50942]
2538
+ - Updated dependencies [775e079]
2539
+ - Updated dependencies [7e8b3c0]
2540
+ - Updated dependencies [53374dc]
2541
+ - Updated dependencies [f6fb83f]
2542
+ - Updated dependencies [2049b03]
2543
+ - Updated dependencies [2bf34f7]
2544
+ - Updated dependencies [15b33ae]
2545
+ - Updated dependencies [7cbc724]
2546
+ - Updated dependencies [4a94c38]
2547
+ - Updated dependencies [7098eed]
2548
+ - Updated dependencies [3df7c5c]
2549
+ - Updated dependencies [fb91ac9]
2550
+ - Updated dependencies [fb91ac9]
2551
+ - Updated dependencies [641fb55]
2552
+ - Updated dependencies [8524372]
2553
+ - Updated dependencies [7cbefa5]
2554
+ - Updated dependencies [72d6587]
2555
+ - Updated dependencies [a272a4f]
2556
+ - Updated dependencies [55f39ee]
2557
+ - Updated dependencies [502eb58]
2558
+ - Updated dependencies [0ce32d5]
2559
+ - Updated dependencies [0970a0e]
2560
+ - Updated dependencies [e427e9c]
2561
+ - Updated dependencies [bbc9dc3]
2562
+ - Updated dependencies [02f1813]
2563
+ - Updated dependencies [1ef89c0]
2564
+ - Updated dependencies [ba0b61a]
2565
+ - Updated dependencies [ba0b61a]
2566
+ - Updated dependencies [ba0b61a]
2567
+ - Updated dependencies [ac716ff]
2568
+ - Updated dependencies [697aabc]
2569
+ - Updated dependencies [f0f3cd5]
2570
+ - Updated dependencies [ab856ed]
2571
+ - Updated dependencies [20f3e65]
2572
+ - Updated dependencies [bbba098]
2573
+ - Updated dependencies [87af769]
2574
+ - Updated dependencies [3be720e]
2575
+ - Updated dependencies [80a0ecd]
2576
+ - Updated dependencies [43c0d17]
2577
+ - Updated dependencies [c3df43a]
2578
+ - Updated dependencies [d16d0e9]
2579
+ - Updated dependencies [bbe57fd]
2580
+ - Updated dependencies [272a530]
2581
+ - Updated dependencies [462bafb]
2582
+ - Updated dependencies [1779e8d]
2583
+ - Updated dependencies [f7fcc2c]
2584
+ - Updated dependencies [f0f4d6c]
2585
+ - Updated dependencies [4128188]
2586
+ - Updated dependencies [b253c4e]
2587
+ - Updated dependencies [78a9c67]
2588
+ - Updated dependencies [4a7ef0d]
2589
+ - Updated dependencies [4598f6d]
2590
+ - Updated dependencies [dea17b4]
2591
+ - Updated dependencies [89bb77a]
2592
+ - Updated dependencies [06611e4]
2593
+ - Updated dependencies [44152c4]
2594
+ - Updated dependencies [3939545]
2595
+ - Updated dependencies [0ee6e31]
2596
+ - Updated dependencies [66abbde]
2597
+ - Updated dependencies [dc3893d]
2598
+ - Updated dependencies [1bbaa16]
2599
+ - Updated dependencies [6ee259a]
2600
+ - Updated dependencies [7649f43]
2601
+ - Updated dependencies [d0f52e4]
2602
+ - Updated dependencies [e708426]
2603
+ - Updated dependencies [33e1697]
2604
+ - Updated dependencies [3b6d53b]
2605
+ - Updated dependencies [a017617]
2606
+ - Updated dependencies [276d174]
2607
+ - Updated dependencies [2982ed9]
2608
+ - Updated dependencies [741864f]
2609
+ - Updated dependencies [a8198de]
2610
+ - Updated dependencies [0c789a4]
2611
+ - Updated dependencies [05a49f2]
2612
+ - Updated dependencies [b234a84]
2613
+ - Updated dependencies [a78cd37]
2614
+ - Updated dependencies [5ea623e]
2615
+ - Updated dependencies [dc49246]
2616
+ - Updated dependencies [5eabe86]
2617
+ - Updated dependencies [ca5d671]
2618
+ - Updated dependencies [32bf2d6]
2619
+ - Updated dependencies [ff0c384]
2620
+ - Updated dependencies [af4fb29]
2621
+ - Updated dependencies [c698a81]
2622
+ - Updated dependencies [ff5ef1c]
2623
+ - Updated dependencies [befd40c]
2624
+ - Updated dependencies [905913c]
2625
+ - Updated dependencies [9a97800]
2626
+ - Updated dependencies [6358a2d]
2627
+ - Updated dependencies [6bca0e4]
2628
+ - Updated dependencies [81c0bc4]
2629
+ - Updated dependencies [3c76801]
2630
+ - Updated dependencies [d06fba8]
2631
+ - Updated dependencies [60500cb]
2632
+ - Updated dependencies [2fcefb9]
2633
+ - Updated dependencies [77f846a]
2634
+ - Updated dependencies [bc5870c]
2635
+ - Updated dependencies [b55a346]
2636
+ - Updated dependencies [065bba7]
2637
+ - Updated dependencies [f760064]
2638
+ - Updated dependencies [dd19463]
2639
+ - Updated dependencies [6791717]
2640
+ - Updated dependencies [8ea3bee]
2641
+ - Updated dependencies [100547e]
2642
+ - Updated dependencies [3a58149]
2643
+ - Updated dependencies [6d1c155]
2644
+ - Updated dependencies [d7573b3]
2645
+ - Updated dependencies [bf3edfe]
2646
+ - Updated dependencies [2c8474c]
2647
+ - Updated dependencies [6ce89da]
2648
+ - Updated dependencies [0e05aac]
2649
+ - Updated dependencies [ae61ad4]
2650
+ - Updated dependencies [5aed9e4]
2651
+ - Updated dependencies [83c77dc]
2652
+ - Updated dependencies [3c9fca3]
2653
+ - Updated dependencies [18a8e7d]
2654
+ - Updated dependencies [e7957ab]
2655
+ - Updated dependencies [f7e34ca]
2656
+ - Updated dependencies [e719ebd]
2657
+ - Updated dependencies [516583b]
2658
+ - Updated dependencies [f9e4f91]
2659
+ - Updated dependencies [6ef48b1]
2660
+ - Updated dependencies [fa429cf]
2661
+ - Updated dependencies [ed8df3e]
2662
+ - Updated dependencies [fe76ece]
2663
+ - Updated dependencies [8b446f5]
2664
+ - Updated dependencies [8e74b27]
2665
+ - Updated dependencies [7102b20]
2666
+ - Updated dependencies [8ebd57f]
2667
+ - Updated dependencies [617707a]
2668
+ - Updated dependencies [c40f3b8]
2669
+ - Updated dependencies [58770f3]
2670
+ - Updated dependencies [aefe428]
2671
+ - Updated dependencies [485f096]
2672
+ - Updated dependencies [7357447]
2673
+ - Updated dependencies [199d31b]
2674
+ - Updated dependencies [b655a9d]
2675
+ - Updated dependencies [3e01cb5]
2676
+ - Updated dependencies [7138bc1]
2677
+ - Updated dependencies [cef27e2]
2678
+ - Updated dependencies [4e8622b]
2679
+ - Updated dependencies [dffd752]
2680
+ - Updated dependencies [06973aa]
2681
+ - Updated dependencies [50798f3]
2682
+ - Updated dependencies [6a576c9]
2683
+ - Updated dependencies [0b12a33]
2684
+ - Updated dependencies [105f3c5]
2685
+ - Updated dependencies [3ccd9e8]
2686
+ - Updated dependencies [689b979]
2687
+ - Updated dependencies [c70f865]
2688
+ - Updated dependencies [e546222]
2689
+ - Updated dependencies [fd13f52]
2690
+ - Updated dependencies [d7bd274]
2691
+ - Updated dependencies [98c3a74]
2692
+ - Updated dependencies [fffa30d]
2693
+ - Updated dependencies [ebce5a3]
2694
+ - Updated dependencies [fb336df]
2695
+ - Updated dependencies [6c1b105]
2696
+ - Updated dependencies [4dc80d0]
2697
+ - Updated dependencies [9d9040d]
2698
+ - Updated dependencies [20e317c]
2699
+ - Updated dependencies [0fce2ef]
2700
+ - Updated dependencies [42df928]
2701
+ - Updated dependencies [0e2ddd4]
2702
+ - Updated dependencies [b7479ab]
2703
+ - Updated dependencies [9850c6e]
2704
+ - Updated dependencies [de570cc]
2705
+ - Updated dependencies [b2ea297]
2706
+ - Updated dependencies [5b5a5c3]
2707
+ - Updated dependencies [14582b8]
2708
+ - Updated dependencies [51e144e]
2709
+ - Updated dependencies [19cbf10]
2710
+ - Updated dependencies [7e50e84]
2711
+ - Updated dependencies [ab92940]
2712
+ - Updated dependencies [a691c0b]
2713
+ - Updated dependencies [0b1326d]
2714
+ - Updated dependencies [1e66879]
2715
+ - Updated dependencies [c5200f0]
2716
+ - Updated dependencies [af3861f]
2717
+ - Updated dependencies [2a79e84]
2718
+ - Updated dependencies [2609812]
2719
+ - Updated dependencies [515f171]
2720
+ - Updated dependencies [1f4e029]
2721
+ - Updated dependencies [4f14ad7]
2722
+ - Updated dependencies [258d264]
2723
+ - Updated dependencies [cac64b3]
2724
+ - Updated dependencies [17fbbaf]
2725
+ - Updated dependencies [d8cf1cb]
2726
+ - Updated dependencies [0d1e702]
2727
+ - Updated dependencies [b03ba3a]
2728
+ - Updated dependencies [0068348]
2729
+ - Updated dependencies [641543f]
2730
+ - Updated dependencies [8a44390]
2731
+ - Updated dependencies [8033ad1]
2732
+ - Updated dependencies [fa140b8]
2733
+ - Updated dependencies [71cba28]
2734
+ - Updated dependencies [190fbd0]
2735
+ - Updated dependencies [c00bf28]
2736
+ - Updated dependencies [23705b7]
2737
+ - Updated dependencies [93127bd]
2738
+ - Updated dependencies [f2158ec]
2739
+ - Updated dependencies [759606e]
2740
+ - Updated dependencies [fd8dace]
2741
+ - Updated dependencies [72ffc34]
2742
+ - Updated dependencies [a51fa0c]
2743
+ - Updated dependencies [51f3d8d]
2744
+ - Updated dependencies [bf28341]
2745
+ - Updated dependencies [78cbdb5]
2746
+ - Updated dependencies [b7543a9]
2747
+ - Updated dependencies [6c6cee7]
2748
+ - Updated dependencies [42887e0]
2749
+ - Updated dependencies [83fe6e7]
2750
+ - Updated dependencies [d1ab06f]
2751
+ - Updated dependencies [38a9568]
2752
+ - Updated dependencies [f90b8fb]
2753
+ - Updated dependencies [91783c4]
2754
+ - Updated dependencies [982885d]
2755
+ - Updated dependencies [dba7d84]
2756
+ - Updated dependencies [ca39427]
2757
+ - Updated dependencies [bd09957]
2758
+ - Updated dependencies [5a07e67]
2759
+ - Updated dependencies [2d36552]
2760
+ - Updated dependencies [45d8288]
2761
+ - Updated dependencies [b2437a7]
2762
+ - Updated dependencies [f157423]
2763
+ - Updated dependencies [7a90afd]
2764
+ - Updated dependencies [eddc1dd]
2765
+ - Updated dependencies [490f482]
2766
+ - Updated dependencies [27308c5]
2767
+ - Updated dependencies [8689166]
2768
+ - Updated dependencies [c9327c9]
2769
+ - Updated dependencies [920165d]
2770
+ - Updated dependencies [9101be5]
2771
+ - Updated dependencies [f53a8d0]
2772
+ - Updated dependencies [30266cf]
2773
+ - Updated dependencies [968dc1e]
2774
+ - Updated dependencies [57f9b07]
2775
+ - Updated dependencies [3c73d99]
2776
+ - Updated dependencies [d91aed9]
2777
+ - Updated dependencies [ed71d9e]
2778
+ - Updated dependencies [7776fc2]
2779
+ - Updated dependencies [e76634c]
2780
+ - Updated dependencies [c86185e]
2781
+ - Updated dependencies [fb96ecb]
2782
+ - Updated dependencies [1170ed1]
2783
+ - Updated dependencies [92814db]
2784
+ - Updated dependencies [4d73b07]
2785
+ - @object-ui/plugin-detail@17.7.0
2786
+ - @object-ui/react@17.7.0
2787
+ - @object-ui/core@17.7.0
2788
+ - @object-ui/types@17.7.0
2789
+ - @object-ui/i18n@17.7.0
2790
+ - @object-ui/components@17.7.0
2791
+ - @object-ui/mobile@17.7.0
2792
+ - @object-ui/permissions@17.7.0
2793
+
3
2794
  ## 17.6.0
4
2795
 
5
2796
  ### Patch Changes