@zayne-labs/ui-react 0.6.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/{chunk-ENDWJXPF.js → chunk-L2SROZYQ.js} +2 -2
- package/dist/esm/{chunk-ENDWJXPF.js.map → chunk-L2SROZYQ.js.map} +1 -1
- package/dist/esm/common/await/index.js +37 -3
- package/dist/esm/common/await/index.js.map +1 -1
- package/dist/esm/common/focus-scope/index.d.ts +32 -0
- package/dist/esm/common/focus-scope/index.js +232 -0
- package/dist/esm/common/focus-scope/index.js.map +1 -0
- package/dist/esm/common/show/index.js +48 -2
- package/dist/esm/common/show/index.js.map +1 -1
- package/dist/esm/common/slot/index.js +1 -1
- package/dist/esm/common/suspense-with-boundary/index.js +11 -2
- package/dist/esm/common/suspense-with-boundary/index.js.map +1 -1
- package/dist/esm/common/switch/index.js +38 -2
- package/dist/esm/common/switch/index.js.map +1 -1
- package/dist/esm/common/teleport/index.js +28 -1
- package/dist/esm/common/teleport/index.js.map +1 -1
- package/dist/esm/ui/card/index.js +43 -4
- package/dist/esm/ui/card/index.js.map +1 -1
- package/dist/esm/ui/carousel/index.js +272 -4
- package/dist/esm/ui/carousel/index.js.map +1 -1
- package/dist/esm/ui/drag-scroll/index.js +117 -2
- package/dist/esm/ui/drag-scroll/index.js.map +1 -1
- package/dist/esm/ui/drop-zone/index.js +137 -2
- package/dist/esm/ui/drop-zone/index.js.map +1 -1
- package/dist/esm/ui/form/index.js +508 -12
- package/dist/esm/ui/form/index.js.map +1 -1
- package/package.json +6 -9
- package/dist/esm/chunk-CB2EZJYW.js +0 -31
- package/dist/esm/chunk-CB2EZJYW.js.map +0 -1
- package/dist/esm/chunk-CWUEUCR5.js +0 -3
- package/dist/esm/chunk-CWUEUCR5.js.map +0 -1
- package/dist/esm/chunk-E42DOTGX.js +0 -119
- package/dist/esm/chunk-E42DOTGX.js.map +0 -1
- package/dist/esm/chunk-EOI2VNGP.js +0 -39
- package/dist/esm/chunk-EOI2VNGP.js.map +0 -1
- package/dist/esm/chunk-FPCKBOJN.js +0 -50
- package/dist/esm/chunk-FPCKBOJN.js.map +0 -1
- package/dist/esm/chunk-GVL6BLX5.js +0 -274
- package/dist/esm/chunk-GVL6BLX5.js.map +0 -1
- package/dist/esm/chunk-IJUYDZCZ.js +0 -510
- package/dist/esm/chunk-IJUYDZCZ.js.map +0 -1
- package/dist/esm/chunk-NPIJ4XZP.js +0 -13
- package/dist/esm/chunk-NPIJ4XZP.js.map +0 -1
- package/dist/esm/chunk-PNYEIX7F.js +0 -3
- package/dist/esm/chunk-PNYEIX7F.js.map +0 -1
- package/dist/esm/chunk-PXYYL2LL.js +0 -45
- package/dist/esm/chunk-PXYYL2LL.js.map +0 -1
- package/dist/esm/chunk-RQZL6ZG6.js +0 -139
- package/dist/esm/chunk-RQZL6ZG6.js.map +0 -1
- package/dist/esm/chunk-SVQ4WBSO.js +0 -40
- package/dist/esm/chunk-SVQ4WBSO.js.map +0 -1
- package/dist/esm/common/index.d.ts +0 -12
- package/dist/esm/common/index.js +0 -12
- package/dist/esm/common/index.js.map +0 -1
- package/dist/esm/index.d.ts +0 -20
- package/dist/esm/index.js +0 -19
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/ui/index.d.ts +0 -11
- package/dist/esm/ui/index.js +0 -19
- package/dist/esm/ui/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/card/card.tsx","../../../../src/components/ui/card/card-parts.ts"],"names":[],"mappings":";;;;;AAMO,SAAS,SACf,KACC,EAAA;AACD,EAAA,MAAM,EAAE,EAAI,EAAA,OAAA,GAAU,SAAW,EAAA,GAAG,aAAgB,GAAA,KAAA;AAEpD,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAS,EAAA,EAAA,GAAG,WAAa,EAAA,CAAA;AAClC;AAEO,SAAS,WACf,KACC,EAAA;AACD,EAAA,MAAM,EAAE,EAAI,EAAA,OAAA,GAAU,QAAU,EAAA,GAAG,aAAgB,GAAA,KAAA;AAEnD,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAS,EAAA,EAAA,GAAG,WAAa,EAAA,CAAA;AAClC;AAEO,SAAS,UAAqD,KAAmC,EAAA;AACvG,EAAA,MAAM,EAAE,EAAI,EAAA,OAAA,GAAU,MAAM,SAAW,EAAA,GAAG,aAAgB,GAAA,KAAA;AAE1D,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,WAAQ,SAAW,EAAA,OAAA,CAAQ,iBAAiB,SAAS,CAAA,EAAI,GAAG,WAAa,EAAA,CAAA;AAClF;AAEO,SAAS,gBACf,KACC,EAAA;AACD,EAAA,MAAM,EAAE,EAAI,EAAA,OAAA,GAAU,KAAK,SAAW,EAAA,GAAG,aAAgB,GAAA,KAAA;AAEzD,EACC,uBAAA,KAAA,CAAA,aAAA,CAAC,WAAQ,SAAW,EAAA,OAAA,CAAQ,wCAAwC,SAAS,CAAA,EAAI,GAAG,WAAa,EAAA,CAAA;AAEnG;AAEO,SAAS,YACf,KACC,EAAA;AACD,EAAA,MAAM,EAAE,EAAI,EAAA,OAAA,GAAU,KAAO,EAAA,GAAG,aAAgB,GAAA,KAAA;AAEhD,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAS,EAAA,EAAA,GAAG,WAAa,EAAA,CAAA;AAClC;AAEO,SAAS,WACf,KACC,EAAA;AACD,EAAA,MAAM,EAAE,EAAI,EAAA,OAAA,GAAU,UAAU,OAAS,EAAA,GAAG,aAAgB,GAAA,KAAA;AAE5D,EAAM,MAAA,SAAA,GAAY,UAAU,IAAO,GAAA,OAAA;AAEnC,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,SAAW,EAAA,EAAA,GAAG,WAAa,EAAA,CAAA;AACpC;;;ACtDA,IAAA,kBAAA,GAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,OAAA,EAAA,MAAA,WAAA;AAAA,EAAA,WAAA,EAAA,MAAA,eAAA;AAAA,EAAA,MAAA,EAAA,MAAA,UAAA;AAAA,EAAA,MAAA,EAAA,MAAA,UAAA;AAAA,EAAA,IAAA,EAAA,MAAA,QAAA;AAAA,EAAA,KAAA,EAAA,MAAA;AAAA,CAAA,CAAA","file":"index.js","sourcesContent":["import * as React from \"react\";\n\nimport { Slot } from \"@/components/common/slot\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport type { PolymorphicProps } from \"@zayne-labs/toolkit-react/utils\";\n\nexport function CardRoot<TElement extends React.ElementType = \"article\">(\n\tprops: PolymorphicProps<TElement>\n) {\n\tconst { as: Element = \"article\", ...restOfProps } = props;\n\n\treturn <Element {...restOfProps} />;\n}\n\nexport function CardHeader<TElement extends React.ElementType = \"header\">(\n\tprops: PolymorphicProps<TElement>\n) {\n\tconst { as: Element = \"header\", ...restOfProps } = props;\n\n\treturn <Element {...restOfProps} />;\n}\n\nexport function CardTitle<TElement extends React.ElementType = \"h3\">(props: PolymorphicProps<TElement>) {\n\tconst { as: Element = \"h3\", className, ...restOfProps } = props;\n\n\treturn <Element className={cnMerge(\"font-semibold\", className)} {...restOfProps} />;\n}\n\nexport function CardDescription<TElement extends React.ElementType = \"p\">(\n\tprops: PolymorphicProps<TElement>\n) {\n\tconst { as: Element = \"p\", className, ...restOfProps } = props;\n\n\treturn (\n\t\t<Element className={cnMerge(\"text-sm text-shadcn-muted-foreground\", className)} {...restOfProps} />\n\t);\n}\n\nexport function CardContent<TElement extends React.ElementType = \"div\">(\n\tprops: PolymorphicProps<TElement>\n) {\n\tconst { as: Element = \"div\", ...restOfProps } = props;\n\n\treturn <Element {...restOfProps} />;\n}\n\nexport function CardFooter<TElement extends React.ElementType = \"footer\">(\n\tprops: PolymorphicProps<TElement, { asChild?: boolean }>\n) {\n\tconst { as: Element = \"footer\", asChild, ...restOfProps } = props;\n\n\tconst Component = asChild ? Slot : Element;\n\n\treturn <Component {...restOfProps} />;\n}\n","export {\n\tCardContent as Content,\n\tCardDescription as Description,\n\tCardFooter as Footer,\n\tCardHeader as Header,\n\tCardRoot as Root,\n\tCardTitle as Title,\n} from \"./card\";\n"]}
|
|
@@ -1,6 +1,274 @@
|
|
|
1
|
-
|
|
2
|
-
import '../../chunk-
|
|
3
|
-
import '../../chunk-
|
|
4
|
-
import '
|
|
1
|
+
import { cnMerge } from '../../chunk-OHG7GB7O.js';
|
|
2
|
+
import { getElementList } from '../../chunk-DW3FXTFL.js';
|
|
3
|
+
import { __export } from '../../chunk-PZ5AY32C.js';
|
|
4
|
+
import * as React3 from 'react';
|
|
5
|
+
import { useEffect, useState } from 'react';
|
|
6
|
+
import { useConstant, useAnimationInterval, useCallbackRef } from '@zayne-labs/toolkit-react';
|
|
7
|
+
import { createZustandContext } from '@zayne-labs/toolkit-react/zustand';
|
|
8
|
+
import { create } from 'zustand';
|
|
9
|
+
|
|
10
|
+
var ChevronLeftIcon = (props) => /* @__PURE__ */ React3.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props }, /* @__PURE__ */ React3.createElement("g", { fill: "none", stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2" }, /* @__PURE__ */ React3.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React3.createElement("path", { d: "m14 16l-4-4l4-4" })));
|
|
11
|
+
var [Provider, useCarouselStoreContext] = createZustandContext({
|
|
12
|
+
hookName: "useCarouselStore",
|
|
13
|
+
name: "CarouselStoreContext",
|
|
14
|
+
providerName: "CarouselContextProvider"
|
|
15
|
+
});
|
|
16
|
+
var createCarouselStore = (storeValues) => {
|
|
17
|
+
const { images, onSlideBtnClick } = storeValues;
|
|
18
|
+
const useInitCarouselStore = create()((set, get) => ({
|
|
19
|
+
currentSlide: 0,
|
|
20
|
+
images,
|
|
21
|
+
maxSlide: images.length - 1,
|
|
22
|
+
/* eslint-disable perfectionist/sort-objects -- actions should be last */
|
|
23
|
+
actions: {
|
|
24
|
+
/* eslint-enable perfectionist/sort-objects -- actions should be last */
|
|
25
|
+
goToNextSlide: () => {
|
|
26
|
+
const { currentSlide, maxSlide } = get();
|
|
27
|
+
const { goToSlide } = get().actions;
|
|
28
|
+
if (currentSlide === maxSlide) {
|
|
29
|
+
goToSlide(0);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
goToSlide(currentSlide + 1);
|
|
33
|
+
},
|
|
34
|
+
goToPreviousSlide: () => {
|
|
35
|
+
const { currentSlide, maxSlide } = get();
|
|
36
|
+
const { goToSlide } = get().actions;
|
|
37
|
+
if (currentSlide === 0) {
|
|
38
|
+
goToSlide(maxSlide);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
goToSlide(currentSlide - 1);
|
|
42
|
+
},
|
|
43
|
+
goToSlide: (newValue) => {
|
|
44
|
+
onSlideBtnClick?.();
|
|
45
|
+
set({ currentSlide: newValue });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}));
|
|
49
|
+
return useInitCarouselStore;
|
|
50
|
+
};
|
|
51
|
+
var useCarousel = (props) => {
|
|
52
|
+
const { images, onSlideBtnClick } = props;
|
|
53
|
+
const useInitCarouselStore = useConstant(() => createCarouselStore({ images, onSlideBtnClick }));
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
useInitCarouselStore.setState({ images });
|
|
56
|
+
}, [images]);
|
|
57
|
+
return useInitCarouselStore;
|
|
58
|
+
};
|
|
59
|
+
function CarouselContextProvider(props) {
|
|
60
|
+
const { children, images, onSlideBtnClick } = props;
|
|
61
|
+
const useInitCarouselStore = useCarousel({ images, onSlideBtnClick });
|
|
62
|
+
return /* @__PURE__ */ React3.createElement(Provider, { value: useInitCarouselStore }, children);
|
|
63
|
+
}
|
|
64
|
+
var useCarouselOptions = (options = {}) => {
|
|
65
|
+
const { autoSlideInterval = 5e3, hasAutoSlide = false, shouldPauseOnHover = false } = options;
|
|
66
|
+
const { goToNextSlide } = useCarouselStoreContext((state) => state.actions);
|
|
67
|
+
const [isPaused, setIsPaused] = useState(false);
|
|
68
|
+
const shouldAutoSlide = hasAutoSlide && !isPaused;
|
|
69
|
+
useAnimationInterval({
|
|
70
|
+
intervalDuration: shouldAutoSlide ? autoSlideInterval : null,
|
|
71
|
+
onAnimation: goToNextSlide
|
|
72
|
+
});
|
|
73
|
+
const pauseAutoSlide = useCallbackRef(() => shouldPauseOnHover && setIsPaused(true));
|
|
74
|
+
const resumeAutoSlide = useCallbackRef(() => shouldPauseOnHover && setIsPaused(false));
|
|
75
|
+
return { pauseAutoSlide, resumeAutoSlide };
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// src/components/ui/carousel/carousel.tsx
|
|
79
|
+
function CarouselContent(props) {
|
|
80
|
+
const {
|
|
81
|
+
as: HtmlElement = "article",
|
|
82
|
+
autoSlideInterval,
|
|
83
|
+
children,
|
|
84
|
+
classNames,
|
|
85
|
+
hasAutoSlide,
|
|
86
|
+
shouldPauseOnHover
|
|
87
|
+
} = props;
|
|
88
|
+
const { pauseAutoSlide, resumeAutoSlide } = useCarouselOptions({
|
|
89
|
+
autoSlideInterval,
|
|
90
|
+
hasAutoSlide,
|
|
91
|
+
shouldPauseOnHover
|
|
92
|
+
});
|
|
93
|
+
return /* @__PURE__ */ React3.createElement(
|
|
94
|
+
HtmlElement,
|
|
95
|
+
{
|
|
96
|
+
"data-id": "Carousel",
|
|
97
|
+
className: cnMerge("relative select-none", classNames?.base),
|
|
98
|
+
onMouseEnter: pauseAutoSlide,
|
|
99
|
+
onMouseLeave: resumeAutoSlide
|
|
100
|
+
},
|
|
101
|
+
/* @__PURE__ */ React3.createElement(
|
|
102
|
+
"div",
|
|
103
|
+
{
|
|
104
|
+
"data-id": "Scroll Container",
|
|
105
|
+
className: cnMerge(
|
|
106
|
+
"flex size-full overflow-x-scroll [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
|
|
107
|
+
classNames?.scrollContainer
|
|
108
|
+
)
|
|
109
|
+
},
|
|
110
|
+
children
|
|
111
|
+
)
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
function CarouselButton(props) {
|
|
115
|
+
const { classNames, icon, variant } = props;
|
|
116
|
+
const { goToNextSlide, goToPreviousSlide } = useCarouselStoreContext((state) => state.actions);
|
|
117
|
+
return /* @__PURE__ */ React3.createElement(
|
|
118
|
+
"button",
|
|
119
|
+
{
|
|
120
|
+
type: "button",
|
|
121
|
+
className: cnMerge(
|
|
122
|
+
"z-30 flex h-full w-[15%] items-center",
|
|
123
|
+
variant === "prev" ? "justify-start" : "justify-end",
|
|
124
|
+
classNames?.base
|
|
125
|
+
),
|
|
126
|
+
onClick: variant === "prev" ? goToPreviousSlide : goToNextSlide
|
|
127
|
+
},
|
|
128
|
+
/* @__PURE__ */ React3.createElement("span", { className: cnMerge("transition-transform active:scale-[1.06]", classNames?.iconContainer) }, icon ?? /* @__PURE__ */ React3.createElement(
|
|
129
|
+
ChevronLeftIcon,
|
|
130
|
+
{
|
|
131
|
+
className: cnMerge(variant === "next" && "rotate-180", classNames?.defaultIcon)
|
|
132
|
+
}
|
|
133
|
+
))
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
function CarouselControls(props) {
|
|
137
|
+
const { classNames, icon } = props;
|
|
138
|
+
return /* @__PURE__ */ React3.createElement("div", { className: cnMerge("absolute inset-0 flex justify-between", classNames?.base) }, icon?.iconType ? /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(
|
|
139
|
+
CarouselButton,
|
|
140
|
+
{
|
|
141
|
+
variant: "prev",
|
|
142
|
+
classNames: {
|
|
143
|
+
defaultIcon: classNames?.defaultIcon,
|
|
144
|
+
iconContainer: cnMerge(
|
|
145
|
+
icon.iconType === "nextIcon" && "rotate-180",
|
|
146
|
+
classNames?.iconContainer
|
|
147
|
+
)
|
|
148
|
+
},
|
|
149
|
+
icon: icon.icon
|
|
150
|
+
}
|
|
151
|
+
), /* @__PURE__ */ React3.createElement(
|
|
152
|
+
CarouselButton,
|
|
153
|
+
{
|
|
154
|
+
variant: "next",
|
|
155
|
+
classNames: {
|
|
156
|
+
defaultIcon: classNames?.defaultIcon,
|
|
157
|
+
iconContainer: cnMerge(
|
|
158
|
+
icon.iconType === "prevIcon" && "rotate-180",
|
|
159
|
+
classNames?.iconContainer
|
|
160
|
+
)
|
|
161
|
+
},
|
|
162
|
+
icon: icon.icon
|
|
163
|
+
}
|
|
164
|
+
)) : /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(
|
|
165
|
+
CarouselButton,
|
|
166
|
+
{
|
|
167
|
+
variant: "prev",
|
|
168
|
+
classNames: {
|
|
169
|
+
defaultIcon: classNames?.defaultIcon,
|
|
170
|
+
iconContainer: classNames?.iconContainer
|
|
171
|
+
},
|
|
172
|
+
icon: icon?.prev
|
|
173
|
+
}
|
|
174
|
+
), /* @__PURE__ */ React3.createElement(
|
|
175
|
+
CarouselButton,
|
|
176
|
+
{
|
|
177
|
+
variant: "next",
|
|
178
|
+
classNames: {
|
|
179
|
+
defaultIcon: classNames?.defaultIcon,
|
|
180
|
+
iconContainer: classNames?.iconContainer
|
|
181
|
+
},
|
|
182
|
+
icon: icon?.next
|
|
183
|
+
}
|
|
184
|
+
)));
|
|
185
|
+
}
|
|
186
|
+
function CarouselItemGroup(props) {
|
|
187
|
+
const { children, className, each, render } = props;
|
|
188
|
+
const [ItemList] = getElementList("base");
|
|
189
|
+
const currentSlide = useCarouselStoreContext((state) => state.currentSlide);
|
|
190
|
+
const images = useCarouselStoreContext((state) => each ?? state.images);
|
|
191
|
+
return /* @__PURE__ */ React3.createElement(
|
|
192
|
+
"ul",
|
|
193
|
+
{
|
|
194
|
+
"data-id": "Carousel Image Wrapper",
|
|
195
|
+
className: cnMerge(
|
|
196
|
+
`flex w-full shrink-0 [transform:translate3d(var(--translate-distance),0,0)] snap-center
|
|
197
|
+
[transition:transform_800ms_ease]`,
|
|
198
|
+
className
|
|
199
|
+
),
|
|
200
|
+
style: {
|
|
201
|
+
"--translate-distance": `-${currentSlide * 100}%`
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
typeof render === "function" ? /* @__PURE__ */ React3.createElement(ItemList, { each: images, render }) : /* @__PURE__ */ React3.createElement(ItemList, { each: images }, children)
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
function CarouselItem({ children, className, ...restOfProps }) {
|
|
208
|
+
return /* @__PURE__ */ React3.createElement(
|
|
209
|
+
"li",
|
|
210
|
+
{
|
|
211
|
+
className: cnMerge("flex w-full shrink-0 snap-center justify-center", className),
|
|
212
|
+
...restOfProps
|
|
213
|
+
},
|
|
214
|
+
children
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
function CarouselCaption(props) {
|
|
218
|
+
const { as: HtmlElement = "div", children, className } = props;
|
|
219
|
+
return /* @__PURE__ */ React3.createElement(HtmlElement, { "data-id": "Carousel Caption", className: cnMerge("absolute z-10", className) }, children);
|
|
220
|
+
}
|
|
221
|
+
function CarouselIndicatorGroup(props) {
|
|
222
|
+
const { children, className, each, render } = props;
|
|
223
|
+
const images = useCarouselStoreContext((state) => each ?? state.images);
|
|
224
|
+
const [IndicatorList] = getElementList("base");
|
|
225
|
+
return /* @__PURE__ */ React3.createElement(
|
|
226
|
+
"ul",
|
|
227
|
+
{
|
|
228
|
+
"data-id": "Carousel Indicators",
|
|
229
|
+
className: cnMerge(
|
|
230
|
+
"absolute bottom-10 z-[2] flex w-full items-center justify-center gap-6",
|
|
231
|
+
className
|
|
232
|
+
)
|
|
233
|
+
},
|
|
234
|
+
typeof render === "function" ? /* @__PURE__ */ React3.createElement(IndicatorList, { each: images, render }) : /* @__PURE__ */ React3.createElement(IndicatorList, { each: images }, children)
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
function CarouselIndicator(props) {
|
|
238
|
+
const { classNames, currentIndex } = props;
|
|
239
|
+
const {
|
|
240
|
+
actions: { goToSlide },
|
|
241
|
+
currentSlide
|
|
242
|
+
} = useCarouselStoreContext((state) => state);
|
|
243
|
+
return /* @__PURE__ */ React3.createElement("li", { className: cnMerge("inline-flex", classNames?.base) }, /* @__PURE__ */ React3.createElement(
|
|
244
|
+
"button",
|
|
245
|
+
{
|
|
246
|
+
"data-active": currentIndex === currentSlide,
|
|
247
|
+
type: "button",
|
|
248
|
+
onClick: () => goToSlide(currentIndex),
|
|
249
|
+
className: cnMerge(
|
|
250
|
+
"size-[6px] rounded-[50%]",
|
|
251
|
+
classNames?.button,
|
|
252
|
+
currentIndex === currentSlide && ["w-14 rounded-lg", classNames?.activeBtn]
|
|
253
|
+
)
|
|
254
|
+
}
|
|
255
|
+
));
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// src/components/ui/carousel/carousel-parts.ts
|
|
259
|
+
var carousel_parts_exports = {};
|
|
260
|
+
__export(carousel_parts_exports, {
|
|
261
|
+
Button: () => CarouselButton,
|
|
262
|
+
Caption: () => CarouselCaption,
|
|
263
|
+
Content: () => CarouselContent,
|
|
264
|
+
Controls: () => CarouselControls,
|
|
265
|
+
Indicator: () => CarouselIndicator,
|
|
266
|
+
IndicatorWrapper: () => CarouselIndicatorGroup,
|
|
267
|
+
Item: () => CarouselItem,
|
|
268
|
+
ItemWrapper: () => CarouselItemGroup,
|
|
269
|
+
Root: () => CarouselContextProvider
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
export { carousel_parts_exports as Carousel, CarouselButton, CarouselCaption, CarouselContent, CarouselControls, CarouselIndicator, CarouselIndicatorGroup, CarouselItem, CarouselItemGroup };
|
|
5
273
|
//# sourceMappingURL=index.js.map
|
|
6
274
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/icons/ChevronLeftIcon.tsx","../../../../src/components/ui/carousel/carousel-store-context.tsx","../../../../src/components/ui/carousel/useCarouselOptions.ts","../../../../src/components/ui/carousel/carousel.tsx","../../../../src/components/ui/carousel/carousel-parts.ts"],"names":["React","React2"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from \"react\";\n\nconst ChevronLeftIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<circle cx=\"12\" cy=\"12\" r=\"10\" />\n\t\t\t<path d=\"m14 16l-4-4l4-4\" />\n\t\t</g>\n\t</svg>\n);\n\nexport { ChevronLeftIcon };\n","import * as React from \"react\";\n\nimport { useConstant } from \"@zayne-labs/toolkit-react\";\nimport { createZustandContext } from \"@zayne-labs/toolkit-react/zustand\";\nimport type { PrettyOmit } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useEffect } from \"react\";\nimport { create } from \"zustand\";\nimport type { CarouselProviderProps, CarouselStore, ImagesType } from \"./types\";\n\nconst [Provider, useCarouselStoreContext] = createZustandContext<CarouselStore>({\n\thookName: \"useCarouselStore\",\n\tname: \"CarouselStoreContext\",\n\tproviderName: \"CarouselContextProvider\",\n});\n\n// CarouselStore Creation\nconst createCarouselStore = <TImages extends ImagesType>(\n\tstoreValues: PrettyOmit<CarouselProviderProps<TImages>, \"children\">\n) => {\n\tconst { images, onSlideBtnClick } = storeValues;\n\n\tconst useInitCarouselStore = create<CarouselStore<TImages>>()((set, get) => ({\n\t\tcurrentSlide: 0,\n\t\timages,\n\t\tmaxSlide: images.length - 1,\n\n\t\t/* eslint-disable perfectionist/sort-objects -- actions should be last */\n\t\tactions: {\n\t\t\t/* eslint-enable perfectionist/sort-objects -- actions should be last */\n\n\t\t\tgoToNextSlide: () => {\n\t\t\t\tconst { currentSlide, maxSlide } = get();\n\t\t\t\tconst { goToSlide } = get().actions;\n\n\t\t\t\tif (currentSlide === maxSlide) {\n\t\t\t\t\tgoToSlide(0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tgoToSlide(currentSlide + 1);\n\t\t\t},\n\n\t\t\tgoToPreviousSlide: () => {\n\t\t\t\tconst { currentSlide, maxSlide } = get();\n\t\t\t\tconst { goToSlide } = get().actions;\n\n\t\t\t\tif (currentSlide === 0) {\n\t\t\t\t\tgoToSlide(maxSlide);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tgoToSlide(currentSlide - 1);\n\t\t\t},\n\n\t\t\tgoToSlide: (newValue) => {\n\t\t\t\tonSlideBtnClick?.();\n\n\t\t\t\tset({ currentSlide: newValue });\n\t\t\t},\n\t\t},\n\t}));\n\n\treturn useInitCarouselStore;\n};\n\nconst useCarousel = <TImages extends ImagesType>(\n\tprops: Omit<CarouselProviderProps<TImages>, \"children\">\n) => {\n\tconst { images, onSlideBtnClick } = props;\n\n\tconst useInitCarouselStore = useConstant(() => createCarouselStore({ images, onSlideBtnClick }));\n\n\t// == To set images again when a page is mounted, preventing stale images from previous page\n\tuseEffect(() => {\n\t\tuseInitCarouselStore.setState({ images });\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps -- useInitCarouselStore is stable\n\t}, [images]);\n\n\treturn useInitCarouselStore;\n};\n\n// == Provider Component\nfunction CarouselContextProvider<TImages extends ImagesType>(props: CarouselProviderProps<TImages>) {\n\tconst { children, images, onSlideBtnClick } = props;\n\n\tconst useInitCarouselStore = useCarousel({ images, onSlideBtnClick });\n\n\treturn <Provider value={useInitCarouselStore}>{children}</Provider>;\n}\n\n// eslint-disable-next-line react-refresh/only-export-components -- It's fine\nexport { useCarouselStoreContext, CarouselContextProvider };\n","import { useAnimationInterval, useCallbackRef } from \"@zayne-labs/toolkit-react\";\nimport { useState } from \"react\";\nimport { useCarouselStoreContext } from \"./carousel-store-context\";\n\ntype CarouselOptions = {\n\tautoSlideInterval?: number;\n\thasAutoSlide?: boolean;\n\tshouldPauseOnHover?: boolean;\n};\n\nconst useCarouselOptions = (options: CarouselOptions = {}) => {\n\tconst { autoSlideInterval = 5000, hasAutoSlide = false, shouldPauseOnHover = false } = options;\n\n\tconst { goToNextSlide } = useCarouselStoreContext((state) => state.actions);\n\n\tconst [isPaused, setIsPaused] = useState(false);\n\n\tconst shouldAutoSlide = hasAutoSlide && !isPaused;\n\n\tuseAnimationInterval({\n\t\tintervalDuration: shouldAutoSlide ? autoSlideInterval : null,\n\t\tonAnimation: goToNextSlide,\n\t});\n\n\tconst pauseAutoSlide = useCallbackRef(() => shouldPauseOnHover && setIsPaused(true));\n\n\tconst resumeAutoSlide = useCallbackRef(() => shouldPauseOnHover && setIsPaused(false));\n\n\treturn { pauseAutoSlide, resumeAutoSlide };\n};\n\nexport { useCarouselOptions };\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { getElementList } from \"@/components/common/for\";\nimport { ChevronLeftIcon } from \"@/components/icons\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport type { MyCustomCss, PolymorphicProps } from \"@zayne-labs/toolkit-react/utils\";\nimport { useCarouselStoreContext } from \"./carousel-store-context\";\nimport type {\n\tCarouselButtonsProps,\n\tCarouselContentProps,\n\tCarouselControlProps,\n\tCarouselIndicatorProps,\n\tCarouselWrapperProps,\n\tOtherCarouselProps,\n} from \"./types\";\nimport { useCarouselOptions } from \"./useCarouselOptions\";\n\n// TODO - Add dragging and swiping support\nexport function CarouselContent<TElement extends React.ElementType = \"article\">(\n\tprops: PolymorphicProps<TElement, CarouselContentProps>\n) {\n\tconst {\n\t\tas: HtmlElement = \"article\",\n\t\tautoSlideInterval,\n\t\tchildren,\n\t\tclassNames,\n\t\thasAutoSlide,\n\t\tshouldPauseOnHover,\n\t} = props;\n\n\tconst { pauseAutoSlide, resumeAutoSlide } = useCarouselOptions({\n\t\tautoSlideInterval,\n\t\thasAutoSlide,\n\t\tshouldPauseOnHover,\n\t});\n\n\t// FIXME - Prevent touch swipe on mobile using a cover element or allow swipe but it must update the state appriopriately\n\treturn (\n\t\t<HtmlElement\n\t\t\tdata-id=\"Carousel\"\n\t\t\tclassName={cnMerge(\"relative select-none\", classNames?.base)}\n\t\t\tonMouseEnter={pauseAutoSlide}\n\t\t\tonMouseLeave={resumeAutoSlide}\n\t\t>\n\t\t\t<div\n\t\t\t\tdata-id=\"Scroll Container\"\n\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\"flex size-full overflow-x-scroll [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n\t\t\t\t\tclassNames?.scrollContainer\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</HtmlElement>\n\t);\n}\n\nexport function CarouselButton(props: CarouselButtonsProps) {\n\tconst { classNames, icon, variant } = props;\n\n\tconst { goToNextSlide, goToPreviousSlide } = useCarouselStoreContext((state) => state.actions);\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName={cnMerge(\n\t\t\t\t\"z-30 flex h-full w-[15%] items-center\",\n\t\t\t\tvariant === \"prev\" ? \"justify-start\" : \"justify-end\",\n\t\t\t\tclassNames?.base\n\t\t\t)}\n\t\t\tonClick={variant === \"prev\" ? goToPreviousSlide : goToNextSlide}\n\t\t>\n\t\t\t<span className={cnMerge(\"transition-transform active:scale-[1.06]\", classNames?.iconContainer)}>\n\t\t\t\t{icon ?? (\n\t\t\t\t\t<ChevronLeftIcon\n\t\t\t\t\t\tclassName={cnMerge(variant === \"next\" && \"rotate-180\", classNames?.defaultIcon)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n\nexport function CarouselControls(props: CarouselControlProps) {\n\tconst { classNames, icon } = props;\n\n\treturn (\n\t\t<div className={cnMerge(\"absolute inset-0 flex justify-between\", classNames?.base)}>\n\t\t\t{icon?.iconType ? (\n\t\t\t\t<>\n\t\t\t\t\t<CarouselButton\n\t\t\t\t\t\tvariant=\"prev\"\n\t\t\t\t\t\tclassNames={{\n\t\t\t\t\t\t\tdefaultIcon: classNames?.defaultIcon,\n\t\t\t\t\t\t\ticonContainer: cnMerge(\n\t\t\t\t\t\t\t\ticon.iconType === \"nextIcon\" && \"rotate-180\",\n\t\t\t\t\t\t\t\tclassNames?.iconContainer\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ticon={icon.icon}\n\t\t\t\t\t/>\n\t\t\t\t\t<CarouselButton\n\t\t\t\t\t\tvariant=\"next\"\n\t\t\t\t\t\tclassNames={{\n\t\t\t\t\t\t\tdefaultIcon: classNames?.defaultIcon,\n\t\t\t\t\t\t\ticonContainer: cnMerge(\n\t\t\t\t\t\t\t\ticon.iconType === \"prevIcon\" && \"rotate-180\",\n\t\t\t\t\t\t\t\tclassNames?.iconContainer\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ticon={icon.icon}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<CarouselButton\n\t\t\t\t\t\tvariant=\"prev\"\n\t\t\t\t\t\tclassNames={{\n\t\t\t\t\t\t\tdefaultIcon: classNames?.defaultIcon,\n\t\t\t\t\t\t\ticonContainer: classNames?.iconContainer,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ticon={icon?.prev}\n\t\t\t\t\t/>\n\t\t\t\t\t<CarouselButton\n\t\t\t\t\t\tvariant=\"next\"\n\t\t\t\t\t\tclassNames={{\n\t\t\t\t\t\t\tdefaultIcon: classNames?.defaultIcon,\n\t\t\t\t\t\t\ticonContainer: classNames?.iconContainer,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ticon={icon?.next}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport function CarouselItemGroup<TArrayItem>(props: CarouselWrapperProps<TArrayItem>) {\n\tconst { children, className, each, render } = props;\n\n\tconst [ItemList] = getElementList(\"base\");\n\tconst currentSlide = useCarouselStoreContext((state) => state.currentSlide);\n\tconst images = useCarouselStoreContext((state) => each ?? (state.images as TArrayItem[]));\n\n\treturn (\n\t\t<ul\n\t\t\tdata-id=\"Carousel Image Wrapper\"\n\t\t\tclassName={cnMerge(\n\t\t\t\t`flex w-full shrink-0 [transform:translate3d(var(--translate-distance),0,0)] snap-center\n\t\t\t\t[transition:transform_800ms_ease]`,\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\tstyle={\n\t\t\t\t{\n\t\t\t\t\t\"--translate-distance\": `-${currentSlide * 100}%`,\n\t\t\t\t} satisfies MyCustomCss as MyCustomCss\n\t\t\t}\n\t\t>\n\t\t\t{typeof render === \"function\" ? (\n\t\t\t\t<ItemList each={images} render={render} />\n\t\t\t) : (\n\t\t\t\t<ItemList each={images}>{children}</ItemList>\n\t\t\t)}\n\t\t</ul>\n\t);\n}\n\nexport function CarouselItem({ children, className, ...restOfProps }: OtherCarouselProps) {\n\treturn (\n\t\t<li\n\t\t\tclassName={cnMerge(\"flex w-full shrink-0 snap-center justify-center\", className)}\n\t\t\t{...restOfProps}\n\t\t>\n\t\t\t{children}\n\t\t</li>\n\t);\n}\n\nexport function CarouselCaption<TElement extends React.ElementType = \"div\">(\n\tprops: PolymorphicProps<TElement, OtherCarouselProps>\n) {\n\tconst { as: HtmlElement = \"div\", children, className } = props;\n\n\treturn (\n\t\t<HtmlElement data-id=\"Carousel Caption\" className={cnMerge(\"absolute z-10\", className)}>\n\t\t\t{children}\n\t\t</HtmlElement>\n\t);\n}\n\nexport function CarouselIndicatorGroup<TArrayItem>(props: CarouselWrapperProps<TArrayItem>) {\n\tconst { children, className, each, render } = props;\n\n\tconst images = useCarouselStoreContext((state) => each ?? (state.images as TArrayItem[]));\n\tconst [IndicatorList] = getElementList(\"base\");\n\n\treturn (\n\t\t<ul\n\t\t\tdata-id=\"Carousel Indicators\"\n\t\t\tclassName={cnMerge(\n\t\t\t\t\"absolute bottom-10 z-[2] flex w-full items-center justify-center gap-6\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t>\n\t\t\t{typeof render === \"function\" ? (\n\t\t\t\t<IndicatorList each={images} render={render} />\n\t\t\t) : (\n\t\t\t\t<IndicatorList each={images}>{children}</IndicatorList>\n\t\t\t)}\n\t\t</ul>\n\t);\n}\n\nexport function CarouselIndicator(props: CarouselIndicatorProps) {\n\tconst { classNames, currentIndex } = props;\n\n\tconst {\n\t\tactions: { goToSlide },\n\t\tcurrentSlide,\n\t} = useCarouselStoreContext((state) => state);\n\n\treturn (\n\t\t<li className={cnMerge(\"inline-flex\", classNames?.base)}>\n\t\t\t<button\n\t\t\t\tdata-active={currentIndex === currentSlide}\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => goToSlide(currentIndex)}\n\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\"size-[6px] rounded-[50%]\",\n\t\t\t\t\tclassNames?.button,\n\t\t\t\t\tcurrentIndex === currentSlide && [\"w-14 rounded-lg\", classNames?.activeBtn]\n\t\t\t\t)}\n\t\t\t/>\n\t\t</li>\n\t);\n}\n","export { CarouselContextProvider as Root } from \"./carousel-store-context\";\nexport {\n\tCarouselContent as Content,\n\tCarouselControls as Controls,\n\tCarouselButton as Button,\n\tCarouselItem as Item,\n\tCarouselItemGroup as ItemWrapper,\n\tCarouselCaption as Caption,\n\tCarouselIndicator as Indicator,\n\tCarouselIndicatorGroup as IndicatorWrapper,\n} from \"./carousel\";\n"]}
|
|
@@ -1,5 +1,120 @@
|
|
|
1
|
-
|
|
2
|
-
import '../../chunk-OHG7GB7O.js';
|
|
1
|
+
import { cnMerge } from '../../chunk-OHG7GB7O.js';
|
|
3
2
|
import '../../chunk-PZ5AY32C.js';
|
|
3
|
+
import { off, on, checkIsDeviceMobileOrTablet } from '@zayne-labs/toolkit-core';
|
|
4
|
+
import { useCallbackRef } from '@zayne-labs/toolkit-react';
|
|
5
|
+
import { mergeTwoProps, composeRefs } from '@zayne-labs/toolkit-react/utils';
|
|
6
|
+
import { useRef } from 'react';
|
|
7
|
+
|
|
8
|
+
var updateCursor = (element) => {
|
|
9
|
+
element.style.cursor = "grabbing";
|
|
10
|
+
element.style.userSelect = "none";
|
|
11
|
+
};
|
|
12
|
+
var onScrollSnap = (action, element) => {
|
|
13
|
+
if (action === "remove") {
|
|
14
|
+
element.style.scrollSnapType = "none";
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
element.style.scrollSnapType = "";
|
|
18
|
+
};
|
|
19
|
+
var resetCursor = (element) => {
|
|
20
|
+
element.style.cursor = "";
|
|
21
|
+
element.style.userSelect = "";
|
|
22
|
+
};
|
|
23
|
+
var handleScrollSnap = (dragContainer) => {
|
|
24
|
+
const isMobileOrTablet = checkIsDeviceMobileOrTablet();
|
|
25
|
+
if (!isMobileOrTablet) {
|
|
26
|
+
onScrollSnap("remove", dragContainer);
|
|
27
|
+
} else {
|
|
28
|
+
onScrollSnap("reset", dragContainer);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// src/components/ui/drag-scroll/use-drag-scroll.ts
|
|
33
|
+
var useDragScroll = (props = {}) => {
|
|
34
|
+
const {
|
|
35
|
+
classNames,
|
|
36
|
+
extraItemProps,
|
|
37
|
+
extraRootProps,
|
|
38
|
+
orientation = "horizontal",
|
|
39
|
+
usage = "allScreens"
|
|
40
|
+
} = props;
|
|
41
|
+
const dragContainerRef = useRef(null);
|
|
42
|
+
const positionRef = useRef({ left: 0, top: 0, x: 0, y: 0 });
|
|
43
|
+
const handleMouseMove = useCallbackRef((event) => {
|
|
44
|
+
if (!dragContainerRef.current) return;
|
|
45
|
+
if (orientation === "horizontal" || orientation === "both") {
|
|
46
|
+
const dx = event.clientX - positionRef.current.x;
|
|
47
|
+
dragContainerRef.current.scrollLeft = positionRef.current.left - dx;
|
|
48
|
+
}
|
|
49
|
+
if (orientation === "vertical" || orientation === "both") {
|
|
50
|
+
const dy = event.clientY - positionRef.current.y;
|
|
51
|
+
dragContainerRef.current.scrollTop = positionRef.current.top - dy;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
const handleMouseUpOrLeave = useCallbackRef(() => {
|
|
55
|
+
if (!dragContainerRef.current) return;
|
|
56
|
+
off("mousemove", dragContainerRef.current, handleMouseMove);
|
|
57
|
+
off("mouseup", dragContainerRef.current, handleMouseUpOrLeave);
|
|
58
|
+
off("mouseleave", dragContainerRef.current, handleMouseUpOrLeave);
|
|
59
|
+
resetCursor(dragContainerRef.current);
|
|
60
|
+
});
|
|
61
|
+
const handleMouseDown = useCallbackRef((event) => {
|
|
62
|
+
if (usage === "mobileAndTabletOnly" && window.innerWidth >= 768) return;
|
|
63
|
+
if (usage === "desktopOnly" && window.innerWidth < 768) return;
|
|
64
|
+
if (!dragContainerRef.current) return;
|
|
65
|
+
if (orientation === "horizontal" || orientation === "both") {
|
|
66
|
+
positionRef.current.x = event.clientX;
|
|
67
|
+
positionRef.current.left = dragContainerRef.current.scrollLeft;
|
|
68
|
+
}
|
|
69
|
+
if (orientation === "vertical" || orientation === "both") {
|
|
70
|
+
positionRef.current.y = event.clientY;
|
|
71
|
+
positionRef.current.top = dragContainerRef.current.scrollTop;
|
|
72
|
+
}
|
|
73
|
+
updateCursor(dragContainerRef.current);
|
|
74
|
+
on("mousemove", dragContainerRef.current, handleMouseMove);
|
|
75
|
+
on("mouseup", dragContainerRef.current, handleMouseUpOrLeave);
|
|
76
|
+
on("mouseleave", dragContainerRef.current, handleMouseUpOrLeave);
|
|
77
|
+
});
|
|
78
|
+
const refCallBack = useCallbackRef((node) => {
|
|
79
|
+
dragContainerRef.current = node;
|
|
80
|
+
node && handleScrollSnap(node);
|
|
81
|
+
const cleanup = on("mousedown", dragContainerRef.current, handleMouseDown);
|
|
82
|
+
return cleanup;
|
|
83
|
+
});
|
|
84
|
+
const getRootProps = (rootProps) => {
|
|
85
|
+
const mergedRootProps = mergeTwoProps(extraRootProps, rootProps);
|
|
86
|
+
return {
|
|
87
|
+
...mergedRootProps,
|
|
88
|
+
className: cnMerge(
|
|
89
|
+
`flex w-full cursor-grab snap-x snap-mandatory overflow-x-scroll overflow-y-clip
|
|
90
|
+
[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden`,
|
|
91
|
+
orientation === "horizontal" && "flex-row",
|
|
92
|
+
orientation === "vertical" && "flex-col",
|
|
93
|
+
usage === "mobileAndTabletOnly" && "md:cursor-default md:flex-col",
|
|
94
|
+
usage === "desktopOnly" && "max-md:cursor-default max-md:flex-col",
|
|
95
|
+
classNames?.base,
|
|
96
|
+
mergedRootProps.className
|
|
97
|
+
),
|
|
98
|
+
"data-part": "root",
|
|
99
|
+
"data-scope": "drag-scroll",
|
|
100
|
+
ref: composeRefs([
|
|
101
|
+
refCallBack,
|
|
102
|
+
mergedRootProps?.ref
|
|
103
|
+
])
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
const getItemProps = (itemProps) => {
|
|
107
|
+
const mergedItemProps = mergeTwoProps(extraItemProps, itemProps);
|
|
108
|
+
return {
|
|
109
|
+
...mergedItemProps,
|
|
110
|
+
className: cnMerge("snap-center snap-always", classNames?.item, mergedItemProps.className),
|
|
111
|
+
"data-part": "item",
|
|
112
|
+
"data-scope": "drag-scroll"
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
return { getItemProps, getRootProps };
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export { useDragScroll };
|
|
4
119
|
//# sourceMappingURL=index.js.map
|
|
5
120
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/drag-scroll/utils.ts","../../../../src/components/ui/drag-scroll/use-drag-scroll.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { checkIsDeviceMobileOrTablet } from \"@zayne-labs/toolkit-core\";\n\n/* eslint-disable no-param-reassign -- Mutation is needed here since it's an element */\nexport const updateCursor = <TElement extends HTMLElement>(element: TElement) => {\n\telement.style.cursor = \"grabbing\";\n\telement.style.userSelect = \"none\";\n};\n\nexport const onScrollSnap = <TElement extends HTMLElement>(\n\taction: \"remove\" | \"reset\",\n\telement: TElement\n) => {\n\tif (action === \"remove\") {\n\t\telement.style.scrollSnapType = \"none\";\n\t\treturn;\n\t}\n\n\telement.style.scrollSnapType = \"\";\n};\n\nexport const resetCursor = <TElement extends HTMLElement>(element: TElement) => {\n\telement.style.cursor = \"\";\n\telement.style.userSelect = \"\";\n};\n/* eslint-enable no-param-reassign -- Mutation is needed here since it's an element */\n\nexport const handleScrollSnap = (dragContainer: HTMLElement) => {\n\tconst isMobileOrTablet = checkIsDeviceMobileOrTablet();\n\n\tif (!isMobileOrTablet) {\n\t\tonScrollSnap(\"remove\", dragContainer);\n\t} else {\n\t\tonScrollSnap(\"reset\", dragContainer);\n\t}\n};\n","import { cnMerge } from \"@/lib/utils/cn\";\nimport { off, on } from \"@zayne-labs/toolkit-core\";\nimport { useCallbackRef } from \"@zayne-labs/toolkit-react\";\nimport { type InferProps, composeRefs, mergeTwoProps } from \"@zayne-labs/toolkit-react/utils\";\nimport { type RefCallback, useRef } from \"react\";\nimport { handleScrollSnap, resetCursor, updateCursor } from \"./utils\";\n\ntype DragScrollProps<TElement extends HTMLElement> = {\n\tclassNames?: { base?: string; item?: string };\n\textraItemProps?: InferProps<HTMLElement>;\n\textraRootProps?: Omit<InferProps<TElement>, \"children\">;\n\torientation?: \"both\" | \"horizontal\" | \"vertical\";\n\tusage?: \"allScreens\" | \"desktopOnly\" | \"mobileAndTabletOnly\";\n};\n\nconst useDragScroll = <TElement extends HTMLElement>(props: DragScrollProps<TElement> = {}) => {\n\tconst {\n\t\tclassNames,\n\t\textraItemProps,\n\t\textraRootProps,\n\t\torientation = \"horizontal\",\n\t\tusage = \"allScreens\",\n\t} = props;\n\n\tconst dragContainerRef = useRef<TElement>(null);\n\n\tconst positionRef = useRef({ left: 0, top: 0, x: 0, y: 0 });\n\n\tconst handleMouseMove = useCallbackRef((event: MouseEvent) => {\n\t\tif (!dragContainerRef.current) return;\n\n\t\tif (orientation === \"horizontal\" || orientation === \"both\") {\n\t\t\t// == calculate the current change in the horizontal scroll position based on the difference between the previous mouse position and the new mouse position\n\t\t\tconst dx = event.clientX - positionRef.current.x;\n\n\t\t\t// == Assign the scrollLeft of the container to the difference between its previous horizontal scroll position and the change in the mouse position\n\t\t\tdragContainerRef.current.scrollLeft = positionRef.current.left - dx;\n\t\t}\n\n\t\tif (orientation === \"vertical\" || orientation === \"both\") {\n\t\t\t// == calculate the current change in the vertical scroll position based on the difference between the previous mouse position and the new mouse position\n\t\t\tconst dy = event.clientY - positionRef.current.y;\n\n\t\t\t// == Assign the scrollTop of the container to the difference between its previous vertical scroll position and the change in the mouse position\n\t\t\tdragContainerRef.current.scrollTop = positionRef.current.top - dy;\n\t\t}\n\t});\n\n\tconst handleMouseUpOrLeave = useCallbackRef(() => {\n\t\tif (!dragContainerRef.current) return;\n\n\t\toff(\"mousemove\", dragContainerRef.current, handleMouseMove);\n\t\toff(\"mouseup\", dragContainerRef.current, handleMouseUpOrLeave);\n\t\toff(\"mouseleave\", dragContainerRef.current, handleMouseUpOrLeave);\n\n\t\tresetCursor(dragContainerRef.current);\n\t});\n\n\tconst handleMouseDown = useCallbackRef((event: MouseEvent) => {\n\t\tif (usage === \"mobileAndTabletOnly\" && window.innerWidth >= 768) return;\n\t\tif (usage === \"desktopOnly\" && window.innerWidth < 768) return;\n\n\t\tif (!dragContainerRef.current) return;\n\n\t\t// == Update all initial position properties stored in the positionRef\n\t\tif (orientation === \"horizontal\" || orientation === \"both\") {\n\t\t\tpositionRef.current.x = event.clientX;\n\t\t\tpositionRef.current.left = dragContainerRef.current.scrollLeft;\n\t\t}\n\n\t\tif (orientation === \"vertical\" || orientation === \"both\") {\n\t\t\tpositionRef.current.y = event.clientY;\n\t\t\tpositionRef.current.top = dragContainerRef.current.scrollTop;\n\t\t}\n\n\t\tupdateCursor(dragContainerRef.current);\n\n\t\ton(\"mousemove\", dragContainerRef.current, handleMouseMove);\n\t\ton(\"mouseup\", dragContainerRef.current, handleMouseUpOrLeave);\n\t\ton(\"mouseleave\", dragContainerRef.current, handleMouseUpOrLeave);\n\t});\n\n\tconst refCallBack: RefCallback<TElement> = useCallbackRef((node) => {\n\t\tdragContainerRef.current = node;\n\n\t\tnode && handleScrollSnap(node);\n\n\t\tconst cleanup = on(\"mousedown\", dragContainerRef.current, handleMouseDown);\n\n\t\treturn cleanup;\n\t});\n\n\tconst getRootProps = (rootProps?: DragScrollProps<TElement>[\"extraRootProps\"]) => {\n\t\tconst mergedRootProps = mergeTwoProps(extraRootProps, rootProps);\n\n\t\treturn {\n\t\t\t...mergedRootProps,\n\t\t\tclassName: cnMerge(\n\t\t\t\t`flex w-full cursor-grab snap-x snap-mandatory overflow-x-scroll overflow-y-clip\n\t\t\t\t[-ms-overflow-style:none] [scrollbar-width:none] [&::-webkit-scrollbar]:hidden`,\n\t\t\t\torientation === \"horizontal\" && \"flex-row\",\n\t\t\t\torientation === \"vertical\" && \"flex-col\",\n\t\t\t\tusage === \"mobileAndTabletOnly\" && \"md:cursor-default md:flex-col\",\n\t\t\t\tusage === \"desktopOnly\" && \"max-md:cursor-default max-md:flex-col\",\n\t\t\t\tclassNames?.base,\n\t\t\t\tmergedRootProps.className\n\t\t\t),\n\t\t\t\"data-part\": \"root\",\n\t\t\t\"data-scope\": \"drag-scroll\",\n\t\t\tref: composeRefs([\n\t\t\t\trefCallBack,\n\t\t\t\t(mergedRootProps as { ref?: React.Ref<TElement> } | undefined)?.ref,\n\t\t\t]),\n\t\t};\n\t};\n\n\tconst getItemProps = <TItemElement extends HTMLElement>(\n\t\titemProps?: DragScrollProps<TItemElement>[\"extraItemProps\"]\n\t) => {\n\t\tconst mergedItemProps = mergeTwoProps(extraItemProps, itemProps);\n\n\t\treturn {\n\t\t\t...mergedItemProps,\n\t\t\tclassName: cnMerge(\"snap-center snap-always\", classNames?.item, mergedItemProps.className),\n\t\t\t\"data-part\": \"item\",\n\t\t\t\"data-scope\": \"drag-scroll\",\n\t\t};\n\t};\n\n\treturn { getItemProps, getRootProps };\n};\n\nexport { useDragScroll };\n"]}
|
|
@@ -1,5 +1,140 @@
|
|
|
1
|
-
|
|
2
|
-
import '../../chunk-OHG7GB7O.js';
|
|
1
|
+
import { cnMerge } from '../../chunk-OHG7GB7O.js';
|
|
3
2
|
import '../../chunk-PZ5AY32C.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { useRef, useState } from 'react';
|
|
5
|
+
import { handleFileValidation } from '@zayne-labs/toolkit-core';
|
|
6
|
+
import { useToggle, useCallbackRef } from '@zayne-labs/toolkit-react';
|
|
7
|
+
import { mergeTwoProps, composeRefs } from '@zayne-labs/toolkit-react/utils';
|
|
8
|
+
import { isFunction } from '@zayne-labs/toolkit-type-helpers';
|
|
9
|
+
|
|
10
|
+
var useDropZone = (props) => {
|
|
11
|
+
const inputRef = useRef(null);
|
|
12
|
+
const {
|
|
13
|
+
allowedFileTypes,
|
|
14
|
+
children,
|
|
15
|
+
classNames,
|
|
16
|
+
disallowDuplicates = true,
|
|
17
|
+
existingFiles,
|
|
18
|
+
extraInputProps,
|
|
19
|
+
extraRootProps,
|
|
20
|
+
fileLimit,
|
|
21
|
+
maxFileSize,
|
|
22
|
+
onUpload,
|
|
23
|
+
onUploadError,
|
|
24
|
+
onUploadSuccess,
|
|
25
|
+
render,
|
|
26
|
+
validator
|
|
27
|
+
// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- Can be undefined
|
|
28
|
+
} = props ?? {};
|
|
29
|
+
const [isDragging, toggleIsDragging] = useToggle(false);
|
|
30
|
+
const [acceptedFiles, setAcceptedFiles] = useState([]);
|
|
31
|
+
const handleFileUpload = useCallbackRef(
|
|
32
|
+
(event) => {
|
|
33
|
+
if (event.defaultPrevented) return;
|
|
34
|
+
if (event.type === "drop") {
|
|
35
|
+
event.preventDefault();
|
|
36
|
+
toggleIsDragging(false);
|
|
37
|
+
}
|
|
38
|
+
const fileList = event.type === "drop" ? event.dataTransfer.files : event.target.files;
|
|
39
|
+
if (fileList === null) {
|
|
40
|
+
console.warn("No file selected");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const validFilesArray = handleFileValidation({
|
|
44
|
+
existingFileArray: existingFiles,
|
|
45
|
+
newFileList: fileList,
|
|
46
|
+
onError: onUploadError,
|
|
47
|
+
onSuccess: onUploadSuccess,
|
|
48
|
+
validationSettings: {
|
|
49
|
+
allowedFileTypes,
|
|
50
|
+
disallowDuplicates,
|
|
51
|
+
fileLimit,
|
|
52
|
+
maxFileSize
|
|
53
|
+
},
|
|
54
|
+
validator
|
|
55
|
+
});
|
|
56
|
+
if (validFilesArray.length === 0) return;
|
|
57
|
+
setAcceptedFiles(validFilesArray);
|
|
58
|
+
onUpload?.({ acceptedFiles: validFilesArray, event });
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
const handleDragOver = (event) => {
|
|
62
|
+
event.preventDefault();
|
|
63
|
+
toggleIsDragging(true);
|
|
64
|
+
};
|
|
65
|
+
const handleDragLeave = (event) => {
|
|
66
|
+
event.preventDefault();
|
|
67
|
+
toggleIsDragging(false);
|
|
68
|
+
};
|
|
69
|
+
const getRenderProps = () => ({
|
|
70
|
+
acceptedFiles,
|
|
71
|
+
inputRef,
|
|
72
|
+
isDragging,
|
|
73
|
+
openFilePicker: () => inputRef.current?.click()
|
|
74
|
+
});
|
|
75
|
+
const computedChildren = children ?? render;
|
|
76
|
+
const getChildren = () => isFunction(computedChildren) ? computedChildren(getRenderProps()) : computedChildren;
|
|
77
|
+
const getRootProps = (rootProps) => {
|
|
78
|
+
const mergedRootProps = mergeTwoProps(extraRootProps, rootProps);
|
|
79
|
+
return {
|
|
80
|
+
...mergedRootProps,
|
|
81
|
+
className: cnMerge(
|
|
82
|
+
"relative isolate flex flex-col",
|
|
83
|
+
mergedRootProps.className,
|
|
84
|
+
classNames?.base,
|
|
85
|
+
isDragging && ["opacity-60", classNames?.activeDrag, rootProps?.classNames?.activeDrag]
|
|
86
|
+
),
|
|
87
|
+
"data-active-drag": isDragging,
|
|
88
|
+
"data-part": "root",
|
|
89
|
+
"data-scope": "dropzone",
|
|
90
|
+
onDragEnter: handleDragOver,
|
|
91
|
+
onDragLeave: handleDragLeave,
|
|
92
|
+
onDragOver: handleDragOver,
|
|
93
|
+
onDrop: handleFileUpload
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
const getInputProps = (inputProps) => {
|
|
97
|
+
const mergedInputProps = mergeTwoProps(extraInputProps, inputProps);
|
|
98
|
+
return {
|
|
99
|
+
...mergedInputProps,
|
|
100
|
+
accept: allowedFileTypes ? allowedFileTypes.join(", ") : mergedInputProps.accept,
|
|
101
|
+
className: cnMerge(
|
|
102
|
+
"absolute inset-0 z-[100] cursor-pointer opacity-0",
|
|
103
|
+
classNames?.input,
|
|
104
|
+
mergedInputProps.className
|
|
105
|
+
),
|
|
106
|
+
"data-active-drag": isDragging,
|
|
107
|
+
"data-part": "input",
|
|
108
|
+
"data-scope": "dropzone",
|
|
109
|
+
onChange: (event) => {
|
|
110
|
+
mergedInputProps.onChange?.(event);
|
|
111
|
+
handleFileUpload(event);
|
|
112
|
+
},
|
|
113
|
+
ref: composeRefs([inputRef, mergedInputProps.ref]),
|
|
114
|
+
type: "file"
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
return {
|
|
118
|
+
acceptedFiles,
|
|
119
|
+
computedChildren,
|
|
120
|
+
getChildren,
|
|
121
|
+
getInputProps,
|
|
122
|
+
getRenderProps,
|
|
123
|
+
getRootProps,
|
|
124
|
+
handleDragLeave,
|
|
125
|
+
handleDragOver,
|
|
126
|
+
handleFileUpload,
|
|
127
|
+
inputRef,
|
|
128
|
+
isDragging
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// src/components/ui/drop-zone/drop-zone.tsx
|
|
133
|
+
function DropZone(props) {
|
|
134
|
+
const api = useDropZone(props);
|
|
135
|
+
return /* @__PURE__ */ React.createElement("div", { ...api.getRootProps() }, /* @__PURE__ */ React.createElement("input", { ...api.getInputProps() }), api.getChildren());
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export { DropZone, useDropZone };
|
|
4
139
|
//# sourceMappingURL=index.js.map
|
|
5
140
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/drop-zone/use-drop-zone.ts","../../../../src/components/ui/drop-zone/drop-zone.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport { type FileValidationOptions, handleFileValidation } from \"@zayne-labs/toolkit-core\";\nimport { useCallbackRef, useToggle } from \"@zayne-labs/toolkit-react\";\nimport {\n\ttype DiscriminatedRenderProps,\n\ttype InferProps,\n\tcomposeRefs,\n\tmergeTwoProps,\n} from \"@zayne-labs/toolkit-react/utils\";\nimport { isFunction } from \"@zayne-labs/toolkit-type-helpers\";\nimport { useRef, useState } from \"react\";\n\ntype RenderProps = {\n\tacceptedFiles: File[];\n\tinputRef: React.RefObject<HTMLInputElement | null>;\n\tisDragging: boolean;\n\topenFilePicker: () => void;\n};\n\nexport type RootProps = InferProps<\"div\"> & {\n\tclassNames?: {\n\t\tactiveDrag?: string;\n\t\tbase?: string;\n\t};\n};\n\nexport type InputProps = InferProps<\"input\">;\n\ntype DropZoneRenderProps = DiscriminatedRenderProps<\n\tReact.ReactNode | ((props: RenderProps) => React.ReactNode)\n>;\n\nexport type UseDropZoneProps = DropZoneRenderProps & {\n\t/**\n\t * Allowed file types to be uploaded.\n\t */\n\tallowedFileTypes?: string[];\n\n\tclassNames?: { activeDrag?: string; base?: string; input?: string };\n\t/**\n\t * Whether to disallow duplicate files\n\t * @default true\n\t */\n\tdisallowDuplicates?: boolean;\n\n\t/**\n\t * Existing files to be uploaded\n\t */\n\texistingFiles?: File[];\n\n\t/**\n\t * Extra props to pass to the input element\n\t */\n\textraInputProps?: InputProps;\n\n\t/**\n\t * Extra props to pass to the root element\n\t */\n\textraRootProps?: RootProps;\n\n\t/**\n\t * Maximum number of files that can be uploaded.\n\t */\n\tfileLimit?: number;\n\n\t/**\n\t * Maximum file size in MB\n\t */\n\tmaxFileSize?: number;\n\n\t/**\n\t * Callback function to handle file upload\n\t */\n\tonUpload?: (details: {\n\t\tacceptedFiles: File[];\n\t\tevent: React.ChangeEvent<HTMLInputElement> | React.DragEvent<HTMLDivElement>;\n\t}) => void;\n\n\t/**\n\t * Callback function to handle file upload errors\n\t */\n\tonUploadError?: FileValidationOptions[\"onError\"];\n\n\t/**\n\t * Callback function to handle file upload success\n\t */\n\tonUploadSuccess?: FileValidationOptions[\"onSuccess\"];\n\n\t/**\n\t * Custom validator function to handle file validation\n\t */\n\tvalidator?: (context: { existingFileArray: File[] | undefined; newFileList: FileList }) => File[];\n};\n\nexport const useDropZone = (props: UseDropZoneProps) => {\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\n\tconst {\n\t\tallowedFileTypes,\n\t\tchildren,\n\t\tclassNames,\n\t\tdisallowDuplicates = true,\n\t\texistingFiles,\n\t\textraInputProps,\n\t\textraRootProps,\n\t\tfileLimit,\n\t\tmaxFileSize,\n\t\tonUpload,\n\t\tonUploadError,\n\t\tonUploadSuccess,\n\t\trender,\n\t\tvalidator,\n\t\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- Can be undefined\n\t} = props ?? {};\n\n\tconst [isDragging, toggleIsDragging] = useToggle(false);\n\n\tconst [acceptedFiles, setAcceptedFiles] = useState<File[]>([]);\n\n\tconst handleFileUpload = useCallbackRef(\n\t\t(event: React.ChangeEvent<HTMLInputElement> | React.DragEvent<HTMLDivElement>) => {\n\t\t\tif (event.defaultPrevented) return;\n\n\t\t\tif (event.type === \"drop\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\ttoggleIsDragging(false);\n\t\t\t}\n\n\t\t\tconst fileList =\n\t\t\t\tevent.type === \"drop\"\n\t\t\t\t\t? (event as React.DragEvent).dataTransfer.files\n\t\t\t\t\t: (event as React.ChangeEvent<HTMLInputElement>).target.files;\n\n\t\t\tif (fileList === null) {\n\t\t\t\tconsole.warn(\"No file selected\");\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst validFilesArray = handleFileValidation({\n\t\t\t\texistingFileArray: existingFiles,\n\t\t\t\tnewFileList: fileList,\n\t\t\t\tonError: onUploadError,\n\t\t\t\tonSuccess: onUploadSuccess,\n\t\t\t\tvalidationSettings: {\n\t\t\t\t\tallowedFileTypes,\n\t\t\t\t\tdisallowDuplicates,\n\t\t\t\t\tfileLimit,\n\t\t\t\t\tmaxFileSize,\n\t\t\t\t},\n\t\t\t\tvalidator,\n\t\t\t});\n\n\t\t\tif (validFilesArray.length === 0) return;\n\n\t\t\tsetAcceptedFiles(validFilesArray);\n\n\t\t\tonUpload?.({ acceptedFiles: validFilesArray, event });\n\t\t}\n\t);\n\n\tconst handleDragOver = (event: React.DragEvent<HTMLDivElement>) => {\n\t\tevent.preventDefault();\n\t\ttoggleIsDragging(true);\n\t};\n\n\tconst handleDragLeave = (event: React.DragEvent<HTMLDivElement>) => {\n\t\tevent.preventDefault();\n\t\ttoggleIsDragging(false);\n\t};\n\n\tconst getRenderProps = () =>\n\t\t({\n\t\t\tacceptedFiles,\n\t\t\tinputRef,\n\t\t\tisDragging,\n\t\t\topenFilePicker: () => inputRef.current?.click(),\n\t\t}) satisfies RenderProps;\n\n\tconst computedChildren = children ?? render;\n\n\tconst getChildren = () =>\n\t\tisFunction(computedChildren) ? computedChildren(getRenderProps()) : computedChildren;\n\n\tconst getRootProps = (rootProps?: RootProps) => {\n\t\tconst mergedRootProps = mergeTwoProps(extraRootProps, rootProps);\n\n\t\treturn {\n\t\t\t...mergedRootProps,\n\t\t\tclassName: cnMerge(\n\t\t\t\t\"relative isolate flex flex-col\",\n\t\t\t\tmergedRootProps.className,\n\t\t\t\tclassNames?.base,\n\t\t\t\tisDragging && [\"opacity-60\", classNames?.activeDrag, rootProps?.classNames?.activeDrag]\n\t\t\t),\n\t\t\t\"data-active-drag\": isDragging,\n\t\t\t\"data-part\": \"root\",\n\t\t\t\"data-scope\": \"dropzone\",\n\t\t\tonDragEnter: handleDragOver,\n\t\t\tonDragLeave: handleDragLeave,\n\t\t\tonDragOver: handleDragOver,\n\t\t\tonDrop: handleFileUpload,\n\t\t};\n\t};\n\n\tconst getInputProps = (inputProps?: InputProps) => {\n\t\tconst mergedInputProps = mergeTwoProps(extraInputProps, inputProps);\n\n\t\treturn {\n\t\t\t...mergedInputProps,\n\t\t\taccept: allowedFileTypes ? allowedFileTypes.join(\", \") : mergedInputProps.accept,\n\t\t\tclassName: cnMerge(\n\t\t\t\t\"absolute inset-0 z-[100] cursor-pointer opacity-0\",\n\t\t\t\tclassNames?.input,\n\t\t\t\tmergedInputProps.className\n\t\t\t),\n\t\t\t\"data-active-drag\": isDragging,\n\t\t\t\"data-part\": \"input\",\n\t\t\t\"data-scope\": \"dropzone\",\n\t\t\tonChange: (event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\t\tmergedInputProps.onChange?.(event);\n\t\t\t\thandleFileUpload(event);\n\t\t\t},\n\t\t\tref: composeRefs([inputRef, mergedInputProps.ref]),\n\t\t\ttype: \"file\",\n\t\t};\n\t};\n\n\treturn {\n\t\tacceptedFiles,\n\t\tcomputedChildren,\n\t\tgetChildren,\n\t\tgetInputProps,\n\t\tgetRenderProps,\n\t\tgetRootProps,\n\t\thandleDragLeave,\n\t\thandleDragOver,\n\t\thandleFileUpload,\n\t\tinputRef,\n\t\tisDragging,\n\t};\n};\n","import * as React from \"react\";\n\nimport { type UseDropZoneProps, useDropZone } from \"./use-drop-zone\";\n\nfunction DropZone(props: UseDropZoneProps) {\n\tconst api = useDropZone(props);\n\n\treturn (\n\t\t<div {...api.getRootProps()}>\n\t\t\t<input {...api.getInputProps()} />\n\n\t\t\t{api.getChildren()}\n\t\t</div>\n\t);\n}\n\nexport { DropZone };\n"]}
|