@refrakt-md/lumina 0.7.1 → 0.8.0

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/contracts/structures.json +670 -94
  2. package/dist/config.d.ts +1 -1
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +75 -1
  5. package/dist/config.js.map +1 -1
  6. package/index.css +12 -0
  7. package/package.json +5 -5
  8. package/styles/base/attributes.css +20 -0
  9. package/styles/global.css +2 -2
  10. package/styles/layouts/default.css +131 -5
  11. package/styles/layouts/split.css +34 -0
  12. package/styles/runes/accordion.css +36 -0
  13. package/styles/runes/annotate.css +2 -2
  14. package/styles/runes/audio.css +199 -0
  15. package/styles/runes/bento.css +81 -4
  16. package/styles/runes/bg.css +53 -0
  17. package/styles/runes/budget.css +2 -2
  18. package/styles/runes/cast.css +1 -1
  19. package/styles/runes/codegroup.css +9 -0
  20. package/styles/runes/comparison.css +2 -2
  21. package/styles/runes/conversation.css +4 -4
  22. package/styles/runes/cta.css +58 -4
  23. package/styles/runes/feature.css +63 -17
  24. package/styles/runes/gallery.css +182 -0
  25. package/styles/runes/grid.css +39 -5
  26. package/styles/runes/hero.css +78 -13
  27. package/styles/runes/itinerary.css +2 -0
  28. package/styles/runes/mockup.css +539 -0
  29. package/styles/runes/page-section.css +1 -0
  30. package/styles/runes/playlist.css +88 -0
  31. package/styles/runes/preview.css +3 -4
  32. package/styles/runes/pricing.css +34 -2
  33. package/styles/runes/reveal.css +38 -2
  34. package/styles/runes/showcase.css +94 -0
  35. package/styles/runes/steps.css +38 -10
  36. package/styles/runes/storyboard.css +2 -2
  37. package/styles/runes/tabs.css +36 -0
  38. package/styles/runes/tint.css +203 -0
  39. package/styles/runes/track.css +118 -0
  40. package/tokens/base.css +21 -1
@@ -2,6 +2,42 @@
2
2
  .rf-bento {
3
3
  margin: 1.5rem 0;
4
4
  }
5
+ .rf-bento__header {
6
+ margin-bottom: 1.5rem;
7
+ }
8
+ .rf-bento__eyebrow {
9
+ font-size: 0.8125rem;
10
+ font-weight: 600;
11
+ letter-spacing: 0.05em;
12
+ text-transform: uppercase;
13
+ color: var(--rf-color-primary);
14
+ margin: 0 0 0.5rem;
15
+ }
16
+ .rf-bento__eyebrow:has(a) {
17
+ display: inline-block;
18
+ position: relative;
19
+ padding: 0.25rem 0.875rem;
20
+ border: 1px solid var(--rf-color-border);
21
+ border-radius: var(--rf-radius-full);
22
+ color: var(--rf-color-text);
23
+ font-weight: 400;
24
+ text-transform: none;
25
+ letter-spacing: 0;
26
+ transition: border-color 150ms ease;
27
+ }
28
+ .rf-bento__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
29
+ .rf-bento__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: 600; text-decoration: none; }
30
+ .rf-bento__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
31
+ .rf-bento__headline {
32
+ margin-top: 0;
33
+ }
34
+ .rf-bento__blurb {
35
+ color: var(--rf-color-muted);
36
+ margin-bottom: 0;
37
+ }
38
+ .rf-bento__image {
39
+ margin-bottom: 1rem;
40
+ }
5
41
  .rf-bento__grid {
6
42
  display: grid;
7
43
  grid-template-columns: repeat(var(--bento-columns, 4), 1fr);
@@ -14,6 +50,9 @@
14
50
  background: var(--rf-color-surface);
15
51
  overflow: hidden;
16
52
  }
53
+ .rf-bento-cell--full {
54
+ grid-column: 1 / -1;
55
+ }
17
56
  .rf-bento-cell--large {
18
57
  grid-column: span 2;
19
58
  grid-row: span 2;
@@ -24,13 +63,31 @@
24
63
  .rf-bento-cell--small {
25
64
  grid-column: span 1;
26
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
+ }
27
84
  .rf-bento-cell__title {
28
- font-size: 1rem;
85
+ font-size: 1.125rem;
29
86
  font-weight: 600;
30
87
  margin: 0 0 0.5rem;
31
88
  }
32
- .rf-bento-cell__body span[property],
33
- .rf-bento-cell__body meta { display: none; }
89
+ .rf-bento-cell__body > span[property],
90
+ .rf-bento-cell__body > meta { display: none; }
34
91
  .rf-bento-cell__body p:last-child { margin-bottom: 0; }
35
92
  .rf-bento-cell img {
36
93
  width: 100%;
@@ -38,13 +95,33 @@
38
95
  border-radius: var(--rf-radius-sm);
39
96
  margin-bottom: 0.75rem;
40
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
+ }
41
114
  @media (max-width: 768px) {
42
115
  .rf-bento__grid { grid-template-columns: repeat(2, 1fr) !important; }
116
+ .rf-bento-cell--full { grid-column: 1 / -1; }
43
117
  .rf-bento-cell--large { grid-column: span 2; grid-row: span 1; }
44
118
  .rf-bento-cell--medium { grid-column: span 2; }
119
+ .rf-bento-cell--span { grid-column: span min(var(--cell-span, 1), 2); }
45
120
  }
46
121
  @media (max-width: 480px) {
47
122
  .rf-bento__grid { grid-template-columns: 1fr !important; }
123
+ .rf-bento-cell--full,
48
124
  .rf-bento-cell--large,
49
- .rf-bento-cell--medium { grid-column: span 1; }
125
+ .rf-bento-cell--medium,
126
+ .rf-bento-cell--span { grid-column: span 1; }
50
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,11 +1,59 @@
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
+ }
10
+ .rf-cta__header {
11
+ margin-bottom: 1.5rem;
12
+ }
13
+ /* Higher specificity needed to override .rf-cta p (0,1,1) */
14
+ .rf-cta .rf-cta__eyebrow {
15
+ font-size: 0.875rem;
16
+ font-weight: 600;
17
+ letter-spacing: 0.05em;
18
+ text-transform: uppercase;
19
+ color: var(--rf-color-primary);
20
+ margin: 0 0 0.75rem;
21
+ max-width: none;
22
+ }
23
+ /* Pill-badge variant when eyebrow contains a link */
24
+ .rf-cta .rf-cta__eyebrow:has(a) {
25
+ display: inline-block;
26
+ position: relative;
27
+ padding: 0.25rem 0.875rem;
28
+ border: 1px solid var(--rf-color-border);
29
+ border-radius: var(--rf-radius-full);
30
+ color: var(--rf-color-text);
31
+ font-weight: 400;
32
+ text-transform: none;
33
+ letter-spacing: 0;
34
+ transition: border-color 150ms ease;
35
+ }
36
+ .rf-cta .rf-cta__eyebrow:has(a):hover {
37
+ border-color: var(--rf-color-muted);
38
+ }
39
+ .rf-cta .rf-cta__eyebrow:has(a) a {
40
+ color: var(--rf-color-primary);
41
+ font-weight: 600;
42
+ text-decoration: none;
43
+ }
44
+ .rf-cta .rf-cta__eyebrow:has(a) a::before {
45
+ content: '';
46
+ position: absolute;
47
+ inset: 0;
48
+ border-radius: inherit;
49
+ }
50
+ .rf-cta__image {
51
+ margin-bottom: 1.5rem;
52
+ }
6
53
  .rf-cta h1,
7
54
  .rf-cta h2,
8
- .rf-cta h3 {
55
+ .rf-cta h3,
56
+ .rf-cta__headline {
9
57
  font-size: 2.5rem;
10
58
  font-weight: 750;
11
59
  letter-spacing: -0.03em;
@@ -17,7 +65,9 @@
17
65
  -webkit-text-fill-color: transparent;
18
66
  background-clip: text;
19
67
  }
20
- .rf-cta p {
68
+ /* Higher specificity needed to override .rf-cta p (0,1,1) */
69
+ .rf-cta p,
70
+ .rf-cta .rf-cta__blurb {
21
71
  font-size: 1.15rem;
22
72
  color: var(--rf-color-muted);
23
73
  max-width: 540px;
@@ -78,9 +128,13 @@
78
128
 
79
129
  /* Context-aware: CTA inside pricing — compact, left-aligned */
80
130
  .rf-cta--in-pricing {
81
- text-align: left;
82
131
  padding: 1.5rem 0 0;
83
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
+ }
84
138
  .rf-cta--in-pricing p {
85
139
  margin: 0 0 1rem;
86
140
  max-width: none;
@@ -2,42 +2,88 @@
2
2
  .rf-feature {
3
3
  padding: 2.5rem 0 2rem;
4
4
  }
5
- .rf-feature__body {
5
+ .rf-feature__header {
6
+ margin-bottom: 1.5rem;
7
+ }
8
+ .rf-feature__eyebrow {
9
+ font-size: 0.8125rem;
10
+ font-weight: 600;
11
+ letter-spacing: 0.05em;
12
+ text-transform: uppercase;
13
+ color: var(--rf-color-primary);
14
+ margin: 0 0 0.5rem;
15
+ }
16
+ .rf-feature__eyebrow:has(a) {
17
+ display: inline-block;
18
+ position: relative;
19
+ padding: 0.25rem 0.875rem;
20
+ border: 1px solid var(--rf-color-border);
21
+ border-radius: var(--rf-radius-full);
22
+ color: var(--rf-color-text);
23
+ font-weight: 400;
24
+ text-transform: none;
25
+ letter-spacing: 0;
26
+ transition: border-color 150ms ease;
27
+ }
28
+ .rf-feature__eyebrow:has(a):hover { border-color: var(--rf-color-muted); }
29
+ .rf-feature__eyebrow:has(a) a { color: var(--rf-color-primary); font-weight: 600; text-decoration: none; }
30
+ .rf-feature__eyebrow:has(a) a::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
31
+ .rf-feature__headline {
32
+ margin-top: 0;
33
+ }
34
+ .rf-feature__blurb {
35
+ color: var(--rf-color-muted);
36
+ margin-bottom: 0;
37
+ max-width: 40rem;
38
+ }
39
+ .rf-feature__image {
40
+ margin-bottom: 1rem;
41
+ }
42
+ .rf-feature__content {
6
43
  display: contents;
7
44
  }
8
45
  .rf-feature h2 {
9
- text-align: center;
10
46
  margin-bottom: 2rem;
11
47
  }
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
+ }
12
60
  .rf-feature dl {
13
61
  display: grid;
14
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
62
+ grid-template-columns: repeat(auto-fit, minmax(max(240px, calc((100% - 3rem) / 3)), 1fr));
15
63
  gap: 1.5rem;
16
64
  margin: 0;
17
65
  }
18
- .rf-feature--split {
19
- display: grid;
20
- align-items: center;
21
- grid-template-columns: 1fr 1fr;
22
- gap: 3rem;
23
- }
24
- .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 {
25
69
  display: block;
26
70
  }
27
- .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 {
28
75
  text-align: left;
29
76
  }
30
- .rf-feature--split dl {
77
+ .rf-feature[data-layout="split"] dl,
78
+ .rf-feature[data-layout="split-reverse"] dl {
31
79
  display: block;
32
80
  }
33
- .rf-feature--split .rf-feature-definition {
81
+ .rf-feature[data-layout="split"] .rf-feature-definition,
82
+ .rf-feature[data-layout="split-reverse"] .rf-feature-definition {
34
83
  border: none;
35
84
  background: none;
36
85
  padding: 0.75rem 0;
37
86
  }
38
- .rf-feature--mirror .rf-feature__showcase {
39
- order: -1;
40
- }
41
87
  .rf-feature-definition {
42
88
  padding: 1.75rem;
43
89
  border-radius: var(--rf-radius-md);
@@ -46,7 +92,7 @@
46
92
  }
47
93
  .rf-feature-definition dt {
48
94
  font-weight: 650;
49
- font-size: 1.05rem;
95
+ font-size: 1.125rem;
50
96
  margin-bottom: 0.75rem;
51
97
  letter-spacing: -0.01em;
52
98
  color: var(--rf-color-text);
@@ -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
+ }