@deepnoid/ui 0.1.156 → 0.1.158
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/.turbo/turbo-build.log +198 -188
- package/dist/{chunk-6YTT5ACI.mjs → chunk-3QE57PU3.mjs} +1 -1
- package/dist/{chunk-KKHOCWXJ.mjs → chunk-3X376ACN.mjs} +1 -1
- package/dist/{chunk-URJA4W4R.mjs → chunk-46EIW6MN.mjs} +2 -2
- package/dist/chunk-7YMXOYES.mjs +449 -0
- package/dist/{chunk-2DAIOZ7N.mjs → chunk-CSG6FDBX.mjs} +2 -2
- package/dist/{chunk-WHU5VP5G.mjs → chunk-DDFJMHBC.mjs} +57 -2
- package/dist/{chunk-ZY3HNPPG.mjs → chunk-HKHVSCER.mjs} +1 -1
- package/dist/{chunk-ZNQML73F.mjs → chunk-IRJP6BF3.mjs} +2 -2
- package/dist/{chunk-HP4ARKW3.mjs → chunk-ITFEV25U.mjs} +1 -1
- package/dist/{chunk-7RG7CQQM.mjs → chunk-JKYLYL3A.mjs} +1 -1
- package/dist/{chunk-KX6WG4VG.mjs → chunk-KLBA5J2H.mjs} +1 -1
- package/dist/chunk-L5FRTUM6.mjs +100 -0
- package/dist/chunk-OLQOLLKG.mjs +1 -0
- package/dist/{chunk-LFALITPU.mjs → chunk-PXAJEOZS.mjs} +1 -1
- package/dist/{chunk-5VVNAW4E.mjs → chunk-QHETCLHO.mjs} +2 -2
- package/dist/{chunk-Q2YLULZH.mjs → chunk-R7KUEH3N.mjs} +1 -1
- package/dist/{chunk-47MQPUEY.mjs → chunk-SFGFRMWL.mjs} +1 -1
- package/dist/{chunk-4YVZ3XKA.mjs → chunk-V64PCWVW.mjs} +3 -3
- package/dist/{chunk-R2USZD77.mjs → chunk-XHCPYYMC.mjs} +1 -1
- package/dist/{chunk-UIRHCS6B.mjs → chunk-YQYO5RLZ.mjs} +1 -1
- package/dist/{chunk-ZGUTKE5H.mjs → chunk-Z7CLJYRF.mjs} +1 -1
- package/dist/components/avatar/avatar.js +57 -2
- package/dist/components/avatar/avatar.mjs +2 -2
- package/dist/components/avatar/index.js +57 -2
- package/dist/components/avatar/index.mjs +2 -2
- package/dist/components/breadcrumb/breadcrumb.js +57 -2
- package/dist/components/breadcrumb/breadcrumb.mjs +5 -5
- package/dist/components/breadcrumb/index.js +57 -2
- package/dist/components/breadcrumb/index.mjs +5 -5
- package/dist/components/button/button.js +57 -2
- package/dist/components/button/button.mjs +3 -3
- package/dist/components/button/icon-button.js +57 -2
- package/dist/components/button/icon-button.mjs +3 -3
- package/dist/components/button/index.js +57 -2
- package/dist/components/button/index.mjs +4 -4
- package/dist/components/chip/chip.js +57 -2
- package/dist/components/chip/chip.mjs +3 -3
- package/dist/components/chip/index.js +57 -2
- package/dist/components/chip/index.mjs +3 -3
- package/dist/components/fileUpload/fileUpload.js +57 -2
- package/dist/components/fileUpload/fileUpload.mjs +6 -6
- package/dist/components/fileUpload/index.js +57 -2
- package/dist/components/fileUpload/index.mjs +6 -6
- package/dist/components/icon/Icon.d.mts +8 -0
- package/dist/components/icon/Icon.d.ts +8 -0
- package/dist/components/icon/Icon.js +57 -2
- package/dist/components/icon/Icon.mjs +2 -2
- package/dist/components/icon/index.js +57 -2
- package/dist/components/icon/index.mjs +2 -2
- package/dist/components/icon/template.d.mts +2 -0
- package/dist/components/icon/template.d.ts +2 -0
- package/dist/components/icon/template.js +57 -2
- package/dist/components/icon/template.mjs +1 -1
- package/dist/components/input/index.js +57 -2
- package/dist/components/input/index.mjs +3 -3
- package/dist/components/input/input.js +57 -2
- package/dist/components/input/input.mjs +3 -3
- package/dist/components/list/index.js +57 -2
- package/dist/components/list/index.mjs +4 -4
- package/dist/components/list/listItem.js +57 -2
- package/dist/components/list/listItem.mjs +4 -4
- package/dist/components/modal/index.js +57 -2
- package/dist/components/modal/index.mjs +5 -5
- package/dist/components/modal/modal.js +57 -2
- package/dist/components/modal/modal.mjs +5 -5
- package/dist/components/pagination/index.js +57 -2
- package/dist/components/pagination/index.mjs +4 -4
- package/dist/components/pagination/pagination.js +57 -2
- package/dist/components/pagination/pagination.mjs +4 -4
- package/dist/components/picker/datePicker.d.mts +35 -4
- package/dist/components/picker/datePicker.d.ts +35 -4
- package/dist/components/picker/datePicker.js +238 -49
- package/dist/components/picker/datePicker.mjs +6 -6
- package/dist/components/picker/day.d.mts +2 -2
- package/dist/components/picker/day.d.ts +2 -2
- package/dist/components/picker/index.d.mts +1 -1
- package/dist/components/picker/index.d.ts +1 -1
- package/dist/components/picker/index.js +238 -49
- package/dist/components/picker/index.mjs +8 -8
- package/dist/components/picker/timePicker.js +57 -2
- package/dist/components/picker/timePicker.mjs +4 -4
- package/dist/components/radio/index.d.mts +1 -1
- package/dist/components/radio/index.d.ts +1 -1
- package/dist/components/select/index.js +57 -2
- package/dist/components/select/index.mjs +3 -3
- package/dist/components/select/select.js +57 -2
- package/dist/components/select/select.mjs +3 -3
- package/dist/components/starRating/index.d.mts +4 -0
- package/dist/components/starRating/index.d.ts +4 -0
- package/dist/components/starRating/index.js +5279 -0
- package/dist/components/starRating/index.mjs +14 -0
- package/dist/components/starRating/starRating.d.mts +60 -0
- package/dist/components/starRating/starRating.d.ts +60 -0
- package/dist/components/starRating/starRating.js +5278 -0
- package/dist/components/starRating/starRating.mjs +15 -0
- package/dist/components/table/index.js +57 -2
- package/dist/components/table/index.mjs +7 -7
- package/dist/components/table/table-body.js +57 -2
- package/dist/components/table/table-body.mjs +5 -5
- package/dist/components/table/table-head.js +57 -2
- package/dist/components/table/table-head.mjs +5 -5
- package/dist/components/table/table.js +57 -2
- package/dist/components/table/table.mjs +5 -5
- package/dist/components/timePicker/calendar.js +57 -2
- package/dist/components/timePicker/calendar.mjs +2 -2
- package/dist/components/toast/index.js +57 -2
- package/dist/components/toast/index.mjs +4 -4
- package/dist/components/toast/toast.js +57 -2
- package/dist/components/toast/toast.mjs +3 -3
- package/dist/components/toast/use-toast.js +57 -2
- package/dist/components/toast/use-toast.mjs +4 -4
- package/dist/components/tree/index.js +57 -2
- package/dist/components/tree/index.mjs +3 -3
- package/dist/components/tree/tree.js +57 -2
- package/dist/components/tree/tree.mjs +3 -3
- package/dist/index.d.mts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +325 -49
- package/dist/index.mjs +37 -32
- package/package.json +1 -1
- package/dist/chunk-TCURFCQ2.mjs +0 -315
package/dist/index.js
CHANGED
|
@@ -132,6 +132,7 @@ __export(index_exports, {
|
|
|
132
132
|
ScrollArea: () => scrollArea_default,
|
|
133
133
|
Select: () => select_default,
|
|
134
134
|
Skeleton: () => skeleton_default,
|
|
135
|
+
StarRating: () => starRating_default,
|
|
135
136
|
Switch: () => switch_default,
|
|
136
137
|
Table: () => table_default,
|
|
137
138
|
Tabs: () => tabs_default,
|
|
@@ -1135,8 +1136,8 @@ var template = {
|
|
|
1135
1136
|
{
|
|
1136
1137
|
fillRule: "evenodd",
|
|
1137
1138
|
clipRule: "evenodd",
|
|
1138
|
-
|
|
1139
|
-
|
|
1139
|
+
d: "M8.26603 3.51086C8.53733 2.82971 9.46267 2.82971 9.73397 3.51086L10.9948 6.67687L14.2674 6.95135C14.9723 7.01017 15.2582 7.92848 14.721 8.40913L12.2278 10.6398L12.989 13.9746C13.1531 14.6931 12.4052 15.2604 11.8021 14.8759L9 13.0886L6.19794 14.8759C5.59478 15.2604 4.84687 14.6925 5.01099 13.9746L5.77221 10.6398L3.27901 8.40913C2.74185 7.92848 3.02769 7.01017 3.73259 6.95135L7.00519 6.67687L8.26603 3.51086Z",
|
|
1140
|
+
fill: "currentColor"
|
|
1140
1141
|
}
|
|
1141
1142
|
) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
1142
1143
|
"path",
|
|
@@ -1150,6 +1151,41 @@ var template = {
|
|
|
1150
1151
|
}
|
|
1151
1152
|
);
|
|
1152
1153
|
},
|
|
1154
|
+
halfStar: ({ className }) => {
|
|
1155
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
1156
|
+
"svg",
|
|
1157
|
+
{
|
|
1158
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
1159
|
+
width: "18",
|
|
1160
|
+
height: "18",
|
|
1161
|
+
viewBox: "0 0 18 18",
|
|
1162
|
+
fill: "none",
|
|
1163
|
+
className,
|
|
1164
|
+
children: [
|
|
1165
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("clipPath", { id: "half-clip", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("rect", { x: "0", y: "0", width: "9", height: "18" }) }) }),
|
|
1166
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
1167
|
+
"path",
|
|
1168
|
+
{
|
|
1169
|
+
fillRule: "evenodd",
|
|
1170
|
+
clipRule: "evenodd",
|
|
1171
|
+
fill: "currentColor",
|
|
1172
|
+
d: "M8.26603 3.51086C8.53733 2.82971 9.46267 2.82971 9.73397 3.51086L10.9948 6.67687L14.2674 6.95135C14.9723 7.01017 15.2582 7.92848 14.721 8.40913L12.2278 10.6398L12.989 13.9746C13.1531 14.6931 12.4052 15.2604 11.8021 14.8759L9 13.0886L6.19794 14.8759C5.59478 15.2604 4.84687 14.6925 5.01099 13.9746L5.77221 10.6398L3.27901 8.40913C2.74185 7.92848 3.02769 7.01017 3.73259 6.95135L7.00519 6.67687L8.26603 3.51086Z",
|
|
1173
|
+
clipPath: "url(#half-clip)"
|
|
1174
|
+
}
|
|
1175
|
+
),
|
|
1176
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
1177
|
+
"path",
|
|
1178
|
+
{
|
|
1179
|
+
d: "M8.65925 3.23957C8.68697 3.16871 8.73417 3.1081 8.79484 3.06544C8.85552 3.02278 8.92693 3 9 3C9.07306 3 9.14448 3.02278 9.20515 3.06544C9.26583 3.1081 9.31303 3.16871 9.34074 3.23957L10.7332 6.74977C10.7593 6.81546 10.8021 6.87233 10.857 6.91413C10.912 6.95594 10.9768 6.98105 11.0445 6.98672L14.6603 7.29028C14.9873 7.31775 15.1196 7.74563 14.8706 7.96883L12.1158 10.4427C12.0644 10.4888 12.026 10.5489 12.005 10.6164C11.984 10.6839 11.981 10.7561 11.9966 10.8252L12.8386 14.5236C12.8555 14.5978 12.8511 14.6756 12.8259 14.7471C12.8006 14.8187 12.7557 14.8808 12.6968 14.9257C12.6379 14.9705 12.5677 14.996 12.495 14.999C12.4222 15.002 12.3503 14.9824 12.2882 14.9425L9.19199 12.9611C9.13418 12.9241 9.06775 12.9045 9 12.9045C8.93225 12.9045 8.86581 12.9241 8.808 12.9611L5.71181 14.9432C5.64973 14.9831 5.57778 15.0027 5.50504 14.9997C5.43231 14.9967 5.36206 14.9712 5.30316 14.9263C5.24426 14.8815 5.19936 14.8194 5.17412 14.7478C5.14889 14.6763 5.14445 14.5985 5.16138 14.5243L6.00341 10.8252C6.01903 10.7561 6.01616 10.6838 5.99511 10.6164C5.97407 10.5489 5.93568 10.4888 5.88415 10.4427L3.12936 7.96883C3.07389 7.91927 3.03369 7.85357 3.01387 7.78005C2.99405 7.70652 2.9955 7.62849 3.01802 7.55583C3.04055 7.48317 3.08314 7.41915 3.1404 7.37188C3.19767 7.3246 3.26703 7.29621 3.33971 7.29028L6.95553 6.98672C7.02319 6.98105 7.08804 6.95594 7.14296 6.91413C7.19787 6.87233 7.24072 6.81546 7.26679 6.74977L8.65925 3.23957Z",
|
|
1180
|
+
stroke: "currentColor",
|
|
1181
|
+
strokeLinecap: "round",
|
|
1182
|
+
strokeLinejoin: "round"
|
|
1183
|
+
}
|
|
1184
|
+
)
|
|
1185
|
+
]
|
|
1186
|
+
}
|
|
1187
|
+
);
|
|
1188
|
+
},
|
|
1153
1189
|
avatar: ({ className }) => {
|
|
1154
1190
|
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
1155
1191
|
"svg",
|
|
@@ -2575,6 +2611,26 @@ var template = {
|
|
|
2575
2611
|
}
|
|
2576
2612
|
);
|
|
2577
2613
|
},
|
|
2614
|
+
question: ({ className = "text-white" }) => {
|
|
2615
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2616
|
+
"svg",
|
|
2617
|
+
{
|
|
2618
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
2619
|
+
width: "24",
|
|
2620
|
+
height: "24",
|
|
2621
|
+
viewBox: "0 0 24 24",
|
|
2622
|
+
fill: "none",
|
|
2623
|
+
className,
|
|
2624
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2625
|
+
"path",
|
|
2626
|
+
{
|
|
2627
|
+
d: "M17 2.42969H7C4 2.42969 2 4.42969 2 7.42969V13.4297C2 16.4297 4 18.4297 7 18.4297V20.5597C7 21.3597 7.89 21.8397 8.55 21.3897L13 18.4297H17C20 18.4297 22 16.4297 22 13.4297V7.42969C22 4.42969 20 2.42969 17 2.42969ZM12 14.5997C11.58 14.5997 11.25 14.2597 11.25 13.8497C11.25 13.4397 11.58 13.0997 12 13.0997C12.42 13.0997 12.75 13.4397 12.75 13.8497C12.75 14.2597 12.42 14.5997 12 14.5997ZM13.26 10.4497C12.87 10.7097 12.75 10.8797 12.75 11.1597V11.3697C12.75 11.7797 12.41 12.1197 12 12.1197C11.59 12.1197 11.25 11.7797 11.25 11.3697V11.1597C11.25 9.99969 12.1 9.42969 12.42 9.20969C12.79 8.95969 12.91 8.78969 12.91 8.52969C12.91 8.02969 12.5 7.61969 12 7.61969C11.5 7.61969 11.09 8.02969 11.09 8.52969C11.09 8.93969 10.75 9.27969 10.34 9.27969C9.93 9.27969 9.59 8.93969 9.59 8.52969C9.59 7.19969 10.67 6.11969 12 6.11969C13.33 6.11969 14.41 7.19969 14.41 8.52969C14.41 9.66969 13.57 10.2397 13.26 10.4497Z",
|
|
2628
|
+
fill: "currentColor"
|
|
2629
|
+
}
|
|
2630
|
+
)
|
|
2631
|
+
}
|
|
2632
|
+
);
|
|
2633
|
+
},
|
|
2578
2634
|
// ----------------------------------- old ---------------------------------
|
|
2579
2635
|
// ** Status **
|
|
2580
2636
|
"plus-circle": ({ className, fill }) => {
|
|
@@ -11236,12 +11292,25 @@ var DatePicker = (0, import_react32.forwardRef)((originalProps, ref) => {
|
|
|
11236
11292
|
todayTitle,
|
|
11237
11293
|
cancelTitle,
|
|
11238
11294
|
confirmTitle,
|
|
11295
|
+
range = false,
|
|
11296
|
+
dualCalendar = false,
|
|
11239
11297
|
...inputProps
|
|
11240
11298
|
} = { ...props, ...variantProps };
|
|
11241
|
-
const [selectedDate, setSelectedDate] = (0, import_react32.useState)(value || "");
|
|
11242
|
-
const [
|
|
11299
|
+
const [selectedDate, setSelectedDate] = (0, import_react32.useState)(range ? "" : typeof value === "string" ? value || "" : "");
|
|
11300
|
+
const [selectedRange, setSelectedRange] = (0, import_react32.useState)({
|
|
11301
|
+
startDate: range && typeof value === "object" ? (value == null ? void 0 : value.startDate) || "" : "",
|
|
11302
|
+
endDate: range && typeof value === "object" ? (value == null ? void 0 : value.endDate) || "" : ""
|
|
11303
|
+
});
|
|
11304
|
+
const [tempSelectedDate, setTempSelectedDate] = (0, import_react32.useState)(selectedDate);
|
|
11305
|
+
const [tempSelectedRange, setTempSelectedRange] = (0, import_react32.useState)(selectedRange);
|
|
11306
|
+
const [rangeSelection, setRangeSelection] = (0, import_react32.useState)("start");
|
|
11243
11307
|
const [isPanelOpen, setIsPanelOpen] = (0, import_react32.useState)(false);
|
|
11244
|
-
const [
|
|
11308
|
+
const [leftCurrentDate, setLeftCurrentDate] = (0, import_react32.useState)(
|
|
11309
|
+
range && tempSelectedRange.startDate ? new Date(tempSelectedRange.startDate) : tempSelectedDate ? new Date(tempSelectedDate) : /* @__PURE__ */ new Date()
|
|
11310
|
+
);
|
|
11311
|
+
const [rightCurrentDate, setRightCurrentDate] = (0, import_react32.useState)(
|
|
11312
|
+
dualCalendar ? new Date(leftCurrentDate.getFullYear(), leftCurrentDate.getMonth() + 1) : /* @__PURE__ */ new Date()
|
|
11313
|
+
);
|
|
11245
11314
|
const inputWrapperRef = (0, import_react32.useRef)(null);
|
|
11246
11315
|
const calendarWrapperRef = (0, import_react32.useRef)(null);
|
|
11247
11316
|
const [panelPos, setPanelPos] = (0, import_react32.useState)({ top: -9999, left: -9999 });
|
|
@@ -11258,7 +11327,16 @@ var DatePicker = (0, import_react32.forwardRef)((originalProps, ref) => {
|
|
|
11258
11327
|
return dateString;
|
|
11259
11328
|
}
|
|
11260
11329
|
};
|
|
11261
|
-
const displayValue = (0, import_react32.useMemo)(() =>
|
|
11330
|
+
const displayValue = (0, import_react32.useMemo)(() => {
|
|
11331
|
+
if (range) {
|
|
11332
|
+
const start = formatDate(selectedRange.startDate);
|
|
11333
|
+
const end = formatDate(selectedRange.endDate);
|
|
11334
|
+
if (start && end) return `${start} ~ ${end}`;
|
|
11335
|
+
if (start) return start;
|
|
11336
|
+
return "";
|
|
11337
|
+
}
|
|
11338
|
+
return formatDate(selectedDate);
|
|
11339
|
+
}, [selectedDate, selectedRange, format, range]);
|
|
11262
11340
|
const calculatePosition = (0, import_react32.useCallback)(() => {
|
|
11263
11341
|
if (inputWrapperRef.current) {
|
|
11264
11342
|
const rect = inputWrapperRef.current.getBoundingClientRect();
|
|
@@ -11291,13 +11369,18 @@ var DatePicker = (0, import_react32.forwardRef)((originalProps, ref) => {
|
|
|
11291
11369
|
};
|
|
11292
11370
|
const handleClearDate = (e) => {
|
|
11293
11371
|
e.preventDefault();
|
|
11294
|
-
|
|
11372
|
+
if (range) {
|
|
11373
|
+
setTempSelectedRange({ startDate: "", endDate: "" });
|
|
11374
|
+
setRangeSelection("start");
|
|
11375
|
+
} else {
|
|
11376
|
+
setTempSelectedDate("");
|
|
11377
|
+
}
|
|
11295
11378
|
};
|
|
11296
11379
|
const handleCalendarMouseDown = (e) => {
|
|
11297
11380
|
e.preventDefault();
|
|
11298
11381
|
if (blurTimeoutRef.current) clearTimeout(blurTimeoutRef.current);
|
|
11299
11382
|
};
|
|
11300
|
-
const getCalendarDates = (0, import_react32.useCallback)(() => {
|
|
11383
|
+
const getCalendarDates = (0, import_react32.useCallback)((currentDate) => {
|
|
11301
11384
|
const year = currentDate.getFullYear();
|
|
11302
11385
|
const month = currentDate.getMonth();
|
|
11303
11386
|
const firstDayOfMonth = new Date(year, month, 1).getDay();
|
|
@@ -11311,47 +11394,160 @@ var DatePicker = (0, import_react32.forwardRef)((originalProps, ref) => {
|
|
|
11311
11394
|
const weeks = [];
|
|
11312
11395
|
for (let i = 0; i < dates.length; i += 7) weeks.push(dates.slice(i, i + 7));
|
|
11313
11396
|
return weeks;
|
|
11314
|
-
}, [
|
|
11315
|
-
const
|
|
11316
|
-
|
|
11317
|
-
|
|
11397
|
+
}, []);
|
|
11398
|
+
const handleLeftPrevMonth = () => {
|
|
11399
|
+
const newLeftDate = new Date(leftCurrentDate.getFullYear(), leftCurrentDate.getMonth() - 1);
|
|
11400
|
+
setLeftCurrentDate(newLeftDate);
|
|
11401
|
+
if (dualCalendar) {
|
|
11402
|
+
setRightCurrentDate(new Date(newLeftDate.getFullYear(), newLeftDate.getMonth() + 1));
|
|
11403
|
+
}
|
|
11404
|
+
};
|
|
11405
|
+
const handleLeftNextMonth = () => {
|
|
11406
|
+
const newLeftDate = new Date(leftCurrentDate.getFullYear(), leftCurrentDate.getMonth() + 1);
|
|
11407
|
+
setLeftCurrentDate(newLeftDate);
|
|
11408
|
+
if (dualCalendar) {
|
|
11409
|
+
setRightCurrentDate(new Date(newLeftDate.getFullYear(), newLeftDate.getMonth() + 1));
|
|
11410
|
+
}
|
|
11411
|
+
};
|
|
11412
|
+
const handleRightNextMonth = () => {
|
|
11413
|
+
if (!dualCalendar) return;
|
|
11414
|
+
const newRightDate = new Date(rightCurrentDate.getFullYear(), rightCurrentDate.getMonth() + 1);
|
|
11415
|
+
setRightCurrentDate(newRightDate);
|
|
11416
|
+
setLeftCurrentDate(new Date(newRightDate.getFullYear(), newRightDate.getMonth() - 1));
|
|
11417
|
+
};
|
|
11418
|
+
const handleDateSelect = (date, isCurrentMonth, currentDate) => {
|
|
11318
11419
|
if (!isCurrentMonth) return;
|
|
11319
11420
|
const selected = new Date(currentDate.getFullYear(), currentDate.getMonth(), date);
|
|
11320
11421
|
const formatted = formatDateToString(selected);
|
|
11321
|
-
|
|
11422
|
+
if (range) {
|
|
11423
|
+
if (rangeSelection === "start") {
|
|
11424
|
+
setTempSelectedRange({ startDate: formatted, endDate: "" });
|
|
11425
|
+
setRangeSelection("end");
|
|
11426
|
+
} else {
|
|
11427
|
+
const startDate = new Date(tempSelectedRange.startDate);
|
|
11428
|
+
if (selected >= startDate) {
|
|
11429
|
+
setTempSelectedRange({ ...tempSelectedRange, endDate: formatted });
|
|
11430
|
+
} else {
|
|
11431
|
+
setTempSelectedRange({ startDate: formatted, endDate: tempSelectedRange.startDate });
|
|
11432
|
+
}
|
|
11433
|
+
}
|
|
11434
|
+
} else {
|
|
11435
|
+
setTempSelectedDate(formatted);
|
|
11436
|
+
}
|
|
11322
11437
|
};
|
|
11323
11438
|
const handleSetToday = () => {
|
|
11324
11439
|
const today = /* @__PURE__ */ new Date();
|
|
11325
11440
|
const formatted = formatDateToString(today);
|
|
11326
|
-
|
|
11327
|
-
|
|
11441
|
+
if (range) {
|
|
11442
|
+
if (rangeSelection === "start") {
|
|
11443
|
+
setTempSelectedRange({ startDate: formatted, endDate: "" });
|
|
11444
|
+
setRangeSelection("end");
|
|
11445
|
+
} else {
|
|
11446
|
+
const startDate = new Date(tempSelectedRange.startDate);
|
|
11447
|
+
if (today >= startDate) {
|
|
11448
|
+
setTempSelectedRange({ ...tempSelectedRange, endDate: formatted });
|
|
11449
|
+
} else {
|
|
11450
|
+
setTempSelectedRange({ startDate: formatted, endDate: tempSelectedRange.startDate });
|
|
11451
|
+
}
|
|
11452
|
+
}
|
|
11453
|
+
} else {
|
|
11454
|
+
setLeftCurrentDate(today);
|
|
11455
|
+
if (dualCalendar) setRightCurrentDate(new Date(today.getFullYear(), today.getMonth() + 1));
|
|
11456
|
+
setTempSelectedDate(formatted);
|
|
11457
|
+
}
|
|
11328
11458
|
};
|
|
11329
11459
|
const handleConfirmDate = () => {
|
|
11330
|
-
|
|
11331
|
-
|
|
11460
|
+
if (range) {
|
|
11461
|
+
setSelectedRange(tempSelectedRange);
|
|
11462
|
+
onChange == null ? void 0 : onChange(tempSelectedRange);
|
|
11463
|
+
} else {
|
|
11464
|
+
setSelectedDate(tempSelectedDate);
|
|
11465
|
+
onChange == null ? void 0 : onChange(tempSelectedDate);
|
|
11466
|
+
}
|
|
11332
11467
|
setIsPanelOpen(false);
|
|
11333
11468
|
};
|
|
11334
11469
|
const handleResetDate = () => {
|
|
11335
|
-
|
|
11470
|
+
if (range) {
|
|
11471
|
+
setTempSelectedRange(selectedRange);
|
|
11472
|
+
setRangeSelection("start");
|
|
11473
|
+
} else {
|
|
11474
|
+
setTempSelectedDate(selectedDate);
|
|
11475
|
+
}
|
|
11336
11476
|
setIsPanelOpen(false);
|
|
11337
11477
|
};
|
|
11338
11478
|
const getDayProps = (0, import_react32.useCallback)(
|
|
11339
|
-
(dateObj) => {
|
|
11479
|
+
(dateObj, currentDate) => {
|
|
11340
11480
|
const today = /* @__PURE__ */ new Date();
|
|
11341
11481
|
const isToday = today.getDate() === dateObj.date && today.getMonth() === currentDate.getMonth() && today.getFullYear() === currentDate.getFullYear();
|
|
11342
|
-
|
|
11343
|
-
|
|
11344
|
-
|
|
11482
|
+
if (range) {
|
|
11483
|
+
const startFormatted = tempSelectedRange.startDate ? formatStringToDate(tempSelectedRange.startDate) : null;
|
|
11484
|
+
const endFormatted = tempSelectedRange.endDate ? formatStringToDate(tempSelectedRange.endDate) : null;
|
|
11485
|
+
const currentFormatted = new Date(currentDate.getFullYear(), currentDate.getMonth(), dateObj.date);
|
|
11486
|
+
const isStartSelected = startFormatted && startFormatted.getDate() === dateObj.date && startFormatted.getMonth() === currentDate.getMonth() && startFormatted.getFullYear() === currentDate.getFullYear();
|
|
11487
|
+
const isEndSelected = endFormatted && endFormatted.getDate() === dateObj.date && endFormatted.getMonth() === currentDate.getMonth() && endFormatted.getFullYear() === currentDate.getFullYear();
|
|
11488
|
+
const isInRange = startFormatted && endFormatted && currentFormatted > startFormatted && currentFormatted < endFormatted;
|
|
11489
|
+
if (dateObj.currentMonth && (isStartSelected || isEndSelected)) return "selected";
|
|
11490
|
+
if (dateObj.currentMonth && isInRange) return "period";
|
|
11491
|
+
if (dateObj.currentMonth && isToday) return "today";
|
|
11492
|
+
if (!dateObj.currentMonth) return "disabled";
|
|
11493
|
+
return "default";
|
|
11494
|
+
} else {
|
|
11495
|
+
const formatted = tempSelectedDate ? formatStringToDate(tempSelectedDate) : null;
|
|
11496
|
+
const isSelected = (formatted == null ? void 0 : formatted.getDate()) === dateObj.date && formatted.getMonth() === currentDate.getMonth() && formatted.getFullYear() === currentDate.getFullYear();
|
|
11497
|
+
return dateObj.currentMonth && isSelected ? "selected" : dateObj.currentMonth && isToday ? "today" : !dateObj.currentMonth ? "disabled" : "default";
|
|
11498
|
+
}
|
|
11345
11499
|
},
|
|
11346
|
-
[tempSelectedDate,
|
|
11500
|
+
[tempSelectedDate, tempSelectedRange, range]
|
|
11347
11501
|
);
|
|
11502
|
+
const getPlaceholderText = () => {
|
|
11503
|
+
return placeholder;
|
|
11504
|
+
};
|
|
11348
11505
|
(0, import_react32.useEffect)(() => {
|
|
11349
|
-
|
|
11350
|
-
|
|
11351
|
-
|
|
11352
|
-
|
|
11353
|
-
|
|
11506
|
+
if (range && typeof value === "object") {
|
|
11507
|
+
setSelectedRange(value || { startDate: "", endDate: "" });
|
|
11508
|
+
setTempSelectedRange(value || { startDate: "", endDate: "" });
|
|
11509
|
+
if (value == null ? void 0 : value.startDate) setLeftCurrentDate(new Date(value.startDate));
|
|
11510
|
+
} else if (!range && typeof value === "string") {
|
|
11511
|
+
setSelectedDate(value || "");
|
|
11512
|
+
setTempSelectedDate(value || "");
|
|
11513
|
+
if (value) setLeftCurrentDate(new Date(value));
|
|
11514
|
+
}
|
|
11515
|
+
}, [value, range]);
|
|
11516
|
+
(0, import_react32.useEffect)(() => {
|
|
11517
|
+
if (dualCalendar) {
|
|
11518
|
+
setRightCurrentDate(new Date(leftCurrentDate.getFullYear(), leftCurrentDate.getMonth() + 1));
|
|
11519
|
+
}
|
|
11520
|
+
}, [leftCurrentDate, dualCalendar]);
|
|
11521
|
+
const slots = (0, import_react32.useMemo)(() => datePickerStyle({ ...variantProps, dualCalendar }), [variantProps, dualCalendar]);
|
|
11354
11522
|
const endContent = /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Icon_default, { name: "calendar", size, className: "cursor-pointer", fill: true, onClick: handleCalendarIconClick });
|
|
11523
|
+
const renderCalendar = (currentDate, isLeft) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "flex flex-col gap-[5px]", children: [
|
|
11524
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: slots.calendarHead({ class: classNames == null ? void 0 : classNames.calendarHead }), children: dualCalendar ? isLeft ? /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
|
|
11525
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(icon_button_default, { name: "left", variant: "soft", color: "neutral", onClick: handleLeftPrevMonth }),
|
|
11526
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "text-xl font-extrabold", children: monthYearFormat(currentDate.getFullYear(), currentDate.getMonth()) }),
|
|
11527
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "w-8" })
|
|
11528
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
|
|
11529
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "w-8" }),
|
|
11530
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "text-xl font-extrabold", children: monthYearFormat(currentDate.getFullYear(), currentDate.getMonth()) }),
|
|
11531
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(icon_button_default, { name: "right", variant: "soft", color: "neutral", onClick: handleRightNextMonth })
|
|
11532
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
|
|
11533
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(icon_button_default, { name: "left", variant: "soft", color: "neutral", onClick: handleLeftPrevMonth }),
|
|
11534
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "text-xl font-extrabold", children: monthYearFormat(currentDate.getFullYear(), currentDate.getMonth()) }),
|
|
11535
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(icon_button_default, { name: "right", variant: "soft", color: "neutral", onClick: handleLeftNextMonth })
|
|
11536
|
+
] }) }),
|
|
11537
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "grid grid-cols-7", children: daysOfWeek.map((day, index) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(day_default, { variant: "text", children: day }, `${day}-${index}`)) }),
|
|
11538
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "grid grid-cols-7 gap-y-[5px] text-center", children: getCalendarDates(currentDate).map((week, weekIndex) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_react32.Fragment, { children: week.map((dateObj, index) => {
|
|
11539
|
+
const dayVariant = getDayProps(dateObj, currentDate);
|
|
11540
|
+
return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
11541
|
+
day_default,
|
|
11542
|
+
{
|
|
11543
|
+
variant: dayVariant,
|
|
11544
|
+
onClick: () => handleDateSelect(dateObj.date, dateObj.currentMonth, currentDate),
|
|
11545
|
+
children: dateObj.date
|
|
11546
|
+
},
|
|
11547
|
+
index
|
|
11548
|
+
);
|
|
11549
|
+
}) }, weekIndex)) })
|
|
11550
|
+
] });
|
|
11355
11551
|
return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
|
|
11356
11552
|
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { ref: inputWrapperRef, className: slots.base({ class: classNames == null ? void 0 : classNames.base }), onClick: handleFocusInput, children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
11357
11553
|
input_default,
|
|
@@ -11360,7 +11556,7 @@ var DatePicker = (0, import_react32.forwardRef)((originalProps, ref) => {
|
|
|
11360
11556
|
ref,
|
|
11361
11557
|
label,
|
|
11362
11558
|
value: displayValue,
|
|
11363
|
-
placeholder,
|
|
11559
|
+
placeholder: getPlaceholderText(),
|
|
11364
11560
|
errorMessage,
|
|
11365
11561
|
helperMessage,
|
|
11366
11562
|
size,
|
|
@@ -11393,22 +11589,12 @@ var DatePicker = (0, import_react32.forwardRef)((originalProps, ref) => {
|
|
|
11393
11589
|
style: { position: "absolute", top: panelPos.top, left: panelPos.left, zIndex: 1e3 },
|
|
11394
11590
|
onMouseDown: handleCalendarMouseDown,
|
|
11395
11591
|
children: [
|
|
11396
|
-
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className:
|
|
11397
|
-
|
|
11398
|
-
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("
|
|
11399
|
-
|
|
11592
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: dualCalendar ? "flex gap-[10px]" : "flex", children: [
|
|
11593
|
+
renderCalendar(leftCurrentDate, true),
|
|
11594
|
+
dualCalendar && range && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "bg-neutral-soft w-px self-stretch" }),
|
|
11595
|
+
dualCalendar && renderCalendar(rightCurrentDate, false)
|
|
11400
11596
|
] }),
|
|
11401
|
-
/* @__PURE__ */ (0, import_jsx_runtime35.
|
|
11402
|
-
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "grid grid-cols-7 gap-[5px] text-center", children: getCalendarDates().map((week, weekIndex) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_react32.Fragment, { children: week.map((dateObj, index) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
11403
|
-
day_default,
|
|
11404
|
-
{
|
|
11405
|
-
variant: getDayProps(dateObj),
|
|
11406
|
-
onClick: () => handleDateSelect(dateObj.date, dateObj.currentMonth),
|
|
11407
|
-
children: dateObj.date
|
|
11408
|
-
},
|
|
11409
|
-
index
|
|
11410
|
-
)) }, weekIndex)) }),
|
|
11411
|
-
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "flex justify-between px-[10px]", children: [
|
|
11597
|
+
/* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "flex h-[30px] justify-between px-[10px]", children: [
|
|
11412
11598
|
/* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
|
|
11413
11599
|
text_button_default,
|
|
11414
11600
|
{
|
|
@@ -11454,13 +11640,11 @@ var datePickerStyle = tv({
|
|
|
11454
11640
|
"rounded-xl",
|
|
11455
11641
|
"bg-body-background",
|
|
11456
11642
|
"shadow-drop-xl",
|
|
11457
|
-
"gap-[5px]",
|
|
11458
11643
|
"overflow-auto",
|
|
11459
|
-
"w-[300px]",
|
|
11460
11644
|
"select-none",
|
|
11461
11645
|
"p-[10px]"
|
|
11462
11646
|
],
|
|
11463
|
-
calendarHead: ["calendar-header", "flex", "items-center", "justify-between", "h-[40px]"],
|
|
11647
|
+
calendarHead: ["calendar-header", "flex", "items-center", "justify-between", "h-[40px]", "w-[280px]"],
|
|
11464
11648
|
inputBase: [],
|
|
11465
11649
|
inputWrapper: [],
|
|
11466
11650
|
input: [],
|
|
@@ -11472,13 +11656,19 @@ var datePickerStyle = tv({
|
|
|
11472
11656
|
color: { primary: {}, secondary: {} },
|
|
11473
11657
|
size: { sm: {}, md: {}, lg: {}, xl: {} },
|
|
11474
11658
|
full: { true: { base: ["w-full"] } },
|
|
11475
|
-
disabled: { true: { base: ["pointer-events-none"] } }
|
|
11659
|
+
disabled: { true: { base: ["pointer-events-none"] } },
|
|
11660
|
+
dualCalendar: {
|
|
11661
|
+
true: { calendarWrapper: ["w-fit", "gap-[10px]"] },
|
|
11662
|
+
false: { calendarWrapper: ["w-[300px]", "gap-[5px]"] }
|
|
11663
|
+
}
|
|
11476
11664
|
},
|
|
11477
11665
|
defaultVariants: {
|
|
11478
11666
|
color: "primary",
|
|
11479
11667
|
size: "md",
|
|
11480
11668
|
full: false,
|
|
11481
|
-
disabled: false
|
|
11669
|
+
disabled: false,
|
|
11670
|
+
range: false,
|
|
11671
|
+
dualCalendar: false
|
|
11482
11672
|
}
|
|
11483
11673
|
});
|
|
11484
11674
|
|
|
@@ -12945,6 +13135,91 @@ var radarChartStyle = tv({
|
|
|
12945
13135
|
color: "primary"
|
|
12946
13136
|
}
|
|
12947
13137
|
});
|
|
13138
|
+
|
|
13139
|
+
// src/components/starRating/starRating.tsx
|
|
13140
|
+
var import_react42 = require("react");
|
|
13141
|
+
var import_jsx_runtime45 = require("react/jsx-runtime");
|
|
13142
|
+
var StarRating = (0, import_react42.forwardRef)((originalProps, ref) => {
|
|
13143
|
+
const [props, variantProps] = mapPropsVariants(originalProps, starRatingStyle.variantKeys);
|
|
13144
|
+
const {
|
|
13145
|
+
stars,
|
|
13146
|
+
size,
|
|
13147
|
+
value,
|
|
13148
|
+
onChange,
|
|
13149
|
+
readOnly = false,
|
|
13150
|
+
allowHalf = false,
|
|
13151
|
+
classNames,
|
|
13152
|
+
filledColor = "text-primary-main",
|
|
13153
|
+
emptyColor = "text-neutral-light"
|
|
13154
|
+
} = { ...props, ...variantProps };
|
|
13155
|
+
const slots = (0, import_react42.useMemo)(() => starRatingStyle({ ...variantProps }), [variantProps]);
|
|
13156
|
+
const [hoverRating, setHoverRating] = (0, import_react42.useState)(0);
|
|
13157
|
+
const handleStarClick = (starIndex, isHalf = false) => {
|
|
13158
|
+
if (readOnly || !onChange) return;
|
|
13159
|
+
const newRating = allowHalf && isHalf ? starIndex - 0.5 : starIndex;
|
|
13160
|
+
onChange(newRating);
|
|
13161
|
+
};
|
|
13162
|
+
const handleStarHover = (starIndex, isHalf = false) => {
|
|
13163
|
+
if (readOnly) return;
|
|
13164
|
+
const newHoverRating = allowHalf && isHalf ? starIndex - 0.5 : starIndex;
|
|
13165
|
+
setHoverRating(newHoverRating);
|
|
13166
|
+
};
|
|
13167
|
+
const handleMouseLeave = () => {
|
|
13168
|
+
if (readOnly) return;
|
|
13169
|
+
setHoverRating(0);
|
|
13170
|
+
};
|
|
13171
|
+
const createRange = (n) => {
|
|
13172
|
+
return Array.from({ length: n }, (_, i) => i + 1);
|
|
13173
|
+
};
|
|
13174
|
+
const renderStar = (starIndex) => {
|
|
13175
|
+
const currentRating = readOnly ? value : hoverRating || value;
|
|
13176
|
+
const isFull = currentRating >= starIndex;
|
|
13177
|
+
const isHalf = allowHalf && currentRating >= starIndex - 0.5 && currentRating < starIndex;
|
|
13178
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: slots.starWrapper({ class: classNames == null ? void 0 : classNames.starWrapper }), children: [
|
|
13179
|
+
!readOnly && /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_jsx_runtime45.Fragment, { children: [
|
|
13180
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
13181
|
+
"div",
|
|
13182
|
+
{
|
|
13183
|
+
className: slots.star({ class: classNames == null ? void 0 : classNames.star }),
|
|
13184
|
+
onClick: () => handleStarClick(starIndex),
|
|
13185
|
+
onMouseEnter: () => handleStarHover(starIndex)
|
|
13186
|
+
}
|
|
13187
|
+
),
|
|
13188
|
+
allowHalf && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
13189
|
+
"div",
|
|
13190
|
+
{
|
|
13191
|
+
className: slots.starHalf({ class: classNames == null ? void 0 : classNames.starHalf }),
|
|
13192
|
+
onClick: () => handleStarClick(starIndex, true),
|
|
13193
|
+
onMouseEnter: () => handleStarHover(starIndex, true)
|
|
13194
|
+
}
|
|
13195
|
+
)
|
|
13196
|
+
] }),
|
|
13197
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { children: isHalf ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Icon_default, { name: "halfStar", className: filledColor, size }) : /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Icon_default, { name: "star", fill: isFull, className: isFull ? filledColor : emptyColor, size }) })
|
|
13198
|
+
] }, starIndex);
|
|
13199
|
+
};
|
|
13200
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { ref, className: slots.base({ class: classNames == null ? void 0 : classNames.base }), onMouseLeave: handleMouseLeave, children: createRange(stars).map(renderStar) });
|
|
13201
|
+
});
|
|
13202
|
+
StarRating.displayName = "StarRating";
|
|
13203
|
+
var starRating_default = StarRating;
|
|
13204
|
+
var starRatingStyle = tv({
|
|
13205
|
+
slots: {
|
|
13206
|
+
base: ["flex", "items-center"],
|
|
13207
|
+
starWrapper: ["relative", "inline-block"],
|
|
13208
|
+
star: ["absolute", "inset-0", "z-10", "h-full", "w-full", "cursor-pointer"],
|
|
13209
|
+
starHalf: ["absolute", "left-0", "top-0", "z-20", "h-full", "w-1/2", "cursor-pointer"]
|
|
13210
|
+
},
|
|
13211
|
+
variants: {
|
|
13212
|
+
size: {
|
|
13213
|
+
sm: {},
|
|
13214
|
+
md: {},
|
|
13215
|
+
lg: {},
|
|
13216
|
+
xl: {}
|
|
13217
|
+
}
|
|
13218
|
+
},
|
|
13219
|
+
defaultVariants: {
|
|
13220
|
+
size: "xl"
|
|
13221
|
+
}
|
|
13222
|
+
});
|
|
12948
13223
|
// Annotate the CommonJS export names for ESM import in node:
|
|
12949
13224
|
0 && (module.exports = {
|
|
12950
13225
|
Accordion,
|
|
@@ -12977,6 +13252,7 @@ var radarChartStyle = tv({
|
|
|
12977
13252
|
ScrollArea,
|
|
12978
13253
|
Select,
|
|
12979
13254
|
Skeleton,
|
|
13255
|
+
StarRating,
|
|
12980
13256
|
Switch,
|
|
12981
13257
|
Table,
|
|
12982
13258
|
Tabs,
|