@refrakt-md/lumina 0.8.0 → 0.8.2

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 CHANGED
@@ -20,3 +20,7 @@
20
20
  @import './styles/layouts/on-this-page.css';
21
21
  @import './styles/layouts/search.css';
22
22
  @import './styles/layouts/version-switcher.css';
23
+ @import './styles/layouts/split.css';
24
+
25
+ /* Universal Rune Attributes */
26
+ @import './styles/base/attributes.css';
@@ -1184,6 +1184,11 @@
1184
1184
  "tag": "image",
1185
1185
  "selector": ".rf-feature__image",
1186
1186
  "source": "autoLabel"
1187
+ },
1188
+ "definitions": {
1189
+ "tag": "dl",
1190
+ "selector": ".rf-feature__definitions",
1191
+ "source": "autoLabel"
1187
1192
  }
1188
1193
  },
1189
1194
  "inlineStyles": {
@@ -1198,15 +1203,6 @@
1198
1203
  }
1199
1204
  }
1200
1205
  },
1201
- "FeatureDefinition": {
1202
- "block": "feature-definition",
1203
- "root": ".rf-feature-definition",
1204
- "dataRune": "feature-definition",
1205
- "parent": "Feature",
1206
- "childOrder": [
1207
- "{content}"
1208
- ]
1209
- },
1210
1206
  "Steps": {
1211
1207
  "block": "steps",
1212
1208
  "root": ".rf-steps",
@@ -2423,9 +2419,15 @@
2423
2419
  "dataRune": "recipe",
2424
2420
  "childOrder": [
2425
2421
  "meta",
2426
- "{content:content}"
2422
+ "{content}"
2427
2423
  ],
2428
2424
  "modifiers": {
2425
+ "layout": {
2426
+ "source": "meta",
2427
+ "default": "stacked",
2428
+ "classPattern": ".rf-recipe--{value}",
2429
+ "dataAttribute": "data-layout"
2430
+ },
2429
2431
  "prepTime": {
2430
2432
  "source": "meta",
2431
2433
  "classPattern": ".rf-recipe--{value}",
@@ -2446,6 +2448,25 @@
2446
2448
  "default": "medium",
2447
2449
  "classPattern": ".rf-recipe--{value}",
2448
2450
  "dataAttribute": "data-difficulty"
2451
+ },
2452
+ "ratio": {
2453
+ "source": "meta",
2454
+ "default": "1 1",
2455
+ "dataAttribute": "data-ratio"
2456
+ },
2457
+ "valign": {
2458
+ "source": "meta",
2459
+ "default": "top",
2460
+ "dataAttribute": "data-valign"
2461
+ },
2462
+ "gap": {
2463
+ "source": "meta",
2464
+ "default": "default",
2465
+ "dataAttribute": "data-gap"
2466
+ },
2467
+ "collapse": {
2468
+ "source": "meta",
2469
+ "dataAttribute": "data-collapse"
2449
2470
  }
2450
2471
  },
2451
2472
  "elements": {
@@ -2474,10 +2495,46 @@
2474
2495
  "parent": "meta",
2475
2496
  "condition": "difficulty"
2476
2497
  },
2477
- "content": {
2478
- "tag": "div",
2479
- "selector": ".rf-recipe__content",
2480
- "source": "contentWrapper"
2498
+ "header": {
2499
+ "tag": "header",
2500
+ "selector": ".rf-recipe__header",
2501
+ "source": "autoLabel"
2502
+ },
2503
+ "eyebrow": {
2504
+ "tag": "eyebrow",
2505
+ "selector": ".rf-recipe__eyebrow",
2506
+ "source": "autoLabel"
2507
+ },
2508
+ "headline": {
2509
+ "tag": "headline",
2510
+ "selector": ".rf-recipe__headline",
2511
+ "source": "autoLabel"
2512
+ },
2513
+ "blurb": {
2514
+ "tag": "blurb",
2515
+ "selector": ".rf-recipe__blurb",
2516
+ "source": "autoLabel"
2517
+ },
2518
+ "image": {
2519
+ "tag": "image",
2520
+ "selector": ".rf-recipe__image",
2521
+ "source": "autoLabel"
2522
+ },
2523
+ "media": {
2524
+ "tag": "media",
2525
+ "selector": ".rf-recipe__media",
2526
+ "source": "autoLabel"
2527
+ }
2528
+ },
2529
+ "inlineStyles": {
2530
+ "ratio": {
2531
+ "prop": "--split-ratio"
2532
+ },
2533
+ "valign": {
2534
+ "prop": "--split-valign"
2535
+ },
2536
+ "gap": {
2537
+ "prop": "--split-gap"
2481
2538
  }
2482
2539
  }
2483
2540
  },
package/html/index.ts ADDED
@@ -0,0 +1,28 @@
1
+ import type { HtmlTheme } from '@refrakt-md/html';
2
+ import manifest from '../manifest.json';
3
+ import { defaultLayout, docsLayout, blogArticleLayout } from '@refrakt-md/transform';
4
+
5
+ // Layout region metadata from the base theme manifest
6
+ const layoutRegions: Record<string, { regions: string[]; requiredRegions?: string[] }> = {
7
+ default: { regions: ['header', 'footer'] },
8
+ docs: { regions: ['header', 'nav', 'sidebar', 'footer'], requiredRegions: ['nav'] },
9
+ 'blog-article': { regions: ['header', 'sidebar', 'footer'] },
10
+ };
11
+
12
+ const layouts: Record<string, any> = {};
13
+ for (const [name, def] of Object.entries(manifest.layouts)) {
14
+ layouts[name] = { ...layoutRegions[name], ...def };
15
+ }
16
+
17
+ const mergedManifest = { ...manifest, layouts };
18
+
19
+ export { mergedManifest as manifest };
20
+
21
+ export const theme: HtmlTheme = {
22
+ manifest: mergedManifest as any,
23
+ layouts: {
24
+ default: defaultLayout,
25
+ docs: docsLayout,
26
+ 'blog-article': blogArticleLayout,
27
+ },
28
+ };
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 framework adapters",
4
- "version": "0.8.0",
4
+ "version": "0.8.2",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -28,6 +28,10 @@
28
28
  "svelte": "./svelte/index.ts",
29
29
  "default": "./svelte/index.ts"
30
30
  },
31
+ "./html": {
32
+ "types": "./html/index.ts",
33
+ "default": "./html/index.ts"
34
+ },
31
35
  "./styles/runes/*.css": "./styles/runes/*.css",
32
36
  "./svelte/tokens.css": "./svelte/tokens.css",
33
37
  "./svelte/manifest": "./svelte/manifest.json"
@@ -40,20 +44,22 @@
40
44
  "styles",
41
45
  "contracts",
42
46
  "manifest.json",
43
- "svelte"
47
+ "svelte",
48
+ "html"
44
49
  ],
45
50
  "scripts": {
46
51
  "build": "tsc"
47
52
  },
48
53
  "dependencies": {
49
- "@refrakt-md/runes": "0.8.0",
50
- "@refrakt-md/transform": "0.8.0",
51
- "@refrakt-md/types": "0.8.0",
52
- "@refrakt-md/svelte": "0.8.0"
54
+ "@refrakt-md/runes": "0.8.2",
55
+ "@refrakt-md/transform": "0.8.2",
56
+ "@refrakt-md/types": "0.8.2",
57
+ "@refrakt-md/svelte": "0.8.2"
53
58
  },
54
59
  "peerDependencies": {
55
60
  "svelte": "^5.0.0",
56
- "@sveltejs/kit": "^2.0.0"
61
+ "@sveltejs/kit": "^2.0.0",
62
+ "@refrakt-md/html": "0.8.2"
57
63
  },
58
64
  "devDependencies": {
59
65
  "postcss": "^8.4.0"
@@ -64,6 +70,9 @@
64
70
  },
65
71
  "@sveltejs/kit": {
66
72
  "optional": true
73
+ },
74
+ "@refrakt-md/html": {
75
+ "optional": true
67
76
  }
68
77
  }
69
78
  }
@@ -113,14 +113,20 @@
113
113
  );
114
114
  }
115
115
 
116
- /* Section spacing — vertical rhythm between block runes
117
- * Symmetric margins collapse between plain sections (no visual change)
118
- * but ensure correct gaps at plain→tinted boundaries (where tinted
119
- * sections use padding instead of margin). */
120
- .rf-page-content > article > * + * {
116
+ /* Section spacing — vertical rhythm around block runes.
117
+ * Rune blocks (elements with data-rune) get section-level margins.
118
+ * Prose elements (p, h2, pre, table, etc.) keep their natural flow
119
+ * spacing from global.css only gaining section margins when
120
+ * immediately adjacent to a rune block. */
121
+ .rf-page-content > article > * + [data-rune] {
121
122
  margin-top: var(--rf-spacing-section, 4rem);
122
123
  margin-bottom: var(--rf-spacing-section, 4rem);
123
124
  }
125
+ /* Prose after a rune block: section gap above only.
126
+ * No margin-bottom so subsequent prose keeps natural flow spacing. */
127
+ .rf-page-content > article > [data-rune] + :not([data-rune]) {
128
+ margin-top: var(--rf-spacing-section, 4rem);
129
+ }
124
130
  .rf-page-content > article > [data-spacing="flush"] {
125
131
  margin-top: 0;
126
132
  margin-bottom: 0;
@@ -200,7 +200,10 @@
200
200
  bottom: 0;
201
201
  transform: none;
202
202
  width: 100%;
203
+ height: 100vh;
204
+ height: 100dvh;
203
205
  max-height: 100vh;
206
+ max-height: 100dvh;
204
207
  border-radius: 0;
205
208
  border: none;
206
209
  }
@@ -57,7 +57,7 @@
57
57
  .rf-feature[data-align="right"] h2 {
58
58
  text-align: right;
59
59
  }
60
- .rf-feature dl {
60
+ .rf-feature__definitions {
61
61
  display: grid;
62
62
  grid-template-columns: repeat(auto-fit, minmax(max(240px, calc((100% - 3rem) / 3)), 1fr));
63
63
  gap: 1.5rem;
@@ -74,40 +74,40 @@
74
74
  .rf-feature[data-layout="split-reverse"] h2 {
75
75
  text-align: left;
76
76
  }
77
- .rf-feature[data-layout="split"] dl,
78
- .rf-feature[data-layout="split-reverse"] dl {
77
+ .rf-feature[data-layout="split"] .rf-feature__definitions,
78
+ .rf-feature[data-layout="split-reverse"] .rf-feature__definitions {
79
79
  display: block;
80
80
  }
81
- .rf-feature[data-layout="split"] .rf-feature-definition,
82
- .rf-feature[data-layout="split-reverse"] .rf-feature-definition {
81
+ .rf-feature[data-layout="split"] .rf-feature__feature-item,
82
+ .rf-feature[data-layout="split-reverse"] .rf-feature__feature-item {
83
83
  border: none;
84
84
  background: none;
85
85
  padding: 0.75rem 0;
86
86
  }
87
- .rf-feature-definition {
87
+ .rf-feature__feature-item {
88
88
  padding: 1.75rem;
89
89
  border-radius: var(--rf-radius-md);
90
90
  border: 1px solid var(--rf-color-border);
91
91
  background: var(--rf-color-bg);
92
92
  }
93
- .rf-feature-definition dt {
93
+ .rf-feature__feature-item dt {
94
94
  font-weight: 650;
95
95
  font-size: 1.125rem;
96
96
  margin-bottom: 0.75rem;
97
97
  letter-spacing: -0.01em;
98
98
  color: var(--rf-color-text);
99
99
  }
100
- .rf-feature-definition dt:has(> .rf-icon) {
100
+ .rf-feature__feature-item dt:has(> .rf-icon) {
101
101
  display: flex;
102
102
  flex-direction: column;
103
103
  }
104
- .rf-feature-definition dt > .rf-icon {
104
+ .rf-feature__feature-item dt > .rf-icon {
105
105
  width: 1.5rem;
106
106
  height: 1.5rem;
107
107
  margin-bottom: 0.5rem;
108
108
  color: var(--rf-color-accent);
109
109
  }
110
- .rf-feature-definition dd {
110
+ .rf-feature__feature-item dd {
111
111
  margin: 0;
112
112
  color: var(--rf-color-muted);
113
113
  font-size: 0.9rem;
@@ -118,7 +118,7 @@
118
118
  .rf-feature--in-hero {
119
119
  padding-top: 0;
120
120
  }
121
- .rf-feature--in-hero .rf-feature-definition {
121
+ .rf-feature--in-hero .rf-feature__feature-item {
122
122
  background: transparent;
123
123
  border-color: rgba(255, 255, 255, 0.15);
124
124
  }
@@ -5,6 +5,28 @@
5
5
  padding: 2rem;
6
6
  margin: 1.5rem 0;
7
7
  }
8
+ .rf-recipe__header {
9
+ margin-bottom: 1.5rem;
10
+ }
11
+ .rf-recipe .rf-recipe__eyebrow {
12
+ font-size: 0.875rem;
13
+ font-weight: 600;
14
+ letter-spacing: 0.05em;
15
+ text-transform: uppercase;
16
+ color: var(--rf-color-primary);
17
+ margin: 0 0 0.5rem;
18
+ }
19
+ .rf-recipe__headline {
20
+ margin-top: 0;
21
+ }
22
+ .rf-recipe .rf-recipe__blurb {
23
+ color: var(--rf-color-muted);
24
+ margin-bottom: 0;
25
+ max-width: 40rem;
26
+ }
27
+ .rf-recipe__image {
28
+ margin-bottom: 1rem;
29
+ }
8
30
  .rf-recipe__meta {
9
31
  display: flex;
10
32
  flex-wrap: wrap;
@@ -45,3 +67,18 @@
45
67
  .rf-recipe__content ol li {
46
68
  padding: 0.25rem 0;
47
69
  }
70
+ /* Media zone */
71
+ .rf-recipe__media {
72
+ border-radius: var(--rf-radius-lg);
73
+ }
74
+ .rf-recipe__media img {
75
+ display: block;
76
+ width: 100%;
77
+ height: auto;
78
+ border-radius: var(--rf-radius-lg);
79
+ }
80
+ /* Split layout: meta bar spans full width above the grid */
81
+ .rf-recipe[data-layout="split"] > .rf-recipe__meta,
82
+ .rf-recipe[data-layout="split-reverse"] > .rf-recipe__meta {
83
+ grid-column: 1 / -1;
84
+ }
@@ -42,13 +42,7 @@
42
42
  .rf-tabs__image {
43
43
  margin-bottom: 1rem;
44
44
  }
45
- .rf-tabs__tabs,
46
- .rf-tabs__panels {
47
- list-style: none;
48
- padding: 0;
49
- margin: 0;
50
- }
51
- .rf-tabs__bar {
45
+ .rf-tabs__tabs {
52
46
  display: flex;
53
47
  background: var(--rf-color-surface);
54
48
  border-bottom: 1px solid var(--rf-color-border);
@@ -56,7 +50,11 @@
56
50
  overflow-y: hidden;
57
51
  -webkit-overflow-scrolling: touch;
58
52
  }
59
- .rf-tabs__button {
53
+ .rf-tabs__panels {
54
+ padding: 0;
55
+ margin: 0;
56
+ }
57
+ .rf-tab {
60
58
  flex: 0 0 auto;
61
59
  padding: 0.625rem 1.25rem;
62
60
  font-size: 0.85rem;
@@ -71,11 +69,11 @@
71
69
  margin-bottom: -1px;
72
70
  font-family: inherit;
73
71
  }
74
- .rf-tabs__button:hover {
72
+ .rf-tab:hover {
75
73
  color: var(--rf-color-text);
76
74
  background: var(--rf-color-surface-hover);
77
75
  }
78
- .rf-tabs__button--active {
76
+ .rf-tab--active {
79
77
  color: var(--rf-color-primary);
80
78
  border-bottom-color: var(--rf-color-primary);
81
79
  font-weight: 600;