@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.
- package/base.css +2 -1
- 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 +5 -3
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +44 -3
- package/dist/tokens.js.map +1 -1
- package/index.css +11 -1
- package/package.json +7 -5
- package/styles/base/attributes.css +6 -7
- package/styles/dimensions/checklist.css +7 -36
- package/styles/dimensions/cover.css +13 -95
- package/styles/dimensions/density.css +6 -3
- package/styles/dimensions/frame.css +7 -4
- package/styles/dimensions/media.css +14 -61
- package/styles/dimensions/metadata.css +30 -80
- package/styles/dimensions/sections.css +16 -30
- package/styles/dimensions/sequence.css +17 -82
- 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 +24 -63
- package/styles/layouts/blog.css +34 -95
- package/styles/layouts/default.css +12 -86
- package/styles/layouts/docs.css +9 -159
- package/styles/layouts/mobile.css +3 -52
- package/styles/layouts/on-this-page.css +8 -7
- package/styles/layouts/plan.css +27 -158
- package/styles/layouts/search.css +17 -82
- package/styles/layouts/split.css +24 -169
- package/styles/layouts/theme-toggle.css +3 -29
- package/styles/layouts/version-switcher.css +9 -10
- package/styles/runes/accordion.css +25 -68
- package/styles/runes/aggregate.css +4 -13
- package/styles/runes/annotate.css +11 -40
- package/styles/runes/api.css +4 -1
- package/styles/runes/audio.css +12 -50
- package/styles/runes/badge.css +5 -2
- package/styles/runes/bar.css +3 -0
- package/styles/runes/bento.css +18 -161
- package/styles/runes/bg.css +3 -37
- package/styles/runes/blog.css +18 -20
- package/styles/runes/bond.css +6 -26
- package/styles/runes/breadcrumb.css +7 -15
- package/styles/runes/budget.css +23 -45
- package/styles/runes/bug.css +5 -2
- package/styles/runes/card.css +27 -95
- package/styles/runes/cast.css +10 -27
- package/styles/runes/changelog.css +13 -17
- package/styles/runes/character.css +6 -20
- package/styles/runes/chart.css +15 -57
- package/styles/runes/codegroup.css +18 -26
- package/styles/runes/collection.css +8 -85
- package/styles/runes/compare.css +8 -19
- package/styles/runes/comparison.css +29 -56
- package/styles/runes/conversation.css +9 -31
- package/styles/runes/cta.css +17 -40
- package/styles/runes/datatable.css +33 -48
- package/styles/runes/decision.css +5 -2
- package/styles/runes/design-context.css +5 -4
- package/styles/runes/details.css +9 -17
- package/styles/runes/diagram.css +8 -16
- package/styles/runes/diff.css +11 -94
- package/styles/runes/drawer.css +9 -113
- package/styles/runes/embed.css +5 -13
- package/styles/runes/event.css +5 -3
- package/styles/runes/expand.css +10 -45
- package/styles/runes/faction.css +6 -12
- package/styles/runes/feature.css +15 -43
- package/styles/runes/figure.css +7 -26
- package/styles/runes/file-ref.css +3 -18
- package/styles/runes/form.css +19 -48
- package/styles/runes/gallery.css +8 -140
- package/styles/runes/grid.css +4 -56
- package/styles/runes/hero.css +28 -140
- package/styles/runes/hint.css +23 -48
- package/styles/runes/howto.css +9 -31
- package/styles/runes/itinerary.css +15 -44
- package/styles/runes/juxtapose.css +17 -92
- package/styles/runes/lore.css +7 -14
- package/styles/runes/map.css +9 -42
- package/styles/runes/mediatext.css +4 -45
- package/styles/runes/milestone.css +15 -28
- package/styles/runes/mockup.css +10 -115
- package/styles/runes/nav.css +37 -212
- package/styles/runes/organization.css +6 -5
- package/styles/runes/page-section.css +3 -4
- package/styles/runes/pagination.css +10 -42
- package/styles/runes/palette.css +16 -35
- package/styles/runes/placeholder.css +16 -0
- package/styles/runes/plan-history.css +23 -43
- package/styles/runes/plan-progress.css +6 -7
- package/styles/runes/plan-ref.css +4 -1
- package/styles/runes/playlist.css +10 -44
- package/styles/runes/plot.css +9 -25
- package/styles/runes/preview.css +9 -34
- package/styles/runes/pricing.css +23 -41
- package/styles/runes/progress.css +8 -27
- package/styles/runes/pullquote.css +9 -31
- package/styles/runes/realm.css +6 -12
- package/styles/runes/recipe.css +12 -36
- package/styles/runes/relationships.css +5 -36
- package/styles/runes/reveal.css +17 -22
- package/styles/runes/sandbox.css +9 -39
- package/styles/runes/section.css +10 -24
- package/styles/runes/showcase.css +3 -20
- package/styles/runes/sidenote.css +5 -4
- package/styles/runes/snippet.css +3 -0
- package/styles/runes/spacing.css +14 -33
- package/styles/runes/spec.css +5 -2
- package/styles/runes/steps.css +14 -46
- package/styles/runes/storyboard.css +4 -19
- package/styles/runes/swatch.css +4 -7
- package/styles/runes/symbol.css +16 -14
- package/styles/runes/tabs.css +15 -18
- package/styles/runes/testimonial.css +12 -13
- package/styles/runes/textblock.css +6 -24
- package/styles/runes/timeline.css +10 -28
- package/styles/runes/tint.css +3 -0
- package/styles/runes/toc.css +9 -7
- package/styles/runes/track.css +12 -41
- package/styles/runes/typography.css +15 -27
- package/styles/runes/work.css +5 -2
- package/styles/runes/xref.css +3 -1
- package/tokens/base.css +56 -66
- package/tokens/dark.css +79 -80
- package/styles/dimensions/guest-posture.css +0 -27
package/styles/layouts/split.css
CHANGED
|
@@ -1,193 +1,48 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* preset). Same vocabulary as `bento-cell`:
|
|
4
|
-
* • `data-media-position="top"` — media above content (default, block flow)
|
|
5
|
-
* • `data-media-position="bottom"` — media below content (flex column-reverse)
|
|
6
|
-
* • `data-media-position="start"` — media beside content on the left (grid)
|
|
7
|
-
* • `data-media-position="end"` — media beside content on the right (grid)
|
|
1
|
+
@layer skin {
|
|
2
|
+
/* Shared media + content layout — skin.
|
|
8
3
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
4
|
+
* The layout *structure* (start/end grid, top/bottom stack, 3-section placement,
|
|
5
|
+
* the media-zone fill/clip mechanism, responsive collapse) lives in
|
|
6
|
+
* @refrakt-md/skeleton (layouts/split.css). What remains here is skin: the media
|
|
7
|
+
* radius tier, the beside-image depth shadow, and the codegroup radius alignment. */
|
|
12
8
|
|
|
13
|
-
/*
|
|
14
|
-
|
|
15
|
-
[data-media-position="start"],
|
|
16
|
-
[data-media-position="end"] {
|
|
17
|
-
display: grid;
|
|
18
|
-
grid-template-columns: var(--media-share, 50%) 1fr;
|
|
19
|
-
align-items: var(--split-valign, start);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/* "end" flips the grid so media lands in column 2 (right) instead of column 1.
|
|
23
|
-
* Source order is media-first, so we re-place media via grid-column. */
|
|
24
|
-
[data-media-position="end"] {
|
|
25
|
-
grid-template-columns: 1fr var(--media-share, 50%);
|
|
26
|
-
}
|
|
27
|
-
[data-media-position="end"] > [data-section="media"],
|
|
28
|
-
[data-media-position="end"] > [data-name="media"] { grid-column: 2; }
|
|
29
|
-
[data-media-position="end"] > [data-name="content"] { grid-column: 1; }
|
|
30
|
-
|
|
31
|
-
/* `media-ratio` → media's share of the row width (shared across runes; mirrors
|
|
32
|
-
* the bento-cell scale at `bento.css:50-54`). When unset, columns fall back to
|
|
33
|
-
* the 50% default on `--media-share`. */
|
|
34
|
-
[data-media-ratio="1/3"] { --media-share: 33.333%; }
|
|
35
|
-
[data-media-ratio="2/5"] { --media-share: 40%; }
|
|
36
|
-
[data-media-ratio="1/2"] { --media-share: 50%; }
|
|
37
|
-
[data-media-ratio="3/5"] { --media-share: 60%; }
|
|
38
|
-
[data-media-ratio="2/3"] { --media-share: 66.667%; }
|
|
39
|
-
|
|
40
|
-
/* Grid so children can use justify-self/align-self (default: stretch) */
|
|
41
|
-
[data-media-position="start"] > [data-name="media"],
|
|
42
|
-
[data-media-position="end"] > [data-name="media"],
|
|
43
|
-
[data-media-position="start"] > [data-section="media"],
|
|
44
|
-
[data-media-position="end"] > [data-section="media"] {
|
|
45
|
-
display: grid;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/* ─── Stacked layouts (top / bottom) ────────────────────────────────── */
|
|
49
|
-
|
|
50
|
-
/* "bottom" puts content on top, media at the bottom. Source order is media-
|
|
51
|
-
* first, so column-reverse flips it visually without changing the DOM. */
|
|
52
|
-
[data-media-position="bottom"] {
|
|
53
|
-
display: flex;
|
|
54
|
-
flex-direction: column-reverse;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/* ─── 3-section grid placement (header + content + media) ───────────── */
|
|
58
|
-
/* Applies only when a `data-section="header"` child exists. 2-section runes
|
|
59
|
-
* (e.g. hero, feature with the header rolled into content) fall through to
|
|
60
|
-
* the simple 2-column flow above. */
|
|
61
|
-
|
|
62
|
-
[data-media-position="start"]:has(> [data-section="header"]) > [data-section="header"] { grid-column: 1; grid-row: 1; }
|
|
63
|
-
[data-media-position="start"]:has(> [data-section="header"]) > [data-name="content"] { grid-column: 1; grid-row: 2; }
|
|
64
|
-
[data-media-position="start"]:has(> [data-section="header"]) > [data-section="media"] { grid-column: 2; grid-row: 1 / 3; }
|
|
65
|
-
|
|
66
|
-
[data-media-position="end"]:has(> [data-section="header"]) > [data-section="header"] { grid-column: 2; grid-row: 1; }
|
|
67
|
-
[data-media-position="end"]:has(> [data-section="header"]) > [data-name="content"] { grid-column: 2; grid-row: 2; }
|
|
68
|
-
[data-media-position="end"]:has(> [data-section="header"]) > [data-section="media"] { grid-column: 1; grid-row: 1 / 3; }
|
|
69
|
-
|
|
70
|
-
[data-media-position="start"]:has(> [data-section="header"]) > [data-section="media"],
|
|
71
|
-
[data-media-position="end"]:has(> [data-section="header"]) > [data-section="media"] {
|
|
72
|
-
margin: 0;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/* ─── Media zone base styles ──────────────────────────────────────── */
|
|
76
|
-
|
|
77
|
-
/* Media-zone guest adaptation (WORK-339 / SPEC-084). Any visual guest fills the
|
|
78
|
-
* zone, and the zone clips, rounds, and becomes a container-query context — so
|
|
79
|
-
* a tall guest scales/clips instead of ballooning, and intrinsically responsive
|
|
80
|
-
* guests (e.g. `mockup`'s `cqi` auto-scale) resolve against the slot. Guests
|
|
81
|
-
* that manage their own bleed / interactive chrome (preview, juxtapose, an
|
|
82
|
-
* explicitly-bleeding showcase) self-declare an opt-out below so their
|
|
83
|
-
* displacement isn't clipped. */
|
|
9
|
+
/* Media guests use the smaller media radius tier so they never read as more
|
|
10
|
+
* rounded than the (larger-radius) container they sit in. */
|
|
84
11
|
[data-section="media"] {
|
|
85
|
-
|
|
86
|
-
overflow: hidden;
|
|
87
|
-
/* Media guests use the smaller media radius tier so they never read as more
|
|
88
|
-
* rounded than the (larger-radius) container they sit in. */
|
|
89
|
-
border-radius: var(--rf-radius-media);
|
|
12
|
+
border-radius: var(--rf-radius-media);
|
|
90
13
|
}
|
|
91
14
|
[data-section="media"] > * {
|
|
92
|
-
|
|
93
|
-
width: 100%;
|
|
94
|
-
max-height: 100%;
|
|
95
|
-
border-radius: inherit;
|
|
96
|
-
margin: 0;
|
|
97
|
-
}
|
|
98
|
-
[data-section="media"] > :is(img, video) {
|
|
99
|
-
height: 100%;
|
|
100
|
-
object-fit: cover;
|
|
101
|
-
}
|
|
102
|
-
[data-section="media"]:is(
|
|
103
|
-
:has(> [data-rune="preview"]),
|
|
104
|
-
:has(> [data-rune="juxtapose"]),
|
|
105
|
-
:has(> .rf-showcase[data-displace]:not(.rf-showcase--in-bento-cell))
|
|
106
|
-
) {
|
|
107
|
-
overflow: visible;
|
|
108
|
-
container-type: normal;
|
|
15
|
+
border-radius: inherit;
|
|
109
16
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* own `__panels` chrome is dropped instead; see surfaces.css). */
|
|
17
|
+
|
|
18
|
+
/* `preview` (negative-margin breakout) and a displaced `showcase` (peek spill)
|
|
19
|
+
* want the slot fully de-chromed so the bleed reads as edge-to-edge. Juxtapose
|
|
20
|
+
* keeps the slot's rounded corners (it still reads as part of the card surface). */
|
|
115
21
|
[data-section="media"]:is(
|
|
116
|
-
|
|
117
|
-
|
|
22
|
+
:has(> [data-rune="preview"]),
|
|
23
|
+
:has(> .rf-showcase[data-displace]:not(.rf-showcase--in-bento-cell))
|
|
118
24
|
) {
|
|
119
|
-
|
|
25
|
+
border-radius: 0;
|
|
120
26
|
}
|
|
121
|
-
/* …and let those self-managing guests keep their intrinsic width/sizing: the
|
|
122
|
-
* generic `width: 100%` above would defeat a negative-margin breakout (e.g.
|
|
123
|
-
* `preview--in-feature` bleeding to the viewport edge on mobile). */
|
|
124
27
|
[data-section="media"]:is(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
28
|
+
:has(> [data-rune="preview"]),
|
|
29
|
+
:has(> [data-rune="juxtapose"]),
|
|
30
|
+
:has(> .rf-showcase[data-displace]:not(.rf-showcase--in-bento-cell))
|
|
128
31
|
) > * {
|
|
129
|
-
|
|
130
|
-
max-height: none;
|
|
131
|
-
border-radius: 0;
|
|
32
|
+
border-radius: 0;
|
|
132
33
|
}
|
|
133
34
|
|
|
134
|
-
/* (Figure-style media bleed used to live here — a negative-margin breakout that
|
|
135
|
-
* extended a top-position media banner past the container padding to leave a
|
|
136
|
-
* small consistent figure margin. Every consumer (card / recipe / realm /
|
|
137
|
-
* faction / playlist / bento-cell) moved to the thin-edge inset model — outer
|
|
138
|
-
* padding is a thin edge, the content zone fills the remaining inset — which
|
|
139
|
-
* achieves the same visual without the negative-margin hack. The rule was
|
|
140
|
-
* removed once it had no remaining matches; reintroduce a positive opt-in if
|
|
141
|
-
* a new rune ever wants figure bleed.) */
|
|
142
|
-
|
|
143
35
|
/* A code-group dropped into a media zone uses the media radius tier so its
|
|
144
|
-
* border and corners line up with the zone's clip
|
|
145
|
-
* container radius it gets as a standalone inset surface. */
|
|
36
|
+
* border and corners line up with the zone's clip. */
|
|
146
37
|
[data-section="media"] .rf-codegroup {
|
|
147
|
-
|
|
38
|
+
border-radius: var(--rf-radius-media);
|
|
148
39
|
}
|
|
149
40
|
|
|
150
41
|
/* Beside-layout images get subtle depth. Block runes carry their own visual
|
|
151
42
|
* weight (topbars, frames) so the shadow is image-only. */
|
|
152
43
|
[data-media-position="start"] > [data-section="media"] > img,
|
|
153
44
|
[data-media-position="end"] > [data-section="media"] > img {
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/* ─── Collapse breakpoints ────────────────────────────────────────────
|
|
158
|
-
* Beside (start/end) layouts drop to a single column at the chosen breakpoint;
|
|
159
|
-
* the source-order (media-first) carries through, so media ends up on top of
|
|
160
|
-
* content after the collapse. `top` / `bottom` are already stacked and unchanged
|
|
161
|
-
* by collapse (their orientation is preserved). */
|
|
162
|
-
|
|
163
|
-
@media (max-width: 640px) {
|
|
164
|
-
:is([data-media-position="start"], [data-media-position="end"])[data-collapse="sm"],
|
|
165
|
-
:is([data-media-position="start"], [data-media-position="end"]):not([data-collapse]) {
|
|
166
|
-
grid-template-columns: 1fr;
|
|
167
|
-
}
|
|
168
|
-
:is([data-media-position="start"], [data-media-position="end"])[data-collapse="sm"] > *,
|
|
169
|
-
:is([data-media-position="start"], [data-media-position="end"]):not([data-collapse]) > * {
|
|
170
|
-
grid-column: auto;
|
|
171
|
-
grid-row: auto;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
@media (max-width: 768px) {
|
|
176
|
-
:is([data-media-position="start"], [data-media-position="end"])[data-collapse="md"] {
|
|
177
|
-
grid-template-columns: 1fr;
|
|
178
|
-
}
|
|
179
|
-
:is([data-media-position="start"], [data-media-position="end"])[data-collapse="md"] > * {
|
|
180
|
-
grid-column: auto;
|
|
181
|
-
grid-row: auto;
|
|
182
|
-
}
|
|
45
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
|
|
183
46
|
}
|
|
184
47
|
|
|
185
|
-
@media (max-width: 1024px) {
|
|
186
|
-
:is([data-media-position="start"], [data-media-position="end"])[data-collapse="lg"] {
|
|
187
|
-
grid-template-columns: 1fr;
|
|
188
|
-
}
|
|
189
|
-
:is([data-media-position="start"], [data-media-position="end"])[data-collapse="lg"] > * {
|
|
190
|
-
grid-column: auto;
|
|
191
|
-
grid-row: auto;
|
|
192
|
-
}
|
|
193
48
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@layer skin {
|
|
1
2
|
/* Theme-mode toggle button (SPEC-073).
|
|
2
3
|
*
|
|
3
4
|
* Layout chrome — a peer of the search trigger, placed in the header/toolbar.
|
|
@@ -7,11 +8,6 @@
|
|
|
7
8
|
* look is unchanged, with the icon selector rekeyed from a swapped class to
|
|
8
9
|
* the `data-theme-pref` attribute. */
|
|
9
10
|
.rf-theme-toggle {
|
|
10
|
-
display: inline-flex;
|
|
11
|
-
align-items: center;
|
|
12
|
-
justify-content: center;
|
|
13
|
-
width: 2rem;
|
|
14
|
-
height: 2rem;
|
|
15
11
|
padding: 0;
|
|
16
12
|
border: 1px solid var(--rf-color-border);
|
|
17
13
|
border-radius: var(--rf-radius-md);
|
|
@@ -28,35 +24,11 @@
|
|
|
28
24
|
outline-offset: 2px;
|
|
29
25
|
}
|
|
30
26
|
|
|
31
|
-
/* In the header chrome the brand/nav and the controls are flex siblings
|
|
32
|
-
* arranged by `order` (search is order 1, nav/menu order 3). Without this the
|
|
33
|
-
* toggle defaults to order 0 and groups with the brand on the left; order 2
|
|
34
|
-
* places it just after the right-aligned search trigger — matching the former
|
|
35
|
-
* component. The plan toolbar arranges by DOM order, so it isn't included. */
|
|
36
|
-
.rf-header__inner .rf-theme-toggle,
|
|
37
|
-
.rf-docs-header__inner .rf-theme-toggle,
|
|
38
|
-
.rf-blog-header__inner .rf-theme-toggle {
|
|
39
|
-
order: 2;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/* Hidden on tint-locked pages: the saved preference is preserved but ignored
|
|
43
|
-
* while the lock is active (SPEC-052), so a toggle that does nothing would be
|
|
44
|
-
* confusing. Pure CSS — the lock lands on <html> at SSR and on client nav. */
|
|
45
|
-
html[data-tint-lock="true"] .rf-theme-toggle {
|
|
46
|
-
display: none;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
27
|
/* Icon — a currentColor-tinted mask. Defaults to the auto glyph so the SSR'd
|
|
50
28
|
* button shows an icon before the behavior sets data-theme-pref; the light and
|
|
51
29
|
* dark glyphs swap in by state. */
|
|
52
30
|
.rf-theme-toggle__icon {
|
|
53
|
-
display: inline-block;
|
|
54
|
-
width: 1rem;
|
|
55
|
-
height: 1rem;
|
|
56
31
|
background: currentColor;
|
|
57
|
-
mask-size: contain;
|
|
58
|
-
mask-repeat: no-repeat;
|
|
59
|
-
mask-position: center;
|
|
60
32
|
mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><path d='M12 2a10 10 0 0 0 0 20Z' fill='currentColor'/></svg>");
|
|
61
33
|
}
|
|
62
34
|
.rf-theme-toggle[data-theme-pref="light"] .rf-theme-toggle__icon {
|
|
@@ -65,3 +37,5 @@ html[data-tint-lock="true"] .rf-theme-toggle {
|
|
|
65
37
|
.rf-theme-toggle[data-theme-pref="dark"] .rf-theme-toggle__icon {
|
|
66
38
|
mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z'/></svg>");
|
|
67
39
|
}
|
|
40
|
+
|
|
41
|
+
}
|
|
@@ -1,33 +1,30 @@
|
|
|
1
|
+
@layer skin {
|
|
1
2
|
/* Version Switcher — page-level version dropdown */
|
|
2
3
|
|
|
3
4
|
.rf-version-switcher {
|
|
4
|
-
display: inline-flex;
|
|
5
|
-
align-items: center;
|
|
6
5
|
gap: 0.5rem;
|
|
7
6
|
margin-bottom: 1.5rem;
|
|
8
|
-
font-size:
|
|
7
|
+
font-size: var(--rf-text-sm);
|
|
9
8
|
}
|
|
10
9
|
|
|
11
10
|
.rf-version-switcher__label {
|
|
12
11
|
color: var(--rf-color-muted);
|
|
13
|
-
font-weight:
|
|
14
|
-
font-size:
|
|
12
|
+
font-weight: var(--rf-weight-medium);
|
|
13
|
+
font-size: var(--rf-text-xs);
|
|
15
14
|
text-transform: uppercase;
|
|
16
|
-
letter-spacing:
|
|
15
|
+
letter-spacing: var(--rf-tracking-wide);
|
|
17
16
|
}
|
|
18
17
|
|
|
19
18
|
.rf-version-switcher__select {
|
|
20
|
-
appearance: none;
|
|
21
|
-
-webkit-appearance: none;
|
|
22
19
|
background: var(--rf-color-surface);
|
|
23
20
|
border: 1px solid var(--rf-color-border);
|
|
24
21
|
border-radius: var(--rf-radius-sm, 0.25rem);
|
|
25
22
|
color: var(--rf-color-text);
|
|
26
|
-
font-size:
|
|
23
|
+
font-size: var(--rf-text-sm);
|
|
27
24
|
font-family: inherit;
|
|
28
25
|
padding: 0.3rem 2rem 0.3rem 0.6rem;
|
|
29
26
|
cursor: pointer;
|
|
30
|
-
line-height:
|
|
27
|
+
line-height: var(--rf-leading-snug);
|
|
31
28
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
|
|
32
29
|
background-repeat: no-repeat;
|
|
33
30
|
background-position: right 0.5rem center;
|
|
@@ -43,3 +40,5 @@
|
|
|
43
40
|
border-color: var(--rf-color-primary);
|
|
44
41
|
box-shadow: 0 0 0 2px var(--rf-color-primary-bg);
|
|
45
42
|
}
|
|
43
|
+
|
|
44
|
+
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
/*
|
|
3
|
-
|
|
1
|
+
@layer skin {
|
|
2
|
+
/* Accordion — skin. The eyebrow stretched-link, items passthrough, header flex +
|
|
3
|
+
* chevron box/glyph/rotate mechanism, title/count flex, and the ::details-content
|
|
4
|
+
* collapse mechanism live in @refrakt-md/skeleton (styles/runes/accordion.css).
|
|
5
|
+
* No wrapping border / radius — the only chrome is the divider between items. */
|
|
4
6
|
.rf-accordion__preamble {
|
|
5
7
|
margin-bottom: 1.5rem;
|
|
6
8
|
}
|
|
7
9
|
.rf-accordion__eyebrow {
|
|
8
|
-
font-size:
|
|
9
|
-
font-weight:
|
|
10
|
-
letter-spacing:
|
|
10
|
+
font-size: var(--rf-text-sm);
|
|
11
|
+
font-weight: var(--rf-weight-semibold);
|
|
12
|
+
letter-spacing: var(--rf-tracking-wider);
|
|
11
13
|
text-transform: uppercase;
|
|
12
14
|
color: var(--rf-color-primary);
|
|
13
15
|
margin: 0 0 0.5rem;
|
|
14
16
|
}
|
|
15
17
|
.rf-accordion__eyebrow:has(a) {
|
|
16
|
-
display: inline-block;
|
|
17
|
-
position: relative;
|
|
18
18
|
padding: 0.25rem 0.875rem;
|
|
19
19
|
border: 1px solid var(--rf-color-border);
|
|
20
20
|
border-radius: var(--rf-radius-full);
|
|
21
21
|
color: var(--rf-color-text);
|
|
22
|
-
font-weight:
|
|
22
|
+
font-weight: var(--rf-weight-normal);
|
|
23
23
|
text-transform: none;
|
|
24
|
-
letter-spacing:
|
|
24
|
+
letter-spacing: var(--rf-tracking-normal);
|
|
25
25
|
transition: border-color 150ms ease;
|
|
26
26
|
}
|
|
27
27
|
.rf-accordion__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
|
|
28
|
-
.rf-accordion__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight:
|
|
29
|
-
.rf-accordion__eyebrow:has(a) a::before {
|
|
28
|
+
.rf-accordion__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: var(--rf-weight-semibold); text-decoration: none; }
|
|
29
|
+
.rf-accordion__eyebrow:has(a) a::before { border-radius: inherit; }
|
|
30
30
|
.rf-accordion__headline {
|
|
31
31
|
margin-top: 0;
|
|
32
32
|
}
|
|
@@ -37,9 +37,6 @@
|
|
|
37
37
|
.rf-accordion__image {
|
|
38
38
|
margin-bottom: 1rem;
|
|
39
39
|
}
|
|
40
|
-
.rf-accordion__items {
|
|
41
|
-
display: contents;
|
|
42
|
-
}
|
|
43
40
|
.rf-accordion-item {
|
|
44
41
|
border-bottom: 1px solid var(--rf-color-border);
|
|
45
42
|
}
|
|
@@ -47,84 +44,44 @@
|
|
|
47
44
|
border-bottom: none;
|
|
48
45
|
}
|
|
49
46
|
.rf-accordion-item__header {
|
|
50
|
-
display: flex;
|
|
51
|
-
align-items: center;
|
|
52
47
|
gap: 0.5rem;
|
|
53
48
|
padding: 0.875rem 0rem;
|
|
54
|
-
font-weight:
|
|
55
|
-
font-size:
|
|
49
|
+
font-weight: var(--rf-weight-semibold);
|
|
50
|
+
font-size: var(--rf-text);
|
|
56
51
|
cursor: pointer;
|
|
57
52
|
user-select: none;
|
|
58
|
-
list-style: none;
|
|
59
53
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
/* Chevron in front of the label — points right when collapsed, rotates 90°
|
|
63
|
-
* to point down when expanded. SVG mask so the glyph is crisp at any size
|
|
64
|
-
* and tints with the muted text color. */
|
|
54
|
+
/* Chevron tint + rotate animation (the box + glyph + the open-rotate are
|
|
55
|
+
* skeleton). */
|
|
65
56
|
.rf-accordion-item__header::before {
|
|
66
|
-
content: '';
|
|
67
|
-
flex-shrink: 0;
|
|
68
|
-
width: 0.75rem;
|
|
69
|
-
height: 0.75rem;
|
|
70
57
|
background: var(--rf-color-muted);
|
|
71
|
-
mask-size: contain;
|
|
72
|
-
mask-repeat: no-repeat;
|
|
73
|
-
mask-position: center;
|
|
74
|
-
mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='9 18 15 12 9 6'/></svg>");
|
|
75
58
|
transition: transform 200ms ease;
|
|
76
59
|
}
|
|
77
|
-
.rf-accordion-item[open] .rf-accordion-item__header::before {
|
|
78
|
-
transform: rotate(90deg);
|
|
79
|
-
}
|
|
80
60
|
.rf-accordion-item__title {
|
|
81
|
-
flex
|
|
82
|
-
min-width: 0;
|
|
61
|
+
/* flex sizing is skeleton */
|
|
83
62
|
}
|
|
84
|
-
/* Per-group count for collection/relationships group-display="accordion".
|
|
85
|
-
* Inherits the header's font (weight + color) so the count reads as part
|
|
86
|
-
* of the same label. The header's `gap` handles spacing — no margins needed. */
|
|
63
|
+
/* Per-group count for collection/relationships group-display="accordion". */
|
|
87
64
|
.rf-accordion-item__count {
|
|
88
|
-
flex-shrink
|
|
89
|
-
}
|
|
90
|
-
/* Animate the panel's collapse / expand. `::details-content` (the auto-generated
|
|
91
|
-
* wrapper for non-summary content) + `interpolate-size: allow-keywords` lets the
|
|
92
|
-
* height transition between 0 and auto. `transition-behavior: allow-discrete`
|
|
93
|
-
* on `content-visibility` keeps the panel reachable during the open animation.
|
|
94
|
-
* Browsers without `::details-content` support fall back to the native snap. */
|
|
95
|
-
.rf-accordion-item {
|
|
96
|
-
interpolate-size: allow-keywords;
|
|
65
|
+
/* flex-shrink is skeleton */
|
|
97
66
|
}
|
|
98
67
|
.rf-accordion-item::details-content {
|
|
99
|
-
block-size: 0;
|
|
100
|
-
overflow: hidden;
|
|
101
68
|
transition: block-size 250ms ease, content-visibility 250ms allow-discrete;
|
|
102
69
|
}
|
|
103
|
-
.rf-accordion-item[open]::details-content {
|
|
104
|
-
block-size: auto;
|
|
105
|
-
}
|
|
106
70
|
.rf-accordion-item__body {
|
|
107
71
|
padding: 0 1.25rem 1rem;
|
|
108
72
|
}
|
|
109
|
-
/* Prose styles for the standalone accordion rune's bodies
|
|
110
|
-
* lists, etc.). Scoped to `:not(:has([data-block]))` so they don't bleed into
|
|
111
|
-
* block-content children like cards inside a collection/relationships
|
|
112
|
-
* `group-display="accordion"` panel, where the card's own typography
|
|
113
|
-
* should govern. */
|
|
73
|
+
/* Prose styles for the standalone accordion rune's bodies. */
|
|
114
74
|
.rf-accordion-item__body:not(:has([data-block])) {
|
|
115
|
-
font-size:
|
|
116
|
-
line-height:
|
|
75
|
+
font-size: var(--rf-text-sm);
|
|
76
|
+
line-height: var(--rf-leading-relaxed);
|
|
117
77
|
color: var(--rf-color-muted);
|
|
118
78
|
}
|
|
119
79
|
.rf-accordion-item__body p:last-child {
|
|
120
80
|
margin-bottom: 0;
|
|
121
81
|
}
|
|
122
|
-
/* Block-content
|
|
123
|
-
* items `data-block`. A panel housing them (group-display="accordion") switches
|
|
124
|
-
* to a flex column with the small gap so cards get the same spacing they'd have
|
|
125
|
-
* under a heading-grouped layout. */
|
|
82
|
+
/* Block-content panels get the small gap (the flex column is skeleton). */
|
|
126
83
|
.rf-accordion-item__body:has([data-block]) {
|
|
127
|
-
display: flex;
|
|
128
|
-
flex-direction: column;
|
|
129
84
|
gap: var(--rf-spacing-sm);
|
|
130
85
|
}
|
|
86
|
+
|
|
87
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@layer skin {
|
|
1
2
|
/* Aggregate — counts and per-group breakdowns from the registry (SPEC-076).
|
|
2
3
|
*
|
|
3
4
|
* Two modes share the same block class. The no-body inline form is a `<span>`
|
|
@@ -20,7 +21,7 @@
|
|
|
20
21
|
* weight tuned to stand out modestly in prose. */
|
|
21
22
|
.rf-aggregate[data-aggregate='count'] {
|
|
22
23
|
font-variant-numeric: tabular-nums;
|
|
23
|
-
font-weight:
|
|
24
|
+
font-weight: var(--rf-weight-semibold);
|
|
24
25
|
color: var(--rf-color-text);
|
|
25
26
|
}
|
|
26
27
|
|
|
@@ -43,14 +44,10 @@
|
|
|
43
44
|
* body). With groups, switch to a wrapping inline row so per-group renders
|
|
44
45
|
* (badges, pills, …) flow across the page. */
|
|
45
46
|
.rf-aggregate__items {
|
|
46
|
-
display: flex;
|
|
47
|
-
flex-direction: column;
|
|
48
47
|
gap: var(--rf-spacing-sm);
|
|
49
48
|
margin-top: var(--rf-spacing-sm);
|
|
50
49
|
}
|
|
51
50
|
.rf-aggregate__items:has(.rf-aggregate__group) {
|
|
52
|
-
flex-direction: row;
|
|
53
|
-
flex-wrap: wrap;
|
|
54
51
|
gap: var(--rf-spacing-xs) var(--rf-spacing-sm);
|
|
55
52
|
}
|
|
56
53
|
|
|
@@ -59,17 +56,11 @@
|
|
|
59
56
|
* empty. */
|
|
60
57
|
.rf-aggregate__items > :first-child { margin-top: 0; }
|
|
61
58
|
.rf-aggregate__items > :last-child { margin-bottom: 0; }
|
|
62
|
-
|
|
63
|
-
/* Per-group block — wraps one render of the template. `data-block` is set
|
|
64
|
-
* by the resolver so we trim its outer block margins (the items-row `gap`
|
|
65
|
-
* governs inter-group spacing) — same pattern collection / relationships
|
|
66
|
-
* use for `__item[data-block]`. */
|
|
67
|
-
.rf-aggregate__group {
|
|
68
|
-
min-width: 0;
|
|
69
|
-
}
|
|
70
59
|
.rf-aggregate__group[data-block] > :first-child {
|
|
71
60
|
margin-top: 0;
|
|
72
61
|
}
|
|
73
62
|
.rf-aggregate__group[data-block] > :last-child {
|
|
74
63
|
margin-bottom: 0;
|
|
75
64
|
}
|
|
65
|
+
|
|
66
|
+
}
|
|
@@ -1,80 +1,51 @@
|
|
|
1
|
-
|
|
2
|
-
.
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
/* Margin style */
|
|
1
|
+
@layer skin {
|
|
2
|
+
/* Annotate — skin. The body passthrough, margin float, inline/tooltip display +
|
|
3
|
+
* positioning + hover reveal, and metadata hide live in @refrakt-md/skeleton
|
|
4
|
+
* (styles/runes/annotate.css). */
|
|
6
5
|
.rf-annotate--margin .rf-annotate-note {
|
|
7
|
-
float: right;
|
|
8
|
-
clear: right;
|
|
9
|
-
width: 40%;
|
|
10
6
|
margin: 0.25rem 0 0.5rem 1rem;
|
|
11
7
|
padding: 0.5rem 0 0.5rem 1rem;
|
|
12
|
-
font-size:
|
|
8
|
+
font-size: var(--rf-text-sm);
|
|
13
9
|
color: var(--rf-color-muted);
|
|
14
10
|
border-left: 2px solid var(--rf-color-border);
|
|
15
11
|
}
|
|
16
|
-
/* Inline style */
|
|
17
|
-
.rf-annotate--inline p { display: inline; }
|
|
18
12
|
.rf-annotate--inline .rf-annotate-note {
|
|
19
|
-
display: inline-block;
|
|
20
|
-
vertical-align: baseline;
|
|
21
13
|
margin: 0 0.25rem;
|
|
22
14
|
padding: 0.125rem 0 0.125rem 0.5rem;
|
|
23
|
-
font-size:
|
|
15
|
+
font-size: var(--rf-text-sm);
|
|
24
16
|
color: var(--rf-color-muted);
|
|
25
17
|
border-left: 2px solid var(--rf-color-border);
|
|
26
18
|
}
|
|
27
|
-
/* Tooltip style */
|
|
28
19
|
.rf-annotate--tooltip .rf-annotate-note {
|
|
29
|
-
display: inline-block;
|
|
30
|
-
position: relative;
|
|
31
20
|
margin: 0 0.25rem;
|
|
32
21
|
padding: 0;
|
|
33
22
|
font-size: 0;
|
|
34
|
-
vertical-align: super;
|
|
35
23
|
}
|
|
36
24
|
.rf-annotate--tooltip .rf-annotate-note::before {
|
|
37
25
|
content: '?';
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
justify-content: center;
|
|
41
|
-
width: 1rem;
|
|
42
|
-
height: 1rem;
|
|
43
|
-
font-size: 0.625rem;
|
|
44
|
-
font-weight: 700;
|
|
26
|
+
font-size: var(--rf-text-xs);
|
|
27
|
+
font-weight: var(--rf-weight-bold);
|
|
45
28
|
color: var(--rf-color-primary);
|
|
46
29
|
border: 1px solid var(--rf-color-primary);
|
|
47
30
|
border-radius: var(--rf-radius-full, 50%);
|
|
48
31
|
cursor: help;
|
|
49
32
|
}
|
|
50
33
|
.rf-annotate--tooltip .rf-annotate-note__body {
|
|
51
|
-
display: none;
|
|
52
|
-
position: absolute;
|
|
53
|
-
bottom: 100%;
|
|
54
|
-
left: 50%;
|
|
55
|
-
transform: translateX(-50%);
|
|
56
|
-
width: 16rem;
|
|
57
34
|
padding: 0.75rem;
|
|
58
|
-
font-size:
|
|
35
|
+
font-size: var(--rf-text-sm);
|
|
59
36
|
color: var(--rf-color-text);
|
|
60
37
|
background: var(--rf-color-bg);
|
|
61
38
|
border: 1px solid var(--rf-color-border);
|
|
62
39
|
border-radius: var(--rf-radius-md);
|
|
63
40
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
|
64
41
|
margin-bottom: 0.5rem;
|
|
65
|
-
z-index: 10;
|
|
66
|
-
}
|
|
67
|
-
.rf-annotate--tooltip .rf-annotate-note:hover .rf-annotate-note__body {
|
|
68
|
-
display: block;
|
|
69
42
|
}
|
|
70
43
|
.rf-annotate-note__body p:last-child { margin-bottom: 0; }
|
|
71
|
-
.rf-annotate-note__body > span[property],
|
|
72
|
-
.rf-annotate-note__body > meta { display: none; }
|
|
73
44
|
@media (max-width: 768px) {
|
|
74
45
|
.rf-annotate--margin .rf-annotate-note {
|
|
75
|
-
float: none;
|
|
76
|
-
width: 100%;
|
|
77
46
|
margin: 0.5rem 0 1rem;
|
|
78
47
|
padding: 0.75rem 1rem;
|
|
79
48
|
}
|
|
80
49
|
}
|
|
50
|
+
|
|
51
|
+
}
|
package/styles/runes/api.css
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@layer skin {
|
|
1
2
|
/* Api */
|
|
2
3
|
|
|
3
4
|
/* SPEC-080: the endpoint header is a projected `eyebrow` bar (method + path
|
|
@@ -19,8 +20,10 @@
|
|
|
19
20
|
padding: 0.5rem 1rem;
|
|
20
21
|
margin: 0.75rem 0;
|
|
21
22
|
border-radius: 0 var(--rf-radius-sm) var(--rf-radius-sm) 0;
|
|
22
|
-
font-size:
|
|
23
|
+
font-size: var(--rf-text);
|
|
23
24
|
}
|
|
24
25
|
.rf-api__body blockquote::before {
|
|
25
26
|
content: none;
|
|
26
27
|
}
|
|
28
|
+
|
|
29
|
+
}
|