@object-ui/layout 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,2011 @@
1
1
  # @object-ui/layout
2
2
 
3
+ ## 18.0.0
4
+
5
+ ### Dependency floors
6
+
7
+ Computed from `.objectstack-sha` `06cab4849a8a`: the earliest published `@objectstack/spec` that contains it is `18.0.0`.
8
+
9
+ - `@objectstack/spec` (`dependencies`): `^18.0.0-next.1` → `^18.0.0`
10
+
11
+ ### Major Changes
12
+
13
+ - 6f3299f: objectui moves to major 18, following `@objectstack/*` from 17 to 18 (objectui#12334). objectui's major is not a count of its own breaking changes: it tracks the major of the `@objectstack/spec` its packages depend on, so that the same major means compatible across the two projects. These packages already declare `@objectstack/*` on the 18 line (objectui#12030), so every package in the fixed release group crosses to 18 together. It is the one `major` that rule admits: objectui's own breaking changes ship as `minor`, described in their entries.
14
+
15
+ The 18 line is released from Changesets pre mode on the `next` tag (`.changeset/pre.json`), as `@objectstack/*` 18 is: these releases are `18.0.0-next.N` on the npm `next` dist-tag, and they do not move `latest`. The first `18.0.0` on `latest` comes when `@objectstack` 18 is generally available and this repository leaves pre mode.
16
+
17
+ What a consumer must do to take it is in the `@objectstack/*` 18 entry of this release (objectui#12030): move its own `@objectstack/*` packages to the 18 line at the same time.
18
+
19
+ ### Minor Changes
20
+
21
+ - 9fc68aa: Screen readers can name and reach the controls of the view tab bar, the settings form, the sidebar menus, the table's selection column and the percent cell (objectui#11690). axe-core (wcag2a + wcag2aa) on an object list page and on a Setup settings page reported the faults below; each is fixed where it is produced and pinned by an axe run on that component.
22
+
23
+ - **View tab bar (`ViewTabBar`).** The "+" add-view button is named, through the existing `view.addView` key, and its tooltip reads the same translated words instead of a hard-coded "Add View". Each view is now a `<button>`; the current one carries `aria-current="true"`. The views were `role="tab"` elements with no `tablist`, and the active view's actions button sat inside its tab, so it was a control inside a control. That button is now the view button's sibling, still named "View actions for …" and still one Tab stop away. Tab roles could not hold it: a tab's content is presentational and a tablist may contain only tabs. These views never had the tabs keyboard model (arrow keys, a tab panel) either. Every view stays its own Tab stop. When the bar is not reorderable, as the console renders it, Enter or Space switches to the focused view. With drag-to-reorder on, Enter or Space on a view starts a keyboard drag instead, as it did before this change, so a view is switched to by click. The rename box is now outside the view button and is named through `view.rename`. With drag-to-reorder on, the sortable attributes describe the view as a button. Breaking for anything that queried the bar by `role="tab"` or `aria-selected`: query `data-testid="view-tab-ID"` or `aria-current` instead.
24
+ - **Settings form (`@object-ui/console`).** Each row's label is bound to its control, so text, number, password, textarea, JSON, colour, switch and select controls are named by it. Clicking a label now focuses or toggles its control. A radio group and a multiselect checkbox group are named by the row label too.
25
+ - **Sidebar menus (`NavigationRenderer`).** With drag-to-reorder on (the desktop default), every row was wrapped in a `<div>` between the menu's `<ul>` and its `<li>`. The sortable node is now the row's own `<li>`. A separator and a nested group inside a menu are now list items too: the separator's item is hidden from assistive tech, and a top-level group is unchanged.
26
+ - **Table selection column (`data-table`).** The select-all checkbox and each row's checkbox are named through the existing `table.selectAllRows` and `table.selectRow` keys.
27
+ - **Percent cell (`PercentCellRenderer`).** The progress bar is named by the formatted value beside it (`aria-labelledby`), so the name is in the viewer's locale.
28
+
29
+ No language-pack key, export or prop is added; every new name reads a key the packs already carried.
30
+ - c5406c2: Depend on the `@objectstack/*` 18 prerelease line (objectui#12030).
31
+
32
+ Every `@objectstack/*` range these packages declare in `dependencies` or `peerDependencies` moves from `^17.x` to `^18.0.0-next.0`, the `next` prerelease of `@objectstack/*` 18 (raised to `^18.0.0-next.1` by objectui#12370 before release).
33
+
34
+ **Breaking for consumers:** an install that resolves `@objectstack/spec` (or `@objectstack/client`, `@objectstack/formula`, `@objectstack/lint`) 17.x no longer satisfies these ranges. A consumer must move its own `@objectstack/*` packages to the 18 line, starting with `18.0.0-next.1` (objectui#12370), at the same time as it takes this release.
35
+
36
+ **objectui's own surface moves with it:**
37
+
38
+ - `element:record_picker`'s registration stops publishing the `object`, `filter`, `sort` and `limit` inputs, which spec 18 retires; a JSX page that writes one now gets `unknown-prop`.
39
+ - The `CapabilityMultiSelectField` widget's curated capability set (`@object-ui/fields`) follows spec 18: `manage_mailboxes` in, `manage_org_presentation` out.
40
+ - `element:number` and `element:repeater` nodes that bind no object are accepted, as spec 18's row and `PageComponentSchema` accept them; the two `ELEMENT_*_OBJECT_REQUIRED` refusals are gone.
41
+
42
+ **Retired with the spec:** `@objectstack/spec` 18 tombstones `object-grid`'s `defaultFilters` and refuses it by name, and `ObjectGrid` and `ObjectView` stop reading it (`table.defaultFilters` on an `object-view` included). A view that still carries it renders unfiltered: rename the key to `filter`, whose value is the same rule array.
43
+ - 8a55f0c: The console sidebar no longer lets a user drag the app's menu into a private order; the Pinned section is now the one place a user orders entries (objectui#12059). Arranging an app's navigation is Studio's job: the menu is drawn in the order authored for the app, and every user sees that order. This reverses objectui#11626, which had extended menu drag-to-reorder to grouped menus.
44
+
45
+ **`@object-ui/layout` (breaking, declared `minor` per the version policy).** `NavigationRenderer` retires `enableReorder` and `onReorder`, and with them every sortable path through the menu: no menu row draws a grip or carries a sortable role. `AppSchemaRenderer` retires the same two props, which only handed them through. Two props are added for the pinned section: `pinnedOrder` (the pinned entry ids in the user's order; the section draws in that order, an unnamed pinned entry following in menu order) and `onPinnedReorder` (makes the pinned rows sortable and receives the drawn ids in their new order). A pinned row is dragged by the row itself: no grip at rest, a grab cursor, and a line marking where the row will land. From the keyboard, with the row's link focused, Space picks it up, the arrow keys move it, Space drops it and Escape cancels; Enter still follows the link. The row's link stays a link and the row's one focus stop. The click a pointer drag ends with is not followed.
46
+
47
+ **`@object-ui/app-shell`.** The sidebar no longer reads or writes the per-user menu order it kept in localStorage (`objectui-nav-order-APP`); a key left from before is ignored. The pinned order is stored with the pins, in the `UserDataAdapter`-backed favorites, so it syncs across devices the way the pins do: it is the order of the `type: 'nav'` entries in the stored list. A new pin now joins the end of that order (a content favorite still goes first), and an unpin leaves the others in order. `useFavorites()` gains `reorderNavPins(navIds)`, which puts the named pins in a new order in the places they already hold, so a pin another app's sidebar draws and every content favorite stay put; `useNavPins()` gains `reorderPins(orderedIds)` over it, and its `pinnedIds` lists the pins in the user's order. At the nav-pin cap a new pin still joins the end and the earliest-pinned one rolls off. Pins made before this change are now drawn in their stored order, which is newest first (a pin used to be put at the front of the list), rather than in menu order, until the user drags them.
48
+
49
+ **`@object-ui/i18n` (breaking, declared `minor`).** `console.nav.dragToReorder`, the label of the retired menu grip, is removed from all ten packs. `view.dragToReorder` is a different key and stays.
50
+
51
+ **Clause-②: yes.** Published surface changes: `NavigationRendererProps` loses `enableReorder` / `onReorder` and gains `pinnedOrder` / `onPinnedReorder`; `AppSchemaRendererProps` loses `enableReorder` / `onReorder`; the return of `useFavorites()` gains `reorderNavPins`; the return of `useNavPins()` gains `reorderPins`; the `console.nav.dragToReorder` pack key leaves.
52
+ - ff9df88: Depend on `@objectstack/*` `18.0.0-next.1` (objectui#12370).
53
+
54
+ Every `@objectstack/*` range these packages declare moves from `^18.0.0-next.0` to `^18.0.0-next.1`; the console and the runner bundle `18.0.0-next.1`. A consumer moves its own `@objectstack/*` packages to `18.0.0-next.1` with this release.
55
+
56
+ **Accept sets that narrow with it.** `@object-ui/types` validates page action rows and view data bindings through the spec's own rows, so its faces (`safeValidateSchema` and `StrictAnyComponentSchema`) now refuse what `18.0.0-next.1` refuses. Each was accepted on `18.0.0-next.0`:
57
+
58
+ - `onSuccess` on an `action:button` / `action:icon` row, or an `action:group` / `action:menu` member, whose executor is the `url`, `navigation`, `modal`, `flow` or `form` built-in, or that has no executor at all. Write the hop on an `api` or `script` action (or a host handler name), or drop it.
59
+ - `onSuccess` beside `operation: 'update'`, and an `onSuccess` block carrying a key outside `{ navigate, openIn }`.
60
+ - `actionType: 'navigation'` on a row (and `type: 'navigation'` on a container member): write `'url'`.
61
+ - A `url` executor's `target` that is not openable, judged on the executor the runner runs, including a row whose `name` selects it.
62
+ - A view `data` binding with `provider: 'api'`: bind the object or static rows; an API call is the page element's binding.
63
+ - a8e5b73: Console sidebar: one Favorites section at the top, and one ⋯ menu on every entry (objectui#12427).
64
+
65
+ - **The ⋯ menu replaces the pin icon.** When you hover a navigation entry it shows one ⋯ trigger, and a right-click on the row opens the same menu. There is no pin icon any more. The menu's entries depend on what the entry is:
66
+ - Add to favorites / Remove from favorites always comes first. It writes the same pin as before, so the entry lands in the Favorites section at the top.
67
+ - Open in new tab and Copy link appear for an entry that goes somewhere. They use the address the row's own link renders, so a console served under a basename opens and copies a working link, and a URL off the console is used as it is.
68
+ - Design appears for an `object`, `dashboard` or `page` entry. It opens that target's designer on the metadata-admin route (`/apps/APP/metadata/TYPE/NAME`, which is where a page's Edit in studio button already goes). Only a workspace admin whose session may author metadata sees it.
69
+ - On a phone, navigation entries show no trigger, as they showed no pin icon before.
70
+ - **One Favorites section, at the top.** Favorites that are not navigation entries, such as an object or a record you starred, used to be a group after Recent, below the fold on a long menu. They are now rows of the Favorites section at the top, after the pinned entries. Each row shows its stored label and type icon and carries the same ⋯ menu, whose favorites entry removes it. Design shows for object, dashboard and page favorites, never for a record. Existing favorites appear there as stored: nothing in the favorites store changes and nothing is migrated. The console-home Starred group and the Home page are unchanged.
71
+ - **The page header's favorites entry is in its overflow menu.**
72
+ - The object list header no longer has a star. Its last control is now an icon-only ⋯ button ("More actions") whose menu holds Add to favorites / Remove from favorites. When the current app's navigation has an entry that opens this list, the entry pins that navigation entry, the same action as the sidebar's own menu. It writes one `nav:` favorite that lands in the Favorites section, and no second `object:` favorite. For an object the app does not list, it keeps an `object:` favorite.
73
+ - On a record page the same entry leads the header's ⋯ overflow, ahead of Share, and toggles the record favorite.
74
+ - **`NavigationRenderer` (`@object-ui/layout`) gets two additive props.**
75
+ - `renderItemAction(item, context)` is a host control drawn on every leaf and action row, in place of the pin action. `context` carries the row's `href`, `external`, `label` and `basePath` (type `NavItemActionContext`).
76
+ - `extraFavorites` takes host rows that are appended to the Favorites section after the pinned entries. The section renders when either kind of row is there.
77
+ - A host that passes neither keeps the pin action and a section of pinned entries only, with the pinned drag order unchanged.
78
+ - **Language packs.** Six new `console.nav` keys in all ten packs: `itemMenu`, `openInNewTab`, `copyLink`, `linkCopied`, `linkCopyFailed` and `design`. The list header's ⋯ button is named by `detail.moreActions`, the name the record header's ⋯ already has. The favorites entry reuses `common.addToFavorites` / `common.removeFromFavorites`. `sidebar.favorites`, the title of the removed group, is no longer read and leaves all ten packs.
79
+ - dcd1041: The console top bar is 48 px (`h-12`) in every frame, the height both approved console artboards draw (objectui#12639). It was 56 px (`h-14`).
80
+
81
+ - **One height everywhere.** `AppShell`'s header (inside every app), Home, the organization list and an organization's pages, the full-page assistant at `/ai` and the `/studio` landing all draw the same bar, so it no longer changes height on the way from Home into an app or onto an organization page. Studio's package builder keeps its own header, which was already 48 px from `sm` up.
82
+ - **The app sidebar follows the bar.** On desktop its column starts 48 px down and is the viewport's height less 48 px, so no gap opens between the bar and the sidebar.
83
+ - **The bar's contents are unchanged.** Its controls (the product mark, the app pill, the preview chip, the search field, the bell, help and the avatar) are 32 px or shorter, so each keeps its size.
84
+
85
+ No export, prop or type is added, removed or renamed. A host that renders `@object-ui/layout`'s `AppShell` gets the 48 px header too.
86
+ - 1b94d50: A navigation entry's API `dataSource` is read, and its `visible` sees the selected value as `data` (objectui#13029).
87
+
88
+ The spec lets a navigation entry declare `dataSource: { provider: 'api', read: { url }, path? }` (`BaseNavItemSchema.dataSource`). Only the entry's `visible` reads the value, as `data` (for example `data.total == 1`). The label, the target and `children` do not.
89
+
90
+ - `@object-ui/layout`: `VisibilityEvaluator` takes an optional second argument, the entry whose `visible` it judges. The item guard passes it on every path it serves: the rows, the derived area visibility and the Favorites section. The default evaluator reads no binding, so it hides an entry that declares one. An entry without the key renders as before.
91
+ - `@object-ui/app-shell`: the sidebar, the `nav:menu` block and the command palette share one `visible` evaluator. It reads each binding the app's navigation declares through the page element's reader (`readElementApi`, with the host's signed-in `apiFetch`). The entry is hidden while the read is pending, after it fails, when `path` selects nothing, or when the spec refuses the binding. An entry without the key is evaluated as before, with no request and no wait.
92
+ - `@object-ui/types`: the `dataSource` describe and doc on the navigation item now state what the console does with it. The accept set is unchanged.
93
+ - df71568: A navigation item's `visible` now takes `@objectstack/spec`'s `EvaluatedExpressionInputSchema` by reference, beside the boolean it already took (objectui#13075).
94
+
95
+ The spec types every navigation entry's `visible` as an evaluated expression input: a non-blank CEL string, or the `{ dialect, source }` envelope the spec's own parse produces. objectui's `NavigationItemSchema` typed it as `boolean | string`, so the two disagreed both ways. This changes what `NavigationItemSchema` (and so `objectui validate`) accepts:
96
+
97
+ - **Widened: the envelope is accepted.** `visible: { dialect: 'cel', source: "'org_admin' in current_user.positions" }` used to be refused. It parses now and is kept as written. The TypeScript type `NavigationItem['visible']` is `boolean | EvaluatedExpressionInput` (the spec's input type), so a typed literal can carry the envelope too.
98
+ - **Narrowed (breaking): a blank string is refused.** `visible: ''` and a whitespace-only string used to pass. They are refused now with the spec's own code (`invalid_union` at `visible`) and sentence. A blank `source` inside an envelope is refused at `visible.source`, as the spec refuses it. To show an entry to everyone, omit `visible`.
99
+
100
+ Unchanged: a non-blank string is still accepted and kept as a string (the validator does not rewrite it into an envelope), and `visible: true` / `false` are still accepted. The boolean is the one stated divergence from the spec on this key.
101
+
102
+ Code that reads `NavigationItem['visible']` and passes it on as `string | boolean` no longer compiles: widen that parameter to `NavigationItem['visible']`.
103
+
104
+ `@object-ui/layout` (minor): the exported `VisibilityEvaluator` type now takes `NavigationItem['visible']` instead of `string | boolean | undefined`, so an evaluator receives the envelope as authored. An evaluator a host passes in whose parameter is the old, narrower type no longer type-checks; widen it the same way. The runtime is unchanged: `NavigationRenderer` already handed the value through.
105
+
106
+ `@object-ui/app-shell` (patch): the shell's navigation gates (`useNavMemberGates` and the `nav:menu` block) take the widened type internally. No exported type changes, and the runtime is unchanged: `evaluateNavigationVisibility` already evaluated the envelope.
107
+
108
+ ### Patch Changes
109
+
110
+ - b88937b: Drag-to-reorder of a grouped sidebar menu, within each level (objectui#11626), was retired before it was released. objectui#12059 removed every drag-to-reorder of the sidebar menu: an app's menu order is authored in Studio, and every user sees that order. Nothing of objectui#11626 ships, because objectui#12059 retires the menu reorder whole: `NavigationRenderer`'s `enableReorder` / `onReorder`, the menu drag grip, and the sidebar's per-user menu order in localStorage (`objectui-nav-order-APP`), each of which predates objectui#11626, are gone. The objectui#12059 changeset describes what replaced them: the pinned section is the one place a user orders entries.
111
+ - f114263: In the collapsed (icon-mode) sidebar, a click on an icon reaches its row again. Before, a hidden group label could take the click instead (objectui#12744).
112
+
113
+ The `SidebarGroupLabel` primitive hides a label in icon mode with `opacity-0` and `-mt-8` only. The invisible label stayed hit-testable and lay over the lower half of the row just above its group. A centre click on that row's icon landed on the label. A collapsible group's label toggled its group, the Recent label toggled Recent, and the row did not navigate.
114
+
115
+ The labels that sit below a row now take no pointer events while the primitive hides them. The condition is the primitive's own `group-data-[state=collapsed]:group-data-[collapsible=icon]:` variant:
116
+
117
+ - `@object-ui/layout`: `NavigationRenderer`'s collapsible group label, and its Favorites label (it sits below the Area switcher in a multi-area app);
118
+ - `@object-ui/app-shell`: `UnifiedSidebar`'s Recent label.
119
+
120
+ In the expanded sidebar nothing changes. A group's label still toggles its group by mouse and keyboard, and the Recent label still opens and closes Recent. The primitive itself is a Shadcn-synced file and is not edited: the class rides on the `className` each call site passes. Nothing is added to either package entry: no export, prop or type member.
121
+ - e43a162: In the collapsed (icon-mode) sidebar, a hidden group label is no longer a keyboard focus stop, and screen readers no longer announce it (objectui#12795). Before, Tab from the row above a collapsible group landed on the group's invisible label button, and Enter toggled a group the user could not see.
122
+
123
+ The `SidebarGroupLabel` primitive hides a label there by fading it to `opacity-0`, which left it in the tab order and the accessibility tree. `NavigationRenderer`'s collapsible group and Favorites labels, `AppSchemaRenderer`'s Area label and `SidebarNav`'s group labels now also take `visibility: hidden` under the primitive's own icon-mode condition. The label still fades out before it is hidden. Tab now moves from a group's last row straight to the next group's first row.
124
+
125
+ In the expanded sidebar and the mobile sheet nothing changes: every group label that took focus still does, and Enter still opens and closes its group. The primitive itself is a Shadcn-synced file and is not edited, and no export, prop or type member is added.
126
+ - d758f2f: Doc comment only. The `PageHeaderComponentProps` comment no longer says `@object-ui/app-shell` shares the name: the console's header props are now `ConsolePageHeaderProps`, so this package is the one authority for `PageHeaderComponentProps` (objectui#6349, batch 8). The type and its members are unchanged.
127
+
128
+ No runtime behaviour changes.
129
+ - Updated dependencies [18d7b48]
130
+ - Updated dependencies [172acc3]
131
+ - Updated dependencies [f0496bd]
132
+ - Updated dependencies [c4c506b]
133
+ - Updated dependencies [9db9ff3]
134
+ - Updated dependencies [c096f03]
135
+ - Updated dependencies [92f4e2b]
136
+ - Updated dependencies [b10c68e]
137
+ - Updated dependencies [bdc9049]
138
+ - Updated dependencies [2e818d0]
139
+ - Updated dependencies [fd060f0]
140
+ - Updated dependencies [8b14aec]
141
+ - Updated dependencies [2abec3a]
142
+ - Updated dependencies [9dfaca6]
143
+ - Updated dependencies [c000398]
144
+ - Updated dependencies [73b5d77]
145
+ - Updated dependencies [e6dcd85]
146
+ - Updated dependencies [96fcf30]
147
+ - Updated dependencies [7a2c60b]
148
+ - Updated dependencies [9fc68aa]
149
+ - Updated dependencies [d50f724]
150
+ - Updated dependencies [17acfbb]
151
+ - Updated dependencies [89cc738]
152
+ - Updated dependencies [c0862c1]
153
+ - Updated dependencies [c0862c1]
154
+ - Updated dependencies [c0862c1]
155
+ - Updated dependencies [c0862c1]
156
+ - Updated dependencies [c0862c1]
157
+ - Updated dependencies [4c0de52]
158
+ - Updated dependencies [a80fef7]
159
+ - Updated dependencies [e06365c]
160
+ - Updated dependencies [1e1f09e]
161
+ - Updated dependencies [455c646]
162
+ - Updated dependencies [f34e877]
163
+ - Updated dependencies [f34e877]
164
+ - Updated dependencies [9844bbf]
165
+ - Updated dependencies [cef0eee]
166
+ - Updated dependencies [7241a81]
167
+ - Updated dependencies [74add0c]
168
+ - Updated dependencies [aaba865]
169
+ - Updated dependencies [45d5853]
170
+ - Updated dependencies [4f4fc03]
171
+ - Updated dependencies [2312bd9]
172
+ - Updated dependencies [c5406c2]
173
+ - Updated dependencies [d99b731]
174
+ - Updated dependencies [2a48bd4]
175
+ - Updated dependencies [c7b30bd]
176
+ - Updated dependencies [69bca0a]
177
+ - Updated dependencies [023f00d]
178
+ - Updated dependencies [158c75d]
179
+ - Updated dependencies [7525045]
180
+ - Updated dependencies [5af42db]
181
+ - Updated dependencies [ce991bd]
182
+ - Updated dependencies [5f75cfa]
183
+ - Updated dependencies [b7cd5c8]
184
+ - Updated dependencies [5330038]
185
+ - Updated dependencies [c9fc10b]
186
+ - Updated dependencies [dc6d28e]
187
+ - Updated dependencies [c0c2f79]
188
+ - Updated dependencies [0665c3b]
189
+ - Updated dependencies [d2500d8]
190
+ - Updated dependencies [e723f58]
191
+ - Updated dependencies [f3d5408]
192
+ - Updated dependencies [b231607]
193
+ - Updated dependencies [466a219]
194
+ - Updated dependencies [6fb281d]
195
+ - Updated dependencies [334f0cf]
196
+ - Updated dependencies [c08c933]
197
+ - Updated dependencies [92f979d]
198
+ - Updated dependencies [c4dd707]
199
+ - Updated dependencies [c4dd707]
200
+ - Updated dependencies [923504f]
201
+ - Updated dependencies [5c2982a]
202
+ - Updated dependencies [97e7d4e]
203
+ - Updated dependencies [10aba37]
204
+ - Updated dependencies [5d3f437]
205
+ - Updated dependencies [7af0ab3]
206
+ - Updated dependencies [b434f5f]
207
+ - Updated dependencies [fd4872f]
208
+ - Updated dependencies [f0532d8]
209
+ - Updated dependencies [3092aca]
210
+ - Updated dependencies [82e5f53]
211
+ - Updated dependencies [d81e460]
212
+ - Updated dependencies [8106db1]
213
+ - Updated dependencies [093d55b]
214
+ - Updated dependencies [a8051d6]
215
+ - Updated dependencies [72594f2]
216
+ - Updated dependencies [524136e]
217
+ - Updated dependencies [6f3299f]
218
+ - Updated dependencies [f2b17c6]
219
+ - Updated dependencies [52d6194]
220
+ - Updated dependencies [23bf859]
221
+ - Updated dependencies [1c72d77]
222
+ - Updated dependencies [2b4d3f1]
223
+ - Updated dependencies [d75f212]
224
+ - Updated dependencies [ff9df88]
225
+ - Updated dependencies [70e843f]
226
+ - Updated dependencies [a2225f9]
227
+ - Updated dependencies [5c4deb5]
228
+ - Updated dependencies [c950345]
229
+ - Updated dependencies [21f9577]
230
+ - Updated dependencies [044f231]
231
+ - Updated dependencies [f8267df]
232
+ - Updated dependencies [3eb3ec1]
233
+ - Updated dependencies [1ffd6a2]
234
+ - Updated dependencies [5f8ecf6]
235
+ - Updated dependencies [726d8c9]
236
+ - Updated dependencies [ef71a09]
237
+ - Updated dependencies [619e3f7]
238
+ - Updated dependencies [c9e6742]
239
+ - Updated dependencies [f62b6ff]
240
+ - Updated dependencies [608033b]
241
+ - Updated dependencies [611566b]
242
+ - Updated dependencies [d66d7e8]
243
+ - Updated dependencies [15d8ca6]
244
+ - Updated dependencies [378896d]
245
+ - Updated dependencies [71243db]
246
+ - Updated dependencies [a8add5c]
247
+ - Updated dependencies [33ee9de]
248
+ - Updated dependencies [4839f5c]
249
+ - Updated dependencies [c7462e7]
250
+ - Updated dependencies [e058d76]
251
+ - Updated dependencies [c999d4c]
252
+ - Updated dependencies [8df2608]
253
+ - Updated dependencies [5483297]
254
+ - Updated dependencies [ed43c79]
255
+ - Updated dependencies [260ef71]
256
+ - Updated dependencies [655e897]
257
+ - Updated dependencies [655e897]
258
+ - Updated dependencies [69a408f]
259
+ - Updated dependencies [d2b21a1]
260
+ - Updated dependencies [5ff64ef]
261
+ - Updated dependencies [26323c4]
262
+ - Updated dependencies [9753811]
263
+ - Updated dependencies [bc281f4]
264
+ - Updated dependencies [d637be3]
265
+ - Updated dependencies [2cfdc99]
266
+ - Updated dependencies [1e6d83b]
267
+ - Updated dependencies [c219165]
268
+ - Updated dependencies [a7ae252]
269
+ - Updated dependencies [fb501bc]
270
+ - Updated dependencies [30083da]
271
+ - Updated dependencies [025130c]
272
+ - Updated dependencies [8aa8e3e]
273
+ - Updated dependencies [024b7b6]
274
+ - Updated dependencies [909c64e]
275
+ - Updated dependencies [9e7e1a5]
276
+ - Updated dependencies [2493e85]
277
+ - Updated dependencies [d0b9648]
278
+ - Updated dependencies [46dbf32]
279
+ - Updated dependencies [a928aaa]
280
+ - Updated dependencies [61ed5ad]
281
+ - Updated dependencies [1b94d50]
282
+ - Updated dependencies [988aa9f]
283
+ - Updated dependencies [fb85637]
284
+ - Updated dependencies [9f1dd79]
285
+ - Updated dependencies [df71568]
286
+ - Updated dependencies [d11174a]
287
+ - Updated dependencies [2d8a8b7]
288
+ - Updated dependencies [cbac9d7]
289
+ - Updated dependencies [616df65]
290
+ - Updated dependencies [4b92c5a]
291
+ - Updated dependencies [3650d94]
292
+ - Updated dependencies [8cd4db4]
293
+ - Updated dependencies [daeb77f]
294
+ - Updated dependencies [eb4552e]
295
+ - Updated dependencies [3c3115e]
296
+ - Updated dependencies [55e90fd]
297
+ - Updated dependencies [9b75509]
298
+ - Updated dependencies [b13ea3c]
299
+ - Updated dependencies [d7e9e9a]
300
+ - Updated dependencies [cf62edf]
301
+ - Updated dependencies [0253416]
302
+ - Updated dependencies [5d77c09]
303
+ - Updated dependencies [3fd8625]
304
+ - Updated dependencies [1473757]
305
+ - Updated dependencies [d73d987]
306
+ - Updated dependencies [12ff256]
307
+ - Updated dependencies [26b0bd2]
308
+ - Updated dependencies [26b0bd2]
309
+ - Updated dependencies [d328698]
310
+ - Updated dependencies [d328698]
311
+ - Updated dependencies [b4e0787]
312
+ - Updated dependencies [088e0f7]
313
+ - Updated dependencies [78b07f4]
314
+ - Updated dependencies [b403bb3]
315
+ - Updated dependencies [4016370]
316
+ - Updated dependencies [12dc7b4]
317
+ - @object-ui/types@18.0.0
318
+ - @object-ui/components@18.0.0
319
+ - @object-ui/core@18.0.0
320
+ - @object-ui/react@18.0.0
321
+
322
+ ## 17.7.0
323
+
324
+ ### Minor Changes
325
+
326
+ - d6a1a80: feat(layout): a host can hide a `doc` navigation entry the member may not read (objectui#10188)
327
+
328
+ `NavigationRenderer`, `AppSchemaRenderer` and `hasVisibleNavigationItems` take an optional
329
+ `checkDocTarget` — a `DocTargetChecker`, asked `{ book, doc }` for each `type: 'doc'` entry.
330
+ An entry it answers `false` for is not drawn, is not collected into Favorites, and does not
331
+ make its area count as visible: it joins the one guard statement the other item guards
332
+ already share. Without it, `doc` entries draw as before.
333
+
334
+ It is defence in depth. The server is the enforcer (ADR-0046 §6.7): its app read already
335
+ leaves out a `doc` entry the member may not read. This layer holds no audience rules, so the
336
+ host answers from the member's own doc / book reads. `DocNavTarget` and `DocTargetChecker` are
337
+ exported. `CapabilityChecker` is unchanged: it asks whether the runtime has a target, and this
338
+ checker asks whether the member may read it.
339
+ - ad1785c: refactor(layout)!: retire the `page-header` node type key; the header node is `page:header` (objectui#10859, batch 8 phase 2c)
340
+
341
+ **BREAKING (authoring):** `registerLayout()` no longer registers `PageHeader` under `page-header` (and with it `layout:page-header`). `objectui validate` already refused a `page-header` node at `type`, and nothing in this repository authored or emitted it. objectstack's `page-header-subtitle-alias` conversion renames the key `description` → `subtitle` on both header spellings and leaves the type to objectui. A `page-header` node now renders the "Unknown component type" panel. `PageHeader` stays a named export for JSX composition.
342
+
343
+ Migration, measured against `objectui validate` (`page:header` carries its props in `properties`):
344
+
345
+ - `{ "type": "page-header", "title": T, "subtitle": S }` → `{ "type": "page:header", "properties": { "title": T, "subtitle": S } }`;
346
+ - `actions` (action ids) → `properties.actions`, the same id array;
347
+ - `icon` has no `page:header` spelling: the contract refuses `properties.icon` by name (an ADR-0087 D2 tombstone). Drop it, or compose `PageHeader` in JSX, which still takes `icon`;
348
+ - `children` (the right-hand slot) has no `page:header` spelling: the contract refuses a node-level `children` by name, and `properties.children` as an unrecognized key. Put the buttons in `properties.actions` as action ids, or compose `PageHeader` in JSX, which still renders its `children`.
349
+
350
+ `registerLayout()` now registers four keys: `layout:page:card`, `responsive-grid`, `navigation-renderer` and `app-schema-renderer`.
351
+
352
+ **Clause-②: yes** — a registration leaves the runtime (narrowing), released as `minor` with this banner.
353
+
354
+ ⚠️ **Dated note, 2026-10-02 — `responsive-grid` and `navigation-renderer` are retired too — objectui#11441.**
355
+ Later in this same release objectui#11441 (the maintainer's ruling, letters B / B) unregistered both, with their
356
+ `layout:` twins, so `registerLayout()` registers two keys: `layout:page:card` and `app-schema-renderer`. The rest of
357
+ this entry is kept as the reading of this change.
358
+ - e6bc087: feat: a `doc` navigation entry (ADR-0046) validates and draws as a link into the docs portal
359
+
360
+ `@objectstack/spec` 17.5.0 added a tenth navigation item type, `doc` — `{ type: 'doc', book }`
361
+ opens a book, `{ type: 'doc', doc }` opens one page, both opens that page in that book's
362
+ context. `objectui validate` refused it: `NavigationItemTypeSchema` was a hand-written list of
363
+ the nine older types, while the TypeScript `NavigationItemType`, derived from the spec, already
364
+ carried `doc`. And no renderer drew one — `resolveHref` had no `doc` branch, so the entry
365
+ rendered as a dead `#` link.
366
+
367
+ - **`@object-ui/types`** — `NavigationItemTypeSchema` is now read off the discriminator of the
368
+ spec's navigation union instead of hand-listed, so it gains `doc`. A `doc` entry is judged by
369
+ the spec's own `DocNavItemSchema`: it accepts exactly what the spec accepts — at least one of
370
+ `book` / `doc`, a doc NAME (a filename or a path is refused), a snake_case `id`, and the closed
371
+ key set of the spec's `doc` arm — and refuses an empty `label` as every sibling type does. The
372
+ parsed entry is never rewritten. `NavigationEntryItem` gains the spec-derived `book` and `doc`
373
+ members. An unknown `type` is now refused with `invalid_union` at `type` (was `invalid_value`),
374
+ the code the spec's own union answers with.
375
+ - **`@object-ui/layout`** — `resolveHref` sends a `doc` entry to the console docs portal under
376
+ its `basePath`: `/docs/DOC`, `/docs/BOOK` or `/docs/BOOK/DOC`. An unlabelled `doc`
377
+ entry shows the page it opens, else the book. It is gated by the same base keys as its
378
+ siblings (`visible`, `requiredPermissions`, `requiresObject`, `requiresService`); the book
379
+ audience gate stays the server's. The mobile tab bar links it the same way.
380
+ - **`@object-ui/app-shell`** — the app designer's preview keys its navigation kinds by
381
+ `NavigationItemType`, so a `doc` entry is drawn with its target and route instead of being
382
+ dropped (label-less) or badged `untyped`.
383
+ - **`@object-ui/plugin-designer`** — `NAV_TYPE_META` drops the `| 'doc'` key that bridged the
384
+ spec pin lag; it is keyed by `NavigationItemType` alone.
385
+ - **`@object-ui/console`** — the docs portal resolves a path segment that is a book's NAME
386
+ rather than its `slug` — what a `{ type: 'doc', book }` entry links to — and redirects to
387
+ the book's canonical slug URL: `/docs/NAME` opens the book, `/docs/NAME/DOC` reads that page
388
+ with the book's sidebar. It is looked up after a book's slug and an installed doc's name, so
389
+ every URL that resolved before answers as it did; only former "Documentation not found"
390
+ answers change.
391
+ - 770cc5b: feat(layout): a navigation label written as an inline locale map renders in the viewer's locale; three inert resolver props retire (objectui#11299)
392
+
393
+ **Breaking for a consumer that passes the retired props or calls `resolveNavItemLabel` with six arguments** — a compile error, never a silent change of what renders.
394
+
395
+ - **New: `NavigationRenderer`'s optional `locale` prop**, and a trailing `locale`
396
+ argument on `resolveNavItemLabel`. A present entry label written as an inline locale
397
+ map (`{ en: 'Accounts', 'zh-CN': '客户' }`) renders the entry for that locale, through
398
+ the spec's own `resolveI18nLabel`; when the map has no entry for it, that resolver's
399
+ fallback order applies. objectui#11201 rendered such a map's `en` entry for every
400
+ viewer; pass the viewer's language as `locale` to show theirs. Without `locale` the
401
+ map still reads its `en` entry. A plain-string label and an absent label are
402
+ unaffected.
403
+ - **Retired: `NavigationRenderer`'s `resolveObjectLabel`, `resolveDashboardLabel` and
404
+ `resolveViewLabel` props.** objectui#11201 stopped reading them and kept them as
405
+ no-ops; they are removed now. Delete them from your `NavigationRenderer` call. An
406
+ unlabelled entry's localized text comes from `resolveTargetLabel`, as before.
407
+ - **Changed signature: `resolveNavItemLabel(item, t?, targetLabel?, locale?)`.** The
408
+ 2nd, 4th and 5th arguments (the same three resolvers) are gone. A call written
409
+ `resolveNavItemLabel(item, undefined, t, undefined, undefined, targetLabel)` becomes
410
+ `resolveNavItemLabel(item, t, targetLabel, locale)`.
411
+
412
+ Marked `minor`, not `major`: this repository's fixed release group follows the
413
+ `@objectstack` major, so a breaking change of its own is declared `minor` with the
414
+ break spelled out here.
415
+ - 9d1c0bf: refactor(layout)!: retire the `navigation-renderer` and `responsive-grid` node type keys; navigation is application metadata, and the breakpoint grid is `grid` (objectui#11441)
416
+
417
+ **BREAKING (authoring):** `registerLayout()` no longer registers `NavigationRenderer` under `navigation-renderer` or `ResponsiveGrid` under `responsive-grid` (and with them `layout:navigation-renderer` and `layout:responsive-grid`). This executes the maintainer's ruling on objectui#11441 (letters B / B) as one more batch of objectui#10859. `objectui validate` already refused both keys at `type`, and nothing in this repository or in objectstack authored or emitted either node. A node of either type now renders the "Unknown component type" panel. `registerLayout()` now registers two keys: `layout:page:card` and `app-schema-renderer`.
418
+
419
+ `NavigationRenderer` and `ResponsiveGrid` stay named exports for JSX composition. `NavigationRenderer` is what the console's sidebar and `AppSchemaRenderer` mount. `ResponsiveGrid` had no in-repo consumer other than the retired registration, and it stays because the same ruling keeps objectui#7580's vocabulary half: `BreakpointColumnMap` stays declared in this package as the type of its `columns` prop.
420
+
421
+ Migration, measured against `objectui validate` on both of its faces:
422
+
423
+ - `{ "type": "responsive-grid", "columns": C, "gap": G }` → `{ "type": "grid", "columns": C, "gap": G }`. `grid` accepts the same breakpoint `columns` object (`xs` … `2xl`) and a `gap` number, and refuses an unknown breakpoint key as an unrecognized key (`unrecognized_keys` on `columns`). Unlike `responsive-grid`, which drew `not-a-container` and rendered no authored child list, `grid` draws its `children`;
424
+ - `{ "type": "navigation-renderer", "items": I }` has no page-node replacement: navigation is application metadata. Put `I` in the app document's `navigation` (`{ "type": "app", "name": N, "navigation": I }` validates on both faces), and the shell draws it: the console's sidebar, or `AppSchemaRenderer` in JSX;
425
+ - `basePath` has no app-document spelling: the strict face refuses it as an unrecognized key. It belongs to the shell, as `AppSchemaRenderer`'s `basePath` prop.
426
+
427
+ **Clause-②: yes** — two registrations leave the runtime (narrowing), released as `minor` with this banner.
428
+
429
+ ⚠️ **Dated note, 2026-10-02 — `grid` takes one of ten `gap` steps, not any number — objectui#11474.** At this change `grid` accepted any `gap` number; now it accepts one of 0, 1, 2, 3, 4, 5, 6, 8, 10 and 12, the steps the `grid` renderer maps, and `objectui validate` refuses any other `G` at `gap` on both faces with that set named: 7, 9, 11, a number above 12, a negative number or a fraction. For such a number `grid` drew no gap anyway, because the class it built at runtime is in no compiled stylesheet. So in the migration above `G` must be one of those ten steps; each step `ResponsiveGrid`'s own class map drew (0 to 6 and 8) is one of them. `.changeset/11474-layout-spacing-sets.md` states what ships. The rest of this entry is kept as the reading of this change.
430
+
431
+ ⚠️ **Dated note, 2026-10-02 — `grid` takes column counts 1 to 12, not any number — objectui#11491.** At this change `grid` accepted any count in the breakpoint `columns` object; now each count is one of 1 to 12, the counts the `grid` renderer maps, and `objectui validate` refuses any other count in `C` at `columns` on both faces with that set named. For such a count `grid` drew no column class at that breakpoint anyway. So in the migration above every count in `C` must be one of 1 to 12; each count `ResponsiveGrid`'s own class map drew (1, 2, 3, 4, 6 and 12) is one of them. `.changeset/11491-grid-columns-set.md` states what ships. The rest of this entry is kept as the reading of this change.
432
+ - fcdc8ec: An `app-schema-renderer` node draws the app document it carries under `schema` (objectui#11494, triage ruling A).
433
+
434
+ **Breaking for a node that writes the app document's keys flat on itself** (shipped as `minor`, per this repository's version policy). `SchemaRenderer` hands every registered component the node itself as its `schema` prop, and `registerLayout()` registered `AppSchemaRenderer` directly, so the component took the node for its app document: a document nested under the node's `schema` key drew an empty shell, and only app keys written flat on the node (`navigation`, `title`, …), which no schema declares, drew. `registerLayout()` now registers the key against an adapter that hands `node.schema` to `AppSchemaRenderer`:
435
+
436
+ - `{ "type": "app-schema-renderer", "schema": { "type": "app", "name": "crm", "navigation": [ … ] } }` draws the document's branding and navigation.
437
+ - The same keys written flat on the node are no longer read. Move them under `schema`, with `"type": "app"`. No producer in objectui or objectstack authors them flat.
438
+ - A node without `schema` draws the shell with no branding and no navigation, as it did before.
439
+
440
+ Unchanged: `basePath` and `mobileNavMode` are read off the node, the registration's three declared `inputs`, and `AppSchemaRenderer` itself, whose JSX hosts pass `schema={appDocument}` directly. A node's `children` are still not rendered.
441
+ - 969ba84: Renderers for the `app:launcher` and `nav:menu` page blocks.
442
+ Phase 1 of the 2026-08-26 maintainer ruling on objectstack#12183 — the two
443
+ `PageComponentType` members that are purely metadata-driven, so nothing had to
444
+ ship before their renderers could. Phase 2 (`global:search` /
445
+ `global:notifications`) landed in `f99932a42` and set the pattern this
446
+ follows.
447
+
448
+ A page that declared either member drew a dashed box. The two symptoms were not
449
+ the same, which is worth recording because it decides what "fixed" looks like
450
+ for each:
451
+
452
+ - `nav:menu` is in `PALETTE_PLACEHOLDER_BLOCKS`, registered eagerly, so it drew
453
+ the literal "Component Placeholder" scaffold in every host.
454
+ - `app:launcher` is only in `PROTOCOL_COMPONENTS`, registered when a host opts
455
+ in via `registerPlaceholders()` — which just `apps/console` does. So it drew
456
+ the scaffold in the console and `SchemaRenderer`'s red OBJUI-001 "Unknown
457
+ component type" panel everywhere else.
458
+
459
+ Neither block adds a data layer — each mounts plumbing that was already live,
460
+ and neither issues a request or touches an adapter:
461
+
462
+ - `app:launcher` reads the metadata app registry (`useMetadata().apps`, which
463
+ `MetadataProvider` fetches eagerly) through the shared `filterActiveApps`
464
+ predicate, and draws it with `HomeAppsStrip` — the console's own launcher
465
+ grid — so an authored launcher and the Home launcher cannot drift into two
466
+ looks for one thing.
467
+ - `nav:menu` reads the active app's navigation tree from that same registry and
468
+ renders it as page content, taking every derived fact from `@object-ui/layout`:
469
+ hrefs from `resolveHref`, labels from `resolveNavItemLabel`, the active row
470
+ from `resolveActiveNavItem`, and the item-level guards (`visible`,
471
+ `requiredPermissions`, `requiresObject` / `requiresService`) in the order
472
+ `NavigationItemRenderer` applies them, wired to the same console providers
473
+ `UnifiedSidebar` wires them to. `action` items dispatch through
474
+ `useNavActionDispatch`, so framework#4509's "renders but dead-clicks" shape is
475
+ not reintroduced.
476
+
477
+ `nav:menu` does not mount `NavigationRenderer` itself: that renders through
478
+ `SidebarMenuButton`, whose `useSidebar()` throws outside the shell's
479
+ `SidebarProvider`, and a page block has to render standalone. `@object-ui/layout`
480
+ therefore exports `resolveNavItemLabel`, which was module-private — an additive
481
+ export with no behaviour change, so the sidebar and an authored menu cannot show
482
+ one nav entry under two names.
483
+
484
+ Both registrations publish **no** `inputs`: `ComponentPropsMap` declares an empty
485
+ shape for each, and both use `skipFallback: true` so neither claims the bare
486
+ `launcher` / `menu` keys. This does not change the Studio page palette —
487
+ `app:launcher` remains recorded there as a shell singleton, which is a palette
488
+ decision independent of whether a declared type renders.
489
+
490
+ Three new strings — the launcher's and the menu's accessible names, and the
491
+ menu's empty state — are declared under `console.nav` in `en.ts` and its nine
492
+ sibling packs. An inline `defaultValue` alone is not a fix: it renders English
493
+ at one call site and leaves the string untranslatable everywhere
494
+ (objectui#3517).
495
+ - e62c44e: Re-home the breakpoint layout vocabulary and delete the two dead responsive
496
+ implementations (objectui#7580, maintainer ruling 2026-09-04, option A).
497
+
498
+ **Breaking, deliberately, in one direction only.** `@objectstack/spec` retired its whole
499
+ `ui/responsive` vocabulary in objectstack#11027 — `ResponsiveConfigSchema`,
500
+ `BreakpointName`, `BreakpointColumnMapSchema` and `BreakpointOrderMapSchema` — on the
501
+ stated ground that the four types "had no other authorable carrier". That ground is
502
+ measurably false on the renderer side: `responsive-grid` is a REGISTERED SDUI component
503
+ whose authorable `columns` input is typed by `BreakpointColumnMap` and applied by
504
+ `resolveColumnClasses` on the render path, and `BreakpointName` types four live readers in
505
+ `@object-ui/mobile`. The tombstone's own return condition — the vocabulary "returns if and
506
+ when a renderer implements it" — is already met here, so the two types a renderer reads
507
+ are re-homed rather than retired.
508
+
509
+ What survives, under the same names and the same members:
510
+
511
+ - `BreakpointName` (`xs`…`2xl`) is now declared in `@object-ui/types` (`mobile.ts`) instead
512
+ of re-exported from the spec. **No consumer change**: same name, same six members, same
513
+ export sites on `@object-ui/types` and `@object-ui/mobile`. Only its provenance moved.
514
+ - `BreakpointColumnMap` is now declared in `@object-ui/layout` (`ResponsiveGrid.tsx`),
515
+ verbatim from the retired `$strict` schema: six optional column counts, no index
516
+ signature. `responsive-grid`'s `columns` input and its resolver are unchanged.
517
+
518
+ What is removed:
519
+
520
+ - `BreakpointOrderMap` (`@object-ui/layout`) — retired with the key, not re-homed. It had
521
+ no read point in the package; it was published only because the retired
522
+ `ResponsiveConfigSchema` paired it with the column map, so an author configuring `order`
523
+ needed the type. With the schema gone there is no order vocabulary for it to be the type
524
+ of, and re-declaring it would be the declare-without-enforce shape ADR-0049 removes.
525
+ - `useResponsiveConfig` (`@object-ui/mobile`), with its `SpecResponsiveConfig` and
526
+ `ResolvedResponsiveState` exports, and `ResponsiveProtocol` (`@object-ui/core`), with
527
+ `resolveResponsiveConfig` / `getVisibilityClasses` / `getColumnClasses` /
528
+ `getOrderClasses` / `shouldHideAtBreakpoint`. Both read the retired
529
+ `ResponsiveConfigSchema` and both were measured at zero callers (objectui#4773).
530
+ - `SpecResponsiveConfig` / `SpecBreakpointName` (`@object-ui/types`) — dead re-exports once
531
+ the two implementations above went, dropped rather than re-declared locally, the same
532
+ disposition the retired i18n names in that file already carry.
533
+
534
+ No behaviour is retired. The live per-breakpoint readers — `useBreakpoint`,
535
+ `ResponsiveContainer`, `BREAKPOINTS` / `BREAKPOINT_ORDER` / `getCurrentBreakpoint`, and
536
+ `responsive-grid` itself — are untouched.
537
+
538
+ **Sequencing.** objectui's next `@objectstack/spec` pin bump must carry `Blocked-by:`
539
+ objectui#7580: the retirement is merged upstream and unreleased, so this must land first.
540
+
541
+ ⚠️ **Dated note, 2026-10-02 — the `responsive-grid` registration is retired — objectui#11441.**
542
+ Later in this same release the maintainer's ruling on objectui#11441 (letter B) unregistered `responsive-grid` (and
543
+ `layout:responsive-grid`). That ruling updates item 2 of this change's ruling: the vocabulary half stands, so
544
+ `BreakpointName` and `BreakpointColumnMap` stay declared here, and `ResponsiveGrid` stays a React export whose
545
+ `columns` prop `BreakpointColumnMap` types. The authorable breakpoint grid is the `grid` node with a breakpoint
546
+ `columns` object, which `BreakpointName` keys. The rest of this entry is kept as the reading of this change.
547
+ - 0ea7054: Remove 37 runtime dependencies that no file in the declaring package consumes, and gate
548
+ the direction so the next one cannot land (objectui#8198).
549
+
550
+ `check:phantom-deps` judges imports that are not declared; nothing judged the reverse,
551
+ so a declaration could outlive its last consumer indefinitely. That is what happened to
552
+ `recharts` in `@object-ui/components` after objectui#7397 deleted its only importer — it
553
+ was removed by hand on objectui#7625, and nothing would have reported the next one. The
554
+ new `pnpm check:unused-deps` asks the reverse question over `dependencies` and
555
+ `optionalDependencies` of every released package.
556
+
557
+ **Potentially breaking, for consumers relying on hoisting.** Nothing these packages ship
558
+ changes: their Vite `external` predicates are path-based and never read `dependencies`,
559
+ so no built artifact moves. What changes is the install graph — a project that imports
560
+ one of the removed packages while depending only on the ObjectUI package that used to
561
+ drag it in will no longer resolve it. Declare it directly; that is the correct
562
+ dependency edge in either case. The removals, by package:
563
+
564
+ - `@object-ui/plugin-designer`: `@dnd-kit/core`, `@dnd-kit/sortable`, `@dnd-kit/utilities`, `@object-ui/fields`
565
+ - `@object-ui/plugin-chatbot`: `react-markdown`, `react-syntax-highlighter`, `remark-gfm` (and the orphaned `@types/react-syntax-highlighter`)
566
+ - `@object-ui/plugin-report`: `@object-ui/plugin-grid`, `clsx`, `react-i18next`, `tailwind-merge`
567
+ - `@object-ui/plugin-map`: `@objectstack/spec`, `lucide-react`, `zod`
568
+ - `@object-ui/runner`: `class-variance-authority`, `clsx`, `tailwind-merge`
569
+ - `@object-ui/core`: `lodash`, `zod`
570
+ - `@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
571
+ - `@object-ui/plugin-dashboard`: `clsx`, `tailwind-merge`, and the same `react-dom` defect
572
+ - `@object-ui/plugin-ai`: `@object-ui/react`, `clsx`, `tailwind-merge`
573
+ - `@object-ui/fields`: `clsx`, `tailwind-merge`
574
+ - `@object-ui/console`: `@object-ui/react-runtime`, `sucrase`
575
+ - `@object-ui/auth`: `@object-ui/types`
576
+ - `@object-ui/plugin-calendar`: `@object-ui/fields`
577
+ - `@object-ui/plugin-editor`, `@object-ui/plugin-markdown`: `@object-ui/react`
578
+ - `@object-ui/react`: `react-hook-form`
579
+
580
+ Every one was verified by a whole-package grep before removal — the name appeared nowhere
581
+ under the package but its own manifest and CHANGELOG — and the whole workspace builds,
582
+ type-checks and tests green afterwards.
583
+ - a8198de: feat(types,layout,app-shell): a navigation entry with no `label` shows its target's current label, resolved at render time (objectui#9868)
584
+
585
+ `@objectstack/spec` 17.5.0 made a navigation entry's `label` optional on every
586
+ entry arm of its `NavigationItemSchema` (the separator still carries none), with
587
+ a declared semantic (the cloud#2021 letter-A ruling): absent ⇒ the entry
588
+ shows the CURRENT label of what it opens — the view's label when it names a
589
+ labelled view, else the object's / dashboard's label; present ⇒ rendered
590
+ verbatim. Nothing is stored for the absent case, so a renamed target shows its
591
+ new name on the next render.
592
+
593
+ - `@object-ui/types` (widening): `NavigationEntryItem.label` is optional, and
594
+ `NavigationItemSchema` accepts a label-less entry of every type the spec does,
595
+ filling nothing in at parse time. `id` is still required. An EMPTY label is
596
+ still refused — `''` is a present label that would render empty text — and the
597
+ message says to omit the key instead. `menuItemToNavigationItem` no longer
598
+ turns a missing legacy label into `''`.
599
+ - `@object-ui/layout` (additive public surface): `resolveNavItemLabel`
600
+ resolves an absent label through a new `resolveTargetLabel` resolver
601
+ (`NavigationRenderer` prop, types
602
+ `NavLabelTarget` / `NavTargetLabelResolver`), walking view → object /
603
+ dashboard, and falls back to the target's machine name (`viewName`,
604
+ `objectName`, `dashboardName`, `pageName`, `reportName`, `url`,
605
+ `componentRef`, the action name; a group shows its `id`). An authored label is
606
+ never replaced by the target's label, including one spelled like the machine
607
+ name. Action entries, the search filter and `AppSchemaRenderer`'s mobile tab
608
+ bar read the label through the same function, so an unlabelled entry no longer
609
+ throws there.
610
+ - `@object-ui/app-shell`: the sidebar, the `nav:menu` block, the ⌘K command
611
+ palette and the full-page search all name a nav entry through
612
+ `resolveNavItemLabel` with one hook over the metadata cache the shell already
613
+ holds (object schema, merged list views, dashboards) — no request per nav
614
+ entry. Read raw, a label-less entry drew a blank palette row searched as
615
+ `undefined`, and the search page listed it by its machine name.
616
+ Navigation sync stops writing `label: pageName` / `label: dashboardName` for an
617
+ unnamed page or dashboard; an author label is still written, and stored labels
618
+ are kept.
619
+ - 5ea623e: fix(sdui-parser,components,layout,types): containment is the declared `children` slot, not `isContainer` (objectui#9910)
620
+
621
+ `validateTree`'s `not-a-container` diagnostic now reads exactly one declaration:
622
+ an input named `children` in the component's registration `inputs`. Ten
623
+ registrations already carried such an input — `slot`-typed on `tooltip` and the
624
+ four `page:*` containers, `array`-typed on the five page kinds — and the
625
+ predicate reads the NAME, so both count. `isContainer` is no longer
626
+ consulted and is not a fallback — new exports `acceptsChildren` and
627
+ `CHILD_LIST_KEY` in `@object-ui/sdui-parser` spell the predicate, and the
628
+ retired `body` dialect follows the same reading.
629
+
630
+ Why: the flag was hand-kept and drifted from the renderers four times; after
631
+ objectui#6771 converged a dozen `schema.body` readers onto `children`, and with
632
+ objectui#6804 ruling the flag OFF for that population (it means layout
633
+ containment, and declaring it deletes a public tag from every react page's JSX
634
+ scope), the diagnostic landed FALSE on the one key `button`, `badge`, `alert`
635
+ and the `sidebar-*` parts render. The maintainer ruled declare-and-pin
636
+ (2026-09-24).
637
+
638
+ What is declared: every renderer under `@object-ui/components` and
639
+ `@object-ui/layout` that puts `schema.children` on the page — 65 registrations
640
+ measured bare plus `sidebar` and `sidebar-menu-button` in their provider
641
+ context — now declares the `children` slot; the 34 flow/inline HTML tags, the
642
+ seven sectioning tags, the layout primitives, `button` / `badge` / `alert` /
643
+ `toggle` (label and description fallbacks), `span` (read ahead of `value`),
644
+ `div`, `form`, `scroll-area`, the ten `sidebar-*` parts and `page-header`. Nine public blocks
645
+ gain the slot in `sdui.manifest.json`; a `slot` input emits no JSX attribute, so
646
+ the generated `.d.ts` is unchanged. `isContainer` is kept everywhere it was
647
+ declared and re-described on every published face (`ComponentMeta`,
648
+ `RuntimeWidgetManifest`, `ComponentMetaSchema`, the manifest types) as LAYOUT
649
+ containment — the react-page scope builder keeps reading it unchanged.
650
+
651
+ The runtime containment census is re-pointed from the flag to the input in both
652
+ directions (declared ⇔ actually renders, with named context probes for the
653
+ provider-scoped and portal renderers), `scripts/container-declaration-baseline.json`
654
+ is at zero, and a registration that is a layout container but renders no
655
+ authored list (`page:tabs`, `page:accordion`, `responsive-grid`) now draws the
656
+ TRUE `not-a-container` the flag used to silence.
657
+
658
+ ⚠️ **Dated note, 2026-10-02 — `page-header` is retired — objectui#10859.**
659
+ Later in this same release objectui#10859 batch 8 (phase 2c) unregistered `@object-ui/layout`'s
660
+ `page-header` (and `layout:page-header`), so its `children` slot declaration left with it; authors write
661
+ `page:header`. The rest of this entry is kept as the reading of this change.
662
+
663
+ ⚠️ **Dated note, 2026-10-02 — `responsive-grid` is retired — objectui#11441.**
664
+ Later in this same release objectui#11441 unregistered `@object-ui/layout`'s `responsive-grid` (and
665
+ `layout:responsive-grid`), so it no longer draws `not-a-container`: a node written with it renders the "Unknown
666
+ component type" panel. Authors write `grid` with a breakpoint `columns` object. The rest of this entry is kept as the
667
+ reading of this change.
668
+
669
+ ⚠️ **Dated note, 2026-10-02 — the ten `sidebar-*` parts are retired — objectui#10859.**
670
+ Later in this same release objectui#10859 batch 8 (phase 2d) unregistered the ten `sidebar-*` parts, so their
671
+ `children` slot declarations left with them. `sidebar` keeps its declaration, and it now mounts its own provider
672
+ when none is above it, so the containment census measures it bare and its provider-scoped context probe is
673
+ gone, as is `sidebar-menu-button`'s. The rest of this entry is kept as the reading of this change.
674
+ - 73a3c89: Nav `visible`: an ancestor's predicate now reaches the whole subtree, and a group no longer outlives its children
675
+
676
+ The card reported that an app navigation item's `visible` CEL predicate was served to the
677
+ browser and then ignored, so the entry rendered for every user. That headline no longer
678
+ reproduces: measured on today's `main`, a leaf and a group whose predicate is `false` for the
679
+ session are both absent, and the same predicate evaluating `true` renders both — one run,
680
+ two sessions, asserted as a difference rather than as an absence. `evaluateVisibility`
681
+ routes the served `{ dialect, source }` envelope to the CEL engine, and `NavigationRenderer`
682
+ applies it per item.
683
+
684
+ Two paths into the same subtree did NOT apply it, and both are fixed here.
685
+
686
+ - **A pinned descendant escaped its hidden ancestor.** The Favorites section collects pinned
687
+ items by walking `children`, and that walk asked nothing about the node it was descending
688
+ through. So an author could gate a group with `visible`, watch the group disappear from the
689
+ tree, and still find a pinned entry from inside it rendered under Favorites — the predicate
690
+ evaluated, answered `false`, and changed nothing the excluded user could see. `visible`,
691
+ `requiredPermissions` and the `requiresObject` / `requiresService` capability gates all
692
+ leaked the same way, because the collection applied none of them. It now stops at a
693
+ gated-away node. A Favorites section whose every entry is gated away is no longer rendered
694
+ as a heading over an empty list.
695
+
696
+ - **A group whose children were all hidden rendered as an empty disclosure.** A labelled
697
+ collapsible that opens onto nothing is a dead affordance, and it contradicted
698
+ `hasVisibleNavigationItems` — the predicate the area switcher elects areas by, which already
699
+ scores such a group as contributing nothing and documents that it "can never disagree with
700
+ the rendered navigation". The renderer now asks that same predicate, so the sidebar and the
701
+ area list agree about what a user can reach. A group authored with no children at all
702
+ derives the same way, as it already did for area election.
703
+
704
+ The per-item guard sequence was written out twice and omitted once; it is now a single
705
+ `passesNavItemGuards` statement that `NavigationItemRenderer`, `hasVisibleNavigationItems`
706
+ and the Favorites collection share, so the three cannot drift again.
707
+
708
+ **Presentation, not authorization.** Hiding a nav entry is a UI affordance; the server still
709
+ enforces object and record permissions on every route an entry would have led to, and no
710
+ server-side check is touched. A user who types the URL directly gets the same answer as
711
+ before.
712
+
713
+ **Failure direction: fail-open, unchanged and now pinned.** A predicate that cannot be
714
+ evaluated still renders the entry, which is this tier's shipped policy. Hiding on error would
715
+ silently delete a user's navigation with no way to notice; showing on error leaves an entry
716
+ the server still refuses, and the unresolvable-predicate diagnostic still names the source.
717
+
718
+ ### Patch Changes
719
+
720
+ - cd7b728: `useAppShellBranding` now puts the previous favicon back when the shell unmounts
721
+ (objectui#10040), the same way it already puts the previous tab title back
722
+ (objectui#8637).
723
+
724
+ The hook's effect makes two branded writes to the document: `document.title` and the
725
+ `href` of the page's icon link. The title write was scoped to the mount; the favicon
726
+ write was not, so a branded `favicon` stayed on the icon link after the shell went
727
+ away unless something else happened to re-apply an icon. In the console that something was
728
+ `FaviconSync`, which wrote the icon only when an operator favicon was configured (until
729
+ objectui#10379 removed that write) — so on a deployment without one, the icon link kept
730
+ a branded app's URL after the user left the app.
731
+
732
+ When `branding.favicon` is set and the page has an icon link (`#favicon`, otherwise
733
+ `link[rel="icon"]`), the hook now records that link and its `href` attribute before
734
+ writing the branded URL, and restores the recorded attribute in the same cleanup that
735
+ restores the title — so switching from one branded app to another and then leaving
736
+ puts back the icon from before the first one. The attribute is captured rather than
737
+ the `href` property, because the property resolves an empty `href=""` (the console's
738
+ icon link before an operator favicon exists) to the page's own URL; an icon link that
739
+ had no `href` attribute is left without one. A shell with no `favicon`, or a page with
740
+ no icon link, is untouched in both directions, and the hook still never creates an
741
+ icon link.
742
+
743
+ As with the title, the restore replays the captured value unconditionally: an icon
744
+ written by something else while the shell is mounted is overwritten when it unmounts.
745
+ - c58b8e4: `ResponsiveGrid`'s component docblock no longer attributes its column map to the
746
+ spec's retired `BreakpointColumnMapSchema` (objectstack#11027 retired it; objectui#7580
747
+ re-homed the six-key shape as this package's own `BreakpointColumnMap`). The docblock
748
+ now names that local type. Text only: no member is added and no behaviour changes.
749
+ - f976774: An app's `branding.logo` now shows in the console, and it is the only logo spelling
750
+ (objectui#10827).
751
+
752
+ **The console renders it.** The designer (`AppCreationWizard`, `BrandingEditor`) writes an
753
+ app's `branding.logo` and previews it, but nothing mounted in the console drew it. Its only
754
+ reader was `AppSidebar`, which was never mounted and has since been removed. `UnifiedSidebar`,
755
+ the console's sidebar, now reads the active app's `branding.logo` and shows it as an image in a
756
+ header at the top of the sidebar. The image's alt text is the app's label. An app without a
757
+ logo gets no header, so its sidebar looks the same as before. The header appears only inside
758
+ an app. On Home the sidebar's fallback app is not the screen's app, so no logo is shown there.
759
+ `AppShellBranding` is unchanged: objectui#4818 removed its `logo` key, and this change does not
760
+ add it back.
761
+
762
+ **One spelling — breaking for a top-level `logo`.** `@objectstack/spec` declares the app logo
763
+ only as `branding.logo` (a URL). Its app schema refuses a top-level `logo` and suggests
764
+ `branding`. objectui had a second spelling of its own: `AppComponentSchema.logo`, described as
765
+ "Logo URL or icon name". This change retires it:
766
+
767
+ - `@object-ui/types`: `AppComponentSchema.logo` is now `never` on the TypeScript face, and the
768
+ zod mirror refuses a top-level `logo` by name, answering "Did you mean `logo` → `branding`?".
769
+ It is a named refusal rather than a deletion because the node is `.passthrough()`, and a
770
+ deleted key would be kept without any error. `wizardDraftToAppSchema` no longer copies the
771
+ draft's logo to the top level. The logo goes into `branding` only.
772
+ - `@object-ui/layout`: `AppSchemaRenderer`'s default sidebar header draws `branding.logo` as
773
+ an image. This includes site-relative paths and `data:` URIs, which the old read skipped
774
+ because it drew an image only for values starting with `http`. The header's icon now comes
775
+ from the app's `icon`.
776
+ - `@object-ui/runner`: `LayoutRenderer`'s sidebar brand mark does the same. It draws
777
+ `branding.logo` as an image and takes an icon name from `icon`. It no longer guesses the kind
778
+ of value from a `/` or `.`.
779
+
780
+ Migration: move a top-level `logo` URL to `branding: { logo: '…' }`. An icon name that was
781
+ written as `logo` belongs in `icon`. The published 17.6.0 changelog entry that removed
782
+ `AppShellBranding.logo` says the top-level `logo` is "rendered directly by
783
+ `AppSchemaRenderer`'s default sidebar header". That is no longer true: the header reads
784
+ `branding.logo`.
785
+ - 25cb364: The Studio's app wizard saves an app the platform accepts, and the app favicon has one
786
+ spelling, `branding.favicon` (objectui#10842).
787
+
788
+ **Creating an app is no longer refused.** The console's "create app" and "edit app" pages save through
789
+ `client.meta.saveItem('app', …)`, and the platform judges that document with
790
+ `@objectstack/spec`'s strict `AppSchema`. `wizardDraftToAppSchema` wrote four top-level keys the
791
+ spec does not declare (`type`, `title`, `favicon` and `layout`), so the save was refused with
792
+ `422 INVALID_METADATA` (`unrecognized_keys`). It now writes only declared keys: the draft's
793
+ title as `label`, the logo and favicon inside `branding`, and no `type` or `layout`. The spec
794
+ has no app layout, so the wizard's layout choice is not saved.
795
+
796
+ - `@object-ui/types` — **breaking:** `wizardDraftToAppSchema` now returns the app document
797
+ (the spec's `App` shape, with objectui's `NavigationItem[]` as `navigation`) instead of an
798
+ `AppComponentSchema` renderer node. It has no `type`, `title`, top-level `favicon` or `layout`.
799
+ Code that read `result.title` reads `result.label`. Code that fed the result to
800
+ `AppSchemaRenderer` builds the renderer node itself (`type: 'app'`, `title`).
801
+ - `@object-ui/types` — **breaking:** `AppComponentSchema.favicon` is now `never` on the
802
+ TypeScript face, and the zod mirror refuses a top-level `favicon` by name, answering "Did you
803
+ mean `favicon` → `branding`?". This is the objectui#10827 rule that retired the top-level
804
+ `logo`: the spec refuses the key, and the console reads only `branding.favicon`.
805
+ - `@object-ui/layout`: `AppSchemaRenderer` puts `branding.favicon` on the tab. It read the
806
+ top-level `favicon` before, and never `branding.favicon`.
807
+ - `@object-ui/plugin-designer`: `EditAppPage` keeps the keys the wizard does not maintain, but
808
+ only keys the spec's `AppSchema` declares, read from that schema. A row stored before the
809
+ schema closed is served with the old wizard's top-level keys, and echoing them made every
810
+ edit of such an app fail the same way. Its pre-fill no longer falls back onto a top-level
811
+ `logo`, `favicon` or `title`; it reads `branding.logo`, `branding.favicon` and `label`.
812
+
813
+ Migration: move a top-level `favicon` URL to `branding: { favicon: '…' }`.
814
+
815
+ ⚠️ **Dated note, 2026-09-28 — the wizard has no layout choice — objectui#10867.**
816
+ Later in this same release the wizard's Layout control was removed, with `AppWizardDraft.layout`, so there is no
817
+ layout choice left to not save. The rest of this entry still holds.
818
+ - 7343376: fix(types,plugin-designer)!: the Studio app wizard saves a document the platform accepts, and an edit keeps the stored `accentColor` (objectui#10867)
819
+
820
+ ⚠️ **BREAKING (authoring)**, marked `minor` under this repository's version-alignment rule (a `major` in the fixed group would move all of it off the `@objectstack` major). Two published `@object-ui/types` members narrow: a navigation separator no longer takes a `label`, and `AppWizardDraft.layout` is removed. A TypeScript literal that writes either no longer compiles. `NavigationItem` is now a union type alias, not an interface. So code that reads `label` off an unnarrowed `NavigationItem` into a `string` slot (its type is now `string | undefined`; objectui#11299, in the same release, widens it to the spec's `I18nLabel` or `undefined`, see `.changeset/11299-types-nav-label-locale-map.md`) also stops compiling, as does code that spreads an entry-only key onto one, and an `interface` that `extends NavigationItem` or augments it (extend `NavigationEntryItem` instead). `objectui validate` now refuses a separator `label` too: the zod mirror's `NavigationItemSchema` refuses every key on a separator that the spec's separator does not declare. The four `appDesigner` layout keys also leave the published `@object-ui/i18n` packs and `DESIGNER_DEFAULT_TRANSLATIONS`, so an application that calls `t()` with one of them now renders the raw key (unless the call passes a `defaultValue`).
821
+
822
+ **Clause-②: yes (narrowing)** — the separator arm of `NavigationItem` loses `label`, and `AppWizardDraft` loses `layout`.
823
+
824
+ - **A separator carries only `type`, `id` and `order`.** `@objectstack/spec`'s separator branch declares exactly those keys, and its `AppSchema` refuses anything else. `NavigationItem` required a `label` on every item, so the wizard's "Add separator" wrote `{ id, type: 'separator', label: '' }`, and the console's create-app and edit-app saves were refused with `422 INVALID_METADATA` (`unrecognized_keys` `['label']` at `navigation.N`). `NavigationItem` is now a union of two arms, discriminated by `type`. `NavigationEntryItem` holds every other nav type and keeps its required `label`. `NavigationSeparatorItem` admits `type`, `id` and `order`, and every other entry key is `?: never` on it. Both arms are exported. Reading an entry-only key off an unnarrowed item still compiles, but its type now includes `undefined` (a `label` is `string | undefined`; objectui#11299, in the same release, makes it the spec's `I18nLabel` or `undefined`, see `.changeset/11299-types-nav-label-locale-map.md`), so passing it where a `string` is required does not. Narrow on `item.type === 'separator'` before relying on `label`. `menuItemToNavigationItem` maps a legacy separator to `{ id, type: 'separator' }` and drops its label. `spec-derived-unions.test.ts` no longer pins the separator `label` as a blocker. It asserts, at both spec tiers, that the separator arm admits the spec separator's keys and no others.
825
+ - **`@object-ui/plugin-designer`: the wizard and `NavigationDesigner` write a separator as `{ id, type }`.** `NavigationDesigner` no longer writes a `label` onto a new separator, and its label, icon and visibility patchers skip one.
826
+ - **`@object-ui/layout` narrows on the separator arm; nothing it renders changes.** `resolveNavItemLabel` answers `''` for every separator. A stored separator carrying a non-empty `label`, which `menuItemToNavigationItem` produced before this change, used to resolve to that label. No renderer asks it for a separator's label. The mobile bottom nav's leaf list, which already skipped separators, is now typed as entries.
827
+ - **`@object-ui/app-shell` narrows the same way; nothing it renders changes.** `useNavPins` registers a favorite only for an entry and leaves a separator as it is, and the Studio sidebar's navigation walk passes a separator through unchanged.
828
+ - **`@object-ui/plugin-designer`: `EditAppPage` keeps the stored branding.** The wizard maintains the logo, primary colour and favicon, and its `branding` replaced the stored block, so a stored `accentColor` was dropped on every edit. The console reads that key. The save now keeps every stored `branding` key the spec's `AppBrandingSchema` declares, read from that schema. The wizard's values win for the keys it maintains. A stored key the spec does not declare is still left out.
829
+ - **The wizard's Layout control is removed, with `AppWizardDraft.layout`.** The spec declares no app `layout`, no console surface reads one, and since objectui#10842 the save wrote none. The control persisted nothing. `EditAppPage` no longer reads a stored `layout` into the draft. The Basic Info step's description now reads "Name, title, and icon".
830
+ - **`@object-ui/i18n`:** the four `appDesigner` layout keys (`layout`, `layoutSidebar`, `layoutHeader` and `layoutEmpty`) are removed from all ten packs, and `appDesigner.stepBasicDesc` no longer names a layout.
831
+
832
+ **Migration:** write a separator as `{ id, type: 'separator' }`, with an optional `order`. Remove `layout` from any `AppWizardDraft` you build. Code that spreads an entry-only key (`label`, `visible`, `requiredPermissions` and the rest) onto a value typed `NavigationItem` narrows it first (`item.type !== 'separator'`) or types it `NavigationEntryItem`: the separator arm refuses those keys. `AppComponentSchema.layout`, the renderer node's own layout strategy, is a different member and is unchanged.
833
+
834
+ Pinned in `packages/types/src/__tests__/app-wizard-separator-layout-10867.test.ts` and `packages/plugin-designer/src/__tests__/AppWizard.specDocument-10867.test.tsx`.
835
+ - 1ccb5ba: fix(layout): a present navigation label renders as written, with no exception, and an inline locale-map label renders its text (objectui#11201)
836
+
837
+ A navigation entry's text now follows one rule. A present label is shown as written. An absent label
838
+ shows the current, localized label of what the entry opens.
839
+
840
+ - **Visible change.** An entry whose stored label is its target's machine name (for example
841
+ `account`, `sales_overview`) used to be translated, because the sidebar looked that text up as
842
+ the object's, view's or dashboard's name. It now shows the name as written, in every locale.
843
+ **To fix such an entry:** clear its label so it inherits the target's localized label, or set the
844
+ text you want shown. Stored navigation is not converted, and no notice is sent.
845
+ - An entry label written as an inline locale map (`{ en: 'Accounts', 'zh-CN': '客户' }`) used to
846
+ render as empty text. It now renders the map's text. objectui#11201 did not tell the sidebar the
847
+ viewer's locale, so it read the `en` entry, then `default`, then any entry; objectui#11299, in the
848
+ same release, gives the sidebar the viewer's locale (`.changeset/11299-layout-nav-label-locale.md`).
849
+ - `NavigationRenderer`'s `resolveObjectLabel`, `resolveDashboardLabel` and `resolveViewLabel` props,
850
+ and the matching arguments of `resolveNavItemLabel`, are no longer read. objectui#11201 still
851
+ accepted them, so no caller broke; objectui#11299, in the same release, removes them
852
+ (`.changeset/11299-layout-nav-label-locale.md`). An unlabelled entry's localized text comes from
853
+ `resolveTargetLabel`.
854
+ - c18a075: fix(layout): the mobile tab bar opens the same page as the sidebar (objectui#11211)
855
+
856
+ With `mobileNavMode: 'bottom_nav'`, `AppSchemaRenderer`'s bottom tab bar used to
857
+ build each tab's link itself, so some navigation entries opened a different page
858
+ there than in the sidebar:
859
+
860
+ - a record deep link (`recordId`) opened the object's list instead of the record;
861
+ - an entry with `filters` opened the list without its filter;
862
+ - an entry with `runAction` opened the list without running its action;
863
+ - a `metadata:*` component entry opened the generic component route instead of
864
+ the metadata page;
865
+ - a `page` entry dropped its `params`, and `recordMode: 'edit'` was ignored.
866
+
867
+ Every tab now links to exactly the page its sidebar row links to. Two related
868
+ behaviours follow the sidebar too: the highlighted tab is the one whose sidebar
869
+ row is highlighted (at most one tab lights, and a filtered or quick-action tab
870
+ lights on its own page), and a `url` entry with `target: '_blank'` opens in a
871
+ new browser tab.
872
+ - 5ad9f5d: fix(layout): the mobile tab bar draws only the entries its sidebar draws
873
+
874
+ `AppSchemaRenderer` with `mobileNavMode: 'bottom_nav'` drew its tab bar from the
875
+ navigation tree with no entry guard. An entry the author hid with `visible: false`,
876
+ or gated with `requiredPermissions` the viewer lacks, was hidden in the sidebar and
877
+ still drawn as a tab, and an `action` entry became a tab linking to the root. The
878
+ five-tab cap was applied before any guard, so a hidden entry also took the place of
879
+ one that should have shown.
880
+
881
+ The bar now asks the sidebar's own guard about every node, through
882
+ `hasVisibleNavigationItems` (the predicate the area list already uses, built on
883
+ `passesNavItemGuards`), with the same evaluator, permission checker, capability
884
+ checker and doc-target checker the sidebar gets. The guard runs before the cap, and a
885
+ group the viewer may not see takes its entries with it, as in the sidebar. An
886
+ `action` entry is drawn the sidebar's way, as a button that hands the whole item to
887
+ `onAction`, and is left off the bar when no `onAction` is wired, which is when the
888
+ sidebar hides it too.
889
+
890
+ These are UI visibility gates, not data access: a route behind a wrongly drawn tab
891
+ still answered with its own server-side checks.
892
+ - 7728c67: fix(layout): the mobile tab bar draws its tabs in the sidebar's order, and shows an entry's badge
893
+
894
+ `AppSchemaRenderer` with `mobileNavMode: 'bottom_nav'` drew its tab bar in authored
895
+ position and never read `order`. Two entries written `Zeta` (`order: 2`) then
896
+ `Ypsilon` (`order: 1`) came out `Ypsilon, Zeta` in the sidebar and `Zeta, Ypsilon` on
897
+ the bar. With more than five entries, the five-tab cap kept the first five by authored
898
+ position rather than the five the sidebar lists first.
899
+
900
+ The bar now sorts each level with the sidebar's own comparator before it flattens:
901
+ first the top level, then each group's children. The guard and the five-tab cap run
902
+ after the sort, so the five tabs are the first five entries the sidebar draws. The
903
+ comparator lives in one internal module, and the sidebar's two sort sites use it too.
904
+ It is not exported, so the package's public API does not change. An entry with no
905
+ `order` still sorts as `0`, and entries with equal `order` keep their authored order,
906
+ as in the sidebar before.
907
+
908
+ The bar also dropped an entry's `badge` and `badgeVariant`. It now draws them on the
909
+ tab with the same `Badge` component and the same variant the sidebar row uses.
910
+ - d9a0490: Correct the `AppShellBranding.title` doc comment. It read "Page title
911
+ suffix (sets document.title)" while `useAppShellBranding` assigns `document.title = title`
912
+ wholesale — nothing is appended; the caller composes the whole string (the console passes
913
+ `"App label — Product name"`). That comment ships in `dist/index.d.ts` and is the only
914
+ description a consumer sees on editor hover, so a reader who followed it passed a
915
+ suffix-only fragment and got a truncated title with no error. The comment now carries the
916
+ same wording as `content/docs/layout/app-shell.mdx`, and agrees with the `AppShellProps`
917
+ tables in the package README and `content/docs/guide/layout.md`. No runtime behaviour
918
+ changes; the wholesale assignment and the four-surface agreement are now pinned by tests.
919
+ - 63a8828: Record headers: give the title column a width floor so a wide action tail can no
920
+ longer starve it.
921
+
922
+ Two headers repeated the title/action width arbitration objectui#7244 fixed on
923
+ `page:header`. Both were measured in Chromium at a 799px viewport with three
924
+ labelled `record_header` actions, before and after:
925
+
926
+ | header | before | after |
927
+ | --- | --- | --- |
928
+ | `DetailView` (`type: 'detail'`, the header that renders when the host supplies no `page:header`) | h1 6.17px of a 218px title | 218.39px, tail wrapped to its own line |
929
+ | `PageHeader` (`@object-ui/layout`) | h1 170.59px of a 265px title | 751.00px, tail wrapped to its own line |
930
+
931
+ `DetailView` gets the precedent's two utilities, both `sm:`-scoped so the
932
+ sub-640px column layout is untouched: `sm:flex-wrap` on the row and
933
+ `sm:min-w-64` on the title column. The floor is one step above the precedent's
934
+ `sm:min-w-48` because this title column carries the 40px back button and a 12px
935
+ gap inside it, so 256px is what leaves the h1 the same ~192px readable floor.
936
+
937
+ `PageHeader`'s row already wrapped, so it needed only the floor — and that floor
938
+ is unconditional rather than `sm:`-scoped, because this row has no
939
+ breakpoint-scoped direction change and the squeeze measures worse just below
940
+ `sm` (639px: h1 10.59px of a 212px title). `min-w-48` replaces `min-w-0` rather
941
+ than joining it: an explicit min-width overrides a flex item's automatic
942
+ min-content minimum exactly as `min-w-0` did, so long titles still ellipsise
943
+ (measured at 799px: 751px rendered of a 1682px title, no horizontal overflow).
944
+
945
+ Wide viewports are unchanged: at 1440px both headers keep the tail on the
946
+ title's line with the title unclipped, before and after alike.
947
+ - c6198c2: **Breaking for authored metadata:** `ComponentInput.label`, `ComponentInput.defaultValue` and
948
+ `ComponentInput.advanced` are RETIRED on both faces (objectui#7493 item ① and objectui#7781;
949
+ maintainer ruling A of 2026-09-06, immediate, no deprecation window; ADR-0049 enforce-or-remove).
950
+ They are the three keys the manifest serializer does not forward, and nothing read them on any
951
+ publication or consumption path.
952
+
953
+ No manifest ever published them, so no consumer could ever have read them. `sdui-parser`'s
954
+ serializer (`packages/sdui-parser/src/index.ts`) forwards exactly seven keys per input — `name`,
955
+ `type`, `of`, `required`, `enum`, `binding`, `description` — so a value authored under any of the three
956
+ never reached `sdui.manifest.json`, the generated JSX `.d.ts`, or a diagnostic; its boundary type
957
+ has no slot for them; the registry's data-source seam reads `name` only; and neither the designer
958
+ nor the app-shell inspectors consult registry `inputs` at all. A structural census over every
959
+ `inputs:` array in the repository (re-measured on this change's merge-base, `name` 951 and `type`
960
+ 951 as the controls) counted the writes: `label` 908, `defaultValue` 245, `advanced` 9 — written on
961
+ nearly every registration, read by nothing.
962
+
963
+ FROM → TO, per key — all three **TOMBSTONED, not removed**, because the route was measured on
964
+ the built face before it was chosen: `ComponentInputSchema` is a non-strict `z.object`, and an
965
+ undeclared key parses GREEN and is silently STRIPPED, so a deletion would have swallowed 1,162
966
+ authored values in silence. The tombstone is what makes the refusal loud and by name.
967
+
968
+ - `label?: string` → `label?: never` on the interface, `retirementTombstone()` on the Zod mirror.
969
+ Migration: delete the key. An input is identified by its `name` on every path that reaches it;
970
+ nothing ever rendered a label for it.
971
+ - `defaultValue?: any` → `defaultValue?: never` / `retirementTombstone()`. Migration: delete the
972
+ key. The renderer's own fallback read IS the default; tell the author about it in `description`,
973
+ which IS published. (Tightening the type to `unknown` was ruled out: it closes no error class,
974
+ since nothing reads the value.)
975
+ - `advanced?: boolean` → `advanced?: never` / `retirementTombstone()`. Migration: delete the key.
976
+ No designer surface ever hid an "advanced" input; there is nothing to write instead.
977
+
978
+ The retirement kit: `?: never` on `ComponentInput` (`packages/types/src/base.ts`), so authoring one
979
+ is a `tsc` error at the registration site; `retirementTombstone()` on `ComponentInputSchema`
980
+ (`packages/types/src/zod/base.zod.ts`), so an authored value is REFUSED at parse time with
981
+ `code: 'invalid_type'`, the key named in the issue `path`, and the migration note as the message
982
+ (one string, both channels). Pinned in
983
+ `packages/types/src/__tests__/component-input-retired-keys-7493.test.ts`, which also holds a
984
+ tree-scoped absence census over every `inputs:` array under `packages/**` and `apps/**`.
985
+
986
+ Accept-set change, stated plainly for reviewers: a document that sets any of the three keys on a
987
+ `ComponentInput` used to parse GREEN (the value was then dropped by the serializer) and now parses
988
+ RED. Every in-repo authoring site — 1,199 keys across 110 registration files, the three standalone
989
+ `ComponentInput[]` arrays and the two named input arrays `tsc` found included — is deleted in the same change, as the ruling's split rule
990
+ requires; the `WidgetRegistry` seam no longer copies the widget-manifest values onto the synthesized
991
+ `ComponentInput` (they fed nothing), and the data-source declaration `ELEMENT_DATA_SOURCE_INPUT`
992
+ drops its `label`. The patch entries on the other packages record exactly that: their registrations
993
+ stop authoring inert keys, with no runtime or published-manifest change.
994
+
995
+ The nine test files that read `defaultValue` off a registration were re-pinned against the
996
+ renderer's ACTUAL default (its own fallback read, or the `defaultProps` it ships) instead of the
997
+ declaration that went away; two assertions that only restated the shadow default were dropped with
998
+ the reason on the line.
999
+
1000
+ The in-repo zero is what was measured. Whether anything OUTSIDE this repository writes these keys
1001
+ is not measurable from here (the objectui#5674 limit); converting such a write from a silent drop
1002
+ into a named refusal is exactly what the tombstones buy. `WidgetInput`'s own `label` /
1003
+ `defaultValue` / `advanced` (the widget-manifest face) stay declared and writable — nothing has
1004
+ ruled on that face; that it now has no reader either is recorded as objectui#7911.
1005
+ - f4abff4: `@object-ui/layout` and `@object-ui/plugin-dashboard` no longer install a React of their
1006
+ own. `react` moves from `dependencies` to `devDependencies` at the same pin (`19.2.8`);
1007
+ `peerDependencies` is untouched, so both packages still ask their host for
1008
+ `^18.0.0 || ^19.0.0` (objectui#8303).
1009
+
1010
+ Both manifests were making two contradictory statements at once: asking the host for React
1011
+ as a peer, and pinning an exact React 19 of their own. The peer range is the one a consumer
1012
+ reads; the pin is the one their installer acts on. A consumer on React 18 therefore
1013
+ satisfied the peer range and **still** got a second, pinned React 19 pulled into their
1014
+ graph on these two packages' account. Two React copies in one tree is the classic cause of
1015
+ `Invalid hook call`, and the failure is not at install time — it is at first render, in the
1016
+ consumer's own component, with nothing pointing back at these manifests.
1017
+
1018
+ Re-measured on `origin/main` at `348725a7c` across all four `pnpm-workspace.yaml` globs
1019
+ (46 packages), rather than inherited from the card:
1020
+
1021
+ declares a react peer AND pins react in dependencies 2 layout, plugin-dashboard
1022
+ declares a react-dom peer AND pins it in dependencies 0 (objectui#8198 took that half)
1023
+ pins react in dependencies with NO react peer 5 runner, site, 3 examples
1024
+
1025
+ The last row is the control that keeps the fix narrow. Those five are applications that
1026
+ supply React rather than libraries that ask for it: one statement, not two, and correctly
1027
+ untouched. Against the 20+ sibling libraries the two packages fixed here were the only
1028
+ outliers, so this converges on the existing house shape — `app-shell`, `auth`,
1029
+ `collaboration`, `i18n`, `mobile` and `permissions` already carry `react` in
1030
+ `devDependencies` at exactly this pin.
1031
+
1032
+ `scripts/__tests__/react-peer-range-norm-3741.test.ts` gains the invariant so a regression
1033
+ goes red rather than being re-found by a consumer. That file already owns React manifest
1034
+ norms across the fixed version group, already walks the workspace globs, and already
1035
+ governs `react` + `react-dom`, so this is a second assertion on an existing guard rather
1036
+ than a new one. It asserts the CONTRADICTION, not "React in `dependencies`" — widening it
1037
+ further would go red on the five applications above for doing the right thing.
1038
+
1039
+ Two gates are green on this shape by construction and neither green was a reading of it.
1040
+ `check:unused-deps` asks whether a declared runtime dependency has a consumer, and `react`
1041
+ is imported by both packages — which is exactly why objectui#8198 could see and remove the
1042
+ `react-dom` half here and could not see this one. `check-changeset-presence.mjs` reads an
1043
+ eight-field allowlist that includes `peerDependencies` and deliberately excludes
1044
+ `dependencies`; its own docblock states the trade ("a runtime dependency bump can be just
1045
+ as user-visible as any of the eight, and this gate still does not see it"). This changeset
1046
+ is therefore owed by the house rule, not demanded by the gate.
1047
+ - 0febe1a: The console tab title no longer reverts to the bare product name after an in-app
1048
+ navigation (objectui#8637).
1049
+
1050
+ Two effects wrote `document.title` on different keys. The console's `BrandingSync`
1051
+ was keyed on `useLocation()` and assigned the bare product name on **every route
1052
+ change**; `useAppShellBranding` assigns the composed `"App label — Product name"`
1053
+ from an effect keyed on that string, so it fires when the title changes and not on
1054
+ navigation. Both run on the commit that mounts the shell, and the composed title
1055
+ wins — which is why the tab looked right and the defect stayed hidden. Navigating
1056
+ between two pages of the same app moved `location` and not the composed title, so
1057
+ only the route-keyed writer ran and the tab fell back to the bare product name.
1058
+ Measured in a real browser, not inferred.
1059
+
1060
+ The repair is one writer rather than two careful ones. `useAppShellBranding` now
1061
+ owns `document.title` for as long as a shell is mounted: it captures whatever the
1062
+ tab already said, writes `title` over it, and puts the captured string back when the
1063
+ shell unmounts or `title` changes. That is what let the console's route-keyed writer
1064
+ drop its title assignment entirely — it had doubled as the reset that took the app
1065
+ label back off the tab on the way out — and it became `FaviconSync`, which kept only
1066
+ the favicon write until objectui#10379 removed that too.
1067
+
1068
+ For hosts of `@object-ui/layout`: the forward assignment is unchanged, and a shell
1069
+ with no `title` still leaves the tab untouched in both directions. What is new is the
1070
+ restore, so a shell mounted over part of a route tree hands the title back on exit
1071
+ instead of stranding it. The restore replays the captured string unconditionally, so
1072
+ a surface that writes the tab title from **inside** a mounted shell has its value
1073
+ overwritten on unmount; keep such surfaces outside the shell.
1074
+ - fe76ece: The typings both packages publish now carry an explicit extension on every relative specifier, so a consumer on `moduleResolution: nodenext` can follow them.
1075
+
1076
+ `vite-plugin-dts` emits one declaration file per source file, and TypeScript
1077
+ copies a module specifier into the declaration verbatim. `export * from './ui'`
1078
+ therefore shipped extensionless in `dist/index.d.ts` — 21 such re-exports in
1079
+ `@object-ui/components`, 7 in `@object-ui/layout`, 128 across the two emitted
1080
+ trees. Node16/NodeNext resolution does not extension-search a relative
1081
+ specifier, so the compiler could follow none of the hops and every symbol they
1082
+ carried read as absent from the package:
1083
+
1084
+ ```
1085
+ error TS2305: Module '"@object-ui/components"' has no exported member 'Badge'.
1086
+ ```
1087
+
1088
+ Measured on `@object-ui/app-shell`, the largest consumer and the one that pulls
1089
+ in both packages: 880 TS2305 across 162 files (864 from `components`, 16 from
1090
+ `layout`), plus 215 TS7006 as fallout from the imports that stopped resolving.
1091
+ On `@object-ui/fields`, 178 TS2305 and 57 TS7006. Both are zero now.
1092
+
1093
+ The emitted `.js` never had the defect — rolldown resolves the same specifier
1094
+ away — which is why `pnpm check:esm-specifiers`, whose verdict is about
1095
+ specifier-preserving `.js` builds, correctly never scanned either package. The
1096
+ fix is therefore in the declaration EMIT (`scripts/vite-dts-explicit-extensions.ts`,
1097
+ shared by both `vite.config.ts` files), not in the sources: the same source line
1098
+ produces a clean `.js` and a broken `.d.ts`, so no source edit can express the
1099
+ difference. The rewriter resolves each specifier against the source tree the
1100
+ output mirrors — a file hop becomes `./x.js`, a directory hop `./x/index.js` —
1101
+ throws on anything it cannot resolve, and after the build re-parses the emitted
1102
+ declarations to assert every relative specifier both carries an extension and
1103
+ names a file the build really emitted.
1104
+
1105
+ `packages/fields` takes the `nodenext` pin as a result — the same two lines
1106
+ `packages/react` has carried since objectui#4538 — so the property is enforced by
1107
+ the compiler on the consumer side rather than by review. `packages/app-shell`
1108
+ does not: it type-checks clean without the pin and still shows 23 errors with it,
1109
+ none of them from these two packages. That residue is filed separately.
1110
+ - fb336df: Move `lucide-react` from `^1.31.0` to `^1.43.0` in every package that declares it, and
1111
+ repair what the jump breaks, so icons resolved from a STRING keep drawing a glyph.
1112
+
1113
+ Measured once against the installed 1.43.0 artifact when this change was made; nothing in
1114
+ the repository re-derives these readings. Across the jump lucide removes no runtime export,
1115
+ no public type name and no `lucide-react/dynamic.mjs` name, and every name this repository
1116
+ imports from `lucide-react` resolves. Exactly one key leaves the runtime `icons` record:
1117
+ `Trash2`, retired in favour of `trash`.
1118
+
1119
+ What a user sees change:
1120
+
1121
+ - Icons the lazy icon seam draws (`resolveIcon`, objectui#9251) get their path data again.
1122
+ lucide 1.43.0 icon modules export their path data inside `__iconData` and no longer
1123
+ export `__iconNode`; the seam now reads both. Reading only `__iconNode` against 1.43.0
1124
+ leaves every such glyph an empty box, with nothing thrown or logged.
1125
+ - `DetailView`'s delete action and three schema-catalog examples spell their icon
1126
+ `trash`, not `trash-2`, so they keep resolving. The glyph is unchanged: 1.43.0's `trash`
1127
+ path data is byte-identical to the `trash-2` path data of 1.31.0 and 1.35.0. Anything
1128
+ that already authored `trash` now draws that same artwork, because lucide moved it under
1129
+ the `trash` name; a few other glyphs were also redrawn upstream.
1130
+ - Icons imported as COMPONENTS carry lucide 1.43.0's own classes: one class per declared
1131
+ alias (a spinner renders `class="lucide lucide-loader-circle lucide-loader-2 ..."`), and
1132
+ no longer the class lucide used to derive from the PascalCase key where that differs
1133
+ (`ArrowDown01` no longer carries `lucide-arrow-down01`). The canonical
1134
+ `lucide-<icon name>` class is still there, so a `.lucide-loader-circle` selector still
1135
+ matches.
1136
+ - Icons resolved from a STRING through the seam keep the classes they had: `lucide`, the
1137
+ canonical `lucide-<icon name>` class and the key-derived class. They do not carry
1138
+ lucide's per-alias classes. That is a maintainer ruling (objectui#8941, option C): the
1139
+ alias list lives only inside each lazily loaded icon module, and it was not moved into
1140
+ the eager name list. A selector that targets an alias class matches a component-imported
1141
+ icon and not a string-resolved one. This also dates the example in the objectui#9251
1142
+ entry: `trash-2` no longer resolves as a string, so no seam-drawn glyph carries
1143
+ `lucide-trash2 lucide-trash-2`; a digit-bearing name that still resolves, such as
1144
+ `arrow-down-0-1`, carries `lucide-arrow-down01 lucide-arrow-down-0-1`.
1145
+ - Updated dependencies [7b10bef]
1146
+ - Updated dependencies [97abedc]
1147
+ - Updated dependencies [b46c58f]
1148
+ - Updated dependencies [ad694ac]
1149
+ - Updated dependencies [6f96fca]
1150
+ - Updated dependencies [0aacecc]
1151
+ - Updated dependencies [777fca2]
1152
+ - Updated dependencies [c131d9e]
1153
+ - Updated dependencies [5f00ff4]
1154
+ - Updated dependencies [c9e073a]
1155
+ - Updated dependencies [7b395d8]
1156
+ - Updated dependencies [0879812]
1157
+ - Updated dependencies [8cedb0d]
1158
+ - Updated dependencies [162621b]
1159
+ - Updated dependencies [4c6f549]
1160
+ - Updated dependencies [6cc910b]
1161
+ - Updated dependencies [061f5e8]
1162
+ - Updated dependencies [2dd4d3f]
1163
+ - Updated dependencies [4ab4f1b]
1164
+ - Updated dependencies [e3ea4f9]
1165
+ - Updated dependencies [8b1f066]
1166
+ - Updated dependencies [af243c1]
1167
+ - Updated dependencies [cff4b77]
1168
+ - Updated dependencies [961ceaa]
1169
+ - Updated dependencies [f3f4e4c]
1170
+ - Updated dependencies [a05c350]
1171
+ - Updated dependencies [2b5f509]
1172
+ - Updated dependencies [808f339]
1173
+ - Updated dependencies [6cf5999]
1174
+ - Updated dependencies [274e14a]
1175
+ - Updated dependencies [8c10f4f]
1176
+ - Updated dependencies [90dac98]
1177
+ - Updated dependencies [6096f20]
1178
+ - Updated dependencies [544aca2]
1179
+ - Updated dependencies [ea02938]
1180
+ - Updated dependencies [a14fb23]
1181
+ - Updated dependencies [ae98f1d]
1182
+ - Updated dependencies [f98eddf]
1183
+ - Updated dependencies [ce6bd99]
1184
+ - Updated dependencies [a5b08c9]
1185
+ - Updated dependencies [86982ac]
1186
+ - Updated dependencies [cdefa2a]
1187
+ - Updated dependencies [0961d5e]
1188
+ - Updated dependencies [6276478]
1189
+ - Updated dependencies [ff14e29]
1190
+ - Updated dependencies [9b28151]
1191
+ - Updated dependencies [64563a9]
1192
+ - Updated dependencies [1a5003f]
1193
+ - Updated dependencies [09ab32b]
1194
+ - Updated dependencies [8acc51b]
1195
+ - Updated dependencies [93a689d]
1196
+ - Updated dependencies [e5f4343]
1197
+ - Updated dependencies [3261e64]
1198
+ - Updated dependencies [f5178a2]
1199
+ - Updated dependencies [2ad3671]
1200
+ - Updated dependencies [d22b37b]
1201
+ - Updated dependencies [1daf477]
1202
+ - Updated dependencies [3d614ea]
1203
+ - Updated dependencies [6c2f3c5]
1204
+ - Updated dependencies [fb13e85]
1205
+ - Updated dependencies [c2d8659]
1206
+ - Updated dependencies [e0f8202]
1207
+ - Updated dependencies [9fbbb17]
1208
+ - Updated dependencies [c3a26cc]
1209
+ - Updated dependencies [a66e58e]
1210
+ - Updated dependencies [d89492c]
1211
+ - Updated dependencies [9a5f998]
1212
+ - Updated dependencies [9327397]
1213
+ - Updated dependencies [17cc3a3]
1214
+ - Updated dependencies [02e6d36]
1215
+ - Updated dependencies [4758b33]
1216
+ - Updated dependencies [4758b33]
1217
+ - Updated dependencies [9c78ebe]
1218
+ - Updated dependencies [9c78ebe]
1219
+ - Updated dependencies [12809a5]
1220
+ - Updated dependencies [7afc81d]
1221
+ - Updated dependencies [f9c06ef]
1222
+ - Updated dependencies [5ad3b88]
1223
+ - Updated dependencies [f9d772b]
1224
+ - Updated dependencies [97b6c21]
1225
+ - Updated dependencies [26ca2ad]
1226
+ - Updated dependencies [41ae65b]
1227
+ - Updated dependencies [baac95a]
1228
+ - Updated dependencies [13220af]
1229
+ - Updated dependencies [29b45f6]
1230
+ - Updated dependencies [39b8d51]
1231
+ - Updated dependencies [17b323e]
1232
+ - Updated dependencies [b956e69]
1233
+ - Updated dependencies [33e58d8]
1234
+ - Updated dependencies [256b4c9]
1235
+ - Updated dependencies [c5ec15c]
1236
+ - Updated dependencies [fec3b1a]
1237
+ - Updated dependencies [b8e0941]
1238
+ - Updated dependencies [0c50f18]
1239
+ - Updated dependencies [1dae95a]
1240
+ - Updated dependencies [e32dae1]
1241
+ - Updated dependencies [30b11ad]
1242
+ - Updated dependencies [4aebea0]
1243
+ - Updated dependencies [f976774]
1244
+ - Updated dependencies [3d6badf]
1245
+ - Updated dependencies [25cb364]
1246
+ - Updated dependencies [a60539b]
1247
+ - Updated dependencies [de1b879]
1248
+ - Updated dependencies [c6678b1]
1249
+ - Updated dependencies [0638322]
1250
+ - Updated dependencies [e3782d2]
1251
+ - Updated dependencies [db0beb2]
1252
+ - Updated dependencies [997ce38]
1253
+ - Updated dependencies [ae0b9d3]
1254
+ - Updated dependencies [ad1785c]
1255
+ - Updated dependencies [3b469c8]
1256
+ - Updated dependencies [990a2d6]
1257
+ - Updated dependencies [1c84036]
1258
+ - Updated dependencies [1c84036]
1259
+ - Updated dependencies [6650259]
1260
+ - Updated dependencies [4f8b7f8]
1261
+ - Updated dependencies [9e6619f]
1262
+ - Updated dependencies [f6ae5e2]
1263
+ - Updated dependencies [7343376]
1264
+ - Updated dependencies [b2683a2]
1265
+ - Updated dependencies [dded788]
1266
+ - Updated dependencies [b45d463]
1267
+ - Updated dependencies [54a7830]
1268
+ - Updated dependencies [f3135a4]
1269
+ - Updated dependencies [b5696d3]
1270
+ - Updated dependencies [3f9d926]
1271
+ - Updated dependencies [e978ed5]
1272
+ - Updated dependencies [6a7f24e]
1273
+ - Updated dependencies [b3c96d6]
1274
+ - Updated dependencies [8d0ca91]
1275
+ - Updated dependencies [c30c8dd]
1276
+ - Updated dependencies [deca847]
1277
+ - Updated dependencies [328abeb]
1278
+ - Updated dependencies [dd0d78f]
1279
+ - Updated dependencies [24d3e65]
1280
+ - Updated dependencies [95a7c8d]
1281
+ - Updated dependencies [e227156]
1282
+ - Updated dependencies [cc4e476]
1283
+ - Updated dependencies [92970c4]
1284
+ - Updated dependencies [d570eaa]
1285
+ - Updated dependencies [4b742f4]
1286
+ - Updated dependencies [42687ba]
1287
+ - Updated dependencies [6cd8f66]
1288
+ - Updated dependencies [24a0f14]
1289
+ - Updated dependencies [797a30f]
1290
+ - Updated dependencies [b4075c0]
1291
+ - Updated dependencies [9b85600]
1292
+ - Updated dependencies [99878d8]
1293
+ - Updated dependencies [3c13675]
1294
+ - Updated dependencies [63ab761]
1295
+ - Updated dependencies [0eb9f36]
1296
+ - Updated dependencies [ae582b7]
1297
+ - Updated dependencies [a4b017e]
1298
+ - Updated dependencies [559a2e2]
1299
+ - Updated dependencies [db11afd]
1300
+ - Updated dependencies [154075a]
1301
+ - Updated dependencies [582edef]
1302
+ - Updated dependencies [19f484f]
1303
+ - Updated dependencies [0a78a20]
1304
+ - Updated dependencies [615346d]
1305
+ - Updated dependencies [75dcc81]
1306
+ - Updated dependencies [55a12a8]
1307
+ - Updated dependencies [edfcf5a]
1308
+ - Updated dependencies [0a3e540]
1309
+ - Updated dependencies [c021b35]
1310
+ - Updated dependencies [f61dab1]
1311
+ - Updated dependencies [b0a05dd]
1312
+ - Updated dependencies [dd5ff19]
1313
+ - Updated dependencies [81f8498]
1314
+ - Updated dependencies [a782fa7]
1315
+ - Updated dependencies [0645133]
1316
+ - Updated dependencies [76e9df0]
1317
+ - Updated dependencies [0ecaa7d]
1318
+ - Updated dependencies [b24f93a]
1319
+ - Updated dependencies [6158e4c]
1320
+ - Updated dependencies [c27b575]
1321
+ - Updated dependencies [84b275c]
1322
+ - Updated dependencies [0e6e76b]
1323
+ - Updated dependencies [bf43afa]
1324
+ - Updated dependencies [858eafb]
1325
+ - Updated dependencies [0ffc423]
1326
+ - Updated dependencies [3cc4fe5]
1327
+ - Updated dependencies [cd5b19a]
1328
+ - Updated dependencies [cd5b19a]
1329
+ - Updated dependencies [17dc167]
1330
+ - Updated dependencies [20d23be]
1331
+ - Updated dependencies [20d23be]
1332
+ - Updated dependencies [2e3da72]
1333
+ - Updated dependencies [1263e40]
1334
+ - Updated dependencies [e6bc087]
1335
+ - Updated dependencies [8bab157]
1336
+ - Updated dependencies [a7557a7]
1337
+ - Updated dependencies [7d074ba]
1338
+ - Updated dependencies [6158e4c]
1339
+ - Updated dependencies [6158e4c]
1340
+ - Updated dependencies [52aad5c]
1341
+ - Updated dependencies [18d1a0a]
1342
+ - Updated dependencies [7fed09d]
1343
+ - Updated dependencies [58da8ae]
1344
+ - Updated dependencies [a8b9889]
1345
+ - Updated dependencies [138ad45]
1346
+ - Updated dependencies [138ad45]
1347
+ - Updated dependencies [5262f7d]
1348
+ - Updated dependencies [6aa029b]
1349
+ - Updated dependencies [2124d04]
1350
+ - Updated dependencies [be52115]
1351
+ - Updated dependencies [770cc5b]
1352
+ - Updated dependencies [1a88ce2]
1353
+ - Updated dependencies [a1a44d6]
1354
+ - Updated dependencies [e0a9c67]
1355
+ - Updated dependencies [5638529]
1356
+ - Updated dependencies [5638529]
1357
+ - Updated dependencies [c476be0]
1358
+ - Updated dependencies [c82ff39]
1359
+ - Updated dependencies [6c3da53]
1360
+ - Updated dependencies [31987bd]
1361
+ - Updated dependencies [3c3ce15]
1362
+ - Updated dependencies [063119f]
1363
+ - Updated dependencies [e100589]
1364
+ - Updated dependencies [304f611]
1365
+ - Updated dependencies [e46ee77]
1366
+ - Updated dependencies [f9c8c4e]
1367
+ - Updated dependencies [6e9c8d2]
1368
+ - Updated dependencies [9547063]
1369
+ - Updated dependencies [3f6efd6]
1370
+ - Updated dependencies [c4ab6d0]
1371
+ - Updated dependencies [0e9058b]
1372
+ - Updated dependencies [5988b6b]
1373
+ - Updated dependencies [6158e4c]
1374
+ - Updated dependencies [00ccdf7]
1375
+ - Updated dependencies [9d9ed54]
1376
+ - Updated dependencies [4a1adb7]
1377
+ - Updated dependencies [50c73fe]
1378
+ - Updated dependencies [ca3de72]
1379
+ - Updated dependencies [83e3f83]
1380
+ - Updated dependencies [401611b]
1381
+ - Updated dependencies [2c0ddf2]
1382
+ - Updated dependencies [4abc0aa]
1383
+ - Updated dependencies [f560ded]
1384
+ - Updated dependencies [2b188fa]
1385
+ - Updated dependencies [b654d4e]
1386
+ - Updated dependencies [f68e0a0]
1387
+ - Updated dependencies [aea682a]
1388
+ - Updated dependencies [fcdc8ec]
1389
+ - Updated dependencies [2d576e4]
1390
+ - Updated dependencies [8366acc]
1391
+ - Updated dependencies [95e58a3]
1392
+ - Updated dependencies [9d7419b]
1393
+ - Updated dependencies [fc7db05]
1394
+ - Updated dependencies [9ed8d0f]
1395
+ - Updated dependencies [c73cdb5]
1396
+ - Updated dependencies [6f5719e]
1397
+ - Updated dependencies [64dae8e]
1398
+ - Updated dependencies [06a8af5]
1399
+ - Updated dependencies [6a91586]
1400
+ - Updated dependencies [a04d7c6]
1401
+ - Updated dependencies [5ccc500]
1402
+ - Updated dependencies [f3c2bb0]
1403
+ - Updated dependencies [978507b]
1404
+ - Updated dependencies [778138e]
1405
+ - Updated dependencies [9801765]
1406
+ - Updated dependencies [9cebfca]
1407
+ - Updated dependencies [460575f]
1408
+ - Updated dependencies [d796c8d]
1409
+ - Updated dependencies [1b1d772]
1410
+ - Updated dependencies [d88e20f]
1411
+ - Updated dependencies [2d7304d]
1412
+ - Updated dependencies [636b236]
1413
+ - Updated dependencies [4172589]
1414
+ - Updated dependencies [d6d8fb9]
1415
+ - Updated dependencies [64d624d]
1416
+ - Updated dependencies [053fdc8]
1417
+ - Updated dependencies [ae476b8]
1418
+ - Updated dependencies [39f4309]
1419
+ - Updated dependencies [95bad12]
1420
+ - Updated dependencies [d2fb6ef]
1421
+ - Updated dependencies [7cd3987]
1422
+ - Updated dependencies [ee3b878]
1423
+ - Updated dependencies [e304a4e]
1424
+ - Updated dependencies [fda49e5]
1425
+ - Updated dependencies [490d9a9]
1426
+ - Updated dependencies [fc62bb4]
1427
+ - Updated dependencies [41df893]
1428
+ - Updated dependencies [0cba1b7]
1429
+ - Updated dependencies [00f3eb5]
1430
+ - Updated dependencies [1ec291c]
1431
+ - Updated dependencies [453dbaa]
1432
+ - Updated dependencies [f8cdbf2]
1433
+ - Updated dependencies [69a2163]
1434
+ - Updated dependencies [24e027e]
1435
+ - Updated dependencies [2c3cd1b]
1436
+ - Updated dependencies [e176053]
1437
+ - Updated dependencies [e30ed15]
1438
+ - Updated dependencies [90665e0]
1439
+ - Updated dependencies [194fae1]
1440
+ - Updated dependencies [7e19d03]
1441
+ - Updated dependencies [1e946c9]
1442
+ - Updated dependencies [546ddf7]
1443
+ - Updated dependencies [864154e]
1444
+ - Updated dependencies [b023625]
1445
+ - Updated dependencies [75bd83d]
1446
+ - Updated dependencies [44d075b]
1447
+ - Updated dependencies [40c479a]
1448
+ - Updated dependencies [971d387]
1449
+ - Updated dependencies [ee851c3]
1450
+ - Updated dependencies [6414dfd]
1451
+ - Updated dependencies [a8d5c71]
1452
+ - Updated dependencies [905b21f]
1453
+ - Updated dependencies [88e9109]
1454
+ - Updated dependencies [2c45966]
1455
+ - Updated dependencies [db3a600]
1456
+ - Updated dependencies [3a3db76]
1457
+ - Updated dependencies [0d723a3]
1458
+ - Updated dependencies [0c95d3d]
1459
+ - Updated dependencies [3e4fa2c]
1460
+ - Updated dependencies [b5b928a]
1461
+ - Updated dependencies [6fd2cf7]
1462
+ - Updated dependencies [52a43de]
1463
+ - Updated dependencies [195052f]
1464
+ - Updated dependencies [e4559d1]
1465
+ - Updated dependencies [2c71482]
1466
+ - Updated dependencies [129bcc5]
1467
+ - Updated dependencies [a26b9e4]
1468
+ - Updated dependencies [5ef9c4f]
1469
+ - Updated dependencies [46f0bb4]
1470
+ - Updated dependencies [06b82b8]
1471
+ - Updated dependencies [8ec11e1]
1472
+ - Updated dependencies [6f81384]
1473
+ - Updated dependencies [22ba927]
1474
+ - Updated dependencies [f8c70f4]
1475
+ - Updated dependencies [8f1d995]
1476
+ - Updated dependencies [f9c34df]
1477
+ - Updated dependencies [dddb942]
1478
+ - Updated dependencies [29754cf]
1479
+ - Updated dependencies [d7de534]
1480
+ - Updated dependencies [3c2b6f7]
1481
+ - Updated dependencies [6e88630]
1482
+ - Updated dependencies [b84dc18]
1483
+ - Updated dependencies [ac8abb0]
1484
+ - Updated dependencies [9d86e1d]
1485
+ - Updated dependencies [3a5817f]
1486
+ - Updated dependencies [99a3c2d]
1487
+ - Updated dependencies [5961030]
1488
+ - Updated dependencies [f24de8b]
1489
+ - Updated dependencies [c8ea8af]
1490
+ - Updated dependencies [3190414]
1491
+ - Updated dependencies [4e480f5]
1492
+ - Updated dependencies [38a123c]
1493
+ - Updated dependencies [299102e]
1494
+ - Updated dependencies [30c73cd]
1495
+ - Updated dependencies [830ed58]
1496
+ - Updated dependencies [d7acad6]
1497
+ - Updated dependencies [45a9aeb]
1498
+ - Updated dependencies [713db46]
1499
+ - Updated dependencies [c71e14d]
1500
+ - Updated dependencies [bf3a03c]
1501
+ - Updated dependencies [cb55718]
1502
+ - Updated dependencies [748494b]
1503
+ - Updated dependencies [5967be0]
1504
+ - Updated dependencies [831be72]
1505
+ - Updated dependencies [29cb85b]
1506
+ - Updated dependencies [3e028c8]
1507
+ - Updated dependencies [d0889e2]
1508
+ - Updated dependencies [ce503e5]
1509
+ - Updated dependencies [f20dcf0]
1510
+ - Updated dependencies [12402a9]
1511
+ - Updated dependencies [aff3d7a]
1512
+ - Updated dependencies [4ca30d0]
1513
+ - Updated dependencies [7a5da14]
1514
+ - Updated dependencies [2c1c967]
1515
+ - Updated dependencies [9486ac6]
1516
+ - Updated dependencies [9486ac6]
1517
+ - Updated dependencies [4d5f9b4]
1518
+ - Updated dependencies [d6ceb8d]
1519
+ - Updated dependencies [dc4365c]
1520
+ - Updated dependencies [e321d52]
1521
+ - Updated dependencies [4c68077]
1522
+ - Updated dependencies [7977ff9]
1523
+ - Updated dependencies [3beef6d]
1524
+ - Updated dependencies [06b8c42]
1525
+ - Updated dependencies [46b9bc9]
1526
+ - Updated dependencies [b97790a]
1527
+ - Updated dependencies [7c9b044]
1528
+ - Updated dependencies [d47de51]
1529
+ - Updated dependencies [3fe6463]
1530
+ - Updated dependencies [31ab372]
1531
+ - Updated dependencies [846889b]
1532
+ - Updated dependencies [2acd8e1]
1533
+ - Updated dependencies [26896c6]
1534
+ - Updated dependencies [67fc3b0]
1535
+ - Updated dependencies [33a3b3c]
1536
+ - Updated dependencies [b87f15b]
1537
+ - Updated dependencies [045d20b]
1538
+ - Updated dependencies [a2d2515]
1539
+ - Updated dependencies [c18d099]
1540
+ - Updated dependencies [adb2a86]
1541
+ - Updated dependencies [03380aa]
1542
+ - Updated dependencies [4562ea5]
1543
+ - Updated dependencies [3619792]
1544
+ - Updated dependencies [3561bd2]
1545
+ - Updated dependencies [bf97b98]
1546
+ - Updated dependencies [b0d308d]
1547
+ - Updated dependencies [40f34b4]
1548
+ - Updated dependencies [8063bcb]
1549
+ - Updated dependencies [b74a859]
1550
+ - Updated dependencies [d4493fd]
1551
+ - Updated dependencies [240b80f]
1552
+ - Updated dependencies [77cb489]
1553
+ - Updated dependencies [bfaa158]
1554
+ - Updated dependencies [777e5c6]
1555
+ - Updated dependencies [0c386dd]
1556
+ - Updated dependencies [9e37d9b]
1557
+ - Updated dependencies [5ad86dd]
1558
+ - Updated dependencies [16a725f]
1559
+ - Updated dependencies [4dfdcc3]
1560
+ - Updated dependencies [6a449fc]
1561
+ - Updated dependencies [446d93d]
1562
+ - Updated dependencies [ecd9cb2]
1563
+ - Updated dependencies [98d4108]
1564
+ - Updated dependencies [0e3b3be]
1565
+ - Updated dependencies [a29ae2d]
1566
+ - Updated dependencies [00d3f09]
1567
+ - Updated dependencies [4388f71]
1568
+ - Updated dependencies [0b1ac58]
1569
+ - Updated dependencies [c93b4d5]
1570
+ - Updated dependencies [c1fe272]
1571
+ - Updated dependencies [3cab570]
1572
+ - Updated dependencies [8ad218d]
1573
+ - Updated dependencies [3e41187]
1574
+ - Updated dependencies [5f78953]
1575
+ - Updated dependencies [639114c]
1576
+ - Updated dependencies [1f31d3a]
1577
+ - Updated dependencies [d1842ab]
1578
+ - Updated dependencies [78ca238]
1579
+ - Updated dependencies [351eb31]
1580
+ - Updated dependencies [20c04b2]
1581
+ - Updated dependencies [48c19bd]
1582
+ - Updated dependencies [a6d8b8d]
1583
+ - Updated dependencies [4b5bb95]
1584
+ - Updated dependencies [b652514]
1585
+ - Updated dependencies [adbda1b]
1586
+ - Updated dependencies [adbda1b]
1587
+ - Updated dependencies [e2b3826]
1588
+ - Updated dependencies [2e32ed4]
1589
+ - Updated dependencies [3ed3eec]
1590
+ - Updated dependencies [7c3df8f]
1591
+ - Updated dependencies [b9f5ff1]
1592
+ - Updated dependencies [e75f4c9]
1593
+ - Updated dependencies [19f1639]
1594
+ - Updated dependencies [4704aa4]
1595
+ - Updated dependencies [47547d0]
1596
+ - Updated dependencies [1bee5d0]
1597
+ - Updated dependencies [858cd72]
1598
+ - Updated dependencies [cfc9b6d]
1599
+ - Updated dependencies [554f2b6]
1600
+ - Updated dependencies [72f55c9]
1601
+ - Updated dependencies [26e06d7]
1602
+ - Updated dependencies [669d71b]
1603
+ - Updated dependencies [ed27d7c]
1604
+ - Updated dependencies [52c8cf7]
1605
+ - Updated dependencies [2ceb43a]
1606
+ - Updated dependencies [7cdd2b9]
1607
+ - Updated dependencies [52c8cf7]
1608
+ - Updated dependencies [71a4a53]
1609
+ - Updated dependencies [7bf244b]
1610
+ - Updated dependencies [f0bb9fa]
1611
+ - Updated dependencies [81a2eb1]
1612
+ - Updated dependencies [caa0cd3]
1613
+ - Updated dependencies [caa0cd3]
1614
+ - Updated dependencies [25c7d58]
1615
+ - Updated dependencies [00d2fa6]
1616
+ - Updated dependencies [c6198c2]
1617
+ - Updated dependencies [721d1e0]
1618
+ - Updated dependencies [1237ae4]
1619
+ - Updated dependencies [2f61238]
1620
+ - Updated dependencies [51eb515]
1621
+ - Updated dependencies [c354ce5]
1622
+ - Updated dependencies [8fe8e5c]
1623
+ - Updated dependencies [feac439]
1624
+ - Updated dependencies [9ae871d]
1625
+ - Updated dependencies [efbd566]
1626
+ - Updated dependencies [9587fc9]
1627
+ - Updated dependencies [e62c44e]
1628
+ - Updated dependencies [daf9d57]
1629
+ - Updated dependencies [c15d7ec]
1630
+ - Updated dependencies [5d0876c]
1631
+ - Updated dependencies [f7ace0a]
1632
+ - Updated dependencies [b041b9c]
1633
+ - Updated dependencies [ce2aaef]
1634
+ - Updated dependencies [544ecba]
1635
+ - Updated dependencies [2ce2612]
1636
+ - Updated dependencies [bc640ec]
1637
+ - Updated dependencies [1e215c4]
1638
+ - Updated dependencies [da6e191]
1639
+ - Updated dependencies [3e377c9]
1640
+ - Updated dependencies [a3eb5d0]
1641
+ - Updated dependencies [4ce14f1]
1642
+ - Updated dependencies [aef97e5]
1643
+ - Updated dependencies [2af1fa7]
1644
+ - Updated dependencies [c14d3a0]
1645
+ - Updated dependencies [a137d0c]
1646
+ - Updated dependencies [caf477f]
1647
+ - Updated dependencies [f6375da]
1648
+ - Updated dependencies [967e5d8]
1649
+ - Updated dependencies [a4611b3]
1650
+ - Updated dependencies [20316ba]
1651
+ - Updated dependencies [d3499b3]
1652
+ - Updated dependencies [309c75e]
1653
+ - Updated dependencies [c9f9bae]
1654
+ - Updated dependencies [18897a4]
1655
+ - Updated dependencies [8b7ea39]
1656
+ - Updated dependencies [dcbf0b2]
1657
+ - Updated dependencies [52cac38]
1658
+ - Updated dependencies [93fea2e]
1659
+ - Updated dependencies [1422a92]
1660
+ - Updated dependencies [d05fe17]
1661
+ - Updated dependencies [a480f79]
1662
+ - Updated dependencies [f08d1a8]
1663
+ - Updated dependencies [64a252d]
1664
+ - Updated dependencies [786bc91]
1665
+ - Updated dependencies [75fca96]
1666
+ - Updated dependencies [7ca6ddd]
1667
+ - Updated dependencies [f1cd290]
1668
+ - Updated dependencies [5a41ce7]
1669
+ - Updated dependencies [8d50bc2]
1670
+ - Updated dependencies [604476d]
1671
+ - Updated dependencies [d1bebb0]
1672
+ - Updated dependencies [95bf128]
1673
+ - Updated dependencies [335abea]
1674
+ - Updated dependencies [edea22a]
1675
+ - Updated dependencies [0f5cadf]
1676
+ - Updated dependencies [4f9f1ee]
1677
+ - Updated dependencies [66e8b2a]
1678
+ - Updated dependencies [aa083cd]
1679
+ - Updated dependencies [12b5992]
1680
+ - Updated dependencies [b93e245]
1681
+ - Updated dependencies [c842594]
1682
+ - Updated dependencies [290de37]
1683
+ - Updated dependencies [8c8da45]
1684
+ - Updated dependencies [8cd8eb5]
1685
+ - Updated dependencies [cf1d29e]
1686
+ - Updated dependencies [1bd79c8]
1687
+ - Updated dependencies [af9e957]
1688
+ - Updated dependencies [b1030c7]
1689
+ - Updated dependencies [c974edf]
1690
+ - Updated dependencies [ad852b6]
1691
+ - Updated dependencies [7fb22a1]
1692
+ - Updated dependencies [ad66d79]
1693
+ - Updated dependencies [ee4d19f]
1694
+ - Updated dependencies [496d31d]
1695
+ - Updated dependencies [0ea7054]
1696
+ - Updated dependencies [9a853f2]
1697
+ - Updated dependencies [cb847fd]
1698
+ - Updated dependencies [ee70287]
1699
+ - Updated dependencies [3e98e13]
1700
+ - Updated dependencies [fc32921]
1701
+ - Updated dependencies [4eaa835]
1702
+ - Updated dependencies [8f9d87a]
1703
+ - Updated dependencies [b1777ae]
1704
+ - Updated dependencies [24845c4]
1705
+ - Updated dependencies [6f864cf]
1706
+ - Updated dependencies [24d1edd]
1707
+ - Updated dependencies [645087c]
1708
+ - Updated dependencies [33f4a19]
1709
+ - Updated dependencies [4a292d2]
1710
+ - Updated dependencies [5323168]
1711
+ - Updated dependencies [841dd2b]
1712
+ - Updated dependencies [3014fc0]
1713
+ - Updated dependencies [dacb402]
1714
+ - Updated dependencies [846cec0]
1715
+ - Updated dependencies [91facae]
1716
+ - Updated dependencies [b38014e]
1717
+ - Updated dependencies [474797d]
1718
+ - Updated dependencies [704e695]
1719
+ - Updated dependencies [a407bd6]
1720
+ - Updated dependencies [317dbce]
1721
+ - Updated dependencies [3a43a15]
1722
+ - Updated dependencies [868e825]
1723
+ - Updated dependencies [f76f436]
1724
+ - Updated dependencies [ce45a03]
1725
+ - Updated dependencies [421544b]
1726
+ - Updated dependencies [fb01022]
1727
+ - Updated dependencies [e9d9212]
1728
+ - Updated dependencies [ecfb693]
1729
+ - Updated dependencies [abc1b18]
1730
+ - Updated dependencies [81a51db]
1731
+ - Updated dependencies [67749c7]
1732
+ - Updated dependencies [507b61b]
1733
+ - Updated dependencies [512c84b]
1734
+ - Updated dependencies [c300267]
1735
+ - Updated dependencies [fb3a101]
1736
+ - Updated dependencies [d4733f2]
1737
+ - Updated dependencies [1570eac]
1738
+ - Updated dependencies [f391ede]
1739
+ - Updated dependencies [f5cfbbd]
1740
+ - Updated dependencies [f5cfbbd]
1741
+ - Updated dependencies [8b532cb]
1742
+ - Updated dependencies [64c3cdd]
1743
+ - Updated dependencies [4d65991]
1744
+ - Updated dependencies [c42554e]
1745
+ - Updated dependencies [555b4ec]
1746
+ - Updated dependencies [1ccfc23]
1747
+ - Updated dependencies [542718f]
1748
+ - Updated dependencies [7f27bc5]
1749
+ - Updated dependencies [0a174f3]
1750
+ - Updated dependencies [f95b140]
1751
+ - Updated dependencies [541ce4e]
1752
+ - Updated dependencies [6479086]
1753
+ - Updated dependencies [d79f525]
1754
+ - Updated dependencies [d1865d2]
1755
+ - Updated dependencies [f1190b0]
1756
+ - Updated dependencies [561abef]
1757
+ - Updated dependencies [6a4680b]
1758
+ - Updated dependencies [c3a4273]
1759
+ - Updated dependencies [abf710d]
1760
+ - Updated dependencies [093af32]
1761
+ - Updated dependencies [1bd1be7]
1762
+ - Updated dependencies [d234fa9]
1763
+ - Updated dependencies [adf5812]
1764
+ - Updated dependencies [e36acd4]
1765
+ - Updated dependencies [5058336]
1766
+ - Updated dependencies [2f6b2bf]
1767
+ - Updated dependencies [2028b31]
1768
+ - Updated dependencies [63601ab]
1769
+ - Updated dependencies [c372b29]
1770
+ - Updated dependencies [152f0a7]
1771
+ - Updated dependencies [8693b85]
1772
+ - Updated dependencies [e82dad1]
1773
+ - Updated dependencies [58b7b3d]
1774
+ - Updated dependencies [84defab]
1775
+ - Updated dependencies [681d3f1]
1776
+ - Updated dependencies [969d4f2]
1777
+ - Updated dependencies [f3bc481]
1778
+ - Updated dependencies [b79aac2]
1779
+ - Updated dependencies [93fc0e7]
1780
+ - Updated dependencies [a4b723f]
1781
+ - Updated dependencies [2b10ca0]
1782
+ - Updated dependencies [7db4a81]
1783
+ - Updated dependencies [19a0b0e]
1784
+ - Updated dependencies [526fc11]
1785
+ - Updated dependencies [f8e3e9a]
1786
+ - Updated dependencies [b9d47ec]
1787
+ - Updated dependencies [3b6bc69]
1788
+ - Updated dependencies [6214db6]
1789
+ - Updated dependencies [6732df4]
1790
+ - Updated dependencies [fe9e0d0]
1791
+ - Updated dependencies [63fb72c]
1792
+ - Updated dependencies [804831c]
1793
+ - Updated dependencies [279e48e]
1794
+ - Updated dependencies [8700d6d]
1795
+ - Updated dependencies [8db2a0f]
1796
+ - Updated dependencies [689953a]
1797
+ - Updated dependencies [30443fb]
1798
+ - Updated dependencies [8d3dbb2]
1799
+ - Updated dependencies [efc1c9c]
1800
+ - Updated dependencies [da45e6b]
1801
+ - Updated dependencies [7533465]
1802
+ - Updated dependencies [835f0f3]
1803
+ - Updated dependencies [a9d97be]
1804
+ - Updated dependencies [ed35b44]
1805
+ - Updated dependencies [9ba7e9c]
1806
+ - Updated dependencies [729e851]
1807
+ - Updated dependencies [96919a4]
1808
+ - Updated dependencies [345e24a]
1809
+ - Updated dependencies [20b507a]
1810
+ - Updated dependencies [2e471dc]
1811
+ - Updated dependencies [6748587]
1812
+ - Updated dependencies [be50942]
1813
+ - Updated dependencies [775e079]
1814
+ - Updated dependencies [7e8b3c0]
1815
+ - Updated dependencies [53374dc]
1816
+ - Updated dependencies [f6fb83f]
1817
+ - Updated dependencies [2049b03]
1818
+ - Updated dependencies [7cbc724]
1819
+ - Updated dependencies [7098eed]
1820
+ - Updated dependencies [3df7c5c]
1821
+ - Updated dependencies [fb91ac9]
1822
+ - Updated dependencies [fb91ac9]
1823
+ - Updated dependencies [641fb55]
1824
+ - Updated dependencies [8524372]
1825
+ - Updated dependencies [7cbefa5]
1826
+ - Updated dependencies [72d6587]
1827
+ - Updated dependencies [a272a4f]
1828
+ - Updated dependencies [55f39ee]
1829
+ - Updated dependencies [0ce32d5]
1830
+ - Updated dependencies [0970a0e]
1831
+ - Updated dependencies [e427e9c]
1832
+ - Updated dependencies [bbc9dc3]
1833
+ - Updated dependencies [02f1813]
1834
+ - Updated dependencies [1ef89c0]
1835
+ - Updated dependencies [ba0b61a]
1836
+ - Updated dependencies [ba0b61a]
1837
+ - Updated dependencies [ac716ff]
1838
+ - Updated dependencies [f0f3cd5]
1839
+ - Updated dependencies [ab856ed]
1840
+ - Updated dependencies [20f3e65]
1841
+ - Updated dependencies [bbba098]
1842
+ - Updated dependencies [87af769]
1843
+ - Updated dependencies [3be720e]
1844
+ - Updated dependencies [43c0d17]
1845
+ - Updated dependencies [c3df43a]
1846
+ - Updated dependencies [d16d0e9]
1847
+ - Updated dependencies [bbe57fd]
1848
+ - Updated dependencies [272a530]
1849
+ - Updated dependencies [1779e8d]
1850
+ - Updated dependencies [f7fcc2c]
1851
+ - Updated dependencies [f0f4d6c]
1852
+ - Updated dependencies [4128188]
1853
+ - Updated dependencies [b253c4e]
1854
+ - Updated dependencies [78a9c67]
1855
+ - Updated dependencies [4a7ef0d]
1856
+ - Updated dependencies [4598f6d]
1857
+ - Updated dependencies [dea17b4]
1858
+ - Updated dependencies [89bb77a]
1859
+ - Updated dependencies [06611e4]
1860
+ - Updated dependencies [3939545]
1861
+ - Updated dependencies [66abbde]
1862
+ - Updated dependencies [dc3893d]
1863
+ - Updated dependencies [1bbaa16]
1864
+ - Updated dependencies [6ee259a]
1865
+ - Updated dependencies [7649f43]
1866
+ - Updated dependencies [e708426]
1867
+ - Updated dependencies [3b6d53b]
1868
+ - Updated dependencies [276d174]
1869
+ - Updated dependencies [2982ed9]
1870
+ - Updated dependencies [a8198de]
1871
+ - Updated dependencies [0c789a4]
1872
+ - Updated dependencies [05a49f2]
1873
+ - Updated dependencies [b234a84]
1874
+ - Updated dependencies [a78cd37]
1875
+ - Updated dependencies [5ea623e]
1876
+ - Updated dependencies [5eabe86]
1877
+ - Updated dependencies [ca5d671]
1878
+ - Updated dependencies [32bf2d6]
1879
+ - Updated dependencies [ff0c384]
1880
+ - Updated dependencies [af4fb29]
1881
+ - Updated dependencies [ff5ef1c]
1882
+ - Updated dependencies [befd40c]
1883
+ - Updated dependencies [9a97800]
1884
+ - Updated dependencies [6bca0e4]
1885
+ - Updated dependencies [81c0bc4]
1886
+ - Updated dependencies [3c76801]
1887
+ - Updated dependencies [60500cb]
1888
+ - Updated dependencies [2fcefb9]
1889
+ - Updated dependencies [b55a346]
1890
+ - Updated dependencies [065bba7]
1891
+ - Updated dependencies [dd19463]
1892
+ - Updated dependencies [6791717]
1893
+ - Updated dependencies [100547e]
1894
+ - Updated dependencies [6d1c155]
1895
+ - Updated dependencies [d7573b3]
1896
+ - Updated dependencies [bf3edfe]
1897
+ - Updated dependencies [2c8474c]
1898
+ - Updated dependencies [0e05aac]
1899
+ - Updated dependencies [ae61ad4]
1900
+ - Updated dependencies [5aed9e4]
1901
+ - Updated dependencies [83c77dc]
1902
+ - Updated dependencies [18a8e7d]
1903
+ - Updated dependencies [e7957ab]
1904
+ - Updated dependencies [f7e34ca]
1905
+ - Updated dependencies [e719ebd]
1906
+ - Updated dependencies [516583b]
1907
+ - Updated dependencies [f9e4f91]
1908
+ - Updated dependencies [6ef48b1]
1909
+ - Updated dependencies [fa429cf]
1910
+ - Updated dependencies [ed8df3e]
1911
+ - Updated dependencies [fe76ece]
1912
+ - Updated dependencies [8b446f5]
1913
+ - Updated dependencies [8e74b27]
1914
+ - Updated dependencies [7102b20]
1915
+ - Updated dependencies [8ebd57f]
1916
+ - Updated dependencies [617707a]
1917
+ - Updated dependencies [58770f3]
1918
+ - Updated dependencies [aefe428]
1919
+ - Updated dependencies [485f096]
1920
+ - Updated dependencies [7357447]
1921
+ - Updated dependencies [199d31b]
1922
+ - Updated dependencies [b655a9d]
1923
+ - Updated dependencies [3e01cb5]
1924
+ - Updated dependencies [7138bc1]
1925
+ - Updated dependencies [cef27e2]
1926
+ - Updated dependencies [4e8622b]
1927
+ - Updated dependencies [dffd752]
1928
+ - Updated dependencies [06973aa]
1929
+ - Updated dependencies [50798f3]
1930
+ - Updated dependencies [105f3c5]
1931
+ - Updated dependencies [3ccd9e8]
1932
+ - Updated dependencies [689b979]
1933
+ - Updated dependencies [c70f865]
1934
+ - Updated dependencies [e546222]
1935
+ - Updated dependencies [fd13f52]
1936
+ - Updated dependencies [d7bd274]
1937
+ - Updated dependencies [98c3a74]
1938
+ - Updated dependencies [ebce5a3]
1939
+ - Updated dependencies [fb336df]
1940
+ - Updated dependencies [9d9040d]
1941
+ - Updated dependencies [0fce2ef]
1942
+ - Updated dependencies [42df928]
1943
+ - Updated dependencies [0e2ddd4]
1944
+ - Updated dependencies [b7479ab]
1945
+ - Updated dependencies [9850c6e]
1946
+ - Updated dependencies [b2ea297]
1947
+ - Updated dependencies [5b5a5c3]
1948
+ - Updated dependencies [14582b8]
1949
+ - Updated dependencies [51e144e]
1950
+ - Updated dependencies [ab92940]
1951
+ - Updated dependencies [a691c0b]
1952
+ - Updated dependencies [0b1326d]
1953
+ - Updated dependencies [af3861f]
1954
+ - Updated dependencies [515f171]
1955
+ - Updated dependencies [1f4e029]
1956
+ - Updated dependencies [4f14ad7]
1957
+ - Updated dependencies [258d264]
1958
+ - Updated dependencies [cac64b3]
1959
+ - Updated dependencies [8033ad1]
1960
+ - Updated dependencies [fa140b8]
1961
+ - Updated dependencies [71cba28]
1962
+ - Updated dependencies [190fbd0]
1963
+ - Updated dependencies [c00bf28]
1964
+ - Updated dependencies [93127bd]
1965
+ - Updated dependencies [f2158ec]
1966
+ - Updated dependencies [759606e]
1967
+ - Updated dependencies [72ffc34]
1968
+ - Updated dependencies [a51fa0c]
1969
+ - Updated dependencies [51f3d8d]
1970
+ - Updated dependencies [bf28341]
1971
+ - Updated dependencies [78cbdb5]
1972
+ - Updated dependencies [b7543a9]
1973
+ - Updated dependencies [6c6cee7]
1974
+ - Updated dependencies [42887e0]
1975
+ - Updated dependencies [83fe6e7]
1976
+ - Updated dependencies [d1ab06f]
1977
+ - Updated dependencies [f90b8fb]
1978
+ - Updated dependencies [91783c4]
1979
+ - Updated dependencies [982885d]
1980
+ - Updated dependencies [dba7d84]
1981
+ - Updated dependencies [ca39427]
1982
+ - Updated dependencies [bd09957]
1983
+ - Updated dependencies [5a07e67]
1984
+ - Updated dependencies [2d36552]
1985
+ - Updated dependencies [45d8288]
1986
+ - Updated dependencies [490f482]
1987
+ - Updated dependencies [27308c5]
1988
+ - Updated dependencies [8689166]
1989
+ - Updated dependencies [c9327c9]
1990
+ - Updated dependencies [920165d]
1991
+ - Updated dependencies [9101be5]
1992
+ - Updated dependencies [f53a8d0]
1993
+ - Updated dependencies [968dc1e]
1994
+ - Updated dependencies [57f9b07]
1995
+ - Updated dependencies [3c73d99]
1996
+ - Updated dependencies [d91aed9]
1997
+ - Updated dependencies [ed71d9e]
1998
+ - Updated dependencies [7776fc2]
1999
+ - Updated dependencies [e76634c]
2000
+ - Updated dependencies [c86185e]
2001
+ - Updated dependencies [1170ed1]
2002
+ - Updated dependencies [92814db]
2003
+ - Updated dependencies [4d73b07]
2004
+ - @object-ui/react@17.7.0
2005
+ - @object-ui/core@17.7.0
2006
+ - @object-ui/types@17.7.0
2007
+ - @object-ui/components@17.7.0
2008
+
3
2009
  ## 17.6.0
4
2010
 
5
2011
  ### Minor Changes