Repository navigation
fix: review follow-ups for #228 and #259, plus the actions-runtime prototype lookup (#261) - #263
Merged
Merged
Conversation
…finding 1) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…synthetic click (review of #228, finding 3) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…op dead class (review of #228, finding 4) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
… custom mode (review of #228, finding 5) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…ons (review of #228, finding 6) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…(review of #228, finding 7) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…eave (review of #228, finding 8) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…ding 9) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
… own edit (review of #259, finding 1) The form's input listener pushes the raw text through valueChanges before the mask re-formats it; re-masking there threw the caret to the end. A capture-phase flag tells a user edit from a programmatic write. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…nt (review of #259, finding 2) ui-accordion-trigger sits between the row and its h3, so [&>h3] never matched. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…label an input (review of #259, finding 3) A touch laptop has a fine primary pointer, so (pointer: coarse) hid the only touch drag affordance. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…nel (review of #259, finding 4) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…eview of #259, finding 5) Focus goes to the trigger, the panel closes and the browser's Tab walks on from the trigger, in both the projected and the options-driven panel. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…filled (review of #259, finding 6) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…lass can override it (review of #259, finding 8) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…led one (review of #259, finding 9) Stillness only counts as arrival after a seen movement or a bounded start grace; the SETTLE caps still bound the scroll-spy suppression. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…s the code does (review of #259, finding 10) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokCTX5ussLb7WYcDLug
…entries (#261) Invariant: a key taken from content resolves only to an entry the app or library registered itself, never an inherited Object.prototype name. actions-runtime now uses Object.hasOwn; the pasted <font size> lookup is a Map. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokEbJxTcCyzsoYgCSQg
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokEbJxTcCyzsoYgCSQg
…us/next stylesheets The #228 review fix moved the custom-mode previous/next sizing into two density stylesheets; pagination is in the data-table closure, so it gained two files (the set-equality assertion in the same spec already held; only the hard-coded count was stale). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6YokEbJxTcCyzsoYgCSQg
✅ Deploy Preview for shadcn-angular-demo ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this is
Two independent code reviews of PRs that were merged without one (#228 and #259) found real defects in our own fixes, and the gil-elements agent filed one more (#261). Every finding was a hypothesis from reading code: each was validated (in real Chromium where it concerned layout, focus, caret or key handling) before changing anything. Three branches, one commit per finding, merged here.
Fixes #261.
Review of #259 (10 findings: 8 real and fixed, 1 judged no change, 1 doc-only)
valueChangessubscription (format the initial value) also ran on every keystroke beforehandleInput, so the form's echo reformatted the text and threw the caret to the end whenever you typed mid-string. A capture-phaseuserEditingflag now keepsformatModelValueto programmatic writes.(pointer: coarse), but touch drag now requires the grip, so a touch laptop (fine primary pointer, coarse secondary) lost touch reordering. It shows under(any-pointer: coarse), and its label is a newdragHandleLabelinput (default "Drag to reorder") instead of hard-coded English.onPanelKeyhijacked ArrowUp/Down/Home/End for any target in a panel, including an<input>; it now leaves keys to anything that is not a panel link.preventDefaults and re-focuses the trigger (that cost a second Tab); focus returns to the trigger first, the panel closes without committing (like the data-driven path), and the same Tab leaves the select. The options-driven path (restoreFocusFromPanel) matches.['a','b'] -> [] -> ['c']froze); it restarts when the list becomes non-empty and clears the text when emptied.class="pointer-events-auto"; it is a host class now (consumer class last), same default.[&>h3]never matched through thedisplay: contentsaccordion trigger; it is[&_h3]now (the test env has no Tailwind, so there is no committed geometry test for this one).resolveLocalereturns a custom object as-is), so the type check is the guard; a per-key fallback is a library-wide decision.Review of #228 (9 findings: 7 real and fixed, 2 not applicable)
selectTab(via a newdata-value) instead of a syntheticclick(), so a held arrow no longer fires consumer click handlers.translate-x-0conditional is gone,round()is behind@supportswith a valid fallback (the Tailwind v4 baseline is Chrome 111,round()needs 125), and the thumb isheight: 100%; aspect-ratio: 1instead of a hard-coded 4px, so a consumer border class cannot mis-size it.h-9 px-4 py-2while simple mode scaled with density; two density stylesheets now drive them (identical at density 1 by arithmetic, no screenshots), and the deaddata-sizeattributes on the simple-mode buttons are removed.:last-childgave the real last item padding when a trailing non-item sat after it; it is:last-of-typenow (a trailing sibling with the same tag as an item would still count: a gap on the container would be sturdier but changes the spacing contract).nextStep()keeps bypassingcanNavigateTo(widening the gate would make the next step's trigger clickable in linear mode), and the docs now say so.focusRangeInputuses aviewChild; touch focus stays (a range input opens no virtual keyboard).dir).#261 (RTE actions runtime)
options.handlers[event.actionId]walked the prototype chain, and the id comes from untrusted rendered HTML (ID_PATTERNaccepts__proto__,constructor, ...):__proto__and__defineGetter__threw before the'*'catch-all ran, andtoString/valueOf/constructor/hasOwnPropertywere called with the click event. Handlers are looked up withObject.hasOwn(a handler the app registers astoStringstill works), tested for click and hover over six names. The class audit found one more instance: the paste normalizer'ssizeMap[size]turned<font size="constructor">intofont-size: function Object()...; it is aMapnow. Other lookups in the editor tree were checked and are safe (uppercase DOM names, gated by a Set, or app-supplied keys).Verification
npm run sonar:gateone543bd1e: coverage current on both legs (12,345 browser + 2,059 CLI tests), scanned revision equals HEAD, quality gate OK, 0 new issues, new coverage 92.4%. This is the first time the three branches ran together.any-pointermedia query have no committed test (the test env has no Tailwind and Chromium emulation flips both pointer features together).Release consequences
rich-text-editor, so@gilav21/shadcn-angular-rteneedsnpm run release:package -- rte <level>(manual, 2FA) for package users to get them.set-densitychange already shipped in fix: modal density, stepper connectors, popover offset, menu separators (#229, #230, #232, #233) #231). Component baselines were not regenerated.Behaviour the gil-elements port should mirror
Select Tab (no preventDefault, close without commit, same Tab leaves); bento grip under
(any-pointer: coarse)plus thedragHandleLabelinput; nav-menu panel keys ignore non-link targets; typing-animation restarts when the list refills; particles click-through via a host class a consumer class can override; emoji settle needs observed movement; tabs ignore modified keys and select via the component, not a click; switch thumb sizing; pagination custom-mode sizing via density; timeline:last-of-type; actions lookup by own property and a Map for pasted font sizes.🤖 Generated with Claude Code
https://claude.ai/code/session_01H6YokEbJxTcCyzsoYgCSQg