@rimelight/ui 0.0.42 → 0.0.44

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 (434) hide show
  1. package/README.md +18 -26
  2. package/package.json +24 -37
  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 +11 -39
  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 +24 -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 +114 -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 +13 -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 +159 -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 +11 -18
  39. package/src/components/callout/callout.theme.ts +55 -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 +45 -13
  46. package/src/components/carousel/carousel.theme.ts +28 -32
  47. package/src/components/chart/RLAChart.astro +6 -12
  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 +3 -17
  69. package/src/components/checkbox/RLSCheckbox.tsx +65 -0
  70. package/src/components/checkbox/checkbox.theme.ts +31 -46
  71. package/src/components/checkbox/checkbox.ts +1 -1
  72. package/src/components/chip/RLAChip.astro +33 -56
  73. package/src/components/chip/chip.theme.ts +62 -72
  74. package/src/components/chip/chip.ts +3 -1
  75. package/src/components/collapsible/RLACollapsible.astro +3 -13
  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 +3 -13
  79. package/src/components/color-area/color-area.theme.ts +16 -32
  80. package/src/components/color-area/color-area.ts +1 -1
  81. package/src/components/color-field/RLAColorField.astro +4 -14
  82. package/src/components/color-field/color-field.theme.ts +15 -31
  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 +3 -13
  87. package/src/components/color-slider/color-slider.theme.ts +17 -33
  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 +15 -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 -12
  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 +122 -21
  119. package/src/components/dashboard-sidebar/dashboard-sidebar.theme.ts +41 -11
  120. package/src/components/dashboard-sidebar/dashboard-sidebar.ts +8 -6
  121. package/src/components/dashboard-sidebar-collapse/RLADashboardSidebarCollapse.astro +25 -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/editor.theme.ts +9 -12
  140. package/src/components/empty/RLAEmpty.astro +86 -20
  141. package/src/components/empty/empty.theme.ts +79 -11
  142. package/src/components/empty/empty.ts +59 -2
  143. package/src/components/error/RLAError.astro +9 -20
  144. package/src/components/error/error.theme.ts +9 -12
  145. package/src/components/field-group/RLAFieldGroup.astro +2 -11
  146. package/src/components/field-group/field-group.theme.ts +18 -22
  147. package/src/components/fieldset/RLAFieldset.astro +9 -20
  148. package/src/components/fieldset/fieldset.theme.ts +9 -12
  149. package/src/components/file-upload/RLAFileUpload.astro +4 -13
  150. package/src/components/file-upload/file-upload.theme.ts +19 -22
  151. package/src/components/file-upload/file-upload.ts +1 -1
  152. package/src/components/floating-action/RLAFloatingAction.astro +9 -20
  153. package/src/components/floating-action/floating-action.theme.ts +9 -12
  154. package/src/components/footer/RLAFooter.astro +34 -38
  155. package/src/components/footer/footer.theme.ts +24 -27
  156. package/src/components/footer/footer.ts +4 -0
  157. package/src/components/form/RLAForm.astro +9 -20
  158. package/src/components/form/form.theme.ts +9 -12
  159. package/src/components/form-field/RLAFormField.astro +5 -12
  160. package/src/components/form-field/RLSFormField.tsx +71 -0
  161. package/src/components/form-field/RLVFormField.vue +5 -14
  162. package/src/components/form-field/form-field.theme.ts +19 -22
  163. package/src/components/form-field/form-field.ts +1 -0
  164. package/src/components/gallery/RLAGallery.astro +9 -20
  165. package/src/components/gallery/gallery.theme.ts +9 -12
  166. package/src/components/gamepad/RLAGamepad.astro +1 -1
  167. package/src/components/grid/RLAGrid.astro +2 -15
  168. package/src/components/grid/grid.theme.ts +31 -34
  169. package/src/components/head/UIHead.astro +297 -0
  170. package/src/components/head/head.theme.ts +9 -12
  171. package/src/components/header/HeaderLayer.astro +63 -0
  172. package/src/components/header/RLAHeader.astro +29 -48
  173. package/src/components/header/header.theme.ts +37 -40
  174. package/src/components/header/header.ts +4 -0
  175. package/src/{utils → components/header}/headerStack.ts +30 -22
  176. package/src/components/hover-card/RLAHoverCard.astro +24 -35
  177. package/src/components/hover-card/hover-card.theme.ts +23 -27
  178. package/src/components/icon/RLAIcon.astro +26 -36
  179. package/src/components/icon/RLSIcon.tsx +8 -9
  180. package/src/components/icon/RLVIcon.vue +23 -12
  181. package/src/components/icon/icon.theme.ts +18 -28
  182. package/src/components/image/RLAImage.astro +20 -23
  183. package/src/components/image/image.theme.ts +29 -32
  184. package/src/components/input/RLAInput.astro +7 -21
  185. package/src/components/input/RLSInput.tsx +101 -0
  186. package/src/components/input/RLVInput.vue +11 -20
  187. package/src/components/input/input.theme.ts +37 -44
  188. package/src/components/input/input.ts +1 -1
  189. package/src/components/input-date/RLAInputDate.astro +9 -20
  190. package/src/components/input-date/input-date.theme.ts +9 -12
  191. package/src/components/input-menu/RLAInputMenu.astro +4 -14
  192. package/src/components/input-menu/input-menu.theme.ts +29 -32
  193. package/src/components/input-menu/input-menu.ts +1 -1
  194. package/src/components/input-number/RLAInputNumber.astro +9 -20
  195. package/src/components/input-number/input-number.theme.ts +9 -12
  196. package/src/components/input-pin/RLAInputPin.astro +9 -22
  197. package/src/components/input-pin/input-pin.theme.ts +9 -13
  198. package/src/components/input-rating/RLAInputRating.astro +2 -23
  199. package/src/components/input-rating/input-rating.theme.ts +64 -76
  200. package/src/components/input-rating/input-rating.ts +1 -1
  201. package/src/components/input-tags/RLAInputTags.astro +174 -21
  202. package/src/components/input-tags/input-tags.theme.ts +37 -12
  203. package/src/components/input-tags/input-tags.ts +50 -0
  204. package/src/components/input-time/RLAInputTime.astro +9 -20
  205. package/src/components/input-time/input-time.theme.ts +9 -12
  206. package/src/components/kbd/RLAKbd.astro +18 -32
  207. package/src/components/kbd/kbd.theme.ts +45 -91
  208. package/src/components/kbd/kbd.ts +3 -0
  209. package/src/components/keyboard/RLAKeyboard.astro +1 -1
  210. package/src/components/knob/RLAKnob.astro +9 -20
  211. package/src/components/knob/knob.theme.ts +9 -12
  212. package/src/components/label/RLALabel.astro +16 -27
  213. package/src/components/label/label.theme.ts +16 -20
  214. package/src/components/layout-grid/RLALayoutGrid.astro +5 -11
  215. package/src/components/layout-grid/layout-grid.theme.ts +12 -15
  216. package/src/components/link/RLALink.astro +7 -20
  217. package/src/components/link/RLSLink.tsx +8 -16
  218. package/src/components/link/RLVLink.vue +7 -16
  219. package/src/components/link/link.theme.ts +33 -37
  220. package/src/components/link/link.ts +5 -5
  221. package/src/components/link-group/RLALinkGroup.astro +8 -45
  222. package/src/components/link-group/link-group.theme.ts +13 -27
  223. package/src/components/link-group/link-group.ts +5 -16
  224. package/src/components/listbox/RLAListbox.astro +9 -20
  225. package/src/components/listbox/listbox.theme.ts +9 -12
  226. package/src/components/locale-selector/RLALocaleSelector.astro +12 -52
  227. package/src/components/locale-selector/locale-selector.theme.ts +42 -45
  228. package/src/components/locale-selector/locale-selector.ts +4 -0
  229. package/src/components/logo/RLALogo.astro +13 -27
  230. package/src/components/logo/logo.theme.ts +9 -12
  231. package/src/components/main/RLAMain.astro +31 -36
  232. package/src/components/main/main.theme.ts +9 -12
  233. package/src/components/marquee/RLAMarquee.astro +62 -43
  234. package/src/components/marquee/marquee.theme.ts +22 -26
  235. package/src/components/meter/RLAMeter.astro +9 -20
  236. package/src/components/meter/meter.theme.ts +9 -12
  237. package/src/components/modal/RLAModal.astro +71 -73
  238. package/src/components/modal/RLSModal.tsx +156 -0
  239. package/src/components/modal/RLVModal.vue +5 -6
  240. package/src/components/modal/modal.theme.ts +42 -46
  241. package/src/components/modal/modal.ts +1 -0
  242. package/src/components/navigation-menu/RLANavigationMenu.astro +22 -31
  243. package/src/components/navigation-menu/navigation-menu.theme.ts +33 -40
  244. package/src/components/navigation-menu/navigation-menu.ts +19 -18
  245. package/src/components/page/RLAPage.astro +9 -20
  246. package/src/components/page/page.theme.ts +9 -12
  247. package/src/components/page-aside/RLAPageAside.astro +9 -20
  248. package/src/components/page-aside/page-aside.theme.ts +9 -12
  249. package/src/components/page-body/RLAPageBody.astro +9 -20
  250. package/src/components/page-body/page-body.theme.ts +9 -12
  251. package/src/components/page-header/RLAPageHeader.astro +9 -20
  252. package/src/components/page-header/page-header.theme.ts +9 -12
  253. package/src/components/page-section/RLAPageSection.astro +11 -15
  254. package/src/components/page-section/page-section.theme.ts +193 -176
  255. package/src/components/pagination/RLAPagination.astro +91 -97
  256. package/src/components/pagination/pagination.theme.ts +22 -26
  257. package/src/components/password/RLAPassword.astro +9 -20
  258. package/src/components/password/password.theme.ts +9 -12
  259. package/src/components/phone-mockup/RLAPhoneMockup.astro +9 -20
  260. package/src/components/phone-mockup/phone-mockup.theme.ts +9 -12
  261. package/src/components/placeholder/RLAPlaceholder.astro +32 -43
  262. package/src/components/placeholder/placeholder.theme.ts +11 -14
  263. package/src/components/popover/RLAPopover.astro +241 -129
  264. package/src/components/popover/popover.theme.ts +23 -27
  265. package/src/components/post/RLAPost.astro +2 -10
  266. package/src/components/post/post.theme.ts +45 -48
  267. package/src/components/pricing-plan/RLAPricingPlan.astro +9 -20
  268. package/src/components/pricing-plan/pricing-plan.theme.ts +9 -12
  269. package/src/components/pricing-table/RLAPricingTable.astro +9 -20
  270. package/src/components/pricing-table/pricing-table.theme.ts +9 -12
  271. package/src/components/progress/RLAProgress.astro +3 -16
  272. package/src/components/progress/progress.theme.ts +19 -35
  273. package/src/components/progress/progress.ts +1 -1
  274. package/src/components/prose/RLAProse.astro +9 -20
  275. package/src/components/prose/prose.theme.ts +9 -12
  276. package/src/components/qr-code/RLAQrCode.astro +9 -20
  277. package/src/components/qr-code/qr-code.theme.ts +9 -12
  278. package/src/components/quote/quote.theme.ts +9 -12
  279. package/src/components/radio-group/RLARadioGroup.astro +9 -20
  280. package/src/components/radio-group/radio-group.theme.ts +9 -12
  281. package/src/components/rating/RLARating.astro +9 -20
  282. package/src/components/rating/rating.theme.ts +9 -12
  283. package/src/components/scroll-area/RLAScrollArea.astro +2 -10
  284. package/src/components/scroll-area/scroll-area.theme.ts +21 -24
  285. package/src/components/scroll-to-top/RLAScrollToTop.astro +70 -45
  286. package/src/components/scroll-to-top/RLVScrollToTop.vue +13 -17
  287. package/src/components/scroll-to-top/scroll-to-top.theme.ts +28 -46
  288. package/src/components/scroll-to-top/scroll-to-top.ts +1 -1
  289. package/src/{utils → components/scroll-to-top}/scroll.ts +19 -6
  290. package/src/components/search/RLASearch.astro +6 -12
  291. package/src/components/search/search.theme.ts +60 -63
  292. package/src/components/select/RLASelect.astro +101 -132
  293. package/src/components/select/RLSSelect.tsx +180 -0
  294. package/src/components/select/RLVSelect.vue +64 -15
  295. package/src/components/select/select.theme.ts +21 -27
  296. package/src/components/select/select.ts +58 -36
  297. package/src/components/separator/RLASeparator.astro +62 -83
  298. package/src/components/separator/separator.theme.ts +135 -138
  299. package/src/components/separator/separator.ts +4 -0
  300. package/src/components/shortcuts/RLAShortcuts.astro +11 -12
  301. package/src/components/sidebar/RLASidebar.astro +14 -24
  302. package/src/components/sidebar/sidebar.theme.ts +39 -42
  303. package/src/components/sidebar/sidebar.ts +2 -0
  304. package/src/components/skeleton/RLASkeleton.astro +13 -22
  305. package/src/components/skeleton/skeleton.theme.ts +16 -19
  306. package/src/components/slideover/RLASlideover.astro +3 -13
  307. package/src/components/slideover/slideover.theme.ts +51 -55
  308. package/src/components/slider/RLASlider.astro +3 -15
  309. package/src/components/slider/slider.theme.ts +17 -34
  310. package/src/components/slider/slider.ts +1 -1
  311. package/src/components/speed-dial/RLASpeedDial.astro +9 -20
  312. package/src/components/speed-dial/speed-dial.theme.ts +9 -12
  313. package/src/components/spinner/RLASpinner.astro +3 -17
  314. package/src/components/spinner/spinner.theme.ts +25 -30
  315. package/src/components/spinner/spinner.ts +1 -1
  316. package/src/components/splitter/RLASplitter.astro +3 -11
  317. package/src/components/splitter/splitter.theme.ts +18 -21
  318. package/src/components/spoiler/RLASpoiler.astro +9 -20
  319. package/src/components/spoiler/spoiler.theme.ts +9 -12
  320. package/src/components/stepper/RLAStepper.astro +300 -21
  321. package/src/components/stepper/stepper.theme.ts +213 -12
  322. package/src/components/stepper/stepper.ts +23 -6
  323. package/src/components/steps/RLASteps.astro +5 -11
  324. package/src/components/steps/steps.theme.ts +9 -12
  325. package/src/components/sticky-surface/RLAStickySurface.astro +67 -38
  326. package/src/components/sticky-surface/sticky-surface.theme.ts +7 -11
  327. package/src/components/sticky-surface/sticky-surface.ts +1 -0
  328. package/src/components/surround/RLASurround.astro +5 -5
  329. package/src/components/switch/RLASwitch.astro +3 -18
  330. package/src/components/switch/switch.theme.ts +46 -61
  331. package/src/components/switch/switch.ts +1 -1
  332. package/src/components/table/RLATable.astro +566 -50
  333. package/src/components/table/table.theme.ts +112 -31
  334. package/src/components/table/table.ts +207 -6
  335. package/src/components/table-of-contents/RLATableOfContents.astro +12 -17
  336. package/src/components/table-of-contents/table-of-contents.theme.ts +60 -63
  337. package/src/components/tabs/RLATabs.astro +195 -51
  338. package/src/components/tabs/tabs.theme.ts +81 -84
  339. package/src/components/tabs/tabs.ts +18 -1
  340. package/src/components/textarea/RLATextarea.astro +16 -13
  341. package/src/components/textarea/RLSTextarea.tsx +69 -0
  342. package/src/components/textarea/RLVTextarea.vue +8 -16
  343. package/src/components/textarea/textarea.theme.ts +21 -24
  344. package/src/components/textarea/textarea.ts +2 -1
  345. package/src/components/theme-selector/RLAThemeSelector.astro +21 -27
  346. package/src/components/theme-selector/theme-selector.theme.ts +11 -14
  347. package/src/components/timeline/RLATimeline.astro +24 -44
  348. package/src/components/timeline/timeline.theme.ts +302 -307
  349. package/src/components/toast/RLAToast.astro +50 -24
  350. package/src/components/toast/store.ts +97 -0
  351. package/src/components/toast/toast.theme.ts +31 -34
  352. package/src/components/toast/toast.ts +1 -1
  353. package/src/components/toaster/RLAToaster.astro +76 -6
  354. package/src/components/tooltip/RLATooltip.astro +136 -33
  355. package/src/components/tooltip/tooltip.theme.ts +23 -26
  356. package/src/components/tour/RLATour.astro +9 -20
  357. package/src/components/tour/tour.theme.ts +9 -12
  358. package/src/components/tree/RLATree.astro +9 -20
  359. package/src/components/tree/tree.theme.ts +9 -12
  360. package/src/components/user/RLAUser.astro +9 -20
  361. package/src/components/user/user.theme.ts +9 -12
  362. package/src/components/video/RLAVideo.astro +5 -10
  363. package/src/components/video/video.theme.ts +13 -16
  364. package/src/components/watermark/RLAWatermark.astro +9 -20
  365. package/src/components/watermark/watermark.theme.ts +9 -12
  366. package/src/components/window-mockup/RLAWindowMockup.astro +9 -20
  367. package/src/components/window-mockup/window-mockup.theme.ts +9 -12
  368. package/src/icons.raw.ts +67 -0
  369. package/src/icons.ts +35 -0
  370. package/src/index.ts +32 -0
  371. package/src/preset.ts +148 -0
  372. package/src/resolver.ts +132 -0
  373. package/src/shortcuts.ts +191 -0
  374. package/src/stores.ts +22 -0
  375. package/src/types.ts +75 -0
  376. package/src/virtual.d.ts +4 -0
  377. package/src/components/editor/PageEditor.vue +0 -459
  378. package/src/components/editor/PageMention.vue +0 -87
  379. package/src/components/editor/PagePropertiesEditor.vue +0 -358
  380. package/src/components/editor/PagePropertiesRenderer.vue +0 -285
  381. package/src/components/editor/PageRenderer.vue +0 -155
  382. package/src/components/editor/PageSurround.vue +0 -130
  383. package/src/components/editor/PageVersionSelector.vue +0 -371
  384. package/src/components/editor/blocks/AddBlockModal.vue +0 -196
  385. package/src/components/editor/blocks/Block.vue +0 -141
  386. package/src/components/editor/blocks/BlockEditRenderer.vue +0 -26
  387. package/src/components/editor/blocks/BlockEditor.vue +0 -141
  388. package/src/components/editor/blocks/BlockViewRenderer.vue +0 -65
  389. package/src/components/editor/blocks/TextRenderer.vue +0 -31
  390. package/src/components/editor/blocks/editor/CalloutBlockEditor.vue +0 -53
  391. package/src/components/editor/blocks/editor/ImageBlockEditor.vue +0 -55
  392. package/src/components/editor/blocks/editor/ParagraphBlockEditor.vue +0 -31
  393. package/src/components/editor/blocks/editor/SectionBlockEditor.vue +0 -65
  394. package/src/components/editor/blocks/nodes/LinkNode.vue +0 -28
  395. package/src/components/editor/blocks/nodes/TextNode.vue +0 -22
  396. package/src/components/editor/blocks/renderer/CalloutBlockRenderer.vue +0 -66
  397. package/src/components/editor/blocks/renderer/ImageBlockRenderer.vue +0 -20
  398. package/src/components/editor/blocks/renderer/ParagraphBlockRenderer.vue +0 -21
  399. package/src/components/editor/blocks/renderer/SectionBlockRenderer.vue +0 -55
  400. package/src/components/editor/composables/injectionKeys.ts +0 -3
  401. package/src/components/editor/composables/useBlockEditor.ts +0 -261
  402. package/src/components/editor/composables/usePageEditor.ts +0 -97
  403. package/src/components/editor/modals/CreatePageModal.vue +0 -160
  404. package/src/components/editor/modals/DeletePageModal.vue +0 -116
  405. package/src/components/editor/modals/PageTreeModal.vue +0 -275
  406. package/src/components/editor/types/blocks.ts +0 -100
  407. package/src/components/editor/types/pages.ts +0 -89
  408. package/src/components/editor/types/schemas.ts +0 -36
  409. package/src/components/editor/utils/blocks.ts +0 -42
  410. package/src/components/editor/utils/editorHelpers.ts +0 -24
  411. package/src/components/editor/utils/page.ts +0 -219
  412. package/src/components/editor/utils/richTextHelpers.ts +0 -35
  413. package/src/components/editor/views/PageEditView.vue +0 -195
  414. package/src/components/editor/views/PageLiveView.vue +0 -90
  415. package/src/components/editor/views/PageReviewView.vue +0 -308
  416. package/src/components/head/RLAHead.astro +0 -528
  417. package/src/components/icon/resolver.ts +0 -37
  418. package/src/config/color.config.ts +0 -300
  419. package/src/config/site.config.ts +0 -28
  420. package/src/config/ui.config.ts +0 -89
  421. package/src/env.d.ts +0 -23
  422. package/src/icons/defaults.ts +0 -44
  423. package/src/presets/index.ts +0 -577
  424. package/src/stores/toast.ts +0 -24
  425. package/src/themes.ts +0 -26
  426. package/src/types/component.ts +0 -28
  427. package/src/ui.ts +0 -159
  428. package/src/utils/defineTheme.ts +0 -5
  429. package/src/utils/merge.ts +0 -62
  430. package/src/utils/resolveClasses.ts +0 -39
  431. package/src/utils/resolveTheme.ts +0 -13
  432. package/src/utils/shortcuts.ts +0 -322
  433. package/src/utils/toast.ts +0 -36
  434. package/src/utils/useUi.ts +0 -33
@@ -1,40 +1,38 @@
1
1
  ---
2
- import { scv } from "css-variants"
3
- import { useUi } from "../../utils/useUi"
4
- import { resolveClasses } from "../../utils/resolveClasses"
5
2
  import type { ToastProps } from "./toast"
6
- import toastTheme from "./toast.theme"
3
+ import { toastTheme } from "./toast.theme"
7
4
 
8
5
  import RLAIcon from "../icon/RLAIcon.astro"
9
6
 
10
- const toast = scv(toastTheme)
11
7
 
12
8
  const {
13
9
  title,
14
10
  description,
15
11
  variant = "default",
16
12
  actionLabel,
17
- duration = 5000,
18
- color = "primary",
19
- ui: uiProp,
20
- class: className,
13
+ duration = 6000,
21
14
  dismissable = true,
22
15
  ...rest
23
16
  } = Astro.props as ToastProps
24
17
 
25
- const classes = resolveClasses(toast, {
26
- variant: ["success", "error", "warning", "info"].includes(variant ?? "") ? variant : "default"
27
- }, useUi("toast", uiProp), className)
18
+ const classes = toastTheme({
19
+ ...Astro.props,
20
+ variant: ["success",
21
+ "error",
22
+ "warning",
23
+ "info"].includes(variant ?? "") ? variant : "default"
24
+ })
28
25
 
29
26
  const variantIcons: Record<string, string> = {
30
- default: "bell",
31
- error: "circleX",
32
- success: "circleCheck",
33
- warning: "alertTriangle",
34
- info: "info",
27
+ default: "i-rl-bell",
28
+ error: "i-rl-circleCheck",
29
+ success: "i-rl-circleCheck",
30
+ warning: "i-rl-alertTriangle",
31
+ info: "i-rl-info",
35
32
  }
36
33
 
37
34
  const icon = variantIcons[variant] ?? variantIcons.default!
35
+ const isError = variant === "error"
38
36
  ---
39
37
 
40
38
  <div
@@ -43,9 +41,10 @@ const icon = variantIcons[variant] ?? variantIcons.default!
43
41
  data-toast
44
42
  data-duration={duration}
45
43
  data-dismissable={dismissable.toString()}
46
- role="alert"
47
- aria-live="assertive"
44
+ role={isError ? "alert" : "status"}
45
+ aria-live={isError ? "assertive" : "polite"}
48
46
  aria-atomic="true"
47
+ tabindex="-1"
49
48
  {...rest}
50
49
  >
51
50
  {/* Icon */}
@@ -91,27 +90,54 @@ const icon = variantIcons[variant] ?? variantIcons.default!
91
90
  data-toast-close
92
91
  aria-label="Dismiss notification"
93
92
  >
94
- <RLAIcon name="close" class="size-3.5" aria-hidden="true" />
93
+ <RLAIcon name="i-rl-close" class="size-3.5" aria-hidden="true" />
95
94
  </button>
96
95
  )}
97
96
  </div>
98
97
 
99
98
  <script>
100
- document.querySelectorAll("[data-toast]").forEach(toast => {
99
+ document.querySelectorAll("[data-toast]").forEach(toastEl => {
100
+ const toast = toastEl as HTMLElement;
101
101
  const dismissable = toast.getAttribute("data-dismissable") !== "false";
102
102
  if (!dismissable) return;
103
103
 
104
104
  const close = toast.querySelector("[data-toast-close]");
105
- const duration = parseInt((toast as HTMLElement).dataset.duration ?? "5000", 10);
105
+ const duration = parseInt(toast.dataset.duration ?? "6000", 10);
106
+ let timerId: ReturnType<typeof setTimeout> | null = null;
107
+ let startTime = Date.now();
108
+ let remaining = duration;
106
109
 
107
110
  const dismiss = () => {
108
111
  toast.classList.add("opacity-0", "translate-y-2", "pointer-events-none");
109
112
  toast.addEventListener("transitionend", () => toast.remove(), { once: true });
110
113
  };
111
114
 
112
- // Auto-dismiss
115
+ const startTimer = () => {
116
+ if (duration > 0 && remaining > 0) {
117
+ startTime = Date.now();
118
+ timerId = setTimeout(dismiss, remaining);
119
+ }
120
+ };
121
+
122
+ const pauseTimer = () => {
123
+ if (timerId !== null) {
124
+ clearTimeout(timerId);
125
+ timerId = null;
126
+ remaining -= Date.now() - startTime;
127
+ }
128
+ };
129
+
130
+ // Auto-dismiss with pause on hover & focus
113
131
  if (duration > 0) {
114
- setTimeout(dismiss, duration);
132
+ startTimer();
133
+ toast.addEventListener("mouseenter", pauseTimer);
134
+ toast.addEventListener("mouseleave", startTimer);
135
+ toast.addEventListener("focusin", pauseTimer);
136
+ toast.addEventListener("focusout", (e) => {
137
+ if (!toast.contains(e.relatedTarget as Node)) {
138
+ startTimer();
139
+ }
140
+ });
115
141
  }
116
142
 
117
143
  // Manual close
@@ -0,0 +1,97 @@
1
+ import { atom } from "../../stores"
2
+
3
+ export interface ToastItem {
4
+ id: string
5
+ title: string
6
+ description?: string
7
+ variant?: "success" | "error" | "warning" | "info" | "default"
8
+ duration?: number
9
+ color?: string
10
+ icon?: string
11
+ onDismiss?: () => void
12
+ }
13
+
14
+ export type Toast = ToastItem
15
+
16
+ export const toasts = atom<ToastItem[]>([])
17
+
18
+ export function addToast(toast: Omit<ToastItem, "id"> & { id?: string }): ToastItem {
19
+ const id =
20
+ toast.id ||
21
+ (typeof crypto !== "undefined" && crypto.randomUUID
22
+ ? crypto.randomUUID()
23
+ : Math.random().toString(36).substring(2, 9))
24
+ const item: ToastItem = { duration: 6000, ...toast, id }
25
+ toasts.set([...toasts.get(), item])
26
+ return item
27
+ }
28
+
29
+ export function removeToast(id: string) {
30
+ const current = toasts.get()
31
+ const target = current.find((t) => t.id === id)
32
+ if (target?.onDismiss) {
33
+ const cb = target.onDismiss
34
+ delete target.onDismiss
35
+ try {
36
+ cb()
37
+ } catch (err) {
38
+ console.error("Error executing toast onDismiss callback:", err)
39
+ }
40
+ }
41
+ toasts.set(current.filter((t) => t.id !== id))
42
+ }
43
+
44
+ export function clearToasts() {
45
+ toasts.set([])
46
+ }
47
+
48
+ export type ToastInput = string | (Omit<ToastItem, "id"> & { id?: string })
49
+
50
+ function normalizeToastInput(
51
+ input: ToastInput,
52
+ description?: string,
53
+ variant?: ToastItem["variant"],
54
+ extra?: Partial<ToastItem>
55
+ ): Omit<ToastItem, "id"> & { id?: string } {
56
+ if (typeof input === "string") {
57
+ return {
58
+ title: input,
59
+ ...(description !== undefined ? { description } : {}),
60
+ ...(variant ? { variant } : {}),
61
+ ...extra
62
+ }
63
+ }
64
+ return {
65
+ ...input,
66
+ ...(variant && !input.variant ? { variant } : {}),
67
+ ...extra
68
+ }
69
+ }
70
+
71
+ export const toast = Object.assign(
72
+ (input: ToastInput, description?: string, options?: Partial<ToastItem>) => {
73
+ return addToast(normalizeToastInput(input, description, undefined, options))
74
+ },
75
+ {
76
+ error: (input: ToastInput, description?: string, options?: Partial<ToastItem>) =>
77
+ addToast(normalizeToastInput(input, description, "error", options)),
78
+ success: (input: ToastInput, description?: string, options?: Partial<ToastItem>) =>
79
+ addToast(normalizeToastInput(input, description, "success", options)),
80
+ warning: (input: ToastInput, description?: string, options?: Partial<ToastItem>) =>
81
+ addToast(normalizeToastInput(input, description, "warning", options)),
82
+ info: (input: ToastInput, description?: string, options?: Partial<ToastItem>) =>
83
+ addToast(normalizeToastInput(input, description, "info", options)),
84
+ add: addToast,
85
+ remove: removeToast,
86
+ clear: clearToasts
87
+ }
88
+ )
89
+
90
+ export const showErrorToast = (title: string, description?: string, options?: Partial<ToastItem>) =>
91
+ toast.error(title, description, options)
92
+
93
+ export const showSuccessToast = (
94
+ title: string,
95
+ description?: string,
96
+ options?: Partial<ToastItem>
97
+ ) => toast.success(title, description, options)
@@ -1,37 +1,34 @@
1
- import { defineTheme } from "../../utils/defineTheme"
1
+ import { defineTheme } from "../../resolver"
2
2
 
3
- export const createToastTheme = () =>
4
- defineTheme({
5
- slots: ["root", "title", "description", "action", "close"],
6
- base: {
7
- root: "group pointer-events-auto relative flex w-full items-start justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all border-border bg-background text-foreground",
8
- title: "text-sm font-semibold",
9
- description: "text-xs opacity-90",
10
- action:
11
- "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-xs font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.error]:border-muted/40 group-[.error]:hover:border-error-500/30 group-[.error]:hover:bg-error-500 group-[.error]:hover:text-white group-[.error]:focus:ring-error-500",
12
- close:
13
- "absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100"
14
- },
15
- variants: {
16
- variant: {
17
- default: { root: "bg-background border-border" },
18
- error: {
19
- root: "error group border-error-500/20 bg-error-500/10 text-error-700 dark:text-error-400"
20
- },
21
- success: {
22
- root: "border-success-500/20 bg-success-500/10 text-success-700 dark:text-success-400"
23
- },
24
- warning: {
25
- root: "border-warning-500/20 bg-warning-500/10 text-warning-700 dark:text-warning-400"
26
- },
27
- info: {
28
- root: "border-info-500/20 bg-info-500/10 text-info-700 dark:text-info-400"
29
- }
3
+ export const toastTheme = defineTheme("toast", {
4
+ slots: ["root", "title", "description", "action", "close"],
5
+ base: {
6
+ root: "group pointer-events-auto relative flex w-full items-start justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all border-default bg-default text-highlighted",
7
+ title: "text-sm font-semibold",
8
+ description: "text-xs opacity-90",
9
+ action:
10
+ "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-xs font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.error]:border-muted/40 group-[.error]:hover:border-error-500/30 group-[.error]:hover:bg-error-500 group-[.error]:hover:text-white group-[.error]:focus:ring-error-500",
11
+ close:
12
+ "absolute right-2 top-2 rounded-md p-1 text-highlighted/50 opacity-0 transition-opacity hover:text-highlighted focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100"
13
+ },
14
+ variants: {
15
+ variant: {
16
+ default: { root: "bg-default border-default" },
17
+ error: {
18
+ root: "error group border-error-500/20 bg-error-500/10 text-error-700 dark:text-error-400"
19
+ },
20
+ success: {
21
+ root: "border-success-500/20 bg-success-500/10 text-success-700 dark:text-success-400"
22
+ },
23
+ warning: {
24
+ root: "border-warning-500/20 bg-warning-500/10 text-warning-700 dark:text-warning-400"
25
+ },
26
+ info: {
27
+ root: "border-info-500/20 bg-info-500/10 text-info-700 dark:text-info-400"
30
28
  }
31
- },
32
- defaultVariants: {
33
- variant: "default"
34
29
  }
35
- })
36
-
37
- export default createToastTheme()
30
+ },
31
+ defaultVariants: {
32
+ variant: "default"
33
+ }
34
+ })
@@ -1,4 +1,4 @@
1
- import type { ThemeColor } from "../../types/component"
1
+ import type { ThemeColor } from "../../types"
2
2
  export interface ToastProps {
3
3
  /**
4
4
  * Main toast title.
@@ -1,10 +1,16 @@
1
1
  ---
2
2
  ---
3
3
 
4
- <div id="rla-toaster-container" class="fixed bottom-5 right-5 z-[200] flex flex-col gap-2 max-w-sm w-full pointer-events-none"></div>
4
+ <div
5
+ id="rla-toaster-container"
6
+ class="fixed bottom-5 right-5 z-[200] flex flex-col gap-2 max-w-sm w-full pointer-events-none"
7
+ aria-live="polite"
8
+ aria-atomic="false"
9
+ role="status"
10
+ ></div>
5
11
 
6
12
  <script>
7
- import { toasts, removeToast, addToast } from "../../stores/toast"
13
+ import { toasts, removeToast, addToast } from "../toast/store"
8
14
 
9
15
  function checkPendingToasts() {
10
16
  const stored = sessionStorage.getItem("pending_toast")
@@ -56,9 +62,30 @@
56
62
  document.addEventListener("astro:page-load", checkPendingToasts)
57
63
 
58
64
  const container = document.getElementById("rla-toaster-container")
65
+ const activeTimers = new Map<string, { timerId: ReturnType<typeof setTimeout> | null; startTime: number; remaining: number }>()
66
+
67
+ // Keyboard shortcut (Alt + T) to jump focus to active toasts for keyboard accessibility
68
+ window.addEventListener("keydown", (e) => {
69
+ if (e.altKey && (e.key === "t" || e.key === "T")) {
70
+ const firstCloseBtn = container?.querySelector<HTMLButtonElement>("button")
71
+ if (firstCloseBtn) {
72
+ e.preventDefault()
73
+ firstCloseBtn.focus()
74
+ }
75
+ }
76
+ })
59
77
 
60
78
  toasts.subscribe((list) => {
61
79
  if (!container) return
80
+
81
+ // Cleanup old timers for removed toasts
82
+ for (const [id, timerData] of activeTimers.entries()) {
83
+ if (!list.some(t => t.id === id)) {
84
+ if (timerData.timerId) clearTimeout(timerData.timerId)
85
+ activeTimers.delete(id)
86
+ }
87
+ }
88
+
62
89
  container.innerHTML = ""
63
90
  list.forEach((t) => {
64
91
  const el = document.createElement("div")
@@ -67,20 +94,63 @@
67
94
  ? "bg-error-900 text-error-100 border-error-700"
68
95
  : "bg-neutral-900 text-white border-neutral-800 dark:bg-neutral-800"
69
96
  const iconSvg = isError
70
- ? `<svg class="size-4 shrink-0 text-error-400 mt-0.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="m15 9-6 6M9 9l6 6"/></svg>`
71
- : `<svg class="size-4 shrink-0 text-success-400 mt-0.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="m9 12 2 2 4-4"/></svg>`
97
+ ? `<svg class="size-4 shrink-0 text-error-400 mt-0.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="m15 9-6 6M9 9l6 6"/></svg>`
98
+ : `<svg class="size-4 shrink-0 text-success-400 mt-0.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="m9 12 2 2 4-4"/></svg>`
72
99
 
73
100
  el.className = `pointer-events-auto flex items-start gap-3 p-4 rounded-lg border shadow-xl transition-all duration-300 ${bgClass}`
101
+ el.setAttribute("role", isError ? "alert" : "status")
102
+ el.setAttribute("aria-live", isError ? "assertive" : "polite")
103
+ el.setAttribute("tabindex", "-1")
104
+
74
105
  el.innerHTML = `
75
106
  ${iconSvg}
76
107
  <div class="flex flex-col gap-0.5 flex-1 min-w-0">
77
108
  <div class="font-semibold text-sm">${t.title}</div>
78
109
  ${t.description ? `<div class="text-xs opacity-90">${t.description}</div>` : ""}
79
110
  </div>
80
- <button type="button" class="text-neutral-400 hover:text-white p-0.5 rounded focus:outline-none" aria-label="Close">
81
- <svg class="size-3.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6 6 18M6 6l12 12"/></svg>
111
+ <button type="button" class="text-neutral-400 hover:text-white p-0.5 rounded focus:outline-none focus:ring-2 focus:ring-primary-500" aria-label="Dismiss notification">
112
+ <svg class="size-3.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12"/></svg>
82
113
  </button>
83
114
  `
115
+
116
+ // Auto-dismiss management with pause-on-hover/focus
117
+ const duration = t.duration ?? 6000
118
+ if (duration > 0) {
119
+ let timerData = activeTimers.get(t.id)
120
+ if (!timerData) {
121
+ timerData = { timerId: null, startTime: Date.now(), remaining: duration }
122
+ activeTimers.set(t.id, timerData)
123
+ }
124
+
125
+ const startTimer = () => {
126
+ if (timerData.remaining > 0) {
127
+ timerData.startTime = Date.now()
128
+ timerData.timerId = setTimeout(() => {
129
+ removeToast(t.id)
130
+ }, timerData.remaining)
131
+ }
132
+ }
133
+
134
+ const pauseTimer = () => {
135
+ if (timerData.timerId !== null) {
136
+ clearTimeout(timerData.timerId)
137
+ timerData.timerId = null;
138
+ timerData.remaining -= Date.now() - timerData.startTime
139
+ }
140
+ }
141
+
142
+ startTimer()
143
+
144
+ el.addEventListener("mouseenter", pauseTimer)
145
+ el.addEventListener("mouseleave", startTimer)
146
+ el.addEventListener("focusin", pauseTimer)
147
+ el.addEventListener("focusout", (e) => {
148
+ if (!el.contains(e.relatedTarget as Node)) {
149
+ startTimer()
150
+ }
151
+ })
152
+ }
153
+
84
154
  el.querySelector("button")?.addEventListener("click", () => removeToast(t.id))
85
155
  container.appendChild(el)
86
156
  })
@@ -1,33 +1,136 @@
1
- ---
2
- import { scv } from "css-variants"
3
- import { useUi } from "../../utils/useUi"
4
- import { resolveClasses } from "../../utils/resolveClasses"
5
- import type { TooltipProps } from "./tooltip"
6
- import tooltipTheme from "./tooltip.theme"
7
-
8
-
9
- const tooltip = scv(tooltipTheme)
10
-
11
- const {
12
- content,
13
- placement = "top",
14
- ui: uiProp,
15
- class: className,
16
- ...rest
17
- } = Astro.props as TooltipProps
18
-
19
- const classes = resolveClasses(tooltip, {
20
- placement
21
- }, useUi("tooltip", uiProp), className)
22
- ---
23
- <div class={classes.root} data-slot="tooltip-container" {...rest}>
24
- <div class={classes.trigger} data-slot="trigger" tabindex="0">
25
- <slot />
26
- </div>
27
-
28
- <div class={classes.content} data-slot="content" role="tooltip">
29
- <slot name="content">
30
- {content}
31
- </slot>
32
- </div>
33
- </div>
1
+ ---
2
+ import type { TooltipProps } from "./tooltip"
3
+ import { tooltipTheme } from "./tooltip.theme"
4
+
5
+
6
+
7
+ const {
8
+ content,
9
+ placement = "top",
10
+ ...rest
11
+ } = Astro.props as TooltipProps
12
+
13
+ const classes = tooltipTheme(Astro.props)
14
+
15
+ const anchorName = `--rla-tt-${Math.random().toString(36).substring(2, 9)}`
16
+ ---
17
+ <div class={classes.root} data-slot="tooltip-container" data-placement={placement} {...rest}>
18
+ <div
19
+ class={classes.trigger}
20
+ data-slot="trigger"
21
+ tabindex="0"
22
+ style={`anchor-name: ${anchorName}`}
23
+ >
24
+ <slot />
25
+ </div>
26
+
27
+ <div
28
+ class={classes.content}
29
+ data-slot="content"
30
+ role="tooltip"
31
+ style={`position-anchor: ${anchorName}`}
32
+ >
33
+ <slot name="content">
34
+ {content}
35
+ </slot>
36
+ </div>
37
+ </div>
38
+
39
+ <style>
40
+ /*
41
+ * CSS Anchor Positioning — progressive enhancement (Chrome 125+).
42
+ *
43
+ * Browsers that don't support anchor-name will ignore this block and
44
+ * fall back to the existing absolute + translate-based placement
45
+ * defined in tooltip.theme.ts. No JavaScript needed in either path.
46
+ */
47
+ @supports (anchor-name: --x) {
48
+ [data-slot="tooltip-container"] [data-slot="content"] {
49
+ /*
50
+ * Switch from the theme's translate-based absolute positioning
51
+ * to anchor-relative positioning so the browser handles overflow
52
+ * and viewport clipping automatically.
53
+ */
54
+ position: absolute;
55
+ position-anchor: inherit; /* resolved from inline style */
56
+
57
+ /* Reset theme's translate hacks — anchor() handles the math */
58
+ transform: none !important;
59
+ left: unset;
60
+ right: unset;
61
+ top: unset;
62
+ bottom: unset;
63
+ margin: 0;
64
+ }
65
+
66
+ /* top (default) */
67
+ [data-placement="top"] [data-slot="content"] {
68
+ bottom: anchor(top);
69
+ left: anchor(center);
70
+ translate: -50% 0;
71
+ margin-bottom: 0.375rem;
72
+ position-try-fallbacks: --tt-bottom, --tt-right, --tt-left;
73
+ }
74
+
75
+ /* bottom */
76
+ [data-placement="bottom"] [data-slot="content"] {
77
+ top: anchor(bottom);
78
+ left: anchor(center);
79
+ translate: -50% 0;
80
+ margin-top: 0.375rem;
81
+ position-try-fallbacks: --tt-top, --tt-right, --tt-left;
82
+ }
83
+
84
+ /* left */
85
+ [data-placement="left"] [data-slot="content"] {
86
+ right: anchor(left);
87
+ top: anchor(center);
88
+ translate: 0 -50%;
89
+ margin-right: 0.375rem;
90
+ position-try-fallbacks: --tt-right, --tt-top, --tt-bottom;
91
+ }
92
+
93
+ /* right */
94
+ [data-placement="right"] [data-slot="content"] {
95
+ left: anchor(right);
96
+ top: anchor(center);
97
+ translate: 0 -50%;
98
+ margin-left: 0.375rem;
99
+ position-try-fallbacks: --tt-left, --tt-top, --tt-bottom;
100
+ }
101
+
102
+ /* Fallback positions the browser tries when the preferred side clips */
103
+ @position-try --tt-top {
104
+ bottom: anchor(top);
105
+ top: auto;
106
+ left: anchor(center);
107
+ translate: -50% 0;
108
+ margin-bottom: 0.375rem;
109
+ margin-top: 0;
110
+ }
111
+ @position-try --tt-bottom {
112
+ top: anchor(bottom);
113
+ bottom: auto;
114
+ left: anchor(center);
115
+ translate: -50% 0;
116
+ margin-top: 0.375rem;
117
+ margin-bottom: 0;
118
+ }
119
+ @position-try --tt-left {
120
+ right: anchor(left);
121
+ left: auto;
122
+ top: anchor(center);
123
+ translate: 0 -50%;
124
+ margin-right: 0.375rem;
125
+ margin-left: 0;
126
+ }
127
+ @position-try --tt-right {
128
+ left: anchor(right);
129
+ right: auto;
130
+ top: anchor(center);
131
+ translate: 0 -50%;
132
+ margin-left: 0.375rem;
133
+ margin-right: 0;
134
+ }
135
+ }
136
+ </style>
@@ -1,28 +1,25 @@
1
- import { defineTheme } from "../../utils/defineTheme"
1
+ import { defineTheme } from "../../resolver"
2
2
 
3
- export const createTooltipTheme = () =>
4
- defineTheme({
5
- slots: ["root", "trigger", "content"],
6
- base: {
7
- root: "relative inline-block group/tooltip",
8
- trigger: "",
9
- content: [
10
- "absolute z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground shadow-md animate-in fade-in-0 zoom-in-95",
11
- "transition-all duration-150 invisible opacity-0 scale-95 origin-center pointer-events-none",
12
- "group-hover/tooltip:visible group-hover/tooltip:opacity-100 group-hover/tooltip:scale-100"
13
- ]
14
- },
15
- variants: {
16
- placement: {
17
- top: { content: "bottom-full left-1/2 -translate-x-1/2 mb-1.5" },
18
- bottom: { content: "top-full left-1/2 -translate-x-1/2 mt-1.5" },
19
- left: { content: "right-full top-1/2 -translate-y-1/2 mr-1.5" },
20
- right: { content: "left-full top-1/2 -translate-y-1/2 ml-1.5" }
21
- }
22
- },
23
- defaultVariants: {
24
- placement: "top"
3
+ export const tooltipTheme = defineTheme("tooltip", {
4
+ slots: ["root", "trigger", "content"],
5
+ base: {
6
+ root: "relative inline-block group/tooltip",
7
+ trigger: "",
8
+ content: [
9
+ "absolute z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-neutral-50 shadow-md animate-in fade-in-0 zoom-in-95",
10
+ "transition-all duration-150 invisible opacity-0 scale-95 origin-center pointer-events-none",
11
+ "group-hover/tooltip:visible group-hover/tooltip:opacity-100 group-hover/tooltip:scale-100"
12
+ ]
13
+ },
14
+ variants: {
15
+ placement: {
16
+ top: { content: "bottom-full left-1/2 -translate-x-1/2 mb-1.5" },
17
+ bottom: { content: "top-full left-1/2 -translate-x-1/2 mt-1.5" },
18
+ left: { content: "right-full top-1/2 -translate-y-1/2 mr-1.5" },
19
+ right: { content: "left-full top-1/2 -translate-y-1/2 ml-1.5" }
25
20
  }
26
- })
27
-
28
- export default createTooltipTheme()
21
+ },
22
+ defaultVariants: {
23
+ placement: "top"
24
+ }
25
+ })