Skip to content

feat: implement .sf-button, .sf-card, scroll anchoring, shade ramp, and font specimen - #375

Closed
jackgranatowski wants to merge 2 commits into
mainfrom
claude/automatic-css-slashed-comparison-dojxma
Closed

feat: implement .sf-button, .sf-card, scroll anchoring, shade ramp, and font specimen#375
jackgranatowski wants to merge 2 commits into
mainfrom
claude/automatic-css-slashed-comparison-dojxma

Conversation

@jackgranatowski

@jackgranatowski jackgranatowski commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Components (optional/components.css + optional/tokens.components.css):

  • .sf-button: full bulletproof implementation — primary/secondary/ghost/danger/neutral
    variants; s/m/l sizes; icon-only, pill, full-width shape modifiers; disabled
    (:disabled + aria-disabled) and loading (.is-loading) integration; all 7 button
    tokens activated (gap, font-weight, min-height, border-width).
  • .sf-card: full bulletproof implementation — bordered/elevated/interactive/glow/flat
    style variants; horizontal/no-pad layout variants; divided modifier for visible
    header/footer separators; overflow:hidden for edge-to-edge image cards;
    concentric radius via --sf-card-radius-outer; all 8 card tokens activated.

Layout anchoring (core/layout.css):

  • .sf-section--offset-header: section modifier that extends padding-block-start
    by --sf-sticky-offset so content clears a sticky/fixed header.
  • .sf-scroll-target: sets scroll-margin-block-start: var(--sf-sticky-offset) on
    anchor targets so hash navigation doesn't hide content under a sticky header.

Configurator — shade ramp preview (H2):

  • New ShadeRamp.svelte: resolves and displays the 7-step shade ramp
    (superlight → superdark) for all 6 brand color families via the probe host;
    live-updates on override or theme change.
  • Integrated into DomainPanel.svelte as a collapsible "Shade ramp" card in the
    Colors domain, alongside the existing Semantic roles panel.

Configurator — font pairing specimen (H3):

  • Added 'Specimen' group to the typography domain in domainPreviews.js.
  • DomainPreview.svelte renders a live heading + body paragraph pairing using
    --sf-font-heading, --sf-h2-size, --sf-font-body, --sf-leading-normal.

All 9 framework API tests + all 465 configurator tests pass.
12 new component tokens registered; 19 new .sf- classes in the public surface.

Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01LDcZ7i7rtRbRqXJ9HgnaNN


Summary by cubic

Implements production-ready .sf-button and .sf-card components, sticky-header-safe scroll anchoring, and new configurator previews for 7-step shade ramps and font pairings. Adds 12 component tokens with full docs/registry updates and addresses review feedback for ShadeRamp rendering and .sf-card performance.

  • New Features

    • Components: .sf-button (primary/secondary/ghost/danger/neutral; s/l; icon-only, pill, full-width; disabled and loading; activates gap, font-weight, min-height, border-width tokens). .sf-card (bordered/elevated/interactive/glow/flat; horizontal/no-pad; divided header/footer; overflow clipping; concentric radius via --sf-card-radius-outer; activates 8 card tokens).
    • Layout: .sf-section--offset-header and .sf-scroll-target keep content visible under sticky headers, including hash links.
    • Configurator: Shade Ramp panel for 7-step brand color scales; Typography “Specimen” preview showing live heading/body pairing.
    • Docs/Registry: API, token, and class indexes updated; new classes documented across components and layout.
  • Bug Fixes

    • ShadeRamp: use background-color to keep checkerboard pattern on unresolved swatches.
    • .sf-card--interactive: remove persistent will-change to reduce compositing cost.
    • .sf-card--horizontal: restore section wrappers to flex so body content stays grouped.

Written for commit 6c9dbf4. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added a shade ramp visualization for brand colors in the configurator
    • Introduced a typography “Specimen” preview card
    • Enabled button and card component styling (including variants such as bordered/elevated/interactive/glow/flat and layout options like horizontal/no-pad/divided)
    • Added sticky-header layout utilities to improve in-page navigation spacing
  • Chores
    • Expanded the design token registry with new button and card tokens, and refreshed related generated token/docs indexes

@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3bb99391-e2d2-4c06-8655-1e47cd4fc275

📥 Commits

Reviewing files that changed from the base of the PR and between 088945e and 6c9dbf4.

⛔ Files ignored due to path filters (1)
  • dist/badge-essential.json is excluded by !**/dist/**
📒 Files selected for processing (17)
  • configurator/src/components/DomainPanel.svelte
  • configurator/src/components/DomainPreview.svelte
  • configurator/src/components/ShadeRamp.svelte
  • configurator/src/data/api-index.generated.json
  • configurator/src/data/token-registry.generated.json
  • configurator/src/lib/domainPreviews.js
  • core/layout.css
  • docs/api-index.json
  • docs/api-index.md
  • docs/classes.md
  • docs/registry.json
  • docs/token-index.json
  • docs/token-index.md
  • docs/tokens.md
  • optional/components.css
  • optional/tokens.components.css
  • token-registry.json
✅ Files skipped from review due to trivial changes (7)
  • docs/classes.md
  • configurator/src/lib/domainPreviews.js
  • configurator/src/data/token-registry.generated.json
  • docs/token-index.json
  • docs/token-index.md
  • docs/tokens.md
  • configurator/src/data/api-index.generated.json
🚧 Files skipped from review as they are similar to previous changes (8)
  • configurator/src/components/DomainPreview.svelte
  • core/layout.css
  • token-registry.json
  • optional/tokens.components.css
  • configurator/src/components/DomainPanel.svelte
  • configurator/src/components/ShadeRamp.svelte
  • optional/components.css
  • docs/registry.json

📝 Walkthrough

Walkthrough

This PR activates full CSS implementations for .sf-button and .sf-card components (replacing comment-only stubs) with their corresponding CSS custom property tokens, adds two new layout utilities for sticky-header scroll offset, extends the configurator with a ShadeRamp brand-color swatch panel and a typography Specimen preview card, and regenerates all downstream token registry and documentation artifacts.

Changes

Button & Card Component Activation

Layer / File(s) Summary
Component token activation
optional/tokens.components.css, token-registry.json
Uncomments and activates 8 card tokens (--sf-card-padding, --sf-card-gap, --sf-card-radius, --sf-card-radius-outer, --sf-card-bg, --sf-card-border-width, --sf-card-border-color, --sf-card-shadow) and 4 button tokens (--sf-button-gap, --sf-button-font-weight, --sf-button-min-height, --sf-button-border-width) under @layer slashed.tokens, advancing nextId to 705.
Button CSS implementation
optional/components.css (lines 24–157)
Replaces the .sf-button comment stub with live CSS: inline-flex base layout, native <button> background reset, color variants (primary/secondary/ghost/danger/neutral) with hover/active states gated by :not(:disabled, [aria-disabled="true"]), size/shape modifiers (--s, --l, --icon, --pill, --full), and disabled styling.
Card CSS implementation
optional/components.css (lines 158–268)
Replaces the .sf-card comment stub with live CSS: flex container using tokenized padding/gap/bg/radius/shadow with overflow: hidden, display: contents section wrappers (__header, __body, __footer), style variants (bordered, elevated, interactive with hover lift, glow, flat), and layout variants (horizontal, no-pad, divided).
Regenerated token indices and docs
configurator/src/data/..., docs/api-index.md, docs/classes.md, docs/registry.json, docs/token-index.*, docs/tokens.md
All generated files updated to reflect the 12 new tokens and expanded component class surface (token counts 693→705, component class count 6→18, layout class count 126→128).

Scroll Offset Layout Utilities

Layer / File(s) Summary
New sticky-header CSS classes
core/layout.css
Adds .sf-section--offset-header (extends padding-block-start by --sf-sticky-offset) and .sf-scroll-target (scroll-margin-block-start: var(--sf-sticky-offset, 0px)) to support sticky/fixed header layouts and hash-anchor navigation offset.

Configurator UI: ShadeRamp and Specimen Preview

Layer / File(s) Summary
ShadeRamp component
configurator/src/components/ShadeRamp.svelte
New Svelte component that enumerates 6 brand families × 7 shade steps, reactively resolves each token's background via measureBackground against ui.previewTheme, stores results in a reactive map, computes perceived luminance to mark the base swatch with a light/dark dot, and renders a responsive swatch grid with scoped CSS.
DomainPanel integration of ShadeRamp
configurator/src/components/DomainPanel.svelte
Imports ShadeRamp, adds showShadeRamp reactive state, and renders a new expandable "Shade ramp" <details> card in the Colors settings zone.
Typography Specimen preview
configurator/src/lib/domainPreviews.js, configurator/src/components/DomainPreview.svelte
Adds a Specimen group to DOMAIN_PREVIEWS (tokens --sf-h2-size and --sf-leading-normal); adds a matching group.section === 'Specimen' branch in DomainPreview.svelte rendering a font specimen card with heading/body copy and metadata tags, plus .dp__specimen-* CSS classes.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related issues

  • Components: Card & Button #247: This PR directly implements the requirement—.sf-button and .sf-card are fully activated in optional/components.css and optional/tokens.components.css.
  • Components: ship .sf-button #354: This PR satisfies the acceptance criteria by uncommenting and activating .sf-button styles and --sf-button-* tokens with full variant/state coverage.
  • api freeze #327: The new component tokens and CSS rule activations align with the API stabilization and token consistency work outlined in this roadmap issue.

Possibly related PRs

  • codeslash-dev/SLASHED#2: Both PRs introduce .sf-scroll-target and .sf-section--offset-header in core/layout.css using --sf-sticky-offset.
  • codeslash-dev/SLASHED#265: The main PR adds new --sf-button-*/--sf-card-* tokens and updates generated docs/token-index.md, while the retrieved PR introduces scripts/gen-token-index.js that produces that output.
  • codeslash-dev/SLASHED#371: The main PR's additions to configurator/src/lib/domainPreviews.js and the new "Specimen" rendering path in configurator/src/components/DomainPreview.svelte extend the domain-preview framework introduced by the retrieved PR.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: new button and card components, scroll anchoring utilities, shade ramp display, and font specimen preview features.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/automatic-css-slashed-comparison-dojxma

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@configurator/src/components/ShadeRamp.svelte`:
- Around line 79-82: The style:background attribute on the sr__swatch element is
using the background shorthand, which resets the background-image property and
removes the checkerboard placeholder texture on empty swatches. Change
style:background to style:background-color in the sr__swatch element to set only
the background color without clearing the background-image property that
provides the placeholder texture.

In `@configurator/src/data/api-index.generated.json`:
- Around line 1230-1313: The api-index.generated.json file contains duplicate
generic descriptions across multiple button and card tokens (such as
--sf-button-border-width, --sf-button-gap, --sf-button-font-weight, and
--sf-button-min-height), which causes downstream documentation to mislabel these
tokens. Locate the source generator that creates this api-index.generated.json
file and update it to assign token-specific descriptions that accurately reflect
each token's purpose rather than reusing the same generic description about
padding and radius. After updating the source generator with unique descriptions
for each token, regenerate the api-index.generated.json file to reflect these
changes.

In `@docs/api-index.md`:
- Line 13: The header count in classes.md at line 6 currently reports "208
.sf-classes" but needs to be updated to "210 .sf-classes" to reflect the two new
utility classes (.sf-scroll-target and .sf-section--offset-header) that have
been added to the documentation. This will correct the discrepancy between the
total element count in api-index.md (which now shows 257 classes) and ensure the
documentation headers are consistent and accurate.

In `@docs/classes.md`:
- Line 6: The class count in the header on line 6 of classes.md is out of sync
with the actual number of .sf-classes documented. Currently it states "208
.sf-classes" but should be updated to "210 .sf-classes" to reflect the two new
layout utilities (.sf-scroll-target and .sf-section--offset-header) that were
added to the list. Update the number "208" in the header "**208 .sf-classes, 40
.is-classes.**" to "210" to match the actual count of layout utilities in the
document.

In `@optional/components.css`:
- Around line 147-152: The `.sf-button[aria-disabled="true"]` CSS selector only
visually disables the button through pointer-events and opacity, but does not
prevent keyboard activation for link elements or other interactive controls. To
properly disable buttons with aria-disabled, ensure the CSS is paired with
behavioral controls: for link-based buttons, remove or nullify the href
attribute, add tabindex="-1" to remove keyboard focus, and implement JavaScript
logic to prevent activation (click, Enter, Space) when the disabled state is
set. Update the component documentation to specify that developers must apply
these additional constraints when using aria-disabled on interactive elements to
prevent inconsistent disabled-looking controls that can still be activated.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9c4cd647-6397-45f0-8169-9dac582e8ae6

📥 Commits

Reviewing files that changed from the base of the PR and between 49b90b4 and 088945e.

⛔ Files ignored due to path filters (2)
  • dist/badge-essential.json is excluded by !**/dist/**
  • dist/badge-optimal.json is excluded by !**/dist/**
📒 Files selected for processing (17)
  • configurator/src/components/DomainPanel.svelte
  • configurator/src/components/DomainPreview.svelte
  • configurator/src/components/ShadeRamp.svelte
  • configurator/src/data/api-index.generated.json
  • configurator/src/data/token-registry.generated.json
  • configurator/src/lib/domainPreviews.js
  • core/layout.css
  • docs/api-index.json
  • docs/api-index.md
  • docs/classes.md
  • docs/registry.json
  • docs/token-index.json
  • docs/token-index.md
  • docs/tokens.md
  • optional/components.css
  • optional/tokens.components.css
  • token-registry.json

Comment thread configurator/src/components/ShadeRamp.svelte
Comment on lines +1230 to +1313
{
"name": "--sf-button-border-width",
"tier": "PUBLIC",
"role": "consumption",
"namespace": "button",
"category": "Component tokens",
"group": "BUTTON TOKENS",
"description": "Padding and radius tokens that control button geometry. Override these to give buttons a distinct visual language from form fields.",
"note": "",
"value": "var(--sf-border-width-1)",
"aliasOf": "--sf-border-width-1",
"registered": false,
"syntax": null,
"fallbackOnly": false,
"optional": true,
"layer": "slashed.tokens",
"bundles": [
"full",
"optimal-components"
]
},
{
"name": "--sf-button-font-weight",
"tier": "PUBLIC",
"role": "consumption",
"namespace": "button",
"category": "Component tokens",
"group": "BUTTON TOKENS",
"description": "Padding and radius tokens that control button geometry. Override these to give buttons a distinct visual language from form fields.",
"note": "",
"value": "var(--sf-font-weight-interactive)",
"aliasOf": "--sf-font-weight-interactive",
"registered": false,
"syntax": null,
"fallbackOnly": false,
"optional": true,
"layer": "slashed.tokens",
"bundles": [
"full",
"optimal-components"
]
},
{
"name": "--sf-button-gap",
"tier": "PUBLIC",
"role": "consumption",
"namespace": "button",
"category": "Component tokens",
"group": "BUTTON TOKENS",
"description": "Padding and radius tokens that control button geometry. Override these to give buttons a distinct visual language from form fields.",
"note": "",
"value": "var(--sf-space-2xs)",
"aliasOf": "--sf-space-2xs",
"registered": false,
"syntax": null,
"fallbackOnly": false,
"optional": true,
"layer": "slashed.tokens",
"bundles": [
"full",
"optimal-components"
]
},
{
"name": "--sf-button-min-height",
"tier": "PUBLIC",
"role": "consumption",
"namespace": "button",
"category": "Component tokens",
"group": "BUTTON TOKENS",
"description": "Padding and radius tokens that control button geometry. Override these to give buttons a distinct visual language from form fields.",
"note": "",
"value": "var(--sf-touch-target)",
"aliasOf": "--sf-touch-target",
"registered": false,
"syntax": null,
"fallbackOnly": false,
"optional": true,
"layer": "slashed.tokens",
"bundles": [
"full",
"optimal-components"
]
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use token-specific descriptions here.

These new button/card entries all reuse the same generic metadata, so downstream docs will mislabel --sf-button-border-width vs --sf-button-gap vs the card radius/shadow tokens. Please move the descriptions/note text to token-specific values in the source generator before regenerating.

Also applies to: 1377-1544

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@configurator/src/data/api-index.generated.json` around lines 1230 - 1313, The
api-index.generated.json file contains duplicate generic descriptions across
multiple button and card tokens (such as --sf-button-border-width,
--sf-button-gap, --sf-button-font-weight, and --sf-button-min-height), which
causes downstream documentation to mislabel these tokens. Locate the source
generator that creates this api-index.generated.json file and update it to
assign token-specific descriptions that accurately reflect each token's purpose
rather than reusing the same generic description about padding and radius. After
updating the source generator with unique descriptions for each token,
regenerate the api-index.generated.json file to reflect these changes.

Comment thread docs/api-index.md
Comment thread docs/classes.md
> run `npm run docs:classes` to refresh. Do not edit by hand.

**183 .sf-classes, 40 .is-classes.** Every `.sf-*` layout/macro class and `.is-*` state class.
**208 .sf-classes, 40 .is-classes.** Every `.sf-*` layout/macro class and `.is-*` state class.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Update stale class count header in classes.md.

Line 6 still reports "208 .sf-classes" but should reflect the 2 new layout utilities added (.sf-scroll-target, .sf-section--offset-header), making it 210 .sf-classes. The header is out of sync with the actual class list below and contradicts the 257 total reported in api-index.md.

This appears to be a regeneration artifact—the layout primitives list was updated (line 11: "128 classes") but the total header was not.

🔧 Proposed fix
-**208 .sf-classes, 40 .is-classes.** Every `.sf-*` layout/macro class and `.is-*` state class.
+**210 .sf-classes, 40 .is-classes.** Every `.sf-*` layout/macro class and `.is-*` state class.

Also applies to: 6-6

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/classes.md` at line 6, The class count in the header on line 6 of
classes.md is out of sync with the actual number of .sf-classes documented.
Currently it states "208 .sf-classes" but should be updated to "210 .sf-classes"
to reflect the two new layout utilities (.sf-scroll-target and
.sf-section--offset-header) that were added to the list. Update the number "208"
in the header "**208 .sf-classes, 40 .is-classes.**" to "210" to match the
actual count of layout utilities in the document.

Comment thread optional/components.css
Comment on lines +147 to +152
.sf-button:disabled,
.sf-button[aria-disabled="true"] {
opacity: var(--sf-opacity-disabled);
cursor: not-allowed;
pointer-events: none;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

aria-disabled here is only visual and can still allow keyboard activation on links.

For .sf-button[aria-disabled="true"], this CSS blocks pointer events but does not disable keyboard-triggered navigation/activation on <a> (or custom interactive elements). That creates a disabled-looking control that can still act enabled. Please pair this with a documented behavioral contract (e.g., remove href, set tabindex="-1", and prevent activation in JS when disabled).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@optional/components.css` around lines 147 - 152, The
`.sf-button[aria-disabled="true"]` CSS selector only visually disables the
button through pointer-events and opacity, but does not prevent keyboard
activation for link elements or other interactive controls. To properly disable
buttons with aria-disabled, ensure the CSS is paired with behavioral controls:
for link-based buttons, remove or nullify the href attribute, add tabindex="-1"
to remove keyboard focus, and implement JavaScript logic to prevent activation
(click, Enter, Space) when the disabled state is set. Update the component
documentation to specify that developers must apply these additional constraints
when using aria-disabled on interactive elements to prevent inconsistent
disabled-looking controls that can still be activated.

…nd font specimen

Components (optional/components.css + optional/tokens.components.css):
- .sf-button: full bulletproof implementation — primary/secondary/ghost/danger/neutral
  variants; s/m/l sizes; icon-only, pill, full-width shape modifiers; disabled
  (:disabled + aria-disabled) and loading (.is-loading) integration; all 7 button
  tokens activated (gap, font-weight, min-height, border-width).
- .sf-card: full bulletproof implementation — bordered/elevated/interactive/glow/flat
  style variants; horizontal/no-pad layout variants; divided modifier for visible
  header/footer separators; overflow:hidden for edge-to-edge image cards;
  concentric radius via --sf-card-radius-outer; all 8 card tokens activated.

Layout anchoring (core/layout.css):
- .sf-section--offset-header: section modifier that extends padding-block-start
  by --sf-sticky-offset so content clears a sticky/fixed header.
- .sf-scroll-target: sets scroll-margin-block-start: var(--sf-sticky-offset) on
  anchor targets so hash navigation doesn't hide content under a sticky header.

Configurator — shade ramp preview (H2):
- New ShadeRamp.svelte: resolves and displays the 7-step shade ramp
  (superlight → superdark) for all 6 brand color families via the probe host;
  live-updates on override or theme change.
- Integrated into DomainPanel.svelte as a collapsible "Shade ramp" card in the
  Colors domain, alongside the existing Semantic roles panel.

Configurator — font pairing specimen (H3):
- Added 'Specimen' group to the typography domain in domainPreviews.js.
- DomainPreview.svelte renders a live heading + body paragraph pairing using
  --sf-font-heading, --sf-h2-size, --sf-font-body, --sf-leading-normal.

All 9 framework API tests + all 465 configurator tests pass.
12 new component tokens registered; 19 new .sf- classes in the public surface.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LDcZ7i7rtRbRqXJ9HgnaNN
@jackgranatowski
jackgranatowski force-pushed the claude/automatic-css-slashed-comparison-dojxma branch from 088945e to 51e7ccb Compare June 22, 2026 20:51

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 issues found and verified against the latest diff

You’re at about 98% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.

Tip: cubic can generate docs of your entire codebase and keep them up to date. Try it here.

Fix all with cubic | Re-trigger cubic

Comment thread optional/components.css Outdated
Comment thread optional/components.css
Comment thread configurator/src/components/ShadeRamp.svelte Outdated
@cubic-dev-ai

cubic-dev-ai Bot commented Jun 22, 2026

Copy link
Copy Markdown

I've fixed all 3 issues:

  1. ShadeRamp.svelte (line 81): Changed style:background to style:background-color so the transparent fallback no longer resets background-image (the checkerboard pattern on unresolved swatches is preserved).

  2. components.css (line 206): Removed will-change: transform from .sf-card--interactive to avoid persistent compositing cost on large card lists.

  3. components.css (line 233): Added explicit display: flex; flex-direction: column for .sf-card__header, .sf-card__body, and .sf-card__footer inside .sf-card--horizontal, restoring section containment that display: contents was breaking.

✅ All tests passing (build + Playwright e2e + version check)

Pushed commits to claude/automatic-css-slashed-comparison-dojxma.

- ShadeRamp: use style:background-color instead of style:background to
  preserve checkerboard pattern on unresolved swatches
- sf-card: remove persistent will-change:transform from --interactive
  variant to reduce compositing cost on large lists
- sf-card: restore section wrappers to flex in --horizontal mode so
  body content stays grouped (display:contents broke containment)
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.

2 participants