@refrakt-md/lumina 0.8.4 → 0.8.5

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.
@@ -209,6 +209,71 @@
209
209
  "{content}"
210
210
  ]
211
211
  },
212
+ "Blog": {
213
+ "block": "blog",
214
+ "root": ".rf-blog",
215
+ "dataRune": "blog",
216
+ "childOrder": [
217
+ "{content:content}"
218
+ ],
219
+ "modifiers": {
220
+ "layout": {
221
+ "source": "meta",
222
+ "default": "list",
223
+ "classPattern": ".rf-blog--{value}",
224
+ "dataAttribute": "data-layout"
225
+ },
226
+ "sort": {
227
+ "source": "meta",
228
+ "default": "date-desc",
229
+ "dataAttribute": "data-sort"
230
+ },
231
+ "filter": {
232
+ "source": "meta",
233
+ "dataAttribute": "data-filter"
234
+ },
235
+ "limit": {
236
+ "source": "meta",
237
+ "dataAttribute": "data-limit"
238
+ },
239
+ "folder": {
240
+ "source": "meta",
241
+ "dataAttribute": "data-folder"
242
+ }
243
+ },
244
+ "elements": {
245
+ "content": {
246
+ "tag": "div",
247
+ "selector": ".rf-blog__content",
248
+ "source": "contentWrapper"
249
+ },
250
+ "header": {
251
+ "tag": "header",
252
+ "selector": ".rf-blog__header",
253
+ "source": "autoLabel"
254
+ },
255
+ "eyebrow": {
256
+ "tag": "eyebrow",
257
+ "selector": ".rf-blog__eyebrow",
258
+ "source": "autoLabel"
259
+ },
260
+ "headline": {
261
+ "tag": "headline",
262
+ "selector": ".rf-blog__headline",
263
+ "source": "autoLabel"
264
+ },
265
+ "blurb": {
266
+ "tag": "blurb",
267
+ "selector": ".rf-blog__blurb",
268
+ "source": "autoLabel"
269
+ },
270
+ "image": {
271
+ "tag": "image",
272
+ "selector": ".rf-blog__image",
273
+ "source": "autoLabel"
274
+ }
275
+ }
276
+ },
212
277
  "Budget": {
213
278
  "block": "budget",
214
279
  "root": ".rf-budget",
@@ -885,6 +950,50 @@
885
950
  "{content}"
886
951
  ]
887
952
  },
953
+ "Juxtapose": {
954
+ "block": "juxtapose",
955
+ "root": ".rf-juxtapose",
956
+ "dataRune": "juxtapose",
957
+ "childOrder": [
958
+ "{content}"
959
+ ],
960
+ "modifiers": {
961
+ "variant": {
962
+ "source": "meta",
963
+ "default": "slider",
964
+ "classPattern": ".rf-juxtapose--{value}",
965
+ "dataAttribute": "data-variant"
966
+ },
967
+ "orientation": {
968
+ "source": "meta",
969
+ "default": "vertical",
970
+ "dataAttribute": "data-orientation"
971
+ },
972
+ "position": {
973
+ "source": "meta",
974
+ "default": "50",
975
+ "dataAttribute": "data-position"
976
+ },
977
+ "duration": {
978
+ "source": "meta",
979
+ "default": "1000",
980
+ "dataAttribute": "data-duration"
981
+ }
982
+ },
983
+ "inlineStyles": {
984
+ "position": "--jx-position",
985
+ "duration": "--jx-duration"
986
+ }
987
+ },
988
+ "JuxtaposePanel": {
989
+ "block": "juxtapose-panel",
990
+ "root": ".rf-juxtapose-panel",
991
+ "dataRune": "juxtapose-panel",
992
+ "parent": "Juxtapose",
993
+ "childOrder": [
994
+ "{content}"
995
+ ]
996
+ },
888
997
  "Diagram": {
889
998
  "block": "diagram",
890
999
  "root": ".rf-diagram",
@@ -893,6 +1002,33 @@
893
1002
  "{content}"
894
1003
  ]
895
1004
  },
1005
+ "Tint": {
1006
+ "block": "tint",
1007
+ "root": ".rf-tint",
1008
+ "dataRune": "tint",
1009
+ "parent": "*",
1010
+ "childOrder": [
1011
+ "{content}"
1012
+ ]
1013
+ },
1014
+ "Bg": {
1015
+ "block": "bg",
1016
+ "root": ".rf-bg",
1017
+ "dataRune": "bg",
1018
+ "parent": "*",
1019
+ "childOrder": [
1020
+ "{content}"
1021
+ ]
1022
+ },
1023
+ "Region": {
1024
+ "block": "region",
1025
+ "root": ".rf-region",
1026
+ "dataRune": "region",
1027
+ "parent": "Layout",
1028
+ "childOrder": [
1029
+ "{content}"
1030
+ ]
1031
+ },
896
1032
  "Sandbox": {
897
1033
  "block": "sandbox",
898
1034
  "root": ".rf-sandbox",
@@ -1220,6 +1356,15 @@
1220
1356
  }
1221
1357
  }
1222
1358
  },
1359
+ "Definition": {
1360
+ "block": "definition",
1361
+ "root": ".rf-definition",
1362
+ "dataRune": "definition",
1363
+ "parent": "Feature",
1364
+ "childOrder": [
1365
+ "{content}"
1366
+ ]
1367
+ },
1223
1368
  "Steps": {
1224
1369
  "block": "steps",
1225
1370
  "root": ".rf-steps",
package/index.css CHANGED
@@ -31,6 +31,7 @@
31
31
  @import './styles/runes/audio.css';
32
32
  @import './styles/runes/api.css';
33
33
  @import './styles/runes/bento.css';
34
+ @import './styles/runes/blog.css';
34
35
  @import './styles/runes/bond.css';
35
36
  @import './styles/runes/breadcrumb.css';
36
37
  @import './styles/runes/budget.css';
@@ -58,6 +59,7 @@
58
59
  @import './styles/runes/hero.css';
59
60
  @import './styles/runes/hint.css';
60
61
  @import './styles/runes/howto.css';
62
+ @import './styles/runes/juxtapose.css';
61
63
  @import './styles/runes/lore.css';
62
64
  @import './styles/runes/itinerary.css';
63
65
  @import './styles/runes/map.css';
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.4",
4
+ "version": "0.8.5",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -51,15 +51,15 @@
51
51
  "build": "tsc"
52
52
  },
53
53
  "dependencies": {
54
- "@refrakt-md/runes": "0.8.4",
55
- "@refrakt-md/transform": "0.8.4",
56
- "@refrakt-md/types": "0.8.4",
57
- "@refrakt-md/svelte": "0.8.4"
54
+ "@refrakt-md/runes": "0.8.5",
55
+ "@refrakt-md/transform": "0.8.5",
56
+ "@refrakt-md/types": "0.8.5",
57
+ "@refrakt-md/svelte": "0.8.5"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "svelte": "^5.0.0",
61
61
  "@sveltejs/kit": "^2.0.0",
62
- "@refrakt-md/html": "0.8.4"
62
+ "@refrakt-md/html": "0.8.5"
63
63
  },
64
64
  "devDependencies": {
65
65
  "postcss": "^8.4.0"
@@ -0,0 +1,98 @@
1
+ /* Blog — post listing with filtering and sorting */
2
+ .rf-blog {
3
+ padding: 2rem 0;
4
+ }
5
+ .rf-blog__header {
6
+ margin-bottom: 2rem;
7
+ }
8
+ .rf-blog__headline {
9
+ font-size: 2rem;
10
+ font-weight: 700;
11
+ letter-spacing: -0.02em;
12
+ margin: 0 0 0.5rem;
13
+ line-height: 1.2;
14
+ color: var(--rf-color-text);
15
+ }
16
+ .rf-blog__blurb {
17
+ font-size: 1.1rem;
18
+ color: var(--rf-color-muted);
19
+ margin: 0 0 1rem;
20
+ line-height: 1.6;
21
+ max-width: 640px;
22
+ }
23
+ .rf-blog__posts {
24
+ display: flex;
25
+ flex-direction: column;
26
+ gap: 1.5rem;
27
+ }
28
+ .rf-blog__post {
29
+ padding: 1.25rem 1.5rem;
30
+ border: 1px solid var(--rf-color-border);
31
+ border-radius: var(--rf-radius-md);
32
+ background: var(--rf-color-surface);
33
+ transition: border-color 200ms ease, box-shadow 200ms ease;
34
+ }
35
+ .rf-blog__post:hover {
36
+ border-color: var(--rf-color-primary);
37
+ box-shadow: var(--rf-shadow-sm);
38
+ }
39
+ .rf-blog__post h3 {
40
+ font-size: 1.25rem;
41
+ font-weight: 600;
42
+ margin: 0 0 0.375rem;
43
+ line-height: 1.3;
44
+ }
45
+ .rf-blog__post h3 a {
46
+ color: var(--rf-color-text);
47
+ text-decoration: none;
48
+ }
49
+ .rf-blog__post h3 a:hover {
50
+ color: var(--rf-color-primary);
51
+ }
52
+ .rf-blog__post time {
53
+ display: inline-block;
54
+ font-size: 0.85rem;
55
+ color: var(--rf-color-muted);
56
+ margin-bottom: 0.5rem;
57
+ }
58
+ .rf-blog__post p {
59
+ font-size: 0.95rem;
60
+ color: var(--rf-color-muted);
61
+ margin: 0;
62
+ line-height: 1.6;
63
+ }
64
+
65
+ /* Grid layout */
66
+ .rf-blog--grid .rf-blog__posts {
67
+ display: grid;
68
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
69
+ gap: 1.25rem;
70
+ }
71
+
72
+ /* Compact layout */
73
+ .rf-blog--compact .rf-blog__posts {
74
+ gap: 0;
75
+ }
76
+ .rf-blog--compact .rf-blog__post {
77
+ border-radius: 0;
78
+ border-bottom-width: 0;
79
+ padding: 1rem 1.25rem;
80
+ }
81
+ .rf-blog--compact .rf-blog__post:first-child {
82
+ border-radius: var(--rf-radius-md) var(--rf-radius-md) 0 0;
83
+ }
84
+ .rf-blog--compact .rf-blog__post:last-child {
85
+ border-radius: 0 0 var(--rf-radius-md) var(--rf-radius-md);
86
+ border-bottom-width: 1px;
87
+ }
88
+ .rf-blog--compact .rf-blog__post h3 {
89
+ font-size: 1.1rem;
90
+ margin-bottom: 0.125rem;
91
+ }
92
+ .rf-blog--compact .rf-blog__post p {
93
+ font-size: 0.875rem;
94
+ }
95
+ .rf-blog--compact .rf-blog__post time {
96
+ font-size: 0.8rem;
97
+ margin-bottom: 0.25rem;
98
+ }
@@ -0,0 +1,164 @@
1
+ /* Juxtapose — interactive comparison between two panels */
2
+
3
+ .rf-juxtapose {
4
+ margin: 1.5rem 0;
5
+ }
6
+
7
+ /* ─── Variant modifiers (for static/no-JS layout) ─── */
8
+ .rf-juxtapose--slider,
9
+ .rf-juxtapose--auto,
10
+ .rf-juxtapose--fade,
11
+ .rf-juxtapose--toggle {
12
+ /* shared base — no additional styling needed */
13
+ }
14
+
15
+ /* ─── Panels container ─── */
16
+ .rf-juxtapose__panels {
17
+ border-radius: var(--rf-radius-md);
18
+ overflow: hidden;
19
+ border: 1px solid var(--rf-color-border);
20
+ background: var(--rf-color-surface);
21
+ }
22
+
23
+ /* ─── Panel ─── */
24
+ .rf-juxtapose-panel {
25
+ position: relative;
26
+ overflow: hidden;
27
+ }
28
+ .rf-juxtapose-panel__name {
29
+ position: absolute;
30
+ bottom: 0.5rem;
31
+ padding: 0.25rem 0.75rem;
32
+ background: rgba(0, 0, 0, 0.6);
33
+ color: white;
34
+ font-size: 0.75rem;
35
+ font-weight: 600;
36
+ border-radius: var(--rf-radius-sm);
37
+ pointer-events: none;
38
+ }
39
+ /* First panel: label bottom-left */
40
+ .rf-juxtapose-panel:first-child .rf-juxtapose-panel__name {
41
+ left: 0.5rem;
42
+ }
43
+ /* Second panel: label bottom-right */
44
+ .rf-juxtapose-panel:last-child .rf-juxtapose-panel__name {
45
+ right: 0.5rem;
46
+ }
47
+ .rf-juxtapose-panel__body {
48
+ /* Content fills the panel */
49
+ }
50
+ .rf-juxtapose-panel__body img {
51
+ display: block;
52
+ width: 100%;
53
+ height: auto;
54
+ object-fit: cover;
55
+ }
56
+
57
+ /* Hide meta tags inside panels */
58
+ .rf-juxtapose-panel > meta { display: none; }
59
+
60
+ /* ─── Toggle variant: labels only on buttons, not in panels ─── */
61
+ .rf-juxtapose--toggle .rf-juxtapose-panel__name {
62
+ display: none;
63
+ }
64
+
65
+ /* ─── Slider divider (injected by behavior) ─── */
66
+ .rf-juxtapose__divider {
67
+ position: absolute;
68
+ z-index: 10;
69
+ cursor: col-resize;
70
+ touch-action: none;
71
+ }
72
+
73
+ /* Vertical orientation (left/right split) — default */
74
+ .rf-juxtapose:not([data-orientation="horizontal"]) .rf-juxtapose__divider {
75
+ top: 0;
76
+ bottom: 0;
77
+ width: 3px;
78
+ transform: translateX(-50%);
79
+ background: var(--rf-color-bg, #fff);
80
+ box-shadow: var(--rf-shadow-sm);
81
+ }
82
+
83
+ /* Horizontal orientation (top/bottom split) */
84
+ .rf-juxtapose[data-orientation="horizontal"] .rf-juxtapose__divider {
85
+ left: 0;
86
+ right: 0;
87
+ height: 3px;
88
+ transform: translateY(-50%);
89
+ background: var(--rf-color-bg, #fff);
90
+ box-shadow: var(--rf-shadow-sm);
91
+ cursor: row-resize;
92
+ }
93
+
94
+ .rf-juxtapose__divider-handle {
95
+ position: absolute;
96
+ top: 50%;
97
+ left: 50%;
98
+ transform: translate(-50%, -50%);
99
+ width: 2.5rem;
100
+ height: 2.5rem;
101
+ border-radius: var(--rf-radius-full);
102
+ background: var(--rf-color-bg, #fff);
103
+ border: 2px solid var(--rf-color-border);
104
+ box-shadow: var(--rf-shadow-md);
105
+ display: flex;
106
+ align-items: center;
107
+ justify-content: center;
108
+ }
109
+
110
+ .rf-juxtapose__divider-handle::before {
111
+ content: '\2194'; /* ↔ */
112
+ font-size: 1rem;
113
+ color: var(--rf-color-muted);
114
+ line-height: 1;
115
+ }
116
+
117
+ .rf-juxtapose[data-orientation="horizontal"] .rf-juxtapose__divider-handle::before {
118
+ content: '\2195'; /* ↕ */
119
+ }
120
+
121
+ .rf-juxtapose__divider:focus-visible {
122
+ outline: 2px solid var(--rf-color-primary);
123
+ outline-offset: 2px;
124
+ }
125
+
126
+ /* ─── Toggle bar (injected by behavior) ─── */
127
+ .rf-juxtapose__toggle-bar {
128
+ display: flex;
129
+ gap: 0.25rem;
130
+ padding: 0.25rem;
131
+ margin-bottom: 0.75rem;
132
+ background: var(--rf-color-surface);
133
+ border: 1px solid var(--rf-color-border);
134
+ border-radius: var(--rf-radius-md);
135
+ width: fit-content;
136
+ }
137
+
138
+ .rf-juxtapose__toggle-btn {
139
+ padding: 0.375rem 1rem;
140
+ border: none;
141
+ border-radius: var(--rf-radius-sm);
142
+ background: transparent;
143
+ color: var(--rf-color-muted);
144
+ font-size: 0.875rem;
145
+ font-weight: 500;
146
+ cursor: pointer;
147
+ transition: background 0.15s, color 0.15s;
148
+ }
149
+
150
+ .rf-juxtapose__toggle-btn:hover {
151
+ color: var(--rf-color-text);
152
+ }
153
+
154
+ .rf-juxtapose__toggle-btn--active {
155
+ background: var(--rf-color-bg, #fff);
156
+ color: var(--rf-color-text);
157
+ box-shadow: var(--rf-shadow-sm);
158
+ }
159
+
160
+ /* ─── Fade variant cursor hint ─── */
161
+ .rf-juxtapose--fade .rf-juxtapose__panels {
162
+ cursor: pointer;
163
+ }
164
+
@@ -4,9 +4,14 @@
4
4
  margin: 2rem 0;
5
5
  border-radius: var(--rf-radius-lg, 0.75rem);
6
6
  overflow: hidden;
7
- border: 1px solid var(--rf-color-border);
8
7
  }
9
8
 
9
+ /* Spacing variants */
10
+ .rf-map--spacing-flush { margin: 0; }
11
+ .rf-map--spacing-tight { margin: 0.5rem 0; }
12
+ .rf-map--spacing-loose { margin: 3rem 0; }
13
+ .rf-map--spacing-breathe { margin: 4rem 0; }
14
+
10
15
  /* Height variants */
11
16
  .rf-map--small .rf-map__container { height: 200px; }
12
17
  .rf-map--medium .rf-map__container { height: 400px; }