@wow-two-beta/ui 0.0.14 → 0.0.15

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 (97) hide show
  1. package/dist/actions/index.d.ts +1 -0
  2. package/dist/actions/index.d.ts.map +1 -1
  3. package/dist/actions/index.js +3 -3
  4. package/dist/actions/speedDial/SpeedDial.d.ts +38 -0
  5. package/dist/actions/speedDial/SpeedDial.d.ts.map +1 -0
  6. package/dist/actions/speedDial/index.d.ts +3 -0
  7. package/dist/actions/speedDial/index.d.ts.map +1 -0
  8. package/dist/{chunk-FS6DTWWH.js → chunk-2VAZKEQD.js} +6 -231
  9. package/dist/chunk-2VAZKEQD.js.map +1 -0
  10. package/dist/{chunk-RIW2V3N4.js → chunk-3IN5ULKY.js} +213 -5
  11. package/dist/chunk-3IN5ULKY.js.map +1 -0
  12. package/dist/{chunk-UGHPZ3I7.js → chunk-4ESR253U.js} +331 -5
  13. package/dist/chunk-4ESR253U.js.map +1 -0
  14. package/dist/chunk-ASIHQQDQ.js +27 -0
  15. package/dist/chunk-ASIHQQDQ.js.map +1 -0
  16. package/dist/chunk-FFQENBTW.js +31 -0
  17. package/dist/chunk-FFQENBTW.js.map +1 -0
  18. package/dist/{chunk-BQTO7XY6.js → chunk-ILYL6ROC.js} +548 -33
  19. package/dist/chunk-ILYL6ROC.js.map +1 -0
  20. package/dist/{chunk-YMSAS7M7.js → chunk-NC2CBGX2.js} +24 -4
  21. package/dist/chunk-NC2CBGX2.js.map +1 -0
  22. package/dist/{chunk-ULAOIBCP.js → chunk-NRAJPSEK.js} +164 -7
  23. package/dist/chunk-NRAJPSEK.js.map +1 -0
  24. package/dist/chunk-SM2TOB4U.js +641 -0
  25. package/dist/chunk-SM2TOB4U.js.map +1 -0
  26. package/dist/{chunk-ASXB42MH.js → chunk-W7LQZKTH.js} +246 -42
  27. package/dist/chunk-W7LQZKTH.js.map +1 -0
  28. package/dist/chunk-XHGWBSIR.js +222 -0
  29. package/dist/chunk-XHGWBSIR.js.map +1 -0
  30. package/dist/chunk-ZCA365IX.js +44 -0
  31. package/dist/chunk-ZCA365IX.js.map +1 -0
  32. package/dist/display/carousel/Carousel.d.ts +47 -0
  33. package/dist/display/carousel/Carousel.d.ts.map +1 -0
  34. package/dist/display/carousel/index.d.ts +3 -0
  35. package/dist/display/carousel/index.d.ts.map +1 -0
  36. package/dist/display/index.d.ts +1 -0
  37. package/dist/display/index.d.ts.map +1 -1
  38. package/dist/display/index.js +4 -3
  39. package/dist/feedback/index.d.ts +2 -0
  40. package/dist/feedback/index.d.ts.map +1 -1
  41. package/dist/feedback/index.js +4 -1
  42. package/dist/feedback/loadingOverlay/LoadingOverlay.d.ts +19 -0
  43. package/dist/feedback/loadingOverlay/LoadingOverlay.d.ts.map +1 -0
  44. package/dist/feedback/loadingOverlay/index.d.ts +2 -0
  45. package/dist/feedback/loadingOverlay/index.d.ts.map +1 -0
  46. package/dist/feedback/toaster/Toaster.d.ts +49 -0
  47. package/dist/feedback/toaster/Toaster.d.ts.map +1 -0
  48. package/dist/feedback/toaster/index.d.ts +2 -0
  49. package/dist/feedback/toaster/index.d.ts.map +1 -0
  50. package/dist/forms/editable/Editable.d.ts +37 -0
  51. package/dist/forms/editable/Editable.d.ts.map +1 -0
  52. package/dist/forms/editable/index.d.ts +3 -0
  53. package/dist/forms/editable/index.d.ts.map +1 -0
  54. package/dist/forms/fileUpload/FileUpload.d.ts +25 -0
  55. package/dist/forms/fileUpload/FileUpload.d.ts.map +1 -0
  56. package/dist/forms/fileUpload/index.d.ts +2 -0
  57. package/dist/forms/fileUpload/index.d.ts.map +1 -0
  58. package/dist/forms/index.d.ts +3 -0
  59. package/dist/forms/index.d.ts.map +1 -1
  60. package/dist/forms/index.js +8 -4
  61. package/dist/forms/tagsInput/TagsInput.d.ts +26 -0
  62. package/dist/forms/tagsInput/TagsInput.d.ts.map +1 -0
  63. package/dist/forms/tagsInput/index.d.ts +2 -0
  64. package/dist/forms/tagsInput/index.d.ts.map +1 -0
  65. package/dist/index.js +13 -9
  66. package/dist/layout/index.d.ts +1 -0
  67. package/dist/layout/index.d.ts.map +1 -1
  68. package/dist/layout/index.js +3 -1
  69. package/dist/layout/resizablePanels/ResizablePanels.d.ts +27 -0
  70. package/dist/layout/resizablePanels/ResizablePanels.d.ts.map +1 -0
  71. package/dist/layout/resizablePanels/index.d.ts +3 -0
  72. package/dist/layout/resizablePanels/index.d.ts.map +1 -0
  73. package/dist/nav/commandPalette/CommandPalette.d.ts +48 -0
  74. package/dist/nav/commandPalette/CommandPalette.d.ts.map +1 -0
  75. package/dist/nav/commandPalette/index.d.ts +3 -0
  76. package/dist/nav/commandPalette/index.d.ts.map +1 -0
  77. package/dist/nav/index.d.ts +1 -0
  78. package/dist/nav/index.d.ts.map +1 -1
  79. package/dist/nav/index.js +6 -3
  80. package/dist/overlays/index.js +5 -3
  81. package/dist/primitives/announce/Announce.d.ts +13 -0
  82. package/dist/primitives/announce/Announce.d.ts.map +1 -0
  83. package/dist/primitives/announce/index.d.ts +2 -0
  84. package/dist/primitives/announce/index.d.ts.map +1 -0
  85. package/dist/primitives/index.d.ts +1 -0
  86. package/dist/primitives/index.d.ts.map +1 -1
  87. package/dist/primitives/index.js +2 -2
  88. package/package.json +1 -1
  89. package/dist/chunk-ASXB42MH.js.map +0 -1
  90. package/dist/chunk-BQTO7XY6.js.map +0 -1
  91. package/dist/chunk-FS6DTWWH.js.map +0 -1
  92. package/dist/chunk-NKGNOOXJ.js +0 -330
  93. package/dist/chunk-NKGNOOXJ.js.map +0 -1
  94. package/dist/chunk-RIW2V3N4.js.map +0 -1
  95. package/dist/chunk-UGHPZ3I7.js.map +0 -1
  96. package/dist/chunk-ULAOIBCP.js.map +0 -1
  97. package/dist/chunk-YMSAS7M7.js.map +0 -1
@@ -1,15 +1,17 @@
1
- import { PopoverTrigger, Popover, PopoverContent } from './chunk-FS6DTWWH.js';
1
+ import { listboxVariants, listboxItemVariants, listboxGroupLabelVariants, listboxSeparatorVariants, listboxEmptyVariants } from './chunk-FFQENBTW.js';
2
+ import { PopoverTrigger, Popover, PopoverContent } from './chunk-2VAZKEQD.js';
3
+ import { Tag } from './chunk-ZCA365IX.js';
2
4
  import { useControlled } from './chunk-4P2TFUVW.js';
3
- import { useFormControl, FormControlProvider, RovingFocusGroup, useRovingFocusItem, Portal, AnchoredPositioner, DismissableLayer } from './chunk-YMSAS7M7.js';
4
- import { useId } from './chunk-KDXJQNB6.js';
5
5
  import { tv, dataAttr } from './chunk-BMBIZLO4.js';
6
6
  import { Icon } from './chunk-TDX22OWF.js';
7
+ import { useFormControl, FormControlProvider, RovingFocusGroup, useRovingFocusItem, Portal, AnchoredPositioner, DismissableLayer } from './chunk-NC2CBGX2.js';
7
8
  import { composeRefs } from './chunk-DN7WBRIV.js';
9
+ import { useId } from './chunk-KDXJQNB6.js';
8
10
  import { cn } from './chunk-KZ4VFY2T.js';
9
11
  import * as React from 'react';
10
12
  import { forwardRef, useRef, useImperativeHandle, useState, Children, isValidElement, cloneElement, useId as useId$1, createContext, useMemo, useCallback, useEffect, useContext } from 'react';
11
13
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
12
- import { Minus, Plus, EyeOff, Eye, Search, X, Check, Upload, ChevronDown, Calendar as Calendar$1, Clock, ChevronLeft, ChevronRight } from 'lucide-react';
14
+ import { Minus, Plus, EyeOff, Eye, Search, X, Check, Upload, ChevronDown, Calendar as Calendar$1, Clock, UploadCloud, ChevronLeft, ChevronRight } from 'lucide-react';
13
15
 
14
16
  var Label = forwardRef(
15
17
  ({ className, required, htmlFor, id, children, ...props }, ref) => {
@@ -1115,32 +1117,6 @@ var FilePicker = forwardRef(
1115
1117
  }
1116
1118
  );
1117
1119
  FilePicker.displayName = "FilePicker";
1118
-
1119
- // src/forms/listbox/Listbox.variants.ts
1120
- var listboxVariants = tv({
1121
- base: "flex max-h-72 flex-col gap-0.5 overflow-y-auto rounded-md border border-border bg-popover p-1 text-sm text-popover-foreground shadow-md outline-none"
1122
- });
1123
- var listboxItemVariants = tv({
1124
- base: "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none",
1125
- variants: {
1126
- state: {
1127
- default: "text-popover-foreground",
1128
- active: "bg-muted text-foreground",
1129
- selected: "bg-primary-soft text-primary-soft-foreground",
1130
- disabled: "pointer-events-none opacity-50"
1131
- }
1132
- },
1133
- defaultVariants: { state: "default" }
1134
- });
1135
- var listboxGroupLabelVariants = tv({
1136
- base: "px-2 py-1.5 text-xs font-semibold text-muted-foreground"
1137
- });
1138
- var listboxSeparatorVariants = tv({
1139
- base: "-mx-1 my-1 h-px bg-border"
1140
- });
1141
- var listboxEmptyVariants = tv({
1142
- base: "px-2 py-6 text-center text-sm text-muted-foreground"
1143
- });
1144
1120
  var ListboxContext = createContext(null);
1145
1121
  function useListboxContext() {
1146
1122
  const ctx = useContext(ListboxContext);
@@ -3725,7 +3701,546 @@ var StepperPanel = forwardRef(function StepperPanel2({ value, className, childre
3725
3701
  Stepper.List = StepperList;
3726
3702
  Stepper.Step = StepperStep;
3727
3703
  Stepper.Panel = StepperPanel;
3704
+ var TagsInput = forwardRef(function TagsInput2({
3705
+ value,
3706
+ defaultValue,
3707
+ onValueChange,
3708
+ inputValue,
3709
+ onInputChange,
3710
+ placeholder = "Add tag\u2026",
3711
+ delimiters = [","],
3712
+ validate = (t) => t.trim().length > 0,
3713
+ allowDuplicates = false,
3714
+ max,
3715
+ invalid,
3716
+ disabled,
3717
+ readOnly,
3718
+ name,
3719
+ tagVariant = "neutral",
3720
+ size,
3721
+ className,
3722
+ onKeyDown,
3723
+ onBlur,
3724
+ ...rest
3725
+ }, forwardedRef) {
3726
+ const [tags, setTags] = useControlled({
3727
+ controlled: value,
3728
+ default: defaultValue ?? [],
3729
+ onChange: onValueChange
3730
+ });
3731
+ const [text, setText] = useControlled({
3732
+ controlled: inputValue,
3733
+ default: "",
3734
+ onChange: onInputChange
3735
+ });
3736
+ const inputRef = useRef(null);
3737
+ const [pendingDelete, setPendingDelete] = useState(false);
3738
+ const state = invalid ? "invalid" : "default";
3739
+ const commit = useCallback(
3740
+ (raw) => {
3741
+ const trimmed = raw.trim();
3742
+ if (!trimmed || !validate(trimmed)) return;
3743
+ if (!allowDuplicates && tags.includes(trimmed)) return;
3744
+ if (max != null && tags.length >= max) return;
3745
+ setTags([...tags, trimmed]);
3746
+ setText("");
3747
+ },
3748
+ [tags, validate, allowDuplicates, max, setTags, setText]
3749
+ );
3750
+ const removeAt = useCallback(
3751
+ (idx) => {
3752
+ setTags(tags.filter((_, i) => i !== idx));
3753
+ },
3754
+ [tags, setTags]
3755
+ );
3756
+ const handleKeyDown = (e) => {
3757
+ onKeyDown?.(e);
3758
+ if (e.defaultPrevented || disabled || readOnly) return;
3759
+ if (e.key === "Enter" || e.key === "Tab" && text) {
3760
+ if (text) {
3761
+ e.preventDefault();
3762
+ commit(text);
3763
+ setPendingDelete(false);
3764
+ }
3765
+ return;
3766
+ }
3767
+ if (delimiters.includes(e.key)) {
3768
+ e.preventDefault();
3769
+ commit(text);
3770
+ setPendingDelete(false);
3771
+ return;
3772
+ }
3773
+ if (e.key === "Backspace" && !text && tags.length > 0) {
3774
+ if (pendingDelete) {
3775
+ e.preventDefault();
3776
+ removeAt(tags.length - 1);
3777
+ setPendingDelete(false);
3778
+ } else {
3779
+ setPendingDelete(true);
3780
+ }
3781
+ return;
3782
+ }
3783
+ setPendingDelete(false);
3784
+ };
3785
+ const handleContainerClick = (e) => {
3786
+ if (e.target === e.currentTarget) inputRef.current?.focus();
3787
+ };
3788
+ return /* @__PURE__ */ jsxs(
3789
+ "div",
3790
+ {
3791
+ role: "group",
3792
+ onClick: handleContainerClick,
3793
+ "data-disabled": disabled || void 0,
3794
+ "data-readonly": readOnly || void 0,
3795
+ "data-invalid": invalid || void 0,
3796
+ className: cn(
3797
+ inputBaseVariants({ size, state }),
3798
+ "h-auto min-h-10 flex-wrap items-center gap-1.5 py-1.5",
3799
+ disabled && "cursor-not-allowed opacity-60",
3800
+ className
3801
+ ),
3802
+ children: [
3803
+ tags.map((t, i) => /* @__PURE__ */ jsx(
3804
+ Tag,
3805
+ {
3806
+ variant: tagVariant,
3807
+ "data-pending-delete": pendingDelete && i === tags.length - 1 ? "" : void 0,
3808
+ onClose: !disabled && !readOnly ? () => removeAt(i) : void 0,
3809
+ className: cn(pendingDelete && i === tags.length - 1 && "ring-1 ring-ring"),
3810
+ children: t
3811
+ },
3812
+ `${t}-${i}`
3813
+ )),
3814
+ /* @__PURE__ */ jsx(
3815
+ "input",
3816
+ {
3817
+ ...rest,
3818
+ ref: composeRefs(forwardedRef, inputRef),
3819
+ type: "text",
3820
+ value: text,
3821
+ placeholder: tags.length === 0 ? placeholder : void 0,
3822
+ disabled,
3823
+ readOnly,
3824
+ "aria-invalid": invalid || void 0,
3825
+ onChange: (e) => setText(e.target.value),
3826
+ onKeyDown: handleKeyDown,
3827
+ onBlur: (e) => {
3828
+ onBlur?.(e);
3829
+ if (text) commit(text);
3830
+ setPendingDelete(false);
3831
+ },
3832
+ className: "min-w-[6rem] flex-1 border-0 bg-transparent p-0 text-sm outline-none placeholder:text-subtle-foreground disabled:cursor-not-allowed"
3833
+ }
3834
+ ),
3835
+ name && /* @__PURE__ */ jsx("input", { type: "hidden", name, value: tags.join(",") })
3836
+ ]
3837
+ }
3838
+ );
3839
+ });
3840
+ TagsInput.displayName = "TagsInput";
3841
+ function matchesAccept(file, accept) {
3842
+ if (!accept) return true;
3843
+ const tokens = accept.split(",").map((t) => t.trim().toLowerCase()).filter(Boolean);
3844
+ if (tokens.length === 0) return true;
3845
+ const fileType = file.type.toLowerCase();
3846
+ const fileName = file.name.toLowerCase();
3847
+ return tokens.some((t) => {
3848
+ if (t.startsWith(".")) return fileName.endsWith(t);
3849
+ if (t.endsWith("/*")) return fileType.startsWith(t.slice(0, -1));
3850
+ return fileType === t;
3851
+ });
3852
+ }
3853
+ var FileUpload = forwardRef(function FileUpload2({
3854
+ accept,
3855
+ multiple = false,
3856
+ maxSize,
3857
+ maxFiles,
3858
+ onFilesChange,
3859
+ disabled,
3860
+ invalid,
3861
+ label = "Drop files here, or click to browse",
3862
+ hint,
3863
+ children,
3864
+ className,
3865
+ name,
3866
+ ...rest
3867
+ }, forwardedRef) {
3868
+ const inputRef = useRef(null);
3869
+ useImperativeHandle(forwardedRef, () => inputRef.current);
3870
+ const dragCounter = useRef(0);
3871
+ const [dragState, setDragState] = useState("idle");
3872
+ const partition = useCallback(
3873
+ (files) => {
3874
+ const accepted = [];
3875
+ const rejected = [];
3876
+ const arr = Array.from(files);
3877
+ for (const f of arr) {
3878
+ if (!matchesAccept(f, accept)) {
3879
+ rejected.push({ file: f, reason: "type" });
3880
+ continue;
3881
+ }
3882
+ if (maxSize != null && f.size > maxSize) {
3883
+ rejected.push({ file: f, reason: "size" });
3884
+ continue;
3885
+ }
3886
+ accepted.push(f);
3887
+ }
3888
+ if (maxFiles != null && accepted.length > maxFiles) {
3889
+ const overflow = accepted.splice(maxFiles);
3890
+ for (const f of overflow) rejected.push({ file: f, reason: "count" });
3891
+ }
3892
+ return [accepted, rejected];
3893
+ },
3894
+ [accept, maxSize, maxFiles]
3895
+ );
3896
+ const openPicker = () => {
3897
+ if (!disabled) inputRef.current?.click();
3898
+ };
3899
+ const handleDragEnter = (e) => {
3900
+ if (disabled) return;
3901
+ e.preventDefault();
3902
+ dragCounter.current += 1;
3903
+ const items = e.dataTransfer?.items;
3904
+ let reject = false;
3905
+ if (items && (accept || maxSize)) {
3906
+ if (accept) {
3907
+ const tokens = accept.split(",").map((t) => t.trim().toLowerCase()).filter(Boolean);
3908
+ for (let i = 0; i < items.length; i++) {
3909
+ const it = items[i];
3910
+ if (!it || it.kind !== "file") continue;
3911
+ const t = it.type.toLowerCase();
3912
+ const ok = tokens.some((tk) => {
3913
+ if (tk.startsWith(".")) return false;
3914
+ if (tk.endsWith("/*")) return t.startsWith(tk.slice(0, -1));
3915
+ return t === tk;
3916
+ });
3917
+ if (!ok) {
3918
+ reject = true;
3919
+ break;
3920
+ }
3921
+ }
3922
+ }
3923
+ }
3924
+ setDragState(reject ? "reject" : "over");
3925
+ };
3926
+ const handleDragOver = (e) => {
3927
+ if (disabled) return;
3928
+ e.preventDefault();
3929
+ e.dataTransfer.dropEffect = "copy";
3930
+ };
3931
+ const handleDragLeave = (e) => {
3932
+ if (disabled) return;
3933
+ e.preventDefault();
3934
+ dragCounter.current -= 1;
3935
+ if (dragCounter.current <= 0) {
3936
+ dragCounter.current = 0;
3937
+ setDragState("idle");
3938
+ }
3939
+ };
3940
+ const handleDrop = (e) => {
3941
+ if (disabled) return;
3942
+ e.preventDefault();
3943
+ dragCounter.current = 0;
3944
+ setDragState("idle");
3945
+ const files = e.dataTransfer?.files;
3946
+ if (!files || files.length === 0) return;
3947
+ const [accepted, rejected] = partition(files);
3948
+ onFilesChange?.(accepted, rejected);
3949
+ };
3950
+ const handleKeyDown = (e) => {
3951
+ if (disabled) return;
3952
+ if (e.key === "Enter" || e.key === " ") {
3953
+ e.preventDefault();
3954
+ openPicker();
3955
+ }
3956
+ };
3957
+ const showError = invalid || dragState === "reject";
3958
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-3", className), children: [
3959
+ /* @__PURE__ */ jsxs(
3960
+ "div",
3961
+ {
3962
+ role: "button",
3963
+ tabIndex: disabled ? -1 : 0,
3964
+ "aria-disabled": disabled || void 0,
3965
+ "data-drag-state": dragState,
3966
+ "data-invalid": showError || void 0,
3967
+ onClick: openPicker,
3968
+ onKeyDown: handleKeyDown,
3969
+ onDragEnter: handleDragEnter,
3970
+ onDragOver: handleDragOver,
3971
+ onDragLeave: handleDragLeave,
3972
+ onDrop: handleDrop,
3973
+ className: cn(
3974
+ "flex flex-col items-center justify-center gap-2 rounded-md border-2 border-dashed border-input bg-background px-6 py-10 text-center text-sm text-muted-foreground transition-colors",
3975
+ "hover:border-border-strong hover:bg-muted/40",
3976
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
3977
+ dragState === "over" && "border-primary bg-primary-soft/30 text-foreground",
3978
+ showError && "border-destructive bg-destructive-soft/30 text-destructive",
3979
+ disabled && "cursor-not-allowed opacity-60 hover:border-input hover:bg-background"
3980
+ ),
3981
+ children: [
3982
+ /* @__PURE__ */ jsx(
3983
+ Icon,
3984
+ {
3985
+ icon: UploadCloud,
3986
+ size: 28,
3987
+ className: cn(
3988
+ "text-muted-foreground",
3989
+ dragState === "over" && "text-primary",
3990
+ showError && "text-destructive"
3991
+ )
3992
+ }
3993
+ ),
3994
+ /* @__PURE__ */ jsx("div", { className: "font-medium text-foreground", children: label }),
3995
+ hint && /* @__PURE__ */ jsx("div", { className: "text-xs", children: hint }),
3996
+ /* @__PURE__ */ jsx(
3997
+ "input",
3998
+ {
3999
+ ...rest,
4000
+ ref: inputRef,
4001
+ type: "file",
4002
+ accept,
4003
+ multiple,
4004
+ disabled,
4005
+ name,
4006
+ className: "sr-only",
4007
+ onChange: (e) => {
4008
+ const files = e.target.files;
4009
+ if (!files || files.length === 0) return;
4010
+ const [accepted, rejected] = partition(files);
4011
+ onFilesChange?.(accepted, rejected);
4012
+ e.target.value = "";
4013
+ }
4014
+ }
4015
+ )
4016
+ ]
4017
+ }
4018
+ ),
4019
+ children
4020
+ ] });
4021
+ });
4022
+ FileUpload.displayName = "FileUpload";
4023
+ var EditableContext = createContext(null);
4024
+ function useEditableContext() {
4025
+ const ctx = useContext(EditableContext);
4026
+ if (!ctx) throw new Error("Editable.* must be used inside <Editable>");
4027
+ return ctx;
4028
+ }
4029
+ function Editable({
4030
+ value: valueProp,
4031
+ defaultValue,
4032
+ onValueChange,
4033
+ editing: editingProp,
4034
+ defaultEditing = false,
4035
+ onEditingChange,
4036
+ placeholder = "Click to edit",
4037
+ submitOnBlur = true,
4038
+ submitOnEnter = true,
4039
+ cancelOnEscape = true,
4040
+ disabled = false,
4041
+ readOnly = false,
4042
+ name,
4043
+ className,
4044
+ children
4045
+ }) {
4046
+ const [value, setValue] = useControlled({
4047
+ controlled: valueProp,
4048
+ default: defaultValue ?? "",
4049
+ onChange: onValueChange
4050
+ });
4051
+ const [editing, setEditing] = useControlled({
4052
+ controlled: editingProp,
4053
+ default: defaultEditing,
4054
+ onChange: onEditingChange
4055
+ });
4056
+ const [draft, setDraft] = useState(value);
4057
+ const inputRef = useRef(null);
4058
+ useEffect(() => {
4059
+ if (editing) setDraft(value);
4060
+ }, [editing, value]);
4061
+ const submit = useCallback(() => {
4062
+ setValue(draft);
4063
+ setEditing(false);
4064
+ }, [draft, setValue, setEditing]);
4065
+ const cancel = useCallback(() => {
4066
+ setDraft(value);
4067
+ setEditing(false);
4068
+ }, [value, setEditing]);
4069
+ const ctx = useMemo(
4070
+ () => ({
4071
+ value,
4072
+ draft,
4073
+ setDraft,
4074
+ editing,
4075
+ setEditing,
4076
+ submit,
4077
+ cancel,
4078
+ placeholder,
4079
+ disabled,
4080
+ readOnly,
4081
+ submitOnBlur,
4082
+ submitOnEnter,
4083
+ cancelOnEscape,
4084
+ inputRef
4085
+ }),
4086
+ [
4087
+ value,
4088
+ draft,
4089
+ editing,
4090
+ setEditing,
4091
+ submit,
4092
+ cancel,
4093
+ placeholder,
4094
+ disabled,
4095
+ readOnly,
4096
+ submitOnBlur,
4097
+ submitOnEnter,
4098
+ cancelOnEscape
4099
+ ]
4100
+ );
4101
+ return /* @__PURE__ */ jsx(EditableContext.Provider, { value: ctx, children: /* @__PURE__ */ jsxs("div", { className: cn("inline-flex items-center gap-1.5", className), children: [
4102
+ children,
4103
+ name && /* @__PURE__ */ jsx("input", { type: "hidden", name, value })
4104
+ ] }) });
4105
+ }
4106
+ var EditablePreview = forwardRef(
4107
+ function EditablePreview2({ className, onClick, onKeyDown, ...rest }, forwardedRef) {
4108
+ const ctx = useEditableContext();
4109
+ if (ctx.editing) return null;
4110
+ const isEmpty = !ctx.value;
4111
+ const interactive = !ctx.disabled && !ctx.readOnly;
4112
+ return /* @__PURE__ */ jsx(
4113
+ "span",
4114
+ {
4115
+ ref: forwardedRef,
4116
+ role: interactive ? "button" : void 0,
4117
+ tabIndex: interactive ? 0 : -1,
4118
+ "aria-disabled": !interactive || void 0,
4119
+ onClick: (e) => {
4120
+ onClick?.(e);
4121
+ if (e.defaultPrevented || !interactive) return;
4122
+ ctx.setEditing(true);
4123
+ },
4124
+ onKeyDown: (e) => {
4125
+ onKeyDown?.(e);
4126
+ if (e.defaultPrevented || !interactive) return;
4127
+ if (e.key === "Enter" || e.key === " ") {
4128
+ e.preventDefault();
4129
+ ctx.setEditing(true);
4130
+ }
4131
+ },
4132
+ className: cn(
4133
+ "cursor-text rounded-sm px-1 py-0.5 text-sm text-foreground transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
4134
+ isEmpty && "italic text-subtle-foreground",
4135
+ !interactive && "cursor-default hover:bg-transparent",
4136
+ className
4137
+ ),
4138
+ ...rest,
4139
+ children: ctx.value || ctx.placeholder
4140
+ }
4141
+ );
4142
+ }
4143
+ );
4144
+ var EditableInput = forwardRef(
4145
+ function EditableInput2({ className, size, state, onKeyDown, onBlur, ...rest }, forwardedRef) {
4146
+ const ctx = useEditableContext();
4147
+ useEffect(() => {
4148
+ if (ctx.editing && ctx.inputRef.current) {
4149
+ ctx.inputRef.current.focus();
4150
+ const len = ctx.inputRef.current.value.length;
4151
+ ctx.inputRef.current.setSelectionRange(len, len);
4152
+ }
4153
+ }, [ctx.editing, ctx.inputRef]);
4154
+ if (!ctx.editing) return null;
4155
+ const handleKeyDown = (e) => {
4156
+ onKeyDown?.(e);
4157
+ if (e.defaultPrevented) return;
4158
+ if (ctx.submitOnEnter && e.key === "Enter") {
4159
+ e.preventDefault();
4160
+ ctx.submit();
4161
+ } else if (ctx.cancelOnEscape && e.key === "Escape") {
4162
+ e.preventDefault();
4163
+ ctx.cancel();
4164
+ }
4165
+ };
4166
+ return /* @__PURE__ */ jsx(
4167
+ "input",
4168
+ {
4169
+ ref: composeRefs(forwardedRef, ctx.inputRef),
4170
+ type: "text",
4171
+ value: ctx.draft,
4172
+ disabled: ctx.disabled,
4173
+ readOnly: ctx.readOnly,
4174
+ onChange: (e) => ctx.setDraft(e.target.value),
4175
+ onKeyDown: handleKeyDown,
4176
+ onBlur: (e) => {
4177
+ onBlur?.(e);
4178
+ if (e.defaultPrevented) return;
4179
+ if (ctx.submitOnBlur) ctx.submit();
4180
+ },
4181
+ className: cn(inputBaseVariants({ size, state }), className),
4182
+ ...rest
4183
+ }
4184
+ );
4185
+ }
4186
+ );
4187
+ var EditableSubmit = forwardRef(
4188
+ function EditableSubmit2({ className, onClick, children, type = "button", ...rest }, forwardedRef) {
4189
+ const ctx = useEditableContext();
4190
+ if (!ctx.editing) return null;
4191
+ return /* @__PURE__ */ jsx(
4192
+ "button",
4193
+ {
4194
+ ref: forwardedRef,
4195
+ type,
4196
+ "aria-label": "Submit",
4197
+ onMouseDown: (e) => e.preventDefault(),
4198
+ onClick: (e) => {
4199
+ onClick?.(e);
4200
+ if (e.defaultPrevented) return;
4201
+ ctx.submit();
4202
+ },
4203
+ className: cn(
4204
+ "inline-flex h-8 w-8 items-center justify-center rounded-md text-success transition-colors hover:bg-success-soft focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
4205
+ className
4206
+ ),
4207
+ ...rest,
4208
+ children: children ?? /* @__PURE__ */ jsx(Icon, { icon: Check, size: 14 })
4209
+ }
4210
+ );
4211
+ }
4212
+ );
4213
+ var EditableCancel = forwardRef(
4214
+ function EditableCancel2({ className, onClick, children, type = "button", ...rest }, forwardedRef) {
4215
+ const ctx = useEditableContext();
4216
+ if (!ctx.editing) return null;
4217
+ return /* @__PURE__ */ jsx(
4218
+ "button",
4219
+ {
4220
+ ref: forwardedRef,
4221
+ type,
4222
+ "aria-label": "Cancel",
4223
+ onMouseDown: (e) => e.preventDefault(),
4224
+ onClick: (e) => {
4225
+ onClick?.(e);
4226
+ if (e.defaultPrevented) return;
4227
+ ctx.cancel();
4228
+ },
4229
+ className: cn(
4230
+ "inline-flex h-8 w-8 items-center justify-center rounded-md text-destructive transition-colors hover:bg-destructive-soft focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
4231
+ className
4232
+ ),
4233
+ ...rest,
4234
+ children: children ?? /* @__PURE__ */ jsx(Icon, { icon: X, size: 14 })
4235
+ }
4236
+ );
4237
+ }
4238
+ );
4239
+ Editable.Preview = EditablePreview;
4240
+ Editable.Input = EditableInput;
4241
+ Editable.Submit = EditableSubmit;
4242
+ Editable.Cancel = EditableCancel;
3728
4243
 
3729
- export { Calendar, CharacterCount, Checkbox, CheckboxField, CheckboxGroup, ChoiceCard, ColorArea, ColorField, ColorPicker, ColorSlider, ColorSwatch, ColorSwatchPicker, ColorWheel, Combobox, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxSeparator, CurrencyInput, DateField, DatePicker, DateRangePicker, EmailInput, Fieldset, FilePicker, FormErrorMessage, FormField, FormHelperText, InputAddon, InputGroup, Label, LabeledInput, Legend, Listbox, ListboxEmpty, ListboxGroup, ListboxItem, ListboxSeparator, MaskedInput, MultiSelect, MultiSelectContent, MultiSelectItem, MultiSelectTags, MultiSelectTrigger, NumberInput, PasswordInput, PasswordStrength, PercentInput, PinInput, Radio, RadioField, RadioGroup, RangeCalendar, SearchInput, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Slider, Stepper, StepperList, StepperPanel, StepperStep, Switch, SwitchField, TelInput, TextInput, Textarea, TimeField, TimePicker, UrlInput, colorSwatchVariants };
3730
- //# sourceMappingURL=chunk-BQTO7XY6.js.map
3731
- //# sourceMappingURL=chunk-BQTO7XY6.js.map
4244
+ export { Calendar, CharacterCount, Checkbox, CheckboxField, CheckboxGroup, ChoiceCard, ColorArea, ColorField, ColorPicker, ColorSlider, ColorSwatch, ColorSwatchPicker, ColorWheel, Combobox, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxInput, ComboboxItem, ComboboxSeparator, CurrencyInput, DateField, DatePicker, DateRangePicker, Editable, EditableCancel, EditableInput, EditablePreview, EditableSubmit, EmailInput, Fieldset, FilePicker, FileUpload, FormErrorMessage, FormField, FormHelperText, InputAddon, InputGroup, Label, LabeledInput, Legend, Listbox, ListboxEmpty, ListboxGroup, ListboxItem, ListboxSeparator, MaskedInput, MultiSelect, MultiSelectContent, MultiSelectItem, MultiSelectTags, MultiSelectTrigger, NumberInput, PasswordInput, PasswordStrength, PercentInput, PinInput, Radio, RadioField, RadioGroup, RangeCalendar, SearchInput, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Slider, Stepper, StepperList, StepperPanel, StepperStep, Switch, SwitchField, TagsInput, TelInput, TextInput, Textarea, TimeField, TimePicker, UrlInput, colorSwatchVariants };
4245
+ //# sourceMappingURL=chunk-ILYL6ROC.js.map
4246
+ //# sourceMappingURL=chunk-ILYL6ROC.js.map