@myrjfa/ui 1.1.0 → 1.1.1
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/chat/ChatMain.d.ts.map +1 -1
- package/dist/chat/ChatMain.js +173 -145
- package/dist/chat/ChatSidebar.js +7 -8
- package/dist/chat/ConversationList.d.ts.map +1 -1
- package/dist/chat/ConversationList.js +20 -18
- package/dist/chat/ExpensePanel.d.ts +4 -1
- package/dist/chat/ExpensePanel.d.ts.map +1 -1
- package/dist/chat/ExpensePanel.js +215 -195
- package/dist/chat/MessageBubble.d.ts +5 -3
- package/dist/chat/MessageBubble.d.ts.map +1 -1
- package/dist/chat/MessageBubble.js +185 -103
- package/dist/chat/MessageInput.d.ts +8 -1
- package/dist/chat/MessageInput.d.ts.map +1 -1
- package/dist/chat/MessageInput.js +182 -165
- package/dist/chat/MilestonePanel.d.ts +4 -1
- package/dist/chat/MilestonePanel.d.ts.map +1 -1
- package/dist/chat/MilestonePanel.js +150 -150
- package/dist/chat/components/ParticipantSelector.d.ts +11 -0
- package/dist/chat/components/ParticipantSelector.d.ts.map +1 -0
- package/dist/chat/components/ParticipantSelector.js +17 -0
- package/dist/chat/components/SplitInputs.d.ts +11 -0
- package/dist/chat/components/SplitInputs.d.ts.map +1 -0
- package/dist/chat/components/SplitInputs.js +83 -0
- package/dist/chat/components/SplitTypeSelector.d.ts +8 -0
- package/dist/chat/components/SplitTypeSelector.d.ts.map +1 -0
- package/dist/chat/components/SplitTypeSelector.js +13 -0
- package/dist/chat/dialogs/AddMemberDialog.js +30 -90
- package/dist/chat/dialogs/CameraDialog.js +38 -86
- package/dist/chat/dialogs/CreatePollDialog.d.ts +8 -0
- package/dist/chat/dialogs/CreatePollDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/CreatePollDialog.js +38 -0
- package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts +19 -0
- package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/ExpenseAnalyticsDialog.js +52 -0
- package/dist/chat/dialogs/GroupInfoDialog.d.ts.map +1 -1
- package/dist/chat/dialogs/GroupInfoDialog.js +55 -92
- package/dist/chat/dialogs/GroupInfoViewDialog.js +5 -6
- package/dist/chat/dialogs/NewChatDialog.d.ts.map +1 -1
- package/dist/chat/dialogs/NewChatDialog.js +49 -113
- package/dist/chat/dialogs/NewGroupDialog.d.ts.map +1 -1
- package/dist/chat/dialogs/NewGroupDialog.js +49 -92
- package/dist/chat/dialogs/ParticipantsDialog.d.ts.map +1 -1
- package/dist/chat/dialogs/ParticipantsDialog.js +68 -118
- package/dist/chat/dialogs/UserProfileDialog.d.ts +10 -0
- package/dist/chat/dialogs/UserProfileDialog.d.ts.map +1 -0
- package/dist/chat/dialogs/UserProfileDialog.js +100 -0
- package/dist/dashboard/action-buttons.js +4 -5
- package/dist/dashboard/app-sidebar.js +46 -128
- package/dist/dashboard/card-header.js +1 -2
- package/dist/dashboard/dashboard-components.js +3 -5
- package/dist/dashboard/data-table.js +21 -33
- package/dist/dashboard/nav-main.js +4 -5
- package/dist/dashboard/nav-secondary.js +2 -25
- package/dist/dashboard/stats-card.js +1 -2
- package/dist/dashboard/table.js +8 -54
- package/dist/header/mobile-nav-item.js +1 -2
- package/dist/header/mobile-navbar.js +8 -9
- package/dist/header/nav-item.js +1 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/main/footer.js +5 -9
- package/dist/main/navbar.js +53 -136
- package/dist/main/paginationBar.js +12 -14
- package/dist/main/portfolio/portfolioItem.js +1 -2
- package/dist/main/portfolio/portfolioPopup.js +16 -17
- package/dist/main/review-page.d.ts.map +1 -1
- package/dist/main/review-page.js +131 -198
- package/dist/misc/accordion.js +8 -34
- package/dist/misc/alert-dialog.js +22 -55
- package/dist/misc/alert.js +7 -32
- package/dist/misc/alertdialogclaude.js +50 -125
- package/dist/misc/avatar.js +6 -31
- package/dist/misc/badge.js +4 -27
- package/dist/misc/button.js +4 -27
- package/dist/misc/card.js +12 -40
- package/dist/misc/carousel.js +37 -61
- package/dist/misc/checkbox.js +2 -25
- package/dist/misc/command.js +18 -49
- package/dist/misc/datepicker.js +66 -76
- package/dist/misc/dialog.js +20 -52
- package/dist/misc/dropdown-menu.js +30 -67
- package/dist/misc/faq.js +2 -3
- package/dist/misc/file-preview.js +43 -97
- package/dist/misc/filter.d.ts.map +1 -1
- package/dist/misc/filter.js +18 -21
- package/dist/misc/filterBar.js +136 -160
- package/dist/misc/form.js +39 -60
- package/dist/misc/image-cropper.d.ts +10 -0
- package/dist/misc/image-cropper.d.ts.map +1 -0
- package/dist/misc/image-cropper.js +44 -0
- package/dist/misc/input.js +2 -25
- package/dist/misc/label.js +2 -25
- package/dist/misc/line-carousel.js +3 -13
- package/dist/misc/multiImageUploader.js +2 -3
- package/dist/misc/newsLetter.js +18 -78
- package/dist/misc/notification.d.ts +1 -2
- package/dist/misc/notification.d.ts.map +1 -1
- package/dist/misc/notification.js +89 -125
- package/dist/misc/pagination.js +16 -45
- package/dist/misc/password-eye.js +2 -3
- package/dist/misc/popover.d.ts.map +1 -1
- package/dist/misc/popover.js +8 -34
- package/dist/misc/progress.js +2 -25
- package/dist/misc/scroll-area.js +5 -29
- package/dist/misc/searchBar.js +27 -31
- package/dist/misc/searchBox.js +18 -22
- package/dist/misc/select.d.ts.map +1 -1
- package/dist/misc/select.js +22 -54
- package/dist/misc/separator.js +2 -25
- package/dist/misc/share.js +48 -104
- package/dist/misc/sheet.js +21 -53
- package/dist/misc/sidebar.js +112 -153
- package/dist/misc/skeleton.js +2 -25
- package/dist/misc/slider.js +3 -26
- package/dist/misc/starRating.js +5 -15
- package/dist/misc/stateCard.js +7 -8
- package/dist/misc/switch.d.ts +5 -0
- package/dist/misc/switch.d.ts.map +1 -0
- package/dist/misc/switch.js +8 -0
- package/dist/misc/tabs.js +8 -34
- package/dist/misc/textarea.js +2 -25
- package/dist/misc/tile.js +31 -92
- package/dist/misc/tooltip.js +8 -34
- package/dist/profile/socialLink.d.ts +1 -1
- package/dist/profile/socialLink.d.ts.map +1 -1
- package/dist/profile/socialLink.js +53 -69
- package/dist/utils/permissions.d.ts +7 -0
- package/dist/utils/permissions.d.ts.map +1 -0
- package/dist/utils/permissions.js +38 -0
- package/package.json +3 -2
package/dist/misc/carousel.js
CHANGED
|
@@ -1,58 +1,38 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
14
|
-
var t = {};
|
|
15
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
16
|
-
t[p] = s[p];
|
|
17
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
18
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
19
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
20
|
-
t[p[i]] = s[p[i]];
|
|
21
|
-
}
|
|
22
|
-
return t;
|
|
23
|
-
};
|
|
24
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
25
3
|
import { cn } from "@myrjfa/state/dist/lib/utils";
|
|
26
4
|
import useEmblaCarousel from "embla-carousel-react";
|
|
27
5
|
import { ArrowLeft, ArrowRight } from "lucide-react";
|
|
28
6
|
import React from "react";
|
|
29
7
|
import { Button } from "./button";
|
|
30
|
-
|
|
8
|
+
const CarouselContext = React.createContext(null);
|
|
31
9
|
function useCarousel() {
|
|
32
|
-
|
|
10
|
+
const context = React.useContext(CarouselContext);
|
|
33
11
|
if (!context) {
|
|
34
12
|
throw new Error("useCarousel must be used within a <Carousel />");
|
|
35
13
|
}
|
|
36
14
|
return context;
|
|
37
15
|
}
|
|
38
|
-
function Carousel(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
16
|
+
function Carousel({ orientation = "horizontal", opts, setApi, plugins, className, children, ...props }) {
|
|
17
|
+
const [carouselRef, api] = useEmblaCarousel({
|
|
18
|
+
...opts,
|
|
19
|
+
axis: orientation === "horizontal" ? "x" : "y",
|
|
20
|
+
}, plugins);
|
|
21
|
+
const [canScrollPrev, setCanScrollPrev] = React.useState(false);
|
|
22
|
+
const [canScrollNext, setCanScrollNext] = React.useState(false);
|
|
23
|
+
const onSelect = React.useCallback((api) => {
|
|
44
24
|
if (!api)
|
|
45
25
|
return;
|
|
46
26
|
setCanScrollPrev(api.canScrollPrev());
|
|
47
27
|
setCanScrollNext(api.canScrollNext());
|
|
48
28
|
}, []);
|
|
49
|
-
|
|
29
|
+
const scrollPrev = React.useCallback(() => {
|
|
50
30
|
api === null || api === void 0 ? void 0 : api.scrollPrev();
|
|
51
31
|
}, [api]);
|
|
52
|
-
|
|
32
|
+
const scrollNext = React.useCallback(() => {
|
|
53
33
|
api === null || api === void 0 ? void 0 : api.scrollNext();
|
|
54
34
|
}, [api]);
|
|
55
|
-
|
|
35
|
+
const handleKeyDown = React.useCallback((event) => {
|
|
56
36
|
if (event.key === "ArrowLeft") {
|
|
57
37
|
event.preventDefault();
|
|
58
38
|
scrollPrev();
|
|
@@ -62,54 +42,50 @@ function Carousel(_a) {
|
|
|
62
42
|
scrollNext();
|
|
63
43
|
}
|
|
64
44
|
}, [scrollPrev, scrollNext]);
|
|
65
|
-
React.useEffect(
|
|
45
|
+
React.useEffect(() => {
|
|
66
46
|
if (!api || !setApi)
|
|
67
47
|
return;
|
|
68
48
|
setApi(api);
|
|
69
49
|
}, [api, setApi]);
|
|
70
|
-
React.useEffect(
|
|
50
|
+
React.useEffect(() => {
|
|
71
51
|
if (!api)
|
|
72
52
|
return;
|
|
73
53
|
onSelect(api);
|
|
74
54
|
api.on("reInit", onSelect);
|
|
75
55
|
api.on("select", onSelect);
|
|
76
|
-
return
|
|
56
|
+
return () => {
|
|
77
57
|
api === null || api === void 0 ? void 0 : api.off("select", onSelect);
|
|
78
58
|
};
|
|
79
59
|
}, [api, onSelect]);
|
|
80
60
|
return (_jsx(CarouselContext.Provider, { value: {
|
|
81
|
-
carouselRef
|
|
61
|
+
carouselRef,
|
|
82
62
|
api: api,
|
|
83
|
-
opts
|
|
63
|
+
opts,
|
|
84
64
|
orientation: orientation || ((opts === null || opts === void 0 ? void 0 : opts.axis) === "y" ? "vertical" : "horizontal"),
|
|
85
|
-
scrollPrev
|
|
86
|
-
scrollNext
|
|
87
|
-
canScrollPrev
|
|
88
|
-
canScrollNext
|
|
89
|
-
}, children: _jsx("div",
|
|
65
|
+
scrollPrev,
|
|
66
|
+
scrollNext,
|
|
67
|
+
canScrollPrev,
|
|
68
|
+
canScrollNext,
|
|
69
|
+
}, children: _jsx("div", { onKeyDownCapture: handleKeyDown, className: cn("relative", className), role: "region", "aria-roledescription": "carousel", "data-slot": "carousel", ...props, children: children }) }));
|
|
90
70
|
}
|
|
91
|
-
function CarouselContent(
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
return (_jsx("div", { ref: carouselRef, className: "overflow-hidden", "data-slot": "carousel-content", children: _jsx("div", __assign({ className: cn("flex", orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col", className) }, props)) }));
|
|
71
|
+
function CarouselContent({ className, ...props }) {
|
|
72
|
+
const { carouselRef, orientation } = useCarousel();
|
|
73
|
+
return (_jsx("div", { ref: carouselRef, className: "overflow-hidden", "data-slot": "carousel-content", children: _jsx("div", { className: cn("flex", orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col", className), ...props }) }));
|
|
95
74
|
}
|
|
96
|
-
function CarouselItem(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
return (_jsx("div", __assign({ role: "group", "aria-roledescription": "slide", "data-slot": "carousel-item", className: cn("min-w-0 shrink-0 grow-0 basis-full", orientation === "horizontal" ? "pl-4" : "pt-4", className) }, props)));
|
|
75
|
+
function CarouselItem({ className, ...props }) {
|
|
76
|
+
const { orientation } = useCarousel();
|
|
77
|
+
return (_jsx("div", { role: "group", "aria-roledescription": "slide", "data-slot": "carousel-item", className: cn("min-w-0 shrink-0 grow-0 basis-full", orientation === "horizontal" ? "pl-4" : "pt-4", className), ...props }));
|
|
100
78
|
}
|
|
101
|
-
function CarouselPrevious(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return (_jsxs(Button, __assign({ "data-slot": "carousel-previous", variant: variant, size: size, className: cn("absolute size-8 rounded-full", orientation === "horizontal"
|
|
79
|
+
function CarouselPrevious({ className, variant = "outline", size = "icon", ...props }) {
|
|
80
|
+
const { orientation, scrollPrev, canScrollPrev } = useCarousel();
|
|
81
|
+
return (_jsxs(Button, { "data-slot": "carousel-previous", variant: variant, size: size, className: cn("absolute size-8 rounded-full", orientation === "horizontal"
|
|
105
82
|
? "top-1/2 left-2"
|
|
106
|
-
: "top-2 left-1/2 rotate-90", className), disabled: !canScrollPrev, onClick: scrollPrev
|
|
83
|
+
: "top-2 left-1/2 rotate-90", className), disabled: !canScrollPrev, onClick: scrollPrev, ...props, children: [_jsx(ArrowLeft, {}), _jsx("span", { className: "sr-only", children: "Previous slide" })] }));
|
|
107
84
|
}
|
|
108
|
-
function CarouselNext(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
return (_jsxs(Button, __assign({ "data-slot": "carousel-next", variant: variant, size: size, className: cn("absolute size-8 rounded-full", orientation === "horizontal"
|
|
85
|
+
function CarouselNext({ className, variant = "outline", size = "icon", ...props }) {
|
|
86
|
+
const { orientation, scrollNext, canScrollNext } = useCarousel();
|
|
87
|
+
return (_jsxs(Button, { "data-slot": "carousel-next", variant: variant, size: size, className: cn("absolute size-8 rounded-full", orientation === "horizontal"
|
|
112
88
|
? "top-1/2 right-2"
|
|
113
|
-
: "bottom-2 left-1/2 rotate-90", className), disabled: !canScrollNext, onClick: scrollNext
|
|
89
|
+
: "bottom-2 left-1/2 rotate-90", className), disabled: !canScrollNext, onClick: scrollNext, ...props, children: [_jsx(ArrowRight, {}), _jsx("span", { className: "sr-only", children: "Next slide" })] }));
|
|
114
90
|
}
|
|
115
91
|
export { Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext, };
|
package/dist/misc/checkbox.js
CHANGED
|
@@ -1,32 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
14
|
-
var t = {};
|
|
15
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
16
|
-
t[p] = s[p];
|
|
17
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
18
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
19
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
20
|
-
t[p[i]] = s[p[i]];
|
|
21
|
-
}
|
|
22
|
-
return t;
|
|
23
|
-
};
|
|
24
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
25
3
|
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
|
|
26
4
|
import { cn } from "@myrjfa/state/dist/lib/utils";
|
|
27
5
|
import { CheckIcon } from "lucide-react";
|
|
28
|
-
function Checkbox(
|
|
29
|
-
|
|
30
|
-
return (_jsx(CheckboxPrimitive.Root, __assign({ className: cn("peer border-input data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className) }, props, { children: _jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-current transition-none", children: _jsx(CheckIcon, { className: "size-3.5" }) }, "checkbox-indicator") }), "checkbox"));
|
|
6
|
+
function Checkbox({ className, ...props }) {
|
|
7
|
+
return (_jsx(CheckboxPrimitive.Root, { className: cn("peer border-input data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className), ...props, children: _jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-current transition-none", children: _jsx(CheckIcon, { className: "size-3.5" }) }, "checkbox-indicator") }, "checkbox"));
|
|
31
8
|
}
|
|
32
9
|
export { Checkbox };
|
package/dist/misc/command.js
CHANGED
|
@@ -1,65 +1,34 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
14
|
-
var t = {};
|
|
15
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
16
|
-
t[p] = s[p];
|
|
17
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
18
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
19
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
20
|
-
t[p[i]] = s[p[i]];
|
|
21
|
-
}
|
|
22
|
-
return t;
|
|
23
|
-
};
|
|
24
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
25
3
|
import { cn } from "@myrjfa/state/dist/lib/utils";
|
|
26
4
|
import { Command as CommandPrimitive } from "cmdk";
|
|
27
5
|
import { SearchIcon } from "lucide-react";
|
|
28
6
|
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "./dialog";
|
|
29
|
-
function Command(
|
|
30
|
-
|
|
31
|
-
return (_jsx(CommandPrimitive, __assign({ "data-slot": "command", className: cn("bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md", className) }, props)));
|
|
7
|
+
function Command({ className, ...props }) {
|
|
8
|
+
return (_jsx(CommandPrimitive, { "data-slot": "command", className: cn("bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md", className), ...props }));
|
|
32
9
|
}
|
|
33
|
-
function CommandDialog(
|
|
34
|
-
|
|
35
|
-
return (_jsxs(Dialog, __assign({}, props, { children: [_jsxs(DialogHeader, { className: "sr-only", children: [_jsx(DialogTitle, { children: title }), _jsx(DialogDescription, { children: description })] }), _jsx(DialogContent, { className: "overflow-hidden p-0", children: _jsx(Command, { className: "[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5", children: children }) })] })));
|
|
10
|
+
function CommandDialog({ title = "Command Palette", description = "Search for a command to run...", children, ...props }) {
|
|
11
|
+
return (_jsxs(Dialog, { ...props, children: [_jsxs(DialogHeader, { className: "sr-only", children: [_jsx(DialogTitle, { children: title }), _jsx(DialogDescription, { children: description })] }), _jsx(DialogContent, { className: "overflow-hidden p-0", children: _jsx(Command, { className: "[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5", children: children }) })] }));
|
|
36
12
|
}
|
|
37
|
-
function CommandInput(
|
|
38
|
-
|
|
39
|
-
return (_jsxs("div", { "data-slot": "command-input-wrapper", className: "flex h-9 items-center gap-2 border-b px-3", children: [_jsx(SearchIcon, { className: "size-4 shrink-0 opacity-50" }), _jsx(CommandPrimitive.Input, __assign({ "data-slot": "command-input", className: cn("placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50", className) }, props))] }));
|
|
13
|
+
function CommandInput({ className, ...props }) {
|
|
14
|
+
return (_jsxs("div", { "data-slot": "command-input-wrapper", className: "flex h-9 items-center gap-2 border-b px-3", children: [_jsx(SearchIcon, { className: "size-4 shrink-0 opacity-50" }), _jsx(CommandPrimitive.Input, { "data-slot": "command-input", className: cn("placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50", className), ...props })] }));
|
|
40
15
|
}
|
|
41
|
-
function CommandList(
|
|
42
|
-
|
|
43
|
-
return (_jsx(CommandPrimitive.List, __assign({ "data-slot": "command-list", className: cn("max-h-[250px] scroll-py-1 overflow-x-hidden overflow-y-auto", className) }, props)));
|
|
16
|
+
function CommandList({ className, ...props }) {
|
|
17
|
+
return (_jsx(CommandPrimitive.List, { "data-slot": "command-list", className: cn("max-h-[350px] scroll-py-1 overflow-x-hidden overflow-y-auto touch-pan-y z-[300]", className), ...props }));
|
|
44
18
|
}
|
|
45
|
-
function CommandEmpty(
|
|
46
|
-
|
|
47
|
-
return (_jsx(CommandPrimitive.Empty, __assign({ "data-slot": "command-empty", className: "py-6 text-center text-sm" }, props)));
|
|
19
|
+
function CommandEmpty({ ...props }) {
|
|
20
|
+
return (_jsx(CommandPrimitive.Empty, { "data-slot": "command-empty", className: "py-6 text-center text-sm", ...props }));
|
|
48
21
|
}
|
|
49
|
-
function CommandGroup(
|
|
50
|
-
|
|
51
|
-
return (_jsx(CommandPrimitive.Group, __assign({ "data-slot": "command-group", className: cn("text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium", className) }, props)));
|
|
22
|
+
function CommandGroup({ className, ...props }) {
|
|
23
|
+
return (_jsx(CommandPrimitive.Group, { "data-slot": "command-group", className: cn("text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium", className), ...props }));
|
|
52
24
|
}
|
|
53
|
-
function CommandSeparator(
|
|
54
|
-
|
|
55
|
-
return (_jsx(CommandPrimitive.Separator, __assign({ "data-slot": "command-separator", className: cn("bg-border -mx-1 h-px", className) }, props)));
|
|
25
|
+
function CommandSeparator({ className, ...props }) {
|
|
26
|
+
return (_jsx(CommandPrimitive.Separator, { "data-slot": "command-separator", className: cn("bg-border -mx-1 h-px", className), ...props }));
|
|
56
27
|
}
|
|
57
|
-
function CommandItem(
|
|
58
|
-
|
|
59
|
-
return (_jsx(CommandPrimitive.Item, __assign({ "data-slot": "command-item", className: cn("data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className) }, props)));
|
|
28
|
+
function CommandItem({ className, ...props }) {
|
|
29
|
+
return (_jsx(CommandPrimitive.Item, { "data-slot": "command-item", className: cn("data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), ...props }));
|
|
60
30
|
}
|
|
61
|
-
function CommandShortcut(
|
|
62
|
-
|
|
63
|
-
return (_jsx("span", __assign({ "data-slot": "command-shortcut", className: cn("text-muted-foreground ml-auto text-xs tracking-widest", className) }, props)));
|
|
31
|
+
function CommandShortcut({ className, ...props }) {
|
|
32
|
+
return (_jsx("span", { "data-slot": "command-shortcut", className: cn("text-muted-foreground ml-auto text-xs tracking-widest", className), ...props }));
|
|
64
33
|
}
|
|
65
34
|
export { Command, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut, CommandSeparator, };
|
package/dist/misc/datepicker.js
CHANGED
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
|
-
if (ar || !(i in from)) {
|
|
5
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
6
|
-
ar[i] = from[i];
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
|
-
};
|
|
11
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
12
3
|
import { cn } from "@myrjfa/state/dist/lib/utils";
|
|
13
4
|
import { format } from "date-fns";
|
|
@@ -16,43 +7,42 @@ import { useEffect, useState } from "react";
|
|
|
16
7
|
import { Button } from "./button";
|
|
17
8
|
import { FormControl, FormItem, FormLabel, } from "./form";
|
|
18
9
|
import { Popover, PopoverContent, PopoverTrigger, } from "./popover";
|
|
19
|
-
export function DatePicker(
|
|
20
|
-
|
|
21
|
-
var _e = useState(false), open = _e[0], setOpen = _e[1];
|
|
10
|
+
export function DatePicker({ field, minDate = new Date("1900-01-01"), maxDate = new Date("2100-01-01"), label = "Date of birth" }) {
|
|
11
|
+
const [open, setOpen] = useState(false);
|
|
22
12
|
// Create state for the calendar view
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
13
|
+
const [calendarDate, setCalendarDate] = useState(field.value || new Date());
|
|
14
|
+
const [view, setView] = useState("days"); // "days", "months", or "years"
|
|
15
|
+
const [yearRange, setYearRange] = useState(() => {
|
|
16
|
+
const year = (field.value || new Date()).getFullYear();
|
|
17
|
+
const startYear = Math.floor(year / 10) * 10;
|
|
28
18
|
return [startYear, startYear + 9];
|
|
29
|
-
})
|
|
19
|
+
});
|
|
30
20
|
// Update calendar date when field.value changes
|
|
31
|
-
useEffect(
|
|
21
|
+
useEffect(() => {
|
|
32
22
|
if (field.value) {
|
|
33
23
|
setCalendarDate(field.value);
|
|
34
24
|
}
|
|
35
25
|
}, [field.value]);
|
|
36
26
|
// Get min and max years constraints
|
|
37
|
-
|
|
38
|
-
|
|
27
|
+
const minYear = minDate.getFullYear();
|
|
28
|
+
const maxYear = maxDate.getFullYear();
|
|
39
29
|
// Month names
|
|
40
|
-
|
|
30
|
+
const months = [
|
|
41
31
|
"January", "February", "March", "April", "May", "June",
|
|
42
32
|
"July", "August", "September", "October", "November", "December"
|
|
43
33
|
];
|
|
44
34
|
// Get days of the current month view
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
35
|
+
const getDaysInMonth = (year, month) => {
|
|
36
|
+
const daysInMonth = new Date(year, month + 1, 0).getDate();
|
|
37
|
+
const firstDayOfMonth = new Date(year, month, 1).getDay();
|
|
38
|
+
const prevMonthDays = [];
|
|
39
|
+
const currentMonthDays = [];
|
|
40
|
+
const nextMonthDays = [];
|
|
51
41
|
// Previous month days
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
for (
|
|
42
|
+
const prevMonth = month === 0 ? 11 : month - 1;
|
|
43
|
+
const prevMonthYear = month === 0 ? year - 1 : year;
|
|
44
|
+
const daysInPrevMonth = new Date(prevMonthYear, prevMonth + 1, 0).getDate();
|
|
45
|
+
for (let i = firstDayOfMonth - 1; i >= 0; i--) {
|
|
56
46
|
prevMonthDays.unshift({
|
|
57
47
|
day: daysInPrevMonth - i,
|
|
58
48
|
month: prevMonth,
|
|
@@ -61,19 +51,19 @@ export function DatePicker(_a) {
|
|
|
61
51
|
});
|
|
62
52
|
}
|
|
63
53
|
// Current month days
|
|
64
|
-
for (
|
|
54
|
+
for (let i = 1; i <= daysInMonth; i++) {
|
|
65
55
|
currentMonthDays.push({
|
|
66
56
|
day: i,
|
|
67
|
-
month
|
|
68
|
-
year
|
|
57
|
+
month,
|
|
58
|
+
year,
|
|
69
59
|
isCurrentMonth: true
|
|
70
60
|
});
|
|
71
61
|
}
|
|
72
62
|
// Next month days
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
for (
|
|
63
|
+
const nextMonth = month === 11 ? 0 : month + 1;
|
|
64
|
+
const nextMonthYear = month === 11 ? year + 1 : year;
|
|
65
|
+
const remainingDays = 42 - (prevMonthDays.length + currentMonthDays.length);
|
|
66
|
+
for (let i = 1; i <= remainingDays; i++) {
|
|
77
67
|
nextMonthDays.push({
|
|
78
68
|
day: i,
|
|
79
69
|
month: nextMonth,
|
|
@@ -81,10 +71,10 @@ export function DatePicker(_a) {
|
|
|
81
71
|
isCurrentMonth: false
|
|
82
72
|
});
|
|
83
73
|
}
|
|
84
|
-
return
|
|
74
|
+
return [...prevMonthDays, ...currentMonthDays, ...nextMonthDays];
|
|
85
75
|
};
|
|
86
76
|
// Check if a day is selected
|
|
87
|
-
|
|
77
|
+
const isSelected = (day, month, year) => {
|
|
88
78
|
if (!field.value)
|
|
89
79
|
return false;
|
|
90
80
|
return field.value.getDate() === day &&
|
|
@@ -92,76 +82,76 @@ export function DatePicker(_a) {
|
|
|
92
82
|
field.value.getFullYear() === year;
|
|
93
83
|
};
|
|
94
84
|
// Check if a day is disabled
|
|
95
|
-
|
|
96
|
-
|
|
85
|
+
const isDisabled = (day, month, year) => {
|
|
86
|
+
const date = new Date(year, month, day);
|
|
97
87
|
return date < minDate || date > maxDate;
|
|
98
88
|
};
|
|
99
89
|
// Handler for day selection
|
|
100
|
-
|
|
101
|
-
|
|
90
|
+
const handleDaySelect = (day, month, year) => {
|
|
91
|
+
const selectedDate = new Date(year, month, day);
|
|
102
92
|
field.onChange(selectedDate);
|
|
103
93
|
setOpen(false);
|
|
104
94
|
};
|
|
105
95
|
// Handle month selection
|
|
106
|
-
|
|
107
|
-
|
|
96
|
+
const handleMonthSelect = (monthIndex) => {
|
|
97
|
+
const newDate = new Date(calendarDate.getFullYear(), monthIndex, 1);
|
|
108
98
|
if (newDate >= minDate && newDate <= maxDate) {
|
|
109
99
|
setCalendarDate(newDate);
|
|
110
100
|
setView("days");
|
|
111
101
|
}
|
|
112
102
|
};
|
|
113
103
|
// Handle year selection
|
|
114
|
-
|
|
115
|
-
|
|
104
|
+
const handleYearSelect = (year) => {
|
|
105
|
+
const newDate = new Date(year, calendarDate.getMonth(), 1);
|
|
116
106
|
if (newDate >= minDate && newDate <= maxDate) {
|
|
117
107
|
setCalendarDate(newDate);
|
|
118
108
|
setView("months");
|
|
119
109
|
}
|
|
120
110
|
};
|
|
121
111
|
// Navigate to previous month
|
|
122
|
-
|
|
123
|
-
|
|
112
|
+
const prevMonth = () => {
|
|
113
|
+
const prevMonthDate = new Date(calendarDate);
|
|
124
114
|
prevMonthDate.setMonth(prevMonthDate.getMonth() - 1);
|
|
125
115
|
setCalendarDate(prevMonthDate);
|
|
126
116
|
};
|
|
127
117
|
// Navigate to next month
|
|
128
|
-
|
|
129
|
-
|
|
118
|
+
const nextMonth = () => {
|
|
119
|
+
const nextMonthDate = new Date(calendarDate);
|
|
130
120
|
nextMonthDate.setMonth(nextMonthDate.getMonth() + 1);
|
|
131
121
|
setCalendarDate(nextMonthDate);
|
|
132
122
|
};
|
|
133
123
|
// Navigate to previous year range
|
|
134
|
-
|
|
124
|
+
const prevYearRange = () => {
|
|
135
125
|
setYearRange([yearRange[0] - 10, yearRange[1] - 10]);
|
|
136
126
|
};
|
|
137
127
|
// Navigate to next year range
|
|
138
|
-
|
|
128
|
+
const nextYearRange = () => {
|
|
139
129
|
setYearRange([yearRange[0] + 10, yearRange[1] + 10]);
|
|
140
130
|
};
|
|
141
131
|
// Toggle between day, month, and year views
|
|
142
|
-
|
|
132
|
+
const toggleView = () => {
|
|
143
133
|
if (view === "days") {
|
|
144
134
|
setView("months");
|
|
145
135
|
}
|
|
146
136
|
else if (view === "months") {
|
|
147
|
-
|
|
148
|
-
|
|
137
|
+
const year = calendarDate.getFullYear();
|
|
138
|
+
const startYear = Math.floor(year / 10) * 10;
|
|
149
139
|
setYearRange([startYear, startYear + 9]);
|
|
150
140
|
setView("years");
|
|
151
141
|
}
|
|
152
142
|
};
|
|
153
143
|
// Render the header
|
|
154
|
-
|
|
144
|
+
const renderHeader = () => {
|
|
155
145
|
if (view === "days") {
|
|
156
146
|
return (_jsxs("div", { className: "flex justify-between items-center mb-2", children: [_jsx("button", { type: "button", className: "p-1 rounded-full hover:bg-gray-200", onClick: prevMonth, children: _jsx(ChevronLeft, { className: "h-4 w-4" }) }), _jsxs("button", { type: "button", className: "font-semibold hover:bg-muted px-2 py-1 rounded", onClick: toggleView, children: [months[calendarDate.getMonth()], " ", calendarDate.getFullYear()] }), _jsx("button", { type: "button", className: "p-1 rounded-full hover:bg-gray-200", onClick: nextMonth, children: _jsx(ChevronRight, { className: "h-4 w-4" }) })] }));
|
|
157
147
|
}
|
|
158
148
|
else if (view === "months") {
|
|
159
|
-
return (_jsxs("div", { className: "flex justify-between items-center mb-2", children: [_jsx("button", { type: "button", className: "p-1 rounded-full hover:bg-gray-200", onClick:
|
|
160
|
-
|
|
149
|
+
return (_jsxs("div", { className: "flex justify-between items-center mb-2", children: [_jsx("button", { type: "button", className: "p-1 rounded-full hover:bg-gray-200", onClick: () => {
|
|
150
|
+
const newDate = new Date(calendarDate);
|
|
161
151
|
newDate.setFullYear(newDate.getFullYear() - 1);
|
|
162
152
|
setCalendarDate(newDate);
|
|
163
|
-
}, children: _jsx(ChevronLeft, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", className: "font-semibold hover:bg-muted px-2 py-1 rounded", onClick: toggleView, children: calendarDate.getFullYear() }), _jsx("button", { type: "button", className: "p-1 rounded-full hover:bg-gray-200", onClick:
|
|
164
|
-
|
|
153
|
+
}, children: _jsx(ChevronLeft, { className: "h-4 w-4" }) }), _jsx("button", { type: "button", className: "font-semibold hover:bg-muted px-2 py-1 rounded", onClick: toggleView, children: calendarDate.getFullYear() }), _jsx("button", { type: "button", className: "p-1 rounded-full hover:bg-gray-200", onClick: () => {
|
|
154
|
+
const newDate = new Date(calendarDate);
|
|
165
155
|
newDate.setFullYear(newDate.getFullYear() + 1);
|
|
166
156
|
setCalendarDate(newDate);
|
|
167
157
|
}, children: _jsx(ChevronRight, { className: "h-4 w-4" }) })] }));
|
|
@@ -171,27 +161,27 @@ export function DatePicker(_a) {
|
|
|
171
161
|
}
|
|
172
162
|
};
|
|
173
163
|
// Render the calendar content based on the current view
|
|
174
|
-
|
|
164
|
+
const renderCalendarContent = () => {
|
|
175
165
|
if (view === "days") {
|
|
176
|
-
|
|
177
|
-
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "grid grid-cols-7 gap-1 mb-1", children: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"].map(
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
return (_jsx("button", { type: "button", disabled: isDateDisabled, className: cn("h-8 w-8 text-sm rounded-full flex items-center justify-center", !isCurrentMonth && "text-muted-foreground", isDateSelected && !isDateDisabled && "bg-black text-white", !isDateSelected && !isDateDisabled && "hover:bg-muted", isDateDisabled && "text-gray-300 cursor-not-allowed"), onClick:
|
|
166
|
+
const daysInMonth = getDaysInMonth(calendarDate.getFullYear(), calendarDate.getMonth());
|
|
167
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "grid grid-cols-7 gap-1 mb-1", children: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"].map((day) => (_jsx("div", { className: "text-center text-xs font-medium text-gray-500", children: day }, day))) }), _jsx("div", { className: "grid grid-cols-7 gap-1", children: daysInMonth.map((dayInfo, index) => {
|
|
168
|
+
const { day, month, year, isCurrentMonth } = dayInfo;
|
|
169
|
+
const isDateSelected = isSelected(day, month, year);
|
|
170
|
+
const isDateDisabled = isDisabled(day, month, year);
|
|
171
|
+
return (_jsx("button", { type: "button", disabled: isDateDisabled, className: cn("h-8 w-8 text-sm rounded-full flex items-center justify-center", !isCurrentMonth && "text-muted-foreground", isDateSelected && !isDateDisabled && "bg-black text-white", !isDateSelected && !isDateDisabled && "hover:bg-muted", isDateDisabled && "text-gray-300 cursor-not-allowed"), onClick: () => handleDaySelect(day, month, year), children: day }, index));
|
|
182
172
|
}) })] }));
|
|
183
173
|
}
|
|
184
174
|
else if (view === "months") {
|
|
185
|
-
return (_jsx("div", { className: "grid grid-cols-3 gap-2 p-2", children: months.map(
|
|
186
|
-
|
|
175
|
+
return (_jsx("div", { className: "grid grid-cols-3 gap-2 p-2", children: months.map((month, index) => {
|
|
176
|
+
const isMonthDisabled = (calendarDate.getFullYear() === minYear && index < minDate.getMonth()) ||
|
|
187
177
|
(calendarDate.getFullYear() === maxYear && index > maxDate.getMonth());
|
|
188
|
-
return (_jsx("button", { type: "button", disabled: isMonthDisabled, className: cn("py-2 rounded text-sm", calendarDate.getMonth() === index && "bg-black text-white", !isMonthDisabled && calendarDate.getMonth() !== index && "hover:bg-muted", isMonthDisabled && "text-gray-300 cursor-not-allowed"), onClick:
|
|
178
|
+
return (_jsx("button", { type: "button", disabled: isMonthDisabled, className: cn("py-2 rounded text-sm", calendarDate.getMonth() === index && "bg-black text-white", !isMonthDisabled && calendarDate.getMonth() !== index && "hover:bg-muted", isMonthDisabled && "text-gray-300 cursor-not-allowed"), onClick: () => handleMonthSelect(index), children: month.substring(0, 3) }, month));
|
|
189
179
|
}) }));
|
|
190
180
|
}
|
|
191
181
|
else if (view === "years") {
|
|
192
|
-
return (_jsx("div", { className: "grid grid-cols-3 gap-2 p-2", children: Array.from({ length: 10 },
|
|
193
|
-
|
|
194
|
-
return (_jsx("button", { type: "button", disabled: isYearDisabled, className: cn("py-2 rounded text-sm", calendarDate.getFullYear() === year && "bg-black text-white", !isYearDisabled && calendarDate.getFullYear() !== year && "hover:bg-muted", isYearDisabled && "text-gray-300 cursor-not-allowed"), onClick:
|
|
182
|
+
return (_jsx("div", { className: "grid grid-cols-3 gap-2 p-2", children: Array.from({ length: 10 }, (_, i) => yearRange[0] + i).map((year) => {
|
|
183
|
+
const isYearDisabled = year < minYear || year > maxYear;
|
|
184
|
+
return (_jsx("button", { type: "button", disabled: isYearDisabled, className: cn("py-2 rounded text-sm", calendarDate.getFullYear() === year && "bg-black text-white", !isYearDisabled && calendarDate.getFullYear() !== year && "hover:bg-muted", isYearDisabled && "text-gray-300 cursor-not-allowed"), onClick: () => handleYearSelect(year), children: year }, year));
|
|
195
185
|
}) }));
|
|
196
186
|
}
|
|
197
187
|
};
|