@object-ui/plugin-form 17.7.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.
Files changed (41) hide show
  1. package/CHANGELOG.md +804 -0
  2. package/README.md +148 -38
  3. package/dist/DrawerForm.d.ts +13 -2
  4. package/dist/DrawerForm.d.ts.map +1 -1
  5. package/dist/LineItemsPanel.d.ts.map +1 -1
  6. package/dist/MasterDetailForm.d.ts +49 -29
  7. package/dist/MasterDetailForm.d.ts.map +1 -1
  8. package/dist/ModalForm.d.ts +13 -2
  9. package/dist/ModalForm.d.ts.map +1 -1
  10. package/dist/ObjectForm.d.ts.map +1 -1
  11. package/dist/SplitForm.d.ts +13 -2
  12. package/dist/SplitForm.d.ts.map +1 -1
  13. package/dist/TabbedForm.d.ts +11 -3
  14. package/dist/TabbedForm.d.ts.map +1 -1
  15. package/dist/WizardForm.d.ts +5 -3
  16. package/dist/WizardForm.d.ts.map +1 -1
  17. package/dist/autoLayout.d.ts +101 -5
  18. package/dist/autoLayout.d.ts.map +1 -1
  19. package/dist/deriveMasterDetail.d.ts +53 -24
  20. package/dist/deriveMasterDetail.d.ts.map +1 -1
  21. package/dist/fieldGroups.d.ts +14 -1
  22. package/dist/fieldGroups.d.ts.map +1 -1
  23. package/dist/fieldWriteGate.d.ts +31 -11
  24. package/dist/fieldWriteGate.d.ts.map +1 -1
  25. package/dist/index.d.ts +32 -7
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2206 -1896
  28. package/dist/index.umd.cjs +1 -1
  29. package/dist/initialFieldFocus.d.ts +23 -0
  30. package/dist/initialFieldFocus.d.ts.map +1 -0
  31. package/dist/sanitize.d.ts +88 -3
  32. package/dist/sanitize.d.ts.map +1 -1
  33. package/dist/schemaDefaults.d.ts +80 -6
  34. package/dist/schemaDefaults.d.ts.map +1 -1
  35. package/dist/sectionFields.d.ts +17 -6
  36. package/dist/sectionFields.d.ts.map +1 -1
  37. package/dist/submitTarget.d.ts +17 -0
  38. package/dist/submitTarget.d.ts.map +1 -1
  39. package/dist/writePayload.d.ts +24 -5
  40. package/dist/writePayload.d.ts.map +1 -1
  41. package/package.json +10 -10
package/CHANGELOG.md CHANGED
@@ -1,5 +1,809 @@
1
1
  # @object-ui/plugin-form
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
+ - 902ebab: The `record:line_items` registration no longer declares `childObject` required,
22
+ so the page compile accepts a node whose `dataSource` binding names the child
23
+ object (objectui#11569).
24
+
25
+ `@objectstack/spec`'s `record:line_items` row leaves `childObject` optional,
26
+ because the node's `dataSource` binding can supply it, and the renderer agrees:
27
+ `dataSource.object` lands on `childObject` before the panel reads the node. The
28
+ registration still declared `required: true`, and the page compile reads the
29
+ registration, so a bound node with no `childObject` of its own was refused with
30
+ `missing-required-prop` and the save failed.
31
+
32
+ **Clause-②: yes (widening)** — a `record:line_items` node that names its child object
33
+ through `dataSource.object` and sets no `childObject` now compiles and saves. A
34
+ node that names its child object in neither place also compiles now: the panel
35
+ shows its configuration hint naming `childObject` and loads nothing, as it did
36
+ before when such a node reached it. `relationshipField` and `columns` are still
37
+ required. The published `childObject` input now carries a description that says
38
+ the binding can supply it.
39
+ - fd060f0: The `object-form`, `view:form`, `embeddable-form` and
40
+ `object-master-detail-form` registrations no longer declare `objectName`
41
+ required, so the page compile accepts a node whose `dataSource` binding names the
42
+ object, and a form that names its object in neither place shows a hint instead of
43
+ a form with no fields (objectui#11605).
44
+
45
+ `@objectstack/spec`'s `object-form` and `object-master-detail-form` rows leave
46
+ `objectName` optional, because the node's `dataSource` binding can supply it;
47
+ `embeddable-form` has no spec row, and the binding doc says a bound node needs no
48
+ `objectName` of its own. Each renderer agrees: `dataSource.object` lands on
49
+ `objectName` before the form reads the node. The registrations still declared
50
+ `required: true`, and the page compile reads them, so a bound form with no
51
+ `objectName` of its own was refused with `missing-required-prop` and the save
52
+ failed.
53
+
54
+ **Clause-②: yes (widening)** — an `object-form`, `view:form`, `embeddable-form`
55
+ or `object-master-detail-form` node that names its object through
56
+ `dataSource.object` and sets no `objectName` now compiles and saves. A node that
57
+ names its object in neither place also compiles now, and shows "No object named:
58
+ set objectName or dataSource.object." where it used to draw a field-less card, a
59
+ public form that could not submit, or an empty parent form. An `object-form`
60
+ or `view:form` whose fields are declared inline shows no hint and renders as
61
+ before: non-empty `customFields`, or `sections` whose every field is an inline
62
+ field, the target-less collector the `tabbed`, `wizard`, `split`, `drawer` and
63
+ `modal` variants render. `formId` on `embeddable-form` and `details` on
64
+ `object-master-detail-form` are still required. The published `objectName`
65
+ inputs now carry a description that says the binding can supply them.
66
+ - 9dfaca6: The default (`simple`) `object-form` draws a self-describing inline section entry, as the `tabbed`, `wizard`, `split`, `drawer` and `modal` forms already did (objectui#11615). Before, the default form resolved every section entry against its parent field pool and skipped an inline `{ name, … }` entry whose name the pool did not hold. The same section drew that entry on every other form type and drew nothing for it on `simple`, apart from a console warning when the object declared the name.
67
+
68
+ **Clause-②: yes (widening, with one break for TypeScript readers).** Authored input is only widened: nothing either package accepted before is refused now. Code that READS `ObjectFormSection.fields` can break at compile time, described under "Breaking for TypeScript readers" below.
69
+
70
+ - `@object-ui/types`: `ObjectFormSection.fields` is `(string | SpecFormFieldInput | FormField)[]`. The new arm is the form view's `{ field, … }` entry, and it is `@objectstack/spec`'s `FormFieldInput` by reference, not a copy. The form already drew that entry. Before, a TypeScript author could not annotate it, because `FormField` requires `name` and types `field` as an object. The zod mirror is unchanged: a section's `fields` entry is still `z.any()` there.
71
+ - `@object-ui/plugin-form`, layout types: the section `fields` of the five layout configs is `NonNullable<ObjectFormSection['fields']>`, by reference. Those configs are `FormSectionConfig` (tabbed), `WizardStepConfig`, `SplitFormSectionConfig`, `DrawerFormSectionConfig` and `ModalFormSectionConfig`, reached through the exported `TabbedFormSchema`, `WizardFormSchema`, `SplitFormSchema`, `DrawerFormSchema` and `ModalFormSchema`. Each of these layouts already drew the `{ field }` entry. Before, their types refused it, and `ObjectForm` passing an authored section to them would no longer compile once the section type named the entry.
72
+ - `@object-ui/plugin-form`, section drawing: on `simple`, an entry that names itself is drawn as it stands, whatever the field pool holds. Such an entry is an object whose `field` is not a string and whose `name` is a string. This is the existing `isInlineFieldDef` predicate that the submit-target rule already reads. It does not require `type`: the spec's inline arm makes `type` optional, and the other five forms draw a typeless entry as the default input.
73
+ - `@object-ui/plugin-form`, inline collector: a `simple` form with no data source and no `submitHandler`, whose sections list only inline entries, is now a self-contained collector, as on the other five forms. It opens on `initialValues` / `initialData`, and its `onSuccess` receives the collected values. Before, that form drew no fields and refused the submit. Its submit carve-out now reads the shared `hasInlineFieldSource`.
74
+
75
+ **Breaking for TypeScript readers of `ObjectFormSection.fields`** (still `minor`: objectui's major follows the `@objectstack` family major, so its own breaks ship as `minor` and are stated here). A consumer that narrowed an entry with `typeof entry === 'string' ? entry : entry.name` compiled while every object entry was typed as an inline `FormField`. It no longer compiles: `Property 'name' does not exist on type 'FormFieldInput | FormField'`. The read was already wrong at runtime for a `{ field }` entry, where it gave `undefined`. Remedy: name an entry by its arm. The string is the name itself, the `{ field }` entry names its field by `field`, and the inline entry names it by `name`. `@object-ui/plugin-form` now exports `sectionEntryName(entry)`, which applies exactly that rule and returns `undefined` for an entry that names nothing. It sits beside `resolveSectionGroupReferences`, whose result it reads. The repo's own reader, an app-shell test over that resolver's result, is respelled this way.
76
+
77
+ **What stays refused or warned.**
78
+
79
+ - A field name and a `{ field }` entry still resolve against the pool on `simple`. A name the pool does not hold is still dropped, and still warned about once when the object declares it, because top-level `fields` and `sections` still intersect (objectui#9884).
80
+ - An inline entry with no `name` is malformed and is still not drawn on `simple`.
81
+ - A form with no data source and no `submitHandler` still refuses its submit with `DataSource is required for form submission (inline mode not configured)` unless every section entry is inline. One name or `{ field }` entry among inline ones is enough to refuse, on all six forms.
82
+
83
+ **Behaviour change for an existing schema.** On `simple`, an inline entry whose name the object declares but top-level `fields` leaves out used to be dropped with the intersection warning. It is now drawn as its own definition, with no warning, as on the other five forms. With a data source, its value is still written only if the object declares the field. As on every form, a key the object does not declare is stripped from the write.
84
+ - 2312bd9: A page that declares `print` now prints as a document, and a record page bound to such a page offers a Print action (objectui#11958, the objectui half of the print-page ruling on objectstack#8346, M1, zero server).
85
+
86
+ - **The print stylesheet.** `PageRenderer` mounts a stylesheet built from the page's `print` declaration, only for a page that declares it. Every rule sits inside `@media print`, so the page on screen is drawn as before. `paperSize` and `orientation` set `@page { size }` (A4 and portrait when omitted). `margins` set one `@page` margin per declared side, in millimetres. `pageNumbers` prints "page / pages" in the bottom-right margin. `repeatHeader` and `repeatFooter` repeat the page's own `header` and `footer` regions on every sheet. `repeatTableHeaders` (on when omitted) repeats a table's column headings on every sheet it runs onto. `avoidBreakInside` keeps each block of a region whole on one sheet when it fits. Only the print page reaches paper: the console chrome and the record view's own panels around the page are hidden, and the page runs onto as many sheets as it needs.
87
+ - **The printable blocks print whole.** On a print page, `record:line_items` no longer cuts lines off at its row cap in silence: when the child object has more lines than the cap (500 unless `limit` is set), the panel draws the cap's lines and the shared row-ceiling note under them, naming both numbers when the server reports a total. A collapsible `record:details` section draws open, because a closed section never reaches paper. Off a print page both blocks behave as before.
88
+ - **The record page's Print action.** When the record page bound to a record declares `print`, the record view shows a Print button that opens the browser's print preview of that page.
89
+ - **New exports from `@object-ui/react`:** `PrintPageProvider`, `usePrintPage` and `PrintPageContext`. `usePrintPage()` returns the enclosing page's `print` declaration, or `null` outside a print page.
90
+ - The source comments that described PDF export as declined now say where a printable document lives: a page that declares `print`.
91
+ - c5406c2: Depend on the `@objectstack/*` 18 prerelease line (objectui#12030).
92
+
93
+ 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).
94
+
95
+ **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.
96
+
97
+ **objectui's own surface moves with it:**
98
+
99
+ - `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`.
100
+ - The `CapabilityMultiSelectField` widget's curated capability set (`@object-ui/fields`) follows spec 18: `manage_mailboxes` in, `manage_org_presentation` out.
101
+ - `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.
102
+
103
+ **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.
104
+ - 923504f: The record form draws a field's `inlineHelpText` under its control, and no longer reads a field's `help` (objectui#12213).
105
+
106
+ `@objectstack/spec`'s `FieldSchema` declares `inlineHelpText` ("Help text displayed below the field in forms"), and Studio's object field inspector writes it. `ObjectForm`'s field builder and `fromObjectSchema` both built a field's help line from `help`, then `description`, and never read `inlineHelpText`, so help text typed in Studio never appeared on the record form. Flow screens already drew it.
107
+
108
+ - FROM `field.help || field.description` → TO `field.inlineHelpText || field.description`
109
+
110
+ The two builders now share one read (`fieldHelpText`, exported by `@object-ui/fields`), so the flat, sectioned and tabbed forms cannot drift apart. The line is the control's accessible description, drawn under it, where flow screens draw it. An empty `inlineHelpText` reads as absent, so the field's description still shows. A `file` or `image` field's size hint follows the help text as before.
111
+
112
+ ## ⚠️ BREAKING, priced as minor under the fixed group's version policy
113
+
114
+ Translated field help on the record form needs an objectstack server on `@objectstack/spec` 17.7.0 or later (objectstack-ai/objectstack `bab76850c`, objectstack-ai/objectstack#21956). `FieldSchema` refuses `help` as an authoring key, and its one producer was a server on spec 17.6.0 or earlier, whose translator put a field's translated description on the served field's `help` key. 17.7.0 serves that text on `description`, which the form reads. Against an older server, a field's help line shows its `description` as the server stores it, untranslated, and a field whose only help is a served `help` key shows no help line. Fix: run the server on spec 17.7.0 or later, within the same major. (The bump is `minor` by this repo's release model: objectui's major follows the `@objectstack` family major, and its own breaking changes ship as `minor` with the breaking semantics stated here.)
115
+ - ff9df88: Depend on `@objectstack/*` `18.0.0-next.1` (objectui#12370).
116
+
117
+ 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.
118
+
119
+ **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`:
120
+
121
+ - `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.
122
+ - `onSuccess` beside `operation: 'update'`, and an `onSuccess` block carrying a key outside `{ navigate, openIn }`.
123
+ - `actionType: 'navigation'` on a row (and `type: 'navigation'` on a container member): write `'url'`.
124
+ - A `url` executor's `target` that is not openable, judged on the executor the runner runs, including a row whose `name` selects it.
125
+ - A view `data` binding with `provider: 'api'`: bind the object or static rows; an API call is the page element's binding.
126
+ - 7b5e558: **A record dialog with no authored layout opens bounded, and draws two fields per row wherever no `columns` is declared** (objectui#12521). Three defaults of `ModalForm` change. None reaches a setting the author declared.
127
+
128
+ - **Size.** A dialog with no `modalSize` derived its width from its inferred column count, and three or more columns derived `full` (95vw). It now derives `lg` or `xl` from the grid it renders and its field count, and never `full`. `inferModalSize` returns `'lg'` for one column and `'xl'` for two or more. An authored `modalSize`, `'full'` included, is used as written.
129
+ - **Flat grid.** A dialog whose form declares no `columns` and draws no sections inferred one to four columns from its field count. It now lays out at two columns from the container's `@md` tier up and one below it, so the phone sheet is unchanged. Every field takes one cell, so fields of one kind share one width. A wide kind (textarea, rich text, markdown, html, an inline grid) and a `span: 'full'` field take the whole row. The object's `fieldGroups` fallback lays out the same way.
130
+ - **Section density.** In a form that declares no `columns`, a section that declares none draws two fields per row from `@md`, whatever the other sections declare. Beside a `columns: 3` section it draws two per row on the 12-track grid of objectui#12548, where before it filled three; with no section declaring any, the grid is two wide. A declared count, `1` included, is drawn as written, and a form-level `columns` still sets an undeclared section's count. Until `@objectstack/spec` drops `FormSectionSchema.columns`' `default(1)` (objectstack-ai/objectstack#23740), the spec's parse writes `columns: 1` into every section that omits it, so a section from an authored stack arrives declared and draws one column, as before.
131
+ - **What does not move.** A declared form `columns`, a declared section `columns` and a field's `colSpan` / `span` render the same grid classes as before. `inferColumns`, and the page form, drawer and detail view that read it, are unchanged. A host that passes a `modalSize` of its own keeps it.
132
+ - 611566b: A form view field's `visibleOn` is no longer read when sections are normalized (`normalizeSectionField`, used by `ObjectForm`, `ModalForm` and the record form page) (objectui#12654). `@objectstack/spec` 18 retires the form view field's `visibleOn` as a `retiredKey` tombstone naming `visibleWhen` (objectstack#23543 F4), so the field's `visibleWhen` is the one view-level predicate carried onto the runtime field.
133
+
134
+ What a raw schema loses: a form view section entry `{ field: 'x', visibleOn: 'PREDICATE' }` that did not pass through the spec's parse no longer hides the field; write `visibleWhen`. A runtime `FormField` (an inline field object with its own `name`) keeps its `visibleOn` slot: that is the runtime field's view-level gate, a different key, and it is unchanged.
135
+
136
+ What is unaffected: form views served by an ObjectStack runtime. They already arrive with `visibleWhen`: the spec's parse folds the old key through the 18 pre-releases, and spec 18's stored-row rehydration rewrites a row stored with it.
137
+ - 684f22e: A section entry written as a bare field name no longer reads the object field's `visibleOn` when sections are normalized (`normalizeSectionField`, used by `ObjectForm`, `ModalForm` and the record form page) (objectui#12719). The spec's object `FieldSchema` declares no `visibleOn`: an object field's visibility predicate is `visibleWhen`, which the shorthand already carries onto the runtime field as its field-level rule.
138
+
139
+ Clause-②: no (narrowing). The shorthand stops honouring an object field's `visibleOn` (it was copied into the runtime field's view-level `visibleOn` slot), and starts reading nothing new.
140
+
141
+ What a raw schema loses: an object schema handed straight to the form, whose field carries `visibleOn: 'PREDICATE'`, no longer hides that field where a section lists it by name; write `visibleWhen` on the object field. What is unaffected: object schemas served by an ObjectStack runtime, which the spec's strict `FieldSchema` parse never lets carry `visibleOn`; a form view field's `visibleWhen`; and a runtime `FormField`'s own `visibleOn` slot.
142
+ - 32b492b: Line-item grids read a boolean column's options and a file cell's text in the session language (objectui#12924). Under a zh-CN session, a master-detail or `record:line_items` grid showed English in two places: the two options of a column derived from a `boolean` or `toggle` child field (`Yes` / `No`, in the editable picker and in the per-row form's list), and a file cell's text (`N files` for a cell holding several files, `File` for a file with no name). Both now come from the language packs, and English reads as before.
143
+
144
+ - **Boolean options.** The labels are the session's word for each value, from `useBooleanValueLabel` (`@object-ui/fields`), which reads `common.yes` / `common.no`, the keys read-only booleans already use. The stored values are unchanged: `'true'` and `'false'`. `MasterDetailForm` and `LineItemsPanel` call the hook and pass it to the derive functions. Both re-label the options when the session's words change, so a catalogue that lands after the child schema, or a language switch, reaches them without re-reading the lines.
145
+ - **File text.** `GridField` reads the count from `detail.fileCount`, the plural family the file cell renderer already uses, so each language gets its own plural forms (Russian `few` / `many`, for example). The name of a nameless file comes from `fields.file.fileFallback`. The per-row form's list cell and the read-only table both show these words.
146
+
147
+ No language-pack key is added.
148
+
149
+ BREAKING (`@object-ui/plugin-form`), for a caller of the exported `deriveDetail` or `deriveColumns`: both now require `booleanLabel`, a function that names a boolean value in the session language. Pass `useBooleanValueLabel()` from `@object-ui/fields`: `deriveDetail(childObject, childSchema, parentObjectName, { booleanLabel })`, and `deriveColumns(childSchema, { booleanLabel })`. There is no default, because an English default would label the options in English for a session in any other language. (The bump is `minor` by this repo's release model: objectui's major follows the `@objectstack` family major, and its own breaking changes ship as `minor` with the breaking semantics stated here.)
150
+
151
+ Clause-②: no (narrowing)
152
+ - b9e1887: Publish `optionListDefault` (and its parameter type `OptionListFieldLike`) from the package entry: the reading of an option list's `default: true` that create forms seed from (objectui#11914). The console's public form page (`/f/:slug`) now seeds a field's option-list default through it, so a required select whose options mark a default opens on that option and submits it, instead of refusing the submit on the client (objectui#13049).
153
+
154
+ Console: on a public form, a select whose options mark `default: true` (and that declares no `defaultValue`) now opens with that option selected, so an untouched submit sends it instead of failing with "Required: FIELD".
155
+
156
+ ### Patch Changes
157
+
158
+ - 15f6702: `deriveColumns`, the default columns of a master-detail inline grid whose author listed none, now takes which columns it draws, their order and which of them are `defaultHidden` from `@objectstack/spec`'s `deriveInlineGridColumns`, and its visible budget from the spec's `DEFAULT_MAX_INLINE_GRID_COLUMNS` (objectui#11345). The rule is the spec's now, so objectstack's `field-no-consumers` lint credits exactly the columns this grid draws.
159
+
160
+ The output does not change. The signature is the same, and each column's label, cell type, options, lookup target, conditional rules and computed expression are still built from the child field here, including a plain text column for a field whose definition is falsy. The module-level `DEFAULT_MAX_INLINE_COLUMNS` constant, which the package entry never exported, is removed.
161
+
162
+ `@object-ui/plugin-form` raises its `@objectstack/spec` floor from `^17.0.0` to `^17.6.0`, because its published entry now imports `deriveInlineGridColumns` and `DEFAULT_MAX_INLINE_GRID_COLUMNS`, which the spec first exports in 17.6.0.
163
+ - 3f0b0cd: The per-row expand form of an inline master-detail collection now takes both of its rules from `@objectstack/spec` (objectui#11428), as the collection's grid columns already do. `deriveFormFields`, the form's fields when its author listed none, returns the spec's `deriveInlineRowFormFields` answer, and `MasterDetailForm` offers a row the form when the spec's `isInlineRowFormOffered` says so. The rules are the spec's now, so objectstack's `field-no-consumers` lint credits exactly the fields this form draws.
164
+
165
+ The output does not change. `deriveFormFields` keeps its signature and returns the same names in the same order, and a row is offered the form exactly when it was before: always in `form` mode, and in `grid` mode only when the form has more fields than the grid has columns. How each named field renders is still decided here.
166
+
167
+ `@object-ui/plugin-form` raises its `@objectstack/spec` floor from `^17.6.0` to `^17.7.0`, because its published entry now imports `deriveInlineRowFormFields` and `isInlineRowFormOffered`, which the spec first exports in 17.7.0.
168
+ - c0862c1: `@objectstack/spec` 17.7.0 retires `sortField` on an `object-master-detail-form` `details` entry (objectstack-ai/objectstack#21589), so `objectui validate` now refuses an entry that writes it, at that member, with the spec's retired-key message (objectui#11717). The form never read it: the line-position field is derived from the child object (objectui#11070). The `details` registration description and the `MasterDetailDetailConfig` docblock now say so. The type is unchanged: it already left the key off.
169
+ - e06365c: fix(components): fields that belong to no field group no longer render under the last group's heading (objectui#11777)
170
+
171
+ On an object where some fields join a declared `fieldGroups` entry and the rest join none, the create and edit forms drew the ungrouped fields straight on under the last group's heading, in the same grid and even in the same row as that group's last field, so they read as its members. The Studio form designer shows those fields apart, in their own trailing area.
172
+
173
+ The form renderer now ends a section's field grid where the section's heading stops claiming fields. The fields after it start a block of their own below a rule, with no heading and no placeholder title. Ungrouped fields keep their place after the groups, and a section without a heading that follows a titled one is set apart the same way. Every stacked form layout gets this: the default form, `formType: 'modal'` and `formType: 'drawer'`, with sections derived from `fieldGroups` or listed explicitly. A form with no groups, a form whose every field is in a group, collapse and a group's `visibleWhen` render as before.
174
+ - ccddd11: A create form preselects the option a field's option list marks `default: true` (objectui#11914).
175
+
176
+ A `select` field that declares no `defaultValue` but marks one option `default: true` opened on the "Select an option" placeholder in every object-form container, the console's create dialog included. The server stores the marked option when a create omits the field, so the objectstack tutorial's Create Ticket form showed Priority and Status empty and could not be submitted until the user picked the values the metadata had already chosen.
177
+
178
+ The create form now reads the option list the way the server's insert path does:
179
+
180
+ - only when the field declares no `defaultValue`. A field-level default, static or runtime, always wins, and the option flag is then not seeded;
181
+ - a single-valued field takes the first marked option;
182
+ - a multi-valued field (`multiselect`, or `select` with `multiple: true`) takes every marked option, as an array.
183
+
184
+ A value the caller seeds or the user picks still wins. Edit forms are unchanged: they show the stored record.
185
+
186
+ Nothing is added to the package entry: no export, prop or type member.
187
+ - 023f00d: A create form asks its fields the create question, so a role that may create
188
+ records but not edit them can fill and submit the form (objectui#12082). Every
189
+ console affordance that offers a write now reads the grant it exercises from
190
+ one map.
191
+
192
+ **The defect.** A create form gated each field on `checkField(object, field,
193
+ 'write')`, whose fallback for a field the permission set does not mention is
194
+ the object's `allowEdit`. Under a grant of `allowCreate: true, allowEdit: false`
195
+ every field of the create form rendered disabled, the outbound filter stripped
196
+ every field from the body, and the save posted an empty record that the server
197
+ refused for its required fields — while the server accepts the same create.
198
+
199
+ **The server's insert rule, which the create question follows.** The server's
200
+ field-level write step refuses a write that names a field whose explicit
201
+ field-level entry has `editable: false`; a field with no entry passes it, and
202
+ object admission decides the operation (`allowCreate` for an insert,
203
+ `allowEdit` for an update). So a create-form field now reads its explicit entry
204
+ when there is one and the object's create grant when there is none. A field the
205
+ permission set marks `editable: false` stays disabled and out of the body.
206
+
207
+ **Clause-②: yes (widening)**
208
+
209
+ - `@object-ui/core` exports the affordance-to-grant map: `AFFORDANCE_GRANTS`
210
+ (one row per affordance: the CRUD-affordance bit it needs, the object grant it
211
+ exercises and, for an affordance that offers fields, the field question it
212
+ asks), `resolveAffordance` (managed-object policy ∧ the server's effective API
213
+ operation set ∧ the caller's grant, with the row's `userActions` predicates
214
+ surfaced only when all three allow it), `resolveFieldAffordance`,
215
+ `formFieldsAffordance`, and their types (`ConsoleAffordance`,
216
+ `FieldAffordance`, `AffordanceGrant`, `FieldAffordanceGrant`,
217
+ `AffordanceGrantRow`, `AffordanceGrantPrincipal`, `FieldAffordancePrincipal`,
218
+ `AffordanceSource`, `AffordanceVerdict`).
219
+ - `@object-ui/permissions`: `checkField`'s action accepts `'create'` beside
220
+ `'read'` and `'write'`. `MePermissionsProvider` answers it from the explicit
221
+ field entry when there is one and from `allowCreate` otherwise; the
222
+ role-based `PermissionProvider` answers it as it answers `'write'`.
223
+
224
+ **Behaviour, by package.** With no permission provider mounted every grant
225
+ still reads open, as before.
226
+
227
+ - `@object-ui/plugin-form`: every `ObjectForm` layout's fields and outbound
228
+ filter ask the question of the form's mode (create or edit). The form-wide
229
+ lock, with its "You don't have permission to …" notice, also engages when the
230
+ caller's object grant for the form's mode is denied, not only when the
231
+ managed-object policy or the effective API operation set closes it. A
232
+ create-mode `MasterDetailForm`'s line cells ask the create question of the
233
+ child object, since every line there is a new record.
234
+ - `@object-ui/app-shell`: the record page's Edit and Delete (and the record
235
+ body's in-place editing) read the caller's update / delete grant; they read
236
+ none before. The import wizard's write targets ask the create question, so a
237
+ caller offered Import keeps every field the insert accepts. List New / Import,
238
+ the related lists and the Attachments panel read the map with the verdicts
239
+ they had.
240
+ - `@object-ui/fields`: a lookup's "Create new" reads the create grant (and the
241
+ managed-object policy and operation set) of the object the field references;
242
+ it read no grant before.
243
+ - `@object-ui/plugin-grid`: row Edit / Delete, in-place editing, the template
244
+ download and the add-record row read the map; the add-record row now also
245
+ honours the object's managed-object policy and effective `create` operation.
246
+ - `@object-ui/plugin-detail`: `record:details` in-place editing reads the
247
+ caller's update grant; the detail header's object gate adds the effective
248
+ operation set.
249
+ - `@object-ui/plugin-list` and `@object-ui/console`: bulk Delete, the
250
+ inline-edit toggle and the profile page's language field read the map with
251
+ the verdicts they had.
252
+ - 7525045: More write affordances read the affordance-to-grant map, so a caller without the
253
+ grant is no longer offered a write the server then refuses (objectui#12082, leg A
254
+ of the write-census backlog). No row is added: each reuses the row of the same
255
+ verb on the same object.
256
+
257
+ - **The record overlay's inline edit** — the overlay the calendar, the kanban and
258
+ the gantt open on a record (`RecordDetailPanel`) — reads the `recordEdit` row,
259
+ the row the record page reads for the same in-place edit: the object's policy,
260
+ the effective API operation set and the caller's update grant. A closed row
261
+ opens no inline-edit session, as an absent `onFieldSave` already did. Each
262
+ field still asks its own field question, as since objectui#12103.
263
+ - **The gantt's in-chart writes** read `rowEdit` (a bar's drag, resize and
264
+ progress, its title edited in place, and its dependency links) and `rowDelete`
265
+ (a row's Delete). A closed row withholds the handler the chart draws the
266
+ affordance from, the way `readOnly` and `lockField` already do.
267
+ - **A grid's bulk field update** (a `bulkActionDefs` entry with `operation:
268
+ 'update'`) reads `rowEdit`, as its bulk delete reads `rowDelete`: a closed row
269
+ removes the button from the selection bar, and with it the dialog, its undo
270
+ and its retry. `custom` operations are unchanged.
271
+ - **A master-detail form's line grids** read `relatedNew` (Add, the entry row
272
+ and Duplicate) and `relatedRowDelete` (Remove) on the CHILD object, as a
273
+ line-items panel does. Remove asks the delete grant on an edit form only: a
274
+ create form's lines are drafts, and a removed one is never a server delete.
275
+ - **A line-items panel** now hands its child object's schema to those two rows,
276
+ so the child's own policy (`managedBy`, `userActions`) is read too.
277
+ - **The AI build panel's spreadsheet import** (`ExcelImportBar`) reads the
278
+ `listImport` row of the object it imports into, as the list page's Import
279
+ does: without it, Import is disabled for that object.
280
+
281
+ With no permission provider mounted every one of these reads open, as before.
282
+ - 5af42db: Five write affordances that read no grant at all now read the affordance-to-grant
283
+ map, so a caller without the grant is no longer offered a write the server then
284
+ refuses (objectui#12082, the card's remainder).
285
+
286
+ - **`object-view`'s New** (the toolbar button of the SDUI `object-view` node)
287
+ reads the `listNew` row, as the console's list pages already did: the
288
+ object's policy, the effective API operation set and the caller's create
289
+ grant, on top of the node's `showCreate` / `operations.create` toggles.
290
+ - **The calendar's quick-create** (an empty-day click, or a time-range drag in
291
+ the week / day grid) reads the new `calendarQuickCreate` row, and
292
+ **drag-to-reschedule** reads the new `calendarReschedule` row. A closed row
293
+ withholds the handler the calendar grid draws the affordance from: no dialog
294
+ on a day click, no range drag, no draggable event. A host-supplied
295
+ `onDateClick` / `onEventDrop` is handed through unchanged.
296
+ - **The kanban card move** reads the new `kanbanCardMove` row. A closed row
297
+ draws the cards as not movable and hands the board no mover, so no drop
298
+ reaches the write.
299
+ - **A line-items panel's add and remove** (`record:line_items`) read the
300
+ `relatedNew` and `relatedRowDelete` rows on the CHILD object, the same rows a
301
+ related list reads for the same two writes. Add covers the Add button, the
302
+ entry row and Duplicate; remove covers the per-row Remove.
303
+
304
+ With no permission provider mounted every one of them reads open, as before.
305
+
306
+ **Clause-②: yes (widening).** `AFFORDANCE_GRANTS`, exported from
307
+ `@object-ui/core`, gains three rows: `calendarQuickCreate` (create),
308
+ `calendarReschedule` (update) and `kanbanCardMove` (update), and with them the
309
+ `ConsoleAffordance` union that `resolveAffordance` accepts. Nothing is removed or
310
+ renamed. The other four packages change behaviour only.
311
+ - 5330038: Console rendering fixes from the HotCRM browser pass (objectui#12110):
312
+
313
+ - **Grid:** a view column's authored `label` is the header. It used to lose to the field's translated label whenever the app bundle translated the field.
314
+ - **Form:** a field `widget` that names no registered component falls back to the field type's renderer, as the spec's `widget` description says. A `rating` field declaring `widget: 'star_rating'` now draws the star widget instead of a text box. A built-in control name (`input`, `textarea`, …) and the native password and email inputs still render as before.
315
+ - **Cells:** a `rating` value draws stars out of the field's `max` (5 by default) in list, detail and related-list cells, instead of a bare number.
316
+ - **Reference rail:** a related row is named by its object's declared `nameField`, and the rail refetches in place when the record, a related object or everything is invalidated. A record action with `refreshAfter: true` therefore refreshes the rail too.
317
+ - **Gantt:** the task list, the tooltip and the drag previews show a date's year when it is not the current year.
318
+ - **Approvals drawer:** a `position:` approver shows the position's label, from the console's position registry, instead of a truncated id. The headline figure prefers the object's declared `currency` field and never shows a zero from a field matched only by its name.
319
+ - **Public form:** a form with no title of its own is headed by its object's label, not the object's API name.
320
+ - d2500d8: A form field declares `step` and `className` on both faces, so the strict authoring face stops telling authors to remove two keys that work. A built-in form branch now joins an entry's `className` with its own classes, and the form renderer's own number input derives its step, so `ObjectForm` no longer writes `step: 'any'` (objectui#12130).
321
+
322
+ These were the last two keys the form-field channel census (`form-field-channel-census-12130.test.tsx` in `examples/schema-catalog/test/`) listed as read and undeclared with the question open. Each is measured through the real `SchemaRenderer`, with and without the key, in `form-field-channel-effects-12130.test.tsx` beside it.
323
+
324
+ - **`step`, declared by reference to `@objectstack/spec`'s `FieldSchema.step`:** a number. The `number` widget and the form renderer's own number input put it on the `<input>`; the `slider` widget steps by it.
325
+ - **The form renderer's own number input (`@object-ui/components`).** The built-in `input` branch, and the default branch for an unregistered widget, draw a native number input under `inputType: 'number'`. Its step now follows the `number` widget's rule, read off the field's metadata: an explicit `step` wins, else `10^-scale`, else `any`. Before, it took only a `step` written on the entry, and with none the input kept HTML's step of 1, which refuses decimals. An entry with `inputType: 'number'` and neither `step` nor `scale` now accepts decimals. On an `ObjectForm` field drawn by that input (`widget: 'input'`), a `step` the object field declares now wins over `scale`, as it always did in the `number` widget.
326
+ - **`ObjectForm` (`@object-ui/plugin-form`) no longer writes `step`** onto the number, currency and percent fields it builds. It wrote `10^-scale`, or `'any'` with no `scale`, and the spec's numeric `step` refuses `'any'`. Both routes `objectFormNumericStep-9574.test.tsx` measures render the same steps as before, and that pin passes unchanged.
327
+ - **`className`, declared as a string:** the classes of the element the field's type renders. That is the control on a built-in branch, the element a registered field widget renders, or a `section-divider` row's divider. It is never the field row; a field's width is `colSpan` / `span`. Some widgets draw no class from it, and most read-only displays draw none.
328
+ - **Built-in branches merge it (`@object-ui/components`).** The `input`, `textarea`, `checkbox` and `switch` branches and the unregistered-widget default used to let an entry's `className` replace their own classes, which dropped the touch-target height and the read-only tint. They now join the two with `cn`, as the built-in `select` already did, so a conflicting utility in `className` still wins.
329
+ - **TypeScript.** `FormField` gains both members. `step` is `number`, so assigning `'any'` is now a compile error.
330
+ - **zod (`@object-ui/types/zod`).** WIDENS on the strict authoring face (`StrictAnyComponentSchema`): both keys used to be refused with `unrecognized_keys`, and now parse, `step` as a number. NARROWS on the tolerant face (`safeValidateSchema`), where both keys used to be stripped unjudged. `step: 'any'` was accepted and dropped there, and is now refused at `fields[].step`. A non-string `className` is now refused too. The face is flat: both keys are accepted on every field type.
331
+
332
+ BREAKING (`@object-ui/types`), for a document whose form field carries `step: 'any'` or a non-number `step`, or a non-string `className`: it no longer validates on the tolerant face. Delete `step: 'any'` (a number input with no `step` and no `scale` already steps by `any`), or write a number. (The bumps are `minor` by this repo's release model: objectui's major follows the `@objectstack` family major, and its own breaking changes ship as `minor` with the breaking semantics stated here.)
333
+
334
+ **Clause-②: yes (narrowing)**: the two declared keys widen the strict face's accept set. Typing `step` as the spec's number narrows the tolerant face, from accepting `step: 'any'` (stripped) to refusing it at `fields[].step`.
335
+ - b231607: The flat `ObjectForm`'s file-size hint now reads the spec's `maxSize`, and it is shown in the session language (objectui#12156).
336
+
337
+ A `file` or `image` field that declares a size limit gets a size-limit hint appended to its description. The form read the limit as `max_size`, a spelling the spec's `FieldSchema` refuses by name, so metadata the server serves never carried it and the hint never appeared. It now reads `maxSize`, the spelling the file and image widgets already enforce, and no longer reads `max_size`.
338
+
339
+ The hint's words were an English literal ("Max size: …"). Once the hint started to appear, a session in any other language would have shown that English beside a translated form. The words now come from the `form.maxFileSize` pack key in the session language. The number and unit are still formatted the same way ("10.0 MB"). A host with no i18n provider still sees the English sentence.
340
+ - 6c437b0: A record's Edit form saves the owner the user changes or clears (objectui#12205). The form dropped `owner_id` from every save, so a reassignment or a clear made in the Edit dialog never reached the server: Save answered as if it had saved, the dialog closed, and the record kept its old owner. When the owner was the only change, the update carried every other field unchanged and no owner.
341
+
342
+ An edit now sends `owner_id` when, and only when, its value differs from the record the form loaded: a new owner is sent as its id, and a cleared owner as `null`. This applies to the modal, drawer and page Edit forms, and to the tabbed, split and wizard layouts. The server stays the authority: a role without the transfer grant is refused, and the form shows that refusal as its error and stays open.
343
+
344
+ Unchanged:
345
+
346
+ - An owner the user did not touch is still never sent, so a save from a role without the transfer grant is not refused for echoing it back (objectui#10108). This holds for a save with nothing changed, and for any save where the form has no loaded record to compare against.
347
+ - A create never sends the owner.
348
+ - The caller's field-level security, and an object that declares its owner read-only, still keep the owner off the wire.
349
+ - The business-unit and tenant columns (`owning_business_unit_id`, `organization_id`, `tenant_id`) and the audit columns are still never sent, even when they differ.
350
+ - A form laid out automatically still renders no owner input.
351
+ - The master-detail form's batch still sends no owner, for the header record as well as its lines. An owner changed in a master-detail header is therefore still not saved.
352
+
353
+ Nothing is added to the package entry: no export, prop or type changes.
354
+
355
+ Clause-②: no
356
+ - 10aba37: The record form stops reading a field's snake_case `visible_on`. A field's visibility is `visibleWhen`, the key `@objectstack/spec`'s `FieldSchema` declares (objectui#12242).
357
+
358
+ `ObjectForm`'s object-field builder and the sectioned forms' name-string entries read `visible_on` beside `visibleWhen` and carried it onto the runtime field as a view-level gate. The spec refuses `visible_on` by name and suggests `visibleWhen`, and `BaseFieldMetadata` now refuses it, so the read retires with no alias.
359
+
360
+ - FROM `visibleWhen` plus the `visible_on` gate → TO `visibleWhen` alone, carried as before.
361
+
362
+ A predicate written under `visible_on` now gates nothing and is not reported. Write it as `visibleWhen`; a CEL predicate keeps the same text.
363
+ - f0532d8: Saving a master-detail edit form no longer rewrites the position of lines the
364
+ user did not touch (objectui#12286).
365
+
366
+ The edit form read each collection's lines with no sort, so its line grid drew
367
+ them in whatever order the server returned, and the grid stamped every line's
368
+ index into the child's sort field (`position`, `sort_order`, …) on any change.
369
+ Editing one cell of one line therefore saved a new position onto its untouched
370
+ siblings, swapping their stored order and bumping their `updated_at`.
371
+
372
+ - `MasterDetailForm` now reads the lines ascending by the child's derived sort
373
+ field, the record id breaking ties, so the grid opens in stored order.
374
+ - The line grid (`field:grid` with a `sortField`) renumbers only when a row is
375
+ added, removed, duplicated or moved. A cell edit leaves every row's position
376
+ as it was, so lines whose stored positions are tied, empty or gapped are not
377
+ renumbered by an edit either.
378
+
379
+ Editing one line's field now sends exactly one update, and moving a line sends
380
+ only the lines whose position changed. The `GridFieldMetadata.sortField`
381
+ description says when the grid stamps the field.
382
+ - fc211e8: A New form now saves the owner the user picks (objectui#12359). When the form's layout shows Owner, the user could pick a user and see that user's chip. The create request still carried no `owner_id`, so the server saved the record under the creator, answered 201 and showed no error.
383
+
384
+ Every create writer in the package now sends `owner_id` when the user picked an owner that differs from the value the form opened with. The six writers are `ModalForm`, `DrawerForm`, and the simple, tabbed, split and wizard layouts of `ObjectForm`. They read the same admission objectui#12205 gave the Edit form. An owner the form was seeded with and the user left alone is still not sent. That covers the acting user from a `current_user` default and an owner in the caller's initial values. The caller's field-level security and an owner the object declares `readonly` still refuse it. The client does not decide whether the caller may assign another owner. The server judges the pick: an insert that names another user is refused without the transfer grant (`allowTransfer` or `modifyAllRecords`), and the form shows that refusal as its error.
385
+
386
+ Not published: nothing changes on the package entry. No export, prop or type member is added or removed.
387
+ - 5f8ecf6: A sectioned create or edit form draws every section at its own `columns` count per row, whatever the other sections declare (objectui#12548).
388
+
389
+ `@objectstack/spec` `FormSectionSchema.columns` is a per-section count, but all of a form's sections share one field grid, sized by the widest section, and each field spanned `Math.round(grid / sectionColumns)` cells of it. A section whose count did not fit that grid drew the wrong number per row. A `columns: 2` section beside a `columns: 3` one spanned 2 of 3 cells, so it drew one field per row and left the right third empty. A `columns: 3` section beside a `columns: 4` one spanned 1 of 4 cells, so it drew four per row.
390
+
391
+ `ModalForm`, `ObjectForm`, `SplitForm`, `TabbedForm` and `WizardForm` now share one rule:
392
+
393
+ - When every section's count is 1 or the grid's own width, the form keeps the grid and spans it always had, class for class.
394
+ - Otherwise the field grid is 12 tracks wide from `@md` (`grid-cols-1 @md:grid-cols-12`). Each field spans 12 / 6 / 4 / 3 twelfths of the row for a 1 / 2 / 3 / 4-column section. `span: 'full'` and wide widgets take the row, and an authored `colSpan` counts its section's columns.
395
+
396
+ The form renderer draws a twelfths `colSpan` with the step ladder each count has on its own grid: at most two per row at `@md`, three at `@2xl` and four at `@4xl`. Below `@md` the form stays one column.
397
+
398
+ No type, prop or export changes. A form with no section `columns` is unchanged.
399
+ - 0081cdc: Opening a collapsed section in a record dialog no longer takes the whole console off screen (objectui#12559).
400
+
401
+ The field widgets `@object-ui/fields` registers load on demand: a type's code is fetched the first time a form draws it. Nothing inside the modal form caught that wait, so it landed on the host's nearest loading boundary. In the console's record create and edit dialog that is the boundary around the whole console, because the dialog mounts beside the pages rather than inside one. Opening a collapsed section whose fields used a type not loaded yet, for example a currency or address field, swapped the whole console, dialog included, for the loading screen until the code arrived. The full-page form hid only its page.
402
+
403
+ The modal form now owns that wait: the dialog keeps its header and footer, its body shows a placeholder until the widget's code arrives, and the form underneath keeps its state, so the section the user opened is open and everything typed elsewhere is kept. Nothing is added to the package entry: no export, prop or type member.
404
+ - 96fa4b9: A form section that declares no `columns` now draws two fields per row from the container's `@md` width (one below it) on every page form host — `ObjectForm`, `SplitForm`, `TabbedForm` and `WizardForm` — as the record dialog already did (objectui#12592). Before this, `ObjectForm` sized it by field count and the other three drew it one per row, or at the widest declared count. `@objectstack/spec` no longer defaults a section's `columns` to `1`, so this reaches every section an author left undeclared, a field-group section included. The rule lives once, in the shared sectioned-form layout, and a declared `columns` (`1` included) is drawn as written.
405
+
406
+ Clause-② reading: no. Only how many columns an undeclared section draws changes; no published type, prop, export, schema read or pack key changes, and the ruling on objectui#12521 makes an undeclared density the renderer's choice by available width.
407
+ - 85e8961: An `lg` or `xl` `ModalForm` dialog keeps a 1rem gutter on each side of the window from `sm` (640px) up (objectui#12593).
408
+
409
+ The two sizes are bounded at 672px (`lg`) and 1024px (`xl`), but the dialog took the full width of any window narrower than that, at x = 0, with no margin. Since every field-heavy create or edit in the console opens `lg` or `xl`, a laptop or tablet window between 640px and 1056px drew those dialogs edge to edge. Both sizes now read one shared width, the window less 2rem, under their own max width, so the dialog is centred with an equal gutter. On a window wider than the max width plus 2rem each size is exactly as wide as before.
410
+
411
+ Unchanged: the `sm`, `default` and `full` sizes, the full-screen sheet below `sm`, and the dialog's height rules. Nothing is added to the package entry: no export, prop, type member or `modalSize` value.
412
+ - 726d8c9: Every wide centred dialog keeps a 1rem gutter on each side of the window from `sm` (640px) up, by one shared class (objectui#12603).
413
+
414
+ `@object-ui/components` adds one export, `DIALOG_VIEWPORT_GUTTER` (`sm:w-[calc(100%-2rem)]`): the gutter `ModalForm` introduced for its `lg` and `xl` sizes (objectui#12593), promoted so every wide dialog reads the same value. A dialog that raises its cap with `sm:max-w-2xl` or wider writes this constant beside the cap.
415
+
416
+ Dialogs that ran edge to edge between `sm` and their max width and now keep the gutter:
417
+
418
+ - the action modal's `lg` and `xl` sizes (`xl` is what a `type: 'modal'` action with a page target and no size opens at);
419
+ - the action parameter dialog with a long parameter list, the flow runner's object-form or long screen step, and the CEL test-run dialog;
420
+ - the full-screen text editor dialog, the image lightbox and the import wizard.
421
+
422
+ The record picker reads the same class under every width rung; it kept a `95vw` margin of its own before, so between `sm` and its cap it is now the window less 2rem instead. `ModalForm` reads the shared export instead of its private copy, with no change in output.
423
+
424
+ Unchanged: sheets, the phone sheet below `sm`, the `full` size (`95vw`), and every dialog's width on a window wider than its max width plus 2rem.
425
+ - 54e79f9: `record:line_items` fills an untyped column from the child object's field (objectui#12854, the objectui half of objectstack-ai/objectstack#24140).
426
+
427
+ A column listed only by `name` was headed by the bare field name and edited as plain text, on screen and on a print page. The panel now passes its columns through `hydrateColumns`, the function the master-detail form already uses: a column without a `type` takes its `label`, `type` and `options` (and the field's `required`, lookup reference and formula) from the child object's field. The child schema is the one the panel already loads, which the object-metadata endpoint serves in the session locale, so a heading translates the same way a master-detail grid's does.
428
+
429
+ An authored `label` or `type` still wins, and a column whose field the child object does not declare renders as before. Nothing is added to the package entry: no export, prop, type member or language-pack key.
430
+ - 1e6d83b: Data-bound blocks title their "data source could not be resolved" panel in the page's language (objectui#12920, the family of objectui#12910). The panel shows when a block's `dataSource.view` names a view its object does not have. Each block's title now reads `@object-ui/i18n` through `useObjectTranslation`, with the `en` pack's value as the inline default, so a page with no `I18nProvider` draws the same English it drew before.
431
+
432
+ - **Plugin blocks.** `object-calendar`, `object-chart`, `object-metric`, `object-pivot`, `detail-view`, `record:related_list`, `object-form`, `embeddable-form`, `object-master-detail-form`, `record:line_items`, `object-gantt`, `object-grid`, `object-kanban`, `list-view`, `object-map` and `object-timeline` read one `element.KIND.sourceUnresolved` key per block kind. `object-metric` reads `element.number.sourceUnresolved`, the key `element:number` already reads for the same sentence. The three forms share `element.form.sourceUnresolved`. `record:related_list`'s panel for a failed `parentDataSource` read reads `element.relatedList.parentUnreadable` ("This related list’s parent record could not be read").
433
+ - **`@object-ui/react` panel defaults.** `ElementDataSourceErrorPanel` with no `title` reads `element.component.sourceUnresolved`, and `NoDataSourcePanel` with no `title` reads `element.component.noDataSource`. A passed `title` still wins, an empty string included. Props and markup do not change.
434
+
435
+ Clause-②: yes
436
+
437
+ The new keys in `@object-ui/i18n` widen its exported `TranslationKeys`. No prop, input or export of these packages changes.
438
+ - fb85637: A field group whose `visibleWhen` cannot be evaluated is now hidden, header and members, on the form and on the record detail page (objectui#13055).
439
+
440
+ `@objectstack/spec` declares `ObjectFieldGroupSchema.visibleWhen` fail-closed: "the whole group (header included) is shown only when TRUE, else hidden (fail-closed)". Until now both surfaces failed open. A group whose predicate had a parse error, named an unknown field or root, or failed to evaluate was drawn in full, with only a console warning.
441
+
442
+ - **Form.** Every layout now hides the group: simple, tabbed, split, drawer, modal, and the console's form page. This holds whether the group comes from the object's `fieldGroups` fallback or from a `{ group }` section reference. Members of a group hidden this way behave as they do under a FALSE predicate: their values still submit and their client-side validation is skipped.
443
+ - **Record detail page.** `record:details` hides the group's section.
444
+ - **Diagnostic.** The one-time warning still fires, and now names the default taken: `safe default (false)` and "the group is hidden".
445
+ - **What stays fail-open.** An authored form-view section's own `visibleWhen` still faults open, as `FormSectionSchema.visibleWhen` declares. So do a field's own `visibleWhen`, `readonlyWhen` and `requiredWhen` (ADR-0137 D3), and every other predicate slot. A well-formed predicate gates exactly as before.
446
+
447
+ How the direction reaches the renderer: a form-view section's predicate and a field group's predicate arrive at the form renderer in the same slot, a `section-divider` row's (or a tab's) `visibleWhen`. So the direction travels with the predicate. `@object-ui/types` declares one runtime hand-off key, `visibleWhenFault?: 'hidden' | 'shown'`, on `ObjectFormSection`, `FormField` (`section-divider` rows only) and `FormFieldTab`, and mirrors it on the zod faces. `deriveFieldGroupSections` stamps `'hidden'` beside a group's predicate. Every layout carries it next to `visibleWhen`, and the form renderer reads it as the fault fallback. Absent means today's fail-open. It is not an authoring key: the spec's strict `FormSectionSchema` refuses it in authored metadata.
448
+ - bc98626: A master-detail edit form now applies its line rules to the header record however late that record loads (objectui#13062).
449
+
450
+ A line column's `readonlyWhen` / `requiredWhen` rule that reads `parent.*` was evaluated against a copy of the header form read from the page at mount and 120, 360 and 800 ms after it. When the header record loaded later than that, `parent` stayed empty. A stored paid invoice then opened with its `readonlyWhen: parent.status == 'paid'` line cells editable until the user changed a header field.
451
+
452
+ The line grids now take the header's own record when the header's read returns, and the user's header edits apply over it as they are made. A status change still locks or unlocks the cells at once. The timers are gone. A create form starts from its prefilled values (`initialValues` / `initialData`).
453
+
454
+ Nothing is added to the package entry: no export, prop or type member.
455
+ - 9eb1479: Keyboard access to the console: a "Skip to content" link, and record dialogs that open on their first field (objectui#13130).
456
+
457
+ - **Skip to content.** The console shell's first Tab stop is now a "Skip to content" link. It stays out of sight until it is focused. Activating it moves focus to the element that holds the page, so the next Tab reaches the page's first control without walking the app bar and every sidebar entry. It moves focus without writing a hash into the URL. Its text is the new `console.skipToContent` key in all ten language packs.
458
+ - **Create/Edit dialogs open on their first editable field.** `ModalForm`'s dialog opened with focus on its Close button (the master-detail dialog on one of its buttons), never on a field. Its body (the object schema, the record on edit, and the field widgets) loads after the dialog opens, so when the dialog took focus no field was there yet. While the body loads, the dialog now keeps focus on itself. When the fields arrive, focus moves to the first field that can be edited, skipping disabled and read-only ones. If the user has already moved focus to another control, focus stays there. This covers both of `ModalForm`'s dialogs: the flat form and the master-detail form.
459
+
460
+ No export, prop or schema key is added.
461
+ - ab4e4d7: Record drawers open on their first field (objectui#13219), as record dialogs do since objectui#13130.
462
+
463
+ `DrawerForm`'s panel opened with focus on its Close button (the master-detail drawer on its Cancel button), never on a field. The object schema, and on edit the record, are read after the drawer opens, so when the drawer took focus no field was there yet. While the body loads, the drawer now keeps focus on its own panel. When the fields arrive, focus moves to the first field that can be edited, skipping disabled and read-only ones. If the user has already moved focus to another control, focus stays there. This covers both of the drawer's bodies: the form and the master-detail form.
464
+
465
+ No export, prop or schema key is added.
466
+ - a29f615: A record drawer stays open on its first open (objectui#13238). On the first open in a page session, the drawer's body is drawn for the first time once the record is read, and its field widgets' code is still loading, so that render waits. The drawer had no place of its own to wait, so the wait was handed to the page's: in the console, the whole page was replaced by the loading screen, and when it came back a `kind:'react'` page that hosted the drawer was rebuilt and lost its own state, closing the drawer it had opened a second or two earlier. The drawer now waits inside its own sheet, as the record dialog already does: the header stays, the body shows a placeholder until its fields can be drawn, focus stays in the sheet and moves to the first field when it lands, and the page behind is never hidden. Escape, the Close button and a click outside still close the drawer.
467
+
468
+ Nothing is added to the package entry: no export, prop or type member.
469
+ - ff128e3: Opening a collapsed form section keeps keyboard focus on its header the first time too (objectui#13246).
470
+
471
+ The first time a section opens, the widget code for its fields can still be loading. In the record dialog (`ModalForm`), that wait hid the whole dialog body, and the header the user had just pressed with it. The browser then dropped focus from the hidden header, and focus came back to the dialog itself, so the next Tab started again at the dialog's first field. The record drawer (`DrawerForm`) had no wait of its own: the same toggle hid everything under the host's nearest loading boundary, the drawer included. Later toggles were not affected, because the widget code was already loaded.
472
+
473
+ Both forms now open and close a section as a React transition. While the section's widgets load, the form stays on screen as it was. The header keeps focus, the section opens when its fields can be drawn, and the next Tab reaches the section's first field. The dialog keeps its own loading placeholder for every other wait, such as the first draw of its body after the record loads.
474
+
475
+ Nothing is added to the package entry: no export, prop or type member.
476
+ - Updated dependencies [18d7b48]
477
+ - Updated dependencies [172acc3]
478
+ - Updated dependencies [f0496bd]
479
+ - Updated dependencies [c4c506b]
480
+ - Updated dependencies [9db9ff3]
481
+ - Updated dependencies [c096f03]
482
+ - Updated dependencies [d92b2a1]
483
+ - Updated dependencies [92f4e2b]
484
+ - Updated dependencies [b10c68e]
485
+ - Updated dependencies [bdc9049]
486
+ - Updated dependencies [e8c0b96]
487
+ - Updated dependencies [b92329c]
488
+ - Updated dependencies [2e818d0]
489
+ - Updated dependencies [fd060f0]
490
+ - Updated dependencies [fd060f0]
491
+ - Updated dependencies [8b14aec]
492
+ - Updated dependencies [2abec3a]
493
+ - Updated dependencies [9dfaca6]
494
+ - Updated dependencies [c000398]
495
+ - Updated dependencies [73b5d77]
496
+ - Updated dependencies [7b17705]
497
+ - Updated dependencies [fc3c2cc]
498
+ - Updated dependencies [f9f4a62]
499
+ - Updated dependencies [848ba0e]
500
+ - Updated dependencies [57d82cb]
501
+ - Updated dependencies [de96f3d]
502
+ - Updated dependencies [9ca3cac]
503
+ - Updated dependencies [c910630]
504
+ - Updated dependencies [ce464d9]
505
+ - Updated dependencies [e6dcd85]
506
+ - Updated dependencies [96fcf30]
507
+ - Updated dependencies [7a2c60b]
508
+ - Updated dependencies [055d350]
509
+ - Updated dependencies [834c559]
510
+ - Updated dependencies [22b503c]
511
+ - Updated dependencies [9fc68aa]
512
+ - Updated dependencies [d50f724]
513
+ - Updated dependencies [17acfbb]
514
+ - Updated dependencies [6be0f7a]
515
+ - Updated dependencies [db4cb6b]
516
+ - Updated dependencies [89cc738]
517
+ - Updated dependencies [c0862c1]
518
+ - Updated dependencies [c0862c1]
519
+ - Updated dependencies [c0862c1]
520
+ - Updated dependencies [c0862c1]
521
+ - Updated dependencies [c0862c1]
522
+ - Updated dependencies [c0862c1]
523
+ - Updated dependencies [ded4494]
524
+ - Updated dependencies [d172f63]
525
+ - Updated dependencies [4c0de52]
526
+ - Updated dependencies [a80fef7]
527
+ - Updated dependencies [3bf8894]
528
+ - Updated dependencies [e06365c]
529
+ - Updated dependencies [3035948]
530
+ - Updated dependencies [1e1f09e]
531
+ - Updated dependencies [455c646]
532
+ - Updated dependencies [f34e877]
533
+ - Updated dependencies [f34e877]
534
+ - Updated dependencies [f34e877]
535
+ - Updated dependencies [9844bbf]
536
+ - Updated dependencies [cef0eee]
537
+ - Updated dependencies [7ebff39]
538
+ - Updated dependencies [054fd84]
539
+ - Updated dependencies [5275d1f]
540
+ - Updated dependencies [7241a81]
541
+ - Updated dependencies [74add0c]
542
+ - Updated dependencies [aaba865]
543
+ - Updated dependencies [f1781be]
544
+ - Updated dependencies [5ab2f19]
545
+ - Updated dependencies [fbad078]
546
+ - Updated dependencies [45d5853]
547
+ - Updated dependencies [4f4fc03]
548
+ - Updated dependencies [2312bd9]
549
+ - Updated dependencies [6d5eb34]
550
+ - Updated dependencies [c5406c2]
551
+ - Updated dependencies [c5406c2]
552
+ - Updated dependencies [d99b731]
553
+ - Updated dependencies [2571a3e]
554
+ - Updated dependencies [a368ccb]
555
+ - Updated dependencies [2a48bd4]
556
+ - Updated dependencies [8a55f0c]
557
+ - Updated dependencies [c7b30bd]
558
+ - Updated dependencies [20c6d35]
559
+ - Updated dependencies [417e245]
560
+ - Updated dependencies [69bca0a]
561
+ - Updated dependencies [023f00d]
562
+ - Updated dependencies [158c75d]
563
+ - Updated dependencies [7525045]
564
+ - Updated dependencies [5af42db]
565
+ - Updated dependencies [ce991bd]
566
+ - Updated dependencies [3c0f806]
567
+ - Updated dependencies [1071393]
568
+ - Updated dependencies [5f75cfa]
569
+ - Updated dependencies [29b9949]
570
+ - Updated dependencies [6757a93]
571
+ - Updated dependencies [b7cd5c8]
572
+ - Updated dependencies [5330038]
573
+ - Updated dependencies [2498a07]
574
+ - Updated dependencies [898bd2c]
575
+ - Updated dependencies [c9fc10b]
576
+ - Updated dependencies [dc6d28e]
577
+ - Updated dependencies [c0c2f79]
578
+ - Updated dependencies [0665c3b]
579
+ - Updated dependencies [d2500d8]
580
+ - Updated dependencies [e723f58]
581
+ - Updated dependencies [82bb1d5]
582
+ - Updated dependencies [f3d5408]
583
+ - Updated dependencies [b231607]
584
+ - Updated dependencies [b231607]
585
+ - Updated dependencies [466a219]
586
+ - Updated dependencies [466a219]
587
+ - Updated dependencies [6fb281d]
588
+ - Updated dependencies [54159d3]
589
+ - Updated dependencies [fa778e6]
590
+ - Updated dependencies [334f0cf]
591
+ - Updated dependencies [c08c933]
592
+ - Updated dependencies [92f979d]
593
+ - Updated dependencies [c4dd707]
594
+ - Updated dependencies [c4dd707]
595
+ - Updated dependencies [7578323]
596
+ - Updated dependencies [a491b64]
597
+ - Updated dependencies [38bb373]
598
+ - Updated dependencies [923504f]
599
+ - Updated dependencies [5b45c0d]
600
+ - Updated dependencies [923504f]
601
+ - Updated dependencies [5c2982a]
602
+ - Updated dependencies [97e7d4e]
603
+ - Updated dependencies [5d3f437]
604
+ - Updated dependencies [10aba37]
605
+ - Updated dependencies [5d3f437]
606
+ - Updated dependencies [51c661e]
607
+ - Updated dependencies [7af0ab3]
608
+ - Updated dependencies [b434f5f]
609
+ - Updated dependencies [9f282ef]
610
+ - Updated dependencies [fd4872f]
611
+ - Updated dependencies [f0532d8]
612
+ - Updated dependencies [cea429b]
613
+ - Updated dependencies [3092aca]
614
+ - Updated dependencies [82e5f53]
615
+ - Updated dependencies [d81e460]
616
+ - Updated dependencies [8106db1]
617
+ - Updated dependencies [068a540]
618
+ - Updated dependencies [ca45c6d]
619
+ - Updated dependencies [093d55b]
620
+ - Updated dependencies [b64fda3]
621
+ - Updated dependencies [a8051d6]
622
+ - Updated dependencies [72594f2]
623
+ - Updated dependencies [524136e]
624
+ - Updated dependencies [2b06a91]
625
+ - Updated dependencies [6f3299f]
626
+ - Updated dependencies [065a1cf]
627
+ - Updated dependencies [f2b17c6]
628
+ - Updated dependencies [52d6194]
629
+ - Updated dependencies [23bf859]
630
+ - Updated dependencies [1c72d77]
631
+ - Updated dependencies [789cb16]
632
+ - Updated dependencies [2b4d3f1]
633
+ - Updated dependencies [d75f212]
634
+ - Updated dependencies [37db09f]
635
+ - Updated dependencies [ff9df88]
636
+ - Updated dependencies [70e843f]
637
+ - Updated dependencies [caac3b2]
638
+ - Updated dependencies [a2225f9]
639
+ - Updated dependencies [5c4deb5]
640
+ - Updated dependencies [a8e5b73]
641
+ - Updated dependencies [d9d9d98]
642
+ - Updated dependencies [c950345]
643
+ - Updated dependencies [21f9577]
644
+ - Updated dependencies [044f231]
645
+ - Updated dependencies [f8267df]
646
+ - Updated dependencies [023087f]
647
+ - Updated dependencies [9b82ced]
648
+ - Updated dependencies [3821a3a]
649
+ - Updated dependencies [3eb3ec1]
650
+ - Updated dependencies [92c2a69]
651
+ - Updated dependencies [518a8e3]
652
+ - Updated dependencies [646caea]
653
+ - Updated dependencies [1ffd6a2]
654
+ - Updated dependencies [5f8ecf6]
655
+ - Updated dependencies [7d0c174]
656
+ - Updated dependencies [8ed7e5a]
657
+ - Updated dependencies [6c4d00d]
658
+ - Updated dependencies [db8ce2f]
659
+ - Updated dependencies [726d8c9]
660
+ - Updated dependencies [f0e760a]
661
+ - Updated dependencies [a5bb7ac]
662
+ - Updated dependencies [f78efdd]
663
+ - Updated dependencies [8a8bcf3]
664
+ - Updated dependencies [f74638c]
665
+ - Updated dependencies [278bc29]
666
+ - Updated dependencies [ef71a09]
667
+ - Updated dependencies [8614705]
668
+ - Updated dependencies [619e3f7]
669
+ - Updated dependencies [ca7a4c3]
670
+ - Updated dependencies [c9e6742]
671
+ - Updated dependencies [f62b6ff]
672
+ - Updated dependencies [608033b]
673
+ - Updated dependencies [c6b7d82]
674
+ - Updated dependencies [611566b]
675
+ - Updated dependencies [efa9cb4]
676
+ - Updated dependencies [d66d7e8]
677
+ - Updated dependencies [15d8ca6]
678
+ - Updated dependencies [378896d]
679
+ - Updated dependencies [9d857c9]
680
+ - Updated dependencies [670ea10]
681
+ - Updated dependencies [ff215d9]
682
+ - Updated dependencies [71243db]
683
+ - Updated dependencies [a8add5c]
684
+ - Updated dependencies [33ee9de]
685
+ - Updated dependencies [4839f5c]
686
+ - Updated dependencies [a23e804]
687
+ - Updated dependencies [c7462e7]
688
+ - Updated dependencies [36e2f7b]
689
+ - Updated dependencies [ac59073]
690
+ - Updated dependencies [44cb469]
691
+ - Updated dependencies [e058d76]
692
+ - Updated dependencies [c999d4c]
693
+ - Updated dependencies [8df2608]
694
+ - Updated dependencies [5483297]
695
+ - Updated dependencies [ed43c79]
696
+ - Updated dependencies [260ef71]
697
+ - Updated dependencies [655e897]
698
+ - Updated dependencies [655e897]
699
+ - Updated dependencies [020d178]
700
+ - Updated dependencies [8d80845]
701
+ - Updated dependencies [69a408f]
702
+ - Updated dependencies [d2b21a1]
703
+ - Updated dependencies [5ff64ef]
704
+ - Updated dependencies [64acb7e]
705
+ - Updated dependencies [4ff5b6b]
706
+ - Updated dependencies [473e5a0]
707
+ - Updated dependencies [b279016]
708
+ - Updated dependencies [bb6c38c]
709
+ - Updated dependencies [26323c4]
710
+ - Updated dependencies [9753811]
711
+ - Updated dependencies [2727527]
712
+ - Updated dependencies [3da39ae]
713
+ - Updated dependencies [bc281f4]
714
+ - Updated dependencies [d637be3]
715
+ - Updated dependencies [2cfdc99]
716
+ - Updated dependencies [2cfdc99]
717
+ - Updated dependencies [8523e81]
718
+ - Updated dependencies [1e6d83b]
719
+ - Updated dependencies [1e6d83b]
720
+ - Updated dependencies [32b492b]
721
+ - Updated dependencies [6058bf8]
722
+ - Updated dependencies [c219165]
723
+ - Updated dependencies [a7ae252]
724
+ - Updated dependencies [fb501bc]
725
+ - Updated dependencies [30083da]
726
+ - Updated dependencies [7f9cc37]
727
+ - Updated dependencies [b7fe09e]
728
+ - Updated dependencies [025130c]
729
+ - Updated dependencies [76f91f8]
730
+ - Updated dependencies [ea34d9b]
731
+ - Updated dependencies [8aa8e3e]
732
+ - Updated dependencies [024b7b6]
733
+ - Updated dependencies [cb80001]
734
+ - Updated dependencies [909c64e]
735
+ - Updated dependencies [9e7e1a5]
736
+ - Updated dependencies [2493e85]
737
+ - Updated dependencies [d0b9648]
738
+ - Updated dependencies [46dbf32]
739
+ - Updated dependencies [a928aaa]
740
+ - Updated dependencies [47508f3]
741
+ - Updated dependencies [61ed5ad]
742
+ - Updated dependencies [1b94d50]
743
+ - Updated dependencies [6f877f1]
744
+ - Updated dependencies [988aa9f]
745
+ - Updated dependencies [1ce0711]
746
+ - Updated dependencies [fb85637]
747
+ - Updated dependencies [9f1dd79]
748
+ - Updated dependencies [df71568]
749
+ - Updated dependencies [d11174a]
750
+ - Updated dependencies [2d8a8b7]
751
+ - Updated dependencies [cbac9d7]
752
+ - Updated dependencies [5129caa]
753
+ - Updated dependencies [9eb1479]
754
+ - Updated dependencies [74e37aa]
755
+ - Updated dependencies [961b69f]
756
+ - Updated dependencies [52907d7]
757
+ - Updated dependencies [f466b0a]
758
+ - Updated dependencies [673a71c]
759
+ - Updated dependencies [616df65]
760
+ - Updated dependencies [f48a4d5]
761
+ - Updated dependencies [58798ec]
762
+ - Updated dependencies [8803ca5]
763
+ - Updated dependencies [e70c21d]
764
+ - Updated dependencies [4b92c5a]
765
+ - Updated dependencies [06be396]
766
+ - Updated dependencies [3650d94]
767
+ - Updated dependencies [7c05f21]
768
+ - Updated dependencies [8cd4db4]
769
+ - Updated dependencies [daeb77f]
770
+ - Updated dependencies [eb4552e]
771
+ - Updated dependencies [3c3115e]
772
+ - Updated dependencies [55e90fd]
773
+ - Updated dependencies [9b75509]
774
+ - Updated dependencies [b13ea3c]
775
+ - Updated dependencies [d7e9e9a]
776
+ - Updated dependencies [cf62edf]
777
+ - Updated dependencies [0253416]
778
+ - Updated dependencies [5d77c09]
779
+ - Updated dependencies [3fd8625]
780
+ - Updated dependencies [1473757]
781
+ - Updated dependencies [d73d987]
782
+ - Updated dependencies [12ff256]
783
+ - Updated dependencies [35a2b59]
784
+ - Updated dependencies [26b0bd2]
785
+ - Updated dependencies [26b0bd2]
786
+ - Updated dependencies [d328698]
787
+ - Updated dependencies [d328698]
788
+ - Updated dependencies [d328698]
789
+ - Updated dependencies [b4e0787]
790
+ - Updated dependencies [53ee2f8]
791
+ - Updated dependencies [088e0f7]
792
+ - Updated dependencies [78b07f4]
793
+ - Updated dependencies [0df67f2]
794
+ - Updated dependencies [f962cdc]
795
+ - Updated dependencies [b403bb3]
796
+ - Updated dependencies [8a25fee]
797
+ - Updated dependencies [4016370]
798
+ - Updated dependencies [12dc7b4]
799
+ - @object-ui/types@18.0.0
800
+ - @object-ui/components@18.0.0
801
+ - @object-ui/core@18.0.0
802
+ - @object-ui/i18n@18.0.0
803
+ - @object-ui/react@18.0.0
804
+ - @object-ui/fields@18.0.0
805
+ - @object-ui/permissions@18.0.0
806
+
3
807
  ## 17.7.0
4
808
 
5
809
  ### Minor Changes