@refrakt-md/lumina 0.8.4 → 0.9.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 (81) hide show
  1. package/base.css +10 -0
  2. package/contracts/structures.json +235 -45
  3. package/index.css +22 -0
  4. package/package.json +6 -6
  5. package/styles/dimensions/checklist.css +81 -0
  6. package/styles/dimensions/density.css +51 -0
  7. package/styles/dimensions/media.css +62 -0
  8. package/styles/dimensions/metadata.css +161 -0
  9. package/styles/dimensions/sections.css +77 -0
  10. package/styles/dimensions/sequence.css +129 -0
  11. package/styles/dimensions/state.css +57 -0
  12. package/styles/dimensions/surfaces.css +88 -0
  13. package/styles/global.css +1 -1
  14. package/styles/layouts/docs.css +28 -2
  15. package/styles/layouts/split.css +159 -3
  16. package/styles/runes/accordion.css +1 -2
  17. package/styles/runes/annotate.css +0 -3
  18. package/styles/runes/api.css +0 -4
  19. package/styles/runes/audio.css +0 -3
  20. package/styles/runes/backlog.css +61 -0
  21. package/styles/runes/bento.css +4 -5
  22. package/styles/runes/blog.css +94 -0
  23. package/styles/runes/budget.css +3 -19
  24. package/styles/runes/bug.css +25 -0
  25. package/styles/runes/cast.css +0 -3
  26. package/styles/runes/character.css +5 -43
  27. package/styles/runes/chart.css +0 -2
  28. package/styles/runes/codegroup.css +2 -2
  29. package/styles/runes/compare.css +0 -1
  30. package/styles/runes/conversation.css +0 -1
  31. package/styles/runes/cta.css +6 -3
  32. package/styles/runes/datatable.css +0 -3
  33. package/styles/runes/decision-log.css +46 -0
  34. package/styles/runes/decision.css +21 -0
  35. package/styles/runes/design-context.css +0 -1
  36. package/styles/runes/details.css +0 -1
  37. package/styles/runes/diagram.css +0 -1
  38. package/styles/runes/diff.css +0 -1
  39. package/styles/runes/embed.css +0 -1
  40. package/styles/runes/event.css +0 -3
  41. package/styles/runes/faction.css +79 -48
  42. package/styles/runes/feature.css +10 -10
  43. package/styles/runes/figure.css +0 -3
  44. package/styles/runes/form.css +0 -1
  45. package/styles/runes/gallery.css +0 -1
  46. package/styles/runes/grid.css +0 -3
  47. package/styles/runes/hero.css +13 -4
  48. package/styles/runes/hint.css +0 -7
  49. package/styles/runes/howto.css +7 -18
  50. package/styles/runes/itinerary.css +0 -2
  51. package/styles/runes/juxtapose.css +160 -0
  52. package/styles/runes/lore.css +0 -20
  53. package/styles/runes/map.css +6 -1
  54. package/styles/runes/mediatext.css +0 -3
  55. package/styles/runes/milestone.css +106 -0
  56. package/styles/runes/mockup.css +0 -1
  57. package/styles/runes/organization.css +0 -3
  58. package/styles/runes/palette.css +0 -3
  59. package/styles/runes/plan-activity.css +87 -0
  60. package/styles/runes/plan-progress.css +69 -0
  61. package/styles/runes/playlist.css +101 -83
  62. package/styles/runes/plot.css +0 -23
  63. package/styles/runes/preview.css +9 -17
  64. package/styles/runes/pricing.css +4 -1
  65. package/styles/runes/realm.css +80 -46
  66. package/styles/runes/recipe.css +7 -89
  67. package/styles/runes/reveal.css +1 -4
  68. package/styles/runes/sandbox.css +0 -1
  69. package/styles/runes/spacing.css +0 -3
  70. package/styles/runes/spec.css +20 -0
  71. package/styles/runes/steps.css +4 -2
  72. package/styles/runes/storyboard.css +0 -3
  73. package/styles/runes/symbol.css +0 -39
  74. package/styles/runes/tabs.css +1 -4
  75. package/styles/runes/testimonial.css +0 -2
  76. package/styles/runes/textblock.css +0 -3
  77. package/styles/runes/toc.css +0 -1
  78. package/styles/runes/track.css +16 -5
  79. package/styles/runes/typography.css +0 -3
  80. package/styles/runes/work.css +35 -0
  81. package/styles/runes/xref.css +12 -0
@@ -5,7 +5,7 @@
5
5
  display: grid;
6
6
  grid-template-columns: var(--split-ratio, 1fr 1fr);
7
7
  align-items: var(--split-valign, start);
8
- gap: var(--split-gap, var(--rf-spacing-lg));
8
+ column-gap: var(--split-gap, var(--rf-spacing-lg));
9
9
  }
10
10
 
11
11
  [data-layout="split-reverse"] > [data-name="content"] { order: 2; }
@@ -13,11 +13,57 @@
13
13
 
14
14
  /* Grid so children can use justify-self/align-self (default: stretch) */
15
15
  [data-layout="split"] > [data-name="media"],
16
- [data-layout="split-reverse"] > [data-name="media"] {
16
+ [data-layout="split-reverse"] > [data-name="media"],
17
+ [data-layout="split"] > [data-section="media"],
18
+ [data-layout="split-reverse"] > [data-section="media"] {
17
19
  display: grid;
18
20
  }
19
21
 
20
- /* Collapse breakpoints */
22
+ /* ─── 3-section grid placement (header + content + media) ─────────── */
23
+ /* Only applies when a data-section="header" child exists (3-section runes).
24
+ 2-section runes (e.g. Feature with display:contents on content) use the
25
+ default 2-column flow from the base grid above. */
26
+
27
+ /* Split: header + content in col 1, media in col 2 spanning both rows */
28
+ [data-layout="split"]:has(> [data-section="header"]) > [data-section="header"] { grid-column: 1; grid-row: 1; }
29
+ [data-layout="split"]:has(> [data-section="header"]) > [data-name="content"] { grid-column: 1; grid-row: 2; }
30
+ [data-layout="split"]:has(> [data-section="header"]) > [data-section="media"] { grid-column: 2; grid-row: 1 / 3; }
31
+
32
+ /* Split-reverse: media in col 1 spanning both rows, header + content in col 2 */
33
+ [data-layout="split-reverse"]:has(> [data-section="header"]) > [data-section="header"] { grid-column: 2; grid-row: 1; }
34
+ [data-layout="split-reverse"]:has(> [data-section="header"]) > [data-name="content"] { grid-column: 2; grid-row: 2; }
35
+ [data-layout="split-reverse"]:has(> [data-section="header"]) > [data-section="media"] { grid-column: 1; grid-row: 1 / 3; }
36
+
37
+ /* Reset margin on media zone in 3-section split layouts (header + content + media).
38
+ 2-section runes (e.g. Hero) retain their per-rune media margins. */
39
+ [data-layout="split"]:has(> [data-section="header"]) > [data-section="media"],
40
+ [data-layout="split-reverse"]:has(> [data-section="header"]) > [data-section="media"] {
41
+ margin: 0;
42
+ }
43
+
44
+ /* ─── Media zone base styles ──────────────────────────────────────── */
45
+
46
+ /* Only clip overflow when media zone contains an image. Interactive content
47
+ (preview, juxtapose) needs overflow visible for bleed effects. */
48
+ [data-section="media"]:has(> img) {
49
+ border-radius: var(--rf-radius-lg);
50
+ overflow: hidden;
51
+ }
52
+ [data-section="media"] img {
53
+ display: block;
54
+ width: 100%;
55
+ height: auto;
56
+ border-radius: var(--rf-radius-lg);
57
+ }
58
+
59
+ /* Split layout media gets subtle depth */
60
+ [data-layout="split"] > [data-section="media"] img,
61
+ [data-layout="split-reverse"] > [data-section="media"] img {
62
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
63
+ }
64
+
65
+ /* ─── Collapse breakpoints ────────────────────────────────────────── */
66
+
21
67
  @media (max-width: 640px) {
22
68
  [data-layout^="split"][data-collapse="sm"] { grid-template-columns: 1fr; }
23
69
  [data-layout^="split"][data-collapse="sm"] > * { order: unset; }
@@ -32,3 +78,113 @@
32
78
  [data-layout^="split"][data-collapse="lg"] { grid-template-columns: 1fr; }
33
79
  [data-layout^="split"][data-collapse="lg"] > * { order: unset; }
34
80
  }
81
+
82
+ /* ─── Default mobile collapse for split layouts ───────────────────── */
83
+ /* Runes without an explicit data-collapse always collapse at sm */
84
+
85
+ @media (max-width: 640px) {
86
+ [data-layout^="split"]:not([data-collapse]) {
87
+ grid-template-columns: 1fr;
88
+ }
89
+ [data-layout^="split"]:not([data-collapse]) > [data-section="header"],
90
+ [data-layout^="split"]:not([data-collapse]) > [data-name="content"],
91
+ [data-layout^="split"]:not([data-collapse]) > [data-section="media"] {
92
+ grid-column: auto;
93
+ grid-row: auto;
94
+ }
95
+ [data-layout^="split"]:not([data-collapse]) > * {
96
+ order: unset;
97
+ }
98
+
99
+ /* ─── Content-first collapse (data-media-position="top") ────────── */
100
+ /* Media hoists above preamble as full-bleed card header */
101
+ [data-media-position="top"] > [data-section="media"],
102
+ [data-media-position="top"][data-layout="split"] > [data-section="media"],
103
+ [data-media-position="top"][data-layout="split-reverse"] > [data-section="media"] {
104
+ order: -1;
105
+ grid-column: auto;
106
+ grid-row: auto;
107
+ width: calc(100% + 2 * var(--rune-padding, var(--rf-spacing-md)));
108
+ margin: calc(-1 * var(--rune-padding, var(--rf-spacing-md)));
109
+ margin-bottom: var(--rune-padding, var(--rf-spacing-md));
110
+ border-radius: 0;
111
+ }
112
+ [data-media-position="top"] > [data-section="media"] img {
113
+ border-radius: var(--rf-radius-md) var(--rf-radius-md) 0 0;
114
+ }
115
+
116
+ /* Stacked layout also needs flex context for order to work */
117
+ [data-media-position="top"][data-layout="stacked"] {
118
+ display: flex;
119
+ flex-direction: column;
120
+ }
121
+ }
122
+
123
+ /* ─── Explicit collapse breakpoint + content-first ────────────────── */
124
+
125
+ @media (max-width: 640px) {
126
+ [data-media-position="top"][data-collapse="sm"] > [data-section="media"],
127
+ [data-media-position="top"][data-collapse="sm"][data-layout="split"] > [data-section="media"],
128
+ [data-media-position="top"][data-collapse="sm"][data-layout="split-reverse"] > [data-section="media"] {
129
+ order: -1;
130
+ grid-column: auto;
131
+ grid-row: auto;
132
+ width: calc(100% + 2 * var(--rune-padding, var(--rf-spacing-md)));
133
+ margin: calc(-1 * var(--rune-padding, var(--rf-spacing-md)));
134
+ margin-bottom: var(--rune-padding, var(--rf-spacing-md));
135
+ border-radius: 0;
136
+ }
137
+ [data-media-position="top"][data-collapse="sm"] > [data-section="media"] img {
138
+ border-radius: var(--rf-radius-md) var(--rf-radius-md) 0 0;
139
+ }
140
+ /* Reset grid placement on collapse for header/content */
141
+ [data-media-position="top"][data-collapse="sm"] > [data-section="header"],
142
+ [data-media-position="top"][data-collapse="sm"] > [data-name="content"] {
143
+ grid-column: auto;
144
+ grid-row: auto;
145
+ }
146
+ }
147
+
148
+ @media (max-width: 768px) {
149
+ [data-media-position="top"][data-collapse="md"] > [data-section="media"],
150
+ [data-media-position="top"][data-collapse="md"][data-layout="split"] > [data-section="media"],
151
+ [data-media-position="top"][data-collapse="md"][data-layout="split-reverse"] > [data-section="media"] {
152
+ order: -1;
153
+ grid-column: auto;
154
+ grid-row: auto;
155
+ width: calc(100% + 2 * var(--rune-padding, var(--rf-spacing-md)));
156
+ margin: calc(-1 * var(--rune-padding, var(--rf-spacing-md)));
157
+ margin-bottom: var(--rune-padding, var(--rf-spacing-md));
158
+ border-radius: 0;
159
+ }
160
+ [data-media-position="top"][data-collapse="md"] > [data-section="media"] img {
161
+ border-radius: var(--rf-radius-md) var(--rf-radius-md) 0 0;
162
+ }
163
+ [data-media-position="top"][data-collapse="md"] > [data-section="header"],
164
+ [data-media-position="top"][data-collapse="md"] > [data-name="content"] {
165
+ grid-column: auto;
166
+ grid-row: auto;
167
+ }
168
+ }
169
+
170
+ @media (max-width: 1024px) {
171
+ [data-media-position="top"][data-collapse="lg"] > [data-section="media"],
172
+ [data-media-position="top"][data-collapse="lg"][data-layout="split"] > [data-section="media"],
173
+ [data-media-position="top"][data-collapse="lg"][data-layout="split-reverse"] > [data-section="media"] {
174
+ order: -1;
175
+ grid-column: auto;
176
+ grid-row: auto;
177
+ width: calc(100% + 2 * var(--rune-padding, var(--rf-spacing-md)));
178
+ margin: calc(-1 * var(--rune-padding, var(--rf-spacing-md)));
179
+ margin-bottom: var(--rune-padding, var(--rf-spacing-md));
180
+ border-radius: 0;
181
+ }
182
+ [data-media-position="top"][data-collapse="lg"] > [data-section="media"] img {
183
+ border-radius: var(--rf-radius-md) var(--rf-radius-md) 0 0;
184
+ }
185
+ [data-media-position="top"][data-collapse="lg"] > [data-section="header"],
186
+ [data-media-position="top"][data-collapse="lg"] > [data-name="content"] {
187
+ grid-column: auto;
188
+ grid-row: auto;
189
+ }
190
+ }
@@ -3,9 +3,8 @@
3
3
  border: 1px solid var(--rf-color-border);
4
4
  border-radius: var(--rf-radius-md);
5
5
  overflow: hidden;
6
- margin: 1.5rem 0;
7
6
  }
8
- .rf-accordion__header {
7
+ .rf-accordion__preamble {
9
8
  margin-bottom: 1.5rem;
10
9
  }
11
10
  .rf-accordion__eyebrow {
@@ -1,7 +1,4 @@
1
1
  /* Annotate */
2
- .rf-annotate {
3
- margin: 1.5rem 0;
4
- }
5
2
  .rf-annotate__body {
6
3
  display: contents;
7
4
  }
@@ -2,13 +2,9 @@
2
2
  .rf-api {
3
3
  border: 1px solid var(--rf-color-border);
4
4
  border-radius: var(--rf-radius-lg);
5
- margin: 1.5rem 0;
6
5
  overflow: hidden;
7
6
  }
8
7
  .rf-api__header {
9
- display: flex;
10
- align-items: center;
11
- gap: 0.75rem;
12
8
  padding: 1rem 1.25rem;
13
9
  background: var(--rf-color-surface-hover);
14
10
  border-bottom: 1px solid var(--rf-color-border);
@@ -1,7 +1,4 @@
1
1
  /* Audio */
2
- .rf-audio {
3
- margin: 1.5rem 0;
4
- }
5
2
  .rf-audio rf-audio {
6
3
  display: block;
7
4
  }
@@ -0,0 +1,61 @@
1
+ /* Backlog */
2
+
3
+ /* Group sections */
4
+ .rf-backlog__group {
5
+ margin-bottom: 1.5rem;
6
+ }
7
+ .rf-backlog__group-title {
8
+ font-size: 0.8125rem;
9
+ font-weight: 700;
10
+ text-transform: uppercase;
11
+ letter-spacing: 0.05em;
12
+ color: var(--rf-color-muted);
13
+ margin: 0 0 0.5rem;
14
+ padding-bottom: 0.375rem;
15
+ border-bottom: 1px solid var(--rf-color-border);
16
+ }
17
+
18
+ /* Cards — mini rune surface */
19
+ .rf-backlog__card {
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: 0.25rem;
23
+ padding: 0.75rem 1rem;
24
+ border-radius: var(--rf-radius-md);
25
+ background: var(--rf-color-surface);
26
+ margin-bottom: 0.5rem;
27
+ transition: box-shadow 200ms ease;
28
+ }
29
+ .rf-backlog__card:hover {
30
+ box-shadow: var(--rf-shadow-md);
31
+ }
32
+
33
+ /* Card link — suppress underline */
34
+ .rf-backlog__card-link {
35
+ text-decoration: none;
36
+ color: inherit;
37
+ display: flex;
38
+ flex-direction: column;
39
+ gap: 0.25rem;
40
+ }
41
+ .rf-backlog__card-link:hover {
42
+ text-decoration: none;
43
+ }
44
+
45
+ /* Card title — smaller than full rune */
46
+ .rf-backlog__card [data-section="title"] {
47
+ font-size: 0.9375rem;
48
+ font-weight: 600;
49
+ }
50
+
51
+ /* Checklist progress badge */
52
+ .rf-backlog__card-progress {
53
+ font-family: var(--rf-font-mono);
54
+ font-size: 0.6875rem;
55
+ font-weight: 600;
56
+ padding: 0.125rem 0.5rem;
57
+ border: 1px solid var(--rf-color-border);
58
+ border-radius: 999px;
59
+ color: var(--rf-color-muted);
60
+ margin-left: auto;
61
+ }
@@ -1,8 +1,8 @@
1
1
  /* Bento */
2
- .rf-bento {
3
- margin: 1.5rem 0;
4
- }
5
- .rf-bento__header {
2
+ .rf-bento__preamble {
3
+ flex-direction: column;
4
+ align-items: flex-start;
5
+ gap: 0.25rem;
6
6
  margin-bottom: 1.5rem;
7
7
  }
8
8
  .rf-bento__eyebrow {
@@ -44,7 +44,6 @@
44
44
  gap: var(--bento-gap, 1rem);
45
45
  }
46
46
  .rf-bento-cell {
47
- border: 1px solid var(--rf-color-border);
48
47
  border-radius: var(--rf-radius-md);
49
48
  padding: 1.25rem;
50
49
  background: var(--rf-color-surface);
@@ -0,0 +1,94 @@
1
+ /* Blog — post listing with filtering and sorting */
2
+ .rf-blog {
3
+ padding: 2rem 0;
4
+ }
5
+ .rf-blog__preamble {
6
+ margin-bottom: 2rem;
7
+ }
8
+ .rf-blog__headline {
9
+ font-size: 2rem;
10
+ font-weight: 700;
11
+ letter-spacing: -0.02em;
12
+ margin: 0 0 0.5rem;
13
+ line-height: 1.2;
14
+ color: var(--rf-color-text);
15
+ }
16
+ .rf-blog__blurb {
17
+ font-size: 1.1rem;
18
+ color: var(--rf-color-muted);
19
+ margin: 0 0 1rem;
20
+ line-height: 1.6;
21
+ max-width: 640px;
22
+ }
23
+ .rf-blog__posts {
24
+ display: flex;
25
+ flex-direction: column;
26
+ gap: 1.5rem;
27
+ }
28
+ .rf-blog__post {
29
+ padding: 1.25rem 1.5rem;
30
+ border-radius: var(--rf-radius-md);
31
+ background: var(--rf-color-surface);
32
+ transition: box-shadow 200ms ease;
33
+ }
34
+ .rf-blog__post:hover {
35
+ box-shadow: var(--rf-shadow-md);
36
+ }
37
+ .rf-blog__post h3 {
38
+ font-size: 1.25rem;
39
+ font-weight: 600;
40
+ margin: 0 0 0.375rem;
41
+ line-height: 1.3;
42
+ }
43
+ .rf-blog__post h3 a {
44
+ color: var(--rf-color-text);
45
+ text-decoration: none;
46
+ }
47
+ .rf-blog__post h3 a:hover {
48
+ color: var(--rf-color-primary);
49
+ }
50
+ .rf-blog__post time {
51
+ display: inline-block;
52
+ font-size: 0.85rem;
53
+ color: var(--rf-color-muted);
54
+ margin-bottom: 0.5rem;
55
+ }
56
+ .rf-blog__post p {
57
+ font-size: 0.95rem;
58
+ color: var(--rf-color-muted);
59
+ margin: 0;
60
+ line-height: 1.6;
61
+ }
62
+
63
+ /* Grid layout */
64
+ .rf-blog--grid .rf-blog__posts {
65
+ display: grid;
66
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
67
+ gap: 1.25rem;
68
+ }
69
+
70
+ /* Compact layout */
71
+ .rf-blog--compact .rf-blog__posts {
72
+ gap: 0;
73
+ }
74
+ .rf-blog--compact .rf-blog__post {
75
+ border-radius: 0;
76
+ padding: 1rem 1.25rem;
77
+ }
78
+ .rf-blog--compact .rf-blog__post:first-child {
79
+ border-radius: var(--rf-radius-md) var(--rf-radius-md) 0 0;
80
+ }
81
+ .rf-blog--compact .rf-blog__post:last-child {
82
+ border-radius: 0 0 var(--rf-radius-md) var(--rf-radius-md);
83
+ }
84
+ .rf-blog--compact .rf-blog__post h3 {
85
+ font-size: 1.1rem;
86
+ margin-bottom: 0.125rem;
87
+ }
88
+ .rf-blog--compact .rf-blog__post p {
89
+ font-size: 0.875rem;
90
+ }
91
+ .rf-blog--compact .rf-blog__post time {
92
+ font-size: 0.8rem;
93
+ margin-bottom: 0.25rem;
94
+ }
@@ -1,8 +1,8 @@
1
1
  /* Budget */
2
- .rf-budget {
3
- margin: 1.5rem 0;
4
- }
5
2
  .rf-budget__header {
3
+ display: flex;
4
+ flex-direction: column;
5
+ align-items: flex-start;
6
6
  margin-bottom: 1.5rem;
7
7
  }
8
8
  .rf-budget__title {
@@ -12,22 +12,6 @@
12
12
  color: var(--rf-color-text);
13
13
  }
14
14
 
15
- /* Meta bar — single surface strip matching recipe pattern */
16
- .rf-budget__meta {
17
- display: flex;
18
- flex-wrap: wrap;
19
- gap: 0.75rem 1.25rem;
20
- align-items: center;
21
- background: var(--rf-color-surface);
22
- border-radius: var(--rf-radius-md);
23
- padding: 0.625rem 1rem;
24
- }
25
- .rf-budget__meta-item {
26
- font-size: 0.8125rem;
27
- font-weight: 400;
28
- color: var(--rf-color-muted);
29
- }
30
-
31
15
  /* Categories */
32
16
  .rf-budget__categories {
33
17
  display: flex;
@@ -0,0 +1,25 @@
1
+ /* Bug */
2
+ .rf-bug__assignee-badge {
3
+ margin-left: auto;
4
+ }
5
+ .rf-bug__assignee-badge::before { content: '@'; }
6
+ .rf-bug__body {
7
+ font-size: 0.925rem;
8
+ line-height: 1.65;
9
+ }
10
+ .rf-bug__body > header {
11
+ margin-bottom: 0.75rem;
12
+ }
13
+ .rf-bug__body > header h1,
14
+ .rf-bug__body > header h2,
15
+ .rf-bug__body > header h3 {
16
+ margin-top: 0;
17
+ }
18
+ .rf-bug__body > div > section {
19
+ margin-top: 1rem;
20
+ padding-top: 0.75rem;
21
+ border-top: 1px solid var(--rf-color-border);
22
+ }
23
+ .rf-bug__body > div > section:first-child {
24
+ margin-top: 0.75rem;
25
+ }
@@ -1,7 +1,4 @@
1
1
  /* Cast */
2
- .rf-cast {
3
- margin: 1.5rem 0;
4
- }
5
2
 
6
3
  /* Members list — base */
7
4
  .rf-cast__members {
@@ -1,28 +1,4 @@
1
1
  /* Character */
2
- .rf-character {
3
- margin: 1.5rem 0;
4
- }
5
-
6
- /* Badge bar — surface strip */
7
- .rf-character__badge {
8
- display: flex;
9
- flex-wrap: wrap;
10
- gap: 0.75rem 1.25rem;
11
- align-items: center;
12
- background: var(--rf-color-surface);
13
- border-radius: var(--rf-radius-md);
14
- padding: 0.625rem 1rem;
15
- margin-bottom: 1rem;
16
- }
17
- .rf-character__role-badge,
18
- .rf-character__status-badge {
19
- font-size: 0.8125rem;
20
- font-weight: 500;
21
- text-transform: capitalize;
22
- color: var(--rf-color-muted);
23
- }
24
- .rf-character__role-badge::before { content: 'Role: '; font-weight: 400; opacity: 0.65; }
25
- .rf-character__status-badge::before { content: 'Status: '; font-weight: 400; opacity: 0.65; }
26
2
 
27
3
  /* Portrait */
28
4
  .rf-character__portrait {
@@ -61,30 +37,16 @@
61
37
  color: var(--rf-color-heading);
62
38
  }
63
39
 
64
- /* Role variant colors — text color only */
65
- .rf-character[data-role="protagonist"] .rf-character__role-badge {
66
- color: var(--rf-color-success);
67
- }
68
- .rf-character[data-role="antagonist"] .rf-character__role-badge {
69
- color: var(--rf-color-danger);
70
- }
71
-
72
- /* Status indicators — text color only */
73
- .rf-character[data-status="dead"] .rf-character__status-badge {
74
- color: var(--rf-color-danger);
75
- }
76
- .rf-character[data-status="missing"] .rf-character__status-badge {
77
- color: var(--rf-color-warning);
78
- }
79
-
80
40
  /* Character Section */
81
41
  .rf-character-section {
82
42
  padding: 0.75rem 0;
83
43
  border-top: 1px solid var(--rf-color-border);
84
44
  }
85
- .rf-character-section__header {
86
- font-size: 1.125rem;
87
- font-weight: 600;
45
+ .rf-character-section__name {
46
+ display: block;
47
+ font-size: 1.25rem;
48
+ font-weight: 700;
49
+ line-height: 1.3;
88
50
  margin-bottom: 0.5rem;
89
51
  color: var(--rf-color-heading);
90
52
  }
@@ -1,9 +1,7 @@
1
1
  /* Chart */
2
2
  .rf-chart {
3
- border: 1px solid var(--rf-color-border);
4
3
  border-radius: var(--rf-radius-lg);
5
4
  padding: 1.5rem;
6
- margin: 1.5rem 0;
7
5
  }
8
6
  .rf-chart__title {
9
7
  font-weight: 600;
@@ -1,12 +1,11 @@
1
1
  /* Code Group */
2
2
  .rf-codegroup {
3
3
  border: 1px solid var(--rf-color-border);
4
- border-radius: var(--rf-radius-md);
5
4
  overflow: hidden;
6
- margin: 1.5rem 0;
7
5
  background: var(--rf-color-code-bg);
8
6
  color: var(--rf-color-code-text);
9
7
  box-shadow: var(--rf-shadow-md);
8
+ padding: 0;
10
9
  }
11
10
  .rf-codegroup__topbar {
12
11
  display: flex;
@@ -15,6 +14,7 @@
15
14
  padding: 0.75rem 1rem;
16
15
  background: rgba(255, 255, 255, 0.03);
17
16
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
17
+ margin-bottom: 0;
18
18
  }
19
19
  .rf-codegroup__dot {
20
20
  width: 10px;
@@ -1,6 +1,5 @@
1
1
  /* Compare */
2
2
  .rf-compare {
3
- margin: 1.5rem 0;
4
3
  border: 1px solid var(--rf-color-border);
5
4
  border-radius: var(--rf-radius-md);
6
5
  overflow: hidden;
@@ -3,7 +3,6 @@
3
3
  display: flex;
4
4
  flex-direction: column;
5
5
  gap: 1rem;
6
- margin: 1.5rem 0;
7
6
  max-width: 40rem;
8
7
  }
9
8
  .rf-conversation__messages {
@@ -2,12 +2,15 @@
2
2
  .rf-cta {
3
3
  padding: 3.5rem 2rem 3rem;
4
4
  }
5
- .rf-cta .rf-cta__header,
5
+ .rf-cta .rf-cta__preamble,
6
6
  .rf-cta > h1, .rf-cta > h2, .rf-cta > h3,
7
7
  .rf-cta > p {
8
8
  text-align: center;
9
9
  }
10
- .rf-cta__header {
10
+ .rf-cta__preamble {
11
+ flex-direction: column;
12
+ align-items: center;
13
+ gap: 0.25rem;
11
14
  margin-bottom: 1.5rem;
12
15
  }
13
16
  /* Higher specificity needed to override .rf-cta p (0,1,1) */
@@ -130,7 +133,7 @@
130
133
  .rf-cta--in-pricing {
131
134
  padding: 1.5rem 0 0;
132
135
  }
133
- .rf-cta--in-pricing .rf-cta__header,
136
+ .rf-cta--in-pricing .rf-cta__preamble,
134
137
  .rf-cta--in-pricing > h1, .rf-cta--in-pricing > h2, .rf-cta--in-pricing > h3,
135
138
  .rf-cta--in-pricing > p {
136
139
  text-align: left;
@@ -1,7 +1,4 @@
1
1
  /* DataTable */
2
- .rf-datatable {
3
- margin: 1.5rem 0;
4
- }
5
2
  .rf-datatable__toolbar {
6
3
  display: flex;
7
4
  justify-content: flex-end;
@@ -0,0 +1,46 @@
1
+ /* Decision Log */
2
+
3
+ /* Entry list */
4
+ .rf-decision-log__list {
5
+ list-style: none;
6
+ padding: 0;
7
+ margin: 0;
8
+ }
9
+ .rf-decision-log__entry {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: 0.25rem;
13
+ padding: 0.75rem 1rem;
14
+ border-radius: var(--rf-radius-md);
15
+ background: var(--rf-color-surface);
16
+ margin-bottom: 0.5rem;
17
+ transition: box-shadow 200ms ease;
18
+ }
19
+ .rf-decision-log__entry:hover {
20
+ box-shadow: var(--rf-shadow-md);
21
+ }
22
+
23
+ /* Entry link — suppress underline */
24
+ .rf-decision-log__link {
25
+ text-decoration: none;
26
+ color: inherit;
27
+ display: flex;
28
+ flex-direction: column;
29
+ gap: 0.25rem;
30
+ }
31
+ .rf-decision-log__link:hover {
32
+ text-decoration: none;
33
+ }
34
+
35
+ /* Entry title — smaller than full rune */
36
+ .rf-decision-log__entry [data-section="title"] {
37
+ font-size: 0.9375rem;
38
+ font-weight: 600;
39
+ }
40
+
41
+ /* Superseded/deprecated entries — muted with strikethrough */
42
+ .rf-decision-log__entry[data-status="superseded"] [data-section="title"],
43
+ .rf-decision-log__entry[data-status="deprecated"] [data-section="title"] {
44
+ color: var(--rf-color-muted);
45
+ text-decoration: line-through;
46
+ }