Skip to content

Commit 21ef238

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/issue-9507-url-filter-op-prototype-chain
2 parents 2c974ed + 276d174 commit 21ef238

23 files changed

Lines changed: 1319 additions & 87 deletions
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
---
3+
4+
Pin the MEMBERS of `object-grid`'s four toolbar keys — `batchActions`,
5+
`pagination`, `searchableFields` and `selection` — at what `ObjectGrid` actually
6+
reads, and delete their member-pin exemptions in the same change
7+
(objectui#8071, slice 13). Each of the four is the canonical half of a
8+
canonical-vs-deprecated pair resolved in the one fold that assembles the
9+
`data-table` props, so the precedence, the presence rules and the empty-array
10+
arms are pinned rather than restated: `pagination`'s presence overrules
11+
`showPagination: false` while `selection`'s presence alone does nothing,
12+
`pageSizeOptions` replaces the built-in rows-per-page list instead of extending
13+
it, an empty `searchableFields` turns search off, and an empty `batchActions`
14+
still wins over a populated `bulkActions`. Test and ledger only; no package is
15+
released by this change.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
'@object-ui/components': patch
3+
'@object-ui/types': patch
4+
---
5+
6+
**A bare-string `trigger` now renders on every overlay block that declares one, instead of landing in the error boundary** (objectui#9710).
7+
8+
objectui#9701 repaired one instance of this. Eight sibling renderers — `alert-dialog`, `dialog`, `drawer`, `dropdown-menu`, `hover-card`, `popover`, `sheet` and `tooltip` — carried the identical shape: the authored slot handed straight to a Radix `*Trigger` with `asChild` written unconditionally. `asChild` resolves the primitive to its `Slot`, which merges onto its child through `React.Children.only`: a single React element, and nothing else. Both published faces say a bare string is legal on these keys — the TypeScript union `SchemaNode` names `string` explicitly, and the zod mirror types each `trigger` against that same union — so `trigger: 'Open it'`, the most natural thing to write for something called a trigger, validated twice and then threw, painting `Component "…" failed to render` with no diagnostic naming the key.
9+
10+
`asChild` is now conditional on Radix's own structural precondition, through one shared seam (`renderTriggerSlot`) rather than eight copies of the predicate: the rendered slot being a single React element. Where it is not — a bare string, a number, a multi-node array — the primitive renders its own element around the returned content, so a string paints as the trigger's text and stays a real trigger. An element trigger keeps the merge, asserted as a control rather than assumed.
11+
12+
**An EMPTY trigger is a separate arm, and it was never broken.** Read from the lockfile-pinned `@radix-ui/react-slot`, the throwing branch is guarded by `if (children || children === 0)`, so a `null` child is returned as-is: omitting the trigger never threw. `trigger` is `.optional()` on `dialog`, `alert-dialog`, `sheet`, `drawer` and `tooltip`, so a document that omits it is legal — and such a document renders **no trigger element at all**, exactly as before this change. The same seam carries that rule, because a `*Trigger` with no content still paints its own element, and an empty `button` is an unlabeled tab stop with nothing to read. `OMITTED_TRIGGER_PAINTS_NOTHING` in the class pin holds that arm; it reads the optional/required split from the published zod faces rather than a list.
13+
14+
⛔ **No published FACE moves — and one published FILE does.** The accept set is the one both faces already shipped, and this is the implementation catching up to it — the direction objectui#7105 ruled for node slots, which relax the renderer rather than narrow the declaration. ⛔ No type, no accept set, no export and no runtime behaviour moves in `@object-ui/types`: every changed line in `packages/types/src/overlay.ts` is a docblock line. What moves there is documentation that SHIPS. The eight `trigger` docblocks named `renderChildren(schema.trigger)` inside each Radix trigger, and the renderers now spell that read `renderTriggerSlot(XTrigger, schema.trigger)` — so the JSDoc an author's editor shows described a call that no longer exists. Those eight now name the current spelling, which the emitted `dist/overlay.d.ts` carries and the old spelling no longer appears in; and the line addresses they carried are gone, because `packages/components` moves lines, nothing re-derived those numbers, and shipped documentation should not rot with them. That correction is why `@object-ui/types` takes a patch here.
15+
16+
`context-menu` declares the same key and is deliberately unchanged: its `asChild` child is a real `div`, so the rendered slot goes inside it and `Children.only` never sees the string.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
'@object-ui/core': patch
3+
---
4+
5+
`Registry.registerLazy` now reports a bare-name collision, and `Registry.register`'s existing report is no longer blind to the other table.
6+
7+
Clause-②: no — this adds no exported symbol, no key on a published payload, and relaxes no accept set. Which registrations the registry ACCEPTS is unchanged, and so is what `skipFallback` does; only what the registry SAYS changes.
8+
9+
The registry has two doors onto one bare key: `register` writes `components`, `registerLazy` writes `lazyEntries`. `registerLazy` took the same `namespace && !skipFallback` fallback branch with no collision check at all, and `register`'s check read only its own table — so a contest that spans the two tables was reported by neither. Replaying this repository's own 425 declared registration claims against a real registry emitted zero collision warnings in every order, including for the one genuinely contested bare key.
10+
11+
Both doors now consult both tables and key on the declared full type, so a contest is reported whichever order the declarations arrive in. The ordinary stub-then-real lifecycle stays silent: a stub and the registration that satisfies it name one full type, and so do the bare keys this repository stubs twice from two files with different loader closures.
12+
13+
The two doors give different advice on purpose. `registerLazy` names `skipFallback: true`, which settles it there. `register` does not, because it clears the bare stub whether or not the fallback is taken, so that opt-out would leave the bare key resolving to nothing; it asks for the two declarations to agree on one full type instead.

0 commit comments

Comments
 (0)