@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,13 +1,12 @@
1
- /* ─── Metadata Dimensions ──────────────────────────────────────────────
2
- * SPEC-080 typography / geometry split:
3
- * - `[data-meta-type=…]` selectors carry ONLY typography hints
4
- * (monospace, tabular-nums). No padding, no border, no chip geometry.
5
- * - Geometry comes from `[data-zone-layout=…]` selectors (`bar`,
6
- * `definition-list`) and from the universal `.rf-badge` class, which
7
- * is emitted by chip-type fields AND by the standalone `{% badge %}`
8
- * rune.
9
- * - Sentiment rules drive `--meta-color`, which the chip and any
10
- * sentiment-tinted text inherits.
1
+ @layer skin {
2
+ /* ─── Metadata Dimensions skin ───────────────────────────────────────
3
+ * SPEC-080 typography / geometry split. The zone-layout *structure* (bar +
4
+ * definition-list display/grid, the rating flex row, the sr-only label
5
+ * mechanism) lives in @refrakt-md/skeleton (dimensions/metadata.css). What
6
+ * remains here is skin: sentiment colours, meta-type typography, the rating
7
+ * glyph + colours, the chip/def-list spacing + borders + radius, and labels.
8
+ * - `[data-meta-type=…]` selectors carry ONLY typography hints.
9
+ * - Sentiment rules drive `--meta-color`, inherited by chips + tinted text.
11
10
  * ────────────────────────────────────────────────────────────────────── */
12
11
 
13
12
  /* ─── Sentiment ────────────────────────────────────────────────────── */
@@ -22,7 +21,7 @@
22
21
  [data-meta-type="id"],
23
22
  [data-meta-type="code"] {
24
23
  font-family: var(--rf-font-mono, monospace);
25
- font-size: var(--meta-font-size, 0.8125rem);
24
+ font-size: var(--meta-font-size, var(--rf-text-sm));
26
25
  }
27
26
 
28
27
  /* IDs read as primary-coloured references wherever they appear (eyebrow
@@ -30,7 +29,7 @@
30
29
  * not a per-layout one. `code` (e.g. API paths) stays neutral monospace. */
31
30
  [data-meta-type="id"] {
32
31
  color: var(--rf-color-primary);
33
- font-weight: 500;
32
+ font-weight: var(--rf-weight-medium);
34
33
  }
35
34
 
36
35
  [data-meta-type="quantity"] {
@@ -44,9 +43,10 @@
44
43
  }
45
44
 
46
45
  /* Rating — `value` filled marks out of `total`; each mark carries
47
- * `data-filled`. Stars via colour (filled = primary, empty = border). */
46
+ * `data-filled`. Stars via colour (filled = primary, empty = border). The
47
+ * inline-flex row is structure (skeleton); the glyph + spacing + colours are
48
+ * skin. */
48
49
  [data-meta-type="rating"] {
49
- display: inline-flex;
50
50
  gap: 0.0625rem;
51
51
  line-height: 1;
52
52
  }
@@ -73,71 +73,38 @@
73
73
  text-underline-offset: 0.15em;
74
74
  }
75
75
 
76
- /* ─── Layout: bar (SPEC-080) ───────────────────────────────────────── */
77
-
78
- /* Horizontal flex row of fields, each in its own intrinsic shape (chip or
79
- * bare). Wraps by default; `data-wrap="false"` keeps it on one line. A field
80
- * tagged `data-align="end"` (and everything after it) is pushed to the right
81
- * edge. */
76
+ /* ─── Layout: bar spacing ────────────────────────────────────────── */
77
+ /* The flex row + end-push are structure (skeleton); the gap is skin. */
82
78
  [data-zone-layout="bar"] {
83
- display: flex;
84
- flex-wrap: wrap;
85
79
  gap: 0.5rem;
86
- align-items: center;
87
- }
88
- [data-zone-layout="bar"][data-wrap="false"] {
89
- flex-wrap: nowrap;
90
80
  }
91
- [data-zone-layout="bar"] [data-align="end"] {
92
- margin-left: auto;
93
- }
94
-
95
- /* ─── Layout: definition-list ──────────────────────────────────────── */
96
81
 
97
- /* Single source of truth for the `definition-list` primitive, shared by
98
- * both the projected metadata zone (`<dl data-zone="…">`) and the authored
99
- * `{% deflist %}` rune (`<dl data-rune="deflist">`) they emit the same
100
- * `data-zone-layout` so they render identically (geometry, borders, margin).
101
- *
102
- * Each row stacks `dt` above `dd`. Rows flow into multiple columns
103
- * via `auto-fit` — CSS grid naturally collapses to a single column
104
- * when the container is narrower than the minimum, so the same rule
105
- * reads fine on mobile and packs dense on wider screens without a
106
- * media-query step. The 8rem minimum keeps short label / value pairs
107
- * like "Prep" + "15m" tight while leaving room for the per-item border. */
82
+ /* ─── Layout: definition-list spacing + chrome ───────────────────── */
83
+ /* The grid + row stacking are structure (skeleton); the gaps, the per-row
84
+ * border/padding/radius card chrome, and the dt/dd type are skin. */
108
85
  [data-zone-layout="definition-list"] {
109
- display: grid;
110
- grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
111
86
  gap: 0.75rem;
112
87
  margin: 1.25rem 0;
113
88
  }
114
89
 
115
90
  [data-zone-layout="definition-list"] > [data-name="row"] {
116
- display: flex;
117
- flex-direction: column;
118
91
  gap: 0.125rem;
119
- min-width: 0;
120
92
  padding: 0.625rem 0.75rem;
121
93
  border: 1px solid var(--rf-color-border);
122
94
  border-radius: var(--rf-radius-sm);
123
95
  }
124
96
 
125
97
  [data-zone-layout="definition-list"] dt {
126
- font-size: 0.75rem;
127
- font-weight: 500;
98
+ font-size: var(--rf-text-xs);
99
+ font-weight: var(--rf-weight-medium);
128
100
  color: var(--rf-color-muted);
129
101
  }
130
102
 
131
103
  [data-zone-layout="definition-list"] dd {
132
- margin: 0;
133
- font-size: 0.875rem;
104
+ font-size: var(--rf-text-sm);
134
105
  }
135
106
 
136
- /* Multi-value dd (fields with `splitOn`) renders a row of chips
137
- * inside the cell, flowing naturally. */
138
107
  [data-zone-layout="definition-list"] dd[data-multi-value] {
139
- display: flex;
140
- flex-wrap: wrap;
141
108
  gap: 0.25rem;
142
109
  }
143
110
 
@@ -145,23 +112,10 @@
145
112
 
146
113
  /* Label element within a chip — thin, muted; pairs visually with the value */
147
114
  [data-meta-label] {
148
- font-weight: 400;
115
+ font-weight: var(--rf-weight-normal);
149
116
  opacity: 0.65;
150
117
  }
151
118
 
152
- /* Visually hidden labels — accessible to screen readers only */
153
- [data-meta-label-hidden] {
154
- position: absolute;
155
- width: 1px;
156
- height: 1px;
157
- padding: 0;
158
- margin: -1px;
159
- overflow: hidden;
160
- clip: rect(0, 0, 0, 0);
161
- white-space: nowrap;
162
- border: 0;
163
- }
164
-
165
119
  /* ─── Mobile: compact ──────────────────────────────────────────────── */
166
120
 
167
121
  @media (max-width: 48rem) {
@@ -169,26 +123,22 @@
169
123
  gap: 0.375rem;
170
124
  }
171
125
 
172
- /* On narrow screens, fall back to the original label-left / value-right
173
- * list: each row's dt/dd flow directly into a two-column grid via
174
- * `display: contents`, which drops the per-item border (no box to paint).
175
- * The border + padding move to the list itself so the whole group reads
176
- * as one bordered card. */
126
+ /* The border + padding move to the list itself so the whole group reads as
127
+ * one bordered card (the per-row box is dropped by the skeleton's
128
+ * `display: contents`). */
177
129
  [data-zone-layout="definition-list"] {
178
- grid-template-columns: max-content 1fr;
179
130
  gap: 0.25rem 1rem;
180
- align-items: baseline;
181
131
  padding: 0.75rem 1rem;
182
132
  border: 1px solid var(--rf-color-border);
183
133
  border-radius: var(--rf-radius-sm);
184
134
  }
185
135
 
186
- [data-zone-layout="definition-list"] > [data-name="row"] {
187
- display: contents;
188
- }
189
-
136
+ /* Header rhythm stays skin with sections.css (deferred until the split layout
137
+ * + sections promote together). */
190
138
  [data-section="header"] {
191
139
  gap: 0.375rem;
192
140
  margin-bottom: 1.5rem;
193
141
  }
194
142
  }
143
+
144
+ }
@@ -1,66 +1,51 @@
1
- /* ─── Section Anatomy Dimension ─────────────────────────────────────────
2
- * Generic layout and typography for the 6 standard section roles.
3
- * Every rune that declares `sections` in its config gets these for free.
4
- *
5
- * Includes density × section interactions (title scaling, hiding).
1
+ @layer skin {
2
+ /* ─── Section Anatomy Dimension skin ──────────────────────────────────
3
+ * Zone rhythm (margins, gaps, padding), typography, and borders for the 6
4
+ * standard section roles. The flex zone *containers* (header / preamble /
5
+ * footer) live in @refrakt-md/skeleton (dimensions/sections.css). Rhythm stays
6
+ * here so rune zone overrides resolve against it by source order.
6
7
  * ────────────────────────────────────────────────────────────────────── */
7
8
 
8
9
  /* ─── Header: chrome metadata row (badges, status, icons) ────────── */
9
-
10
10
  [data-section="header"] {
11
- display: flex;
12
- flex-wrap: wrap;
13
- align-items: center;
14
11
  gap: 0.5rem;
15
12
  margin-bottom: 3rem;
16
13
  }
17
14
 
18
15
  /* ─── Preamble: intro section (eyebrow, headline, blurb) ─────────── */
19
-
20
16
  [data-section="preamble"] {
21
- display: flex;
22
- flex-direction: column;
23
17
  gap: 0.25rem;
24
18
  }
25
19
 
26
20
  /* ─── Title: primary heading ──────────────────────────────────────── */
27
-
28
21
  /* The size rides --rf-title-size (set per density root in density.css) so a
29
- * nested rune's own density re-declares it a full-density hero inside a
30
- * compact preview keeps its full-size title and a rune's own title CSS
31
- * (e.g. .rf-hero__headline) outranks the bare attribute selector. The old
32
- * `[data-density="compact"] [data-section="title"]` descendant rule leaked
33
- * through nested densities AND beat per-rune title sizes. */
22
+ * nested rune's own density re-declares it, and a rune's own title CSS
23
+ * (e.g. .rf-hero__headline) outranks the bare attribute selector. */
34
24
  [data-section="title"] {
35
25
  font-family: var(--rf-font-sans);
36
- font-size: var(--rf-title-size, 1.5rem);
37
- font-weight: 700;
38
- line-height: 1.2;
26
+ font-size: var(--rf-title-size, var(--rf-text-2xl));
27
+ font-weight: var(--rf-weight-bold);
28
+ line-height: var(--rf-leading-tight);
39
29
  color: var(--rf-color-text);
40
30
  margin: 0;
41
31
  }
42
32
 
43
33
  /* ─── Description: secondary text ─────────────────────────────────── */
44
-
45
34
  [data-section="description"] {
46
- font-size: 1rem;
47
- line-height: 1.5;
35
+ font-size: var(--rf-text);
36
+ line-height: var(--rf-leading-normal);
48
37
  color: var(--rf-color-muted);
49
38
  margin: var(--rf-spacing-xs) 0 var(--rf-spacing-md);
50
39
  }
51
40
 
52
41
  /* ─── Body: main content ──────────────────────────────────────────── */
53
-
54
42
  [data-section="body"] {
55
- line-height: 1.6;
43
+ line-height: var(--rf-leading-relaxed);
56
44
  color: var(--rf-color-text);
57
45
  }
58
46
 
59
47
  /* ─── Footer: actions and links ───────────────────────────────────── */
60
-
61
48
  [data-section="footer"] {
62
- display: flex;
63
- flex-wrap: wrap;
64
49
  gap: var(--rf-spacing-sm);
65
50
  margin-top: var(--rf-spacing-md);
66
51
  padding-top: var(--rf-spacing-sm);
@@ -68,10 +53,11 @@
68
53
  }
69
54
 
70
55
  /* ─── Media: visual content ───────────────────────────────────────── */
71
-
72
56
  [data-section="media"] {
73
57
  /* Media zones manage their own spacing via their layout (split gap, cell
74
58
  * padding, flow margins); a blanket block margin here misaligns media in
75
59
  * flex/beside layouts, so keep it neutral. */
76
60
  margin: 0;
77
61
  }
62
+
63
+ }
@@ -1,30 +1,14 @@
1
- /* === Sequential Items: universal ordered item styling === */
2
-
3
- /* Numbered counter circle to the left of each item */
4
- [data-sequence="numbered"] {
5
- counter-reset: sequence;
6
- list-style: none;
7
- padding-left: 0;
8
- }
9
-
10
- [data-sequence="numbered"] > li {
11
- counter-increment: sequence;
12
- position: relative;
13
- padding-left: 2.25rem;
14
- }
15
-
1
+ @layer skin {
2
+ /* === Sequential Items — skin ===
3
+ * The connector lines (borders), the marker chrome (fill, radius, shadow), the
4
+ * counter type, and the layout gaps. The counter mechanism, list resets, item
5
+ * geometry, and marker box placement live in @refrakt-md/skeleton
6
+ * (dimensions/sequence.css). */
7
+
8
+ /* Numbered — counter circle chrome + type. */
16
9
  [data-sequence="numbered"] > li::before {
17
- content: counter(sequence);
18
- position: absolute;
19
- left: 0;
20
- top: 0.625rem;
21
- width: 1.5rem;
22
- height: 1.5rem;
23
- display: flex;
24
- align-items: center;
25
- justify-content: center;
26
- font-size: 0.75rem;
27
- font-weight: 700;
10
+ font-size: var(--rf-text-xs);
11
+ font-weight: var(--rf-weight-bold);
28
12
  font-variant-numeric: tabular-nums;
29
13
  color: var(--rf-color-primary);
30
14
  background: var(--rf-color-surface-active);
@@ -35,95 +19,46 @@
35
19
  border-top: 1px solid var(--rf-color-border);
36
20
  }
37
21
 
38
- /* Connected vertical — line with dots */
39
- [data-sequence="connected"] {
40
- list-style: none;
41
- padding-left: 0;
42
- }
43
-
22
+ /* Connected vertical — the line is a left border; the dot is the marker. */
44
23
  [data-sequence="connected"] > li {
45
- position: relative;
46
- padding-left: 2rem;
47
- padding-bottom: 2rem;
48
24
  border-left: 2px solid var(--rf-color-border);
49
- margin-left: 0.375rem;
50
25
  }
51
26
 
52
27
  [data-sequence="connected"] > li:last-child {
53
28
  border-left-color: transparent;
54
- padding-bottom: 0;
55
29
  }
56
30
 
57
31
  [data-sequence="connected"] > li::before {
58
- content: '';
59
- position: absolute;
60
- left: -0.4375rem;
61
- top: 0.25rem;
62
- width: 0.75rem;
63
- height: 0.75rem;
64
32
  border-radius: 50%;
65
33
  background: var(--rf-color-primary);
66
34
  border: 2px solid var(--rf-color-bg);
67
35
  box-shadow: 0 0 0 2px var(--rf-color-primary);
68
36
  }
69
37
 
70
- /* Connected horizontal — line with dots */
38
+ /* Connected horizontal — the line moves to the top border; gap spaces the items. */
71
39
  [data-sequence="connected"][data-sequence-direction="horizontal"] {
72
- display: flex;
73
40
  gap: 2rem;
74
- overflow-x: auto;
75
41
  }
76
42
 
77
43
  [data-sequence="connected"][data-sequence-direction="horizontal"] > li {
78
- position: relative;
79
- min-width: 12rem;
80
- padding-top: 1.5rem;
81
- padding-left: 0;
82
- padding-bottom: 0;
83
44
  border-left: none;
84
45
  border-top: 2px solid var(--rf-color-border);
85
- margin-left: 0;
86
46
  }
87
47
 
88
48
  [data-sequence="connected"][data-sequence-direction="horizontal"] > li:last-child {
89
49
  border-top-color: var(--rf-color-border);
90
50
  }
91
51
 
92
- [data-sequence="connected"][data-sequence-direction="horizontal"] > li::before {
93
- left: 0.5rem;
94
- top: -0.4375rem;
95
- }
96
-
97
- /* Plain — no indicators, just ordered semantics */
98
- [data-sequence="plain"] {
99
- list-style: none;
100
- padding-left: 0;
101
- }
102
-
103
52
  /* === Density interaction === */
104
53
 
105
- /* Compact: smaller circles, tighter spacing */
106
- [data-density="compact"] [data-sequence="numbered"] > li {
107
- padding-left: 1.75rem;
108
- }
109
-
54
+ /* Compact: smaller circle keeps the same type scale. */
110
55
  [data-density="compact"] [data-sequence="numbered"] > li::before {
111
- width: 1.25rem;
112
- height: 1.25rem;
113
- font-size: 0.625rem;
114
- }
115
-
116
- [data-density="compact"] [data-sequence="connected"] > li {
117
- padding-bottom: 1rem;
118
- }
119
-
120
- /* Minimal: no indicators, collapsed list */
121
- [data-density="minimal"] [data-sequence] > li::before {
122
- display: none;
56
+ font-size: var(--rf-text-xs);
123
57
  }
124
58
 
59
+ /* Minimal: drop the connector line on the collapsed list. */
125
60
  [data-density="minimal"] [data-sequence="connected"] > li {
126
61
  border-left: none;
127
- padding-left: 0;
128
- margin-left: 0;
62
+ }
63
+
129
64
  }
@@ -1,57 +1,40 @@
1
- /* ─── Interactive State Dimension ───────────────────────────────────────
2
- * Generic styling for interactive rune states: open/closed, active/inactive,
3
- * selected, and disabled. Behaviours toggle data-state; themes read it here.
4
- * ────────────────────────────────────────────────────────────────────── */
5
-
6
- /* ─── Open/Closed: collapsible content ────────────────────────────── */
7
-
8
- [data-state="closed"] > [class*="__body"],
9
- [data-state="closed"] > [class*="__content"] {
10
- display: none;
11
- }
12
-
13
- [data-state="open"] > [class*="__body"],
14
- [data-state="open"] > [class*="__content"] {
15
- display: block;
16
- animation: rf-expand 0.2s ease-out;
17
- }
18
-
19
- @keyframes rf-expand {
20
- from { opacity: 0; transform: translateY(-0.5rem); }
21
- to { opacity: 1; transform: translateY(0); }
22
- }
23
-
24
- /* ─── Active/Inactive: selection indicators ───────────────────────── */
25
-
26
- button[data-state="active"] {
27
- border-bottom: 2px solid var(--rf-color-primary);
28
- color: var(--rf-color-primary);
29
- }
30
-
31
- button[data-state="inactive"] {
32
- border-bottom: 2px solid transparent;
33
- color: var(--rf-color-muted);
34
- }
35
-
36
- /* Panels controlled by tab/toggle state */
37
- [role="tabpanel"][data-state="inactive"] {
38
- display: none;
39
- }
40
-
41
- [role="tabpanel"][data-state="active"] {
42
- display: block;
43
- }
44
-
45
- /* ─── Selected: user selection highlight ──────────────────────────── */
46
-
47
- [data-state="selected"] {
48
- background: var(--rf-color-primary-bg);
49
- outline: 2px solid var(--rf-color-primary);
50
- }
51
-
52
- /* ─── Disabled: dimmed non-interactive ────────────────────────────── */
53
-
54
- [data-state="disabled"] {
55
- opacity: 0.4;
56
- pointer-events: none;
1
+ /* ─── Interactive State Dimension — skin ────────────────────────────────
2
+ * Aesthetic state treatments. The visibility/interaction mechanisms (collapse,
3
+ * panel switching, disabled pointer suppression) are structure and live in
4
+ * `@refrakt-md/skeleton` (styles/dimensions/state.css). Skin sits in @layer skin,
5
+ * ordered after skeleton, so these low-specificity rules win where they overlap. */
6
+
7
+ @layer skin {
8
+ /* Expand animation for opening collapsibles (decorative — the rune works
9
+ * without it; the skeleton supplies the display:block). */
10
+ [data-state="open"] > [class*="__body"],
11
+ [data-state="open"] > [class*="__content"] {
12
+ animation: rf-expand 0.2s ease-out;
13
+ }
14
+
15
+ @keyframes rf-expand {
16
+ from { opacity: 0; transform: translateY(-0.5rem); }
17
+ to { opacity: 1; transform: translateY(0); }
18
+ }
19
+
20
+ /* Active/inactive selection indicators */
21
+ button[data-state="active"] {
22
+ border-bottom: 2px solid var(--rf-color-primary);
23
+ color: var(--rf-color-primary);
24
+ }
25
+ button[data-state="inactive"] {
26
+ border-bottom: 2px solid transparent;
27
+ color: var(--rf-color-muted);
28
+ }
29
+
30
+ /* Selected highlight */
31
+ [data-state="selected"] {
32
+ background: var(--rf-color-primary-bg);
33
+ outline: 2px solid var(--rf-color-primary);
34
+ }
35
+
36
+ /* Disabled dim (the pointer-events:none is structure) */
37
+ [data-state="disabled"] {
38
+ opacity: 0.4;
39
+ }
57
40
  }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Substrate (SPEC-087) — generated surface pattern.
2
3
  *
3
4
  * The token-driven gradient recipes that realise each pattern ship here in the
@@ -106,3 +107,5 @@
106
107
  [data-color-scheme="light"] {
107
108
  --substrate-mode-boost: 1;
108
109
  }
110
+
111
+ }