@refrakt-md/lumina 0.22.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 (130) 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.map +1 -1
  6. package/dist/tokens.js +2 -0
  7. package/dist/tokens.js.map +1 -1
  8. package/index.css +10 -1
  9. package/package.json +5 -4
  10. package/styles/base/attributes.css +6 -7
  11. package/styles/dimensions/checklist.css +6 -35
  12. package/styles/dimensions/cover.css +13 -95
  13. package/styles/dimensions/density.css +3 -0
  14. package/styles/dimensions/frame.css +3 -0
  15. package/styles/dimensions/media.css +14 -61
  16. package/styles/dimensions/metadata.css +24 -74
  17. package/styles/dimensions/sections.css +10 -24
  18. package/styles/dimensions/sequence.css +14 -79
  19. package/styles/dimensions/state.css +39 -56
  20. package/styles/dimensions/substrate.css +3 -0
  21. package/styles/dimensions/surfaces.css +73 -113
  22. package/styles/elements/blockquote.css +3 -2
  23. package/styles/elements/code.css +3 -0
  24. package/styles/elements/table.css +3 -0
  25. package/styles/global.css +9 -48
  26. package/styles/layouts/blog.css +3 -64
  27. package/styles/layouts/default.css +3 -77
  28. package/styles/layouts/docs.css +3 -153
  29. package/styles/layouts/mobile.css +1 -50
  30. package/styles/layouts/on-this-page.css +3 -2
  31. package/styles/layouts/plan.css +3 -134
  32. package/styles/layouts/search.css +3 -68
  33. package/styles/layouts/split.css +24 -169
  34. package/styles/layouts/theme-toggle.css +3 -29
  35. package/styles/layouts/version-switcher.css +3 -4
  36. package/styles/runes/accordion.css +15 -58
  37. package/styles/runes/aggregate.css +3 -12
  38. package/styles/runes/annotate.css +6 -35
  39. package/styles/runes/api.css +3 -0
  40. package/styles/runes/audio.css +3 -41
  41. package/styles/runes/badge.css +3 -0
  42. package/styles/runes/bar.css +3 -0
  43. package/styles/runes/bento.css +16 -159
  44. package/styles/runes/bg.css +3 -37
  45. package/styles/runes/blog.css +3 -5
  46. package/styles/runes/bond.css +3 -23
  47. package/styles/runes/breadcrumb.css +5 -13
  48. package/styles/runes/budget.css +3 -25
  49. package/styles/runes/bug.css +3 -0
  50. package/styles/runes/card.css +24 -92
  51. package/styles/runes/cast.css +5 -22
  52. package/styles/runes/changelog.css +5 -9
  53. package/styles/runes/character.css +3 -17
  54. package/styles/runes/chart.css +10 -52
  55. package/styles/runes/codegroup.css +15 -23
  56. package/styles/runes/collection.css +5 -82
  57. package/styles/runes/compare.css +3 -14
  58. package/styles/runes/comparison.css +7 -34
  59. package/styles/runes/conversation.css +5 -27
  60. package/styles/runes/cta.css +3 -26
  61. package/styles/runes/datatable.css +25 -40
  62. package/styles/runes/decision.css +3 -0
  63. package/styles/runes/design-context.css +3 -2
  64. package/styles/runes/details.css +5 -13
  65. package/styles/runes/diagram.css +5 -13
  66. package/styles/runes/diff.css +5 -88
  67. package/styles/runes/drawer.css +1 -105
  68. package/styles/runes/embed.css +4 -12
  69. package/styles/runes/event.css +3 -1
  70. package/styles/runes/expand.css +5 -40
  71. package/styles/runes/faction.css +3 -9
  72. package/styles/runes/feature.css +4 -32
  73. package/styles/runes/figure.css +5 -24
  74. package/styles/runes/file-ref.css +3 -18
  75. package/styles/runes/form.css +3 -32
  76. package/styles/runes/gallery.css +3 -135
  77. package/styles/runes/grid.css +4 -56
  78. package/styles/runes/hero.css +13 -126
  79. package/styles/runes/hint.css +16 -41
  80. package/styles/runes/howto.css +3 -25
  81. package/styles/runes/itinerary.css +3 -32
  82. package/styles/runes/juxtapose.css +12 -87
  83. package/styles/runes/lore.css +3 -10
  84. package/styles/runes/map.css +3 -36
  85. package/styles/runes/mediatext.css +3 -44
  86. package/styles/runes/milestone.css +3 -16
  87. package/styles/runes/mockup.css +3 -108
  88. package/styles/runes/nav.css +3 -178
  89. package/styles/runes/organization.css +3 -2
  90. package/styles/runes/page-section.css +3 -4
  91. package/styles/runes/pagination.css +5 -37
  92. package/styles/runes/palette.css +3 -22
  93. package/styles/runes/placeholder.css +3 -3
  94. package/styles/runes/plan-history.css +3 -23
  95. package/styles/runes/plan-progress.css +3 -4
  96. package/styles/runes/plan-ref.css +3 -0
  97. package/styles/runes/playlist.css +2 -36
  98. package/styles/runes/plot.css +3 -19
  99. package/styles/runes/preview.css +3 -28
  100. package/styles/runes/pricing.css +7 -25
  101. package/styles/runes/progress.css +6 -25
  102. package/styles/runes/pullquote.css +3 -26
  103. package/styles/runes/realm.css +3 -9
  104. package/styles/runes/recipe.css +3 -27
  105. package/styles/runes/relationships.css +3 -34
  106. package/styles/runes/reveal.css +7 -12
  107. package/styles/runes/sandbox.css +6 -36
  108. package/styles/runes/section.css +4 -18
  109. package/styles/runes/showcase.css +3 -20
  110. package/styles/runes/sidenote.css +3 -2
  111. package/styles/runes/snippet.css +3 -0
  112. package/styles/runes/spacing.css +3 -22
  113. package/styles/runes/spec.css +3 -0
  114. package/styles/runes/steps.css +4 -36
  115. package/styles/runes/storyboard.css +2 -17
  116. package/styles/runes/swatch.css +3 -6
  117. package/styles/runes/symbol.css +6 -4
  118. package/styles/runes/tabs.css +6 -9
  119. package/styles/runes/testimonial.css +5 -6
  120. package/styles/runes/textblock.css +2 -20
  121. package/styles/runes/timeline.css +3 -21
  122. package/styles/runes/tint.css +3 -0
  123. package/styles/runes/toc.css +5 -3
  124. package/styles/runes/track.css +2 -31
  125. package/styles/runes/typography.css +3 -15
  126. package/styles/runes/work.css +3 -0
  127. package/styles/runes/xref.css +3 -1
  128. package/tokens/base.css +13 -0
  129. package/tokens/dark.css +3 -0
  130. package/styles/dimensions/guest-posture.css +0 -27
@@ -1,49 +1,22 @@
1
- /* Hint */
1
+ @layer skin {
2
+ /* Hint — skin. The sunken surface chrome (fill, border, radius) comes from
3
+ * dimensions/surfaces.css via defaultElevation: 'sunken'; only the bespoke
4
+ * padding stays here so the icon+title+body breathes wider than --rune-padding
5
+ * at compact density. The header layout + icon-glyph box mechanism live in
6
+ * @refrakt-md/skeleton (styles/runes/hint.css). */
2
7
  .rf-hint {
3
8
  --hint-color: var(--rf-color-info);
4
- padding: 0.875rem 1.25rem;
5
- border-radius: var(--rf-radius-md);
6
- background: var(--rf-color-surface);
9
+ padding: var(--rf-spacing-snug) var(--rf-spacing-cozy);
7
10
  }
8
11
  .rf-hint__header {
9
- margin-bottom: 0.375rem;
12
+ margin-bottom: var(--rf-spacing-xs);
10
13
  color: var(--hint-color);
11
14
  }
12
- /* The lone `hintType` field renders icon + label in one inline-flex span. */
13
15
  .rf-hint__header > span {
14
- display: inline-flex;
15
- align-items: center;
16
- gap: 0.375rem;
17
- }
18
- .rf-hint__header [data-icon-group="hint"] {
19
- display: block;
16
+ gap: var(--rf-spacing-xs);
20
17
  }
21
18
  .rf-hint__header [data-icon-group="hint"]::before {
22
- content: '';
23
- display: block;
24
- width: 1.25rem;
25
- height: 1.25rem;
26
19
  background-color: var(--hint-color);
27
- -webkit-mask-size: contain;
28
- mask-size: contain;
29
- -webkit-mask-repeat: no-repeat;
30
- mask-repeat: no-repeat;
31
- }
32
- [data-icon-group="hint"][data-icon="note"]::before {
33
- -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='16' x2='12' y2='12'/%3E%3Cline x1='12' y1='8' x2='12.01' y2='8'/%3E%3C/svg%3E");
34
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='16' x2='12' y2='12'/%3E%3Cline x1='12' y1='8' x2='12.01' y2='8'/%3E%3C/svg%3E");
35
- }
36
- [data-icon-group="hint"][data-icon="warning"]::before {
37
- -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'/%3E%3Cline x1='12' y1='9' x2='12' y2='13'/%3E%3Cline x1='12' y1='17' x2='12.01' y2='17'/%3E%3C/svg%3E");
38
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'/%3E%3Cline x1='12' y1='9' x2='12' y2='13'/%3E%3Cline x1='12' y1='17' x2='12.01' y2='17'/%3E%3C/svg%3E");
39
- }
40
- [data-icon-group="hint"][data-icon="caution"]::before {
41
- -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='15' y1='9' x2='9' y2='15'/%3E%3Cline x1='9' y1='9' x2='15' y2='15'/%3E%3C/svg%3E");
42
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='15' y1='9' x2='9' y2='15'/%3E%3Cline x1='9' y1='9' x2='15' y2='15'/%3E%3C/svg%3E");
43
- }
44
- [data-icon-group="hint"][data-icon="check"]::before {
45
- -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 11.08V12a10 10 0 1 1-5.93-9.14'/%3E%3Cpolyline points='22 4 12 14.01 9 11.01'/%3E%3C/svg%3E");
46
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 11.08V12a10 10 0 1 1-5.93-9.14'/%3E%3Cpolyline points='22 4 12 14.01 9 11.01'/%3E%3C/svg%3E");
47
20
  }
48
21
  .rf-hint__header [data-meta-value] {
49
22
  font-weight: var(--rf-weight-semibold);
@@ -75,18 +48,20 @@
75
48
 
76
49
  /* Context-aware: compact hint when nested inside a hero */
77
50
  .rf-hint--in-hero {
78
- margin: 1rem 0 0;
79
- padding: 0.625rem 1rem;
51
+ margin: var(--rf-spacing-cozy) 0 0;
52
+ padding: var(--rf-spacing-sm) var(--rf-spacing-cozy);
80
53
  border-radius: var(--rf-radius-sm);
81
54
  font-size: var(--rf-text-sm);
82
55
  }
83
56
  .rf-hint--in-hero .rf-hint__header {
84
- margin-bottom: 0.25rem;
57
+ margin-bottom: var(--rf-spacing-xs);
85
58
  }
86
59
 
87
60
  /* Context-aware: hint inside a feature block */
88
61
  .rf-hint--in-feature {
89
- margin: 0.75rem 0 0;
90
- padding: 0.5rem 0.875rem;
62
+ margin: var(--rf-spacing-snug) 0 0;
63
+ padding: var(--rf-spacing-sm) var(--rf-spacing-snug);
91
64
  font-size: var(--rf-text-sm);
92
65
  }
66
+
67
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* HowTo — matches recipe design */
2
3
 
3
4
  /* Tools/materials list — surfaced zone with primary markers */
@@ -21,29 +22,16 @@
21
22
  .rf-howto__content ol {
22
23
  padding-left: 0;
23
24
  margin: 0;
24
- list-style: none;
25
- counter-reset: howto-step;
26
25
  }
27
26
  .rf-howto__content ol > li {
28
- counter-increment: howto-step;
29
27
  padding: 0.625rem 0;
30
28
  padding-left: 2.25rem;
31
- position: relative;
32
29
  line-height: var(--rf-leading-relaxed);
33
30
  }
34
31
  .rf-howto__content ol > li + li {
35
32
  border-top: 1px solid var(--rf-color-border);
36
33
  }
37
34
  .rf-howto__content ol > li::before {
38
- content: counter(howto-step);
39
- position: absolute;
40
- left: 0;
41
- top: 0.625rem;
42
- width: 1.5rem;
43
- height: 1.5rem;
44
- display: flex;
45
- align-items: center;
46
- justify-content: center;
47
35
  font-size: var(--rf-text-xs);
48
36
  font-weight: var(--rf-weight-bold);
49
37
  color: var(--rf-color-primary);
@@ -71,23 +59,13 @@
71
59
  .rf-howto__content blockquote p {
72
60
  margin: 0;
73
61
  }
74
-
75
- /* Metadata — est. time / difficulty are short, symmetric facts, so keep the
76
- * def-list a dense tile grid at every width (a smaller column min than the
77
- * 8rem default) instead of the shared mobile label/value list. */
78
- .rf-howto__metadata {
79
- grid-template-columns: repeat(auto-fit, minmax(6rem, 1fr));
80
- }
81
62
  @media (max-width: 48rem) {
82
63
  .rf-howto__metadata {
83
- grid-template-columns: repeat(auto-fit, minmax(6rem, 1fr));
84
64
  gap: 0.75rem;
85
- align-items: normal;
86
65
  padding: 0;
87
66
  border: none;
88
67
  }
89
- .rf-howto__metadata > [data-name="row"] {
90
- display: flex;
91
- }
92
68
  }
93
69
 
70
+
71
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Itinerary */
2
3
  .rf-itinerary {
3
4
  margin: 2rem 0;
@@ -21,18 +22,13 @@
21
22
  padding-bottom: 0.5rem;
22
23
  border-bottom: 2px solid var(--rf-color-border);
23
24
  }
24
- .rf-itinerary-day__header:empty {
25
- display: none;
26
- }
27
25
  .rf-itinerary-day ol {
28
- list-style: none;
29
26
  padding: 0;
30
27
  margin: 0;
31
28
  }
32
29
 
33
30
  /* Stop */
34
31
  .rf-itinerary-stop {
35
- position: relative;
36
32
  padding-left: 2rem;
37
33
  padding-bottom: 1.5rem;
38
34
  border-left: 2px solid var(--rf-color-border);
@@ -43,12 +39,6 @@
43
39
  padding-bottom: 0;
44
40
  }
45
41
  .rf-itinerary-stop::before {
46
- content: '';
47
- position: absolute;
48
- left: -0.4375rem;
49
- top: 0.25rem;
50
- width: 0.75rem;
51
- height: 0.75rem;
52
42
  border-radius: 50%;
53
43
  background: var(--rf-color-primary);
54
44
  border: 2px solid var(--rf-color-bg);
@@ -57,7 +47,6 @@
57
47
 
58
48
  /* Stop time */
59
49
  .rf-itinerary-stop__time {
60
- display: block;
61
50
  font-size: var(--rf-text-xs);
62
51
  font-weight: var(--rf-weight-semibold);
63
52
  color: var(--rf-color-primary);
@@ -67,7 +56,6 @@
67
56
 
68
57
  /* Stop location */
69
58
  .rf-itinerary-stop__location {
70
- display: block;
71
59
  font-size: var(--rf-text);
72
60
  font-weight: var(--rf-weight-bold);
73
61
  color: var(--rf-color-text);
@@ -87,9 +75,6 @@
87
75
  /* Duration badge */
88
76
  .rf-itinerary-stop[data-duration]::after {
89
77
  content: attr(data-duration);
90
- position: absolute;
91
- top: 0.15rem;
92
- right: 0;
93
78
  font-size: var(--rf-text-xs);
94
79
  font-weight: var(--rf-weight-medium);
95
80
  color: var(--rf-color-muted);
@@ -126,13 +111,10 @@
126
111
 
127
112
  /* Horizontal direction */
128
113
  .rf-itinerary--horizontal .rf-itinerary-day ol {
129
- display: flex;
130
114
  gap: 2rem;
131
- overflow-x: auto;
132
115
  padding: 2rem 0 1rem;
133
116
  }
134
117
  .rf-itinerary--horizontal .rf-itinerary-stop {
135
- min-width: 14rem;
136
118
  padding-left: 0;
137
119
  padding-top: 1.5rem;
138
120
  padding-bottom: 0;
@@ -143,31 +125,20 @@
143
125
  .rf-itinerary--horizontal .rf-itinerary-stop:last-child {
144
126
  border-top-color: transparent;
145
127
  }
146
- .rf-itinerary--horizontal .rf-itinerary-stop::before {
147
- left: 0.5rem;
148
- top: -0.4375rem;
149
- }
150
128
  .rf-itinerary--horizontal .rf-itinerary-stop[data-duration]::after {
151
- position: static;
152
- display: inline-block;
153
129
  margin-top: 0.5rem;
154
130
  }
155
-
156
- /* Compact style */
157
- .rf-itinerary--compact .rf-itinerary-stop__body {
158
- display: none;
159
- }
160
131
  .rf-itinerary--compact .rf-itinerary-stop {
161
132
  padding-bottom: 0.75rem;
162
133
  }
163
134
  .rf-itinerary--compact .rf-itinerary-stop__location {
164
- display: inline;
165
135
  font-size: var(--rf-text-sm);
166
136
  }
167
137
  .rf-itinerary--compact .rf-itinerary-stop__time {
168
- display: inline;
169
138
  margin-bottom: 0;
170
139
  }
171
140
  .rf-itinerary--compact .rf-itinerary-stop__time::after {
172
141
  content: ' — ';
173
142
  }
143
+
144
+ }
@@ -1,135 +1,58 @@
1
- /* Juxtapose — interactive comparison between two panels */
2
-
3
- /* ─── Variant modifiers (for static/no-JS layout) ─── */
4
- .rf-juxtapose--slider,
5
- .rf-juxtapose--auto,
6
- .rf-juxtapose--fade,
7
- .rf-juxtapose--toggle {
8
- /* shared base — no additional styling needed */
9
- }
10
-
11
- /* ─── Panels container ─── */
1
+ @layer skin {
2
+ /* Juxtapose — skin. The panel clip/positioning, label placement, media fill, slider
3
+ * divider/handle positioning, toggle-bar flex, and meta/label hides live in
4
+ * @refrakt-md/skeleton (styles/runes/juxtapose.css). */
12
5
  .rf-juxtapose__panels {
13
6
  border-radius: var(--rf-radius-md);
14
- overflow: hidden;
15
7
  border: 1px solid var(--rf-color-border);
16
8
  background: var(--rf-color-surface);
17
9
  }
18
-
19
- /* ─── Panel ─── */
20
- .rf-juxtapose-panel {
21
- position: relative;
22
- overflow: hidden;
23
- }
24
10
  .rf-juxtapose-panel__name {
25
- position: absolute;
26
- bottom: 0.5rem;
27
11
  padding: 0.25rem 0.75rem;
28
12
  background: rgba(0, 0, 0, 0.6);
29
13
  color: white;
30
14
  font-size: var(--rf-text-xs);
31
15
  font-weight: var(--rf-weight-semibold);
32
16
  border-radius: var(--rf-radius-sm);
33
- pointer-events: none;
34
- }
35
- /* First panel: label bottom-left */
36
- .rf-juxtapose-panel:first-child .rf-juxtapose-panel__name {
37
- left: 0.5rem;
38
- }
39
- /* Second panel: label bottom-right */
40
- .rf-juxtapose-panel:last-child .rf-juxtapose-panel__name {
41
- right: 0.5rem;
42
17
  }
43
- .rf-juxtapose-panel__body {
44
- /* Content fills the panel */
45
- }
46
- .rf-juxtapose-panel__body :is(img, .rf-placeholder) {
47
- display: block;
48
- width: 100%;
49
- height: auto;
50
- object-fit: cover;
51
- }
52
-
53
- /* Hide meta tags inside panels */
54
- .rf-juxtapose-panel > meta { display: none; }
55
-
56
- /* ─── Toggle variant: labels only on buttons, not in panels ─── */
57
- .rf-juxtapose--toggle .rf-juxtapose-panel__name {
58
- display: none;
59
- }
60
-
61
- /* ─── Slider divider (injected by behavior) ─── */
62
18
  .rf-juxtapose__divider {
63
- position: absolute;
64
- z-index: 10;
65
19
  cursor: col-resize;
66
- touch-action: none;
67
20
  }
68
-
69
- /* Vertical orientation (left/right split) — default */
70
21
  .rf-juxtapose:not([data-orientation="horizontal"]) .rf-juxtapose__divider {
71
- top: 0;
72
- bottom: 0;
73
- width: 3px;
74
- transform: translateX(-50%);
75
22
  background: var(--rf-color-bg, #fff);
76
23
  box-shadow: var(--rf-shadow-sm);
77
24
  }
78
-
79
- /* Horizontal orientation (top/bottom split) */
80
25
  .rf-juxtapose[data-orientation="horizontal"] .rf-juxtapose__divider {
81
- left: 0;
82
- right: 0;
83
- height: 3px;
84
- transform: translateY(-50%);
85
26
  background: var(--rf-color-bg, #fff);
86
27
  box-shadow: var(--rf-shadow-sm);
87
28
  cursor: row-resize;
88
29
  }
89
-
90
30
  .rf-juxtapose__divider-handle {
91
- position: absolute;
92
- top: 50%;
93
- left: 50%;
94
- transform: translate(-50%, -50%);
95
- width: 2.5rem;
96
- height: 2.5rem;
97
31
  border-radius: var(--rf-radius-full);
98
32
  background: var(--rf-color-bg, #fff);
99
33
  border: 2px solid var(--rf-color-border);
100
34
  box-shadow: var(--rf-shadow-md);
101
- display: flex;
102
- align-items: center;
103
- justify-content: center;
104
35
  }
105
-
106
36
  .rf-juxtapose__divider-handle::before {
107
- content: '\2194'; /* ↔ */
37
+ content: '\2194';
108
38
  font-size: var(--rf-text);
109
39
  color: var(--rf-color-muted);
110
40
  line-height: 1;
111
41
  }
112
-
113
42
  .rf-juxtapose[data-orientation="horizontal"] .rf-juxtapose__divider-handle::before {
114
- content: '\2195'; /* ↕ */
43
+ content: '\2195';
115
44
  }
116
-
117
45
  .rf-juxtapose__divider:focus-visible {
118
46
  outline: 2px solid var(--rf-color-primary);
119
47
  outline-offset: 2px;
120
48
  }
121
-
122
- /* ─── Toggle bar (injected by behavior) ─── */
123
49
  .rf-juxtapose__toggle-bar {
124
- display: flex;
125
50
  gap: 0.125rem;
126
51
  padding: 0.125rem;
127
52
  margin-bottom: 0.75rem;
128
53
  background: var(--rf-color-surface-active);
129
54
  border-radius: var(--rf-radius-full);
130
- width: fit-content;
131
55
  }
132
-
133
56
  .rf-juxtapose__toggle-btn,
134
57
  .rf-juxtapose__toggle-btn[data-state] {
135
58
  padding: 0.25rem 0.75rem;
@@ -142,20 +65,22 @@
142
65
  cursor: pointer;
143
66
  transition: background 150ms ease, color 150ms ease;
144
67
  }
145
-
146
68
  .rf-juxtapose__toggle-btn:hover {
147
69
  color: var(--rf-color-text);
148
70
  }
149
-
150
71
  .rf-juxtapose__toggle-btn--active,
151
72
  .rf-juxtapose__toggle-btn[data-state="active"] {
152
73
  background: var(--rf-color-bg);
153
74
  color: var(--rf-color-text);
154
75
  box-shadow: var(--rf-shadow-xs);
155
76
  }
156
-
157
- /* ─── Fade variant cursor hint ─── */
158
77
  .rf-juxtapose--fade .rf-juxtapose__panels {
159
78
  cursor: pointer;
160
79
  }
80
+ [data-section="media"] > .rf-juxtapose .rf-juxtapose__panels {
81
+ background: transparent;
82
+ border: 0;
83
+ border-radius: var(--rf-radius-media);
84
+ }
161
85
 
86
+ }
@@ -1,7 +1,4 @@
1
- /* Lore */
2
- .rf-lore {
3
- position: relative;
4
- }
1
+ @layer skin {
5
2
 
6
3
  /* Content */
7
4
  .rf-lore__content {
@@ -15,7 +12,6 @@
15
12
  font-style: italic;
16
13
  }
17
14
  .rf-lore > span[property="title"] {
18
- display: block;
19
15
  font-size: var(--rf-text-2xl);
20
16
  font-weight: var(--rf-weight-bold);
21
17
  margin-bottom: 0.5rem;
@@ -29,10 +25,6 @@
29
25
  }
30
26
  .rf-lore--spoiler::after {
31
27
  content: 'Contains spoilers \2014 click to reveal';
32
- position: absolute;
33
- top: 50%;
34
- left: 50%;
35
- transform: translate(-50%, -50%);
36
28
  padding: 0.5rem 1rem;
37
29
  background: var(--rf-color-bg);
38
30
  border-radius: var(--rf-radius-md);
@@ -40,5 +32,6 @@
40
32
  font-weight: var(--rf-weight-medium);
41
33
  color: var(--rf-color-muted);
42
34
  cursor: pointer;
43
- z-index: 1;
35
+ }
36
+
44
37
  }
@@ -1,9 +1,9 @@
1
+ @layer skin {
1
2
  /* ── Map Rune ── */
2
3
 
3
4
  .rf-map {
4
5
  margin: 2rem 0;
5
6
  border-radius: var(--rf-radius-lg, 0.75rem);
6
- overflow: hidden;
7
7
  }
8
8
 
9
9
  /* Spacing variants */
@@ -12,15 +12,7 @@
12
12
  .rf-map--spacing-loose { margin: 3rem 0; }
13
13
  .rf-map--spacing-breathe { margin: 4rem 0; }
14
14
 
15
- /* Height variants */
16
- .rf-map--small .rf-map__container { height: 200px; }
17
- .rf-map--medium .rf-map__container { height: 400px; }
18
- .rf-map--large .rf-map__container { height: 600px; }
19
- .rf-map--full .rf-map__container { height: 80vh; min-height: 400px; }
20
-
21
15
  .rf-map__container {
22
- width: 100%;
23
- position: relative;
24
16
  background: var(--rf-color-surface, #f8f9fa);
25
17
  /* Establish a stacking context so Leaflet's internal pane z-indices
26
18
  * (tile-pane 200, overlay-pane 400, marker-pane 600, popup-pane 700,
@@ -28,14 +20,12 @@
28
20
  * a map dropped into a cover card's media slot punches through the
29
21
  * cover scrim (z-index auto) and overlaid content (z-index 1).
30
22
  * `position: relative` alone is not enough; `isolation: isolate` is. */
31
- isolation: isolate;
32
23
  }
33
24
 
34
25
  /* Fallback list shown while Leaflet loads */
35
26
  .rf-map__fallback {
36
27
  padding: 1.5rem;
37
28
  margin: 0;
38
- list-style: decimal inside;
39
29
  font-size: var(--rf-text-sm);
40
30
  color: var(--rf-color-muted);
41
31
  }
@@ -48,19 +38,6 @@
48
38
  color: var(--rf-color-text);
49
39
  }
50
40
 
51
- /* Accessible text list (visible to screen readers, hidden visually) */
52
- .rf-map__pins {
53
- position: absolute;
54
- width: 1px;
55
- height: 1px;
56
- padding: 0;
57
- margin: -1px;
58
- overflow: hidden;
59
- clip: rect(0, 0, 0, 0);
60
- white-space: nowrap;
61
- border: 0;
62
- }
63
-
64
41
  /* MapPin in fallback / a11y list */
65
42
  .rf-map-pin {
66
43
  padding: 0.25rem 0;
@@ -72,7 +49,6 @@
72
49
  }
73
50
 
74
51
  .rf-map-pin__group {
75
- display: inline-block;
76
52
  font-size: var(--rf-text-xs);
77
53
  padding: 0.1rem 0.5rem;
78
54
  border-radius: var(--rf-radius-sm, 0.25rem);
@@ -81,12 +57,6 @@
81
57
  margin-left: 0.5rem;
82
58
  }
83
59
 
84
- /* Hide meta tags and property spans inside the map */
85
- .rf-map meta,
86
- .rf-map span[property] {
87
- display: none;
88
- }
89
-
90
60
  /* ── Map as a media guest ──
91
61
  * When dropped into a `[data-section="media"]` slot (e.g. a card or
92
62
  * bento-cell in cover mode), the map yields its standalone presentation to
@@ -99,12 +69,8 @@
99
69
  [data-section="media"] > .rf-map {
100
70
  margin: 0;
101
71
  padding: 0;
102
- height: 100%;
103
72
  border-radius: inherit;
104
73
  }
105
- [data-section="media"] > .rf-map > .rf-map__container {
106
- height: 100%;
107
- }
108
74
  [data-section="media"] .rf-map__fallback {
109
75
  padding: 0.75rem 1rem;
110
76
  }
@@ -123,7 +89,6 @@
123
89
  }
124
90
 
125
91
  .rf-map .leaflet-popup-content strong {
126
- display: block;
127
92
  font-size: var(--rf-text);
128
93
  margin-bottom: 0.25rem;
129
94
  }
@@ -145,3 +110,5 @@
145
110
  .rf-map .leaflet-popup-content a:hover {
146
111
  text-decoration: underline;
147
112
  }
113
+
114
+ }
@@ -1,32 +1,13 @@
1
+ @layer skin {
1
2
  /* MediaText */
2
3
 
3
4
  /* Grid mode (default — no wrap) */
4
5
  .rf-mediatext:not([data-wrap="true"]) {
5
- display: grid;
6
6
  gap: 2rem;
7
- align-items: start;
8
- }
9
-
10
- /* Ratio variants for grid mode */
11
- .rf-mediatext[data-ratio="1:1"]:not([data-wrap="true"]) {
12
- grid-template-columns: 1fr 1fr;
13
- }
14
- .rf-mediatext[data-ratio="1:2"]:not([data-wrap="true"]) {
15
- grid-template-columns: 1fr 2fr;
16
- }
17
- .rf-mediatext[data-ratio="2:1"]:not([data-wrap="true"]) {
18
- grid-template-columns: 2fr 1fr;
19
- }
20
-
21
- /* Right alignment — media on the right in grid mode */
22
- .rf-mediatext--right:not([data-wrap="true"]) .rf-mediatext__media {
23
- order: 1;
24
7
  }
25
8
 
26
9
  /* Media container */
27
10
  .rf-mediatext__media :is(img, .rf-placeholder) {
28
- max-width: 100%;
29
- height: auto;
30
11
  border-radius: var(--rf-radius-md);
31
12
  }
32
13
 
@@ -38,40 +19,18 @@
38
19
  .rf-mediatext[data-wrap="true"] .rf-mediatext__media {
39
20
  margin-bottom: 1rem;
40
21
  }
41
- .rf-mediatext[data-ratio="1:1"][data-wrap="true"] .rf-mediatext__media {
42
- max-width: 50%;
43
- }
44
- .rf-mediatext[data-ratio="1:2"][data-wrap="true"] .rf-mediatext__media {
45
- max-width: 33.333%;
46
- }
47
- .rf-mediatext[data-ratio="2:1"][data-wrap="true"] .rf-mediatext__media {
48
- max-width: 66.666%;
49
- }
50
22
  .rf-mediatext--left[data-wrap="true"] .rf-mediatext__media {
51
- float: left;
52
23
  margin-right: 2rem;
53
24
  }
54
25
  .rf-mediatext--right[data-wrap="true"] .rf-mediatext__media {
55
- float: right;
56
26
  margin-left: 2rem;
57
27
  }
58
- .rf-mediatext[data-wrap="true"]::after {
59
- content: '';
60
- display: table;
61
- clear: both;
62
- }
63
28
 
64
29
  /* Responsive — stack on mobile */
65
30
  @media (max-width: 768px) {
66
- .rf-mediatext:not([data-wrap="true"]) {
67
- grid-template-columns: 1fr !important;
68
- }
69
- .rf-mediatext--right:not([data-wrap="true"]) .rf-mediatext__media {
70
- order: 0;
71
- }
72
31
  .rf-mediatext[data-wrap="true"] .rf-mediatext__media {
73
- float: none;
74
- max-width: 100%;
75
32
  margin: 0 0 1rem 0;
76
33
  }
77
34
  }
35
+
36
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Milestone */
2
3
 
3
4
  /* SPEC-079: eyebrow + metadata zone names replace header-primary /
@@ -43,15 +44,10 @@
43
44
 
44
45
  /* Backlog tabs */
45
46
  .rf-milestone__tabs {
46
- display: flex;
47
47
  border-bottom: 1px solid var(--rf-color-border);
48
- overflow-x: auto;
49
- overflow-y: hidden;
50
- -webkit-overflow-scrolling: touch;
51
48
  margin-bottom: 0;
52
49
  }
53
50
  .rf-milestone__tab {
54
- flex: 0 0 auto;
55
51
  padding: 0.5rem 1rem;
56
52
  font-size: var(--rf-text-sm);
57
53
  font-weight: var(--rf-weight-medium);
@@ -82,14 +78,9 @@
82
78
 
83
79
  /* Aggregate progress */
84
80
  .rf-milestone__progress {
85
- display: flex;
86
- flex-direction: column;
87
81
  margin-bottom: 1rem;
88
82
  }
89
83
  .rf-milestone__progress-header {
90
- display: flex;
91
- justify-content: space-between;
92
- align-items: baseline;
93
84
  margin-bottom: 0.375rem;
94
85
  }
95
86
  .rf-milestone__progress-label {
@@ -103,17 +94,13 @@
103
94
  color: var(--rf-color-muted);
104
95
  }
105
96
  .rf-milestone__progress-bar {
106
- height: 0.375rem;
107
97
  border-radius: var(--rf-radius-sm);
108
98
  background: var(--rf-color-surface-active);
109
- overflow: hidden;
110
99
  }
111
100
  .rf-milestone__progress-bar::after {
112
- content: '';
113
- display: block;
114
- height: 100%;
115
- width: var(--rf-progress, 0%);
116
101
  background: var(--rf-color-primary);
117
102
  border-radius: var(--rf-radius-sm);
118
103
  transition: width 0.3s ease;
119
104
  }
105
+
106
+ }