@refrakt-md/lumina 0.32.0 → 0.34.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 +29 -29
- package/contracts/structures.json +58 -60
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +57 -57
- package/dist/icons.js.map +1 -1
- package/dist/presets/catppuccin.js.map +1 -1
- package/dist/presets/dracula.js.map +1 -1
- package/dist/presets/gruvbox.js.map +1 -1
- package/dist/presets/niwaki.js.map +1 -1
- package/dist/presets/nord.js.map +1 -1
- package/dist/presets/one-dark.js.map +1 -1
- package/dist/presets/solarized.js.map +1 -1
- package/dist/presets/tideline.d.ts.map +1 -1
- package/dist/presets/tideline.js +20 -4
- package/dist/presets/tideline.js.map +1 -1
- package/dist/presets/tokyo-night.js.map +1 -1
- package/dist/tokens.js.map +1 -1
- package/index.css +124 -124
- package/package.json +5 -5
- package/presets.json +61 -13
- package/styles/base/attributes.css +32 -13
- package/styles/dimensions/checklist.css +45 -46
- package/styles/dimensions/cover.css +71 -51
- package/styles/dimensions/density.css +69 -65
- package/styles/dimensions/frame.css +116 -57
- package/styles/dimensions/metadata.css +110 -103
- package/styles/dimensions/motion.css +42 -13
- package/styles/dimensions/reading.css +27 -27
- package/styles/dimensions/sections.css +44 -45
- package/styles/dimensions/sequence.css +56 -57
- package/styles/dimensions/state.css +8 -2
- package/styles/dimensions/substrate.css +82 -58
- package/styles/dimensions/surfaces.css +65 -62
- package/styles/elements/blockquote.css +24 -25
- package/styles/elements/code.css +72 -71
- package/styles/elements/table.css +36 -37
- package/styles/global.css +163 -121
- package/styles/layouts/blog.css +219 -218
- package/styles/layouts/default.css +168 -167
- package/styles/layouts/docs.css +121 -122
- package/styles/layouts/mobile.css +54 -55
- package/styles/layouts/on-this-page.css +46 -47
- package/styles/layouts/plan.css +248 -247
- package/styles/layouts/search.css +142 -140
- package/styles/layouts/split.css +45 -45
- package/styles/layouts/theme-toggle.css +33 -31
- package/styles/layouts/version-switcher.css +38 -37
- package/styles/runes/accordion.css +90 -81
- package/styles/runes/aggregate.css +50 -39
- package/styles/runes/annotate.css +46 -45
- package/styles/runes/api.css +22 -23
- package/styles/runes/audio.css +140 -141
- package/styles/runes/badge.css +12 -13
- package/styles/runes/bar.css +4 -5
- package/styles/runes/bento.css +73 -62
- package/styles/runes/bg.css +62 -47
- package/styles/runes/blog.css +89 -90
- package/styles/runes/bond.css +49 -50
- package/styles/runes/breadcrumb.css +34 -35
- package/styles/runes/budget.css +126 -127
- package/styles/runes/bug.css +28 -27
- package/styles/runes/card.css +63 -60
- package/styles/runes/carousel.css +15 -15
- package/styles/runes/cast.css +50 -51
- package/styles/runes/changelog.css +45 -46
- package/styles/runes/character.css +31 -32
- package/styles/runes/chart.css +194 -106
- package/styles/runes/codegroup.css +109 -100
- package/styles/runes/collection.css +87 -86
- package/styles/runes/compare.css +38 -39
- package/styles/runes/comparison.css +205 -179
- package/styles/runes/conversation.css +36 -33
- package/styles/runes/cta.css +135 -132
- package/styles/runes/datatable.css +84 -83
- package/styles/runes/decision.css +25 -26
- package/styles/runes/design-context.css +21 -23
- package/styles/runes/details.css +26 -27
- package/styles/runes/diagram.css +28 -29
- package/styles/runes/diff.css +75 -72
- package/styles/runes/drawer.css +276 -198
- package/styles/runes/embed.css +20 -21
- package/styles/runes/event.css +35 -36
- package/styles/runes/expand.css +43 -34
- package/styles/runes/faction.css +47 -48
- package/styles/runes/feature.css +119 -112
- package/styles/runes/figure.css +11 -12
- package/styles/runes/file-ref.css +11 -13
- package/styles/runes/form.css +155 -154
- package/styles/runes/gallery.css +59 -60
- package/styles/runes/grid.css +10 -7
- package/styles/runes/hero.css +189 -185
- package/styles/runes/hint.css +57 -58
- package/styles/runes/howto.css +62 -64
- package/styles/runes/itinerary.css +133 -134
- package/styles/runes/juxtapose.css +83 -82
- package/styles/runes/lore.css +32 -34
- package/styles/runes/map.css +106 -99
- package/styles/runes/mediatext.css +30 -27
- package/styles/runes/milestone.css +98 -97
- package/styles/runes/mockup.css +338 -335
- package/styles/runes/nav.css +465 -450
- package/styles/runes/organization.css +23 -20
- package/styles/runes/page-section.css +14 -15
- package/styles/runes/pagination.css +45 -44
- package/styles/runes/palette.css +78 -80
- package/styles/runes/placeholder.css +8 -9
- package/styles/runes/plan-history.css +160 -161
- package/styles/runes/plan-progress.css +15 -16
- package/styles/runes/plan-ref.css +32 -23
- package/styles/runes/playlist.css +106 -107
- package/styles/runes/plot.css +92 -91
- package/styles/runes/preview.css +152 -149
- package/styles/runes/pricing.css +133 -123
- package/styles/runes/progress.css +32 -27
- package/styles/runes/pullquote.css +89 -90
- package/styles/runes/realm.css +47 -48
- package/styles/runes/recipe.css +112 -114
- package/styles/runes/relationships.css +77 -76
- package/styles/runes/reveal.css +90 -79
- package/styles/runes/sandbox.css +59 -60
- package/styles/runes/section.css +57 -50
- package/styles/runes/showcase.css +35 -16
- package/styles/runes/sidenote.css +30 -27
- package/styles/runes/snippet.css +8 -9
- package/styles/runes/spacing.css +86 -88
- package/styles/runes/spec.css +24 -25
- package/styles/runes/steps.css +89 -80
- package/styles/runes/storyboard.css +46 -45
- package/styles/runes/swatch.css +22 -23
- package/styles/runes/symbol.css +117 -118
- package/styles/runes/tabs.css +88 -79
- package/styles/runes/testimonial.css +43 -44
- package/styles/runes/textblock.css +32 -28
- package/styles/runes/timeline.css +63 -64
- package/styles/runes/tint.css +214 -215
- package/styles/runes/toc.css +40 -41
- package/styles/runes/track.css +89 -90
- package/styles/runes/typography.css +89 -91
- package/styles/runes/work.css +47 -36
- package/styles/runes/xref.css +21 -22
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
@layer skin {
|
|
2
|
-
/* Frame chrome (SPEC-086) — media-surface presentation.
|
|
2
|
+
/* Frame chrome (SPEC-086) — media-surface presentation.
|
|
3
3
|
*
|
|
4
4
|
* The engine lands the frame contract on the frame-target element: a rune's
|
|
5
5
|
* `[data-section="media"]` zone (frameTarget: 'media') or the rune's own root
|
|
@@ -21,48 +21,66 @@
|
|
|
21
21
|
* `frame-shadow` (drop-shadow silhouette here) never collide — different property,
|
|
22
22
|
* different surface. */
|
|
23
23
|
|
|
24
|
-
/* ── Silhouette drop-shadow ────────────────────────────────────────────
|
|
24
|
+
/* ── Silhouette drop-shadow ────────────────────────────────────────────
|
|
25
25
|
* Same media-target / self-target split as `frame-displace`. Media-target
|
|
26
26
|
* frames land `data-frame-shadow` on the media zone wrapper, but the shadow
|
|
27
27
|
* should ride the inner guest so it (a) shifts with `frame-displace` and
|
|
28
28
|
* (b) actually casts onto exposed slot interior when the guest is inset
|
|
29
29
|
* from the wrapper. Self-target frames (showcase, figure) keep the filter
|
|
30
30
|
* on the root itself, where it traces the rune's own painted silhouette. */
|
|
31
|
-
[data-frame-shadow="none"] {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
[data-frame-shadow="
|
|
31
|
+
[data-frame-shadow="none"] {
|
|
32
|
+
--frame-shadow: none;
|
|
33
|
+
}
|
|
34
|
+
[data-frame-shadow="sm"] {
|
|
35
|
+
--frame-shadow: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.1));
|
|
36
|
+
}
|
|
37
|
+
[data-frame-shadow="md"] {
|
|
38
|
+
--frame-shadow: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.25));
|
|
39
|
+
}
|
|
40
|
+
[data-frame-shadow="lg"] {
|
|
41
|
+
--frame-shadow: drop-shadow(0 12px 40px rgba(0, 0, 0, 0.2));
|
|
42
|
+
}
|
|
35
43
|
|
|
36
|
-
/* Self-target — figure, showcase, anything else where the rune root is the
|
|
44
|
+
/* Self-target — figure, showcase, anything else where the rune root is the
|
|
37
45
|
* frame target. The filter applies to the painted root. */
|
|
38
|
-
[data-frame-shadow]:not([data-section="media"]) {
|
|
39
|
-
|
|
40
|
-
}
|
|
46
|
+
[data-frame-shadow]:not([data-section="media"]) {
|
|
47
|
+
filter: var(--frame-shadow);
|
|
48
|
+
}
|
|
41
49
|
|
|
42
|
-
/* Media-target — card, bento-cell, recipe, etc. The filter rides the inner
|
|
50
|
+
/* Media-target — card, bento-cell, recipe, etc. The filter rides the inner
|
|
43
51
|
* guest so a displaced image's shadow falls into the slot's exposed
|
|
44
52
|
* interior (clipped at the slot's `overflow: hidden` boundary like any
|
|
45
53
|
* other in-slot content). */
|
|
46
|
-
[data-section="media"][data-frame-shadow] > :is(img, video, .rf-placeholder, [data-rune]) {
|
|
47
|
-
|
|
48
|
-
}
|
|
54
|
+
[data-section="media"][data-frame-shadow] > :is(img, video, .rf-placeholder, [data-rune]) {
|
|
55
|
+
filter: var(--frame-shadow);
|
|
56
|
+
}
|
|
49
57
|
|
|
50
|
-
/* ── Aspect ratio ────────────────────────────────────────────────────── */
|
|
51
|
-
[style*="--frame-aspect"] {
|
|
58
|
+
/* ── Aspect ratio ────────────────────────────────────────────────────── */
|
|
59
|
+
[style*="--frame-aspect"] {
|
|
60
|
+
aspect-ratio: var(--frame-aspect);
|
|
61
|
+
}
|
|
52
62
|
|
|
53
|
-
/* ── Crop anchor — focal point when the guest is cut ─────────────────── */
|
|
54
|
-
[style*="--frame-anchor"] > :is(img, video, .rf-placeholder) {
|
|
63
|
+
/* ── Crop anchor — focal point when the guest is cut ─────────────────── */
|
|
64
|
+
[style*="--frame-anchor"] > :is(img, video, .rf-placeholder) {
|
|
65
|
+
object-position: var(--frame-anchor);
|
|
66
|
+
}
|
|
55
67
|
|
|
56
|
-
/* ── Placement of the framed box within its slot ─────────────────────── */
|
|
57
|
-
[style*="--frame-place-x"] {
|
|
68
|
+
/* ── Placement of the framed box within its slot ─────────────────────── */
|
|
69
|
+
[style*="--frame-place-x"] {
|
|
70
|
+
justify-self: var(--frame-place-x, auto);
|
|
71
|
+
align-self: var(--frame-place-y, auto);
|
|
72
|
+
}
|
|
58
73
|
|
|
59
|
-
/* ── Oversize — guest exceeds its slot (clipping hosts crop it) ──────── */
|
|
60
|
-
/* `[data-rune]` extends the rule to nested rune guests (codegroup, mockup,
|
|
74
|
+
/* ── Oversize — guest exceeds its slot (clipping hosts crop it) ──────── */
|
|
75
|
+
/* `[data-rune]` extends the rule to nested rune guests (codegroup, mockup,
|
|
61
76
|
* chart, etc.), so frame chrome stays guest-agnostic — the same selector
|
|
62
77
|
* pattern the displace rule uses. */
|
|
63
|
-
[style*="--frame-oversize"] > :is(img, video, .rf-placeholder, [data-rune]) {
|
|
78
|
+
[style*="--frame-oversize"] > :is(img, video, .rf-placeholder, [data-rune]) {
|
|
79
|
+
width: calc(100% * var(--frame-oversize, 1));
|
|
80
|
+
max-width: none;
|
|
81
|
+
}
|
|
64
82
|
|
|
65
|
-
/* ── Displacement (peek / spill) — move the guest toward an edge/corner.
|
|
83
|
+
/* ── Displacement (peek / spill) — move the guest toward an edge/corner.
|
|
66
84
|
* The host decides whether the guest is cropped or spills; this only moves it.
|
|
67
85
|
* Two cases, distinguished by where the engine landed `data-displace`:
|
|
68
86
|
*
|
|
@@ -80,45 +98,87 @@
|
|
|
80
98
|
* We push the root with negative margins so it can spill past its
|
|
81
99
|
* parent's edge for a true breakout. */
|
|
82
100
|
|
|
83
|
-
/* — Case 1a: media-zone displace, default `peek` mode → translate the inner
|
|
101
|
+
/* — Case 1a: media-zone displace, default `peek` mode → translate the inner
|
|
84
102
|
* guest inside the slot. The zone's `overflow: hidden` clips the displaced
|
|
85
103
|
* guest into a peek (card / bento-cell behaviour). */
|
|
86
|
-
[data-section="media"][data-displace]:not([data-displace-mode="bleed"])
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
[data-section="media"][data-displace="
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
[data-section="media"][data-displace="bottom
|
|
104
|
+
[data-section="media"][data-displace]:not([data-displace-mode="bleed"])
|
|
105
|
+
> :is(img, video, .rf-placeholder, [data-rune]) {
|
|
106
|
+
transform: translate(var(--displace-x, 0), var(--displace-y, 0));
|
|
107
|
+
}
|
|
108
|
+
[data-section="media"][data-displace="top"] {
|
|
109
|
+
--displace-y: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
110
|
+
}
|
|
111
|
+
[data-section="media"][data-displace="bottom"] {
|
|
112
|
+
--displace-y: var(--frame-offset, var(--rf-spacing-lg));
|
|
113
|
+
}
|
|
114
|
+
[data-section="media"][data-displace="end"] {
|
|
115
|
+
--displace-x: var(--frame-offset, var(--rf-spacing-lg));
|
|
116
|
+
}
|
|
117
|
+
[data-section="media"][data-displace="top-end"] {
|
|
118
|
+
--displace-x: var(--frame-offset, var(--rf-spacing-lg));
|
|
119
|
+
--displace-y: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
120
|
+
}
|
|
121
|
+
[data-section="media"][data-displace="bottom-end"] {
|
|
122
|
+
--displace-x: var(--frame-offset, var(--rf-spacing-lg));
|
|
123
|
+
--displace-y: var(--frame-offset, var(--rf-spacing-lg));
|
|
124
|
+
}
|
|
94
125
|
|
|
95
|
-
/* — Case 1b: media-zone displace, `bleed` mode → negative margin on the media
|
|
126
|
+
/* — Case 1b: media-zone displace, `bleed` mode → negative margin on the media
|
|
96
127
|
* zone itself, so following layout pulls up and the guest extends past the
|
|
97
128
|
* host's edge (hero / cta behaviour). The guest renders at its natural
|
|
98
129
|
* position inside the zone — no translate, no artificial gap above. The
|
|
99
130
|
* margin needs to exceed the host's padding for the guest to clear the host
|
|
100
131
|
* edge; the offset scale tops out at `3xl` (6rem) for this. */
|
|
101
|
-
[data-section="media"][data-displace="top"][data-displace-mode="bleed"]
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
[data-section="media"][data-displace="
|
|
105
|
-
|
|
132
|
+
[data-section="media"][data-displace="top"][data-displace-mode="bleed"] {
|
|
133
|
+
margin-top: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
134
|
+
}
|
|
135
|
+
[data-section="media"][data-displace="bottom"][data-displace-mode="bleed"] {
|
|
136
|
+
margin-bottom: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
137
|
+
}
|
|
138
|
+
[data-section="media"][data-displace="end"][data-displace-mode="bleed"] {
|
|
139
|
+
margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
140
|
+
}
|
|
141
|
+
[data-section="media"][data-displace="top-end"][data-displace-mode="bleed"] {
|
|
142
|
+
margin-top: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
143
|
+
margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
144
|
+
}
|
|
145
|
+
[data-section="media"][data-displace="bottom-end"][data-displace-mode="bleed"] {
|
|
146
|
+
margin-bottom: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
147
|
+
margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
148
|
+
}
|
|
106
149
|
|
|
107
|
-
/* — Case 2: self-target (showcase, etc.) → root moves; parent decides. */
|
|
108
|
-
[data-displace]:not([data-section="media"]) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
[data-displace="
|
|
113
|
-
|
|
114
|
-
|
|
150
|
+
/* — Case 2: self-target (showcase, etc.) → root moves; parent decides. */
|
|
151
|
+
[data-displace]:not([data-section="media"]) {
|
|
152
|
+
position: relative;
|
|
153
|
+
z-index: 1;
|
|
154
|
+
}
|
|
155
|
+
[data-displace="top"]:not([data-section="media"]) {
|
|
156
|
+
margin-top: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
157
|
+
}
|
|
158
|
+
[data-displace="bottom"]:not([data-section="media"]) {
|
|
159
|
+
margin-bottom: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
160
|
+
}
|
|
161
|
+
[data-displace="both"]:not([data-section="media"]) {
|
|
162
|
+
margin-block: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
163
|
+
}
|
|
164
|
+
[data-displace="end"]:not([data-section="media"]) {
|
|
165
|
+
margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
166
|
+
}
|
|
167
|
+
[data-displace="bottom-end"]:not([data-section="media"]) {
|
|
168
|
+
margin-bottom: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
169
|
+
margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
170
|
+
}
|
|
171
|
+
[data-displace="top-end"]:not([data-section="media"]) {
|
|
172
|
+
margin-top: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
173
|
+
margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg)));
|
|
174
|
+
}
|
|
115
175
|
|
|
116
|
-
/* Displacement carries across breakpoints. For media-target the guest is
|
|
176
|
+
/* Displacement carries across breakpoints. For media-target the guest is
|
|
117
177
|
* clipped by the zone's `overflow: hidden` regardless of width, so the peek
|
|
118
178
|
* reads consistently from desktop to mobile. For self-target (showcase) the
|
|
119
179
|
* negative-margin spill stays on too — that's the intended breakout. */
|
|
120
180
|
|
|
121
|
-
/* ── frame-overflow="bleed" (SPEC-116) ───────────────────────────────────
|
|
181
|
+
/* ── frame-overflow="bleed" (SPEC-116) ───────────────────────────────────
|
|
122
182
|
* The host declares the policy (`data-frame-overflow="bleed"` on its media
|
|
123
183
|
* zone, a bleed host only); the guest signals the fact (`data-overflowing`,
|
|
124
184
|
* set by its runtime when its content is wider than the frame). When both
|
|
@@ -131,13 +191,12 @@
|
|
|
131
191
|
* at the content row). v1 is inline-end only; direction (via frame-anchor) and
|
|
132
192
|
* side-by-side are deferred. The host media zone is already `overflow: visible`
|
|
133
193
|
* for a rune guest (the bleed-host guestFit rule), so the guest can spill. */
|
|
134
|
-
@media (max-width: 640px) {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
194
|
+
@media (max-width: 640px) {
|
|
195
|
+
[data-frame-overflow="bleed"] > [data-overflowing] {
|
|
196
|
+
width: calc(100% + var(--rf-bleed-room-end, var(--rf-content-gutter, 1.5rem)));
|
|
197
|
+
max-width: none;
|
|
198
|
+
border-start-end-radius: 0;
|
|
199
|
+
border-end-end-radius: 0;
|
|
200
|
+
}
|
|
140
201
|
}
|
|
141
202
|
}
|
|
142
|
-
|
|
143
|
-
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
@layer skin {
|
|
2
|
-
/* ─── Metadata Dimensions — skin ───────────────────────────────────────
|
|
2
|
+
/* ─── Metadata Dimensions — skin ───────────────────────────────────────
|
|
3
3
|
* SPEC-080 typography / geometry split. The zone-layout *structure* (bar +
|
|
4
4
|
* definition-list display/grid, the rating flex row, the sr-only label
|
|
5
5
|
* mechanism) lives in @refrakt-md/skeleton (dimensions/metadata.css). What
|
|
@@ -9,136 +9,143 @@
|
|
|
9
9
|
* - Sentiment rules drive `--meta-color`, inherited by chips + tinted text.
|
|
10
10
|
* ────────────────────────────────────────────────────────────────────── */
|
|
11
11
|
|
|
12
|
-
/* ─── Sentiment ────────────────────────────────────────────────────── */
|
|
12
|
+
/* ─── Sentiment ────────────────────────────────────────────────────── */
|
|
13
13
|
|
|
14
|
-
[data-meta-sentiment="positive"] {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
[data-meta-sentiment="
|
|
14
|
+
[data-meta-sentiment="positive"] {
|
|
15
|
+
--meta-color: var(--rf-color-success, #10b981);
|
|
16
|
+
}
|
|
17
|
+
[data-meta-sentiment="negative"] {
|
|
18
|
+
--meta-color: var(--rf-color-danger, #ef4444);
|
|
19
|
+
}
|
|
20
|
+
[data-meta-sentiment="caution"] {
|
|
21
|
+
--meta-color: var(--rf-color-warning, #f59e0b);
|
|
22
|
+
}
|
|
23
|
+
[data-meta-sentiment="neutral"] {
|
|
24
|
+
--meta-color: var(--rf-color-muted, #64748b);
|
|
25
|
+
}
|
|
18
26
|
|
|
19
|
-
/* ─── Meta Types — typography only ─────────────────────────────────── */
|
|
27
|
+
/* ─── Meta Types — typography only ─────────────────────────────────── */
|
|
20
28
|
|
|
21
|
-
[data-meta-type="id"],
|
|
22
|
-
[data-meta-type="code"] {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
29
|
+
[data-meta-type="id"],
|
|
30
|
+
[data-meta-type="code"] {
|
|
31
|
+
font-family: var(--rf-font-mono, monospace);
|
|
32
|
+
font-size: var(--meta-font-size, var(--rf-text-sm));
|
|
33
|
+
}
|
|
26
34
|
|
|
27
|
-
/* IDs read as primary-coloured references wherever they appear (eyebrow
|
|
35
|
+
/* IDs read as primary-coloured references wherever they appear (eyebrow
|
|
28
36
|
* bars, metadata def-lists, etc.) — a semantic treatment of the `id` type,
|
|
29
37
|
* not a per-layout one. `code` (e.g. API paths) stays neutral monospace. */
|
|
30
|
-
[data-meta-type="id"] {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
38
|
+
[data-meta-type="id"] {
|
|
39
|
+
color: var(--rf-color-primary);
|
|
40
|
+
font-weight: var(--rf-weight-medium);
|
|
41
|
+
}
|
|
34
42
|
|
|
35
|
-
[data-meta-type="quantity"] {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
43
|
+
[data-meta-type="quantity"] {
|
|
44
|
+
font-variant-numeric: tabular-nums;
|
|
45
|
+
font-size: var(--meta-font-size, 0.8125rem);
|
|
46
|
+
}
|
|
39
47
|
|
|
40
|
-
[data-meta-type="temporal"] {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
48
|
+
[data-meta-type="temporal"] {
|
|
49
|
+
font-variant-numeric: tabular-nums;
|
|
50
|
+
font-size: var(--meta-font-size, 0.8125rem);
|
|
51
|
+
}
|
|
44
52
|
|
|
45
|
-
/* Rating — `value` filled marks out of `total`; each mark carries
|
|
53
|
+
/* Rating — `value` filled marks out of `total`; each mark carries
|
|
46
54
|
* `data-filled`. Stars via colour (filled = primary, empty = border). The
|
|
47
55
|
* inline-flex row is structure (skeleton); the glyph + spacing + colours are
|
|
48
56
|
* skin. */
|
|
49
|
-
[data-meta-type="rating"] {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
[data-meta-type="rating"] span::before {
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
[data-meta-type="rating"] span[data-filled="true"] {
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
[data-meta-type="rating"] span[data-filled="false"] {
|
|
60
|
-
|
|
61
|
-
}
|
|
57
|
+
[data-meta-type="rating"] {
|
|
58
|
+
gap: 0.0625rem;
|
|
59
|
+
line-height: 1;
|
|
60
|
+
}
|
|
61
|
+
[data-meta-type="rating"] span::before {
|
|
62
|
+
content: "★";
|
|
63
|
+
}
|
|
64
|
+
[data-meta-type="rating"] span[data-filled="true"] {
|
|
65
|
+
color: var(--rf-color-primary);
|
|
66
|
+
}
|
|
67
|
+
[data-meta-type="rating"] span[data-filled="false"] {
|
|
68
|
+
color: var(--rf-color-border);
|
|
69
|
+
}
|
|
62
70
|
|
|
63
|
-
[data-meta-type="status"],
|
|
64
|
-
[data-meta-type="category"],
|
|
65
|
-
[data-meta-type="tag"] {
|
|
66
|
-
|
|
67
|
-
}
|
|
71
|
+
[data-meta-type="status"],
|
|
72
|
+
[data-meta-type="category"],
|
|
73
|
+
[data-meta-type="tag"] {
|
|
74
|
+
font-size: var(--meta-font-size, 0.8125rem);
|
|
75
|
+
}
|
|
68
76
|
|
|
69
|
-
/* Linked eyebrow content (matches today's hero behaviour). */
|
|
70
|
-
[data-zone="eyebrow"] a {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
77
|
+
/* Linked eyebrow content (matches today's hero behaviour). */
|
|
78
|
+
[data-zone="eyebrow"] a {
|
|
79
|
+
color: var(--rf-color-primary);
|
|
80
|
+
text-decoration: underline;
|
|
81
|
+
text-underline-offset: 0.15em;
|
|
82
|
+
}
|
|
75
83
|
|
|
76
|
-
/* ─── Layout: bar — spacing ────────────────────────────────────────── */
|
|
77
|
-
/* The flex row + end-push are structure (skeleton); the gap is skin. */
|
|
78
|
-
[data-zone-layout="bar"] {
|
|
79
|
-
|
|
80
|
-
}
|
|
84
|
+
/* ─── Layout: bar — spacing ────────────────────────────────────────── */
|
|
85
|
+
/* The flex row + end-push are structure (skeleton); the gap is skin. */
|
|
86
|
+
[data-zone-layout="bar"] {
|
|
87
|
+
gap: 0.5rem;
|
|
88
|
+
}
|
|
81
89
|
|
|
82
|
-
/* ─── Layout: definition-list — spacing + chrome ───────────────────── */
|
|
83
|
-
/* The grid + row stacking are structure (skeleton); the gaps, the per-row
|
|
90
|
+
/* ─── Layout: definition-list — spacing + chrome ───────────────────── */
|
|
91
|
+
/* The grid + row stacking are structure (skeleton); the gaps, the per-row
|
|
84
92
|
* border/padding/radius card chrome, and the dt/dd type are skin. */
|
|
85
|
-
[data-zone-layout="definition-list"] {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
93
|
+
[data-zone-layout="definition-list"] {
|
|
94
|
+
gap: 0.75rem;
|
|
95
|
+
margin: 1.25rem 0;
|
|
96
|
+
}
|
|
89
97
|
|
|
90
|
-
[data-zone-layout="definition-list"] > [data-name="row"] {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
98
|
+
[data-zone-layout="definition-list"] > [data-name="row"] {
|
|
99
|
+
gap: 0.125rem;
|
|
100
|
+
padding: 0.625rem 0.75rem;
|
|
101
|
+
border: 1px solid var(--rf-color-border);
|
|
102
|
+
border-radius: var(--rf-radius-sm);
|
|
103
|
+
}
|
|
96
104
|
|
|
97
|
-
[data-zone-layout="definition-list"] dt {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
105
|
+
[data-zone-layout="definition-list"] dt {
|
|
106
|
+
font-size: var(--rf-text-xs);
|
|
107
|
+
font-weight: var(--rf-weight-medium);
|
|
108
|
+
color: var(--rf-color-muted);
|
|
109
|
+
}
|
|
102
110
|
|
|
103
|
-
[data-zone-layout="definition-list"] dd {
|
|
104
|
-
|
|
105
|
-
}
|
|
111
|
+
[data-zone-layout="definition-list"] dd {
|
|
112
|
+
font-size: var(--rf-text-sm);
|
|
113
|
+
}
|
|
106
114
|
|
|
107
|
-
[data-zone-layout="definition-list"] dd[data-multi-value] {
|
|
108
|
-
|
|
109
|
-
}
|
|
115
|
+
[data-zone-layout="definition-list"] dd[data-multi-value] {
|
|
116
|
+
gap: 0.25rem;
|
|
117
|
+
}
|
|
110
118
|
|
|
111
|
-
/* ─── Labels ──────────────────────────────────────────────────────── */
|
|
119
|
+
/* ─── Labels ──────────────────────────────────────────────────────── */
|
|
112
120
|
|
|
113
|
-
/* Label element within a chip — thin, muted; pairs visually with the value */
|
|
114
|
-
[data-meta-label] {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
121
|
+
/* Label element within a chip — thin, muted; pairs visually with the value */
|
|
122
|
+
[data-meta-label] {
|
|
123
|
+
font-weight: var(--rf-weight-normal);
|
|
124
|
+
opacity: 0.65;
|
|
125
|
+
}
|
|
118
126
|
|
|
119
|
-
/* ─── Mobile: compact ──────────────────────────────────────────────── */
|
|
127
|
+
/* ─── Mobile: compact ──────────────────────────────────────────────── */
|
|
120
128
|
|
|
121
|
-
@media (max-width: 48rem) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
129
|
+
@media (max-width: 48rem) {
|
|
130
|
+
[data-zone-layout="bar"] {
|
|
131
|
+
gap: 0.375rem;
|
|
132
|
+
}
|
|
125
133
|
|
|
126
|
-
|
|
134
|
+
/* The border + padding move to the list itself so the whole group reads as
|
|
127
135
|
* one bordered card (the per-row box is dropped by the skeleton's
|
|
128
136
|
* `display: contents`). */
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
+
[data-zone-layout="definition-list"] {
|
|
138
|
+
gap: 0.25rem 1rem;
|
|
139
|
+
padding: 0.75rem 1rem;
|
|
140
|
+
border: 1px solid var(--rf-color-border);
|
|
141
|
+
border-radius: var(--rf-radius-sm);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* Header rhythm stays skin with sections.css (deferred until the split layout
|
|
137
145
|
* + sections promote together). */
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
146
|
+
[data-section="header"] {
|
|
147
|
+
gap: 0.375rem;
|
|
148
|
+
margin-bottom: 1.5rem;
|
|
149
|
+
}
|
|
141
150
|
}
|
|
142
151
|
}
|
|
143
|
-
|
|
144
|
-
}
|
|
@@ -26,12 +26,32 @@
|
|
|
26
26
|
/* Per-character offsets — set on the `[data-reveal]` container and inherited by
|
|
27
27
|
* staggered children, so the single hidden-state block below covers every
|
|
28
28
|
* character. `none` carries no offsets (it never animates). */
|
|
29
|
-
[data-reveal="fade"]
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
[data-reveal="fade"] {
|
|
30
|
+
--reveal-x: 0;
|
|
31
|
+
--reveal-y: 0;
|
|
32
|
+
--reveal-scale: 1;
|
|
33
|
+
--reveal-blur: 0;
|
|
34
|
+
}
|
|
35
|
+
[data-reveal="slide"] {
|
|
36
|
+
--reveal-x: 0;
|
|
37
|
+
--reveal-y: var(--rf-reveal-distance, 1.5rem);
|
|
38
|
+
--reveal-scale: 1;
|
|
39
|
+
--reveal-blur: 0;
|
|
40
|
+
}
|
|
41
|
+
[data-reveal="scale"] {
|
|
42
|
+
--reveal-x: 0;
|
|
43
|
+
--reveal-y: 0;
|
|
44
|
+
--reveal-scale: var(--rf-reveal-scale-start, 0.95);
|
|
45
|
+
--reveal-blur: 0;
|
|
46
|
+
}
|
|
32
47
|
/* `blur` is focus-led; it animates `filter` (not compositor-cheap), so a theme
|
|
33
48
|
* or low-power path may downgrade it to `fade` by zeroing the blur token. */
|
|
34
|
-
[data-reveal="blur"]
|
|
49
|
+
[data-reveal="blur"] {
|
|
50
|
+
--reveal-x: 0;
|
|
51
|
+
--reveal-y: 0;
|
|
52
|
+
--reveal-scale: 1;
|
|
53
|
+
--reveal-blur: var(--rf-reveal-blur, 8px);
|
|
54
|
+
}
|
|
35
55
|
|
|
36
56
|
/* The animated unit:
|
|
37
57
|
* • non-staggered → the `[data-reveal]` element itself,
|
|
@@ -43,19 +63,21 @@
|
|
|
43
63
|
* the `transform` shorthand, so it composes with the rune transforms Lumina
|
|
44
64
|
* already uses (hover-lifts on card/cta/feature, frame displacement, drawer/nav
|
|
45
65
|
* slides) instead of clobbering them. */
|
|
46
|
-
[data-animate]
|
|
66
|
+
[data-animate]
|
|
67
|
+
:where(
|
|
47
68
|
[data-reveal]:not([data-reveal="none"]):not([data-stagger]),
|
|
48
69
|
[data-stagger]:not([data-reveal="none"]) [style*="--rf-reveal-index"]
|
|
49
70
|
) {
|
|
50
71
|
transition:
|
|
51
|
-
opacity
|
|
72
|
+
opacity var(--rf-reveal-duration, 0.9s) var(--rf-reveal-easing, ease-out),
|
|
52
73
|
translate var(--rf-reveal-duration, 0.9s) var(--rf-reveal-easing, ease-out),
|
|
53
|
-
scale
|
|
54
|
-
filter
|
|
74
|
+
scale var(--rf-reveal-duration, 0.9s) var(--rf-reveal-easing, ease-out),
|
|
75
|
+
filter var(--rf-reveal-duration, 0.9s) var(--rf-reveal-easing, ease-out);
|
|
55
76
|
}
|
|
56
77
|
|
|
57
78
|
/* Pre-entrance (hidden) — until the unit's trigger fires. */
|
|
58
|
-
[data-animate]
|
|
79
|
+
[data-animate]
|
|
80
|
+
:where(
|
|
59
81
|
[data-reveal]:not([data-reveal="none"]):not([data-stagger]):not([data-in-view]),
|
|
60
82
|
[data-stagger]:not([data-reveal="none"]):not([data-in-view]) [style*="--rf-reveal-index"]
|
|
61
83
|
) {
|
|
@@ -70,7 +92,8 @@
|
|
|
70
92
|
* transition `translate`/`scale`/`filter` to-or-from `none`, so reverting to
|
|
71
93
|
* the default would snap (no motion on iOS) — only opacity would animate.
|
|
72
94
|
* Transitioning between two explicit values animates everywhere. */
|
|
73
|
-
[data-animate]
|
|
95
|
+
[data-animate]
|
|
96
|
+
:where(
|
|
74
97
|
[data-reveal]:not([data-reveal="none"]):not([data-stagger])[data-in-view],
|
|
75
98
|
[data-stagger][data-in-view] [style*="--rf-reveal-index"]
|
|
76
99
|
) {
|
|
@@ -90,11 +113,17 @@
|
|
|
90
113
|
* sliding section, let the media arrive a beat behind the content for a subtle
|
|
91
114
|
* two-part entrance. Demonstrated on the named anatomy the theme already styles;
|
|
92
115
|
* a theme adds or drops this freely. */
|
|
93
|
-
[data-animate]
|
|
116
|
+
[data-animate]
|
|
117
|
+
[data-reveal="slide"]:not([data-stagger]):not([data-in-view])
|
|
118
|
+
> *
|
|
119
|
+
> [data-section="media"] {
|
|
94
120
|
translate: 0 calc(var(--rf-reveal-distance, 1.5rem) * 1.5);
|
|
95
121
|
}
|
|
96
|
-
[data-animate]
|
|
97
|
-
|
|
122
|
+
[data-animate]
|
|
123
|
+
[data-reveal="slide"]:not([data-stagger])[data-in-view]
|
|
124
|
+
> *
|
|
125
|
+
> [data-section="media"] {
|
|
126
|
+
translate: 0 0; /* explicit identity end-state — see the WebKit note above */
|
|
98
127
|
}
|
|
99
128
|
[data-animate] [data-reveal="slide"]:not([data-stagger]) > * > [data-section="media"] {
|
|
100
129
|
transition: translate var(--rf-reveal-duration, 0.9s) var(--rf-reveal-easing, ease-out);
|
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
@layer skin {
|
|
2
|
-
/* Reading register (SPEC-108) — Lumina's editorial treatment of `[data-reading]`.
|
|
2
|
+
/* Reading register (SPEC-108) — Lumina's editorial treatment of `[data-reading]`.
|
|
3
3
|
* The measure cap + niceties are structural (skeleton); this is the type, rhythm,
|
|
4
4
|
* and drop-cap glyph. `ui` (the default) is left to the base body styling. */
|
|
5
5
|
|
|
6
|
-
/* Prose — long-form reading. */
|
|
7
|
-
[data-reading="prose"] {
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
[data-reading="prose"] > p {
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
[data-reading="prose"] a {
|
|
14
|
-
|
|
15
|
-
}
|
|
6
|
+
/* Prose — long-form reading. */
|
|
7
|
+
[data-reading="prose"] {
|
|
8
|
+
line-height: var(--rf-leading-relaxed);
|
|
9
|
+
}
|
|
10
|
+
[data-reading="prose"] > p {
|
|
11
|
+
margin-bottom: 1em;
|
|
12
|
+
}
|
|
13
|
+
[data-reading="prose"] a {
|
|
14
|
+
text-underline-offset: 0.15em;
|
|
15
|
+
}
|
|
16
16
|
|
|
17
|
-
/* Drop-cap glyph — the theme owns the treatment; the author owns where (the
|
|
17
|
+
/* Drop-cap glyph — the theme owns the treatment; the author owns where (the
|
|
18
18
|
* `dropcap` opt-in, honoured only on a prose body). */
|
|
19
|
-
[data-reading="prose"][data-dropcap] > p:first-child::first-letter {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
19
|
+
[data-reading="prose"][data-dropcap] > p:first-child::first-letter {
|
|
20
|
+
font-size: 3.5em;
|
|
21
|
+
font-weight: var(--rf-weight-bold);
|
|
22
|
+
line-height: 0.8;
|
|
23
|
+
padding-right: 0.1em;
|
|
24
|
+
margin-top: 0.05em;
|
|
25
|
+
color: var(--rf-color-primary);
|
|
26
|
+
font-family: Georgia, "Times New Roman", serif;
|
|
27
|
+
}
|
|
28
28
|
|
|
29
|
-
/* Fine print — captions, footnotes, asides: smaller and quieter. */
|
|
30
|
-
[data-reading="fine"] {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
29
|
+
/* Fine print — captions, footnotes, asides: smaller and quieter. */
|
|
30
|
+
[data-reading="fine"] {
|
|
31
|
+
font-size: var(--rf-text-sm);
|
|
32
|
+
line-height: var(--rf-leading-normal);
|
|
33
|
+
color: var(--rf-color-muted);
|
|
34
|
+
}
|
|
35
35
|
}
|