@rimelight/ui 0.0.42 → 0.0.43

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 (400) hide show
  1. package/README.md +4 -14
  2. package/package.json +20 -30
  3. package/src/components/3d-hover/3d-hover.theme.ts +9 -12
  4. package/src/components/3d-hover/RLA3dHover.astro +9 -20
  5. package/src/components/accordion/RLAAccordion.astro +5 -14
  6. package/src/components/accordion/accordion.theme.ts +34 -37
  7. package/src/components/app/RLAApp.astro +9 -20
  8. package/src/components/app/app.theme.ts +9 -12
  9. package/src/components/aspect-ratio/RLAAspectRatio.astro +19 -27
  10. package/src/components/aspect-ratio/aspect-ratio.theme.ts +8 -12
  11. package/src/components/audio/RLAAudio.astro +3 -14
  12. package/src/components/audio/audio.theme.ts +9 -12
  13. package/src/components/avatar/RLAAvatar.astro +9 -29
  14. package/src/components/avatar/avatar.theme.ts +66 -77
  15. package/src/components/avatar/avatar.ts +6 -11
  16. package/src/components/avatar-group/RLAAvatarGroup.astro +188 -23
  17. package/src/components/avatar-group/avatar-group.theme.ts +12 -11
  18. package/src/components/avatar-group/avatar-group.ts +41 -0
  19. package/src/components/badge/RLABadge.astro +23 -36
  20. package/src/components/badge/RLSBadge.tsx +41 -0
  21. package/src/components/badge/RLVBadge.vue +8 -16
  22. package/src/components/badge/badge.theme.ts +118 -160
  23. package/src/components/badge/badge.ts +2 -1
  24. package/src/components/banner/RLABanner.astro +88 -103
  25. package/src/components/banner/banner.theme.ts +40 -43
  26. package/src/components/breadcrumb/RLABreadcrumb.astro +241 -62
  27. package/src/components/breadcrumb/breadcrumb.theme.ts +12 -16
  28. package/src/components/breadcrumb/breadcrumb.ts +19 -0
  29. package/src/components/browser-mockup/RLABrowserMockup.astro +9 -20
  30. package/src/components/browser-mockup/browser-mockup.theme.ts +9 -12
  31. package/src/components/button/RLAButton.astro +10 -30
  32. package/src/components/button/RLSButton.tsx +169 -0
  33. package/src/components/button/RLVButton.vue +13 -26
  34. package/src/components/button/button.theme.ts +163 -220
  35. package/src/components/button/button.ts +1 -1
  36. package/src/components/calendar/RLACalendar.astro +9 -20
  37. package/src/components/calendar/calendar.theme.ts +9 -12
  38. package/src/components/callout/RLACallout.astro +5 -14
  39. package/src/components/callout/callout.theme.ts +59 -101
  40. package/src/components/callout/callout.ts +1 -1
  41. package/src/components/card/RLACard.astro +71 -77
  42. package/src/components/card/RLSCard.tsx +116 -0
  43. package/src/components/card/RLVCard.vue +6 -14
  44. package/src/components/card/card.theme.ts +41 -44
  45. package/src/components/carousel/RLACarousel.astro +43 -11
  46. package/src/components/carousel/carousel.theme.ts +28 -32
  47. package/src/components/chart/RLAChart.astro +5 -11
  48. package/src/components/chart/chart.theme.ts +18 -21
  49. package/src/components/chart/chart.ts +1 -1
  50. package/src/components/chat/RLAChat.astro +9 -20
  51. package/src/components/chat/chat.theme.ts +9 -12
  52. package/src/components/chat-message/RLAChatMessage.astro +9 -20
  53. package/src/components/chat-message/chat-message.theme.ts +9 -12
  54. package/src/components/chat-messages/RLAChatMessages.astro +9 -20
  55. package/src/components/chat-messages/chat-messages.theme.ts +9 -12
  56. package/src/components/chat-palette/RLAChatPalette.astro +9 -20
  57. package/src/components/chat-palette/chat-palette.theme.ts +9 -12
  58. package/src/components/chat-prompt/RLAChatPrompt.astro +9 -20
  59. package/src/components/chat-prompt/chat-prompt.theme.ts +9 -12
  60. package/src/components/chat-prompt-submit/RLAChatPromptSubmit.astro +9 -20
  61. package/src/components/chat-prompt-submit/chat-prompt-submit.theme.ts +9 -12
  62. package/src/components/chat-reasoning/RLAChatReasoning.astro +9 -20
  63. package/src/components/chat-reasoning/chat-reasoning.theme.ts +9 -12
  64. package/src/components/chat-shimmer/RLAChatShimmer.astro +9 -20
  65. package/src/components/chat-shimmer/chat-shimmer.theme.ts +9 -12
  66. package/src/components/chat-tool/RLAChatTool.astro +9 -20
  67. package/src/components/chat-tool/chat-tool.theme.ts +9 -12
  68. package/src/components/checkbox/RLACheckbox.astro +2 -17
  69. package/src/components/checkbox/RLSCheckbox.tsx +65 -0
  70. package/src/components/checkbox/checkbox.theme.ts +34 -45
  71. package/src/components/checkbox/checkbox.ts +1 -1
  72. package/src/components/chip/RLAChip.astro +32 -56
  73. package/src/components/chip/chip.theme.ts +66 -72
  74. package/src/components/chip/chip.ts +3 -1
  75. package/src/components/collapsible/RLACollapsible.astro +2 -12
  76. package/src/components/collapsible/collapsible.theme.ts +17 -20
  77. package/src/components/collapsible/collapsible.ts +1 -1
  78. package/src/components/color-area/RLAColorArea.astro +2 -13
  79. package/src/components/color-area/color-area.theme.ts +19 -31
  80. package/src/components/color-area/color-area.ts +1 -1
  81. package/src/components/color-field/RLAColorField.astro +3 -14
  82. package/src/components/color-field/color-field.theme.ts +18 -30
  83. package/src/components/color-field/color-field.ts +1 -1
  84. package/src/components/color-picker/RLAColorPicker.astro +9 -20
  85. package/src/components/color-picker/color-picker.theme.ts +9 -12
  86. package/src/components/color-slider/RLAColorSlider.astro +2 -13
  87. package/src/components/color-slider/color-slider.theme.ts +20 -32
  88. package/src/components/color-slider/color-slider.ts +1 -1
  89. package/src/components/command-palette/RLACommandPalette.astro +9 -20
  90. package/src/components/command-palette/command-palette.theme.ts +9 -12
  91. package/src/components/compare/RLACompare.astro +9 -20
  92. package/src/components/compare/compare.theme.ts +9 -12
  93. package/src/components/confirm/RLAConfirm.astro +114 -122
  94. package/src/components/confirm/confirm.theme.ts +40 -44
  95. package/src/components/confirm/confirm.ts +1 -0
  96. package/src/components/container/RLAContainer.astro +9 -20
  97. package/src/components/container/container.theme.ts +9 -12
  98. package/src/components/context-menu/RLAContextMenu.astro +9 -20
  99. package/src/components/context-menu/context-menu.theme.ts +9 -12
  100. package/src/components/dashboard-group/RLADashboardGroup.astro +17 -21
  101. package/src/components/dashboard-group/dashboard-group.theme.ts +9 -12
  102. package/src/components/dashboard-group/dashboard-group.ts +1 -6
  103. package/src/components/dashboard-navbar/RLADashboardNavbar.astro +61 -21
  104. package/src/components/dashboard-navbar/dashboard-navbar.theme.ts +26 -12
  105. package/src/components/dashboard-navbar/dashboard-navbar.ts +5 -6
  106. package/src/components/dashboard-panel/RLADashboardPanel.astro +25 -13
  107. package/src/components/dashboard-panel/dashboard-panel.theme.ts +22 -12
  108. package/src/components/dashboard-panel/dashboard-panel.ts +4 -6
  109. package/src/components/dashboard-resize-handle/RLADashboardResizeHandle.astro +21 -21
  110. package/src/components/dashboard-resize-handle/dashboard-resize-handle.theme.ts +9 -12
  111. package/src/components/dashboard-resize-handle/dashboard-resize-handle.ts +1 -6
  112. package/src/components/dashboard-search/RLADashboardSearch.astro +100 -21
  113. package/src/components/dashboard-search/dashboard-search.theme.ts +24 -11
  114. package/src/components/dashboard-search/dashboard-search.ts +2 -6
  115. package/src/components/dashboard-search-button/RLADashboardSearchButton.astro +45 -21
  116. package/src/components/dashboard-search-button/dashboard-search-button.theme.ts +20 -12
  117. package/src/components/dashboard-search-button/dashboard-search-button.ts +4 -6
  118. package/src/components/dashboard-sidebar/RLADashboardSidebar.astro +119 -21
  119. package/src/components/dashboard-sidebar/dashboard-sidebar.theme.ts +40 -11
  120. package/src/components/dashboard-sidebar/dashboard-sidebar.ts +8 -6
  121. package/src/components/dashboard-sidebar-collapse/RLADashboardSidebarCollapse.astro +24 -21
  122. package/src/components/dashboard-sidebar-collapse/dashboard-sidebar-collapse.theme.ts +16 -12
  123. package/src/components/dashboard-sidebar-collapse/dashboard-sidebar-collapse.ts +2 -6
  124. package/src/components/dashboard-sidebar-toggle/RLADashboardSidebarToggle.astro +23 -21
  125. package/src/components/dashboard-sidebar-toggle/dashboard-sidebar-toggle.theme.ts +16 -12
  126. package/src/components/dashboard-sidebar-toggle/dashboard-sidebar-toggle.ts +2 -6
  127. package/src/components/dashboard-toolbar/RLADashboardToolbar.astro +25 -21
  128. package/src/components/dashboard-toolbar/dashboard-toolbar.theme.ts +11 -12
  129. package/src/components/dashboard-toolbar/dashboard-toolbar.ts +1 -6
  130. package/src/components/dock/RLADock.astro +9 -20
  131. package/src/components/dock/dock.theme.ts +9 -12
  132. package/src/components/drawer/RLADrawer.astro +115 -126
  133. package/src/components/drawer/drawer.theme.ts +53 -57
  134. package/src/components/dropdown-menu/RLADropdownMenu.astro +180 -47
  135. package/src/components/dropdown-menu/RLSDropdownMenu.tsx +196 -0
  136. package/src/components/dropdown-menu/dropdown-menu.theme.ts +51 -27
  137. package/src/components/dropdown-menu/dropdown-menu.ts +47 -9
  138. package/src/components/editor/RLAEditor.astro +9 -20
  139. package/src/components/editor/blocks/AddBlockModal.vue +3 -3
  140. package/src/components/editor/blocks/Block.vue +4 -3
  141. package/src/components/editor/blocks/BlockEditor.vue +3 -3
  142. package/src/components/editor/blocks/BlockViewRenderer.vue +8 -2
  143. package/src/components/editor/blocks/editor/CalloutBlockEditor.vue +2 -2
  144. package/src/components/editor/blocks/editor/ParagraphBlockEditor.vue +1 -1
  145. package/src/components/editor/blocks/editor/SectionBlockEditor.vue +3 -3
  146. package/src/components/editor/blocks/renderer/CalloutBlockRenderer.vue +2 -3
  147. package/src/components/editor/blocks/renderer/SectionBlockRenderer.vue +2 -2
  148. package/src/components/editor/editor.theme.ts +9 -12
  149. package/src/components/empty/RLAEmpty.astro +86 -20
  150. package/src/components/empty/empty.theme.ts +79 -11
  151. package/src/components/empty/empty.ts +59 -2
  152. package/src/components/error/RLAError.astro +9 -20
  153. package/src/components/error/error.theme.ts +9 -12
  154. package/src/components/field-group/RLAFieldGroup.astro +2 -11
  155. package/src/components/field-group/field-group.theme.ts +18 -22
  156. package/src/components/fieldset/RLAFieldset.astro +9 -20
  157. package/src/components/fieldset/fieldset.theme.ts +9 -12
  158. package/src/components/file-upload/RLAFileUpload.astro +4 -13
  159. package/src/components/file-upload/file-upload.theme.ts +19 -22
  160. package/src/components/file-upload/file-upload.ts +1 -1
  161. package/src/components/floating-action/RLAFloatingAction.astro +9 -20
  162. package/src/components/floating-action/floating-action.theme.ts +9 -12
  163. package/src/components/footer/RLAFooter.astro +32 -38
  164. package/src/components/footer/footer.theme.ts +31 -26
  165. package/src/components/footer/footer.ts +4 -0
  166. package/src/components/form/RLAForm.astro +9 -20
  167. package/src/components/form/form.theme.ts +9 -12
  168. package/src/components/form-field/RLAFormField.astro +5 -12
  169. package/src/components/form-field/RLSFormField.tsx +71 -0
  170. package/src/components/form-field/RLVFormField.vue +5 -14
  171. package/src/components/form-field/form-field.theme.ts +19 -22
  172. package/src/components/form-field/form-field.ts +1 -0
  173. package/src/components/gallery/RLAGallery.astro +9 -20
  174. package/src/components/gallery/gallery.theme.ts +9 -12
  175. package/src/components/grid/RLAGrid.astro +2 -15
  176. package/src/components/grid/grid.theme.ts +31 -34
  177. package/src/components/head/UIHead.astro +298 -0
  178. package/src/components/head/head.theme.ts +9 -12
  179. package/src/components/header/HeaderLayer.astro +63 -0
  180. package/src/components/header/RLAHeader.astro +29 -48
  181. package/src/components/header/header.theme.ts +37 -40
  182. package/src/components/header/header.ts +4 -0
  183. package/src/{utils → components/header}/headerStack.ts +30 -22
  184. package/src/components/hover-card/RLAHoverCard.astro +24 -35
  185. package/src/components/hover-card/hover-card.theme.ts +23 -27
  186. package/src/components/icon/RLAIcon.astro +29 -36
  187. package/src/components/icon/RLSIcon.tsx +6 -7
  188. package/src/components/icon/RLVIcon.vue +5 -6
  189. package/src/components/icon/icon.theme.ts +18 -28
  190. package/src/components/icon/resolver.ts +15 -29
  191. package/src/components/image/RLAImage.astro +20 -23
  192. package/src/components/image/image.theme.ts +29 -32
  193. package/src/components/input/RLAInput.astro +6 -21
  194. package/src/components/input/RLSInput.tsx +101 -0
  195. package/src/components/input/RLVInput.vue +11 -20
  196. package/src/components/input/input.theme.ts +41 -44
  197. package/src/components/input/input.ts +1 -1
  198. package/src/components/input-date/RLAInputDate.astro +9 -20
  199. package/src/components/input-date/input-date.theme.ts +9 -12
  200. package/src/components/input-menu/RLAInputMenu.astro +2 -12
  201. package/src/components/input-menu/input-menu.theme.ts +29 -32
  202. package/src/components/input-menu/input-menu.ts +1 -1
  203. package/src/components/input-number/RLAInputNumber.astro +9 -20
  204. package/src/components/input-number/input-number.theme.ts +9 -12
  205. package/src/components/input-pin/RLAInputPin.astro +9 -22
  206. package/src/components/input-pin/input-pin.theme.ts +9 -13
  207. package/src/components/input-rating/RLAInputRating.astro +2 -23
  208. package/src/components/input-rating/input-rating.theme.ts +64 -76
  209. package/src/components/input-rating/input-rating.ts +1 -1
  210. package/src/components/input-tags/RLAInputTags.astro +174 -21
  211. package/src/components/input-tags/input-tags.theme.ts +37 -12
  212. package/src/components/input-tags/input-tags.ts +50 -0
  213. package/src/components/input-time/RLAInputTime.astro +9 -20
  214. package/src/components/input-time/input-time.theme.ts +9 -12
  215. package/src/components/kbd/RLAKbd.astro +17 -32
  216. package/src/components/kbd/kbd.theme.ts +49 -91
  217. package/src/components/kbd/kbd.ts +3 -0
  218. package/src/components/knob/RLAKnob.astro +9 -20
  219. package/src/components/knob/knob.theme.ts +9 -12
  220. package/src/components/label/RLALabel.astro +16 -27
  221. package/src/components/label/label.theme.ts +16 -20
  222. package/src/components/layout-grid/RLALayoutGrid.astro +5 -11
  223. package/src/components/layout-grid/layout-grid.theme.ts +12 -15
  224. package/src/components/link/RLALink.astro +6 -20
  225. package/src/components/link/RLSLink.tsx +8 -16
  226. package/src/components/link/RLVLink.vue +7 -16
  227. package/src/components/link/link.theme.ts +37 -37
  228. package/src/components/link/link.ts +5 -5
  229. package/src/components/link-group/RLALinkGroup.astro +7 -44
  230. package/src/components/link-group/link-group.theme.ts +21 -26
  231. package/src/components/link-group/link-group.ts +5 -16
  232. package/src/components/listbox/RLAListbox.astro +9 -20
  233. package/src/components/listbox/listbox.theme.ts +9 -12
  234. package/src/components/locale-selector/RLALocaleSelector.astro +13 -21
  235. package/src/components/locale-selector/locale-selector.theme.ts +49 -44
  236. package/src/components/locale-selector/locale-selector.ts +4 -0
  237. package/src/components/logo/RLALogo.astro +13 -26
  238. package/src/components/logo/logo.theme.ts +9 -12
  239. package/src/components/main/RLAMain.astro +31 -36
  240. package/src/components/main/main.theme.ts +9 -12
  241. package/src/components/marquee/RLAMarquee.astro +62 -43
  242. package/src/components/marquee/marquee.theme.ts +22 -26
  243. package/src/components/meter/RLAMeter.astro +9 -20
  244. package/src/components/meter/meter.theme.ts +9 -12
  245. package/src/components/modal/RLAModal.astro +70 -72
  246. package/src/components/modal/RLSModal.tsx +156 -0
  247. package/src/components/modal/RLVModal.vue +5 -6
  248. package/src/components/modal/modal.theme.ts +42 -46
  249. package/src/components/modal/modal.ts +1 -0
  250. package/src/components/navigation-menu/RLANavigationMenu.astro +7 -12
  251. package/src/components/navigation-menu/navigation-menu.theme.ts +36 -39
  252. package/src/components/navigation-menu/navigation-menu.ts +19 -18
  253. package/src/components/page/RLAPage.astro +9 -20
  254. package/src/components/page/page.theme.ts +9 -12
  255. package/src/components/page-aside/RLAPageAside.astro +9 -20
  256. package/src/components/page-aside/page-aside.theme.ts +9 -12
  257. package/src/components/page-body/RLAPageBody.astro +9 -20
  258. package/src/components/page-body/page-body.theme.ts +9 -12
  259. package/src/components/page-header/RLAPageHeader.astro +9 -20
  260. package/src/components/page-header/page-header.theme.ts +9 -12
  261. package/src/components/page-section/RLAPageSection.astro +11 -15
  262. package/src/components/page-section/page-section.theme.ts +193 -176
  263. package/src/components/pagination/RLAPagination.astro +91 -97
  264. package/src/components/pagination/pagination.theme.ts +22 -26
  265. package/src/components/password/RLAPassword.astro +9 -20
  266. package/src/components/password/password.theme.ts +9 -12
  267. package/src/components/phone-mockup/RLAPhoneMockup.astro +9 -20
  268. package/src/components/phone-mockup/phone-mockup.theme.ts +9 -12
  269. package/src/components/placeholder/RLAPlaceholder.astro +32 -43
  270. package/src/components/placeholder/placeholder.theme.ts +11 -14
  271. package/src/components/popover/RLAPopover.astro +205 -132
  272. package/src/components/popover/popover.theme.ts +23 -27
  273. package/src/components/post/RLAPost.astro +2 -10
  274. package/src/components/post/post.theme.ts +45 -48
  275. package/src/components/pricing-plan/RLAPricingPlan.astro +9 -20
  276. package/src/components/pricing-plan/pricing-plan.theme.ts +9 -12
  277. package/src/components/pricing-table/RLAPricingTable.astro +9 -20
  278. package/src/components/pricing-table/pricing-table.theme.ts +9 -12
  279. package/src/components/progress/RLAProgress.astro +2 -17
  280. package/src/components/progress/progress.theme.ts +22 -34
  281. package/src/components/progress/progress.ts +1 -1
  282. package/src/components/prose/RLAProse.astro +9 -20
  283. package/src/components/prose/prose.theme.ts +9 -12
  284. package/src/components/qr-code/RLAQrCode.astro +9 -20
  285. package/src/components/qr-code/qr-code.theme.ts +9 -12
  286. package/src/components/quote/quote.theme.ts +9 -12
  287. package/src/components/radio-group/RLARadioGroup.astro +9 -20
  288. package/src/components/radio-group/radio-group.theme.ts +9 -12
  289. package/src/components/rating/RLARating.astro +9 -20
  290. package/src/components/rating/rating.theme.ts +9 -12
  291. package/src/components/scroll-area/RLAScrollArea.astro +2 -10
  292. package/src/components/scroll-area/scroll-area.theme.ts +21 -24
  293. package/src/components/scroll-to-top/RLAScrollToTop.astro +67 -43
  294. package/src/components/scroll-to-top/RLVScrollToTop.vue +6 -10
  295. package/src/components/scroll-to-top/scroll-to-top.theme.ts +32 -46
  296. package/src/components/scroll-to-top/scroll-to-top.ts +1 -1
  297. package/src/{utils → components/scroll-to-top}/scroll.ts +19 -6
  298. package/src/components/search/RLASearch.astro +3 -9
  299. package/src/components/search/search.theme.ts +60 -63
  300. package/src/components/select/RLASelect.astro +514 -113
  301. package/src/components/select/RLSSelect.tsx +126 -0
  302. package/src/components/select/RLVSelect.vue +7 -15
  303. package/src/components/select/select.theme.ts +104 -25
  304. package/src/components/select/select.ts +58 -36
  305. package/src/components/separator/RLASeparator.astro +62 -83
  306. package/src/components/separator/separator.theme.ts +135 -138
  307. package/src/components/separator/separator.ts +4 -0
  308. package/src/components/shortcuts/RLAShortcuts.astro +3 -4
  309. package/src/components/sidebar/RLASidebar.astro +11 -21
  310. package/src/components/sidebar/sidebar.theme.ts +39 -42
  311. package/src/components/sidebar/sidebar.ts +2 -0
  312. package/src/components/skeleton/RLASkeleton.astro +13 -22
  313. package/src/components/skeleton/skeleton.theme.ts +16 -19
  314. package/src/components/slideover/RLASlideover.astro +2 -12
  315. package/src/components/slideover/slideover.theme.ts +51 -55
  316. package/src/components/slider/RLASlider.astro +2 -15
  317. package/src/components/slider/slider.theme.ts +20 -33
  318. package/src/components/slider/slider.ts +1 -1
  319. package/src/components/speed-dial/RLASpeedDial.astro +9 -20
  320. package/src/components/speed-dial/speed-dial.theme.ts +9 -12
  321. package/src/components/spinner/RLASpinner.astro +2 -17
  322. package/src/components/spinner/spinner.theme.ts +29 -30
  323. package/src/components/spinner/spinner.ts +1 -1
  324. package/src/components/splitter/RLASplitter.astro +3 -11
  325. package/src/components/splitter/splitter.theme.ts +18 -21
  326. package/src/components/spoiler/RLASpoiler.astro +9 -20
  327. package/src/components/spoiler/spoiler.theme.ts +9 -12
  328. package/src/components/stepper/RLAStepper.astro +300 -21
  329. package/src/components/stepper/stepper.theme.ts +214 -12
  330. package/src/components/stepper/stepper.ts +23 -6
  331. package/src/components/steps/RLASteps.astro +2 -8
  332. package/src/components/steps/steps.theme.ts +9 -12
  333. package/src/components/sticky-surface/RLAStickySurface.astro +67 -38
  334. package/src/components/sticky-surface/sticky-surface.theme.ts +7 -11
  335. package/src/components/sticky-surface/sticky-surface.ts +1 -0
  336. package/src/components/surround/RLASurround.astro +5 -5
  337. package/src/components/switch/RLASwitch.astro +2 -18
  338. package/src/components/switch/switch.theme.ts +50 -61
  339. package/src/components/switch/switch.ts +1 -1
  340. package/src/components/table/RLATable.astro +566 -50
  341. package/src/components/table/table.theme.ts +112 -31
  342. package/src/components/table/table.ts +207 -6
  343. package/src/components/table-of-contents/RLATableOfContents.astro +8 -13
  344. package/src/components/table-of-contents/table-of-contents.theme.ts +60 -63
  345. package/src/components/tabs/RLATabs.astro +195 -51
  346. package/src/components/tabs/tabs.theme.ts +81 -84
  347. package/src/components/tabs/tabs.ts +18 -1
  348. package/src/components/textarea/RLATextarea.astro +16 -13
  349. package/src/components/textarea/RLSTextarea.tsx +69 -0
  350. package/src/components/textarea/RLVTextarea.vue +8 -16
  351. package/src/components/textarea/textarea.theme.ts +21 -24
  352. package/src/components/textarea/textarea.ts +2 -1
  353. package/src/components/theme-selector/RLAThemeSelector.astro +5 -13
  354. package/src/components/theme-selector/theme-selector.theme.ts +11 -14
  355. package/src/components/timeline/RLATimeline.astro +24 -44
  356. package/src/components/timeline/timeline.theme.ts +302 -307
  357. package/src/components/toast/RLAToast.astro +44 -18
  358. package/src/components/toast/store.ts +97 -0
  359. package/src/components/toast/toast.theme.ts +31 -34
  360. package/src/components/toast/toast.ts +1 -1
  361. package/src/components/toaster/RLAToaster.astro +76 -6
  362. package/src/components/tooltip/RLATooltip.astro +136 -33
  363. package/src/components/tooltip/tooltip.theme.ts +23 -26
  364. package/src/components/tour/RLATour.astro +9 -20
  365. package/src/components/tour/tour.theme.ts +9 -12
  366. package/src/components/tree/RLATree.astro +9 -20
  367. package/src/components/tree/tree.theme.ts +9 -12
  368. package/src/components/user/RLAUser.astro +9 -20
  369. package/src/components/user/user.theme.ts +9 -12
  370. package/src/components/video/RLAVideo.astro +5 -10
  371. package/src/components/video/video.theme.ts +13 -16
  372. package/src/components/watermark/RLAWatermark.astro +9 -20
  373. package/src/components/watermark/watermark.theme.ts +9 -12
  374. package/src/components/window-mockup/RLAWindowMockup.astro +9 -20
  375. package/src/components/window-mockup/window-mockup.theme.ts +9 -12
  376. package/src/icons.ts +68 -0
  377. package/src/index.ts +31 -0
  378. package/src/preset.ts +146 -0
  379. package/src/resolver.ts +20 -0
  380. package/src/shortcuts.ts +172 -0
  381. package/src/types.ts +57 -0
  382. package/LICENSE +0 -21
  383. package/src/components/head/RLAHead.astro +0 -528
  384. package/src/config/color.config.ts +0 -300
  385. package/src/config/site.config.ts +0 -28
  386. package/src/config/ui.config.ts +0 -89
  387. package/src/env.d.ts +0 -23
  388. package/src/icons/defaults.ts +0 -44
  389. package/src/presets/index.ts +0 -577
  390. package/src/stores/toast.ts +0 -24
  391. package/src/themes.ts +0 -26
  392. package/src/types/component.ts +0 -28
  393. package/src/ui.ts +0 -159
  394. package/src/utils/defineTheme.ts +0 -5
  395. package/src/utils/merge.ts +0 -62
  396. package/src/utils/resolveClasses.ts +0 -39
  397. package/src/utils/resolveTheme.ts +0 -13
  398. package/src/utils/shortcuts.ts +0 -322
  399. package/src/utils/toast.ts +0 -36
  400. package/src/utils/useUi.ts +0 -33
@@ -1,12 +1,9 @@
1
1
  ---
2
- import { scv } from "css-variants"
3
- import { useUi } from "../../utils/useUi"
4
- import { resolveClasses } from "../../utils/resolveClasses"
5
- import type { TabsProps, TabItem } from "./tabs"
6
- import tabsTheme from "./tabs.theme"
2
+ import type { TabsProps } from "./tabs"
3
+ import { tabsTheme } from "./tabs.theme"
7
4
  import RLABadge from "../badge/RLABadge.astro"
5
+ import RLAIcon from "../icon/RLAIcon.astro"
8
6
 
9
- const tabs = scv(tabsTheme)
10
7
 
11
8
  const {
12
9
  items = [],
@@ -17,37 +14,74 @@ const {
17
14
  size = "md",
18
15
  color = "primary",
19
16
  content = true,
20
- unmountOnHide = true,
21
17
  valueKey = "value",
22
18
  labelKey = "label",
23
- ui: uiProp,
24
- class: className,
19
+ maxTabs,
20
+ estimatedTabWidth = 100,
25
21
  ...rest
26
22
  } = Astro.props as TabsProps
27
23
 
28
- // Normalize variant names for backward compatibility (solid -> pill, pills -> pill, underline -> underline, link -> underline)
24
+ // Normalize variant names
29
25
  const normalizedVariant = (variant === "solid" || variant === "pills") ? "pill" : (variant === "link" ? "underline" : variant);
30
26
 
31
- const classes = resolveClasses(tabs, {
32
- variant: normalizedVariant,
33
- orientation,
34
- size
35
- }, useUi("tabs", uiProp), className);
27
+ const classes = tabsTheme({
28
+ ...Astro.props,
29
+ variant: normalizedVariant
30
+ });
36
31
 
37
- const initialValue = value || defaultValue || (items.length > 0 ? (items[0][valueKey] ?? items[0].value ?? "0") : "")
32
+ const initialValue = value || defaultValue || (items.length > 0 ? (items[0]?.[valueKey] ?? items[0]?.value ?? "0") : "")
33
+
34
+ // ─── Responsive CSS Item Counter + Native Popover Overflow ───────────────────
35
+ const uid = Math.random().toString(36).substring(2, 9)
36
+ const cName = `rla-tb-${uid}`
37
+ const popoverId = `rla-tb-pop-${uid}`
38
+
39
+ const effectiveMaxTabs = maxTabs !== undefined ? Math.max(1, maxTabs) : items.length
40
+ const renderedListItems = items.slice(0, effectiveMaxTabs)
41
+ const overflowItems = items.slice(effectiveMaxTabs)
42
+ const baseHiddenCount = overflowItems.length
43
+ const needsOverflow = items.length > 1 && orientation === "horizontal"
44
+
45
+ // Generate per-instance container-query CSS for horizontal layout
46
+ let instanceCss = ""
47
+ if (needsOverflow && renderedListItems.length > 1) {
48
+ const maxBreaks = renderedListItems.length - 1
49
+ for (let i = 0; i < maxBreaks; i++) {
50
+ const hiddenItems = i + 1
51
+ const visibleCount = renderedListItems.length - hiddenItems
52
+ const maxWidth = visibleCount * estimatedTabWidth + 90
53
+ const hideNthChild = renderedListItems.length - i
54
+
55
+ instanceCss += `\n@container ${cName} (max-width: ${maxWidth}px) {`
56
+ instanceCss += `\n [data-tb="${uid}"] { --hidden-items: ${hiddenItems}; }`
57
+ instanceCss += `\n [data-tb="${uid}"] [data-slot=list] > button.hidable:nth-child(${hideNthChild + 1}) { display: none !important; }`
58
+ if (baseHiddenCount === 0) {
59
+ instanceCss += `\n [data-tb="${uid}"] .rla-tb-overflow-hidden { display: inline-flex !important; }`
60
+ }
61
+ instanceCss += `\n}`
62
+ }
63
+ }
38
64
  ---
39
65
  <rla-tabs {...rest} data-orientation={orientation} data-variant={normalizedVariant}>
40
- <div class={classes.root} data-slot="root" data-tabs-container data-value={initialValue}>
66
+ <div
67
+ class:list={[classes.root, orientation === "horizontal" && "rla-tb-host"]}
68
+ data-slot="root"
69
+ data-tabs-container
70
+ data-value={initialValue}
71
+ data-tb={uid}
72
+ style={orientation === "horizontal" ? `container-type: inline-size; container-name: ${cName}; --base-hidden: ${baseHiddenCount}; --hidden-items: 0;` : undefined}
73
+ >
41
74
  <div class={classes.list} data-slot="list" role="tablist">
42
75
  <div class={classes.indicator} data-slot="indicator" style="display: none;"></div>
43
- {items.map((item, index) => {
76
+ {renderedListItems.map((item, index) => {
44
77
  const itemVal = item[valueKey] ?? item.value ?? String(index)
45
78
  const itemLabel = item[labelKey] ?? item.label
46
79
  const active = itemVal === initialValue
80
+ const isHidable = needsOverflow && index > 0
47
81
  return (
48
82
  <button
49
83
  type="button"
50
- class={classes.trigger}
84
+ class:list={[classes.trigger, isHidable && "hidable"]}
51
85
  data-slot="trigger"
52
86
  role="tab"
53
87
  data-value={itemVal}
@@ -70,7 +104,58 @@ const initialValue = value || defaultValue || (items.length > 0 ? (items[0][valu
70
104
  </button>
71
105
  )
72
106
  })}
107
+
108
+ {needsOverflow && (
109
+ <div class="relative inline-flex items-center ml-auto">
110
+ <button
111
+ type="button"
112
+ class:list={[
113
+ classes.trigger,
114
+ "rla-tb-overflow-btn",
115
+ baseHiddenCount === 0 && "rla-tb-overflow-hidden"
116
+ ]}
117
+ popovertarget={popoverId}
118
+ data-slot="overflow-trigger"
119
+ aria-label="More tabs"
120
+ >
121
+ <span class="rla-tb-label">
122
+ +<span class="rla-tb-count"></span> more
123
+ </span>
124
+ <RLAIcon name="chevronDown" class="ml-1 size-3.5 opacity-70" />
125
+ </button>
126
+
127
+ <div
128
+ id={popoverId}
129
+ popover="auto"
130
+ class="rla-tb-popover rounded-lg border border-default bg-default p-1 shadow-lg backdrop-blur-sm"
131
+ >
132
+ <div class="flex flex-col gap-0.5 min-w-[10rem]">
133
+ {items.map((item, index) => {
134
+ const itemVal = item[valueKey] ?? item.value ?? String(index)
135
+ const itemLabel = item[labelKey] ?? item.label
136
+ const isExtra = index >= effectiveMaxTabs
137
+ return (
138
+ <button
139
+ type="button"
140
+ class:list={[
141
+ "w-full text-left px-3 py-1.5 text-sm rounded-md transition-colors flex items-center justify-between",
142
+ "hover:bg-muted focus-visible:outline-none cursor-pointer",
143
+ !isExtra && "rla-tb-pop-rendered"
144
+ ]}
145
+ data-tab-overflow-value={itemVal}
146
+ data-popover-item
147
+ >
148
+ <span class="truncate">{itemLabel}</span>
149
+ <RLAIcon name="check" class="size-4 opacity-0 data-[active=true]:opacity-100" />
150
+ </button>
151
+ )
152
+ })}
153
+ </div>
154
+ </div>
155
+ </div>
156
+ )}
73
157
  </div>
158
+
74
159
  {content && (
75
160
  <div class="flex-1">
76
161
  <slot>
@@ -95,6 +180,38 @@ const initialValue = value || defaultValue || (items.length > 0 ? (items[0][valu
95
180
  </div>
96
181
  </rla-tabs>
97
182
 
183
+ <style is:inline set:html={instanceCss} />
184
+
185
+ <style>
186
+ .rla-tb-host {
187
+ width: 100%;
188
+ }
189
+ .rla-tb-overflow-hidden {
190
+ display: none !important;
191
+ }
192
+ .rla-tb-count::after {
193
+ counter-reset: rla-tb-cnt calc(var(--base-hidden, 0) + var(--hidden-items, 0));
194
+ content: counter(rla-tb-cnt);
195
+ }
196
+ .rla-tb-popover {
197
+ margin: 0;
198
+ inset: auto;
199
+ position: absolute;
200
+ }
201
+ .rla-tb-popover:popover-open {
202
+ display: block;
203
+ }
204
+ /* Show items in popover if they are hidden in list or extra */
205
+ .rla-tb-pop-rendered {
206
+ display: none;
207
+ }
208
+ @supports not (content-visibility: hidden) {
209
+ [hidden="until-found"] {
210
+ display: none !important;
211
+ }
212
+ }
213
+ </style>
214
+
98
215
  <script>
99
216
  if (typeof HTMLElement !== 'undefined') {
100
217
  class RLATabs extends HTMLElement {
@@ -117,6 +234,12 @@ const initialValue = value || defaultValue || (items.length > 0 ? (items[0][valu
117
234
  return;
118
235
  }
119
236
 
237
+ // If active trigger is hidden due to container queries, position near overflow button
238
+ if (getComputedStyle(activeTrigger).display === 'none') {
239
+ const overflowBtn = list.querySelector('.rla-tb-overflow-btn') as HTMLElement | null;
240
+ if (overflowBtn) activeTrigger = overflowBtn;
241
+ }
242
+
120
243
  const listRect = list.getBoundingClientRect();
121
244
  const triggerRect = activeTrigger.getBoundingClientRect();
122
245
 
@@ -143,27 +266,43 @@ const initialValue = value || defaultValue || (items.length > 0 ? (items[0][valu
143
266
  const containerValue = container.dataset.value;
144
267
  const triggers = container.querySelectorAll("[role=tab]");
145
268
  const panels = container.querySelectorAll("[role=tabpanel]");
269
+ const popoverItems = container.querySelectorAll("[data-popover-item]");
146
270
 
147
271
  let activeTrigger: HTMLElement | null = null;
148
272
 
149
- triggers.forEach(trigger => {
150
- const el = trigger as HTMLElement;
151
- const val = el.dataset.value;
152
- const isActive = val === containerValue;
153
- el.setAttribute("data-state", isActive ? "active" : "inactive");
154
- if (isActive) activeTrigger = el;
155
- });
273
+ const syncState = (targetValue: string | undefined) => {
274
+ triggers.forEach(trigger => {
275
+ const el = trigger as HTMLElement;
276
+ const val = el.dataset.value;
277
+ const isActive = val === targetValue;
278
+ el.setAttribute("data-state", isActive ? "active" : "inactive");
279
+ if (isActive) activeTrigger = el;
280
+ });
156
281
 
157
- panels.forEach(panel => {
158
- const val = (panel as HTMLElement).dataset.value;
159
- if (val === containerValue) {
160
- panel.removeAttribute("hidden");
161
- } else {
162
- panel.setAttribute("hidden", "until-found");
163
- }
164
- });
282
+ popoverItems.forEach(item => {
283
+ const el = item as HTMLElement;
284
+ const val = el.dataset.tabOverflowValue;
285
+ if (val === targetValue) {
286
+ el.setAttribute("data-active", "true");
287
+ el.classList.add("bg-muted/80", "font-medium");
288
+ } else {
289
+ el.removeAttribute("data-active");
290
+ el.classList.remove("bg-muted/80", "font-medium");
291
+ }
292
+ });
293
+
294
+ panels.forEach(panel => {
295
+ const val = (panel as HTMLElement).dataset.value;
296
+ if (val === targetValue) {
297
+ panel.removeAttribute("hidden");
298
+ } else {
299
+ panel.setAttribute("hidden", "until-found");
300
+ }
301
+ });
302
+ };
303
+
304
+ syncState(containerValue);
165
305
 
166
- // Initialize indicator position
167
306
  requestAnimationFrame(() => updateIndicator(activeTrigger));
168
307
 
169
308
  if (window.ResizeObserver && list) {
@@ -184,6 +323,8 @@ const initialValue = value || defaultValue || (items.length > 0 ? (items[0][valu
184
323
  const trigger = container.querySelector(`[role=tab][data-value="${targetValue}"]`) as HTMLButtonElement | null;
185
324
  if (trigger) {
186
325
  trigger.click();
326
+ } else {
327
+ syncState(targetValue);
187
328
  }
188
329
  };
189
330
  panel.addEventListener("beforematch", onBeforeMatch);
@@ -195,26 +336,30 @@ const initialValue = value || defaultValue || (items.length > 0 ? (items[0][valu
195
336
  const onClick = () => {
196
337
  if (trigger.disabled) return;
197
338
  const targetValue = trigger.dataset.value;
198
-
199
- triggers.forEach(tNode => {
200
- const t = tNode as HTMLButtonElement;
201
- const isTarget = t.dataset.value === targetValue;
202
- t.setAttribute("data-state", isTarget ? "active" : "inactive");
203
- if (isTarget) updateIndicator(t);
204
- });
205
-
206
- panels.forEach(panel => {
207
- if ((panel as HTMLElement).dataset.value === targetValue) {
208
- panel.removeAttribute("hidden");
209
- } else {
210
- panel.setAttribute("hidden", "until-found");
211
- }
212
- });
339
+ syncState(targetValue);
340
+ updateIndicator(trigger);
213
341
  };
214
342
  trigger.addEventListener("click", onClick);
215
343
  clickCleanups.push(() => trigger.removeEventListener("click", onClick));
216
344
  });
217
345
 
346
+ popoverItems.forEach(itemNode => {
347
+ const item = itemNode as HTMLButtonElement;
348
+ const onClick = () => {
349
+ const targetValue = item.dataset.tabOverflowValue;
350
+ syncState(targetValue);
351
+ const activeTrig = container.querySelector(`[role=tab][data-value="${targetValue}"]`) as HTMLElement | null;
352
+ updateIndicator(activeTrig);
353
+ // Hide popover after selection
354
+ const popover = item.closest('[popover]') as HTMLElement | null;
355
+ if (popover && 'hidePopover' in popover) {
356
+ (popover as any).hidePopover();
357
+ }
358
+ };
359
+ item.addEventListener("click", onClick);
360
+ clickCleanups.push(() => item.removeEventListener("click", onClick));
361
+ });
362
+
218
363
  this.tabsCleanup = () => {
219
364
  clickCleanups.forEach(fn => fn());
220
365
  beforeMatchCleanups.forEach(fn => fn());
@@ -238,4 +383,3 @@ const initialValue = value || defaultValue || (items.length > 0 ? (items[0][valu
238
383
  }
239
384
  }
240
385
  </script>
241
-
@@ -1,90 +1,87 @@
1
- import { defineTheme } from "../../utils/defineTheme"
1
+ import { defineTheme } from "../../resolver"
2
2
 
3
- export const createTabsTheme = () =>
4
- defineTheme({
5
- slots: [
6
- "root",
7
- "list",
8
- "indicator",
9
- "trigger",
10
- "leadingIcon",
11
- "leadingAvatar",
12
- "label",
13
- "trailingBadge",
14
- "content"
15
- ],
16
- base: {
17
- root: "flex gap-2 w-full",
18
- list: "relative flex p-1 group items-center min-w-0",
19
- indicator:
20
- "absolute transition-[translate,width,height,top,left] duration-200 ease-out pointer-events-none",
21
- trigger:
22
- "group relative inline-flex items-center justify-center min-w-0 whitespace-nowrap font-medium transition-colors cursor-pointer disabled:cursor-not-allowed disabled:opacity-75 focus-visible:outline-none data-[state=inactive]:text-muted-foreground hover:data-[state=inactive]:text-foreground",
23
- leadingIcon: "shrink-0",
24
- leadingAvatar: "shrink-0",
25
- label: "truncate",
26
- trailingBadge: "shrink-0",
27
- content: "w-full focus-visible:outline-none"
28
- },
29
- variants: {
30
- variant: {
31
- pill: {
32
- list: "bg-muted/60 dark:bg-muted/40 rounded-lg p-1",
33
- trigger: "grow rounded-md data-[state=active]:text-foreground z-10",
34
- indicator: "bg-background rounded-md shadow-xs top-1 bottom-1 h-[calc(100%-8px)]"
35
- },
36
- underline: {
37
- list: "bg-transparent border-b border-border p-0 gap-2 -mb-px",
38
- trigger: "rounded-md data-[state=active]:text-primary pb-2 pt-1 px-3 z-10",
39
- indicator: "bg-primary rounded-full -bottom-px h-0.5 left-0"
40
- },
41
- link: {
42
- list: "bg-transparent border-b border-border p-0 gap-2 -mb-px",
43
- trigger: "rounded-md data-[state=active]:text-primary pb-2 pt-1 px-3 z-10",
44
- indicator: "bg-primary rounded-full -bottom-px h-0.5 left-0"
45
- }
3
+ export const tabsTheme = defineTheme("tabs", {
4
+ slots: [
5
+ "root",
6
+ "list",
7
+ "indicator",
8
+ "trigger",
9
+ "leadingIcon",
10
+ "leadingAvatar",
11
+ "label",
12
+ "trailingBadge",
13
+ "content"
14
+ ],
15
+ base: {
16
+ root: "flex gap-2 w-full",
17
+ list: "relative flex p-1 group items-center min-w-0",
18
+ indicator:
19
+ "absolute transition-[translate,width,height,top,left] duration-200 ease-out pointer-events-none",
20
+ trigger:
21
+ "group relative inline-flex items-center justify-center min-w-0 whitespace-nowrap font-medium transition-colors cursor-pointer disabled:cursor-not-allowed disabled:opacity-75 focus-visible:outline-none data-[state=inactive]:text-muted hover:data-[state=inactive]:text-highlighted",
22
+ leadingIcon: "shrink-0",
23
+ leadingAvatar: "shrink-0",
24
+ label: "truncate",
25
+ trailingBadge: "shrink-0",
26
+ content: "w-full focus-visible:outline-none"
27
+ },
28
+ variants: {
29
+ variant: {
30
+ pill: {
31
+ list: "bg-muted/60 dark:bg-muted/40 rounded-lg p-1",
32
+ trigger: "grow rounded-md data-[state=active]:text-highlighted z-10",
33
+ indicator: "bg-default rounded-md shadow-xs top-1 bottom-1 h-[calc(100%-8px)]"
46
34
  },
47
- orientation: {
48
- horizontal: {
49
- root: "flex-col",
50
- list: "w-full",
51
- indicator: "",
52
- trigger: "justify-center"
53
- },
54
- vertical: {
55
- root: "flex-row gap-6",
56
- list: "flex-col items-stretch w-48 border-r border-border p-0",
57
- trigger: "justify-start text-left"
58
- }
35
+ underline: {
36
+ list: "bg-transparent border-b border-default p-0 gap-2 -mb-px",
37
+ trigger: "rounded-md data-[state=active]:text-primary pb-2 pt-1 px-3 z-10",
38
+ indicator: "bg-primary rounded-full -bottom-px h-0.5 left-0"
59
39
  },
60
- size: {
61
- xs: {
62
- trigger: "px-2 py-1 text-xs gap-1",
63
- leadingIcon: "size-3.5"
64
- },
65
- sm: {
66
- trigger: "px-2.5 py-1.5 text-xs gap-1.5",
67
- leadingIcon: "size-4"
68
- },
69
- md: {
70
- trigger: "px-3 py-1.5 text-sm gap-1.5",
71
- leadingIcon: "size-4"
72
- },
73
- lg: {
74
- trigger: "px-3.5 py-2 text-sm gap-2",
75
- leadingIcon: "size-5"
76
- },
77
- xl: {
78
- trigger: "px-4 py-2.5 text-base gap-2",
79
- leadingIcon: "size-5"
80
- }
40
+ link: {
41
+ list: "bg-transparent border-b border-default p-0 gap-2 -mb-px",
42
+ trigger: "rounded-md data-[state=active]:text-primary pb-2 pt-1 px-3 z-10",
43
+ indicator: "bg-primary rounded-full -bottom-px h-0.5 left-0"
81
44
  }
82
45
  },
83
- defaultVariants: {
84
- variant: "pill",
85
- orientation: "horizontal",
86
- size: "md"
46
+ orientation: {
47
+ horizontal: {
48
+ root: "flex-col",
49
+ list: "w-full",
50
+ indicator: "",
51
+ trigger: "justify-center"
52
+ },
53
+ vertical: {
54
+ root: "flex-row gap-6",
55
+ list: "flex-col items-stretch w-48 border-r border-default p-0",
56
+ trigger: "justify-start text-left"
57
+ }
58
+ },
59
+ size: {
60
+ xs: {
61
+ trigger: "px-2 py-1 text-xs gap-1",
62
+ leadingIcon: "size-3.5"
63
+ },
64
+ sm: {
65
+ trigger: "px-2.5 py-1.5 text-xs gap-1.5",
66
+ leadingIcon: "size-4"
67
+ },
68
+ md: {
69
+ trigger: "px-3 py-1.5 text-sm gap-1.5",
70
+ leadingIcon: "size-4"
71
+ },
72
+ lg: {
73
+ trigger: "px-3.5 py-2 text-sm gap-2",
74
+ leadingIcon: "size-5"
75
+ },
76
+ xl: {
77
+ trigger: "px-4 py-2.5 text-base gap-2",
78
+ leadingIcon: "size-5"
79
+ }
87
80
  }
88
- })
89
-
90
- export default createTabsTheme()
81
+ },
82
+ defaultVariants: {
83
+ variant: "pill",
84
+ orientation: "horizontal",
85
+ size: "md"
86
+ }
87
+ })
@@ -1,4 +1,4 @@
1
- import type { ThemeColor } from "../../types/component"
1
+ import type { ThemeColor } from "../../types"
2
2
 
3
3
  export interface TabItem {
4
4
  label?: string
@@ -73,6 +73,23 @@ export interface TabsProps<T extends TabItem = TabItem> {
73
73
  * @default "label"
74
74
  */
75
75
  labelKey?: string
76
+ /**
77
+ * Maximum number of tab triggers to render in the tab list. Tabs beyond this cap are placed in a
78
+ * native popover accessible via a '+N more' overflow button at the end of the tab list.
79
+ *
80
+ * Additionally, container queries will progressively hide visible triggers from right to left as
81
+ * the container narrows, surfacing those in the popover as well.
82
+ *
83
+ * When undefined, all tabs are rendered in the list (original behaviour).
84
+ */
85
+ maxTabs?: number
86
+ /**
87
+ * Estimated width in pixels of each tab trigger — used to compute the container-query breakpoints
88
+ * that drive the responsive overflow. Increase for longer labels, decrease for icon-only tabs.
89
+ *
90
+ * @default 100
91
+ */
92
+ estimatedTabWidth?: number
76
93
  /**
77
94
  * Slot-specific CSS class overrides.
78
95
  */
@@ -1,12 +1,8 @@
1
1
  ---
2
- import { scv } from "css-variants"
3
- import { useUi } from "../../utils/useUi"
4
- import { resolveClasses } from "../../utils/resolveClasses"
5
2
  import type { TextareaProps } from "./textarea"
6
- import textareaTheme from "./textarea.theme"
3
+ import { textareaTheme } from "./textarea.theme"
7
4
 
8
5
 
9
- const textarea = scv(textareaTheme)
10
6
 
11
7
  const {
12
8
  value = "",
@@ -16,20 +12,26 @@ const {
16
12
  name,
17
13
  required = false,
18
14
  rows = 4,
15
+ autoGrow = false,
19
16
  error = false,
20
- size = "md",
21
- color = "primary",
22
- ui: uiProp,
23
- class: className,
24
17
  ...rest
25
18
  } = Astro.props as TextareaProps
26
19
 
27
- const classes = resolveClasses(textarea, {
28
- size,
20
+
21
+
22
+ const classes = textareaTheme({
23
+ ...Astro.props,
29
24
  error: !!error
30
- }, useUi("textarea", uiProp), className);
25
+ });
31
26
  ---
32
27
  <div class={classes.root} data-slot="root">
28
+ <!--
29
+ field-sizing: content (Chrome 2024+) makes the textarea grow automatically.
30
+ - When autoGrow is true we omit `rows` (fixed row count conflicts with field-sizing)
31
+ and inject the CSS property via an inline style.
32
+ - Browsers that don't support field-sizing silently ignore the style and fall
33
+ back to the min-height defined in textarea.theme.ts.
34
+ -->
33
35
  <textarea
34
36
  class={classes.textarea}
35
37
  placeholder={placeholder}
@@ -37,7 +39,8 @@ const classes = resolveClasses(textarea, {
37
39
  readonly={readonly}
38
40
  name={name}
39
41
  required={required}
40
- rows={rows}
42
+ rows={autoGrow ? undefined : rows}
43
+ style={autoGrow ? "field-sizing: content; min-height: unset;" : undefined}
41
44
  {...rest}
42
45
  >{value}</textarea>
43
46
  </div>
@@ -0,0 +1,69 @@
1
+ import { createMemo, splitProps, type Component } from "solid-js"
2
+ import type { TextareaProps } from "./textarea"
3
+ import { textareaTheme } from "./textarea.theme"
4
+
5
+ export interface RLSTextareaProps extends TextareaProps {
6
+ onInput?: (e: InputEvent & { currentTarget: HTMLTextAreaElement }) => void
7
+ onChange?: (e: Event & { currentTarget: HTMLTextAreaElement }) => void
8
+ onBlur?: (e: FocusEvent & { currentTarget: HTMLTextAreaElement }) => void
9
+ onFocus?: (e: FocusEvent & { currentTarget: HTMLTextAreaElement }) => void
10
+ onKeyDown?: (e: KeyboardEvent & { currentTarget: HTMLTextAreaElement }) => void
11
+ ref?: HTMLTextAreaElement | ((el: HTMLTextAreaElement) => void)
12
+ }
13
+
14
+ const RLSTextarea: Component<RLSTextareaProps> = (allProps) => {
15
+ const [props, rest] = splitProps(allProps, [
16
+ "value",
17
+ "placeholder",
18
+ "disabled",
19
+ "readonly",
20
+ "name",
21
+ "required",
22
+ "rows",
23
+ "error",
24
+ "size",
25
+ "color",
26
+ "ui",
27
+ "class",
28
+ "onInput",
29
+ "onChange",
30
+ "onBlur",
31
+ "onFocus",
32
+ "onKeyDown",
33
+ "ref"
34
+ ])
35
+
36
+ const resolvedClasses = createMemo(() =>
37
+ textareaTheme({
38
+ size: props.size ?? "md",
39
+ error: !!props.error,
40
+ ui: props.ui,
41
+ class: props.class
42
+ })
43
+ )
44
+
45
+ return (
46
+ <div class={resolvedClasses().root} data-slot="root">
47
+ <textarea
48
+ ref={props.ref}
49
+ name={props.name}
50
+ rows={props.rows ?? 3}
51
+ value={props.value !== undefined ? props.value : ""}
52
+ placeholder={props.placeholder}
53
+ disabled={props.disabled}
54
+ readonly={props.readonly}
55
+ required={props.required}
56
+ class={resolvedClasses().textarea}
57
+ data-slot="textarea"
58
+ onInput={props.onInput}
59
+ onChange={props.onChange}
60
+ onBlur={props.onBlur}
61
+ onFocus={props.onFocus}
62
+ onKeyDown={props.onKeyDown}
63
+ {...rest}
64
+ />
65
+ </div>
66
+ )
67
+ }
68
+
69
+ export default RLSTextarea