@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,97 +0,0 @@
1
- import { computed, type Ref, shallowRef, watch } from "vue"
2
- import { type Page } from "../types/pages"
3
-
4
- export function usePageEditor(page: Ref<Page>, maxHistorySize: number = 100) {
5
- const history = shallowRef<string[]>([])
6
- const future = shallowRef<string[]>([])
7
- let lastCapturedState = JSON.stringify(page.value)
8
- let isPaused = false
9
-
10
- const canUndo = computed(() => history.value.length > 0)
11
- const canRedo = computed(() => future.value.length > 0)
12
-
13
- const captureSnapshot = () => {
14
- const currentSnapshot = JSON.stringify(page.value)
15
- if (currentSnapshot === lastCapturedState) return
16
-
17
- future.value = []
18
- const newHistory = [...history.value, lastCapturedState]
19
- if (newHistory.length > maxHistorySize) newHistory.shift()
20
- history.value = newHistory
21
-
22
- lastCapturedState = currentSnapshot
23
- }
24
-
25
- const undo = () => {
26
- if (history.value.length === 0) return
27
-
28
- const currentState = JSON.stringify(page.value)
29
- future.value = [currentState, ...future.value]
30
-
31
- const previousStateString = history.value[history.value.length - 1]!
32
- lastCapturedState = previousStateString
33
-
34
- page.value = JSON.parse(previousStateString)
35
-
36
- const newHistory = [...history.value]
37
- newHistory.pop()
38
- history.value = newHistory
39
- }
40
-
41
- const redo = () => {
42
- if (future.value.length === 0) return
43
-
44
- const currentState = JSON.stringify(page.value)
45
- history.value = [...history.value, currentState]
46
- lastCapturedState = currentState
47
-
48
- const nextStateString = future.value[0]!
49
- page.value = JSON.parse(nextStateString)
50
- lastCapturedState = nextStateString
51
-
52
- const newFuture = [...future.value]
53
- newFuture.shift()
54
- future.value = newFuture
55
- }
56
-
57
- const save = () => {
58
- return JSON.parse(JSON.stringify(page.value))
59
- }
60
-
61
- const pauseHistory = () => {
62
- isPaused = true
63
- }
64
-
65
- const resumeHistory = () => {
66
- isPaused = false
67
- }
68
-
69
- const resetHistory = () => {
70
- history.value = []
71
- future.value = []
72
- lastCapturedState = JSON.stringify(page.value)
73
- }
74
-
75
- watch(
76
- [() => page.value.properties, () => page.value.title, () => page.value.blocks],
77
- () => {
78
- if (isPaused) {
79
- return
80
- }
81
- captureSnapshot()
82
- },
83
- { deep: true }
84
- )
85
-
86
- return {
87
- undo,
88
- redo,
89
- canUndo,
90
- canRedo,
91
- save,
92
- captureSnapshot,
93
- resetHistory,
94
- pauseHistory,
95
- resumeHistory
96
- }
97
- }
@@ -1,160 +0,0 @@
1
- <script setup lang="ts">
2
- import { ref, computed, watch } from "vue"
3
- import type { PageDefinition, PageType, Page } from "../types/pages"
4
- import { scv, cx } from "css-variants"
5
- import { useI18n } from "../utils/editorHelpers"
6
- import RLVButton from "../../button/RLVButton.vue"
7
- import RLVInput from "../../input/RLVInput.vue"
8
- import RLVFormField from "../../form-field/RLVFormField.vue"
9
-
10
- export interface CreatePageModalProps {
11
- definitions: Record<string, PageDefinition>
12
- loading?: boolean
13
- }
14
-
15
- const { loading, definitions } = defineProps<CreatePageModalProps>()
16
-
17
- export interface CreatePageModalEmits {
18
- close: []
19
- confirm: [page: Partial<Page>]
20
- }
21
- const emit = defineEmits<CreatePageModalEmits>()
22
-
23
- const createPageModalStyles = scv({
24
- slots: ["header", "headerTitle", "closeButton", "body", "field", "footerClass"],
25
- base: {
26
- header: "flex items-center justify-between px-4 py-3 border-b border-default",
27
- headerTitle: "text-base font-semibold leading-6",
28
- closeButton: "-my-1",
29
- body: "space-y-4 p-4",
30
- field: "w-full",
31
- footerClass: "flex justify-end gap-2 p-4 border-t border-default"
32
- }
33
- })
34
-
35
- const styles = computed(() => createPageModalStyles())
36
-
37
- const open = defineModel<boolean>("open", { default: false })
38
- const { t } = useI18n()
39
- const selectedType = ref<PageType | "">("")
40
- const title = ref("")
41
- const slug = ref("")
42
-
43
- const typeOptions = computed(() => {
44
- if (!definitions) return []
45
- return Object.entries(definitions).map(([key, def]) => ({
46
- label: t(def.typeLabelKey) === def.typeLabelKey ? key : t(def.typeLabelKey),
47
- value: key
48
- }))
49
- })
50
-
51
- defineOptions({ name: "CreatePageModal" })
52
-
53
- watch(title, (newTitle) => {
54
- slug.value = newTitle
55
- .toLowerCase()
56
- .replace(/[^a-z0-9]+/g, "-")
57
- .replace(/(^-|-$)/g, "")
58
- })
59
-
60
- watch(open, (isOpen) => {
61
- if (!isOpen) {
62
- emit("close")
63
- }
64
- })
65
-
66
- const handleConfirm = () => {
67
- if (!selectedType.value || !definitions) return
68
- const definition = definitions[selectedType.value]
69
- if (!definition) {
70
- console.error(`Definition for type "${selectedType.value}" not found.`)
71
- return
72
- }
73
-
74
- const properties: Record<string, any> = {}
75
- Object.entries(definition.properties).forEach(([groupKey, group]) => {
76
- properties[groupKey] = { ...group, fields: {} }
77
- Object.entries(group.fields).forEach(([fieldKey, field]) => {
78
- properties[groupKey].fields[fieldKey] = { ...field }
79
- })
80
- })
81
-
82
- const newPage: Partial<Page> = {
83
- type: selectedType.value as any,
84
- title: { en: title.value },
85
- slug: slug.value,
86
- properties: properties as any,
87
- blocks: definition.initialBlocks ? definition.initialBlocks() : [],
88
- createdAt: new Date(),
89
- updatedAt: new Date()
90
- }
91
-
92
- emit("confirm", newPage)
93
- }
94
- </script>
95
-
96
- <template>
97
- <div
98
- v-if="open"
99
- class="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/60 backdrop-blur-sm"
100
- @click.self="open = false"
101
- >
102
- <div
103
- class="bg-white dark:bg-neutral-900 border border-default rounded-2xl w-full max-w-lg shadow-xl overflow-hidden flex flex-col"
104
- >
105
- <div :class="styles.header">
106
- <h3 :class="styles.headerTitle">
107
- {{ t("page_editor.create_page", "Create New Page") }}
108
- </h3>
109
- <RLVButton
110
- color="neutral"
111
- variant="ghost"
112
- leading-leading-icon="i-lucide-x"
113
- class="!p-1.5"
114
- :class="styles.closeButton"
115
- @click="open = false"
116
- />
117
- </div>
118
-
119
- <div :class="styles.body">
120
- <RLVFormField :label="t('page_properties.page_template', 'Page Template')" required>
121
- <select
122
- v-model="selectedType"
123
- class="w-full bg-transparent border border-default rounded-md px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary text-default bg-white dark:bg-neutral-900"
124
- >
125
- <option value="" disabled>
126
- {{ t("editor.template_placeholder", "Select a template...") }}
127
- </option>
128
- <option v-for="opt in typeOptions" :key="opt.value" :value="opt.value">
129
- {{ opt.label }}
130
- </option>
131
- </select>
132
- </RLVFormField>
133
-
134
- <RLVFormField :label="t('page_properties.title', 'Title')" required>
135
- <RLVInput v-model="title" placeholder="e.g. My Awesome Article" class="w-full" />
136
- </RLVFormField>
137
-
138
- <RLVFormField :label="t('page_properties.slug', 'Slug')" required>
139
- <RLVInput v-model="slug" placeholder="my-awesome-article" class="w-full" />
140
- </RLVFormField>
141
- </div>
142
-
143
- <div :class="styles.footerClass">
144
- <RLVButton
145
- color="neutral"
146
- variant="ghost"
147
- :label="t('common.cancel', 'Cancel')"
148
- @click="open = false"
149
- />
150
- <RLVButton
151
- color="primary"
152
- :label="t('page_properties.create_and_edit', 'Create & Edit')"
153
- :loading="loading"
154
- :disabled="!selectedType || !title"
155
- @click="handleConfirm"
156
- />
157
- </div>
158
- </div>
159
- </div>
160
- </template>
@@ -1,116 +0,0 @@
1
- <script setup lang="ts">
2
- import { ref, watch, computed } from "vue"
3
- import { scv, cx } from "css-variants"
4
- import { useI18n } from "../utils/editorHelpers"
5
- import RLVButton from "../../button/RLVButton.vue"
6
- import RLVInput from "../../input/RLVInput.vue"
7
- import RLVFormField from "../../form-field/RLVFormField.vue"
8
-
9
- export interface DeletePageModalProps {
10
- loading?: boolean
11
- pageTitle: string
12
- }
13
-
14
- const { loading, pageTitle } = defineProps<DeletePageModalProps>()
15
-
16
- export interface DeletePageModalEmits {
17
- close: []
18
- confirm: []
19
- }
20
- const emits = defineEmits<DeletePageModalEmits>()
21
-
22
- const deletePageModalStyles = scv({
23
- slots: ["header", "headerTitle", "closeButton", "bodyClass", "footerClass"],
24
- base: {
25
- header: "flex items-center justify-between px-4 py-3 border-b border-default",
26
- headerTitle: "text-base font-semibold leading-6 text-red-600 dark:text-red-500",
27
- closeButton: "-my-1",
28
- bodyClass: "text-sm text-neutral-600 dark:text-neutral-400 p-4 space-y-4",
29
- footerClass: "flex justify-end gap-2 p-4 border-t border-default"
30
- }
31
- })
32
-
33
- const styles = computed(() => deletePageModalStyles())
34
-
35
- const open = defineModel<boolean>("open", { default: false })
36
- const { t } = useI18n()
37
- const confirmationInput = ref("")
38
- const CONFIRMATION_TEXT = "DELETE"
39
-
40
- defineOptions({ name: "DeletePageModal" })
41
-
42
- watch(open, (val) => {
43
- if (!val) {
44
- confirmationInput.value = ""
45
- emits("close")
46
- }
47
- })
48
-
49
- const handleConfirm = () => {
50
- if (confirmationInput.value === CONFIRMATION_TEXT) {
51
- emits("confirm")
52
- }
53
- }
54
- </script>
55
-
56
- <template>
57
- <div
58
- v-if="open"
59
- class="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/60 backdrop-blur-sm"
60
- @click.self="open = false"
61
- >
62
- <div
63
- class="bg-white dark:bg-neutral-900 border border-default rounded-2xl w-full max-w-lg shadow-xl overflow-hidden flex flex-col"
64
- >
65
- <div :class="styles.header">
66
- <h3 :class="styles.headerTitle">
67
- {{ t("editor.delete_page_title", "Delete Page") }}
68
- </h3>
69
- <RLVButton
70
- color="neutral"
71
- variant="ghost"
72
- leading-leading-icon="i-lucide-x"
73
- class="!p-1.5"
74
- :class="styles.closeButton"
75
- @click="open = false"
76
- />
77
- </div>
78
-
79
- <div :class="styles.bodyClass">
80
- <p>
81
- Are you sure you want to delete <strong>{{ pageTitle }}</strong
82
- >? This action is permanent and cannot be undone.
83
- </p>
84
- <RLVFormField
85
- :label="t('editor.delete_confirm_label', `Please type ${CONFIRMATION_TEXT} to confirm`)"
86
- required
87
- >
88
- <RLVInput
89
- v-model="confirmationInput"
90
- :placeholder="CONFIRMATION_TEXT"
91
- color="danger"
92
- autocomplete="off"
93
- @keyup.enter="handleConfirm"
94
- />
95
- </RLVFormField>
96
- </div>
97
-
98
- <div :class="styles.footerClass">
99
- <RLVButton
100
- color="neutral"
101
- variant="ghost"
102
- :label="t('common.cancel', 'Cancel')"
103
- @click="open = false"
104
- />
105
- <RLVButton
106
- color="danger"
107
- leading-leading-icon="i-lucide-trash-2"
108
- :label="t('editor.delete_button', 'Delete Permanently')"
109
- :loading="loading"
110
- :disabled="confirmationInput !== CONFIRMATION_TEXT"
111
- @click="handleConfirm"
112
- />
113
- </div>
114
- </div>
115
- </div>
116
- </template>
@@ -1,275 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, ref } from "vue"
3
- import { scv, cx } from "css-variants"
4
- import { useI18n } from "../utils/editorHelpers"
5
- import { getLocalizedContent } from "../utils/page"
6
- import type { Page } from "../types/pages"
7
- import RLVButton from "../../button/RLVButton.vue"
8
-
9
- export interface TreeItem {
10
- label: string
11
- icon?: string
12
- slug?: string
13
- path: string
14
- children?: TreeItem[]
15
- defaultExpanded?: boolean
16
- }
17
-
18
- export interface PageTreeModalProps {
19
- loading?: boolean
20
- pages?: Pick<Page, "title" | "slug">[]
21
- basePath?: string
22
- }
23
-
24
- const { loading, pages = [], basePath } = defineProps<PageTreeModalProps>()
25
-
26
- export interface PageTreeModalEmits {
27
- close: []
28
- navigate: [slug: string]
29
- }
30
- const emit = defineEmits<PageTreeModalEmits>()
31
-
32
- const pageTreeModalStyles = scv({
33
- slots: [
34
- "headerClass",
35
- "headerTitleClass",
36
- "closeButtonClass",
37
- "bodyClass",
38
- "footerClass",
39
- "loadingWrapper",
40
- "emptyWrapper",
41
- "itemWrapper",
42
- "itemLabel",
43
- "arrowIcon"
44
- ],
45
- base: {
46
- headerClass: "flex items-center justify-between px-4 py-3 border-b border-default",
47
- headerTitleClass: "text-base font-semibold leading-6",
48
- closeButtonClass: "-my-1",
49
- bodyClass: "p-4 min-h-[300px] max-h-[60vh] overflow-y-auto space-y-2",
50
- footerClass: "flex justify-end gap-2 p-4 border-t border-default",
51
- loadingWrapper: "p-4 flex justify-center items-center py-12",
52
- emptyWrapper: "p-4 text-center text-neutral-500 py-12",
53
- itemWrapper:
54
- "flex items-center gap-2 py-1.5 w-full hover:bg-neutral-50 dark:hover:bg-neutral-800/50 px-2 rounded-md transition cursor-pointer text-left",
55
- itemLabel: "text-sm",
56
- arrowIcon: "w-4 h-4 text-neutral-400 shrink-0"
57
- }
58
- })
59
-
60
- const styles = computed(() => pageTreeModalStyles())
61
-
62
- const open = defineModel<boolean>("open", { default: false })
63
- const { t, locale } = useI18n()
64
- const expandedNodes = ref<Record<string, boolean>>({})
65
-
66
- const treeItems = computed<TreeItem[]>(() => {
67
- if (!pages || pages.length === 0) return []
68
- const nodeMap = new Map<string, TreeItem>()
69
- const rootNodes: TreeItem[] = []
70
- const cleanBasePath = basePath ? basePath.replace(/^\/|\/$/g, "") : ""
71
-
72
- const getNode = (
73
- path: string,
74
- partLabel: string,
75
- pageObj?: Pick<Page, "title" | "slug">
76
- ): TreeItem => {
77
- if (!nodeMap.has(path)) {
78
- const label = pageObj
79
- ? getLocalizedContent(pageObj.title, locale.value) || partLabel
80
- : partLabel.charAt(0).toUpperCase() + partLabel.slice(1)
81
- const newNode: TreeItem = {
82
- label,
83
- path,
84
- slug: pageObj ? pageObj.slug : undefined,
85
- icon: pageObj ? "i-lucide-file" : "i-lucide-folder",
86
- children: []
87
- }
88
- nodeMap.set(path, newNode)
89
- } else if (pageObj) {
90
- const node = nodeMap.get(path)!
91
- node.label = getLocalizedContent(pageObj.title, locale.value) || node.label
92
- node.slug = pageObj.slug
93
- node.icon = "i-lucide-file-text"
94
- }
95
- return nodeMap.get(path)!
96
- }
97
-
98
- pages.forEach((page) => {
99
- const cleanSlug = page.slug.replace(/^\/|\/$/g, "")
100
- let relativePath = cleanSlug
101
- if (cleanBasePath && cleanSlug.startsWith(cleanBasePath)) {
102
- relativePath = cleanSlug.slice(cleanBasePath.length).replace(/^\//, "")
103
- } else if (cleanBasePath) {
104
- if (cleanSlug === cleanBasePath) {
105
- relativePath = ""
106
- }
107
- }
108
- const parts = relativePath.split("/").filter(Boolean)
109
- if (parts.length === 0) {
110
- const node = getNode("__root__", "Overview", page)
111
- if (!rootNodes.includes(node)) {
112
- rootNodes.push(node)
113
- }
114
- return
115
- }
116
- let currentPath = ""
117
- let parent: TreeItem | null = null
118
- parts.forEach((part, index) => {
119
- currentPath = currentPath ? `${currentPath}/${part}` : part
120
- const isLast = index === parts.length - 1
121
- const pageObj = isLast ? page : undefined
122
- const node = getNode(currentPath, part, pageObj)
123
- if (index === 0) {
124
- if (!rootNodes.includes(node)) {
125
- rootNodes.push(node)
126
- }
127
- } else {
128
- if (parent && !parent.children?.some((c) => c.path === node.path)) {
129
- if (!parent.children) {
130
- parent.children = []
131
- }
132
- parent.children.push(node)
133
- }
134
- }
135
- parent = node
136
- })
137
- })
138
-
139
- const processNodes = (nodes: TreeItem[]) => {
140
- nodes.sort((a, b) => a.label.localeCompare(b.label))
141
- for (const node of nodes) {
142
- if (node.slug && node.children && node.children.length > 0) {
143
- const indexNode: TreeItem = {
144
- label: `Overview: ${node.label}`,
145
- slug: node.slug,
146
- path: `${node.path}:index`,
147
- icon: "i-lucide-file-text",
148
- children: []
149
- }
150
- if (!node.children.some((c) => c.path === indexNode.path)) {
151
- node.children.unshift(indexNode)
152
- }
153
- node.slug = undefined
154
- node.icon = "i-lucide-folder"
155
- }
156
- if (node.children && node.children.length > 0) {
157
- processNodes(node.children)
158
- }
159
- }
160
- }
161
-
162
- processNodes(rootNodes)
163
- return rootNodes
164
- })
165
-
166
- defineOptions({ name: "PageTreeModal" })
167
-
168
- const handleSelect = (node: TreeItem) => {
169
- if (node.slug) {
170
- emit("navigate", node.slug)
171
- open.value = false
172
- } else {
173
- expandedNodes.value[node.path] = !expandedNodes.value[node.path]
174
- }
175
- }
176
-
177
- const isExpanded = (node: TreeItem) => {
178
- return expandedNodes.value[node.path] ?? false
179
- }
180
- </script>
181
-
182
- <template>
183
- <div
184
- v-if="open"
185
- class="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/60 backdrop-blur-sm"
186
- @click.self="open = false"
187
- >
188
- <div
189
- class="bg-white dark:bg-neutral-900 border border-default rounded-2xl w-full max-w-lg shadow-xl overflow-hidden flex flex-col"
190
- >
191
- <div :class="styles.headerClass">
192
- <h3 :class="styles.headerTitleClass">
193
- {{ t("editor.page_hierarchy", "Page Hierarchy") }}
194
- </h3>
195
- <RLVButton
196
- color="neutral"
197
- variant="ghost"
198
- leading-leading-icon="i-lucide-x"
199
- class="!p-1.5"
200
- :class="styles.closeButtonClass"
201
- @click="open = false"
202
- />
203
- </div>
204
-
205
- <div :class="styles.bodyClass">
206
- <div v-if="loading" :class="styles.loadingWrapper">
207
- <span class="i-lucide-loader-2 size-6 animate-spin text-neutral-400" />
208
- </div>
209
-
210
- <div v-else-if="treeItems.length === 0" :class="styles.emptyWrapper">
211
- {{ t("editor.no_pages_found", "No pages found.") }}
212
- </div>
213
-
214
- <div v-else class="space-y-1">
215
- <div v-for="item in treeItems" :key="item.path" class="space-y-1">
216
- <button :class="styles.itemWrapper" @click="handleSelect(item)">
217
- <span
218
- v-if="item.children && item.children.length > 0"
219
- :class="[
220
- isExpanded(item) ? 'i-lucide-chevron-down' : 'i-lucide-chevron-right',
221
- styles.arrowIcon
222
- ]"
223
- />
224
- <span v-else class="w-4 shrink-0" />
225
- <span v-if="item.icon" :class="[item.icon, 'size-4 shrink-0 opacity-60']" />
226
- <span
227
- :class="[
228
- styles.itemLabel,
229
- item.slug
230
- ? 'text-neutral-900 dark:text-neutral-100 font-medium'
231
- : 'text-neutral-500'
232
- ]"
233
- >
234
- {{ item.label }}
235
- </span>
236
- </button>
237
-
238
- <div
239
- v-if="item.children && item.children.length > 0 && isExpanded(item)"
240
- class="pl-4 border-l border-default ml-4 space-y-1"
241
- >
242
- <button
243
- v-for="sub in item.children"
244
- :key="sub.path"
245
- :class="styles.itemWrapper"
246
- @click="handleSelect(sub)"
247
- >
248
- <span v-if="sub.icon" :class="[sub.icon, 'size-4 shrink-0 opacity-60']" />
249
- <span
250
- :class="[
251
- styles.itemLabel,
252
- sub.slug
253
- ? 'text-neutral-900 dark:text-neutral-100 font-medium'
254
- : 'text-neutral-500'
255
- ]"
256
- >
257
- {{ sub.label }}
258
- </span>
259
- </button>
260
- </div>
261
- </div>
262
- </div>
263
- </div>
264
-
265
- <div :class="styles.footerClass">
266
- <RLVButton
267
- color="neutral"
268
- variant="ghost"
269
- :label="t('common.close', 'Close')"
270
- @click="open = false"
271
- />
272
- </div>
273
- </div>
274
- </div>
275
- </template>