@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.
- package/README.md +78 -39
- package/dist/adapter-context-B7L2ucTr.mjs +25 -0
- package/dist/alert/index.mjs +2 -3
- package/dist/{alert-BC2Mccfo.mjs → alert-BDj6od5I.mjs} +2 -4
- package/dist/app-navigation/index.mjs +4 -12
- package/dist/{app-navigation-DsCKgfPe.mjs → app-navigation-84ro28PU.mjs} +5 -8
- package/dist/autocomplete/index.mjs +2 -7
- package/dist/{autocomplete-DRB_kSVx.mjs → autocomplete-V5-qslzS.mjs} +5 -7
- package/dist/avatar/index.mjs +2 -4
- package/dist/{avatar-DyLq0xkt.mjs → avatar-BtKVcvO4.mjs} +2 -4
- package/dist/avatar-stack/index.mjs +2 -6
- package/dist/{avatar-stack-BT0dBswq.mjs → avatar-stack-oVr8tsU7.mjs} +4 -6
- package/dist/badge/index.mjs +2 -3
- package/dist/{badge-BgFj4Nsc.mjs → badge-DJR33ftJ.mjs} +2 -4
- package/dist/breadcrumb/index.mjs +2 -4
- package/dist/{breadcrumb-CJNaYyk1.mjs → breadcrumb-B-9G347O.mjs} +2 -4
- package/dist/button/index.mjs +3 -4
- package/dist/{button-0N61fmAR.mjs → button-BllvE9Lm.mjs} +3 -5
- package/dist/{button-D6AORsOz.mjs → button-D3RrsMfQ.mjs} +2 -4
- package/dist/{link-button-Cby0p4LW.mjs → button-fO8nazJE.mjs} +3 -5
- package/dist/button-group/index.mjs +2 -5
- package/dist/{button-group-BDk8btAy.mjs → button-group-CYPka2zz.mjs} +3 -5
- package/dist/calendar/index.mjs +2 -5
- package/dist/{calendar-BtfraIvX.mjs → calendar-DEkCw7I1.mjs} +4 -6
- package/dist/{calendar-date-picker-B9mxJM7f.mjs → calendar-date-picker-DWK94_DC.mjs} +6 -8
- package/dist/card/index.mjs +2 -4
- package/dist/{card-BiHXFt4s.mjs → card-DKG1Cwlj.mjs} +3 -6
- package/dist/chart/index.mjs +2 -4
- package/dist/{chart-CL0i-xIt.mjs → chart-CUa21ynK.mjs} +2 -4
- package/dist/checkbox/index.mjs +2 -4
- package/dist/{checkbox-CQrjygFt.mjs → checkbox-I5BvrMPe.mjs} +3 -6
- package/dist/{close.icon-D2r5q3bj.mjs → close.icon-HCfS4Y-N.mjs} +2 -4
- package/dist/{cn-DWCc1QRE.mjs → cn-D2KYQ917.mjs} +1 -3
- package/dist/code-editor/index.mjs +2 -0
- package/dist/{col-C9PDhvm5.mjs → col-YBbQ5wlb.mjs} +2 -7
- package/dist/collapsible/index.mjs +2 -3
- package/dist/{collapsible-Dw71o2um.mjs → collapsible-CUphkSBt.mjs} +1 -3
- package/dist/command/index.mjs +2 -5
- package/dist/{command-DVroicgn.mjs → command-DqHWukGK.mjs} +3 -5
- package/dist/components/features/code-editor/code-editor-tabs.d.ts +63 -0
- package/dist/components/features/code-editor/code-editor-tabs.d.ts.map +1 -0
- package/dist/components/features/code-editor/code-editor.d.ts +58 -0
- package/dist/components/features/code-editor/code-editor.d.ts.map +1 -0
- package/dist/components/features/code-editor/index.d.ts +6 -0
- package/dist/components/features/code-editor/index.d.ts.map +1 -0
- package/dist/components/features/code-editor/lib/editor.d.ts +7 -0
- package/dist/components/features/code-editor/lib/editor.d.ts.map +1 -0
- package/dist/components/features/code-editor/types.d.ts +98 -0
- package/dist/components/features/code-editor/types.d.ts.map +1 -0
- package/dist/components/features/form/adapter-context.d.ts +17 -0
- package/dist/components/features/form/adapter-context.d.ts.map +1 -0
- package/dist/components/features/form/adapter-types.d.ts +100 -0
- package/dist/components/features/form/adapter-types.d.ts.map +1 -0
- package/dist/components/features/form/adapters/conform/conform-adapter.d.ts +9 -0
- package/dist/components/features/form/adapters/conform/conform-adapter.d.ts.map +1 -0
- package/dist/components/features/form/adapters/conform/conform-provider.d.ts +22 -0
- package/dist/components/features/form/adapters/conform/conform-provider.d.ts.map +1 -0
- package/dist/components/features/form/adapters/conform/index.d.ts +3 -0
- package/dist/components/features/form/adapters/conform/index.d.ts.map +1 -0
- package/dist/components/features/form/adapters/rhf/index.d.ts +3 -0
- package/dist/components/features/form/adapters/rhf/index.d.ts.map +1 -0
- package/dist/components/features/form/adapters/rhf/rhf-adapter.d.ts +10 -0
- package/dist/components/features/form/adapters/rhf/rhf-adapter.d.ts.map +1 -0
- package/dist/components/features/form/adapters/rhf/rhf-provider.d.ts +22 -0
- package/dist/components/features/form/adapters/rhf/rhf-provider.d.ts.map +1 -0
- package/dist/components/features/form/components/form-autocomplete.d.ts.map +1 -1
- package/dist/components/features/form/components/form-checkbox.d.ts.map +1 -1
- package/dist/components/features/form/components/form-copy-box.d.ts.map +1 -1
- package/dist/components/features/form/components/form-field-array.d.ts +5 -17
- package/dist/components/features/form/components/form-field-array.d.ts.map +1 -1
- package/dist/components/features/form/components/form-field.d.ts +7 -21
- package/dist/components/features/form/components/form-field.d.ts.map +1 -1
- package/dist/components/features/form/components/form-input-group.d.ts +4 -4
- package/dist/components/features/form/components/form-input-group.d.ts.map +1 -1
- package/dist/components/features/form/components/form-input.d.ts.map +1 -1
- package/dist/components/features/form/components/form-radio-group.d.ts.map +1 -1
- package/dist/components/features/form/components/form-root.d.ts +5 -25
- package/dist/components/features/form/components/form-root.d.ts.map +1 -1
- package/dist/components/features/form/components/form-select.d.ts.map +1 -1
- package/dist/components/features/form/components/form-switch.d.ts.map +1 -1
- package/dist/components/features/form/components/form-textarea.d.ts.map +1 -1
- package/dist/components/features/form/components/stepper/form-stepper.d.ts.map +1 -1
- package/dist/components/features/form/context/form-context.d.ts +2 -2
- package/dist/components/features/form/context/form-context.d.ts.map +1 -1
- package/dist/components/features/form/hooks/use-field.d.ts +12 -18
- package/dist/components/features/form/hooks/use-field.d.ts.map +1 -1
- package/dist/components/features/form/hooks/use-watch.d.ts +9 -20
- package/dist/components/features/form/hooks/use-watch.d.ts.map +1 -1
- package/dist/components/features/form/index.d.ts +33 -27
- package/dist/components/features/form/index.d.ts.map +1 -1
- package/dist/components/features/form/types/index.d.ts +32 -32
- package/dist/components/features/form/types/index.d.ts.map +1 -1
- package/dist/components/features/form/utils/get-field-constraints.d.ts +11 -0
- package/dist/components/features/form/utils/get-field-constraints.d.ts.map +1 -0
- package/dist/components/features/index.d.ts +1 -0
- package/dist/components/features/index.d.ts.map +1 -1
- package/dist/components/toast.d.ts +2 -0
- package/dist/components/toast.d.ts.map +1 -0
- package/dist/data-table/index.mjs +21 -51
- package/dist/date-picker/index.mjs +3 -10
- package/dist/dialog/index.mjs +2 -5
- package/dist/{dialog-B0B3Kbfk.mjs → dialog-Bm2H9lrx.mjs} +4 -6
- package/dist/{dialog-DdrHeboM.mjs → dialog-DASRaFxD.mjs} +2 -4
- package/dist/dropdown/index.mjs +2 -3
- package/dist/{dropdown-Cdx7rOKv.mjs → dropdown-DZiAt-jS.mjs} +3 -5
- package/dist/{dropdown-menu-CdShrDz_.mjs → dropdown-menu-lALvDnab.mjs} +5 -7
- package/dist/dropzone/index.mjs +2 -5
- package/dist/{dropzone-B6kSN3DY.mjs → dropzone-ogtpQ4fy.mjs} +5 -8
- package/dist/empty-content/index.mjs +2 -3
- package/dist/{empty-content-B1lwLr40.mjs → empty-content-C63GPJ5d.mjs} +3 -9
- package/dist/form/adapters/conform/index.mjs +237 -0
- package/dist/form/adapters/rhf/index.mjs +181 -0
- package/dist/form/index.mjs +3 -146
- package/dist/{use-stepper-DigoyHhX.mjs → form-BE1xBne4.mjs} +447 -601
- package/dist/get-field-constraints-BPMW8VvY.mjs +48 -0
- package/dist/grid/index.mjs +2 -3
- package/dist/hooks/index.mjs +3 -4
- package/dist/{use-debounce-MnfjH51L.mjs → hooks-DYjN7lvC.mjs} +1 -3
- package/dist/hover-card/index.mjs +2 -4
- package/dist/{hover-card-CEIauuie.mjs → hover-card-DDWWD5Hx.mjs} +2 -4
- package/dist/{icon-wrapper-BBK4z4tj.mjs → icon-wrapper-DuLp3RM1.mjs} +1 -3
- package/dist/icons/index.mjs +4 -5
- package/dist/index.mjs +66 -71
- package/dist/input/index.mjs +2 -5
- package/dist/{input-DEMoi_8F.mjs → input-DOmNpcQJ.mjs} +2 -4
- package/dist/{input-CYFN0Ap2.mjs → input-FKGqZypx.mjs} +3 -5
- package/dist/input-group/index.mjs +2 -7
- package/dist/{input-group-DJgYpOlq.mjs → input-group-DDtz-RT7.mjs} +5 -7
- package/dist/input-number/index.mjs +2 -6
- package/dist/{input-number-Cuy9CCg_.mjs → input-number-DEjXG2I6.mjs} +4 -6
- package/dist/input-with-addons/index.mjs +28 -3
- package/dist/label/index.mjs +2 -4
- package/dist/{label-mOg07fuQ.mjs → label-cnAhY-ej.mjs} +3 -6
- package/dist/loader-overlay/index.mjs +2 -3
- package/dist/{loader-overlay-8IWX_1Ga.mjs → loader-overlay-BTFdkp7W.mjs} +3 -5
- package/dist/map/index.mjs +2 -14
- package/dist/{map-CaI1EshG.mjs → map-Cw7u8r6E.mjs} +10 -14
- package/dist/{map-leaflet-imports-J7w1V7mh.mjs → map-leaflet-imports-D6nTEOIh.mjs} +1 -2
- package/dist/more-actions/index.mjs +2 -5
- package/dist/{more-actions-BO5ikUxY.mjs → more-actions-BNQ2yfWZ.mjs} +5 -7
- package/dist/nprogress/index.mjs +1 -3
- package/dist/page-title/index.mjs +2 -3
- package/dist/{page-title-DWteBy1E.mjs → page-title-CNiRNZ7p.mjs} +2 -4
- package/dist/popover/index.mjs +2 -4
- package/dist/{popover-ugw5MpuT.mjs → popover-FJAcbYoH.mjs} +2 -4
- package/dist/radio-group/index.mjs +2 -4
- package/dist/{radio-group-_gMymwnb.mjs → radio-group-CiITR0LO.mjs} +3 -6
- package/dist/select/index.mjs +2 -4
- package/dist/{select-BZOKWjlH.mjs → select-CiLR_DiQ.mjs} +3 -6
- package/dist/separator/index.mjs +2 -4
- package/dist/{separator-BzyALya2.mjs → separator-DXVTncCK.mjs} +2 -4
- package/dist/sheet/index.mjs +3 -5
- package/dist/{sheet-BX6lae56.mjs → sheet-BzXksqYY.mjs} +4 -6
- package/dist/{sheet-DAcFjaGw.mjs → sheet-Di3b-oPu.mjs} +2 -4
- package/dist/sidebar/index.mjs +2 -10
- package/dist/{sidebar-B3EV33mG.mjs → sidebar-BnhnjvfO.mjs} +10 -14
- package/dist/skeleton/index.mjs +2 -5
- package/dist/{skeleton-2vQ0vFQk.mjs → skeleton-BKl4mfJt.mjs} +2 -4
- package/dist/{skeleton-BgOwIgE0.mjs → skeleton-D1MUhAVo.mjs} +3 -5
- package/dist/spinner/index.mjs +2 -4
- package/dist/{spinner-osyXAlhr.mjs → spinner-OyOf9-Yu.mjs} +2 -4
- package/dist/{spinner.icon-C0MbtgqX.mjs → spinner.icon-C-vjSM6o.mjs} +2 -4
- package/dist/stepper/index.mjs +321 -5
- package/dist/switch/index.mjs +2 -4
- package/dist/{switch-C60FpEal.mjs → switch-DQJQhPIQ.mjs} +3 -6
- package/dist/table/index.mjs +2 -4
- package/dist/{table-Cl3UzIhI.mjs → table-Cdsh-39-.mjs} +2 -4
- package/dist/tabs/index.mjs +50 -3
- package/dist/tag-input/index.mjs +2 -5
- package/dist/{tag-input-DR2gukhL.mjs → tag-input-BKed-cul.mjs} +5 -7
- package/dist/task-queue/index.mjs +2 -7
- package/dist/{task-queue-dropdown-C9KHKbGh.mjs → task-queue-dropdown-Di_Wjspz.mjs} +10 -30
- package/dist/textarea/index.mjs +2 -5
- package/dist/{textarea-CVo38n3S.mjs → textarea-94vq_G_S.mjs} +2 -4
- package/dist/{textarea-CZF5n57i.mjs → textarea-BwD-MmTV.mjs} +3 -5
- package/dist/theme/index.mjs +2 -3
- package/dist/{theme.provider-TUHlMsjM.mjs → themes-DG1md8FI.mjs} +1 -6
- package/dist/{to-api-format-naIpF-NI.mjs → to-api-format-Cq4prffn.mjs} +9 -18
- package/dist/toast/index.mjs +3 -3
- package/dist/{use-toast-By9HuFwP.mjs → toast-BWnN5fax.mjs} +5 -42
- package/dist/toast-DpxlFNNx.mjs +37 -0
- package/dist/tooltip/index.mjs +2 -4
- package/dist/{tooltip-CuX2jQA9.mjs → tooltip-Cruvl5F6.mjs} +3 -6
- package/dist/types-BZNk3q65.mjs +357 -0
- package/dist/typography/index.mjs +2 -3
- package/dist/{typography-Iap9fU5P.mjs → typography-ClB8k55E.mjs} +2 -4
- package/dist/{use-copy-to-clipboard-n29wJwvW.mjs → use-copy-to-clipboard-BGdTmkFV.mjs} +2 -4
- package/dist/utils/index.mjs +2 -3
- package/dist/{utils-DJboNGQM.mjs → utils-C8KwMfT_.mjs} +1 -3
- package/dist/visually-hidden/index.mjs +2 -3
- package/dist/{visuallyhidden-BJsQCmg-.mjs → visuallyhidden-BLUsJpYH.mjs} +1 -3
- package/package.json +44 -3
- package/dist/input-with-addons-B8rzNhpq.mjs +0 -30
- package/dist/stepper-BMsn7I78.mjs +0 -323
- package/dist/tabs-DJU7JA3h.mjs +0 -52
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { t as cn } from "./utils-
|
|
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-
|
|
2
|
-
import { t as Textarea$1 } from "./textarea-
|
|
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 };
|
package/dist/theme/index.mjs
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import { i as ClientOnly, n as useTheme, r as ThemeScript, t as ThemeProvider } from "../
|
|
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-
|
|
2
|
-
import { t as Button } from "./button-
|
|
3
|
-
import { t as Separator } from "./separator-
|
|
4
|
-
import { t as Icon } from "./icon-wrapper-
|
|
5
|
-
import { t as Calendar$1 } from "./calendar-
|
|
6
|
-
import { t as Input } from "./input-
|
|
7
|
-
import { i as PopoverTrigger, r as PopoverContent, t as Popover } from "./popover-
|
|
8
|
-
import { i as SelectItem, l as SelectTrigger, n as SelectContent, t as Select, u as SelectValue } from "./select-
|
|
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 };
|
package/dist/toast/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
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-
|
|
2
|
-
import { t as CloseIcon } from "./close.icon-
|
|
3
|
-
import { createElement
|
|
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 {
|
|
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
|
-
|
|
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 };
|
package/dist/tooltip/index.mjs
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { t as cn } from "./cn-
|
|
2
|
-
import { t as cn$1 } from "./utils-
|
|
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-
|
|
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 };
|