@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,3 +1,4 @@
1
+ @layer skin {
1
2
  /* Bug */
2
3
 
3
4
  /* SPEC-079: eyebrow + metadata zone names replace header-primary /
@@ -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
  }
@@ -91,7 +70,7 @@
91
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,41 +1,33 @@
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
26
  font-weight: var(--rf-weight-semibold);
34
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
31
  font-size: var(--rf-text-sm);
40
32
  color: var(--rf-color-muted);
41
33
  margin-top: 0.125rem;
@@ -46,31 +38,22 @@
46
38
  color: var(--rf-color-muted);
47
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,9 +11,6 @@
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
15
  font-size: var(--rf-text-xl);
20
16
  font-weight: var(--rf-weight-bold);
@@ -22,7 +18,6 @@
22
18
  color: var(--rf-color-text);
23
19
  }
24
20
  .rf-changelog-release time {
25
- display: block;
26
21
  font-size: var(--rf-text-xs);
27
22
  color: var(--rf-color-muted);
28
23
  margin-bottom: 0.75rem;
@@ -37,7 +32,6 @@
37
32
  margin-bottom: 0.25rem;
38
33
  }
39
34
  .rf-changelog-release strong {
40
- display: inline-block;
41
35
  font-size: var(--rf-text-xs);
42
36
  font-weight: var(--rf-weight-bold);
43
37
  text-transform: uppercase;
@@ -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,7 +26,6 @@
41
26
  border-top: 1px solid var(--rf-color-border);
42
27
  }
43
28
  .rf-character-section__name {
44
- display: block;
45
29
  font-size: var(--rf-text-xl);
46
30
  font-weight: var(--rf-weight-bold);
47
31
  line-height: var(--rf-leading-snug);
@@ -52,3 +36,5 @@
52
36
  .rf-character-section__body ol {
53
37
  padding-left: 1.5rem;
54
38
  }
39
+
40
+ }
@@ -1,50 +1,34 @@
1
- /* Chart */
1
+ @layer skin {
2
+ /* Chart — skin. The chart block, responsive SVG/container, legend flex, swatch box,
3
+ * and the sr-only rendered data table live in @refrakt-md/skeleton
4
+ * (styles/runes/chart.css). What remains is the --rf-chart-* theming contract, SVG
5
+ * paint, palette rotation, data-table chrome, and type. */
2
6
  .rf-chart {
3
- /* ─── Theming contract (SPEC-083 / WORK-353) ───
4
- * Every paint + geometry value the renderer uses is one of these
5
- * `--rf-chart-*` properties; a theme overrides any of them (here, on a tint
6
- * scope, or inline) with no renderer or selector changes. A non-CSS provider
7
- * (canvas) reads the same props via getComputedStyle. */
8
-
9
- /* Series palette — a dedicated categorical palette, deliberately distinct
10
- * from the semantic status tokens (those are reserved for sentiment mode). */
11
7
  --rf-chart-series-1: #6366f1;
12
8
  --rf-chart-series-2: #06b6d4;
13
9
  --rf-chart-series-3: #22c55e;
14
10
  --rf-chart-series-4: #f59e0b;
15
11
  --rf-chart-series-5: #a855f7;
16
12
  --rf-chart-series-6: #ec4899;
17
-
18
- /* Geometry (layout values the renderer reads via getComputedStyle). */
19
- --rf-chart-bar-ratio: 0.75; /* bar width as a fraction of its slot */
20
- --rf-chart-bar-thickness: 48px; /* max bar width cap */
21
- --rf-chart-bar-gap: 0.15; /* slot fraction reserved as inter-group gap */
13
+ --rf-chart-bar-ratio: 0.75;
14
+ --rf-chart-bar-thickness: 48px;
15
+ --rf-chart-bar-gap: 0.15;
22
16
  --rf-chart-bar-radius: 2px;
23
17
  --rf-chart-point-radius: 4px;
24
18
  --rf-chart-line-width: 2px;
25
-
26
- /* Typography / grid (paint values applied by CSS below). */
27
19
  --rf-chart-label-size: 12px;
28
20
  --rf-chart-label-color: var(--rf-color-muted);
29
21
  --rf-chart-grid-color: var(--rf-color-border);
30
22
  --rf-chart-grid-width: 1px;
31
-
32
- display: block;
33
23
  border-radius: var(--rf-radius-lg);
34
24
  padding: 1.5rem;
35
25
  margin: 0;
36
26
  }
37
-
38
- /* ─── SVG paint — driven entirely by the contract (the renderer sets no inline
39
- * fill/stroke; it only tags elements with a class + data-series + optional
40
- * data-meta-sentiment). ─── */
41
27
  .rf-chart__axis { stroke: var(--rf-chart-grid-color); stroke-width: var(--rf-chart-grid-width); }
42
28
  .rf-chart__label { fill: var(--rf-chart-label-color); font-size: var(--rf-chart-label-size); }
43
29
  .rf-chart__bar { rx: var(--rf-chart-bar-radius); fill: var(--rf-chart-series-1); }
44
30
  .rf-chart__point { fill: var(--rf-chart-series-1); }
45
31
  .rf-chart__line { fill: none; stroke: var(--rf-chart-series-1); stroke-width: var(--rf-chart-line-width); }
46
-
47
- /* Series palette rotation (data-series 0 is the default above). */
48
32
  .rf-chart__bar[data-series="1"], .rf-chart__point[data-series="1"] { fill: var(--rf-chart-series-2); }
49
33
  .rf-chart__bar[data-series="2"], .rf-chart__point[data-series="2"] { fill: var(--rf-chart-series-3); }
50
34
  .rf-chart__bar[data-series="3"], .rf-chart__point[data-series="3"] { fill: var(--rf-chart-series-4); }
@@ -55,11 +39,6 @@
55
39
  .rf-chart__line[data-series="3"] { stroke: var(--rf-chart-series-4); }
56
40
  .rf-chart__line[data-series="4"] { stroke: var(--rf-chart-series-5); }
57
41
  .rf-chart__line[data-series="5"] { stroke: var(--rf-chart-series-6); }
58
-
59
- /* Sentiment colouring — a data cell carrying `data-meta-sentiment` overrides the
60
- * rotating palette with the semantic token (the roadmap chart renders green-done
61
- * / red-blocked with no per-chart config). After the palette so it wins at equal
62
- * specificity. */
63
42
  .rf-chart__bar[data-meta-sentiment="positive"], .rf-chart__point[data-meta-sentiment="positive"] { fill: var(--rf-color-success); }
64
43
  .rf-chart__bar[data-meta-sentiment="negative"], .rf-chart__point[data-meta-sentiment="negative"] { fill: var(--rf-color-danger); }
65
44
  .rf-chart__bar[data-meta-sentiment="caution"], .rf-chart__point[data-meta-sentiment="caution"] { fill: var(--rf-color-warning); }
@@ -68,10 +47,6 @@
68
47
  .rf-chart__line[data-meta-sentiment="negative"] { stroke: var(--rf-color-danger); }
69
48
  .rf-chart__line[data-meta-sentiment="caution"] { stroke: var(--rf-color-warning); }
70
49
  .rf-chart__line[data-meta-sentiment="neutral"] { stroke: var(--rf-color-muted); }
71
-
72
- /* Data table — the no-JS / screen-reader source of truth. Visible as the
73
- * fallback; visually-hidden (but kept for assistive tech) once rf-chart has
74
- * rendered the svg. */
75
50
  .rf-chart__data {
76
51
  width: 100%;
77
52
  border-collapse: collapse;
@@ -87,41 +62,22 @@
87
62
  padding: 0.375rem 0.625rem;
88
63
  text-align: left;
89
64
  }
90
- .rf-chart[data-rendered] .rf-chart__data {
91
- position: absolute;
92
- width: 1px;
93
- height: 1px;
94
- padding: 0;
95
- margin: -1px;
96
- overflow: hidden;
97
- clip: rect(0, 0, 0, 0);
98
- white-space: nowrap;
99
- border: 0;
100
- }
101
65
  .rf-chart__title {
102
66
  font-weight: var(--rf-weight-semibold);
103
67
  font-size: var(--rf-text);
104
68
  margin-bottom: 1rem;
105
69
  text-align: center;
106
70
  }
107
- .rf-chart__container { width: 100%; }
108
- .rf-chart__svg { width: 100%; height: auto; }
109
71
  .rf-chart__legend {
110
- display: flex;
111
- justify-content: center;
112
72
  gap: 1rem;
113
73
  margin-top: 1rem;
114
74
  }
115
75
  .rf-chart__legend-item {
116
- display: flex;
117
- align-items: center;
118
76
  gap: 0.375rem;
119
77
  font-size: var(--rf-text-sm);
120
78
  color: var(--rf-color-muted);
121
79
  }
122
80
  .rf-chart__legend-color {
123
- width: 12px;
124
- height: 12px;
125
81
  border-radius: 2px;
126
82
  background: var(--rf-chart-series-1);
127
83
  }
@@ -130,3 +86,5 @@
130
86
  .rf-chart__legend-color[data-series="3"] { background: var(--rf-chart-series-4); }
131
87
  .rf-chart__legend-color[data-series="4"] { background: var(--rf-chart-series-5); }
132
88
  .rf-chart__legend-color[data-series="5"] { background: var(--rf-chart-series-6); }
89
+
90
+ }
@@ -1,21 +1,22 @@
1
- /* Code Group
1
+ @layer skin {
2
+ /* Code Group — skin.
2
3
  *
3
4
  * Chrome (the wrapper + topbar + tabs) uses `--rf-color-surface` so it
4
5
  * reads against the page in both light and dark modes. The code areas
5
- * themselves inherit `--rf-color-code-bg` from the global `pre` rule, so
6
- * code stays on its own background even when the surrounding chrome
7
- * flips with the page mode. */
6
+ * themselves inherit `--rf-color-code-bg` from the global `pre` rule.
7
+ *
8
+ * The wrapper clip, topbar flex, list reset, the scrollable tab strip, and the
9
+ * tab flex live in @refrakt-md/skeleton (styles/runes/codegroup.css). The pre/code
10
+ * rules stay here in skin: they deliberately override elements/code.css by source
11
+ * order (the `data-overflow="wrap"` reset especially). */
8
12
  .rf-codegroup {
9
13
  border: 1px solid var(--rf-color-border);
10
- overflow: hidden;
11
14
  background: var(--rf-color-surface);
12
15
  color: var(--rf-color-text);
13
16
  box-shadow: var(--rf-shadow-md);
14
17
  padding: 0;
15
18
  }
16
19
  .rf-codegroup__topbar {
17
- display: flex;
18
- align-items: center;
19
20
  gap: 0.375rem;
20
21
  padding: 0.75rem 1rem;
21
22
  background: transparent;
@@ -24,9 +25,7 @@
24
25
  }
25
26
  /* Window chrome — three traffic-light dots painted as gradients on one
26
27
  * pseudo-element. The element reserves real width (three 10px dots, 1rem
27
- * apart) so the flex row spaces the title clear of the dots box-shadow
28
- * dots take no layout space and overlapped the title. Pure decoration, so
29
- * it lives entirely in CSS (no markup). */
28
+ * apart) so the flex row spaces the title clear of the dots. Pure decoration. */
30
29
  .rf-codegroup__topbar::before {
31
30
  content: '';
32
31
  flex: 0 0 auto;
@@ -47,19 +46,14 @@
47
46
  color: var(--rf-color-muted);
48
47
  }
49
48
  .rf-codegroup ul {
50
- list-style: none;
51
49
  padding: 0;
52
50
  margin: 0;
53
51
  }
54
52
  .rf-codegroup__tabs {
55
- display: flex;
56
53
  background: transparent;
57
54
  border-bottom: 1px solid var(--rf-color-border);
58
- overflow-x: auto;
59
- overflow-y: hidden;
60
55
  }
61
56
  .rf-codegroup__tab {
62
- flex: 0 0 auto;
63
57
  padding: 0.5rem 1rem;
64
58
  font-size: var(--rf-text-xs);
65
59
  font-family: var(--rf-font-mono);
@@ -104,14 +98,10 @@
104
98
  overflow-x: hidden;
105
99
  }
106
100
  /* WORK-304 — the standalone codeblock CSS at `elements/code.css`
107
- * sets `display: grid; min-width: max-content` on `pre code` so
108
- * row tints + line numbers extend across the horizontal scroll
109
- * region. That sizing actively prevents wrapping (the code track
110
- * is locked at max-content). Inside `overflow="wrap"` codegroups
111
- * we WANT wrapping, so revert the code element back to a plain
112
- * block with no min-width constraint. Lines stay block-flow so
113
- * Shiki's `<span class="line">` children wrap with the pre's
114
- * `white-space: pre-wrap`. */
101
+ * sets `display: grid; min-width: max-content` on `pre code`. Inside
102
+ * `overflow="wrap"` codegroups we WANT wrapping, so revert the code element
103
+ * back to a plain block with no min-width constraint. This must stay skin —
104
+ * it overrides elements/code.css (also skin) by source order + specificity. */
115
105
  .rf-codegroup[data-overflow="wrap"] pre code {
116
106
  display: block;
117
107
  min-width: 0;
@@ -119,3 +109,5 @@
119
109
  .rf-codegroup[data-overflow="hide"] pre {
120
110
  overflow-x: hidden;
121
111
  }
112
+
113
+ }