Skip to content

Commit 9a0401f

Browse files
chore(spec): re-measure the action:group, action:menu and element:repeater records at the objectui pin and quote their props-read sites, ASSERTED_ANCHOR_FLOOR 10 to 13 (#22043)
Fixes #20471 Clause-②: no (docblock text and a gate constant: the accept set and the public type surface are unchanged) Stage 2 of #20471, as the landing record of stage 1 (PR #22038) scopes it. All six `ComponentPropsMap` rows the card names now quote their props-read site, so this PR closes the card. The `action:group`, `action:menu` and `element:repeater` records cited objectui lines that did not hold at the pin they assert (`.objectui-sha` = `a58626c88`). This PR re-measures them at the pin, re-points every cited line that moved, corrects the prose that was false at the pin, and then quotes one load-bearing anchor per row. `ASSERTED_ANCHOR_FLOOR` goes from 10 to 13. ## What changed - `packages/spec/src/ui/component.zod.ts` (docblocks and one code comment, no code): - **Section 4b hop note.** It said only the two `objectName` forwards moved at the `0abd4f9f8` → `a58626c88` hop. In fact every container anchor below the deleted `useConfigBagEvaluator()` call moved, and `static-params.ts` moved too. The note now says so. A new "correction" sentence records where earlier hop notes certified anchors that had already drifted (details below). The older dated notes are left as written. - **`action:group` and `action:menu` row records:** every moved anchor is re-pointed (table below). The "static values" parenthetical on each member forward now describes what is there at the pin: since objectui#11638, a member's own `properties.params` is no longer read. - **`element:repeater` row record:** every `data-list.tsx` anchor is re-pointed (+28), and so are the two `data-objectstack/src/index.ts` anchors. The `fields` sentence said the renderer's TS type and its registration description both advertise `label`. Since objectui#11168 slice 2 neither does, and the sentence now says so. - **`element:definition-list` registration prose:** it said the registration publishes the strings `'1'` / `'2'` and marks `items` required. Since objectui#11168 slice 2 it does neither. Both sentences now give the history and the current lines. The inline comment on the `columns` literal makes the same correction. `previews/block-config.ts:307` is re-pointed to `:320`. - **`action:button`:** `static-params.ts:91-101` is re-pointed to `:98-108`. - **The `[#21855]` member paragraph** above `actionContainerMemberShape` (patch round `00c6b980`, at the seat's direction, claim revision `6027563825`): it called `0abd4f9f8` the current pin. Its three anchors now point at `a58626c88` (group `:325-327`, menu `:261-263`, `static-params.ts:164-174`), in the asserting spelling, so the gate re-checks it at the next pin bump. It is an in-place fix: the same defect class, a mechanical edit, no other claim, and the same gate family. - **Three quotes,** one per row, each spelling its path (see "The quotes" below). - `packages/spec/scripts/check-objectui-pin-citations.ts`: `ASSERTED_ANCHOR_FLOOR` goes from 10 to 13, exactly the three quotes. Its docblock names the three. It also updates the worklist count from 418 to 419, as `--verify-anchors` reads it at `a58626c88` (see Acceptance notes for why it went up by one). - `.changeset/20471-component-row-anchor-requote.md`: a `patch` changeset for `@objectstack/spec`, because `files[]` ships `src/**/*.zod.ts` and these docblocks are published text, as stage 1 measured. ## Re-pointed anchors Each row was checked in two ways, read-only, in the local objectui object store: - The new line's text was compared with the old line's text at the pin where the old number last held. They are identical for every row except the two `paramsPayload` tails that objectui#11638 rewrote. - The record's claim was re-read against the new line. | Row | Cited | Old | New (verified line at `a58626c88`) | |---|---|---|---| | `action:group` | `actions` read | `:303` | `:300` `const declaredActions: UIActionSchema[] = schema.actions \|\| [];` | | | `actionRendersAt` filter | `:304` | `:301` | | | member forward | `:329-382` | `action-group.tsx:325-374`, QUOTED (`params` `:325-327`, `objectName` `:381` → `:373`) | | | `display` | `:404` | `:396` | | | `label` / `icon` | `:424` / `:408` | `:416` / `:400` | | | `variant` | `:414`, `:456` | `:406`, `:448` | | | `size` | `:415`, `:457`, registration `:487-528` | `:407`, `:449`, `:479-520` (`:124` held) | | | `visible` | `:290` + `:401` | `:287` + `:393` | | | host `disabled` (dropdown trigger) | `:418` | `:410` (`:274`, `:159` held) | | | held | `:114-171`, `:205-243`, `:81-86`, `action-group.tsx:40-42` | unchanged | | `action:menu` | `actions` read | `:342` | `:335` `const actions: UIActionSchema[] = schema.actions \|\| [];` | | | members | `:80`, `:108-147`, `:408` | `:80`, `:108-147`, `:401` | | | `ActionAutoTrigger` | `:363-370` | `:356-363` | | | member forward | `:264-328` | `action-menu.tsx:261-321`, QUOTED (`params` `:261-263`, `objectName` `:327` → `:320`) | | | `label` | `:389`, `:398-399` | `:382`, `:391-392` | | | `icon` / `variant` / `size` | `:240` / `:241` / `:242` | `:237` / `:238` / `:239` | | | `visible` | `:235` + `:336` | `:232` + `:329` | | | registration `inputs` | `:435-463` | `:428-456` | | | host `disabled` | `:219`, `:388` | `:219`, `:381` | | `element:repeater` | `readProps` | `:97-107` | `data-list.tsx:125-135`, QUOTED | | | `object` | `:143`, `:155`; `:143-146`, `:181` | `:171`, `:183`; `:171-174`, `:209` | | | `filter` / `sort` / `limit` | `:120`, `:152` / `:153` / `:154` | `:148`, `:180` / `:181` / `:182` | | | `emptyText` / `divided` | `:181` / `:186` | `:209` / `:214` | | | `titleField` / `fields` | `:191-192` / `:128`, `:194-196`, `:196` | `:219-220` / `:156`, `:222-224`, `:224` | | | `useResolvedFilter` | `data-list.tsx:119-120` | `data-list.tsx:147-148` | | | filter arm / `serializeOrderBy` | `data-objectstack/src/index.ts:4782-4793`, `:760-786` | `:5000-5011` (`options.filters = translateFilterArray(params.$filter);`), `:868-894` | | `element:definition-list` | Studio `columns` control | `previews/block-config.ts:307` | `:320` | | | registration `columns` / `items` | `:82` (prose false at the pin) | `data-list.tsx:99-105` / `:91-97`, prose rewritten | | `action:button` | `readStaticParamValues` | `static-params.ts:91-101` | `static-params.ts:98-108` | ## When each anchor moved These readings use blob ids of each cited file at every pin from `dd3f7e1be` to `a58626c88`, read in the local objectui object store. `89cad75d5` and `ab1879721` were fetched read-only at depth 1 for this. - **`action-group.tsx` / `action-menu.tsx`:** objectui#11638 at the `0abd4f9f8` → `a58626c88` hop (+10/-18 and +11/-18). Anchors move -3 below the deleted `useConfigBagEvaluator()` call and -8 (group) / -7 (menu) from the member forward on. - **`static-params.ts`:** byte-identical from `dd3f7e1be` through `0abd4f9f8`. It gained 7 lines above `readStaticParamValues` at the same hop. - **`basic/data-list.tsx`:** changed once, at `e420df310` → `31971ff1e` (objectui#11168 slice 2 rewrote both list registrations). The repeater moved by +28. That hop's note does not list the file. Every later note recorded its anchors as held or re-read in place. - **`previews/block-config.ts`:** `:307` moved to `:320` at the same hop. - **`data-objectstack/src/index.ts`:** - The `translateFilterArray` arm moved at `db11afd49` (+42), at `e420df310` and at `ab1879721`. - `serializeOrderBy` moved at `e420df310` (+108). - Neither moved at the last hop: the file gained 7 lines at its end. The new correction sentence in section 4b records the three files whose drift went unrecorded. It does not rewrite the older dated notes. ## The quotes (H3 definition from stage 1: one load-bearing anchor per row, its props-read site) - `action:group`: `action-group.tsx:325-374` first line `const paramsPayload: ActionDef = Array.isArray(action.params)`. This is the member forward, where every key a member forwards to the runner is enumerated (`type`, `name`, `label`, `description`, `target`, `openIn`, `endpoint`, `method`, params, `bodyExtra`, `bodyShape`, `operation`, `patch`, `confirmText`, `successMessage`, `outcomeMessages`, `errorMessage`, `refreshAfter`, `locations`, `toast`, `resultDialog`, `onSuccess`, `objectName`). The range keeps the record's own extent: from the params payload to the end of the `execute` call. The line is unique in the file, so a drift is relocated. - `action:menu`: `action-menu.tsx:261-321`, same first line, same role, unique in that file. - `element:repeater`: `data-list.tsx:125-135`, quoting the opening line of the `readProps` call, the same text stage 1 quoted for the definition list at `:42` (in the source, `const props = readProps` followed by the generic's opening bracket and brace). The type literal is the row's key set. As H3 expected, the line is not unique (`:42`, `:125`), so a drift goes red without a relocation hint. - **One quote per row, as the claim says.** Stage 1 described the containers' props-read site as "the actions read plus the member forward". The claim and the dispatch both say one quote per row. I chose the member forward because it is where the member key set is read as a set, as the `forwarded: ActionDef` literal is for `action:button`. It also sits below the `actions` read (`:300` / `:335`), so a shift above either line reds the quote. A quote on the `actions` line would add a content check of one key read only. That is noted, not done. - Each quote spells its path. A path-less continuation inherits the nearest preceding FULL anchor (`inheritedAt` in the gate), which for these rows would be another file. ## Verification (at `afe6f9df`; the patch round `00c6b980` re-ran the card gate, the spec build and tests, and the derived gates green, report `6027887111`) - **The card's gate, three ways.** All exit codes were captured to a file before any pipe. - `OBJECTUI_ROOT=/home/user/objectui … check-objectui-pin-citations.ts --verify-anchors` = exit 0: `13 asserted, 419 objectui anchor(s) still carry no content assertion`. - `pnpm --filter @objectstack/spec check:objectui-pin-citations` beside the objectui checkout = exit 0: `13 anchor content assertion(s) verified against objectui at a58626c88; 500 file:line anchor(s) seen`. The self-test, including its live round-trip, is green. - The same with no objectui checkout (the CI shape) = exit 0: `13 … NOT VERIFIED — no git checkout`. - **Before the floor edit:** the gate was red, exit 1: `You ADDED coverage — set ASSERTED_ANCHOR_FLOOR to 13`. All 13 assertions verified, with no mismatch. - **Ablation, one leg per new quote.** Each leg ran through `node scripts/ablation-replace.mjs` in WRAP mode, with `--verify-anchors` as the wrapped command. Each anchor hit x1. The mutation was proven by a blob change, and the restore by blob == HEAD blob `83976000` with `git diff HEAD` empty. The final porcelain was clean. - Leg A, the group range `:325-374` changed to `:326-374`: exit 1, `That line IS in the file — at :325, not :326. Either the anchor drifted by -1 lines`. - Leg B, the menu quote `action.params` changed to `action.paramz`: exit 1, `That line is NOWHERE in packages/components/src/renderers/action/action-menu.tsx at this pin`. - Leg C, the repeater range `:125-135` changed to `:126-135`: exit 1, `That line appears 2 times in the file (:42, :125)`. - **Build, typecheck and tests**, all under the shared lock: - `pnpm --filter @objectstack/spec build`: VERDICT command-exit 0, and `git status` was clean afterwards. - `pnpm --filter @objectstack/spec typecheck`: VERDICT command-exit 0. `check:scripts-typecheck` compiles the edited script (`--listFilesOnly`: 1 hit). - `pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2`: VERDICT command-exit 0, `Test Files 619 passed (619)`, `Tests 18485 passed | 1 todo`. No test names the edited gate script (`git grep`: 0 hits). Its own `--self-test`, including the live round-trip, runs inside the gate. - **Derived gate families.** `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` was run with no paths at `afe6f9df` and derived 82 commands, the same list as at `10006d5d`. - All 82 were run, with exit codes captured before any pipe. 81 exited 0. `pnpm check:dual-build-cjs-loads` exited 3 (PREREQUISITE NOT MET: about 77 workspace packages unbuilt), so it is NOT MEASURED. - That narrowing is declared. This diff moves no emitted JS: the new docblock text has 0 hits in `packages/spec/dist` JS and 2 in `.d.ts`, against a positive control of 14 JS hits for a `.describe()` string. CI runs the gate. - `--ran` reconciliation: `82 derived, 81 run, 1 NOT-MEASURED, 0 UNRUN`, exit 0. - `check:doc-formula-expressions`, `check:lean-entry-closure`, `check:dts-closure` and `check:exported-any` first refused their prerequisites while a build was in flight. They exited 0 on the final pass, after `pnpm turbo run build` of formula, lint and objectql (14 tasks, VERDICT command-exit 0) and the spec rebuild. - The `check:pm-dispatch-gates` battery (exit 0, `1976 cases pass`) ran at `10006d5d`. The later commit changes six comment lines in the two spec files and nothing the battery reads. - **Lint, as a proven narrowing.** `pnpm lint` (`eslint . --no-inline-config`) is CI's run. Here: - Population: the two touched TypeScript files. - Count: `npx eslint --no-inline-config --format json` on them reads 2 files, 0 errors, 0 warnings, neither ignored. - Invariance: `eslint.config.mjs` never enables type-aware linting (no `parserOptions.project`, stated at its lines 326-328), so this diff cannot move the verdict on an untouched file. ## Acceptance notes (noted, not filed) - **The historical `[#21464]` member docblock** (pin `2e818d0b51ec`) stays dated and unquoted. Its `[#21855]` paragraph, which called `0abd4f9f8` the current pin, was corrected in place in `00c6b980` (see What changed). - **`data-list.tsx:99-105` is spelled as a full anchor.** It used to be the bare `:82`. A bare continuation there would read as `previews/block-config.ts`. The new full anchor carries no quote, so the worklist count rises from 418 to 419. - **The repeater quote is not unique in its file** (H3, as stage 1's review judged acceptable). - **Stage 1's changeset** (`.changeset/20471-component-row-anchor-quotes.md`, not yet released) says the other three rows "carry no quote yet". This PR adds its own changeset rather than editing that one. --- _Generated by [Claude Code](https://claude.ai/code/session_01GV6oYwgc1kWiUCb1YaprQ7)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent b220e09 commit 9a0401f

3 files changed

Lines changed: 101 additions & 55 deletions

File tree

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
The `action:group`, `action:menu` and `element:repeater` read-point records are re-measured at the objectui pin and quote the line they cite
6+
7+
Clause-②: no
8+
9+
The docblocks of `action:group`, `action:menu` and `element:repeater` in `src/ui/component.zod.ts`
10+
cited objectui lines that had moved without any gate noticing: the two containers' anchors by 3 to 8
11+
lines since objectui#11638, every repeater anchor by 28 lines since objectui#11168 slice 2, and the
12+
repeater's `data-objectstack` filter and sort anchors since earlier pins. Each is now re-pointed at
13+
the pin this package builds against (`a58626c88`), as are `action:button`'s `static-params.ts`
14+
citation and the `element:definition-list` registration notes, which said the registration
15+
publishes the strings `'1'` / `'2'` and marks `items` required (it no longer does either). Each of
16+
the three rows now quotes the first line of its props-read site (the member forward of the two
17+
containers, the `readProps` call of the repeater), so a pin bump that moves or changes one of those
18+
lines fails `check:objectui-pin-citations`. All six rows of that section now carry a quote. Comment
19+
text only: no schema, key, type or export changes.

‎packages/spec/scripts/check-objectui-pin-citations.ts‎

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -815,13 +815,16 @@ export function verifyAssertion(
815815
* `forwarded: ActionDef` literal of `action:button` and of `action:icon`, where
816816
* the keys each row forwards to the runner are enumerated, and the `readProps`
817817
* call of `element:definition-list`, whose type literal is that row's key set.
818-
* The section's other three rows (`action:group`, `action:menu`,
819-
* `element:repeater`) carry none yet: their cited lines do not hold at that
820-
* pin, and a quote goes only beside a line that does. 418 objectui anchors in
821-
* `packages/spec/src` still carry none, read against objectui `a58626c88` —
822-
* `--verify-anchors` prints that worklist.
818+
*
819+
* The next three are the same section's other three rows, quoted once their
820+
* records were re-measured at pin `a58626c88` (their cited lines had moved
821+
* without any hop note recording it): the member forward of
822+
* `action:group` and of `action:menu`, where the keys a member forwards to the
823+
* runner are enumerated, and the `readProps` call of `element:repeater`. 419
824+
* objectui anchors in `packages/spec/src` still carry none, read against
825+
* objectui `a58626c88` — `--verify-anchors` prints that worklist.
823826
*/
824-
const ASSERTED_ANCHOR_FLOOR = 10;
827+
const ASSERTED_ANCHOR_FLOOR = 13;
825828

826829
// ---------------------------------------------------------------------------
827830
// self-test — the shapes, not the corpus

‎packages/spec/src/ui/component.zod.ts‎

Lines changed: 73 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3212,9 +3212,23 @@ export const ElementTextInputPropsSchema = lazySchema(() => strictObject({
32123212
* (+11/-18) changed for objectui#11638, which retires the two containers' read
32133213
* of a member's `properties.params` (`readMemberStaticParamValues`, deleted
32143214
* from `static-params.ts` with both calls) and the `useConfigBagEvaluator()`
3215-
* call that served it, so the `objectName` forward each makes MOVED with its
3216-
* line byte-identical, `381` -> `373` and `327` -> `320`, and is cited below at
3217-
* this pin.
3215+
* call that served it, so every container anchor below that call MOVED: by 3
3216+
* down to the member forward, and from the forward on by 8 in
3217+
* `action-group.tsx` and by 7 in `action-menu.tsx` (the `objectName` forward
3218+
* `381` -> `373` and `327` -> `320`), each cited line byte-identical except the
3219+
* forward's `params` construction, which objectui#11638 rewrote. `static-params.ts`
3220+
* gained 7 lines above `readStaticParamValues`, and
3221+
* `data-objectstack/src/index.ts` changed only below both of its cited lines.
3222+
* Each moved anchor is cited below at this pin.
3223+
* A correction, measured at this pin: anchors in three cited files had moved
3224+
* under the hop notes below, which recorded them as held or re-read.
3225+
* `basic/data-list.tsx` changed at `31971ff1e` (objectui#11168 slice 2 rewrote
3226+
* both list registrations), which that hop's note omits, so every
3227+
* `element:repeater` anchor has cited a line 28 above its read point since.
3228+
* `previews/block-config.ts` changed at the same hop (+13 above the cited
3229+
* `columns` control). In `data-objectstack/src/index.ts` the
3230+
* `translateFilterArray` arm has moved since `db11afd49` and `serializeOrderBy`
3231+
* since `e420df310`. Each is cited below at this pin.
32183232
* At `0abd4f9f8`, re-read there 2026-10-05:
32193233
* every objectui file this record cites is byte-identical across the hop from
32203234
* `9dfaca654` (`git diff --quiet`), so every anchor held unmoved.
@@ -3413,7 +3427,7 @@ const ACTION_NODE_GUIDANCE = {
34133427
* against the row the host binds (`usePredicateRecordContext`).
34143428
* - `params` — `:180-183`. An array is the input list, forwarded as
34153429
* `actionParams`; the static values are read off `properties.params`
3416-
* itself (`readStaticParamValues`, `static-params.ts:91-101`). On a page
3430+
* itself (`readStaticParamValues`, `static-params.ts:98-108`). On a page
34173431
* node the two are one key: this row IS `properties`, and `SchemaRenderer`'s
34183432
* hoist makes `schema.params` the same object, so an array here is the input
34193433
* list and an object is the static values. (A node-level object `params`
@@ -3682,11 +3696,11 @@ export type ActionIconPropsParsed = z.infer<typeof ActionIconPropsSchema>;
36823696
*
36833697
* [#21855] The rows' value ratchet for this one member, with its own
36843698
* inventory. A member's `params` is its `ActionParam[]` input list: both
3685-
* containers forward an array as `actionParams` (group `:330-335`, menu
3686-
* `:265-270`; the renderer directory is byte-identical at the current
3687-
* `.objectui-sha` pin `0abd4f9f8` and at objectui `main` `f1a177c41`). Any
3699+
* containers forward an array as `actionParams` (group `:325-327`, menu
3700+
* `:261-263`, re-read at the pin this repo builds against, `.objectui-sha` =
3701+
* `a58626c88`). Any
36883702
* other value goes through `readActionEntryParamValues`
3689-
* (`static-params.ts:172-182`), which returns it unchanged for a `type: 'api'`
3703+
* (`static-params.ts:164-174`), which returns it unchanged for a `type: 'api'`
36903704
* member — the inline-action payload window (#5777), as the request payload
36913705
* until 18 — and for every other `type`, an absent one included, returns
36923706
* nothing (with a development-build warning only). So an object `params` on a
@@ -3865,34 +3879,37 @@ const actionMenuMember = () => (actionMenuMemberOnce ??= buildActionMenuMember()
38653879
* (`components/src/renderers/action/action-group.tsx` at the pin). Read
38663880
* points, per key:
38673881
*
3868-
* - `actions` — `:303`, then filtered by `location` through `actionRendersAt`
3869-
* (`:304`); members are read at `:114-171` (inline), `:205-243` (dropdown),
3882+
* - `actions` — `:300`, then filtered by `location` through `actionRendersAt`
3883+
* (`:301`); members are read at `:114-171` (inline), `:205-243` (dropdown),
38703884
* both through the shared `useMemberVisible` for `visible` (`:81-86`), and
3871-
* forwarded at `:329-382` (static values `:329-335`, `objectName`
3872-
* `:381`; the member's `outcomeMessages` too since objectui#11344).
3873-
* - `display` — `:404`, `inline` unless it is `dropdown`.
3874-
* - `label` / `icon` — `:424` / `:408`: the DROPDOWN trigger's text (default
3885+
* forwarded at `action-group.tsx:325-374` first line
3886+
* `const paramsPayload: ActionDef = Array.isArray(action.params)` (`params`
3887+
* `:325-327`, no longer joined by the member's own `properties.params`
3888+
* since objectui#11638; `objectName` `:373`; the member's
3889+
* `outcomeMessages` too since objectui#11344).
3890+
* - `display` — `:396`, `inline` unless it is `dropdown`.
3891+
* - `label` / `icon` — `:416` / `:400`: the DROPDOWN trigger's text (default
38753892
* `Actions`) and icon. Inline mode renders neither.
3876-
* - `variant` — `:414` (dropdown trigger) and `:456` (each inline member's
3893+
* - `variant` — `:406` (dropdown trigger) and `:448` (each inline member's
38773894
* fallback); no `primary` mapping at group level, so the primitive's six.
3878-
* - `size` — `:415` maps `md` → `default` for the dropdown trigger, but `:457`
3895+
* - `size` — `:407` maps `md` → `default` for the dropdown trigger, but `:449`
38793896
* hands the group size to each inline member raw, and `:124` maps only a
38803897
* member's OWN `md`. So `md` renders only in dropdown mode, and in the
38813898
* default inline mode reaches the Button primitive, which has no `md`.
38823899
* Declared: the primitive's four sizes. (Since objectui#11168 the
3883-
* registration publishes those same four, `:487-528`; through `db11afd49`
3900+
* registration publishes those same four, `:479-520`; through `db11afd49`
38843901
* it published `sm` / `md` / `lg`. A stored `md` is still mapped in
38853902
* dropdown mode only, which objectui records as a back-compat read.)
3886-
* - `visible` — `:290` + `:401`; `:290` fails CLOSED on a faulting predicate
3887-
* since objectui#11212. `:401` tests the raw value's truthiness, so a
3903+
* - `visible` — `:287` + `:393`; `:287` fails CLOSED on a faulting predicate
3904+
* since objectui#11212. `:393` tests the raw value's truthiness, so a
38883905
* literal `false` is honoured by `SchemaRenderer`'s node gate, which also
38893906
* evaluates the hoisted value, rather than by this check.
38903907
*
38913908
* ⚠️ New at this pin, and NOT a key of this row: objectui#11182 has the group
38923909
* consume the host's EVALUATED `disabled` verdict by name (`:274`), the one
38933910
* `SchemaRenderer`'s generic enablement gate computes from a hoisted
38943911
* `disabled` on any node, and apply it to every inline member (`:159`) or to
3895-
* the dropdown trigger (`:418`). So a `properties.disabled` on this block now
3912+
* the dropdown trigger (`:410`). So a `properties.disabled` on this block now
38963913
* greys it out at render while this strict row refuses the key at save. The
38973914
* row stays as measured from the block's own reads: declaring the key is a
38983915
* contract decision, not a pin re-measure.
@@ -3947,24 +3964,27 @@ export type ActionGroupPropsParsed = z.infer<typeof ActionGroupPropsSchema>;
39473964
* (`components/src/renderers/action/action-menu.tsx` at the pin). Read
39483965
* points, per key:
39493966
*
3950-
* - `actions` — `:342`; members are read at `:80`, `:108-147` and `:408`, run
3951-
* through `ActionAutoTrigger` (`:363-370`), and forwarded at `:264-328`
3952-
* (static values `:264-270`, `objectName` `:327`; the member's
3967+
* - `actions` — `:335`; members are read at `:80`, `:108-147` and `:401`, run
3968+
* through `ActionAutoTrigger` (`:356-363`), and forwarded at
3969+
* `action-menu.tsx:261-321` first line
3970+
* `const paramsPayload: ActionDef = Array.isArray(action.params)` (`params`
3971+
* `:261-263`, no longer joined by the member's own `properties.params`
3972+
* since objectui#11638; `objectName` `:320`; the member's
39533973
* `outcomeMessages` too since objectui#11344).
3954-
* - `label` — `:389` (`aria-label`, default: the translated "More actions")
3955-
* and `:398-399` (trigger text; icon-only when omitted).
3956-
* - `icon` — `:240`, default the `MoreHorizontal` glyph.
3957-
* - `variant` / `size` — `:241` / `:242`, handed to the Button primitive
3974+
* - `label` — `:382` (`aria-label`, default: the translated "More actions")
3975+
* and `:391-392` (trigger text; icon-only when omitted).
3976+
* - `icon` — `:237`, default the `MoreHorizontal` glyph.
3977+
* - `variant` / `size` — `:238` / `:239`, handed to the Button primitive
39583978
* unmapped (defaults `ghost` / `icon`): no `primary`, no `md` here.
3959-
* - `visible` — `:235` + `:336`, fail-closed; the same truthiness note as
3979+
* - `visible` — `:232` + `:329`, fail-closed; the same truthiness note as
39603980
* `action:group`'s applies to a literal `false`.
39613981
*
3962-
* The registration's `inputs` (`:435-463`) publish `label`, `icon`,
3982+
* The registration's `inputs` (`:428-456`) publish `label`, `icon`,
39633983
* `actions`, `variant`, `size`, `visible` and `className` since objectui#11168
39643984
* slice 1, every key this row declares; through `db11afd49` (`:410-419`
39653985
* there) `size` and `visible` were read and unpublished. ⚠️ As on
39663986
* `action:group`, objectui#11182 has the trigger consume the host's evaluated
3967-
* `disabled` verdict (`:219`, `:388`) — at `db11afd49` it already reached the
3987+
* `disabled` verdict (`:219`, `:381`) — at `db11afd49` it already reached the
39683988
* trigger through the `...rest` spread — so a `properties.disabled` here greys
39693989
* the trigger out while this row refuses it; recorded, not declared.
39703990
*/
@@ -4007,12 +4027,13 @@ export type ActionMenuPropsParsed = z.infer<typeof ActionMenuPropsSchema>;
40074027
* - `columns` is compared as the NUMBER `2` (`props.columns === 2`); any other
40084028
* value renders one column. Declared as the literal pair `1 | 2`, which is
40094029
* what the Studio designer writes (a `number` control,
4010-
* `previews/block-config.ts:307`). The registration's enum publishes the
4011-
* STRINGS `'1'` / `'2'` (`:82`), and the string `'2'` renders one column —
4012-
* the read wins.
4030+
* `previews/block-config.ts:320`). The registration's enum published the
4031+
* STRINGS `'1'` / `'2'` until objectui#11168 slice 2, and the string `'2'`
4032+
* renders one column; it now publishes the numbers `1` and `2`
4033+
* (`data-list.tsx:99-105`), as this row declares.
40134034
* - `items` is optional, as it is read: absent and empty both render the
4014-
* renderer's own "No details" state (`:51-53`). The registration marks it
4015-
* required.
4035+
* renderer's own "No details" state (`:51-53`). The registration marked it
4036+
* required until objectui#11168 slice 2, and no longer does (`:91-97`).
40164037
* - An item is strict. `term` is required — it is the row's only label, placed
40174038
* as a React child, so a literal string — and `description` takes any value
40184039
* (`toText` prints objects as JSON and an absent one as an em dash). The
@@ -4038,9 +4059,9 @@ export const ElementDefinitionListPropsSchema = lazySchema(() => strictObject({
40384059
})).optional()
40394060
.describe('Term/description pairs, in order. Omitted or empty renders the "No details" empty state'),
40404061
columns: z.literal([1, 2], {
4041-
// The registration's own enum spells these as strings, so the string is
4042-
// the likeliest wrong value — and the one the renderer silently collapses
4043-
// to a single column.
4062+
// The registration's own enum spelled these as strings until objectui#11168
4063+
// slice 2, so the string is the likeliest wrong value — and the one the
4064+
// renderer silently collapses to a single column.
40444065
error: (issue) => (issue.input === '1' || issue.input === '2'
40454066
? `\`columns\` on this \`element:definition-list\` takes the NUMBER \`${String(issue.input)}\`, not `
40464067
+ `the string '${String(issue.input)}' — the renderer compares it to the number 2, so the string `
@@ -4061,32 +4082,35 @@ export type ElementDefinitionListProps = z.input<typeof ElementDefinitionListPro
40614082
/**
40624083
* `element:repeater` — a data-bound, chrome-free list: one line per record
40634084
* (`components/src/renderers/basic/data-list.tsx` at the pin, props through
4064-
* `readProps`, `:97-107`). Read points: `object` (`:143`, `:155`), `filter`
4065-
* (`:120`, `:152` → `$filter`), `sort` (`:153` → `$orderby`), `limit` (`:154` →
4066-
* `$top`), `emptyText` (`:181`), `divided` (`:186`), `titleField`
4067-
* (`:191-192`) and `fields` (`:128`, `:194-196`).
4085+
* `readProps`, `data-list.tsx:125-135` first line `const props = readProps<{`).
4086+
* Read points: `object` (`:171`, `:183`), `filter`
4087+
* (`:148`, `:180` → `$filter`), `sort` (`:181` → `$orderby`), `limit` (`:182` →
4088+
* `$top`), `emptyText` (`:209`), `divided` (`:214`), `titleField`
4089+
* (`:219-220`) and `fields` (`:156`, `:222-224`).
40684090
*
40694091
* - `object` is REQUIRED, as `element:number`'s is: without it the renderer
4070-
* never queries and shows its "No records" state (`:143-146`, `:181`) —
4092+
* never queries and shows its "No records" state (`:171-174`, `:209`) —
40714093
* indistinguishable from an object that really has no rows. The
40724094
* registration marks it required too.
40734095
* - `filter` / `sort` are the family's one orthography from birth —
40744096
* `ViewFilterRule[]` and `SortItem[]` — and both are delivered:
40754097
* `ObjectStackAdapter.find` lowers a `{ field, operator, value }` array
40764098
* through `translateFilterArray` and serializes `{ field, order }` items
4077-
* through `serializeOrderBy` (`data-objectstack/src/index.ts:4782-4793`,
4078-
* `:760-786`). Before the query the renderer resolves the rules' context
4099+
* through `serializeOrderBy` (`data-objectstack/src/index.ts:5000-5011`,
4100+
* `:868-894`). Before the query the renderer resolves the rules' context
40794101
* tokens (`{current_user_id}`, the date macros) through `useResolvedFilter`
4080-
* (`data-list.tsx:119-120`), so a rule's string `value` may be one. The
4102+
* (`data-list.tsx:147-148`), so a rule's string `value` may be one. The
40814103
* rule-array door here is the bare one `record:related_list` declares, not a
40824104
* `ruleArrayFilterError` door: that prescription speaks to a door that used
40834105
* to take the record form, and a door wired to it joins the stored-row
40844106
* conversion's reach (`conversions/registry.ts`), which is not this row's to
40854107
* change.
40864108
* - `fields` takes a bare field name or `{ field }`. The renderer reads only
4087-
* `field` off the object form (`:196`) — the `label` its TS type and its
4088-
* registration's description both advertise is never rendered (the list has
4089-
* no header row), so it is refused with that reason.
4109+
* `field` off the object form (`:224`) — a `label` is never rendered (the
4110+
* list has no header row), so it is refused with that reason. Its TS type
4111+
* and its registration's description advertised that `label` until
4112+
* objectui#11168 slice 2; both now name `field` alone (`:115-122`,
4113+
* `:245-249`).
40904114
*
40914115
* NOT read at the pin, whatever a sibling might suggest: the node-level
40924116
* `dataSource` binding. This renderer is not wrapped in objectui's

0 commit comments

Comments
 (0)