@rimelight/ui 0.0.34 → 0.0.35

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 (185) hide show
  1. package/README.md +1 -0
  2. package/package.json +19 -24
  3. package/src/components/astro/RLAAccordion.astro +94 -18
  4. package/src/components/astro/RLAAvatar.astro +135 -68
  5. package/src/components/astro/RLABadge.astro +4 -2
  6. package/src/components/astro/RLABanner.astro +138 -23
  7. package/src/components/astro/RLABreadcrumb.astro +13 -0
  8. package/src/components/astro/RLAButton.astro +8 -4
  9. package/src/components/astro/RLACallout.astro +112 -0
  10. package/src/components/astro/RLACard.astro +6 -5
  11. package/src/components/astro/RLACarousel.astro +104 -75
  12. package/src/components/astro/RLAChart.astro +4 -1
  13. package/src/components/astro/RLAChip.astro +11 -5
  14. package/src/components/astro/RLACollapsible.astro +4 -1
  15. package/src/components/astro/RLAColorArea.astro +432 -0
  16. package/src/components/astro/RLAColorField.astro +300 -0
  17. package/src/components/astro/RLAColorSlider.astro +413 -0
  18. package/src/components/astro/RLAConfirm.astro +13 -11
  19. package/src/components/astro/RLACopyMarkdown.astro +78 -0
  20. package/src/components/astro/RLADate.astro +30 -0
  21. package/src/components/astro/RLADrawer.astro +50 -3
  22. package/src/components/astro/RLADropdownMenu.astro +78 -51
  23. package/src/components/astro/RLAFieldGroup.astro +4 -1
  24. package/src/components/astro/RLAFileUpload.astro +114 -100
  25. package/src/components/astro/RLAFooter.astro +2 -1
  26. package/src/components/astro/RLAFormField.astro +10 -6
  27. package/src/components/astro/RLAGrid.astro +31 -39
  28. package/src/components/astro/RLAHead.astro +139 -39
  29. package/src/components/astro/RLAHeader.astro +2 -1
  30. package/src/components/astro/RLAImage.astro +274 -251
  31. package/src/components/astro/RLAInput.astro +14 -9
  32. package/src/components/astro/RLAInputMenu.astro +119 -83
  33. package/src/components/astro/RLAKbd.astro +5 -5
  34. package/src/components/astro/RLALayoutGrid.astro +395 -0
  35. package/src/components/astro/RLALink.astro +23 -1
  36. package/src/components/astro/RLALinkGroup.astro +99 -99
  37. package/src/components/astro/RLALocaleSelector.astro +29 -35
  38. package/src/components/astro/RLALogo.astro +117 -90
  39. package/src/components/astro/RLAModal.astro +48 -18
  40. package/src/components/astro/RLANavigationMenu.astro +381 -326
  41. package/src/components/astro/{RLADocsPackageManagers.astro → RLAPackageManagers.astro} +81 -87
  42. package/src/components/astro/RLAPageSection.astro +4 -2
  43. package/src/components/astro/RLAPopover.astro +4 -3
  44. package/src/components/astro/RLAPost.astro +11 -2
  45. package/src/components/astro/RLAScrollArea.astro +4 -1
  46. package/src/components/astro/RLAScrollToTop.astro +200 -172
  47. package/src/components/astro/RLASearch.astro +282 -0
  48. package/src/components/astro/RLASelect.astro +78 -55
  49. package/src/components/astro/RLASeparator.astro +11 -6
  50. package/src/components/astro/RLAShare.astro +60 -0
  51. package/src/components/astro/RLAShortcuts.astro +429 -0
  52. package/src/components/astro/RLASidebar.astro +158 -212
  53. package/src/components/astro/RLASlideover.astro +47 -17
  54. package/src/components/astro/RLASplitter.astro +194 -141
  55. package/src/components/astro/RLASteps.astro +118 -71
  56. package/src/components/astro/RLASurround.astro +39 -0
  57. package/src/components/astro/RLATable.astro +4 -1
  58. package/src/components/astro/RLATableOfContents.astro +109 -23
  59. package/src/components/astro/RLATabs.astro +147 -133
  60. package/src/components/astro/RLATextarea.astro +4 -1
  61. package/src/components/astro/RLAThemeSelector.astro +105 -76
  62. package/src/components/astro/RLAToast.astro +35 -21
  63. package/src/components/vue/RLVBanner.vue +230 -0
  64. package/src/components/vue/RLVButton.vue +3 -2
  65. package/src/components/vue/RLVCheckbox.vue +4 -2
  66. package/src/components/vue/RLVFooter.vue +3 -2
  67. package/src/components/vue/RLVHeader.vue +3 -2
  68. package/src/components/vue/RLVIcon.vue +4 -2
  69. package/src/components/vue/RLVInput.vue +5 -4
  70. package/src/components/vue/RLVLogo.vue +25 -3
  71. package/src/components/vue/RLVPlaceholder.vue +3 -2
  72. package/src/components/vue/RLVPost.vue +8 -2
  73. package/src/components/vue/RLVProgress.vue +60 -0
  74. package/src/components/vue/RLVScrollToTop.vue +65 -52
  75. package/src/components/vue/RLVSection.vue +14 -13
  76. package/src/components/vue/RLVToast.vue +17 -4
  77. package/src/composables/index.ts +1 -0
  78. package/src/composables/useHeaderStore.ts +1 -0
  79. package/src/composables/useShortcuts.ts +11 -0
  80. package/src/config/security.ts +43 -36
  81. package/src/config/site.config.ts +1 -0
  82. package/src/docs/components/ApiChangelog.astro +147 -0
  83. package/src/{plugins/starlightDocsApi → docs}/components/ApiEmits.astro +4 -4
  84. package/src/{plugins/starlightDocsApi → docs}/components/ApiProps.astro +4 -4
  85. package/src/{plugins/starlightDocsApi → docs}/components/ApiSlots.astro +4 -4
  86. package/src/docs/components/ApiTheme.astro +100 -0
  87. package/src/docs/extractAll.ts +94 -0
  88. package/src/docs/extractors/extractAstro.ts +69 -0
  89. package/src/docs/extractors/extractTheme.ts +56 -0
  90. package/src/{plugins/starlightDocsApi/extract-vue.ts → docs/extractors/extractVue.ts} +164 -15
  91. package/src/{plugins/starlightDocsApi → docs}/utils.ts +1 -2
  92. package/src/env.d.ts +0 -12
  93. package/src/integrations/ui.ts +35 -19
  94. package/src/middleware/security.ts +75 -19
  95. package/src/presets/index.ts +118 -293
  96. package/src/styles/index.css +0 -2
  97. package/src/themes/accordion.theme.ts +29 -3
  98. package/src/themes/aspect-ratio.theme.ts +1 -1
  99. package/src/themes/avatar-group.theme.ts +1 -1
  100. package/src/themes/avatar.theme.ts +2 -2
  101. package/src/themes/badge.theme.ts +2 -3
  102. package/src/themes/banner.theme.ts +40 -4
  103. package/src/themes/breadcrumb.theme.ts +1 -1
  104. package/src/themes/button.theme.ts +21 -22
  105. package/src/themes/{alert.theme.ts → callout.theme.ts} +12 -39
  106. package/src/themes/card.theme.ts +17 -9
  107. package/src/themes/carousel.theme.ts +1 -1
  108. package/src/themes/checkbox.theme.ts +1 -2
  109. package/src/themes/chip.theme.ts +2 -3
  110. package/src/themes/color-area.theme.ts +33 -0
  111. package/src/themes/color-field.theme.ts +32 -0
  112. package/src/themes/color-slider.theme.ts +34 -0
  113. package/src/themes/confirm.theme.ts +1 -1
  114. package/src/themes/container.theme.ts +1 -1
  115. package/src/themes/drawer.theme.ts +1 -1
  116. package/src/themes/footer.theme.ts +2 -2
  117. package/src/themes/grid.theme.ts +38 -0
  118. package/src/themes/header.theme.ts +4 -3
  119. package/src/themes/hover-card.theme.ts +1 -1
  120. package/src/themes/image.theme.ts +11 -1
  121. package/src/themes/input.theme.ts +7 -1
  122. package/src/themes/kbd.theme.ts +2 -3
  123. package/src/themes/label.theme.ts +1 -1
  124. package/src/themes/layout-grid.theme.ts +16 -0
  125. package/src/themes/link-group.theme.ts +0 -4
  126. package/src/themes/marquee.theme.ts +1 -1
  127. package/src/themes/modal.theme.ts +1 -1
  128. package/src/themes/navigation-menu.theme.ts +2 -2
  129. package/src/themes/page-section.theme.ts +4 -2
  130. package/src/themes/pagination.theme.ts +1 -1
  131. package/src/themes/pin-input.theme.ts +1 -1
  132. package/src/themes/popover.theme.ts +1 -1
  133. package/src/themes/post.theme.ts +23 -3
  134. package/src/themes/progress.theme.ts +1 -2
  135. package/src/themes/scroll-to-top.theme.ts +2 -3
  136. package/src/themes/search.theme.ts +64 -0
  137. package/src/themes/separator.theme.ts +1 -1
  138. package/src/themes/slideover.theme.ts +1 -1
  139. package/src/themes/slider.theme.ts +1 -2
  140. package/src/themes/spinner.theme.ts +1 -2
  141. package/src/themes/{megamenu.theme.ts → steps.theme.ts} +3 -3
  142. package/src/themes/sticky-surface.theme.ts +1 -1
  143. package/src/themes/switch.theme.ts +1 -2
  144. package/src/themes/table-of-contents.theme.ts +21 -2
  145. package/src/themes/timeline.theme.ts +7 -2
  146. package/src/themes/toast.theme.ts +1 -1
  147. package/src/types/components/accordion.ts +35 -2
  148. package/src/types/components/avatar.ts +16 -0
  149. package/src/types/components/banner.ts +42 -0
  150. package/src/types/components/button.ts +3 -4
  151. package/src/types/components/{alert.ts → callout.ts} +6 -6
  152. package/src/types/components/color-area.ts +19 -0
  153. package/src/types/components/color-field.ts +21 -0
  154. package/src/types/components/color-slider.ts +20 -0
  155. package/src/types/components/grid.ts +23 -0
  156. package/src/types/components/input.ts +4 -0
  157. package/src/types/components/layout-grid.ts +145 -0
  158. package/src/types/components/link-group.ts +4 -2
  159. package/src/types/components/link.ts +15 -0
  160. package/src/types/components/logo.ts +3 -3
  161. package/src/types/components/post.ts +12 -0
  162. package/src/types/components/search.ts +29 -0
  163. package/src/types/components/sidebar.ts +2 -6
  164. package/src/types/components/{megamenu.ts → steps.ts} +7 -1
  165. package/src/types/components/table-of-contents.ts +22 -0
  166. package/src/types/components/toast.ts +4 -0
  167. package/src/types/docs.ts +40 -0
  168. package/src/types/index.ts +151 -1
  169. package/src/types/theme.ts +6 -6
  170. package/src/utils/color.ts +165 -0
  171. package/src/utils/docs.ts +260 -110
  172. package/src/utils/headerStack.ts +24 -4
  173. package/src/utils/index.ts +2 -0
  174. package/src/utils/shortcuts.ts +322 -0
  175. package/src/components/TableOfContents.astro +0 -107
  176. package/src/components/astro/RLAAlert.astro +0 -93
  177. package/src/components/astro/RLAChangelog.astro +0 -23
  178. package/src/components/astro/RLAMegamenu.astro +0 -23
  179. package/src/plugins/index.ts +0 -2
  180. package/src/plugins/starlightDocsApi/components/ApiTheme.astro +0 -27
  181. package/src/plugins/starlightDocsApi/index.ts +0 -272
  182. package/src/styles/prism.css +0 -42
  183. package/src/themes/changelog.theme.ts +0 -13
  184. package/src/types/components/index.ts +0 -134
  185. /package/src/{plugins/starlightDocsApi → docs}/types.ts +0 -0
@@ -4,7 +4,10 @@ import { useUi, resolveClasses } from "../../utils"
4
4
  import type { SplitterProps } from "../../types"
5
5
  import splitterThemeDefault, { createSplitterTheme } from "../../themes/splitter.theme"
6
6
 
7
- const splitterTheme = splitterThemeDefault
7
+ import { getUIConfig } from "virtual:rimelight-ui"
8
+
9
+ const uiConfig = getUIConfig()
10
+ const splitterTheme = uiConfig.colors ? createSplitterTheme() : splitterThemeDefault
8
11
  const splitter = scv(splitterTheme)
9
12
 
10
13
  const {
@@ -25,155 +28,205 @@ const sizes = defaultSizes.map(s => (s / (total || 100)) * 100)
25
28
 
26
29
  const panelCount = sizes.length
27
30
  const id = `splitter-${Math.random().toString(36).substring(2, 9)}`
28
- ---
29
31
 
30
- <div
31
- class:list={[classes.root, id]}
32
- data-slot="root"
33
- data-resizable
34
- data-direction={direction}
35
- {...rest}
36
- >
37
- {sizes.map((size, i) => (
38
- <>
39
- <div
40
- class={classes.panel}
41
- data-slot="panel"
42
- data-resizable-panel={i}
43
- >
44
- <slot name={`panel-${i}`}>
45
- {i === 0
46
- ? <slot />
47
- : <slot name="panel" />
48
- }
49
- </slot>
50
- </div>
32
+ const panelContents: string[] = []
33
+ await Promise.all(
34
+ sizes.map(async (_, i) => {
35
+ if (Astro.slots.has(`panel-${i}`)) {
36
+ panelContents[i] = await Astro.slots.render(`panel-${i}`)
37
+ }
38
+ })
39
+ )
40
+ ---
51
41
 
52
- {/* Render a handle between panels, not after the last one */}
53
- {i < panelCount - 1 && (
42
+ <rla-splitter {...rest}>
43
+ <div
44
+ class:list={[classes.root, id]}
45
+ data-slot="root"
46
+ data-resizable
47
+ data-direction={direction}
48
+ >
49
+ {sizes.map((_size, i) => (
50
+ <>
54
51
  <div
55
- class={classes.handle}
56
- data-slot="handle"
57
- data-resizable-handle={i}
58
- role="separator"
59
- aria-orientation={direction === "horizontal" ? "vertical" : "horizontal"}
60
- tabindex={0}
61
- aria-label="Resize panels"
52
+ class={classes.panel}
53
+ data-slot="panel"
54
+ data-resizable-panel={i}
62
55
  >
63
- <span
64
- class={
65
- direction === "horizontal"
66
- ? "i-lucide-grip-vertical size-3.5 text-muted-foreground/50"
67
- : "i-lucide-grip-horizontal size-3.5 text-muted-foreground/50"
68
- }
69
- aria-hidden="true"
70
- />
56
+ {Astro.slots.has(`panel-${i}`) ? (
57
+ <Fragment set:html={panelContents[i]} />
58
+ ) : (
59
+ i === 0
60
+ ? <slot />
61
+ : <slot name="panel" />
62
+ )}
71
63
  </div>
72
- )}
73
- </>
74
- ))}
75
- </div>
76
-
77
- <script>
78
- document.querySelectorAll("[data-resizable]").forEach(container => {
79
- const direction = (container as HTMLElement).dataset.direction ?? "horizontal";
80
- const isHorizontal = direction === "horizontal";
81
-
82
- const panels = Array.from(
83
- container.querySelectorAll("[data-resizable-panel]")
84
- ) as HTMLElement[];
85
-
86
- const handles = Array.from(
87
- container.querySelectorAll("[data-resizable-handle]")
88
- ) as HTMLElement[];
89
-
90
- handles.forEach((handle, idx) => {
91
- const panelA = panels[idx];
92
- const panelB = panels[idx + 1];
93
- if (!panelA || !panelB) return;
94
-
95
- const containerSize = () =>
96
- isHorizontal
97
- ? (container as HTMLElement).clientWidth
98
- : (container as HTMLElement).clientHeight;
99
-
100
- let isDragging = false;
101
- let startPos = 0;
102
- let startASize = 0;
103
- let startBSize = 0;
104
-
105
- const getSize = (el: HTMLElement) =>
106
- isHorizontal ? el.offsetWidth : el.offsetHeight;
107
-
108
- const setSize = (el: HTMLElement, px: number) => {
109
- const pct = (px / containerSize()) * 100;
110
- if (isHorizontal) {
111
- el.style.width = `${pct}%`;
112
- } else {
113
- el.style.height = `${pct}%`;
114
- }
115
- };
116
-
117
- const onMouseMove = (e: MouseEvent) => {
118
- if (!isDragging) return;
119
- const delta = isHorizontal
120
- ? e.clientX - startPos
121
- : e.clientY - startPos;
122
-
123
- const newASize = Math.max(48, startASize + delta);
124
- const newBSize = Math.max(48, startBSize - delta);
125
64
 
126
- // Only resize if both panels have enough space
127
- if (startASize + startBSize - newASize < 48) return;
65
+ {/* Render a handle between panels, not after the last one */}
66
+ {i < panelCount - 1 && (
67
+ <div
68
+ class={classes.handle}
69
+ data-slot="handle"
70
+ data-resizable-handle={i}
71
+ role="separator"
72
+ aria-orientation={direction === "horizontal" ? "vertical" : "horizontal"}
73
+ tabindex={0}
74
+ aria-label="Resize panels"
75
+ >
76
+ <span
77
+ class={
78
+ direction === "horizontal"
79
+ ? "i-lucide-grip-vertical size-3.5 text-muted-foreground/50"
80
+ : "i-lucide-grip-horizontal size-3.5 text-muted-foreground/50"
81
+ }
82
+ aria-hidden="true"
83
+ />
84
+ </div>
85
+ )}
86
+ </>
87
+ ))}
88
+ </div>
89
+ </rla-splitter>
128
90
 
129
- setSize(panelA, newASize);
130
- setSize(panelB, newBSize);
131
- };
132
-
133
- const onMouseUp = () => {
134
- isDragging = false;
135
- document.body.style.cursor = "";
136
- document.body.style.userSelect = "";
137
- handle.classList.remove("bg-primary/30");
138
- document.removeEventListener("mousemove", onMouseMove);
139
- document.removeEventListener("mouseup", onMouseUp);
140
- };
141
-
142
- handle.addEventListener("mousedown", (e) => {
143
- e.preventDefault();
144
- isDragging = true;
145
- startPos = isHorizontal ? e.clientX : e.clientY;
146
- startASize = getSize(panelA);
147
- startBSize = getSize(panelB);
148
- document.body.style.cursor = isHorizontal ? "col-resize" : "row-resize";
149
- document.body.style.userSelect = "none";
150
- handle.classList.add("bg-primary/30");
151
- document.addEventListener("mousemove", onMouseMove);
152
- document.addEventListener("mouseup", onMouseUp);
91
+ <script>
92
+ class RLASplitter extends HTMLElement {
93
+ private splitterCleanup: (() => void) | null = null;
94
+
95
+ connectedCallback() {
96
+ this.style.display = 'contents';
97
+ const container = this.querySelector("[data-resizable]") as HTMLElement | null;
98
+ if (!container) return;
99
+
100
+ const direction = container.dataset.direction ?? "horizontal";
101
+ const isHorizontal = direction === "horizontal";
102
+
103
+ const panels = Array.from(
104
+ container.querySelectorAll("[data-resizable-panel]")
105
+ ) as HTMLElement[];
106
+
107
+ const handles = Array.from(
108
+ container.querySelectorAll("[data-resizable-handle]")
109
+ ) as HTMLElement[];
110
+
111
+ const cleanupFns: (() => void)[] = [];
112
+
113
+ handles.forEach((handle, idx) => {
114
+ const panelA = panels[idx];
115
+ const panelB = panels[idx + 1];
116
+ if (!panelA || !panelB) return;
117
+
118
+ const containerSize = () =>
119
+ isHorizontal
120
+ ? container.clientWidth
121
+ : container.clientHeight;
122
+
123
+ let isDragging = false;
124
+ let startPos = 0;
125
+ let startASize = 0;
126
+ let startBSize = 0;
127
+
128
+ const getSize = (el: HTMLElement) =>
129
+ isHorizontal ? el.offsetWidth : el.offsetHeight;
130
+
131
+ const setSize = (el: HTMLElement, px: number) => {
132
+ const pct = (px / containerSize()) * 100;
133
+ if (isHorizontal) {
134
+ el.style.width = `${pct}%`;
135
+ } else {
136
+ el.style.height = `${pct}%`;
137
+ }
138
+ };
139
+
140
+ const onMouseMove = (e: MouseEvent) => {
141
+ if (!isDragging) return;
142
+ const delta = isHorizontal
143
+ ? e.clientX - startPos
144
+ : e.clientY - startPos;
145
+
146
+ const newASize = Math.max(48, startASize + delta);
147
+ const newBSize = Math.max(48, startBSize - delta);
148
+
149
+ // Only resize if both panels have enough space
150
+ if (startASize + startBSize - newASize < 48) return;
151
+
152
+ setSize(panelA, newASize);
153
+ setSize(panelB, newBSize);
154
+ };
155
+
156
+ const onMouseUp = () => {
157
+ isDragging = false;
158
+ document.body.style.cursor = "";
159
+ document.body.style.userSelect = "";
160
+ handle.classList.remove("bg-primary/30");
161
+ panels.forEach(p => p.style.transition = "");
162
+ document.removeEventListener("mousemove", onMouseMove);
163
+ document.removeEventListener("mouseup", onMouseUp);
164
+ };
165
+
166
+ const onMouseDown = (e: MouseEvent) => {
167
+ e.preventDefault();
168
+ isDragging = true;
169
+ startPos = isHorizontal ? e.clientX : e.clientY;
170
+ startASize = getSize(panelA);
171
+ startBSize = getSize(panelB);
172
+ document.body.style.cursor = isHorizontal ? "col-resize" : "row-resize";
173
+ document.body.style.userSelect = "none";
174
+ handle.classList.add("bg-primary/30");
175
+ panels.forEach(p => p.style.transition = "none");
176
+ document.addEventListener("mousemove", onMouseMove);
177
+ document.addEventListener("mouseup", onMouseUp);
178
+ };
179
+
180
+ handle.addEventListener("mousedown", onMouseDown);
181
+ cleanupFns.push(() => {
182
+ handle.removeEventListener("mousedown", onMouseDown);
183
+ document.removeEventListener("mousemove", onMouseMove);
184
+ document.removeEventListener("mouseup", onMouseUp);
185
+ });
186
+
187
+ // Keyboard resize: arrow keys shift by 2%
188
+ const onKeyDown = (e: KeyboardEvent) => {
189
+ const step = containerSize() * 0.02;
190
+ const forward = isHorizontal
191
+ ? e.key === "ArrowRight"
192
+ : e.key === "ArrowDown";
193
+ const backward = isHorizontal
194
+ ? e.key === "ArrowLeft"
195
+ : e.key === "ArrowUp";
196
+
197
+ if (!forward && !backward) return;
198
+ e.preventDefault();
199
+
200
+ const aSize = getSize(panelA);
201
+ const bSize = getSize(panelB);
202
+ const delta = forward ? step : -step;
203
+
204
+ setSize(panelA, Math.max(48, aSize + delta));
205
+ setSize(panelB, Math.max(48, bSize - delta));
206
+ };
207
+
208
+ handle.addEventListener("keydown", onKeyDown);
209
+ cleanupFns.push(() => {
210
+ handle.removeEventListener("keydown", onKeyDown);
211
+ });
153
212
  });
154
213
 
155
- // Keyboard resize: arrow keys shift by 2%
156
- handle.addEventListener("keydown", (e) => {
157
- const step = containerSize() * 0.02;
158
- const forward = isHorizontal
159
- ? e.key === "ArrowRight"
160
- : e.key === "ArrowDown";
161
- const backward = isHorizontal
162
- ? e.key === "ArrowLeft"
163
- : e.key === "ArrowUp";
164
-
165
- if (!forward && !backward) return;
166
- e.preventDefault();
167
-
168
- const aSize = getSize(panelA);
169
- const bSize = getSize(panelB);
170
- const delta = forward ? step : -step;
171
-
172
- setSize(panelA, Math.max(48, aSize + delta));
173
- setSize(panelB, Math.max(48, bSize - delta));
174
- });
175
- });
176
- });
214
+ this.splitterCleanup = () => {
215
+ cleanupFns.forEach(fn => fn());
216
+ };
217
+ }
218
+
219
+ disconnectedCallback() {
220
+ if (this.splitterCleanup) {
221
+ this.splitterCleanup();
222
+ this.splitterCleanup = null;
223
+ }
224
+ }
225
+ }
226
+
227
+ if (!customElements.get('rla-splitter')) {
228
+ customElements.define('rla-splitter', RLASplitter);
229
+ }
177
230
  </script>
178
231
 
179
232
  <style is:inline set:html={`
@@ -1,71 +1,118 @@
1
- ---
2
- interface Props {
3
- class?: string
4
- }
5
-
6
- const { class: className = "", ...rest } = Astro.props
7
- ---
8
- <div class:list={["rl-steps-container", className]} {...rest}>
9
- <slot />
10
- </div>
11
-
12
- <style is:global>
13
- .rl-steps-container ol {
14
- list-style: none;
15
- counter-reset: steps-counter 0;
16
- padding-inline-start: 0;
17
- margin-top: 1.5rem;
18
- margin-bottom: 1.5rem;
19
- }
20
-
21
- .rl-steps-container ol > li {
22
- counter-increment: steps-counter;
23
- position: relative;
24
- padding-inline-start: 3rem;
25
- padding-bottom: 1.5rem;
26
- min-height: 2.5rem;
27
- }
28
-
29
- .rl-steps-container ol > li + li {
30
- margin-top: 0;
31
- }
32
-
33
- /* Custom bullet */
34
- .rl-steps-container ol > li::before {
35
- content: counter(steps-counter);
36
- position: absolute;
37
- top: 0.125rem;
38
- left: 0;
39
- width: 1.75rem;
40
- height: 1.75rem;
41
- line-height: 1.75rem;
42
- font-size: 0.75rem;
43
- font-weight: 700;
44
- text-align: center;
45
- color: var(--primary-foreground, #fff);
46
- background-color: var(--primary, #3b82f6);
47
- border-radius: 9999px;
48
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
49
- }
50
-
51
- /* Vertical guideline */
52
- .rl-steps-container ol > li::after {
53
- content: '';
54
- position: absolute;
55
- top: 2rem;
56
- bottom: 0.125rem;
57
- left: 0.875rem;
58
- width: 2px;
59
- background-color: var(--border, #e5e7eb);
60
- }
61
-
62
- /* Hide guideline on the last item */
63
- .rl-steps-container ol > li:last-child::after {
64
- display: none;
65
- }
66
-
67
- /* Style headings or paragraphs inside list items nicely */
68
- .rl-steps-container ol > li > :first-child {
69
- margin-top: 0;
70
- }
71
- </style>
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { StepsProps } from "../../types"
5
+ import stepsThemeDefault, { createStepsTheme } from "../../themes/steps.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const uiConfig = getUIConfig()
9
+ const stepsTheme = uiConfig.colors ? createStepsTheme() : stepsThemeDefault
10
+
11
+ const steps = scv(stepsTheme)
12
+
13
+ const {
14
+ size = "md",
15
+ ui: uiProp,
16
+ class: className,
17
+ ...rest
18
+ } = Astro.props as StepsProps
19
+
20
+ const classes = resolveClasses(steps, { size }, useUi("steps", uiProp), className)
21
+ ---
22
+
23
+ <div class:list={[classes.root, "rl-steps"]} data-slot="root" data-size={size} {...rest}>
24
+ <ol class="rl-steps-list">
25
+ <slot />
26
+ </ol>
27
+ </div>
28
+
29
+ <style is:inline>
30
+ .rl-steps-list {
31
+ list-style: none;
32
+ counter-reset: rl-step 0;
33
+ padding: 0;
34
+ margin: 0;
35
+ display: flex;
36
+ flex-direction: column;
37
+ }
38
+
39
+ .rl-steps-list > li {
40
+ counter-increment: rl-step;
41
+ position: relative;
42
+ padding-left: 2.625rem;
43
+ padding-bottom: 1.75rem;
44
+ margin: 0;
45
+ }
46
+
47
+ .rl-steps-list > li:last-child {
48
+ padding-bottom: 0;
49
+ }
50
+
51
+ .rl-steps-list > li::before {
52
+ content: counter(rl-step);
53
+ position: absolute;
54
+ left: 0;
55
+ top: 0.125rem;
56
+ display: flex;
57
+ align-items: center;
58
+ justify-content: center;
59
+ width: 1.75rem;
60
+ height: 1.75rem;
61
+ border-radius: 9999px;
62
+ font-size: 0.75rem;
63
+ font-weight: 700;
64
+ line-height: 1;
65
+ color: var(--color-primary-foreground, #fff);
66
+ background-color: var(--color-primary, #3b82f6);
67
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
68
+ z-index: 1;
69
+ }
70
+
71
+ .rl-steps-list > li::after {
72
+ content: '';
73
+ position: absolute;
74
+ left: calc(0.875rem - 1px);
75
+ top: calc(1.75rem + 0.375rem);
76
+ bottom: 0;
77
+ width: 2px;
78
+ background-color: var(--color-border, #e5e7eb);
79
+ }
80
+
81
+ .rl-steps-list > li:last-child::after {
82
+ display: none;
83
+ }
84
+
85
+ .rl-steps-list > li > :first-child {
86
+ margin-top: 0;
87
+ }
88
+
89
+ /* size: sm */
90
+ [data-size="sm"] .rl-steps-list > li {
91
+ padding-left: 2rem;
92
+ padding-bottom: 1.25rem;
93
+ }
94
+ [data-size="sm"] .rl-steps-list > li::before {
95
+ width: 1.375rem;
96
+ height: 1.375rem;
97
+ font-size: 0.625rem;
98
+ }
99
+ [data-size="sm"] .rl-steps-list > li::after {
100
+ left: calc(0.6875rem - 1px);
101
+ top: calc(1.375rem + 0.375rem);
102
+ }
103
+
104
+ /* size: lg */
105
+ [data-size="lg"] .rl-steps-list > li {
106
+ padding-left: 3.25rem;
107
+ padding-bottom: 2.25rem;
108
+ }
109
+ [data-size="lg"] .rl-steps-list > li::before {
110
+ width: 2.25rem;
111
+ height: 2.25rem;
112
+ font-size: 0.875rem;
113
+ }
114
+ [data-size="lg"] .rl-steps-list > li::after {
115
+ left: calc(1.125rem - 1px);
116
+ top: calc(2.25rem + 0.375rem);
117
+ }
118
+ </style>
@@ -0,0 +1,39 @@
1
+ ---
2
+ export interface SurroundItem {
3
+ label: string;
4
+ href: string;
5
+ }
6
+
7
+ export interface Props {
8
+ prev?: SurroundItem | null;
9
+ next?: SurroundItem | null;
10
+ }
11
+
12
+ const { prev, next } = Astro.props;
13
+ ---
14
+
15
+ {(prev || next) && (
16
+ <div class="mt-12 pt-6 border-t border-border flex justify-between gap-4">
17
+ {prev ? (
18
+ <a href={prev.href} class="flex flex-col gap-1 text-left group no-underline max-w-[45%]">
19
+ <span class="text-xs text-muted-foreground font-medium flex items-center gap-1 group-hover:text-primary transition-colors">
20
+ <span class="i-lucide-arrow-left size-3" /> Previous
21
+ </span>
22
+ <span class="text-sm font-semibold text-foreground group-hover:text-primary transition-colors truncate">
23
+ {prev.label}
24
+ </span>
25
+ </a>
26
+ ) : <div />}
27
+
28
+ {next ? (
29
+ <a href={next.href} class="flex flex-col gap-1 text-right group no-underline max-w-[45%]">
30
+ <span class="text-xs text-muted-foreground font-medium flex items-center justify-end gap-1 group-hover:text-primary transition-colors">
31
+ Next <span class="i-lucide-arrow-right size-3" />
32
+ </span>
33
+ <span class="text-sm font-semibold text-foreground group-hover:text-primary transition-colors truncate">
34
+ {next.label}
35
+ </span>
36
+ </a>
37
+ ) : <div />}
38
+ </div>
39
+ )}
@@ -4,7 +4,10 @@ import { useUi, resolveClasses } from "../../utils"
4
4
  import type { TableProps } from "../../types"
5
5
  import tableThemeDefault, { createTableTheme } from "../../themes/table.theme"
6
6
 
7
- const tableTheme = tableThemeDefault
7
+ import { getUIConfig } from "virtual:rimelight-ui"
8
+
9
+ const uiConfig = getUIConfig()
10
+ const tableTheme = uiConfig.colors ? createTableTheme() : tableThemeDefault
8
11
  const table = scv(tableTheme)
9
12
 
10
13
  const {