@motion-proto/live-tokens 0.6.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.md +14 -13
  2. package/dist-plugin/index.cjs +854 -226
  3. package/dist-plugin/index.d.cts +2 -1
  4. package/dist-plugin/index.d.ts +2 -1
  5. package/dist-plugin/index.js +852 -225
  6. package/package.json +26 -40
  7. package/src/{styles → app}/site.css +1 -1
  8. package/src/{component-editor → editor/component-editor}/BadgeEditor.svelte +8 -82
  9. package/src/{component-editor → editor/component-editor}/CalloutEditor.svelte +4 -4
  10. package/src/{component-editor → editor/component-editor}/CardEditor.svelte +28 -76
  11. package/src/{component-editor → editor/component-editor}/CollapsibleSectionEditor.svelte +37 -30
  12. package/src/{component-editor → editor/component-editor}/CornerBadgeEditor.svelte +31 -93
  13. package/src/{component-editor → editor/component-editor}/DialogEditor.svelte +60 -57
  14. package/src/editor/component-editor/ImageEditor.svelte +30 -0
  15. package/src/{component-editor → editor/component-editor}/InlineEditActionsEditor.svelte +6 -4
  16. package/src/editor/component-editor/MenuSelectEditor.svelte +160 -0
  17. package/src/{component-editor → editor/component-editor}/NotificationEditor.svelte +67 -38
  18. package/src/{component-editor → editor/component-editor}/ProgressBarEditor.svelte +5 -4
  19. package/src/{component-editor → editor/component-editor}/RadioButtonEditor.svelte +3 -3
  20. package/src/editor/component-editor/SectionDividerEditor.svelte +565 -0
  21. package/src/{component-editor → editor/component-editor}/SegmentedControlEditor.svelte +2 -2
  22. package/src/{component-editor → editor/component-editor}/StandardButtonsEditor.svelte +29 -21
  23. package/src/{component-editor → editor/component-editor}/TabBarEditor.svelte +9 -14
  24. package/src/{component-editor → editor/component-editor}/TableEditor.svelte +9 -18
  25. package/src/{component-editor → editor/component-editor}/TooltipEditor.svelte +11 -47
  26. package/src/editor/component-editor/editors.d.ts +10 -0
  27. package/src/{component-editor → editor/component-editor}/registry.ts +28 -18
  28. package/src/{component-editor → editor/component-editor}/scaffolding/AngleDial.svelte +54 -15
  29. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentEditorBase.svelte +3 -51
  30. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentFileManager.svelte +151 -424
  31. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentFileMenu.svelte +18 -170
  32. package/src/{component-editor → editor/component-editor}/scaffolding/ComponentsTab.svelte +2 -2
  33. package/src/{component-editor → editor/component-editor}/scaffolding/CopyFromMenu.svelte +44 -4
  34. package/src/{component-editor → editor/component-editor}/scaffolding/FieldsetWrapper.svelte +1 -1
  35. package/src/{component-editor → editor/component-editor}/scaffolding/LinkageChart.svelte +6 -6
  36. package/src/{component-editor → editor/component-editor}/scaffolding/LinkedBlock.svelte +6 -12
  37. package/src/editor/component-editor/scaffolding/NonStylableConfig.svelte +38 -0
  38. package/src/editor/component-editor/scaffolding/RadialShapePad.svelte +483 -0
  39. package/src/{component-editor → editor/component-editor}/scaffolding/SaveAsDialog.svelte +66 -12
  40. package/src/editor/component-editor/scaffolding/ShadowBackdrop.svelte +85 -0
  41. package/src/editor/component-editor/scaffolding/ShadowBackdropControls.svelte +132 -0
  42. package/src/editor/component-editor/scaffolding/StateBlock.svelte +345 -0
  43. package/src/{component-editor → editor/component-editor}/scaffolding/TokenLayout.svelte +17 -12
  44. package/src/{component-editor → editor/component-editor}/scaffolding/TypeEditor.svelte +13 -1
  45. package/src/editor/component-editor/scaffolding/VariantGroup.svelte +858 -0
  46. package/src/{component-editor → editor/component-editor}/scaffolding/buildTypeGroupTokens.ts +1 -0
  47. package/src/{component-editor → editor/component-editor}/scaffolding/editorContext.ts +19 -9
  48. package/src/{component-editor → editor/component-editor}/scaffolding/linkedBlock.ts +2 -2
  49. package/src/{component-editor → editor/component-editor}/scaffolding/types.ts +25 -0
  50. package/src/{lib → editor/core/components}/componentConfigKeys.ts +8 -0
  51. package/src/{lib → editor/core/components}/componentConfigService.ts +3 -3
  52. package/src/{lib → editor/core/components}/componentPersist.ts +11 -9
  53. package/src/editor/core/flashStatus.ts +30 -0
  54. package/src/{lib → editor/core/fonts}/fontLoader.ts +2 -2
  55. package/src/{lib → editor/core/fonts}/fontMigration.ts +4 -4
  56. package/src/{lib → editor/core/fonts}/fontParse.ts +1 -1
  57. package/src/editor/core/manifests/manifestService.ts +171 -0
  58. package/src/editor/core/palettes/familySwap.ts +99 -0
  59. package/src/{lib → editor/core/palettes}/paletteDerivation.ts +71 -2
  60. package/src/{lib → editor/core/palettes}/tokenRegistry.ts +9 -6
  61. package/src/editor/core/productionPulse.ts +37 -0
  62. package/src/{lib → editor/core/routing}/router.ts +1 -1
  63. package/src/{lib/files/versionedFileResource.ts → editor/core/storage/files/versionedFileResourceClient.ts} +8 -1
  64. package/src/{lib → editor/core/store}/editorCore.ts +24 -8
  65. package/src/{lib → editor/core/store}/editorPersistence.ts +3 -3
  66. package/src/{lib → editor/core/store}/editorRenderer.ts +2 -2
  67. package/src/{lib → editor/core/store}/editorStore.ts +222 -28
  68. package/src/{lib → editor/core/store}/editorTypes.ts +56 -13
  69. package/src/editor/core/store/gradientSource.ts +192 -0
  70. package/src/editor/core/themes/migrations/2026-05-19-collapsiblesection-drop-frame-surface.ts +28 -0
  71. package/src/editor/core/themes/migrations/2026-05-19-sectiondivider-rich-gradient.ts +35 -0
  72. package/src/editor/core/themes/migrations/2026-05-20-sectiondivider-slim-variants.ts +82 -0
  73. package/src/editor/core/themes/migrations/2026-05-21-sectiondivider-spacing-to-padding.ts +24 -0
  74. package/src/editor/core/themes/migrations/2026-05-22-sectiondivider-intrinsics-to-css.ts +81 -0
  75. package/src/{lib → editor/core/themes}/migrations/index.ts +10 -0
  76. package/src/{lib → editor/core/themes}/slices/columns.ts +2 -2
  77. package/src/{lib → editor/core/themes}/slices/components.ts +20 -6
  78. package/src/{lib → editor/core/themes}/slices/fonts.ts +1 -1
  79. package/src/{lib → editor/core/themes}/slices/gradients.ts +89 -14
  80. package/src/{lib → editor/core/themes}/slices/overlays.ts +1 -1
  81. package/src/{lib → editor/core/themes}/slices/palettes.ts +1 -1
  82. package/src/{lib → editor/core/themes}/slices/shadows.ts +3 -3
  83. package/src/{lib → editor/core/themes}/themeInit.ts +8 -8
  84. package/src/{lib → editor/core/themes}/themeService.ts +6 -6
  85. package/src/{lib → editor/core/themes}/themeTypes.ts +67 -8
  86. package/src/editor/index.ts +69 -0
  87. package/src/{lib → editor/overlay}/ColumnsOverlay.svelte +0 -1
  88. package/src/{lib → editor/overlay}/LiveEditorOverlay.svelte +80 -129
  89. package/src/{lib → editor/overlay}/columnsOverlay.ts +2 -2
  90. package/src/{pages → editor/pages}/ComponentEditorPage.svelte +12 -12
  91. package/src/{pages → editor/pages}/Editor.svelte +4 -4
  92. package/src/{pages → editor/pages}/EditorShell.svelte +18 -36
  93. package/src/{styles → editor/styles}/ui-editor.css +43 -22
  94. package/src/{styles → editor/styles}/ui-form-controls.css +23 -24
  95. package/src/{ui → editor/ui}/BezierCurveEditor.svelte +119 -68
  96. package/src/{ui → editor/ui}/ColorEditPanel.svelte +13 -13
  97. package/src/{ui → editor/ui}/EditorViewSwitcher.svelte +7 -6
  98. package/src/editor/ui/FileLoadList.svelte +367 -0
  99. package/src/editor/ui/FilePill.svelte +80 -0
  100. package/src/editor/ui/FontStackEditor.svelte +499 -0
  101. package/src/editor/ui/GradientEditor.svelte +690 -0
  102. package/src/{ui → editor/ui}/GradientStopPicker.svelte +12 -4
  103. package/src/editor/ui/ManifestFileManager.svelte +438 -0
  104. package/src/{ui → editor/ui}/PaletteEditor.svelte +180 -673
  105. package/src/editor/ui/ProjectFontsSection.svelte +638 -0
  106. package/src/{ui → editor/ui}/SurfacesTab.svelte +3 -3
  107. package/src/{ui → editor/ui}/TextTab.svelte +3 -3
  108. package/src/editor/ui/ThemeFileManager.svelte +783 -0
  109. package/src/{ui → editor/ui}/UICopyPopover.svelte +4 -4
  110. package/src/{ui → editor/ui}/UIFontFamilySelector.svelte +6 -7
  111. package/src/{ui → editor/ui}/UIFontSizeSelector.svelte +4 -1
  112. package/src/editor/ui/UIInfoPopover.svelte +243 -0
  113. package/src/editor/ui/UILetterSpacingSelector.svelte +65 -0
  114. package/src/{ui → editor/ui}/UILineHeightSelector.svelte +5 -5
  115. package/src/{ui → editor/ui}/UILinkToggle.svelte +2 -2
  116. package/src/{ui → editor/ui}/UIPaddingSelector.svelte +6 -6
  117. package/src/{ui → editor/ui}/UIPaletteSelector.svelte +57 -30
  118. package/src/editor/ui/UIPillButton.svelte +168 -0
  119. package/src/{ui → editor/ui}/UIRadio.svelte +2 -2
  120. package/src/{ui → editor/ui}/UIRelinkConfirmPopover.svelte +4 -4
  121. package/src/editor/ui/UISegmentedControl.svelte +114 -0
  122. package/src/editor/ui/UISquareButton.svelte +172 -0
  123. package/src/{ui → editor/ui}/UITokenSelector.svelte +14 -11
  124. package/src/{ui → editor/ui}/UIVariantSelector.svelte +1 -1
  125. package/src/{ui → editor/ui}/VariablesTab.svelte +46 -17
  126. package/src/{ui → editor/ui}/palette/GradientStopEditor.svelte +13 -13
  127. package/src/{ui → editor/ui}/palette/OverridesPanel.svelte +24 -47
  128. package/src/{ui → editor/ui}/palette/PaletteBase.svelte +11 -8
  129. package/src/{ui → editor/ui}/palette/paletteEditorState.ts +1 -1
  130. package/src/editor/ui/palette/paletteMath.ts +275 -0
  131. package/src/{ui → editor/ui}/sections/ColumnsSection.svelte +137 -18
  132. package/src/{ui → editor/ui}/sections/GradientsSection.svelte +8 -8
  133. package/src/{ui → editor/ui}/sections/OverlaysSection.svelte +18 -18
  134. package/src/{ui → editor/ui}/sections/ShadowsSection.svelte +23 -23
  135. package/src/{ui → editor/ui}/sections/TokenScaleTable.svelte +3 -3
  136. package/src/{components → system/components}/Badge.svelte +0 -36
  137. package/src/{components → system/components}/Button.svelte +2 -2
  138. package/src/{components → system/components}/Card.svelte +34 -60
  139. package/src/{components → system/components}/CollapsibleSection.svelte +25 -2
  140. package/src/{components → system/components}/CornerBadge.svelte +8 -24
  141. package/src/{components → system/components}/Dialog.svelte +1 -1
  142. package/src/system/components/FloatingTokenTags.css +275 -0
  143. package/src/system/components/FloatingTokenTags.svelte +543 -0
  144. package/src/{components → system/components}/InlineEditActions.svelte +6 -4
  145. package/src/system/components/MenuSelect.svelte +229 -0
  146. package/src/{components → system/components}/Notification.svelte +8 -1
  147. package/src/{components → system/components}/ProgressBar.svelte +29 -11
  148. package/src/system/components/SectionDivider.svelte +560 -0
  149. package/src/{components → system/components}/SegmentedControl.svelte +49 -43
  150. package/src/{components → system/components}/TabBar.svelte +81 -65
  151. package/src/{components → system/components}/Table.svelte +17 -3
  152. package/src/{components → system/components}/Tooltip.svelte +6 -4
  153. package/src/system/styles/CONVENTIONS.md +178 -0
  154. package/src/system/styles/fonts.css +20 -0
  155. package/src/system/styles/tokens.css +601 -0
  156. package/src/system/styles/tokens.generated.css +544 -0
  157. package/src/component-editor/ImageEditor.svelte +0 -74
  158. package/src/component-editor/SectionDividerEditor.svelte +0 -265
  159. package/src/component-editor/scaffolding/DividerEditor.svelte +0 -94
  160. package/src/component-editor/scaffolding/GradientCard.svelte +0 -296
  161. package/src/component-editor/scaffolding/NonStylableConfig.svelte +0 -62
  162. package/src/component-editor/scaffolding/ShadowBackdrop.svelte +0 -37
  163. package/src/component-editor/scaffolding/ShadowBackdropControls.svelte +0 -61
  164. package/src/component-editor/scaffolding/StateBlock.svelte +0 -132
  165. package/src/component-editor/scaffolding/VariantGroup.svelte +0 -310
  166. package/src/components/SectionDivider.svelte +0 -483
  167. package/src/data/google-fonts.json +0 -75
  168. package/src/lib/index.ts +0 -68
  169. package/src/lib/presetService.ts +0 -214
  170. package/src/lib/productionPulse.ts +0 -32
  171. package/src/styles/fonts.css +0 -30
  172. package/src/styles/tokens.css +0 -1324
  173. package/src/ui/FontStackEditor.svelte +0 -361
  174. package/src/ui/GradientEditor.svelte +0 -470
  175. package/src/ui/PresetFileManager.svelte +0 -1116
  176. package/src/ui/ProjectFontsSection.svelte +0 -645
  177. package/src/ui/ThemeFileManager.svelte +0 -1020
  178. package/src/ui/UnsavedComponentsDialog.svelte +0 -315
  179. /package/src/{component-editor → editor/component-editor}/index.ts +0 -0
  180. /package/src/{component-editor → editor/component-editor}/scaffolding/DemoHeader.svelte +0 -0
  181. /package/src/{component-editor → editor/component-editor}/scaffolding/componentSectionType.ts +0 -0
  182. /package/src/{component-editor → editor/component-editor}/scaffolding/componentSources.ts +0 -0
  183. /package/src/{component-editor → editor/component-editor}/scaffolding/defaultSections.ts +0 -0
  184. /package/src/{component-editor → editor/component-editor}/scaffolding/siblings.ts +0 -0
  185. /package/src/{lib → editor/core}/cssVarSync.ts +0 -0
  186. /package/src/{lib → editor/core/palettes}/oklch.ts +0 -0
  187. /package/src/{lib → editor/core/routing}/navLinkTypes.ts +0 -0
  188. /package/src/{lib → editor/core/routing}/parentRouteStore.ts +0 -0
  189. /package/src/{lib → editor/core/storage}/storage.ts +0 -0
  190. /package/src/{lib → editor/core/store}/editorConfig.ts +0 -0
  191. /package/src/{lib → editor/core/store}/editorConfigStore.ts +0 -0
  192. /package/src/{lib → editor/core/store}/editorKeybindings.ts +0 -0
  193. /package/src/{lib → editor/core/store}/editorViewStore.ts +0 -0
  194. /package/src/{lib → editor/core/themes}/migrations/2026-04-24-component-prefix-and-suffix-renames.ts +0 -0
  195. /package/src/{lib → editor/core/themes}/migrations/2026-04-24-legacy-keys-and-bg-to-canvas.ts +0 -0
  196. /package/src/{lib → editor/core/themes}/migrations/2026-04-27-segmentedcontrol-disabled-flatten.ts +0 -0
  197. /package/src/{lib → editor/core/themes}/migrations/2026-05-08-collapsiblesection-frame-and-cleanup.ts +0 -0
  198. /package/src/{lib → editor/core/themes}/migrations/2026-05-08-collapsiblesection-variant-namespace.ts +0 -0
  199. /package/src/{lib → editor/core/themes}/migrations/2026-05-10-sectiondivider-gradient-stops.ts +0 -0
  200. /package/src/{lib → editor/core/themes}/migrations/2026-05-13-primary-to-brand.ts +0 -0
  201. /package/src/{lib → editor/core/themes}/parsers/globalRootBlock.ts +0 -0
  202. /package/src/{lib → editor/core/themes}/slices/domainVars.ts +0 -0
  203. /package/src/{lib → editor/overlay}/overlayState.ts +0 -0
  204. /package/src/{pages → editor/pages}/ComponentEditorPage.svelte.d.ts +0 -0
  205. /package/src/{pages → editor/pages}/Editor.svelte.d.ts +0 -0
  206. /package/src/{ui → editor/ui}/Toggle.svelte +0 -0
  207. /package/src/{ui → editor/ui}/UIDialog.svelte +0 -0
  208. /package/src/{ui → editor/ui}/UIFontWeightSelector.svelte +0 -0
  209. /package/src/{ui → editor/ui}/UIOptionItem.svelte +0 -0
  210. /package/src/{ui → editor/ui}/UIOptionList.svelte +0 -0
  211. /package/src/{ui → editor/ui}/UIRadioGroup.svelte +0 -0
  212. /package/src/{lib → editor/ui}/copyPopover.ts +0 -0
  213. /package/src/{ui → editor/ui}/curveEngine.ts +0 -0
  214. /package/src/{ui → editor/ui}/index.ts +0 -0
  215. /package/src/{ui → editor/ui}/keepInViewport.ts +0 -0
  216. /package/src/{ui → editor/ui}/palette/ScaleCurveEditor.svelte +0 -0
  217. /package/src/{lib → editor/ui}/scrollSection.ts +0 -0
  218. /package/src/{ui → editor/ui}/sections/tokenScales.ts +0 -0
  219. /package/src/{ui → editor/ui}/variantScales.ts +0 -0
  220. /package/src/{assets → system/assets}/newspaper.webp +0 -0
  221. /package/src/{assets → system/assets}/offering.webp +0 -0
  222. /package/src/{components → system/components}/Callout.svelte +0 -0
  223. /package/src/{components → system/components}/Image.svelte +0 -0
  224. /package/src/{components → system/components}/RadioButton.svelte +0 -0
  225. /package/src/{components → system/components}/types.ts +0 -0
  226. /package/src/{styles → system/styles}/_padding.scss +0 -0
  227. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-italic-latin-ext.woff2 +0 -0
  228. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-italic-latin.woff2 +0 -0
  229. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-roman-latin-ext.woff2 +0 -0
  230. /package/src/{styles → system/styles}/fonts/Fraunces/Fraunces-roman-latin.woff2 +0 -0
  231. /package/src/{styles → system/styles}/fonts/Manrope/Manrope-latin-ext.woff2 +0 -0
  232. /package/src/{styles → system/styles}/fonts/Manrope/Manrope-latin.woff2 +0 -0
@@ -0,0 +1,560 @@
1
+ <script lang="ts">
2
+ import { run } from 'svelte/legacy';
3
+
4
+ import { onMount, tick } from 'svelte';
5
+
6
+ /** Size variant. Each variant owns everything that defines its look:
7
+ * typography, geometry, colors AND the intrinsic display properties
8
+ * (alignment, eyebrow visibility, description visibility, hairline
9
+ * position). Every intrinsic flows through `:root` CSS vars so a designer
10
+ * edit cascades to every consumer instance without per-call wiring. */
11
+ type Variant = 'lg' | 'md' | 'sm';
12
+
13
+ interface Props {
14
+ title: string;
15
+ description?: string | undefined;
16
+ eyebrow?: string | undefined;
17
+ variant?: Variant;
18
+ }
19
+
20
+ let {
21
+ title,
22
+ description = undefined,
23
+ eyebrow = undefined,
24
+ variant = 'md',
25
+ }: Props = $props();
26
+
27
+ let svgEl: SVGSVGElement | undefined = $state();
28
+ let svgTextEl: SVGTextElement | undefined = $state();
29
+ let svgW = $state(0);
30
+ let svgH = $state(0);
31
+ let svgX = $state(0);
32
+ let svgY = $state(0);
33
+
34
+ // feMorphology radius and feFlood flood-color are non-presentation attributes
35
+ // and can't read CSS vars. Read resolved values off the SVG element and push
36
+ // them onto the filter primitives, refreshing on doc-level inline-var changes.
37
+ let outlineRadius = $state('0');
38
+ let outlineColor = $state('#000');
39
+ const filterId = `sd-outline-${Math.random().toString(36).slice(2, 10)}`;
40
+
41
+ function syncFilter(): void {
42
+ if (!svgEl) return;
43
+ const cs = getComputedStyle(svgEl);
44
+ const wPx = parseFloat(cs.getPropertyValue('--_divider-title-outline-width'));
45
+ outlineRadius = String(Number.isFinite(wPx) ? wPx / 2 : 0);
46
+ const c = cs.getPropertyValue('--_divider-title-outline-color').trim();
47
+ outlineColor = c || '#000';
48
+ }
49
+
50
+ function measure(): void {
51
+ if (!svgTextEl) return;
52
+ const bb = svgTextEl.getBBox();
53
+ svgX = bb.x;
54
+ svgY = bb.y;
55
+ svgW = Math.ceil(bb.width);
56
+ svgH = Math.ceil(bb.height);
57
+ }
58
+
59
+ run(() => {
60
+ if (title) {
61
+ tick().then(() => { measure(); syncFilter(); });
62
+ }
63
+ });
64
+
65
+ onMount(() => {
66
+ measure();
67
+ syncFilter();
68
+ const obs = new MutationObserver(() => { measure(); syncFilter(); });
69
+ obs.observe(document.documentElement, { attributes: true, attributeFilter: ['style'] });
70
+ return () => obs.disconnect();
71
+ });
72
+ </script>
73
+
74
+ <div class="section-divider variant-{variant}">
75
+ <span class="divider-eyebrow">{eyebrow ?? ''}</span>
76
+ <span class="sd-hairline sd-hairline--row sd-hairline-above-label" aria-hidden="true"></span>
77
+ <div class="title-row">
78
+ <span class="sd-hairline sd-hairline--side sd-hairline-through-label" aria-hidden="true"></span>
79
+ <span class="title-inline">
80
+ <svg
81
+ bind:this={svgEl}
82
+ class="divider-label"
83
+ width={svgW || undefined}
84
+ height={svgH || undefined}
85
+ viewBox={svgW && svgH ? `${svgX} ${svgY} ${svgW} ${svgH}` : undefined}
86
+ aria-label={title}
87
+ role="img"
88
+ >
89
+ <defs>
90
+ <filter id={filterId} x="-50%" y="-50%" width="200%" height="200%">
91
+ <feMorphology in="SourceAlpha" operator="dilate" radius={outlineRadius} result="dilated" />
92
+ <feFlood flood-color={outlineColor} result="color" />
93
+ <feComposite in="color" in2="dilated" operator="in" result="outline" />
94
+ <feComposite in="SourceGraphic" in2="outline" operator="over" />
95
+ </filter>
96
+ </defs>
97
+ <text
98
+ bind:this={svgTextEl}
99
+ x="0"
100
+ y="0"
101
+ dominant-baseline="hanging"
102
+ filter="url(#{filterId})"
103
+ >{title}</text>
104
+ </svg>
105
+ </span>
106
+ <span class="sd-hairline sd-hairline--side sd-hairline-through-label" aria-hidden="true"></span>
107
+ </div>
108
+ <span class="sd-hairline sd-hairline--row sd-hairline-below-label" aria-hidden="true"></span>
109
+ <span class="sd-hairline sd-hairline--row sd-hairline-above-description" aria-hidden="true"></span>
110
+ <div class="description-row">
111
+ <span class="sd-hairline sd-hairline--side sd-hairline-through-description" aria-hidden="true"></span>
112
+ <span class="description-inline">
113
+ <p class="divider-description">{description ?? ''}</p>
114
+ </span>
115
+ <span class="sd-hairline sd-hairline--side sd-hairline-through-description" aria-hidden="true"></span>
116
+ </div>
117
+ <span class="sd-hairline sd-hairline--row sd-hairline-below-description" aria-hidden="true"></span>
118
+ </div>
119
+
120
+ <style>
121
+ /* Each size variant owns its full token set: typography, geometry, colors
122
+ AND intrinsic display properties (alignment, eyebrow/description
123
+ visibility, hairline position, eyebrow text-transform). There is no
124
+ separate color axis — variants are full presets the designer composes
125
+ in the editor. The instance picks one variant; that's it. */
126
+ :global(:root) {
127
+ /* Large */
128
+ --sectiondivider-lg-title-font-family: var(--font-display);
129
+ --sectiondivider-lg-title-font-weight: var(--font-weight-normal);
130
+ --sectiondivider-lg-title-font-size: var(--font-size-5xl);
131
+ --sectiondivider-lg-title-line-height: var(--line-height-xs);
132
+ --sectiondivider-lg-title-letter-spacing: var(--letter-spacing-normal);
133
+ --sectiondivider-lg-title-outline-width: var(--border-width-4);
134
+ --sectiondivider-lg-description-font-family: var(--font-sans);
135
+ --sectiondivider-lg-description-font-weight: var(--font-weight-normal);
136
+ --sectiondivider-lg-description-font-size: var(--font-size-lg);
137
+ --sectiondivider-lg-description-line-height: var(--line-height-md);
138
+ --sectiondivider-lg-eyebrow-font-family: var(--font-sans);
139
+ --sectiondivider-lg-eyebrow-font-weight: var(--font-weight-medium);
140
+ --sectiondivider-lg-eyebrow-font-size: var(--font-size-md);
141
+ --sectiondivider-lg-eyebrow-letter-spacing: var(--letter-spacing-wide);
142
+ --sectiondivider-lg-padding: var(--space-16);
143
+ --sectiondivider-lg-title-padding: var(--space-0);
144
+ --sectiondivider-lg-description-padding: var(--space-0);
145
+ --sectiondivider-lg-eyebrow-padding: var(--space-0);
146
+ --sectiondivider-lg-radius: var(--radius-lg);
147
+ --sectiondivider-lg-border-width: var(--border-width-0);
148
+ --sectiondivider-lg-shadow: var(--shadow-none);
149
+ --sectiondivider-lg-hairline-thickness: var(--border-width-1);
150
+ --sectiondivider-lg-background: linear-gradient(135deg, var(--surface-canvas-highest) 0%, var(--surface-canvas-higher) 50%, var(--surface-canvas) 100%);
151
+ --sectiondivider-lg-title: var(--text-primary);
152
+ --sectiondivider-lg-description: var(--text-secondary);
153
+ --sectiondivider-lg-eyebrow: var(--text-tertiary);
154
+ --sectiondivider-lg-border: var(--color-transparent);
155
+ --sectiondivider-lg-title-outline-color: var(--surface-canvas-lowest);
156
+ --sectiondivider-lg-hairline-color: var(--border-canvas-medium);
157
+
158
+ /* Medium */
159
+ --sectiondivider-md-title-font-family: var(--font-display);
160
+ --sectiondivider-md-title-font-weight: var(--font-weight-normal);
161
+ --sectiondivider-md-title-font-size: var(--font-size-4xl);
162
+ --sectiondivider-md-title-line-height: var(--line-height-xs);
163
+ --sectiondivider-md-title-letter-spacing: var(--letter-spacing-normal);
164
+ --sectiondivider-md-title-outline-width: var(--border-width-3);
165
+ --sectiondivider-md-description-font-family: var(--font-sans);
166
+ --sectiondivider-md-description-font-weight: var(--font-weight-normal);
167
+ --sectiondivider-md-description-font-size: var(--font-size-md);
168
+ --sectiondivider-md-description-line-height: var(--line-height-md);
169
+ --sectiondivider-md-eyebrow-font-family: var(--font-sans);
170
+ --sectiondivider-md-eyebrow-font-weight: var(--font-weight-medium);
171
+ --sectiondivider-md-eyebrow-font-size: var(--font-size-sm);
172
+ --sectiondivider-md-eyebrow-letter-spacing: var(--letter-spacing-wide);
173
+ --sectiondivider-md-padding: var(--space-12);
174
+ --sectiondivider-md-title-padding: var(--space-0);
175
+ --sectiondivider-md-description-padding: var(--space-0);
176
+ --sectiondivider-md-eyebrow-padding: var(--space-0);
177
+ --sectiondivider-md-radius: var(--radius-md);
178
+ --sectiondivider-md-border-width: var(--border-width-0);
179
+ --sectiondivider-md-shadow: var(--shadow-none);
180
+ --sectiondivider-md-hairline-thickness: var(--border-width-1);
181
+ --sectiondivider-md-background: linear-gradient(135deg, var(--surface-canvas-highest) 0%, var(--surface-canvas-higher) 50%, var(--surface-canvas) 100%);
182
+ --sectiondivider-md-title: var(--text-primary);
183
+ --sectiondivider-md-description: var(--text-secondary);
184
+ --sectiondivider-md-eyebrow: var(--text-tertiary);
185
+ --sectiondivider-md-border: var(--color-transparent);
186
+ --sectiondivider-md-title-outline-color: var(--surface-canvas-lowest);
187
+ --sectiondivider-md-hairline-color: var(--border-canvas-medium);
188
+
189
+ /* Small */
190
+ --sectiondivider-sm-title-font-family: var(--font-display);
191
+ --sectiondivider-sm-title-font-weight: var(--font-weight-normal);
192
+ --sectiondivider-sm-title-font-size: var(--font-size-3xl);
193
+ --sectiondivider-sm-title-line-height: var(--line-height-xs);
194
+ --sectiondivider-sm-title-letter-spacing: var(--letter-spacing-normal);
195
+ --sectiondivider-sm-title-outline-width: var(--border-width-2);
196
+ --sectiondivider-sm-description-font-family: var(--font-sans);
197
+ --sectiondivider-sm-description-font-weight: var(--font-weight-normal);
198
+ --sectiondivider-sm-description-font-size: var(--font-size-sm);
199
+ --sectiondivider-sm-description-line-height: var(--line-height-md);
200
+ --sectiondivider-sm-eyebrow-font-family: var(--font-sans);
201
+ --sectiondivider-sm-eyebrow-font-weight: var(--font-weight-medium);
202
+ --sectiondivider-sm-eyebrow-font-size: var(--font-size-xs);
203
+ --sectiondivider-sm-eyebrow-letter-spacing: var(--letter-spacing-wide);
204
+ --sectiondivider-sm-padding: var(--space-8);
205
+ --sectiondivider-sm-title-padding: var(--space-0);
206
+ --sectiondivider-sm-description-padding: var(--space-0);
207
+ --sectiondivider-sm-eyebrow-padding: var(--space-0);
208
+ --sectiondivider-sm-radius: var(--radius-sm);
209
+ --sectiondivider-sm-border-width: var(--border-width-0);
210
+ --sectiondivider-sm-shadow: var(--shadow-none);
211
+ --sectiondivider-sm-hairline-thickness: var(--border-width-1);
212
+ --sectiondivider-sm-background: linear-gradient(135deg, var(--surface-canvas-highest) 0%, var(--surface-canvas-higher) 50%, var(--surface-canvas) 100%);
213
+ --sectiondivider-sm-title: var(--text-primary);
214
+ --sectiondivider-sm-description: var(--text-secondary);
215
+ --sectiondivider-sm-eyebrow: var(--text-tertiary);
216
+ --sectiondivider-sm-border: var(--color-transparent);
217
+ --sectiondivider-sm-title-outline-color: var(--surface-canvas-lowest);
218
+ --sectiondivider-sm-hairline-color: var(--border-canvas-medium);
219
+
220
+ /* Intrinsic defaults. These keys cascade to `:root` via the editor's
221
+ alias bucket; un-edited variants fall back to these. The defaults
222
+ match the legacy "config bucket" semantics: center alignment, hidden
223
+ eyebrow, visible description, hidden hairline, normal-case eyebrow. */
224
+ --sectiondivider-lg-align: center;
225
+ --sectiondivider-md-align: center;
226
+ --sectiondivider-sm-align: center;
227
+ --sectiondivider-lg-eyebrow-display: none;
228
+ --sectiondivider-md-eyebrow-display: none;
229
+ --sectiondivider-sm-eyebrow-display: none;
230
+ --sectiondivider-lg-description-display: flex;
231
+ --sectiondivider-md-description-display: flex;
232
+ --sectiondivider-sm-description-display: flex;
233
+ --sectiondivider-lg-hairline: none;
234
+ --sectiondivider-md-hairline: none;
235
+ --sectiondivider-sm-hairline: none;
236
+ --sectiondivider-lg-eyebrow-text-transform: none;
237
+ --sectiondivider-md-eyebrow-text-transform: none;
238
+ --sectiondivider-sm-eyebrow-text-transform: none;
239
+ }
240
+
241
+ .section-divider {
242
+ /* `container-name` lets the per-variant intrinsic vars below drive
243
+ style-query rules that reveal exactly one hairline and react to the
244
+ align/description-display values. No `container-type` is set so the
245
+ column layout stays in normal flow — style queries don't require it. */
246
+ container-name: sd;
247
+ position: relative;
248
+ margin: var(--space-24) 0;
249
+ padding:
250
+ var(--_divider-padding-top)
251
+ var(--_divider-padding-right)
252
+ var(--_divider-padding-bottom)
253
+ var(--_divider-padding-left);
254
+ border-radius: var(--_divider-radius);
255
+ border: var(--_divider-border-width) solid var(--_divider-border);
256
+ box-shadow: var(--_divider-shadow);
257
+ background: var(--_divider-bg);
258
+ display: flex;
259
+ flex-direction: column;
260
+ align-items: var(--_divider-align);
261
+ text-align: var(--_divider-align);
262
+ --_divider-justify: var(--_divider-align);
263
+ }
264
+
265
+ /* Variant pipes — one full token set per variant, including the intrinsics
266
+ that now cascade through CSS vars instead of runtime props. */
267
+ .variant-lg {
268
+ --_divider-title-font-family: var(--sectiondivider-lg-title-font-family);
269
+ --_divider-title-font-weight: var(--sectiondivider-lg-title-font-weight);
270
+ --_divider-title-font-size: var(--sectiondivider-lg-title-font-size);
271
+ --_divider-title-line-height: var(--sectiondivider-lg-title-line-height);
272
+ --_divider-title-letter-spacing: var(--sectiondivider-lg-title-letter-spacing);
273
+ --_divider-title-outline-width: var(--sectiondivider-lg-title-outline-width);
274
+ --_divider-description-font-family: var(--sectiondivider-lg-description-font-family);
275
+ --_divider-description-font-weight: var(--sectiondivider-lg-description-font-weight);
276
+ --_divider-description-font-size: var(--sectiondivider-lg-description-font-size);
277
+ --_divider-description-line-height: var(--sectiondivider-lg-description-line-height);
278
+ --_divider-eyebrow-font-family: var(--sectiondivider-lg-eyebrow-font-family);
279
+ --_divider-eyebrow-font-weight: var(--sectiondivider-lg-eyebrow-font-weight);
280
+ --_divider-eyebrow-font-size: var(--sectiondivider-lg-eyebrow-font-size);
281
+ --_divider-eyebrow-letter-spacing: var(--sectiondivider-lg-eyebrow-letter-spacing);
282
+ --_divider-padding-top: var(--sectiondivider-lg-padding-top, var(--sectiondivider-lg-padding));
283
+ --_divider-padding-right: var(--sectiondivider-lg-padding-right, calc(var(--sectiondivider-lg-padding) * 1.5));
284
+ --_divider-padding-bottom: var(--sectiondivider-lg-padding-bottom, var(--sectiondivider-lg-padding));
285
+ --_divider-padding-left: var(--sectiondivider-lg-padding-left, calc(var(--sectiondivider-lg-padding) * 1.5));
286
+ --_divider-radius: var(--sectiondivider-lg-radius);
287
+ --_divider-border-width: var(--sectiondivider-lg-border-width);
288
+ --_divider-shadow: var(--sectiondivider-lg-shadow);
289
+ --_divider-hairline-thickness: var(--sectiondivider-lg-hairline-thickness);
290
+ --_divider-bg: var(--sectiondivider-lg-background);
291
+ --_divider-title: var(--sectiondivider-lg-title);
292
+ --_divider-description: var(--sectiondivider-lg-description);
293
+ --_divider-eyebrow: var(--sectiondivider-lg-eyebrow);
294
+ --_divider-border: var(--sectiondivider-lg-border);
295
+ --_divider-title-outline-color: var(--sectiondivider-lg-title-outline-color);
296
+ --_divider-hairline-color: var(--sectiondivider-lg-hairline-color);
297
+ --_divider-align: var(--sectiondivider-lg-align);
298
+ --_divider-eyebrow-display: var(--sectiondivider-lg-eyebrow-display);
299
+ --_divider-description-display: var(--sectiondivider-lg-description-display);
300
+ --_divider-hairline: var(--sectiondivider-lg-hairline);
301
+ --_divider-eyebrow-text-transform: var(--sectiondivider-lg-eyebrow-text-transform);
302
+ }
303
+
304
+ .variant-md {
305
+ --_divider-title-font-family: var(--sectiondivider-md-title-font-family);
306
+ --_divider-title-font-weight: var(--sectiondivider-md-title-font-weight);
307
+ --_divider-title-font-size: var(--sectiondivider-md-title-font-size);
308
+ --_divider-title-line-height: var(--sectiondivider-md-title-line-height);
309
+ --_divider-title-letter-spacing: var(--sectiondivider-md-title-letter-spacing);
310
+ --_divider-title-outline-width: var(--sectiondivider-md-title-outline-width);
311
+ --_divider-description-font-family: var(--sectiondivider-md-description-font-family);
312
+ --_divider-description-font-weight: var(--sectiondivider-md-description-font-weight);
313
+ --_divider-description-font-size: var(--sectiondivider-md-description-font-size);
314
+ --_divider-description-line-height: var(--sectiondivider-md-description-line-height);
315
+ --_divider-eyebrow-font-family: var(--sectiondivider-md-eyebrow-font-family);
316
+ --_divider-eyebrow-font-weight: var(--sectiondivider-md-eyebrow-font-weight);
317
+ --_divider-eyebrow-font-size: var(--sectiondivider-md-eyebrow-font-size);
318
+ --_divider-eyebrow-letter-spacing: var(--sectiondivider-md-eyebrow-letter-spacing);
319
+ --_divider-padding-top: var(--sectiondivider-md-padding-top, var(--sectiondivider-md-padding));
320
+ --_divider-padding-right: var(--sectiondivider-md-padding-right, calc(var(--sectiondivider-md-padding) * 1.5));
321
+ --_divider-padding-bottom: var(--sectiondivider-md-padding-bottom, var(--sectiondivider-md-padding));
322
+ --_divider-padding-left: var(--sectiondivider-md-padding-left, calc(var(--sectiondivider-md-padding) * 1.5));
323
+ --_divider-radius: var(--sectiondivider-md-radius);
324
+ --_divider-border-width: var(--sectiondivider-md-border-width);
325
+ --_divider-shadow: var(--sectiondivider-md-shadow);
326
+ --_divider-hairline-thickness: var(--sectiondivider-md-hairline-thickness);
327
+ --_divider-bg: var(--sectiondivider-md-background);
328
+ --_divider-title: var(--sectiondivider-md-title);
329
+ --_divider-description: var(--sectiondivider-md-description);
330
+ --_divider-eyebrow: var(--sectiondivider-md-eyebrow);
331
+ --_divider-border: var(--sectiondivider-md-border);
332
+ --_divider-title-outline-color: var(--sectiondivider-md-title-outline-color);
333
+ --_divider-hairline-color: var(--sectiondivider-md-hairline-color);
334
+ --_divider-align: var(--sectiondivider-md-align);
335
+ --_divider-eyebrow-display: var(--sectiondivider-md-eyebrow-display);
336
+ --_divider-description-display: var(--sectiondivider-md-description-display);
337
+ --_divider-hairline: var(--sectiondivider-md-hairline);
338
+ --_divider-eyebrow-text-transform: var(--sectiondivider-md-eyebrow-text-transform);
339
+ }
340
+
341
+ .variant-sm {
342
+ --_divider-title-font-family: var(--sectiondivider-sm-title-font-family);
343
+ --_divider-title-font-weight: var(--sectiondivider-sm-title-font-weight);
344
+ --_divider-title-font-size: var(--sectiondivider-sm-title-font-size);
345
+ --_divider-title-line-height: var(--sectiondivider-sm-title-line-height);
346
+ --_divider-title-letter-spacing: var(--sectiondivider-sm-title-letter-spacing);
347
+ --_divider-title-outline-width: var(--sectiondivider-sm-title-outline-width);
348
+ --_divider-description-font-family: var(--sectiondivider-sm-description-font-family);
349
+ --_divider-description-font-weight: var(--sectiondivider-sm-description-font-weight);
350
+ --_divider-description-font-size: var(--sectiondivider-sm-description-font-size);
351
+ --_divider-description-line-height: var(--sectiondivider-sm-description-line-height);
352
+ --_divider-eyebrow-font-family: var(--sectiondivider-sm-eyebrow-font-family);
353
+ --_divider-eyebrow-font-weight: var(--sectiondivider-sm-eyebrow-font-weight);
354
+ --_divider-eyebrow-font-size: var(--sectiondivider-sm-eyebrow-font-size);
355
+ --_divider-eyebrow-letter-spacing: var(--sectiondivider-sm-eyebrow-letter-spacing);
356
+ --_divider-padding-top: var(--sectiondivider-sm-padding-top, var(--sectiondivider-sm-padding));
357
+ --_divider-padding-right: var(--sectiondivider-sm-padding-right, calc(var(--sectiondivider-sm-padding) * 1.5));
358
+ --_divider-padding-bottom: var(--sectiondivider-sm-padding-bottom, var(--sectiondivider-sm-padding));
359
+ --_divider-padding-left: var(--sectiondivider-sm-padding-left, calc(var(--sectiondivider-sm-padding) * 1.5));
360
+ --_divider-radius: var(--sectiondivider-sm-radius);
361
+ --_divider-border-width: var(--sectiondivider-sm-border-width);
362
+ --_divider-shadow: var(--sectiondivider-sm-shadow);
363
+ --_divider-hairline-thickness: var(--sectiondivider-sm-hairline-thickness);
364
+ --_divider-bg: var(--sectiondivider-sm-background);
365
+ --_divider-title: var(--sectiondivider-sm-title);
366
+ --_divider-description: var(--sectiondivider-sm-description);
367
+ --_divider-eyebrow: var(--sectiondivider-sm-eyebrow);
368
+ --_divider-border: var(--sectiondivider-sm-border);
369
+ --_divider-title-outline-color: var(--sectiondivider-sm-title-outline-color);
370
+ --_divider-hairline-color: var(--sectiondivider-sm-hairline-color);
371
+ --_divider-align: var(--sectiondivider-sm-align);
372
+ --_divider-eyebrow-display: var(--sectiondivider-sm-eyebrow-display);
373
+ --_divider-description-display: var(--sectiondivider-sm-description-display);
374
+ --_divider-hairline: var(--sectiondivider-sm-hairline);
375
+ --_divider-eyebrow-text-transform: var(--sectiondivider-sm-eyebrow-text-transform);
376
+ }
377
+
378
+ /* Per-element padding. Each type element (title / description / eyebrow) owns
379
+ its own padding tokens, replacing the section-level `gap`. The user gets
380
+ explicit per-side control via the editor's padding selector. Falls back
381
+ through: side var → single-value var → 0. Variant-scoped so each preset
382
+ can carry its own per-element rhythm. */
383
+ .variant-lg .title-row {
384
+ padding:
385
+ var(--sectiondivider-lg-title-padding-top, var(--sectiondivider-lg-title-padding, 0))
386
+ var(--sectiondivider-lg-title-padding-right, var(--sectiondivider-lg-title-padding, 0))
387
+ var(--sectiondivider-lg-title-padding-bottom, var(--sectiondivider-lg-title-padding, 0))
388
+ var(--sectiondivider-lg-title-padding-left, var(--sectiondivider-lg-title-padding, 0));
389
+ }
390
+ .variant-lg .description-row {
391
+ padding:
392
+ var(--sectiondivider-lg-description-padding-top, var(--sectiondivider-lg-description-padding, 0))
393
+ var(--sectiondivider-lg-description-padding-right, var(--sectiondivider-lg-description-padding, 0))
394
+ var(--sectiondivider-lg-description-padding-bottom, var(--sectiondivider-lg-description-padding, 0))
395
+ var(--sectiondivider-lg-description-padding-left, var(--sectiondivider-lg-description-padding, 0));
396
+ }
397
+ .variant-lg .divider-eyebrow {
398
+ padding:
399
+ var(--sectiondivider-lg-eyebrow-padding-top, var(--sectiondivider-lg-eyebrow-padding, 0))
400
+ var(--sectiondivider-lg-eyebrow-padding-right, var(--sectiondivider-lg-eyebrow-padding, 0))
401
+ var(--sectiondivider-lg-eyebrow-padding-bottom, var(--sectiondivider-lg-eyebrow-padding, 0))
402
+ var(--sectiondivider-lg-eyebrow-padding-left, var(--sectiondivider-lg-eyebrow-padding, 0));
403
+ }
404
+ .variant-md .title-row {
405
+ padding:
406
+ var(--sectiondivider-md-title-padding-top, var(--sectiondivider-md-title-padding, 0))
407
+ var(--sectiondivider-md-title-padding-right, var(--sectiondivider-md-title-padding, 0))
408
+ var(--sectiondivider-md-title-padding-bottom, var(--sectiondivider-md-title-padding, 0))
409
+ var(--sectiondivider-md-title-padding-left, var(--sectiondivider-md-title-padding, 0));
410
+ }
411
+ .variant-md .description-row {
412
+ padding:
413
+ var(--sectiondivider-md-description-padding-top, var(--sectiondivider-md-description-padding, 0))
414
+ var(--sectiondivider-md-description-padding-right, var(--sectiondivider-md-description-padding, 0))
415
+ var(--sectiondivider-md-description-padding-bottom, var(--sectiondivider-md-description-padding, 0))
416
+ var(--sectiondivider-md-description-padding-left, var(--sectiondivider-md-description-padding, 0));
417
+ }
418
+ .variant-md .divider-eyebrow {
419
+ padding:
420
+ var(--sectiondivider-md-eyebrow-padding-top, var(--sectiondivider-md-eyebrow-padding, 0))
421
+ var(--sectiondivider-md-eyebrow-padding-right, var(--sectiondivider-md-eyebrow-padding, 0))
422
+ var(--sectiondivider-md-eyebrow-padding-bottom, var(--sectiondivider-md-eyebrow-padding, 0))
423
+ var(--sectiondivider-md-eyebrow-padding-left, var(--sectiondivider-md-eyebrow-padding, 0));
424
+ }
425
+ .variant-sm .title-row {
426
+ padding:
427
+ var(--sectiondivider-sm-title-padding-top, var(--sectiondivider-sm-title-padding, 0))
428
+ var(--sectiondivider-sm-title-padding-right, var(--sectiondivider-sm-title-padding, 0))
429
+ var(--sectiondivider-sm-title-padding-bottom, var(--sectiondivider-sm-title-padding, 0))
430
+ var(--sectiondivider-sm-title-padding-left, var(--sectiondivider-sm-title-padding, 0));
431
+ }
432
+ .variant-sm .description-row {
433
+ padding:
434
+ var(--sectiondivider-sm-description-padding-top, var(--sectiondivider-sm-description-padding, 0))
435
+ var(--sectiondivider-sm-description-padding-right, var(--sectiondivider-sm-description-padding, 0))
436
+ var(--sectiondivider-sm-description-padding-bottom, var(--sectiondivider-sm-description-padding, 0))
437
+ var(--sectiondivider-sm-description-padding-left, var(--sectiondivider-sm-description-padding, 0));
438
+ }
439
+ .variant-sm .divider-eyebrow {
440
+ padding:
441
+ var(--sectiondivider-sm-eyebrow-padding-top, var(--sectiondivider-sm-eyebrow-padding, 0))
442
+ var(--sectiondivider-sm-eyebrow-padding-right, var(--sectiondivider-sm-eyebrow-padding, 0))
443
+ var(--sectiondivider-sm-eyebrow-padding-bottom, var(--sectiondivider-sm-eyebrow-padding, 0))
444
+ var(--sectiondivider-sm-eyebrow-padding-left, var(--sectiondivider-sm-eyebrow-padding, 0));
445
+ }
446
+
447
+ /* Title rendered as a single <text> through a feMorphology dilate + flood +
448
+ composite filter. Dilating the alpha treats all glyphs as one combined
449
+ shape, so neighbor-glyph overlaps (CQ, AC etc.) merge into a single
450
+ outline instead of double-stacking. */
451
+ svg.divider-label {
452
+ display: block;
453
+ overflow: visible;
454
+ color: var(--_divider-title);
455
+ }
456
+ svg.divider-label text {
457
+ font-family: var(--_divider-title-font-family);
458
+ font-weight: var(--_divider-title-font-weight);
459
+ font-size: var(--_divider-title-font-size);
460
+ letter-spacing: var(--_divider-title-letter-spacing);
461
+ fill: currentColor;
462
+ }
463
+
464
+ .title-row {
465
+ display: flex;
466
+ width: 100%;
467
+ justify-content: var(--_divider-justify);
468
+ align-items: center;
469
+ gap: 0.75em;
470
+ }
471
+ .title-inline {
472
+ display: inline-flex;
473
+ }
474
+
475
+ /* Eyebrow visibility + uppercase flow from per-variant CSS vars. */
476
+ .divider-eyebrow {
477
+ display: var(--_divider-eyebrow-display);
478
+ font-family: var(--_divider-eyebrow-font-family);
479
+ font-weight: var(--_divider-eyebrow-font-weight);
480
+ font-size: var(--_divider-eyebrow-font-size);
481
+ letter-spacing: var(--_divider-eyebrow-letter-spacing);
482
+ color: var(--_divider-eyebrow);
483
+ text-transform: var(--_divider-eyebrow-text-transform);
484
+ }
485
+
486
+ /* Description visibility from the per-variant `description-display` var.
487
+ The row keeps its flex layout when shown; `none` removes it from the
488
+ flow entirely. */
489
+ .description-row {
490
+ display: var(--_divider-description-display);
491
+ width: 100%;
492
+ justify-content: var(--_divider-justify);
493
+ align-items: center;
494
+ gap: 0.75em;
495
+ }
496
+ .description-inline {
497
+ display: inline-flex;
498
+ }
499
+ .divider-description {
500
+ margin: 0;
501
+ font-family: var(--_divider-description-font-family);
502
+ font-weight: var(--_divider-description-font-weight);
503
+ font-size: var(--_divider-description-font-size);
504
+ line-height: var(--_divider-description-line-height);
505
+ color: var(--_divider-description);
506
+ font-style: italic;
507
+ }
508
+
509
+ /* Hairlines: all six render unconditionally; container style queries
510
+ reveal exactly one per the variant's `--_divider-hairline` value. */
511
+ .sd-hairline {
512
+ display: none;
513
+ background: var(--_divider-hairline-color);
514
+ height: var(--_divider-hairline-thickness);
515
+ }
516
+ .sd-hairline--row {
517
+ width: 100%;
518
+ }
519
+ .sd-hairline--side {
520
+ flex: 1;
521
+ min-width: 0;
522
+ }
523
+
524
+ @container sd style(--_divider-hairline: above-label) {
525
+ .sd-hairline-above-label { display: block; }
526
+ }
527
+ @container sd style(--_divider-hairline: through-label) {
528
+ .sd-hairline-through-label { display: block; }
529
+ }
530
+ @container sd style(--_divider-hairline: below-label) {
531
+ .sd-hairline-below-label { display: block; }
532
+ }
533
+ @container sd style(--_divider-hairline: above-description) {
534
+ .sd-hairline-above-description { display: block; }
535
+ }
536
+ @container sd style(--_divider-hairline: through-description) {
537
+ .sd-hairline-through-description { display: block; }
538
+ }
539
+ @container sd style(--_divider-hairline: below-description) {
540
+ .sd-hairline-below-description { display: block; }
541
+ }
542
+
543
+ /* When description is hidden, any description-targeted hairline is hidden
544
+ too — the gap follows the description. No editor-side snap logic needed. */
545
+ @container sd style(--_divider-description-display: none) {
546
+ .sd-hairline-above-description,
547
+ .sd-hairline-through-description,
548
+ .sd-hairline-below-description { display: none; }
549
+ }
550
+
551
+ /* In start alignment the text hugs the left edge, so the leading side
552
+ hairline would have zero width — hide it and let the trailing one
553
+ stretch to the right edge. Container style query rather than a class. */
554
+ @container sd style(--_divider-align: start) {
555
+ .title-row .sd-hairline--side:first-child,
556
+ .description-row .sd-hairline--side:first-child {
557
+ display: none;
558
+ }
559
+ }
560
+ </style>