@refrakt-md/lumina 0.32.0 → 0.34.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 (142) hide show
  1. package/base.css +29 -29
  2. package/contracts/structures.json +58 -60
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js.map +1 -1
  5. package/dist/icons.d.ts.map +1 -1
  6. package/dist/icons.js +57 -57
  7. package/dist/icons.js.map +1 -1
  8. package/dist/presets/catppuccin.js.map +1 -1
  9. package/dist/presets/dracula.js.map +1 -1
  10. package/dist/presets/gruvbox.js.map +1 -1
  11. package/dist/presets/niwaki.js.map +1 -1
  12. package/dist/presets/nord.js.map +1 -1
  13. package/dist/presets/one-dark.js.map +1 -1
  14. package/dist/presets/solarized.js.map +1 -1
  15. package/dist/presets/tideline.d.ts.map +1 -1
  16. package/dist/presets/tideline.js +20 -4
  17. package/dist/presets/tideline.js.map +1 -1
  18. package/dist/presets/tokyo-night.js.map +1 -1
  19. package/dist/tokens.js.map +1 -1
  20. package/index.css +124 -124
  21. package/package.json +5 -5
  22. package/presets.json +61 -13
  23. package/styles/base/attributes.css +32 -13
  24. package/styles/dimensions/checklist.css +45 -46
  25. package/styles/dimensions/cover.css +71 -51
  26. package/styles/dimensions/density.css +69 -65
  27. package/styles/dimensions/frame.css +116 -57
  28. package/styles/dimensions/metadata.css +110 -103
  29. package/styles/dimensions/motion.css +42 -13
  30. package/styles/dimensions/reading.css +27 -27
  31. package/styles/dimensions/sections.css +44 -45
  32. package/styles/dimensions/sequence.css +56 -57
  33. package/styles/dimensions/state.css +8 -2
  34. package/styles/dimensions/substrate.css +82 -58
  35. package/styles/dimensions/surfaces.css +65 -62
  36. package/styles/elements/blockquote.css +24 -25
  37. package/styles/elements/code.css +72 -71
  38. package/styles/elements/table.css +36 -37
  39. package/styles/global.css +163 -121
  40. package/styles/layouts/blog.css +219 -218
  41. package/styles/layouts/default.css +168 -167
  42. package/styles/layouts/docs.css +121 -122
  43. package/styles/layouts/mobile.css +54 -55
  44. package/styles/layouts/on-this-page.css +46 -47
  45. package/styles/layouts/plan.css +248 -247
  46. package/styles/layouts/search.css +142 -140
  47. package/styles/layouts/split.css +45 -45
  48. package/styles/layouts/theme-toggle.css +33 -31
  49. package/styles/layouts/version-switcher.css +38 -37
  50. package/styles/runes/accordion.css +90 -81
  51. package/styles/runes/aggregate.css +50 -39
  52. package/styles/runes/annotate.css +46 -45
  53. package/styles/runes/api.css +22 -23
  54. package/styles/runes/audio.css +140 -141
  55. package/styles/runes/badge.css +12 -13
  56. package/styles/runes/bar.css +4 -5
  57. package/styles/runes/bento.css +73 -62
  58. package/styles/runes/bg.css +62 -47
  59. package/styles/runes/blog.css +89 -90
  60. package/styles/runes/bond.css +49 -50
  61. package/styles/runes/breadcrumb.css +34 -35
  62. package/styles/runes/budget.css +126 -127
  63. package/styles/runes/bug.css +28 -27
  64. package/styles/runes/card.css +63 -60
  65. package/styles/runes/carousel.css +15 -15
  66. package/styles/runes/cast.css +50 -51
  67. package/styles/runes/changelog.css +45 -46
  68. package/styles/runes/character.css +31 -32
  69. package/styles/runes/chart.css +194 -106
  70. package/styles/runes/codegroup.css +109 -100
  71. package/styles/runes/collection.css +87 -86
  72. package/styles/runes/compare.css +38 -39
  73. package/styles/runes/comparison.css +205 -179
  74. package/styles/runes/conversation.css +36 -33
  75. package/styles/runes/cta.css +135 -132
  76. package/styles/runes/datatable.css +84 -83
  77. package/styles/runes/decision.css +25 -26
  78. package/styles/runes/design-context.css +21 -23
  79. package/styles/runes/details.css +26 -27
  80. package/styles/runes/diagram.css +28 -29
  81. package/styles/runes/diff.css +75 -72
  82. package/styles/runes/drawer.css +276 -198
  83. package/styles/runes/embed.css +20 -21
  84. package/styles/runes/event.css +35 -36
  85. package/styles/runes/expand.css +43 -34
  86. package/styles/runes/faction.css +47 -48
  87. package/styles/runes/feature.css +119 -112
  88. package/styles/runes/figure.css +11 -12
  89. package/styles/runes/file-ref.css +11 -13
  90. package/styles/runes/form.css +155 -154
  91. package/styles/runes/gallery.css +59 -60
  92. package/styles/runes/grid.css +10 -7
  93. package/styles/runes/hero.css +189 -185
  94. package/styles/runes/hint.css +57 -58
  95. package/styles/runes/howto.css +62 -64
  96. package/styles/runes/itinerary.css +133 -134
  97. package/styles/runes/juxtapose.css +83 -82
  98. package/styles/runes/lore.css +32 -34
  99. package/styles/runes/map.css +106 -99
  100. package/styles/runes/mediatext.css +30 -27
  101. package/styles/runes/milestone.css +98 -97
  102. package/styles/runes/mockup.css +338 -335
  103. package/styles/runes/nav.css +465 -450
  104. package/styles/runes/organization.css +23 -20
  105. package/styles/runes/page-section.css +14 -15
  106. package/styles/runes/pagination.css +45 -44
  107. package/styles/runes/palette.css +78 -80
  108. package/styles/runes/placeholder.css +8 -9
  109. package/styles/runes/plan-history.css +160 -161
  110. package/styles/runes/plan-progress.css +15 -16
  111. package/styles/runes/plan-ref.css +32 -23
  112. package/styles/runes/playlist.css +106 -107
  113. package/styles/runes/plot.css +92 -91
  114. package/styles/runes/preview.css +152 -149
  115. package/styles/runes/pricing.css +133 -123
  116. package/styles/runes/progress.css +32 -27
  117. package/styles/runes/pullquote.css +89 -90
  118. package/styles/runes/realm.css +47 -48
  119. package/styles/runes/recipe.css +112 -114
  120. package/styles/runes/relationships.css +77 -76
  121. package/styles/runes/reveal.css +90 -79
  122. package/styles/runes/sandbox.css +59 -60
  123. package/styles/runes/section.css +57 -50
  124. package/styles/runes/showcase.css +35 -16
  125. package/styles/runes/sidenote.css +30 -27
  126. package/styles/runes/snippet.css +8 -9
  127. package/styles/runes/spacing.css +86 -88
  128. package/styles/runes/spec.css +24 -25
  129. package/styles/runes/steps.css +89 -80
  130. package/styles/runes/storyboard.css +46 -45
  131. package/styles/runes/swatch.css +22 -23
  132. package/styles/runes/symbol.css +117 -118
  133. package/styles/runes/tabs.css +88 -79
  134. package/styles/runes/testimonial.css +43 -44
  135. package/styles/runes/textblock.css +32 -28
  136. package/styles/runes/timeline.css +63 -64
  137. package/styles/runes/tint.css +214 -215
  138. package/styles/runes/toc.css +40 -41
  139. package/styles/runes/track.css +89 -90
  140. package/styles/runes/typography.css +89 -91
  141. package/styles/runes/work.css +47 -36
  142. package/styles/runes/xref.css +21 -22
@@ -1,177 +1,176 @@
1
1
  @layer skin {
2
- /* Plan History — vertical timeline (mirrors .rf-timeline--vertical) */
2
+ /* Plan History — vertical timeline (mirrors .rf-timeline--vertical) */
3
3
 
4
- .rf-plan-history {
5
- margin: 2rem 0;
6
- }
7
- .rf-plan-history__heading {
8
- font-size: var(--rf-text);
9
- font-weight: var(--rf-weight-bold);
10
- color: var(--rf-color-text);
11
- margin: 0 0 1rem;
12
- }
13
-
14
- /* Event list — vertical line */
15
- .rf-plan-history__events {
16
- padding: 0;
17
- margin: 0;
18
- }
4
+ .rf-plan-history {
5
+ margin: 2rem 0;
6
+ }
7
+ .rf-plan-history__heading {
8
+ font-size: var(--rf-text);
9
+ font-weight: var(--rf-weight-bold);
10
+ color: var(--rf-color-text);
11
+ margin: 0 0 1rem;
12
+ }
19
13
 
20
- /* Each event entry — left-padded with border line */
21
- .rf-plan-history__event {
22
- padding-left: 2rem;
23
- padding-bottom: 2rem;
24
- border-left: 2px solid var(--rf-color-border);
25
- margin-left: 0.375rem;
26
- }
27
- .rf-plan-history__event:last-child {
28
- border-left-color: transparent;
29
- padding-bottom: 0;
30
- }
14
+ /* Event list — vertical line */
15
+ .rf-plan-history__events {
16
+ padding: 0;
17
+ margin: 0;
18
+ }
31
19
 
32
- /* Circle markers on the timeline line */
33
- .rf-plan-history__event::before {
34
- border-radius: 50%;
35
- background: var(--rf-color-primary);
36
- border: 2px solid var(--rf-color-bg);
37
- box-shadow: 0 0 0 2px var(--rf-color-primary);
38
- }
20
+ /* Each event entry — left-padded with border line */
21
+ .rf-plan-history__event {
22
+ padding-left: 2rem;
23
+ padding-bottom: 2rem;
24
+ border-left: 2px solid var(--rf-color-border);
25
+ margin-left: 0.375rem;
26
+ }
27
+ .rf-plan-history__event:last-child {
28
+ border-left-color: transparent;
29
+ padding-bottom: 0;
30
+ }
39
31
 
40
- /* Open circle for creation events */
41
- .rf-plan-history__event[data-kind="created"]::before {
42
- background: var(--rf-color-bg);
43
- }
32
+ /* Circle markers on the timeline line */
33
+ .rf-plan-history__event::before {
34
+ border-radius: 50%;
35
+ background: var(--rf-color-primary);
36
+ border: 2px solid var(--rf-color-bg);
37
+ box-shadow: 0 0 0 2px var(--rf-color-primary);
38
+ }
44
39
 
45
- /* Date + hash header */
46
- .rf-plan-history__date {
47
- font-size: var(--rf-text-xs);
48
- font-weight: var(--rf-weight-semibold);
49
- color: var(--rf-color-primary);
50
- letter-spacing: var(--rf-tracking-wide);
51
- margin-right: 0.5rem;
52
- }
53
- .rf-plan-history__hash {
54
- font-family: var(--rf-font-mono);
55
- font-size: var(--rf-text-xs);
56
- color: var(--rf-color-muted);
57
- text-decoration: none;
58
- }
59
- a.rf-plan-history__hash:hover {
60
- color: var(--rf-color-primary);
61
- text-decoration: underline;
62
- }
40
+ /* Open circle for creation events */
41
+ .rf-plan-history__event[data-kind="created"]::before {
42
+ background: var(--rf-color-bg);
43
+ }
63
44
 
64
- /* Changes block */
65
- .rf-plan-history__changes {
66
- margin-top: 0.25rem;
67
- }
68
- .rf-plan-history__change {
69
- gap: 0.25rem;
70
- font-size: var(--rf-text-sm);
71
- line-height: var(--rf-leading-relaxed);
72
- color: var(--rf-color-muted);
73
- }
74
- .rf-plan-history__field {
75
- font-weight: var(--rf-weight-medium);
76
- color: var(--rf-color-text);
77
- }
78
- .rf-plan-history__field::after {
79
- content: ':';
80
- }
81
- .rf-plan-history__arrow {
82
- color: var(--rf-color-muted);
83
- margin-inline: 0.125rem;
84
- }
45
+ /* Date + hash header */
46
+ .rf-plan-history__date {
47
+ font-size: var(--rf-text-xs);
48
+ font-weight: var(--rf-weight-semibold);
49
+ color: var(--rf-color-primary);
50
+ letter-spacing: var(--rf-tracking-wide);
51
+ margin-right: 0.5rem;
52
+ }
53
+ .rf-plan-history__hash {
54
+ font-family: var(--rf-font-mono);
55
+ font-size: var(--rf-text-xs);
56
+ color: var(--rf-color-muted);
57
+ text-decoration: none;
58
+ }
59
+ a.rf-plan-history__hash:hover {
60
+ color: var(--rf-color-primary);
61
+ text-decoration: underline;
62
+ }
85
63
 
86
- /* Value badges (add/remove) */
87
- .rf-plan-history__value {
88
- font-size: var(--rf-text-sm);
89
- padding: 0.0625rem 0.375rem;
90
- border-radius: var(--rf-radius-sm);
91
- }
92
- .rf-plan-history__value[data-type="add"] {
93
- background: var(--rf-color-success-bg);
94
- color: var(--rf-color-success);
95
- }
96
- .rf-plan-history__value[data-type="remove"] {
97
- background: var(--rf-color-danger-bg);
98
- color: var(--rf-color-danger);
99
- text-decoration: line-through;
100
- }
64
+ /* Changes block */
65
+ .rf-plan-history__changes {
66
+ margin-top: 0.25rem;
67
+ }
68
+ .rf-plan-history__change {
69
+ gap: 0.25rem;
70
+ font-size: var(--rf-text-sm);
71
+ line-height: var(--rf-leading-relaxed);
72
+ color: var(--rf-color-muted);
73
+ }
74
+ .rf-plan-history__field {
75
+ font-weight: var(--rf-weight-medium);
76
+ color: var(--rf-color-text);
77
+ }
78
+ .rf-plan-history__field::after {
79
+ content: ":";
80
+ }
81
+ .rf-plan-history__arrow {
82
+ color: var(--rf-color-muted);
83
+ margin-inline: 0.125rem;
84
+ }
101
85
 
102
- /* Event kind labels */
103
- .rf-plan-history__created {
104
- font-size: var(--rf-text-sm);
105
- color: var(--rf-color-muted);
106
- }
107
- .rf-plan-history__resolution,
108
- .rf-plan-history__content-edit {
109
- font-size: var(--rf-text-sm);
110
- color: var(--rf-color-muted);
111
- font-style: italic;
112
- }
86
+ /* Value badges (add/remove) */
87
+ .rf-plan-history__value {
88
+ font-size: var(--rf-text-sm);
89
+ padding: 0.0625rem 0.375rem;
90
+ border-radius: var(--rf-radius-sm);
91
+ }
92
+ .rf-plan-history__value[data-type="add"] {
93
+ background: var(--rf-color-success-bg);
94
+ color: var(--rf-color-success);
95
+ }
96
+ .rf-plan-history__value[data-type="remove"] {
97
+ background: var(--rf-color-danger-bg);
98
+ color: var(--rf-color-danger);
99
+ text-decoration: line-through;
100
+ }
113
101
 
114
- /* Criteria list */
115
- .rf-plan-history__criteria {
116
- padding: 0;
117
- margin: 0.25rem 0 0;
118
- }
119
- .rf-plan-history__criteria li {
120
- font-size: var(--rf-text-sm);
121
- line-height: var(--rf-leading-relaxed);
122
- color: var(--rf-color-text);
123
- }
124
- .rf-plan-history__criteria li[data-action="checked"] {
125
- color: var(--rf-color-success);
126
- }
127
- .rf-plan-history__criteria li[data-action="unchecked"] {
128
- color: var(--rf-color-danger);
129
- }
130
- .rf-plan-history__criteria li[data-action="removed"] {
131
- color: var(--rf-color-danger);
132
- text-decoration: line-through;
133
- }
102
+ /* Event kind labels */
103
+ .rf-plan-history__created {
104
+ font-size: var(--rf-text-sm);
105
+ color: var(--rf-color-muted);
106
+ }
107
+ .rf-plan-history__resolution,
108
+ .rf-plan-history__content-edit {
109
+ font-size: var(--rf-text-sm);
110
+ color: var(--rf-color-muted);
111
+ font-style: italic;
112
+ }
134
113
 
135
- /* Collapse / empty */
136
- .rf-plan-history__more {
137
- color: var(--rf-color-muted);
138
- font-style: italic;
139
- cursor: pointer;
140
- }
141
- .rf-plan-history__empty {
142
- color: var(--rf-color-muted);
143
- font-style: italic;
144
- }
114
+ /* Criteria list */
115
+ .rf-plan-history__criteria {
116
+ padding: 0;
117
+ margin: 0.25rem 0 0;
118
+ }
119
+ .rf-plan-history__criteria li {
120
+ font-size: var(--rf-text-sm);
121
+ line-height: var(--rf-leading-relaxed);
122
+ color: var(--rf-color-text);
123
+ }
124
+ .rf-plan-history__criteria li[data-action="checked"] {
125
+ color: var(--rf-color-success);
126
+ }
127
+ .rf-plan-history__criteria li[data-action="unchecked"] {
128
+ color: var(--rf-color-danger);
129
+ }
130
+ .rf-plan-history__criteria li[data-action="removed"] {
131
+ color: var(--rf-color-danger);
132
+ text-decoration: line-through;
133
+ }
145
134
 
146
- /* Global feed (commit-grouped) */
147
- .rf-plan-history--global .rf-plan-history__commit-message {
148
- font-size: var(--rf-text);
149
- font-weight: var(--rf-weight-bold);
150
- color: var(--rf-color-text);
151
- margin-top: 0.25rem;
152
- margin-bottom: 0.5rem;
153
- }
154
- .rf-plan-history--global .rf-plan-history__entity-summary {
155
- gap: 0.5rem;
156
- font-size: var(--rf-text-sm);
157
- line-height: var(--rf-leading-relaxed);
158
- }
159
- .rf-plan-history--global .rf-plan-history__entity-id {
160
- font-weight: var(--rf-weight-semibold);
161
- font-family: var(--rf-font-mono);
162
- font-size: var(--rf-text-xs);
163
- color: var(--rf-color-primary);
164
- white-space: nowrap;
165
- }
166
- .rf-plan-history--global .rf-plan-history__entity-changes {
167
- color: var(--rf-color-muted);
168
- }
135
+ /* Collapse / empty */
136
+ .rf-plan-history__more {
137
+ color: var(--rf-color-muted);
138
+ font-style: italic;
139
+ cursor: pointer;
140
+ }
141
+ .rf-plan-history__empty {
142
+ color: var(--rf-color-muted);
143
+ font-style: italic;
144
+ }
169
145
 
170
- /* Responsive */
171
- @media (max-width: 640px) {
172
- .rf-plan-history__event {
173
- padding-left: 1.25rem;
146
+ /* Global feed (commit-grouped) */
147
+ .rf-plan-history--global .rf-plan-history__commit-message {
148
+ font-size: var(--rf-text);
149
+ font-weight: var(--rf-weight-bold);
150
+ color: var(--rf-color-text);
151
+ margin-top: 0.25rem;
152
+ margin-bottom: 0.5rem;
153
+ }
154
+ .rf-plan-history--global .rf-plan-history__entity-summary {
155
+ gap: 0.5rem;
156
+ font-size: var(--rf-text-sm);
157
+ line-height: var(--rf-leading-relaxed);
158
+ }
159
+ .rf-plan-history--global .rf-plan-history__entity-id {
160
+ font-weight: var(--rf-weight-semibold);
161
+ font-family: var(--rf-font-mono);
162
+ font-size: var(--rf-text-xs);
163
+ color: var(--rf-color-primary);
164
+ white-space: nowrap;
165
+ }
166
+ .rf-plan-history--global .rf-plan-history__entity-changes {
167
+ color: var(--rf-color-muted);
174
168
  }
175
- }
176
169
 
170
+ /* Responsive */
171
+ @media (max-width: 640px) {
172
+ .rf-plan-history__event {
173
+ padding-left: 1.25rem;
174
+ }
175
+ }
177
176
  }
@@ -1,21 +1,20 @@
1
1
  @layer skin {
2
- /* plan-progress (SPEC-076 / WORK-296) — a stack of per-type blocks, each a type
2
+ /* plan-progress (SPEC-076 / WORK-296) — a stack of per-type blocks, each a type
3
3
  * heading + an `aggregate` composition (progress bar + status badges). The bar
4
4
  * and badge-row chrome come from the `progress` / `aggregate` / `badge` runes;
5
5
  * this file only lays out the per-type grouping. */
6
- .rf-plan-progress {
7
- gap: var(--rf-spacing-lg, 2rem);
8
- }
9
- .rf-plan-progress__group {
10
- gap: var(--rf-spacing-sm, 0.75rem);
11
- }
12
- .rf-plan-progress__heading {
13
- margin: 0;
14
- font-size: var(--rf-text-sm);
15
- font-weight: var(--rf-weight-semibold);
16
- text-transform: uppercase;
17
- letter-spacing: var(--rf-tracking-wider);
18
- color: var(--rf-color-muted);
19
- }
20
-
6
+ .rf-plan-progress {
7
+ gap: var(--rf-spacing-lg, 2rem);
8
+ }
9
+ .rf-plan-progress__group {
10
+ gap: var(--rf-spacing-sm, 0.75rem);
11
+ }
12
+ .rf-plan-progress__heading {
13
+ margin: 0;
14
+ font-size: var(--rf-text-sm);
15
+ font-weight: var(--rf-weight-semibold);
16
+ text-transform: uppercase;
17
+ letter-spacing: var(--rf-tracking-wider);
18
+ color: var(--rf-color-muted);
19
+ }
21
20
  }
@@ -1,29 +1,38 @@
1
1
  @layer skin {
2
- /* Plan cross-reference links */
2
+ /* Plan cross-reference links */
3
3
 
4
- .rf-plan-ref {
5
- font-family: var(--rf-font-mono, ui-monospace, monospace);
6
- font-size: var(--rf-text-sm);
7
- color: var(--rf-color-info, #339af0);
8
- text-decoration: none;
9
- border-bottom: 1px dashed var(--rf-color-info, #339af0);
10
- padding-inline: 0.25rem;
11
- }
12
-
13
- .rf-plan-ref:hover {
14
- background: var(--rf-color-info-bg, #e7f5ff);
15
- border-radius: var(--rf-radius-sm, 0.25rem);
16
- border-bottom-color: transparent;
17
- }
4
+ .rf-plan-ref {
5
+ font-family: var(--rf-font-mono, ui-monospace, monospace);
6
+ font-size: var(--rf-text-sm);
7
+ color: var(--rf-color-info, #339af0);
8
+ text-decoration: none;
9
+ border-bottom: 1px dashed var(--rf-color-info, #339af0);
10
+ padding-inline: 0.25rem;
11
+ }
18
12
 
19
- .rf-plan-ref::before {
20
- margin-inline-end: 0.25rem;
21
- }
13
+ .rf-plan-ref:hover {
14
+ background: var(--rf-color-info-bg, #e7f5ff);
15
+ border-radius: var(--rf-radius-sm, 0.25rem);
16
+ border-bottom-color: transparent;
17
+ }
22
18
 
23
- .rf-plan-ref[data-type="spec"]::before { content: '\1F4CB'; }
24
- .rf-plan-ref[data-type="work"]::before { content: '\1F527'; }
25
- .rf-plan-ref[data-type="bug"]::before { content: '\1F41B'; }
26
- .rf-plan-ref[data-type="decision"]::before { content: '\2696\FE0F'; }
27
- .rf-plan-ref[data-type="milestone"]::before { content: '\1F3AF'; }
19
+ .rf-plan-ref::before {
20
+ margin-inline-end: 0.25rem;
21
+ }
28
22
 
23
+ .rf-plan-ref[data-type="spec"]::before {
24
+ content: "\1F4CB";
25
+ }
26
+ .rf-plan-ref[data-type="work"]::before {
27
+ content: "\1F527";
28
+ }
29
+ .rf-plan-ref[data-type="bug"]::before {
30
+ content: "\1F41B";
31
+ }
32
+ .rf-plan-ref[data-type="decision"]::before {
33
+ content: "\2696\FE0F";
34
+ }
35
+ .rf-plan-ref[data-type="milestone"]::before {
36
+ content: "\1F3AF";
37
+ }
29
38
  }
@@ -1,128 +1,127 @@
1
1
  @layer skin {
2
- /* Playlist */
2
+ /* Playlist */
3
3
 
4
- /* Thin-edge inset model (matches `.rf-card` / `.rf-recipe`): card outer padding
4
+ /* Thin-edge inset model (matches `.rf-card` / `.rf-recipe`): card outer padding
5
5
  * is a thin edge, the content column adds the remaining inset back so text sits
6
6
  * at the full `--rune-padding` without negative-margin bleed. Like recipe, no
7
7
  * `align-items: stretch` — the cover is a square album image (aspect-ratio: 1
8
8
  * on `__media img` below), and stretching the cell would just produce empty
9
9
  * card padding around it. */
10
- .rf-playlist {
11
- --rf-playlist-edge: 0.5rem;
12
- --rf-playlist-media-gap: var(--rf-spacing-lg);
13
- --rf-playlist-split-gap: var(--rf-spacing-sm);
14
- padding: var(--rf-playlist-edge);
15
- }
10
+ .rf-playlist {
11
+ --rf-playlist-edge: 0.5rem;
12
+ --rf-playlist-media-gap: var(--rf-spacing-lg);
13
+ --rf-playlist-split-gap: var(--rf-spacing-sm);
14
+ padding: var(--rf-playlist-edge);
15
+ }
16
16
 
17
- .rf-playlist__content {
18
- padding: max(0px, calc(var(--rune-padding, var(--rf-spacing-md)) - var(--rf-playlist-edge)));
19
- }
17
+ .rf-playlist__content {
18
+ padding: max(0px, calc(var(--rune-padding, var(--rf-spacing-md)) - var(--rf-playlist-edge)));
19
+ }
20
20
 
21
- /* Direct grid properties (column-gap / row-gap) win via selector specificity
21
+ /* Direct grid properties (column-gap / row-gap) win via selector specificity
22
22
  * over the shared media-position layout vars. */
23
- .rf-playlist[data-media-position="start"],
24
- .rf-playlist[data-media-position="end"] {
25
- column-gap: var(--rf-playlist-split-gap);
26
- row-gap: var(--rf-playlist-media-gap);
27
- }
23
+ .rf-playlist[data-media-position="start"],
24
+ .rf-playlist[data-media-position="end"] {
25
+ column-gap: var(--rf-playlist-split-gap);
26
+ row-gap: var(--rf-playlist-media-gap);
27
+ }
28
28
 
29
- .rf-playlist[data-media-position="top"] > [data-section="media"] {
30
- margin-bottom: var(--rf-playlist-media-gap);
31
- }
32
- .rf-playlist[data-media-position="bottom"] > [data-section="media"] {
33
- margin-top: var(--rf-playlist-media-gap);
34
- }
29
+ .rf-playlist[data-media-position="top"] > [data-section="media"] {
30
+ margin-bottom: var(--rf-playlist-media-gap);
31
+ }
32
+ .rf-playlist[data-media-position="bottom"] > [data-section="media"] {
33
+ margin-top: var(--rf-playlist-media-gap);
34
+ }
35
35
 
36
- /* Inner header (headline + description) inside content */
37
- .rf-playlist__content > .rf-playlist__header {
38
- gap: 0.25rem;
39
- margin-bottom: 1rem;
40
- }
41
- .rf-playlist__headline {
42
- margin: 0;
43
- }
44
- .rf-playlist__content > .rf-playlist__header p {
45
- margin: 0;
46
- font-size: var(--rf-text-sm);
47
- color: var(--rf-color-muted);
48
- line-height: var(--rf-leading-normal);
49
- }
36
+ /* Inner header (headline + description) inside content */
37
+ .rf-playlist__content > .rf-playlist__header {
38
+ gap: 0.25rem;
39
+ margin-bottom: 1rem;
40
+ }
41
+ .rf-playlist__headline {
42
+ margin: 0;
43
+ }
44
+ .rf-playlist__content > .rf-playlist__header p {
45
+ margin: 0;
46
+ font-size: var(--rf-text-sm);
47
+ color: var(--rf-color-muted);
48
+ line-height: var(--rf-leading-normal);
49
+ }
50
50
 
51
- /* Tracks list wrapper */
52
- .rf-playlist__tracks {
53
- padding: 0;
54
- margin: 0;
55
- border: 1px solid var(--rf-color-border);
56
- border-radius: var(--rf-radius-md);
57
- }
51
+ /* Tracks list wrapper */
52
+ .rf-playlist__tracks {
53
+ padding: 0;
54
+ margin: 0;
55
+ border: 1px solid var(--rf-color-border);
56
+ border-radius: var(--rf-radius-md);
57
+ }
58
58
 
59
- /* Track items — override sequence dimension's absolute positioning */
60
- .rf-playlist__tracks > li {
61
- gap: 0.75rem;
62
- padding: 0.75rem 1.25rem;
63
- padding-left: 1.25rem;
64
- transition: background 0.15s ease;
65
- }
66
- .rf-playlist__tracks > li + li {
67
- border-top: 1px solid var(--rf-color-border);
68
- }
69
- .rf-playlist__tracks > li:hover {
70
- background: color-mix(in srgb, var(--rf-color-border) 15%, transparent);
71
- }
72
- .rf-playlist__tracks > li::before {
73
- font-size: var(--rf-text-xs);
74
- font-variant-numeric: tabular-nums;
75
- color: var(--rf-color-muted);
76
- background: none;
77
- border-radius: 0;
78
- text-align: right;
79
- }
59
+ /* Track items — override sequence dimension's absolute positioning */
60
+ .rf-playlist__tracks > li {
61
+ gap: 0.75rem;
62
+ padding: 0.75rem 1.25rem;
63
+ padding-left: 1.25rem;
64
+ transition: background 0.15s ease;
65
+ }
66
+ .rf-playlist__tracks > li + li {
67
+ border-top: 1px solid var(--rf-color-border);
68
+ }
69
+ .rf-playlist__tracks > li:hover {
70
+ background: color-mix(in srgb, var(--rf-color-border) 15%, transparent);
71
+ }
72
+ .rf-playlist__tracks > li::before {
73
+ font-size: var(--rf-text-xs);
74
+ font-variant-numeric: tabular-nums;
75
+ color: var(--rf-color-muted);
76
+ background: none;
77
+ border-radius: 0;
78
+ text-align: right;
79
+ }
80
80
 
81
- /* Track name */
82
- .rf-playlist__tracks [data-name="track-name"] {
83
- font-size: var(--rf-text);
84
- font-weight: var(--rf-weight-medium);
85
- color: var(--rf-color-text);
86
- text-overflow: ellipsis;
87
- white-space: nowrap;
88
- }
89
-
90
- /* Track artist */
91
- .rf-playlist__tracks [data-name="track-artist"] {
92
- font-size: var(--rf-text-sm);
93
- color: var(--rf-color-muted);
94
- }
95
- .rf-playlist__tracks [data-name="track-artist"]::before {
96
- content: '\00b7';
97
- margin-right: 0.5rem;
98
- opacity: 0.5;
99
- }
81
+ /* Track name */
82
+ .rf-playlist__tracks [data-name="track-name"] {
83
+ font-size: var(--rf-text);
84
+ font-weight: var(--rf-weight-medium);
85
+ color: var(--rf-color-text);
86
+ text-overflow: ellipsis;
87
+ white-space: nowrap;
88
+ }
100
89
 
101
- /* Track duration — pushed right */
102
- .rf-playlist__tracks [data-name="track-duration"] {
103
- font-size: var(--rf-text-sm);
104
- color: var(--rf-color-muted);
105
- font-variant-numeric: tabular-nums;
106
- text-align: right;
107
- }
90
+ /* Track artist */
91
+ .rf-playlist__tracks [data-name="track-artist"] {
92
+ font-size: var(--rf-text-sm);
93
+ color: var(--rf-color-muted);
94
+ }
95
+ .rf-playlist__tracks [data-name="track-artist"]::before {
96
+ content: "\00b7";
97
+ margin-right: 0.5rem;
98
+ opacity: 0.5;
99
+ }
108
100
 
109
- /* Track meta (date etc.) */
110
- .rf-playlist__tracks [data-name="track-meta"] {
111
- font-size: var(--rf-text-xs);
112
- color: var(--rf-color-muted);
113
- }
114
- .rf-playlist__tracks [data-name="track-meta"]::before {
115
- content: '\00b7';
116
- margin-right: 0.5rem;
117
- opacity: 0.5;
118
- }
101
+ /* Track duration — pushed right */
102
+ .rf-playlist__tracks [data-name="track-duration"] {
103
+ font-size: var(--rf-text-sm);
104
+ color: var(--rf-color-muted);
105
+ font-variant-numeric: tabular-nums;
106
+ text-align: right;
107
+ }
119
108
 
120
- /* Player area */
121
- .rf-playlist__player {
122
- padding: 0.75rem 0;
123
- margin-top: 0.5rem;
124
- }
109
+ /* Track meta (date etc.) */
110
+ .rf-playlist__tracks [data-name="track-meta"] {
111
+ font-size: var(--rf-text-xs);
112
+ color: var(--rf-color-muted);
113
+ }
114
+ .rf-playlist__tracks [data-name="track-meta"]::before {
115
+ content: "\00b7";
116
+ margin-right: 0.5rem;
117
+ opacity: 0.5;
118
+ }
125
119
 
126
- /* Hide secondary columns on narrow screens */
120
+ /* Player area */
121
+ .rf-playlist__player {
122
+ padding: 0.75rem 0;
123
+ margin-top: 0.5rem;
124
+ }
127
125
 
126
+ /* Hide secondary columns on narrow screens */
128
127
  }