@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,26 +1,16 @@
1
- /* Breadcrumb */
1
+ @layer skin {
2
+ /* Breadcrumb — skin. The contents passthroughs + the flex trail live in
3
+ * @refrakt-md/skeleton (styles/runes/breadcrumb.css). */
2
4
  .rf-breadcrumb {
3
- font-size: 0.85rem;
5
+ font-size: var(--rf-text-sm);
4
6
  margin: 0 0 1.5rem;
5
7
  }
6
- .rf-breadcrumb__items {
7
- display: contents;
8
- }
9
- .rf-breadcrumb-item {
10
- display: contents;
11
- }
12
8
  .rf-breadcrumb ol {
13
- display: flex;
14
- align-items: center;
15
- flex-wrap: wrap;
16
9
  gap: 0.25rem;
17
- list-style: none;
18
10
  padding: 0;
19
11
  margin: 0;
20
12
  }
21
13
  .rf-breadcrumb li {
22
- display: flex;
23
- align-items: center;
24
14
  gap: 0.25rem;
25
15
  padding: 0;
26
16
  margin: 0;
@@ -42,5 +32,7 @@
42
32
  }
43
33
  .rf-breadcrumb li:last-child span {
44
34
  color: var(--rf-color-text);
45
- font-weight: 500;
35
+ font-weight: var(--rf-weight-medium);
36
+ }
37
+
46
38
  }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Budget */
2
3
 
3
4
  /* Duration + currency meta row — flex/gap from the shared
@@ -9,9 +10,9 @@
9
10
  margin-bottom: 1.5rem;
10
11
  }
11
12
  .rf-budget .rf-budget__eyebrow {
12
- font-size: 0.8rem;
13
- font-weight: 600;
14
- letter-spacing: 0.06em;
13
+ font-size: var(--rf-text-xs);
14
+ font-weight: var(--rf-weight-semibold);
15
+ letter-spacing: var(--rf-tracking-wider);
15
16
  text-transform: uppercase;
16
17
  color: var(--rf-color-primary);
17
18
  margin: 0 0 0.375rem;
@@ -28,8 +29,6 @@
28
29
 
29
30
  /* Categories */
30
31
  .rf-budget__categories {
31
- display: flex;
32
- flex-direction: column;
33
32
  gap: 1.5rem;
34
33
  }
35
34
 
@@ -42,17 +41,14 @@
42
41
  padding-left: 1rem;
43
42
  }
44
43
  .rf-budget-category__header {
45
- display: flex;
46
- justify-content: space-between;
47
- align-items: center;
48
44
  margin-bottom: 0.5rem;
49
45
  }
50
46
  .rf-budget-category--estimate .rf-budget-category__subtotal::before {
51
47
  content: 'est.';
52
- font-size: 0.6875rem;
53
- font-weight: 600;
48
+ font-size: var(--rf-text-xs);
49
+ font-weight: var(--rf-weight-semibold);
54
50
  text-transform: uppercase;
55
- letter-spacing: 0.05em;
51
+ letter-spacing: var(--rf-tracking-wider);
56
52
  color: var(--rf-color-warning);
57
53
  background: var(--rf-color-warning-bg);
58
54
  padding: 0.0625rem 0.375rem;
@@ -61,27 +57,23 @@
61
57
  vertical-align: middle;
62
58
  }
63
59
  .rf-budget-category__label {
64
- font-size: 0.9375rem;
65
- font-weight: 600;
60
+ font-size: var(--rf-text);
61
+ font-weight: var(--rf-weight-semibold);
66
62
  color: var(--rf-color-text);
67
63
  }
68
64
  .rf-budget-category__subtotal {
69
- font-size: 0.9375rem;
70
- font-weight: 600;
65
+ font-size: var(--rf-text);
66
+ font-weight: var(--rf-weight-semibold);
71
67
  color: var(--rf-color-text);
72
68
  white-space: nowrap;
73
69
  }
74
70
  .rf-budget-category__line-items {
75
- list-style: none;
76
71
  padding: 0;
77
72
  margin: 0;
78
73
  }
79
74
 
80
75
  /* Budget Line Item */
81
76
  .rf-budget-line-item {
82
- display: flex;
83
- justify-content: space-between;
84
- align-items: baseline;
85
77
  padding: 0.3125rem 0;
86
78
  gap: 1rem;
87
79
  }
@@ -89,14 +81,12 @@
89
81
  border-top: 1px solid var(--rf-color-border);
90
82
  }
91
83
  .rf-budget-line-item__description {
92
- font-size: 0.875rem;
84
+ font-size: var(--rf-text-sm);
93
85
  color: var(--rf-color-muted);
94
- flex: 1;
95
- min-width: 0;
96
86
  }
97
87
  .rf-budget-line-item__amount {
98
- font-size: 0.875rem;
99
- font-weight: 500;
88
+ font-size: var(--rf-text-sm);
89
+ font-weight: var(--rf-weight-medium);
100
90
  color: var(--rf-color-text);
101
91
  white-space: nowrap;
102
92
  font-variant-numeric: tabular-nums;
@@ -107,51 +97,39 @@
107
97
  margin-top: 1.5rem;
108
98
  padding-top: 1rem;
109
99
  border-top: 2px solid var(--rf-color-text);
110
- display: flex;
111
- flex-direction: column;
112
100
  gap: 0.5rem;
113
101
  }
114
102
  .rf-budget__total {
115
- display: flex;
116
- justify-content: space-between;
117
- align-items: baseline;
118
103
  gap: 1rem;
119
104
  }
120
105
  .rf-budget__total-label {
121
- font-size: 1rem;
122
- font-weight: 700;
106
+ font-size: var(--rf-text);
107
+ font-weight: var(--rf-weight-bold);
123
108
  color: var(--rf-color-text);
124
109
  }
125
110
  .rf-budget__total-amount {
126
- font-size: 1.25rem;
127
- font-weight: 700;
111
+ font-size: var(--rf-text-xl);
112
+ font-weight: var(--rf-weight-bold);
128
113
  color: var(--rf-color-text);
129
114
  white-space: nowrap;
130
115
  font-variant-numeric: tabular-nums;
131
116
  }
132
117
  .rf-budget__per-day {
133
- display: flex;
134
- justify-content: space-between;
135
- align-items: baseline;
136
118
  gap: 1rem;
137
119
  }
138
120
  .rf-budget__per-day-label {
139
- font-size: 0.8125rem;
121
+ font-size: var(--rf-text-sm);
140
122
  color: var(--rf-color-muted);
141
- min-width: 0;
142
123
  }
143
124
  .rf-budget__per-day-amount {
144
- font-size: 0.9375rem;
145
- font-weight: 500;
125
+ font-size: var(--rf-text);
126
+ font-weight: var(--rf-weight-medium);
146
127
  color: var(--rf-color-muted);
147
128
  white-space: nowrap;
148
129
  font-variant-numeric: tabular-nums;
149
130
  }
150
-
151
- /* Summary style — hide line items, show only category headers */
152
- [data-variant="summary"] .rf-budget-category__line-items {
153
- display: none;
154
- }
155
131
  [data-variant="summary"] .rf-budget-category__header {
156
132
  margin-bottom: 0;
157
133
  }
134
+
135
+ }
@@ -1,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Bug */
2
3
 
3
4
  /* SPEC-079: eyebrow + metadata zone names replace header-primary /
@@ -20,8 +21,8 @@
20
21
  .rf-bug__metadata [data-field="assignee"] dd .rf-badge::before { content: '@'; }
21
22
 
22
23
  .rf-bug__body {
23
- font-size: 0.925rem;
24
- line-height: 1.65;
24
+ font-size: var(--rf-text-sm);
25
+ line-height: var(--rf-leading-relaxed);
25
26
  }
26
27
  .rf-bug__body > section {
27
28
  margin-top: 1rem;
@@ -31,3 +32,5 @@
31
32
  .rf-bug__body > section:first-child {
32
33
  margin-top: 0.75rem;
33
34
  }
35
+
36
+ }
@@ -1,73 +1,52 @@
1
- /* card — generic content card (SPEC-070).
1
+ @layer skin {
2
+ /* card — generic content card (SPEC-070) — skin.
2
3
  *
3
4
  * A soft surface fill plus a subtle border; the surface + border + structure
4
- * (media split, footer separator) carry the card. The media|content split +
5
- * responsive collapse + inset media banner come from the shared
6
- * layouts/split.css (keyed off data-layout / data-section="media" /
7
- * data-name="content" / data-media-position).
5
+ * (media split, footer separator) carry the card. Pure layout (the stretched
6
+ * link, clip, split align, collection-grid height filling, height scale) lives in
7
+ * @refrakt-md/skeleton (styles/runes/card.css). All spacing stays here in skin.
8
8
  */
9
9
 
10
10
  .rf-card {
11
- position: relative; /* anchor for the stretched link */
12
11
  /* Thin-edge inset model (matches `bento-cell`): the card hugs its media with
13
12
  * only a small edge margin, and the content zone adds the remaining inset
14
- * back below so text still sits at the full `--rune-padding` while media
15
- * sits close to the card border, with no negative-margin bleed.
16
- * `--rf-card-edge` fixed thin outer padding.
17
- * • `--rf-card-media-gap` — generous gap when media stacks above/below
18
- * content (stacked layout, or split collapsed
19
- * to one column on mobile).
20
- * • `--rf-card-split-gap` — tight gap when media sits beside content,
21
- * so the card reads as a unified surface
22
- * rather than two loosely-related panels. */
23
- --rf-card-edge: 0.5rem;
13
+ * back below. The root `padding` lives in skin so it overrides the
14
+ * surface-elevation padding (dimensions/surfaces.css, also skin) by source
15
+ * order in skeleton it would lose and an elevated card would double-pad. */
16
+ --rf-card-edge: var(--rf-spacing-sm);
24
17
  --rf-card-media-gap: var(--rf-spacing-lg);
25
18
  --rf-card-split-gap: var(--rf-spacing-sm);
26
19
  padding: var(--rf-card-edge);
27
20
  border-radius: var(--rf-radius-container);
28
21
  border: 1px solid var(--rf-color-border);
29
22
  background: var(--rf-color-surface);
30
- /* Clip non-media content (substrate patterns, bg gradient/image layers) to
31
- * the card's rounded outer corners. The displaced-peek case is unaffected:
32
- * `frame-displace` translates the guest *inside* the media zone, which has
33
- * its own `overflow: hidden`, so no peek ever crosses this boundary.
34
- * `box-shadow` from `elevation` paints outside the element box and is
35
- * unaffected by `overflow`. */
36
- overflow: hidden;
23
+ }
24
+
25
+ /* Media slot shares the card surface chrome (1px border + recessed well) so the
26
+ * framed media reads as part of the card. `:where()` keeps it overridable
27
+ * per-instance, matching the elevation rule. */
28
+ :where(.rf-card) [data-section="media"] {
29
+ border: 1px solid var(--rf-color-border);
30
+ background: oklch(from var(--rf-color-surface) calc(l - var(--rf-surface-inset-shift)) c h);
37
31
  }
38
32
 
39
33
  /* Content zone fills the remaining inset so total text padding still equals
40
- * `--rune-padding`. `max(0, …)` keeps dense+ (rune-padding < edge) safe — at
41
- * tighter densities the edge becomes the floor. */
34
+ * `--rune-padding`. `max(0, …)` keeps dense+ (rune-padding < edge) safe. */
42
35
  .rf-card__content {
43
36
  padding: max(0px, calc(var(--rune-padding, var(--rf-spacing-md)) - var(--rf-card-edge)));
44
37
  }
45
38
 
46
- /* Split layout: tight column-gap when media sits beside content. `row-gap`
47
- * stays at the larger media-gap so the collapse step (split grid single
48
- * column) automatically picks up the generous stacked spacing instead of
49
- * inheriting the tight beside-gap. (2-section cards have only one grid row in
50
- * the uncollapsed state, so row-gap is dormant until collapse.) `stretch`
51
- * lets the media zone match the content's height — the image inside uses
52
- * `object-fit: cover` so it re-crops rather than letterboxing when content
53
- * is taller than the media's natural aspect ratio.
54
- *
55
- * We set `column-gap` / `row-gap` / `align-items` directly rather than override
56
- * `--split-gap` / `--split-valign`: the shared split layout transform emits
57
- * those vars as inline styles even when the author doesn't set the matching
58
- * attributes, so a CSS-variable override loses to inline-style specificity.
59
- * Direct grid properties win via selector specificity and stay in our control. */
39
+ /* Split layout: tight column-gap beside content; row-gap stays at the larger
40
+ * media-gap so the collapse step picks up the generous stacked spacing. (The
41
+ * vertical-align is structure; these gaps are skin.) */
60
42
  .rf-card[data-media-position="start"],
61
43
  .rf-card[data-media-position="end"] {
62
44
  column-gap: var(--rf-card-split-gap);
63
45
  row-gap: var(--rf-card-media-gap);
64
- align-items: stretch;
65
46
  }
66
47
 
67
- /* Stacked layouts (top / bottom): explicit gap between the media banner and
68
- * the content zone (replaces the figure-style margin-bottom from the bleed
69
- * model). For `bottom`, column-reverse already flips the visual order, so the
70
- * gap still reads as the space between the two zones. */
48
+ /* Stacked layouts (top / bottom): explicit gap between the media banner and the
49
+ * content zone. */
71
50
  .rf-card[data-media-position="top"] > [data-section="media"] {
72
51
  margin-bottom: var(--rf-card-media-gap);
73
52
  }
@@ -86,12 +65,12 @@
86
65
  /* Eyebrow — a leading paragraph immediately before a heading, the same kicker
87
66
  * treatment as page-section / recipe. */
88
67
  .rf-card__eyebrow {
89
- font-size: 0.8rem;
90
- font-weight: 600;
91
- letter-spacing: 0.06em;
68
+ font-size: var(--rf-text-xs);
69
+ font-weight: var(--rf-weight-semibold);
70
+ letter-spacing: var(--rf-tracking-wider);
92
71
  text-transform: uppercase;
93
72
  color: var(--rf-color-primary);
94
- margin: 0 0 0.375rem;
73
+ margin: 0 0 var(--rf-spacing-xs);
95
74
  }
96
75
 
97
76
  /* The body's leading heading is the card title; drop its prose top margin so it
@@ -108,51 +87,4 @@
108
87
  color: var(--rf-color-muted);
109
88
  }
110
89
 
111
- /* In a collection grid, each row stretches its items to the tallest (see
112
- * collection.css); these rules make a stacked card spend that height usefully:
113
- * the card becomes a column, its content fills the leftover height, and the
114
- * body grows so footers drop to a common baseline across the row. Scoped to
115
- * stacked cards so a split card's grid (layouts/split.css) is left intact. */
116
- .rf-collection[data-layout='grid'] .rf-card[data-layout='stacked'] {
117
- display: flex;
118
- flex-direction: column;
119
- /* The grid/flex wrapper stretches the card, but a nested flex container
120
- * doesn't always pass that height to its own flex children; pin it so the
121
- * content/body flex:1 reliably fills. */
122
- height: 100%;
123
- }
124
- .rf-collection[data-layout='grid'] .rf-card[data-layout='stacked'] > .rf-card__content {
125
- flex: 1;
126
- }
127
- .rf-collection[data-layout='grid'] .rf-card[data-layout='stacked'] .rf-card__content {
128
- display: flex;
129
- flex-direction: column;
130
- }
131
- .rf-collection[data-layout='grid'] .rf-card[data-layout='stacked'] .rf-card__body {
132
- flex: 1;
133
- }
134
-
135
- /* Height knob (SPEC-089) — a named intrinsic-height scale for cover / bg-only
136
- * cards that have no natural content height to fill. `aspect` (→ aspect-ratio,
137
- * emitted inline by the engine) is the proportional alternative; `height` is the
138
- * absolute one. Both are authority overrides: they win over the cover variant's
139
- * default media aspect because they sit on the card root with a real value, and
140
- * over an external grid track only when the card isn't being stretched by one.
141
- * For cover cards the grid stack (cover.css) fills this box; for bg-only cards
142
- * the min-height simply gives the surface a poster shape. */
143
- .rf-card[data-height="sm"] { min-height: 12rem; }
144
- .rf-card[data-height="md"] { min-height: 18rem; }
145
- .rf-card[data-height="lg"] { min-height: 26rem; }
146
- .rf-card[data-height="xl"] { min-height: 34rem; }
147
-
148
- /* Whole-card stretched link — covers the card; real links in body/footer
149
- * sit above it via position:relative. */
150
- .rf-card__link {
151
- position: absolute;
152
- inset: 0;
153
- z-index: 0;
154
- }
155
- .rf-card a:not(.rf-card__link) {
156
- position: relative;
157
- z-index: 1;
158
90
  }
@@ -1,76 +1,59 @@
1
+ @layer skin {
1
2
  /* Cast */
2
3
 
3
4
  /* Members list — base */
4
5
  .rf-cast__members {
5
- list-style: none;
6
6
  padding: 0;
7
7
  margin: 0;
8
8
  }
9
9
 
10
10
  /* Grid layout (default) */
11
11
  .rf-cast--grid .rf-cast__members {
12
- display: grid;
13
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
14
12
  gap: 1rem;
15
13
  }
16
14
 
17
15
  /* List layout */
18
16
  .rf-cast--list .rf-cast__members {
19
- display: flex;
20
- flex-direction: column;
21
17
  gap: 0.75rem;
22
18
  }
23
19
 
24
- /* Member card — surface instead of border */
20
+ /* Member card — surface chrome (fill, border, radius, padding) comes from
21
+ * dimensions/surfaces.css via defaultElevation: 'flat'. */
25
22
  .rf-cast-member {
26
- background: var(--rf-color-surface);
27
- border-radius: var(--rf-radius-md);
28
- padding: 1.25rem;
29
23
  text-align: center;
30
24
  }
31
25
  .rf-cast-member__name {
32
- display: block;
33
- font-weight: 600;
34
- font-size: 1rem;
26
+ font-weight: var(--rf-weight-semibold);
27
+ font-size: var(--rf-text);
35
28
  color: var(--rf-color-text);
36
29
  }
37
30
  .rf-cast-member__role {
38
- display: block;
39
- font-size: 0.875rem;
31
+ font-size: var(--rf-text-sm);
40
32
  color: var(--rf-color-muted);
41
33
  margin-top: 0.125rem;
42
34
  }
43
35
  .rf-cast-member__body {
44
36
  margin-top: 0.75rem;
45
- font-size: 0.875rem;
37
+ font-size: var(--rf-text-sm);
46
38
  color: var(--rf-color-muted);
47
- line-height: 1.5;
39
+ line-height: var(--rf-leading-normal);
48
40
  }
49
- .rf-cast-member__body:empty { display: none; }
50
41
  .rf-cast-member img {
51
- width: 80px;
52
- height: 80px;
53
42
  border-radius: var(--rf-radius-full);
54
- object-fit: cover;
55
43
  margin: 0 auto 0.75rem;
56
- display: block;
57
44
  }
58
45
 
59
46
  /* List layout — horizontal member cards */
60
47
  .rf-cast--list .rf-cast-member {
61
- display: flex;
62
- align-items: center;
63
48
  gap: 1rem;
64
49
  text-align: left;
65
50
  padding: 0.75rem 1rem;
66
51
  }
67
52
  .rf-cast--list .rf-cast-member img {
68
- width: 48px;
69
- height: 48px;
70
53
  margin: 0;
71
- flex-shrink: 0;
72
54
  }
73
55
  .rf-cast--list .rf-cast-member__body {
74
56
  margin-top: 0;
75
- flex: 1;
57
+ }
58
+
76
59
  }
@@ -1,10 +1,9 @@
1
- /* Changelog */
1
+ @layer skin {
2
+ /* Changelog — skin. The display:contents passthroughs + the date/badge displays
3
+ * live in @refrakt-md/skeleton (styles/runes/changelog.css). */
2
4
  .rf-changelog {
3
5
  margin: 2rem 0;
4
6
  }
5
- .rf-changelog__releases {
6
- display: contents;
7
- }
8
7
  .rf-changelog-release {
9
8
  padding: 1.5rem 0;
10
9
  border-bottom: 1px solid var(--rf-color-border);
@@ -12,18 +11,14 @@
12
11
  .rf-changelog-release:last-child {
13
12
  border-bottom: none;
14
13
  }
15
- .rf-changelog-release__body {
16
- display: contents;
17
- }
18
14
  .rf-changelog-release h3 {
19
- font-size: 1.25rem;
20
- font-weight: 700;
15
+ font-size: var(--rf-text-xl);
16
+ font-weight: var(--rf-weight-bold);
21
17
  margin: 0 0 0.25rem;
22
18
  color: var(--rf-color-text);
23
19
  }
24
20
  .rf-changelog-release time {
25
- display: block;
26
- font-size: 0.8rem;
21
+ font-size: var(--rf-text-xs);
27
22
  color: var(--rf-color-muted);
28
23
  margin-bottom: 0.75rem;
29
24
  }
@@ -32,16 +27,15 @@
32
27
  margin: 0;
33
28
  }
34
29
  .rf-changelog-release li {
35
- font-size: 0.925rem;
36
- line-height: 1.65;
30
+ font-size: var(--rf-text-sm);
31
+ line-height: var(--rf-leading-relaxed);
37
32
  margin-bottom: 0.25rem;
38
33
  }
39
34
  .rf-changelog-release strong {
40
- display: inline-block;
41
- font-size: 0.7rem;
42
- font-weight: 700;
35
+ font-size: var(--rf-text-xs);
36
+ font-weight: var(--rf-weight-bold);
43
37
  text-transform: uppercase;
44
- letter-spacing: 0.05em;
38
+ letter-spacing: var(--rf-tracking-wider);
45
39
  padding: 0.1rem 0.4rem;
46
40
  border-radius: var(--rf-radius-sm);
47
41
  margin-right: 0.375rem;
@@ -51,3 +45,5 @@
51
45
  background: var(--rf-color-success-bg);
52
46
  color: var(--rf-color-success);
53
47
  }
48
+
49
+ }
@@ -1,33 +1,18 @@
1
+ @layer skin {
1
2
  /* Character — the title and the role/status def-list come from the shared
2
3
  * dimensions (sections + metadata); only the floated portrait avatar is
3
4
  * character-specific chrome. Unlike faction/realm, character is not a split
4
5
  * rune: the portrait floats and the content column wraps around it. */
5
6
 
6
- /* Contain the floated portrait within the article */
7
- .rf-character {
8
- display: flow-root;
9
- }
10
-
11
7
  /* Portrait — floated circular avatar */
12
8
  .rf-character__portrait {
13
- float: right;
14
9
  margin-left: 1.5rem;
15
10
  margin-bottom: 1rem;
16
- width: 120px;
17
- height: 120px;
18
11
  border-radius: var(--rf-radius-full);
19
- overflow: hidden;
20
- }
21
- .rf-character__portrait img {
22
- width: 100%;
23
- height: 100%;
24
- object-fit: cover;
25
12
  }
26
13
 
27
14
  /* Content */
28
15
  .rf-character__sections {
29
- display: flex;
30
- flex-direction: column;
31
16
  gap: 1rem;
32
17
  }
33
18
  .rf-character__content ul,
@@ -41,10 +26,9 @@
41
26
  border-top: 1px solid var(--rf-color-border);
42
27
  }
43
28
  .rf-character-section__name {
44
- display: block;
45
- font-size: 1.25rem;
46
- font-weight: 700;
47
- line-height: 1.3;
29
+ font-size: var(--rf-text-xl);
30
+ font-weight: var(--rf-weight-bold);
31
+ line-height: var(--rf-leading-snug);
48
32
  margin-bottom: 0.5rem;
49
33
  color: var(--rf-color-text);
50
34
  }
@@ -52,3 +36,5 @@
52
36
  .rf-character-section__body ol {
53
37
  padding-left: 1.5rem;
54
38
  }
39
+
40
+ }