@refrakt-md/lumina 0.8.4 → 0.9.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 (81) hide show
  1. package/base.css +10 -0
  2. package/contracts/structures.json +235 -45
  3. package/index.css +22 -0
  4. package/package.json +6 -6
  5. package/styles/dimensions/checklist.css +81 -0
  6. package/styles/dimensions/density.css +51 -0
  7. package/styles/dimensions/media.css +62 -0
  8. package/styles/dimensions/metadata.css +161 -0
  9. package/styles/dimensions/sections.css +77 -0
  10. package/styles/dimensions/sequence.css +129 -0
  11. package/styles/dimensions/state.css +57 -0
  12. package/styles/dimensions/surfaces.css +88 -0
  13. package/styles/global.css +1 -1
  14. package/styles/layouts/docs.css +28 -2
  15. package/styles/layouts/split.css +159 -3
  16. package/styles/runes/accordion.css +1 -2
  17. package/styles/runes/annotate.css +0 -3
  18. package/styles/runes/api.css +0 -4
  19. package/styles/runes/audio.css +0 -3
  20. package/styles/runes/backlog.css +61 -0
  21. package/styles/runes/bento.css +4 -5
  22. package/styles/runes/blog.css +94 -0
  23. package/styles/runes/budget.css +3 -19
  24. package/styles/runes/bug.css +25 -0
  25. package/styles/runes/cast.css +0 -3
  26. package/styles/runes/character.css +5 -43
  27. package/styles/runes/chart.css +0 -2
  28. package/styles/runes/codegroup.css +2 -2
  29. package/styles/runes/compare.css +0 -1
  30. package/styles/runes/conversation.css +0 -1
  31. package/styles/runes/cta.css +6 -3
  32. package/styles/runes/datatable.css +0 -3
  33. package/styles/runes/decision-log.css +46 -0
  34. package/styles/runes/decision.css +21 -0
  35. package/styles/runes/design-context.css +0 -1
  36. package/styles/runes/details.css +0 -1
  37. package/styles/runes/diagram.css +0 -1
  38. package/styles/runes/diff.css +0 -1
  39. package/styles/runes/embed.css +0 -1
  40. package/styles/runes/event.css +0 -3
  41. package/styles/runes/faction.css +79 -48
  42. package/styles/runes/feature.css +10 -10
  43. package/styles/runes/figure.css +0 -3
  44. package/styles/runes/form.css +0 -1
  45. package/styles/runes/gallery.css +0 -1
  46. package/styles/runes/grid.css +0 -3
  47. package/styles/runes/hero.css +13 -4
  48. package/styles/runes/hint.css +0 -7
  49. package/styles/runes/howto.css +7 -18
  50. package/styles/runes/itinerary.css +0 -2
  51. package/styles/runes/juxtapose.css +160 -0
  52. package/styles/runes/lore.css +0 -20
  53. package/styles/runes/map.css +6 -1
  54. package/styles/runes/mediatext.css +0 -3
  55. package/styles/runes/milestone.css +106 -0
  56. package/styles/runes/mockup.css +0 -1
  57. package/styles/runes/organization.css +0 -3
  58. package/styles/runes/palette.css +0 -3
  59. package/styles/runes/plan-activity.css +87 -0
  60. package/styles/runes/plan-progress.css +69 -0
  61. package/styles/runes/playlist.css +101 -83
  62. package/styles/runes/plot.css +0 -23
  63. package/styles/runes/preview.css +9 -17
  64. package/styles/runes/pricing.css +4 -1
  65. package/styles/runes/realm.css +80 -46
  66. package/styles/runes/recipe.css +7 -89
  67. package/styles/runes/reveal.css +1 -4
  68. package/styles/runes/sandbox.css +0 -1
  69. package/styles/runes/spacing.css +0 -3
  70. package/styles/runes/spec.css +20 -0
  71. package/styles/runes/steps.css +4 -2
  72. package/styles/runes/storyboard.css +0 -3
  73. package/styles/runes/symbol.css +0 -39
  74. package/styles/runes/tabs.css +1 -4
  75. package/styles/runes/testimonial.css +0 -2
  76. package/styles/runes/textblock.css +0 -3
  77. package/styles/runes/toc.css +0 -1
  78. package/styles/runes/track.css +16 -5
  79. package/styles/runes/typography.css +0 -3
  80. package/styles/runes/work.css +35 -0
  81. package/styles/runes/xref.css +12 -0
@@ -0,0 +1,21 @@
1
+ /* Decision */
2
+ .rf-decision__body {
3
+ font-size: 0.925rem;
4
+ line-height: 1.65;
5
+ }
6
+ .rf-decision__body > header {
7
+ margin-bottom: 0.75rem;
8
+ }
9
+ .rf-decision__body > header h1,
10
+ .rf-decision__body > header h2,
11
+ .rf-decision__body > header h3 {
12
+ margin-top: 0;
13
+ }
14
+ .rf-decision__body > div > section {
15
+ margin-top: 1rem;
16
+ padding-top: 0.75rem;
17
+ border-top: 1px solid var(--rf-color-border);
18
+ }
19
+ .rf-decision__body > div > section:first-child {
20
+ margin-top: 0.75rem;
21
+ }
@@ -1,6 +1,5 @@
1
1
  /* Design Context — unified token card wrapper */
2
2
  .rf-design-context {
3
- margin: 1.5rem 0;
4
3
  border: 1px solid var(--rf-color-border, #e5e7eb);
5
4
  border-radius: 0.75rem;
6
5
  overflow: hidden;
@@ -2,7 +2,6 @@
2
2
  .rf-details {
3
3
  border: 1px solid var(--rf-color-border);
4
4
  border-radius: var(--rf-radius-md);
5
- margin: 1.5rem 0;
6
5
  overflow: hidden;
7
6
  }
8
7
  .rf-details__summary {
@@ -3,7 +3,6 @@
3
3
  border: 1px solid var(--rf-color-border);
4
4
  border-radius: var(--rf-radius-lg);
5
5
  padding: 1.5rem;
6
- margin: 1.5rem 0;
7
6
  text-align: center;
8
7
  }
9
8
  .rf-diagram__title {
@@ -2,7 +2,6 @@
2
2
  .rf-diff {
3
3
  border: 1px solid var(--rf-color-border);
4
4
  border-radius: var(--rf-radius-lg);
5
- margin: 1.5rem 0;
6
5
  overflow: hidden;
7
6
  font-size: 0.875rem;
8
7
  }
@@ -1,6 +1,5 @@
1
1
  /* Embed */
2
2
  .rf-embed {
3
- margin: 1.5rem 0;
4
3
  padding: 0;
5
4
  }
6
5
  .rf-embed__wrapper {
@@ -1,7 +1,4 @@
1
1
  /* Event */
2
- .rf-event {
3
- margin: 1.5rem 0;
4
- }
5
2
  .rf-event__details {
6
3
  display: flex;
7
4
  flex-wrap: wrap;
@@ -1,43 +1,12 @@
1
1
  /* Faction */
2
2
  .rf-faction {
3
- margin: 1.5rem 0;
4
3
  display: flex;
5
4
  flex-direction: column;
6
5
  }
7
6
 
8
- /* Badge barsurface strip */
9
- .rf-faction__badge {
10
- display: flex;
11
- flex-wrap: wrap;
12
- gap: 0.75rem 1.25rem;
13
- align-items: center;
14
- background: var(--rf-color-surface);
15
- border-radius: var(--rf-radius-md);
16
- padding: 0.625rem 1rem;
17
- margin-bottom: 1rem;
18
- }
19
- .rf-faction__type-badge,
20
- .rf-faction__alignment-badge,
21
- .rf-faction__size-badge {
22
- font-size: 0.8125rem;
23
- font-weight: 500;
24
- text-transform: capitalize;
25
- color: var(--rf-color-muted);
26
- }
27
- .rf-faction__type-badge::before { content: 'Type: '; font-weight: 400; opacity: 0.65; }
28
- .rf-faction__alignment-badge::before { content: 'Alignment: '; font-weight: 400; opacity: 0.65; }
29
- .rf-faction__size-badge::before { content: 'Size: '; font-weight: 400; opacity: 0.65; }
30
-
31
- /* Scene image */
7
+ /* Scene imagebase styles deferred to shared [data-section="media"] in split.css */
32
8
  .rf-faction__scene {
33
- border-radius: var(--rf-radius-lg);
34
- overflow: hidden;
35
- }
36
- .rf-faction__scene img {
37
- display: block;
38
- width: 100%;
39
- height: auto;
40
- border-radius: var(--rf-radius-lg);
9
+ margin-bottom: var(--rf-spacing-md);
41
10
  }
42
11
 
43
12
  /* Content */
@@ -56,7 +25,6 @@
56
25
  font-weight: 700;
57
26
  margin-bottom: 0.5rem;
58
27
  color: var(--rf-color-heading);
59
- order: -1;
60
28
  }
61
29
 
62
30
  /* Faction Section */
@@ -64,9 +32,11 @@
64
32
  padding: 0.75rem 0;
65
33
  border-top: 1px solid var(--rf-color-border);
66
34
  }
67
- .rf-faction-section__header {
68
- font-size: 1.125rem;
69
- font-weight: 600;
35
+ .rf-faction-section__name {
36
+ display: block;
37
+ font-size: 1.25rem;
38
+ font-weight: 700;
39
+ line-height: 1.3;
70
40
  margin-bottom: 0.5rem;
71
41
  color: var(--rf-color-heading);
72
42
  }
@@ -80,41 +50,102 @@
80
50
  .rf-faction[data-layout="split-reverse"] {
81
51
  display: grid;
82
52
  grid-template-columns: var(--split-ratio, 1fr 1fr);
83
- gap: var(--split-gap, 2rem);
53
+ column-gap: var(--split-gap, 2rem);
84
54
  align-items: var(--split-valign, start);
85
55
  }
86
- /* Name and badge span full width at the top */
87
- .rf-faction[data-layout="split"] > span[property="name"],
88
- .rf-faction[data-layout="split-reverse"] > span[property="name"] {
89
- grid-column: 1 / -1;
56
+ /* Split: badge + name + content left (col 1), scene right (col 2) */
57
+ .rf-faction[data-layout="split"] > .rf-faction__badge {
58
+ grid-column: 1;
90
59
  grid-row: 1;
91
60
  }
92
- .rf-faction[data-layout="split"] > .rf-faction__badge,
93
- .rf-faction[data-layout="split-reverse"] > .rf-faction__badge {
94
- grid-column: 1 / -1;
61
+ .rf-faction[data-layout="split"] > span[property="name"] {
62
+ grid-column: 1;
95
63
  grid-row: 2;
96
64
  }
97
- /* Split: content left (col 1), scene right (col 2) */
98
65
  .rf-faction[data-layout="split"] > .rf-faction__content {
99
66
  grid-column: 1;
100
67
  grid-row: 3;
101
68
  }
102
69
  .rf-faction[data-layout="split"] > .rf-faction__scene {
70
+ grid-column: 2;
71
+ grid-row: 1 / 4;
72
+ }
73
+ /* Split-reverse: scene left (col 1), badge + name + content right (col 2) */
74
+ .rf-faction[data-layout="split-reverse"] > .rf-faction__badge {
75
+ grid-column: 2;
76
+ grid-row: 1;
77
+ }
78
+ .rf-faction[data-layout="split-reverse"] > span[property="name"] {
79
+ grid-column: 2;
80
+ grid-row: 2;
81
+ }
82
+ .rf-faction[data-layout="split-reverse"] > .rf-faction__content {
103
83
  grid-column: 2;
104
84
  grid-row: 3;
105
85
  }
106
- /* Split-reverse: scene left (col 1), content right (col 2) — matches DOM order */
86
+ .rf-faction[data-layout="split-reverse"] > .rf-faction__scene {
87
+ grid-column: 1;
88
+ grid-row: 1 / 4;
89
+ margin: 0;
90
+ }
107
91
  /* Collapse to single column on small screens */
108
92
  @media (max-width: 640px) {
109
93
  .rf-faction[data-layout="split"],
110
94
  .rf-faction[data-layout="split-reverse"] {
111
95
  grid-template-columns: 1fr;
112
96
  }
97
+ .rf-faction[data-layout="split"] > .rf-faction__badge,
98
+ .rf-faction[data-layout="split"] > span[property="name"],
113
99
  .rf-faction[data-layout="split"] > .rf-faction__content,
114
- .rf-faction[data-layout="split"] > .rf-faction__scene {
100
+ .rf-faction[data-layout="split"] > .rf-faction__scene,
101
+ .rf-faction[data-layout="split-reverse"] > .rf-faction__badge,
102
+ .rf-faction[data-layout="split-reverse"] > span[property="name"],
103
+ .rf-faction[data-layout="split-reverse"] > .rf-faction__content,
104
+ .rf-faction[data-layout="split-reverse"] > .rf-faction__scene {
105
+ grid-column: auto;
106
+ grid-row: auto;
107
+ }
108
+ .rf-faction[data-layout="split"]:not([data-media-position="top"]) > .rf-faction__scene,
109
+ .rf-faction[data-layout="split-reverse"]:not([data-media-position="top"]) > .rf-faction__scene {
110
+ margin-bottom: var(--rf-spacing-md);
111
+ }
112
+ }
113
+ /* Reset grid placement when data-collapse triggers single-column from shared split.css */
114
+ @media (max-width: 640px) {
115
+ .rf-faction[data-collapse="sm"] > .rf-faction__badge,
116
+ .rf-faction[data-collapse="sm"] > span[property="name"],
117
+ .rf-faction[data-collapse="sm"] > .rf-faction__content,
118
+ .rf-faction[data-collapse="sm"] > .rf-faction__scene {
115
119
  grid-column: auto;
116
120
  grid-row: auto;
117
121
  }
122
+ .rf-faction[data-collapse="sm"]:not([data-media-position="top"]) > .rf-faction__scene {
123
+ margin-bottom: var(--rf-spacing-md);
124
+ }
125
+ }
126
+ @media (max-width: 768px) {
127
+ .rf-faction[data-collapse="md"] > .rf-faction__badge,
128
+ .rf-faction[data-collapse="md"] > span[property="name"],
129
+ .rf-faction[data-collapse="md"] > .rf-faction__content,
130
+ .rf-faction[data-collapse="md"] > .rf-faction__scene {
131
+ grid-column: auto;
132
+ grid-row: auto;
133
+ }
134
+ .rf-faction[data-collapse="md"]:not([data-media-position="top"]) > .rf-faction__scene {
135
+ margin-bottom: var(--rf-spacing-md);
136
+ }
137
+ }
138
+ @media (max-width: 1024px) {
139
+ .rf-faction[data-collapse="lg"] > .rf-faction__badge,
140
+ .rf-faction[data-collapse="lg"] > span[property="name"],
141
+ .rf-faction[data-collapse="lg"] > .rf-faction__content,
142
+ .rf-faction[data-collapse="lg"] > .rf-faction__scene {
143
+ grid-column: auto;
144
+ grid-row: auto;
145
+ }
146
+ .rf-faction[data-collapse="lg"]:not([data-media-position="top"]) > .rf-faction__scene {
147
+ margin-bottom: var(--rf-spacing-md);
148
+ }
118
149
  }
119
150
 
120
151
  /* Split layout scene gets subtle depth */
@@ -2,7 +2,10 @@
2
2
  .rf-feature {
3
3
  padding: 2.5rem 0 2rem;
4
4
  }
5
- .rf-feature__header {
5
+ .rf-feature__preamble {
6
+ flex-direction: column;
7
+ align-items: flex-start;
8
+ gap: 0.25rem;
6
9
  margin-bottom: 1.5rem;
7
10
  }
8
11
  .rf-feature__eyebrow {
@@ -45,15 +48,15 @@
45
48
  .rf-feature h2 {
46
49
  margin-bottom: 2rem;
47
50
  }
48
- .rf-feature[data-align="center"] .rf-feature__header,
51
+ .rf-feature[data-align="center"] .rf-feature__preamble,
49
52
  .rf-feature[data-align="center"] h2 {
50
53
  text-align: center;
51
54
  }
52
- .rf-feature[data-align="left"] .rf-feature__header,
55
+ .rf-feature[data-align="left"] .rf-feature__preamble,
53
56
  .rf-feature[data-align="left"] h2 {
54
57
  text-align: left;
55
58
  }
56
- .rf-feature[data-align="right"] .rf-feature__header,
59
+ .rf-feature[data-align="right"] .rf-feature__preamble,
57
60
  .rf-feature[data-align="right"] h2 {
58
61
  text-align: right;
59
62
  }
@@ -68,8 +71,8 @@
68
71
  .rf-feature[data-layout="split-reverse"] .rf-feature__content {
69
72
  display: block;
70
73
  }
71
- .rf-feature[data-layout="split"] .rf-feature__header,
72
- .rf-feature[data-layout="split-reverse"] .rf-feature__header,
74
+ .rf-feature[data-layout="split"] .rf-feature__preamble,
75
+ .rf-feature[data-layout="split-reverse"] .rf-feature__preamble,
73
76
  .rf-feature[data-layout="split"] h2,
74
77
  .rf-feature[data-layout="split-reverse"] h2 {
75
78
  text-align: left;
@@ -80,15 +83,13 @@
80
83
  }
81
84
  .rf-feature[data-layout="split"] .rf-feature__feature-item,
82
85
  .rf-feature[data-layout="split-reverse"] .rf-feature__feature-item {
83
- border: none;
84
86
  background: none;
85
87
  padding: 0.75rem 0;
86
88
  }
87
89
  .rf-feature__feature-item {
88
90
  padding: 1.75rem;
89
91
  border-radius: var(--rf-radius-md);
90
- border: 1px solid var(--rf-color-border);
91
- background: var(--rf-color-bg);
92
+ background: var(--rf-color-surface);
92
93
  }
93
94
  .rf-feature__feature-item dt {
94
95
  font-weight: 650;
@@ -120,7 +121,6 @@
120
121
  }
121
122
  .rf-feature--in-hero .rf-feature__feature-item {
122
123
  background: transparent;
123
- border-color: rgba(255, 255, 255, 0.15);
124
124
  }
125
125
 
126
126
  /* Context-aware: feature inside a grid — remove outer padding */
@@ -1,7 +1,4 @@
1
1
  /* Figure */
2
- .rf-figure {
3
- margin: 1.5rem 0;
4
- }
5
2
  .rf-figure img {
6
3
  max-width: 100%;
7
4
  height: auto;
@@ -1,6 +1,5 @@
1
1
  /* Form */
2
2
  .rf-form {
3
- margin: 1.5rem 0;
4
3
  display: flex;
5
4
  flex-direction: column;
6
5
  gap: 1.25rem;
@@ -1,6 +1,5 @@
1
1
  /* Gallery — Multi-image container with grid/carousel/masonry layout */
2
2
  .rf-gallery {
3
- margin: 1.5rem 0;
4
3
  position: relative;
5
4
  }
6
5
 
@@ -1,7 +1,4 @@
1
1
  /* Grid */
2
- .rf-grid {
3
- margin: 1.5rem 0;
4
- }
5
2
  .rf-grid [data-layout="grid"] {
6
3
  display: grid;
7
4
  grid-template-columns: var(--grid-ratio, repeat(auto-fit, minmax(250px, 1fr)));
@@ -5,7 +5,10 @@
5
5
  background-size: cover;
6
6
  background-position: center;
7
7
  }
8
- .rf-hero__header {
8
+ .rf-hero__preamble {
9
+ flex-direction: column;
10
+ align-items: center;
11
+ gap: 0.25rem;
9
12
  margin-bottom: 2rem;
10
13
  }
11
14
  /* Higher specificity needed to override .rf-hero p (0,1,1) */
@@ -56,7 +59,7 @@
56
59
  gap: 0.75rem;
57
60
  flex-wrap: wrap;
58
61
  }
59
- .rf-hero[data-align="center"] .rf-hero__header,
62
+ .rf-hero[data-align="center"] .rf-hero__preamble,
60
63
  .rf-hero[data-align="center"] > h1,
61
64
  .rf-hero[data-align="center"] > p {
62
65
  text-align: center;
@@ -65,19 +68,25 @@
65
68
  margin: 0 auto;
66
69
  justify-content: center;
67
70
  }
68
- .rf-hero[data-align="left"] .rf-hero__header,
71
+ .rf-hero[data-align="left"] .rf-hero__preamble,
69
72
  .rf-hero[data-align="left"] > h1,
70
73
  .rf-hero[data-align="left"] > p {
71
74
  text-align: left;
72
75
  }
76
+ .rf-hero[data-align="left"] .rf-hero__preamble {
77
+ align-items: flex-start;
78
+ }
73
79
  .rf-hero[data-align="left"] .rf-hero__actions {
74
80
  margin: 0;
75
81
  }
76
- .rf-hero[data-align="right"] .rf-hero__header,
82
+ .rf-hero[data-align="right"] .rf-hero__preamble,
77
83
  .rf-hero[data-align="right"] > h1,
78
84
  .rf-hero[data-align="right"] > p {
79
85
  text-align: right;
80
86
  }
87
+ .rf-hero[data-align="right"] .rf-hero__preamble {
88
+ align-items: flex-end;
89
+ }
81
90
  .rf-hero[data-align="right"] .rf-hero__actions {
82
91
  margin: 0 0 0 auto;
83
92
  }
@@ -4,16 +4,9 @@
4
4
  --hint-bg: var(--rf-color-info-bg);
5
5
  border-left: 3px solid var(--hint-color);
6
6
  padding: 0.875rem 1.25rem;
7
- margin: 1.5rem 0;
8
7
  border-radius: 0 var(--rf-radius-md) var(--rf-radius-md) 0;
9
8
  background: var(--hint-bg);
10
9
  }
11
- .rf-hint__header {
12
- display: flex;
13
- align-items: center;
14
- gap: 0.5rem;
15
- margin-bottom: 0.375rem;
16
- }
17
10
  .rf-hint__icon {
18
11
  display: flex;
19
12
  align-items: center;
@@ -1,30 +1,14 @@
1
1
  /* HowTo — matches recipe design */
2
2
 
3
- /* Root: no border box, just flow spacing */
4
- .rf-howto {
5
- margin: 1.5rem 0;
6
- }
7
-
8
- /* Meta bar — soft surface strip */
3
+ /* Meta bar extra bottom spacing beyond section header default */
9
4
  .rf-howto__meta {
10
- display: flex;
11
- flex-wrap: wrap;
12
- gap: 0.75rem 1.25rem;
13
- align-items: center;
14
- background: var(--rf-color-surface);
15
- border-radius: var(--rf-radius-md);
16
- padding: 0.625rem 1rem;
17
5
  margin-bottom: 1.5rem;
18
6
  }
19
- .rf-howto__meta-item {
20
- font-size: 0.8125rem;
21
- color: var(--rf-color-muted);
22
- font-weight: 400;
23
- }
24
7
 
25
8
  /* Tools/materials list — surfaced zone with primary markers */
26
9
  .rf-howto__content ul {
27
10
  background: var(--rf-color-surface);
11
+ border: 1px solid var(--rf-color-border);
28
12
  border-radius: var(--rf-radius-md);
29
13
  padding: 1.25rem 1.25rem 1.25rem 2.5rem;
30
14
  margin: 0 0 1.75rem;
@@ -72,6 +56,11 @@
72
56
  border-radius: var(--rf-radius-full);
73
57
  }
74
58
 
59
+ .rf-howto__content ol > li > p,
60
+ .rf-howto__content ul > li > p {
61
+ margin: 0;
62
+ }
63
+
75
64
  /* Tips — callout accent like hint */
76
65
  .rf-howto__content blockquote {
77
66
  border-left: 2px solid var(--rf-color-primary);
@@ -1,8 +1,6 @@
1
1
  /* Itinerary */
2
2
  .rf-itinerary {
3
3
  margin: 2rem 0;
4
- padding-left: 0.75rem;
5
- padding-right: 0.75rem;
6
4
  }
7
5
  .rf-itinerary > header {
8
6
  margin-bottom: 1.5rem;
@@ -0,0 +1,160 @@
1
+ /* Juxtapose — interactive comparison between two panels */
2
+
3
+ /* ─── Variant modifiers (for static/no-JS layout) ─── */
4
+ .rf-juxtapose--slider,
5
+ .rf-juxtapose--auto,
6
+ .rf-juxtapose--fade,
7
+ .rf-juxtapose--toggle {
8
+ /* shared base — no additional styling needed */
9
+ }
10
+
11
+ /* ─── Panels container ─── */
12
+ .rf-juxtapose__panels {
13
+ border-radius: var(--rf-radius-md);
14
+ overflow: hidden;
15
+ border: 1px solid var(--rf-color-border);
16
+ background: var(--rf-color-surface);
17
+ }
18
+
19
+ /* ─── Panel ─── */
20
+ .rf-juxtapose-panel {
21
+ position: relative;
22
+ overflow: hidden;
23
+ }
24
+ .rf-juxtapose-panel__name {
25
+ position: absolute;
26
+ bottom: 0.5rem;
27
+ padding: 0.25rem 0.75rem;
28
+ background: rgba(0, 0, 0, 0.6);
29
+ color: white;
30
+ font-size: 0.75rem;
31
+ font-weight: 600;
32
+ border-radius: var(--rf-radius-sm);
33
+ pointer-events: none;
34
+ }
35
+ /* First panel: label bottom-left */
36
+ .rf-juxtapose-panel:first-child .rf-juxtapose-panel__name {
37
+ left: 0.5rem;
38
+ }
39
+ /* Second panel: label bottom-right */
40
+ .rf-juxtapose-panel:last-child .rf-juxtapose-panel__name {
41
+ right: 0.5rem;
42
+ }
43
+ .rf-juxtapose-panel__body {
44
+ /* Content fills the panel */
45
+ }
46
+ .rf-juxtapose-panel__body img {
47
+ display: block;
48
+ width: 100%;
49
+ height: auto;
50
+ object-fit: cover;
51
+ }
52
+
53
+ /* Hide meta tags inside panels */
54
+ .rf-juxtapose-panel > meta { display: none; }
55
+
56
+ /* ─── Toggle variant: labels only on buttons, not in panels ─── */
57
+ .rf-juxtapose--toggle .rf-juxtapose-panel__name {
58
+ display: none;
59
+ }
60
+
61
+ /* ─── Slider divider (injected by behavior) ─── */
62
+ .rf-juxtapose__divider {
63
+ position: absolute;
64
+ z-index: 10;
65
+ cursor: col-resize;
66
+ touch-action: none;
67
+ }
68
+
69
+ /* Vertical orientation (left/right split) — default */
70
+ .rf-juxtapose:not([data-orientation="horizontal"]) .rf-juxtapose__divider {
71
+ top: 0;
72
+ bottom: 0;
73
+ width: 3px;
74
+ transform: translateX(-50%);
75
+ background: var(--rf-color-bg, #fff);
76
+ box-shadow: var(--rf-shadow-sm);
77
+ }
78
+
79
+ /* Horizontal orientation (top/bottom split) */
80
+ .rf-juxtapose[data-orientation="horizontal"] .rf-juxtapose__divider {
81
+ left: 0;
82
+ right: 0;
83
+ height: 3px;
84
+ transform: translateY(-50%);
85
+ background: var(--rf-color-bg, #fff);
86
+ box-shadow: var(--rf-shadow-sm);
87
+ cursor: row-resize;
88
+ }
89
+
90
+ .rf-juxtapose__divider-handle {
91
+ position: absolute;
92
+ top: 50%;
93
+ left: 50%;
94
+ transform: translate(-50%, -50%);
95
+ width: 2.5rem;
96
+ height: 2.5rem;
97
+ border-radius: var(--rf-radius-full);
98
+ background: var(--rf-color-bg, #fff);
99
+ border: 2px solid var(--rf-color-border);
100
+ box-shadow: var(--rf-shadow-md);
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: center;
104
+ }
105
+
106
+ .rf-juxtapose__divider-handle::before {
107
+ content: '\2194'; /* ↔ */
108
+ font-size: 1rem;
109
+ color: var(--rf-color-muted);
110
+ line-height: 1;
111
+ }
112
+
113
+ .rf-juxtapose[data-orientation="horizontal"] .rf-juxtapose__divider-handle::before {
114
+ content: '\2195'; /* ↕ */
115
+ }
116
+
117
+ .rf-juxtapose__divider:focus-visible {
118
+ outline: 2px solid var(--rf-color-primary);
119
+ outline-offset: 2px;
120
+ }
121
+
122
+ /* ─── Toggle bar (injected by behavior) ─── */
123
+ .rf-juxtapose__toggle-bar {
124
+ display: flex;
125
+ gap: 0.25rem;
126
+ padding: 0.25rem;
127
+ margin-bottom: 0.75rem;
128
+ background: var(--rf-color-surface);
129
+ border: 1px solid var(--rf-color-border);
130
+ border-radius: var(--rf-radius-md);
131
+ width: fit-content;
132
+ }
133
+
134
+ .rf-juxtapose__toggle-btn {
135
+ padding: 0.375rem 1rem;
136
+ border: none;
137
+ border-radius: var(--rf-radius-sm);
138
+ background: transparent;
139
+ color: var(--rf-color-muted);
140
+ font-size: 0.875rem;
141
+ font-weight: 500;
142
+ cursor: pointer;
143
+ transition: background 0.15s, color 0.15s;
144
+ }
145
+
146
+ .rf-juxtapose__toggle-btn:hover {
147
+ color: var(--rf-color-text);
148
+ }
149
+
150
+ .rf-juxtapose__toggle-btn--active {
151
+ background: var(--rf-color-bg, #fff);
152
+ color: var(--rf-color-text);
153
+ box-shadow: var(--rf-shadow-sm);
154
+ }
155
+
156
+ /* ─── Fade variant cursor hint ─── */
157
+ .rf-juxtapose--fade .rf-juxtapose__panels {
158
+ cursor: pointer;
159
+ }
160
+
@@ -1,28 +1,8 @@
1
1
  /* Lore */
2
2
  .rf-lore {
3
- margin: 1.5rem 0;
4
3
  position: relative;
5
4
  }
6
5
 
7
- /* Badge bar — surface strip */
8
- .rf-lore__badge {
9
- display: flex;
10
- flex-wrap: wrap;
11
- gap: 0.75rem 1.25rem;
12
- align-items: center;
13
- background: var(--rf-color-surface);
14
- border-radius: var(--rf-radius-md);
15
- padding: 0.625rem 1rem;
16
- margin-bottom: 1rem;
17
- }
18
- .rf-lore__category-badge {
19
- font-size: 0.8125rem;
20
- font-weight: 500;
21
- text-transform: capitalize;
22
- color: var(--rf-color-muted);
23
- }
24
- .rf-lore__category-badge::before { content: 'Category: '; font-weight: 400; opacity: 0.65; }
25
-
26
6
  /* Content */
27
7
  .rf-lore__content {
28
8
  transition: filter 0.3s ease;
@@ -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; }
@@ -1,7 +1,4 @@
1
1
  /* MediaText */
2
- .rf-mediatext {
3
- margin: 1.5rem 0;
4
- }
5
2
 
6
3
  /* Grid mode (default — no wrap) */
7
4
  .rf-mediatext:not([data-wrap="true"]) {