@mdigital_ui/ui 0.4.5 → 0.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +258 -662
- package/dist/anchor/index.js +4 -0
- package/dist/anchor/index.js.map +1 -0
- package/dist/autocomplete/index.js +6 -0
- package/dist/autocomplete/index.js.map +1 -0
- package/dist/breadcrumbs/index.js +3 -3
- package/dist/calendar/index.js +4 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/chunk-3Z7RLVWD.js +258 -0
- package/dist/chunk-3Z7RLVWD.js.map +1 -0
- package/dist/chunk-5YEC6FDN.js +263 -0
- package/dist/chunk-5YEC6FDN.js.map +1 -0
- package/dist/{chunk-OTNKP5CD.js → chunk-6NXZWLSM.js} +3 -3
- package/dist/{chunk-OTNKP5CD.js.map → chunk-6NXZWLSM.js.map} +1 -1
- package/dist/{chunk-AL2EEKUY.js → chunk-6ROGWFQ2.js} +3 -3
- package/dist/{chunk-AL2EEKUY.js.map → chunk-6ROGWFQ2.js.map} +1 -1
- package/dist/{chunk-LJOQ2C5W.js → chunk-6RZEJRTC.js} +3 -3
- package/dist/{chunk-LJOQ2C5W.js.map → chunk-6RZEJRTC.js.map} +1 -1
- package/dist/chunk-74AF6PO2.js +374 -0
- package/dist/chunk-74AF6PO2.js.map +1 -0
- package/dist/chunk-75N6T3IS.js +77 -0
- package/dist/chunk-75N6T3IS.js.map +1 -0
- package/dist/{chunk-BKLJDEUX.js → chunk-DBPLQZJ2.js} +38 -14
- package/dist/chunk-DBPLQZJ2.js.map +1 -0
- package/dist/{chunk-HVHQA34X.js → chunk-DIUOGEL3.js} +95 -100
- package/dist/chunk-DIUOGEL3.js.map +1 -0
- package/dist/chunk-ED4CQZ72.js +343 -0
- package/dist/chunk-ED4CQZ72.js.map +1 -0
- package/dist/{chunk-4ZXHLPRS.js → chunk-FY2TZ2NT.js} +4 -4
- package/dist/{chunk-4ZXHLPRS.js.map → chunk-FY2TZ2NT.js.map} +1 -1
- package/dist/{chunk-I5AD247M.js → chunk-HKQOAEFY.js} +13 -3
- package/dist/chunk-HKQOAEFY.js.map +1 -0
- package/dist/chunk-JWYBDNC6.js +307 -0
- package/dist/chunk-JWYBDNC6.js.map +1 -0
- package/dist/{chunk-W5VLFE4U.js → chunk-LHZJ2GJU.js} +32 -6
- package/dist/chunk-LHZJ2GJU.js.map +1 -0
- package/dist/{chunk-253JZOYG.js → chunk-NB66D6A5.js} +3 -2
- package/dist/chunk-NB66D6A5.js.map +1 -0
- package/dist/{chunk-BGMYX7L5.js → chunk-NF6JUJBE.js} +9 -7
- package/dist/chunk-NF6JUJBE.js.map +1 -0
- package/dist/chunk-NPK4ESMA.js +281 -0
- package/dist/chunk-NPK4ESMA.js.map +1 -0
- package/dist/{chunk-X7MF3TIF.js → chunk-PD3O6ZH4.js} +12 -5
- package/dist/chunk-PD3O6ZH4.js.map +1 -0
- package/dist/{chunk-HJITFPBT.js → chunk-QDJ5PZPP.js} +14 -9
- package/dist/chunk-QDJ5PZPP.js.map +1 -0
- package/dist/chunk-QEYNOLRC.js +157 -0
- package/dist/chunk-QEYNOLRC.js.map +1 -0
- package/dist/chunk-RNG7HR6U.js +174 -0
- package/dist/chunk-RNG7HR6U.js.map +1 -0
- package/dist/chunk-TDPJYCNI.js +96 -0
- package/dist/chunk-TDPJYCNI.js.map +1 -0
- package/dist/chunk-UFYG3HKL.js +374 -0
- package/dist/chunk-UFYG3HKL.js.map +1 -0
- package/dist/chunk-VNH6R5EU.js +211 -0
- package/dist/chunk-VNH6R5EU.js.map +1 -0
- package/dist/{chunk-XOEEAMMY.js → chunk-X3VT5SSK.js} +88 -98
- package/dist/chunk-X3VT5SSK.js.map +1 -0
- package/dist/{chunk-SFP77VS3.js → chunk-X7JN7WPF.js} +5 -2
- package/dist/chunk-X7JN7WPF.js.map +1 -0
- package/dist/chunk-YRSHBAUQ.js +201 -0
- package/dist/chunk-YRSHBAUQ.js.map +1 -0
- package/dist/chunk-YUACN5GJ.js +303 -0
- package/dist/chunk-YUACN5GJ.js.map +1 -0
- package/dist/color-picker/index.js +6 -0
- package/dist/color-picker/index.js.map +1 -0
- package/dist/date-picker/RangePicker.d.ts.map +1 -1
- package/dist/date-picker/index.d.ts.map +1 -1
- package/dist/date-picker/index.js +1 -1
- package/dist/date-picker/shared.d.ts +5 -0
- package/dist/date-picker/shared.d.ts.map +1 -1
- package/dist/dropdown/index.js +2 -2
- package/dist/float-button/index.js +5 -0
- package/dist/float-button/index.js.map +1 -0
- package/dist/index.js +50 -2995
- package/dist/index.js.map +1 -1
- package/dist/input/index.d.ts.map +1 -1
- package/dist/input/index.js +1 -1
- package/dist/input-password/index.js +2 -2
- package/dist/mentions/index.js +4 -0
- package/dist/mentions/index.js.map +1 -0
- package/dist/menubar/index.d.ts +3 -3
- package/dist/menubar/index.d.ts.map +1 -1
- package/dist/menubar/index.js +2 -2
- package/dist/multi-select/index.d.ts.map +1 -1
- package/dist/multi-select/index.js +4 -4
- package/dist/number-input/index.d.ts.map +1 -1
- package/dist/number-input/index.js +1 -1
- package/dist/qr-code/index.js +5 -0
- package/dist/qr-code/index.js.map +1 -0
- package/dist/resizable/index.js +4 -0
- package/dist/resizable/index.js.map +1 -0
- package/dist/result/index.js +4 -0
- package/dist/result/index.js.map +1 -0
- package/dist/select/index.d.ts.map +1 -1
- package/dist/select/index.js +4 -4
- package/dist/shared/useSelectBase.d.ts.map +1 -1
- package/dist/skeleton/index.d.ts.map +1 -1
- package/dist/skeleton/index.js +1 -1
- package/dist/table/index.js +4 -4
- package/dist/tabs/index.d.ts.map +1 -1
- package/dist/tabs/index.js +1 -1
- package/dist/tags-input/index.js +5 -0
- package/dist/tags-input/index.js.map +1 -0
- package/dist/toast/index.d.ts.map +1 -1
- package/dist/toast/index.js +1 -1
- package/dist/tooltip/index.d.ts.map +1 -1
- package/dist/tooltip/index.js +1 -1
- package/dist/tour/index.js +5 -0
- package/dist/tour/index.js.map +1 -0
- package/dist/typography/index.js +4 -0
- package/dist/typography/index.js.map +1 -0
- package/dist/watermark/index.js +4 -0
- package/dist/watermark/index.js.map +1 -0
- package/package.json +59 -11
- package/styles/global.css +6 -3
- package/dist/chunk-253JZOYG.js.map +0 -1
- package/dist/chunk-BGMYX7L5.js.map +0 -1
- package/dist/chunk-BKLJDEUX.js.map +0 -1
- package/dist/chunk-HJITFPBT.js.map +0 -1
- package/dist/chunk-HVHQA34X.js.map +0 -1
- package/dist/chunk-I5AD247M.js.map +0 -1
- package/dist/chunk-JBNFVXH5.js +0 -322
- package/dist/chunk-JBNFVXH5.js.map +0 -1
- package/dist/chunk-SFP77VS3.js.map +0 -1
- package/dist/chunk-W5VLFE4U.js.map +0 -1
- package/dist/chunk-X7MF3TIF.js.map +0 -1
- package/dist/chunk-XOEEAMMY.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, breadcrumbs_default as default } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-ROQGBDET.js';
|
|
1
|
+
export { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, breadcrumbs_default as default } from '../chunk-6ROGWFQ2.js';
|
|
2
|
+
import '../chunk-6NXZWLSM.js';
|
|
4
3
|
import '../chunk-NZHKNUGE.js';
|
|
5
4
|
import '../chunk-4TEZWGX7.js';
|
|
5
|
+
import '../chunk-ROQGBDET.js';
|
|
6
6
|
import '../chunk-G6QIIWKU.js';
|
|
7
7
|
import '../chunk-RAS6HUEI.js';
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { cn, statusMessageVariants } from './chunk-RAS6HUEI.js';
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import React, { useState, useRef, useCallback, useMemo, useEffect } from 'react';
|
|
4
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var textareaVariants = cva(
|
|
7
|
+
"w-full rounded-md border bg-background text-text-primary placeholder:text-text-secondary/50 outline-none transition-colors disabled:opacity-50 disabled:cursor-not-allowed read-only:bg-surface read-only:cursor-default",
|
|
8
|
+
{
|
|
9
|
+
variants: {
|
|
10
|
+
size: {
|
|
11
|
+
xs: "px-(--input-padding-x-xs) py-1.5 text-xs",
|
|
12
|
+
sm: "px-(--input-padding-x-sm) py-2 text-sm",
|
|
13
|
+
md: "px-(--input-padding-x-md) py-2 text-sm",
|
|
14
|
+
lg: "px-(--input-padding-x-lg) py-2.5 text-base"
|
|
15
|
+
},
|
|
16
|
+
status: {
|
|
17
|
+
default: "border-border focus:border-primary",
|
|
18
|
+
error: "border-error focus:border-error"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
defaultVariants: { size: "md", status: "default" }
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
function getCaretCoordinates(element, position) {
|
|
25
|
+
const div = document.createElement("div");
|
|
26
|
+
const style = getComputedStyle(element);
|
|
27
|
+
const props = [
|
|
28
|
+
"fontFamily",
|
|
29
|
+
"fontSize",
|
|
30
|
+
"fontWeight",
|
|
31
|
+
"letterSpacing",
|
|
32
|
+
"lineHeight",
|
|
33
|
+
"paddingTop",
|
|
34
|
+
"paddingRight",
|
|
35
|
+
"paddingBottom",
|
|
36
|
+
"paddingLeft",
|
|
37
|
+
"borderTopWidth",
|
|
38
|
+
"borderRightWidth",
|
|
39
|
+
"borderBottomWidth",
|
|
40
|
+
"borderLeftWidth",
|
|
41
|
+
"wordWrap",
|
|
42
|
+
"whiteSpace",
|
|
43
|
+
"overflowWrap"
|
|
44
|
+
];
|
|
45
|
+
div.style.position = "absolute";
|
|
46
|
+
div.style.visibility = "hidden";
|
|
47
|
+
div.style.whiteSpace = "pre-wrap";
|
|
48
|
+
div.style.wordWrap = "break-word";
|
|
49
|
+
div.style.width = `${element.offsetWidth}px`;
|
|
50
|
+
for (const prop of props) div.style[prop] = style.getPropertyValue(prop.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`));
|
|
51
|
+
div.textContent = element.value.substring(0, position);
|
|
52
|
+
const span = document.createElement("span");
|
|
53
|
+
span.textContent = element.value.substring(position) || ".";
|
|
54
|
+
div.appendChild(span);
|
|
55
|
+
document.body.appendChild(div);
|
|
56
|
+
const top = span.offsetTop - element.scrollTop;
|
|
57
|
+
const left = span.offsetLeft - element.scrollLeft;
|
|
58
|
+
document.body.removeChild(div);
|
|
59
|
+
return { top, left };
|
|
60
|
+
}
|
|
61
|
+
var Mentions = React.memo(
|
|
62
|
+
({
|
|
63
|
+
value,
|
|
64
|
+
defaultValue = "",
|
|
65
|
+
onChange,
|
|
66
|
+
onSelect,
|
|
67
|
+
options = [],
|
|
68
|
+
triggers = ["@"],
|
|
69
|
+
loading = false,
|
|
70
|
+
size = "md",
|
|
71
|
+
disabled = false,
|
|
72
|
+
readOnly = false,
|
|
73
|
+
placeholder,
|
|
74
|
+
rows = 3,
|
|
75
|
+
label,
|
|
76
|
+
error,
|
|
77
|
+
helperText,
|
|
78
|
+
fullWidth = true,
|
|
79
|
+
className,
|
|
80
|
+
classNames
|
|
81
|
+
}) => {
|
|
82
|
+
const [internalValue, setInternalValue] = useState(defaultValue);
|
|
83
|
+
const currentValue = value !== void 0 ? value : internalValue;
|
|
84
|
+
const [showDropdown, setShowDropdown] = useState(false);
|
|
85
|
+
const [query, setQuery] = useState("");
|
|
86
|
+
const [activeTrigger, setActiveTrigger] = useState("");
|
|
87
|
+
const [triggerStart, setTriggerStart] = useState(-1);
|
|
88
|
+
const [highlightedIdx, setHighlightedIdx] = useState(0);
|
|
89
|
+
const [dropdownPos, setDropdownPos] = useState({ top: 0, left: 0 });
|
|
90
|
+
const textareaRef = useRef(null);
|
|
91
|
+
const update = useCallback(
|
|
92
|
+
(v) => {
|
|
93
|
+
if (value === void 0) setInternalValue(v);
|
|
94
|
+
onChange?.(v);
|
|
95
|
+
},
|
|
96
|
+
[value, onChange]
|
|
97
|
+
);
|
|
98
|
+
const filteredOptions = useMemo(() => {
|
|
99
|
+
if (!query) return options;
|
|
100
|
+
const q = query.toLowerCase();
|
|
101
|
+
return options.filter(
|
|
102
|
+
(o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q)
|
|
103
|
+
);
|
|
104
|
+
}, [options, query]);
|
|
105
|
+
const insertMention = useCallback(
|
|
106
|
+
(option) => {
|
|
107
|
+
const before = currentValue.substring(0, triggerStart);
|
|
108
|
+
const after = currentValue.substring(textareaRef.current?.selectionStart ?? triggerStart);
|
|
109
|
+
const mention = `${activeTrigger}${option.value} `;
|
|
110
|
+
const next = before + mention + after;
|
|
111
|
+
update(next);
|
|
112
|
+
onSelect?.(option, activeTrigger);
|
|
113
|
+
setShowDropdown(false);
|
|
114
|
+
setQuery("");
|
|
115
|
+
requestAnimationFrame(() => {
|
|
116
|
+
if (textareaRef.current) {
|
|
117
|
+
const pos = before.length + mention.length;
|
|
118
|
+
textareaRef.current.selectionStart = pos;
|
|
119
|
+
textareaRef.current.selectionEnd = pos;
|
|
120
|
+
textareaRef.current.focus();
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
[currentValue, triggerStart, activeTrigger, update, onSelect]
|
|
125
|
+
);
|
|
126
|
+
const handleChange = (e) => {
|
|
127
|
+
const v = e.target.value;
|
|
128
|
+
update(v);
|
|
129
|
+
const cursor = e.target.selectionStart;
|
|
130
|
+
const textBefore = v.substring(0, cursor);
|
|
131
|
+
let found = false;
|
|
132
|
+
for (const trigger of triggers) {
|
|
133
|
+
const lastTrigger = textBefore.lastIndexOf(trigger);
|
|
134
|
+
if (lastTrigger >= 0) {
|
|
135
|
+
const between = textBefore.substring(lastTrigger + trigger.length);
|
|
136
|
+
const charBefore = lastTrigger > 0 ? textBefore[lastTrigger - 1] : " ";
|
|
137
|
+
if (/\s/.test(charBefore) || lastTrigger === 0) {
|
|
138
|
+
if (!/\s/.test(between)) {
|
|
139
|
+
setActiveTrigger(trigger);
|
|
140
|
+
setTriggerStart(lastTrigger);
|
|
141
|
+
setQuery(between);
|
|
142
|
+
setShowDropdown(true);
|
|
143
|
+
setHighlightedIdx(0);
|
|
144
|
+
found = true;
|
|
145
|
+
if (typeof window !== "undefined" && textareaRef.current) {
|
|
146
|
+
const coords = getCaretCoordinates(textareaRef.current, lastTrigger);
|
|
147
|
+
setDropdownPos({ top: coords.top + 24, left: coords.left });
|
|
148
|
+
}
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (!found) setShowDropdown(false);
|
|
155
|
+
};
|
|
156
|
+
const handleKeyDown = (e) => {
|
|
157
|
+
if (!showDropdown || filteredOptions.length === 0) return;
|
|
158
|
+
if (e.key === "ArrowDown") {
|
|
159
|
+
e.preventDefault();
|
|
160
|
+
setHighlightedIdx((p) => Math.min(p + 1, filteredOptions.length - 1));
|
|
161
|
+
} else if (e.key === "ArrowUp") {
|
|
162
|
+
e.preventDefault();
|
|
163
|
+
setHighlightedIdx((p) => Math.max(p - 1, 0));
|
|
164
|
+
} else if (e.key === "Enter" || e.key === "Tab") {
|
|
165
|
+
e.preventDefault();
|
|
166
|
+
if (filteredOptions[highlightedIdx]) insertMention(filteredOptions[highlightedIdx]);
|
|
167
|
+
} else if (e.key === "Escape") {
|
|
168
|
+
setShowDropdown(false);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
useEffect(() => {
|
|
172
|
+
if (highlightedIdx >= filteredOptions.length) setHighlightedIdx(Math.max(0, filteredOptions.length - 1));
|
|
173
|
+
}, [filteredOptions.length, highlightedIdx]);
|
|
174
|
+
return /* @__PURE__ */ jsxs(
|
|
175
|
+
"div",
|
|
176
|
+
{
|
|
177
|
+
"data-slot": "root",
|
|
178
|
+
className: cn(
|
|
179
|
+
"mentions_root",
|
|
180
|
+
"flex flex-col gap-1.5",
|
|
181
|
+
fullWidth ? "w-full" : "inline-flex",
|
|
182
|
+
classNames?.root,
|
|
183
|
+
className
|
|
184
|
+
),
|
|
185
|
+
children: [
|
|
186
|
+
label && /* @__PURE__ */ jsx("label", { "data-slot": "label", className: "text-sm font-medium text-text-primary", children: label }),
|
|
187
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
188
|
+
/* @__PURE__ */ jsx(
|
|
189
|
+
"textarea",
|
|
190
|
+
{
|
|
191
|
+
ref: textareaRef,
|
|
192
|
+
value: currentValue,
|
|
193
|
+
onChange: handleChange,
|
|
194
|
+
onKeyDown: handleKeyDown,
|
|
195
|
+
onBlur: () => setTimeout(() => setShowDropdown(false), 150),
|
|
196
|
+
placeholder,
|
|
197
|
+
rows,
|
|
198
|
+
disabled,
|
|
199
|
+
readOnly,
|
|
200
|
+
"data-slot": "textarea",
|
|
201
|
+
className: cn(
|
|
202
|
+
"mentions_textarea",
|
|
203
|
+
textareaVariants({ size, status: error ? "error" : "default" }),
|
|
204
|
+
"resize-y",
|
|
205
|
+
classNames?.textarea
|
|
206
|
+
)
|
|
207
|
+
}
|
|
208
|
+
),
|
|
209
|
+
showDropdown && filteredOptions.length > 0 && /* @__PURE__ */ jsx(
|
|
210
|
+
"div",
|
|
211
|
+
{
|
|
212
|
+
"data-slot": "dropdown",
|
|
213
|
+
className: cn(
|
|
214
|
+
"mentions_dropdown",
|
|
215
|
+
"absolute z-[var(--z-popover)] rounded-md border border-border bg-background shadow-md max-h-[200px] overflow-auto min-w-[180px]",
|
|
216
|
+
classNames?.dropdown
|
|
217
|
+
),
|
|
218
|
+
style: { top: dropdownPos.top, left: Math.min(dropdownPos.left, 200) },
|
|
219
|
+
children: loading ? /* @__PURE__ */ jsx("div", { className: "px-3 py-2 text-sm text-text-secondary", children: "Loading..." }) : filteredOptions.map((option, idx) => /* @__PURE__ */ jsxs(
|
|
220
|
+
"div",
|
|
221
|
+
{
|
|
222
|
+
onMouseDown: (e) => {
|
|
223
|
+
e.preventDefault();
|
|
224
|
+
insertMention(option);
|
|
225
|
+
},
|
|
226
|
+
onMouseEnter: () => setHighlightedIdx(idx),
|
|
227
|
+
"data-slot": "option",
|
|
228
|
+
className: cn(
|
|
229
|
+
"mentions_option",
|
|
230
|
+
"flex items-center gap-2 px-3 py-1.5 text-sm cursor-pointer transition-colors",
|
|
231
|
+
idx === highlightedIdx ? "bg-surface text-text-primary" : "text-text-primary hover:bg-surface",
|
|
232
|
+
classNames?.option
|
|
233
|
+
),
|
|
234
|
+
children: [
|
|
235
|
+
option.icon && /* @__PURE__ */ jsx("span", { className: "shrink-0 w-5 h-5", children: option.icon }),
|
|
236
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
237
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium truncate", children: option.label }),
|
|
238
|
+
option.description && /* @__PURE__ */ jsx("div", { className: "text-xs text-text-secondary truncate", children: option.description })
|
|
239
|
+
] })
|
|
240
|
+
]
|
|
241
|
+
},
|
|
242
|
+
option.value
|
|
243
|
+
))
|
|
244
|
+
}
|
|
245
|
+
)
|
|
246
|
+
] }),
|
|
247
|
+
(error || helperText) && /* @__PURE__ */ jsx("p", { "data-slot": "message", className: cn("text-xs", error ? statusMessageVariants({ status: "error" }) : "text-text-secondary"), children: error || helperText })
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
);
|
|
253
|
+
Mentions.displayName = "Mentions";
|
|
254
|
+
var mentions_default = Mentions;
|
|
255
|
+
|
|
256
|
+
export { mentions_default };
|
|
257
|
+
//# sourceMappingURL=chunk-3Z7RLVWD.js.map
|
|
258
|
+
//# sourceMappingURL=chunk-3Z7RLVWD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mentions/index.tsx"],"names":[],"mappings":"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","file":"chunk-3Z7RLVWD.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React, { useState, useRef, useCallback, useMemo, useEffect } from 'react'\n\nimport { cn, statusMessageVariants } from '../utils'\nimport type { MentionOption, MentionsProps } from './types'\n\nconst textareaVariants = cva(\n 'w-full rounded-md border bg-background text-text-primary placeholder:text-text-secondary/50 outline-none transition-colors disabled:opacity-50 disabled:cursor-not-allowed read-only:bg-surface read-only:cursor-default',\n {\n variants: {\n size: {\n xs: 'px-(--input-padding-x-xs) py-1.5 text-xs',\n sm: 'px-(--input-padding-x-sm) py-2 text-sm',\n md: 'px-(--input-padding-x-md) py-2 text-sm',\n lg: 'px-(--input-padding-x-lg) py-2.5 text-base',\n },\n status: {\n default: 'border-border focus:border-primary',\n error: 'border-error focus:border-error',\n },\n },\n defaultVariants: { size: 'md', status: 'default' },\n },\n)\n\nfunction getCaretCoordinates(element: HTMLTextAreaElement, position: number) {\n const div = document.createElement('div')\n const style = getComputedStyle(element)\n const props = [\n 'fontFamily', 'fontSize', 'fontWeight', 'letterSpacing', 'lineHeight',\n 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft',\n 'borderTopWidth', 'borderRightWidth', 'borderBottomWidth', 'borderLeftWidth',\n 'wordWrap', 'whiteSpace', 'overflowWrap',\n ] as const\n\n div.style.position = 'absolute'\n div.style.visibility = 'hidden'\n div.style.whiteSpace = 'pre-wrap'\n div.style.wordWrap = 'break-word'\n div.style.width = `${element.offsetWidth}px`\n for (const prop of props) div.style[prop as any] = style.getPropertyValue(prop.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`))\n\n div.textContent = element.value.substring(0, position)\n const span = document.createElement('span')\n span.textContent = element.value.substring(position) || '.'\n div.appendChild(span)\n document.body.appendChild(div)\n\n const top = span.offsetTop - element.scrollTop\n const left = span.offsetLeft - element.scrollLeft\n document.body.removeChild(div)\n return { top, left }\n}\n\nconst Mentions = React.memo<MentionsProps>(\n ({\n value,\n defaultValue = '',\n onChange,\n onSelect,\n options = [],\n triggers = ['@'],\n loading = false,\n size = 'md',\n disabled = false,\n readOnly = false,\n placeholder,\n rows = 3,\n label,\n error,\n helperText,\n fullWidth = true,\n className,\n classNames,\n }) => {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const currentValue = value !== undefined ? value : internalValue\n const [showDropdown, setShowDropdown] = useState(false)\n const [query, setQuery] = useState('')\n const [activeTrigger, setActiveTrigger] = useState('')\n const [triggerStart, setTriggerStart] = useState(-1)\n const [highlightedIdx, setHighlightedIdx] = useState(0)\n const [dropdownPos, setDropdownPos] = useState({ top: 0, left: 0 })\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const update = useCallback(\n (v: string) => {\n if (value === undefined) setInternalValue(v)\n onChange?.(v)\n },\n [value, onChange],\n )\n\n const filteredOptions = useMemo(() => {\n if (!query) return options\n const q = query.toLowerCase()\n return options.filter(\n (o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q),\n )\n }, [options, query])\n\n const insertMention = useCallback(\n (option: MentionOption) => {\n const before = currentValue.substring(0, triggerStart)\n const after = currentValue.substring(textareaRef.current?.selectionStart ?? triggerStart)\n const mention = `${activeTrigger}${option.value} `\n const next = before + mention + after\n update(next)\n onSelect?.(option, activeTrigger)\n setShowDropdown(false)\n setQuery('')\n\n requestAnimationFrame(() => {\n if (textareaRef.current) {\n const pos = before.length + mention.length\n textareaRef.current.selectionStart = pos\n textareaRef.current.selectionEnd = pos\n textareaRef.current.focus()\n }\n })\n },\n [currentValue, triggerStart, activeTrigger, update, onSelect],\n )\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const v = e.target.value\n update(v)\n\n const cursor = e.target.selectionStart\n const textBefore = v.substring(0, cursor)\n\n let found = false\n for (const trigger of triggers) {\n const lastTrigger = textBefore.lastIndexOf(trigger)\n if (lastTrigger >= 0) {\n const between = textBefore.substring(lastTrigger + trigger.length)\n const charBefore = lastTrigger > 0 ? textBefore[lastTrigger - 1] : ' '\n if (/\\s/.test(charBefore) || lastTrigger === 0) {\n if (!/\\s/.test(between)) {\n setActiveTrigger(trigger)\n setTriggerStart(lastTrigger)\n setQuery(between)\n setShowDropdown(true)\n setHighlightedIdx(0)\n found = true\n\n if (typeof window !== 'undefined' && textareaRef.current) {\n const coords = getCaretCoordinates(textareaRef.current, lastTrigger)\n setDropdownPos({ top: coords.top + 24, left: coords.left })\n }\n break\n }\n }\n }\n }\n if (!found) setShowDropdown(false)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!showDropdown || filteredOptions.length === 0) return\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setHighlightedIdx((p) => Math.min(p + 1, filteredOptions.length - 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setHighlightedIdx((p) => Math.max(p - 1, 0))\n } else if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault()\n if (filteredOptions[highlightedIdx]) insertMention(filteredOptions[highlightedIdx])\n } else if (e.key === 'Escape') {\n setShowDropdown(false)\n }\n }\n\n useEffect(() => {\n if (highlightedIdx >= filteredOptions.length) setHighlightedIdx(Math.max(0, filteredOptions.length - 1))\n }, [filteredOptions.length, highlightedIdx])\n\n return (\n <div\n data-slot=\"root\"\n className={cn(\n 'mentions_root',\n 'flex flex-col gap-1.5',\n fullWidth ? 'w-full' : 'inline-flex',\n classNames?.root,\n className,\n )}\n >\n {label && (\n <label data-slot=\"label\" className=\"text-sm font-medium text-text-primary\">\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n <textarea\n ref={textareaRef}\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={() => setTimeout(() => setShowDropdown(false), 150)}\n placeholder={placeholder}\n rows={rows}\n disabled={disabled}\n readOnly={readOnly}\n data-slot=\"textarea\"\n className={cn(\n 'mentions_textarea',\n textareaVariants({ size, status: error ? 'error' : 'default' }),\n 'resize-y',\n classNames?.textarea,\n )}\n />\n\n {showDropdown && filteredOptions.length > 0 && (\n <div\n data-slot=\"dropdown\"\n className={cn(\n 'mentions_dropdown',\n 'absolute z-[var(--z-popover)] rounded-md border border-border bg-background shadow-md max-h-[200px] overflow-auto min-w-[180px]',\n classNames?.dropdown,\n )}\n style={{ top: dropdownPos.top, left: Math.min(dropdownPos.left, 200) }}\n >\n {loading ? (\n <div className=\"px-3 py-2 text-sm text-text-secondary\">Loading...</div>\n ) : (\n filteredOptions.map((option, idx) => (\n <div\n key={option.value}\n onMouseDown={(e) => { e.preventDefault(); insertMention(option) }}\n onMouseEnter={() => setHighlightedIdx(idx)}\n data-slot=\"option\"\n className={cn(\n 'mentions_option',\n 'flex items-center gap-2 px-3 py-1.5 text-sm cursor-pointer transition-colors',\n idx === highlightedIdx ? 'bg-surface text-text-primary' : 'text-text-primary hover:bg-surface',\n classNames?.option,\n )}\n >\n {option.icon && <span className=\"shrink-0 w-5 h-5\">{option.icon}</span>}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium truncate\">{option.label}</div>\n {option.description && (\n <div className=\"text-xs text-text-secondary truncate\">{option.description}</div>\n )}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n\n {(error || helperText) && (\n <p data-slot=\"message\" className={cn('text-xs', error ? statusMessageVariants({ status: 'error' }) : 'text-text-secondary')}>\n {error || helperText}\n </p>\n )}\n </div>\n )\n },\n)\n\nMentions.displayName = 'Mentions'\n\nexport type * from './types'\nexport default Mentions\n"]}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { cn } from './chunk-RAS6HUEI.js';
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { ChevronLeft, ChevronRight } from 'lucide-react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var calendarVariants = cva("inline-flex flex-col select-none", {
|
|
8
|
+
variants: {
|
|
9
|
+
size: {
|
|
10
|
+
xs: "text-xs gap-1",
|
|
11
|
+
sm: "text-sm gap-1.5",
|
|
12
|
+
md: "text-sm gap-2",
|
|
13
|
+
lg: "text-base gap-2.5"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
defaultVariants: { size: "md" }
|
|
17
|
+
});
|
|
18
|
+
var cellVariants = cva(
|
|
19
|
+
"flex items-center justify-center rounded-md transition-colors cursor-pointer font-normal",
|
|
20
|
+
{
|
|
21
|
+
variants: {
|
|
22
|
+
size: {
|
|
23
|
+
xs: "w-7 h-7 text-xs",
|
|
24
|
+
sm: "w-8 h-8 text-sm",
|
|
25
|
+
md: "w-9 h-9 text-sm",
|
|
26
|
+
lg: "w-10 h-10 text-base"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
defaultVariants: { size: "md" }
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
var navBtnClass = "inline-flex items-center justify-center rounded-md w-7 h-7 hover:bg-surface transition-colors cursor-pointer text-text-secondary hover:text-text-primary";
|
|
33
|
+
function isSameDay(a, b) {
|
|
34
|
+
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
35
|
+
}
|
|
36
|
+
function getDaysInMonth(year, month) {
|
|
37
|
+
return new Date(year, month + 1, 0).getDate();
|
|
38
|
+
}
|
|
39
|
+
function getMonthGrid(year, month, weekStartsOn, showOutside) {
|
|
40
|
+
const firstDay = new Date(year, month, 1).getDay();
|
|
41
|
+
const daysInMonth = getDaysInMonth(year, month);
|
|
42
|
+
const daysInPrevMonth = getDaysInMonth(year, month - 1);
|
|
43
|
+
const offset = (firstDay - weekStartsOn + 7) % 7;
|
|
44
|
+
const weeks = [];
|
|
45
|
+
let week = [];
|
|
46
|
+
for (let i = 0; i < offset; i++) {
|
|
47
|
+
const day = daysInPrevMonth - offset + 1 + i;
|
|
48
|
+
week.push({ date: new Date(year, month - 1, day), outside: true });
|
|
49
|
+
}
|
|
50
|
+
for (let day = 1; day <= daysInMonth; day++) {
|
|
51
|
+
week.push({ date: new Date(year, month, day), outside: false });
|
|
52
|
+
if (week.length === 7) {
|
|
53
|
+
weeks.push(week);
|
|
54
|
+
week = [];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (week.length > 0) {
|
|
58
|
+
let nextDay = 1;
|
|
59
|
+
while (week.length < 7) {
|
|
60
|
+
week.push({ date: new Date(year, month + 1, nextDay++), outside: true });
|
|
61
|
+
}
|
|
62
|
+
weeks.push(week);
|
|
63
|
+
}
|
|
64
|
+
if (!showOutside) {
|
|
65
|
+
return weeks.map(
|
|
66
|
+
(w) => w.map((d) => d.outside ? { ...d, date: d.date } : d)
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
return weeks;
|
|
70
|
+
}
|
|
71
|
+
var DAY_NAMES_SHORT = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
|
|
72
|
+
var MONTH_NAMES = [
|
|
73
|
+
"January",
|
|
74
|
+
"February",
|
|
75
|
+
"March",
|
|
76
|
+
"April",
|
|
77
|
+
"May",
|
|
78
|
+
"June",
|
|
79
|
+
"July",
|
|
80
|
+
"August",
|
|
81
|
+
"September",
|
|
82
|
+
"October",
|
|
83
|
+
"November",
|
|
84
|
+
"December"
|
|
85
|
+
];
|
|
86
|
+
var Calendar = React.memo(
|
|
87
|
+
({
|
|
88
|
+
value,
|
|
89
|
+
defaultValue,
|
|
90
|
+
onChange,
|
|
91
|
+
month: controlledMonth,
|
|
92
|
+
defaultMonth,
|
|
93
|
+
onMonthChange,
|
|
94
|
+
minDate,
|
|
95
|
+
maxDate,
|
|
96
|
+
disabledDates,
|
|
97
|
+
size = "md",
|
|
98
|
+
weekStartsOn = 0,
|
|
99
|
+
showOutsideDays = true,
|
|
100
|
+
className,
|
|
101
|
+
classNames
|
|
102
|
+
}) => {
|
|
103
|
+
const today = /* @__PURE__ */ new Date();
|
|
104
|
+
const [internalValue, setInternalValue] = React.useState(
|
|
105
|
+
defaultValue ?? null
|
|
106
|
+
);
|
|
107
|
+
const [internalMonth, setInternalMonth] = React.useState(
|
|
108
|
+
defaultMonth ?? defaultValue ?? today
|
|
109
|
+
);
|
|
110
|
+
const selected = value !== void 0 ? value : internalValue;
|
|
111
|
+
const currentMonth = controlledMonth ?? internalMonth;
|
|
112
|
+
const year = currentMonth.getFullYear();
|
|
113
|
+
const monthIdx = currentMonth.getMonth();
|
|
114
|
+
const weeks = React.useMemo(
|
|
115
|
+
() => getMonthGrid(year, monthIdx, weekStartsOn, showOutsideDays),
|
|
116
|
+
[year, monthIdx, weekStartsOn, showOutsideDays]
|
|
117
|
+
);
|
|
118
|
+
const dayNames = React.useMemo(() => {
|
|
119
|
+
const names = [];
|
|
120
|
+
for (let i = 0; i < 7; i++) {
|
|
121
|
+
names.push(DAY_NAMES_SHORT[(weekStartsOn + i) % 7]);
|
|
122
|
+
}
|
|
123
|
+
return names;
|
|
124
|
+
}, [weekStartsOn]);
|
|
125
|
+
const navigate = (offset) => {
|
|
126
|
+
const next = new Date(year, monthIdx + offset, 1);
|
|
127
|
+
if (controlledMonth === void 0) setInternalMonth(next);
|
|
128
|
+
onMonthChange?.(next);
|
|
129
|
+
};
|
|
130
|
+
const isDisabled = (date) => {
|
|
131
|
+
if (minDate && date < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()))
|
|
132
|
+
return true;
|
|
133
|
+
if (maxDate && date > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate()))
|
|
134
|
+
return true;
|
|
135
|
+
return disabledDates?.(date) ?? false;
|
|
136
|
+
};
|
|
137
|
+
const handleSelect = (date) => {
|
|
138
|
+
if (isDisabled(date)) return;
|
|
139
|
+
if (value === void 0) setInternalValue(date);
|
|
140
|
+
onChange?.(date);
|
|
141
|
+
if (date.getMonth() !== monthIdx) {
|
|
142
|
+
navigate(date.getMonth() - monthIdx);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
return /* @__PURE__ */ jsxs(
|
|
146
|
+
"div",
|
|
147
|
+
{
|
|
148
|
+
"data-slot": "root",
|
|
149
|
+
className: cn(
|
|
150
|
+
"calendar_root",
|
|
151
|
+
calendarVariants({ size }),
|
|
152
|
+
classNames?.root,
|
|
153
|
+
className
|
|
154
|
+
),
|
|
155
|
+
children: [
|
|
156
|
+
/* @__PURE__ */ jsxs(
|
|
157
|
+
"div",
|
|
158
|
+
{
|
|
159
|
+
"data-slot": "header",
|
|
160
|
+
className: cn(
|
|
161
|
+
"calendar_header",
|
|
162
|
+
"flex items-center justify-between px-1",
|
|
163
|
+
classNames?.header
|
|
164
|
+
),
|
|
165
|
+
children: [
|
|
166
|
+
/* @__PURE__ */ jsx(
|
|
167
|
+
"button",
|
|
168
|
+
{
|
|
169
|
+
type: "button",
|
|
170
|
+
onClick: () => navigate(-1),
|
|
171
|
+
className: navBtnClass,
|
|
172
|
+
"aria-label": "Previous month",
|
|
173
|
+
children: /* @__PURE__ */ jsx(ChevronLeft, { className: "w-4 h-4" })
|
|
174
|
+
}
|
|
175
|
+
),
|
|
176
|
+
/* @__PURE__ */ jsxs("span", { className: "font-semibold text-text-primary", children: [
|
|
177
|
+
MONTH_NAMES[monthIdx],
|
|
178
|
+
" ",
|
|
179
|
+
year
|
|
180
|
+
] }),
|
|
181
|
+
/* @__PURE__ */ jsx(
|
|
182
|
+
"button",
|
|
183
|
+
{
|
|
184
|
+
type: "button",
|
|
185
|
+
onClick: () => navigate(1),
|
|
186
|
+
className: navBtnClass,
|
|
187
|
+
"aria-label": "Next month",
|
|
188
|
+
children: /* @__PURE__ */ jsx(ChevronRight, { className: "w-4 h-4" })
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
]
|
|
192
|
+
}
|
|
193
|
+
),
|
|
194
|
+
/* @__PURE__ */ jsxs(
|
|
195
|
+
"div",
|
|
196
|
+
{
|
|
197
|
+
"data-slot": "grid",
|
|
198
|
+
className: cn("calendar_grid", "grid grid-cols-7", classNames?.grid),
|
|
199
|
+
role: "grid",
|
|
200
|
+
children: [
|
|
201
|
+
dayNames.map((name) => /* @__PURE__ */ jsx(
|
|
202
|
+
"div",
|
|
203
|
+
{
|
|
204
|
+
role: "columnheader",
|
|
205
|
+
className: cn(
|
|
206
|
+
"calendar_dayName",
|
|
207
|
+
cellVariants({ size }),
|
|
208
|
+
"font-medium text-text-secondary cursor-default",
|
|
209
|
+
classNames?.dayName
|
|
210
|
+
),
|
|
211
|
+
children: name
|
|
212
|
+
},
|
|
213
|
+
name
|
|
214
|
+
)),
|
|
215
|
+
weeks.map(
|
|
216
|
+
(week, wi) => week.map(({ date, outside }) => {
|
|
217
|
+
const disabled = isDisabled(date);
|
|
218
|
+
const isToday = isSameDay(date, today);
|
|
219
|
+
const isSelected = selected ? isSameDay(date, selected) : false;
|
|
220
|
+
return /* @__PURE__ */ jsx(
|
|
221
|
+
"button",
|
|
222
|
+
{
|
|
223
|
+
type: "button",
|
|
224
|
+
role: "gridcell",
|
|
225
|
+
disabled,
|
|
226
|
+
onClick: () => handleSelect(date),
|
|
227
|
+
"aria-selected": isSelected,
|
|
228
|
+
"aria-current": isToday ? "date" : void 0,
|
|
229
|
+
className: cn(
|
|
230
|
+
"calendar_day",
|
|
231
|
+
cellVariants({ size }),
|
|
232
|
+
outside && "text-text-secondary/40",
|
|
233
|
+
outside && !showOutsideDays && "invisible",
|
|
234
|
+
disabled && "opacity-30 cursor-not-allowed",
|
|
235
|
+
!disabled && !isSelected && "hover:bg-surface",
|
|
236
|
+
isToday && !isSelected && "border border-primary text-primary",
|
|
237
|
+
isSelected && "bg-primary text-primary-foreground",
|
|
238
|
+
classNames?.day,
|
|
239
|
+
isToday && classNames?.today,
|
|
240
|
+
isSelected && classNames?.selected,
|
|
241
|
+
outside && classNames?.outside,
|
|
242
|
+
disabled && classNames?.disabled
|
|
243
|
+
),
|
|
244
|
+
children: date.getDate()
|
|
245
|
+
},
|
|
246
|
+
`${wi}-${date.toISOString()}`
|
|
247
|
+
);
|
|
248
|
+
})
|
|
249
|
+
)
|
|
250
|
+
]
|
|
251
|
+
}
|
|
252
|
+
)
|
|
253
|
+
]
|
|
254
|
+
}
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
);
|
|
258
|
+
Calendar.displayName = "Calendar";
|
|
259
|
+
var calendar_default = Calendar;
|
|
260
|
+
|
|
261
|
+
export { calendar_default };
|
|
262
|
+
//# sourceMappingURL=chunk-5YEC6FDN.js.map
|
|
263
|
+
//# sourceMappingURL=chunk-5YEC6FDN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/calendar/index.tsx"],"names":[],"mappings":"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","file":"chunk-5YEC6FDN.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { cn } from '../utils'\nimport type { CalendarProps } from './types'\n\nconst calendarVariants = cva('inline-flex flex-col select-none', {\n variants: {\n size: {\n xs: 'text-xs gap-1',\n sm: 'text-sm gap-1.5',\n md: 'text-sm gap-2',\n lg: 'text-base gap-2.5',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nconst cellVariants = cva(\n 'flex items-center justify-center rounded-md transition-colors cursor-pointer font-normal',\n {\n variants: {\n size: {\n xs: 'w-7 h-7 text-xs',\n sm: 'w-8 h-8 text-sm',\n md: 'w-9 h-9 text-sm',\n lg: 'w-10 h-10 text-base',\n },\n },\n defaultVariants: { size: 'md' },\n },\n)\n\nconst navBtnClass =\n 'inline-flex items-center justify-center rounded-md w-7 h-7 hover:bg-surface transition-colors cursor-pointer text-text-secondary hover:text-text-primary'\n\nfunction isSameDay(a: Date, b: Date) {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nfunction getDaysInMonth(year: number, month: number) {\n return new Date(year, month + 1, 0).getDate()\n}\n\nfunction getMonthGrid(\n year: number,\n month: number,\n weekStartsOn: number,\n showOutside: boolean,\n) {\n const firstDay = new Date(year, month, 1).getDay()\n const daysInMonth = getDaysInMonth(year, month)\n const daysInPrevMonth = getDaysInMonth(year, month - 1)\n const offset = (firstDay - weekStartsOn + 7) % 7\n\n const weeks: Array<Array<{ date: Date; outside: boolean }>> = []\n let week: Array<{ date: Date; outside: boolean }> = []\n\n for (let i = 0; i < offset; i++) {\n const day = daysInPrevMonth - offset + 1 + i\n week.push({ date: new Date(year, month - 1, day), outside: true })\n }\n\n for (let day = 1; day <= daysInMonth; day++) {\n week.push({ date: new Date(year, month, day), outside: false })\n if (week.length === 7) {\n weeks.push(week)\n week = []\n }\n }\n\n if (week.length > 0) {\n let nextDay = 1\n while (week.length < 7) {\n week.push({ date: new Date(year, month + 1, nextDay++), outside: true })\n }\n weeks.push(week)\n }\n\n if (!showOutside) {\n return weeks.map((w) =>\n w.map((d) => (d.outside ? { ...d, date: d.date } : d)),\n )\n }\n\n return weeks\n}\n\nconst DAY_NAMES_SHORT = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\nconst MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n]\n\nconst Calendar = React.memo<CalendarProps>(\n ({\n value,\n defaultValue,\n onChange,\n month: controlledMonth,\n defaultMonth,\n onMonthChange,\n minDate,\n maxDate,\n disabledDates,\n size = 'md',\n weekStartsOn = 0,\n showOutsideDays = true,\n className,\n classNames,\n }) => {\n const today = new Date()\n const [internalValue, setInternalValue] = React.useState<Date | null>(\n defaultValue ?? null,\n )\n const [internalMonth, setInternalMonth] = React.useState<Date>(\n defaultMonth ?? defaultValue ?? today,\n )\n\n const selected = value !== undefined ? value : internalValue\n const currentMonth = controlledMonth ?? internalMonth\n\n const year = currentMonth.getFullYear()\n const monthIdx = currentMonth.getMonth()\n\n const weeks = React.useMemo(\n () => getMonthGrid(year, monthIdx, weekStartsOn, showOutsideDays),\n [year, monthIdx, weekStartsOn, showOutsideDays],\n )\n\n const dayNames = React.useMemo(() => {\n const names = []\n for (let i = 0; i < 7; i++) {\n names.push(DAY_NAMES_SHORT[(weekStartsOn + i) % 7])\n }\n return names\n }, [weekStartsOn])\n\n const navigate = (offset: number) => {\n const next = new Date(year, monthIdx + offset, 1)\n if (controlledMonth === undefined) setInternalMonth(next)\n onMonthChange?.(next)\n }\n\n const isDisabled = (date: Date) => {\n if (minDate && date < new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()))\n return true\n if (maxDate && date > new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate()))\n return true\n return disabledDates?.(date) ?? false\n }\n\n const handleSelect = (date: Date) => {\n if (isDisabled(date)) return\n if (value === undefined) setInternalValue(date)\n onChange?.(date)\n if (date.getMonth() !== monthIdx) {\n navigate(date.getMonth() - monthIdx)\n }\n }\n\n return (\n <div\n data-slot=\"root\"\n className={cn(\n 'calendar_root',\n calendarVariants({ size }),\n classNames?.root,\n className,\n )}\n >\n {/* Header */}\n <div\n data-slot=\"header\"\n className={cn(\n 'calendar_header',\n 'flex items-center justify-between px-1',\n classNames?.header,\n )}\n >\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n className={navBtnClass}\n aria-label=\"Previous month\"\n >\n <ChevronLeft className=\"w-4 h-4\" />\n </button>\n <span className=\"font-semibold text-text-primary\">\n {MONTH_NAMES[monthIdx]} {year}\n </span>\n <button\n type=\"button\"\n onClick={() => navigate(1)}\n className={navBtnClass}\n aria-label=\"Next month\"\n >\n <ChevronRight className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Grid */}\n <div\n data-slot=\"grid\"\n className={cn('calendar_grid', 'grid grid-cols-7', classNames?.grid)}\n role=\"grid\"\n >\n {dayNames.map((name) => (\n <div\n key={name}\n role=\"columnheader\"\n className={cn(\n 'calendar_dayName',\n cellVariants({ size }),\n 'font-medium text-text-secondary cursor-default',\n classNames?.dayName,\n )}\n >\n {name}\n </div>\n ))}\n {weeks.map((week, wi) =>\n week.map(({ date, outside }) => {\n const disabled = isDisabled(date)\n const isToday = isSameDay(date, today)\n const isSelected = selected ? isSameDay(date, selected) : false\n\n return (\n <button\n key={`${wi}-${date.toISOString()}`}\n type=\"button\"\n role=\"gridcell\"\n disabled={disabled}\n onClick={() => handleSelect(date)}\n aria-selected={isSelected}\n aria-current={isToday ? 'date' : undefined}\n className={cn(\n 'calendar_day',\n cellVariants({ size }),\n outside && 'text-text-secondary/40',\n outside && !showOutsideDays && 'invisible',\n disabled && 'opacity-30 cursor-not-allowed',\n !disabled && !isSelected && 'hover:bg-surface',\n isToday && !isSelected && 'border border-primary text-primary',\n isSelected && 'bg-primary text-primary-foreground',\n classNames?.day,\n isToday && classNames?.today,\n isSelected && classNames?.selected,\n outside && classNames?.outside,\n disabled && classNames?.disabled,\n )}\n >\n {date.getDate()}\n </button>\n )\n }),\n )}\n </div>\n </div>\n )\n },\n)\n\nCalendar.displayName = 'Calendar'\n\nexport type * from './types'\nexport default Calendar\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Popover, PopoverTrigger, PopoverContent } from './chunk-ROQGBDET.js';
|
|
2
1
|
import { useMenuNavigation } from './chunk-NZHKNUGE.js';
|
|
3
2
|
import { useRipple, RippleContainer } from './chunk-4TEZWGX7.js';
|
|
3
|
+
import { Popover, PopoverTrigger, PopoverContent } from './chunk-ROQGBDET.js';
|
|
4
4
|
import { colorVars } from './chunk-G6QIIWKU.js';
|
|
5
5
|
import { cn } from './chunk-RAS6HUEI.js';
|
|
6
6
|
import { cva } from 'class-variance-authority';
|
|
@@ -270,5 +270,5 @@ Dropdown.displayName = "Dropdown";
|
|
|
270
270
|
var dropdown_default = Dropdown;
|
|
271
271
|
|
|
272
272
|
export { dropdown_default };
|
|
273
|
-
//# sourceMappingURL=chunk-
|
|
274
|
-
//# sourceMappingURL=chunk-
|
|
273
|
+
//# sourceMappingURL=chunk-6NXZWLSM.js.map
|
|
274
|
+
//# sourceMappingURL=chunk-6NXZWLSM.js.map
|