@datum-cloud/datum-ui 0.4.0 → 0.6.0-alpha.b817c77

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 (195) hide show
  1. package/README.md +78 -39
  2. package/dist/adapter-context-B7L2ucTr.mjs +25 -0
  3. package/dist/alert/index.mjs +2 -3
  4. package/dist/{alert-BC2Mccfo.mjs → alert-BDj6od5I.mjs} +2 -4
  5. package/dist/app-navigation/index.mjs +4 -12
  6. package/dist/{app-navigation-DsCKgfPe.mjs → app-navigation-84ro28PU.mjs} +5 -8
  7. package/dist/autocomplete/index.mjs +2 -7
  8. package/dist/{autocomplete-DRB_kSVx.mjs → autocomplete-V5-qslzS.mjs} +5 -7
  9. package/dist/avatar/index.mjs +2 -4
  10. package/dist/{avatar-DyLq0xkt.mjs → avatar-BtKVcvO4.mjs} +2 -4
  11. package/dist/avatar-stack/index.mjs +2 -6
  12. package/dist/{avatar-stack-BT0dBswq.mjs → avatar-stack-oVr8tsU7.mjs} +4 -6
  13. package/dist/badge/index.mjs +2 -3
  14. package/dist/{badge-BgFj4Nsc.mjs → badge-DJR33ftJ.mjs} +2 -4
  15. package/dist/breadcrumb/index.mjs +2 -4
  16. package/dist/{breadcrumb-CJNaYyk1.mjs → breadcrumb-B-9G347O.mjs} +2 -4
  17. package/dist/button/index.mjs +3 -4
  18. package/dist/{button-0N61fmAR.mjs → button-BllvE9Lm.mjs} +3 -5
  19. package/dist/{button-D6AORsOz.mjs → button-D3RrsMfQ.mjs} +2 -4
  20. package/dist/{link-button-Cby0p4LW.mjs → button-fO8nazJE.mjs} +3 -5
  21. package/dist/button-group/index.mjs +2 -5
  22. package/dist/{button-group-BDk8btAy.mjs → button-group-CYPka2zz.mjs} +3 -5
  23. package/dist/calendar/index.mjs +2 -5
  24. package/dist/{calendar-BtfraIvX.mjs → calendar-DEkCw7I1.mjs} +4 -6
  25. package/dist/{calendar-date-picker-B9mxJM7f.mjs → calendar-date-picker-DWK94_DC.mjs} +6 -8
  26. package/dist/card/index.mjs +2 -4
  27. package/dist/{card-BiHXFt4s.mjs → card-DKG1Cwlj.mjs} +3 -6
  28. package/dist/chart/index.mjs +2 -4
  29. package/dist/{chart-CL0i-xIt.mjs → chart-CUa21ynK.mjs} +2 -4
  30. package/dist/checkbox/index.mjs +2 -4
  31. package/dist/{checkbox-CQrjygFt.mjs → checkbox-I5BvrMPe.mjs} +3 -6
  32. package/dist/{close.icon-D2r5q3bj.mjs → close.icon-HCfS4Y-N.mjs} +2 -4
  33. package/dist/{cn-DWCc1QRE.mjs → cn-D2KYQ917.mjs} +1 -3
  34. package/dist/code-editor/index.mjs +2 -0
  35. package/dist/{col-C9PDhvm5.mjs → col-YBbQ5wlb.mjs} +2 -7
  36. package/dist/collapsible/index.mjs +2 -3
  37. package/dist/{collapsible-Dw71o2um.mjs → collapsible-CUphkSBt.mjs} +1 -3
  38. package/dist/command/index.mjs +2 -5
  39. package/dist/{command-DVroicgn.mjs → command-DqHWukGK.mjs} +3 -5
  40. package/dist/components/features/code-editor/code-editor-tabs.d.ts +63 -0
  41. package/dist/components/features/code-editor/code-editor-tabs.d.ts.map +1 -0
  42. package/dist/components/features/code-editor/code-editor.d.ts +58 -0
  43. package/dist/components/features/code-editor/code-editor.d.ts.map +1 -0
  44. package/dist/components/features/code-editor/index.d.ts +6 -0
  45. package/dist/components/features/code-editor/index.d.ts.map +1 -0
  46. package/dist/components/features/code-editor/lib/editor.d.ts +7 -0
  47. package/dist/components/features/code-editor/lib/editor.d.ts.map +1 -0
  48. package/dist/components/features/code-editor/types.d.ts +98 -0
  49. package/dist/components/features/code-editor/types.d.ts.map +1 -0
  50. package/dist/components/features/form/adapter-context.d.ts +17 -0
  51. package/dist/components/features/form/adapter-context.d.ts.map +1 -0
  52. package/dist/components/features/form/adapter-types.d.ts +100 -0
  53. package/dist/components/features/form/adapter-types.d.ts.map +1 -0
  54. package/dist/components/features/form/adapters/conform/conform-adapter.d.ts +9 -0
  55. package/dist/components/features/form/adapters/conform/conform-adapter.d.ts.map +1 -0
  56. package/dist/components/features/form/adapters/conform/conform-provider.d.ts +22 -0
  57. package/dist/components/features/form/adapters/conform/conform-provider.d.ts.map +1 -0
  58. package/dist/components/features/form/adapters/conform/index.d.ts +3 -0
  59. package/dist/components/features/form/adapters/conform/index.d.ts.map +1 -0
  60. package/dist/components/features/form/adapters/rhf/index.d.ts +3 -0
  61. package/dist/components/features/form/adapters/rhf/index.d.ts.map +1 -0
  62. package/dist/components/features/form/adapters/rhf/rhf-adapter.d.ts +10 -0
  63. package/dist/components/features/form/adapters/rhf/rhf-adapter.d.ts.map +1 -0
  64. package/dist/components/features/form/adapters/rhf/rhf-provider.d.ts +22 -0
  65. package/dist/components/features/form/adapters/rhf/rhf-provider.d.ts.map +1 -0
  66. package/dist/components/features/form/components/form-autocomplete.d.ts.map +1 -1
  67. package/dist/components/features/form/components/form-checkbox.d.ts.map +1 -1
  68. package/dist/components/features/form/components/form-copy-box.d.ts.map +1 -1
  69. package/dist/components/features/form/components/form-field-array.d.ts +5 -17
  70. package/dist/components/features/form/components/form-field-array.d.ts.map +1 -1
  71. package/dist/components/features/form/components/form-field.d.ts +7 -21
  72. package/dist/components/features/form/components/form-field.d.ts.map +1 -1
  73. package/dist/components/features/form/components/form-input-group.d.ts +4 -4
  74. package/dist/components/features/form/components/form-input-group.d.ts.map +1 -1
  75. package/dist/components/features/form/components/form-input.d.ts.map +1 -1
  76. package/dist/components/features/form/components/form-radio-group.d.ts.map +1 -1
  77. package/dist/components/features/form/components/form-root.d.ts +5 -25
  78. package/dist/components/features/form/components/form-root.d.ts.map +1 -1
  79. package/dist/components/features/form/components/form-select.d.ts.map +1 -1
  80. package/dist/components/features/form/components/form-switch.d.ts.map +1 -1
  81. package/dist/components/features/form/components/form-textarea.d.ts.map +1 -1
  82. package/dist/components/features/form/components/stepper/form-stepper.d.ts.map +1 -1
  83. package/dist/components/features/form/context/form-context.d.ts +2 -2
  84. package/dist/components/features/form/context/form-context.d.ts.map +1 -1
  85. package/dist/components/features/form/hooks/use-field.d.ts +12 -18
  86. package/dist/components/features/form/hooks/use-field.d.ts.map +1 -1
  87. package/dist/components/features/form/hooks/use-watch.d.ts +9 -20
  88. package/dist/components/features/form/hooks/use-watch.d.ts.map +1 -1
  89. package/dist/components/features/form/index.d.ts +33 -27
  90. package/dist/components/features/form/index.d.ts.map +1 -1
  91. package/dist/components/features/form/types/index.d.ts +32 -32
  92. package/dist/components/features/form/types/index.d.ts.map +1 -1
  93. package/dist/components/features/form/utils/get-field-constraints.d.ts +11 -0
  94. package/dist/components/features/form/utils/get-field-constraints.d.ts.map +1 -0
  95. package/dist/components/features/index.d.ts +1 -0
  96. package/dist/components/features/index.d.ts.map +1 -1
  97. package/dist/components/toast.d.ts +2 -0
  98. package/dist/components/toast.d.ts.map +1 -0
  99. package/dist/data-table/index.mjs +21 -51
  100. package/dist/date-picker/index.mjs +3 -10
  101. package/dist/dialog/index.mjs +2 -5
  102. package/dist/{dialog-B0B3Kbfk.mjs → dialog-Bm2H9lrx.mjs} +4 -6
  103. package/dist/{dialog-DdrHeboM.mjs → dialog-DASRaFxD.mjs} +2 -4
  104. package/dist/dropdown/index.mjs +2 -3
  105. package/dist/{dropdown-Cdx7rOKv.mjs → dropdown-DZiAt-jS.mjs} +3 -5
  106. package/dist/{dropdown-menu-CdShrDz_.mjs → dropdown-menu-lALvDnab.mjs} +5 -7
  107. package/dist/dropzone/index.mjs +2 -5
  108. package/dist/{dropzone-B6kSN3DY.mjs → dropzone-ogtpQ4fy.mjs} +5 -8
  109. package/dist/empty-content/index.mjs +2 -3
  110. package/dist/{empty-content-B1lwLr40.mjs → empty-content-C63GPJ5d.mjs} +3 -9
  111. package/dist/form/adapters/conform/index.mjs +237 -0
  112. package/dist/form/adapters/rhf/index.mjs +181 -0
  113. package/dist/form/index.mjs +3 -146
  114. package/dist/{use-stepper-DigoyHhX.mjs → form-BE1xBne4.mjs} +447 -601
  115. package/dist/get-field-constraints-BPMW8VvY.mjs +48 -0
  116. package/dist/grid/index.mjs +2 -3
  117. package/dist/hooks/index.mjs +3 -4
  118. package/dist/{use-debounce-MnfjH51L.mjs → hooks-DYjN7lvC.mjs} +1 -3
  119. package/dist/hover-card/index.mjs +2 -4
  120. package/dist/{hover-card-CEIauuie.mjs → hover-card-DDWWD5Hx.mjs} +2 -4
  121. package/dist/{icon-wrapper-BBK4z4tj.mjs → icon-wrapper-DuLp3RM1.mjs} +1 -3
  122. package/dist/icons/index.mjs +4 -5
  123. package/dist/index.mjs +66 -71
  124. package/dist/input/index.mjs +2 -5
  125. package/dist/{input-DEMoi_8F.mjs → input-DOmNpcQJ.mjs} +2 -4
  126. package/dist/{input-CYFN0Ap2.mjs → input-FKGqZypx.mjs} +3 -5
  127. package/dist/input-group/index.mjs +2 -7
  128. package/dist/{input-group-DJgYpOlq.mjs → input-group-DDtz-RT7.mjs} +5 -7
  129. package/dist/input-number/index.mjs +2 -6
  130. package/dist/{input-number-Cuy9CCg_.mjs → input-number-DEjXG2I6.mjs} +4 -6
  131. package/dist/input-with-addons/index.mjs +28 -3
  132. package/dist/label/index.mjs +2 -4
  133. package/dist/{label-mOg07fuQ.mjs → label-cnAhY-ej.mjs} +3 -6
  134. package/dist/loader-overlay/index.mjs +2 -3
  135. package/dist/{loader-overlay-8IWX_1Ga.mjs → loader-overlay-BTFdkp7W.mjs} +3 -5
  136. package/dist/map/index.mjs +2 -14
  137. package/dist/{map-CaI1EshG.mjs → map-Cw7u8r6E.mjs} +10 -14
  138. package/dist/{map-leaflet-imports-J7w1V7mh.mjs → map-leaflet-imports-D6nTEOIh.mjs} +1 -2
  139. package/dist/more-actions/index.mjs +2 -5
  140. package/dist/{more-actions-BO5ikUxY.mjs → more-actions-BNQ2yfWZ.mjs} +5 -7
  141. package/dist/nprogress/index.mjs +1 -3
  142. package/dist/page-title/index.mjs +2 -3
  143. package/dist/{page-title-DWteBy1E.mjs → page-title-CNiRNZ7p.mjs} +2 -4
  144. package/dist/popover/index.mjs +2 -4
  145. package/dist/{popover-ugw5MpuT.mjs → popover-FJAcbYoH.mjs} +2 -4
  146. package/dist/radio-group/index.mjs +2 -4
  147. package/dist/{radio-group-_gMymwnb.mjs → radio-group-CiITR0LO.mjs} +3 -6
  148. package/dist/select/index.mjs +2 -4
  149. package/dist/{select-BZOKWjlH.mjs → select-CiLR_DiQ.mjs} +3 -6
  150. package/dist/separator/index.mjs +2 -4
  151. package/dist/{separator-BzyALya2.mjs → separator-DXVTncCK.mjs} +2 -4
  152. package/dist/sheet/index.mjs +3 -5
  153. package/dist/{sheet-BX6lae56.mjs → sheet-BzXksqYY.mjs} +4 -6
  154. package/dist/{sheet-DAcFjaGw.mjs → sheet-Di3b-oPu.mjs} +2 -4
  155. package/dist/sidebar/index.mjs +2 -10
  156. package/dist/{sidebar-B3EV33mG.mjs → sidebar-BnhnjvfO.mjs} +10 -14
  157. package/dist/skeleton/index.mjs +2 -5
  158. package/dist/{skeleton-2vQ0vFQk.mjs → skeleton-BKl4mfJt.mjs} +2 -4
  159. package/dist/{skeleton-BgOwIgE0.mjs → skeleton-D1MUhAVo.mjs} +3 -5
  160. package/dist/spinner/index.mjs +2 -4
  161. package/dist/{spinner-osyXAlhr.mjs → spinner-OyOf9-Yu.mjs} +2 -4
  162. package/dist/{spinner.icon-C0MbtgqX.mjs → spinner.icon-C-vjSM6o.mjs} +2 -4
  163. package/dist/stepper/index.mjs +321 -5
  164. package/dist/switch/index.mjs +2 -4
  165. package/dist/{switch-C60FpEal.mjs → switch-DQJQhPIQ.mjs} +3 -6
  166. package/dist/table/index.mjs +2 -4
  167. package/dist/{table-Cl3UzIhI.mjs → table-Cdsh-39-.mjs} +2 -4
  168. package/dist/tabs/index.mjs +50 -3
  169. package/dist/tag-input/index.mjs +2 -5
  170. package/dist/{tag-input-DR2gukhL.mjs → tag-input-BKed-cul.mjs} +5 -7
  171. package/dist/task-queue/index.mjs +2 -7
  172. package/dist/{task-queue-dropdown-C9KHKbGh.mjs → task-queue-dropdown-Di_Wjspz.mjs} +10 -30
  173. package/dist/textarea/index.mjs +2 -5
  174. package/dist/{textarea-CVo38n3S.mjs → textarea-94vq_G_S.mjs} +2 -4
  175. package/dist/{textarea-CZF5n57i.mjs → textarea-BwD-MmTV.mjs} +3 -5
  176. package/dist/theme/index.mjs +2 -3
  177. package/dist/{theme.provider-TUHlMsjM.mjs → themes-DG1md8FI.mjs} +1 -6
  178. package/dist/{to-api-format-naIpF-NI.mjs → to-api-format-Cq4prffn.mjs} +9 -18
  179. package/dist/toast/index.mjs +3 -3
  180. package/dist/{use-toast-By9HuFwP.mjs → toast-BWnN5fax.mjs} +5 -42
  181. package/dist/toast-DpxlFNNx.mjs +37 -0
  182. package/dist/tooltip/index.mjs +2 -4
  183. package/dist/{tooltip-CuX2jQA9.mjs → tooltip-Cruvl5F6.mjs} +3 -6
  184. package/dist/types-BZNk3q65.mjs +357 -0
  185. package/dist/typography/index.mjs +2 -3
  186. package/dist/{typography-Iap9fU5P.mjs → typography-ClB8k55E.mjs} +2 -4
  187. package/dist/{use-copy-to-clipboard-n29wJwvW.mjs → use-copy-to-clipboard-BGdTmkFV.mjs} +2 -4
  188. package/dist/utils/index.mjs +2 -3
  189. package/dist/{utils-DJboNGQM.mjs → utils-C8KwMfT_.mjs} +1 -3
  190. package/dist/visually-hidden/index.mjs +2 -3
  191. package/dist/{visuallyhidden-BJsQCmg-.mjs → visuallyhidden-BLUsJpYH.mjs} +1 -3
  192. package/package.json +44 -3
  193. package/dist/input-with-addons-B8rzNhpq.mjs +0 -30
  194. package/dist/stepper-BMsn7I78.mjs +0 -323
  195. package/dist/tabs-DJU7JA3h.mjs +0 -52
@@ -1,7 +1,6 @@
1
- import { t as cn } from "./utils-DJboNGQM.mjs";
1
+ import { t as cn } from "./utils-C8KwMfT_.mjs";
2
2
  import "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
-
5
4
  //#region ../shadcn/ui/textarea.tsx
6
5
  function Textarea({ className, ...props }) {
7
6
  return /* @__PURE__ */ jsx("textarea", {
@@ -10,6 +9,5 @@ function Textarea({ className, ...props }) {
10
9
  ...props
11
10
  });
12
11
  }
13
-
14
12
  //#endregion
15
- export { Textarea as t };
13
+ export { Textarea as t };
@@ -1,8 +1,7 @@
1
- import { t as cn } from "./cn-DWCc1QRE.mjs";
2
- import { t as Textarea$1 } from "./textarea-CVo38n3S.mjs";
1
+ import { t as cn } from "./cn-D2KYQ917.mjs";
2
+ import { t as Textarea$1 } from "./textarea-94vq_G_S.mjs";
3
3
  import "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
-
6
5
  //#region src/components/base/textarea/textarea.tsx
7
6
  function Textarea({ ref, className, ...props }) {
8
7
  return /* @__PURE__ */ jsx(Textarea$1, {
@@ -12,6 +11,5 @@ function Textarea({ ref, className, ...props }) {
12
11
  });
13
12
  }
14
13
  Textarea.displayName = "Textarea";
15
-
16
14
  //#endregion
17
- export { Textarea as t };
15
+ export { Textarea as t };
@@ -1,3 +1,2 @@
1
- import { i as ClientOnly, n as useTheme, r as ThemeScript, t as ThemeProvider } from "../theme.provider-TUHlMsjM.mjs";
2
-
3
- export { ClientOnly, ThemeProvider, ThemeScript, useTheme };
1
+ import { i as ClientOnly, n as useTheme, r as ThemeScript, t as ThemeProvider } from "../themes-DG1md8FI.mjs";
2
+ export { ClientOnly, ThemeProvider, ThemeScript, useTheme };
@@ -1,6 +1,5 @@
1
1
  import * as React$1 from "react";
2
2
  import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
3
-
4
3
  //#region src/components/themes/client-only.tsx
5
4
  function ClientOnly({ children, fallback = null }) {
6
5
  const [hasMounted, setHasMounted] = React$1.useState(false);
@@ -10,7 +9,6 @@ function ClientOnly({ children, fallback = null }) {
10
9
  if (!hasMounted) return /* @__PURE__ */ jsx(Fragment$1, { children: fallback });
11
10
  return /* @__PURE__ */ jsx(Fragment$1, { children });
12
11
  }
13
-
14
12
  //#endregion
15
13
  //#region src/components/themes/script.ts
16
14
  function script(attribute, storageKey, defaultTheme, forcedTheme, themes, value, enableSystem, enableColorScheme) {
@@ -40,7 +38,6 @@ function script(attribute, storageKey, defaultTheme, forcedTheme, themes, value,
40
38
  updateDOM(enableSystem && themeName === "system" ? getSystemTheme() : themeName);
41
39
  } catch {}
42
40
  }
43
-
44
41
  //#endregion
45
42
  //#region src/components/themes/theme-script.tsx
46
43
  const ThemeScript = React$1.memo(({ forcedTheme, storageKey = "theme", attribute = "data-theme", enableSystem = true, enableColorScheme = true, defaultTheme = "system", value, themes = ["light", "dark"], nonce, scriptProps }) => {
@@ -61,7 +58,6 @@ const ThemeScript = React$1.memo(({ forcedTheme, storageKey = "theme", attribute
61
58
  dangerouslySetInnerHTML: { __html: `(${script.toString()})(${scriptArgs})` }
62
59
  });
63
60
  });
64
-
65
61
  //#endregion
66
62
  //#region src/components/themes/theme.provider.tsx
67
63
  const colorSchemes = ["light", "dark"];
@@ -191,6 +187,5 @@ function getSystemTheme(e) {
191
187
  if (!e) e = window.matchMedia(MEDIA);
192
188
  return e.matches ? "dark" : "light";
193
189
  }
194
-
195
190
  //#endregion
196
- export { ClientOnly as i, useTheme as n, ThemeScript as r, ThemeProvider as t };
191
+ export { ClientOnly as i, useTheme as n, ThemeScript as r, ThemeProvider as t };
@@ -1,17 +1,16 @@
1
- import { t as cn } from "./cn-DWCc1QRE.mjs";
2
- import { t as Button } from "./button-0N61fmAR.mjs";
3
- import { t as Separator } from "./separator-BzyALya2.mjs";
4
- import { t as Icon } from "./icon-wrapper-BBK4z4tj.mjs";
5
- import { t as Calendar$1 } from "./calendar-BtfraIvX.mjs";
6
- import { t as Input } from "./input-CYFN0Ap2.mjs";
7
- import { i as PopoverTrigger, r as PopoverContent, t as Popover } from "./popover-ugw5MpuT.mjs";
8
- import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-BZOKWjlH.mjs";
1
+ import { t as cn } from "./cn-D2KYQ917.mjs";
2
+ import { t as Button } from "./button-BllvE9Lm.mjs";
3
+ import { t as Separator } from "./separator-DXVTncCK.mjs";
4
+ import { t as Icon } from "./icon-wrapper-DuLp3RM1.mjs";
5
+ import { t as Calendar$1 } from "./calendar-DEkCw7I1.mjs";
6
+ import { t as Input } from "./input-FKGqZypx.mjs";
7
+ import { i as PopoverTrigger, r as PopoverContent, t as Popover } from "./popover-FJAcbYoH.mjs";
8
+ import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-CiLR_DiQ.mjs";
9
9
  import { Calendar, CalendarIcon, Globe, X } from "lucide-react";
10
10
  import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
11
11
  import { jsx, jsxs } from "react/jsx-runtime";
12
12
  import { format, isSameDay, isSameYear, parse, subDays, subHours, subMinutes } from "date-fns";
13
13
  import { fromZonedTime, toZonedTime } from "date-fns-tz";
14
-
15
14
  //#region src/components/features/time-range-picker/utils/timezone.ts
16
15
  /**
17
16
  * Get the UTC offset string for a timezone
@@ -121,7 +120,6 @@ function zonedDateToUtcString(zonedDate, timezone) {
121
120
  function formatUtcForDisplay(utcString, timezone, formatString = "MMM d, yyyy HH:mm") {
122
121
  return format(utcStringToZonedDate(utcString, timezone), formatString);
123
122
  }
124
-
125
123
  //#endregion
126
124
  //#region src/components/features/time-range-picker/components/absolute-range-panel.tsx
127
125
  /**
@@ -352,7 +350,6 @@ function CustomRangePanel({ fromUtc, toUtc, timezone, onRangeChange, disableFutu
352
350
  })]
353
351
  });
354
352
  }
355
-
356
353
  //#endregion
357
354
  //#region src/components/features/time-range-picker/components/quick-ranges-panel.tsx
358
355
  function QuickRangesPanel({ presets, value, onPresetSelect, className }) {
@@ -379,7 +376,6 @@ function QuickRangesPanel({ presets, value, onPresetSelect, className }) {
379
376
  })]
380
377
  });
381
378
  }
382
-
383
379
  //#endregion
384
380
  //#region src/components/features/time-range-picker/components/timezone-selector.tsx
385
381
  function TimezoneSelector({ value, onChange, options, className }) {
@@ -403,7 +399,6 @@ function TimezoneSelector({ value, onChange, options, className }) {
403
399
  })]
404
400
  });
405
401
  }
406
-
407
402
  //#endregion
408
403
  //#region src/components/features/time-range-picker/presets.ts
409
404
  /**
@@ -543,7 +538,6 @@ function getPresetRange(preset, timezone) {
543
538
  to: range.to.toISOString()
544
539
  };
545
540
  }
546
-
547
541
  //#endregion
548
542
  //#region src/components/features/time-range-picker/utils/format-display.ts
549
543
  /**
@@ -587,7 +581,6 @@ function formatSingleTimeDisplay(utcString, timezone) {
587
581
  function formatDateForInput(date) {
588
582
  return format(date, "yyyy-MM-dd'T'HH:mm");
589
583
  }
590
-
591
584
  //#endregion
592
585
  //#region src/components/features/time-range-picker/time-range-picker.tsx
593
586
  function TimeRangePicker({ value, onChange, onClear, timezone: timezoneProp, presets = DEFAULT_PRESETS, disableFuture = false, maxDate, minDate, className, disabled = false, placeholder = "Select time range", align = "start", side = "bottom" }) {
@@ -804,7 +797,6 @@ function TimeRangePicker({ value, onChange, onClear, timezone: timezoneProp, pre
804
797
  })]
805
798
  });
806
799
  }
807
-
808
800
  //#endregion
809
801
  //#region src/components/features/time-range-picker/utils/to-api-format.ts
810
802
  /**
@@ -846,6 +838,5 @@ function toApiTimeRange(value, timezone, presets = DEFAULT_PRESETS) {
846
838
  endTime: range.to
847
839
  };
848
840
  }
849
-
850
841
  //#endregion
851
- export { utcToLocalInputString as C, utcStringToZonedDate as S, getBrowserTimezone as _, formatTimeRangeDisplay as a, getTimezoneOffset as b, getPresetByKey as c, TimezoneSelector as d, QuickRangesPanel as f, formatUtcForDisplay as g, formatTimezoneLabel as h, formatSingleTimeDisplay as i, getPresetByShortcut as l, createTimezoneOption as m, TimeRangePicker as n, DEFAULT_PRESETS as o, CustomRangePanel as p, formatDateForInput as r, getDefaultPreset as s, toApiTimeRange as t, getPresetRange as u, getDefaultTimezoneOptions as v, zonedDateToUtcString as w, localInputStringToUtc as x, getShortTimezoneDisplay as y };
842
+ export { utcToLocalInputString as C, utcStringToZonedDate as S, getBrowserTimezone as _, formatTimeRangeDisplay as a, getTimezoneOffset as b, getPresetByKey as c, TimezoneSelector as d, QuickRangesPanel as f, formatUtcForDisplay as g, formatTimezoneLabel as h, formatSingleTimeDisplay as i, getPresetByShortcut as l, createTimezoneOption as m, TimeRangePicker as n, DEFAULT_PRESETS as o, CustomRangePanel as p, formatDateForInput as r, getDefaultPreset as s, toApiTimeRange as t, getPresetRange as u, getDefaultTimezoneOptions as v, zonedDateToUtcString as w, localInputStringToUtc as x, getShortTimezoneDisplay as y };
@@ -1,3 +1,3 @@
1
- import { n as Toaster, r as toast, t as useToast } from "../use-toast-By9HuFwP.mjs";
2
-
3
- export { Toaster, toast, useToast };
1
+ import { t as toast } from "../toast-BWnN5fax.mjs";
2
+ import { n as Toaster, t as useToast } from "../toast-DpxlFNNx.mjs";
3
+ export { Toaster, toast, useToast };
@@ -1,9 +1,8 @@
1
- import { t as cn } from "./cn-DWCc1QRE.mjs";
2
- import { t as CloseIcon } from "./close.icon-D2r5q3bj.mjs";
3
- import { createElement, useEffect } from "react";
1
+ import { t as cn } from "./cn-D2KYQ917.mjs";
2
+ import { t as CloseIcon } from "./close.icon-HCfS4Y-N.mjs";
3
+ import { createElement } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
- import { Toaster, toast } from "sonner";
6
-
5
+ import { toast } from "sonner";
7
6
  //#region src/components/features/toast/headless-toast.tsx
8
7
  const variantAccentClass = {
9
8
  message: "bg-toast-success-background text-toast-success-foreground",
@@ -44,7 +43,6 @@ function HeadlessToast({ variant, title, description, onDismiss }) {
44
43
  })
45
44
  });
46
45
  }
47
-
48
46
  //#endregion
49
47
  //#region src/components/features/toast/toast.ts
50
48
  const defaultOptions = {
@@ -84,40 +82,5 @@ const toast$1 = {
84
82
  return show("warning", title, options);
85
83
  }
86
84
  };
87
-
88
85
  //#endregion
89
- //#region src/components/features/toast/toaster.tsx
90
- /**
91
- * Sonner Toaster configured for "headless" usage.
92
- *
93
- * We render our own toast markup via `toast.custom`, so we remove Sonner's default styling.
94
- */
95
- function Toaster$1({ toastOptions, ...props }) {
96
- return /* @__PURE__ */ jsx(Toaster, {
97
- toastOptions: {
98
- unstyled: true,
99
- ...toastOptions
100
- },
101
- ...props
102
- });
103
- }
104
-
105
- //#endregion
106
- //#region src/components/features/toast/use-toast.ts
107
- /**
108
- * Sonner is a toast library for React.
109
- * Implementation based on github.com/epicweb-dev/epic-stack
110
- */
111
- function useToast(toastData) {
112
- useEffect(() => {
113
- if (toastData) setTimeout(() => {
114
- toast$1[toastData.type](toastData.title ?? toastData.description, {
115
- id: toastData.id,
116
- description: toastData.title ? toastData.description : void 0
117
- });
118
- }, 0);
119
- }, [toastData]);
120
- }
121
-
122
- //#endregion
123
- export { Toaster$1 as n, toast$1 as r, useToast as t };
86
+ export { toast$1 as t };
@@ -0,0 +1,37 @@
1
+ import { t as toast$1 } from "./toast-BWnN5fax.mjs";
2
+ import { useEffect } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { Toaster } from "sonner";
5
+ //#region src/components/features/toast/toaster.tsx
6
+ /**
7
+ * Sonner Toaster configured for "headless" usage.
8
+ *
9
+ * We render our own toast markup via `toast.custom`, so we remove Sonner's default styling.
10
+ */
11
+ function Toaster$1({ toastOptions, ...props }) {
12
+ return /* @__PURE__ */ jsx(Toaster, {
13
+ toastOptions: {
14
+ unstyled: true,
15
+ ...toastOptions
16
+ },
17
+ ...props
18
+ });
19
+ }
20
+ //#endregion
21
+ //#region src/components/features/toast/use-toast.ts
22
+ /**
23
+ * Sonner is a toast library for React.
24
+ * Implementation based on github.com/epicweb-dev/epic-stack
25
+ */
26
+ function useToast(toastData) {
27
+ useEffect(() => {
28
+ if (toastData) setTimeout(() => {
29
+ toast$1[toastData.type](toastData.title ?? toastData.description, {
30
+ id: toastData.id,
31
+ description: toastData.title ? toastData.description : void 0
32
+ });
33
+ }, 0);
34
+ }, [toastData]);
35
+ }
36
+ //#endregion
37
+ export { Toaster$1 as n, useToast as t };
@@ -1,4 +1,2 @@
1
- import "../utils-DJboNGQM.mjs";
2
- import { t as Tooltip } from "../tooltip-CuX2jQA9.mjs";
3
-
4
- export { Tooltip };
1
+ import { t as Tooltip } from "../tooltip-Cruvl5F6.mjs";
2
+ export { Tooltip };
@@ -1,9 +1,8 @@
1
- import { t as cn } from "./cn-DWCc1QRE.mjs";
2
- import { t as cn$1 } from "./utils-DJboNGQM.mjs";
1
+ import { t as cn } from "./cn-D2KYQ917.mjs";
2
+ import { t as cn$1 } from "./utils-C8KwMfT_.mjs";
3
3
  import "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import * as TooltipPrimitive from "@radix-ui/react-tooltip";
6
-
7
6
  //#region ../shadcn/ui/tooltip.tsx
8
7
  const TooltipProvider = ({ delayDuration = 0, ...props }) => {
9
8
  return /* @__PURE__ */ jsx(TooltipPrimitive.Provider, {
@@ -33,7 +32,6 @@ const TooltipContent$1 = ({ className, sideOffset = 0, children, ...props }) =>
33
32
  children: [children, /* @__PURE__ */ jsx(TooltipPrimitive.Arrow, { className: "bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" })]
34
33
  }) });
35
34
  };
36
-
37
35
  //#endregion
38
36
  //#region src/components/base/tooltip/tooltip.tsx
39
37
  function TooltipContent({ className, arrowClassName, sideOffset = 0, children, ...props }) {
@@ -69,6 +67,5 @@ function Tooltip({ message, children, delayDuration = 200, side, align, sideOffs
69
67
  })]
70
68
  });
71
69
  }
72
-
73
70
  //#endregion
74
- export { TooltipTrigger as a, TooltipProvider as i, Tooltip$1 as n, TooltipContent$1 as r, Tooltip as t };
71
+ export { TooltipTrigger as a, TooltipProvider as i, Tooltip$1 as n, TooltipContent$1 as r, Tooltip as t };
@@ -0,0 +1,357 @@
1
+ import { t as cn } from "./cn-D2KYQ917.mjs";
2
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "./tabs/index.mjs";
3
+ import { n as useTheme } from "./themes-DG1md8FI.mjs";
4
+ import { t as toast } from "./toast-BWnN5fax.mjs";
5
+ import { useEffect, useRef, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import Editor from "@monaco-editor/react";
8
+ import yaml from "js-yaml";
9
+ import { z } from "zod";
10
+ //#region src/components/features/code-editor/code-editor.tsx
11
+ /**
12
+ * CodeEditor - Monaco-based code editor component
13
+ *
14
+ * A Monaco Editor wrapper with single language support, theme integration,
15
+ * and form compatibility. Provides a VS Code-like editing experience with
16
+ * automatic formatting, responsive layout, and error state handling.
17
+ *
18
+ * Features:
19
+ * - Monaco Editor with VS Code experience
20
+ * - Theme-aware (automatic light/dark mode)
21
+ * - Form-compatible (hidden input for React Hook Form)
22
+ * - Responsive layout with automatic resizing
23
+ * - Read-only mode support
24
+ * - Custom error state styling
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * import { CodeEditor } from '@datum-cloud/datum-ui/code-editor'
29
+ *
30
+ * // Basic usage
31
+ * <CodeEditor
32
+ * value={code}
33
+ * onChange={(newValue) => setCode(newValue)}
34
+ * language="yaml"
35
+ * minHeight="400px"
36
+ * />
37
+ *
38
+ * // With error state
39
+ * <CodeEditor
40
+ * value={invalidJson}
41
+ * onChange={handleChange}
42
+ * language="json"
43
+ * error="Invalid JSON format"
44
+ * />
45
+ *
46
+ * // Read-only mode
47
+ * <CodeEditor
48
+ * value={config}
49
+ * language="yaml"
50
+ * readOnly={true}
51
+ * />
52
+ * ```
53
+ *
54
+ * @param props - Component props
55
+ * @param props.value - Editor content
56
+ * @param props.onChange - Content change callback
57
+ * @param props.language - Syntax highlighting language
58
+ * @param props.id - Input element ID for form integration
59
+ * @param props.name - Input element name for form submission (default: 'code-editor')
60
+ * @param props.error - Error message to display below the editor
61
+ * @param props.className - Additional CSS classes
62
+ * @param props.readOnly - Read-only mode (default: false)
63
+ * @param props.minHeight - Minimum editor height (default: '200px')
64
+ * @returns Rendered Monaco editor with form integration
65
+ */
66
+ function CodeEditor({ value, onChange, language, id, name = "code-editor", error, className, readOnly = false, minHeight = "200px" }) {
67
+ const { theme } = useTheme();
68
+ const editorRef = useRef(null);
69
+ const [mounted, setMounted] = useState(false);
70
+ const monacoTheme = theme === "dark" ? "vs-dark" : "light";
71
+ useEffect(() => {
72
+ if (editorRef.current && !mounted) {
73
+ setTimeout(() => {
74
+ editorRef.current?.getAction("editor.action.formatDocument")?.run();
75
+ }, 300);
76
+ setMounted(true);
77
+ }
78
+ }, [mounted]);
79
+ const handleEditorChange = (newValue) => {
80
+ onChange?.(newValue || "");
81
+ };
82
+ const handleEditorDidMount = (editor) => {
83
+ editorRef.current = editor;
84
+ };
85
+ return /* @__PURE__ */ jsxs("div", {
86
+ className: cn("relative", className),
87
+ children: [
88
+ /* @__PURE__ */ jsx(Editor, {
89
+ height: minHeight,
90
+ language,
91
+ value,
92
+ theme: monacoTheme,
93
+ onChange: handleEditorChange,
94
+ onMount: handleEditorDidMount,
95
+ options: {
96
+ readOnly,
97
+ minimap: { enabled: false },
98
+ fontSize: 14,
99
+ tabSize: 2,
100
+ wordWrap: "on",
101
+ lineNumbers: "on",
102
+ folding: true,
103
+ automaticLayout: true
104
+ },
105
+ className: cn(error && "border border-destructive rounded-md")
106
+ }),
107
+ /* @__PURE__ */ jsx("input", {
108
+ type: "hidden",
109
+ id,
110
+ name,
111
+ value
112
+ }),
113
+ error && /* @__PURE__ */ jsx("p", {
114
+ className: "text-sm text-destructive mt-1",
115
+ children: error
116
+ })
117
+ ]
118
+ });
119
+ }
120
+ //#endregion
121
+ //#region src/components/features/code-editor/lib/editor.ts
122
+ function isValidJson(jsonStr) {
123
+ try {
124
+ JSON.parse(jsonStr);
125
+ return true;
126
+ } catch {
127
+ return false;
128
+ }
129
+ }
130
+ function isValidYaml(yamlStr) {
131
+ try {
132
+ yaml.load(yamlStr, { schema: yaml.FAILSAFE_SCHEMA });
133
+ return true;
134
+ } catch {
135
+ return false;
136
+ }
137
+ }
138
+ function formatJson(jsonStr) {
139
+ try {
140
+ const parsed = JSON.parse(jsonStr);
141
+ return JSON.stringify(parsed, null, 2);
142
+ } catch (error) {
143
+ throw new Error(`Invalid JSON format: ${error instanceof Error ? error.message : String(error)}`);
144
+ }
145
+ }
146
+ function formatYaml(yamlStr) {
147
+ try {
148
+ const parsed = yaml.load(yamlStr, { schema: yaml.FAILSAFE_SCHEMA });
149
+ return yaml.dump(parsed, {
150
+ indent: 2,
151
+ lineWidth: -1,
152
+ noRefs: true
153
+ });
154
+ } catch (error) {
155
+ throw new Error(`Invalid YAML format: ${error instanceof Error ? error.message : String(error)}`);
156
+ }
157
+ }
158
+ function jsonToYaml(jsonStr) {
159
+ try {
160
+ const parsed = JSON.parse(jsonStr);
161
+ return yaml.dump(parsed, {
162
+ indent: 2,
163
+ lineWidth: -1,
164
+ noRefs: true
165
+ });
166
+ } catch (error) {
167
+ throw new Error(`Invalid JSON format: ${error instanceof Error ? error.message : String(error)}`);
168
+ }
169
+ }
170
+ function yamlToJson(yamlStr) {
171
+ try {
172
+ const parsed = yaml.load(yamlStr, { schema: yaml.FAILSAFE_SCHEMA });
173
+ return JSON.stringify(parsed, null, 2);
174
+ } catch (error) {
175
+ throw new Error(`Invalid YAML format: ${error instanceof Error ? error.message : String(error)}`);
176
+ }
177
+ }
178
+ //#endregion
179
+ //#region src/components/features/code-editor/code-editor-tabs.tsx
180
+ /**
181
+ * CodeEditorTabs - Dual-format code editor with JSON ↔ YAML conversion
182
+ *
183
+ * A tabbed interface that provides JSON and YAML editing with automatic
184
+ * bidirectional conversion and validation. Prevents tab switching when
185
+ * content has syntax errors and shows error toasts for conversion failures.
186
+ *
187
+ * Features:
188
+ * - Dual-format editing (JSON ↔ YAML)
189
+ * - Automatic bidirectional conversion
190
+ * - Real-time validation before conversion
191
+ * - Error toasts for conversion failures
192
+ * - Maintains sync between both formats
193
+ * - Hidden format field for form submission
194
+ *
195
+ * @example
196
+ * ```tsx
197
+ * import { CodeEditorTabs } from '@datum-cloud/datum-ui/code-editor'
198
+ *
199
+ * // Basic usage
200
+ * <CodeEditorTabs
201
+ * value={config}
202
+ * format="yaml"
203
+ * onChange={(value, format) => {
204
+ * setConfig(value)
205
+ * setFormat(format)
206
+ * }}
207
+ * name="configuration"
208
+ * minHeight="500px"
209
+ * />
210
+ *
211
+ * // With React Hook Form
212
+ * const { watch, setValue } = useForm()
213
+ *
214
+ * <CodeEditorTabs
215
+ * value={watch('config')}
216
+ * onChange={(value) => setValue('config', value)}
217
+ * name="config"
218
+ * />
219
+ *
220
+ * // With format change handler
221
+ * <CodeEditorTabs
222
+ * value={data}
223
+ * format={currentFormat}
224
+ * onChange={(value, format) => console.log({ value, format })}
225
+ * onFormatChange={(format) => setCurrentFormat(format)}
226
+ * />
227
+ * ```
228
+ *
229
+ * @param props - Component props
230
+ * @param props.value - Editor content
231
+ * @param props.onChange - Content and format change callback
232
+ * @param props.format - Active format ('json' or 'yaml', default: 'yaml')
233
+ * @param props.onFormatChange - Format change callback
234
+ * @param props.error - Error message to display below the editor
235
+ * @param props.id - Input element ID for form integration
236
+ * @param props.name - Input element name for form submission (default: 'code-editor')
237
+ * @param props.minHeight - Minimum editor height (default: '300px')
238
+ * @returns Rendered tabbed editor with JSON/YAML conversion
239
+ */
240
+ function CodeEditorTabs({ value, onChange, format = "yaml", onFormatChange, error, id, name = "code-editor", minHeight = "300px" }) {
241
+ const [jsonContent, setJsonContent] = useState("");
242
+ const [yamlContent, setYamlContent] = useState("");
243
+ const [activeTab, setActiveTab] = useState(format);
244
+ useEffect(() => {
245
+ if (format === "json") {
246
+ setJsonContent(value);
247
+ try {
248
+ setYamlContent(jsonToYaml(value));
249
+ } catch {}
250
+ } else {
251
+ setYamlContent(value);
252
+ try {
253
+ setJsonContent(yamlToJson(value));
254
+ } catch {}
255
+ }
256
+ }, [value, format]);
257
+ const handleJsonChange = (newValue) => {
258
+ setJsonContent(newValue);
259
+ try {
260
+ setYamlContent(jsonToYaml(newValue));
261
+ if (activeTab === "json") onChange?.(newValue, "json");
262
+ } catch (error) {
263
+ console.error("Failed to convert JSON to YAML:", error);
264
+ }
265
+ };
266
+ const handleYamlChange = (newValue) => {
267
+ setYamlContent(newValue);
268
+ try {
269
+ setJsonContent(yamlToJson(newValue));
270
+ if (activeTab === "yaml") onChange?.(newValue, "yaml");
271
+ } catch (error) {
272
+ console.error("Failed to convert YAML to JSON:", error);
273
+ }
274
+ };
275
+ const handleTabChange = (newTab) => {
276
+ const newFormat = newTab;
277
+ const currentContent = activeTab === "json" ? jsonContent : yamlContent;
278
+ try {
279
+ if (activeTab === "json") jsonToYaml(currentContent);
280
+ else yamlToJson(currentContent);
281
+ setActiveTab(newFormat);
282
+ onFormatChange?.(newFormat);
283
+ onChange?.(newFormat === "json" ? jsonContent : yamlContent, newFormat);
284
+ } catch {
285
+ const errorMsg = activeTab === "json" ? "Invalid JSON format. Please fix errors before switching tabs." : "Invalid YAML format. Please fix errors before switching tabs.";
286
+ toast.error(errorMsg, { id: `${activeTab}-to-${newFormat}-error` });
287
+ }
288
+ };
289
+ return /* @__PURE__ */ jsxs(Tabs, {
290
+ value: activeTab,
291
+ onValueChange: handleTabChange,
292
+ children: [
293
+ /* @__PURE__ */ jsxs(TabsList, { children: [/* @__PURE__ */ jsx(TabsTrigger, {
294
+ value: "yaml",
295
+ children: "YAML"
296
+ }), /* @__PURE__ */ jsx(TabsTrigger, {
297
+ value: "json",
298
+ children: "JSON"
299
+ })] }),
300
+ /* @__PURE__ */ jsx(TabsContent, {
301
+ value: "yaml",
302
+ children: /* @__PURE__ */ jsx(CodeEditor, {
303
+ value: yamlContent,
304
+ onChange: handleYamlChange,
305
+ language: "yaml",
306
+ minHeight,
307
+ error
308
+ })
309
+ }),
310
+ /* @__PURE__ */ jsx(TabsContent, {
311
+ value: "json",
312
+ children: /* @__PURE__ */ jsx(CodeEditor, {
313
+ value: jsonContent,
314
+ onChange: handleJsonChange,
315
+ language: "json",
316
+ minHeight,
317
+ error
318
+ })
319
+ }),
320
+ /* @__PURE__ */ jsx("input", {
321
+ type: "hidden",
322
+ id,
323
+ name,
324
+ value: activeTab === "json" ? jsonContent : yamlContent
325
+ }),
326
+ /* @__PURE__ */ jsx("input", {
327
+ type: "hidden",
328
+ name: `${name}-format`,
329
+ value: activeTab
330
+ })
331
+ ]
332
+ });
333
+ }
334
+ //#endregion
335
+ //#region src/components/features/code-editor/types.ts
336
+ const jsonSchema = z.object({ jsonContent: z.string().min(1, "JSON content is required").refine(isValidJson, { message: "Invalid JSON format" }) });
337
+ const yamlSchema = z.object({ yamlContent: z.string().min(1, "YAML content is required").refine(isValidYaml, { message: "Invalid YAML format" }) });
338
+ function createCodeEditorSchema(name = "code-editor") {
339
+ return z.object({
340
+ [name]: z.string().min(1, `${name} content is required`),
341
+ format: z.enum(["json", "yaml"])
342
+ }).superRefine((data, ctx) => {
343
+ const content = data[name];
344
+ if (data.format === "json" && !isValidJson(content)) ctx.addIssue({
345
+ code: z.ZodIssueCode.custom,
346
+ message: "Invalid JSON format",
347
+ path: [name]
348
+ });
349
+ else if (data.format === "yaml" && !isValidYaml(content)) ctx.addIssue({
350
+ code: z.ZodIssueCode.custom,
351
+ message: "Invalid YAML format",
352
+ path: [name]
353
+ });
354
+ });
355
+ }
356
+ //#endregion
357
+ export { formatJson as a, isValidYaml as c, CodeEditor as d, CodeEditorTabs as i, jsonToYaml as l, jsonSchema as n, formatYaml as o, yamlSchema as r, isValidJson as s, createCodeEditorSchema as t, yamlToJson as u };
@@ -1,3 +1,2 @@
1
- import { a as ListItem, c as Title, d as titleVariants, i as List, l as paragraphVariants, n as Code, o as Paragraph, r as Link, s as Text, t as Blockquote, u as textVariants } from "../typography-Iap9fU5P.mjs";
2
-
3
- export { Blockquote, Code, Link, List, ListItem, Paragraph, Text, Title, paragraphVariants, textVariants, titleVariants };
1
+ import { a as ListItem, c as Title, d as titleVariants, i as List, l as paragraphVariants, n as Code, o as Paragraph, r as Link, s as Text, t as Blockquote, u as textVariants } from "../typography-ClB8k55E.mjs";
2
+ export { Blockquote, Code, Link, List, ListItem, Paragraph, Text, Title, paragraphVariants, textVariants, titleVariants };