@refrakt-md/lumina 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.map +1 -1
- package/dist/tokens.js +2 -0
- package/dist/tokens.js.map +1 -1
- package/index.css +10 -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/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 +10 -52
- 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 +3 -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 +3 -28
- 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 +13 -0
- package/tokens/dark.css +3 -0
- package/styles/dimensions/guest-posture.css +0 -27
package/styles/runes/diff.css
CHANGED
|
@@ -1,20 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
@layer skin {
|
|
2
|
+
/* Diff — skin. The scroll container, sticky header, split grid, rows grid, line
|
|
3
|
+
* flex + gutter sizing live in @refrakt-md/skeleton (styles/runes/diff.css). */
|
|
2
4
|
.rf-diff {
|
|
3
5
|
border: 1px solid var(--rf-color-border);
|
|
4
6
|
border-radius: var(--rf-radius-lg);
|
|
5
|
-
/* WORK-304 — horizontal scroll lives on `.rf-diff` itself, not on
|
|
6
|
-
* `.rf-diff__split-container`. On mobile the split-container's
|
|
7
|
-
* `min-width: 40rem` makes it wider than the viewport; previously
|
|
8
|
-
* `.rf-diff { overflow: hidden }` clipped the right panel and the
|
|
9
|
-
* touch scroll had nowhere to land. Moving the scroll affordance
|
|
10
|
-
* up one level lets users swipe the entire diff sideways to
|
|
11
|
-
* reveal the off-screen panel; the border-radius still clips the
|
|
12
|
-
* children at the rounded corners because `overflow-x: auto` is
|
|
13
|
-
* non-visible. `overflow-y: hidden` keeps the vertical clip for
|
|
14
|
-
* the rounded top/bottom. */
|
|
15
|
-
overflow-x: auto;
|
|
16
|
-
overflow-y: hidden;
|
|
17
|
-
overscroll-behavior-x: contain;
|
|
18
7
|
font-size: var(--rf-text-sm);
|
|
19
8
|
background: var(--rf-color-code-bg);
|
|
20
9
|
}
|
|
@@ -26,19 +15,6 @@
|
|
|
26
15
|
color: var(--rf-color-muted);
|
|
27
16
|
background: var(--rf-color-surface);
|
|
28
17
|
border-bottom: 1px solid var(--rf-color-border);
|
|
29
|
-
/* `.rf-diff` is the horizontal scroll container (so mobile users
|
|
30
|
-
* can swipe to reveal the off-screen split panel). Without
|
|
31
|
-
* sticky, the header would scroll horizontally along with the
|
|
32
|
-
* content and the filename label would slide off-screen.
|
|
33
|
-
* `position: sticky; left: 0` pins the header to the visible left
|
|
34
|
-
* edge of the scroll viewport at all scroll positions. WORK-304. */
|
|
35
|
-
position: sticky;
|
|
36
|
-
left: 0;
|
|
37
|
-
}
|
|
38
|
-
.rf-diff__split-container {
|
|
39
|
-
display: grid;
|
|
40
|
-
grid-template-columns: 1fr 1fr;
|
|
41
|
-
min-width: 40rem;
|
|
42
18
|
}
|
|
43
19
|
.rf-diff__split-container .rf-diff__panel:first-child {
|
|
44
20
|
border-right: 1px solid var(--rf-color-border);
|
|
@@ -49,53 +25,11 @@
|
|
|
49
25
|
border: none;
|
|
50
26
|
border-radius: 0;
|
|
51
27
|
background: var(--rf-color-code-bg);
|
|
52
|
-
overflow-x: auto;
|
|
53
|
-
overscroll-behavior-x: contain;
|
|
54
28
|
font-family: var(--rf-font-mono);
|
|
55
29
|
font-size: var(--rf-text-sm);
|
|
56
30
|
line-height: var(--rf-leading-relaxed);
|
|
57
31
|
}
|
|
58
|
-
|
|
59
|
-
/* WORK-304 — inner rows wrapper, sized as `display: grid; min-width:
|
|
60
|
-
* max-content` so every `.rf-diff__line` (grid item) spans the
|
|
61
|
-
* widest line's intrinsic width. The pre is the scroll container
|
|
62
|
-
* (`overflow-x: auto`); this wrapper is what actually expands past
|
|
63
|
-
* the pre's visible width when a line overflows, triggering the
|
|
64
|
-
* pre's scroll and keeping the row tint (+/-/highlight) contiguous
|
|
65
|
-
* across the full scroll region. Mirrors the
|
|
66
|
-
* `pre code { display: grid; min-width: max-content }` pattern in
|
|
67
|
-
* the standalone codeblock at `elements/code.css`. */
|
|
68
|
-
.rf-diff__rows {
|
|
69
|
-
display: grid;
|
|
70
|
-
min-width: max-content;
|
|
71
|
-
}
|
|
72
|
-
/* WORK-304 — annotated line primitive. Three states share one row
|
|
73
|
-
* shape (`add`, `remove`, `highlight`); only the tint token and the
|
|
74
|
-
* gutter rail colour change. The same selector form is reused by the
|
|
75
|
-
* standalone code block for `data-line-status="highlight"` via the
|
|
76
|
-
* `.rf-codeblock` rules below.
|
|
77
|
-
*
|
|
78
|
-
* `display: block` + inline-block children (not `display: flex`) for
|
|
79
|
-
* the line container so the line's intrinsic max-content is the
|
|
80
|
-
* unambiguous sum of children's intrinsic widths — flex container
|
|
81
|
-
* max-content was being clipped by the flex-basis / flex-grow /
|
|
82
|
-
* flex-shrink combination depending on browser, leaving the row
|
|
83
|
-
* tint cut off at the text width when the user scrolled
|
|
84
|
-
* horizontally. `white-space: nowrap` keeps the inline-block
|
|
85
|
-
* children on a single row (the children themselves preserve their
|
|
86
|
-
* own `white-space: pre` for the code). `min-width: max-content`
|
|
87
|
-
* keeps the line at least as wide as its content (full row tint
|
|
88
|
-
* when content overflows the visible viewport); default width =
|
|
89
|
-
* 100% of pre keeps it filling the visible width on short rows. */
|
|
90
32
|
.rf-diff__line {
|
|
91
|
-
/* `display: flex` for internal layout (gutters + content side
|
|
92
|
-
* by side). The line's WIDTH is determined by the parent grid
|
|
93
|
-
* track (`.rf-diff__code`'s `grid-template-columns:
|
|
94
|
-
* minmax(100%, max-content)`), not by the flex sizing here —
|
|
95
|
-
* so the row tint covers the full grid column regardless of
|
|
96
|
-
* how flex sizing would have resolved. */
|
|
97
|
-
display: flex;
|
|
98
|
-
min-height: 1.6em;
|
|
99
33
|
border-left: 3px solid transparent;
|
|
100
34
|
}
|
|
101
35
|
.rf-diff__line[data-line-status="equal"] { background: transparent; }
|
|
@@ -113,20 +47,13 @@
|
|
|
113
47
|
}
|
|
114
48
|
.rf-diff__line[data-line-status="empty"] { background: transparent; }
|
|
115
49
|
.rf-diff__gutter-num {
|
|
116
|
-
flex-shrink: 0;
|
|
117
50
|
padding: 0 0.5rem;
|
|
118
|
-
width: 2.5em;
|
|
119
|
-
min-height: 1.6em;
|
|
120
51
|
text-align: right;
|
|
121
52
|
font-size: var(--rf-text-xs);
|
|
122
53
|
font-variant-numeric: tabular-nums;
|
|
123
54
|
user-select: none;
|
|
124
55
|
color: var(--rf-color-muted);
|
|
125
56
|
}
|
|
126
|
-
/* Change-type colour drives the directional cue — no more +/- prefix.
|
|
127
|
-
* Remove lines colour the before-number; add lines colour the after-number.
|
|
128
|
-
* The opposite side renders empty (no number) which itself signals "nothing
|
|
129
|
-
* here on this side". */
|
|
130
57
|
.rf-diff__line[data-line-status="remove"] .rf-diff__gutter-num[data-side="before"] {
|
|
131
58
|
color: var(--rf-color-danger);
|
|
132
59
|
}
|
|
@@ -137,18 +64,8 @@
|
|
|
137
64
|
margin: 0;
|
|
138
65
|
}
|
|
139
66
|
.rf-diff__line-content {
|
|
140
|
-
/* `flex: 1 0 auto` so line-content contributes its
|
|
141
|
-
* `white-space: pre` text width to the line's intrinsic
|
|
142
|
-
* max-content (which the parent grid track reads from); grow:1
|
|
143
|
-
* lets it fill any free space in the row beyond the gutters
|
|
144
|
-
* when the grid track is wider than the line's natural size
|
|
145
|
-
* (short content / wide visible viewport). WORK-304. */
|
|
146
|
-
flex: 1 0 auto;
|
|
147
67
|
white-space: pre;
|
|
148
68
|
padding-right: 1rem;
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
* box, so without this the flex item collapses below the parent's
|
|
152
|
-
* min-height and rows visually drift in the split-mode grid. */
|
|
153
|
-
min-height: 1.6em;
|
|
69
|
+
}
|
|
70
|
+
|
|
154
71
|
}
|
package/styles/runes/drawer.css
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@layer skin {
|
|
1
2
|
/* Drawer — addressable modal panel (SPEC-060).
|
|
2
3
|
*
|
|
3
4
|
* Two visual modes ride on the same `.rf-drawer` element:
|
|
@@ -19,9 +20,6 @@
|
|
|
19
20
|
*/
|
|
20
21
|
|
|
21
22
|
.rf-drawer {
|
|
22
|
-
--rf-drawer-size-sm: 22rem;
|
|
23
|
-
--rf-drawer-size-md: 36rem;
|
|
24
|
-
--rf-drawer-size-lg: 52rem;
|
|
25
23
|
--rf-drawer-bg: var(--rf-color-surface);
|
|
26
24
|
--rf-drawer-fg: var(--rf-color-text);
|
|
27
25
|
--rf-drawer-border: var(--rf-color-border);
|
|
@@ -32,13 +30,6 @@
|
|
|
32
30
|
--rf-drawer-anim-ease: cubic-bezier(0.32, 0.72, 0, 1);
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
/* ─── Body-scroll lock while any drawer is open ────────────────── */
|
|
36
|
-
|
|
37
|
-
html.rf-drawer-open,
|
|
38
|
-
html.rf-drawer-open body {
|
|
39
|
-
overflow: hidden;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
33
|
/* ─── No-JS / in-flow mode ─────────────────────────────────────── */
|
|
43
34
|
|
|
44
35
|
section.rf-drawer {
|
|
@@ -52,9 +43,6 @@ section.rf-drawer {
|
|
|
52
43
|
}
|
|
53
44
|
|
|
54
45
|
section.rf-drawer .rf-drawer__header {
|
|
55
|
-
display: flex;
|
|
56
|
-
align-items: baseline;
|
|
57
|
-
justify-content: space-between;
|
|
58
46
|
gap: var(--rf-spacing-sm);
|
|
59
47
|
margin-bottom: var(--rf-spacing-sm);
|
|
60
48
|
}
|
|
@@ -73,7 +61,6 @@ section.rf-drawer .rf-drawer__body > :last-child { margin-bottom: 0; }
|
|
|
73
61
|
/* In-flow footer — small text, top divider, mirrors the dialog-mode look so
|
|
74
62
|
* authors get the same chrome whether JS is enhancing or not. */
|
|
75
63
|
section.rf-drawer .rf-drawer__footer {
|
|
76
|
-
display: block;
|
|
77
64
|
margin-top: var(--rf-spacing-md);
|
|
78
65
|
padding-top: var(--rf-spacing-sm);
|
|
79
66
|
border-top: 1px solid var(--rf-drawer-border);
|
|
@@ -91,7 +78,6 @@ section.rf-drawer .rf-drawer__footer > :last-child { margin-bottom: 0; }
|
|
|
91
78
|
* closed dialogs, so the closed dialog renders visibly as an empty box
|
|
92
79
|
* positioned by the side `inset` rules. */
|
|
93
80
|
dialog.rf-drawer {
|
|
94
|
-
box-sizing: border-box;
|
|
95
81
|
background: var(--rf-drawer-bg);
|
|
96
82
|
color: var(--rf-drawer-fg);
|
|
97
83
|
border: 1px solid var(--rf-drawer-border);
|
|
@@ -99,18 +85,6 @@ dialog.rf-drawer {
|
|
|
99
85
|
box-shadow: var(--rf-drawer-shadow);
|
|
100
86
|
padding: 0;
|
|
101
87
|
margin: 0;
|
|
102
|
-
overflow: hidden;
|
|
103
|
-
max-width: calc(100vw - 2 * var(--rf-drawer-gutter));
|
|
104
|
-
max-height: calc(100vh - 2 * var(--rf-drawer-gutter));
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/* Flex column layout only when the dialog is actually open. The header
|
|
108
|
-
* and footer pin via `flex: 0 0 auto`; the body scrolls via `flex: 1 1
|
|
109
|
-
* auto; overflow-y: auto`. The dialog's `max-height` cap on the dialog
|
|
110
|
-
* provides the scroll context. */
|
|
111
|
-
dialog.rf-drawer[open] {
|
|
112
|
-
display: flex;
|
|
113
|
-
flex-direction: column;
|
|
114
88
|
}
|
|
115
89
|
|
|
116
90
|
dialog.rf-drawer::backdrop {
|
|
@@ -119,10 +93,6 @@ dialog.rf-drawer::backdrop {
|
|
|
119
93
|
}
|
|
120
94
|
|
|
121
95
|
dialog.rf-drawer .rf-drawer__header {
|
|
122
|
-
flex: 0 0 auto;
|
|
123
|
-
display: flex;
|
|
124
|
-
align-items: center;
|
|
125
|
-
justify-content: space-between;
|
|
126
96
|
gap: var(--rf-spacing-md);
|
|
127
97
|
/* Reset the generous `[data-section="header"]` bottom margin (3rem) — the
|
|
128
98
|
* dialog chrome spaces the header from the body via the body's own
|
|
@@ -148,7 +118,6 @@ dialog.rf-drawer .rf-drawer__close {
|
|
|
148
118
|
font-size: var(--rf-text-xl);
|
|
149
119
|
line-height: 1;
|
|
150
120
|
border-radius: var(--rf-radius-sm);
|
|
151
|
-
flex-shrink: 0;
|
|
152
121
|
}
|
|
153
122
|
dialog.rf-drawer .rf-drawer__close:hover {
|
|
154
123
|
color: var(--rf-color-text);
|
|
@@ -156,17 +125,13 @@ dialog.rf-drawer .rf-drawer__close:hover {
|
|
|
156
125
|
}
|
|
157
126
|
|
|
158
127
|
dialog.rf-drawer .rf-drawer__body {
|
|
159
|
-
flex: 1 1 auto;
|
|
160
|
-
overflow-y: auto;
|
|
161
128
|
padding: var(--rf-spacing-md) var(--rf-spacing-lg);
|
|
162
|
-
min-height: 0;
|
|
163
129
|
}
|
|
164
130
|
|
|
165
131
|
/* Dialog footer — small text, top divider, pinned at bottom via flex.
|
|
166
132
|
* Stays visible regardless of body scroll depth so links like "View
|
|
167
133
|
* source on GitHub →" (the SPEC-078 use case) are always one tap away. */
|
|
168
134
|
dialog.rf-drawer .rf-drawer__footer {
|
|
169
|
-
flex: 0 0 auto;
|
|
170
135
|
padding: var(--rf-spacing-sm) var(--rf-spacing-lg);
|
|
171
136
|
border-top: 1px solid var(--rf-drawer-border);
|
|
172
137
|
background: var(--rf-drawer-bg);
|
|
@@ -191,67 +156,24 @@ dialog.rf-drawer .rf-drawer__body > :last-child,
|
|
|
191
156
|
dialog.rf-drawer .rf-drawer__body > :last-child > :last-child {
|
|
192
157
|
margin-bottom: 0;
|
|
193
158
|
}
|
|
194
|
-
|
|
195
|
-
/* ─── Side modifiers ───────────────────────────────────────────────
|
|
196
|
-
*
|
|
197
|
-
* Each side anchors the dialog with `inset`. The slide-in animation is
|
|
198
|
-
* a keyframes animation triggered by `[open]` — picked over
|
|
199
|
-
* `@starting-style` because keyframes have broader browser support
|
|
200
|
-
* (everywhere `<dialog>` works) and a clearer source-of-truth: the
|
|
201
|
-
* starting/ending frames are spelled out, no cascade-interaction
|
|
202
|
-
* footguns. The matching backdrop fade is a separate animation.
|
|
203
|
-
*/
|
|
204
|
-
|
|
205
|
-
dialog.rf-drawer[data-side="right"] {
|
|
206
|
-
inset:
|
|
207
|
-
var(--rf-drawer-gutter)
|
|
208
|
-
var(--rf-drawer-gutter)
|
|
209
|
-
var(--rf-drawer-gutter)
|
|
210
|
-
auto;
|
|
211
|
-
height: auto;
|
|
212
|
-
}
|
|
213
159
|
dialog.rf-drawer[data-side="right"][open]:not([data-state="closing"]) {
|
|
214
160
|
animation: rf-drawer-slide-in-right var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
|
|
215
161
|
}
|
|
216
162
|
dialog.rf-drawer[data-side="right"][data-state="closing"] {
|
|
217
163
|
animation: rf-drawer-slide-out-right var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease) forwards;
|
|
218
164
|
}
|
|
219
|
-
dialog.rf-drawer[data-side="left"] {
|
|
220
|
-
inset:
|
|
221
|
-
var(--rf-drawer-gutter)
|
|
222
|
-
auto
|
|
223
|
-
var(--rf-drawer-gutter)
|
|
224
|
-
var(--rf-drawer-gutter);
|
|
225
|
-
height: auto;
|
|
226
|
-
}
|
|
227
165
|
dialog.rf-drawer[data-side="left"][open]:not([data-state="closing"]) {
|
|
228
166
|
animation: rf-drawer-slide-in-left var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
|
|
229
167
|
}
|
|
230
168
|
dialog.rf-drawer[data-side="left"][data-state="closing"] {
|
|
231
169
|
animation: rf-drawer-slide-out-left var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease) forwards;
|
|
232
170
|
}
|
|
233
|
-
dialog.rf-drawer[data-side="top"] {
|
|
234
|
-
inset:
|
|
235
|
-
var(--rf-drawer-gutter)
|
|
236
|
-
var(--rf-drawer-gutter)
|
|
237
|
-
auto
|
|
238
|
-
var(--rf-drawer-gutter);
|
|
239
|
-
width: auto;
|
|
240
|
-
}
|
|
241
171
|
dialog.rf-drawer[data-side="top"][open]:not([data-state="closing"]) {
|
|
242
172
|
animation: rf-drawer-slide-in-top var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
|
|
243
173
|
}
|
|
244
174
|
dialog.rf-drawer[data-side="top"][data-state="closing"] {
|
|
245
175
|
animation: rf-drawer-slide-out-top var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease) forwards;
|
|
246
176
|
}
|
|
247
|
-
dialog.rf-drawer[data-side="bottom"] {
|
|
248
|
-
inset:
|
|
249
|
-
auto
|
|
250
|
-
var(--rf-drawer-gutter)
|
|
251
|
-
var(--rf-drawer-gutter)
|
|
252
|
-
var(--rf-drawer-gutter);
|
|
253
|
-
width: auto;
|
|
254
|
-
}
|
|
255
177
|
dialog.rf-drawer[data-side="bottom"][open]:not([data-state="closing"]) {
|
|
256
178
|
animation: rf-drawer-slide-in-bottom var(--rf-drawer-anim-duration) var(--rf-drawer-anim-ease);
|
|
257
179
|
}
|
|
@@ -336,30 +258,4 @@ dialog.rf-drawer[data-state="closing"]::backdrop {
|
|
|
336
258
|
}
|
|
337
259
|
}
|
|
338
260
|
|
|
339
|
-
/* ─── Size modifiers (only meaningful in dialog mode) ─────────── */
|
|
340
|
-
|
|
341
|
-
dialog.rf-drawer[data-side="right"][data-size="sm"],
|
|
342
|
-
dialog.rf-drawer[data-side="left"][data-size="sm"] {
|
|
343
|
-
width: var(--rf-drawer-size-sm);
|
|
344
|
-
}
|
|
345
|
-
dialog.rf-drawer[data-side="right"][data-size="md"],
|
|
346
|
-
dialog.rf-drawer[data-side="left"][data-size="md"] {
|
|
347
|
-
width: var(--rf-drawer-size-md);
|
|
348
|
-
}
|
|
349
|
-
dialog.rf-drawer[data-side="right"][data-size="lg"],
|
|
350
|
-
dialog.rf-drawer[data-side="left"][data-size="lg"] {
|
|
351
|
-
width: var(--rf-drawer-size-lg);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
dialog.rf-drawer[data-side="top"][data-size="sm"],
|
|
355
|
-
dialog.rf-drawer[data-side="bottom"][data-size="sm"] {
|
|
356
|
-
height: var(--rf-drawer-size-sm);
|
|
357
|
-
}
|
|
358
|
-
dialog.rf-drawer[data-side="top"][data-size="md"],
|
|
359
|
-
dialog.rf-drawer[data-side="bottom"][data-size="md"] {
|
|
360
|
-
height: var(--rf-drawer-size-md);
|
|
361
|
-
}
|
|
362
|
-
dialog.rf-drawer[data-side="top"][data-size="lg"],
|
|
363
|
-
dialog.rf-drawer[data-side="bottom"][data-size="lg"] {
|
|
364
|
-
height: var(--rf-drawer-size-lg);
|
|
365
261
|
}
|
package/styles/runes/embed.css
CHANGED
|
@@ -1,22 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
@layer skin {
|
|
2
|
+
/* Embed — skin. The responsive iframe wrapper + empty-fallback hide live in
|
|
3
|
+
* @refrakt-md/skeleton (styles/runes/embed.css). */
|
|
2
4
|
.rf-embed {
|
|
3
5
|
margin: 0;
|
|
4
6
|
padding: 0;
|
|
5
7
|
}
|
|
6
8
|
.rf-embed__wrapper {
|
|
7
|
-
position: relative;
|
|
8
|
-
width: 100%;
|
|
9
|
-
height: 0;
|
|
10
|
-
overflow: hidden;
|
|
11
9
|
border-radius: var(--rf-radius-md);
|
|
12
10
|
background: var(--rf-color-surface);
|
|
13
11
|
}
|
|
14
12
|
.rf-embed__wrapper iframe {
|
|
15
|
-
position: absolute;
|
|
16
|
-
top: 0;
|
|
17
|
-
left: 0;
|
|
18
|
-
width: 100%;
|
|
19
|
-
height: 100%;
|
|
20
13
|
border: none;
|
|
21
14
|
}
|
|
22
15
|
.rf-embed__fallback {
|
|
@@ -27,6 +20,5 @@
|
|
|
27
20
|
.rf-embed__fallback p:last-child {
|
|
28
21
|
margin-bottom: 0;
|
|
29
22
|
}
|
|
30
|
-
|
|
31
|
-
display: none;
|
|
23
|
+
|
|
32
24
|
}
|
package/styles/runes/event.css
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@layer skin {
|
|
1
2
|
/* Event */
|
|
2
3
|
|
|
3
4
|
/* When/where def-list — geometry from the shared `[data-zone-layout=
|
|
@@ -11,7 +12,6 @@
|
|
|
11
12
|
margin-top: 1.5rem;
|
|
12
13
|
}
|
|
13
14
|
.rf-event__register a {
|
|
14
|
-
display: inline-block;
|
|
15
15
|
padding: 0.5rem 1rem;
|
|
16
16
|
background: var(--rf-color-primary);
|
|
17
17
|
color: var(--rf-color-on-primary);
|
|
@@ -37,3 +37,5 @@
|
|
|
37
37
|
.rf-event__body a:hover {
|
|
38
38
|
color: var(--rf-color-primary-hover);
|
|
39
39
|
}
|
|
40
|
+
|
|
41
|
+
}
|
package/styles/runes/expand.css
CHANGED
|
@@ -1,53 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* character rune, etc.) renders itself standalone-style; expand just
|
|
5
|
-
* provides the wrapper + canonical-link affordance. Themes that want
|
|
6
|
-
* the embedded content visually distinguished from inline-authored
|
|
7
|
-
* content target `.rf-expand .rf-spec`, `.rf-expand h1`, etc.
|
|
8
|
-
*
|
|
9
|
-
* Two visual treatments:
|
|
10
|
-
*
|
|
11
|
-
* 1. **Default (`level=` unset, peer-document mode)** — the embed reads
|
|
12
|
-
* like a quoted document. A subtle border + indent treatment marks
|
|
13
|
-
* it as set-aside material. Heading scale is dialed down slightly
|
|
14
|
-
* so an H1 inside the embed doesn't compete with the host's H1.
|
|
15
|
-
* 2. **Sub-section mode (`level=` set)** — the embed merges into the
|
|
16
|
-
* host outline. The wrapper sheds the quoted treatment so it reads
|
|
17
|
-
* as authored sub-content. Authors opt into this by setting
|
|
18
|
-
* `level=`; CSS targets `.rf-expand:not([data-outline-scope])` to
|
|
19
|
-
* pick the right treatment automatically.
|
|
20
|
-
*/
|
|
21
|
-
|
|
1
|
+
@layer skin {
|
|
2
|
+
/* Expand — skin. The inline-block canonical-link box lives in @refrakt-md/skeleton
|
|
3
|
+
* (styles/runes/expand.css). */
|
|
22
4
|
.rf-expand {
|
|
23
5
|
margin: var(--rf-spacing-md) 0;
|
|
24
6
|
}
|
|
25
|
-
|
|
26
|
-
/* Peer-document mode — no background, no rounded corners, no rules.
|
|
27
|
-
* Reads as "set-aside material" through spacing alone, without competing
|
|
28
|
-
* visually with the host content. Authors who want a stronger treatment
|
|
29
|
-
* (rules, background, etc.) can override `.rf-expand[data-outline-scope]`
|
|
30
|
-
* in their theme. */
|
|
31
7
|
.rf-expand[data-outline-scope] {
|
|
32
8
|
padding: var(--rf-spacing-md) 0;
|
|
33
9
|
}
|
|
34
|
-
|
|
35
|
-
/* Tone down embedded headings so the host outline keeps visual primacy.
|
|
36
|
-
* The semantic levels are preserved (H1 stays H1 etc.); only the visual
|
|
37
|
-
* scale is adjusted in the peer-document treatment. Authors using
|
|
38
|
-
* `level=` for sub-section mode get the normal heading scale. */
|
|
39
10
|
.rf-expand[data-outline-scope] :is(h1, h2, h3, h4, h5, h6):first-child {
|
|
40
11
|
margin-top: 0;
|
|
41
12
|
}
|
|
42
13
|
.rf-expand[data-outline-scope] h1 { font-size: var(--rf-text-2xl); }
|
|
43
14
|
.rf-expand[data-outline-scope] h2 { font-size: var(--rf-text-xl); }
|
|
44
15
|
.rf-expand[data-outline-scope] h3 { font-size: var(--rf-text-lg); }
|
|
45
|
-
|
|
46
16
|
.rf-expand > :first-child { margin-top: 0; }
|
|
47
17
|
.rf-expand > :last-child { margin-bottom: 0; }
|
|
48
|
-
|
|
49
18
|
.rf-expand__canonical-link {
|
|
50
|
-
display: inline-block;
|
|
51
19
|
margin-top: var(--rf-spacing-sm);
|
|
52
20
|
font-size: var(--rf-text-sm);
|
|
53
21
|
color: var(--rf-color-primary);
|
|
@@ -56,11 +24,6 @@
|
|
|
56
24
|
.rf-expand__canonical-link:hover {
|
|
57
25
|
text-decoration: underline;
|
|
58
26
|
}
|
|
59
|
-
|
|
60
|
-
/* Error-state placeholder rendered when resolution fails. The build
|
|
61
|
-
* also surfaces the error through `ctx.error`; this is the user-facing
|
|
62
|
-
* affordance so the failure isn't silent. Keyed off `[data-expand-error]`
|
|
63
|
-
* which the resolver sets on the error wrapper. */
|
|
64
27
|
.rf-expand[data-expand-error] {
|
|
65
28
|
padding: var(--rf-spacing-sm) var(--rf-spacing-md);
|
|
66
29
|
border-left: 3px solid var(--rf-color-danger);
|
|
@@ -70,3 +33,5 @@
|
|
|
70
33
|
font-size: var(--rf-text-sm);
|
|
71
34
|
border-radius: 0 var(--rf-radius-sm) var(--rf-radius-sm) 0;
|
|
72
35
|
}
|
|
36
|
+
|
|
37
|
+
}
|
package/styles/runes/faction.css
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@layer skin {
|
|
1
2
|
/* Faction — split/stacked geometry, the title, and the metadata def-list all
|
|
2
3
|
* come from the shared layers: layouts/split.css ([data-layout] +
|
|
3
4
|
* [data-section="media"]), dimensions/sections.css ([data-section="title"] /
|
|
@@ -28,12 +29,6 @@
|
|
|
28
29
|
row-gap: var(--rf-faction-media-gap);
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
/* Stacked layouts — beside layouts handled by shared split.css */
|
|
32
|
-
.rf-faction[data-media-position="top"] {
|
|
33
|
-
display: flex;
|
|
34
|
-
flex-direction: column;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
32
|
.rf-faction[data-media-position="top"] > .rf-faction__scene {
|
|
38
33
|
margin-bottom: var(--rf-faction-media-gap);
|
|
39
34
|
}
|
|
@@ -43,8 +38,6 @@
|
|
|
43
38
|
|
|
44
39
|
/* Content */
|
|
45
40
|
.rf-faction__sections {
|
|
46
|
-
display: flex;
|
|
47
|
-
flex-direction: column;
|
|
48
41
|
gap: 1rem;
|
|
49
42
|
}
|
|
50
43
|
.rf-faction__content ul,
|
|
@@ -58,7 +51,6 @@
|
|
|
58
51
|
border-top: 1px solid var(--rf-color-border);
|
|
59
52
|
}
|
|
60
53
|
.rf-faction-section__name {
|
|
61
|
-
display: block;
|
|
62
54
|
font-size: var(--rf-text-xl);
|
|
63
55
|
font-weight: var(--rf-weight-bold);
|
|
64
56
|
line-height: var(--rf-leading-snug);
|
|
@@ -69,3 +61,5 @@
|
|
|
69
61
|
.rf-faction-section__body ol {
|
|
70
62
|
padding-left: 1.5rem;
|
|
71
63
|
}
|
|
64
|
+
|
|
65
|
+
}
|
package/styles/runes/feature.css
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
@layer skin {
|
|
2
|
+
/* Feature — skin. The preamble/eyebrow/content/definitions-grid/icon layout and
|
|
3
|
+
* the media-position flip live in @refrakt-md/skeleton (styles/runes/feature.css). */
|
|
2
4
|
.rf-feature {
|
|
3
5
|
padding: 2.5rem 0 2rem;
|
|
4
6
|
}
|
|
5
7
|
.rf-feature__preamble {
|
|
6
|
-
flex-direction: column;
|
|
7
|
-
align-items: flex-start;
|
|
8
8
|
gap: 0.25rem;
|
|
9
9
|
margin-bottom: 1.5rem;
|
|
10
10
|
}
|
|
@@ -17,8 +17,6 @@
|
|
|
17
17
|
margin: 0 0 0.5rem;
|
|
18
18
|
}
|
|
19
19
|
.rf-feature__eyebrow:has(a) {
|
|
20
|
-
display: inline-block;
|
|
21
|
-
position: relative;
|
|
22
20
|
padding: 0.25rem 0.875rem;
|
|
23
21
|
border: 1px solid var(--rf-color-border);
|
|
24
22
|
border-radius: var(--rf-radius-full);
|
|
@@ -30,7 +28,7 @@
|
|
|
30
28
|
}
|
|
31
29
|
.rf-feature__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
|
|
32
30
|
.rf-feature__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: var(--rf-weight-semibold); text-decoration: none; }
|
|
33
|
-
.rf-feature__eyebrow:has(a) a::before {
|
|
31
|
+
.rf-feature__eyebrow:has(a) a::before { border-radius: inherit; }
|
|
34
32
|
.rf-feature__headline {
|
|
35
33
|
margin-top: 0;
|
|
36
34
|
}
|
|
@@ -42,9 +40,6 @@
|
|
|
42
40
|
.rf-feature__image {
|
|
43
41
|
margin-bottom: 1rem;
|
|
44
42
|
}
|
|
45
|
-
.rf-feature__content {
|
|
46
|
-
display: contents;
|
|
47
|
-
}
|
|
48
43
|
.rf-feature h2 {
|
|
49
44
|
margin-bottom: 2rem;
|
|
50
45
|
}
|
|
@@ -63,20 +58,13 @@
|
|
|
63
58
|
/* Definitions stack in a single column by default; the `--definitions-grid`
|
|
64
59
|
* modifier (SPEC-091 media-position variant: top/bottom) tiles them as a grid. */
|
|
65
60
|
.rf-feature__definitions {
|
|
66
|
-
display: block;
|
|
67
61
|
margin: 0;
|
|
68
62
|
}
|
|
69
63
|
.rf-feature--definitions-grid .rf-feature__definitions {
|
|
70
|
-
display: grid;
|
|
71
|
-
grid-template-columns: repeat(auto-fit, minmax(max(240px, calc((100% - 3rem) / 3)), 1fr));
|
|
72
64
|
gap: 1.5rem;
|
|
73
65
|
}
|
|
74
66
|
/* Beside layouts (media on start/end): definitions stay stacked (no grid
|
|
75
67
|
* modifier) inside the content track. */
|
|
76
|
-
.rf-feature[data-media-position="start"] .rf-feature__content,
|
|
77
|
-
.rf-feature[data-media-position="end"] .rf-feature__content {
|
|
78
|
-
display: block;
|
|
79
|
-
}
|
|
80
68
|
.rf-feature[data-media-position="start"] .rf-feature__preamble,
|
|
81
69
|
.rf-feature[data-media-position="end"] .rf-feature__preamble,
|
|
82
70
|
.rf-feature[data-media-position="start"] h2,
|
|
@@ -103,13 +91,7 @@
|
|
|
103
91
|
letter-spacing: var(--rf-tracking-tight);
|
|
104
92
|
color: var(--rf-color-text);
|
|
105
93
|
}
|
|
106
|
-
.rf-feature__feature-item dt:has(> .rf-icon) {
|
|
107
|
-
display: flex;
|
|
108
|
-
flex-direction: column;
|
|
109
|
-
}
|
|
110
94
|
.rf-feature__feature-item dt > .rf-icon {
|
|
111
|
-
width: 1.5rem;
|
|
112
|
-
height: 1.5rem;
|
|
113
95
|
margin-bottom: 0.5rem;
|
|
114
96
|
color: var(--rf-color-primary);
|
|
115
97
|
}
|
|
@@ -133,14 +115,4 @@
|
|
|
133
115
|
padding: 0;
|
|
134
116
|
}
|
|
135
117
|
|
|
136
|
-
/* BUG-001 — content-first DOM inverts the shared media-first stacked contract
|
|
137
|
-
* (layouts/split.css): counter it so the labels are truthful. `bottom` (the
|
|
138
|
-
* default) is plain block flow — media after the content, the historical
|
|
139
|
-
* look; an explicit `top` flips the visual order without touching the DOM. */
|
|
140
|
-
.rf-feature[data-media-position="bottom"] {
|
|
141
|
-
display: block;
|
|
142
|
-
}
|
|
143
|
-
.rf-feature[data-media-position="top"] {
|
|
144
|
-
display: flex;
|
|
145
|
-
flex-direction: column-reverse;
|
|
146
118
|
}
|
package/styles/runes/figure.css
CHANGED
|
@@ -1,23 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
@layer skin {
|
|
2
|
+
/* Figure — skin. The image box, frame-aspect fill, size max-widths, and alignment
|
|
3
|
+
* auto-margins live in @refrakt-md/skeleton (styles/runes/figure.css). */
|
|
2
4
|
.rf-figure :is(img, .rf-placeholder) {
|
|
3
|
-
display: block;
|
|
4
|
-
max-width: 100%;
|
|
5
|
-
height: auto;
|
|
6
|
-
margin-inline: auto;
|
|
7
5
|
border-radius: var(--rf-radius-media);
|
|
8
6
|
}
|
|
9
|
-
|
|
10
|
-
/* When `frame-aspect` sets an explicit surface shape, the image fills the
|
|
11
|
-
* shape rather than sitting at its natural size with whitespace on the
|
|
12
|
-
* inline-end. `object-fit: cover` crops only if the natural aspect doesn't
|
|
13
|
-
* match — and `frame-anchor` already picks the focal point of that crop
|
|
14
|
-
* (the same contract as a card's media slot). */
|
|
15
|
-
.rf-figure[style*="--frame-aspect"] :is(img, .rf-placeholder) {
|
|
16
|
-
width: 100%;
|
|
17
|
-
height: 100%;
|
|
18
|
-
object-fit: cover;
|
|
19
|
-
margin: 0;
|
|
20
|
-
}
|
|
21
7
|
.rf-figure figcaption {
|
|
22
8
|
margin-top: 0.625rem;
|
|
23
9
|
font-size: var(--rf-text-sm);
|
|
@@ -25,10 +11,5 @@
|
|
|
25
11
|
text-align: center;
|
|
26
12
|
font-style: italic;
|
|
27
13
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
.rf-figure--large { max-width: 960px; }
|
|
31
|
-
.rf-figure--full { max-width: 100%; }
|
|
32
|
-
.rf-figure--left { margin-right: auto; }
|
|
33
|
-
.rf-figure--center { margin-left: auto; margin-right: auto; }
|
|
34
|
-
.rf-figure--right { margin-left: auto; }
|
|
14
|
+
|
|
15
|
+
}
|
|
@@ -1,21 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
*
|
|
3
|
-
* Renders as `<span class="rf-file-ref"><a>label</a></span>` in prose
|
|
4
|
-
* (plus an invisible hoist sentinel `<meta>` when preview="drawer").
|
|
5
|
-
* The span carries the data-rune class; the inner `<a>` is the click
|
|
6
|
-
* target with its own visual treatment.
|
|
7
|
-
*
|
|
8
|
-
* Without preview, the link points at the canonical GitHub URL — give
|
|
9
|
-
* it a small external-link affordance so readers know they're about to
|
|
10
|
-
* leave the page. With preview, it points at the hoisted drawer's
|
|
11
|
-
* fragment id; visually the same inline-link affordance — what makes
|
|
12
|
-
* it a "preview link" rather than a "navigate-away link" is the drawer
|
|
13
|
-
* that opens on click, not extra inline chrome.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
.rf-file-ref {
|
|
17
|
-
display: inline;
|
|
18
|
-
}
|
|
1
|
+
@layer skin {
|
|
19
2
|
|
|
20
3
|
.rf-file-ref > a {
|
|
21
4
|
color: var(--rf-color-primary);
|
|
@@ -29,3 +12,5 @@
|
|
|
29
12
|
.rf-file-ref > a:hover {
|
|
30
13
|
text-decoration-thickness: 2px;
|
|
31
14
|
}
|
|
15
|
+
|
|
16
|
+
}
|