@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.0",
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.0",
88
- "@refrakt-md/skeleton": "0.24.0",
89
- "@refrakt-md/transform": "0.24.0",
90
- "@refrakt-md/types": "0.24.0"
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 1: media-zone displace → translate the inner guest, zone clips. */
84
- [data-section="media"][data-displace] > :is(img, video, .rf-placeholder, [data-rune]) {
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
- [data-rune]:not([data-rune] [data-rune]):not(:where([data-layout="menubar"], [data-layout="columns"])) {
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
 
@@ -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, and the codegroup radius alignment. */
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-md);
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
  }
@@ -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"] {