@rimelight/ui 0.0.31 → 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 (462) 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 +23 -0
  5. package/src/components/astro/RLAAlert.astro +93 -60
  6. package/src/components/astro/RLAApp.astro +23 -0
  7. package/src/components/astro/RLAAspectRatio.astro +27 -23
  8. package/src/components/astro/RLAAudio.astro +23 -0
  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 -31
  12. package/src/components/astro/RLABanner.astro +23 -0
  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 +23 -0
  17. package/src/components/astro/RLAButton.astro +54 -3
  18. package/src/components/astro/RLACalendar.astro +23 -0
  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 +23 -0
  22. package/src/components/astro/RLAChart.astro +33 -9
  23. package/src/components/astro/RLAChat.astro +23 -0
  24. package/src/components/astro/RLAChatMessage.astro +23 -0
  25. package/src/components/astro/RLAChatMessages.astro +23 -0
  26. package/src/components/astro/RLAChatPalette.astro +23 -0
  27. package/src/components/astro/RLAChatPrompt.astro +23 -0
  28. package/src/components/astro/RLAChatPromptSubmit.astro +23 -0
  29. package/src/components/astro/RLAChatReasoning.astro +23 -0
  30. package/src/components/astro/RLAChatShimmer.astro +23 -0
  31. package/src/components/astro/RLAChatTool.astro +23 -0
  32. package/src/components/astro/RLACheckbox.astro +3 -1
  33. package/src/components/astro/RLAChip.astro +51 -0
  34. package/src/components/astro/RLAColorPicker.astro +23 -0
  35. package/src/components/astro/RLACommandPalette.astro +23 -0
  36. package/src/components/astro/RLACompare.astro +23 -0
  37. package/src/components/astro/{RLAAlertDialog.astro → RLAConfirm.astro} +117 -86
  38. package/src/components/astro/RLAContainer.astro +23 -0
  39. package/src/components/astro/RLAContextMenu.astro +23 -0
  40. package/src/components/astro/RLADashboardGroup.astro +23 -0
  41. package/src/components/astro/RLADashboardNavbar.astro +23 -0
  42. package/src/components/astro/RLADashboardPanel.astro +23 -0
  43. package/src/components/astro/RLADashboardResizeHandle.astro +23 -0
  44. package/src/components/astro/RLADashboardSearch.astro +23 -0
  45. package/src/components/astro/RLADashboardSearchButton.astro +23 -0
  46. package/src/components/astro/RLADashboardSidebar.astro +23 -0
  47. package/src/components/astro/RLADashboardSidebarCollapse.astro +23 -0
  48. package/src/components/astro/RLADashboardSidebarToggle.astro +23 -0
  49. package/src/components/astro/RLADashboardToolbar.astro +23 -0
  50. package/src/components/astro/RLADock.astro +23 -0
  51. package/src/{plugins/starlightAddons/components/Gamepad.astro → components/astro/RLADocsGamepad.astro} +178 -180
  52. package/src/{plugins/starlightAddons/components/Keyboard.astro → components/astro/RLADocsKeyboard.astro} +1 -3
  53. package/src/{plugins/starlightAddons/PackageManagers.astro → components/astro/RLADocsPackageManagers.astro} +28 -14
  54. package/src/components/astro/RLADrawer.astro +78 -74
  55. package/src/components/astro/RLADropdownMenu.astro +1 -1
  56. package/src/components/astro/RLAEditor.astro +23 -0
  57. package/src/components/astro/RLAEmpty.astro +23 -0
  58. package/src/components/astro/RLAError.astro +23 -0
  59. package/src/components/astro/{RLAInputGroup.astro → RLAFieldGroup.astro} +7 -7
  60. package/src/components/astro/RLAFieldset.astro +23 -0
  61. package/src/components/astro/{RLADropzone.astro → RLAFileUpload.astro} +14 -14
  62. package/src/components/astro/RLAFloatingAction.astro +23 -0
  63. package/src/components/astro/RLAFooter.astro +39 -35
  64. package/src/components/astro/RLAForm.astro +23 -0
  65. package/src/components/astro/{RLAField.astro → RLAFormField.astro} +7 -7
  66. package/src/components/astro/RLAGallery.astro +23 -0
  67. package/src/components/astro/RLAGrid.astro +39 -0
  68. package/src/components/astro/RLAHead.astro +25 -9
  69. package/src/components/astro/RLAHeader.astro +59 -107
  70. package/src/components/astro/RLAHoverCard.astro +35 -31
  71. package/src/components/astro/RLAIcon.astro +31 -27
  72. package/src/components/astro/RLAImage.astro +209 -0
  73. package/src/components/astro/RLAInput.astro +3 -1
  74. package/src/components/astro/RLAInputDate.astro +23 -0
  75. package/src/components/astro/{RLACombobox.astro → RLAInputMenu.astro} +22 -22
  76. package/src/components/astro/RLAInputNumber.astro +23 -0
  77. package/src/components/astro/RLAInputTags.astro +23 -0
  78. package/src/components/astro/RLAInputTime.astro +23 -0
  79. package/src/components/astro/RLAKbd.astro +32 -22
  80. package/src/components/astro/RLAKnob.astro +23 -0
  81. package/src/components/astro/RLALabel.astro +27 -23
  82. package/src/components/astro/RLALink.astro +23 -0
  83. package/src/components/astro/RLALinkGroup.astro +38 -0
  84. package/src/components/astro/RLAListbox.astro +23 -0
  85. package/src/components/astro/RLALocaleSelector.astro +5 -1
  86. package/src/components/astro/RLALogo.astro +90 -56
  87. package/src/components/astro/RLAMain.astro +8 -2
  88. package/src/components/astro/RLAMarquee.astro +36 -32
  89. package/src/components/astro/RLAMegamenu.astro +23 -0
  90. package/src/components/astro/RLAMeter.astro +23 -0
  91. package/src/components/astro/{RLADialog.astro → RLAModal.astro} +99 -95
  92. package/src/components/astro/RLANavigationMenu.astro +137 -136
  93. package/src/components/astro/RLAPage.astro +23 -0
  94. package/src/components/astro/RLAPageAside.astro +23 -0
  95. package/src/components/astro/RLAPageBody.astro +23 -0
  96. package/src/components/astro/RLAPageHeader.astro +23 -0
  97. package/src/components/astro/{RLASection.astro → RLAPageSection.astro} +10 -6
  98. package/src/components/astro/RLAPagination.astro +98 -94
  99. package/src/components/astro/RLAPassword.astro +23 -0
  100. package/src/components/astro/RLAPhoneMockup.astro +23 -0
  101. package/src/components/astro/RLAPinInput.astro +23 -0
  102. package/src/components/astro/RLAPlaceholder.astro +45 -41
  103. package/src/components/astro/RLAPopover.astro +35 -31
  104. package/src/components/astro/RLAPost.astro +65 -0
  105. package/src/components/astro/RLAPosts.astro +23 -0
  106. package/src/components/astro/RLAPricingPlan.astro +23 -0
  107. package/src/components/astro/RLAPricingTable.astro +23 -0
  108. package/src/components/astro/RLAProgress.astro +3 -1
  109. package/src/components/astro/RLAProse.astro +23 -0
  110. package/src/components/astro/RLAQrCode.astro +23 -0
  111. package/src/components/astro/RLARadioGroup.astro +23 -0
  112. package/src/components/astro/RLARating.astro +23 -0
  113. package/src/components/astro/RLAScrollArea.astro +1 -1
  114. package/src/components/astro/RLAScrollToTop.astro +172 -159
  115. package/src/components/astro/RLASeparator.astro +78 -27
  116. package/src/components/astro/RLASidebar.astro +212 -135
  117. package/src/components/astro/RLASkeleton.astro +24 -20
  118. package/src/components/astro/{RLASheet.astro → RLASlideover.astro} +76 -72
  119. package/src/components/astro/RLASlider.astro +8 -3
  120. package/src/components/astro/RLASpeedDial.astro +23 -0
  121. package/src/components/astro/RLASpinner.astro +3 -1
  122. package/src/components/astro/{RLAResizable.astro → RLASplitter.astro} +7 -7
  123. package/src/components/astro/RLASpoiler.astro +23 -0
  124. package/src/components/astro/RLAStepper.astro +23 -0
  125. package/src/components/astro/RLASteps.astro +71 -0
  126. package/src/components/astro/RLAStickySurface.astro +31 -27
  127. package/src/components/astro/RLASwitch.astro +3 -1
  128. package/src/components/astro/RLATableOfContents.astro +23 -0
  129. package/src/components/astro/RLATabs.astro +133 -92
  130. package/src/components/astro/RLAThemeSelector.astro +5 -1
  131. package/src/components/astro/RLATimeline.astro +23 -0
  132. package/src/components/astro/RLATooltip.astro +35 -31
  133. package/src/components/astro/RLATour.astro +23 -0
  134. package/src/components/astro/RLATree.astro +23 -0
  135. package/src/components/astro/RLAUser.astro +23 -0
  136. package/src/components/astro/{RLAEmbedYoutube.astro → RLAVideo.astro} +200 -196
  137. package/src/components/astro/RLAWatermark.astro +23 -0
  138. package/src/components/astro/RLAWindowMockup.astro +23 -0
  139. package/src/components/vue/RLVCheckbox.vue +68 -0
  140. package/src/components/vue/RLVForm.vue +44 -0
  141. package/src/components/vue/RLVFormField.vue +58 -0
  142. package/src/components/vue/RLVInput.vue +93 -0
  143. package/src/components/vue/RLVPost.vue +63 -0
  144. package/src/components/vue/RLVPosts.vue +21 -0
  145. package/src/components/vue/RLVSection.vue +5 -4
  146. package/src/components/vue/RLVToast.vue +68 -0
  147. package/src/components/vue/RLVToaster.vue +29 -0
  148. package/src/composables/index.ts +3 -1
  149. package/src/composables/useHeaderStore.ts +14 -0
  150. package/src/composables/useScrollToTop.ts +62 -62
  151. package/src/composables/useToast.ts +42 -0
  152. package/src/env.d.ts +0 -13
  153. package/src/integrations/ui.ts +199 -143
  154. package/src/plugins/index.ts +2 -5
  155. package/src/plugins/starlightDocsApi/index.ts +272 -265
  156. package/src/presets/defaults.ts +297 -0
  157. package/src/presets/index.ts +637 -256
  158. package/src/styles/index.css +160 -156
  159. package/src/themes/3d-hover.theme.ts +13 -0
  160. package/src/themes/accordion.theme.ts +13 -0
  161. package/src/themes/alert.theme.ts +125 -51
  162. package/src/themes/app.theme.ts +13 -0
  163. package/src/themes/aspect-ratio.theme.ts +13 -0
  164. package/src/themes/audio.theme.ts +13 -0
  165. package/src/themes/avatar-group.theme.ts +12 -0
  166. package/src/themes/avatar.theme.ts +84 -28
  167. package/src/themes/badge.theme.ts +163 -61
  168. package/src/themes/banner.theme.ts +13 -0
  169. package/src/themes/breadcrumb.theme.ts +14 -12
  170. package/src/themes/browser-mockup.theme.ts +13 -0
  171. package/src/themes/button.theme.ts +202 -190
  172. package/src/themes/calendar.theme.ts +13 -0
  173. package/src/themes/card.theme.ts +42 -34
  174. package/src/themes/carousel.theme.ts +30 -28
  175. package/src/themes/changelog.theme.ts +13 -0
  176. package/src/themes/chart.theme.ts +22 -21
  177. package/src/themes/chat-message.theme.ts +13 -0
  178. package/src/themes/chat-messages.theme.ts +13 -0
  179. package/src/themes/chat-palette.theme.ts +13 -0
  180. package/src/themes/chat-prompt-submit.theme.ts +13 -0
  181. package/src/themes/chat-prompt.theme.ts +13 -0
  182. package/src/themes/chat-reasoning.theme.ts +13 -0
  183. package/src/themes/chat-shimmer.theme.ts +13 -0
  184. package/src/themes/chat-tool.theme.ts +13 -0
  185. package/src/themes/chat.theme.ts +13 -0
  186. package/src/themes/checkbox.theme.ts +50 -42
  187. package/src/themes/chip.theme.ts +74 -0
  188. package/src/themes/color-picker.theme.ts +13 -0
  189. package/src/themes/command-palette.theme.ts +13 -0
  190. package/src/themes/compare.theme.ts +13 -0
  191. package/src/themes/confirm.theme.ts +48 -0
  192. package/src/themes/container.theme.ts +13 -0
  193. package/src/themes/context-menu.theme.ts +13 -0
  194. package/src/themes/dashboard-group.theme.ts +13 -0
  195. package/src/themes/dashboard-navbar.theme.ts +13 -0
  196. package/src/themes/dashboard-panel.theme.ts +13 -0
  197. package/src/themes/dashboard-resize-handle.theme.ts +13 -0
  198. package/src/themes/dashboard-search-button.theme.ts +13 -0
  199. package/src/themes/dashboard-search.theme.ts +13 -0
  200. package/src/themes/dashboard-sidebar-collapse.theme.ts +13 -0
  201. package/src/themes/dashboard-sidebar-toggle.theme.ts +13 -0
  202. package/src/themes/dashboard-sidebar.theme.ts +13 -0
  203. package/src/themes/dashboard-toolbar.theme.ts +13 -0
  204. package/src/themes/dock.theme.ts +13 -0
  205. package/src/themes/drawer.theme.ts +61 -44
  206. package/src/themes/{dropdownMenu.theme.ts → dropdown-menu.theme.ts} +29 -27
  207. package/src/themes/editor.theme.ts +13 -0
  208. package/src/themes/empty.theme.ts +13 -0
  209. package/src/themes/error.theme.ts +13 -0
  210. package/src/themes/{inputGroup.theme.ts → field-group.theme.ts} +24 -23
  211. package/src/themes/fieldset.theme.ts +13 -0
  212. package/src/themes/{dropzone.theme.ts → file-upload.theme.ts} +2 -2
  213. package/src/themes/floating-action.theme.ts +13 -0
  214. package/src/themes/footer.theme.ts +30 -27
  215. package/src/themes/{field.theme.ts → form-field.theme.ts} +2 -2
  216. package/src/themes/form.theme.ts +13 -0
  217. package/src/themes/gallery.theme.ts +13 -0
  218. package/src/themes/head.theme.ts +13 -0
  219. package/src/themes/header.theme.ts +46 -43
  220. package/src/themes/hover-card.theme.ts +29 -0
  221. package/src/themes/icon.theme.ts +23 -20
  222. package/src/themes/image.theme.ts +19 -0
  223. package/src/themes/input-date.theme.ts +13 -0
  224. package/src/themes/input-menu.theme.ts +35 -0
  225. package/src/themes/input-number.theme.ts +13 -0
  226. package/src/themes/input-tags.theme.ts +13 -0
  227. package/src/themes/input-time.theme.ts +13 -0
  228. package/src/themes/input.theme.ts +42 -36
  229. package/src/themes/kbd.theme.ts +89 -24
  230. package/src/themes/knob.theme.ts +13 -0
  231. package/src/themes/label.theme.ts +18 -16
  232. package/src/themes/link-group.theme.ts +32 -0
  233. package/src/themes/link.theme.ts +13 -0
  234. package/src/themes/listbox.theme.ts +13 -0
  235. package/src/themes/locale-selector.theme.ts +49 -0
  236. package/src/themes/logo.theme.ts +13 -10
  237. package/src/themes/main.theme.ts +7 -6
  238. package/src/themes/marquee.theme.ts +24 -22
  239. package/src/themes/megamenu.theme.ts +13 -0
  240. package/src/themes/meter.theme.ts +13 -0
  241. package/src/themes/modal.theme.ts +49 -0
  242. package/src/themes/navigation-menu.theme.ts +27 -0
  243. package/src/themes/page-aside.theme.ts +13 -0
  244. package/src/themes/page-body.theme.ts +13 -0
  245. package/src/themes/page-header.theme.ts +13 -0
  246. package/src/themes/page-section.theme.ts +187 -0
  247. package/src/themes/page.theme.ts +13 -0
  248. package/src/themes/pagination.theme.ts +24 -22
  249. package/src/themes/password.theme.ts +13 -0
  250. package/src/themes/phone-mockup.theme.ts +13 -0
  251. package/src/themes/pin-input.theme.ts +14 -0
  252. package/src/themes/placeholder.theme.ts +15 -12
  253. package/src/themes/popover.theme.ts +26 -24
  254. package/src/themes/post.theme.ts +33 -0
  255. package/src/themes/posts.theme.ts +13 -0
  256. package/src/themes/pricing-plan.theme.ts +13 -0
  257. package/src/themes/pricing-table.theme.ts +13 -0
  258. package/src/themes/progress.theme.ts +38 -26
  259. package/src/themes/prose.theme.ts +13 -0
  260. package/src/themes/qr-code.theme.ts +13 -0
  261. package/src/themes/quote.theme.ts +13 -0
  262. package/src/themes/radio-group.theme.ts +13 -0
  263. package/src/themes/rating.theme.ts +13 -0
  264. package/src/themes/{scrollArea.theme.ts → scroll-area.theme.ts} +26 -24
  265. package/src/themes/scroll-to-top.theme.ts +52 -46
  266. package/src/themes/select.theme.ts +29 -27
  267. package/src/themes/separator.theme.ts +147 -19
  268. package/src/themes/sidebar.theme.ts +38 -33
  269. package/src/themes/skeleton.theme.ts +21 -20
  270. package/src/themes/slideover.theme.ts +59 -0
  271. package/src/themes/slider.theme.ts +36 -28
  272. package/src/themes/speed-dial.theme.ts +13 -0
  273. package/src/themes/spinner.theme.ts +34 -30
  274. package/src/themes/{resizable.theme.ts → splitter.theme.ts} +23 -22
  275. package/src/themes/spoiler.theme.ts +13 -0
  276. package/src/themes/stepper.theme.ts +13 -0
  277. package/src/themes/sticky-surface.theme.ts +12 -0
  278. package/src/themes/switch.theme.ts +67 -59
  279. package/src/themes/table-of-contents.theme.ts +48 -0
  280. package/src/themes/tabs.theme.ts +52 -44
  281. package/src/themes/textarea.theme.ts +27 -26
  282. package/src/themes/theme-selector.theme.ts +15 -0
  283. package/src/themes/timeline.theme.ts +13 -0
  284. package/src/themes/toast.theme.ts +31 -25
  285. package/src/themes/tooltip.theme.ts +28 -27
  286. package/src/themes/tour.theme.ts +13 -0
  287. package/src/themes/tree.theme.ts +13 -0
  288. package/src/themes/user.theme.ts +13 -0
  289. package/src/themes/video.theme.ts +17 -0
  290. package/src/themes/watermark.theme.ts +13 -0
  291. package/src/themes/window-mockup.theme.ts +13 -0
  292. package/src/types/components/3d-hover.ts +11 -0
  293. package/src/types/components/accordion.ts +1 -1
  294. package/src/types/components/alert.ts +7 -1
  295. package/src/types/components/app.ts +11 -0
  296. package/src/types/components/aspect-ratio.ts +2 -2
  297. package/src/types/components/audio.ts +11 -0
  298. package/src/types/components/avatar-group.ts +11 -0
  299. package/src/types/components/avatar.ts +60 -47
  300. package/src/types/components/badge.ts +8 -2
  301. package/src/types/components/banner.ts +11 -0
  302. package/src/types/components/breadcrumb.ts +2 -2
  303. package/src/types/components/browser-mockup.ts +11 -0
  304. package/src/types/components/button.ts +81 -71
  305. package/src/types/components/calendar.ts +11 -0
  306. package/src/types/components/card.ts +2 -2
  307. package/src/types/components/carousel.ts +2 -2
  308. package/src/types/components/changelog.ts +11 -0
  309. package/src/types/components/chart.ts +2 -2
  310. package/src/types/components/chat-message.ts +11 -0
  311. package/src/types/components/chat-messages.ts +11 -0
  312. package/src/types/components/chat-palette.ts +11 -0
  313. package/src/types/components/chat-prompt-submit.ts +11 -0
  314. package/src/types/components/chat-prompt.ts +11 -0
  315. package/src/types/components/chat-reasoning.ts +11 -0
  316. package/src/types/components/chat-shimmer.ts +11 -0
  317. package/src/types/components/chat-tool.ts +11 -0
  318. package/src/types/components/chat.ts +11 -0
  319. package/src/types/components/checkbox.ts +8 -2
  320. package/src/types/components/chip.ts +17 -0
  321. package/src/types/components/collapsible.ts +2 -2
  322. package/src/types/components/color-picker.ts +11 -0
  323. package/src/types/components/command-palette.ts +11 -0
  324. package/src/types/components/compare.ts +11 -0
  325. package/src/types/components/{alert-dialog.ts → confirm.ts} +2 -2
  326. package/src/types/components/container.ts +17 -0
  327. package/src/types/components/context-menu.ts +11 -0
  328. package/src/types/components/dashboard-group.ts +11 -0
  329. package/src/types/components/dashboard-navbar.ts +11 -0
  330. package/src/types/components/dashboard-panel.ts +11 -0
  331. package/src/types/components/dashboard-resize-handle.ts +11 -0
  332. package/src/types/components/dashboard-search-button.ts +11 -0
  333. package/src/types/components/dashboard-search.ts +11 -0
  334. package/src/types/components/dashboard-sidebar-collapse.ts +11 -0
  335. package/src/types/components/dashboard-sidebar-toggle.ts +11 -0
  336. package/src/types/components/dashboard-sidebar.ts +11 -0
  337. package/src/types/components/dashboard-toolbar.ts +11 -0
  338. package/src/types/components/dock.ts +11 -0
  339. package/src/types/components/drawer.ts +2 -2
  340. package/src/types/components/dropdown-menu.ts +2 -2
  341. package/src/types/components/editor.ts +11 -0
  342. package/src/types/components/empty.ts +11 -0
  343. package/src/types/components/error.ts +11 -0
  344. package/src/types/components/{input-group.ts → field-group.ts} +3 -3
  345. package/src/types/components/fieldset.ts +11 -0
  346. package/src/types/components/{dropzone.ts → file-upload.ts} +4 -4
  347. package/src/types/components/floating-action.ts +11 -0
  348. package/src/types/components/footer.ts +1 -1
  349. package/src/types/components/{field.ts → form-field.ts} +3 -3
  350. package/src/types/components/form.ts +19 -0
  351. package/src/types/components/gallery.ts +11 -0
  352. package/src/types/components/header.ts +1 -1
  353. package/src/types/components/hover-card.ts +2 -2
  354. package/src/types/components/icon.ts +19 -19
  355. package/src/types/components/image.ts +28 -0
  356. package/src/types/components/index.ts +135 -60
  357. package/src/types/components/input-date.ts +11 -0
  358. package/src/types/components/{combobox.ts → input-menu.ts} +43 -43
  359. package/src/types/components/input-number.ts +11 -0
  360. package/src/types/components/{native-select.ts → input-pin.ts} +35 -39
  361. package/src/types/components/input-tags.ts +11 -0
  362. package/src/types/components/input-time.ts +11 -0
  363. package/src/types/components/input.ts +8 -2
  364. package/src/types/components/kbd.ts +2 -2
  365. package/src/types/components/knob.ts +11 -0
  366. package/src/types/components/label.ts +2 -2
  367. package/src/types/components/link-group.ts +23 -0
  368. package/src/types/components/link.ts +1 -1
  369. package/src/types/components/listbox.ts +11 -0
  370. package/src/types/components/locale-selector.ts +33 -0
  371. package/src/types/components/logo.ts +31 -27
  372. package/src/types/components/main.ts +15 -15
  373. package/src/types/components/marquee.ts +2 -2
  374. package/src/types/components/megamenu.ts +11 -0
  375. package/src/types/components/meter.ts +11 -0
  376. package/src/types/components/{dialog.ts → modal.ts} +39 -39
  377. package/src/types/components/navigation-menu.ts +54 -27
  378. package/src/types/components/page-aside.ts +11 -0
  379. package/src/types/components/page-body.ts +11 -0
  380. package/src/types/components/page-header.ts +11 -0
  381. package/src/types/components/{section.ts → page-section.ts} +2 -2
  382. package/src/types/components/page.ts +11 -0
  383. package/src/types/components/pagination.ts +2 -2
  384. package/src/types/components/password.ts +11 -0
  385. package/src/types/components/phone-mockup.ts +5 -0
  386. package/src/types/components/pin-input.ts +11 -0
  387. package/src/types/components/placeholder.ts +1 -1
  388. package/src/types/components/popover.ts +23 -23
  389. package/src/types/components/post.ts +35 -0
  390. package/src/types/components/posts.ts +11 -0
  391. package/src/types/components/pricing-plan.ts +11 -0
  392. package/src/types/components/pricing-table.ts +11 -0
  393. package/src/types/components/progress.ts +33 -27
  394. package/src/types/components/prose.ts +11 -0
  395. package/src/types/components/qr-code.ts +11 -0
  396. package/src/types/components/quote.ts +11 -0
  397. package/src/types/components/radio-group.ts +11 -0
  398. package/src/types/components/rating.ts +11 -0
  399. package/src/types/components/scroll-area.ts +23 -23
  400. package/src/types/components/scroll-to-top.ts +7 -1
  401. package/src/types/components/select.ts +2 -2
  402. package/src/types/components/separator.ts +19 -19
  403. package/src/types/components/sidebar.ts +72 -36
  404. package/src/types/components/skeleton.ts +2 -2
  405. package/src/types/components/{sheet.ts → slideover.ts} +31 -31
  406. package/src/types/components/slider.ts +8 -2
  407. package/src/types/components/speed-dial.ts +11 -0
  408. package/src/types/components/spinner.ts +25 -19
  409. package/src/types/components/{resizable.ts → splitter.ts} +19 -19
  410. package/src/types/components/spoiler.ts +11 -0
  411. package/src/types/components/stepper.ts +11 -0
  412. package/src/types/components/sticky-surface.ts +19 -19
  413. package/src/types/components/switch.ts +41 -35
  414. package/src/types/components/table-of-contents.ts +17 -0
  415. package/src/types/components/table.ts +2 -2
  416. package/src/types/components/tabs.ts +2 -2
  417. package/src/types/components/textarea.ts +2 -2
  418. package/src/types/components/theme-selector.ts +15 -0
  419. package/src/types/components/timeline.ts +11 -0
  420. package/src/types/components/toast.ts +2 -2
  421. package/src/types/components/tooltip.ts +23 -23
  422. package/src/types/components/tour.ts +11 -0
  423. package/src/types/components/tree.ts +11 -0
  424. package/src/types/components/user.ts +11 -0
  425. package/src/types/components/{embed-youtube.ts → video.ts} +2 -2
  426. package/src/types/components/watermark.ts +11 -0
  427. package/src/types/components/window-mockup.ts +11 -0
  428. package/src/types/index.ts +2 -1
  429. package/src/types/theme.ts +1 -0
  430. package/src/utils/docs.ts +189 -0
  431. package/src/utils/headerStack.ts +95 -88
  432. package/src/utils/index.ts +5 -4
  433. package/src/components/astro/RLANativeSelect.astro +0 -51
  434. package/src/components/astro/RLAToggle.astro +0 -38
  435. package/src/components/astro/RLAToggleGroup.astro +0 -30
  436. package/src/integrations/vue-entrypoint.ts +0 -6
  437. package/src/nuxt.ts +0 -125
  438. package/src/plugins/starlightAddons/PageTitle.astro +0 -113
  439. package/src/plugins/starlightAddons/index.ts +0 -58
  440. package/src/plugins/starlightAddons/starlight.d.ts +0 -6
  441. package/src/preset.ts +0 -393
  442. package/src/themes/alertDialog.theme.ts +0 -33
  443. package/src/themes/aspectRatio.theme.ts +0 -11
  444. package/src/themes/avatarGroup.theme.ts +0 -10
  445. package/src/themes/combobox.theme.ts +0 -28
  446. package/src/themes/dialog.theme.ts +0 -37
  447. package/src/themes/embedYoutube.theme.ts +0 -14
  448. package/src/themes/hoverCard.theme.ts +0 -27
  449. package/src/themes/localeSelector.theme.ts +0 -50
  450. package/src/themes/nativeSelect.theme.ts +0 -24
  451. package/src/themes/navigationMenu.theme.ts +0 -19
  452. package/src/themes/section.theme.ts +0 -186
  453. package/src/themes/sheet.theme.ts +0 -43
  454. package/src/themes/stickySurface.theme.ts +0 -10
  455. package/src/themes/themeSelector.theme.ts +0 -16
  456. package/src/themes/toggle.theme.ts +0 -42
  457. package/src/themes/toggleGroup.theme.ts +0 -21
  458. package/src/types/components/localeSelector.ts +0 -33
  459. package/src/types/components/navigation.ts +0 -34
  460. package/src/types/components/themeSelector.ts +0 -15
  461. package/src/types/components/toggle-group.ts +0 -23
  462. package/src/types/components/toggle.ts +0 -27
@@ -1,197 +1,201 @@
1
- ---
2
- import { scv } from "css-variants"
3
- import { useUi, resolveClasses } from "../../utils"
4
- import type { EmbedYoutubeProps } from "../../types"
5
- import embedYoutubeTheme from "../../themes/embedYoutube.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 embedYoutube = scv(embedYoutubeTheme)
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 EmbedYoutubeProps
122
-
123
- const classes = resolveClasses(embedYoutube, {
124
- title: !!(Astro.slots.has("title") || title),
125
- icon: !!(Astro.slots.has("icon") || icon),
126
- }, useUi("embedYoutube", 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>
@@ -0,0 +1,23 @@
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 />
23
+ </div>
@@ -0,0 +1,23 @@
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 />
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>
@@ -0,0 +1,58 @@
1
+ <script setup lang="ts">
2
+ import { computed, useSlots } from "vue"
3
+ import { scv } from "css-variants"
4
+ import { useUi, resolveClasses } from "../../utils"
5
+ import type { FormFieldProps } from "../../types/components/form-field"
6
+ import formFieldTheme from "../../themes/form-field.theme"
7
+
8
+ const formField = scv(formFieldTheme)
9
+
10
+ const props = withDefaults(defineProps<FormFieldProps>(), {
11
+ size: "md"
12
+ })
13
+
14
+ const slots = useSlots()
15
+
16
+ const resolvedClasses = computed(() =>
17
+ resolveClasses(
18
+ formField,
19
+ {
20
+ size: props.size
21
+ },
22
+ useUi("formField", props.ui),
23
+ props.class
24
+ )
25
+ )
26
+ </script>
27
+
28
+ <template>
29
+ <div :class="resolvedClasses.root" data-slot="root">
30
+ <div v-if="label || slots.label" class="flex items-center justify-between gap-2">
31
+ <label v-if="label || slots.label" :class="resolvedClasses.label" data-slot="label">
32
+ <slot name="label">{{ label }}</slot>
33
+ <span v-if="required" class="text-error-500">*</span>
34
+ </label>
35
+ <slot name="hint" />
36
+ </div>
37
+
38
+ <p
39
+ v-if="description || slots.description"
40
+ :class="resolvedClasses.description"
41
+ data-slot="description"
42
+ >
43
+ <slot name="description">{{ description }}</slot>
44
+ </p>
45
+
46
+ <div class="relative">
47
+ <slot :ui="resolvedClasses" />
48
+ </div>
49
+
50
+ <p v-if="error || slots.error" :class="resolvedClasses.error" data-slot="error">
51
+ <slot name="error">{{ error }}</slot>
52
+ </p>
53
+
54
+ <div v-if="slots.help" class="mt-1">
55
+ <slot name="help" />
56
+ </div>
57
+ </div>
58
+ </template>