@youcan/celeste 0.9.3 → 0.10.0

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 (534) hide show
  1. package/dist/celeste.css +1030 -634
  2. package/dist/cjs/bar-chart.cjs +2 -0
  3. package/dist/cjs/chart-card.cjs +2 -0
  4. package/dist/cjs/chart-legend.cjs +2 -0
  5. package/dist/cjs/chart-plot.cjs +2 -0
  6. package/dist/cjs/chart-tooltip.cjs +25 -0
  7. package/dist/cjs/chart.cjs +38 -0
  8. package/dist/cjs/chunks/BubbleSelect.cjs +5 -6
  9. package/dist/cjs/chunks/CollapsibleRoot.cjs +3 -4
  10. package/dist/cjs/chunks/Collection.cjs +3 -4
  11. package/dist/cjs/chunks/ComboboxContent.cjs +7 -7
  12. package/dist/cjs/chunks/ComboboxGroup.cjs +4 -5
  13. package/dist/cjs/chunks/ComboboxInput.cjs +3 -4
  14. package/dist/cjs/chunks/ComboboxItem.cjs +7 -7
  15. package/dist/cjs/chunks/ComboboxLabel.cjs +1 -2
  16. package/dist/cjs/chunks/ComboboxRoot.cjs +17 -14
  17. package/dist/cjs/chunks/ComboboxSeparator.cjs +1 -2
  18. package/dist/cjs/chunks/ConfigProvider.cjs +2 -2
  19. package/dist/cjs/chunks/DialogClose.cjs +1 -2
  20. package/dist/cjs/chunks/DialogDescription.cjs +1 -2
  21. package/dist/cjs/chunks/DialogPortal.cjs +10 -10
  22. package/dist/cjs/chunks/DialogRoot.cjs +3 -4
  23. package/dist/cjs/chunks/DialogTitle.cjs +1 -2
  24. package/dist/cjs/chunks/DialogTrigger.cjs +1 -2
  25. package/dist/cjs/chunks/DismissableLayer.cjs +5 -5
  26. package/dist/cjs/chunks/DropdownMenuPortal.cjs +2 -3
  27. package/dist/cjs/chunks/DropdownMenuRoot.cjs +3 -4
  28. package/dist/cjs/chunks/FocusScope.cjs +7 -7
  29. package/dist/cjs/chunks/Label.cjs +1 -2
  30. package/dist/cjs/chunks/MenuAnchor.cjs +1 -2
  31. package/dist/cjs/chunks/MenuContentImpl.cjs +4 -4
  32. package/dist/cjs/chunks/MenuGroup.cjs +2 -3
  33. package/dist/cjs/chunks/MenuItemImpl.cjs +1 -2
  34. package/dist/cjs/chunks/MenuRoot.cjs +8 -8
  35. package/dist/cjs/chunks/MenuSub.cjs +3 -4
  36. package/dist/cjs/chunks/PaginationRoot.cjs +3 -4
  37. package/dist/cjs/chunks/PinInputRoot.cjs +3 -4
  38. package/dist/cjs/chunks/PopoverRoot.cjs +3 -4
  39. package/dist/cjs/chunks/PopperAnchor.cjs +1 -2
  40. package/dist/cjs/chunks/PopperArrow.cjs +2 -3
  41. package/dist/cjs/chunks/PopperContent.cjs +263 -298
  42. package/dist/cjs/chunks/PopperRoot.cjs +2 -3
  43. package/dist/cjs/chunks/Presence.cjs +7 -7
  44. package/dist/cjs/chunks/Primitive.cjs +5 -6
  45. package/dist/cjs/chunks/ProgressIndicator.cjs +4 -5
  46. package/dist/cjs/chunks/RadioGroupRoot.cjs +3 -4
  47. package/dist/cjs/chunks/RovingFocusGroup.cjs +6 -6
  48. package/dist/cjs/chunks/RovingFocusItem.cjs +1 -2
  49. package/dist/cjs/chunks/SelectGroup.cjs +2 -3
  50. package/dist/cjs/chunks/SelectItemAlignedPosition.cjs +9 -9
  51. package/dist/cjs/chunks/TabsRoot.cjs +4 -5
  52. package/dist/cjs/chunks/Teleport.cjs +2 -3
  53. package/dist/cjs/chunks/ToggleGroupRoot.cjs +4 -5
  54. package/dist/cjs/chunks/TooltipProvider.cjs +2 -3
  55. package/dist/cjs/chunks/TooltipRoot.cjs +5 -5
  56. package/dist/cjs/chunks/VisuallyHidden.cjs +1 -2
  57. package/dist/cjs/chunks/VisuallyHiddenInput.cjs +4 -4
  58. package/dist/cjs/chunks/alert.cjs +17 -12
  59. package/dist/cjs/chunks/alpha-slider.cjs +1 -4
  60. package/dist/cjs/chunks/badge.cjs +18 -13
  61. package/dist/cjs/chunks/bar-chart.cjs +10322 -0
  62. package/dist/cjs/chunks/button.cjs +12 -7
  63. package/dist/cjs/chunks/calendar.cjs +39 -33
  64. package/dist/cjs/chunks/chart-card.cjs +69 -0
  65. package/dist/cjs/chunks/chart-legend.cjs +88 -0
  66. package/dist/cjs/chunks/chart-plot.cjs +92 -0
  67. package/dist/cjs/chunks/checkbox-card.cjs +15 -10
  68. package/dist/cjs/chunks/checkbox-label.cjs +11 -6
  69. package/dist/cjs/chunks/checkbox.cjs +18 -12
  70. package/dist/cjs/chunks/clamp.cjs +1 -1
  71. package/dist/cjs/chunks/collapsible-content.cjs +9 -4
  72. package/dist/cjs/chunks/collapsible-trigger.cjs +1 -2
  73. package/dist/cjs/chunks/collapsible.cjs +0 -1
  74. package/dist/cjs/chunks/color-area.cjs +3 -4
  75. package/dist/cjs/chunks/color-picker.cjs +69 -42
  76. package/dist/cjs/chunks/color-swatch.cjs +4 -5
  77. package/dist/cjs/chunks/combobox-anchor.cjs +11 -5
  78. package/dist/cjs/chunks/combobox-empty.cjs +10 -5
  79. package/dist/cjs/chunks/combobox-group.cjs +11 -6
  80. package/dist/cjs/chunks/combobox-input.cjs +11 -6
  81. package/dist/cjs/chunks/combobox-item.cjs +23 -17
  82. package/dist/cjs/chunks/combobox-list.cjs +14 -8
  83. package/dist/cjs/chunks/combobox-root.cjs +2 -3
  84. package/dist/cjs/chunks/combobox-separator.cjs +9 -4
  85. package/dist/cjs/chunks/combobox-trigger.cjs +14 -8
  86. package/dist/cjs/chunks/combobox.cjs +14 -14
  87. package/dist/cjs/chunks/compact-button.cjs +13 -8
  88. package/dist/cjs/chunks/components.cjs +20 -4
  89. package/dist/cjs/chunks/content-divider.cjs +14 -9
  90. package/dist/cjs/chunks/counter-input.cjs +145 -111
  91. package/dist/cjs/chunks/createContext.cjs +1 -2
  92. package/dist/cjs/chunks/date-picker.cjs +14 -9
  93. package/dist/cjs/chunks/digit-input-group.cjs +12 -6
  94. package/dist/cjs/chunks/digit-input-slot.cjs +13 -7
  95. package/dist/cjs/chunks/digit-input.cjs +13 -7
  96. package/dist/cjs/chunks/dist.cjs +120 -230
  97. package/dist/cjs/chunks/dist2.cjs +459 -15492
  98. package/dist/cjs/chunks/dist3.cjs +16177 -0
  99. package/dist/cjs/chunks/dropdown-menu-content.cjs +15 -9
  100. package/dist/cjs/chunks/dropdown-menu-group.cjs +3 -4
  101. package/dist/cjs/chunks/dropdown-menu-item.cjs +13 -7
  102. package/dist/cjs/chunks/dropdown-menu-label.cjs +13 -7
  103. package/dist/cjs/chunks/dropdown-menu-separator.cjs +11 -6
  104. package/dist/cjs/chunks/dropdown-menu-sub-content.cjs +13 -7
  105. package/dist/cjs/chunks/dropdown-menu-sub-trigger.cjs +13 -7
  106. package/dist/cjs/chunks/dropdown-menu-sub.cjs +2 -3
  107. package/dist/cjs/chunks/dropdown-menu-trigger.cjs +3 -4
  108. package/dist/cjs/chunks/dropdown-menu.cjs +11 -5
  109. package/dist/cjs/chunks/extra-settings.cjs +3 -7
  110. package/dist/cjs/chunks/fancy-button.cjs +12 -7
  111. package/dist/cjs/chunks/file-upload-area.cjs +24 -17
  112. package/dist/cjs/chunks/getActiveElement.cjs +1 -1
  113. package/dist/cjs/chunks/handleAndDispatchCustomEvent.cjs +1 -1
  114. package/dist/cjs/chunks/hint-text.cjs +13 -8
  115. package/dist/cjs/chunks/hue-slider.cjs +3 -6
  116. package/dist/cjs/chunks/isValueEqualOrExist.cjs +1 -1
  117. package/dist/cjs/chunks/label2.cjs +15 -10
  118. package/dist/cjs/chunks/link-bubble.cjs +12 -15
  119. package/dist/cjs/chunks/link-button.cjs +14 -9
  120. package/dist/cjs/chunks/menus.cjs +236 -42
  121. package/dist/cjs/chunks/modal-body.cjs +9 -4
  122. package/dist/cjs/chunks/modal-close.cjs +0 -1
  123. package/dist/cjs/chunks/modal-content.cjs +18 -6
  124. package/dist/cjs/chunks/modal-footer.cjs +9 -4
  125. package/dist/cjs/chunks/modal-header.cjs +18 -13
  126. package/dist/cjs/chunks/modal-trigger.cjs +0 -1
  127. package/dist/cjs/chunks/modal.cjs +0 -1
  128. package/dist/cjs/chunks/nullish.cjs +1 -1
  129. package/dist/cjs/chunks/ohash.D__AXeF1.cjs +1 -1
  130. package/dist/cjs/chunks/pagination-content.cjs +14 -9
  131. package/dist/cjs/chunks/pagination-ellipsis.cjs +12 -7
  132. package/dist/cjs/chunks/pagination-first.cjs +11 -5
  133. package/dist/cjs/chunks/pagination-item.cjs +10 -5
  134. package/dist/cjs/chunks/pagination-last.cjs +11 -5
  135. package/dist/cjs/chunks/pagination-next.cjs +11 -5
  136. package/dist/cjs/chunks/pagination-previous.cjs +11 -5
  137. package/dist/cjs/chunks/pagination.cjs +12 -6
  138. package/dist/cjs/chunks/popover-content.cjs +27 -21
  139. package/dist/cjs/chunks/popover-trigger.cjs +3 -4
  140. package/dist/cjs/chunks/popover.cjs +0 -1
  141. package/dist/cjs/chunks/progress-bar.cjs +14 -9
  142. package/dist/cjs/chunks/progress-circle.cjs +10 -5
  143. package/dist/cjs/chunks/radio-group-card.cjs +15 -10
  144. package/dist/cjs/chunks/radio-group-item.cjs +15 -9
  145. package/dist/cjs/chunks/radio-group-label.cjs +11 -6
  146. package/dist/cjs/chunks/radio-group.cjs +9 -3
  147. package/dist/cjs/chunks/range-calendar.cjs +56 -47
  148. package/dist/cjs/chunks/range-picker.cjs +19 -14
  149. package/dist/cjs/chunks/rich-editor.cjs +1130 -262
  150. package/dist/cjs/chunks/{chunk.cjs → rolldown-runtime.cjs} +8 -1
  151. package/dist/cjs/chunks/scroll-area.cjs +13 -8
  152. package/dist/cjs/chunks/scroll-bar.cjs +43 -29
  153. package/dist/cjs/chunks/segmented-control-item.cjs +12 -7
  154. package/dist/cjs/chunks/segmented-control.cjs +11 -5
  155. package/dist/cjs/chunks/select-content.cjs +16 -10
  156. package/dist/cjs/chunks/select-group.cjs +0 -1
  157. package/dist/cjs/chunks/select-icon.cjs +9 -4
  158. package/dist/cjs/chunks/select-item.cjs +17 -11
  159. package/dist/cjs/chunks/select-label.cjs +10 -5
  160. package/dist/cjs/chunks/select-separator.cjs +10 -5
  161. package/dist/cjs/chunks/select-trigger.cjs +12 -7
  162. package/dist/cjs/chunks/select-value.cjs +10 -5
  163. package/dist/cjs/chunks/select.cjs +9 -3
  164. package/dist/cjs/chunks/sheet-close.cjs +9 -4
  165. package/dist/cjs/chunks/sheet-content.cjs +13 -7
  166. package/dist/cjs/chunks/sheet-description.cjs +11 -6
  167. package/dist/cjs/chunks/sheet-footer.cjs +9 -4
  168. package/dist/cjs/chunks/sheet-header.cjs +9 -4
  169. package/dist/cjs/chunks/sheet-title.cjs +11 -6
  170. package/dist/cjs/chunks/sheet-trigger.cjs +0 -1
  171. package/dist/cjs/chunks/sheet.cjs +0 -1
  172. package/dist/cjs/chunks/sidebar-content.cjs +7 -2
  173. package/dist/cjs/chunks/sidebar-element.cjs +8 -3
  174. package/dist/cjs/chunks/sidebar-footer.cjs +7 -2
  175. package/dist/cjs/chunks/sidebar-group-content.cjs +9 -4
  176. package/dist/cjs/chunks/sidebar-group-label.cjs +9 -4
  177. package/dist/cjs/chunks/sidebar-group.cjs +7 -2
  178. package/dist/cjs/chunks/sidebar-header.cjs +7 -2
  179. package/dist/cjs/chunks/sidebar-menu-action.cjs +10 -5
  180. package/dist/cjs/chunks/sidebar-menu-badge.cjs +11 -6
  181. package/dist/cjs/chunks/sidebar-menu-button.cjs +11 -6
  182. package/dist/cjs/chunks/sidebar-menu-item.cjs +7 -2
  183. package/dist/cjs/chunks/sidebar-menu-sub-button.cjs +12 -7
  184. package/dist/cjs/chunks/sidebar-menu-sub-item.cjs +7 -2
  185. package/dist/cjs/chunks/sidebar-menu-sub.cjs +7 -2
  186. package/dist/cjs/chunks/sidebar-menu.cjs +7 -2
  187. package/dist/cjs/chunks/sidebar-provider.cjs +14 -8
  188. package/dist/cjs/chunks/sidebar-trigger.cjs +10 -5
  189. package/dist/cjs/chunks/sidebar.cjs +11 -6
  190. package/dist/cjs/chunks/slider.cjs +38 -24
  191. package/dist/cjs/chunks/social-button.cjs +5 -6
  192. package/dist/cjs/chunks/sonner-alert.cjs +2 -3
  193. package/dist/cjs/chunks/sonner.cjs +4 -4
  194. package/dist/cjs/chunks/status-badge.cjs +13 -8
  195. package/dist/cjs/chunks/switch.cjs +13 -7
  196. package/dist/cjs/chunks/tab-menu-content.cjs +10 -5
  197. package/dist/cjs/chunks/tab-menu-item.cjs +12 -6
  198. package/dist/cjs/chunks/tab-menu-list.cjs +10 -5
  199. package/dist/cjs/chunks/tab-menu.cjs +2 -3
  200. package/dist/cjs/chunks/table-body.cjs +9 -4
  201. package/dist/cjs/chunks/table-caption.cjs +9 -4
  202. package/dist/cjs/chunks/table-cell.cjs +9 -4
  203. package/dist/cjs/chunks/table-footer.cjs +9 -4
  204. package/dist/cjs/chunks/table-head.cjs +9 -4
  205. package/dist/cjs/chunks/table-header.cjs +7 -2
  206. package/dist/cjs/chunks/table-row.cjs +9 -4
  207. package/dist/cjs/chunks/table.cjs +9 -4
  208. package/dist/cjs/chunks/table2.cjs +9 -4
  209. package/dist/cjs/chunks/tag.cjs +16 -11
  210. package/dist/cjs/chunks/text-input-affix.cjs +9 -4
  211. package/dist/cjs/chunks/text-input-button.cjs +9 -4
  212. package/dist/cjs/chunks/text-input.cjs +10 -10
  213. package/dist/cjs/chunks/textarea.cjs +15 -10
  214. package/dist/cjs/chunks/tooltip-content.cjs +38 -32
  215. package/dist/cjs/chunks/tooltip-provider.cjs +0 -1
  216. package/dist/cjs/chunks/tooltip-root.cjs +2 -2
  217. package/dist/cjs/chunks/tooltip-trigger.cjs +1 -2
  218. package/dist/cjs/chunks/tooltip.cjs +17 -11
  219. package/dist/cjs/chunks/use-color-model.cjs +7 -12
  220. package/dist/cjs/chunks/useArrowNavigation.cjs +1 -1
  221. package/dist/cjs/chunks/useCalendar.cjs +669 -598
  222. package/dist/cjs/chunks/useComposing.cjs +1 -2
  223. package/dist/cjs/chunks/useDirection.cjs +1 -2
  224. package/dist/cjs/chunks/useEmitAsProps.cjs +1 -2
  225. package/dist/cjs/chunks/useFocusGuards.cjs +1 -2
  226. package/dist/cjs/chunks/useFormControl.cjs +2 -3
  227. package/dist/cjs/chunks/useForwardExpose.cjs +2 -3
  228. package/dist/cjs/chunks/useForwardProps.cjs +1 -2
  229. package/dist/cjs/chunks/useForwardPropsEmits.cjs +1 -2
  230. package/dist/cjs/chunks/useForwardScopeId.cjs +1 -2
  231. package/dist/cjs/chunks/useHideOthers.cjs +4 -5
  232. package/dist/cjs/chunks/useId.cjs +3 -3
  233. package/dist/cjs/chunks/useKbd.cjs +1 -1
  234. package/dist/cjs/chunks/useLocale.cjs +1 -2
  235. package/dist/cjs/chunks/useNonce.cjs +1 -2
  236. package/dist/cjs/chunks/usePrimitiveElement.cjs +2 -3
  237. package/dist/cjs/chunks/useSize.cjs +2 -3
  238. package/dist/cjs/chunks/useTypeahead.cjs +1 -1
  239. package/dist/cjs/chunks/utils.cjs +1 -1
  240. package/dist/cjs/chunks/utils2.cjs +1 -1
  241. package/dist/cjs/chunks/utils3.cjs +1 -1
  242. package/dist/cjs/color.cjs +1 -3
  243. package/dist/cjs/command-group.cjs +11 -6
  244. package/dist/cjs/command-input.cjs +12 -6
  245. package/dist/cjs/command-item.cjs +10 -4
  246. package/dist/cjs/command-list.cjs +10 -4
  247. package/dist/cjs/command-root.cjs +10 -4
  248. package/dist/cjs/command-separator.cjs +9 -4
  249. package/dist/cjs/config.cjs +0 -1
  250. package/dist/cjs/index.cjs +21 -1
  251. package/dist/cjs/use-chart-motion.cjs +17 -0
  252. package/dist/cjs/use-delegated-props.cjs +0 -1
  253. package/dist/cjs/use-locale.cjs +8 -0
  254. package/dist/cjs/use-sidebar.cjs +1 -1
  255. package/dist/cjs/use-user-select.cjs +0 -1
  256. package/dist/components/chart/bar-chart.d.ts +39 -0
  257. package/dist/components/chart/chart-card.d.ts +26 -0
  258. package/dist/components/chart/chart-legend.d.ts +32 -0
  259. package/dist/components/chart/chart-plot.d.ts +35 -0
  260. package/dist/components/chart/chart-tooltip.d.ts +11 -0
  261. package/dist/components/chart/index.d.ts +9 -0
  262. package/dist/components/color-picker/hue-slider.d.ts +1 -4
  263. package/dist/components/digit-input/digit-input.d.ts +1 -1
  264. package/dist/components/index.d.ts +1 -0
  265. package/dist/components/popover/popover-content.d.ts +1 -1
  266. package/dist/components/progress/progress-bar.d.ts +1 -1
  267. package/dist/components/text-input/text-input.d.ts +1 -0
  268. package/dist/composables/index.d.ts +2 -0
  269. package/dist/composables/use-chart-motion.d.ts +7 -0
  270. package/dist/composables/use-locale.d.ts +2 -0
  271. package/dist/es/bar-chart.js +2 -0
  272. package/dist/es/chart-card.js +2 -0
  273. package/dist/es/chart-legend.js +2 -0
  274. package/dist/es/chart-plot.js +2 -0
  275. package/dist/es/chart-tooltip.js +24 -0
  276. package/dist/es/chart.js +33 -0
  277. package/dist/es/chunks/BubbleSelect.js +5 -5
  278. package/dist/es/chunks/CollapsibleRoot.js +3 -3
  279. package/dist/es/chunks/Collection.js +3 -3
  280. package/dist/es/chunks/ComboboxContent.js +9 -8
  281. package/dist/es/chunks/ComboboxGroup.js +4 -4
  282. package/dist/es/chunks/ComboboxInput.js +3 -3
  283. package/dist/es/chunks/ComboboxItem.js +7 -6
  284. package/dist/es/chunks/ComboboxLabel.js +1 -1
  285. package/dist/es/chunks/ComboboxRoot.js +15 -11
  286. package/dist/es/chunks/ComboboxSeparator.js +1 -1
  287. package/dist/es/chunks/ConfigProvider.js +2 -2
  288. package/dist/es/chunks/DialogClose.js +1 -1
  289. package/dist/es/chunks/DialogDescription.js +1 -1
  290. package/dist/es/chunks/DialogPortal.js +10 -9
  291. package/dist/es/chunks/DialogRoot.js +3 -3
  292. package/dist/es/chunks/DialogTitle.js +1 -1
  293. package/dist/es/chunks/DialogTrigger.js +1 -1
  294. package/dist/es/chunks/DismissableLayer.js +5 -4
  295. package/dist/es/chunks/DropdownMenuPortal.js +2 -2
  296. package/dist/es/chunks/DropdownMenuRoot.js +3 -3
  297. package/dist/es/chunks/FocusScope.js +7 -6
  298. package/dist/es/chunks/Label.js +1 -1
  299. package/dist/es/chunks/MenuAnchor.js +1 -1
  300. package/dist/es/chunks/MenuContentImpl.js +5 -4
  301. package/dist/es/chunks/MenuGroup.js +2 -2
  302. package/dist/es/chunks/MenuItemImpl.js +1 -1
  303. package/dist/es/chunks/MenuRoot.js +6 -5
  304. package/dist/es/chunks/MenuSub.js +3 -3
  305. package/dist/es/chunks/PaginationRoot.js +3 -3
  306. package/dist/es/chunks/PinInputRoot.js +3 -3
  307. package/dist/es/chunks/PopoverRoot.js +3 -3
  308. package/dist/es/chunks/PopperAnchor.js +1 -1
  309. package/dist/es/chunks/PopperArrow.js +3 -3
  310. package/dist/es/chunks/PopperContent.js +261 -321
  311. package/dist/es/chunks/PopperRoot.js +2 -2
  312. package/dist/es/chunks/Presence.js +6 -5
  313. package/dist/es/chunks/Primitive.js +5 -5
  314. package/dist/es/chunks/ProgressIndicator.js +4 -4
  315. package/dist/es/chunks/RadioGroupRoot.js +3 -3
  316. package/dist/es/chunks/RovingFocusGroup.js +6 -5
  317. package/dist/es/chunks/RovingFocusItem.js +1 -1
  318. package/dist/es/chunks/SelectGroup.js +2 -2
  319. package/dist/es/chunks/SelectItemAlignedPosition.js +10 -9
  320. package/dist/es/chunks/TabsRoot.js +4 -4
  321. package/dist/es/chunks/Teleport.js +2 -2
  322. package/dist/es/chunks/ToggleGroupRoot.js +4 -4
  323. package/dist/es/chunks/TooltipProvider.js +2 -2
  324. package/dist/es/chunks/TooltipRoot.js +5 -4
  325. package/dist/es/chunks/VisuallyHidden.js +1 -1
  326. package/dist/es/chunks/VisuallyHiddenInput.js +4 -3
  327. package/dist/es/chunks/alert.js +16 -10
  328. package/dist/es/chunks/alpha-slider.js +1 -3
  329. package/dist/es/chunks/badge.js +17 -11
  330. package/dist/es/chunks/bar-chart.js +10314 -0
  331. package/dist/es/chunks/button.js +11 -5
  332. package/dist/es/chunks/calendar.js +39 -32
  333. package/dist/es/chunks/chart-card.js +63 -0
  334. package/dist/es/chunks/chart-legend.js +82 -0
  335. package/dist/es/chunks/chart-plot.js +87 -0
  336. package/dist/es/chunks/checkbox-card.js +14 -8
  337. package/dist/es/chunks/checkbox-label.js +10 -4
  338. package/dist/es/chunks/checkbox.js +18 -11
  339. package/dist/es/chunks/clamp.js +1 -1
  340. package/dist/es/chunks/collapsible-content.js +9 -3
  341. package/dist/es/chunks/collapsible-trigger.js +1 -1
  342. package/dist/es/chunks/color-area.js +7 -5
  343. package/dist/es/chunks/color-picker.js +68 -40
  344. package/dist/es/chunks/color-swatch.js +3 -3
  345. package/dist/es/chunks/combobox-anchor.js +11 -4
  346. package/dist/es/chunks/combobox-empty.js +9 -3
  347. package/dist/es/chunks/combobox-group.js +10 -4
  348. package/dist/es/chunks/combobox-input.js +10 -4
  349. package/dist/es/chunks/combobox-item.js +22 -15
  350. package/dist/es/chunks/combobox-list.js +13 -6
  351. package/dist/es/chunks/combobox-root.js +1 -1
  352. package/dist/es/chunks/combobox-separator.js +8 -2
  353. package/dist/es/chunks/combobox-trigger.js +13 -6
  354. package/dist/es/chunks/combobox.js +13 -12
  355. package/dist/es/chunks/compact-button.js +12 -6
  356. package/dist/es/chunks/components.js +19 -3
  357. package/dist/es/chunks/content-divider.js +14 -8
  358. package/dist/es/chunks/counter-input.js +141 -106
  359. package/dist/es/chunks/createContext.js +1 -1
  360. package/dist/es/chunks/date-picker.js +13 -7
  361. package/dist/es/chunks/digit-input-group.js +11 -4
  362. package/dist/es/chunks/digit-input-slot.js +12 -5
  363. package/dist/es/chunks/digit-input.js +12 -5
  364. package/dist/es/chunks/dist.js +90 -205
  365. package/dist/es/chunks/dist2.js +434 -15275
  366. package/dist/es/chunks/dist3.js +15890 -0
  367. package/dist/es/chunks/dropdown-menu-content.js +14 -7
  368. package/dist/es/chunks/dropdown-menu-group.js +2 -2
  369. package/dist/es/chunks/dropdown-menu-item.js +12 -5
  370. package/dist/es/chunks/dropdown-menu-label.js +12 -5
  371. package/dist/es/chunks/dropdown-menu-separator.js +10 -4
  372. package/dist/es/chunks/dropdown-menu-sub-content.js +12 -5
  373. package/dist/es/chunks/dropdown-menu-sub-trigger.js +12 -5
  374. package/dist/es/chunks/dropdown-menu-sub.js +2 -2
  375. package/dist/es/chunks/dropdown-menu-trigger.js +2 -2
  376. package/dist/es/chunks/dropdown-menu.js +10 -3
  377. package/dist/es/chunks/extra-settings.js +2 -5
  378. package/dist/es/chunks/fancy-button.js +11 -5
  379. package/dist/es/chunks/file-upload-area.js +23 -15
  380. package/dist/es/chunks/getActiveElement.js +1 -1
  381. package/dist/es/chunks/handleAndDispatchCustomEvent.js +1 -1
  382. package/dist/es/chunks/hint-text.js +12 -6
  383. package/dist/es/chunks/hue-slider.js +3 -5
  384. package/dist/es/chunks/isValueEqualOrExist.js +1 -1
  385. package/dist/es/chunks/label2.js +14 -8
  386. package/dist/es/chunks/link-bubble.js +11 -13
  387. package/dist/es/chunks/link-button.js +13 -7
  388. package/dist/es/chunks/menus.js +236 -41
  389. package/dist/es/chunks/modal-body.js +8 -2
  390. package/dist/es/chunks/modal-content.js +17 -4
  391. package/dist/es/chunks/modal-footer.js +8 -2
  392. package/dist/es/chunks/modal-header.js +17 -11
  393. package/dist/es/chunks/nullish.js +1 -1
  394. package/dist/es/chunks/ohash.D__AXeF1.js +1 -1
  395. package/dist/es/chunks/pagination-content.js +12 -6
  396. package/dist/es/chunks/pagination-ellipsis.js +10 -4
  397. package/dist/es/chunks/pagination-first.js +11 -4
  398. package/dist/es/chunks/pagination-item.js +9 -3
  399. package/dist/es/chunks/pagination-last.js +11 -4
  400. package/dist/es/chunks/pagination-next.js +11 -4
  401. package/dist/es/chunks/pagination-previous.js +11 -4
  402. package/dist/es/chunks/pagination.js +11 -4
  403. package/dist/es/chunks/popover-content.js +28 -21
  404. package/dist/es/chunks/popover-trigger.js +2 -2
  405. package/dist/es/chunks/progress-bar.js +13 -7
  406. package/dist/es/chunks/progress-circle.js +9 -3
  407. package/dist/es/chunks/radio-group-card.js +14 -8
  408. package/dist/es/chunks/radio-group-item.js +15 -8
  409. package/dist/es/chunks/radio-group-label.js +10 -4
  410. package/dist/es/chunks/radio-group.js +9 -2
  411. package/dist/es/chunks/range-calendar.js +56 -46
  412. package/dist/es/chunks/range-picker.js +19 -13
  413. package/dist/es/chunks/rich-editor.js +1129 -260
  414. package/dist/es/chunks/rolldown-runtime.js +34 -0
  415. package/dist/es/chunks/scroll-area.js +12 -6
  416. package/dist/es/chunks/scroll-bar.js +39 -24
  417. package/dist/es/chunks/segmented-control-item.js +11 -5
  418. package/dist/es/chunks/segmented-control.js +10 -3
  419. package/dist/es/chunks/select-content.js +15 -8
  420. package/dist/es/chunks/select-icon.js +8 -2
  421. package/dist/es/chunks/select-item.js +16 -9
  422. package/dist/es/chunks/select-label.js +9 -3
  423. package/dist/es/chunks/select-separator.js +9 -3
  424. package/dist/es/chunks/select-trigger.js +11 -5
  425. package/dist/es/chunks/select-value.js +9 -3
  426. package/dist/es/chunks/select.js +9 -2
  427. package/dist/es/chunks/sheet-close.js +8 -2
  428. package/dist/es/chunks/sheet-content.js +12 -5
  429. package/dist/es/chunks/sheet-description.js +9 -3
  430. package/dist/es/chunks/sheet-footer.js +8 -2
  431. package/dist/es/chunks/sheet-header.js +8 -2
  432. package/dist/es/chunks/sheet-title.js +9 -3
  433. package/dist/es/chunks/sidebar-content.js +7 -1
  434. package/dist/es/chunks/sidebar-element.js +8 -2
  435. package/dist/es/chunks/sidebar-footer.js +7 -1
  436. package/dist/es/chunks/sidebar-group-content.js +8 -2
  437. package/dist/es/chunks/sidebar-group-label.js +9 -3
  438. package/dist/es/chunks/sidebar-group.js +7 -1
  439. package/dist/es/chunks/sidebar-header.js +7 -1
  440. package/dist/es/chunks/sidebar-menu-action.js +10 -4
  441. package/dist/es/chunks/sidebar-menu-badge.js +11 -5
  442. package/dist/es/chunks/sidebar-menu-button.js +10 -4
  443. package/dist/es/chunks/sidebar-menu-item.js +7 -1
  444. package/dist/es/chunks/sidebar-menu-sub-button.js +12 -6
  445. package/dist/es/chunks/sidebar-menu-sub-item.js +7 -1
  446. package/dist/es/chunks/sidebar-menu-sub.js +7 -1
  447. package/dist/es/chunks/sidebar-menu.js +7 -1
  448. package/dist/es/chunks/sidebar-provider.js +10 -3
  449. package/dist/es/chunks/sidebar-trigger.js +9 -3
  450. package/dist/es/chunks/sidebar.js +11 -5
  451. package/dist/es/chunks/slider.js +38 -23
  452. package/dist/es/chunks/social-button.js +4 -4
  453. package/dist/es/chunks/sonner-alert.js +1 -1
  454. package/dist/es/chunks/sonner.js +4 -3
  455. package/dist/es/chunks/status-badge.js +12 -6
  456. package/dist/es/chunks/switch.js +13 -6
  457. package/dist/es/chunks/tab-menu-content.js +9 -3
  458. package/dist/es/chunks/tab-menu-item.js +11 -4
  459. package/dist/es/chunks/tab-menu-list.js +9 -3
  460. package/dist/es/chunks/tab-menu.js +1 -1
  461. package/dist/es/chunks/table-body.js +8 -2
  462. package/dist/es/chunks/table-caption.js +8 -2
  463. package/dist/es/chunks/table-cell.js +8 -2
  464. package/dist/es/chunks/table-footer.js +8 -2
  465. package/dist/es/chunks/table-head.js +8 -2
  466. package/dist/es/chunks/table-header.js +7 -1
  467. package/dist/es/chunks/table-row.js +8 -2
  468. package/dist/es/chunks/table.js +8 -2
  469. package/dist/es/chunks/table2.js +8 -2
  470. package/dist/es/chunks/tag.js +15 -9
  471. package/dist/es/chunks/text-input-affix.js +8 -2
  472. package/dist/es/chunks/text-input-button.js +8 -2
  473. package/dist/es/chunks/text-input.js +10 -9
  474. package/dist/es/chunks/textarea.js +14 -8
  475. package/dist/es/chunks/tooltip-content.js +38 -31
  476. package/dist/es/chunks/tooltip-root.js +2 -1
  477. package/dist/es/chunks/tooltip-trigger.js +1 -1
  478. package/dist/es/chunks/tooltip.js +17 -10
  479. package/dist/es/chunks/use-color-model.js +7 -11
  480. package/dist/es/chunks/useArrowNavigation.js +1 -1
  481. package/dist/es/chunks/useCalendar.js +656 -584
  482. package/dist/es/chunks/useComposing.js +1 -1
  483. package/dist/es/chunks/useDirection.js +1 -1
  484. package/dist/es/chunks/useEmitAsProps.js +1 -1
  485. package/dist/es/chunks/useFocusGuards.js +2 -2
  486. package/dist/es/chunks/useFormControl.js +2 -2
  487. package/dist/es/chunks/useForwardExpose.js +2 -2
  488. package/dist/es/chunks/useForwardProps.js +1 -1
  489. package/dist/es/chunks/useForwardPropsEmits.js +1 -1
  490. package/dist/es/chunks/useForwardScopeId.js +1 -1
  491. package/dist/es/chunks/useHideOthers.js +4 -4
  492. package/dist/es/chunks/useId.js +1 -1
  493. package/dist/es/chunks/useKbd.js +1 -1
  494. package/dist/es/chunks/useLocale.js +1 -1
  495. package/dist/es/chunks/useNonce.js +1 -1
  496. package/dist/es/chunks/usePrimitiveElement.js +2 -2
  497. package/dist/es/chunks/useSize.js +2 -2
  498. package/dist/es/chunks/useTypeahead.js +2 -2
  499. package/dist/es/chunks/utils.js +1 -1
  500. package/dist/es/chunks/utils2.js +1 -1
  501. package/dist/es/chunks/utils3.js +1 -1
  502. package/dist/es/color.js +1 -3
  503. package/dist/es/command-group.js +10 -4
  504. package/dist/es/command-input.js +11 -4
  505. package/dist/es/command-item.js +10 -3
  506. package/dist/es/command-list.js +10 -3
  507. package/dist/es/command-root.js +10 -3
  508. package/dist/es/command-separator.js +8 -2
  509. package/dist/es/index.js +9 -1
  510. package/dist/es/use-chart-motion.js +15 -0
  511. package/dist/es/use-locale.js +8 -0
  512. package/dist/es/use-sidebar.js +1 -1
  513. package/dist/utils/chart.d.ts +6 -0
  514. package/dist/utils/index.d.ts +1 -0
  515. package/package.json +46 -44
  516. package/src/components/chart/bar-chart.vue +383 -0
  517. package/src/components/chart/chart-card.vue +99 -0
  518. package/src/components/chart/chart-legend.vue +164 -0
  519. package/src/components/chart/chart-plot.vue +350 -0
  520. package/src/components/chart/chart-tooltip.ts +35 -0
  521. package/src/components/chart/index.ts +13 -0
  522. package/src/components/chart/stories/bar-chart.stories.ts +319 -0
  523. package/src/components/color-picker/hue-slider.vue +1 -1
  524. package/src/components/file-upload/file-upload-area.vue +1 -1
  525. package/src/components/index.ts +1 -0
  526. package/src/components/text-input/text-input.vue +1 -0
  527. package/src/components/tooltip/tooltip-content.vue +5 -1
  528. package/src/composables/index.ts +2 -0
  529. package/src/composables/use-chart-motion.ts +18 -0
  530. package/src/composables/use-locale.ts +8 -0
  531. package/src/utils/chart.ts +42 -0
  532. package/src/utils/index.ts +1 -0
  533. package/dist/cjs/chunks/core.cjs +0 -325
  534. package/dist/es/chunks/core.js +0 -289
@@ -0,0 +1,383 @@
1
+ <script setup lang="ts">
2
+ import type { Tooltip } from '@unovis/ts';
3
+ import type { ChartLegendItem } from './chart-legend.vue';
4
+ import type { ChartTable } from './chart-plot.vue';
5
+ import type { ChartFormat } from '@/utils/chart';
6
+ import { GroupedBar, Position, StackedBar } from '@unovis/ts';
7
+ import { VisAxis, VisCrosshair, VisGroupedBar, VisStackedBar, VisTooltip, VisXYContainer } from '@unovis/vue';
8
+ import { useElementSize, useTextDirection } from '@vueuse/core';
9
+ import { computed, ref, useTemplateRef, watch } from 'vue';
10
+ import { useChartMotion } from '@/composables/use-chart-motion';
11
+ import { useLocale } from '@/composables/use-locale';
12
+ import { chartColor, formatCompact, formatNumber, niceTicks } from '@/utils/chart';
13
+ import ChartLegend from './chart-legend.vue';
14
+ import ChartPlot from './chart-plot.vue';
15
+ import { chartTooltip } from './chart-tooltip';
16
+
17
+ export type BarDatum = Record<string, any>;
18
+
19
+ export interface BarSeries {
20
+ key: string;
21
+ name: string;
22
+ color?: string;
23
+ muted?: boolean;
24
+ }
25
+
26
+ export interface BarChartProps {
27
+ data: BarDatum[];
28
+ series: BarSeries[];
29
+ category: string;
30
+ layout?: 'stacked' | 'grouped';
31
+ dense?: boolean;
32
+ size?: 'default' | 'compact';
33
+ state?: 'ready' | 'loading' | 'empty' | 'error';
34
+ title?: string;
35
+ description?: string;
36
+ format?: ChartFormat;
37
+ tickFormat?: ChartFormat;
38
+ ticks?: number;
39
+ radius?: number;
40
+ legend?: 'inline' | 'chip' | 'table' | 'none';
41
+ total?: boolean;
42
+ totalLabel?: string;
43
+ ariaLabel?: string;
44
+ tableVisible?: boolean;
45
+ }
46
+
47
+ const props = withDefaults(defineProps<BarChartProps>(), {
48
+ layout: 'stacked',
49
+ format: formatNumber,
50
+ tickFormat: formatCompact,
51
+ ticks: 4,
52
+ radius: 5,
53
+ total: true,
54
+ totalLabel: 'Total',
55
+ });
56
+ const CATEGORY_PADDING = 0.4;
57
+ const DENSE_PADDING = 0.32;
58
+ const DENSE_TICKS = 3;
59
+ const DENSE_LABELS = 7;
60
+ const TOOLTIP_MAX_WIDTH = 280;
61
+ const TOOLTIP_GAP = 8;
62
+ const MARGIN = { top: 16 };
63
+ const EPSILON = 1e-6;
64
+
65
+ const hidden = ref<string[]>([]);
66
+ const hovered = ref<number>();
67
+ const band = ref({ left: 0, width: 0, height: 0 });
68
+ const bandEl = useTemplateRef<HTMLElement>('bandEl');
69
+ const tip = useTemplateRef<{ component: Tooltip }>('tip');
70
+ const duration = useChartMotion('bar');
71
+ const locale = useLocale();
72
+ const direction = useTextDirection({ observe: true });
73
+
74
+ const plotEl = computed(() => bandEl.value?.parentElement ?? null);
75
+ const { width: plotWidth } = useElementSize(plotEl);
76
+
77
+ const rtl = computed(() => direction.value === 'rtl');
78
+ const rows = computed(() => rtl.value ? [...props.data].reverse() : props.data);
79
+ const visible = computed(() => props.series.filter(s => !hidden.value.includes(s.key)));
80
+ const legendVariant = computed(() => props.legend
81
+ ?? (props.series.length > 1 && !props.dense ? 'inline' : 'none'));
82
+ const stacked = computed(() => props.dense || props.layout === 'stacked');
83
+ const bars = computed(() => stacked.value ? StackedBar : GroupedBar);
84
+ const barSelector = computed(() => bars.value.selectors.bar);
85
+
86
+ const colors = computed(() => new Map(
87
+ props.series.map((s, i) => [s.key, s.color ?? (s.muted ? 'var(--chart-muted)' : chartColor(i))]),
88
+ ));
89
+
90
+ function x(_: BarDatum, i: number) {
91
+ return i;
92
+ }
93
+
94
+ function label(d: BarDatum) {
95
+ return String(d[props.category]);
96
+ }
97
+
98
+ function valueOf(d: BarDatum, key: string) {
99
+ return Number(d[key]) || 0;
100
+ }
101
+
102
+ function totalOf(d: BarDatum) {
103
+ return visible.value.reduce((sum, s) => sum + valueOf(d, s.key), 0);
104
+ }
105
+
106
+ function row(d: BarDatum) {
107
+ return d.datum ?? d;
108
+ }
109
+
110
+ function isHidden(d: BarDatum, i: number) {
111
+ return hidden.value.includes(props.series[d.stackIndex ?? i % props.series.length].key);
112
+ }
113
+
114
+ const formatValue = computed(() => (v: number) => props.format(v, locale.value));
115
+ const formatTick = computed(() => (v: number) => props.tickFormat(v, locale.value));
116
+
117
+ const y = computed(() => props.dense
118
+ ? [totalOf]
119
+ : props.series.map(s => hidden.value.includes(s.key)
120
+ ? () => EPSILON
121
+ : (d: BarDatum) => valueOf(d, s.key)));
122
+
123
+ const color = computed(() => {
124
+ const map = colors.value;
125
+
126
+ if (props.dense)
127
+ return () => chartColor(0);
128
+
129
+ return (d: BarDatum, i: number) => {
130
+ const { key } = props.series[i];
131
+
132
+ return d[key] ? map.get(key)! : 'var(--chart-zero)';
133
+ };
134
+ });
135
+
136
+ const barWidth = computed(() => plotWidth.value / Math.max(rows.value.length, 1) * (1 - DENSE_PADDING));
137
+ const radius = computed(() => {
138
+ if (!props.dense)
139
+ return props.radius;
140
+
141
+ if (barWidth.value < 4)
142
+ return 0;
143
+
144
+ return barWidth.value < 6 ? 1 : Math.min(2, props.radius);
145
+ });
146
+
147
+ const categoryTicks = computed(() => {
148
+ const stride = props.dense ? Math.ceil(rows.value.length / DENSE_LABELS) : 1;
149
+
150
+ return rows.value.map((_, i) => i).filter(i => i % stride === 0);
151
+ });
152
+
153
+ const peak = computed(() => Math.max(0, ...rows.value.map(d => props.layout === 'stacked'
154
+ ? totalOf(d)
155
+ : Math.max(...visible.value.map(s => valueOf(d, s.key))))));
156
+
157
+ const tickValues = computed(() => niceTicks(peak.value, props.dense ? DENSE_TICKS : props.ticks));
158
+ const valueDomain = computed<[number, number]>(() => [0, tickValues.value[tickValues.value.length - 1]]);
159
+
160
+ const legendItems = computed<ChartLegendItem[]>(() => props.series.map(s => ({
161
+ key: s.key,
162
+ name: s.name,
163
+ color: colors.value.get(s.key)!,
164
+ value: legendVariant.value === 'table'
165
+ ? formatValue.value(props.data.reduce((sum, d) => sum + valueOf(d, s.key), 0))
166
+ : undefined,
167
+ })));
168
+
169
+ const table = computed<ChartTable>(() => ({
170
+ head: [props.category, ...props.series.map(s => s.name)],
171
+ rows: props.data.map(d => [label(d), ...props.series.map(s => formatValue.value(valueOf(d, s.key)))]),
172
+ }));
173
+
174
+ const ariaLabel = computed(() => props.ariaLabel ?? [
175
+ `${props.layout} bar chart of`,
176
+ props.series.map(s => s.name).join(', '),
177
+ `by ${props.category}, ${props.data.length} bars,`,
178
+ `from ${label(props.data[0])} to ${label(props.data[props.data.length - 1])}`,
179
+ ].join(' '));
180
+
181
+ function tooltipFor(d: BarDatum) {
182
+ return chartTooltip({
183
+ title: label(row(d)),
184
+ rows: visible.value.map(s => ({
185
+ name: s.name,
186
+ value: formatValue.value(valueOf(row(d), s.key)),
187
+ color: colors.value.get(s.key),
188
+ })),
189
+ total: props.total && visible.value.length > 1
190
+ ? { name: props.totalLabel, value: formatValue.value(totalOf(row(d))) }
191
+ : undefined,
192
+ });
193
+ }
194
+
195
+ const triggers = computed(() => props.dense ? {} : { [barSelector.value]: tooltipFor });
196
+
197
+ function onEnter(d: BarDatum & { index?: number }, event: MouseEvent) {
198
+ hovered.value = d.index ?? rows.value.indexOf(d);
199
+
200
+ const bar = event.target as Element;
201
+ const group = bar.parentElement!.getBoundingClientRect();
202
+ const host = bandEl.value!.parentElement!.getBoundingClientRect();
203
+ const pad = group.width * CATEGORY_PADDING / (1 - CATEGORY_PADDING) / 2;
204
+
205
+ band.value = {
206
+ left: group.left - host.left - pad,
207
+ width: group.width + pad * 2,
208
+ height: group.bottom - host.top,
209
+ };
210
+
211
+ const tooltip = tip.value?.component;
212
+ const width = tooltip?.element.offsetWidth || TOOLTIP_MAX_WIDTH;
213
+ const fits = host.right - bar.getBoundingClientRect().right > width + TOOLTIP_GAP;
214
+
215
+ tooltip?.overrideHorizontalPlacement(fits ? Position.Right : Position.Left);
216
+ }
217
+
218
+ const events = computed(() => props.dense
219
+ ? {}
220
+ : {
221
+ [barSelector.value]: {
222
+ mouseover: onEnter,
223
+ mouseleave: () => hovered.value = undefined,
224
+ },
225
+ });
226
+
227
+ watch(hovered, (i) => {
228
+ if (!props.dense)
229
+ return;
230
+
231
+ plotEl.value?.querySelectorAll('[data-bar]')
232
+ .forEach((el, k) => el.toggleAttribute('data-dim', i !== undefined && k !== i));
233
+ });
234
+
235
+ const attributes = computed(() => ({
236
+ [barSelector.value]: {
237
+ 'data-bar': true,
238
+ ...(!stacked.value && { 'data-hidden': isHidden }),
239
+ },
240
+ ...(stacked.value && { [StackedBar.selectors.barGroup]: { 'data-bar-group': true } }),
241
+ }));
242
+ </script>
243
+
244
+ <template>
245
+ <ChartPlot
246
+ class="celeste-bar-chart"
247
+ v-bind="{ ariaLabel }"
248
+ :size="size"
249
+ :state="state"
250
+ :title="title"
251
+ :description="description"
252
+ :table="table"
253
+ :table-visible="tableVisible"
254
+ :data-hovering="(!dense && hovered !== undefined) || undefined"
255
+ :style="{ '--chart-bar-radius': `${radius}px` }"
256
+ >
257
+ <div
258
+ ref="bandEl"
259
+ class="celeste-bar-chart-band"
260
+ :style="{ left: `${band.left}px`, width: `${band.width}px`, height: `${band.height}px` }"
261
+ />
262
+
263
+ <VisXYContainer
264
+ :data="rows"
265
+ :duration="duration"
266
+ :y-domain="valueDomain"
267
+ :margin="MARGIN"
268
+ height="100%"
269
+ >
270
+ <VisStackedBar
271
+ v-if="stacked"
272
+ :x="x"
273
+ :y="y"
274
+ :color="color"
275
+ :rounded-corners="dense ? radius : false"
276
+ :bar-padding="dense ? DENSE_PADDING : CATEGORY_PADDING"
277
+ :events="events"
278
+ :attributes="attributes"
279
+ />
280
+ <VisGroupedBar
281
+ v-else
282
+ :x="x"
283
+ :y="y"
284
+ :color="color"
285
+ :rounded-corners="radius"
286
+ :group-padding="CATEGORY_PADDING"
287
+ :bar-padding="0.1"
288
+ :bar-min-height="2"
289
+ :events="events"
290
+ :attributes="attributes"
291
+ />
292
+
293
+ <VisAxis
294
+ type="x"
295
+ :grid-line="false"
296
+ :tick-line="false"
297
+ :domain-line="false"
298
+ :tick-values="categoryTicks"
299
+ :tick-format="(i: number) => label(rows[i])"
300
+ :tick-text-hide-overlapping="true"
301
+ />
302
+ <VisAxis
303
+ type="y"
304
+ :position="rtl ? Position.Right : Position.Left"
305
+ :tick-line="false"
306
+ :domain-line="false"
307
+ :tick-values="tickValues"
308
+ :tick-format="formatTick"
309
+ />
310
+
311
+ <!-- eslint-disable vue/attribute-hyphenation VisCrosshair declares no props, so kebab keys never reach its config -->
312
+ <VisCrosshair
313
+ v-if="dense"
314
+ :x="x"
315
+ :y="y"
316
+ :template="tooltipFor"
317
+ :getCircles="() => []"
318
+ :onCrosshairMove="(_: unknown, __: unknown, i?: number) => hovered = i"
319
+ />
320
+
321
+ <VisTooltip
322
+ ref="tip"
323
+ :triggers="triggers"
324
+ :follow-cursor="false"
325
+ :vertical-placement="dense ? Position.Top : Position.Center"
326
+ :horizontal-shift="TOOLTIP_GAP"
327
+ :class-name="dense ? 'celeste-bar-chart-tip-dense' : undefined"
328
+ />
329
+ </VisXYContainer>
330
+
331
+ <template #footer>
332
+ <ChartLegend
333
+ v-if="legendVariant !== 'none'"
334
+ v-model="hidden"
335
+ :items="legendItems"
336
+ :variant="legendVariant"
337
+ />
338
+ </template>
339
+ </ChartPlot>
340
+ </template>
341
+
342
+ <style lang="scss">
343
+ .celeste-bar-chart {
344
+ .celeste-bar-chart-band {
345
+ position: absolute;
346
+ top: 0;
347
+ opacity: 0;
348
+ background: var(--chart-track);
349
+ }
350
+
351
+ &[data-hovering] .celeste-bar-chart-band {
352
+ opacity: 1;
353
+ }
354
+
355
+ .celeste-bar-chart-tip-dense .celeste-chart-tooltip {
356
+ width: 168px;
357
+ min-width: 0;
358
+ }
359
+
360
+ [data-bar][data-dim] {
361
+ transition: opacity var(--animation-fast) ease-out;
362
+ opacity: 0.4;
363
+ }
364
+
365
+ [data-bar-group] {
366
+ clip-path: inset(0 round var(--chart-bar-radius) var(--chart-bar-radius) 0 0);
367
+ }
368
+
369
+ &[data-hovering] [data-bar] {
370
+ transition: opacity var(--animation-fast) ease-out;
371
+ opacity: 0.4;
372
+ }
373
+
374
+ &[data-hovering] g:hover > [data-bar] {
375
+ opacity: 1;
376
+ }
377
+
378
+ [data-bar][data-hidden='true'] {
379
+ transition: opacity var(--animation-fast) ease-out;
380
+ opacity: 0;
381
+ }
382
+ }
383
+ </style>
@@ -0,0 +1,99 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import clsx from 'clsx';
4
+ import Badge from '../badge/badge.vue';
5
+
6
+ export interface ChartCardProps {
7
+ title: string;
8
+ value?: string;
9
+ caption?: string;
10
+ delta?: { value: string; direction: 'up' | 'down' };
11
+ class?: HTMLAttributes['class'];
12
+ }
13
+
14
+ const props = defineProps<ChartCardProps>();
15
+ </script>
16
+
17
+ <template>
18
+ <section :class="clsx('celeste-chart-card', props.class)">
19
+ <header class="celeste-chart-card-header">
20
+ <div class="celeste-chart-card-heading">
21
+ <span class="celeste-chart-card-title">{{ title }}</span>
22
+ <div v-if="value" class="celeste-chart-card-kpi">
23
+ <span class="celeste-chart-card-value">{{ value }}</span>
24
+ <Badge
25
+ v-if="delta"
26
+ type="leading-icon"
27
+ variant="lighter"
28
+ size="sm"
29
+ :state="delta.direction === 'up' ? 'success' : 'error'"
30
+ :icon="`i-celeste-arrow-${delta.direction}-line`"
31
+ :label="delta.value"
32
+ />
33
+ </div>
34
+ <span v-if="caption" class="celeste-chart-card-caption">{{ caption }}</span>
35
+ </div>
36
+
37
+ <div v-if="$slots.toolbar" class="celeste-chart-card-toolbar">
38
+ <slot name="toolbar" />
39
+ </div>
40
+ </header>
41
+
42
+ <slot />
43
+ </section>
44
+ </template>
45
+
46
+ <style lang="scss" scoped>
47
+ .celeste-chart-card {
48
+ display: flex;
49
+ flex-direction: column;
50
+ min-width: 320px;
51
+ padding: var(--spacing-20);
52
+ border: 1px solid var(--color-stroke-soft-200);
53
+ border-radius: var(--radius-16);
54
+ background: var(--color-bg-white-0);
55
+ box-shadow: var(--shadow-regular-xs);
56
+ gap: var(--spacing-16);
57
+
58
+ .celeste-chart-card-header {
59
+ display: flex;
60
+ align-items: flex-start;
61
+ justify-content: space-between;
62
+ gap: var(--spacing-20);
63
+ }
64
+
65
+ .celeste-chart-card-heading {
66
+ display: flex;
67
+ flex-direction: column;
68
+ gap: var(--spacing-6);
69
+ }
70
+
71
+ .celeste-chart-card-title {
72
+ color: var(--color-text-strong-950);
73
+ font: var(--label-sm);
74
+ }
75
+
76
+ .celeste-chart-card-kpi {
77
+ display: flex;
78
+ align-items: baseline;
79
+ gap: var(--spacing-10);
80
+ }
81
+
82
+ .celeste-chart-card-value {
83
+ color: var(--color-text-strong-950);
84
+ font: var(--title-h4-title);
85
+ font-variant-numeric: tabular-nums;
86
+ }
87
+
88
+ .celeste-chart-card-caption {
89
+ color: var(--color-text-soft-400);
90
+ font: var(--paragraph-xs);
91
+ }
92
+
93
+ .celeste-chart-card-toolbar {
94
+ display: flex;
95
+ align-items: center;
96
+ gap: var(--spacing-8);
97
+ }
98
+ }
99
+ </style>
@@ -0,0 +1,164 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import clsx from 'clsx';
4
+
5
+ export interface ChartLegendItem {
6
+ key: string;
7
+ name: string;
8
+ color: string;
9
+ value?: string;
10
+ delta?: { value: string; direction: 'up' | 'down' };
11
+ }
12
+
13
+ export interface ChartLegendProps {
14
+ items: ChartLegendItem[];
15
+ variant?: 'inline' | 'chip' | 'table';
16
+ toggle?: boolean;
17
+ class?: HTMLAttributes['class'];
18
+ }
19
+
20
+ const props = withDefaults(defineProps<ChartLegendProps>(), {
21
+ variant: 'inline',
22
+ toggle: true,
23
+ });
24
+
25
+ const hidden = defineModel<string[]>({ default: () => [] });
26
+
27
+ function isHidden(key: string) {
28
+ return hidden.value.includes(key);
29
+ }
30
+
31
+ function onToggle(key: string) {
32
+ hidden.value = isHidden(key)
33
+ ? hidden.value.filter(k => k !== key)
34
+ : [...hidden.value, key];
35
+ }
36
+ </script>
37
+
38
+ <template>
39
+ <div :class="clsx('celeste-chart-legend', props.class)" :data-variant="variant">
40
+ <component
41
+ :is="toggle ? 'button' : 'span'"
42
+ v-for="item in items"
43
+ :key="item.key"
44
+ class="celeste-chart-legend-item"
45
+ :type="toggle ? 'button' : undefined"
46
+ :data-hidden="isHidden(item.key) || undefined"
47
+ :aria-pressed="toggle ? !isHidden(item.key) : undefined"
48
+ @click="toggle && onToggle(item.key)"
49
+ >
50
+ <span
51
+ class="celeste-chart-legend-swatch"
52
+ :style="isHidden(item.key) ? undefined : { background: item.color }"
53
+ />
54
+ <span class="celeste-chart-legend-name">{{ item.name }}</span>
55
+ <span v-if="item.value" class="celeste-chart-legend-value">{{ item.value }}</span>
56
+ <span
57
+ v-if="item.delta"
58
+ class="celeste-chart-legend-delta"
59
+ :data-direction="item.delta.direction"
60
+ >{{ item.delta.value }}</span>
61
+ </component>
62
+ </div>
63
+ </template>
64
+
65
+ <style lang="scss" scoped>
66
+ .celeste-chart-legend {
67
+ display: flex;
68
+ padding-top: var(--spacing-14);
69
+ border-top: 1px solid var(--color-stroke-soft-200);
70
+ gap: var(--spacing-16);
71
+
72
+ .celeste-chart-legend-item {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ padding: 0;
76
+ transition: color var(--animation-fast) ease-out;
77
+ border: none;
78
+ background: none;
79
+ color: var(--color-text-sub-600);
80
+ font: var(--label-xs);
81
+ text-align: start;
82
+ gap: 7px;
83
+
84
+ &[data-hidden] {
85
+ color: var(--color-text-disabled-300);
86
+ }
87
+ }
88
+
89
+ button.celeste-chart-legend-item {
90
+ cursor: pointer;
91
+
92
+ &:hover {
93
+ color: var(--color-text-strong-950);
94
+ }
95
+
96
+ &:focus-visible {
97
+ border-radius: var(--radius-4);
98
+ outline: 2px solid var(--color-primary-alpha-24);
99
+ outline-offset: 2px;
100
+ }
101
+ }
102
+
103
+ .celeste-chart-legend-swatch {
104
+ flex: none;
105
+ width: 8px;
106
+ height: 8px;
107
+ transition: background var(--animation-fast) ease-out;
108
+ border-radius: 3px;
109
+ background: var(--color-neutral-300);
110
+ }
111
+
112
+ .celeste-chart-legend-value,
113
+ .celeste-chart-legend-delta {
114
+ font: var(--label-xs);
115
+ font-family: var(--font-families-display);
116
+ font-variant-numeric: tabular-nums;
117
+ }
118
+
119
+ .celeste-chart-legend-value {
120
+ color: var(--color-text-strong-950);
121
+ }
122
+
123
+ .celeste-chart-legend-delta {
124
+ width: 56px;
125
+ text-align: end;
126
+
127
+ &[data-direction='up'] {
128
+ color: var(--color-state-success-base);
129
+ }
130
+
131
+ &[data-direction='down'] {
132
+ color: var(--color-state-error-base);
133
+ }
134
+ }
135
+
136
+ &[data-variant='chip'] {
137
+ flex-wrap: wrap;
138
+ gap: var(--spacing-8);
139
+
140
+ .celeste-chart-legend-item {
141
+ padding: 5px 11px;
142
+ border: 1px solid var(--color-stroke-soft-200);
143
+ border-radius: var(--radius-full);
144
+ color: var(--color-text-strong-950);
145
+
146
+ &[data-hidden] {
147
+ background: var(--color-bg-weak-50);
148
+ color: var(--color-text-disabled-300);
149
+ }
150
+ }
151
+ }
152
+
153
+ &[data-variant='table'] {
154
+ flex-direction: column;
155
+ gap: var(--spacing-8);
156
+
157
+ .celeste-chart-legend-name {
158
+ flex: 1;
159
+ color: var(--color-text-sub-600);
160
+ font: var(--paragraph-xs);
161
+ }
162
+ }
163
+ }
164
+ </style>