@refrakt-md/lumina 0.21.0 → 0.23.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 (131) hide show
  1. package/base.css +2 -1
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +7 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/tokens.d.ts +5 -3
  6. package/dist/tokens.d.ts.map +1 -1
  7. package/dist/tokens.js +44 -3
  8. package/dist/tokens.js.map +1 -1
  9. package/index.css +11 -1
  10. package/package.json +7 -5
  11. package/styles/base/attributes.css +6 -7
  12. package/styles/dimensions/checklist.css +7 -36
  13. package/styles/dimensions/cover.css +13 -95
  14. package/styles/dimensions/density.css +6 -3
  15. package/styles/dimensions/frame.css +7 -4
  16. package/styles/dimensions/media.css +14 -61
  17. package/styles/dimensions/metadata.css +30 -80
  18. package/styles/dimensions/sections.css +16 -30
  19. package/styles/dimensions/sequence.css +17 -82
  20. package/styles/dimensions/state.css +39 -56
  21. package/styles/dimensions/substrate.css +3 -0
  22. package/styles/dimensions/surfaces.css +73 -113
  23. package/styles/elements/blockquote.css +3 -2
  24. package/styles/elements/code.css +3 -0
  25. package/styles/elements/table.css +3 -0
  26. package/styles/global.css +24 -63
  27. package/styles/layouts/blog.css +34 -95
  28. package/styles/layouts/default.css +12 -86
  29. package/styles/layouts/docs.css +9 -159
  30. package/styles/layouts/mobile.css +3 -52
  31. package/styles/layouts/on-this-page.css +8 -7
  32. package/styles/layouts/plan.css +27 -158
  33. package/styles/layouts/search.css +17 -82
  34. package/styles/layouts/split.css +24 -169
  35. package/styles/layouts/theme-toggle.css +3 -29
  36. package/styles/layouts/version-switcher.css +9 -10
  37. package/styles/runes/accordion.css +25 -68
  38. package/styles/runes/aggregate.css +4 -13
  39. package/styles/runes/annotate.css +11 -40
  40. package/styles/runes/api.css +4 -1
  41. package/styles/runes/audio.css +12 -50
  42. package/styles/runes/badge.css +5 -2
  43. package/styles/runes/bar.css +3 -0
  44. package/styles/runes/bento.css +18 -161
  45. package/styles/runes/bg.css +3 -37
  46. package/styles/runes/blog.css +18 -20
  47. package/styles/runes/bond.css +6 -26
  48. package/styles/runes/breadcrumb.css +7 -15
  49. package/styles/runes/budget.css +23 -45
  50. package/styles/runes/bug.css +5 -2
  51. package/styles/runes/card.css +27 -95
  52. package/styles/runes/cast.css +10 -27
  53. package/styles/runes/changelog.css +13 -17
  54. package/styles/runes/character.css +6 -20
  55. package/styles/runes/chart.css +15 -57
  56. package/styles/runes/codegroup.css +18 -26
  57. package/styles/runes/collection.css +8 -85
  58. package/styles/runes/compare.css +8 -19
  59. package/styles/runes/comparison.css +29 -56
  60. package/styles/runes/conversation.css +9 -31
  61. package/styles/runes/cta.css +17 -40
  62. package/styles/runes/datatable.css +33 -48
  63. package/styles/runes/decision.css +5 -2
  64. package/styles/runes/design-context.css +5 -4
  65. package/styles/runes/details.css +9 -17
  66. package/styles/runes/diagram.css +8 -16
  67. package/styles/runes/diff.css +11 -94
  68. package/styles/runes/drawer.css +9 -113
  69. package/styles/runes/embed.css +5 -13
  70. package/styles/runes/event.css +5 -3
  71. package/styles/runes/expand.css +10 -45
  72. package/styles/runes/faction.css +6 -12
  73. package/styles/runes/feature.css +15 -43
  74. package/styles/runes/figure.css +7 -26
  75. package/styles/runes/file-ref.css +3 -18
  76. package/styles/runes/form.css +19 -48
  77. package/styles/runes/gallery.css +8 -140
  78. package/styles/runes/grid.css +4 -56
  79. package/styles/runes/hero.css +28 -140
  80. package/styles/runes/hint.css +23 -48
  81. package/styles/runes/howto.css +9 -31
  82. package/styles/runes/itinerary.css +15 -44
  83. package/styles/runes/juxtapose.css +17 -92
  84. package/styles/runes/lore.css +7 -14
  85. package/styles/runes/map.css +9 -42
  86. package/styles/runes/mediatext.css +4 -45
  87. package/styles/runes/milestone.css +15 -28
  88. package/styles/runes/mockup.css +10 -115
  89. package/styles/runes/nav.css +37 -212
  90. package/styles/runes/organization.css +6 -5
  91. package/styles/runes/page-section.css +3 -4
  92. package/styles/runes/pagination.css +10 -42
  93. package/styles/runes/palette.css +16 -35
  94. package/styles/runes/placeholder.css +16 -0
  95. package/styles/runes/plan-history.css +23 -43
  96. package/styles/runes/plan-progress.css +6 -7
  97. package/styles/runes/plan-ref.css +4 -1
  98. package/styles/runes/playlist.css +10 -44
  99. package/styles/runes/plot.css +9 -25
  100. package/styles/runes/preview.css +9 -34
  101. package/styles/runes/pricing.css +23 -41
  102. package/styles/runes/progress.css +8 -27
  103. package/styles/runes/pullquote.css +9 -31
  104. package/styles/runes/realm.css +6 -12
  105. package/styles/runes/recipe.css +12 -36
  106. package/styles/runes/relationships.css +5 -36
  107. package/styles/runes/reveal.css +17 -22
  108. package/styles/runes/sandbox.css +9 -39
  109. package/styles/runes/section.css +10 -24
  110. package/styles/runes/showcase.css +3 -20
  111. package/styles/runes/sidenote.css +5 -4
  112. package/styles/runes/snippet.css +3 -0
  113. package/styles/runes/spacing.css +14 -33
  114. package/styles/runes/spec.css +5 -2
  115. package/styles/runes/steps.css +14 -46
  116. package/styles/runes/storyboard.css +4 -19
  117. package/styles/runes/swatch.css +4 -7
  118. package/styles/runes/symbol.css +16 -14
  119. package/styles/runes/tabs.css +15 -18
  120. package/styles/runes/testimonial.css +12 -13
  121. package/styles/runes/textblock.css +6 -24
  122. package/styles/runes/timeline.css +10 -28
  123. package/styles/runes/tint.css +3 -0
  124. package/styles/runes/toc.css +9 -7
  125. package/styles/runes/track.css +12 -41
  126. package/styles/runes/typography.css +15 -27
  127. package/styles/runes/work.css +5 -2
  128. package/styles/runes/xref.css +3 -1
  129. package/tokens/base.css +56 -66
  130. package/tokens/dark.css +79 -80
  131. package/styles/dimensions/guest-posture.css +0 -27
@@ -1,50 +1,34 @@
1
- /* Chart */
1
+ @layer skin {
2
+ /* Chart — skin. The chart block, responsive SVG/container, legend flex, swatch box,
3
+ * and the sr-only rendered data table live in @refrakt-md/skeleton
4
+ * (styles/runes/chart.css). What remains is the --rf-chart-* theming contract, SVG
5
+ * paint, palette rotation, data-table chrome, and type. */
2
6
  .rf-chart {
3
- /* ─── Theming contract (SPEC-083 / WORK-353) ───
4
- * Every paint + geometry value the renderer uses is one of these
5
- * `--rf-chart-*` properties; a theme overrides any of them (here, on a tint
6
- * scope, or inline) with no renderer or selector changes. A non-CSS provider
7
- * (canvas) reads the same props via getComputedStyle. */
8
-
9
- /* Series palette — a dedicated categorical palette, deliberately distinct
10
- * from the semantic status tokens (those are reserved for sentiment mode). */
11
7
  --rf-chart-series-1: #6366f1;
12
8
  --rf-chart-series-2: #06b6d4;
13
9
  --rf-chart-series-3: #22c55e;
14
10
  --rf-chart-series-4: #f59e0b;
15
11
  --rf-chart-series-5: #a855f7;
16
12
  --rf-chart-series-6: #ec4899;
17
-
18
- /* Geometry (layout values the renderer reads via getComputedStyle). */
19
- --rf-chart-bar-ratio: 0.75; /* bar width as a fraction of its slot */
20
- --rf-chart-bar-thickness: 48px; /* max bar width cap */
21
- --rf-chart-bar-gap: 0.15; /* slot fraction reserved as inter-group gap */
13
+ --rf-chart-bar-ratio: 0.75;
14
+ --rf-chart-bar-thickness: 48px;
15
+ --rf-chart-bar-gap: 0.15;
22
16
  --rf-chart-bar-radius: 2px;
23
17
  --rf-chart-point-radius: 4px;
24
18
  --rf-chart-line-width: 2px;
25
-
26
- /* Typography / grid (paint values applied by CSS below). */
27
19
  --rf-chart-label-size: 12px;
28
20
  --rf-chart-label-color: var(--rf-color-muted);
29
21
  --rf-chart-grid-color: var(--rf-color-border);
30
22
  --rf-chart-grid-width: 1px;
31
-
32
- display: block;
33
23
  border-radius: var(--rf-radius-lg);
34
24
  padding: 1.5rem;
35
25
  margin: 0;
36
26
  }
37
-
38
- /* ─── SVG paint — driven entirely by the contract (the renderer sets no inline
39
- * fill/stroke; it only tags elements with a class + data-series + optional
40
- * data-meta-sentiment). ─── */
41
27
  .rf-chart__axis { stroke: var(--rf-chart-grid-color); stroke-width: var(--rf-chart-grid-width); }
42
28
  .rf-chart__label { fill: var(--rf-chart-label-color); font-size: var(--rf-chart-label-size); }
43
29
  .rf-chart__bar { rx: var(--rf-chart-bar-radius); fill: var(--rf-chart-series-1); }
44
30
  .rf-chart__point { fill: var(--rf-chart-series-1); }
45
31
  .rf-chart__line { fill: none; stroke: var(--rf-chart-series-1); stroke-width: var(--rf-chart-line-width); }
46
-
47
- /* Series palette rotation (data-series 0 is the default above). */
48
32
  .rf-chart__bar[data-series="1"], .rf-chart__point[data-series="1"] { fill: var(--rf-chart-series-2); }
49
33
  .rf-chart__bar[data-series="2"], .rf-chart__point[data-series="2"] { fill: var(--rf-chart-series-3); }
50
34
  .rf-chart__bar[data-series="3"], .rf-chart__point[data-series="3"] { fill: var(--rf-chart-series-4); }
@@ -55,11 +39,6 @@
55
39
  .rf-chart__line[data-series="3"] { stroke: var(--rf-chart-series-4); }
56
40
  .rf-chart__line[data-series="4"] { stroke: var(--rf-chart-series-5); }
57
41
  .rf-chart__line[data-series="5"] { stroke: var(--rf-chart-series-6); }
58
-
59
- /* Sentiment colouring — a data cell carrying `data-meta-sentiment` overrides the
60
- * rotating palette with the semantic token (the roadmap chart renders green-done
61
- * / red-blocked with no per-chart config). After the palette so it wins at equal
62
- * specificity. */
63
42
  .rf-chart__bar[data-meta-sentiment="positive"], .rf-chart__point[data-meta-sentiment="positive"] { fill: var(--rf-color-success); }
64
43
  .rf-chart__bar[data-meta-sentiment="negative"], .rf-chart__point[data-meta-sentiment="negative"] { fill: var(--rf-color-danger); }
65
44
  .rf-chart__bar[data-meta-sentiment="caution"], .rf-chart__point[data-meta-sentiment="caution"] { fill: var(--rf-color-warning); }
@@ -68,17 +47,13 @@
68
47
  .rf-chart__line[data-meta-sentiment="negative"] { stroke: var(--rf-color-danger); }
69
48
  .rf-chart__line[data-meta-sentiment="caution"] { stroke: var(--rf-color-warning); }
70
49
  .rf-chart__line[data-meta-sentiment="neutral"] { stroke: var(--rf-color-muted); }
71
-
72
- /* Data table — the no-JS / screen-reader source of truth. Visible as the
73
- * fallback; visually-hidden (but kept for assistive tech) once rf-chart has
74
- * rendered the svg. */
75
50
  .rf-chart__data {
76
51
  width: 100%;
77
52
  border-collapse: collapse;
78
- font-size: 0.875rem;
53
+ font-size: var(--rf-text-sm);
79
54
  }
80
55
  .rf-chart__data caption {
81
- font-weight: 600;
56
+ font-weight: var(--rf-weight-semibold);
82
57
  margin-bottom: 0.75rem;
83
58
  }
84
59
  .rf-chart__data th,
@@ -87,41 +62,22 @@
87
62
  padding: 0.375rem 0.625rem;
88
63
  text-align: left;
89
64
  }
90
- .rf-chart[data-rendered] .rf-chart__data {
91
- position: absolute;
92
- width: 1px;
93
- height: 1px;
94
- padding: 0;
95
- margin: -1px;
96
- overflow: hidden;
97
- clip: rect(0, 0, 0, 0);
98
- white-space: nowrap;
99
- border: 0;
100
- }
101
65
  .rf-chart__title {
102
- font-weight: 600;
103
- font-size: 1rem;
66
+ font-weight: var(--rf-weight-semibold);
67
+ font-size: var(--rf-text);
104
68
  margin-bottom: 1rem;
105
69
  text-align: center;
106
70
  }
107
- .rf-chart__container { width: 100%; }
108
- .rf-chart__svg { width: 100%; height: auto; }
109
71
  .rf-chart__legend {
110
- display: flex;
111
- justify-content: center;
112
72
  gap: 1rem;
113
73
  margin-top: 1rem;
114
74
  }
115
75
  .rf-chart__legend-item {
116
- display: flex;
117
- align-items: center;
118
76
  gap: 0.375rem;
119
- font-size: 0.8125rem;
77
+ font-size: var(--rf-text-sm);
120
78
  color: var(--rf-color-muted);
121
79
  }
122
80
  .rf-chart__legend-color {
123
- width: 12px;
124
- height: 12px;
125
81
  border-radius: 2px;
126
82
  background: var(--rf-chart-series-1);
127
83
  }
@@ -130,3 +86,5 @@
130
86
  .rf-chart__legend-color[data-series="3"] { background: var(--rf-chart-series-4); }
131
87
  .rf-chart__legend-color[data-series="4"] { background: var(--rf-chart-series-5); }
132
88
  .rf-chart__legend-color[data-series="5"] { background: var(--rf-chart-series-6); }
89
+
90
+ }
@@ -1,21 +1,22 @@
1
- /* Code Group
1
+ @layer skin {
2
+ /* Code Group — skin.
2
3
  *
3
4
  * Chrome (the wrapper + topbar + tabs) uses `--rf-color-surface` so it
4
5
  * reads against the page in both light and dark modes. The code areas
5
- * themselves inherit `--rf-color-code-bg` from the global `pre` rule, so
6
- * code stays on its own background even when the surrounding chrome
7
- * flips with the page mode. */
6
+ * themselves inherit `--rf-color-code-bg` from the global `pre` rule.
7
+ *
8
+ * The wrapper clip, topbar flex, list reset, the scrollable tab strip, and the
9
+ * tab flex live in @refrakt-md/skeleton (styles/runes/codegroup.css). The pre/code
10
+ * rules stay here in skin: they deliberately override elements/code.css by source
11
+ * order (the `data-overflow="wrap"` reset especially). */
8
12
  .rf-codegroup {
9
13
  border: 1px solid var(--rf-color-border);
10
- overflow: hidden;
11
14
  background: var(--rf-color-surface);
12
15
  color: var(--rf-color-text);
13
16
  box-shadow: var(--rf-shadow-md);
14
17
  padding: 0;
15
18
  }
16
19
  .rf-codegroup__topbar {
17
- display: flex;
18
- align-items: center;
19
20
  gap: 0.375rem;
20
21
  padding: 0.75rem 1rem;
21
22
  background: transparent;
@@ -24,9 +25,7 @@
24
25
  }
25
26
  /* Window chrome — three traffic-light dots painted as gradients on one
26
27
  * pseudo-element. The element reserves real width (three 10px dots, 1rem
27
- * apart) so the flex row spaces the title clear of the dots box-shadow
28
- * dots take no layout space and overlapped the title. Pure decoration, so
29
- * it lives entirely in CSS (no markup). */
28
+ * apart) so the flex row spaces the title clear of the dots. Pure decoration. */
30
29
  .rf-codegroup__topbar::before {
31
30
  content: '';
32
31
  flex: 0 0 auto;
@@ -42,26 +41,21 @@
42
41
  /* Filename title — the topbar bar's lone `code` field. */
43
42
  .rf-codegroup__topbar [data-meta-type="code"] {
44
43
  margin-left: 0.5rem;
45
- font-size: 0.8rem;
44
+ font-size: var(--rf-text-xs);
46
45
  font-weight: normal;
47
46
  color: var(--rf-color-muted);
48
47
  }
49
48
  .rf-codegroup ul {
50
- list-style: none;
51
49
  padding: 0;
52
50
  margin: 0;
53
51
  }
54
52
  .rf-codegroup__tabs {
55
- display: flex;
56
53
  background: transparent;
57
54
  border-bottom: 1px solid var(--rf-color-border);
58
- overflow-x: auto;
59
- overflow-y: hidden;
60
55
  }
61
56
  .rf-codegroup__tab {
62
- flex: 0 0 auto;
63
57
  padding: 0.5rem 1rem;
64
- font-size: 0.8rem;
58
+ font-size: var(--rf-text-xs);
65
59
  font-family: var(--rf-font-mono);
66
60
  color: var(--rf-color-muted);
67
61
  background: none;
@@ -95,7 +89,7 @@
95
89
  }
96
90
  .rf-codegroup code {
97
91
  font-family: var(--rf-font-mono);
98
- font-size: 0.85rem;
92
+ font-size: var(--rf-text-sm);
99
93
  }
100
94
  /* Overflow modes */
101
95
  .rf-codegroup[data-overflow="wrap"] pre {
@@ -104,14 +98,10 @@
104
98
  overflow-x: hidden;
105
99
  }
106
100
  /* WORK-304 — the standalone codeblock CSS at `elements/code.css`
107
- * sets `display: grid; min-width: max-content` on `pre code` so
108
- * row tints + line numbers extend across the horizontal scroll
109
- * region. That sizing actively prevents wrapping (the code track
110
- * is locked at max-content). Inside `overflow="wrap"` codegroups
111
- * we WANT wrapping, so revert the code element back to a plain
112
- * block with no min-width constraint. Lines stay block-flow so
113
- * Shiki's `<span class="line">` children wrap with the pre's
114
- * `white-space: pre-wrap`. */
101
+ * sets `display: grid; min-width: max-content` on `pre code`. Inside
102
+ * `overflow="wrap"` codegroups we WANT wrapping, so revert the code element
103
+ * back to a plain block with no min-width constraint. This must stay skin —
104
+ * it overrides elements/code.css (also skin) by source order + specificity. */
115
105
  .rf-codegroup[data-overflow="wrap"] pre code {
116
106
  display: block;
117
107
  min-width: 0;
@@ -119,3 +109,5 @@
119
109
  .rf-codegroup[data-overflow="hide"] pre {
120
110
  overflow-x: hidden;
121
111
  }
112
+
113
+ }
@@ -1,166 +1,89 @@
1
- /* Collection — list / grid / table / cards of registry entities (SPEC-070).
2
- *
3
- * The block is layout-agnostic; the `data-layout` attribute on the wrapper
4
- * selects the arrangement. Built-in items carry `.rf-collection__card` /
5
- * `__item`; a body template emits its own markup inside `.rf-collection__item`.
6
- */
7
-
1
+ @layer skin {
2
+ /* Collection — skin. The list/grid arrangement, card flex column, and block-item
3
+ * display reset live in @refrakt-md/skeleton (styles/runes/collection.css). */
8
4
  .rf-collection {
9
5
  margin: var(--rf-spacing-md) 0;
10
6
  }
11
-
12
- /* Preamble — rendered above items only when the query is non-empty, so a
13
- * heading/intro can live inside the rune and vanish with an empty section. */
14
7
  .rf-collection__preamble > :first-child { margin-top: 0; }
15
-
16
- /* Empty state — shown in place of items when the query yields nothing. */
17
8
  .rf-collection__empty {
18
9
  color: var(--rf-color-muted);
19
10
  font-size: 0.9375em;
20
11
  }
21
-
22
12
  .rf-collection__items {
23
- display: flex;
24
- flex-direction: column;
25
13
  gap: var(--rf-spacing-sm);
26
14
  }
27
-
28
- /* grid arranges items into responsive columns; list stays a stacked flow.
29
- * Item chrome (a card box, bare row, …) comes from the item, not the layout. */
30
15
  .rf-collection[data-layout='grid'] .rf-collection__items {
31
- display: grid;
32
- grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
33
16
  gap: var(--rf-spacing-md);
34
- align-items: stretch;
35
- }
36
-
37
- /* Uniform heights per row: grid stretches each item to the tallest in its row;
38
- * a body-template item then lets its card fill that stretched height. */
39
- .rf-collection[data-layout='grid'] .rf-collection__item {
40
- display: flex;
41
17
  }
42
- .rf-collection[data-layout='grid'] .rf-collection__item > * {
43
- flex: 1;
44
- min-width: 0;
45
- }
46
-
47
- /* Grouped grid: the grid belongs to each group (its items are the cells), not
48
- * to __items — whose children are the group blocks (heading groups) or the
49
- * accordion wrapper. Left on __items, each group becomes a single cell, i.e. a
50
- * column per group. So when __items holds groups it stacks them, and each
51
- * group becomes the grid instead, with the group title spanning every column. */
52
18
  .rf-collection[data-layout='grid'] .rf-collection__items:has(.rf-collection__group),
53
19
  .rf-collection[data-layout='grid'] .rf-collection__items:has(.rf-accordion) {
54
- display: flex;
55
- flex-direction: column;
56
20
  gap: var(--rf-spacing-md);
57
21
  }
58
22
  .rf-collection[data-layout='grid'] .rf-collection__group {
59
- display: grid;
60
- grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
61
23
  gap: var(--rf-spacing-md);
62
- align-items: stretch;
63
24
  }
64
- .rf-collection[data-layout='grid'] .rf-collection__group-title {
65
- grid-column: 1 / -1;
66
- }
67
-
68
- .rf-collection__item {
69
- min-width: 0;
70
- }
71
-
72
25
  .rf-collection__card {
73
- display: flex;
74
- flex-direction: column;
75
26
  gap: var(--rf-spacing-xs);
76
27
  padding: var(--rf-spacing-md);
77
28
  border: 1px solid var(--rf-color-border);
78
29
  border-radius: var(--rf-radius-md);
79
30
  background: var(--rf-color-surface);
80
31
  }
81
-
82
32
  .rf-collection__card:hover {
83
33
  background: var(--rf-color-surface-hover);
84
34
  }
85
-
86
35
  .rf-collection__title {
87
- font-weight: 600;
36
+ font-weight: var(--rf-weight-semibold);
88
37
  color: var(--rf-color-text);
89
38
  text-decoration: none;
90
39
  }
91
-
92
40
  .rf-collection__title:hover {
93
41
  color: var(--rf-color-primary);
94
42
  }
95
-
96
43
  .rf-collection__field {
97
44
  font-size: 0.875em;
98
45
  color: var(--rf-color-muted);
99
46
  }
100
-
101
- /* grouping */
102
47
  .rf-collection__group {
103
48
  margin-top: var(--rf-spacing-md);
104
- display: flex;
105
- flex-direction: column;
106
49
  /* Tight default for short item rows (the built-in title link, no body). */
107
50
  gap: var(--rf-spacing-xs);
108
51
  }
109
- /* Modestly roomier when items carry a body template (block content — a card,
110
- * callout, list, …), so they don't collide. Body-template items are marked
111
- * `data-block` by the resolver; the built-in inline title rows are not.
112
- * Mirrors the rf-relationships rule. */
113
52
  .rf-collection__group:has(.rf-collection__item[data-block]) {
114
53
  gap: var(--rf-spacing-sm);
115
54
  }
116
-
117
- /* Block-content item — let the body template (card / callout / etc.) fill the
118
- * container instead of shrink-fitting. No-op in grid mode (items there are
119
- * already `display: flex` with `flex: 1` on the child). Trim the outer margins
120
- * of the template's first/last block so the group `gap` controls inter-item
121
- * spacing — works for any block content, not a wrapper element. */
122
- .rf-collection__item[data-block] {
123
- display: block;
124
- }
125
55
  .rf-collection__item[data-block] > :first-child {
126
56
  margin-top: 0;
127
57
  }
128
58
  .rf-collection__item[data-block] > :last-child {
129
59
  margin-bottom: 0;
130
60
  }
131
-
132
61
  .rf-collection__group-title {
133
62
  margin: 0 0 var(--rf-spacing-sm);
134
63
  font-size: 0.875em;
135
64
  text-transform: uppercase;
136
- letter-spacing: 0.05em;
65
+ letter-spacing: var(--rf-tracking-wider);
137
66
  color: var(--rf-color-muted);
138
67
  }
139
-
140
68
  /* table layout */
141
69
  .rf-collection__table {
142
70
  width: 100%;
143
71
  border-collapse: collapse;
144
72
  }
145
-
146
73
  .rf-collection__table th,
147
74
  .rf-collection__table td {
148
75
  padding: var(--rf-spacing-sm);
149
76
  text-align: left;
150
77
  border-bottom: 1px solid var(--rf-color-border);
151
78
  }
152
-
153
79
  .rf-collection__table th {
154
80
  font-size: 0.875em;
155
81
  text-transform: uppercase;
156
- letter-spacing: 0.05em;
82
+ letter-spacing: var(--rf-tracking-wider);
157
83
  color: var(--rf-color-muted);
158
84
  }
159
-
160
- /* Heading-template cells (`layout="table"` body) wrap their content as
161
- * markdown paragraphs, which pick up the global `p { margin-bottom: 1rem }`
162
- * and leave dead space inside each row. Drop it inside the table — table
163
- * cells don't want paragraph spacing. */
164
85
  .rf-collection__table td p {
165
86
  margin: 0;
166
87
  }
88
+
89
+ }
@@ -1,30 +1,18 @@
1
+ @layer skin {
1
2
  /* Compare */
2
3
  .rf-compare {
3
4
  border: 1px solid var(--rf-color-border);
4
5
  border-radius: var(--rf-radius-md);
5
- overflow: hidden;
6
6
  }
7
7
  .rf-compare__header {
8
8
  padding: 0.5rem 1rem;
9
9
  font-family: var(--rf-font-sans);
10
- font-size: 0.75rem;
11
- font-weight: 600;
10
+ font-size: var(--rf-text-xs);
11
+ font-weight: var(--rf-weight-semibold);
12
12
  color: var(--rf-color-muted);
13
13
  background: var(--rf-color-surface);
14
14
  border-bottom: 1px solid var(--rf-color-border);
15
15
  }
16
- .rf-compare--side-by-side .rf-compare__panels {
17
- display: grid;
18
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
19
- }
20
- .rf-compare--stacked .rf-compare__panels {
21
- display: flex;
22
- flex-direction: column;
23
- }
24
- .rf-compare [data-panel] {
25
- min-width: 0;
26
- overflow: auto;
27
- }
28
16
  .rf-compare--side-by-side [data-panel] + [data-panel] {
29
17
  border-left: 1px solid var(--rf-color-border);
30
18
  }
@@ -32,12 +20,11 @@
32
20
  border-top: 1px solid var(--rf-color-border);
33
21
  }
34
22
  .rf-compare [data-label] {
35
- display: block;
36
23
  padding: 0.5rem 1rem;
37
- font-size: 0.75rem;
38
- font-weight: 600;
24
+ font-size: var(--rf-text-xs);
25
+ font-weight: var(--rf-weight-semibold);
39
26
  text-transform: uppercase;
40
- letter-spacing: 0.05em;
27
+ letter-spacing: var(--rf-tracking-wider);
41
28
  color: var(--rf-color-muted);
42
29
  background: var(--rf-color-surface);
43
30
  border-bottom: 1px solid var(--rf-color-border);
@@ -50,3 +37,5 @@
50
37
  border: none;
51
38
  border-radius: 0;
52
39
  }
40
+
41
+ }
@@ -1,39 +1,26 @@
1
- /* Comparison */
1
+ @layer skin {
2
+ /* Comparison — skin. The grid passthroughs, scroll/sticky geometry, cards grid,
3
+ * card flex + badge positioning, and metadata hiding live in @refrakt-md/skeleton
4
+ * (styles/runes/comparison.css). */
2
5
  .rf-comparison {
3
6
  margin: 2rem 0;
4
7
  }
5
- .rf-comparison__grid {
6
- display: contents;
7
- }
8
- .rf-comparison-column__body,
9
- .rf-comparison-row__body {
10
- display: contents;
11
- }
12
8
  .rf-comparison__title {
13
9
  text-align: center;
14
10
  margin: 0 0 1.5rem;
15
- font-size: 1.5rem;
16
- font-weight: 700;
11
+ font-size: var(--rf-text-2xl);
12
+ font-weight: var(--rf-weight-bold);
17
13
  color: var(--rf-color-text);
18
14
  }
19
- .rf-comparison > meta,
20
- .rf-comparison > span[property] { display: none; }
21
15
  /* Table layout */
22
16
  .rf-comparison__table-wrapper {
23
- overflow-x: auto;
24
- -webkit-overflow-scrolling: touch;
25
17
  margin: 0 -1rem;
26
18
  padding: 0 1rem;
27
19
  }
28
20
  .rf-comparison__table {
29
21
  width: 100%;
30
22
  border-collapse: collapse;
31
- font-size: 0.9375rem;
32
- }
33
- .rf-comparison__table thead {
34
- position: sticky;
35
- top: 0;
36
- z-index: 1;
23
+ font-size: var(--rf-text);
37
24
  }
38
25
  .rf-comparison__table th,
39
26
  .rf-comparison__table td {
@@ -43,8 +30,8 @@
43
30
  }
44
31
  .rf-comparison__table thead th {
45
32
  background: var(--rf-color-bg);
46
- font-weight: 700;
47
- font-size: 1rem;
33
+ font-weight: var(--rf-weight-bold);
34
+ font-size: var(--rf-text);
48
35
  color: var(--rf-color-text);
49
36
  border-bottom: 2px solid var(--rf-color-border);
50
37
  vertical-align: bottom;
@@ -54,20 +41,18 @@
54
41
  border-bottom-color: var(--rf-color-primary);
55
42
  }
56
43
  .rf-comparison__recommended-badge {
57
- display: block;
58
- font-size: 0.6875rem;
59
- font-weight: 600;
44
+ font-size: var(--rf-text-xs);
45
+ font-weight: var(--rf-weight-semibold);
60
46
  text-transform: uppercase;
61
- letter-spacing: 0.05em;
47
+ letter-spacing: var(--rf-tracking-wider);
62
48
  color: var(--rf-color-primary);
63
49
  margin-top: 0.25rem;
64
50
  }
65
51
  .rf-comparison__label-col {
66
- width: 1%;
67
52
  white-space: nowrap;
68
53
  }
69
54
  .rf-comparison__row-label {
70
- font-weight: 600;
55
+ font-weight: var(--rf-weight-semibold);
71
56
  color: var(--rf-color-text);
72
57
  white-space: nowrap;
73
58
  background: var(--rf-color-bg);
@@ -79,8 +64,7 @@
79
64
  .rf-comparison__cell--highlighted {
80
65
  background: color-mix(in srgb, var(--rf-color-primary) 3%, transparent);
81
66
  }
82
- .rf-comparison__cell p { margin: 0; font-size: 0.875rem; }
83
- .rf-comparison__cell strong { display: none; }
67
+ .rf-comparison__cell p { margin: 0; font-size: var(--rf-text-sm); }
84
68
  .rf-comparison__cell em {
85
69
  font-style: italic;
86
70
  color: var(--rf-color-muted);
@@ -90,8 +74,8 @@
90
74
  }
91
75
  /* Row icons */
92
76
  .rf-comparison__row-icon {
93
- font-weight: 700;
94
- font-size: 1.125rem;
77
+ font-weight: var(--rf-weight-bold);
78
+ font-size: var(--rf-text-lg);
95
79
  }
96
80
  .rf-comparison__row-icon--check {
97
81
  color: var(--rf-color-success);
@@ -110,28 +94,23 @@
110
94
  }
111
95
  /* Callout badge */
112
96
  .rf-comparison__callout-badge {
113
- display: inline-block;
114
97
  background: color-mix(in srgb, var(--rf-color-primary) 10%, transparent);
115
98
  color: var(--rf-color-primary);
116
- font-size: 0.75rem;
117
- font-weight: 600;
99
+ font-size: var(--rf-text-xs);
100
+ font-weight: var(--rf-weight-semibold);
118
101
  padding: 0.125rem 0.5rem;
119
102
  border-radius: 999px;
120
103
  }
121
104
  .rf-comparison__callout-badge p { margin: 0; font-size: inherit; }
122
105
  /* Cards layout */
123
106
  .rf-comparison__cards {
124
- display: grid;
125
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
126
107
  gap: 1.5rem;
127
- align-items: start;
128
108
  }
129
109
  .rf-comparison-card {
130
110
  border: 1px solid var(--rf-color-border);
131
111
  border-radius: var(--rf-radius-md);
132
112
  padding: 1.5rem;
133
113
  background: var(--rf-color-bg);
134
- position: relative;
135
114
  transition: box-shadow 200ms ease, transform 200ms ease;
136
115
  }
137
116
  .rf-comparison-card:hover {
@@ -143,43 +122,36 @@
143
122
  transform: scale(1.02);
144
123
  }
145
124
  .rf-comparison-card__badge {
146
- position: absolute;
147
- top: -0.625rem;
148
- left: 50%;
149
- transform: translateX(-50%);
150
125
  background: var(--rf-color-primary);
151
126
  color: white;
152
- font-size: 0.6875rem;
153
- font-weight: 700;
127
+ font-size: var(--rf-text-xs);
128
+ font-weight: var(--rf-weight-bold);
154
129
  text-transform: uppercase;
155
- letter-spacing: 0.05em;
130
+ letter-spacing: var(--rf-tracking-wider);
156
131
  padding: 0.125rem 0.75rem;
157
132
  border-radius: 999px;
158
133
  white-space: nowrap;
159
134
  }
160
135
  .rf-comparison-card__name {
161
136
  margin: 0 0 1rem;
162
- font-size: 1.125rem;
163
- font-weight: 700;
137
+ font-size: var(--rf-text-lg);
138
+ font-weight: var(--rf-weight-bold);
164
139
  color: var(--rf-color-text);
165
140
  }
166
141
  .rf-comparison-card__rows {
167
- list-style: none;
168
142
  padding: 0;
169
143
  margin: 0;
170
144
  }
171
145
  .rf-comparison-card__row {
172
146
  padding: 0.5rem 0;
173
- font-size: 0.875rem;
147
+ font-size: var(--rf-text-sm);
174
148
  color: var(--rf-color-muted);
175
149
  border-bottom: 1px solid var(--rf-color-border);
176
- display: flex;
177
- align-items: baseline;
178
150
  gap: 0.5rem;
179
151
  }
180
152
  .rf-comparison-card__row:last-child { border-bottom: none; }
181
153
  .rf-comparison-card__row strong { color: var(--rf-color-text); white-space: nowrap; }
182
- .rf-comparison-card__row p { margin: 0; display: inline; }
154
+ .rf-comparison-card__row p { margin: 0; }
183
155
  .rf-comparison-card__row--negative { opacity: 0.7; }
184
156
  .rf-comparison-card__row--callout {
185
157
  border-bottom: none;
@@ -188,7 +160,7 @@
188
160
  /* Verdict */
189
161
  .rf-comparison__verdict {
190
162
  text-align: center;
191
- font-size: 0.9375rem;
163
+ font-size: var(--rf-text);
192
164
  color: var(--rf-color-muted);
193
165
  font-style: italic;
194
166
  margin: 1.5rem auto 0;
@@ -203,9 +175,10 @@
203
175
  .rf-comparison-row { padding: 0.25rem 0; }
204
176
  /* Responsive */
205
177
  @media (max-width: 640px) {
206
- .rf-comparison__cards { grid-template-columns: 1fr; }
207
178
  .rf-comparison-card--highlighted { transform: none; }
208
- .rf-comparison__table { font-size: 0.8125rem; }
179
+ .rf-comparison__table { font-size: var(--rf-text-sm); }
209
180
  .rf-comparison__table th,
210
181
  .rf-comparison__table td { padding: 0.5rem 0.625rem; }
211
182
  }
183
+
184
+ }