@rimelight/ui 0.0.33 → 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 (389) hide show
  1. package/README.md +158 -157
  2. package/package.json +100 -105
  3. package/src/components/astro/RLAAccordion.astro +94 -18
  4. package/src/components/astro/RLAAspectRatio.astro +2 -2
  5. package/src/components/astro/RLAAvatar.astro +135 -68
  6. package/src/components/astro/RLABadge.astro +4 -2
  7. package/src/components/astro/RLABanner.astro +138 -23
  8. package/src/components/astro/RLABreadcrumb.astro +13 -0
  9. package/src/components/astro/RLAButton.astro +145 -139
  10. package/src/components/astro/RLACallout.astro +112 -0
  11. package/src/components/astro/RLACard.astro +6 -5
  12. package/src/components/astro/RLACarousel.astro +104 -75
  13. package/src/components/astro/RLAChart.astro +23 -35
  14. package/src/components/astro/RLAChip.astro +11 -5
  15. package/src/components/astro/RLACollapsible.astro +4 -1
  16. package/src/components/astro/RLAColorArea.astro +432 -0
  17. package/src/components/astro/RLAColorField.astro +300 -0
  18. package/src/components/astro/RLAColorSlider.astro +413 -0
  19. package/src/components/astro/RLAConfirm.astro +13 -11
  20. package/src/components/astro/RLACopyMarkdown.astro +78 -0
  21. package/src/components/astro/RLADate.astro +30 -0
  22. package/src/components/astro/RLADrawer.astro +50 -3
  23. package/src/components/astro/RLADropdownMenu.astro +78 -51
  24. package/src/components/astro/RLAFieldGroup.astro +4 -1
  25. package/src/components/astro/RLAFileUpload.astro +114 -100
  26. package/src/components/astro/RLAFooter.astro +2 -1
  27. package/src/components/astro/RLAFormField.astro +10 -6
  28. package/src/components/astro/RLAGrid.astro +31 -39
  29. package/src/components/astro/RLAHead.astro +528 -197
  30. package/src/components/astro/RLAHeader.astro +67 -59
  31. package/src/components/astro/RLAImage.astro +274 -209
  32. package/src/components/astro/RLAInput.astro +14 -9
  33. package/src/components/astro/RLAInputMenu.astro +119 -83
  34. package/src/components/astro/RLAKbd.astro +5 -5
  35. package/src/components/astro/RLALayoutGrid.astro +395 -0
  36. package/src/components/astro/RLALink.astro +44 -23
  37. package/src/components/astro/RLALinkGroup.astro +99 -37
  38. package/src/components/astro/RLALocaleSelector.astro +130 -113
  39. package/src/components/astro/RLALogo.astro +117 -90
  40. package/src/components/astro/RLAMain.astro +8 -3
  41. package/src/components/astro/RLAMarquee.astro +9 -2
  42. package/src/components/astro/RLAModal.astro +48 -18
  43. package/src/components/astro/RLANavigationMenu.astro +381 -137
  44. package/src/components/astro/{RLADocsPackageManagers.astro → RLAPackageManagers.astro} +81 -87
  45. package/src/components/astro/RLAPageSection.astro +4 -2
  46. package/src/components/astro/RLAPagination.astro +2 -4
  47. package/src/components/astro/RLAPopover.astro +4 -3
  48. package/src/components/astro/RLAPost.astro +11 -2
  49. package/src/components/astro/RLAProgress.astro +8 -2
  50. package/src/components/astro/RLAScrollArea.astro +4 -1
  51. package/src/components/astro/RLAScrollToTop.astro +200 -172
  52. package/src/components/astro/RLASearch.astro +282 -0
  53. package/src/components/astro/RLASelect.astro +101 -64
  54. package/src/components/astro/RLASeparator.astro +11 -6
  55. package/src/components/astro/RLAShare.astro +60 -0
  56. package/src/components/astro/RLAShortcuts.astro +429 -0
  57. package/src/components/astro/RLASidebar.astro +158 -212
  58. package/src/components/astro/RLASlideover.astro +99 -4
  59. package/src/components/astro/RLASlider.astro +14 -14
  60. package/src/components/astro/RLASplitter.astro +207 -142
  61. package/src/components/astro/RLASteps.astro +118 -71
  62. package/src/components/astro/RLAStickySurface.astro +9 -2
  63. package/src/components/astro/RLASurround.astro +39 -0
  64. package/src/components/astro/RLATable.astro +4 -1
  65. package/src/components/astro/RLATableOfContents.astro +109 -23
  66. package/src/components/astro/RLATabs.astro +147 -133
  67. package/src/components/astro/RLATextarea.astro +4 -1
  68. package/src/components/astro/RLAThemeSelector.astro +105 -76
  69. package/src/components/astro/RLAToast.astro +35 -21
  70. package/src/components/vue/RLVBanner.vue +230 -0
  71. package/src/components/vue/RLVButton.vue +3 -2
  72. package/src/components/vue/RLVCheckbox.vue +70 -68
  73. package/src/components/vue/RLVFooter.vue +3 -2
  74. package/src/components/vue/RLVForm.vue +44 -44
  75. package/src/components/vue/RLVFormField.vue +58 -58
  76. package/src/components/vue/RLVHeader.vue +3 -2
  77. package/src/components/vue/RLVIcon.vue +4 -2
  78. package/src/components/vue/RLVInput.vue +94 -93
  79. package/src/components/vue/RLVLogo.vue +25 -3
  80. package/src/components/vue/RLVPlaceholder.vue +3 -2
  81. package/src/components/vue/RLVPost.vue +69 -63
  82. package/src/components/vue/RLVPosts.vue +21 -21
  83. package/src/components/vue/RLVProgress.vue +60 -0
  84. package/src/components/vue/RLVScrollToTop.vue +65 -52
  85. package/src/components/vue/RLVSection.vue +14 -13
  86. package/src/components/vue/RLVToast.vue +81 -68
  87. package/src/components/vue/RLVToaster.vue +29 -29
  88. package/src/composables/index.ts +4 -3
  89. package/src/composables/useHeaderStore.ts +14 -14
  90. package/src/composables/useScrollToTop.ts +62 -62
  91. package/src/composables/useShortcuts.ts +11 -0
  92. package/src/composables/useToast.ts +43 -42
  93. package/src/config/index.ts +1 -0
  94. package/src/config/security.ts +227 -0
  95. package/src/config/site.config.ts +1 -0
  96. package/src/docs/components/ApiChangelog.astro +147 -0
  97. package/src/{plugins/starlightDocsApi → docs}/components/ApiEmits.astro +4 -4
  98. package/src/{plugins/starlightDocsApi → docs}/components/ApiProps.astro +4 -4
  99. package/src/{plugins/starlightDocsApi → docs}/components/ApiSlots.astro +4 -4
  100. package/src/docs/components/ApiTheme.astro +100 -0
  101. package/src/docs/extractAll.ts +94 -0
  102. package/src/docs/extractors/extractAstro.ts +69 -0
  103. package/src/docs/extractors/extractTheme.ts +56 -0
  104. package/src/{plugins/starlightDocsApi/extract-vue.ts → docs/extractors/extractVue.ts} +164 -15
  105. package/src/{plugins/starlightDocsApi → docs}/utils.ts +1 -2
  106. package/src/env.d.ts +0 -12
  107. package/src/integrations/ui.ts +215 -199
  108. package/src/middleware/security.ts +145 -29
  109. package/src/presets/defaults.ts +297 -297
  110. package/src/presets/index.ts +508 -637
  111. package/src/styles/index.css +158 -160
  112. package/src/themes/3d-hover.theme.ts +13 -13
  113. package/src/themes/accordion.theme.ts +39 -13
  114. package/src/themes/app.theme.ts +13 -13
  115. package/src/themes/aspect-ratio.theme.ts +1 -1
  116. package/src/themes/audio.theme.ts +13 -13
  117. package/src/themes/avatar-group.theme.ts +1 -1
  118. package/src/themes/avatar.theme.ts +84 -84
  119. package/src/themes/badge.theme.ts +168 -163
  120. package/src/themes/banner.theme.ts +49 -13
  121. package/src/themes/breadcrumb.theme.ts +1 -1
  122. package/src/themes/browser-mockup.theme.ts +13 -13
  123. package/src/themes/button.theme.ts +223 -202
  124. package/src/themes/calendar.theme.ts +13 -13
  125. package/src/themes/{alert.theme.ts → callout.theme.ts} +104 -125
  126. package/src/themes/card.theme.ts +50 -42
  127. package/src/themes/carousel.theme.ts +1 -1
  128. package/src/themes/chart.theme.ts +22 -22
  129. package/src/themes/chat-message.theme.ts +13 -13
  130. package/src/themes/chat-messages.theme.ts +13 -13
  131. package/src/themes/chat-palette.theme.ts +13 -13
  132. package/src/themes/chat-prompt-submit.theme.ts +13 -13
  133. package/src/themes/chat-prompt.theme.ts +13 -13
  134. package/src/themes/chat-reasoning.theme.ts +13 -13
  135. package/src/themes/chat-shimmer.theme.ts +13 -13
  136. package/src/themes/chat-tool.theme.ts +13 -13
  137. package/src/themes/chat.theme.ts +13 -13
  138. package/src/themes/checkbox.theme.ts +49 -50
  139. package/src/themes/chip.theme.ts +73 -74
  140. package/src/themes/color-area.theme.ts +33 -0
  141. package/src/themes/color-field.theme.ts +32 -0
  142. package/src/themes/color-picker.theme.ts +13 -13
  143. package/src/themes/color-slider.theme.ts +34 -0
  144. package/src/themes/command-palette.theme.ts +13 -13
  145. package/src/themes/compare.theme.ts +13 -13
  146. package/src/themes/confirm.theme.ts +48 -48
  147. package/src/themes/container.theme.ts +13 -13
  148. package/src/themes/context-menu.theme.ts +13 -13
  149. package/src/themes/dashboard-group.theme.ts +13 -13
  150. package/src/themes/dashboard-navbar.theme.ts +13 -13
  151. package/src/themes/dashboard-panel.theme.ts +13 -13
  152. package/src/themes/dashboard-resize-handle.theme.ts +13 -13
  153. package/src/themes/dashboard-search-button.theme.ts +13 -13
  154. package/src/themes/dashboard-search.theme.ts +13 -13
  155. package/src/themes/dashboard-sidebar-collapse.theme.ts +13 -13
  156. package/src/themes/dashboard-sidebar-toggle.theme.ts +13 -13
  157. package/src/themes/dashboard-sidebar.theme.ts +13 -13
  158. package/src/themes/dashboard-toolbar.theme.ts +13 -13
  159. package/src/themes/dock.theme.ts +13 -13
  160. package/src/themes/drawer.theme.ts +61 -61
  161. package/src/themes/dropdown-menu.theme.ts +29 -29
  162. package/src/themes/editor.theme.ts +13 -13
  163. package/src/themes/empty.theme.ts +13 -13
  164. package/src/themes/error.theme.ts +13 -13
  165. package/src/themes/field-group.theme.ts +24 -24
  166. package/src/themes/fieldset.theme.ts +13 -13
  167. package/src/themes/floating-action.theme.ts +13 -13
  168. package/src/themes/footer.theme.ts +30 -30
  169. package/src/themes/form.theme.ts +13 -13
  170. package/src/themes/gallery.theme.ts +13 -13
  171. package/src/themes/grid.theme.ts +38 -0
  172. package/src/themes/head.theme.ts +13 -13
  173. package/src/themes/header.theme.ts +46 -46
  174. package/src/themes/hover-card.theme.ts +1 -1
  175. package/src/themes/icon.theme.ts +23 -23
  176. package/src/themes/image.theme.ts +33 -19
  177. package/src/themes/input-date.theme.ts +13 -13
  178. package/src/themes/input-menu.theme.ts +35 -35
  179. package/src/themes/input-number.theme.ts +13 -13
  180. package/src/themes/input-tags.theme.ts +13 -13
  181. package/src/themes/input-time.theme.ts +13 -13
  182. package/src/themes/input.theme.ts +48 -42
  183. package/src/themes/kbd.theme.ts +94 -89
  184. package/src/themes/knob.theme.ts +13 -13
  185. package/src/themes/label.theme.ts +1 -1
  186. package/src/themes/layout-grid.theme.ts +16 -0
  187. package/src/themes/link-group.theme.ts +28 -32
  188. package/src/themes/link.theme.ts +13 -13
  189. package/src/themes/listbox.theme.ts +13 -13
  190. package/src/themes/locale-selector.theme.ts +49 -49
  191. package/src/themes/logo.theme.ts +13 -13
  192. package/src/themes/main.theme.ts +13 -13
  193. package/src/themes/marquee.theme.ts +1 -1
  194. package/src/themes/meter.theme.ts +13 -13
  195. package/src/themes/modal.theme.ts +1 -1
  196. package/src/themes/navigation-menu.theme.ts +44 -27
  197. package/src/themes/page-aside.theme.ts +13 -13
  198. package/src/themes/page-body.theme.ts +13 -13
  199. package/src/themes/page-header.theme.ts +13 -13
  200. package/src/themes/page-section.theme.ts +189 -187
  201. package/src/themes/page.theme.ts +13 -13
  202. package/src/themes/pagination.theme.ts +1 -1
  203. package/src/themes/password.theme.ts +13 -13
  204. package/src/themes/phone-mockup.theme.ts +13 -13
  205. package/src/themes/pin-input.theme.ts +1 -1
  206. package/src/themes/placeholder.theme.ts +15 -15
  207. package/src/themes/popover.theme.ts +1 -1
  208. package/src/themes/post.theme.ts +53 -33
  209. package/src/themes/pricing-plan.theme.ts +13 -13
  210. package/src/themes/pricing-table.theme.ts +13 -13
  211. package/src/themes/progress.theme.ts +37 -38
  212. package/src/themes/prose.theme.ts +13 -13
  213. package/src/themes/qr-code.theme.ts +13 -13
  214. package/src/themes/quote.theme.ts +13 -13
  215. package/src/themes/radio-group.theme.ts +13 -13
  216. package/src/themes/rating.theme.ts +13 -13
  217. package/src/themes/scroll-area.theme.ts +26 -26
  218. package/src/themes/scroll-to-top.theme.ts +51 -52
  219. package/src/themes/search.theme.ts +64 -0
  220. package/src/themes/select.theme.ts +29 -29
  221. package/src/themes/separator.theme.ts +147 -147
  222. package/src/themes/sidebar.theme.ts +38 -38
  223. package/src/themes/skeleton.theme.ts +21 -21
  224. package/src/themes/slideover.theme.ts +5 -5
  225. package/src/themes/slider.theme.ts +35 -36
  226. package/src/themes/speed-dial.theme.ts +13 -13
  227. package/src/themes/spinner.theme.ts +33 -34
  228. package/src/themes/splitter.theme.ts +23 -23
  229. package/src/themes/spoiler.theme.ts +13 -13
  230. package/src/themes/stepper.theme.ts +13 -13
  231. package/src/themes/{megamenu.theme.ts → steps.theme.ts} +13 -13
  232. package/src/themes/sticky-surface.theme.ts +1 -1
  233. package/src/themes/switch.theme.ts +66 -67
  234. package/src/themes/table-of-contents.theme.ts +67 -48
  235. package/src/themes/tabs.theme.ts +52 -52
  236. package/src/themes/textarea.theme.ts +27 -27
  237. package/src/themes/theme-selector.theme.ts +15 -15
  238. package/src/themes/timeline.theme.ts +18 -13
  239. package/src/themes/toast.theme.ts +31 -31
  240. package/src/themes/tooltip.theme.ts +28 -28
  241. package/src/themes/tour.theme.ts +13 -13
  242. package/src/themes/tree.theme.ts +13 -13
  243. package/src/themes/user.theme.ts +13 -13
  244. package/src/themes/video.theme.ts +17 -17
  245. package/src/themes/watermark.theme.ts +13 -13
  246. package/src/themes/window-mockup.theme.ts +13 -13
  247. package/src/types/components/3d-hover.ts +11 -11
  248. package/src/types/components/accordion.ts +35 -2
  249. package/src/types/components/app.ts +11 -11
  250. package/src/types/components/audio.ts +11 -11
  251. package/src/types/components/avatar-group.ts +11 -11
  252. package/src/types/components/avatar.ts +76 -60
  253. package/src/types/components/badge.ts +2 -2
  254. package/src/types/components/banner.ts +53 -11
  255. package/src/types/components/browser-mockup.ts +11 -11
  256. package/src/types/components/button.ts +73 -81
  257. package/src/types/components/calendar.ts +11 -11
  258. package/src/types/components/{alert.ts → callout.ts} +8 -8
  259. package/src/types/components/changelog.ts +11 -11
  260. package/src/types/components/chart.ts +2 -1
  261. package/src/types/components/chat-message.ts +11 -11
  262. package/src/types/components/chat-messages.ts +11 -11
  263. package/src/types/components/chat-palette.ts +11 -11
  264. package/src/types/components/chat-prompt-submit.ts +11 -11
  265. package/src/types/components/chat-prompt.ts +11 -11
  266. package/src/types/components/chat-reasoning.ts +11 -11
  267. package/src/types/components/chat-shimmer.ts +11 -11
  268. package/src/types/components/chat-tool.ts +11 -11
  269. package/src/types/components/chat.ts +11 -11
  270. package/src/types/components/checkbox.ts +2 -2
  271. package/src/types/components/chip.ts +17 -17
  272. package/src/types/components/collapsible.ts +2 -1
  273. package/src/types/components/color-area.ts +19 -0
  274. package/src/types/components/color-field.ts +21 -0
  275. package/src/types/components/color-picker.ts +11 -11
  276. package/src/types/components/color-slider.ts +20 -0
  277. package/src/types/components/command-palette.ts +11 -11
  278. package/src/types/components/compare.ts +11 -11
  279. package/src/types/components/container.ts +17 -17
  280. package/src/types/components/context-menu.ts +11 -11
  281. package/src/types/components/dashboard-group.ts +11 -11
  282. package/src/types/components/dashboard-navbar.ts +11 -11
  283. package/src/types/components/dashboard-panel.ts +11 -11
  284. package/src/types/components/dashboard-resize-handle.ts +11 -11
  285. package/src/types/components/dashboard-search-button.ts +11 -11
  286. package/src/types/components/dashboard-search.ts +11 -11
  287. package/src/types/components/dashboard-sidebar-collapse.ts +11 -11
  288. package/src/types/components/dashboard-sidebar-toggle.ts +11 -11
  289. package/src/types/components/dashboard-sidebar.ts +11 -11
  290. package/src/types/components/dashboard-toolbar.ts +11 -11
  291. package/src/types/components/dock.ts +11 -11
  292. package/src/types/components/dropdown-menu.ts +2 -1
  293. package/src/types/components/editor.ts +11 -11
  294. package/src/types/components/empty.ts +11 -11
  295. package/src/types/components/error.ts +11 -11
  296. package/src/types/components/fieldset.ts +11 -11
  297. package/src/types/components/file-upload.ts +2 -1
  298. package/src/types/components/floating-action.ts +11 -11
  299. package/src/types/components/form.ts +19 -19
  300. package/src/types/components/gallery.ts +11 -11
  301. package/src/types/components/grid.ts +23 -0
  302. package/src/types/components/icon.ts +19 -19
  303. package/src/types/components/image.ts +32 -28
  304. package/src/types/components/input-date.ts +11 -11
  305. package/src/types/components/input-menu.ts +44 -43
  306. package/src/types/components/input-number.ts +11 -11
  307. package/src/types/components/input-pin.ts +36 -35
  308. package/src/types/components/input-tags.ts +11 -11
  309. package/src/types/components/input-time.ts +11 -11
  310. package/src/types/components/input.ts +6 -2
  311. package/src/types/components/knob.ts +11 -11
  312. package/src/types/components/layout-grid.ts +145 -0
  313. package/src/types/components/link-group.ts +47 -23
  314. package/src/types/components/link.ts +19 -0
  315. package/src/types/components/listbox.ts +11 -11
  316. package/src/types/components/locale-selector.ts +33 -33
  317. package/src/types/components/logo.ts +32 -31
  318. package/src/types/components/main.ts +17 -17
  319. package/src/types/components/meter.ts +11 -11
  320. package/src/types/components/modal.ts +39 -39
  321. package/src/types/components/navigation-menu.ts +59 -54
  322. package/src/types/components/page-aside.ts +11 -11
  323. package/src/types/components/page-body.ts +11 -11
  324. package/src/types/components/page-header.ts +11 -11
  325. package/src/types/components/page.ts +11 -11
  326. package/src/types/components/password.ts +11 -11
  327. package/src/types/components/phone-mockup.ts +5 -5
  328. package/src/types/components/pin-input.ts +11 -11
  329. package/src/types/components/popover.ts +23 -23
  330. package/src/types/components/post.ts +47 -35
  331. package/src/types/components/pricing-plan.ts +11 -11
  332. package/src/types/components/pricing-table.ts +11 -11
  333. package/src/types/components/progress.ts +33 -33
  334. package/src/types/components/prose.ts +11 -11
  335. package/src/types/components/qr-code.ts +11 -11
  336. package/src/types/components/radio-group.ts +11 -11
  337. package/src/types/components/rating.ts +11 -11
  338. package/src/types/components/scroll-area.ts +23 -23
  339. package/src/types/components/scroll-to-top.ts +2 -2
  340. package/src/types/components/search.ts +29 -0
  341. package/src/types/components/select.ts +2 -1
  342. package/src/types/components/separator.ts +19 -19
  343. package/src/types/components/sidebar.ts +83 -72
  344. package/src/types/components/slideover.ts +31 -31
  345. package/src/types/components/slider.ts +2 -2
  346. package/src/types/components/speed-dial.ts +11 -11
  347. package/src/types/components/spinner.ts +25 -25
  348. package/src/types/components/splitter.ts +19 -19
  349. package/src/types/components/spoiler.ts +11 -11
  350. package/src/types/components/stepper.ts +11 -11
  351. package/src/types/components/{megamenu.ts → steps.ts} +17 -11
  352. package/src/types/components/sticky-surface.ts +19 -19
  353. package/src/types/components/switch.ts +41 -41
  354. package/src/types/components/table-of-contents.ts +39 -17
  355. package/src/types/components/tabs.ts +2 -1
  356. package/src/types/components/textarea.ts +2 -1
  357. package/src/types/components/theme-selector.ts +15 -15
  358. package/src/types/components/timeline.ts +11 -11
  359. package/src/types/components/toast.ts +6 -1
  360. package/src/types/components/tooltip.ts +23 -23
  361. package/src/types/components/tour.ts +11 -11
  362. package/src/types/components/tree.ts +11 -11
  363. package/src/types/components/user.ts +11 -11
  364. package/src/types/components/watermark.ts +11 -11
  365. package/src/types/components/window-mockup.ts +11 -11
  366. package/src/types/docs.ts +40 -0
  367. package/src/types/index.ts +151 -1
  368. package/src/types/theme.ts +11 -1
  369. package/src/utils/color.ts +165 -0
  370. package/src/utils/docs.ts +365 -189
  371. package/src/utils/headerStack.ts +115 -95
  372. package/src/utils/index.ts +7 -5
  373. package/src/utils/shortcuts.ts +322 -0
  374. package/src/components/TableOfContents.astro +0 -107
  375. package/src/components/astro/RLAAlert.astro +0 -93
  376. package/src/components/astro/RLABlogPost.astro +0 -7
  377. package/src/components/astro/RLABlogPosts.astro +0 -9
  378. package/src/components/astro/RLAChangelog.astro +0 -23
  379. package/src/components/astro/RLAMegamenu.astro +0 -23
  380. package/src/components/astro/RLAPosts.astro +0 -23
  381. package/src/plugins/index.ts +0 -2
  382. package/src/plugins/starlightDocsApi/components/ApiTheme.astro +0 -27
  383. package/src/plugins/starlightDocsApi/index.ts +0 -272
  384. package/src/styles/prism.css +0 -42
  385. package/src/themes/changelog.theme.ts +0 -13
  386. package/src/themes/posts.theme.ts +0 -13
  387. package/src/types/components/index.ts +0 -135
  388. package/src/types/components/posts.ts +0 -11
  389. /package/src/{plugins/starlightDocsApi → docs}/types.ts +0 -0
@@ -0,0 +1,395 @@
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { LayoutGridProps } from "../../types"
5
+ import layoutGridThemeDefault, { createLayoutGridTheme } from "../../themes/layout-grid.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const uiConfig = getUIConfig()
9
+ const layoutGridTheme = uiConfig.colors ? createLayoutGridTheme() : layoutGridThemeDefault
10
+ const layoutGrid = scv(layoutGridTheme)
11
+
12
+ const {
13
+ cols = 4,
14
+ smCols = 4,
15
+ mdCols = 8,
16
+ lgCols = 12,
17
+ xlCols = 12,
18
+ smBreakpoint = 640,
19
+ mdBreakpoint = 768,
20
+ lgBreakpoint = 1024,
21
+ xlBreakpoint = 1280,
22
+ gutter = [0.75, 1, 1.5, 1.5, 1.5],
23
+ margin = [0.75, 1, 1.5, 1.5, 1.5],
24
+ gridColor = "#ff0000",
25
+ gridOpacity = 0.1,
26
+ maxWidth = "1440px",
27
+ innerMaxWidth = "768px",
28
+ innerGridColor = "#10b981",
29
+ innerGridOpacity = 0.1,
30
+ showInnerBackground = true,
31
+ showBackground = true,
32
+ showFullWidth = true,
33
+ fullWidthGridColor = "#3b82f6",
34
+ fullWidthGridOpacity = 0.05,
35
+ showFullWidthBackground = true,
36
+ zIndex = 1000,
37
+ shortcut = "meta_shift_g",
38
+ devOnly = true,
39
+ ui: uiProp,
40
+ class: className,
41
+ ...rest
42
+ } = Astro.props as LayoutGridProps
43
+
44
+ const isDev = import.meta.env.DEV
45
+ const shouldRender = !devOnly || isDev
46
+
47
+ const normalizeArray = (val: number | number[] | undefined, defaultVal: number): number[] => {
48
+ if (val === undefined) return [defaultVal, defaultVal, defaultVal, defaultVal, defaultVal]
49
+ if (!Array.isArray(val)) return [val, val, val, val, val]
50
+ const arr = [...val]
51
+ while (arr.length < 5) {
52
+ const lastVal = arr[arr.length - 1]
53
+ arr.push(lastVal !== undefined ? lastVal : defaultVal)
54
+ }
55
+ return arr
56
+ }
57
+
58
+ const gutterArray = normalizeArray(gutter, 1)
59
+ const marginArray = normalizeArray(margin, 1)
60
+
61
+ const classes = resolveClasses(layoutGrid, {}, useUi("layoutGrid", uiProp), className)
62
+ ---
63
+
64
+ {shouldRender && (
65
+ <rla-layout-grid
66
+ class={classes.root}
67
+ data-cols={cols}
68
+ data-sm-cols={smCols}
69
+ data-md-cols={mdCols}
70
+ data-lg-cols={lgCols}
71
+ data-xl-cols={xlCols}
72
+ data-sm-breakpoint={smBreakpoint}
73
+ data-md-breakpoint={mdBreakpoint}
74
+ data-lg-breakpoint={lgBreakpoint}
75
+ data-xl-breakpoint={xlBreakpoint}
76
+ data-gutter={JSON.stringify(gutterArray)}
77
+ data-margin={JSON.stringify(marginArray)}
78
+ data-grid-color={gridColor}
79
+ data-grid-opacity={gridOpacity}
80
+ data-show-background={showBackground ? "true" : "false"}
81
+ data-max-width={maxWidth}
82
+ data-inner-max-width={innerMaxWidth}
83
+ data-inner-color={innerGridColor}
84
+ data-inner-opacity={innerGridOpacity}
85
+ data-show-inner-background={showInnerBackground ? "true" : "false"}
86
+ data-show-full-width={showFullWidth ? "true" : "false"}
87
+ data-full-width-color={fullWidthGridColor}
88
+ data-full-width-opacity={fullWidthGridOpacity}
89
+ data-show-full-width-background={showFullWidthBackground ? "true" : "false"}
90
+ data-shortcut={shortcut}
91
+ {...rest}
92
+ >
93
+ <aside class={classes.overlay} data-slot="overlay" style={`z-index: ${zIndex}; display: none;`} id="rla-layout-grid-overlay">
94
+ <!-- Container holding absolutely-positioned viewport columns -->
95
+ <div style="position: relative; width: 100%; height: 100%;" data-slot="columns-container"></div>
96
+ <div data-slot="indicator" style="position: fixed; bottom: 20px; right: 20px; background: rgba(0,0,0,0.85); color: #fff; padding: 6px 12px; border-radius: 6px; font-family: var(--font-mono, monospace); font-size: 11px; font-weight: bold; pointer-events: none; border: 1px solid rgba(255,255,255,0.15); box-shadow: 0 4px 12px rgba(0,0,0,0.5); letter-spacing: 0.05em; display: flex; align-items: center; gap: 8px;"></div>
97
+ </aside>
98
+ </rla-layout-grid>
99
+ )}
100
+
101
+ <script>
102
+ import { defineShortcuts } from "../../utils/shortcuts"
103
+
104
+ function hexToRgba(hex: string, alpha: number): string {
105
+ const cleanHex = hex.replace('#', '')
106
+ const num = parseInt(cleanHex, 16)
107
+ const r = (num >> 16) & 255
108
+ const g = (num >> 8) & 255
109
+ const b = num & 255
110
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`
111
+ }
112
+
113
+ class RLALayoutGrid extends HTMLElement {
114
+ private isVisible = false
115
+ private gridElement: HTMLElement | null = null
116
+ private columnsContainer: HTMLElement | null = null
117
+ private indicatorElement: HTMLElement | null = null
118
+ private resizeObserver: ResizeObserver | null = null
119
+ private shortcutsCleanup: (() => void) | null = null
120
+ private currentBreakpoint: 'base' | 'sm' | 'md' | 'lg' | 'xl' = 'base'
121
+
122
+ constructor() {
123
+ super()
124
+ this.handleResize = this.handleResize.bind(this)
125
+ }
126
+
127
+ connectedCallback() {
128
+ this.style.display = 'contents'
129
+ this.gridElement = this.querySelector('[data-slot="overlay"], #rla-layout-grid-overlay') as HTMLElement
130
+ this.columnsContainer = this.querySelector('[data-slot="columns-container"]') as HTMLElement
131
+ this.indicatorElement = this.querySelector('[data-slot="indicator"]') as HTMLElement
132
+
133
+ // Restore visibility state from localStorage
134
+ this.isVisible = localStorage.getItem('rla-grid-visible') === 'true'
135
+ if (this.gridElement) {
136
+ this.gridElement.style.display = this.isVisible ? 'block' : 'none'
137
+ }
138
+
139
+ // Initialize ResizeObserver to monitor viewport changes
140
+ this.resizeObserver = new ResizeObserver(this.handleResize)
141
+ this.resizeObserver.observe(document.documentElement)
142
+
143
+ // Initialize grid
144
+ this.updateGrid()
145
+
146
+ // Set up shortcuts using the library system
147
+ const shortcutKey = this.dataset.shortcut || 'meta_shift_g'
148
+ this.shortcutsCleanup = defineShortcuts({
149
+ [shortcutKey]: {
150
+ handler: (e) => {
151
+ e.preventDefault()
152
+ this.toggleGrid()
153
+ },
154
+ label: "Toggle Layout Grid",
155
+ description: "Show or hide the development layout grid guide overlay",
156
+ category: "development"
157
+ }
158
+ })
159
+ }
160
+
161
+ disconnectedCallback() {
162
+ this.resizeObserver?.disconnect()
163
+ if (this.shortcutsCleanup) {
164
+ this.shortcutsCleanup()
165
+ this.shortcutsCleanup = null
166
+ }
167
+ }
168
+
169
+ private handleResize() {
170
+ const width = document.documentElement.clientWidth
171
+ const smBreakpoint = parseInt(this.dataset.smBreakpoint || '640')
172
+ const mdBreakpoint = parseInt(this.dataset.mdBreakpoint || '768')
173
+ const lgBreakpoint = parseInt(this.dataset.lgBreakpoint || '1024')
174
+ const xlBreakpoint = parseInt(this.dataset.xlBreakpoint || '1280')
175
+
176
+ let newBreakpoint: 'base' | 'sm' | 'md' | 'lg' | 'xl' = 'base'
177
+
178
+ if (width >= xlBreakpoint) {
179
+ newBreakpoint = 'xl'
180
+ } else if (width >= lgBreakpoint) {
181
+ newBreakpoint = 'lg'
182
+ } else if (width >= mdBreakpoint) {
183
+ newBreakpoint = 'md'
184
+ } else if (width >= smBreakpoint) {
185
+ newBreakpoint = 'sm'
186
+ }
187
+
188
+ this.currentBreakpoint = newBreakpoint
189
+ this.updateGrid()
190
+ }
191
+
192
+ private updateGrid() {
193
+ if (!this.columnsContainer) return
194
+
195
+ const width = document.documentElement.clientWidth
196
+ const smBreakpoint = parseInt(this.dataset.smBreakpoint || '640')
197
+ const mdBreakpoint = parseInt(this.dataset.mdBreakpoint || '768')
198
+ const lgBreakpoint = parseInt(this.dataset.lgBreakpoint || '1024')
199
+ const xlBreakpoint = parseInt(this.dataset.xlBreakpoint || '1280')
200
+
201
+ let breakpointIndex = 0
202
+ let colCount = parseInt(this.dataset.cols || '4')
203
+ let breakpointThreshold = 0
204
+
205
+ switch (this.currentBreakpoint) {
206
+ case 'xl':
207
+ breakpointIndex = 4
208
+ colCount = parseInt(this.dataset.xlCols || '12')
209
+ breakpointThreshold = xlBreakpoint
210
+ break
211
+ case 'lg':
212
+ breakpointIndex = 3
213
+ colCount = parseInt(this.dataset.lgCols || '12')
214
+ breakpointThreshold = lgBreakpoint
215
+ break
216
+ case 'md':
217
+ breakpointIndex = 2
218
+ colCount = parseInt(this.dataset.mdCols || '8')
219
+ breakpointThreshold = mdBreakpoint
220
+ break
221
+ case 'sm':
222
+ breakpointIndex = 1
223
+ colCount = parseInt(this.dataset.smCols || '4')
224
+ breakpointThreshold = smBreakpoint
225
+ break
226
+ default:
227
+ breakpointIndex = 0
228
+ colCount = parseInt(this.dataset.cols || '4')
229
+ breakpointThreshold = 0
230
+ break
231
+ }
232
+
233
+ const gutterArray = JSON.parse(this.dataset.gutter || '[1,1,1,1,1]')
234
+ const marginArray = JSON.parse(this.dataset.margin || '[1,1,1,1,1]')
235
+
236
+ const gutterValue = gutterArray[breakpointIndex] ?? gutterArray[gutterArray.length - 1]
237
+ const marginValue = marginArray[breakpointIndex] ?? marginArray[marginArray.length - 1]
238
+
239
+ const gridColor = this.dataset.gridColor || '#ff0000'
240
+ const gridOpacity = parseFloat(this.dataset.gridOpacity || '0.1')
241
+ const showBackground = this.dataset.showBackground === 'true'
242
+
243
+ const showFullWidth = this.dataset.showFullWidth !== 'false'
244
+ const fullWidthColor = this.dataset.fullWidthColor || '#3b82f6'
245
+ const fullWidthOpacity = parseFloat(this.dataset.fullWidthOpacity || '0.05')
246
+ const showFullWidthBackground = this.dataset.showFullWidthBackground === 'true'
247
+
248
+ // Convert rem spacings to pixels dynamically based on root font size
249
+ const rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16
250
+ const marginPx = marginValue * rootFontSize
251
+ const gutterPx = gutterValue * rootFontSize
252
+
253
+ // Calculate max width boundaries
254
+ const maxWidthVal = this.dataset.maxWidth || '1440px'
255
+ let maxWidthPx = width
256
+ if (!maxWidthVal.includes('vw')) {
257
+ maxWidthPx = parseInt(maxWidthVal)
258
+ }
259
+
260
+ const innerMaxWidthVal = this.dataset.innerMaxWidth || '768px'
261
+ let innerMaxWidthPx = width
262
+ if (!innerMaxWidthVal.includes('vw')) {
263
+ innerMaxWidthPx = parseInt(innerMaxWidthVal)
264
+ }
265
+ const innerGridColor = this.dataset.innerColor || '#10b981'
266
+ const innerGridOpacity = parseFloat(this.dataset.innerOpacity || '0.1')
267
+ const showInnerBackground = this.dataset.showInnerBackground === 'true'
268
+
269
+ // Calculate grid properties based on container width or screen width
270
+ const activeWidth = width > maxWidthPx ? maxWidthPx : width
271
+ const innerWidth = activeWidth - 2 * marginPx
272
+ const colWidth = (innerWidth - (colCount - 1) * gutterPx) / colCount
273
+
274
+ // Center container boundaries (where we switch colors)
275
+ const containerLeft = (width - maxWidthPx) / 2
276
+ const containerRight = (width + maxWidthPx) / 2
277
+
278
+ // Clear container
279
+ this.columnsContainer.innerHTML = ''
280
+
281
+ // Set CSS custom properties on the host element and document root
282
+ this.style.setProperty('--rla-grid-cols', colCount.toString())
283
+ this.style.setProperty('--rla-grid-gap', `${gutterPx}px`)
284
+ this.style.setProperty('--rla-grid-margin', `${marginPx}px`)
285
+ this.style.setProperty('--rla-grid-max-width', maxWidthVal)
286
+
287
+ document.documentElement.style.setProperty('--rla-grid-cols', colCount.toString())
288
+ document.documentElement.style.setProperty('--rla-grid-gap', `${gutterPx}px`)
289
+ document.documentElement.style.setProperty('--rla-grid-gutter', `${gutterPx}px`)
290
+ document.documentElement.style.setProperty('--rla-grid-col-width', `${colWidth}px`)
291
+ document.documentElement.style.setProperty('--rla-grid-margin', `${marginPx}px`)
292
+ document.documentElement.style.setProperty('--rla-grid-max-width', maxWidthVal)
293
+
294
+ const containerStartX = width > maxWidthPx ? containerLeft + marginPx : marginPx
295
+ const step = colWidth + gutterPx
296
+
297
+ // Calculate total columns including outer ones
298
+ let totalCols = colCount
299
+ if (width > maxWidthPx && showFullWidth) {
300
+ let leftX = marginPx
301
+ while (leftX + colWidth < containerLeft) {
302
+ totalCols++
303
+ leftX += step
304
+ }
305
+ let rightX = width - marginPx - colWidth
306
+ while (rightX > containerRight) {
307
+ totalCols++
308
+ rightX -= step
309
+ }
310
+ }
311
+
312
+ if (this.indicatorElement) {
313
+ this.indicatorElement.innerHTML = `<span style="color: #3b82f6;">${this.currentBreakpoint.toUpperCase()} (${breakpointThreshold}px)</span> <span style="opacity: 0.35;">|</span> <span>${width}px</span> <span style="opacity: 0.35;">|</span> <span style="color: #ef4444;">${totalCols} Cols</span>`
314
+ }
315
+
316
+
317
+
318
+ // Create centered CSS Grid container using the exact same classes as the page container
319
+ const gridWrapper = document.createElement('div')
320
+ gridWrapper.className = "mx-auto w-full max-w-[1440px] px-xs sm:px-md md:px-xl lg:px-xl gap-xs sm:gap-md md:gap-xl lg:gap-xl h-full box-border grid"
321
+ gridWrapper.style.gridTemplateColumns = 'repeat(var(--rla-grid-cols), 1fr)'
322
+
323
+ const innerLeft = (width - innerMaxWidthPx) / 2
324
+ const innerRight = (width + innerMaxWidthPx) / 2
325
+
326
+ // Add container columns
327
+ for (let i = 0; i < colCount; i++) {
328
+ const colX = containerStartX + i * step
329
+ const colRight = colX + colWidth
330
+ const isInner = (colX >= innerLeft - 1) && (colRight <= innerRight + 1)
331
+
332
+ const col = document.createElement('div')
333
+ col.className = 'grid-column'
334
+ const color = isInner ? innerGridColor : gridColor
335
+ const opacity = isInner ? innerGridOpacity : gridOpacity
336
+ const bg = isInner ? showInnerBackground : showBackground
337
+
338
+ Object.assign(col.style, {
339
+ height: '100%',
340
+ borderInline: `1px solid ${color}`,
341
+ boxSizing: 'border-box',
342
+ backgroundColor: bg ? hexToRgba(color, opacity) : 'transparent'
343
+ })
344
+ gridWrapper.appendChild(col)
345
+ }
346
+
347
+ this.columnsContainer.appendChild(gridWrapper)
348
+
349
+ // If screen is wider than container, draw outer columns using absolute positioning
350
+ if (width > maxWidthPx && showFullWidth) {
351
+ const drawOuterColumn = (x: number) => {
352
+ const col = document.createElement('div')
353
+ col.className = 'rla-outer-column'
354
+ Object.assign(col.style, {
355
+ position: 'absolute',
356
+ top: '0',
357
+ left: `${x}px`,
358
+ width: `${colWidth}px`,
359
+ height: '100%',
360
+ borderInline: `1px solid ${fullWidthColor}`,
361
+ boxSizing: 'border-box',
362
+ backgroundColor: showFullWidthBackground ? hexToRgba(fullWidthColor, fullWidthOpacity) : 'transparent'
363
+ })
364
+ this.columnsContainer!.appendChild(col)
365
+ }
366
+
367
+ // Draw left columns starting from the viewport edge and going right
368
+ let leftX = marginPx
369
+ while (leftX + colWidth < containerLeft) {
370
+ drawOuterColumn(leftX)
371
+ leftX += step
372
+ }
373
+
374
+ // Draw right columns starting from the viewport edge and going left
375
+ let rightX = width - marginPx - colWidth
376
+ while (rightX > containerRight) {
377
+ drawOuterColumn(rightX)
378
+ rightX -= step
379
+ }
380
+ }
381
+ }
382
+
383
+ toggleGrid() {
384
+ this.isVisible = !this.isVisible
385
+ localStorage.setItem('rla-grid-visible', this.isVisible ? 'true' : 'false')
386
+ if (this.gridElement) {
387
+ this.gridElement.style.display = this.isVisible ? 'block' : 'none'
388
+ }
389
+ }
390
+ }
391
+
392
+ if (!customElements.get('rla-layout-grid')) {
393
+ customElements.define('rla-layout-grid', RLALayoutGrid)
394
+ }
395
+ </script>
@@ -1,23 +1,44 @@
1
- ---
2
- import { scv } from "css-variants"
3
- import { useUi, resolveClasses } from "../../utils"
4
- import type { LinkProps } from "../../types"
5
- import linkThemeDefault, { createLinkTheme } from "../../themes/link.theme"
6
- import { getUIConfig } from "virtual:rimelight-ui"
7
-
8
- const uiConfig = getUIConfig()
9
- const linkTheme = uiConfig.colors ? createLinkTheme() : linkThemeDefault
10
-
11
- const link = scv(linkTheme)
12
-
13
- const {
14
- ui: uiProp,
15
- class: className,
16
- ...rest
17
- } = Astro.props as LinkProps
18
-
19
- const classes = resolveClasses(link, {}, useUi("link", uiProp), className);
20
- ---
21
- <div class={classes.root} data-slot="root" {...rest}>
22
- <slot />
23
- </div>
1
+ ---
2
+ import RLAButton from "./RLAButton.astro"
3
+ import type { LinkProps } from "../../types"
4
+
5
+ const {
6
+ to,
7
+ href,
8
+ variant = "link",
9
+ color = "neutral",
10
+ external,
11
+ isButton = false,
12
+ ariaLabel,
13
+ externalIcon,
14
+ target,
15
+ rel,
16
+ trailingIcon,
17
+ ...rest
18
+ } = Astro.props as LinkProps
19
+
20
+ const linkHref = href || (typeof to === 'string' ? to : undefined);
21
+
22
+ const isExternal = !!(external || (linkHref && (linkHref.startsWith('http://') || linkHref.startsWith('https://') || linkHref.startsWith('//'))));
23
+
24
+ const linkVariant = isButton && variant === "link" ? "solid" : variant;
25
+ const linkTarget = target || (isExternal ? "_blank" : undefined);
26
+ const linkRel = rel || (isExternal ? "noopener noreferrer" : undefined);
27
+
28
+ const showExternalIcon = isExternal && !trailingIcon ? (externalIcon || "i-lucide-external-link") : trailingIcon;
29
+ ---
30
+ <RLAButton
31
+ variant={linkVariant as any}
32
+ color={color as any}
33
+ href={linkHref}
34
+ target={linkTarget}
35
+ rel={linkRel}
36
+ aria-label={ariaLabel}
37
+ trailingIcon={showExternalIcon}
38
+ {...rest}
39
+ >
40
+ <slot />
41
+ {isExternal && !ariaLabel && (
42
+ <span class="sr-only"> (opens in a new tab)</span>
43
+ )}
44
+ </RLAButton>
@@ -1,38 +1,100 @@
1
- ---
2
- import { scv } from "css-variants"
3
- import { useUi, resolveClasses } from "../../utils"
4
- import type { LinkGroupProps } from "../../types"
5
- import linkGroupThemeDefault, { createLinkGroupTheme } from "../../themes/link-group.theme"
6
- import { getUIConfig } from "virtual:rimelight-ui"
7
-
8
- const uiConfig = getUIConfig()
9
- const linkGroupTheme = uiConfig.colors ? createLinkGroupTheme() : linkGroupThemeDefault
10
-
11
- const linkGroup = scv(linkGroupTheme)
12
-
13
- const {
14
- title,
15
- links = [],
16
- theme,
17
- ui: uiProp,
18
- class: className,
19
- ...rest
20
- } = Astro.props as LinkGroupProps
21
-
22
- const classes = resolveClasses(linkGroup, { theme }, useUi("linkGroup", uiProp), className);
23
- ---
24
- <div class={classes.root} data-slot="root" {...rest}>
25
- {title && <h4 class={classes.title} data-slot="title">{title}</h4>}
26
-
27
- <ul class={classes.list} data-slot="list">
28
- <slot>
29
- {links.map((link) => (
30
- <li class={classes.item} data-slot="item">
31
- <a href={link.href} class={classes.link} data-slot="link" {...link}>
32
- {link.label}
33
- </a>
34
- </li>
35
- ))}
36
- </slot>
37
- </ul>
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { LinkGroupProps } from "../../types"
5
+ import linkGroupThemeDefault, { createLinkGroupTheme } from "../../themes/link-group.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ import RLALink from "./RLALink.astro"
9
+
10
+ const uiConfig = getUIConfig()
11
+ const linkGroupTheme = uiConfig.colors ? createLinkGroupTheme() : linkGroupThemeDefault
12
+
13
+ const linkGroup = scv(linkGroupTheme)
14
+
15
+ const {
16
+ title,
17
+ label,
18
+ leadingIcon,
19
+ trailingIcon,
20
+ href,
21
+ to,
22
+ links = [],
23
+ theme,
24
+ ui: uiProp,
25
+ class: className,
26
+ ...rest
27
+ } = Astro.props as LinkGroupProps
28
+
29
+ const classes = resolveClasses(linkGroup, { theme }, useUi("linkGroup", uiProp), className);
30
+
31
+ const headingLabel = label || (typeof title === "object" ? title.label : (typeof title === "string" ? title : undefined));
32
+ const headingLeadingIcon = leadingIcon || (typeof title === "object" ? title.leadingIcon : undefined);
33
+ const headingTrailingIcon = trailingIcon || (typeof title === "object" ? title.trailingIcon : undefined);
34
+ const headingHref = href || (typeof title === "object" ? title.href : undefined);
35
+ const headingTo = to || (typeof title === "object" ? (title as any).to : undefined);
36
+
37
+ const linksProp = links ?? [];
38
+ const normalizedLinks = Array.isArray(linksProp) ? linksProp : [linksProp];
39
+
40
+ // Prefix utility classes in classes.link with `!` to cleanly override conflicting text colors in RLAButton's base classes.
41
+ // For default or light themes, do not force base text classes so RLAButton's own light/dark mode styles can adapt naturally.
42
+ const isPinnedDark = theme === "dark";
43
+ const overrideLinkClass = classes.link
44
+ ? classes.link
45
+ .split(" ")
46
+ .map(cls => {
47
+ if (!cls) return "";
48
+ if (cls.includes(":")) {
49
+ const parts = cls.split(":");
50
+ const state = parts.slice(0, -1).join(":");
51
+ const baseCls = parts[parts.length - 1];
52
+ return `${state}:!${baseCls}`;
53
+ }
54
+ if (cls.startsWith("text-") && !isPinnedDark) {
55
+ return cls;
56
+ }
57
+ return `!${cls}`;
58
+ })
59
+ .filter(Boolean)
60
+ .join(" ")
61
+ : "";
62
+ ---
63
+ <div class={classes.root} data-slot="root" {...rest}>
64
+ {headingLabel && (
65
+ <h4 class={classes.title} data-slot="title">
66
+ {headingHref || headingTo ? (
67
+ <a href={headingHref || (typeof headingTo === 'string' ? headingTo : undefined)} class="hover:underline flex items-center gap-1.5">
68
+ {headingLeadingIcon && <span class={headingLeadingIcon} />}
69
+ <span>{headingLabel}</span>
70
+ {headingTrailingIcon && <span class={headingTrailingIcon} />}
71
+ </a>
72
+ ) : (
73
+ <span class="flex items-center gap-1.5">
74
+ {headingLeadingIcon && <span class={headingLeadingIcon} />}
75
+ <span>{headingLabel}</span>
76
+ {headingTrailingIcon && <span class={headingTrailingIcon} />}
77
+ </span>
78
+ )}
79
+ </h4>
80
+ )}
81
+
82
+ <ul class={classes.list} data-slot="list">
83
+ <slot>
84
+ {normalizedLinks.map((link) => (
85
+ <li class={classes.item} data-slot="item">
86
+ <RLALink
87
+ variant={link.variant ?? "ghost"}
88
+ color={link.color ?? "neutral"}
89
+ theme={link.theme ?? theme}
90
+ class:list={[overrideLinkClass, "w-full !justify-start"]}
91
+ data-slot="link"
92
+ {...link}
93
+ >
94
+ {link.label}
95
+ </RLALink>
96
+ </li>
97
+ ))}
98
+ </slot>
99
+ </ul>
38
100
  </div>