@refrakt-md/lumina 0.24.0 → 0.24.1
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/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@refrakt-md/lumina",
|
|
3
3
|
"description": "Lumina theme for refrakt.md — design tokens, CSS, identity transform, and layout configs",
|
|
4
|
-
"version": "0.24.
|
|
4
|
+
"version": "0.24.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -84,10 +84,10 @@
|
|
|
84
84
|
"generate-tokens": "node scripts/generate-tokens.mjs"
|
|
85
85
|
},
|
|
86
86
|
"dependencies": {
|
|
87
|
-
"@refrakt-md/runes": "0.24.
|
|
88
|
-
"@refrakt-md/skeleton": "0.24.
|
|
89
|
-
"@refrakt-md/transform": "0.24.
|
|
90
|
-
"@refrakt-md/types": "0.24.
|
|
87
|
+
"@refrakt-md/runes": "0.24.1",
|
|
88
|
+
"@refrakt-md/skeleton": "0.24.1",
|
|
89
|
+
"@refrakt-md/transform": "0.24.1",
|
|
90
|
+
"@refrakt-md/types": "0.24.1"
|
|
91
91
|
},
|
|
92
92
|
"devDependencies": {
|
|
93
93
|
"postcss": "^8.4.0"
|
|
@@ -80,8 +80,10 @@
|
|
|
80
80
|
* We push the root with negative margins so it can spill past its
|
|
81
81
|
* parent's edge for a true breakout. */
|
|
82
82
|
|
|
83
|
-
/* — Case
|
|
84
|
-
|
|
83
|
+
/* — Case 1a: media-zone displace, default `peek` mode → translate the inner
|
|
84
|
+
* guest inside the slot. The zone's `overflow: hidden` clips the displaced
|
|
85
|
+
* guest into a peek (card / bento-cell behaviour). */
|
|
86
|
+
[data-section="media"][data-displace]:not([data-displace-mode="bleed"]) > :is(img, video, .rf-placeholder, [data-rune]) {
|
|
85
87
|
transform: translate(var(--displace-x, 0), var(--displace-y, 0));
|
|
86
88
|
}
|
|
87
89
|
[data-section="media"][data-displace="top"] { --displace-y: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
@@ -90,6 +92,18 @@
|
|
|
90
92
|
[data-section="media"][data-displace="top-end"] { --displace-x: var(--frame-offset, var(--rf-spacing-lg)); --displace-y: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
91
93
|
[data-section="media"][data-displace="bottom-end"] { --displace-x: var(--frame-offset, var(--rf-spacing-lg)); --displace-y: var(--frame-offset, var(--rf-spacing-lg)); }
|
|
92
94
|
|
|
95
|
+
/* — Case 1b: media-zone displace, `bleed` mode → negative margin on the media
|
|
96
|
+
* zone itself, so following layout pulls up and the guest extends past the
|
|
97
|
+
* host's edge (hero / cta behaviour). The guest renders at its natural
|
|
98
|
+
* position inside the zone — no translate, no artificial gap above. The
|
|
99
|
+
* margin needs to exceed the host's padding for the guest to clear the host
|
|
100
|
+
* edge; the offset scale tops out at `3xl` (6rem) for this. */
|
|
101
|
+
[data-section="media"][data-displace="top"][data-displace-mode="bleed"] { margin-top: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
102
|
+
[data-section="media"][data-displace="bottom"][data-displace-mode="bleed"] { margin-bottom: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
103
|
+
[data-section="media"][data-displace="end"][data-displace-mode="bleed"] { margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
104
|
+
[data-section="media"][data-displace="top-end"][data-displace-mode="bleed"] { margin-top: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
105
|
+
[data-section="media"][data-displace="bottom-end"][data-displace-mode="bleed"] { margin-bottom: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); margin-inline-end: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
106
|
+
|
|
93
107
|
/* — Case 2: self-target (showcase, etc.) → root moves; parent decides. */
|
|
94
108
|
[data-displace]:not([data-section="media"]) { position: relative; z-index: 1; }
|
|
95
109
|
[data-displace="top"]:not([data-section="media"]) { margin-top: calc(-1 * var(--frame-offset, var(--rf-spacing-lg))); }
|
|
@@ -25,7 +25,12 @@
|
|
|
25
25
|
Layout-chrome navs (menubar in header, columns in footer) are excluded
|
|
26
26
|
so they sit flush with the surrounding header/footer container. */
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
/* `:where(...)` zeros the selector specificity so per-rune CSS, the
|
|
29
|
+
* `[data-rune][data-spacing="..."]` attribute rules, and per-instance overrides
|
|
30
|
+
* all win cleanly. Without `:where()` the `:not([data-rune] [data-rune])` clause
|
|
31
|
+
* inflates this default to (0,3,0) — beating the (0,2,0) spacing attribute and
|
|
32
|
+
* masking `spacing="flush"` on top-level runes like hero. */
|
|
33
|
+
:where([data-rune]:not([data-rune] [data-rune]):not([data-layout="menubar"]):not([data-layout="columns"])) {
|
|
29
34
|
margin: var(--rf-spacing-md) 0;
|
|
30
35
|
}
|
|
31
36
|
|
package/styles/layouts/split.css
CHANGED
|
@@ -4,7 +4,19 @@
|
|
|
4
4
|
* The layout *structure* (start/end grid, top/bottom stack, 3-section placement,
|
|
5
5
|
* the media-zone fill/clip mechanism, responsive collapse) lives in
|
|
6
6
|
* @refrakt-md/skeleton (layouts/split.css). What remains here is skin: the media
|
|
7
|
-
* radius tier, the beside-image depth shadow,
|
|
7
|
+
* radius tier, the beside-image depth shadow, the codegroup radius alignment,
|
|
8
|
+
* and the default side-by-side spacing rhythm. */
|
|
9
|
+
|
|
10
|
+
/* Default side-by-side spacing — applies to every rune using the split layout
|
|
11
|
+
* (hero, feature, step, realm, faction, etc.). Contained-chrome runes
|
|
12
|
+
* (card, recipe, bento-cell, playlist) override `column-gap` / `row-gap` with
|
|
13
|
+
* higher-specificity selectors to hug their internal media well; everything
|
|
14
|
+
* else inherits this comfortable default so columns don't sit flush. */
|
|
15
|
+
[data-media-position="start"],
|
|
16
|
+
[data-media-position="end"] {
|
|
17
|
+
column-gap: var(--rf-spacing-lg);
|
|
18
|
+
row-gap: var(--rf-spacing-lg);
|
|
19
|
+
}
|
|
8
20
|
|
|
9
21
|
/* Media guests use the smaller media radius tier so they never read as more
|
|
10
22
|
* rounded than the (larger-radius) container they sit in. */
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* divider/handle positioning, toggle-bar flex, and meta/label hides live in
|
|
4
4
|
* @refrakt-md/skeleton (styles/runes/juxtapose.css). */
|
|
5
5
|
.rf-juxtapose__panels {
|
|
6
|
-
border-radius: var(--rf-radius-
|
|
6
|
+
border-radius: var(--rf-radius-lg);
|
|
7
7
|
border: 1px solid var(--rf-color-border);
|
|
8
8
|
background: var(--rf-color-surface);
|
|
9
9
|
}
|
package/styles/runes/sandbox.css
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
@layer skin {
|
|
2
2
|
/* Sandbox — skin. The iframe clip/fill + banner/poster/activate layout live in
|
|
3
3
|
* @refrakt-md/skeleton (styles/runes/sandbox.css). */
|
|
4
|
-
.rf-sandbox {
|
|
5
|
-
border-radius: var(--rf-radius-md);
|
|
6
|
-
}
|
|
7
4
|
.rf-sandbox iframe {
|
|
8
5
|
border: none;
|
|
9
6
|
}
|
|
@@ -14,7 +11,6 @@
|
|
|
14
11
|
/* When inside preview, remove sandbox margin */
|
|
15
12
|
.rf-preview .rf-sandbox {
|
|
16
13
|
margin: 0;
|
|
17
|
-
border-radius: 0;
|
|
18
14
|
}
|
|
19
15
|
/* Untrusted-mode affordance. */
|
|
20
16
|
.rf-sandbox[data-security-mode="untrusted"] {
|