@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,55 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from "vue"
3
- import type { ImageBlockProps } from "../../types/blocks"
4
- import RLVInput from "../../../input/RLVInput.vue"
5
-
6
- const props = defineProps<{ props: ImageBlockProps }>()
7
- const emit = defineEmits<{ "update:props": [value: ImageBlockProps] }>()
8
-
9
- const src = computed({
10
- get: () => props.props.src || "",
11
- set: (val: string) => emit("update:props", { ...props.props, src: val })
12
- })
13
-
14
- const alt = computed({
15
- get: () => props.props.alt || "",
16
- set: (val: string) => emit("update:props", { ...props.props, alt: val })
17
- })
18
-
19
- const caption = computed({
20
- get: () => props.props.caption || "",
21
- set: (val: string) => emit("update:props", { ...props.props, caption: val })
22
- })
23
-
24
- defineOptions({ name: "ImageBlockEditor" })
25
- </script>
26
-
27
- <template>
28
- <div
29
- class="w-full flex flex-col gap-3 p-4 border border-default rounded-xl bg-white dark:bg-neutral-900"
30
- >
31
- <div class="flex flex-col gap-1">
32
- <label class="text-xs font-bold text-dimmed uppercase">Image URL</label>
33
- <RLVInput v-model="src" placeholder="https://..." class="w-full" />
34
- </div>
35
-
36
- <div class="grid grid-cols-1 sm:grid-cols-2 gap-3">
37
- <div class="flex flex-col gap-1">
38
- <label class="text-xs font-bold text-dimmed uppercase">Alt Text</label>
39
- <RLVInput v-model="alt" placeholder="Alt description" class="w-full" />
40
- </div>
41
-
42
- <div class="flex flex-col gap-1">
43
- <label class="text-xs font-bold text-dimmed uppercase">Caption</label>
44
- <RLVInput v-model="caption" placeholder="Image caption" class="w-full" />
45
- </div>
46
- </div>
47
-
48
- <div
49
- v-if="src"
50
- class="mt-2 flex justify-center bg-neutral-100 dark:bg-neutral-800 p-2 rounded-lg"
51
- >
52
- <img :src="src" :alt="alt" class="max-h-48 object-cover rounded border border-default" />
53
- </div>
54
- </div>
55
- </template>
@@ -1,31 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from "vue"
3
- import type { ParagraphBlockProps } from "../../types/blocks"
4
- import { richTextToHtml, parseHtmlToRichText } from "../utils/richTextHelpers"
5
-
6
- const props = defineProps<{ props: ParagraphBlockProps }>()
7
- const emit = defineEmits<{ "update:props": [value: ParagraphBlockProps] }>()
8
-
9
- const textValue = computed({
10
- get: () => richTextToHtml(props.props?.text || []),
11
- set: (val: string) => {
12
- emit("update:props", {
13
- ...props.props,
14
- text: parseHtmlToRichText(val)
15
- })
16
- }
17
- })
18
-
19
- defineOptions({ name: "ParagraphBlockEditor" })
20
- </script>
21
-
22
- <template>
23
- <div class="w-full">
24
- <textarea
25
- v-model="textValue"
26
- placeholder="Type paragraph text here..."
27
- rows="3"
28
- class="w-full p-3 bg-white dark:bg-neutral-900 border border-default rounded-lg text-sm text-neutral-900 dark:text-neutral-100 focus:outline-none focus:ring-2 focus:ring-primary resize-y"
29
- />
30
- </div>
31
- </template>
@@ -1,65 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, defineAsyncComponent } from "vue"
3
- import type { SectionBlockProps } from "../../types/blocks"
4
- import RLVInput from "../../../input/RLVInput.vue"
5
- import RLVButton from "../../../button/RLVButton.vue"
6
- import { useI18n } from "../utils/editorHelpers"
7
-
8
- const BlockEditRenderer = defineAsyncComponent(() => import("../BlockEditRenderer.vue"))
9
-
10
- const props = defineProps<{ props: SectionBlockProps; containerId?: string | null }>()
11
- const emit = defineEmits<{ "update:props": [value: SectionBlockProps] }>()
12
-
13
- const { t } = useI18n()
14
-
15
- const title = computed({
16
- get: () => props.props.title || "",
17
- set: (val: string) => emit("update:props", { ...props.props, title: val })
18
- })
19
-
20
- const description = computed({
21
- get: () => props.props.description || "",
22
- set: (val: string) => emit("update:props", { ...props.props, description: val })
23
- })
24
-
25
- const level = computed({
26
- get: () => props.props.level || 2,
27
- set: (val: number) => emit("update:props", { ...props.props, level: val as any })
28
- })
29
-
30
- const children = computed({
31
- get: () => props.props.children || [],
32
- set: (val: any[]) => emit("update:props", { ...props.props, children: val })
33
- })
34
-
35
- defineOptions({ name: "SectionBlockEditor" })
36
- </script>
37
-
38
- <template>
39
- <div
40
- class="w-full flex flex-col gap-4 border border-default rounded-xl p-4 bg-neutral-50/50 dark:bg-neutral-900/30"
41
- >
42
- <div class="flex items-center gap-3">
43
- <select
44
- v-model.number="level"
45
- class="bg-white dark:bg-neutral-800 border border-default rounded-lg px-2 py-1 text-xs font-bold focus:outline-none"
46
- >
47
- <option :value="1">H1</option>
48
- <option :value="2">H2</option>
49
- <option :value="3">H3</option>
50
- <option :value="4">H4</option>
51
- </select>
52
- <RLVInput v-model="title" placeholder="Section Title" class="flex-1 font-bold text-lg" />
53
- </div>
54
-
55
- <RLVInput
56
- v-model="description"
57
- placeholder="Section description (optional)..."
58
- class="text-sm text-dimmed"
59
- />
60
-
61
- <div class="pl-4 border-l-2 border-primary-500/30 flex flex-col gap-4 mt-2">
62
- <BlockEditRenderer v-model:blocks="children" :container-id="containerId" />
63
- </div>
64
- </div>
65
- </template>
@@ -1,28 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from "vue"
3
- import { useI18n } from "../../utils/editorHelpers"
4
- import { getLocalizedContent } from "../../utils/page"
5
-
6
- const props = defineProps<{ node: any }>()
7
- const { locale } = useI18n()
8
-
9
- const href = computed(() => props.node?.props?.href || props.node?.href || props.node?.to || "#")
10
- const target = computed(() => props.node?.props?.target || props.node?.target || "_self")
11
- const contentText = computed(() => {
12
- const n = props.node
13
- const val = n?.props?.content ?? n?.content ?? n?.label ?? href.value
14
- return getLocalizedContent(val, locale.value)
15
- })
16
-
17
- defineOptions({ name: "LinkNode" })
18
- </script>
19
-
20
- <template>
21
- <a
22
- :href="href"
23
- :target="target"
24
- class="text-primary underline hover:text-primary-600 transition-colors"
25
- >
26
- {{ contentText }}
27
- </a>
28
- </template>
@@ -1,22 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from "vue"
3
- import { useI18n } from "../../utils/editorHelpers"
4
- import { getLocalizedContent } from "../../utils/page"
5
-
6
- const props = defineProps<{ node: any }>()
7
- const { locale } = useI18n()
8
-
9
- const textContent = computed(() => {
10
- const n = props.node
11
- if (!n) return ""
12
- if (typeof n === "string") return n
13
- const val = n.props?.content ?? n.content ?? n.text ?? n.value
14
- return getLocalizedContent(val, locale.value)
15
- })
16
-
17
- defineOptions({ name: "TextNode" })
18
- </script>
19
-
20
- <template>
21
- <span>{{ textContent }}</span>
22
- </template>
@@ -1,66 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, defineAsyncComponent } from "vue"
3
-
4
- const BlockViewRenderer = defineAsyncComponent(() => import("../BlockViewRenderer.vue"))
5
-
6
- const props = defineProps<{ props: any }>()
7
-
8
- const calloutProps = computed(() => props.props || {})
9
- const calloutChildren = computed(() => {
10
- const p = props.props
11
- if (!p) return []
12
- return p.children || p.blocks || p.slots?.default || []
13
- })
14
-
15
- const variantClasses = computed(() => {
16
- switch (calloutProps.value.variant) {
17
- case "success":
18
- return "bg-green-500/10 border-green-500/30 text-green-700 dark:text-green-300"
19
- case "warning":
20
- return "bg-amber-500/10 border-amber-500/30 text-amber-700 dark:text-amber-300"
21
- case "error":
22
- return "bg-red-500/10 border-red-500/30 text-red-700 dark:text-red-300"
23
- case "commentary":
24
- return "bg-purple-500/10 border-purple-500/30 text-purple-700 dark:text-purple-300"
25
- case "ideation":
26
- return "bg-indigo-500/10 border-indigo-500/30 text-indigo-700 dark:text-indigo-300"
27
- case "source":
28
- return "bg-neutral-500/10 border-neutral-500/30 text-neutral-700 dark:text-neutral-300"
29
- default:
30
- return "bg-blue-500/10 border-blue-500/30 text-blue-700 dark:text-blue-300"
31
- }
32
- })
33
-
34
- const iconName = computed(() => {
35
- switch (calloutProps.value.variant) {
36
- case "success":
37
- return "i-lucide-check-circle"
38
- case "warning":
39
- return "i-lucide-alert-triangle"
40
- case "error":
41
- return "i-lucide-alert-circle"
42
- case "commentary":
43
- return "i-lucide-message-square"
44
- case "ideation":
45
- return "i-lucide-lightbulb"
46
- case "source":
47
- return "i-lucide-file-code"
48
- default:
49
- return "i-lucide-info"
50
- }
51
- })
52
-
53
- defineOptions({ name: "CalloutBlockRenderer" })
54
- </script>
55
-
56
- <template>
57
- <div class="p-4 rounded-xl border flex gap-3 my-4 backdrop-blur-sm" :class="variantClasses">
58
- <span :class="[iconName, 'size-5 shrink-0 mt-0.5']" />
59
- <div class="flex-1 min-w-0">
60
- <BlockViewRenderer
61
- v-if="calloutChildren && calloutChildren.length"
62
- :blocks="calloutChildren"
63
- />
64
- </div>
65
- </div>
66
- </template>
@@ -1,20 +0,0 @@
1
- <script setup lang="ts">
2
- import type { ImageBlockProps } from "../../types/blocks"
3
-
4
- defineProps<{ props: ImageBlockProps }>()
5
- defineOptions({ name: "ImageBlockRenderer" })
6
- </script>
7
-
8
- <template>
9
- <figure class="my-6 flex flex-col items-center">
10
- <img
11
- v-if="props.src"
12
- :src="props.src"
13
- :alt="props.alt || ''"
14
- class="rounded-xl border border-default shadow-md max-w-full h-auto object-cover max-h-[500px]"
15
- />
16
- <figcaption v-if="props.caption" class="text-xs text-dimmed mt-2 text-center italic">
17
- {{ props.caption }}
18
- </figcaption>
19
- </figure>
20
- </template>
@@ -1,21 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from "vue"
3
- import TextRenderer from "../TextRenderer.vue"
4
-
5
- const props = defineProps<{ props: any }>()
6
- const textContent = computed(() => {
7
- const p = props.props
8
- if (!p) return ""
9
- return p.text ?? p.content ?? p.value ?? ""
10
- })
11
-
12
- defineOptions({ name: "ParagraphBlockRenderer" })
13
- </script>
14
-
15
- <template>
16
- <p
17
- class="text-base text-neutral-800 dark:text-neutral-200 leading-relaxed my-2 whitespace-pre-wrap"
18
- >
19
- <TextRenderer :content="textContent" />
20
- </p>
21
- </template>
@@ -1,55 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, defineAsyncComponent } from "vue"
3
- import { useI18n } from "../../utils/editorHelpers"
4
- import { getLocalizedContent } from "../../utils/page"
5
-
6
- const BlockViewRenderer = defineAsyncComponent(() => import("../BlockViewRenderer.vue"))
7
-
8
- const props = defineProps<{ props: any }>()
9
- const { locale } = useI18n()
10
-
11
- const headingTag = computed(() => `h${props.props?.level || 2}`)
12
- const headingClasses = computed(() => {
13
- switch (Number(props.props?.level || 2)) {
14
- case 1:
15
- return "text-3xl font-extrabold tracking-tight mt-8 mb-4 border-b pb-2 text-neutral-900 dark:text-white"
16
- case 2:
17
- return "text-2xl font-bold tracking-tight mt-6 mb-3 text-neutral-900 dark:text-white"
18
- case 3:
19
- return "text-xl font-semibold mt-4 mb-2 text-neutral-900 dark:text-white"
20
- default:
21
- return "text-lg font-medium mt-3 mb-2 text-neutral-900 dark:text-white"
22
- }
23
- })
24
-
25
- const titleText = computed(() => getLocalizedContent(props.props?.title, locale.value))
26
- const descriptionText = computed(() => getLocalizedContent(props.props?.description, locale.value))
27
- const sectionChildren = computed(() => {
28
- const p = props.props
29
- if (!p) return []
30
- return p.children || p.blocks || p.slots?.default || []
31
- })
32
-
33
- defineOptions({ name: "SectionBlockRenderer" })
34
- </script>
35
-
36
- <template>
37
- <div class="my-4">
38
- <component
39
- :is="headingTag"
40
- v-if="titleText"
41
- :class="headingClasses"
42
- :id="typeof titleText === 'string' ? titleText.toLowerCase().replace(/\s+/g, '-') : undefined"
43
- >
44
- {{ titleText }}
45
- </component>
46
-
47
- <p v-if="descriptionText" class="text-sm text-dimmed mb-4 italic">
48
- {{ descriptionText }}
49
- </p>
50
-
51
- <div v-if="sectionChildren && sectionChildren.length" class="flex flex-col gap-2">
52
- <BlockViewRenderer :blocks="sectionChildren" />
53
- </div>
54
- </div>
55
- </template>
@@ -1,3 +0,0 @@
1
- import type { InjectionKey, ComputedRef } from "vue"
2
-
3
- export const SECTION_LEVEL_KEY = Symbol("section-level") as InjectionKey<ComputedRef<number>>
@@ -1,261 +0,0 @@
1
- import { type Ref, computed, ref, shallowRef } from "vue"
2
- import type { Block } from "../types/pages"
3
-
4
- function findBlockLocation(
5
- blocks: Block[],
6
- id: string
7
- ): { parentArray: Block[]; index: number } | null {
8
- for (let i = 0; i < blocks.length; i++) {
9
- const block = blocks[i]
10
- if (!block) continue
11
- if (block.id === id) {
12
- return { parentArray: blocks, index: i }
13
- }
14
- if ("children" in block.props && Array.isArray(block.props.children)) {
15
- const result = findBlockLocation(block.props.children, id)
16
- if (result) return result
17
- }
18
- }
19
- return null
20
- }
21
-
22
- function regenerateIds(block: Block): void {
23
- block.id =
24
- typeof crypto !== "undefined" && typeof crypto.randomUUID === "function"
25
- ? crypto.randomUUID()
26
- : Math.random().toString(36).substring(2)
27
-
28
- if ("children" in block.props && Array.isArray(block.props.children)) {
29
- block.props.children.forEach((child: Block) => regenerateIds(child))
30
- }
31
- }
32
-
33
- function createDefaultBlock(type: Block["type"]): Block {
34
- const id =
35
- typeof crypto !== "undefined" && typeof crypto.randomUUID === "function"
36
- ? crypto.randomUUID()
37
- : Math.random().toString(36).substring(2)
38
- switch (type) {
39
- case "SectionBlock":
40
- return {
41
- id,
42
- type: "SectionBlock",
43
- props: {
44
- level: 2,
45
- title: "New Section",
46
- children: []
47
- }
48
- }
49
- case "ParagraphBlock":
50
- return {
51
- id,
52
- type: "ParagraphBlock",
53
- props: {
54
- text: []
55
- }
56
- }
57
- case "CalloutBlock":
58
- return {
59
- id,
60
- type: "CalloutBlock",
61
- props: {
62
- variant: "info",
63
- children: []
64
- }
65
- }
66
- case "ImageBlock":
67
- return {
68
- id,
69
- type: "ImageBlock",
70
- props: {
71
- src: "https://placehold.co/600x400",
72
- alt: "Placeholder Image"
73
- }
74
- }
75
- default:
76
- return {
77
- id,
78
- type: "ParagraphBlock",
79
- props: { text: [] }
80
- }
81
- }
82
- }
83
-
84
- export function useBlockEditor(
85
- initialBlocks: Ref<Block[]>,
86
- { maxHistorySize = 100, onMutation }: { maxHistorySize?: number; onMutation?: () => void } = {}
87
- ) {
88
- const history = shallowRef<Block[][]>([])
89
- const future = shallowRef<Block[][]>([])
90
- const committedBlocks = ref<Block[]>(JSON.parse(JSON.stringify(initialBlocks.value)))
91
-
92
- const canUndo = computed(() => history.value.length > 0)
93
- const canRedo = computed(() => future.value.length > 0)
94
-
95
- const captureSnapshot = () => {
96
- const snapshot: Block[] = JSON.parse(JSON.stringify(initialBlocks.value))
97
- future.value = []
98
- const newHistory = [...history.value, snapshot]
99
- if (newHistory.length > maxHistorySize) {
100
- newHistory.shift()
101
- }
102
- history.value = newHistory
103
- }
104
-
105
- const executeMutation = (mutationFn: () => void) => {
106
- if (onMutation) {
107
- onMutation()
108
- } else {
109
- captureSnapshot()
110
- }
111
- mutationFn()
112
- }
113
-
114
- const undo = () => {
115
- if (history.value.length === 0) return
116
- const currentState: Block[] = JSON.parse(JSON.stringify(initialBlocks.value))
117
- future.value = [currentState, ...future.value]
118
- const previousState = history.value[history.value.length - 1]
119
- if (previousState) {
120
- initialBlocks.value.splice(0, initialBlocks.value.length, ...previousState)
121
- const newHistory = [...history.value]
122
- newHistory.pop()
123
- history.value = newHistory
124
- }
125
- }
126
-
127
- const redo = () => {
128
- if (future.value.length === 0) return
129
- const currentState: Block[] = JSON.parse(JSON.stringify(initialBlocks.value))
130
- let newHistory = [...history.value, currentState]
131
- if (newHistory.length > maxHistorySize) {
132
- newHistory.shift()
133
- }
134
- history.value = newHistory
135
- const nextState = future.value[0]
136
- if (nextState) {
137
- initialBlocks.value.splice(0, initialBlocks.value.length, ...nextState)
138
- const newFuture = [...future.value]
139
- newFuture.shift()
140
- future.value = newFuture
141
- }
142
- }
143
-
144
- const updateBlockProps = (id: string, newProps: Record<string, any>) => {
145
- executeMutation(() => {
146
- const loc = findBlockLocation(initialBlocks.value, id)
147
- if (!loc) return
148
- const oldBlock = loc.parentArray[loc.index]
149
- if (!oldBlock) return
150
- Object.assign(oldBlock.props, newProps)
151
- })
152
- }
153
-
154
- const removeBlock = (id: string) => {
155
- executeMutation(() => {
156
- const loc = findBlockLocation(initialBlocks.value, id)
157
- if (!loc) return
158
- loc.parentArray.splice(loc.index, 1)
159
- })
160
- }
161
-
162
- const moveBlock = (id: string, direction: -1 | 1) => {
163
- executeMutation(() => {
164
- const loc = findBlockLocation(initialBlocks.value, id)
165
- if (!loc) return
166
- const { parentArray, index } = loc
167
- const newIndex = index + direction
168
- if (newIndex >= 0 && newIndex < parentArray.length) {
169
- const movedBlock = parentArray.splice(index, 1)[0]
170
- if (movedBlock) {
171
- parentArray.splice(newIndex, 0, movedBlock)
172
- }
173
- }
174
- })
175
- }
176
-
177
- const duplicateBlock = (id: string) => {
178
- executeMutation(() => {
179
- const loc = findBlockLocation(initialBlocks.value, id)
180
- if (!loc) return
181
- const original = loc.parentArray[loc.index]
182
- const clone: Block = JSON.parse(JSON.stringify(original))
183
- regenerateIds(clone)
184
- loc.parentArray.splice(loc.index + 1, 0, clone)
185
- })
186
- }
187
-
188
- const insertBlock = (
189
- newBlockType: Block["type"],
190
- targetId: string | null = null,
191
- position: "before" | "after" = "after"
192
- ) => {
193
- executeMutation(() => {
194
- const newBlock = createDefaultBlock(newBlockType)
195
- if (!targetId) {
196
- initialBlocks.value.push(newBlock)
197
- return
198
- }
199
- const loc = findBlockLocation(initialBlocks.value, targetId)
200
- if (!loc) return
201
- const { parentArray, index } = loc
202
- const insertIndex = position === "after" ? index + 1 : index
203
- parentArray.splice(insertIndex, 0, newBlock)
204
- })
205
- }
206
-
207
- const commitChanges = (): Block[] => {
208
- const committedSnapshot: Block[] = JSON.parse(JSON.stringify(initialBlocks.value))
209
- committedBlocks.value = committedSnapshot
210
- return committedSnapshot
211
- }
212
-
213
- const relocateBlock = (
214
- blockId: string,
215
- targetContainerId: string | null,
216
- targetIndex: number
217
- ) => {
218
- executeMutation(() => {
219
- const sourceLoc = findBlockLocation(initialBlocks.value, blockId)
220
- if (!sourceLoc) return
221
- const block = sourceLoc.parentArray[sourceLoc.index]
222
- if (!block) return
223
- sourceLoc.parentArray.splice(sourceLoc.index, 1)
224
-
225
- let targetArray: Block[]
226
- if (targetContainerId === null) {
227
- targetArray = initialBlocks.value
228
- } else {
229
- const targetLoc = findBlockLocation(initialBlocks.value, targetContainerId)
230
- if (!targetLoc) {
231
- sourceLoc.parentArray.splice(sourceLoc.index, 0, block)
232
- return
233
- }
234
- const targetBlock = targetLoc.parentArray[targetLoc.index]
235
- if (!targetBlock || !("children" in targetBlock.props)) {
236
- sourceLoc.parentArray.splice(sourceLoc.index, 0, block)
237
- return
238
- }
239
- targetArray = targetBlock.props.children
240
- }
241
-
242
- const safeIndex = Math.max(0, Math.min(targetIndex, targetArray.length))
243
- targetArray.splice(safeIndex, 0, block)
244
- })
245
- }
246
-
247
- return {
248
- updateBlockProps,
249
- removeBlock,
250
- moveBlock,
251
- duplicateBlock,
252
- insertBlock,
253
- relocateBlock,
254
- undo,
255
- redo,
256
- canUndo,
257
- canRedo,
258
- committedBlocks,
259
- commitChanges
260
- }
261
- }