@refrakt-md/lumina 0.22.0 → 0.24.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.
- package/base.css +7 -1
- package/contracts/structures.json +537 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -0
- package/dist/config.js.map +1 -1
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +13 -0
- package/dist/tokens.js.map +1 -1
- package/index.css +11 -1
- package/package.json +5 -4
- package/styles/base/attributes.css +6 -7
- package/styles/dimensions/checklist.css +6 -35
- package/styles/dimensions/cover.css +13 -95
- package/styles/dimensions/density.css +3 -0
- package/styles/dimensions/frame.css +3 -0
- package/styles/dimensions/media.css +14 -61
- package/styles/dimensions/metadata.css +24 -74
- package/styles/dimensions/motion.css +102 -0
- package/styles/dimensions/sections.css +10 -24
- package/styles/dimensions/sequence.css +14 -79
- package/styles/dimensions/state.css +39 -56
- package/styles/dimensions/substrate.css +3 -0
- package/styles/dimensions/surfaces.css +73 -113
- package/styles/elements/blockquote.css +3 -2
- package/styles/elements/code.css +3 -0
- package/styles/elements/table.css +3 -0
- package/styles/global.css +9 -48
- package/styles/layouts/blog.css +3 -64
- package/styles/layouts/default.css +3 -77
- package/styles/layouts/docs.css +3 -153
- package/styles/layouts/mobile.css +1 -50
- package/styles/layouts/on-this-page.css +3 -2
- package/styles/layouts/plan.css +3 -134
- package/styles/layouts/search.css +3 -68
- package/styles/layouts/split.css +24 -169
- package/styles/layouts/theme-toggle.css +3 -29
- package/styles/layouts/version-switcher.css +3 -4
- package/styles/runes/accordion.css +15 -58
- package/styles/runes/aggregate.css +3 -12
- package/styles/runes/annotate.css +6 -35
- package/styles/runes/api.css +3 -0
- package/styles/runes/audio.css +3 -41
- package/styles/runes/badge.css +3 -0
- package/styles/runes/bar.css +3 -0
- package/styles/runes/bento.css +16 -159
- package/styles/runes/bg.css +3 -37
- package/styles/runes/blog.css +3 -5
- package/styles/runes/bond.css +3 -23
- package/styles/runes/breadcrumb.css +5 -13
- package/styles/runes/budget.css +3 -25
- package/styles/runes/bug.css +3 -0
- package/styles/runes/card.css +24 -92
- package/styles/runes/cast.css +5 -22
- package/styles/runes/changelog.css +5 -9
- package/styles/runes/character.css +3 -17
- package/styles/runes/chart.css +35 -53
- package/styles/runes/codegroup.css +15 -23
- package/styles/runes/collection.css +5 -82
- package/styles/runes/compare.css +3 -14
- package/styles/runes/comparison.css +7 -34
- package/styles/runes/conversation.css +5 -27
- package/styles/runes/cta.css +3 -26
- package/styles/runes/datatable.css +25 -40
- package/styles/runes/decision.css +3 -0
- package/styles/runes/design-context.css +3 -2
- package/styles/runes/details.css +5 -13
- package/styles/runes/diagram.css +5 -13
- package/styles/runes/diff.css +5 -88
- package/styles/runes/drawer.css +1 -105
- package/styles/runes/embed.css +4 -12
- package/styles/runes/event.css +3 -1
- package/styles/runes/expand.css +5 -40
- package/styles/runes/faction.css +3 -9
- package/styles/runes/feature.css +4 -32
- package/styles/runes/figure.css +5 -24
- package/styles/runes/file-ref.css +3 -18
- package/styles/runes/form.css +3 -32
- package/styles/runes/gallery.css +3 -135
- package/styles/runes/grid.css +4 -56
- package/styles/runes/hero.css +13 -126
- package/styles/runes/hint.css +16 -41
- package/styles/runes/howto.css +3 -25
- package/styles/runes/itinerary.css +3 -32
- package/styles/runes/juxtapose.css +12 -87
- package/styles/runes/lore.css +3 -10
- package/styles/runes/map.css +3 -36
- package/styles/runes/mediatext.css +3 -44
- package/styles/runes/milestone.css +3 -16
- package/styles/runes/mockup.css +15 -108
- package/styles/runes/nav.css +3 -178
- package/styles/runes/organization.css +3 -2
- package/styles/runes/page-section.css +3 -4
- package/styles/runes/pagination.css +5 -37
- package/styles/runes/palette.css +3 -22
- package/styles/runes/placeholder.css +3 -3
- package/styles/runes/plan-history.css +3 -23
- package/styles/runes/plan-progress.css +3 -4
- package/styles/runes/plan-ref.css +3 -0
- package/styles/runes/playlist.css +2 -36
- package/styles/runes/plot.css +3 -19
- package/styles/runes/preview.css +7 -25
- package/styles/runes/pricing.css +7 -25
- package/styles/runes/progress.css +6 -25
- package/styles/runes/pullquote.css +3 -26
- package/styles/runes/realm.css +3 -9
- package/styles/runes/recipe.css +3 -27
- package/styles/runes/relationships.css +3 -34
- package/styles/runes/reveal.css +7 -12
- package/styles/runes/sandbox.css +6 -36
- package/styles/runes/section.css +4 -18
- package/styles/runes/showcase.css +3 -20
- package/styles/runes/sidenote.css +3 -2
- package/styles/runes/snippet.css +3 -0
- package/styles/runes/spacing.css +3 -22
- package/styles/runes/spec.css +3 -0
- package/styles/runes/steps.css +4 -36
- package/styles/runes/storyboard.css +2 -17
- package/styles/runes/swatch.css +3 -6
- package/styles/runes/symbol.css +6 -4
- package/styles/runes/tabs.css +6 -9
- package/styles/runes/testimonial.css +5 -6
- package/styles/runes/textblock.css +2 -20
- package/styles/runes/timeline.css +3 -21
- package/styles/runes/tint.css +3 -0
- package/styles/runes/toc.css +5 -3
- package/styles/runes/track.css +2 -31
- package/styles/runes/typography.css +3 -15
- package/styles/runes/work.css +3 -0
- package/styles/runes/xref.css +3 -1
- package/tokens/base.css +19 -0
- package/tokens/dark.css +3 -0
- package/styles/dimensions/guest-posture.css +0 -27
package/styles/runes/bug.css
CHANGED
package/styles/runes/card.css
CHANGED
|
@@ -1,73 +1,52 @@
|
|
|
1
|
-
|
|
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.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
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
|
|
47
|
-
*
|
|
48
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
}
|
package/styles/runes/cast.css
CHANGED
|
@@ -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
|
|
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
|
-
|
|
57
|
+
}
|
|
58
|
+
|
|
76
59
|
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
|
|
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
|
+
}
|
package/styles/runes/chart.css
CHANGED
|
@@ -1,50 +1,58 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
19
|
-
--rf-chart-bar-
|
|
20
|
-
--rf-chart-bar-
|
|
21
|
-
--rf-chart-bar-
|
|
22
|
-
--rf-chart-
|
|
13
|
+
--rf-chart-bar-ratio: 0.75;
|
|
14
|
+
--rf-chart-bar-thickness: 12px;
|
|
15
|
+
--rf-chart-bar-gap: 0.15;
|
|
16
|
+
--rf-chart-bar-cluster-gap: 4px;
|
|
17
|
+
--rf-chart-bar-radius: var(--rf-radius-sm);
|
|
18
|
+
--rf-chart-area-opacity: 0.3;
|
|
23
19
|
--rf-chart-point-radius: 4px;
|
|
24
20
|
--rf-chart-line-width: 2px;
|
|
25
|
-
|
|
26
|
-
/* Typography / grid (paint values applied by CSS below). */
|
|
27
21
|
--rf-chart-label-size: 12px;
|
|
28
22
|
--rf-chart-label-color: var(--rf-color-muted);
|
|
29
23
|
--rf-chart-grid-color: var(--rf-color-border);
|
|
24
|
+
--rf-chart-grid-dash-color: var(--rf-color-muted);
|
|
30
25
|
--rf-chart-grid-width: 1px;
|
|
31
|
-
|
|
32
|
-
display: block;
|
|
26
|
+
--rf-chart-grid-dash: 3 3;
|
|
33
27
|
border-radius: var(--rf-radius-lg);
|
|
34
28
|
padding: 1.5rem;
|
|
35
29
|
margin: 0;
|
|
36
30
|
}
|
|
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
31
|
.rf-chart__axis { stroke: var(--rf-chart-grid-color); stroke-width: var(--rf-chart-grid-width); }
|
|
32
|
+
/* Dotted horizontal grid lines behind the data — text-tier muted colour so the
|
|
33
|
+
* scale is legible at a glance. Opacity still keeps them quieter than the data,
|
|
34
|
+
* which stays the figure-ground emphasis. */
|
|
35
|
+
.rf-chart__grid {
|
|
36
|
+
stroke: var(--rf-chart-grid-dash-color);
|
|
37
|
+
stroke-width: var(--rf-chart-grid-width);
|
|
38
|
+
stroke-dasharray: var(--rf-chart-grid-dash);
|
|
39
|
+
opacity: 0.2;
|
|
40
|
+
}
|
|
42
41
|
.rf-chart__label { fill: var(--rf-chart-label-color); font-size: var(--rf-chart-label-size); }
|
|
42
|
+
.rf-chart__tick-label { fill: var(--rf-chart-label-color); font-size: var(--rf-chart-label-size); }
|
|
43
43
|
.rf-chart__bar { rx: var(--rf-chart-bar-radius); fill: var(--rf-chart-series-1); }
|
|
44
44
|
.rf-chart__point { fill: var(--rf-chart-series-1); }
|
|
45
45
|
.rf-chart__line { fill: none; stroke: var(--rf-chart-series-1); stroke-width: var(--rf-chart-line-width); }
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
/* Area-under-line gradient stops. The `--rf-chart-area-opacity` knob drives the
|
|
47
|
+
* top alpha; the bottom is always 0 so the gradient fades into the chart floor. */
|
|
48
|
+
.rf-chart__area-stop { stop-color: var(--rf-chart-series-1); }
|
|
49
|
+
.rf-chart__area-stop[data-series="1"] { stop-color: var(--rf-chart-series-2); }
|
|
50
|
+
.rf-chart__area-stop[data-series="2"] { stop-color: var(--rf-chart-series-3); }
|
|
51
|
+
.rf-chart__area-stop[data-series="3"] { stop-color: var(--rf-chart-series-4); }
|
|
52
|
+
.rf-chart__area-stop[data-series="4"] { stop-color: var(--rf-chart-series-5); }
|
|
53
|
+
.rf-chart__area-stop[data-series="5"] { stop-color: var(--rf-chart-series-6); }
|
|
54
|
+
.rf-chart__area-stop[data-position="top"] { stop-opacity: var(--rf-chart-area-opacity); }
|
|
55
|
+
.rf-chart__area-stop[data-position="bottom"] { stop-opacity: 0; }
|
|
48
56
|
.rf-chart__bar[data-series="1"], .rf-chart__point[data-series="1"] { fill: var(--rf-chart-series-2); }
|
|
49
57
|
.rf-chart__bar[data-series="2"], .rf-chart__point[data-series="2"] { fill: var(--rf-chart-series-3); }
|
|
50
58
|
.rf-chart__bar[data-series="3"], .rf-chart__point[data-series="3"] { fill: var(--rf-chart-series-4); }
|
|
@@ -55,11 +63,6 @@
|
|
|
55
63
|
.rf-chart__line[data-series="3"] { stroke: var(--rf-chart-series-4); }
|
|
56
64
|
.rf-chart__line[data-series="4"] { stroke: var(--rf-chart-series-5); }
|
|
57
65
|
.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
66
|
.rf-chart__bar[data-meta-sentiment="positive"], .rf-chart__point[data-meta-sentiment="positive"] { fill: var(--rf-color-success); }
|
|
64
67
|
.rf-chart__bar[data-meta-sentiment="negative"], .rf-chart__point[data-meta-sentiment="negative"] { fill: var(--rf-color-danger); }
|
|
65
68
|
.rf-chart__bar[data-meta-sentiment="caution"], .rf-chart__point[data-meta-sentiment="caution"] { fill: var(--rf-color-warning); }
|
|
@@ -68,10 +71,6 @@
|
|
|
68
71
|
.rf-chart__line[data-meta-sentiment="negative"] { stroke: var(--rf-color-danger); }
|
|
69
72
|
.rf-chart__line[data-meta-sentiment="caution"] { stroke: var(--rf-color-warning); }
|
|
70
73
|
.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
74
|
.rf-chart__data {
|
|
76
75
|
width: 100%;
|
|
77
76
|
border-collapse: collapse;
|
|
@@ -87,41 +86,22 @@
|
|
|
87
86
|
padding: 0.375rem 0.625rem;
|
|
88
87
|
text-align: left;
|
|
89
88
|
}
|
|
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
89
|
.rf-chart__title {
|
|
102
90
|
font-weight: var(--rf-weight-semibold);
|
|
103
91
|
font-size: var(--rf-text);
|
|
104
92
|
margin-bottom: 1rem;
|
|
105
93
|
text-align: center;
|
|
106
94
|
}
|
|
107
|
-
.rf-chart__container { width: 100%; }
|
|
108
|
-
.rf-chart__svg { width: 100%; height: auto; }
|
|
109
95
|
.rf-chart__legend {
|
|
110
|
-
display: flex;
|
|
111
|
-
justify-content: center;
|
|
112
96
|
gap: 1rem;
|
|
113
97
|
margin-top: 1rem;
|
|
114
98
|
}
|
|
115
99
|
.rf-chart__legend-item {
|
|
116
|
-
display: flex;
|
|
117
|
-
align-items: center;
|
|
118
100
|
gap: 0.375rem;
|
|
119
101
|
font-size: var(--rf-text-sm);
|
|
120
102
|
color: var(--rf-color-muted);
|
|
121
103
|
}
|
|
122
104
|
.rf-chart__legend-color {
|
|
123
|
-
width: 12px;
|
|
124
|
-
height: 12px;
|
|
125
105
|
border-radius: 2px;
|
|
126
106
|
background: var(--rf-chart-series-1);
|
|
127
107
|
}
|
|
@@ -130,3 +110,5 @@
|
|
|
130
110
|
.rf-chart__legend-color[data-series="3"] { background: var(--rf-chart-series-4); }
|
|
131
111
|
.rf-chart__legend-color[data-series="4"] { background: var(--rf-chart-series-5); }
|
|
132
112
|
.rf-chart__legend-color[data-series="5"] { background: var(--rf-chart-series-6); }
|
|
113
|
+
|
|
114
|
+
}
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
|
|
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
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
|
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
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
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
|
+
}
|