@object-ui/plugin-calendar 17.6.0 → 18.0.0

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