Type: components layer · Tier: v1.0 core
Summary
Ship the first real component, .sf-button, in @layer slashed.components. The name and token block are already reserved; this uncomments and completes the implementation.
Why
.sf-button + .sf-card are the highest-use components and have the most stable tokens — the natural first batch toward 1.0.
Verified state (2026-06-20)
optional/components.css is entirely commented out; grep "sf-button{" against the built bundles returns 0 live rules. The --sf-button-* token block exists in optional/tokens.components.css (also commented). Cascade slot is real and ordered.
Constraints
Additive only, BEM-first, no build step, no runtime JS. Modifiers per docs/components.md: --primary, --secondary, --ghost, --danger, --s, --m, --l.
Acceptance criteria
Type: components layer · Tier: v1.0 core
Summary
Ship the first real component,
.sf-button, in@layer slashed.components. The name and token block are already reserved; this uncomments and completes the implementation.Why
.sf-button+.sf-cardare the highest-use components and have the most stable tokens — the natural first batch toward 1.0.Verified state (2026-06-20)
optional/components.cssis entirely commented out;grep "sf-button{"against the built bundles returns 0 live rules. The--sf-button-*token block exists inoptional/tokens.components.css(also commented). Cascade slot is real and ordered.Constraints
Additive only, BEM-first, no build step, no runtime JS. Modifiers per
docs/components.md:--primary,--secondary,--ghost,--danger,--s,--m,--l.Acceptance criteria
.sf-buttonand its--sf-button-*tokenstests/(light + dark)docs/components.mdwith HTML examples