@datum-cloud/datum-ui 0.6.0 → 0.7.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 (252) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/dist/action-row-DnhBhMtt.mjs +22 -0
  4. package/dist/app-navigation/index.mjs +2 -2
  5. package/dist/{app-navigation-84ro28PU.mjs → app-navigation-D0EBWUwJ.mjs} +48 -3
  6. package/dist/autocomplete/index.mjs +1 -1
  7. package/dist/autocomplete-DdbTQe6u.mjs +141 -0
  8. package/dist/autosearch/index.mjs +100 -92
  9. package/dist/avatar-stack/index.mjs +1 -1
  10. package/dist/{avatar-stack-oVr8tsU7.mjs → avatar-stack-CDhlA1Nm.mjs} +1 -1
  11. package/dist/calendar/index.mjs +1 -1
  12. package/dist/{calendar-DEkCw7I1.mjs → calendar-C-Hbf74r.mjs} +4 -4
  13. package/dist/{calendar-date-picker-CDT-8Ha8.mjs → calendar-date-picker-BaykEs6j.mjs} +324 -240
  14. package/dist/code-editor/index.mjs +1 -1
  15. package/dist/components/base/date-picker/index.d.ts +4 -0
  16. package/dist/components/base/date-picker/index.d.ts.map +1 -0
  17. package/dist/components/base/date-picker/types.d.ts +7 -0
  18. package/dist/components/base/date-picker/types.d.ts.map +1 -0
  19. package/dist/components/base/date-picker/use-date-constraints.d.ts +8 -0
  20. package/dist/components/base/date-picker/use-date-constraints.d.ts.map +1 -0
  21. package/dist/components/base/index.d.ts +3 -0
  22. package/dist/components/base/index.d.ts.map +1 -1
  23. package/dist/components/base/mobile-sheet/context.d.ts +13 -0
  24. package/dist/components/base/mobile-sheet/context.d.ts.map +1 -0
  25. package/dist/components/base/mobile-sheet/index.d.ts +3 -0
  26. package/dist/components/base/mobile-sheet/index.d.ts.map +1 -0
  27. package/dist/components/base/mobile-sheet/mobile-sheet.d.ts +14 -0
  28. package/dist/components/base/mobile-sheet/mobile-sheet.d.ts.map +1 -0
  29. package/dist/components/base/option-picker/index.d.ts +5 -0
  30. package/dist/components/base/option-picker/index.d.ts.map +1 -0
  31. package/dist/components/base/option-picker/option-list.d.ts +3 -0
  32. package/dist/components/base/option-picker/option-list.d.ts.map +1 -0
  33. package/dist/components/base/option-picker/types.d.ts +71 -0
  34. package/dist/components/base/option-picker/types.d.ts.map +1 -0
  35. package/dist/components/base/option-picker/use-option-picker.d.ts +4 -0
  36. package/dist/components/base/option-picker/use-option-picker.d.ts.map +1 -0
  37. package/dist/components/base/responsive-dropdown/index.d.ts +2 -0
  38. package/dist/components/base/responsive-dropdown/index.d.ts.map +1 -0
  39. package/dist/components/base/responsive-dropdown/responsive-dropdown.d.ts +25 -0
  40. package/dist/components/base/responsive-dropdown/responsive-dropdown.d.ts.map +1 -0
  41. package/dist/components/base/responsive-popover/index.d.ts +2 -0
  42. package/dist/components/base/responsive-popover/index.d.ts.map +1 -0
  43. package/dist/components/base/responsive-popover/responsive-popover.d.ts +46 -0
  44. package/dist/components/base/responsive-popover/responsive-popover.d.ts.map +1 -0
  45. package/dist/components/base/tooltip/tooltip.d.ts.map +1 -1
  46. package/dist/components/features/app-navigation/app-navigation.d.ts +5 -3
  47. package/dist/components/features/app-navigation/app-navigation.d.ts.map +1 -1
  48. package/dist/components/features/autocomplete/autocomplete.d.ts +2 -2
  49. package/dist/components/features/autocomplete/autocomplete.d.ts.map +1 -1
  50. package/dist/components/features/autocomplete/autocomplete.types.d.ts +7 -16
  51. package/dist/components/features/autocomplete/autocomplete.types.d.ts.map +1 -1
  52. package/dist/components/features/autocomplete/trigger.d.ts +20 -0
  53. package/dist/components/features/autocomplete/trigger.d.ts.map +1 -0
  54. package/dist/components/features/autosearch/autosearch.d.ts +1 -1
  55. package/dist/components/features/autosearch/autosearch.d.ts.map +1 -1
  56. package/dist/components/features/autosearch/autosearch.types.d.ts +4 -0
  57. package/dist/components/features/autosearch/autosearch.types.d.ts.map +1 -1
  58. package/dist/components/features/calendar-date-picker/calendar-date-picker.d.ts +3 -37
  59. package/dist/components/features/calendar-date-picker/calendar-date-picker.d.ts.map +1 -1
  60. package/dist/components/features/calendar-date-picker/calendar-header.d.ts +13 -0
  61. package/dist/components/features/calendar-date-picker/calendar-header.d.ts.map +1 -0
  62. package/dist/components/features/calendar-date-picker/calendar-presets.d.ts +9 -0
  63. package/dist/components/features/calendar-date-picker/calendar-presets.d.ts.map +1 -0
  64. package/dist/components/features/calendar-date-picker/date-trigger.d.ts +24 -0
  65. package/dist/components/features/calendar-date-picker/date-trigger.d.ts.map +1 -0
  66. package/dist/components/features/calendar-date-picker/index.d.ts +2 -1
  67. package/dist/components/features/calendar-date-picker/index.d.ts.map +1 -1
  68. package/dist/components/features/calendar-date-picker/types.d.ts +42 -0
  69. package/dist/components/features/calendar-date-picker/types.d.ts.map +1 -0
  70. package/dist/components/features/calendar-date-picker/use-calendar-date-picker.d.ts +48 -0
  71. package/dist/components/features/calendar-date-picker/use-calendar-date-picker.d.ts.map +1 -0
  72. package/dist/components/features/data-table/components/row-actions.d.ts +1 -1
  73. package/dist/components/features/data-table/components/row-actions.d.ts.map +1 -1
  74. package/dist/components/features/data-table/filters/checkbox-filter.d.ts +1 -1
  75. package/dist/components/features/data-table/filters/checkbox-filter.d.ts.map +1 -1
  76. package/dist/components/features/data-table/filters/select-filter.d.ts +1 -1
  77. package/dist/components/features/data-table/filters/select-filter.d.ts.map +1 -1
  78. package/dist/components/features/data-table/types.d.ts +11 -12
  79. package/dist/components/features/data-table/types.d.ts.map +1 -1
  80. package/dist/components/features/date-time-picker/date-time-picker.d.ts +1 -1
  81. package/dist/components/features/date-time-picker/date-time-picker.d.ts.map +1 -1
  82. package/dist/components/features/date-time-picker/types.d.ts +23 -0
  83. package/dist/components/features/date-time-picker/types.d.ts.map +1 -1
  84. package/dist/components/features/form/components/form-combobox.d.ts +7 -44
  85. package/dist/components/features/form/components/form-combobox.d.ts.map +1 -1
  86. package/dist/components/features/form/components/form-dialog.d.ts +2 -1
  87. package/dist/components/features/form/components/form-dialog.d.ts.map +1 -1
  88. package/dist/components/features/form/components/form-field.d.ts +1 -1
  89. package/dist/components/features/form/components/form-field.d.ts.map +1 -1
  90. package/dist/components/features/form/types/index.d.ts +4 -0
  91. package/dist/components/features/form/types/index.d.ts.map +1 -1
  92. package/dist/components/features/index.d.ts +2 -0
  93. package/dist/components/features/index.d.ts.map +1 -1
  94. package/dist/components/features/more-actions/action-row.d.ts +9 -0
  95. package/dist/components/features/more-actions/action-row.d.ts.map +1 -0
  96. package/dist/components/features/more-actions/index.d.ts +3 -1
  97. package/dist/components/features/more-actions/index.d.ts.map +1 -1
  98. package/dist/components/features/more-actions/more-actions.d.ts +8 -14
  99. package/dist/components/features/more-actions/more-actions.d.ts.map +1 -1
  100. package/dist/components/features/more-actions/types.d.ts +24 -0
  101. package/dist/components/features/more-actions/types.d.ts.map +1 -0
  102. package/dist/components/features/multi-select/index.d.ts +3 -0
  103. package/dist/components/features/multi-select/index.d.ts.map +1 -0
  104. package/dist/components/features/multi-select/multi-select.d.ts +147 -0
  105. package/dist/components/features/multi-select/multi-select.d.ts.map +1 -0
  106. package/dist/components/features/page-title/page-title.d.ts.map +1 -1
  107. package/dist/components/features/rich-text-editor/index.d.ts +4 -0
  108. package/dist/components/features/rich-text-editor/index.d.ts.map +1 -0
  109. package/dist/components/features/rich-text-editor/rich-text-content.d.ts +3 -0
  110. package/dist/components/features/rich-text-editor/rich-text-content.d.ts.map +1 -0
  111. package/dist/components/features/rich-text-editor/rich-text-editor.d.ts +28 -0
  112. package/dist/components/features/rich-text-editor/rich-text-editor.d.ts.map +1 -0
  113. package/dist/components/features/rich-text-editor/toolbar/bold-toolbar.d.ts +2 -0
  114. package/dist/components/features/rich-text-editor/toolbar/bold-toolbar.d.ts.map +1 -0
  115. package/dist/components/features/rich-text-editor/toolbar/italic-toolbar.d.ts +2 -0
  116. package/dist/components/features/rich-text-editor/toolbar/italic-toolbar.d.ts.map +1 -0
  117. package/dist/components/features/rich-text-editor/toolbar/link-toolbar.d.ts +2 -0
  118. package/dist/components/features/rich-text-editor/toolbar/link-toolbar.d.ts.map +1 -0
  119. package/dist/components/features/rich-text-editor/toolbar/strike-toolbar.d.ts +2 -0
  120. package/dist/components/features/rich-text-editor/toolbar/strike-toolbar.d.ts.map +1 -0
  121. package/dist/components/features/rich-text-editor/toolbar/toolbar-button.d.ts +17 -0
  122. package/dist/components/features/rich-text-editor/toolbar/toolbar-button.d.ts.map +1 -0
  123. package/dist/components/features/rich-text-editor/toolbar/toolbar.d.ts +6 -0
  124. package/dist/components/features/rich-text-editor/toolbar/toolbar.d.ts.map +1 -0
  125. package/dist/components/features/rich-text-editor/toolbar/underline-toolbar.d.ts +2 -0
  126. package/dist/components/features/rich-text-editor/toolbar/underline-toolbar.d.ts.map +1 -0
  127. package/dist/components/features/rich-text-editor/types.d.ts +20 -0
  128. package/dist/components/features/rich-text-editor/types.d.ts.map +1 -0
  129. package/dist/components/features/tag-input/tag-input.d.ts +12 -1
  130. package/dist/components/features/tag-input/tag-input.d.ts.map +1 -1
  131. package/dist/components/features/task-queue/core/task-queue-dropdown.d.ts.map +1 -1
  132. package/dist/components/features/time-picker/time-picker.d.ts +1 -17
  133. package/dist/components/features/time-picker/time-picker.d.ts.map +1 -1
  134. package/dist/components/features/time-picker/types.d.ts +20 -18
  135. package/dist/components/features/time-picker/types.d.ts.map +1 -1
  136. package/dist/components/features/time-picker/use-time-slots.d.ts +10 -0
  137. package/dist/components/features/time-picker/use-time-slots.d.ts.map +1 -0
  138. package/dist/components/features/time-range-picker/components/absolute-range-panel.d.ts.map +1 -1
  139. package/dist/components/features/time-range-picker/time-range-picker.d.ts.map +1 -1
  140. package/dist/data-table/index.mjs +60 -175
  141. package/dist/date-picker/index.mjs +2 -2
  142. package/dist/date-time-picker/index.mjs +1 -1
  143. package/dist/{date-time-picker-BomrW07W.mjs → date-time-picker-DKOxrhmc.mjs} +64 -49
  144. package/dist/dropdown/index.mjs +109 -1
  145. package/dist/dropzone/index.mjs +1 -1
  146. package/dist/empty-content/index.mjs +1 -1
  147. package/dist/form/adapters/conform/index.mjs +2 -2
  148. package/dist/form/adapters/rhf/index.mjs +2 -2
  149. package/dist/form/index.mjs +2 -2
  150. package/dist/form/stepper/index.mjs +3 -3
  151. package/dist/{form-B3rQ4CH9.mjs → form-CCNN9VtJ.mjs} +27 -30
  152. package/dist/grid/index.mjs +1 -1
  153. package/dist/hooks/index.d.ts +1 -0
  154. package/dist/hooks/index.d.ts.map +1 -1
  155. package/dist/hooks/index.mjs +4 -3
  156. package/dist/hooks/use-breakpoint.d.ts +9 -0
  157. package/dist/hooks/use-breakpoint.d.ts.map +1 -0
  158. package/dist/index.mjs +48 -41
  159. package/dist/input-number/index.mjs +1 -1
  160. package/dist/loader-overlay/index.mjs +1 -1
  161. package/dist/map/index.mjs +1 -1
  162. package/dist/{map-CWIQ-eql.mjs → map-DRzZDNtB.mjs} +83 -4
  163. package/dist/mobile-sheet/index.mjs +2 -0
  164. package/dist/mobile-sheet-BxMvkzAj.mjs +61 -0
  165. package/dist/more-actions/index.mjs +3 -2
  166. package/dist/more-actions-Ca5qqd0H.mjs +49 -0
  167. package/dist/multi-select/index.mjs +2 -0
  168. package/dist/multi-select-DM_dxnSV.mjs +235 -0
  169. package/dist/page-title/index.mjs +1 -1
  170. package/dist/{page-title-ChsnpBiH.mjs → page-title-ChLiv6gB.mjs} +3 -2
  171. package/dist/popover/index.mjs +1 -1
  172. package/dist/radio-group/index.mjs +1 -1
  173. package/dist/responsive-dropdown/index.mjs +2 -0
  174. package/dist/responsive-dropdown-IFroDgKn.mjs +53 -0
  175. package/dist/responsive-popover/index.mjs +2 -0
  176. package/dist/responsive-popover-D-t9bxSN.mjs +61 -0
  177. package/dist/rich-text-editor/index.mjs +2 -0
  178. package/dist/rich-text-editor-CQH_U4T5.mjs +293 -0
  179. package/dist/select/index.mjs +1 -1
  180. package/dist/sheet/index.mjs +2 -2
  181. package/dist/{sheet-BzXksqYY.mjs → sheet-LhUgozvg.mjs} +1 -1
  182. package/dist/sidebar/index.mjs +1 -1
  183. package/dist/{sidebar-BnhnjvfO.mjs → sidebar-B8LQJiNI.mjs} +3 -3
  184. package/dist/skeleton/index.mjs +1 -1
  185. package/dist/{skeleton-D1MUhAVo.mjs → skeleton-D4HOEiOZ.mjs} +1 -1
  186. package/dist/spinner/index.mjs +1 -1
  187. package/dist/stepper/index.mjs +1 -1
  188. package/dist/styles/canela.css +23 -0
  189. package/dist/styles/fonts/CanelaText-Regular.ttf +0 -0
  190. package/dist/styles/tokens/figma-tokens.css +4 -0
  191. package/dist/switch/index.mjs +1 -1
  192. package/dist/table/index.mjs +1 -1
  193. package/dist/tag-input/index.mjs +1 -1
  194. package/dist/{tag-input-T9cUX9-G.mjs → tag-input-Bf4GMptp.mjs} +29 -14
  195. package/dist/task-queue/index.mjs +1 -1
  196. package/dist/{task-queue-dropdown-Wcbj-f0V.mjs → task-queue-dropdown-D-LncEWm.mjs} +39 -39
  197. package/dist/textarea/index.mjs +1 -1
  198. package/dist/theme/index.mjs +1 -1
  199. package/dist/time-picker/index.mjs +1 -1
  200. package/dist/time-picker-BZF5jbF6.mjs +99 -0
  201. package/dist/{to-api-format-Bh3c01gr.mjs → to-api-format-CgKcC9SK.mjs} +144 -119
  202. package/dist/toast/index.mjs +2 -2
  203. package/dist/{toast-DpxlFNNx.mjs → toast-DDdLgY53.mjs} +1 -1
  204. package/dist/tooltip/index.mjs +1 -1
  205. package/dist/{tooltip-Cruvl5F6.mjs → tooltip-a7NTDCWw.mjs} +74 -17
  206. package/dist/transfer/index.mjs +1 -1
  207. package/dist/{types-BZNk3q65.mjs → types-CKIe2WlV.mjs} +2 -2
  208. package/dist/typography/index.mjs +1 -1
  209. package/dist/use-breakpoint-DGcVmB3c.mjs +36 -0
  210. package/dist/{use-copy-to-clipboard-uNeeVHC4.mjs → use-copy-to-clipboard-D7KyLIAt.mjs} +1 -1
  211. package/dist/use-date-constraints-R3H4lIoT.mjs +41 -0
  212. package/dist/use-option-picker-BXQOfyrK.mjs +215 -0
  213. package/dist/visually-hidden/index.mjs +1 -1
  214. package/package.json +63 -8
  215. package/dist/autocomplete-CkYJueBL.mjs +0 -293
  216. package/dist/combobox/index.mjs +0 -2
  217. package/dist/combobox-B-C9lJeD.mjs +0 -97
  218. package/dist/components/features/combobox/combobox.d.ts +0 -27
  219. package/dist/components/features/combobox/combobox.d.ts.map +0 -1
  220. package/dist/components/features/combobox/index.d.ts +0 -3
  221. package/dist/components/features/combobox/index.d.ts.map +0 -1
  222. package/dist/components/features/combobox/types.d.ts +0 -84
  223. package/dist/components/features/combobox/types.d.ts.map +0 -1
  224. package/dist/dropdown-DZiAt-jS.mjs +0 -110
  225. package/dist/dropdown-menu-lALvDnab.mjs +0 -85
  226. package/dist/more-actions-ILnEZq_E.mjs +0 -52
  227. package/dist/time-picker-BoF7pZZ2.mjs +0 -43
  228. /package/dist/{adapter-context-rWveHhDd.mjs → adapter-context-NyGTDZYq.mjs} +0 -0
  229. /package/dist/{col-1T0Q3SlH.mjs → col-DISdGlqY.mjs} +0 -0
  230. /package/dist/{dropzone-ogtpQ4fy.mjs → dropzone-Bt0plEuw.mjs} +0 -0
  231. /package/dist/{empty-content-C63GPJ5d.mjs → empty-content-CBh5bbtJ.mjs} +0 -0
  232. /package/dist/{form-context-Ccxm-wqL.mjs → form-context-CeKyvO-A.mjs} +0 -0
  233. /package/dist/{hooks-D8r2M2U6.mjs → hooks-DQXVwbrs.mjs} +0 -0
  234. /package/dist/{input-number-a7uydAsw.mjs → input-number-Diu-C6d5.mjs} +0 -0
  235. /package/dist/{loader-overlay-BTFdkp7W.mjs → loader-overlay-C2WDla6V.mjs} +0 -0
  236. /package/dist/{map-leaflet-imports-CRSKA79m.mjs → map-leaflet-imports-BkUrNU37.mjs} +0 -0
  237. /package/dist/{popover-FJAcbYoH.mjs → popover-JOuXJOZ2.mjs} +0 -0
  238. /package/dist/{radio-group-CiITR0LO.mjs → radio-group-70UjJBb5.mjs} +0 -0
  239. /package/dist/{select-CiLR_DiQ.mjs → select-zxwykvQn.mjs} +0 -0
  240. /package/dist/{sheet-Di3b-oPu.mjs → sheet-DVEToCVY.mjs} +0 -0
  241. /package/dist/{skeleton-BKl4mfJt.mjs → skeleton-D2xuJdE1.mjs} +0 -0
  242. /package/dist/{spinner-OyOf9-Yu.mjs → spinner-CgPI3DDi.mjs} +0 -0
  243. /package/dist/{stepper-DvIOp0hh.mjs → stepper-Beb-zbdL.mjs} +0 -0
  244. /package/dist/{switch-DQJQhPIQ.mjs → switch-DcSF42Kc.mjs} +0 -0
  245. /package/dist/{table-Cdsh-39-.mjs → table-DWGT4cqh.mjs} +0 -0
  246. /package/dist/{textarea-BwD-MmTV.mjs → textarea-BoChBcFz.mjs} +0 -0
  247. /package/dist/{themes-DG1md8FI.mjs → themes-CAiN4b6G.mjs} +0 -0
  248. /package/dist/{toast-BWnN5fax.mjs → toast-D5XD7goD.mjs} +0 -0
  249. /package/dist/{transfer-46C-rFFW.mjs → transfer-CoGPwOc6.mjs} +0 -0
  250. /package/dist/{typography-ClB8k55E.mjs → typography-TRKP_CLT.mjs} +0 -0
  251. /package/dist/{use-display-touched-I39aXEBD.mjs → use-display-touched-8VGszCqj.mjs} +0 -0
  252. /package/dist/{visuallyhidden-BLUsJpYH.mjs → visuallyhidden-BHOPczmW.mjs} +0 -0
@@ -0,0 +1,293 @@
1
+ import { t as cn } from "./cn-D2KYQ917.mjs";
2
+ import { t as Button } from "./button-BllvE9Lm.mjs";
3
+ import { t as Icon } from "./icon-wrapper-DuLp3RM1.mjs";
4
+ import { t as Input } from "./input-FKGqZypx.mjs";
5
+ import { t as ResponsivePopover } from "./responsive-popover-D-t9bxSN.mjs";
6
+ import { t as Tooltip } from "./tooltip-a7NTDCWw.mjs";
7
+ import { BoldIcon, ItalicIcon, LinkIcon, StrikethroughIcon, UnderlineIcon, UnlinkIcon } from "lucide-react";
8
+ import { createContext, use, useCallback, useState } from "react";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ import DOMPurify from "isomorphic-dompurify";
11
+ import CharacterCount from "@tiptap/extension-character-count";
12
+ import Link from "@tiptap/extension-link";
13
+ import Placeholder from "@tiptap/extension-placeholder";
14
+ import Underline from "@tiptap/extension-underline";
15
+ import { EditorContent, useEditor } from "@tiptap/react";
16
+ import StarterKit from "@tiptap/starter-kit";
17
+ //#region src/components/features/rich-text-editor/rich-text-content.tsx
18
+ const SANITIZE_CONFIG = {
19
+ ALLOWED_TAGS: [
20
+ "strong",
21
+ "em",
22
+ "u",
23
+ "s",
24
+ "a",
25
+ "p",
26
+ "br"
27
+ ],
28
+ ALLOWED_ATTR: [
29
+ "href",
30
+ "target",
31
+ "rel"
32
+ ]
33
+ };
34
+ /**
35
+ * Post-sanitization: normalizes link hrefs and ensures safe attributes.
36
+ * Applied AFTER DOMPurify so we only touch already-clean HTML.
37
+ */
38
+ function normalizeLinks(html) {
39
+ return html.replace(/<a\s([^>]*)>/g, (_match, attrs) => {
40
+ let normalized = attrs;
41
+ normalized = normalized.replace(/href="(?!https?:\/\/|mailto:)([^"]+)"/, "href=\"https://$1\"");
42
+ if (!normalized.includes("target=")) normalized += " target=\"_blank\"";
43
+ if (!normalized.includes("rel=")) normalized += " rel=\"noopener noreferrer\"";
44
+ return `<a ${normalized}>`;
45
+ });
46
+ }
47
+ function RichTextContent({ content, className }) {
48
+ if (!content) return null;
49
+ const withSafeLinks = normalizeLinks(DOMPurify.sanitize(content, SANITIZE_CONFIG));
50
+ return /* @__PURE__ */ jsx("div", {
51
+ className: cn("prose prose-sm dark:prose-invert max-w-none", "[&_a]:text-primary text-sm [&_a]:underline [&_p]:my-1 [&_p:empty]:min-h-[1em]", className),
52
+ dangerouslySetInnerHTML: { __html: withSafeLinks }
53
+ });
54
+ }
55
+ //#endregion
56
+ //#region src/components/features/rich-text-editor/toolbar/toolbar-button.tsx
57
+ function ToolbarButton({ ref, active, disabled, onClick, tooltip, children, className }) {
58
+ const button = /* @__PURE__ */ jsx("button", {
59
+ ref,
60
+ type: "button",
61
+ onMouseDown: (e) => {
62
+ e.preventDefault();
63
+ },
64
+ onClick,
65
+ disabled,
66
+ className: cn("flex h-7 w-7 items-center justify-center rounded", "text-muted-foreground hover:bg-accent hover:text-accent-foreground", "disabled:pointer-events-none disabled:opacity-50", "transition-colors", active && "bg-accent text-accent-foreground", className),
67
+ children
68
+ });
69
+ if (!tooltip) return button;
70
+ return /* @__PURE__ */ jsx(Tooltip, {
71
+ message: tooltip,
72
+ children: button
73
+ });
74
+ }
75
+ ToolbarButton.displayName = "ToolbarButton";
76
+ //#endregion
77
+ //#region src/components/features/rich-text-editor/toolbar/bold-toolbar.tsx
78
+ function BoldToolbar() {
79
+ const { editor } = useRichTextEditor();
80
+ return /* @__PURE__ */ jsx(ToolbarButton, {
81
+ active: editor?.isActive("bold"),
82
+ disabled: !editor?.can().toggleBold(),
83
+ onClick: () => editor?.chain().focus().toggleBold().run(),
84
+ tooltip: "Bold",
85
+ shortcut: "⌘B",
86
+ children: /* @__PURE__ */ jsx(BoldIcon, { className: "h-4 w-4" })
87
+ });
88
+ }
89
+ //#endregion
90
+ //#region src/components/features/rich-text-editor/toolbar/italic-toolbar.tsx
91
+ function ItalicToolbar() {
92
+ const { editor } = useRichTextEditor();
93
+ return /* @__PURE__ */ jsx(ToolbarButton, {
94
+ active: editor?.isActive("italic"),
95
+ disabled: !editor?.can().toggleItalic(),
96
+ onClick: () => editor?.chain().focus().toggleItalic().run(),
97
+ tooltip: "Italic",
98
+ shortcut: "⌘I",
99
+ children: /* @__PURE__ */ jsx(ItalicIcon, { className: "h-4 w-4" })
100
+ });
101
+ }
102
+ //#endregion
103
+ //#region src/components/features/rich-text-editor/toolbar/link-toolbar.tsx
104
+ function normalizeUrl(input) {
105
+ const trimmed = input.trim();
106
+ if (!trimmed) return trimmed;
107
+ if (/^https?:\/\/|^mailto:/i.test(trimmed)) return trimmed;
108
+ if (trimmed.includes("@") && !trimmed.includes(" ")) return `mailto:${trimmed}`;
109
+ return `https://${trimmed}`;
110
+ }
111
+ function LinkToolbar() {
112
+ const { editor } = useRichTextEditor();
113
+ const [open, setOpen] = useState(false);
114
+ const [url, setUrl] = useState("");
115
+ const isActive = editor?.isActive("link");
116
+ const handleSubmit = useCallback((e) => {
117
+ e.preventDefault();
118
+ const href = normalizeUrl(url);
119
+ if (!href) return;
120
+ editor?.chain().focus().extendMarkRange("link").setLink({ href }).run();
121
+ setUrl("");
122
+ setOpen(false);
123
+ }, [editor, url]);
124
+ const handleUnlink = useCallback(() => {
125
+ editor?.chain().focus().unsetLink().run();
126
+ }, [editor]);
127
+ if (isActive) return /* @__PURE__ */ jsx(ToolbarButton, {
128
+ active: true,
129
+ onClick: handleUnlink,
130
+ tooltip: "Remove link",
131
+ children: /* @__PURE__ */ jsx(Icon, {
132
+ icon: UnlinkIcon,
133
+ className: "size-4"
134
+ })
135
+ });
136
+ return /* @__PURE__ */ jsx(ResponsivePopover, {
137
+ open,
138
+ onOpenChange: setOpen,
139
+ sheetTitle: "Insert link",
140
+ align: "start",
141
+ side: "bottom",
142
+ contentClassName: "w-80 p-3",
143
+ trigger: /* @__PURE__ */ jsx(ToolbarButton, {
144
+ tooltip: "Add link",
145
+ shortcut: "⌘K",
146
+ children: /* @__PURE__ */ jsx(Icon, {
147
+ icon: LinkIcon,
148
+ className: "size-4"
149
+ })
150
+ }),
151
+ children: /* @__PURE__ */ jsx("div", {
152
+ className: "p-4 sm:p-0",
153
+ children: /* @__PURE__ */ jsxs("form", {
154
+ onSubmit: handleSubmit,
155
+ className: "flex gap-2",
156
+ children: [/* @__PURE__ */ jsx(Input, {
157
+ type: "url",
158
+ value: url,
159
+ onChange: (e) => setUrl(e.target.value),
160
+ placeholder: "https://example.com",
161
+ className: "h-7 flex-1",
162
+ autoFocus: true
163
+ }), /* @__PURE__ */ jsx(Button, {
164
+ type: "primary",
165
+ size: "xs",
166
+ className: "h-7",
167
+ onClick: handleSubmit,
168
+ children: "Add"
169
+ })]
170
+ })
171
+ })
172
+ });
173
+ }
174
+ //#endregion
175
+ //#region src/components/features/rich-text-editor/toolbar/strike-toolbar.tsx
176
+ function StrikeToolbar() {
177
+ const { editor } = useRichTextEditor();
178
+ return /* @__PURE__ */ jsx(ToolbarButton, {
179
+ active: editor?.isActive("strike"),
180
+ disabled: !editor?.can().toggleStrike(),
181
+ onClick: () => editor?.chain().focus().toggleStrike().run(),
182
+ tooltip: "Strikethrough",
183
+ shortcut: "⌘⇧S",
184
+ children: /* @__PURE__ */ jsx(StrikethroughIcon, { className: "h-4 w-4" })
185
+ });
186
+ }
187
+ //#endregion
188
+ //#region src/components/features/rich-text-editor/toolbar/toolbar.tsx
189
+ function Toolbar({ children, className }) {
190
+ return /* @__PURE__ */ jsx("div", {
191
+ className: cn("border-input-border flex items-center gap-0.5 border-b px-2 py-1", className),
192
+ children
193
+ });
194
+ }
195
+ function ToolbarSeparator() {
196
+ return /* @__PURE__ */ jsx("div", { className: "bg-input-border mx-1 h-5 w-px" });
197
+ }
198
+ //#endregion
199
+ //#region src/components/features/rich-text-editor/toolbar/underline-toolbar.tsx
200
+ function UnderlineToolbar() {
201
+ const { editor } = useRichTextEditor();
202
+ return /* @__PURE__ */ jsx(ToolbarButton, {
203
+ active: editor?.isActive("underline"),
204
+ disabled: !editor?.can().toggleUnderline(),
205
+ onClick: () => editor?.chain().focus().toggleUnderline().run(),
206
+ tooltip: "Underline",
207
+ shortcut: "⌘U",
208
+ children: /* @__PURE__ */ jsx(UnderlineIcon, { className: "h-4 w-4" })
209
+ });
210
+ }
211
+ //#endregion
212
+ //#region src/components/features/rich-text-editor/rich-text-editor.tsx
213
+ const RichTextEditorContext = createContext({ editor: null });
214
+ function useRichTextEditor() {
215
+ return use(RichTextEditorContext);
216
+ }
217
+ function RichTextEditorRoot({ content, onChange, onBlur, autoFocus = false, placeholder, disabled = false, children, className }) {
218
+ return /* @__PURE__ */ jsx(RichTextEditorContext, {
219
+ value: { editor: useEditor({
220
+ extensions: [
221
+ StarterKit.configure({
222
+ heading: false,
223
+ codeBlock: false,
224
+ code: false,
225
+ blockquote: false,
226
+ bulletList: false,
227
+ orderedList: false,
228
+ listItem: false,
229
+ horizontalRule: false
230
+ }),
231
+ Underline,
232
+ Link.configure({
233
+ autolink: true,
234
+ openOnClick: false,
235
+ validate: (url) => /^https?:\/\/|^mailto:/.test(url),
236
+ HTMLAttributes: {
237
+ target: "_blank",
238
+ rel: "noopener noreferrer"
239
+ }
240
+ }),
241
+ Placeholder.configure({ placeholder: placeholder ?? "Write something..." }),
242
+ CharacterCount.configure({ limit: void 0 })
243
+ ],
244
+ content: content ?? "",
245
+ editable: !disabled,
246
+ autofocus: autoFocus ? "end" : false,
247
+ onUpdate: ({ editor: ed }) => {
248
+ const text = ed.getText().trim();
249
+ onChange?.(text ? ed.getHTML() : "");
250
+ },
251
+ onBlur: () => {
252
+ onBlur?.();
253
+ },
254
+ editorProps: { attributes: { class: cn("prose prose-sm dark:prose-invert max-w-none", "min-h-[100px] px-3 py-2 text-sm", "focus:outline-none", "[&_p]:my-1 [&_a]:text-primary [&_a]:underline") } }
255
+ }) },
256
+ children: /* @__PURE__ */ jsx("div", {
257
+ className: cn("rounded-lg", "bg-input-background/50", "text-input-foreground", "border-input-border border", "placeholder:text-input-placeholder", className),
258
+ children
259
+ })
260
+ });
261
+ }
262
+ function Content({ className }) {
263
+ const { editor } = useRichTextEditor();
264
+ return /* @__PURE__ */ jsx(EditorContent, {
265
+ editor,
266
+ className: cn("rich-text-content", className)
267
+ });
268
+ }
269
+ function CharCount({ maxLength }) {
270
+ const { editor } = useRichTextEditor();
271
+ if (!editor) return null;
272
+ const count = editor.storage.characterCount?.characters() ?? 0;
273
+ return /* @__PURE__ */ jsx("div", {
274
+ className: "flex justify-end px-3 py-1",
275
+ children: /* @__PURE__ */ jsxs("span", {
276
+ className: cn("text-muted-foreground text-xs", maxLength && count > maxLength && "text-destructive"),
277
+ children: [count, maxLength ? ` / ${maxLength}` : ""]
278
+ })
279
+ });
280
+ }
281
+ const RichTextEditor = Object.assign(RichTextEditorRoot, {
282
+ Toolbar,
283
+ Content,
284
+ CharacterCount: CharCount,
285
+ Bold: BoldToolbar,
286
+ Italic: ItalicToolbar,
287
+ Underline: UnderlineToolbar,
288
+ Strike: StrikeToolbar,
289
+ Link: LinkToolbar,
290
+ Separator: ToolbarSeparator
291
+ });
292
+ //#endregion
293
+ export { useRichTextEditor as n, RichTextContent as r, RichTextEditor as t };
@@ -1,2 +1,2 @@
1
- import { a as SelectLabel, c as SelectSeparator, i as SelectItem, l as SelectTrigger, n as SelectContent, o as SelectScrollDownButton, r as SelectGroup, s as SelectScrollUpButton, t as Select, u as SelectValue } from "../select-CiLR_DiQ.mjs";
1
+ import { a as SelectLabel, c as SelectSeparator, i as SelectItem, l as SelectTrigger, n as SelectContent, o as SelectScrollDownButton, r as SelectGroup, s as SelectScrollUpButton, t as Select, u as SelectValue } from "../select-zxwykvQn.mjs";
2
2
  export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue };
@@ -1,3 +1,3 @@
1
- import { a as SheetHeader, i as SheetFooter, o as SheetTitle, r as SheetDescription, s as SheetTrigger } from "../sheet-Di3b-oPu.mjs";
2
- import { i as SheetOverlay, n as SheetClose, r as SheetContent, t as Sheet } from "../sheet-BzXksqYY.mjs";
1
+ import { a as SheetHeader, i as SheetFooter, o as SheetTitle, r as SheetDescription, s as SheetTrigger } from "../sheet-DVEToCVY.mjs";
2
+ import { i as SheetOverlay, n as SheetClose, r as SheetContent, t as Sheet } from "../sheet-LhUgozvg.mjs";
3
3
  export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetTitle, SheetTrigger };
@@ -1,6 +1,6 @@
1
1
  import { t as cn } from "./cn-D2KYQ917.mjs";
2
2
  import { t as CloseIcon } from "./close.icon-HCfS4Y-N.mjs";
3
- import { a as SheetHeader, i as SheetFooter, o as SheetTitle, r as SheetDescription, s as SheetTrigger, t as Sheet$1 } from "./sheet-Di3b-oPu.mjs";
3
+ import { a as SheetHeader, i as SheetFooter, o as SheetTitle, r as SheetDescription, s as SheetTrigger, t as Sheet$1 } from "./sheet-DVEToCVY.mjs";
4
4
  import "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import * as SheetPrimitive from "@radix-ui/react-dialog";
@@ -1,2 +1,2 @@
1
- import { C as SidebarTrigger, S as SidebarSeparator, _ as SidebarMenuSub, a as SidebarGroupAction, b as SidebarProvider, c as SidebarHeader, d as SidebarMenu, f as SidebarMenuAction, g as SidebarMenuSkeleton, h as SidebarMenuItem, i as SidebarGroup, l as SidebarInput, m as SidebarMenuButton, n as SidebarContent, o as SidebarGroupContent, p as SidebarMenuBadge, r as SidebarFooter, s as SidebarGroupLabel, t as Sidebar, u as SidebarInset, v as SidebarMenuSubButton, w as useSidebar, x as SidebarRail, y as SidebarMenuSubItem } from "../sidebar-BnhnjvfO.mjs";
1
+ import { C as SidebarTrigger, S as SidebarSeparator, _ as SidebarMenuSub, a as SidebarGroupAction, b as SidebarProvider, c as SidebarHeader, d as SidebarMenu, f as SidebarMenuAction, g as SidebarMenuSkeleton, h as SidebarMenuItem, i as SidebarGroup, l as SidebarInput, m as SidebarMenuButton, n as SidebarContent, o as SidebarGroupContent, p as SidebarMenuBadge, r as SidebarFooter, s as SidebarGroupLabel, t as Sidebar, u as SidebarInset, v as SidebarMenuSubButton, w as useSidebar, x as SidebarRail, y as SidebarMenuSubItem } from "../sidebar-B8LQJiNI.mjs";
2
2
  export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar };
@@ -3,9 +3,9 @@ import { t as Separator } from "./separator-DXVTncCK.mjs";
3
3
  import { t as Button } from "./button-D3RrsMfQ.mjs";
4
4
  import { t as Icon } from "./icon-wrapper-DuLp3RM1.mjs";
5
5
  import { t as Input } from "./input-FKGqZypx.mjs";
6
- import { a as SheetHeader, n as SheetContent, o as SheetTitle, r as SheetDescription, t as Sheet } from "./sheet-Di3b-oPu.mjs";
7
- import { t as Skeleton } from "./skeleton-BKl4mfJt.mjs";
8
- import { i as TooltipProvider, t as Tooltip } from "./tooltip-Cruvl5F6.mjs";
6
+ import { a as SheetHeader, n as SheetContent, o as SheetTitle, r as SheetDescription, t as Sheet } from "./sheet-DVEToCVY.mjs";
7
+ import { t as Skeleton } from "./skeleton-D2xuJdE1.mjs";
8
+ import { i as TooltipProvider, t as Tooltip } from "./tooltip-a7NTDCWw.mjs";
9
9
  import { cva } from "class-variance-authority";
10
10
  import { PanelLeftCloseIcon, PanelLeftOpenIcon } from "lucide-react";
11
11
  import * as React$1 from "react";
@@ -1,2 +1,2 @@
1
- import { t as Skeleton } from "../skeleton-D1MUhAVo.mjs";
1
+ import { t as Skeleton } from "../skeleton-D4HOEiOZ.mjs";
2
2
  export { Skeleton };
@@ -1,5 +1,5 @@
1
1
  import { t as cn } from "./cn-D2KYQ917.mjs";
2
- import { t as Skeleton$1 } from "./skeleton-BKl4mfJt.mjs";
2
+ import { t as Skeleton$1 } from "./skeleton-D2xuJdE1.mjs";
3
3
  import "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/components/base/skeleton/skeleton.tsx
@@ -1,2 +1,2 @@
1
- import { t as Spinner } from "../spinner-OyOf9-Yu.mjs";
1
+ import { t as Spinner } from "../spinner-CgPI3DDi.mjs";
2
2
  export { Spinner };
@@ -1,2 +1,2 @@
1
- import { t as defineStepper } from "../stepper-DvIOp0hh.mjs";
1
+ import { t as defineStepper } from "../stepper-Beb-zbdL.mjs";
2
2
  export { defineStepper };
@@ -0,0 +1,23 @@
1
+ /* Optional Canela Text title font.
2
+ *
3
+ * Import this file to opt into Datum's Canela Text typography for
4
+ * titles. Without it, the font-title utility falls back to the
5
+ * system sans stack declared in tokens/figma-tokens.css.
6
+ *
7
+ * Usage:
8
+ * import '@datum-cloud/datum-ui/styles/canela'
9
+ */
10
+
11
+ @font-face {
12
+ font-family: 'Canela Text';
13
+ src: url('./fonts/CanelaText-Regular.ttf') format('truetype');
14
+ font-weight: 400;
15
+ font-style: normal;
16
+ font-display: swap;
17
+ }
18
+
19
+ :root {
20
+ --font-title:
21
+ 'Canela Text', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
22
+ 'Noto Color Emoji';
23
+ }
@@ -125,6 +125,10 @@
125
125
  --potted-olive: oklch(0.776 0.02 152.7); /* #c2ddb6 */
126
126
  --white: oklch(1 0 0); /* #ffffff */
127
127
 
128
+ /* Title font — default fallback. Consumers opt into Canela via
129
+ * @datum-cloud/datum-ui/styles/canela, which overrides this via :root. */
130
+ --font-title: ui-sans-serif, system-ui, sans-serif;
131
+
128
132
  /* Collection: Typography */
129
133
  --app-body-font-family: var(--font-families-alliance);
130
134
  --app-body-font-size: var(--text-sizes-13px);
@@ -1,2 +1,2 @@
1
- import { t as Switch } from "../switch-DQJQhPIQ.mjs";
1
+ import { t as Switch } from "../switch-DcSF42Kc.mjs";
2
2
  export { Switch };
@@ -1,2 +1,2 @@
1
- import { a as TableFooter, c as TableRow, i as TableCell, n as TableBody, o as TableHead, r as TableCaption, s as TableHeader, t as Table } from "../table-Cdsh-39-.mjs";
1
+ import { a as TableFooter, c as TableRow, i as TableCell, n as TableBody, o as TableHead, r as TableCaption, s as TableHeader, t as Table } from "../table-DWGT4cqh.mjs";
2
2
  export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow };
@@ -1,2 +1,2 @@
1
- import { t as TagsInput } from "../tag-input-T9cUX9-G.mjs";
1
+ import { t as TagsInput } from "../tag-input-Bf4GMptp.mjs";
2
2
  export { TagsInput };
@@ -18,8 +18,10 @@ const SPLITTER_REGEX = /[\n\t;,|]+/;
18
18
  * Preserves alphanumeric characters, dots, @, hyphens, and underscores
19
19
  */
20
20
  const FORMATTING_REGEX = /^[\s"'<>]+|[\s"'<>]+$/g;
21
+ /** Default keys that confirm the current input as a tag */
22
+ const DEFAULT_DELIMITERS = ["Enter", ","];
21
23
  const TagInputContext = React.createContext(null);
22
- function TagsInput({ ref, value, onValueChange, placeholder, maxItems, minItems, className, dir, validator, onValidationError, error, showValidationErrors = true, name, key, ...props }) {
24
+ function TagsInput({ ref, value, onValueChange, placeholder, maxItems, minItems, className, dir, delimiters = DEFAULT_DELIMITERS, normalizer, validator, onValidationError, error, showValidationErrors = true, name, key, ...props }) {
23
25
  const [activeIndex, setActiveIndex] = React.useState(-1);
24
26
  const [inputValue, setInputValue] = React.useState("");
25
27
  const [disableInput, setDisableInput] = React.useState(false);
@@ -35,8 +37,10 @@ function TagsInput({ ref, value, onValueChange, placeholder, maxItems, minItems,
35
37
  if (onValidationError) onValidationError(errorMessage);
36
38
  };
37
39
  setError(null);
38
- if (!val.trim()) return;
39
- if (value.includes(val)) {
40
+ const trimmed = val.trim();
41
+ const normalized = normalizer ? normalizer(trimmed) : trimmed;
42
+ if (!normalized) return;
43
+ if (value.includes(normalized)) {
40
44
  setError("This tag already exists");
41
45
  return;
42
46
  }
@@ -45,17 +49,18 @@ function TagsInput({ ref, value, onValueChange, placeholder, maxItems, minItems,
45
49
  return;
46
50
  }
47
51
  if (validator) try {
48
- validator.parse(val);
49
- onValueChange([...value, val]);
52
+ validator.parse(normalized);
53
+ onValueChange([...value, normalized]);
50
54
  } catch (error) {
51
55
  if (error instanceof z.ZodError) setError(error.issues[0]?.message || "Invalid input");
52
56
  else setError("Validation failed");
53
57
  }
54
- else onValueChange([...value, val]);
58
+ else onValueChange([...value, normalized]);
55
59
  }, [
56
60
  value,
57
61
  validator,
58
- parseMaxItems
62
+ parseMaxItems,
63
+ normalizer
59
64
  ]);
60
65
  const RemoveValue = React.useCallback((val) => {
61
66
  if (value.includes(val) && value.length > parseMinItems) onValueChange(value.filter((item) => item !== val));
@@ -156,14 +161,20 @@ function TagsInput({ ref, value, onValueChange, placeholder, maxItems, minItems,
156
161
  case "Escape":
157
162
  setActiveIndex(activeIndex === -1 ? value.length - 1 : -1);
158
163
  break;
159
- case "Enter":
160
- case ",":
164
+ case "Tab":
161
165
  if (inputValue.trim() !== "") {
162
166
  e.preventDefault();
163
167
  onValueChangeHandler(inputValue);
164
168
  setInputValue("");
165
169
  }
166
170
  break;
171
+ default:
172
+ if (delimiters.includes(e.key) && inputValue.trim() !== "") {
173
+ e.preventDefault();
174
+ onValueChangeHandler(inputValue);
175
+ setInputValue("");
176
+ }
177
+ break;
167
178
  }
168
179
  }, [
169
180
  activeIndex,
@@ -173,7 +184,8 @@ function TagsInput({ ref, value, onValueChange, placeholder, maxItems, minItems,
173
184
  dir,
174
185
  selectedValue,
175
186
  isValueSelected,
176
- onValueChangeHandler
187
+ onValueChangeHandler,
188
+ delimiters
177
189
  ]);
178
190
  const mousePreventDefault = React.useCallback((e) => {
179
191
  e.preventDefault();
@@ -183,11 +195,14 @@ function TagsInput({ ref, value, onValueChange, placeholder, maxItems, minItems,
183
195
  setInputValue(e.currentTarget.value);
184
196
  }, []);
185
197
  const handleBlur = React.useCallback((e) => {
198
+ if (inputValue.trim() === "") return;
199
+ onValueChangeHandler(inputValue);
200
+ setInputValue("");
186
201
  const relatedTarget = e.relatedTarget;
187
- if (!(relatedTarget?.tagName === "BUTTON" && (relatedTarget?.getAttribute("type") === "submit" || relatedTarget?.closest("button[type=\"submit\"]"))) && inputValue.trim() !== "") {
188
- onValueChangeHandler(inputValue);
189
- setInputValue("");
190
- }
202
+ const submitButton = relatedTarget?.getAttribute("type") === "submit" ? relatedTarget : relatedTarget?.closest("button[type=\"submit\"]");
203
+ if (submitButton) requestAnimationFrame(() => {
204
+ submitButton.click();
205
+ });
191
206
  }, [inputValue, onValueChangeHandler]);
192
207
  return /* @__PURE__ */ jsxs(TagInputContext, {
193
208
  value: React.useMemo(() => ({
@@ -1,2 +1,2 @@
1
- import { _ as RedisTaskStorage, a as TaskPanelItem, b as createProjectMetadata, c as TaskPanelHeader, d as useCurrentScope, f as useTasksWithLabels, g as detectStorage, h as TaskQueue, i as TaskPanel, l as getContextLabel, m as TaskQueueProvider, n as TaskSummaryDialog, o as TaskPanelCounter, p as useTaskQueue, r as TaskQueueTrigger, s as TaskPanelActions, t as TaskQueueDropdown, u as matchesCurrentScope, v as LocalTaskStorage, x as createUserMetadata, y as createOrgMetadata } from "../task-queue-dropdown-Wcbj-f0V.mjs";
1
+ import { _ as RedisTaskStorage, a as TaskPanelItem, b as createProjectMetadata, c as TaskPanelHeader, d as useCurrentScope, f as useTasksWithLabels, g as detectStorage, h as TaskQueue, i as TaskPanel, l as getContextLabel, m as TaskQueueProvider, n as TaskSummaryDialog, o as TaskPanelCounter, p as useTaskQueue, r as TaskQueueTrigger, s as TaskPanelActions, t as TaskQueueDropdown, u as matchesCurrentScope, v as LocalTaskStorage, x as createUserMetadata, y as createOrgMetadata } from "../task-queue-dropdown-D-LncEWm.mjs";
2
2
  export { LocalTaskStorage, RedisTaskStorage, TaskPanel, TaskPanelActions, TaskPanelCounter, TaskPanelHeader, TaskPanelItem, TaskQueue, TaskQueueDropdown, TaskQueueProvider, TaskQueueTrigger, TaskSummaryDialog, createOrgMetadata, createProjectMetadata, createUserMetadata, detectStorage, getContextLabel, matchesCurrentScope, useCurrentScope, useTaskQueue, useTasksWithLabels };
@@ -4,9 +4,9 @@ import { t as SpinnerIcon } from "./spinner.icon-C-vjSM6o.mjs";
4
4
  import { t as Button } from "./button-BllvE9Lm.mjs";
5
5
  import { t as Icon } from "./icon-wrapper-DuLp3RM1.mjs";
6
6
  import { t as Dialog } from "./dialog-Bm2H9lrx.mjs";
7
- import { a as TooltipTrigger, n as Tooltip, r as TooltipContent, t as Tooltip$1 } from "./tooltip-Cruvl5F6.mjs";
8
- import { c as TableRow, i as TableCell, n as TableBody, o as TableHead, s as TableHeader, t as Table } from "./table-Cdsh-39-.mjs";
9
- import { h as DropdownMenuTrigger, r as DropdownMenuContent, t as DropdownMenu } from "./dropdown-DZiAt-jS.mjs";
7
+ import { t as ResponsiveDropdown } from "./responsive-dropdown-IFroDgKn.mjs";
8
+ import { a as TooltipTrigger, n as Tooltip, r as TooltipContent, t as Tooltip$1 } from "./tooltip-a7NTDCWw.mjs";
9
+ import { c as TableRow, i as TableCell, n as TableBody, o as TableHead, s as TableHeader, t as Table } from "./table-DWGT4cqh.mjs";
10
10
  import { Ban, CheckCircle2, CircleAlert, CircleCheck, CornerDownRightIcon, FileIcon, ListTodo, X, XCircle } from "lucide-react";
11
11
  import { createContext, use, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
12
12
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -1283,45 +1283,45 @@ function TaskQueueDropdown() {
1283
1283
  }
1284
1284
  }, [tasks]);
1285
1285
  const hasDismissable = tasks.some((t) => t.status !== "running" && t.status !== "pending");
1286
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(DropdownMenu, {
1286
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(ResponsiveDropdown, {
1287
1287
  open,
1288
1288
  onOpenChange: setOpen,
1289
- children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
1290
- asChild: true,
1291
- children: /* @__PURE__ */ jsx(TaskQueueTrigger, { tasks })
1292
- }), /* @__PURE__ */ jsxs(DropdownMenuContent, {
1293
- align: "end",
1294
- className: "w-96 rounded-lg p-0",
1295
- onCloseAutoFocus: (e) => e.preventDefault(),
1296
- children: [
1297
- /* @__PURE__ */ jsx(TaskPanelHeader, {}),
1298
- /* @__PURE__ */ jsx("div", {
1299
- className: "max-h-[350px] overflow-y-auto",
1300
- children: tasks.length === 0 && !activeSummary ? /* @__PURE__ */ jsxs("div", {
1301
- className: "flex flex-col items-center justify-center px-4 py-12 text-center",
1302
- children: [/* @__PURE__ */ jsx(CheckCircle2, { className: "text-muted-foreground/30 mb-3 h-12 w-12" }), /* @__PURE__ */ jsx("p", {
1303
- className: "text-muted-foreground text-sm",
1304
- children: "No tasks currently scheduled"
1305
- })]
1306
- }) : tasks.map((task) => /* @__PURE__ */ jsx(TaskPanelItem, {
1307
- task,
1308
- contextLabel: getContextLabel(task.metadata),
1309
- onCancel: () => cancel(task.id)
1310
- }, task.id))
1311
- }),
1312
- hasDismissable && /* @__PURE__ */ jsx("button", {
1313
- type: "button",
1314
- onClick: () => {
1315
- dismissAll();
1316
- },
1317
- className: "border-border hover:bg-accent flex w-full cursor-pointer items-center justify-center gap-2 border-t px-3 py-2 transition-colors",
1318
- children: /* @__PURE__ */ jsx("span", {
1319
- className: "text-destructive text-xs",
1320
- children: "Clear tasks"
1321
- })
1289
+ sheetTitle: "Tasks",
1290
+ sheetDescription: "View running and completed tasks",
1291
+ contentClassName: "w-[calc(100vw-2rem)] sm:w-96",
1292
+ onCloseAutoFocus: (e) => e.preventDefault(),
1293
+ trigger: /* @__PURE__ */ jsx(TaskQueueTrigger, { tasks }),
1294
+ children: [
1295
+ /* @__PURE__ */ jsx("div", {
1296
+ className: "hidden md:block",
1297
+ children: /* @__PURE__ */ jsx(TaskPanelHeader, {})
1298
+ }),
1299
+ /* @__PURE__ */ jsx("div", {
1300
+ className: "max-h-[350px] overflow-y-auto",
1301
+ children: tasks.length === 0 && !activeSummary ? /* @__PURE__ */ jsxs("div", {
1302
+ className: "flex flex-col items-center justify-center px-4 py-12 text-center",
1303
+ children: [/* @__PURE__ */ jsx(CheckCircle2, { className: "text-muted-foreground/30 mb-3 h-12 w-12" }), /* @__PURE__ */ jsx("p", {
1304
+ className: "text-muted-foreground text-sm",
1305
+ children: "No tasks currently scheduled"
1306
+ })]
1307
+ }) : tasks.map((task) => /* @__PURE__ */ jsx(TaskPanelItem, {
1308
+ task,
1309
+ contextLabel: getContextLabel(task.metadata),
1310
+ onCancel: () => cancel(task.id)
1311
+ }, task.id))
1312
+ }),
1313
+ hasDismissable && /* @__PURE__ */ jsx("button", {
1314
+ type: "button",
1315
+ onClick: () => {
1316
+ dismissAll();
1317
+ },
1318
+ className: "border-border hover:bg-accent flex w-full cursor-pointer items-center justify-center gap-2 border-t px-3 py-2 transition-colors",
1319
+ children: /* @__PURE__ */ jsx("span", {
1320
+ className: "text-destructive text-xs",
1321
+ children: "Clear tasks"
1322
1322
  })
1323
- ]
1324
- })]
1323
+ })
1324
+ ]
1325
1325
  }), activeSummary && /* @__PURE__ */ jsx(TaskSummaryDialog, {
1326
1326
  open: true,
1327
1327
  onOpenChange: (isOpen) => {
@@ -1,2 +1,2 @@
1
- import { t as Textarea } from "../textarea-BwD-MmTV.mjs";
1
+ import { t as Textarea } from "../textarea-BoChBcFz.mjs";
2
2
  export { Textarea };
@@ -1,2 +1,2 @@
1
- import { i as ClientOnly, n as useTheme, r as ThemeScript, t as ThemeProvider } from "../themes-DG1md8FI.mjs";
1
+ import { i as ClientOnly, n as useTheme, r as ThemeScript, t as ThemeProvider } from "../themes-CAiN4b6G.mjs";
2
2
  export { ClientOnly, ThemeProvider, ThemeScript, useTheme };
@@ -1,2 +1,2 @@
1
- import { t as TimePicker } from "../time-picker-BoF7pZZ2.mjs";
1
+ import { t as TimePicker } from "../time-picker-BZF5jbF6.mjs";
2
2
  export { TimePicker };