@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,60 @@
1
+ <script setup lang="ts">
2
+ import { computed } from "vue"
3
+ import { scv } from "css-variants"
4
+ import { useUi, resolveClasses } from "../../utils"
5
+ import type { ProgressProps } from "../../types/components/progress"
6
+ import progressTheme from "../../themes/progress.theme"
7
+
8
+ const progress = scv(progressTheme)
9
+
10
+ const props = withDefaults(defineProps<ProgressProps & { modelValue?: number }>(), {
11
+ modelValue: 0,
12
+ max: 100,
13
+ color: "primary",
14
+ size: "md"
15
+ })
16
+
17
+ const emit = defineEmits<{
18
+ (e: "update:modelValue", value: number): void
19
+ }>()
20
+
21
+ const value = computed({
22
+ get: () => props.value ?? props.modelValue ?? 0,
23
+ set: (val) => emit("update:modelValue", val)
24
+ })
25
+
26
+ const percentage = computed(() => {
27
+ if (props.max <= 0) return 0
28
+ return Math.min(100, Math.max(0, (value.value / props.max) * 100))
29
+ })
30
+
31
+ const resolvedClasses = computed(() =>
32
+ resolveClasses(
33
+ progress,
34
+ {
35
+ color: props.color,
36
+ size: props.size,
37
+ theme: props.theme
38
+ },
39
+ useUi("progress", props.ui),
40
+ props.class
41
+ )
42
+ )
43
+ </script>
44
+
45
+ <template>
46
+ <div
47
+ role="progressbar"
48
+ :aria-valuenow="value"
49
+ :aria-valuemin="0"
50
+ :aria-valuemax="max"
51
+ :class="resolvedClasses.root"
52
+ data-slot="root"
53
+ >
54
+ <div
55
+ :class="resolvedClasses.indicator"
56
+ :style="{ width: percentage + '%' }"
57
+ data-slot="indicator"
58
+ />
59
+ </div>
60
+ </template>
@@ -4,8 +4,9 @@ import { useUi, resolveClasses } from "../../utils"
4
4
  import type { ScrollToTopProps } from "../../types/components/scroll-to-top"
5
5
  import scrollToTopTheme from "../../themes/scroll-to-top.theme"
6
6
  import { useScrollToTop } from "../../composables/useScrollToTop"
7
- import { computed } from "vue"
7
+ import { computed, onMounted, onUnmounted, watch, useAttrs } from "vue"
8
8
 
9
+ const attrs = useAttrs()
9
10
  const scrollToTop = scv(scrollToTopTheme)
10
11
 
11
12
  const {
@@ -28,49 +29,49 @@ const {
28
29
  threshold
29
30
  })
30
31
 
31
- const circumference = 2 * Math.PI * 45
32
- const percentPx = circumference / 100
32
+ const instanceId = `rla-vue-${Math.random().toString(36).slice(2, 8)}`
33
+ const gaugeBorderWidth = progressWidth * 0.5
33
34
 
34
- const currentPercent = computed(() => scrollPercentage.value)
35
- const percentageInPx = computed(() => `${percentPx}px`)
36
- const durationInSeconds = computed(() => `${duration}s`)
35
+ let styleEl: HTMLStyleElement | null = null
36
+
37
+ function updateCssVars() {
38
+ if (!styleEl) return
39
+ styleEl.textContent = `
40
+ [data-rla-instance="${instanceId}"] {
41
+ --gauge-track-border-color: var(--color-${color}-900);
42
+ --gauge-track-bg: var(--color-${color}-950);
43
+ --gauge-stroke-width: ${gaugeBorderWidth}px;
44
+ --gauge-color: var(--color-${color}-500);
45
+ --gauge-progress: ${scrollPercentage.value};
46
+ }
47
+ `
48
+ }
49
+
50
+ watch(scrollPercentage, updateCssVars)
51
+
52
+ onMounted(() => {
53
+ const nonce = document.querySelector('meta[name="csp-nonce"]')?.getAttribute("content") ?? ""
54
+ styleEl = document.createElement("style")
55
+ if (nonce) styleEl.setAttribute("nonce", nonce)
56
+ document.head.appendChild(styleEl)
57
+ updateCssVars()
58
+ })
59
+
60
+ onUnmounted(() => {
61
+ if (styleEl) styleEl.remove()
62
+ })
37
63
  </script>
38
64
 
39
65
  <template>
40
66
  <div
67
+ :data-rla-instance="instanceId"
41
68
  :class="['rla-scroll-to-top fixed bottom-6 right-6 z-50', { visible: isVisible }, classes.root]"
42
- v-bind="$attrs"
69
+ v-bind="attrs"
43
70
  >
44
71
  <button type="button" :class="classes.button" aria-label="Scroll to top" @click="scrollToTopFn">
45
72
  <div :class="classes.progressBase">
46
- <svg :class="classes.svg" viewBox="0 0 100 100" shape-rendering="geometricPrecision">
47
- <circle
48
- cx="50"
49
- cy="50"
50
- r="45"
51
- fill="var(--color-primary-950)"
52
- :stroke-width="progressWidth"
53
- stroke-dashoffset="0"
54
- stroke-linecap="round"
55
- class="gauge-secondary-stroke opacity-100"
56
- />
57
- <circle
58
- v-if="showProgress"
59
- cx="50"
60
- cy="50"
61
- r="45"
62
- fill="transparent"
63
- :stroke-width="progressWidth"
64
- stroke-linecap="round"
65
- class="gauge-primary-stroke opacity-100"
66
- :style="{
67
- '--stroke-percent': currentPercent,
68
- '--percent-to-px': percentageInPx,
69
- '--circumference': circumference,
70
- '--duration': durationInSeconds
71
- }"
72
- />
73
- </svg>
73
+ <div class="gauge-track"></div>
74
+ <div v-if="showProgress" class="gauge-progress"></div>
74
75
  <div :class="classes.iconContainer">
75
76
  <svg
76
77
  xmlns="http://www.w3.org/2000/svg"
@@ -106,27 +107,39 @@ const durationInSeconds = computed(() => `${duration}s`)
106
107
  }
107
108
 
108
109
  .progress-circle-base {
110
+ position: relative;
109
111
  transform: translateZ(0);
110
112
  }
111
113
 
112
- .gauge-primary-stroke {
113
- stroke: var(--color-primary-500);
114
- --stroke-percent: v-bind(currentPercent);
115
- --percent-to-px: v-bind(percentageInPx);
116
- --circumference: v-bind(circumference);
117
- stroke-dasharray: calc(var(--stroke-percent) * var(--percent-to-px)) var(--circumference);
118
- transition:
119
- stroke-dasharray v-bind(durationInSeconds) ease,
120
- stroke v-bind(durationInSeconds) ease;
121
- transform: rotate(-90deg);
122
- transform-origin: center;
123
- shape-rendering: geometricPrecision;
114
+ .gauge-track {
115
+ position: absolute;
116
+ inset: 0;
117
+ border-radius: 50%;
118
+ border-style: solid;
119
+ border-width: var(--gauge-stroke-width, 3px);
120
+ border-color: var(--gauge-track-border-color, var(--color-primary-900));
121
+ background-color: var(--gauge-track-bg, var(--color-primary-950));
124
122
  }
125
123
 
126
- .gauge-secondary-stroke {
127
- stroke: var(--color-primary-900);
128
- stroke-dasharray: 282.6;
129
- transform: rotate(-90deg);
130
- transform-origin: center;
124
+ .gauge-progress {
125
+ position: absolute;
126
+ inset: 0;
127
+ border-radius: 50%;
128
+ background: conic-gradient(
129
+ from 0deg,
130
+ var(--gauge-color, var(--color-primary-500)) 0deg,
131
+ var(--gauge-color, var(--color-primary-500)) calc(var(--gauge-progress, 0) * 3.6deg),
132
+ transparent calc(var(--gauge-progress, 0) * 3.6deg)
133
+ );
134
+ -webkit-mask: radial-gradient(
135
+ circle closest-side,
136
+ transparent calc(100% - var(--gauge-stroke-width, 3px)),
137
+ #000 calc(100% - var(--gauge-stroke-width, 3px))
138
+ );
139
+ mask: radial-gradient(
140
+ circle closest-side,
141
+ transparent calc(100% - var(--gauge-stroke-width, 3px)),
142
+ #000 calc(100% - var(--gauge-stroke-width, 3px))
143
+ );
131
144
  }
132
145
  </style>
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { computed, useSlots } from "vue"
2
+ import { computed, useSlots, useAttrs } from "vue"
3
3
  import { scv } from "css-variants"
4
4
  import { useUi, resolveClasses } from "../../utils"
5
5
  import type { PageSectionProps } from "../../types/components/page-section"
@@ -24,6 +24,7 @@ const {
24
24
  links
25
25
  } = defineProps<PageSectionProps>()
26
26
 
27
+ const attrs = useAttrs()
27
28
  const slots = useSlots()
28
29
 
29
30
  const resolvedClasses = computed(() =>
@@ -51,9 +52,9 @@ const resolvedClasses = computed(() =>
51
52
  data-slot="root"
52
53
  :data-orientation="orientation"
53
54
  :class="[resolvedClasses.root]"
54
- v-bind="$attrs"
55
+ v-bind="attrs"
55
56
  >
56
- <slot v-if="$slots.background" name="background">
57
+ <slot v-if="slots.background" name="background">
57
58
  <div :class="resolvedClasses.background" data-slot="background">
58
59
  <slot name="background" />
59
60
  </div>
@@ -64,26 +65,26 @@ const resolvedClasses = computed(() =>
64
65
  <div data-slot="container" :class="resolvedClasses.container">
65
66
  <div
66
67
  v-if="
67
- $slots.header ||
68
+ slots.header ||
68
69
  icon ||
69
70
  headline ||
70
71
  title ||
71
72
  description ||
72
- $slots.body ||
73
- $slots.footer ||
74
- $slots.links ||
73
+ slots.body ||
74
+ slots.footer ||
75
+ slots.links ||
75
76
  links?.length
76
77
  "
77
78
  data-slot="wrapper"
78
79
  :class="resolvedClasses.wrapper"
79
80
  >
80
81
  <div
81
- v-if="$slots.header || icon || headline || title || description"
82
+ v-if="slots.header || icon || headline || title || description"
82
83
  data-slot="header"
83
84
  :class="resolvedClasses.header"
84
85
  >
85
86
  <slot name="header">
86
- <div v-if="icon || $slots.leading" data-slot="leading" :class="resolvedClasses.leading">
87
+ <div v-if="icon || slots.leading" data-slot="leading" :class="resolvedClasses.leading">
87
88
  <slot name="leading" :ui="resolvedClasses">
88
89
  <RLVIcon
89
90
  v-if="icon"
@@ -119,18 +120,18 @@ const resolvedClasses = computed(() =>
119
120
  </slot>
120
121
  </div>
121
122
 
122
- <div v-if="$slots.body" data-slot="body" :class="resolvedClasses.body">
123
+ <div v-if="slots.body" data-slot="body" :class="resolvedClasses.body">
123
124
  <slot name="body" />
124
125
  </div>
125
126
 
126
127
  <div
127
- v-if="$slots.footer || $slots.links || links?.length"
128
+ v-if="slots.footer || slots.links || links?.length"
128
129
  data-slot="footer"
129
130
  :class="resolvedClasses.footer"
130
131
  >
131
132
  <slot name="footer">
132
133
  <div
133
- v-if="links?.length || $slots.links"
134
+ v-if="links?.length || slots.links"
134
135
  data-slot="links"
135
136
  :class="resolvedClasses.links"
136
137
  >
@@ -141,7 +142,7 @@ const resolvedClasses = computed(() =>
141
142
  </div>
142
143
  </div>
143
144
 
144
- <slot v-if="$slots.default" />
145
+ <slot v-if="slots.default" />
145
146
  <div v-else-if="orientation === 'horizontal'" class="hidden lg:block" />
146
147
  </div>
147
148
 
@@ -1,68 +1,81 @@
1
- <script setup lang="ts">
2
- import { computed } from "vue"
3
- import { scv } from "css-variants"
4
- import { useUi, resolveClasses } from "../../utils"
5
- import type { ToastProps } from "../../types/components/toast"
6
- import toastTheme from "../../themes/toast.theme"
7
-
8
- const toast = scv(toastTheme)
9
-
10
- const props = withDefaults(defineProps<ToastProps & { id?: string | number }>(), {
11
- variant: "default",
12
- duration: 5000
13
- })
14
-
15
- const emit = defineEmits<{
16
- (e: "close", id: string | number | undefined): void
17
- }>()
18
-
19
- const resolvedClasses = computed(() =>
20
- resolveClasses(toast, { variant: props.variant }, useUi("toast", props.ui), props.class)
21
- )
22
-
23
- const variantIcons: Record<string, string> = {
24
- default: "i-lucide-bell",
25
- destructive: "i-lucide-alert-circle",
26
- success: "i-lucide-check-circle-2",
27
- warning: "i-lucide-alert-triangle",
28
- info: "i-lucide-info"
29
- }
30
-
31
- const icon = computed(() => variantIcons[props.variant] ?? variantIcons.default!)
32
- </script>
33
-
34
- <template>
35
- <div
36
- :class="resolvedClasses.root"
37
- data-slot="root"
38
- role="alert"
39
- aria-live="assertive"
40
- aria-atomic="true"
41
- >
42
- <span :class="[icon, 'size-4 shrink-0 mt-0.5']" aria-hidden="true" />
43
-
44
- <div class="flex flex-col gap-0.5 flex-1 min-w-0">
45
- <div v-if="title" :class="resolvedClasses.title" data-slot="title">
46
- {{ title }}
47
- </div>
48
- <div v-if="description" :class="resolvedClasses.description" data-slot="description">
49
- {{ description }}
50
- </div>
51
- <slot />
52
- </div>
53
-
54
- <button v-if="actionLabel" type="button" :class="resolvedClasses.action" data-slot="action">
55
- {{ actionLabel }}
56
- </button>
57
-
58
- <button
59
- type="button"
60
- :class="resolvedClasses.close"
61
- data-slot="close"
62
- aria-label="Dismiss notification"
63
- @click="emit('close', id)"
64
- >
65
- <span class="i-lucide-x size-3.5" aria-hidden="true" />
66
- </button>
67
- </div>
68
- </template>
1
+ <script setup lang="ts">
2
+ import { computed } from "vue"
3
+ import { scv } from "css-variants"
4
+ import { useUi, resolveClasses } from "../../utils"
5
+ import type { ToastProps } from "../../types/components/toast"
6
+ import toastTheme from "../../themes/toast.theme"
7
+
8
+ const toast = scv(toastTheme)
9
+
10
+ const props = withDefaults(defineProps<ToastProps & { id?: string | number }>(), {
11
+ variant: "default",
12
+ duration: 5000
13
+ })
14
+
15
+ const emit = defineEmits<{
16
+ (e: "close", id: string | number | undefined): void
17
+ }>()
18
+
19
+ const resolvedClasses = computed(() =>
20
+ resolveClasses(toast, { variant: props.variant }, useUi("toast", props.ui), props.class)
21
+ )
22
+
23
+ const variantIcons: Record<string, string> = {
24
+ default: "i-lucide-bell",
25
+ destructive: "i-lucide-alert-circle",
26
+ success: "i-lucide-check-circle-2",
27
+ warning: "i-lucide-alert-triangle",
28
+ info: "i-lucide-info"
29
+ }
30
+
31
+ const icon = computed(() => variantIcons[props.variant] ?? variantIcons.default!)
32
+ </script>
33
+
34
+ <template>
35
+ <div
36
+ :class="resolvedClasses.root"
37
+ data-slot="root"
38
+ role="alert"
39
+ aria-live="assertive"
40
+ aria-atomic="true"
41
+ >
42
+ <span :class="[icon, 'size-4 shrink-0 mt-0.5']" aria-hidden="true" />
43
+
44
+ <div class="flex flex-col gap-0.5 flex-1 min-w-0">
45
+ <div v-if="title" :class="resolvedClasses.title" data-slot="title">
46
+ {{ title }}
47
+ </div>
48
+ <div v-if="description" :class="resolvedClasses.description" data-slot="description">
49
+ {{ description }}
50
+ </div>
51
+ <slot />
52
+
53
+ <div
54
+ v-if="$slots.actions || actionLabel"
55
+ class="flex items-center justify-end gap-2 mt-3"
56
+ data-slot="actions"
57
+ >
58
+ <slot name="actions">
59
+ <button
60
+ v-if="actionLabel"
61
+ type="button"
62
+ :class="resolvedClasses.action"
63
+ data-slot="action"
64
+ >
65
+ {{ actionLabel }}
66
+ </button>
67
+ </slot>
68
+ </div>
69
+ </div>
70
+
71
+ <button
72
+ type="button"
73
+ :class="resolvedClasses.close"
74
+ data-slot="close"
75
+ aria-label="Dismiss notification"
76
+ @click="emit('close', id)"
77
+ >
78
+ <span class="i-lucide-x size-3.5" aria-hidden="true" />
79
+ </button>
80
+ </div>
81
+ </template>
@@ -1,29 +1,29 @@
1
- <script setup lang="ts">
2
- import { useToast } from "../../composables/useToast"
3
- import RLVToast from "./RLVToast.vue"
4
-
5
- const { toasts, remove } = useToast()
6
- </script>
7
-
8
- <template>
9
- <div
10
- class="fixed bottom-0 right-0 p-4 z-[100] flex flex-col gap-2 w-full max-w-sm pointer-events-none"
11
- >
12
- <TransitionGroup
13
- enter-active-class="transition duration-300 ease-out"
14
- enter-from-class="transform translate-y-2 opacity-0"
15
- enter-to-class="transform translate-y-0 opacity-100"
16
- leave-active-class="transition duration-200 ease-in"
17
- leave-from-class="transform translate-y-0 opacity-100"
18
- leave-to-class="transform translate-y-2 opacity-0"
19
- >
20
- <RLVToast
21
- v-for="toast in toasts"
22
- :key="toast.id"
23
- v-bind="toast"
24
- class="pointer-events-auto"
25
- @close="remove"
26
- />
27
- </TransitionGroup>
28
- </div>
29
- </template>
1
+ <script setup lang="ts">
2
+ import { useToast } from "../../composables/useToast"
3
+ import RLVToast from "./RLVToast.vue"
4
+
5
+ const { toasts, remove } = useToast()
6
+ </script>
7
+
8
+ <template>
9
+ <div
10
+ class="fixed bottom-0 right-0 p-4 z-[100] flex flex-col gap-2 w-full max-w-sm pointer-events-none"
11
+ >
12
+ <TransitionGroup
13
+ enter-active-class="transition duration-300 ease-out"
14
+ enter-from-class="transform translate-y-2 opacity-0"
15
+ enter-to-class="transform translate-y-0 opacity-100"
16
+ leave-active-class="transition duration-200 ease-in"
17
+ leave-from-class="transform translate-y-0 opacity-100"
18
+ leave-to-class="transform translate-y-2 opacity-0"
19
+ >
20
+ <RLVToast
21
+ v-for="toast in toasts"
22
+ :key="toast.id"
23
+ v-bind="toast"
24
+ class="pointer-events-auto"
25
+ @close="remove"
26
+ />
27
+ </TransitionGroup>
28
+ </div>
29
+ </template>
@@ -1,3 +1,4 @@
1
- export { useScrollToTop } from "./useScrollToTop"
2
- export { useToast } from "./useToast"
3
- export { headerLayersStore } from "./useHeaderStore"
1
+ export { useScrollToTop } from "./useScrollToTop"
2
+ export { useToast } from "./useToast"
3
+ export { headerLayersStore } from "./useHeaderStore"
4
+ export { useShortcuts } from "./useShortcuts"
@@ -1,14 +1,14 @@
1
- import { map } from "nanostores"
2
-
3
- export interface HeaderLayerInfo {
4
- order: number
5
- isVisible: boolean
6
- height: number
7
- }
8
-
9
- /**
10
- * Global store tracking all registered header layers.
11
- * This allows child components to subscribe to header layer changes
12
- * even across Vue/Astro boundaries, since nanostores is framework-agnostic.
13
- */
14
- export const headerLayersStore = map<Record<string, HeaderLayerInfo>>({})
1
+ import { map } from "nanostores"
2
+
3
+ export interface HeaderLayerInfo {
4
+ type: "banner" | "header"
5
+ order: number
6
+ isVisible: boolean
7
+ height: number
8
+ }
9
+
10
+ /**
11
+ * Global store tracking all registered header layers. This allows child components to subscribe to
12
+ * header layer changes even across Vue/Astro boundaries, since nanostores is framework-agnostic.
13
+ */
14
+ export const headerLayersStore = map<Record<string, HeaderLayerInfo>>({})
@@ -1,62 +1,62 @@
1
- import { ref, onMounted, onUnmounted, type Ref } from "vue"
2
-
3
- export interface UseScrollToTopOptions {
4
- /**
5
- * The scroll threshold (in pixels) before the button becomes visible.
6
- *
7
- * @default 200
8
- */
9
- threshold?: number
10
- }
11
-
12
- export interface UseScrollToTopReturn {
13
- /**
14
- * Whether the scroll-to-top button should be visible.
15
- */
16
- isVisible: Ref<boolean>
17
- /**
18
- * The current scroll percentage (0-100).
19
- */
20
- scrollPercentage: Ref<number>
21
- /**
22
- * Scrolls the window to the top with a smooth animation.
23
- */
24
- scrollToTop: () => void
25
- }
26
-
27
- function scrollToTop() {
28
- window.scrollTo({
29
- top: 0,
30
- behavior: "smooth"
31
- })
32
- }
33
-
34
- export function useScrollToTop(options: UseScrollToTopOptions = {}): UseScrollToTopReturn {
35
- const { threshold = 200 } = options
36
-
37
- const isVisible = ref(false)
38
- const scrollPercentage = ref(0)
39
-
40
- function updateScrollState() {
41
- const scrollTop = window.scrollY || document.documentElement.scrollTop
42
- const scrollHeight = document.documentElement.scrollHeight - window.innerHeight
43
-
44
- isVisible.value = scrollTop > threshold
45
- scrollPercentage.value = scrollHeight > 0 ? (scrollTop / scrollHeight) * 100 : 0
46
- }
47
-
48
- onMounted(() => {
49
- window.addEventListener("scroll", updateScrollState, { passive: true })
50
- updateScrollState()
51
- })
52
-
53
- onUnmounted(() => {
54
- window.removeEventListener("scroll", updateScrollState)
55
- })
56
-
57
- return {
58
- isVisible,
59
- scrollPercentage,
60
- scrollToTop
61
- }
62
- }
1
+ import { ref, onMounted, onUnmounted, type Ref } from "vue"
2
+
3
+ export interface UseScrollToTopOptions {
4
+ /**
5
+ * The scroll threshold (in pixels) before the button becomes visible.
6
+ *
7
+ * @default 200
8
+ */
9
+ threshold?: number
10
+ }
11
+
12
+ export interface UseScrollToTopReturn {
13
+ /**
14
+ * Whether the scroll-to-top button should be visible.
15
+ */
16
+ isVisible: Ref<boolean>
17
+ /**
18
+ * The current scroll percentage (0-100).
19
+ */
20
+ scrollPercentage: Ref<number>
21
+ /**
22
+ * Scrolls the window to the top with a smooth animation.
23
+ */
24
+ scrollToTop: () => void
25
+ }
26
+
27
+ function scrollToTop() {
28
+ window.scrollTo({
29
+ top: 0,
30
+ behavior: "smooth"
31
+ })
32
+ }
33
+
34
+ export function useScrollToTop(options: UseScrollToTopOptions = {}): UseScrollToTopReturn {
35
+ const { threshold = 200 } = options
36
+
37
+ const isVisible = ref(false)
38
+ const scrollPercentage = ref(0)
39
+
40
+ function updateScrollState() {
41
+ const scrollTop = window.scrollY || document.documentElement.scrollTop
42
+ const scrollHeight = document.documentElement.scrollHeight - window.innerHeight
43
+
44
+ isVisible.value = scrollTop > threshold
45
+ scrollPercentage.value = scrollHeight > 0 ? (scrollTop / scrollHeight) * 100 : 0
46
+ }
47
+
48
+ onMounted(() => {
49
+ window.addEventListener("scroll", updateScrollState, { passive: true })
50
+ updateScrollState()
51
+ })
52
+
53
+ onUnmounted(() => {
54
+ window.removeEventListener("scroll", updateScrollState)
55
+ })
56
+
57
+ return {
58
+ isVisible,
59
+ scrollPercentage,
60
+ scrollToTop
61
+ }
62
+ }