onSet(t.token, `${v}${t.unit}`)}
+ onReset={() => onReset(t.token)}
+ rawDefault={t.rawDefault}
+ variableOptions={t.variableOptions}
+ currentRaw={overrides[t.token]}
+ onRawSet={(v) => onSet(t.token, v)}
+ />
+ {/each}
+
+
+ Radius (outer, computed)
+ {outerRadiusUnknown ? "depends on variable" : `${(cardRadius + cardPadding).toFixed(2)}rem`}
+
+
+ --sf-card-radius-outer = radius + padding (concentric math) — not independently overridable, always computed from the two sliders above.
+
+
+
+
Background — --sf-card-bg
+
+ {#each BG_PRESETS as p (p.step)}
+ {@const cur = currentStep("--sf-card-bg", "color", BG_PRESETS.map(x => x.step), "surface")}
+
+ {/each}
+
+
+
+
+
Border color — --sf-card-border-color
+
+ {#each BORDER_PRESETS as p (p.step)}
+ {@const cur = currentStep("--sf-card-border-color", "color", BORDER_PRESETS.map(x => x.step), "border")}
+
+ {/each}
+
+
+
+
+
Shadow — --sf-card-shadow
+
+ {#each SHADOW_STEPS as step (step)}
+ {@const cur = currentStep("--sf-card-shadow", "shadow", SHADOW_STEPS, "s")}
+
+ {/each}
+
+
+
+
+
Elevated shadow — --sf-card-shadow--elevated
+
+ {#each SHADOW_STEPS as step (step)}
+ {@const cur = currentStep("--sf-card-shadow--elevated", "shadow", SHADOW_STEPS, "l")}
+
+ {/each}
+
+
+
+
+
Hover shadow (interactive) — --sf-card-shadow--hover
+
+ {#each SHADOW_STEPS as step (step)}
+ {@const cur = currentStep("--sf-card-shadow--hover", "shadow", SHADOW_STEPS, "l")}
+
+ {/each}
+
+
+
+
+
Media aspect ratio — --sf-card-media-ratio
+
+ {#each RATIO_STEPS as step (step)}
+ {@const cur = currentStep("--sf-card-media-ratio", "ratio", RATIO_STEPS, "video")}
+
+ {/each}
+
+
+
+
+
Title size — --sf-card-heading-size
+
+ {#each TEXT_STEPS as step (step)}
+ {@const cur = currentStep("--sf-card-heading-size", "text", TEXT_STEPS, "xl")}
+
+ {/each}
+
+
+
+
+
Nested button size — --sf-card-btn-font-size
+
+ {#each TEXT_STEPS as step (step)}
+ {@const cur = currentStep("--sf-card-btn-font-size", "text", TEXT_STEPS, "s")}
+
+ {/each}
+
+
+
+
+
Media object-fit — --sf-object-fit (global, affects all img/video)
+
+ {#each ["cover", "contain"] as fit (fit)}
+ {@const cur = overrides["--sf-object-fit"] ?? "cover"}
+
+ {/each}
+
+
+