@youcan/celeste 0.6.29 → 0.6.31

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 (369) hide show
  1. package/dist/celeste.css +4244 -0
  2. package/dist/cjs/alert.js +111 -0
  3. package/dist/cjs/alpha-slider.js +3 -0
  4. package/dist/cjs/badge.js +55 -0
  5. package/dist/cjs/button.js +39 -0
  6. package/dist/cjs/checkbox-label.js +112 -0
  7. package/dist/cjs/checkbox.js +3 -0
  8. package/dist/cjs/chunks/_plugin-vue_export-helper.js +9 -0
  9. package/dist/cjs/chunks/alpha-slider.js +127 -0
  10. package/dist/cjs/chunks/checkbox.vue_vue_type_style_index_0_lang.js +38 -0
  11. package/dist/cjs/chunks/clsx.js +15 -0
  12. package/dist/cjs/chunks/combobox-anchor.js +31 -0
  13. package/dist/cjs/chunks/content-divider.vue_vue_type_style_index_0_lang.js +52 -0
  14. package/dist/cjs/chunks/dropdown-menu-content.vue_vue_type_style_index_0_lang.js +51 -0
  15. package/dist/cjs/chunks/dropdown-menu-sub-content.vue_vue_type_style_index_0_lang.js +49 -0
  16. package/dist/cjs/chunks/dropdown-menu-sub-trigger.vue_vue_type_style_index_0_lang.js +32 -0
  17. package/dist/cjs/chunks/dropdown-menu-sub.js +25 -0
  18. package/dist/cjs/chunks/index.js +9300 -0
  19. package/dist/cjs/chunks/index2.js +1457 -0
  20. package/dist/cjs/chunks/index3.js +16457 -0
  21. package/dist/cjs/chunks/modal-close.js +22 -0
  22. package/dist/cjs/chunks/modal-trigger.js +22 -0
  23. package/dist/cjs/chunks/modal.js +26 -0
  24. package/dist/cjs/chunks/popover.js +26 -0
  25. package/dist/cjs/chunks/scroll-area.js +41 -0
  26. package/dist/cjs/chunks/select-group.js +22 -0
  27. package/dist/cjs/chunks/select.js +38 -0
  28. package/dist/cjs/chunks/slider.vue_vue_type_style_index_0_lang.js +52 -0
  29. package/dist/cjs/chunks/sonner.js +1153 -0
  30. package/dist/cjs/chunks/switch.vue_vue_type_style_index_0_lang.js +38 -0
  31. package/dist/cjs/chunks/use-color-model.js +992 -0
  32. package/dist/cjs/color-area.js +175 -0
  33. package/dist/cjs/color-picker.js +514 -0
  34. package/dist/cjs/color-swatch.js +59 -0
  35. package/dist/cjs/color.js +102 -0
  36. package/dist/cjs/combobox-anchor.js +3 -0
  37. package/dist/cjs/combobox-empty.js +32 -0
  38. package/dist/cjs/combobox-group.js +42 -0
  39. package/dist/cjs/combobox-input.js +63 -0
  40. package/dist/cjs/combobox-item.js +109 -0
  41. package/dist/cjs/combobox-list.js +62 -0
  42. package/dist/cjs/combobox-root.js +40 -0
  43. package/dist/cjs/combobox-separator.js +32 -0
  44. package/dist/cjs/combobox-trigger.js +47 -0
  45. package/dist/cjs/combobox.js +233 -0
  46. package/dist/cjs/command-group.js +41 -0
  47. package/dist/cjs/command-input.js +42 -0
  48. package/dist/cjs/command-item.js +34 -0
  49. package/dist/cjs/command-list.js +52 -0
  50. package/dist/cjs/command-root.js +45 -0
  51. package/dist/cjs/command-separator.js +32 -0
  52. package/dist/cjs/compact-button.js +42 -0
  53. package/dist/cjs/config.js +136 -0
  54. package/dist/cjs/content-divider.js +3 -0
  55. package/dist/cjs/context-menu-item.js +134 -0
  56. package/dist/cjs/crypto.js +8 -0
  57. package/dist/cjs/dropdown-item.js +99 -0
  58. package/dist/cjs/dropdown-menu-content.js +3 -0
  59. package/dist/cjs/dropdown-menu-group.js +24 -0
  60. package/dist/cjs/dropdown-menu-item.js +68 -0
  61. package/dist/cjs/dropdown-menu-label.js +31 -0
  62. package/dist/cjs/dropdown-menu-separator.js +25 -0
  63. package/dist/cjs/dropdown-menu-sub-content.js +3 -0
  64. package/dist/cjs/dropdown-menu-sub-trigger.js +3 -0
  65. package/dist/cjs/dropdown-menu-sub.js +3 -0
  66. package/dist/cjs/dropdown-menu-trigger.js +26 -0
  67. package/dist/cjs/dropdown-menu.js +32 -0
  68. package/dist/cjs/dropdown.js +291 -0
  69. package/dist/cjs/extra-settings.js +155 -0
  70. package/dist/cjs/fancy-button.js +38 -0
  71. package/dist/cjs/hint-text.js +36 -0
  72. package/dist/cjs/hue-slider.js +133 -0
  73. package/dist/cjs/index.js +229 -0
  74. package/dist/cjs/label.js +55 -0
  75. package/dist/cjs/link-bubble.js +228 -0
  76. package/dist/cjs/link-button.js +44 -0
  77. package/dist/cjs/modal-body.js +22 -0
  78. package/dist/cjs/modal-close.js +3 -0
  79. package/dist/cjs/modal-content.js +48 -0
  80. package/dist/cjs/modal-footer.js +22 -0
  81. package/dist/cjs/modal-header.js +81 -0
  82. package/dist/cjs/modal-trigger.js +3 -0
  83. package/dist/cjs/modal.js +3 -0
  84. package/dist/cjs/popover-content.js +104 -0
  85. package/dist/cjs/popover-trigger.js +24 -0
  86. package/dist/cjs/popover.js +3 -0
  87. package/dist/cjs/rich-editor.js +4996 -0
  88. package/dist/cjs/scroll-area.js +3 -0
  89. package/dist/cjs/scroll-bar.js +39 -0
  90. package/dist/cjs/segmented-control-item.js +41 -0
  91. package/dist/cjs/segmented-control.js +40 -0
  92. package/dist/cjs/select-content.js +61 -0
  93. package/dist/cjs/select-group.js +3 -0
  94. package/dist/cjs/select-icon.js +25 -0
  95. package/dist/cjs/select-item.js +44 -0
  96. package/dist/cjs/select-label.js +32 -0
  97. package/dist/cjs/select-separator.js +26 -0
  98. package/dist/cjs/select-trigger.js +40 -0
  99. package/dist/cjs/select-value.js +31 -0
  100. package/dist/cjs/select.js +3 -0
  101. package/dist/cjs/shims.js +1 -0
  102. package/dist/cjs/slider.js +3 -0
  103. package/dist/cjs/social-button.js +45 -0
  104. package/dist/cjs/sonner-alert.js +41 -0
  105. package/dist/cjs/sonner.js +3 -0
  106. package/dist/cjs/status-badge.js +49 -0
  107. package/dist/cjs/switch.js +3 -0
  108. package/dist/cjs/tab-menu-content.js +32 -0
  109. package/dist/cjs/tab-menu-item.js +44 -0
  110. package/dist/cjs/tab-menu-list.js +34 -0
  111. package/dist/cjs/tab-menu.js +32 -0
  112. package/dist/cjs/text-input-affix.js +27 -0
  113. package/dist/cjs/text-input-button.js +31 -0
  114. package/dist/cjs/text-input.js +119 -0
  115. package/dist/cjs/textarea.js +56 -0
  116. package/dist/cjs/tooltip.js +115 -0
  117. package/dist/cjs/types.js +1 -0
  118. package/dist/cjs/use-color-model.js +6 -0
  119. package/dist/cjs/use-delegated-props.js +14 -0
  120. package/dist/cjs/use-user-select.js +39 -0
  121. package/dist/components/alert/alert.d.ts +30 -0
  122. package/dist/components/alert/index.d.ts +2 -0
  123. package/dist/components/badge/badge.d.ts +17 -0
  124. package/dist/components/badge/index.d.ts +4 -0
  125. package/dist/components/badge/status-badge.d.ts +13 -0
  126. package/dist/components/button/button.d.ts +22 -0
  127. package/dist/components/button/compact-button.d.ts +15 -0
  128. package/dist/components/button/fancy-button.d.ts +20 -0
  129. package/dist/components/button/index.d.ts +10 -0
  130. package/dist/components/button/link-button.d.ts +22 -0
  131. package/dist/components/button/social-button.d.ts +10 -0
  132. package/dist/components/checkbox/checkbox-label.d.ts +32 -0
  133. package/dist/components/checkbox/checkbox.d.ts +11 -0
  134. package/dist/components/checkbox/index.d.ts +4 -0
  135. package/dist/components/color-picker/alpha-slider.d.ts +15 -0
  136. package/dist/components/color-picker/color-area.d.ts +9 -0
  137. package/dist/components/color-picker/color-picker.d.ts +47 -0
  138. package/dist/components/color-picker/color-swatch.d.ts +19 -0
  139. package/dist/components/color-picker/composable/use-color-model.d.ts +7 -0
  140. package/dist/components/color-picker/composable/use-user-select.d.ts +8 -0
  141. package/dist/components/color-picker/hue-slider.d.ts +14 -0
  142. package/dist/components/color-picker/index.d.ts +10 -0
  143. package/dist/components/combobox/combobox-anchor.d.ts +22 -0
  144. package/dist/components/combobox/combobox-empty.d.ts +22 -0
  145. package/dist/components/combobox/combobox-group.d.ts +23 -0
  146. package/dist/components/combobox/combobox-input.d.ts +17 -0
  147. package/dist/components/combobox/combobox-item.d.ts +31 -0
  148. package/dist/components/combobox/combobox-list.d.ts +36 -0
  149. package/dist/components/combobox/combobox-root.d.ts +29 -0
  150. package/dist/components/combobox/combobox-separator.d.ts +22 -0
  151. package/dist/components/combobox/combobox-trigger.d.ts +20 -0
  152. package/dist/components/combobox/combobox.d.ts +42 -0
  153. package/dist/components/combobox/index.d.ts +20 -0
  154. package/dist/components/content-divider/content-divider.d.ts +10 -0
  155. package/dist/components/content-divider/index.d.ts +2 -0
  156. package/dist/components/dropdown/context-menu-item.d.ts +39 -0
  157. package/dist/components/dropdown/dropdown-item.d.ts +30 -0
  158. package/dist/components/dropdown/dropdown.d.ts +55 -0
  159. package/dist/components/dropdown/index.d.ts +6 -0
  160. package/dist/components/dropdown-menu/dropdown-menu-content.d.ts +36 -0
  161. package/dist/components/dropdown-menu/dropdown-menu-group.d.ts +18 -0
  162. package/dist/components/dropdown-menu/dropdown-menu-item.d.ts +26 -0
  163. package/dist/components/dropdown-menu/dropdown-menu-label.d.ts +22 -0
  164. package/dist/components/dropdown-menu/dropdown-menu-separator.d.ts +7 -0
  165. package/dist/components/dropdown-menu/dropdown-menu-sub-content.d.ts +38 -0
  166. package/dist/components/dropdown-menu/dropdown-menu-sub-trigger.d.ts +22 -0
  167. package/dist/components/dropdown-menu/dropdown-menu-sub.d.ts +22 -0
  168. package/dist/components/dropdown-menu/dropdown-menu-trigger.d.ts +18 -0
  169. package/dist/components/dropdown-menu/dropdown-menu.d.ts +18 -0
  170. package/dist/components/dropdown-menu/index.d.ts +20 -0
  171. package/dist/components/hint-text/hint-text.d.ts +11 -0
  172. package/dist/components/hint-text/index.d.ts +2 -0
  173. package/dist/components/index.d.ts +23 -0
  174. package/dist/components/label/index.d.ts +2 -0
  175. package/dist/components/label/label.d.ts +29 -0
  176. package/dist/components/modal/index.d.ts +14 -0
  177. package/dist/components/modal/modal-body.d.ts +21 -0
  178. package/dist/components/modal/modal-close.d.ts +18 -0
  179. package/dist/components/modal/modal-content.d.ts +37 -0
  180. package/dist/components/modal/modal-footer.d.ts +21 -0
  181. package/dist/components/modal/modal-header.d.ts +16 -0
  182. package/dist/components/modal/modal-trigger.d.ts +18 -0
  183. package/dist/components/modal/modal.d.ts +22 -0
  184. package/dist/components/popover/index.d.ts +6 -0
  185. package/dist/components/popover/popover-content.d.ts +41 -0
  186. package/dist/components/popover/popover-trigger.d.ts +18 -0
  187. package/dist/components/popover/popover.d.ts +22 -0
  188. package/dist/components/rich-editor/config.d.ts +33 -0
  189. package/dist/components/rich-editor/extra-settings.d.ts +6 -0
  190. package/dist/components/rich-editor/index.d.ts +2 -0
  191. package/dist/components/rich-editor/link-bubble.d.ts +11 -0
  192. package/dist/components/rich-editor/rich-editor.d.ts +55 -0
  193. package/dist/components/rich-editor/types.d.ts +19 -0
  194. package/dist/components/scroll-area/index.d.ts +2 -0
  195. package/dist/components/scroll-area/scroll-area.d.ts +22 -0
  196. package/dist/components/scroll-area/scroll-bar.d.ts +9 -0
  197. package/dist/components/segmented-control/index.d.ts +4 -0
  198. package/dist/components/segmented-control/segmented-control-item.d.ts +22 -0
  199. package/dist/components/segmented-control/segmented-control.d.ts +26 -0
  200. package/dist/components/select/index.d.ts +18 -0
  201. package/dist/components/select/select-content.d.ts +33 -0
  202. package/dist/components/select/select-group.d.ts +18 -0
  203. package/dist/components/select/select-icon.d.ts +21 -0
  204. package/dist/components/select/select-item.d.ts +22 -0
  205. package/dist/components/select/select-label.d.ts +22 -0
  206. package/dist/components/select/select-separator.d.ts +7 -0
  207. package/dist/components/select/select-trigger.d.ts +28 -0
  208. package/dist/components/select/select-value.d.ts +22 -0
  209. package/dist/components/select/select.d.ts +28 -0
  210. package/dist/components/slider/index.d.ts +2 -0
  211. package/dist/components/slider/slider.d.ts +13 -0
  212. package/dist/components/sonner/index.d.ts +4 -0
  213. package/dist/components/sonner/sonner-alert.d.ts +13 -0
  214. package/dist/components/sonner/sonner.d.ts +5 -0
  215. package/dist/components/switch/index.d.ts +2 -0
  216. package/dist/components/switch/switch.d.ts +11 -0
  217. package/dist/components/tab-menu/index.d.ts +8 -0
  218. package/dist/components/tab-menu/tab-menu-content.d.ts +22 -0
  219. package/dist/components/tab-menu/tab-menu-item.d.ts +24 -0
  220. package/dist/components/tab-menu/tab-menu-list.d.ts +22 -0
  221. package/dist/components/tab-menu/tab-menu.d.ts +23 -0
  222. package/dist/components/text-input/index.d.ts +6 -0
  223. package/dist/components/text-input/text-input-affix.d.ts +23 -0
  224. package/dist/components/text-input/text-input-button.d.ts +23 -0
  225. package/dist/components/text-input/text-input.d.ts +32 -0
  226. package/dist/components/textarea/index.d.ts +2 -0
  227. package/dist/components/textarea/textarea.d.ts +22 -0
  228. package/dist/components/tooltip/index.d.ts +2 -0
  229. package/dist/components/tooltip/tooltip.d.ts +29 -0
  230. package/dist/composables/use-delegated-props.d.ts +2 -0
  231. package/dist/es/alert.js +112 -0
  232. package/dist/es/alpha-slider.js +4 -0
  233. package/dist/es/badge.js +56 -0
  234. package/dist/es/button.js +40 -0
  235. package/dist/es/checkbox-label.js +113 -0
  236. package/dist/es/checkbox.js +4 -0
  237. package/dist/es/chunks/_plugin-vue_export-helper.js +10 -0
  238. package/dist/es/chunks/alpha-slider.js +128 -0
  239. package/dist/es/chunks/checkbox.vue_vue_type_style_index_0_lang.js +39 -0
  240. package/dist/es/chunks/clsx.js +16 -0
  241. package/dist/es/chunks/combobox-anchor.js +32 -0
  242. package/dist/es/chunks/content-divider.vue_vue_type_style_index_0_lang.js +53 -0
  243. package/dist/es/chunks/dropdown-menu-content.vue_vue_type_style_index_0_lang.js +52 -0
  244. package/dist/es/chunks/dropdown-menu-sub-content.vue_vue_type_style_index_0_lang.js +50 -0
  245. package/dist/es/chunks/dropdown-menu-sub-trigger.vue_vue_type_style_index_0_lang.js +33 -0
  246. package/dist/es/chunks/dropdown-menu-sub.js +26 -0
  247. package/dist/es/chunks/index.js +9285 -0
  248. package/dist/es/chunks/index2.js +1457 -0
  249. package/dist/es/chunks/index3.js +16458 -0
  250. package/dist/es/chunks/modal-close.js +23 -0
  251. package/dist/es/chunks/modal-trigger.js +23 -0
  252. package/dist/es/chunks/modal.js +27 -0
  253. package/dist/es/chunks/popover.js +27 -0
  254. package/dist/es/chunks/scroll-area.js +42 -0
  255. package/dist/es/chunks/select-group.js +23 -0
  256. package/dist/es/chunks/select.js +39 -0
  257. package/dist/es/chunks/slider.vue_vue_type_style_index_0_lang.js +53 -0
  258. package/dist/es/chunks/sonner.js +1154 -0
  259. package/dist/es/chunks/switch.vue_vue_type_style_index_0_lang.js +39 -0
  260. package/dist/es/chunks/use-color-model.js +993 -0
  261. package/dist/es/color-area.js +176 -0
  262. package/dist/es/color-picker.js +515 -0
  263. package/dist/es/color-swatch.js +60 -0
  264. package/dist/es/color.js +102 -0
  265. package/dist/es/combobox-anchor.js +4 -0
  266. package/dist/es/combobox-empty.js +33 -0
  267. package/dist/es/combobox-group.js +43 -0
  268. package/dist/es/combobox-input.js +64 -0
  269. package/dist/es/combobox-item.js +110 -0
  270. package/dist/es/combobox-list.js +63 -0
  271. package/dist/es/combobox-root.js +41 -0
  272. package/dist/es/combobox-separator.js +33 -0
  273. package/dist/es/combobox-trigger.js +48 -0
  274. package/dist/es/combobox.js +234 -0
  275. package/dist/es/command-group.js +42 -0
  276. package/dist/es/command-input.js +43 -0
  277. package/dist/es/command-item.js +35 -0
  278. package/dist/es/command-list.js +53 -0
  279. package/dist/es/command-root.js +46 -0
  280. package/dist/es/command-separator.js +33 -0
  281. package/dist/es/compact-button.js +43 -0
  282. package/dist/es/config.js +136 -0
  283. package/dist/es/content-divider.js +4 -0
  284. package/dist/es/context-menu-item.js +135 -0
  285. package/dist/es/crypto.js +8 -0
  286. package/dist/es/dropdown-item.js +100 -0
  287. package/dist/es/dropdown-menu-content.js +4 -0
  288. package/dist/es/dropdown-menu-group.js +25 -0
  289. package/dist/es/dropdown-menu-item.js +69 -0
  290. package/dist/es/dropdown-menu-label.js +32 -0
  291. package/dist/es/dropdown-menu-separator.js +26 -0
  292. package/dist/es/dropdown-menu-sub-content.js +4 -0
  293. package/dist/es/dropdown-menu-sub-trigger.js +4 -0
  294. package/dist/es/dropdown-menu-sub.js +4 -0
  295. package/dist/es/dropdown-menu-trigger.js +27 -0
  296. package/dist/es/dropdown-menu.js +33 -0
  297. package/dist/es/dropdown.js +292 -0
  298. package/dist/es/extra-settings.js +156 -0
  299. package/dist/es/fancy-button.js +39 -0
  300. package/dist/es/hint-text.js +37 -0
  301. package/dist/es/hue-slider.js +134 -0
  302. package/dist/es/index.js +229 -0
  303. package/dist/es/label.js +56 -0
  304. package/dist/es/link-bubble.js +229 -0
  305. package/dist/es/link-button.js +45 -0
  306. package/dist/es/modal-body.js +23 -0
  307. package/dist/es/modal-close.js +4 -0
  308. package/dist/es/modal-content.js +49 -0
  309. package/dist/es/modal-footer.js +23 -0
  310. package/dist/es/modal-header.js +82 -0
  311. package/dist/es/modal-trigger.js +4 -0
  312. package/dist/es/modal.js +4 -0
  313. package/dist/es/popover-content.js +105 -0
  314. package/dist/es/popover-trigger.js +25 -0
  315. package/dist/es/popover.js +4 -0
  316. package/dist/es/rich-editor.js +4997 -0
  317. package/dist/es/scroll-area.js +4 -0
  318. package/dist/es/scroll-bar.js +40 -0
  319. package/dist/es/segmented-control-item.js +42 -0
  320. package/dist/es/segmented-control.js +41 -0
  321. package/dist/es/select-content.js +62 -0
  322. package/dist/es/select-group.js +4 -0
  323. package/dist/es/select-icon.js +26 -0
  324. package/dist/es/select-item.js +45 -0
  325. package/dist/es/select-label.js +33 -0
  326. package/dist/es/select-separator.js +27 -0
  327. package/dist/es/select-trigger.js +41 -0
  328. package/dist/es/select-value.js +32 -0
  329. package/dist/es/select.js +4 -0
  330. package/dist/es/shims.js +1 -0
  331. package/dist/es/slider.js +4 -0
  332. package/dist/es/social-button.js +46 -0
  333. package/dist/es/sonner-alert.js +42 -0
  334. package/dist/es/sonner.js +4 -0
  335. package/dist/es/status-badge.js +50 -0
  336. package/dist/es/switch.js +4 -0
  337. package/dist/es/tab-menu-content.js +33 -0
  338. package/dist/es/tab-menu-item.js +45 -0
  339. package/dist/es/tab-menu-list.js +35 -0
  340. package/dist/es/tab-menu.js +33 -0
  341. package/dist/es/text-input-affix.js +28 -0
  342. package/dist/es/text-input-button.js +32 -0
  343. package/dist/es/text-input.js +120 -0
  344. package/dist/es/textarea.js +57 -0
  345. package/dist/es/tooltip.js +116 -0
  346. package/dist/es/types.js +1 -0
  347. package/dist/es/use-color-model.js +6 -0
  348. package/dist/es/use-delegated-props.js +14 -0
  349. package/dist/es/use-user-select.js +39 -0
  350. package/dist/index.d.ts +5 -0
  351. package/dist/utils/color.d.ts +26 -0
  352. package/dist/utils/crypto.d.ts +1 -0
  353. package/dist/utils/index.d.ts +3 -0
  354. package/dist/utils/sonner.d.ts +19 -0
  355. package/package.json +15 -4
  356. package/src/components/index.ts +2 -0
  357. package/src/components/rich-editor/config.ts +150 -0
  358. package/src/components/rich-editor/extra-settings.vue +151 -0
  359. package/src/components/rich-editor/index.ts +2 -0
  360. package/src/components/rich-editor/link-bubble.vue +288 -0
  361. package/src/components/rich-editor/rich-editor.vue +428 -0
  362. package/src/components/rich-editor/stories/rich-editor.stories.ts +87 -0
  363. package/src/components/rich-editor/types.ts +21 -0
  364. package/src/components/sonner/index.ts +5 -0
  365. package/src/components/sonner/sonner-alert.vue +54 -0
  366. package/src/components/sonner/sonner.vue +13 -0
  367. package/src/components/sonner/stories/sonner.stories.ts +194 -0
  368. package/src/utils/index.ts +3 -0
  369. package/src/utils/sonner.ts +72 -0
@@ -0,0 +1,428 @@
1
+ <script setup lang="ts">
2
+ import type { ToolbarItem } from './types';
3
+ import CompactButton from '@/components/button/compact-button.vue';
4
+ import SelectContent from '@/components/select/select-content.vue';
5
+ import SelectIcon from '@/components/select/select-icon.vue';
6
+ import SelectItem from '@/components/select/select-item.vue';
7
+ import SelectTrigger from '@/components/select/select-trigger.vue';
8
+ import SelectValue from '@/components/select/select-value.vue';
9
+ import Select from '@/components/select/select.vue';
10
+ import Tooltip from '@/components/tooltip/tooltip.vue';
11
+ import Link from '@tiptap/extension-link';
12
+ import TextAlign from '@tiptap/extension-text-align';
13
+ import { TextStyleKit } from '@tiptap/extension-text-style';
14
+ import { CharacterCount, Placeholder } from '@tiptap/extensions';
15
+ import StarterKit from '@tiptap/starter-kit';
16
+ import { Editor, EditorContent } from '@tiptap/vue-3';
17
+ import { computed, onBeforeUnmount, onMounted, type PropType, ref, watch } from 'vue';
18
+ import { fullToolbar, onActionClick, selectedOption } from './config';
19
+ import ExtraSettings from './extra-settings.vue';
20
+ import LinkBubble from './link-bubble.vue';
21
+
22
+ const props = defineProps({
23
+ modelValue: {
24
+ type: String,
25
+ default: '',
26
+ },
27
+ placeholder: {
28
+ type: String,
29
+ default: '',
30
+ },
31
+ customToolbar: {
32
+ type: Array as PropType<string[]>,
33
+ default: () => [],
34
+ },
35
+ maxLimit: {
36
+ type: Number,
37
+ default: null,
38
+ },
39
+ showExtraSettings: {
40
+ type: Boolean,
41
+ default: true,
42
+ },
43
+ });
44
+
45
+ const emit = defineEmits(['update:modelValue']);
46
+
47
+ const filteredToolbar = computed(() => {
48
+ const customToolbar = props.customToolbar;
49
+
50
+ if (!customToolbar || customToolbar.length === 0) {
51
+ return fullToolbar.value;
52
+ }
53
+
54
+ const toolbarMap = new Map(
55
+ fullToolbar.value
56
+ .filter(item => item.type !== 'divider' && 'slug' in item)
57
+ .map(item => [item.slug!, item]),
58
+ );
59
+
60
+ return customToolbar
61
+ .map((key) => {
62
+ if (key === 'divider') {
63
+ return { type: 'divider' };
64
+ }
65
+
66
+ return toolbarMap.get(key);
67
+ })
68
+ .filter((item): item is ToolbarItem => Boolean(item));
69
+ });
70
+
71
+ const editor = ref<Editor | undefined>();
72
+ const showSetLinkFromToolbar = ref<boolean>(false);
73
+
74
+ function openLinkBubbleFromToolbar() {
75
+ showSetLinkFromToolbar.value = true;
76
+ }
77
+
78
+ const charactersCount = computed(() => editor.value?.storage.characterCount.characters() || 0);
79
+ const limitWarning = computed(() => {
80
+ const isCloseToMaxCharacter = charactersCount.value >= (props.maxLimit - 20);
81
+ const isMaxCharacter = charactersCount.value === props.maxLimit;
82
+
83
+ if (isCloseToMaxCharacter && !isMaxCharacter) {
84
+ return 'warning';
85
+ }
86
+
87
+ if (isMaxCharacter) {
88
+ return 'danger';
89
+ }
90
+
91
+ return '';
92
+ });
93
+
94
+ watch(() => props.modelValue, (value) => {
95
+ if (editor.value?.getHTML() === value) {
96
+ return;
97
+ }
98
+
99
+ editor.value?.commands.setContent(value);
100
+ });
101
+
102
+ onMounted(() => {
103
+ editor.value = new Editor({
104
+ content: props.modelValue,
105
+ extensions: [
106
+ StarterKit.configure({
107
+ link: false,
108
+ }),
109
+ Placeholder.configure({
110
+ placeholder: props.placeholder,
111
+ emptyEditorClass: 'is-editor-empty',
112
+ }),
113
+ TextStyleKit.configure({
114
+ color: {
115
+ types: ['textStyle'],
116
+ },
117
+ fontSize: {
118
+ types: ['textStyle'],
119
+ },
120
+ }),
121
+ TextAlign.configure({
122
+ types: ['heading', 'paragraph'],
123
+ }),
124
+ Link.configure({
125
+ openOnClick: false,
126
+ autolink: false,
127
+ HTMLAttributes: {
128
+ class: 'celeste-rich-editor-link',
129
+ rel: null,
130
+ },
131
+ }),
132
+ CharacterCount.configure({
133
+ limit: props.maxLimit,
134
+ }),
135
+ ],
136
+ onUpdate: () => {
137
+ emit('update:modelValue', editor.value?.getHTML() || '');
138
+ },
139
+ });
140
+ });
141
+
142
+ onBeforeUnmount(() => {
143
+ editor.value?.destroy();
144
+ });
145
+ </script>
146
+
147
+ <template>
148
+ <div v-if="editor" class="celeste-rich-editor">
149
+ <div class="toolbar">
150
+ <template v-for="(item, parentIndex) in filteredToolbar" :key="parentIndex">
151
+ <Tooltip
152
+ v-if="item.type !== 'divider' && !item.children"
153
+ :title="item.name"
154
+ variant="dark"
155
+ >
156
+ <CompactButton
157
+ :icon="`${item.icon}`"
158
+ variant="ghost"
159
+ :class="{ active: typeof item.active === 'string' && editor.isActive(item.active) }"
160
+ @click="onActionClick(editor, item.slug, null, openLinkBubbleFromToolbar)"
161
+ />
162
+ </Tooltip>
163
+
164
+ <Tooltip
165
+ v-else-if="item.type !== 'divider' && item.children"
166
+ :title="item.name"
167
+ variant="dark"
168
+ >
169
+ <div class="select-menu-wrapper">
170
+ <Select
171
+ :model-value="selectedOption(editor, item.children)"
172
+ @update:model-value="onActionClick(editor, item.slug, $event)"
173
+ >
174
+ <SelectTrigger variant="inline">
175
+ <SelectValue />
176
+ </SelectTrigger>
177
+ <SelectContent align="end" width="fit">
178
+ <SelectItem
179
+ v-for="(child, childIndex) in item.children"
180
+ :key="childIndex"
181
+ :value="child.option"
182
+ >
183
+ <template v-if="item.slug === 'color'">
184
+ <SelectIcon>
185
+ <i :class="child.icon" :style="{ background: child.option }" />
186
+ </SelectIcon>
187
+ <span>{{ child.name }}</span>
188
+ </template>
189
+ <template v-else-if="item.slug === 'align'">
190
+ <SelectIcon>
191
+ <i :class="child.icon" />
192
+ </SelectIcon>
193
+ </template>
194
+ <span v-else>{{ child.name }}</span>
195
+ </SelectItem>
196
+ </SelectContent>
197
+ </Select>
198
+ </div>
199
+ </Tooltip>
200
+
201
+ <div v-else class="divider" />
202
+ </template>
203
+
204
+ <div v-if="showExtraSettings" class="extra-settings-wrapper">
205
+ <div class="divider" />
206
+ <ExtraSettings
207
+ :editor="editor"
208
+ />
209
+ </div>
210
+ </div>
211
+
212
+ <div class="text-field">
213
+ <EditorContent
214
+ :editor="editor"
215
+ />
216
+ </div>
217
+ <div
218
+ v-if="maxLimit"
219
+ class="characters-count"
220
+ :class="{
221
+ warning: limitWarning === 'warning',
222
+ danger: limitWarning === 'danger',
223
+ }"
224
+ >
225
+ {{ charactersCount }}/{{ maxLimit }}
226
+ </div>
227
+ <LinkBubble
228
+ :editor="editor"
229
+ :show-set-link-from-toolbar="showSetLinkFromToolbar"
230
+ @set-link-closed="showSetLinkFromToolbar = false"
231
+ />
232
+ </div>
233
+ </template>
234
+
235
+ <style lang="scss" scoped>
236
+ .celeste-rich-editor {
237
+ position: relative;
238
+ border: 1px solid var(--color-stroke-soft-200);
239
+ border-radius: var(--spacing-12);
240
+ background: var(--color-bg-white-0);
241
+ box-shadow: var(--shadow-regular-xs);
242
+
243
+ .toolbar {
244
+ display: flex;
245
+ flex-wrap: wrap;
246
+ align-items: center;
247
+ padding: var(--spacing-4);
248
+ border-bottom: 1px solid var(--color-stroke-soft-200);
249
+ border-radius: var(--spacing-12) var(--spacing-12) 0 0;
250
+ background: var(--color-bg-white-0);
251
+ gap: var(--spacing-4);
252
+
253
+ &:deep(.celeste-cbutton:active) {
254
+ background-color: var(--color-bg-weak-50);
255
+ box-shadow: none;
256
+ color: var(--color-icon-strong-950);
257
+ }
258
+
259
+ .celeste-cbutton.active {
260
+ background-color: var(--color-neutral-100);
261
+ color: var(--color-icon-strong-950);
262
+ }
263
+
264
+ .divider {
265
+ width: 1px;
266
+ height: 16px;
267
+ margin: 0 3px;
268
+ background: var(--color-stroke-soft-200);
269
+ }
270
+
271
+ .extra-settings-wrapper {
272
+ display: flex;
273
+ align-items: center;
274
+ }
275
+ }
276
+
277
+ .text-field {
278
+ min-height: 88px;
279
+ margin: var(--spacing-12);
280
+ padding-inline-end: var(--spacing-12);
281
+ overflow-y: auto;
282
+ resize: vertical;
283
+
284
+ &:deep(.tiptap) {
285
+ min-height: 88px;
286
+ outline: none;
287
+
288
+ :first-child {
289
+ margin-top: 0;
290
+ }
291
+
292
+ p.is-editor-empty:first-child::before {
293
+ content: attr(data-placeholder);
294
+ height: 0;
295
+ color: var(--color-neutral-300);
296
+ pointer-events: none;
297
+ }
298
+
299
+ h1,
300
+ h2,
301
+ h3,
302
+ h4,
303
+ h5,
304
+ h6,
305
+ p {
306
+ margin-bottom: 0;
307
+ }
308
+
309
+ h1 {
310
+ margin-top: 40px;
311
+ font-size: 56px;
312
+ font-weight: 500;
313
+ letter-spacing: -0.01em;
314
+ line-height: 64px;
315
+ }
316
+
317
+ h2 {
318
+ margin-top: 36px;
319
+ font-size: 48px;
320
+ font-weight: 500;
321
+ letter-spacing: -0.01em;
322
+ line-height: 56px;
323
+ }
324
+
325
+ h3 {
326
+ margin-top: 32px;
327
+ font-size: 40px;
328
+ font-weight: 500;
329
+ letter-spacing: -0.01em;
330
+ line-height: 48px;
331
+ }
332
+
333
+ h4 {
334
+ margin-top: 20px;
335
+ font-size: 32px;
336
+ font-weight: 500;
337
+ letter-spacing: -0.005em;
338
+ line-height: 40px;
339
+ }
340
+
341
+ h5 {
342
+ margin-top: 20px;
343
+ font-size: 24px;
344
+ font-weight: 500;
345
+ letter-spacing: 0;
346
+ line-height: 32px;
347
+ }
348
+
349
+ h6 {
350
+ margin-top: 16px;
351
+ font-size: 20px;
352
+ font-weight: 500;
353
+ letter-spacing: 0;
354
+ line-height: 28px;
355
+ }
356
+
357
+ p {
358
+ margin-top: 12px;
359
+ font-size: 16px;
360
+ font-weight: 400;
361
+ letter-spacing: -0.011em;
362
+ line-height: 24px;
363
+ }
364
+
365
+ ul,
366
+ ol {
367
+ margin: 1.25rem 1rem 1.25rem 0.4rem;
368
+ padding: 0 1rem;
369
+
370
+ li p {
371
+ margin-top: 0.25em;
372
+ margin-bottom: 0.25em;
373
+ }
374
+ }
375
+
376
+ a {
377
+ color: var(--color-blue-700);
378
+ cursor: pointer;
379
+
380
+ &:hover {
381
+ color: var(--color-blue-500);
382
+ }
383
+ }
384
+ }
385
+ }
386
+
387
+ .characters-count {
388
+ position: absolute;
389
+ bottom: 7px;
390
+ inset-inline-end: 22px;
391
+ max-width: max-content;
392
+ padding: var(--spacing-4);
393
+ border-radius: var(--radius-4);
394
+ background: var(--color-bg-white-0);
395
+ color: var(--color-text-soft-400);
396
+ font: var(--subheading-xxs);
397
+
398
+ &.warning {
399
+ color: var(--color-state-warning-base);
400
+ }
401
+
402
+ &.danger {
403
+ color: var(--color-state-error-base);
404
+ }
405
+ }
406
+
407
+ .select-menu-wrapper {
408
+ padding: 0 var(--spacing-4);
409
+ }
410
+
411
+ &:dir(rtl) {
412
+ :deep(.i-celeste-arrow-go-back-line),
413
+ :deep(.i-celeste-arrow-go-forward-line) {
414
+ transform: scaleX(-1);
415
+ }
416
+ }
417
+
418
+ :deep(.tippy-box[data-theme='custom']) {
419
+ max-width: 400px !important;
420
+ }
421
+ }
422
+
423
+ .celeste-select-item[data-state='checked'] {
424
+ &:deep(.i-celeste-check-line) {
425
+ display: none;
426
+ }
427
+ }
428
+ </style>
@@ -0,0 +1,87 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3-vite';
2
+ import RichEditor from '../rich-editor.vue';
3
+
4
+ const meta: Meta<typeof RichEditor> = {
5
+ title: 'Components/RichEditor',
6
+ component: RichEditor,
7
+
8
+ argTypes: {
9
+ customToolbar: {
10
+ description: `An array of toolbar item slugs that defines the order and visibility of editor actions.
11
+ * item_slugs: [
12
+ 'heading',
13
+ 'fontSize',
14
+ 'color',
15
+ 'bold',
16
+ 'italic',
17
+ 'underline',
18
+ 'strike',
19
+ 'bulletList',
20
+ 'orderedList',
21
+ 'align',
22
+ 'link',
23
+ 'undo',
24
+ 'redo',
25
+ 'clear',
26
+ ]
27
+
28
+ * 'divider': use it for separation.
29
+
30
+ Example: ['bold', 'divider', 'color']
31
+ `,
32
+ },
33
+ showExtraSettings: {
34
+ description: 'Controls the visibility of the dropdown menu containing options like copy, cut, delete, and duplicate.',
35
+ },
36
+ },
37
+ };
38
+
39
+ export default meta;
40
+
41
+ type Story = StoryObj<typeof RichEditor>;
42
+
43
+ export const Default: Story = {
44
+ args: {
45
+ modelValue: '',
46
+ customToolbar: [],
47
+ },
48
+
49
+ render: args => ({
50
+ components: { RichEditor },
51
+ setup() {
52
+ return { args };
53
+ },
54
+ template: `
55
+ <RichEditor v-bind="args" />
56
+ `,
57
+ }),
58
+ };
59
+
60
+ export const CustomToolbar: Story = {
61
+ args: {
62
+ modelValue: '',
63
+ placeholder: 'Write something...',
64
+ customToolbar: [
65
+ 'heading',
66
+ 'divider',
67
+ 'fontSize',
68
+ 'divider',
69
+ 'bold',
70
+ 'underline',
71
+ 'divider',
72
+ 'align',
73
+ ],
74
+ maxLimit: 200,
75
+ showExtraSettings: false,
76
+ },
77
+
78
+ render: args => ({
79
+ components: { RichEditor },
80
+ setup() {
81
+ return { args };
82
+ },
83
+ template: `
84
+ <RichEditor v-bind="args" />
85
+ `,
86
+ }),
87
+ };
@@ -0,0 +1,21 @@
1
+ export interface ToolbarChildOption {
2
+ option: string;
3
+ name: string;
4
+ icon?: string;
5
+ active: string | Record<string, unknown>;
6
+ }
7
+
8
+ interface ToolbarAction {
9
+ type?: 'action';
10
+ slug: string;
11
+ name?: string;
12
+ icon?: string;
13
+ active?: string | Record<string, unknown>;
14
+ children?: ToolbarChildOption[];
15
+ }
16
+
17
+ interface ToolbarDivider {
18
+ type: 'divider';
19
+ }
20
+
21
+ export type ToolbarItem = ToolbarAction | ToolbarDivider;
@@ -0,0 +1,5 @@
1
+ export { default as SonnerAlert } from './sonner-alert.vue';
2
+ export * from './sonner-alert.vue';
3
+
4
+ export { default as Sonner } from './sonner.vue';
5
+ export * from './sonner.vue';
@@ -0,0 +1,54 @@
1
+ <script setup lang="ts">
2
+ import { Alert, type AlertProps } from '../alert';
3
+
4
+ export interface SonnerAlertProps extends /* @vue-ignore */ Partial<AlertProps> {
5
+ title: string;
6
+ description?: string;
7
+ onDismiss?: () => void;
8
+ }
9
+
10
+ const props = withDefaults(
11
+ defineProps<SonnerAlertProps>(),
12
+ {
13
+ size: 'lg',
14
+ variant: 'stroke',
15
+ state: 'success',
16
+ dismissable: true,
17
+ },
18
+ );
19
+
20
+ function handleDismiss(): void {
21
+ if (props.onDismiss) {
22
+ props.onDismiss();
23
+ }
24
+ }
25
+ </script>
26
+
27
+ <template>
28
+ <Alert
29
+ v-bind="props"
30
+ class="sonner-alert"
31
+ @dismiss="handleDismiss"
32
+ >
33
+ <template #title>
34
+ {{ props.title }}
35
+ </template>
36
+ <template v-if="props.description" #description>
37
+ {{ props.description }}
38
+ </template>
39
+ </Alert>
40
+ </template>
41
+
42
+ <style scoped>
43
+ .sonner-alert {
44
+ width: min(360px, calc(100vw - 32px));
45
+ min-width: 360px;
46
+ max-width: 360px;
47
+ }
48
+
49
+ @media (width <= 400px) {
50
+ .sonner-alert {
51
+ min-width: calc(100vw - 32px);
52
+ }
53
+ }
54
+ </style>
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { Toaster, type ToasterProps } from 'vue-sonner';
3
+
4
+ const props = defineProps<SonnerProps>();
5
+ </script>
6
+
7
+ <script lang="ts">
8
+ export interface SonnerProps extends ToasterProps {}
9
+ </script>
10
+
11
+ <template>
12
+ <Toaster v-bind="props" />
13
+ </template>