@rimelight/ui 0.0.32 → 0.0.33

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 (383) hide show
  1. package/README.md +157 -30
  2. package/package.json +105 -108
  3. package/src/components/TableOfContents.astro +44 -43
  4. package/src/components/astro/RLA3dHover.astro +22 -18
  5. package/src/components/astro/RLAAlert.astro +93 -62
  6. package/src/components/astro/RLAApp.astro +22 -18
  7. package/src/components/astro/RLAAspectRatio.astro +27 -23
  8. package/src/components/astro/RLAAudio.astro +22 -18
  9. package/src/components/astro/RLAAvatar.astro +68 -56
  10. package/src/components/astro/RLAAvatarGroup.astro +23 -19
  11. package/src/components/astro/RLABadge.astro +34 -33
  12. package/src/components/astro/RLABanner.astro +22 -18
  13. package/src/components/astro/RLABlogPost.astro +7 -0
  14. package/src/components/astro/RLABlogPosts.astro +9 -0
  15. package/src/components/astro/RLABreadcrumb.astro +48 -44
  16. package/src/components/astro/RLABrowserMockup.astro +22 -18
  17. package/src/components/astro/RLAButton.astro +51 -2
  18. package/src/components/astro/RLACalendar.astro +22 -18
  19. package/src/components/astro/RLACard.astro +78 -74
  20. package/src/components/astro/RLACarousel.astro +75 -71
  21. package/src/components/astro/RLAChangelog.astro +22 -18
  22. package/src/components/astro/RLAChat.astro +22 -18
  23. package/src/components/astro/RLAChatMessage.astro +22 -18
  24. package/src/components/astro/RLAChatMessages.astro +22 -18
  25. package/src/components/astro/RLAChatPalette.astro +22 -18
  26. package/src/components/astro/RLAChatPrompt.astro +22 -18
  27. package/src/components/astro/RLAChatPromptSubmit.astro +22 -18
  28. package/src/components/astro/RLAChatReasoning.astro +22 -18
  29. package/src/components/astro/RLAChatShimmer.astro +22 -18
  30. package/src/components/astro/RLAChatTool.astro +22 -18
  31. package/src/components/astro/RLAChip.astro +51 -20
  32. package/src/components/astro/RLAColorPicker.astro +22 -18
  33. package/src/components/astro/RLACommandPalette.astro +22 -18
  34. package/src/components/astro/RLACompare.astro +22 -18
  35. package/src/components/astro/RLAConfirm.astro +117 -86
  36. package/src/components/astro/RLAContainer.astro +22 -18
  37. package/src/components/astro/RLAContextMenu.astro +22 -18
  38. package/src/components/astro/RLADashboardGroup.astro +22 -18
  39. package/src/components/astro/RLADashboardNavbar.astro +22 -18
  40. package/src/components/astro/RLADashboardPanel.astro +22 -18
  41. package/src/components/astro/RLADashboardResizeHandle.astro +22 -18
  42. package/src/components/astro/RLADashboardSearch.astro +22 -18
  43. package/src/components/astro/RLADashboardSearchButton.astro +22 -18
  44. package/src/components/astro/RLADashboardSidebar.astro +22 -18
  45. package/src/components/astro/RLADashboardSidebarCollapse.astro +22 -18
  46. package/src/components/astro/RLADashboardSidebarToggle.astro +22 -18
  47. package/src/components/astro/RLADashboardToolbar.astro +22 -18
  48. package/src/components/astro/RLADock.astro +22 -18
  49. package/src/{plugins/starlightAddons/components/Gamepad.astro → components/astro/RLADocsGamepad.astro} +178 -180
  50. package/src/{plugins/starlightAddons/components/Keyboard.astro → components/astro/RLADocsKeyboard.astro} +1 -3
  51. package/src/{plugins/starlightAddons/PackageManagers.astro → components/astro/RLADocsPackageManagers.astro} +28 -14
  52. package/src/components/astro/RLADrawer.astro +78 -74
  53. package/src/components/astro/RLAEditor.astro +22 -18
  54. package/src/components/astro/RLAEmpty.astro +22 -18
  55. package/src/components/astro/RLAError.astro +22 -18
  56. package/src/components/astro/RLAFieldset.astro +22 -18
  57. package/src/components/astro/RLAFloatingAction.astro +22 -18
  58. package/src/components/astro/RLAFooter.astro +39 -35
  59. package/src/components/astro/RLAForm.astro +23 -19
  60. package/src/components/astro/RLAGallery.astro +22 -18
  61. package/src/components/astro/RLAGrid.astro +39 -0
  62. package/src/components/astro/RLAHead.astro +25 -9
  63. package/src/components/astro/RLAHeader.astro +59 -107
  64. package/src/components/astro/RLAHoverCard.astro +35 -31
  65. package/src/components/astro/RLAIcon.astro +31 -27
  66. package/src/components/astro/RLAImage.astro +209 -19
  67. package/src/components/astro/RLAInputDate.astro +22 -18
  68. package/src/components/astro/RLAInputNumber.astro +22 -18
  69. package/src/components/astro/RLAInputTags.astro +22 -18
  70. package/src/components/astro/RLAInputTime.astro +22 -18
  71. package/src/components/astro/RLAKbd.astro +32 -22
  72. package/src/components/astro/RLAKnob.astro +22 -18
  73. package/src/components/astro/RLALabel.astro +27 -23
  74. package/src/components/astro/RLALink.astro +22 -18
  75. package/src/components/astro/RLALinkGroup.astro +37 -18
  76. package/src/components/astro/RLAListbox.astro +22 -18
  77. package/src/components/astro/RLALocaleSelector.astro +5 -1
  78. package/src/components/astro/RLALogo.astro +90 -56
  79. package/src/components/astro/RLAMain.astro +8 -2
  80. package/src/components/astro/RLAMarquee.astro +36 -32
  81. package/src/components/astro/RLAMegamenu.astro +22 -18
  82. package/src/components/astro/RLAMeter.astro +22 -18
  83. package/src/components/astro/RLAModal.astro +99 -95
  84. package/src/components/astro/RLANavigationMenu.astro +137 -136
  85. package/src/components/astro/RLAPage.astro +22 -18
  86. package/src/components/astro/RLAPageAside.astro +22 -18
  87. package/src/components/astro/RLAPageBody.astro +22 -18
  88. package/src/components/astro/RLAPageHeader.astro +22 -18
  89. package/src/components/astro/RLAPageSection.astro +5 -1
  90. package/src/components/astro/RLAPagination.astro +98 -94
  91. package/src/components/astro/RLAPassword.astro +22 -18
  92. package/src/components/astro/RLAPhoneMockup.astro +22 -18
  93. package/src/components/astro/RLAPinInput.astro +23 -0
  94. package/src/components/astro/RLAPlaceholder.astro +45 -41
  95. package/src/components/astro/RLAPopover.astro +35 -31
  96. package/src/components/astro/RLAPost.astro +65 -19
  97. package/src/components/astro/RLAPosts.astro +23 -0
  98. package/src/components/astro/RLAPricingPlan.astro +22 -18
  99. package/src/components/astro/RLAPricingTable.astro +22 -18
  100. package/src/components/astro/RLAProse.astro +22 -18
  101. package/src/components/astro/RLAQrCode.astro +22 -18
  102. package/src/components/astro/RLARadioGroup.astro +22 -18
  103. package/src/components/astro/RLARating.astro +22 -18
  104. package/src/components/astro/RLASeparator.astro +78 -27
  105. package/src/components/astro/RLASidebar.astro +212 -135
  106. package/src/components/astro/RLASkeleton.astro +24 -20
  107. package/src/components/astro/RLASlideover.astro +76 -72
  108. package/src/components/astro/RLASpeedDial.astro +22 -18
  109. package/src/components/astro/RLASpoiler.astro +22 -18
  110. package/src/components/astro/RLAStepper.astro +22 -18
  111. package/src/components/astro/RLASteps.astro +71 -0
  112. package/src/components/astro/RLAStickySurface.astro +31 -27
  113. package/src/components/astro/RLATableOfContents.astro +22 -18
  114. package/src/components/astro/RLATabs.astro +133 -92
  115. package/src/components/astro/RLAThemeSelector.astro +5 -1
  116. package/src/components/astro/RLATimeline.astro +22 -18
  117. package/src/components/astro/RLATooltip.astro +35 -31
  118. package/src/components/astro/RLATour.astro +22 -18
  119. package/src/components/astro/RLATree.astro +22 -18
  120. package/src/components/astro/RLAUser.astro +22 -18
  121. package/src/components/astro/RLAVideo.astro +200 -196
  122. package/src/components/astro/RLAWatermark.astro +22 -18
  123. package/src/components/astro/RLAWindowMockup.astro +22 -18
  124. package/src/components/vue/RLVCheckbox.vue +68 -0
  125. package/src/components/vue/RLVForm.vue +44 -0
  126. package/src/components/vue/RLVFormField.vue +58 -0
  127. package/src/components/vue/RLVInput.vue +93 -0
  128. package/src/components/vue/RLVPost.vue +63 -0
  129. package/src/components/vue/RLVPosts.vue +21 -0
  130. package/src/components/vue/RLVSection.vue +5 -4
  131. package/src/components/vue/RLVToast.vue +68 -0
  132. package/src/components/vue/RLVToaster.vue +29 -0
  133. package/src/composables/index.ts +3 -1
  134. package/src/composables/useHeaderStore.ts +14 -0
  135. package/src/composables/useScrollToTop.ts +62 -62
  136. package/src/composables/useToast.ts +42 -0
  137. package/src/env.d.ts +0 -13
  138. package/src/integrations/ui.ts +40 -49
  139. package/src/plugins/index.ts +2 -5
  140. package/src/plugins/starlightDocsApi/index.ts +272 -265
  141. package/src/presets/defaults.ts +297 -285
  142. package/src/presets/index.ts +208 -108
  143. package/src/styles/index.css +160 -162
  144. package/src/themes/3d-hover.theme.ts +13 -10
  145. package/src/themes/accordion.theme.ts +13 -10
  146. package/src/themes/alert.theme.ts +125 -56
  147. package/src/themes/app.theme.ts +13 -10
  148. package/src/themes/aspect-ratio.theme.ts +10 -8
  149. package/src/themes/audio.theme.ts +13 -10
  150. package/src/themes/avatar-group.theme.ts +9 -7
  151. package/src/themes/avatar.theme.ts +84 -28
  152. package/src/themes/badge.theme.ts +163 -66
  153. package/src/themes/banner.theme.ts +13 -10
  154. package/src/themes/breadcrumb.theme.ts +14 -12
  155. package/src/themes/browser-mockup.theme.ts +13 -10
  156. package/src/themes/button.theme.ts +73 -66
  157. package/src/themes/calendar.theme.ts +13 -10
  158. package/src/themes/card.theme.ts +42 -34
  159. package/src/themes/carousel.theme.ts +30 -28
  160. package/src/themes/changelog.theme.ts +13 -10
  161. package/src/themes/chart.theme.ts +22 -21
  162. package/src/themes/chat-message.theme.ts +13 -10
  163. package/src/themes/chat-messages.theme.ts +13 -10
  164. package/src/themes/chat-palette.theme.ts +13 -10
  165. package/src/themes/chat-prompt-submit.theme.ts +13 -10
  166. package/src/themes/chat-prompt.theme.ts +13 -10
  167. package/src/themes/chat-reasoning.theme.ts +13 -10
  168. package/src/themes/chat-shimmer.theme.ts +13 -10
  169. package/src/themes/chat-tool.theme.ts +13 -10
  170. package/src/themes/chat.theme.ts +13 -10
  171. package/src/themes/checkbox.theme.ts +50 -48
  172. package/src/themes/chip.theme.ts +74 -16
  173. package/src/themes/color-picker.theme.ts +13 -10
  174. package/src/themes/command-palette.theme.ts +13 -10
  175. package/src/themes/compare.theme.ts +13 -10
  176. package/src/themes/confirm.theme.ts +48 -33
  177. package/src/themes/container.theme.ts +13 -10
  178. package/src/themes/context-menu.theme.ts +13 -10
  179. package/src/themes/dashboard-group.theme.ts +13 -10
  180. package/src/themes/dashboard-navbar.theme.ts +13 -10
  181. package/src/themes/dashboard-panel.theme.ts +13 -10
  182. package/src/themes/dashboard-resize-handle.theme.ts +13 -10
  183. package/src/themes/dashboard-search-button.theme.ts +13 -10
  184. package/src/themes/dashboard-search.theme.ts +13 -10
  185. package/src/themes/dashboard-sidebar-collapse.theme.ts +13 -10
  186. package/src/themes/dashboard-sidebar-toggle.theme.ts +13 -10
  187. package/src/themes/dashboard-sidebar.theme.ts +13 -10
  188. package/src/themes/dashboard-toolbar.theme.ts +13 -10
  189. package/src/themes/dock.theme.ts +13 -10
  190. package/src/themes/drawer.theme.ts +61 -44
  191. package/src/themes/dropdown-menu.theme.ts +29 -27
  192. package/src/themes/editor.theme.ts +13 -10
  193. package/src/themes/empty.theme.ts +13 -10
  194. package/src/themes/error.theme.ts +13 -10
  195. package/src/themes/field-group.theme.ts +24 -23
  196. package/src/themes/fieldset.theme.ts +13 -10
  197. package/src/themes/floating-action.theme.ts +13 -10
  198. package/src/themes/footer.theme.ts +30 -27
  199. package/src/themes/form.theme.ts +13 -10
  200. package/src/themes/gallery.theme.ts +13 -10
  201. package/src/themes/head.theme.ts +13 -10
  202. package/src/themes/header.theme.ts +46 -43
  203. package/src/themes/hover-card.theme.ts +25 -23
  204. package/src/themes/icon.theme.ts +23 -20
  205. package/src/themes/image.theme.ts +19 -10
  206. package/src/themes/input-date.theme.ts +13 -10
  207. package/src/themes/input-menu.theme.ts +35 -28
  208. package/src/themes/input-number.theme.ts +13 -10
  209. package/src/themes/input-tags.theme.ts +13 -10
  210. package/src/themes/input-time.theme.ts +13 -10
  211. package/src/themes/input.theme.ts +42 -41
  212. package/src/themes/kbd.theme.ts +89 -24
  213. package/src/themes/knob.theme.ts +13 -10
  214. package/src/themes/label.theme.ts +18 -16
  215. package/src/themes/link-group.theme.ts +32 -10
  216. package/src/themes/link.theme.ts +13 -10
  217. package/src/themes/listbox.theme.ts +13 -10
  218. package/src/themes/locale-selector.theme.ts +40 -41
  219. package/src/themes/logo.theme.ts +13 -10
  220. package/src/themes/main.theme.ts +7 -6
  221. package/src/themes/marquee.theme.ts +24 -22
  222. package/src/themes/megamenu.theme.ts +13 -10
  223. package/src/themes/meter.theme.ts +13 -10
  224. package/src/themes/modal.theme.ts +44 -32
  225. package/src/themes/navigation-menu.theme.ts +27 -19
  226. package/src/themes/page-aside.theme.ts +13 -10
  227. package/src/themes/page-body.theme.ts +13 -10
  228. package/src/themes/page-header.theme.ts +13 -10
  229. package/src/themes/page-section.theme.ts +187 -186
  230. package/src/themes/page.theme.ts +13 -10
  231. package/src/themes/pagination.theme.ts +24 -22
  232. package/src/themes/password.theme.ts +13 -10
  233. package/src/themes/phone-mockup.theme.ts +13 -10
  234. package/src/themes/pin-input.theme.ts +14 -0
  235. package/src/themes/placeholder.theme.ts +15 -12
  236. package/src/themes/popover.theme.ts +26 -24
  237. package/src/themes/post.theme.ts +33 -10
  238. package/src/themes/posts.theme.ts +13 -0
  239. package/src/themes/pricing-plan.theme.ts +13 -10
  240. package/src/themes/pricing-table.theme.ts +13 -10
  241. package/src/themes/progress.theme.ts +38 -37
  242. package/src/themes/prose.theme.ts +13 -10
  243. package/src/themes/qr-code.theme.ts +13 -10
  244. package/src/themes/quote.theme.ts +13 -10
  245. package/src/themes/radio-group.theme.ts +13 -10
  246. package/src/themes/rating.theme.ts +13 -10
  247. package/src/themes/scroll-area.theme.ts +26 -24
  248. package/src/themes/scroll-to-top.theme.ts +52 -50
  249. package/src/themes/select.theme.ts +29 -27
  250. package/src/themes/separator.theme.ts +147 -19
  251. package/src/themes/sidebar.theme.ts +38 -33
  252. package/src/themes/skeleton.theme.ts +21 -20
  253. package/src/themes/slideover.theme.ts +53 -37
  254. package/src/themes/slider.theme.ts +36 -34
  255. package/src/themes/speed-dial.theme.ts +13 -10
  256. package/src/themes/spinner.theme.ts +34 -35
  257. package/src/themes/splitter.theme.ts +23 -22
  258. package/src/themes/spoiler.theme.ts +13 -10
  259. package/src/themes/stepper.theme.ts +13 -10
  260. package/src/themes/sticky-surface.theme.ts +9 -7
  261. package/src/themes/switch.theme.ts +67 -65
  262. package/src/themes/table-of-contents.theme.ts +48 -10
  263. package/src/themes/tabs.theme.ts +52 -44
  264. package/src/themes/textarea.theme.ts +27 -26
  265. package/src/themes/theme-selector.theme.ts +9 -10
  266. package/src/themes/timeline.theme.ts +13 -10
  267. package/src/themes/toast.theme.ts +31 -25
  268. package/src/themes/tooltip.theme.ts +28 -27
  269. package/src/themes/tour.theme.ts +13 -10
  270. package/src/themes/tree.theme.ts +13 -10
  271. package/src/themes/user.theme.ts +13 -10
  272. package/src/themes/video.theme.ts +17 -14
  273. package/src/themes/watermark.theme.ts +13 -10
  274. package/src/themes/window-mockup.theme.ts +13 -10
  275. package/src/types/components/3d-hover.ts +11 -11
  276. package/src/types/components/app.ts +11 -11
  277. package/src/types/components/audio.ts +11 -11
  278. package/src/types/components/avatar-group.ts +9 -10
  279. package/src/types/components/avatar.ts +60 -35
  280. package/src/types/components/banner.ts +11 -11
  281. package/src/types/components/browser-mockup.ts +11 -11
  282. package/src/types/components/button.ts +81 -77
  283. package/src/types/components/calendar.ts +11 -11
  284. package/src/types/components/changelog.ts +11 -11
  285. package/src/types/components/chat-message.ts +11 -11
  286. package/src/types/components/chat-messages.ts +11 -11
  287. package/src/types/components/chat-palette.ts +11 -11
  288. package/src/types/components/chat-prompt-submit.ts +11 -11
  289. package/src/types/components/chat-prompt.ts +11 -11
  290. package/src/types/components/chat-reasoning.ts +11 -11
  291. package/src/types/components/chat-shimmer.ts +11 -11
  292. package/src/types/components/chat-tool.ts +11 -11
  293. package/src/types/components/chat.ts +11 -11
  294. package/src/types/components/chip.ts +17 -17
  295. package/src/types/components/color-picker.ts +11 -11
  296. package/src/types/components/command-palette.ts +11 -11
  297. package/src/types/components/compare.ts +11 -11
  298. package/src/types/components/container.ts +17 -11
  299. package/src/types/components/context-menu.ts +11 -11
  300. package/src/types/components/dashboard-group.ts +11 -11
  301. package/src/types/components/dashboard-navbar.ts +11 -11
  302. package/src/types/components/dashboard-panel.ts +11 -11
  303. package/src/types/components/dashboard-resize-handle.ts +11 -11
  304. package/src/types/components/dashboard-search-button.ts +11 -11
  305. package/src/types/components/dashboard-search.ts +11 -11
  306. package/src/types/components/dashboard-sidebar-collapse.ts +11 -11
  307. package/src/types/components/dashboard-sidebar-toggle.ts +11 -11
  308. package/src/types/components/dashboard-sidebar.ts +11 -11
  309. package/src/types/components/dashboard-toolbar.ts +11 -11
  310. package/src/types/components/dock.ts +11 -11
  311. package/src/types/components/editor.ts +11 -11
  312. package/src/types/components/empty.ts +11 -11
  313. package/src/types/components/error.ts +11 -11
  314. package/src/types/components/fieldset.ts +11 -11
  315. package/src/types/components/floating-action.ts +11 -11
  316. package/src/types/components/form.ts +19 -11
  317. package/src/types/components/gallery.ts +11 -11
  318. package/src/types/components/icon.ts +19 -20
  319. package/src/types/components/image.ts +27 -10
  320. package/src/types/components/index.ts +2 -1
  321. package/src/types/components/input-date.ts +11 -11
  322. package/src/types/components/input-menu.ts +43 -44
  323. package/src/types/components/input-number.ts +11 -11
  324. package/src/types/components/input-pin.ts +35 -11
  325. package/src/types/components/input-tags.ts +11 -11
  326. package/src/types/components/input-time.ts +11 -11
  327. package/src/types/components/knob.ts +11 -11
  328. package/src/types/components/link-group.ts +23 -11
  329. package/src/types/components/listbox.ts +11 -11
  330. package/src/types/components/locale-selector.ts +28 -28
  331. package/src/types/components/logo.ts +31 -27
  332. package/src/types/components/main.ts +15 -15
  333. package/src/types/components/megamenu.ts +11 -11
  334. package/src/types/components/meter.ts +11 -11
  335. package/src/types/components/modal.ts +39 -40
  336. package/src/types/components/navigation-menu.ts +54 -54
  337. package/src/types/components/page-aside.ts +11 -11
  338. package/src/types/components/page-body.ts +11 -11
  339. package/src/types/components/page-header.ts +11 -11
  340. package/src/types/components/page.ts +11 -11
  341. package/src/types/components/password.ts +11 -11
  342. package/src/types/components/phone-mockup.ts +5 -5
  343. package/src/types/components/pin-input.ts +11 -0
  344. package/src/types/components/popover.ts +23 -24
  345. package/src/types/components/post.ts +35 -11
  346. package/src/types/components/posts.ts +11 -0
  347. package/src/types/components/pricing-plan.ts +11 -11
  348. package/src/types/components/pricing-table.ts +11 -11
  349. package/src/types/components/progress.ts +33 -34
  350. package/src/types/components/prose.ts +11 -11
  351. package/src/types/components/qr-code.ts +11 -11
  352. package/src/types/components/radio-group.ts +11 -11
  353. package/src/types/components/rating.ts +11 -11
  354. package/src/types/components/scroll-area.ts +23 -24
  355. package/src/types/components/separator.ts +19 -20
  356. package/src/types/components/sidebar.ts +72 -37
  357. package/src/types/components/slideover.ts +31 -32
  358. package/src/types/components/speed-dial.ts +11 -11
  359. package/src/types/components/spinner.ts +25 -26
  360. package/src/types/components/splitter.ts +19 -20
  361. package/src/types/components/spoiler.ts +11 -11
  362. package/src/types/components/stepper.ts +11 -11
  363. package/src/types/components/sticky-surface.ts +19 -20
  364. package/src/types/components/switch.ts +41 -42
  365. package/src/types/components/table-of-contents.ts +17 -11
  366. package/src/types/components/theme-selector.ts +13 -13
  367. package/src/types/components/timeline.ts +11 -11
  368. package/src/types/components/tooltip.ts +23 -24
  369. package/src/types/components/tour.ts +11 -11
  370. package/src/types/components/tree.ts +11 -11
  371. package/src/types/components/user.ts +11 -11
  372. package/src/types/components/watermark.ts +11 -11
  373. package/src/types/components/window-mockup.ts +11 -11
  374. package/src/utils/docs.ts +189 -0
  375. package/src/utils/headerStack.ts +95 -88
  376. package/src/utils/index.ts +5 -4
  377. package/src/components/astro/RLAInputPin.astro +0 -19
  378. package/src/integrations/vue-entrypoint.ts +0 -6
  379. package/src/nuxt.ts +0 -125
  380. package/src/plugins/starlightAddons/PageTitle.astro +0 -113
  381. package/src/plugins/starlightAddons/index.ts +0 -58
  382. package/src/plugins/starlightAddons/starlight.d.ts +0 -6
  383. package/src/themes/input-pin.theme.ts +0 -10
@@ -1,19 +1,23 @@
1
- ---
2
- import { scv } from "css-variants"
3
- import { useUi, resolveClasses } from "../../utils"
4
- import type { UserProps } from "../../types"
5
- import userThemeDefault from "../../themes/user.theme"
6
-
7
- const user = scv(userThemeDefault)
8
-
9
- const {
10
- ui: uiProp,
11
- class: className,
12
- ...rest
13
- } = Astro.props as UserProps
14
-
15
- const classes = resolveClasses(user, {}, useUi("user", uiProp), className);
16
- ---
17
- <div class={classes.root} data-slot="root" {...rest}>
18
- <slot />
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { UserProps } from "../../types"
5
+ import userThemeDefault, { createUserTheme } from "../../themes/user.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const uiConfig = getUIConfig()
9
+ const userTheme = uiConfig.colors ? createUserTheme() : userThemeDefault
10
+
11
+ const user = scv(userTheme)
12
+
13
+ const {
14
+ ui: uiProp,
15
+ class: className,
16
+ ...rest
17
+ } = Astro.props as UserProps
18
+
19
+ const classes = resolveClasses(user, {}, useUi("user", uiProp), className);
20
+ ---
21
+ <div class={classes.root} data-slot="root" {...rest}>
22
+ <slot />
19
23
  </div>
@@ -1,197 +1,201 @@
1
- ---
2
- import { scv } from "css-variants"
3
- import { useUi, resolveClasses } from "../../utils"
4
- import type { VideoProps } from "../../types"
5
- import videoTheme from "../../themes/video.theme"
6
- import { Image } from "astro:assets"
7
-
8
- const PLACEHOLDER_THUMBNAIL = "/assets/placeholder.webp";
9
- const YOUTUBE_EMBED_BASE = "https://www.youtube.com/embed/";
10
- const VALID_ID_PATTERN = /^[\w-]{11}$/;
11
- const KNOWN_PREFIXES = ["www.", "m.", "music.", "gaming."];
12
- const YOUTUBE_THUMB_BASE = "https://i3.ytimg.com/vi/";
13
- const MAXRES_THUMBNAIL = "maxresdefault.jpg";
14
- const DEFAULT_THUMBNAIL = "hqdefault.jpg";
15
-
16
- const thumbnailAvailabilityCache = new Map<string, boolean>();
17
-
18
- function normalizeHost(host: string): string {
19
- for (const prefix of KNOWN_PREFIXES) {
20
- if (host.startsWith(prefix)) {
21
- return host.slice(prefix.length);
22
- }
23
- }
24
- return host;
25
- }
26
-
27
- function sanitizeVideoId(id: string | null): string | null {
28
- if (!id) return null;
29
- return VALID_ID_PATTERN.test(id) ? id : null;
30
- }
31
-
32
- function extractYoutubeVideoId(rawUrl: string): string | null {
33
- if (!rawUrl) return null;
34
-
35
- try {
36
- const url = new URL(rawUrl);
37
- const host = normalizeHost(url.hostname);
38
-
39
- if (host === "youtu.be") {
40
- const id = url.pathname.split("/").filter(Boolean)[0] ?? null;
41
- return sanitizeVideoId(id);
42
- }
43
-
44
- if (host.endsWith("youtube.com")) {
45
- const paramsId = sanitizeVideoId(url.searchParams.get("v"));
46
- if (paramsId) return paramsId;
47
-
48
- const segments = url.pathname.split("/").filter(Boolean);
49
- if (!segments.length) return null;
50
-
51
- if (segments[0] === "embed" || segments[0] === "shorts" || segments[0] === "live") {
52
- return sanitizeVideoId(segments[1] ?? null);
53
- }
54
-
55
- return sanitizeVideoId(segments[segments.length - 1] ?? null);
56
- }
57
- } catch {
58
- // If it's just an 11-character ID passed directly, return it validated
59
- if (VALID_ID_PATTERN.test(rawUrl)) {
60
- return rawUrl;
61
- }
62
- return null;
63
- }
64
-
65
- return null;
66
- }
67
-
68
- async function isThumbnailAvailable(url: string): Promise<boolean> {
69
- if (thumbnailAvailabilityCache.has(url)) {
70
- return thumbnailAvailabilityCache.get(url)!;
71
- }
72
-
73
- if (typeof fetch !== "function") {
74
- return false;
75
- }
76
-
77
- try {
78
- const response = await fetch(url, { method: "HEAD" });
79
- let available = response.ok;
80
-
81
- if (!available && response.status === 405) {
82
- const getResponse = await fetch(url, { method: "GET" });
83
- available = getResponse.ok;
84
- }
85
-
86
- thumbnailAvailabilityCache.set(url, available);
87
- return available;
88
- } catch {
89
- return false;
90
- }
91
- }
92
-
93
- async function getYoutubeThumbnail(rawUrl: string): Promise<string> {
94
- const id = extractYoutubeVideoId(rawUrl);
95
- if (!id) return PLACEHOLDER_THUMBNAIL;
96
-
97
- const baseUrl = `${YOUTUBE_THUMB_BASE}${id}`;
98
- const maxResUrl = `${baseUrl}/${MAXRES_THUMBNAIL}`;
99
-
100
- if (await isThumbnailAvailable(maxResUrl)) {
101
- return maxResUrl;
102
- }
103
-
104
- return `${baseUrl}/${DEFAULT_THUMBNAIL}`;
105
- }
106
-
107
- function getYoutubeEmbedUrl(rawUrl: string): string | null {
108
- const id = extractYoutubeVideoId(rawUrl);
109
- return id ? `${YOUTUBE_EMBED_BASE}${id}?autoplay=1` : null;
110
- }
111
-
112
- const video = scv(videoTheme)
113
-
114
- const {
115
- src,
116
- title = "YouTube Video Player",
117
- icon = "i-lucide-play",
118
- ui: uiProp,
119
- class: className,
120
- ...rest
121
- } = Astro.props as VideoProps
122
-
123
- const classes = resolveClasses(video, {
124
- title: !!(Astro.slots.has("title") || title),
125
- icon: !!(Astro.slots.has("icon") || icon),
126
- }, useUi("video", uiProp), className);
127
-
128
- const embedUrl = getYoutubeEmbedUrl(src);
129
- const thumbnail = await getYoutubeThumbnail(src);
130
- const isPlayable = Boolean(embedUrl);
131
- const ariaLabel = isPlayable ? "Play YouTube Video" : "YouTube Video Unavailable";
132
- ---
133
-
134
- <div
135
- class:list={[classes.root]}
136
- {...rest}
137
- >
138
- <button
139
- type="button"
140
- data-youtube-trigger
141
- aria-label={ariaLabel}
142
- data-embed-url={isPlayable ? embedUrl : undefined}
143
- disabled={!isPlayable}
144
- data-video-title={title}
145
- class:list={[classes.trigger]}
146
- >
147
- <Image
148
- layout="full-width"
149
- src={thumbnail}
150
- alt={title}
151
- width="1280"
152
- height="720"
153
- loading="lazy"
154
- class:list={[classes.image]}
155
- />
156
-
157
- <slot name="icon">
158
- <span class:list={[classes.icon, icon]} aria-hidden="true" />
159
- </slot>
160
- </button>
161
- </div>
162
-
163
- <script is:inline>
164
- (() => {
165
- const root = document.currentScript?.previousElementSibling;
166
- if (!(root instanceof HTMLElement)) return;
167
-
168
- const trigger = root.querySelector("[data-youtube-trigger]");
169
- if (!(trigger instanceof HTMLButtonElement)) return;
170
-
171
- const embedUrl = trigger.dataset.embedUrl;
172
- const title = trigger.dataset.videoTitle;
173
- if (!embedUrl) return;
174
-
175
- const activate = () => {
176
- const iframe = document.createElement("iframe");
177
- iframe.src = embedUrl;
178
- iframe.title = title;
179
- iframe.allow =
180
- "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share";
181
- iframe.allowFullscreen = true;
182
- iframe.loading = "lazy";
183
- iframe.referrerPolicy = "strict-origin-when-cross-origin";
184
- iframe.classList.add("w-full", "h-full", "absolute", "inset-0");
185
-
186
- root.replaceChildren(iframe);
187
- };
188
-
189
- trigger.addEventListener("click", activate, { once: true });
190
- trigger.addEventListener("keydown", (event) => {
191
- if (event.key === "Enter" || event.key === " ") {
192
- event.preventDefault();
193
- activate();
194
- }
195
- }, { once: true });
196
- })();
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { VideoProps } from "../../types"
5
+ import videoThemeDefault, { createVideoTheme } from "../../themes/video.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+ import Image from "astro/components/Image.astro"
8
+
9
+ const PLACEHOLDER_THUMBNAIL = "/assets/placeholder.webp";
10
+ const YOUTUBE_EMBED_BASE = "https://www.youtube.com/embed/";
11
+ const VALID_ID_PATTERN = /^[\w-]{11}$/;
12
+ const KNOWN_PREFIXES = ["www.", "m.", "music.", "gaming."];
13
+ const YOUTUBE_THUMB_BASE = "https://i3.ytimg.com/vi/";
14
+ const MAXRES_THUMBNAIL = "maxresdefault.jpg";
15
+ const DEFAULT_THUMBNAIL = "hqdefault.jpg";
16
+
17
+ const thumbnailAvailabilityCache = new Map<string, boolean>();
18
+
19
+ function normalizeHost(host: string): string {
20
+ for (const prefix of KNOWN_PREFIXES) {
21
+ if (host.startsWith(prefix)) {
22
+ return host.slice(prefix.length);
23
+ }
24
+ }
25
+ return host;
26
+ }
27
+
28
+ function sanitizeVideoId(id: string | null): string | null {
29
+ if (!id) return null;
30
+ return VALID_ID_PATTERN.test(id) ? id : null;
31
+ }
32
+
33
+ function extractYoutubeVideoId(rawUrl: string): string | null {
34
+ if (!rawUrl) return null;
35
+
36
+ try {
37
+ const url = new URL(rawUrl);
38
+ const host = normalizeHost(url.hostname);
39
+
40
+ if (host === "youtu.be") {
41
+ const id = url.pathname.split("/").find(Boolean) ?? null;
42
+ return sanitizeVideoId(id);
43
+ }
44
+
45
+ if (host.endsWith("youtube.com")) {
46
+ const paramsId = sanitizeVideoId(url.searchParams.get("v"));
47
+ if (paramsId) return paramsId;
48
+
49
+ const segments = url.pathname.split("/").filter(Boolean);
50
+ if (!segments.length) return null;
51
+
52
+ if (segments[0] === "embed" || segments[0] === "shorts" || segments[0] === "live") {
53
+ return sanitizeVideoId(segments[1] ?? null);
54
+ }
55
+
56
+ return sanitizeVideoId(segments[segments.length - 1] ?? null);
57
+ }
58
+ } catch {
59
+ // If it's just an 11-character ID passed directly, return it validated
60
+ if (VALID_ID_PATTERN.test(rawUrl)) {
61
+ return rawUrl;
62
+ }
63
+ return null;
64
+ }
65
+
66
+ return null;
67
+ }
68
+
69
+ async function isThumbnailAvailable(url: string): Promise<boolean> {
70
+ if (thumbnailAvailabilityCache.has(url)) {
71
+ return thumbnailAvailabilityCache.get(url)!;
72
+ }
73
+
74
+ if (typeof fetch !== "function") {
75
+ return false;
76
+ }
77
+
78
+ try {
79
+ const response = await fetch(url, { method: "HEAD" });
80
+ let available = response.ok;
81
+
82
+ if (!available && response.status === 405) {
83
+ const getResponse = await fetch(url, { method: "GET" });
84
+ available = getResponse.ok;
85
+ }
86
+
87
+ thumbnailAvailabilityCache.set(url, available);
88
+ return available;
89
+ } catch {
90
+ return false;
91
+ }
92
+ }
93
+
94
+ async function getYoutubeThumbnail(rawUrl: string): Promise<string> {
95
+ const id = extractYoutubeVideoId(rawUrl);
96
+ if (!id) return PLACEHOLDER_THUMBNAIL;
97
+
98
+ const baseUrl = `${YOUTUBE_THUMB_BASE}${id}`;
99
+ const maxResUrl = `${baseUrl}/${MAXRES_THUMBNAIL}`;
100
+
101
+ if (await isThumbnailAvailable(maxResUrl)) {
102
+ return maxResUrl;
103
+ }
104
+
105
+ return `${baseUrl}/${DEFAULT_THUMBNAIL}`;
106
+ }
107
+
108
+ function getYoutubeEmbedUrl(rawUrl: string): string | null {
109
+ const id = extractYoutubeVideoId(rawUrl);
110
+ return id ? `${YOUTUBE_EMBED_BASE}${id}?autoplay=1` : null;
111
+ }
112
+
113
+ const uiConfig = getUIConfig()
114
+ const videoTheme = uiConfig.colors ? createVideoTheme() : videoThemeDefault
115
+
116
+ const video = scv(videoTheme)
117
+
118
+ const {
119
+ src,
120
+ title = "YouTube Video Player",
121
+ icon = "i-lucide-play",
122
+ ui: uiProp,
123
+ class: className,
124
+ ...rest
125
+ } = Astro.props as VideoProps
126
+
127
+ const classes = resolveClasses(video, {
128
+ title: !!(Astro.slots.has("title") || title),
129
+ icon: !!(Astro.slots.has("icon") || icon),
130
+ }, useUi("video", uiProp), className);
131
+
132
+ const embedUrl = getYoutubeEmbedUrl(src);
133
+ const thumbnail = await getYoutubeThumbnail(src);
134
+ const isPlayable = Boolean(embedUrl);
135
+ const ariaLabel = isPlayable ? "Play YouTube Video" : "YouTube Video Unavailable";
136
+ ---
137
+
138
+ <div
139
+ class:list={[classes.root]}
140
+ {...rest}
141
+ >
142
+ <button
143
+ type="button"
144
+ data-youtube-trigger
145
+ aria-label={ariaLabel}
146
+ data-embed-url={isPlayable ? embedUrl : undefined}
147
+ disabled={!isPlayable}
148
+ data-video-title={title}
149
+ class:list={[classes.trigger]}
150
+ >
151
+ <Image
152
+ layout="full-width"
153
+ src={thumbnail}
154
+ alt={title}
155
+ width="1280"
156
+ height="720"
157
+ loading="lazy"
158
+ class:list={[classes.image]}
159
+ />
160
+
161
+ <slot name="icon">
162
+ <span class:list={[classes.icon, icon]} aria-hidden="true" />
163
+ </slot>
164
+ </button>
165
+ </div>
166
+
167
+ <script is:inline>
168
+ (() => {
169
+ const root = document.currentScript?.previousElementSibling;
170
+ if (!(root instanceof HTMLElement)) return;
171
+
172
+ const trigger = root.querySelector("[data-youtube-trigger]");
173
+ if (!(trigger instanceof HTMLButtonElement)) return;
174
+
175
+ const embedUrl = trigger.dataset.embedUrl;
176
+ const title = trigger.dataset.videoTitle;
177
+ if (!embedUrl) return;
178
+
179
+ const activate = () => {
180
+ const iframe = document.createElement("iframe");
181
+ iframe.src = embedUrl;
182
+ iframe.title = title;
183
+ iframe.allow =
184
+ "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share";
185
+ iframe.allowFullscreen = true;
186
+ iframe.loading = "lazy";
187
+ iframe.referrerPolicy = "strict-origin-when-cross-origin";
188
+ iframe.classList.add("w-full", "h-full", "absolute", "inset-0");
189
+
190
+ root.replaceChildren(iframe);
191
+ };
192
+
193
+ trigger.addEventListener("click", activate, { once: true });
194
+ trigger.addEventListener("keydown", (event) => {
195
+ if (event.key === "Enter" || event.key === " ") {
196
+ event.preventDefault();
197
+ activate();
198
+ }
199
+ }, { once: true });
200
+ })();
197
201
  </script>
@@ -1,19 +1,23 @@
1
- ---
2
- import { scv } from "css-variants"
3
- import { useUi, resolveClasses } from "../../utils"
4
- import type { WatermarkProps } from "../../types"
5
- import watermarkThemeDefault from "../../themes/watermark.theme"
6
-
7
- const watermark = scv(watermarkThemeDefault)
8
-
9
- const {
10
- ui: uiProp,
11
- class: className,
12
- ...rest
13
- } = Astro.props as WatermarkProps
14
-
15
- const classes = resolveClasses(watermark, {}, useUi("watermark", uiProp), className);
16
- ---
17
- <div class={classes.root} data-slot="root" {...rest}>
18
- <slot />
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { WatermarkProps } from "../../types"
5
+ import watermarkThemeDefault, { createWatermarkTheme } from "../../themes/watermark.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const uiConfig = getUIConfig()
9
+ const watermarkTheme = uiConfig.colors ? createWatermarkTheme() : watermarkThemeDefault
10
+
11
+ const watermark = scv(watermarkTheme)
12
+
13
+ const {
14
+ ui: uiProp,
15
+ class: className,
16
+ ...rest
17
+ } = Astro.props as WatermarkProps
18
+
19
+ const classes = resolveClasses(watermark, {}, useUi("watermark", uiProp), className);
20
+ ---
21
+ <div class={classes.root} data-slot="root" {...rest}>
22
+ <slot />
19
23
  </div>
@@ -1,19 +1,23 @@
1
- ---
2
- import { scv } from "css-variants"
3
- import { useUi, resolveClasses } from "../../utils"
4
- import type { WindowMockupProps } from "../../types"
5
- import windowMockupThemeDefault from "../../themes/window-mockup.theme"
6
-
7
- const windowMockup = scv(windowMockupThemeDefault)
8
-
9
- const {
10
- ui: uiProp,
11
- class: className,
12
- ...rest
13
- } = Astro.props as WindowMockupProps
14
-
15
- const classes = resolveClasses(windowMockup, {}, useUi("windowMockup", uiProp), className);
16
- ---
17
- <div class={classes.root} data-slot="root" {...rest}>
18
- <slot />
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { WindowMockupProps } from "../../types"
5
+ import windowMockupThemeDefault, { createWindowMockupTheme } from "../../themes/window-mockup.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const uiConfig = getUIConfig()
9
+ const windowMockupTheme = uiConfig.colors ? createWindowMockupTheme() : windowMockupThemeDefault
10
+
11
+ const windowMockup = scv(windowMockupTheme)
12
+
13
+ const {
14
+ ui: uiProp,
15
+ class: className,
16
+ ...rest
17
+ } = Astro.props as WindowMockupProps
18
+
19
+ const classes = resolveClasses(windowMockup, {}, useUi("windowMockup", uiProp), className);
20
+ ---
21
+ <div class={classes.root} data-slot="root" {...rest}>
22
+ <slot />
19
23
  </div>
@@ -0,0 +1,68 @@
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 { CheckboxProps } from "../../types/components/checkbox"
6
+ import checkboxTheme from "../../themes/checkbox.theme"
7
+
8
+ const checkbox = scv(checkboxTheme)
9
+
10
+ const props = withDefaults(defineProps<CheckboxProps & { modelValue?: boolean }>(), {
11
+ size: "md",
12
+ color: "primary"
13
+ })
14
+
15
+ const emit = defineEmits<{
16
+ (e: "update:modelValue", value: boolean): void
17
+ (e: "change", event: Event): void
18
+ }>()
19
+
20
+ const checked = computed({
21
+ get: () => props.modelValue ?? props.checked ?? false,
22
+ set: (val) => emit("update:modelValue", val)
23
+ })
24
+
25
+ const resolvedClasses = computed(() =>
26
+ resolveClasses(
27
+ checkbox,
28
+ {
29
+ size: props.size,
30
+ color: props.color,
31
+ disabled: props.disabled,
32
+ theme: props.theme
33
+ },
34
+ useUi("checkbox", props.ui),
35
+ props.class
36
+ )
37
+ )
38
+
39
+ function onChange(event: Event) {
40
+ const target = event.target as HTMLInputElement
41
+ checked.value = target.checked
42
+ emit("change", event)
43
+ }
44
+ </script>
45
+
46
+ <template>
47
+ <label :class="resolvedClasses.root" data-slot="root">
48
+ <div :class="resolvedClasses.container" data-slot="container">
49
+ <input
50
+ v-bind="$attrs"
51
+ type="checkbox"
52
+ :name="name"
53
+ :checked="checked"
54
+ :disabled="disabled"
55
+ :class="resolvedClasses.input"
56
+ data-slot="input"
57
+ @change="onChange"
58
+ />
59
+ <span v-if="checked" :class="resolvedClasses.indicator" data-slot="indicator">
60
+ <span class="i-lucide-check h-3 w-3 text-white" />
61
+ </span>
62
+ </div>
63
+ <span v-if="label" :class="resolvedClasses.label" data-slot="label">
64
+ {{ label }}
65
+ </span>
66
+ <slot />
67
+ </label>
68
+ </template>
@@ -0,0 +1,44 @@
1
+ <script setup lang="ts">
2
+ import { computed, ref } from "vue"
3
+ import { scv } from "css-variants"
4
+ import { useUi, resolveClasses } from "../../utils"
5
+ import type { FormProps } from "../../types/components/form"
6
+ import formTheme from "../../themes/form.theme"
7
+
8
+ const form = scv(formTheme)
9
+
10
+ const props = defineProps<FormProps>()
11
+
12
+ const emit = defineEmits<{
13
+ (e: "submit", event: { data: any }): void
14
+ (e: "error", errors: any[]): void
15
+ }>()
16
+
17
+ const resolvedClasses = computed(() =>
18
+ resolveClasses(form, {}, useUi("form", props.ui), props.class)
19
+ )
20
+
21
+ async function onSubmit(event: Event) {
22
+ event.preventDefault()
23
+
24
+ if (props.schema && props.state) {
25
+ try {
26
+ const data = await props.schema.parseAsync(props.state)
27
+ emit("submit", { data })
28
+ } catch (err: any) {
29
+ if (err.errors) {
30
+ emit("error", err.errors)
31
+ }
32
+ console.error("Form validation failed", err)
33
+ }
34
+ } else {
35
+ emit("submit", { data: props.state })
36
+ }
37
+ }
38
+ </script>
39
+
40
+ <template>
41
+ <form :class="resolvedClasses.root" data-slot="root" @submit="onSubmit">
42
+ <slot :ui="resolvedClasses" />
43
+ </form>
44
+ </template>