@refrakt-md/lumina 0.7.2 → 0.8.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.
Files changed (40) hide show
  1. package/base.css +4 -0
  2. package/contracts/structures.json +405 -98
  3. package/dist/config.d.ts +1 -1
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +75 -1
  6. package/dist/config.js.map +1 -1
  7. package/html/index.ts +28 -0
  8. package/index.css +11 -0
  9. package/package.json +16 -7
  10. package/styles/base/attributes.css +20 -0
  11. package/styles/global.css +2 -2
  12. package/styles/layouts/default.css +131 -5
  13. package/styles/layouts/split.css +34 -0
  14. package/styles/runes/annotate.css +2 -2
  15. package/styles/runes/audio.css +199 -0
  16. package/styles/runes/bento.css +45 -4
  17. package/styles/runes/bg.css +53 -0
  18. package/styles/runes/budget.css +2 -2
  19. package/styles/runes/cast.css +1 -1
  20. package/styles/runes/codegroup.css +9 -0
  21. package/styles/runes/comparison.css +2 -2
  22. package/styles/runes/conversation.css +4 -4
  23. package/styles/runes/cta.css +10 -2
  24. package/styles/runes/feature.css +34 -26
  25. package/styles/runes/gallery.css +182 -0
  26. package/styles/runes/grid.css +39 -5
  27. package/styles/runes/hero.css +30 -12
  28. package/styles/runes/itinerary.css +2 -0
  29. package/styles/runes/mockup.css +52 -16
  30. package/styles/runes/page-section.css +1 -0
  31. package/styles/runes/playlist.css +88 -0
  32. package/styles/runes/preview.css +3 -4
  33. package/styles/runes/reveal.css +2 -2
  34. package/styles/runes/showcase.css +94 -0
  35. package/styles/runes/steps.css +2 -10
  36. package/styles/runes/storyboard.css +2 -2
  37. package/styles/runes/tabs.css +8 -10
  38. package/styles/runes/tint.css +203 -0
  39. package/styles/runes/track.css +118 -0
  40. package/tokens/base.css +21 -1
@@ -50,6 +50,9 @@
50
50
  background: var(--rf-color-surface);
51
51
  overflow: hidden;
52
52
  }
53
+ .rf-bento-cell--full {
54
+ grid-column: 1 / -1;
55
+ }
53
56
  .rf-bento-cell--large {
54
57
  grid-column: span 2;
55
58
  grid-row: span 2;
@@ -60,13 +63,31 @@
60
63
  .rf-bento-cell--small {
61
64
  grid-column: span 1;
62
65
  }
66
+ /* Span mode: heading level determines column span via CSS variable */
67
+ .rf-bento-cell--span {
68
+ grid-column: span var(--cell-span, 1);
69
+ }
70
+ .rf-bento-cell__icon {
71
+ margin-bottom: 0.75rem;
72
+ line-height: 0;
73
+ }
74
+ .rf-bento-cell__icon svg {
75
+ width: 1.5rem;
76
+ height: 1.5rem;
77
+ color: var(--rf-color-accent);
78
+ }
79
+ .rf-bento-cell__icon .rf-icon {
80
+ width: 1.5rem;
81
+ height: 1.5rem;
82
+ color: var(--rf-color-accent);
83
+ }
63
84
  .rf-bento-cell__title {
64
- font-size: 1rem;
85
+ font-size: 1.125rem;
65
86
  font-weight: 600;
66
87
  margin: 0 0 0.5rem;
67
88
  }
68
- .rf-bento-cell__body span[property],
69
- .rf-bento-cell__body meta { display: none; }
89
+ .rf-bento-cell__body > span[property],
90
+ .rf-bento-cell__body > meta { display: none; }
70
91
  .rf-bento-cell__body p:last-child { margin-bottom: 0; }
71
92
  .rf-bento-cell img {
72
93
  width: 100%;
@@ -74,13 +95,33 @@
74
95
  border-radius: var(--rf-radius-sm);
75
96
  margin-bottom: 0.75rem;
76
97
  }
98
+ /* Remove padding on bleed edges when showcase bleeds inside a cell */
99
+ .rf-bento-cell:has(.rf-showcase[data-bleed="bottom"]),
100
+ .rf-bento-cell:has(.rf-showcase[data-bleed="both"]),
101
+ .rf-bento-cell:has(.rf-showcase[data-bleed="bottom-end"]) {
102
+ padding-bottom: 0;
103
+ }
104
+ .rf-bento-cell:has(.rf-showcase[data-bleed="end"]),
105
+ .rf-bento-cell:has(.rf-showcase[data-bleed="bottom-end"]),
106
+ .rf-bento-cell:has(.rf-showcase[data-bleed="top-end"]) {
107
+ padding-inline-end: 0;
108
+ }
109
+ .rf-bento-cell:has(.rf-showcase[data-bleed="top"]),
110
+ .rf-bento-cell:has(.rf-showcase[data-bleed="both"]),
111
+ .rf-bento-cell:has(.rf-showcase[data-bleed="top-end"]) {
112
+ padding-top: 0;
113
+ }
77
114
  @media (max-width: 768px) {
78
115
  .rf-bento__grid { grid-template-columns: repeat(2, 1fr) !important; }
116
+ .rf-bento-cell--full { grid-column: 1 / -1; }
79
117
  .rf-bento-cell--large { grid-column: span 2; grid-row: span 1; }
80
118
  .rf-bento-cell--medium { grid-column: span 2; }
119
+ .rf-bento-cell--span { grid-column: span min(var(--cell-span, 1), 2); }
81
120
  }
82
121
  @media (max-width: 480px) {
83
122
  .rf-bento__grid { grid-template-columns: 1fr !important; }
123
+ .rf-bento-cell--full,
84
124
  .rf-bento-cell--large,
85
- .rf-bento-cell--medium { grid-column: span 1; }
125
+ .rf-bento-cell--medium,
126
+ .rf-bento-cell--span { grid-column: span 1; }
86
127
  }
@@ -0,0 +1,53 @@
1
+ /* Background — Directive rune for background images, video, overlays, blur */
2
+
3
+ /* Background layer — absolute positioned behind content */
4
+ [data-name="bg"] {
5
+ position: absolute;
6
+ inset: 0;
7
+ z-index: 0;
8
+ overflow: hidden;
9
+ background-image: var(--bg-image);
10
+ background-size: var(--bg-fit, cover);
11
+ background-position: var(--bg-position, center);
12
+ background-repeat: no-repeat;
13
+ }
14
+ /* Blur and opacity applied when set via custom properties */
15
+ [data-name="bg"][style*="--bg-blur"] {
16
+ filter: blur(var(--bg-blur));
17
+ }
18
+ [data-name="bg"][style*="--bg-opacity"] {
19
+ opacity: var(--bg-opacity);
20
+ }
21
+ /* Fixed (parallax) background */
22
+ [data-name="bg"][data-bg-fixed] {
23
+ background-attachment: fixed;
24
+ }
25
+ /* Content above background — any sibling of bg layer gets z-index */
26
+ .rf-has-bg > :not([data-name="bg"]) {
27
+ position: relative;
28
+ z-index: 1;
29
+ }
30
+ /* Video background */
31
+ [data-name="bg-video"] {
32
+ width: 100%;
33
+ height: 100%;
34
+ object-fit: cover;
35
+ object-position: var(--bg-position, center);
36
+ }
37
+ [data-name="bg-video"][style*="--bg-blur"] {
38
+ filter: blur(var(--bg-blur));
39
+ }
40
+ [data-name="bg-video"][style*="--bg-opacity"] {
41
+ opacity: var(--bg-opacity);
42
+ }
43
+ /* Overlay */
44
+ [data-name="bg-overlay"] {
45
+ position: absolute;
46
+ inset: 0;
47
+ }
48
+ [data-name="bg-overlay"][data-bg-overlay="dark"] {
49
+ background: rgba(0, 0, 0, 0.5);
50
+ }
51
+ [data-name="bg-overlay"][data-bg-overlay="light"] {
52
+ background: rgba(255, 255, 255, 0.6);
53
+ }
@@ -154,10 +154,10 @@
154
154
  }
155
155
 
156
156
  /* Summary style — hide line items, show only category headers */
157
- [data-style="summary"] .rf-budget-category__line-items {
157
+ [data-variant="summary"] .rf-budget-category__line-items {
158
158
  display: none;
159
159
  }
160
- [data-style="summary"] .rf-budget-category__header {
160
+ [data-variant="summary"] .rf-budget-category__header {
161
161
  margin-bottom: 0;
162
162
  padding-bottom: 0;
163
163
  border-bottom: none;
@@ -45,7 +45,7 @@
45
45
  color: var(--rf-color-muted);
46
46
  }
47
47
  .rf-cast-member__body:empty { display: none; }
48
- .rf-cast-member__body span[property] { display: none; }
48
+ .rf-cast-member__body > span[property] { display: none; }
49
49
  .rf-cast-member img {
50
50
  width: 80px;
51
51
  height: 80px;
@@ -75,3 +75,12 @@
75
75
  font-family: var(--rf-font-mono);
76
76
  font-size: 0.85rem;
77
77
  }
78
+ /* Overflow modes */
79
+ .rf-codegroup[data-overflow="wrap"] pre {
80
+ white-space: pre-wrap;
81
+ word-break: break-word;
82
+ overflow-x: hidden;
83
+ }
84
+ .rf-codegroup[data-overflow="hide"] pre {
85
+ overflow-x: hidden;
86
+ }
@@ -16,8 +16,8 @@
16
16
  font-weight: 700;
17
17
  color: var(--rf-color-text);
18
18
  }
19
- .rf-comparison meta,
20
- .rf-comparison span[property] { display: none; }
19
+ .rf-comparison > meta,
20
+ .rf-comparison > span[property] { display: none; }
21
21
  /* Table layout */
22
22
  .rf-comparison__table-wrapper {
23
23
  overflow-x: auto;
@@ -48,7 +48,7 @@
48
48
  }
49
49
  .rf-conversation-message__body p { margin: 0; }
50
50
  .rf-conversation-message__body p + p { margin-top: 0.5rem; }
51
- .rf-conversation-message__body span[property],
52
- .rf-conversation-message__body meta { display: none; }
53
- .rf-conversation-message span[property="speaker"],
54
- .rf-conversation-message meta[property] { display: none; }
51
+ .rf-conversation-message__body > span[property],
52
+ .rf-conversation-message__body > meta { display: none; }
53
+ .rf-conversation-message > span[property="speaker"],
54
+ .rf-conversation-message > meta[property] { display: none; }
@@ -1,8 +1,12 @@
1
1
  /* Call to Action */
2
2
  .rf-cta {
3
- text-align: center;
4
3
  padding: 3.5rem 2rem 3rem;
5
4
  }
5
+ .rf-cta .rf-cta__header,
6
+ .rf-cta > h1, .rf-cta > h2, .rf-cta > h3,
7
+ .rf-cta > p {
8
+ text-align: center;
9
+ }
6
10
  .rf-cta__header {
7
11
  margin-bottom: 1.5rem;
8
12
  }
@@ -124,9 +128,13 @@
124
128
 
125
129
  /* Context-aware: CTA inside pricing — compact, left-aligned */
126
130
  .rf-cta--in-pricing {
127
- text-align: left;
128
131
  padding: 1.5rem 0 0;
129
132
  }
133
+ .rf-cta--in-pricing .rf-cta__header,
134
+ .rf-cta--in-pricing > h1, .rf-cta--in-pricing > h2, .rf-cta--in-pricing > h3,
135
+ .rf-cta--in-pricing > p {
136
+ text-align: left;
137
+ }
130
138
  .rf-cta--in-pricing p {
131
139
  margin: 0 0 1rem;
132
140
  max-width: none;
@@ -4,7 +4,6 @@
4
4
  }
5
5
  .rf-feature__header {
6
6
  margin-bottom: 1.5rem;
7
- text-align: center;
8
7
  }
9
8
  .rf-feature__eyebrow {
10
9
  font-size: 0.8125rem;
@@ -35,71 +34,80 @@
35
34
  .rf-feature__blurb {
36
35
  color: var(--rf-color-muted);
37
36
  margin-bottom: 0;
37
+ max-width: 40rem;
38
38
  }
39
39
  .rf-feature__image {
40
40
  margin-bottom: 1rem;
41
41
  }
42
- .rf-feature__body {
42
+ .rf-feature__content {
43
43
  display: contents;
44
44
  }
45
45
  .rf-feature h2 {
46
- text-align: center;
47
46
  margin-bottom: 2rem;
48
47
  }
49
- .rf-feature dl {
48
+ .rf-feature[data-align="center"] .rf-feature__header,
49
+ .rf-feature[data-align="center"] h2 {
50
+ text-align: center;
51
+ }
52
+ .rf-feature[data-align="left"] .rf-feature__header,
53
+ .rf-feature[data-align="left"] h2 {
54
+ text-align: left;
55
+ }
56
+ .rf-feature[data-align="right"] .rf-feature__header,
57
+ .rf-feature[data-align="right"] h2 {
58
+ text-align: right;
59
+ }
60
+ .rf-feature__definitions {
50
61
  display: grid;
51
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
62
+ grid-template-columns: repeat(auto-fit, minmax(max(240px, calc((100% - 3rem) / 3)), 1fr));
52
63
  gap: 1.5rem;
53
64
  margin: 0;
54
65
  }
55
- .rf-feature--split {
56
- display: grid;
57
- align-items: center;
58
- grid-template-columns: 1fr 1fr;
59
- gap: 3rem;
60
- }
61
- .rf-feature--split .rf-feature__body {
66
+ /* Split layout: override defaults when in split mode */
67
+ .rf-feature[data-layout="split"] .rf-feature__content,
68
+ .rf-feature[data-layout="split-reverse"] .rf-feature__content {
62
69
  display: block;
63
70
  }
64
- .rf-feature--split .rf-feature__header,
65
- .rf-feature--split h2 {
71
+ .rf-feature[data-layout="split"] .rf-feature__header,
72
+ .rf-feature[data-layout="split-reverse"] .rf-feature__header,
73
+ .rf-feature[data-layout="split"] h2,
74
+ .rf-feature[data-layout="split-reverse"] h2 {
66
75
  text-align: left;
67
76
  }
68
- .rf-feature--split dl {
77
+ .rf-feature[data-layout="split"] .rf-feature__definitions,
78
+ .rf-feature[data-layout="split-reverse"] .rf-feature__definitions {
69
79
  display: block;
70
80
  }
71
- .rf-feature--split .rf-feature-definition {
81
+ .rf-feature[data-layout="split"] .rf-feature__feature-item,
82
+ .rf-feature[data-layout="split-reverse"] .rf-feature__feature-item {
72
83
  border: none;
73
84
  background: none;
74
85
  padding: 0.75rem 0;
75
86
  }
76
- .rf-feature--mirror .rf-feature__showcase {
77
- order: -1;
78
- }
79
- .rf-feature-definition {
87
+ .rf-feature__feature-item {
80
88
  padding: 1.75rem;
81
89
  border-radius: var(--rf-radius-md);
82
90
  border: 1px solid var(--rf-color-border);
83
91
  background: var(--rf-color-bg);
84
92
  }
85
- .rf-feature-definition dt {
93
+ .rf-feature__feature-item dt {
86
94
  font-weight: 650;
87
- font-size: 1.05rem;
95
+ font-size: 1.125rem;
88
96
  margin-bottom: 0.75rem;
89
97
  letter-spacing: -0.01em;
90
98
  color: var(--rf-color-text);
91
99
  }
92
- .rf-feature-definition dt:has(> .rf-icon) {
100
+ .rf-feature__feature-item dt:has(> .rf-icon) {
93
101
  display: flex;
94
102
  flex-direction: column;
95
103
  }
96
- .rf-feature-definition dt > .rf-icon {
104
+ .rf-feature__feature-item dt > .rf-icon {
97
105
  width: 1.5rem;
98
106
  height: 1.5rem;
99
107
  margin-bottom: 0.5rem;
100
108
  color: var(--rf-color-accent);
101
109
  }
102
- .rf-feature-definition dd {
110
+ .rf-feature__feature-item dd {
103
111
  margin: 0;
104
112
  color: var(--rf-color-muted);
105
113
  font-size: 0.9rem;
@@ -110,7 +118,7 @@
110
118
  .rf-feature--in-hero {
111
119
  padding-top: 0;
112
120
  }
113
- .rf-feature--in-hero .rf-feature-definition {
121
+ .rf-feature--in-hero .rf-feature__feature-item {
114
122
  background: transparent;
115
123
  border-color: rgba(255, 255, 255, 0.15);
116
124
  }
@@ -0,0 +1,182 @@
1
+ /* Gallery — Multi-image container with grid/carousel/masonry layout */
2
+ .rf-gallery {
3
+ margin: 1.5rem 0;
4
+ position: relative;
5
+ }
6
+
7
+ /* Layout modifier classes */
8
+ .rf-gallery--grid {}
9
+ .rf-gallery--carousel {}
10
+ .rf-gallery--masonry {}
11
+
12
+ /* Items container — grid layout by default */
13
+ .rf-gallery__items {
14
+ display: grid;
15
+ grid-template-columns: repeat(var(--gallery-columns, 3), 1fr);
16
+ gap: var(--gallery-gap, var(--rf-spacing-md));
17
+ }
18
+
19
+ /* Individual gallery items */
20
+ .rf-gallery__item {
21
+ position: relative;
22
+ overflow: hidden;
23
+ border-radius: var(--rf-radius-md);
24
+ }
25
+ .rf-gallery__item img {
26
+ width: 100%;
27
+ height: 100%;
28
+ object-fit: cover;
29
+ display: block;
30
+ }
31
+ .rf-gallery__item figcaption {
32
+ position: absolute;
33
+ bottom: 0;
34
+ left: 0;
35
+ right: 0;
36
+ padding: 0.5rem 0.75rem;
37
+ background: linear-gradient(transparent, rgba(0, 0, 0, 0.6));
38
+ color: white;
39
+ font-size: 0.825rem;
40
+ }
41
+
42
+ /* Gallery caption */
43
+ .rf-gallery > figcaption {
44
+ margin-top: 0.625rem;
45
+ font-size: 0.825rem;
46
+ color: var(--rf-color-muted);
47
+ text-align: center;
48
+ font-style: italic;
49
+ }
50
+
51
+ /* Carousel layout */
52
+ .rf-gallery[data-layout="carousel"] .rf-gallery__items {
53
+ display: flex;
54
+ overflow-x: auto;
55
+ scroll-snap-type: x mandatory;
56
+ -webkit-overflow-scrolling: touch;
57
+ }
58
+ .rf-gallery[data-layout="carousel"] .rf-gallery__item {
59
+ flex: 0 0 calc(100% / var(--gallery-columns, 3));
60
+ scroll-snap-align: start;
61
+ }
62
+
63
+ /* Carousel nav buttons */
64
+ .rf-gallery__nav {
65
+ position: absolute;
66
+ top: 50%;
67
+ transform: translateY(-50%);
68
+ z-index: 2;
69
+ width: 2.5rem;
70
+ height: 2.5rem;
71
+ border-radius: 50%;
72
+ border: none;
73
+ background: var(--rf-color-surface);
74
+ color: var(--rf-color-text);
75
+ box-shadow: var(--rf-shadow-md);
76
+ cursor: pointer;
77
+ display: flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ font-size: 1.25rem;
81
+ opacity: 0.8;
82
+ transition: opacity 0.2s;
83
+ }
84
+ .rf-gallery__nav:hover {
85
+ opacity: 1;
86
+ }
87
+ .rf-gallery__nav--prev {
88
+ left: 0.5rem;
89
+ }
90
+ .rf-gallery__nav--next {
91
+ right: 0.5rem;
92
+ }
93
+
94
+ /* Masonry layout (CSS progressive enhancement) */
95
+ .rf-gallery[data-layout="masonry"] .rf-gallery__items {
96
+ grid-template-rows: masonry;
97
+ }
98
+
99
+ /* Lightbox cursor hint */
100
+ .rf-gallery[data-lightbox="true"] .rf-gallery__item {
101
+ cursor: zoom-in;
102
+ }
103
+
104
+ /* Lightbox overlay */
105
+ .rf-gallery__lightbox {
106
+ position: fixed;
107
+ inset: 0;
108
+ z-index: 9999;
109
+ background: rgba(0, 0, 0, 0.9);
110
+ display: flex;
111
+ align-items: center;
112
+ justify-content: center;
113
+ }
114
+ .rf-gallery__lightbox img {
115
+ max-width: 90vw;
116
+ max-height: 90vh;
117
+ object-fit: contain;
118
+ border-radius: var(--rf-radius-md);
119
+ }
120
+ .rf-gallery__lightbox-close {
121
+ position: absolute;
122
+ top: 1rem;
123
+ right: 1rem;
124
+ width: 2.5rem;
125
+ height: 2.5rem;
126
+ border-radius: 50%;
127
+ border: none;
128
+ background: rgba(255, 255, 255, 0.15);
129
+ color: white;
130
+ font-size: 1.5rem;
131
+ cursor: pointer;
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ }
136
+ .rf-gallery__lightbox-nav {
137
+ position: absolute;
138
+ top: 50%;
139
+ transform: translateY(-50%);
140
+ width: 3rem;
141
+ height: 3rem;
142
+ border-radius: 50%;
143
+ border: none;
144
+ background: rgba(255, 255, 255, 0.15);
145
+ color: white;
146
+ font-size: 1.5rem;
147
+ cursor: pointer;
148
+ display: flex;
149
+ align-items: center;
150
+ justify-content: center;
151
+ }
152
+ .rf-gallery__lightbox-nav--prev {
153
+ left: 1rem;
154
+ }
155
+ .rf-gallery__lightbox-nav--next {
156
+ right: 1rem;
157
+ }
158
+
159
+ /* Column count overrides */
160
+ .rf-gallery[data-columns="1"] .rf-gallery__items { grid-template-columns: 1fr; }
161
+ .rf-gallery[data-columns="2"] .rf-gallery__items { grid-template-columns: repeat(2, 1fr); }
162
+ .rf-gallery[data-columns="4"] .rf-gallery__items { grid-template-columns: repeat(4, 1fr); }
163
+ .rf-gallery[data-columns="5"] .rf-gallery__items { grid-template-columns: repeat(5, 1fr); }
164
+ .rf-gallery[data-columns="6"] .rf-gallery__items { grid-template-columns: repeat(6, 1fr); }
165
+
166
+ /* Responsive: collapse to fewer columns on small screens */
167
+ @media (max-width: 768px) {
168
+ .rf-gallery__items {
169
+ grid-template-columns: repeat(2, 1fr);
170
+ }
171
+ .rf-gallery[data-layout="carousel"] .rf-gallery__item {
172
+ flex-basis: 80%;
173
+ }
174
+ }
175
+ @media (max-width: 480px) {
176
+ .rf-gallery__items {
177
+ grid-template-columns: 1fr;
178
+ }
179
+ .rf-gallery[data-layout="carousel"] .rf-gallery__item {
180
+ flex-basis: 100%;
181
+ }
182
+ }
@@ -4,8 +4,9 @@
4
4
  }
5
5
  .rf-grid [data-layout="grid"] {
6
6
  display: grid;
7
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
8
- gap: 1.5rem;
7
+ grid-template-columns: var(--grid-ratio, repeat(auto-fit, minmax(250px, 1fr)));
8
+ align-items: var(--grid-valign, stretch);
9
+ gap: var(--grid-gap, 1.5rem);
9
10
  }
10
11
  /* Explicit column counts override auto-fit */
11
12
  .rf-grid [data-columns="1"] { grid-template-columns: 1fr; }
@@ -26,6 +27,39 @@
26
27
  .rf-grid [data-rowspan="2"] { grid-row: span 2; }
27
28
  .rf-grid [data-rowspan="3"] { grid-row: span 3; }
28
29
  .rf-grid [data-rowspan="4"] { grid-row: span 4; }
29
- /* Item styling */
30
- .rf-grid [data-name="item"] p:first-child { margin-top: 0; }
31
- .rf-grid [data-name="item"] p:last-child { margin-bottom: 0; }
30
+ /* Cell styling */
31
+ .rf-grid [data-name="cell"] p:first-child { margin-top: 0; }
32
+ .rf-grid [data-name="cell"] p:last-child { margin-bottom: 0; }
33
+ /* Auto mode — responsive auto-fill */
34
+ .rf-grid[data-mode="auto"] [data-layout="grid"] {
35
+ grid-template-columns: repeat(auto-fill, minmax(var(--grid-min, 250px), 1fr));
36
+ }
37
+ /* Masonry mode — progressive enhancement */
38
+ .rf-grid[data-mode="masonry"] [data-layout="grid"] {
39
+ grid-template-rows: masonry;
40
+ }
41
+ /* Aspect ratio enforcement on cells */
42
+ .rf-grid[data-aspect] [data-name="cell"] {
43
+ aspect-ratio: var(--grid-aspect);
44
+ overflow: hidden;
45
+ }
46
+ .rf-grid[data-aspect] [data-name="cell"] > img,
47
+ .rf-grid[data-aspect] [data-name="cell"] > video {
48
+ width: 100%;
49
+ height: 100%;
50
+ object-fit: cover;
51
+ }
52
+ /* Stack order when collapsed */
53
+ .rf-grid[data-stack="reverse"] [data-name="cell"]:last-child {
54
+ order: -1;
55
+ }
56
+ /* Collapse breakpoints */
57
+ @media (max-width: 640px) {
58
+ .rf-grid[data-collapse="sm"] [data-layout="grid"] { grid-template-columns: 1fr; }
59
+ }
60
+ @media (max-width: 768px) {
61
+ .rf-grid[data-collapse="md"] [data-layout="grid"] { grid-template-columns: 1fr; }
62
+ }
63
+ @media (max-width: 1024px) {
64
+ .rf-grid[data-collapse="lg"] [data-layout="grid"] { grid-template-columns: 1fr; }
65
+ }
@@ -1,10 +1,9 @@
1
1
  /* Hero */
2
2
  .rf-hero {
3
3
  position: relative;
4
- padding: 5rem 2rem 4.5rem;
4
+ padding: 7rem 2rem 6.5rem;
5
5
  background-size: cover;
6
6
  background-position: center;
7
- overflow: hidden;
8
7
  }
9
8
  .rf-hero__header {
10
9
  margin-bottom: 2rem;
@@ -57,23 +56,29 @@
57
56
  gap: 0.75rem;
58
57
  flex-wrap: wrap;
59
58
  }
60
- .rf-hero--center {
59
+ .rf-hero[data-align="center"] .rf-hero__header,
60
+ .rf-hero[data-align="center"] > h1,
61
+ .rf-hero[data-align="center"] > p {
61
62
  text-align: center;
62
63
  }
63
- .rf-hero--center .rf-hero__actions {
64
+ .rf-hero[data-align="center"] .rf-hero__actions {
64
65
  margin: 0 auto;
65
66
  justify-content: center;
66
67
  }
67
- .rf-hero--left {
68
+ .rf-hero[data-align="left"] .rf-hero__header,
69
+ .rf-hero[data-align="left"] > h1,
70
+ .rf-hero[data-align="left"] > p {
68
71
  text-align: left;
69
72
  }
70
- .rf-hero--left .rf-hero__actions {
73
+ .rf-hero[data-align="left"] .rf-hero__actions {
71
74
  margin: 0;
72
75
  }
73
- .rf-hero--right {
76
+ .rf-hero[data-align="right"] .rf-hero__header,
77
+ .rf-hero[data-align="right"] > h1,
78
+ .rf-hero[data-align="right"] > p {
74
79
  text-align: right;
75
80
  }
76
- .rf-hero--right .rf-hero__actions {
81
+ .rf-hero[data-align="right"] .rf-hero__actions {
77
82
  margin: 0 0 0 auto;
78
83
  }
79
84
  .rf-hero__actions pre {
@@ -105,9 +110,10 @@
105
110
  line-height: 1.65;
106
111
  color: var(--rf-color-muted);
107
112
  margin: 0 0 2rem;
113
+ max-width: 40rem;
108
114
  }
109
- .rf-hero--center p,
110
- .rf-hero--center .rf-hero__blurb {
115
+ .rf-hero[data-align="center"] > p,
116
+ .rf-hero[data-align="center"] .rf-hero__blurb {
111
117
  max-width: 560px;
112
118
  margin-left: auto;
113
119
  margin-right: auto;
@@ -122,8 +128,8 @@
122
128
  padding: 0;
123
129
  margin: 0;
124
130
  }
125
- .rf-hero--center ul,
126
- .rf-hero--center nav {
131
+ .rf-hero[data-align="center"] ul,
132
+ .rf-hero[data-align="center"] nav {
127
133
  justify-content: center;
128
134
  }
129
135
  .rf-hero li {
@@ -162,3 +168,15 @@
162
168
  border-color: var(--rf-color-surface-active);
163
169
  text-decoration: none;
164
170
  }
171
+ .rf-hero__media {
172
+ margin-top: 3rem;
173
+ border-radius: var(--rf-radius-lg);
174
+ }
175
+ .rf-hero__media img {
176
+ display: block;
177
+ width: 100%;
178
+ height: auto;
179
+ }
180
+ .rf-hero__media pre {
181
+ margin: 0;
182
+ }
@@ -1,6 +1,8 @@
1
1
  /* Itinerary */
2
2
  .rf-itinerary {
3
3
  margin: 2rem 0;
4
+ padding-left: 0.75rem;
5
+ padding-right: 0.75rem;
4
6
  }
5
7
  .rf-itinerary > header {
6
8
  margin-bottom: 1.5rem;