You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
"Skeleton" is about to be used for two different axes at once:
Live today — a state utility:core/states.css:77-95 — .sf-is-skeleton (+ img.sf-is-skeleton), a generic shimmer/loading-state class applicable to any element, on any component.
Planned — a component family:docs/roadmap.md:50-53 and issue Components: second batch #384 (item 8) — a future .sf-skeleton component with shape modifiers: .sf-skeleton--text, .sf-skeleton--line, .sf-skeleton--avatar, .sf-skeleton--card.
Once item 8 of #384 ships, an author could plausibly write:
Two independently-named "skeleton" concepts stacked on one element — unclear at a glance whether .sf-is-skeleton (the shimmer effect) is even meant to combine with .sf-skeleton--card (a shape/component), or whether the component is supposed to carry its own built-in shimmer without needing the state class at all. This is exactly the class of bug that produced #571 (.sf-btn--secondary colliding with --sf-color-secondary) — same word, two axes, and it's cheaper to fix now, before anything ships, than after.
Secondary, smaller echo of the same problem:.sf-skeleton--card reuses the word "card" to mean a placeholder shape, not the real .sf-card component — someone skimming class names could misread .sf-skeleton--card as "a skeleton version of .sf-card" (with matching padding/radius/etc.) rather than just "a rectangular placeholder shape shaped roughly like a card."
#384 is the tracking issue for the whole first component batch (button, card, badge, tag, alert, avatar, modal, skeleton, custom form controls, @starting-style animations) and doesn't currently call out this naming risk for item 8 specifically. This issue exists so the naming question gets resolved as a design decision before.sf-skeleton implementation starts, not discovered after.
Proposed resolution (pick one before implementing #384 item 8)
(a) Keep .sf-is-skeleton as the shimmer state (any element), and rename the planned component to something that doesn't share the word — e.g. .sf-placeholder or .sf-shape, with modifiers .sf-placeholder--text/--line/--avatar/--card. The component's base rule would then itself apply (or require) .sf-is-skeleton for the shimmer, making the composition explicit: .sf-placeholder .sf-placeholder--card for shape + .sf-is-skeleton for the shimmer behavior, cleanly separated.
(b) Keep .sf-skeleton as the component name, and make it self-sufficient (it always shimmers on its own, no separate .sf-is-skeleton class needed on skeleton-component elements) — document clearly that .sf-is-skeleton (state) and .sf-skeleton (component) are never meant to be used together, and pick non-colliding names for the shape modifiers to avoid the .sf-skeleton--card vs .sf-card echo (e.g. .sf-skeleton--card-shape or drop the "card" name in favor of a purely geometric descriptor).
Recommend (a) — it keeps the state/component axis separation the framework already uses elsewhere (.sf-is-* = state, .sf-* = structural), rather than introducing a new "self-sufficient component that also happens to share a name with a state" pattern.
Problem
"Skeleton" is about to be used for two different axes at once:
core/states.css:77-95—.sf-is-skeleton(+img.sf-is-skeleton), a generic shimmer/loading-state class applicable to any element, on any component.docs/roadmap.md:50-53and issue Components: second batch #384 (item 8) — a future.sf-skeletoncomponent with shape modifiers:.sf-skeleton--text,.sf-skeleton--line,.sf-skeleton--avatar,.sf-skeleton--card.Once item 8 of #384 ships, an author could plausibly write:
Two independently-named "skeleton" concepts stacked on one element — unclear at a glance whether
.sf-is-skeleton(the shimmer effect) is even meant to combine with.sf-skeleton--card(a shape/component), or whether the component is supposed to carry its own built-in shimmer without needing the state class at all. This is exactly the class of bug that produced #571 (.sf-btn--secondarycolliding with--sf-color-secondary) — same word, two axes, and it's cheaper to fix now, before anything ships, than after.Secondary, smaller echo of the same problem:
.sf-skeleton--cardreuses the word "card" to mean a placeholder shape, not the real.sf-cardcomponent — someone skimming class names could misread.sf-skeleton--cardas "a skeleton version of.sf-card" (with matching padding/radius/etc.) rather than just "a rectangular placeholder shape shaped roughly like a card."Why file this separately from #384
#384 is the tracking issue for the whole first component batch (button, card, badge, tag, alert, avatar, modal, skeleton, custom form controls,
@starting-styleanimations) and doesn't currently call out this naming risk for item 8 specifically. This issue exists so the naming question gets resolved as a design decision before.sf-skeletonimplementation starts, not discovered after.Proposed resolution (pick one before implementing #384 item 8)
.sf-is-skeletonas the shimmer state (any element), and rename the planned component to something that doesn't share the word — e.g..sf-placeholderor.sf-shape, with modifiers.sf-placeholder--text/--line/--avatar/--card. The component's base rule would then itself apply (or require).sf-is-skeletonfor the shimmer, making the composition explicit:.sf-placeholder .sf-placeholder--cardfor shape +.sf-is-skeletonfor the shimmer behavior, cleanly separated..sf-skeletonas the component name, and make it self-sufficient (it always shimmers on its own, no separate.sf-is-skeletonclass needed on skeleton-component elements) — document clearly that.sf-is-skeleton(state) and.sf-skeleton(component) are never meant to be used together, and pick non-colliding names for the shape modifiers to avoid the.sf-skeleton--cardvs.sf-cardecho (e.g..sf-skeleton--card-shapeor drop the "card" name in favor of a purely geometric descriptor).Recommend (a) — it keeps the state/component axis separation the framework already uses elsewhere (
.sf-is-*= state,.sf-*= structural), rather than introducing a new "self-sufficient component that also happens to share a name with a state" pattern.Scope
docs/roadmap.md's planned modifier list accordingly.sf-card's actual token setRelated
.sf-skeleton)