Skip to content

Refresh portable blocks and align component contracts - #267

Merged
silveltman merged 60 commits into
mainfrom
chore/ui-component-consistency-20261009
Oct 9, 2026
Merged

silveltman merged 60 commits into
mainfrom
chore/ui-component-consistency-20261009

Conversation

@silveltman

@silveltman silveltman commented Oct 9, 2026 •

Copy link
Copy Markdown
Collaborator

Refresh the existing UI component contracts and complete the quality pass through all 82 portable blocks. Blocks accept plain content, templates own schema mapping and data gathering, and local block code owns button styling and composition. The matching consumer migration is https://github.com/fulldotdev/astro-template/pull/38.

  • Simplify SectionContainer to consistent width/gutters, forward native attributes, and keep local flex/grid layouts explicit. Clean up headers, footers, optional links, localized prices, reviews, responsive images and sidebar orchestration.
  • Replace duplicated marquee HTML with one Embla list and an accessible play/pause control. Respect reduced motion, keyboard focus, native scrolling and caller-hidden/disabled controls.
  • Add an opt-in rendered pnpm a11y scan with route/node diagnostics and honest manual-check results. Ordinary build/check remains browser-free. Fix dark block foregrounds, Header5 promotional-card composition and light syntax-comment contrast.
  • Preserve neutral styling and placeholders. The shadcnblocks research informed general composition principles; paid source, assets and designs are not redistributed.

This contains intentional pre-1.0 API changes: template callers must migrate the SectionContainer layout, header/footer labels and plain link/button data, price data, contact form composition and marquee controls. The changeset and migrated Astro-template provide the corresponding implementation.

Validation on render/registry head da7bf9467f3aaa22d95bf6ff1367fe1924b1d28e, against ed03f9519e9962baaff3c71e017c9e25fc7e3630: build (90 pages, 176 links), check (21 tests), independent general and boundary reviews, and exact registry validation pass. All 148 registry items and 3,864 transformed style files match their source/metadata/dependencies. The rendered accessibility scan has zero block-page failures and 28 existing unrelated documentation failures, independently matched to baseline; the full scan therefore exits nonzero.

All eight presets pass actual-template installations, strict type checks and builds with every one of the 82 blocks and exact installed file content. Independent rendered review covers all 82 blocks, 270 before/after page pairs and the final light/dark/menu/marquee deltas. CI and the deployed preview passed on that render head.

Final head 5b37bbed56a3087a09e72c08ce6ea7fd814e828e adds only the shared scanner fix excluding paused finite animations, confirmed from the companion CodeRabbit PR review. Running finite animations still settle; endless/paused animations are skipped. Independent fix-delta verification passes: paused finite animations skip immediately, running finite animations still finish, and infinite animations skip. Repeated check/scan matches the results above. Current-head CI passes and Netlify deploy 6ac91a65ca4eb50008751cb3 is verified at this exact commit. Hosted preview checks pass for mobile menu focus/Escape, Header5 composition, dark-block foregrounds and marquee motion/pause/reduced motion. Preview: https://deploy-preview-267--fulldev-ui.netlify.app/

CodeRabbit CLI: not reviewed. The full completed-PR attempt reports 1,096 eligible files against its 300-file maximum (1,097 Git changed files). No narrower review was substituted. CodeRabbit PR review: not reviewed, deliberately skipped under the user-approved replacement for its 150-file limit. The user explicitly approved replacing both CodeRabbit reviews and marking this PR ready at head 5b37bbed56a3087a09e72c08ce6ea7fd814e828e. The replacement controls are the completed independent general/boundary/visual reviews, full registry/source-output validation, eight actual-template preset installations/builds, build/check, current-head CI and verified deploy preview. The 28 pre-existing accessibility failures outside block pages remain explicit above. No unresolved introduced findings remain. The user has authorized full Dispatch: merge to main and verify the published result.

@coderabbitai ignore

Dispatch completed and independently verified: UI source merged as 942467396e22097cbd7a76c10a41a6acd12fb510, release PR268 merged as 7aef7eb1c772baf8609abfcb047dc00be4bffce6, and Astro-template PR38 merged as a523c833965391474bd1521abb94f051a3a40b66. Netlify production deploy 6ac92341592b720008bbee2f is built/published at the exact UI release commit. All 1,341 live registry JSON files match the release; affected menus, marquee and readability pass independent browser checks. fulldev-ui@0.20.0 is npm latest and its standard tarball URL is accessible; published SHA512/SHA1 integrity and all 1,341 registry plus 468 source files match the release. Template merged tree equals the reviewed source, required PR CI passed, and six NL/EN page/navigation checks pass; the template has no separate main-CI or hosted deployment configured. The 28 existing unrelated UI documentation accessibility failures remain recorded above.

silveltman and others added 28 commits October 9, 2026 14:19
Omit presence flags when false in dropdown menu items and labels, serialize
a null dropdown defaultValue as an empty attribute, scope carousel parts to
their own root, sync theme toggles after page loads, forward Layout lang and
type Video props as iframe attributes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mark Banner container, Logo, LogoText, Marquee, Price, PriceValue,
PriceUnit, Rating, Video and Icon with data-slot. Banner, Header and
Section default their variant so data-variant reflects the cva default,
PriceValue exposes its variant on the root, and Carousel controls emit
their resolved data-variant and data-size like Button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…markers in UI components

Typography and TOC wrappers use logical inline directions, NavigationMenuLink
sets aria-current from active, Item and Logo pick a link from href presence,
ToastAction exposes its variant and size, Video and the newly marked roots
let callers override title and data-slot, and ThemeToggle accepts disabled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Doc1 marks its page-copy button with data-doc-copy and its content with
data-doc-content, so code-block decoration and copy delegation no longer
depend on the docs-copy-page ID prefix or touch unrelated Typography.
Doc1 and Blocks1 accept native div attributes on the outer container and
group their open-in links in DropdownMenuGroup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Header1, Header2 and Header3 accept navigation active and pass it to
NavigationMenuLink, and all five headers set aria-current on the
matching mobile SheetClose links.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sidebar1 takes an optional githubStars number and formats it, keeping
the Stars fallback, so the block no longer fetches during render.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocks keep their index, featured and position based styles and map
button data explicitly, so caller data can no longer override them.
The docs callout button becomes a plain link in the global schema.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Badges, headings, descriptions, social proof, feature lists, button
rows and item labels that belong to each block's design are now
required and render directly. Article badges and the Features2/5 and
Services2/5 button rows had no caller and are removed. CTA1 social
proof and FAQ1 buttons stay optional because real callers omit them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Header menus, footer navigation, pricing, service links, ratings,
carousel arrows, doc code copy, the assistant prompt and Sidebar1
labels no longer fall back to English in block code. Headers render
their own sheet close so its label comes from props, and placeholder
images default to an empty alt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Articles1-4 and Services7 no longer fall back to href="#"; a card
without an href renders as a div with the same styling, and Services7
shows its link row only for linked cards. Optional service links check
for a missing href instead of a falsy one. Also restores the Articles2
Badge import that the category badge still needs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Article and Articles items without a badge, Features2/5 and Services5
without a button row drop those dependencies. Headers import the close
icon directly and list @lucide/astro.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BannerContainer gains optional closeLabel and Sidebar optional
mobileTitle/mobileDescription, defaulting to the previous text. Banner1
requires closeLabel and takes an optional storageKey; Banner2 drops its
unused key. Banner1 separator is a middle dot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Astro emits a native element's hardcoded attribute and a spread attribute
of the same name both, and the browser keeps the first, so a caller's
aria-label (such as Sidebar1 labels.breadcrumb) never applied.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reviews3 takes required labels {previous, next, carousel, slide}.
Carousel and CarouselItem render a caller's aria-roledescription once,
defaulting to "carousel" and "slide", since Astro emits both a native
hardcoded attribute and a same-named spread attribute.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@netlify

netlify Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for fulldev-ui ready!

Name Link
🔨 Latest commit 5b37bbe
🔍 Latest deploy log https://app.netlify.com/projects/fulldev-ui/deploys/6ac91a65ca4eb50008751cb3
😎 Deploy Preview https://deploy-preview-267--fulldev-ui.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
silveltman and others added 26 commits October 9, 2026 17:37
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… images

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…te the changeset

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…xactly

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A disabled or aria-disabled toggle no longer counts as a pause control, so the marquee stays static. The fallback tab stop is only managed when the caller set no tabindex, and disabled, hidden, inert or tabindex=-1 content no longer counts as reachable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
github-light-default comments (#6E7781) measure 4.32:1 on the code background. Every token of the high-contrast theme clears 4.5:1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Button transitions were sometimes still running when axe measured colors, so it reported in-between colors as contrast failures. The wait is bounded to 5 seconds and skips endless animations.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A toggle disabled through its fieldset, or with a hidden or display:none parent, no longer counts as a pause control. Rows also stop when a toggle is later disabled, made inert, or hidden at a breakpoint, and start again with the user's pause kept when it becomes usable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The marquee now shows and hides its toggle through a private display:contents wrapper, so the button's hidden attribute, class and style stay the caller's and count when deciding whether the toggle can be seen. Instead of a document-wide observer, it watches class, style, hidden, disabled, aria-disabled and inert on each toggle and its ancestors, and the sizes of the toggle's path inside the marquee, so a toggle hidden at a breakpoint stops motion even when the row keeps its width.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
These sections switch to the dark theme variables but inherited the page's text color, so the Hero4 and Hero9 checklists and the CTA4 outline link were dark on dark under a light page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
NavigationMenuLink lays out in a row, so the promotional card put its label and description beside the full-width image, over the link column.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A paused finite animation never finishes, so it held the scan for the full 5s and failed it. Running finite animations are still awaited, endless ones still skipped, and the timeout is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@silveltman
silveltman marked this pull request as ready for review October 9, 2026 17:02
@silveltman
silveltman merged commit 9424673 into main Oct 9, 2026
7 checks passed
@silveltman
silveltman deleted the chore/ui-component-consistency-20261009 branch October 9, 2026 17:16
@fulldev-release fulldev-release Bot mentioned this pull request Oct 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant