@rimelight/ui 0.0.33 → 0.0.35

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 (389) hide show
  1. package/README.md +158 -157
  2. package/package.json +100 -105
  3. package/src/components/astro/RLAAccordion.astro +94 -18
  4. package/src/components/astro/RLAAspectRatio.astro +2 -2
  5. package/src/components/astro/RLAAvatar.astro +135 -68
  6. package/src/components/astro/RLABadge.astro +4 -2
  7. package/src/components/astro/RLABanner.astro +138 -23
  8. package/src/components/astro/RLABreadcrumb.astro +13 -0
  9. package/src/components/astro/RLAButton.astro +145 -139
  10. package/src/components/astro/RLACallout.astro +112 -0
  11. package/src/components/astro/RLACard.astro +6 -5
  12. package/src/components/astro/RLACarousel.astro +104 -75
  13. package/src/components/astro/RLAChart.astro +23 -35
  14. package/src/components/astro/RLAChip.astro +11 -5
  15. package/src/components/astro/RLACollapsible.astro +4 -1
  16. package/src/components/astro/RLAColorArea.astro +432 -0
  17. package/src/components/astro/RLAColorField.astro +300 -0
  18. package/src/components/astro/RLAColorSlider.astro +413 -0
  19. package/src/components/astro/RLAConfirm.astro +13 -11
  20. package/src/components/astro/RLACopyMarkdown.astro +78 -0
  21. package/src/components/astro/RLADate.astro +30 -0
  22. package/src/components/astro/RLADrawer.astro +50 -3
  23. package/src/components/astro/RLADropdownMenu.astro +78 -51
  24. package/src/components/astro/RLAFieldGroup.astro +4 -1
  25. package/src/components/astro/RLAFileUpload.astro +114 -100
  26. package/src/components/astro/RLAFooter.astro +2 -1
  27. package/src/components/astro/RLAFormField.astro +10 -6
  28. package/src/components/astro/RLAGrid.astro +31 -39
  29. package/src/components/astro/RLAHead.astro +528 -197
  30. package/src/components/astro/RLAHeader.astro +67 -59
  31. package/src/components/astro/RLAImage.astro +274 -209
  32. package/src/components/astro/RLAInput.astro +14 -9
  33. package/src/components/astro/RLAInputMenu.astro +119 -83
  34. package/src/components/astro/RLAKbd.astro +5 -5
  35. package/src/components/astro/RLALayoutGrid.astro +395 -0
  36. package/src/components/astro/RLALink.astro +44 -23
  37. package/src/components/astro/RLALinkGroup.astro +99 -37
  38. package/src/components/astro/RLALocaleSelector.astro +130 -113
  39. package/src/components/astro/RLALogo.astro +117 -90
  40. package/src/components/astro/RLAMain.astro +8 -3
  41. package/src/components/astro/RLAMarquee.astro +9 -2
  42. package/src/components/astro/RLAModal.astro +48 -18
  43. package/src/components/astro/RLANavigationMenu.astro +381 -137
  44. package/src/components/astro/{RLADocsPackageManagers.astro → RLAPackageManagers.astro} +81 -87
  45. package/src/components/astro/RLAPageSection.astro +4 -2
  46. package/src/components/astro/RLAPagination.astro +2 -4
  47. package/src/components/astro/RLAPopover.astro +4 -3
  48. package/src/components/astro/RLAPost.astro +11 -2
  49. package/src/components/astro/RLAProgress.astro +8 -2
  50. package/src/components/astro/RLAScrollArea.astro +4 -1
  51. package/src/components/astro/RLAScrollToTop.astro +200 -172
  52. package/src/components/astro/RLASearch.astro +282 -0
  53. package/src/components/astro/RLASelect.astro +101 -64
  54. package/src/components/astro/RLASeparator.astro +11 -6
  55. package/src/components/astro/RLAShare.astro +60 -0
  56. package/src/components/astro/RLAShortcuts.astro +429 -0
  57. package/src/components/astro/RLASidebar.astro +158 -212
  58. package/src/components/astro/RLASlideover.astro +99 -4
  59. package/src/components/astro/RLASlider.astro +14 -14
  60. package/src/components/astro/RLASplitter.astro +207 -142
  61. package/src/components/astro/RLASteps.astro +118 -71
  62. package/src/components/astro/RLAStickySurface.astro +9 -2
  63. package/src/components/astro/RLASurround.astro +39 -0
  64. package/src/components/astro/RLATable.astro +4 -1
  65. package/src/components/astro/RLATableOfContents.astro +109 -23
  66. package/src/components/astro/RLATabs.astro +147 -133
  67. package/src/components/astro/RLATextarea.astro +4 -1
  68. package/src/components/astro/RLAThemeSelector.astro +105 -76
  69. package/src/components/astro/RLAToast.astro +35 -21
  70. package/src/components/vue/RLVBanner.vue +230 -0
  71. package/src/components/vue/RLVButton.vue +3 -2
  72. package/src/components/vue/RLVCheckbox.vue +70 -68
  73. package/src/components/vue/RLVFooter.vue +3 -2
  74. package/src/components/vue/RLVForm.vue +44 -44
  75. package/src/components/vue/RLVFormField.vue +58 -58
  76. package/src/components/vue/RLVHeader.vue +3 -2
  77. package/src/components/vue/RLVIcon.vue +4 -2
  78. package/src/components/vue/RLVInput.vue +94 -93
  79. package/src/components/vue/RLVLogo.vue +25 -3
  80. package/src/components/vue/RLVPlaceholder.vue +3 -2
  81. package/src/components/vue/RLVPost.vue +69 -63
  82. package/src/components/vue/RLVPosts.vue +21 -21
  83. package/src/components/vue/RLVProgress.vue +60 -0
  84. package/src/components/vue/RLVScrollToTop.vue +65 -52
  85. package/src/components/vue/RLVSection.vue +14 -13
  86. package/src/components/vue/RLVToast.vue +81 -68
  87. package/src/components/vue/RLVToaster.vue +29 -29
  88. package/src/composables/index.ts +4 -3
  89. package/src/composables/useHeaderStore.ts +14 -14
  90. package/src/composables/useScrollToTop.ts +62 -62
  91. package/src/composables/useShortcuts.ts +11 -0
  92. package/src/composables/useToast.ts +43 -42
  93. package/src/config/index.ts +1 -0
  94. package/src/config/security.ts +227 -0
  95. package/src/config/site.config.ts +1 -0
  96. package/src/docs/components/ApiChangelog.astro +147 -0
  97. package/src/{plugins/starlightDocsApi → docs}/components/ApiEmits.astro +4 -4
  98. package/src/{plugins/starlightDocsApi → docs}/components/ApiProps.astro +4 -4
  99. package/src/{plugins/starlightDocsApi → docs}/components/ApiSlots.astro +4 -4
  100. package/src/docs/components/ApiTheme.astro +100 -0
  101. package/src/docs/extractAll.ts +94 -0
  102. package/src/docs/extractors/extractAstro.ts +69 -0
  103. package/src/docs/extractors/extractTheme.ts +56 -0
  104. package/src/{plugins/starlightDocsApi/extract-vue.ts → docs/extractors/extractVue.ts} +164 -15
  105. package/src/{plugins/starlightDocsApi → docs}/utils.ts +1 -2
  106. package/src/env.d.ts +0 -12
  107. package/src/integrations/ui.ts +215 -199
  108. package/src/middleware/security.ts +145 -29
  109. package/src/presets/defaults.ts +297 -297
  110. package/src/presets/index.ts +508 -637
  111. package/src/styles/index.css +158 -160
  112. package/src/themes/3d-hover.theme.ts +13 -13
  113. package/src/themes/accordion.theme.ts +39 -13
  114. package/src/themes/app.theme.ts +13 -13
  115. package/src/themes/aspect-ratio.theme.ts +1 -1
  116. package/src/themes/audio.theme.ts +13 -13
  117. package/src/themes/avatar-group.theme.ts +1 -1
  118. package/src/themes/avatar.theme.ts +84 -84
  119. package/src/themes/badge.theme.ts +168 -163
  120. package/src/themes/banner.theme.ts +49 -13
  121. package/src/themes/breadcrumb.theme.ts +1 -1
  122. package/src/themes/browser-mockup.theme.ts +13 -13
  123. package/src/themes/button.theme.ts +223 -202
  124. package/src/themes/calendar.theme.ts +13 -13
  125. package/src/themes/{alert.theme.ts → callout.theme.ts} +104 -125
  126. package/src/themes/card.theme.ts +50 -42
  127. package/src/themes/carousel.theme.ts +1 -1
  128. package/src/themes/chart.theme.ts +22 -22
  129. package/src/themes/chat-message.theme.ts +13 -13
  130. package/src/themes/chat-messages.theme.ts +13 -13
  131. package/src/themes/chat-palette.theme.ts +13 -13
  132. package/src/themes/chat-prompt-submit.theme.ts +13 -13
  133. package/src/themes/chat-prompt.theme.ts +13 -13
  134. package/src/themes/chat-reasoning.theme.ts +13 -13
  135. package/src/themes/chat-shimmer.theme.ts +13 -13
  136. package/src/themes/chat-tool.theme.ts +13 -13
  137. package/src/themes/chat.theme.ts +13 -13
  138. package/src/themes/checkbox.theme.ts +49 -50
  139. package/src/themes/chip.theme.ts +73 -74
  140. package/src/themes/color-area.theme.ts +33 -0
  141. package/src/themes/color-field.theme.ts +32 -0
  142. package/src/themes/color-picker.theme.ts +13 -13
  143. package/src/themes/color-slider.theme.ts +34 -0
  144. package/src/themes/command-palette.theme.ts +13 -13
  145. package/src/themes/compare.theme.ts +13 -13
  146. package/src/themes/confirm.theme.ts +48 -48
  147. package/src/themes/container.theme.ts +13 -13
  148. package/src/themes/context-menu.theme.ts +13 -13
  149. package/src/themes/dashboard-group.theme.ts +13 -13
  150. package/src/themes/dashboard-navbar.theme.ts +13 -13
  151. package/src/themes/dashboard-panel.theme.ts +13 -13
  152. package/src/themes/dashboard-resize-handle.theme.ts +13 -13
  153. package/src/themes/dashboard-search-button.theme.ts +13 -13
  154. package/src/themes/dashboard-search.theme.ts +13 -13
  155. package/src/themes/dashboard-sidebar-collapse.theme.ts +13 -13
  156. package/src/themes/dashboard-sidebar-toggle.theme.ts +13 -13
  157. package/src/themes/dashboard-sidebar.theme.ts +13 -13
  158. package/src/themes/dashboard-toolbar.theme.ts +13 -13
  159. package/src/themes/dock.theme.ts +13 -13
  160. package/src/themes/drawer.theme.ts +61 -61
  161. package/src/themes/dropdown-menu.theme.ts +29 -29
  162. package/src/themes/editor.theme.ts +13 -13
  163. package/src/themes/empty.theme.ts +13 -13
  164. package/src/themes/error.theme.ts +13 -13
  165. package/src/themes/field-group.theme.ts +24 -24
  166. package/src/themes/fieldset.theme.ts +13 -13
  167. package/src/themes/floating-action.theme.ts +13 -13
  168. package/src/themes/footer.theme.ts +30 -30
  169. package/src/themes/form.theme.ts +13 -13
  170. package/src/themes/gallery.theme.ts +13 -13
  171. package/src/themes/grid.theme.ts +38 -0
  172. package/src/themes/head.theme.ts +13 -13
  173. package/src/themes/header.theme.ts +46 -46
  174. package/src/themes/hover-card.theme.ts +1 -1
  175. package/src/themes/icon.theme.ts +23 -23
  176. package/src/themes/image.theme.ts +33 -19
  177. package/src/themes/input-date.theme.ts +13 -13
  178. package/src/themes/input-menu.theme.ts +35 -35
  179. package/src/themes/input-number.theme.ts +13 -13
  180. package/src/themes/input-tags.theme.ts +13 -13
  181. package/src/themes/input-time.theme.ts +13 -13
  182. package/src/themes/input.theme.ts +48 -42
  183. package/src/themes/kbd.theme.ts +94 -89
  184. package/src/themes/knob.theme.ts +13 -13
  185. package/src/themes/label.theme.ts +1 -1
  186. package/src/themes/layout-grid.theme.ts +16 -0
  187. package/src/themes/link-group.theme.ts +28 -32
  188. package/src/themes/link.theme.ts +13 -13
  189. package/src/themes/listbox.theme.ts +13 -13
  190. package/src/themes/locale-selector.theme.ts +49 -49
  191. package/src/themes/logo.theme.ts +13 -13
  192. package/src/themes/main.theme.ts +13 -13
  193. package/src/themes/marquee.theme.ts +1 -1
  194. package/src/themes/meter.theme.ts +13 -13
  195. package/src/themes/modal.theme.ts +1 -1
  196. package/src/themes/navigation-menu.theme.ts +44 -27
  197. package/src/themes/page-aside.theme.ts +13 -13
  198. package/src/themes/page-body.theme.ts +13 -13
  199. package/src/themes/page-header.theme.ts +13 -13
  200. package/src/themes/page-section.theme.ts +189 -187
  201. package/src/themes/page.theme.ts +13 -13
  202. package/src/themes/pagination.theme.ts +1 -1
  203. package/src/themes/password.theme.ts +13 -13
  204. package/src/themes/phone-mockup.theme.ts +13 -13
  205. package/src/themes/pin-input.theme.ts +1 -1
  206. package/src/themes/placeholder.theme.ts +15 -15
  207. package/src/themes/popover.theme.ts +1 -1
  208. package/src/themes/post.theme.ts +53 -33
  209. package/src/themes/pricing-plan.theme.ts +13 -13
  210. package/src/themes/pricing-table.theme.ts +13 -13
  211. package/src/themes/progress.theme.ts +37 -38
  212. package/src/themes/prose.theme.ts +13 -13
  213. package/src/themes/qr-code.theme.ts +13 -13
  214. package/src/themes/quote.theme.ts +13 -13
  215. package/src/themes/radio-group.theme.ts +13 -13
  216. package/src/themes/rating.theme.ts +13 -13
  217. package/src/themes/scroll-area.theme.ts +26 -26
  218. package/src/themes/scroll-to-top.theme.ts +51 -52
  219. package/src/themes/search.theme.ts +64 -0
  220. package/src/themes/select.theme.ts +29 -29
  221. package/src/themes/separator.theme.ts +147 -147
  222. package/src/themes/sidebar.theme.ts +38 -38
  223. package/src/themes/skeleton.theme.ts +21 -21
  224. package/src/themes/slideover.theme.ts +5 -5
  225. package/src/themes/slider.theme.ts +35 -36
  226. package/src/themes/speed-dial.theme.ts +13 -13
  227. package/src/themes/spinner.theme.ts +33 -34
  228. package/src/themes/splitter.theme.ts +23 -23
  229. package/src/themes/spoiler.theme.ts +13 -13
  230. package/src/themes/stepper.theme.ts +13 -13
  231. package/src/themes/{megamenu.theme.ts → steps.theme.ts} +13 -13
  232. package/src/themes/sticky-surface.theme.ts +1 -1
  233. package/src/themes/switch.theme.ts +66 -67
  234. package/src/themes/table-of-contents.theme.ts +67 -48
  235. package/src/themes/tabs.theme.ts +52 -52
  236. package/src/themes/textarea.theme.ts +27 -27
  237. package/src/themes/theme-selector.theme.ts +15 -15
  238. package/src/themes/timeline.theme.ts +18 -13
  239. package/src/themes/toast.theme.ts +31 -31
  240. package/src/themes/tooltip.theme.ts +28 -28
  241. package/src/themes/tour.theme.ts +13 -13
  242. package/src/themes/tree.theme.ts +13 -13
  243. package/src/themes/user.theme.ts +13 -13
  244. package/src/themes/video.theme.ts +17 -17
  245. package/src/themes/watermark.theme.ts +13 -13
  246. package/src/themes/window-mockup.theme.ts +13 -13
  247. package/src/types/components/3d-hover.ts +11 -11
  248. package/src/types/components/accordion.ts +35 -2
  249. package/src/types/components/app.ts +11 -11
  250. package/src/types/components/audio.ts +11 -11
  251. package/src/types/components/avatar-group.ts +11 -11
  252. package/src/types/components/avatar.ts +76 -60
  253. package/src/types/components/badge.ts +2 -2
  254. package/src/types/components/banner.ts +53 -11
  255. package/src/types/components/browser-mockup.ts +11 -11
  256. package/src/types/components/button.ts +73 -81
  257. package/src/types/components/calendar.ts +11 -11
  258. package/src/types/components/{alert.ts → callout.ts} +8 -8
  259. package/src/types/components/changelog.ts +11 -11
  260. package/src/types/components/chart.ts +2 -1
  261. package/src/types/components/chat-message.ts +11 -11
  262. package/src/types/components/chat-messages.ts +11 -11
  263. package/src/types/components/chat-palette.ts +11 -11
  264. package/src/types/components/chat-prompt-submit.ts +11 -11
  265. package/src/types/components/chat-prompt.ts +11 -11
  266. package/src/types/components/chat-reasoning.ts +11 -11
  267. package/src/types/components/chat-shimmer.ts +11 -11
  268. package/src/types/components/chat-tool.ts +11 -11
  269. package/src/types/components/chat.ts +11 -11
  270. package/src/types/components/checkbox.ts +2 -2
  271. package/src/types/components/chip.ts +17 -17
  272. package/src/types/components/collapsible.ts +2 -1
  273. package/src/types/components/color-area.ts +19 -0
  274. package/src/types/components/color-field.ts +21 -0
  275. package/src/types/components/color-picker.ts +11 -11
  276. package/src/types/components/color-slider.ts +20 -0
  277. package/src/types/components/command-palette.ts +11 -11
  278. package/src/types/components/compare.ts +11 -11
  279. package/src/types/components/container.ts +17 -17
  280. package/src/types/components/context-menu.ts +11 -11
  281. package/src/types/components/dashboard-group.ts +11 -11
  282. package/src/types/components/dashboard-navbar.ts +11 -11
  283. package/src/types/components/dashboard-panel.ts +11 -11
  284. package/src/types/components/dashboard-resize-handle.ts +11 -11
  285. package/src/types/components/dashboard-search-button.ts +11 -11
  286. package/src/types/components/dashboard-search.ts +11 -11
  287. package/src/types/components/dashboard-sidebar-collapse.ts +11 -11
  288. package/src/types/components/dashboard-sidebar-toggle.ts +11 -11
  289. package/src/types/components/dashboard-sidebar.ts +11 -11
  290. package/src/types/components/dashboard-toolbar.ts +11 -11
  291. package/src/types/components/dock.ts +11 -11
  292. package/src/types/components/dropdown-menu.ts +2 -1
  293. package/src/types/components/editor.ts +11 -11
  294. package/src/types/components/empty.ts +11 -11
  295. package/src/types/components/error.ts +11 -11
  296. package/src/types/components/fieldset.ts +11 -11
  297. package/src/types/components/file-upload.ts +2 -1
  298. package/src/types/components/floating-action.ts +11 -11
  299. package/src/types/components/form.ts +19 -19
  300. package/src/types/components/gallery.ts +11 -11
  301. package/src/types/components/grid.ts +23 -0
  302. package/src/types/components/icon.ts +19 -19
  303. package/src/types/components/image.ts +32 -28
  304. package/src/types/components/input-date.ts +11 -11
  305. package/src/types/components/input-menu.ts +44 -43
  306. package/src/types/components/input-number.ts +11 -11
  307. package/src/types/components/input-pin.ts +36 -35
  308. package/src/types/components/input-tags.ts +11 -11
  309. package/src/types/components/input-time.ts +11 -11
  310. package/src/types/components/input.ts +6 -2
  311. package/src/types/components/knob.ts +11 -11
  312. package/src/types/components/layout-grid.ts +145 -0
  313. package/src/types/components/link-group.ts +47 -23
  314. package/src/types/components/link.ts +19 -0
  315. package/src/types/components/listbox.ts +11 -11
  316. package/src/types/components/locale-selector.ts +33 -33
  317. package/src/types/components/logo.ts +32 -31
  318. package/src/types/components/main.ts +17 -17
  319. package/src/types/components/meter.ts +11 -11
  320. package/src/types/components/modal.ts +39 -39
  321. package/src/types/components/navigation-menu.ts +59 -54
  322. package/src/types/components/page-aside.ts +11 -11
  323. package/src/types/components/page-body.ts +11 -11
  324. package/src/types/components/page-header.ts +11 -11
  325. package/src/types/components/page.ts +11 -11
  326. package/src/types/components/password.ts +11 -11
  327. package/src/types/components/phone-mockup.ts +5 -5
  328. package/src/types/components/pin-input.ts +11 -11
  329. package/src/types/components/popover.ts +23 -23
  330. package/src/types/components/post.ts +47 -35
  331. package/src/types/components/pricing-plan.ts +11 -11
  332. package/src/types/components/pricing-table.ts +11 -11
  333. package/src/types/components/progress.ts +33 -33
  334. package/src/types/components/prose.ts +11 -11
  335. package/src/types/components/qr-code.ts +11 -11
  336. package/src/types/components/radio-group.ts +11 -11
  337. package/src/types/components/rating.ts +11 -11
  338. package/src/types/components/scroll-area.ts +23 -23
  339. package/src/types/components/scroll-to-top.ts +2 -2
  340. package/src/types/components/search.ts +29 -0
  341. package/src/types/components/select.ts +2 -1
  342. package/src/types/components/separator.ts +19 -19
  343. package/src/types/components/sidebar.ts +83 -72
  344. package/src/types/components/slideover.ts +31 -31
  345. package/src/types/components/slider.ts +2 -2
  346. package/src/types/components/speed-dial.ts +11 -11
  347. package/src/types/components/spinner.ts +25 -25
  348. package/src/types/components/splitter.ts +19 -19
  349. package/src/types/components/spoiler.ts +11 -11
  350. package/src/types/components/stepper.ts +11 -11
  351. package/src/types/components/{megamenu.ts → steps.ts} +17 -11
  352. package/src/types/components/sticky-surface.ts +19 -19
  353. package/src/types/components/switch.ts +41 -41
  354. package/src/types/components/table-of-contents.ts +39 -17
  355. package/src/types/components/tabs.ts +2 -1
  356. package/src/types/components/textarea.ts +2 -1
  357. package/src/types/components/theme-selector.ts +15 -15
  358. package/src/types/components/timeline.ts +11 -11
  359. package/src/types/components/toast.ts +6 -1
  360. package/src/types/components/tooltip.ts +23 -23
  361. package/src/types/components/tour.ts +11 -11
  362. package/src/types/components/tree.ts +11 -11
  363. package/src/types/components/user.ts +11 -11
  364. package/src/types/components/watermark.ts +11 -11
  365. package/src/types/components/window-mockup.ts +11 -11
  366. package/src/types/docs.ts +40 -0
  367. package/src/types/index.ts +151 -1
  368. package/src/types/theme.ts +11 -1
  369. package/src/utils/color.ts +165 -0
  370. package/src/utils/docs.ts +365 -189
  371. package/src/utils/headerStack.ts +115 -95
  372. package/src/utils/index.ts +7 -5
  373. package/src/utils/shortcuts.ts +322 -0
  374. package/src/components/TableOfContents.astro +0 -107
  375. package/src/components/astro/RLAAlert.astro +0 -93
  376. package/src/components/astro/RLABlogPost.astro +0 -7
  377. package/src/components/astro/RLABlogPosts.astro +0 -9
  378. package/src/components/astro/RLAChangelog.astro +0 -23
  379. package/src/components/astro/RLAMegamenu.astro +0 -23
  380. package/src/components/astro/RLAPosts.astro +0 -23
  381. package/src/plugins/index.ts +0 -2
  382. package/src/plugins/starlightDocsApi/components/ApiTheme.astro +0 -27
  383. package/src/plugins/starlightDocsApi/index.ts +0 -272
  384. package/src/styles/prism.css +0 -42
  385. package/src/themes/changelog.theme.ts +0 -13
  386. package/src/themes/posts.theme.ts +0 -13
  387. package/src/types/components/index.ts +0 -135
  388. package/src/types/components/posts.ts +0 -11
  389. /package/src/{plugins/starlightDocsApi → docs}/types.ts +0 -0
@@ -4,7 +4,10 @@ import { useUi, resolveClasses } from "../../utils"
4
4
  import type { ChartProps, ChartDataPoint } from "../../types"
5
5
  import chartThemeDefault, { createChartTheme } from "../../themes/chart.theme"
6
6
 
7
- const chartTheme = chartThemeDefault
7
+ import { getUIConfig } from "virtual:rimelight-ui"
8
+
9
+ const uiConfig = getUIConfig()
10
+ const chartTheme = uiConfig.colors ? createChartTheme() : chartThemeDefault
8
11
  const chart = scv(chartTheme)
9
12
 
10
13
  const {
@@ -20,9 +23,6 @@ const {
20
23
 
21
24
  const classes = resolveClasses(chart, {}, useUi("chart", uiProp), className)
22
25
 
23
- // Unique instance ID to prevent CSS collisions between multiple charts
24
- const instanceId = Math.random().toString(36).substring(2, 8)
25
-
26
26
  // Compute derived values on the server so we don't do heavy JS on the client
27
27
  const max = data.length > 0 ? Math.max(...data.map(d => d.value)) : 1
28
28
  const total = data.reduce((sum, d) => sum + d.value, 0)
@@ -40,21 +40,6 @@ const palette = [
40
40
  const getColor = (item: ChartDataPoint, index: number) =>
41
41
  item.color ?? palette[index % palette.length]
42
42
 
43
- // Strip angle brackets from color values to prevent XSS via </style> breakout
44
- const cssColor = (item: ChartDataPoint, index: number) =>
45
- getColor(item, index).replace(/[<>]/g, "")
46
-
47
- // Build per-item CSS rules to avoid inline styles (CSP compliance)
48
- const itemCssRules: string[] = []
49
- data.forEach((item, i) => {
50
- if (type === "bar") {
51
- const pct = max > 0 ? (item.value / max) * 100 : 0
52
- itemCssRules.push(`.rlc-${instanceId}-b-${i}{height:${pct}%;background:${cssColor(item, i)};min-height:4px;width:100%}`)
53
- }
54
- itemCssRules.push(`.rlc-${instanceId}-s-${i}{background:${cssColor(item, i)}}`)
55
- })
56
- const chartItemStyles = itemCssRules.join("")
57
-
58
43
  // Build pie/donut SVG path segments
59
44
  const PIE_R = 80
60
45
  const PIE_CX = 100
@@ -99,17 +84,17 @@ const areaPath = linePoints.length > 0
99
84
  ` L ${linePoints[linePoints.length - 1]!.x} ${LINE_H - LINE_PAD}` +
100
85
  ` L ${linePoints[0]!.x} ${LINE_H - LINE_PAD} Z`
101
86
  : ""
87
+ const id = `chart-${Math.random().toString(36).substring(2, 9)}`
102
88
  ---
103
89
 
104
- <style define:vars={{ chartH: `${height}px`, chartInnerH: `${height - 60}px` }}>
105
- [data-slot="root"] { min-height: var(--chart-h); }
106
- [data-slot="container"] { height: var(--chart-inner-h); gap: 6px; align-items: flex-end; }
107
- .rla-chart-line-wrap { height: var(--chart-inner-h); }
108
- .rla-chart-pie-wrap { height: var(--chart-inner-h); }
109
- </style>
110
- <style set:html={chartItemStyles}></style>
90
+ <style is:inline set:html={`
91
+ .${id} { min-height: ${height}px; }
92
+ .${id} [data-slot="container"] { height: ${height - 60}px; gap: 6px; align-items: flex-end; }
93
+ .${id} .rla-chart-line-wrap { height: ${height - 60}px; }
94
+ .${id} .rla-chart-pie-wrap { height: ${height - 60}px; }
95
+ `} />
111
96
 
112
- <div class={classes.root} data-slot="root" {...rest}>
97
+ <div class:list={[classes.root, id]} data-slot="root" {...rest}>
113
98
  {title && <div class={classes.title} data-slot="title">{title}</div>}
114
99
 
115
100
  {/* Bar Chart */}
@@ -122,10 +107,11 @@ const areaPath = linePoints.length > 0
122
107
  <span class="text-[10px] text-muted-foreground font-mono opacity-0 group-hover:opacity-100 transition-opacity">
123
108
  {item.value}
124
109
  </span>
125
- <div
126
- class={`${classes.bar} rlc-${instanceId}-b-${i}`}
127
- title={`${item.label}: ${item.value}`}
128
- />
110
+ <div class:list={[classes.bar, "h-full w-full overflow-hidden !bg-transparent"]} title={`${item.label}: ${item.value}`}>
111
+ <svg class="h-full w-full overflow-visible" viewBox="0 0 20 100" preserveAspectRatio="none">
112
+ <rect x="0" y={100 - pct} width="20" height={pct} fill={getColor(item, i)} rx="2" />
113
+ </svg>
114
+ </div>
129
115
  <span class={classes.axis}>{item.label}</span>
130
116
  </div>
131
117
  )
@@ -211,9 +197,9 @@ const areaPath = linePoints.length > 0
211
197
  <div class="flex flex-col gap-1.5">
212
198
  {data.map((item, i) => (
213
199
  <div class="flex items-center gap-2 text-xs text-muted-foreground">
214
- <span
215
- class={`size-3 rounded-sm shrink-0 rlc-${instanceId}-s-${i}`}
216
- />
200
+ <svg class="size-3 shrink-0" viewBox="0 0 10 10">
201
+ <rect width="10" height="10" rx="2" fill={getColor(item, i)} />
202
+ </svg>
217
203
  <span>{item.label}</span>
218
204
  <span class="ml-1 font-mono text-foreground">{item.value}</span>
219
205
  </div>
@@ -230,7 +216,9 @@ const areaPath = linePoints.length > 0
230
216
  <div class={classes.legend} data-slot="legend">
231
217
  {data.map((item, i) => (
232
218
  <div class="flex items-center gap-1.5">
233
- <span class={`size-2.5 rounded-full shrink-0 rlc-${instanceId}-s-${i}`} />
219
+ <svg class="size-2.5 shrink-0" viewBox="0 0 10 10">
220
+ <circle cx="5" cy="5" r="5" fill={getColor(item, i)} />
221
+ </svg>
234
222
  <span>{item.label}</span>
235
223
  </div>
236
224
  ))}
@@ -6,7 +6,7 @@ import chipThemeDefault, { createChipTheme } from "../../themes/chip.theme"
6
6
  import { getUIConfig } from "virtual:rimelight-ui"
7
7
 
8
8
  const uiConfig = getUIConfig()
9
- const chipTheme = uiConfig.colors ? createChipTheme() : chipThemeDefault
9
+ const chipTheme = uiConfig.colors ? createChipTheme(uiConfig.colors) : chipThemeDefault
10
10
 
11
11
  const chip = scv(chipTheme)
12
12
 
@@ -22,12 +22,18 @@ const {
22
22
  ui: uiProp,
23
23
  class: className,
24
24
  ...rest
25
- } = Astro.props as ChipProps
25
+ } = Astro.props as ChipProps & {
26
+ color?: string
27
+ size?: "3xs" | "2xs" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl"
28
+ position?: "top-right" | "bottom-right" | "top-left" | "bottom-left"
29
+ inset?: boolean
30
+ standalone?: boolean
31
+ }
26
32
 
27
33
  const classes = resolveClasses(chip, {
28
- color,
29
- size,
30
- position,
34
+ color: color as "neutral",
35
+ size: size as "md",
36
+ position: position as "top-right",
31
37
  inset,
32
38
  standalone,
33
39
  theme
@@ -4,7 +4,10 @@ import { useUi, resolveClasses } from "../../utils"
4
4
  import type { CollapsibleProps } from "../../types"
5
5
  import collapsibleThemeDefault, { createCollapsibleTheme } from "../../themes/collapsible.theme"
6
6
 
7
- const collapsibleTheme = collapsibleThemeDefault
7
+ import { getUIConfig } from "virtual:rimelight-ui"
8
+
9
+ const uiConfig = getUIConfig()
10
+ const collapsibleTheme = uiConfig.colors ? createCollapsibleTheme() : collapsibleThemeDefault
8
11
  const collapsible = scv(collapsibleTheme)
9
12
 
10
13
  const {
@@ -0,0 +1,432 @@
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import colorAreaThemeDefault, { createColorAreaTheme } from "../../themes/color-area.theme"
5
+ import { getUIConfig } from "virtual:rimelight-ui"
6
+
7
+ const uiConfig = getUIConfig()
8
+ const colorAreaTheme = uiConfig.colors ? createColorAreaTheme(uiConfig.colors) : colorAreaThemeDefault
9
+ const colorArea = scv(colorAreaTheme)
10
+
11
+ export interface Props {
12
+ colorSpace?: "hsl" | "rgb" | "hsb"
13
+ defaultValue?: string
14
+ disabled?: boolean
15
+ modelValue?: string
16
+ name?: string
17
+ required?: boolean
18
+ xChannel?: "hue" | "saturation" | "red" | "green" | "blue" | "alpha" | "lightness" | "brightness"
19
+ xName?: string
20
+ yChannel?: "hue" | "saturation" | "red" | "green" | "blue" | "alpha" | "lightness" | "brightness"
21
+ yName?: string
22
+ color?: any
23
+ theme?: any
24
+ ui?: any
25
+ class?: string
26
+ }
27
+
28
+ const {
29
+ colorSpace = "hsl",
30
+ defaultValue = "#ff0000",
31
+ disabled = false,
32
+ modelValue,
33
+ name,
34
+ required,
35
+ xChannel = "saturation",
36
+ xName,
37
+ yChannel = "lightness",
38
+ yName,
39
+ color = "primary",
40
+ theme,
41
+ ui: uiProp,
42
+ class: className,
43
+ ...rest
44
+ } = Astro.props as Props
45
+
46
+ const classes = resolveClasses(colorArea, {
47
+ color,
48
+ theme
49
+ }, useUi("colorArea", uiProp), className)
50
+
51
+ const initialValue = modelValue || defaultValue
52
+ ---
53
+ <rla-color-area
54
+ data-color-space={colorSpace}
55
+ data-value={initialValue}
56
+ data-x-channel={xChannel}
57
+ data-y-channel={yChannel}
58
+ data-disabled={disabled ? "true" : "false"}
59
+ {...rest}
60
+ >
61
+ <div class={classes.root} data-slot="root">
62
+ <div class={classes.area} data-slot="area">
63
+ <div class={classes.thumb} data-slot="thumb" role="slider" aria-label="Color Area Thumb"></div>
64
+ </div>
65
+ {name && <input type="hidden" name={name} value={initialValue} data-main-input />}
66
+ {xName && <input type="hidden" name={xName} data-x-input />}
67
+ {yName && <input type="hidden" name={yName} data-y-input />}
68
+ </div>
69
+ </rla-color-area>
70
+
71
+ <script>
72
+ import {
73
+ hexToRgb,
74
+ rgbToHex,
75
+ rgbToHsl,
76
+ hslToRgb,
77
+ rgbToHsb,
78
+ hsbToRgb,
79
+ getChannelRange,
80
+ clamp
81
+ } from "../../utils/color"
82
+
83
+ if (typeof HTMLElement !== 'undefined') {
84
+ class RLAColorArea extends HTMLElement {
85
+ private cleanup: (() => void) | null = null
86
+ private colorSpace: string = "hsl"
87
+ private xChannel: string = "saturation"
88
+ private yChannel: string = "lightness"
89
+ private value: string = "#ff0000"
90
+
91
+ // Internal channel state to prevent hue loss when dragging to grayscale regions (black/white/gray)
92
+ private hue: number = 0
93
+ private saturation: number = 100
94
+ private lightness: number = 50
95
+ private brightness: number = 100
96
+ private red: number = 255
97
+ private green: number = 0
98
+ private blue: number = 0
99
+
100
+ connectedCallback() {
101
+ this.style.display = 'contents'
102
+ this.colorSpace = this.getAttribute("data-color-space") || "hsl"
103
+ this.xChannel = this.getAttribute("data-x-channel") || "saturation"
104
+ this.yChannel = this.getAttribute("data-y-channel") || "lightness"
105
+ this.value = this.getAttribute("data-value") || "#ff0000"
106
+
107
+ const root = this.querySelector('[data-slot="root"]') as HTMLElement
108
+ const area = this.querySelector('[data-slot="area"]') as HTMLElement
109
+ const thumb = this.querySelector('[data-slot="thumb"]') as HTMLElement
110
+
111
+ if (!area || !thumb) return
112
+
113
+ const updateChannelsFromValue = (hex: string) => {
114
+ const rgb = hexToRgb(hex)
115
+ const hsl = rgbToHsl(rgb[0], rgb[1], rgb[2])
116
+ const hsb = rgbToHsb(rgb[0], rgb[1], rgb[2])
117
+
118
+ const max = Math.max(rgb[0], rgb[1], rgb[2])
119
+ const min = Math.min(rgb[0], rgb[1], rgb[2])
120
+ if (max !== min) {
121
+ this.hue = hsl[0]
122
+ }
123
+ this.saturation = hsl[1]
124
+ this.lightness = hsl[2]
125
+ this.brightness = hsb[2]
126
+ this.red = rgb[0]
127
+ this.green = rgb[1]
128
+ this.blue = rgb[2]
129
+ }
130
+
131
+ updateChannelsFromValue(this.value)
132
+
133
+ const updateUI = () => {
134
+ const disabled = this.getAttribute("data-disabled") === "true"
135
+ if (disabled) {
136
+ root.classList.add("opacity-50", "pointer-events-none")
137
+ } else {
138
+ root.classList.remove("opacity-50", "pointer-events-none")
139
+ }
140
+
141
+ const hue = this.hue
142
+
143
+ // Gradient backgrounds
144
+ if (this.colorSpace === "hsl" && this.xChannel === "saturation" && this.yChannel === "lightness") {
145
+ area.style.background = `
146
+ linear-gradient(to top, #000 0%, transparent 50%, #fff 100%),
147
+ linear-gradient(to right, #808080 0%, transparent 100%),
148
+ hsl(${hue}, 100%, 50%)
149
+ `
150
+ } else if (this.colorSpace === "hsb" && this.xChannel === "saturation" && this.yChannel === "brightness") {
151
+ area.style.background = `
152
+ linear-gradient(to top, #000 0%, transparent 100%),
153
+ linear-gradient(to right, #fff 0%, transparent 100%),
154
+ hsl(${hue}, 100%, 50%)
155
+ `
156
+ } else {
157
+ area.style.background = `hsl(${hue}, 100%, 50%)`
158
+ }
159
+ area.style.backgroundRepeat = "no-repeat"
160
+ area.style.backgroundSize = "100% 100%"
161
+
162
+ // Set thumb background color
163
+ thumb.style.backgroundColor = this.value
164
+
165
+ // Calculate Thumb Position
166
+ const xRange = getChannelRange(this.xChannel)
167
+ const yRange = getChannelRange(this.yChannel)
168
+
169
+ let xVal = 0
170
+ let yVal = 0
171
+
172
+ if (this.colorSpace === "hsl") {
173
+ const indexX = ["hue", "saturation", "lightness"].indexOf(this.xChannel)
174
+ const indexY = ["hue", "saturation", "lightness"].indexOf(this.yChannel)
175
+ const hsl = [this.hue, this.saturation, this.lightness]
176
+ xVal = indexX !== -1 ? hsl[indexX]! : 0
177
+ yVal = indexY !== -1 ? hsl[indexY]! : 0
178
+ } else if (this.colorSpace === "hsb") {
179
+ const indexX = ["hue", "saturation", "brightness"].indexOf(this.xChannel)
180
+ const indexY = ["hue", "saturation", "brightness"].indexOf(this.yChannel)
181
+ const hsb = [this.hue, this.saturation, this.brightness]
182
+ xVal = indexX !== -1 ? hsb[indexX]! : 0
183
+ yVal = indexY !== -1 ? hsb[indexY]! : 0
184
+ } else if (this.colorSpace === "rgb") {
185
+ const indexX = ["red", "green", "blue"].indexOf(this.xChannel)
186
+ const indexY = ["red", "green", "blue"].indexOf(this.yChannel)
187
+ const rgb = [this.red, this.green, this.blue]
188
+ xVal = indexX !== -1 ? rgb[indexX]! : 0
189
+ yVal = indexY !== -1 ? rgb[indexY]! : 0
190
+ }
191
+
192
+ const pctX = ((xVal - xRange.min) / (xRange.max - xRange.min)) * 100
193
+ const pctY = 100 - (((yVal - yRange.min) / (yRange.max - yRange.min)) * 100)
194
+
195
+ thumb.style.left = `${pctX}%`
196
+ thumb.style.top = `${pctY}%`
197
+
198
+ // Update inputs
199
+ const mainInput = this.querySelector("[data-main-input]") as HTMLInputElement
200
+ if (mainInput) mainInput.value = this.value
201
+
202
+ const xInput = this.querySelector("[data-x-input]") as HTMLInputElement
203
+ if (xInput) xInput.value = xVal.toString()
204
+
205
+ const yInput = this.querySelector("[data-y-input]") as HTMLInputElement
206
+ if (yInput) yInput.value = yVal.toString()
207
+ }
208
+
209
+ updateUI()
210
+
211
+ const observer = new MutationObserver((mutations) => {
212
+ mutations.forEach((mutation) => {
213
+ if (mutation.type === "attributes") {
214
+ if (mutation.attributeName === "data-value") {
215
+ const newVal = this.getAttribute("data-value") || "#ff0000"
216
+ if (newVal !== this.value) {
217
+ this.value = newVal
218
+ updateChannelsFromValue(this.value)
219
+ updateUI()
220
+ }
221
+ }
222
+ if (mutation.attributeName === "data-disabled") {
223
+ updateUI()
224
+ }
225
+ }
226
+ })
227
+ })
228
+ observer.observe(this, { attributes: true })
229
+
230
+ let isDragging = false
231
+
232
+ const handlePointer = (e: PointerEvent) => {
233
+ if (this.getAttribute("data-disabled") === "true") return
234
+ const rect = area.getBoundingClientRect()
235
+ const x = clamp((e.clientX - rect.left) / rect.width, 0, 1)
236
+ const y = 1 - clamp((e.clientY - rect.top) / rect.height, 0, 1)
237
+
238
+ const xRange = getChannelRange(this.xChannel)
239
+ const yRange = getChannelRange(this.yChannel)
240
+
241
+ const newX = Math.round(xRange.min + x * (xRange.max - xRange.min))
242
+ const newY = Math.round(yRange.min + y * (yRange.max - yRange.min))
243
+
244
+ let newRgb: [number, number, number] = [this.red, this.green, this.blue]
245
+
246
+ if (this.colorSpace === "hsl") {
247
+ if (this.xChannel === "saturation") this.saturation = newX
248
+ if (this.yChannel === "lightness") this.lightness = newY
249
+ if (this.xChannel === "lightness") this.lightness = newX
250
+ if (this.yChannel === "saturation") this.saturation = newY
251
+ if (this.xChannel === "hue") this.hue = newX
252
+ if (this.yChannel === "hue") this.hue = newY
253
+ newRgb = hslToRgb(this.hue, this.saturation, this.lightness)
254
+ } else if (this.colorSpace === "hsb") {
255
+ if (this.xChannel === "saturation") this.saturation = newX
256
+ if (this.yChannel === "brightness") this.brightness = newY
257
+ if (this.xChannel === "brightness") this.brightness = newX
258
+ if (this.yChannel === "saturation") this.saturation = newY
259
+ if (this.xChannel === "hue") this.hue = newX
260
+ if (this.yChannel === "hue") this.hue = newY
261
+ newRgb = hsbToRgb(this.hue, this.saturation, this.brightness)
262
+ } else if (this.colorSpace === "rgb") {
263
+ if (this.xChannel === "red") this.red = newX
264
+ if (this.yChannel === "green") this.green = newY
265
+ if (this.xChannel === "green") this.green = newX
266
+ if (this.yChannel === "red") this.red = newY
267
+ if (this.xChannel === "blue") this.blue = newX
268
+ if (this.yChannel === "blue") this.blue = newY
269
+ newRgb = [this.red, this.green, this.blue]
270
+ }
271
+
272
+ const newValue = rgbToHex(newRgb[0], newRgb[1], newRgb[2])
273
+ const valueChanged = newValue !== this.value
274
+ if (valueChanged) {
275
+ this.value = newValue
276
+ this.setAttribute("data-value", newValue)
277
+ }
278
+
279
+ updateUI()
280
+
281
+ if (valueChanged) {
282
+ this.dispatchEvent(new CustomEvent("change", { detail: newValue }))
283
+ this.dispatchEvent(new CustomEvent("update:modelValue", { detail: newValue }))
284
+
285
+ const rootId = this.getAttribute("id")
286
+ if (rootId) {
287
+ document.querySelectorAll(`[data-color-link="${rootId}"]`).forEach((el) => {
288
+ el.setAttribute("data-value", newValue)
289
+ })
290
+ }
291
+ }
292
+ }
293
+
294
+ const onPointerDown = (e: PointerEvent) => {
295
+ isDragging = true
296
+ area.setPointerCapture(e.pointerId)
297
+ handlePointer(e)
298
+ }
299
+
300
+ const onPointerMove = (e: PointerEvent) => {
301
+ if (!isDragging) return
302
+ handlePointer(e)
303
+ }
304
+
305
+ const onPointerUp = (e: PointerEvent) => {
306
+ if (!isDragging) return
307
+ isDragging = false
308
+ area.releasePointerCapture(e.pointerId)
309
+ this.dispatchEvent(new CustomEvent("changeEnd", { detail: this.value }))
310
+ }
311
+
312
+ area.addEventListener("pointerdown", onPointerDown)
313
+ area.addEventListener("pointermove", onPointerMove)
314
+ area.addEventListener("pointerup", onPointerUp)
315
+
316
+ const onKeyDown = (e: KeyboardEvent) => {
317
+ if (this.getAttribute("data-disabled") === "true") return
318
+ const isShift = e.shiftKey
319
+ const stepSize = isShift ? 10 : 1
320
+
321
+ const xRange = getChannelRange(this.xChannel)
322
+ const yRange = getChannelRange(this.yChannel)
323
+
324
+ let xVal = 0
325
+ let yVal = 0
326
+
327
+ if (this.colorSpace === "hsl") {
328
+ const indexX = ["hue", "saturation", "lightness"].indexOf(this.xChannel)
329
+ const indexY = ["hue", "saturation", "lightness"].indexOf(this.yChannel)
330
+ const hsl = [this.hue, this.saturation, this.lightness]
331
+ xVal = indexX !== -1 ? hsl[indexX]! : 0
332
+ yVal = indexY !== -1 ? hsl[indexY]! : 0
333
+ } else if (this.colorSpace === "hsb") {
334
+ const indexX = ["hue", "saturation", "brightness"].indexOf(this.xChannel)
335
+ const indexY = ["hue", "saturation", "brightness"].indexOf(this.yChannel)
336
+ const hsb = [this.hue, this.saturation, this.brightness]
337
+ xVal = indexX !== -1 ? hsb[indexX]! : 0
338
+ yVal = indexY !== -1 ? hsb[indexY]! : 0
339
+ } else if (this.colorSpace === "rgb") {
340
+ const indexX = ["red", "green", "blue"].indexOf(this.xChannel)
341
+ const indexY = ["red", "green", "blue"].indexOf(this.yChannel)
342
+ const rgb = [this.red, this.green, this.blue]
343
+ xVal = indexX !== -1 ? rgb[indexX]! : 0
344
+ yVal = indexY !== -1 ? rgb[indexY]! : 0
345
+ }
346
+
347
+ let handled = false
348
+ if (e.key === "ArrowLeft") {
349
+ xVal = clamp(xVal - stepSize, xRange.min, xRange.max)
350
+ handled = true
351
+ } else if (e.key === "ArrowRight") {
352
+ xVal = clamp(xVal + stepSize, xRange.min, xRange.max)
353
+ handled = true
354
+ } else if (e.key === "ArrowUp") {
355
+ yVal = clamp(yVal + stepSize, yRange.min, yRange.max)
356
+ handled = true
357
+ } else if (e.key === "ArrowDown") {
358
+ yVal = clamp(yVal - stepSize, yRange.min, yRange.max)
359
+ handled = true
360
+ } else if (e.key === "Home") {
361
+ xVal = xRange.min
362
+ handled = true
363
+ } else if (e.key === "End") {
364
+ xVal = xRange.max
365
+ handled = true
366
+ }
367
+
368
+ if (handled) {
369
+ e.preventDefault()
370
+ let newRgb: [number, number, number] = [this.red, this.green, this.blue]
371
+
372
+ if (this.colorSpace === "hsl") {
373
+ if (this.xChannel === "saturation") this.saturation = xVal
374
+ if (this.yChannel === "lightness") this.lightness = yVal
375
+ if (this.xChannel === "lightness") this.lightness = xVal
376
+ if (this.yChannel === "saturation") this.saturation = yVal
377
+ if (this.xChannel === "hue") this.hue = xVal
378
+ if (this.yChannel === "hue") this.hue = yVal
379
+ newRgb = hslToRgb(this.hue, this.saturation, this.lightness)
380
+ } else if (this.colorSpace === "hsb") {
381
+ if (this.xChannel === "saturation") this.saturation = xVal
382
+ if (this.yChannel === "brightness") this.brightness = yVal
383
+ if (this.xChannel === "brightness") this.brightness = xVal
384
+ if (this.yChannel === "saturation") this.saturation = yVal
385
+ if (this.xChannel === "hue") this.hue = xVal
386
+ if (this.yChannel === "hue") this.hue = yVal
387
+ newRgb = hsbToRgb(this.hue, this.saturation, this.brightness)
388
+ } else if (this.colorSpace === "rgb") {
389
+ if (this.xChannel === "red") this.red = xVal
390
+ if (this.yChannel === "green") this.green = yVal
391
+ if (this.xChannel === "green") this.green = xVal
392
+ if (this.yChannel === "red") this.red = yVal
393
+ if (this.xChannel === "blue") this.blue = xVal
394
+ if (this.yChannel === "blue") this.blue = yVal
395
+ newRgb = [this.red, this.green, this.blue]
396
+ }
397
+
398
+ const newValue = rgbToHex(newRgb[0], newRgb[1], newRgb[2])
399
+ if (newValue !== this.value) {
400
+ this.value = newValue
401
+ this.setAttribute("data-value", newValue)
402
+ updateUI()
403
+ this.dispatchEvent(new CustomEvent("change", { detail: newValue }))
404
+ }
405
+ }
406
+ }
407
+
408
+ thumb.setAttribute("tabindex", "0")
409
+ thumb.addEventListener("keydown", onKeyDown)
410
+
411
+ this.cleanup = () => {
412
+ area.removeEventListener("pointerdown", onPointerDown)
413
+ area.removeEventListener("pointermove", onPointerMove)
414
+ area.removeEventListener("pointerup", onPointerUp)
415
+ thumb.removeEventListener("keydown", onKeyDown)
416
+ observer.disconnect()
417
+ }
418
+ }
419
+
420
+ disconnectedCallback() {
421
+ if (this.cleanup) {
422
+ this.cleanup()
423
+ this.cleanup = null
424
+ }
425
+ }
426
+ }
427
+
428
+ if (!customElements.get("rla-color-area")) {
429
+ customElements.define("rla-color-area", RLAColorArea)
430
+ }
431
+ }
432
+ </script>