@marcoschwartz/lite-ui 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +21 -1
- package/dist/index.d.ts +21 -1
- package/dist/index.js +466 -289
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +446 -270
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -66,6 +66,7 @@ __export(index_exports, {
|
|
|
66
66
|
MenuIcon: () => MenuIcon,
|
|
67
67
|
Modal: () => Modal,
|
|
68
68
|
Navbar: () => Navbar,
|
|
69
|
+
NumberInput: () => NumberInput,
|
|
69
70
|
Pagination: () => Pagination,
|
|
70
71
|
PlusIcon: () => PlusIcon,
|
|
71
72
|
ProgressBar: () => ProgressBar,
|
|
@@ -818,6 +819,7 @@ var AppShell = ({
|
|
|
818
819
|
const [isMobileNavbarOpen, setIsMobileNavbarOpen] = (0, import_react5.useState)(defaultNavbarOpen);
|
|
819
820
|
const navbarWidth = navbar?.width || "md";
|
|
820
821
|
const navbarBreakpoint = navbar?.breakpoint || "md";
|
|
822
|
+
const navbarPosition = navbar?.position || "side";
|
|
821
823
|
const widthClass = widthClasses2[navbarWidth];
|
|
822
824
|
const breakpoint = breakpointClasses[navbarBreakpoint];
|
|
823
825
|
if (!responsive && navbar) {
|
|
@@ -835,6 +837,51 @@ var AppShell = ({
|
|
|
835
837
|
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("main", { className: "flex-1 overflow-y-auto", children })
|
|
836
838
|
] });
|
|
837
839
|
}
|
|
840
|
+
if (navbar && navbarPosition === "top") {
|
|
841
|
+
const mobileMenuClass = navbarBreakpoint === "sm" ? "sm:hidden" : navbarBreakpoint === "md" ? "md:hidden" : navbarBreakpoint === "lg" ? "lg:hidden" : "xl:hidden";
|
|
842
|
+
const desktopNavClass = navbarBreakpoint === "sm" ? "sm:flex" : navbarBreakpoint === "md" ? "md:flex" : navbarBreakpoint === "lg" ? "lg:flex" : "xl:flex";
|
|
843
|
+
return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: `min-h-screen flex flex-col bg-gray-50 dark:bg-gray-900 ${className}`, children: [
|
|
844
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("nav", { className: "sticky top-0 z-30 bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "flex justify-between items-center h-16", children: [
|
|
845
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "flex items-center", children: navbarLogo ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { children: navbarLogo }) : navbarTitle ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "text-xl font-bold text-gray-900 dark:text-gray-100", children: navbarTitle }) : null }),
|
|
846
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: `hidden ${desktopNavClass} items-center gap-6`, children: navbar.content }),
|
|
847
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
848
|
+
"button",
|
|
849
|
+
{
|
|
850
|
+
className: `${mobileMenuClass} p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors`,
|
|
851
|
+
onClick: () => setIsMobileNavbarOpen(!isMobileNavbarOpen),
|
|
852
|
+
"aria-label": "Toggle menu",
|
|
853
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(MenuIcon, { size: "md" })
|
|
854
|
+
}
|
|
855
|
+
)
|
|
856
|
+
] }) }) }),
|
|
857
|
+
header && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "w-full", children: header }),
|
|
858
|
+
isMobileNavbarOpen && /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_jsx_runtime38.Fragment, { children: [
|
|
859
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
860
|
+
"div",
|
|
861
|
+
{
|
|
862
|
+
className: `${mobileMenuClass} fixed inset-0 z-40 bg-black/60 backdrop-blur-sm animate-in fade-in duration-200`,
|
|
863
|
+
onClick: () => setIsMobileNavbarOpen(false)
|
|
864
|
+
}
|
|
865
|
+
),
|
|
866
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: `${mobileMenuClass} fixed left-0 top-0 bottom-0 z-50 w-64 bg-white dark:bg-gray-800 shadow-2xl animate-in slide-in-from-left duration-300`, children: [
|
|
867
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "p-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between", children: [
|
|
868
|
+
navbarLogo ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { children: navbarLogo }) : navbarTitle ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "text-xl font-bold text-gray-900 dark:text-gray-100", children: navbarTitle }) : null,
|
|
869
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
|
|
870
|
+
"button",
|
|
871
|
+
{
|
|
872
|
+
className: "p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors",
|
|
873
|
+
onClick: () => setIsMobileNavbarOpen(false),
|
|
874
|
+
"aria-label": "Close menu",
|
|
875
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("svg", { className: "w-6 h-6", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
|
|
876
|
+
}
|
|
877
|
+
)
|
|
878
|
+
] }),
|
|
879
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "p-4 flex flex-col gap-4", children: navbar.content })
|
|
880
|
+
] })
|
|
881
|
+
] }),
|
|
882
|
+
/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("main", { className: "flex-1 overflow-y-auto", children })
|
|
883
|
+
] });
|
|
884
|
+
}
|
|
838
885
|
if (navbar) {
|
|
839
886
|
const mobileHeaderClass = navbarBreakpoint === "sm" ? "sm:hidden" : navbarBreakpoint === "md" ? "md:hidden" : navbarBreakpoint === "lg" ? "lg:hidden" : "xl:hidden";
|
|
840
887
|
const desktopNavbarClass = navbarBreakpoint === "sm" ? "sm:block" : navbarBreakpoint === "md" ? "md:block" : navbarBreakpoint === "lg" ? "lg:block" : "xl:block";
|
|
@@ -1037,25 +1084,154 @@ var TextInput = (0, import_react7.forwardRef)(
|
|
|
1037
1084
|
);
|
|
1038
1085
|
TextInput.displayName = "TextInput";
|
|
1039
1086
|
|
|
1040
|
-
// src/components/
|
|
1087
|
+
// src/components/NumberInput.tsx
|
|
1041
1088
|
var import_react8 = require("react");
|
|
1042
|
-
var import_react_dom = require("react-dom");
|
|
1043
1089
|
var import_jsx_runtime41 = require("react/jsx-runtime");
|
|
1090
|
+
var sizeClasses5 = {
|
|
1091
|
+
sm: "px-3 py-1.5 text-sm",
|
|
1092
|
+
md: "px-4 py-2.5 text-base",
|
|
1093
|
+
lg: "px-4 py-3 text-lg"
|
|
1094
|
+
};
|
|
1095
|
+
var NumberInput = ({
|
|
1096
|
+
label,
|
|
1097
|
+
error,
|
|
1098
|
+
helperText,
|
|
1099
|
+
value,
|
|
1100
|
+
onChange,
|
|
1101
|
+
min,
|
|
1102
|
+
max,
|
|
1103
|
+
step = 1,
|
|
1104
|
+
precision,
|
|
1105
|
+
disabled = false,
|
|
1106
|
+
hideControls = false,
|
|
1107
|
+
size = "md",
|
|
1108
|
+
fullWidth = false,
|
|
1109
|
+
placeholder,
|
|
1110
|
+
className = ""
|
|
1111
|
+
}) => {
|
|
1112
|
+
const { theme } = useTheme();
|
|
1113
|
+
const inputRef = (0, import_react8.useRef)(null);
|
|
1114
|
+
const [isFocused, setIsFocused] = (0, import_react8.useState)(false);
|
|
1115
|
+
const clampValue = (val) => {
|
|
1116
|
+
let clamped = val;
|
|
1117
|
+
if (min !== void 0 && clamped < min) clamped = min;
|
|
1118
|
+
if (max !== void 0 && clamped > max) clamped = max;
|
|
1119
|
+
if (precision !== void 0) {
|
|
1120
|
+
clamped = parseFloat(clamped.toFixed(precision));
|
|
1121
|
+
}
|
|
1122
|
+
return clamped;
|
|
1123
|
+
};
|
|
1124
|
+
const handleIncrement = () => {
|
|
1125
|
+
if (disabled) return;
|
|
1126
|
+
const currentValue = value ?? 0;
|
|
1127
|
+
const newValue = clampValue(currentValue + step);
|
|
1128
|
+
onChange?.(newValue);
|
|
1129
|
+
};
|
|
1130
|
+
const handleDecrement = () => {
|
|
1131
|
+
if (disabled) return;
|
|
1132
|
+
const currentValue = value ?? 0;
|
|
1133
|
+
const newValue = clampValue(currentValue - step);
|
|
1134
|
+
onChange?.(newValue);
|
|
1135
|
+
};
|
|
1136
|
+
const handleInputChange = (e) => {
|
|
1137
|
+
const inputValue = e.target.value;
|
|
1138
|
+
if (inputValue === "" || inputValue === "-") {
|
|
1139
|
+
onChange?.(void 0);
|
|
1140
|
+
return;
|
|
1141
|
+
}
|
|
1142
|
+
const numValue = parseFloat(inputValue);
|
|
1143
|
+
if (!isNaN(numValue)) {
|
|
1144
|
+
const clamped = clampValue(numValue);
|
|
1145
|
+
onChange?.(clamped);
|
|
1146
|
+
}
|
|
1147
|
+
};
|
|
1148
|
+
const handleKeyDown = (e) => {
|
|
1149
|
+
if (e.key === "ArrowUp") {
|
|
1150
|
+
e.preventDefault();
|
|
1151
|
+
handleIncrement();
|
|
1152
|
+
} else if (e.key === "ArrowDown") {
|
|
1153
|
+
e.preventDefault();
|
|
1154
|
+
handleDecrement();
|
|
1155
|
+
}
|
|
1156
|
+
};
|
|
1157
|
+
const baseStyles = "w-full appearance-none rounded-lg border border-gray-300 bg-white text-gray-900 transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500";
|
|
1158
|
+
const sizeStyle = sizeClasses5[size];
|
|
1159
|
+
const errorStyles = error ? "border-red-500 focus:ring-red-500 dark:border-red-500" : "";
|
|
1160
|
+
const disabledStyles = disabled ? "opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900" : "";
|
|
1161
|
+
const widthStyle = fullWidth ? "w-full" : "";
|
|
1162
|
+
const paddingWithControls = !hideControls ? "pr-8" : "";
|
|
1163
|
+
const displayValue = value !== void 0 ? value.toString() : "";
|
|
1164
|
+
return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: `${widthStyle} ${className}`, children: [
|
|
1165
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", children: label }),
|
|
1166
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "relative", children: [
|
|
1167
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
1168
|
+
"input",
|
|
1169
|
+
{
|
|
1170
|
+
ref: inputRef,
|
|
1171
|
+
type: "number",
|
|
1172
|
+
value: displayValue,
|
|
1173
|
+
onChange: handleInputChange,
|
|
1174
|
+
onKeyDown: handleKeyDown,
|
|
1175
|
+
onFocus: () => setIsFocused(true),
|
|
1176
|
+
onBlur: () => setIsFocused(false),
|
|
1177
|
+
disabled,
|
|
1178
|
+
placeholder,
|
|
1179
|
+
min,
|
|
1180
|
+
max,
|
|
1181
|
+
step,
|
|
1182
|
+
className: `${baseStyles} ${sizeStyle} ${errorStyles} ${disabledStyles} ${paddingWithControls} [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none`.trim()
|
|
1183
|
+
}
|
|
1184
|
+
),
|
|
1185
|
+
!hideControls && /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "absolute right-1 top-1/2 -translate-y-1/2 flex flex-col", children: [
|
|
1186
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
1187
|
+
"button",
|
|
1188
|
+
{
|
|
1189
|
+
type: "button",
|
|
1190
|
+
onClick: handleIncrement,
|
|
1191
|
+
disabled: disabled || max !== void 0 && value !== void 0 && value >= max,
|
|
1192
|
+
className: "px-2 py-0.5 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors disabled:opacity-30 disabled:cursor-not-allowed",
|
|
1193
|
+
tabIndex: -1,
|
|
1194
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("svg", { className: "w-3 h-3 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 3, d: "M5 15l7-7 7 7" }) })
|
|
1195
|
+
}
|
|
1196
|
+
),
|
|
1197
|
+
/* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
|
|
1198
|
+
"button",
|
|
1199
|
+
{
|
|
1200
|
+
type: "button",
|
|
1201
|
+
onClick: handleDecrement,
|
|
1202
|
+
disabled: disabled || min !== void 0 && value !== void 0 && value <= min,
|
|
1203
|
+
className: "px-2 py-0.5 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors disabled:opacity-30 disabled:cursor-not-allowed",
|
|
1204
|
+
tabIndex: -1,
|
|
1205
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("svg", { className: "w-3 h-3 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 3, d: "M19 9l-7 7-7-7" }) })
|
|
1206
|
+
}
|
|
1207
|
+
)
|
|
1208
|
+
] })
|
|
1209
|
+
] }),
|
|
1210
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("p", { className: "mt-1 text-sm text-red-600 dark:text-red-400", children: error }),
|
|
1211
|
+
helperText && !error && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("p", { className: "mt-1 text-sm text-gray-500 dark:text-gray-400", children: helperText })
|
|
1212
|
+
] });
|
|
1213
|
+
};
|
|
1214
|
+
NumberInput.displayName = "NumberInput";
|
|
1215
|
+
|
|
1216
|
+
// src/components/ActionMenu.tsx
|
|
1217
|
+
var import_react9 = require("react");
|
|
1218
|
+
var import_react_dom = require("react-dom");
|
|
1219
|
+
var import_jsx_runtime42 = require("react/jsx-runtime");
|
|
1044
1220
|
var ActionMenu = ({
|
|
1045
1221
|
items,
|
|
1046
1222
|
trigger,
|
|
1047
1223
|
position = "right"
|
|
1048
1224
|
}) => {
|
|
1049
1225
|
const { themeName } = useTheme();
|
|
1050
|
-
const [isOpen, setIsOpen] = (0,
|
|
1051
|
-
const [menuPosition, setMenuPosition] = (0,
|
|
1052
|
-
const [mounted, setMounted] = (0,
|
|
1053
|
-
const menuRef = (0,
|
|
1054
|
-
const triggerRef = (0,
|
|
1055
|
-
(0,
|
|
1226
|
+
const [isOpen, setIsOpen] = (0, import_react9.useState)(false);
|
|
1227
|
+
const [menuPosition, setMenuPosition] = (0, import_react9.useState)(null);
|
|
1228
|
+
const [mounted, setMounted] = (0, import_react9.useState)(false);
|
|
1229
|
+
const menuRef = (0, import_react9.useRef)(null);
|
|
1230
|
+
const triggerRef = (0, import_react9.useRef)(null);
|
|
1231
|
+
(0, import_react9.useEffect)(() => {
|
|
1056
1232
|
setMounted(true);
|
|
1057
1233
|
}, []);
|
|
1058
|
-
(0,
|
|
1234
|
+
(0, import_react9.useEffect)(() => {
|
|
1059
1235
|
const handleClickOutside = (event) => {
|
|
1060
1236
|
if (menuRef.current && !menuRef.current.contains(event.target) && triggerRef.current && !triggerRef.current.contains(event.target)) {
|
|
1061
1237
|
setIsOpen(false);
|
|
@@ -1066,7 +1242,7 @@ var ActionMenu = ({
|
|
|
1066
1242
|
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
1067
1243
|
}
|
|
1068
1244
|
}, [isOpen]);
|
|
1069
|
-
(0,
|
|
1245
|
+
(0, import_react9.useEffect)(() => {
|
|
1070
1246
|
if (isOpen && triggerRef.current) {
|
|
1071
1247
|
const rect = triggerRef.current.getBoundingClientRect();
|
|
1072
1248
|
const menuWidth = 224;
|
|
@@ -1085,17 +1261,17 @@ var ActionMenu = ({
|
|
|
1085
1261
|
setIsOpen(false);
|
|
1086
1262
|
}
|
|
1087
1263
|
};
|
|
1088
|
-
const defaultTrigger = /* @__PURE__ */ (0,
|
|
1264
|
+
const defaultTrigger = /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
1089
1265
|
"button",
|
|
1090
1266
|
{
|
|
1091
1267
|
className: "p-2 rounded-md hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors",
|
|
1092
1268
|
"aria-label": "Open menu",
|
|
1093
|
-
children: /* @__PURE__ */ (0,
|
|
1269
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("svg", { className: "w-5 h-5 text-gray-600 dark:text-gray-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z" }) })
|
|
1094
1270
|
}
|
|
1095
1271
|
);
|
|
1096
1272
|
const menuBaseStyles = themeName === "minimalistic" ? "bg-black border-2 border-white" : "bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 shadow-lg";
|
|
1097
1273
|
const itemBaseStyles = themeName === "minimalistic" ? "text-white hover:bg-white hover:text-black transition-colors duration-200" : "text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors";
|
|
1098
|
-
const menu = isOpen && mounted && menuPosition ? /* @__PURE__ */ (0,
|
|
1274
|
+
const menu = isOpen && mounted && menuPosition ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
1099
1275
|
"div",
|
|
1100
1276
|
{
|
|
1101
1277
|
ref: menuRef,
|
|
@@ -1107,7 +1283,7 @@ var ActionMenu = ({
|
|
|
1107
1283
|
},
|
|
1108
1284
|
children: items.map((item, index) => {
|
|
1109
1285
|
if (item.type === "divider") {
|
|
1110
|
-
return /* @__PURE__ */ (0,
|
|
1286
|
+
return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
|
|
1111
1287
|
"div",
|
|
1112
1288
|
{
|
|
1113
1289
|
className: "my-1 border-t border-gray-200 dark:border-gray-700"
|
|
@@ -1115,15 +1291,15 @@ var ActionMenu = ({
|
|
|
1115
1291
|
index
|
|
1116
1292
|
);
|
|
1117
1293
|
}
|
|
1118
|
-
return /* @__PURE__ */ (0,
|
|
1294
|
+
return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
|
|
1119
1295
|
"button",
|
|
1120
1296
|
{
|
|
1121
1297
|
onClick: () => handleItemClick(item),
|
|
1122
1298
|
disabled: item.disabled,
|
|
1123
1299
|
className: `w-full text-left px-4 py-3 flex items-center gap-3 ${itemBaseStyles} ${item.disabled ? "opacity-50 cursor-not-allowed" : "cursor-pointer"} ${item.variant === "danger" ? "text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20" : ""}`,
|
|
1124
1300
|
children: [
|
|
1125
|
-
item.icon && /* @__PURE__ */ (0,
|
|
1126
|
-
/* @__PURE__ */ (0,
|
|
1301
|
+
item.icon && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "flex-shrink-0", children: item.icon }),
|
|
1302
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "flex-1", children: item.label })
|
|
1127
1303
|
]
|
|
1128
1304
|
},
|
|
1129
1305
|
index
|
|
@@ -1131,14 +1307,14 @@ var ActionMenu = ({
|
|
|
1131
1307
|
})
|
|
1132
1308
|
}
|
|
1133
1309
|
) : null;
|
|
1134
|
-
return /* @__PURE__ */ (0,
|
|
1135
|
-
/* @__PURE__ */ (0,
|
|
1310
|
+
return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
|
|
1311
|
+
/* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "relative inline-block", ref: triggerRef, children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { onClick: () => setIsOpen(!isOpen), children: trigger || defaultTrigger }) }),
|
|
1136
1312
|
mounted && (0, import_react_dom.createPortal)(menu, document.body)
|
|
1137
1313
|
] });
|
|
1138
1314
|
};
|
|
1139
1315
|
|
|
1140
1316
|
// src/components/Card.tsx
|
|
1141
|
-
var
|
|
1317
|
+
var import_jsx_runtime43 = require("react/jsx-runtime");
|
|
1142
1318
|
var paddingClasses = {
|
|
1143
1319
|
none: "",
|
|
1144
1320
|
sm: "p-4",
|
|
@@ -1153,8 +1329,8 @@ var Card = ({
|
|
|
1153
1329
|
}) => {
|
|
1154
1330
|
const { theme } = useTheme();
|
|
1155
1331
|
const paddingClass = paddingClasses[padding];
|
|
1156
|
-
const hoverClass = hover ? "hover:shadow-
|
|
1157
|
-
return /* @__PURE__ */ (0,
|
|
1332
|
+
const hoverClass = hover ? "hover:shadow-xl hover:scale-[1.02] hover:border-blue-400 dark:hover:border-blue-500 cursor-pointer transition-all duration-200 ease-in-out" : "";
|
|
1333
|
+
return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
|
|
1158
1334
|
"div",
|
|
1159
1335
|
{
|
|
1160
1336
|
className: `bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 ${paddingClass} ${hoverClass} ${className}`,
|
|
@@ -1164,7 +1340,7 @@ var Card = ({
|
|
|
1164
1340
|
};
|
|
1165
1341
|
|
|
1166
1342
|
// src/components/Alert.tsx
|
|
1167
|
-
var
|
|
1343
|
+
var import_jsx_runtime44 = require("react/jsx-runtime");
|
|
1168
1344
|
var variantStyles = {
|
|
1169
1345
|
info: "bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800 text-blue-900 dark:text-blue-100",
|
|
1170
1346
|
success: "bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800 text-green-900 dark:text-green-100",
|
|
@@ -1187,38 +1363,38 @@ var Alert = ({
|
|
|
1187
1363
|
const { theme } = useTheme();
|
|
1188
1364
|
const variantClass = variantStyles[variant];
|
|
1189
1365
|
const iconClass = iconStyles[variant];
|
|
1190
|
-
return /* @__PURE__ */ (0,
|
|
1191
|
-
/* @__PURE__ */ (0,
|
|
1192
|
-
variant === "info" && /* @__PURE__ */ (0,
|
|
1193
|
-
variant === "success" && /* @__PURE__ */ (0,
|
|
1194
|
-
variant === "warning" && /* @__PURE__ */ (0,
|
|
1195
|
-
variant === "error" && /* @__PURE__ */ (0,
|
|
1366
|
+
return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: `rounded-lg border p-4 ${variantClass} ${className}`, role: "alert", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "flex items-start gap-3", children: [
|
|
1367
|
+
/* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: `flex-shrink-0 ${iconClass}`, children: [
|
|
1368
|
+
variant === "info" && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z", clipRule: "evenodd" }) }),
|
|
1369
|
+
variant === "success" && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }) }),
|
|
1370
|
+
variant === "warning" && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("path", { fillRule: "evenodd", d: "M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z", clipRule: "evenodd" }) }),
|
|
1371
|
+
variant === "error" && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("svg", { className: "w-5 h-5", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z", clipRule: "evenodd" }) })
|
|
1196
1372
|
] }),
|
|
1197
|
-
/* @__PURE__ */ (0,
|
|
1198
|
-
title && /* @__PURE__ */ (0,
|
|
1199
|
-
/* @__PURE__ */ (0,
|
|
1373
|
+
/* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "flex-1", children: [
|
|
1374
|
+
title && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("h3", { className: "font-semibold mb-1", children: title }),
|
|
1375
|
+
/* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: "text-sm", children })
|
|
1200
1376
|
] }),
|
|
1201
|
-
onClose && /* @__PURE__ */ (0,
|
|
1377
|
+
onClose && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
|
|
1202
1378
|
"button",
|
|
1203
1379
|
{
|
|
1204
1380
|
onClick: onClose,
|
|
1205
1381
|
className: `flex-shrink-0 ${iconClass} hover:opacity-70 transition-opacity`,
|
|
1206
1382
|
"aria-label": "Close alert",
|
|
1207
|
-
children: /* @__PURE__ */ (0,
|
|
1383
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("svg", { className: "w-5 h-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
|
|
1208
1384
|
}
|
|
1209
1385
|
)
|
|
1210
1386
|
] }) });
|
|
1211
1387
|
};
|
|
1212
1388
|
|
|
1213
1389
|
// src/components/Checkbox.tsx
|
|
1214
|
-
var
|
|
1215
|
-
var
|
|
1216
|
-
var Checkbox = (0,
|
|
1390
|
+
var import_react10 = require("react");
|
|
1391
|
+
var import_jsx_runtime45 = require("react/jsx-runtime");
|
|
1392
|
+
var Checkbox = (0, import_react10.forwardRef)(
|
|
1217
1393
|
({ label, error, className = "", disabled, ...props }, ref) => {
|
|
1218
1394
|
const { theme } = useTheme();
|
|
1219
|
-
return /* @__PURE__ */ (0,
|
|
1220
|
-
/* @__PURE__ */ (0,
|
|
1221
|
-
/* @__PURE__ */ (0,
|
|
1395
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className, children: [
|
|
1396
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("label", { className: "flex items-center gap-2 cursor-pointer group", children: [
|
|
1397
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
1222
1398
|
"input",
|
|
1223
1399
|
{
|
|
1224
1400
|
ref,
|
|
@@ -1228,18 +1404,18 @@ var Checkbox = (0, import_react9.forwardRef)(
|
|
|
1228
1404
|
...props
|
|
1229
1405
|
}
|
|
1230
1406
|
),
|
|
1231
|
-
label && /* @__PURE__ */ (0,
|
|
1407
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: `text-sm text-gray-700 dark:text-gray-300 ${disabled ? "opacity-50 cursor-not-allowed" : "group-hover:text-gray-900 dark:group-hover:text-gray-100"}`, children: label })
|
|
1232
1408
|
] }),
|
|
1233
|
-
error && /* @__PURE__ */ (0,
|
|
1409
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "mt-1 text-sm text-red-600 dark:text-red-400", children: error })
|
|
1234
1410
|
] });
|
|
1235
1411
|
}
|
|
1236
1412
|
);
|
|
1237
1413
|
Checkbox.displayName = "Checkbox";
|
|
1238
1414
|
|
|
1239
1415
|
// src/components/Toggle.tsx
|
|
1240
|
-
var
|
|
1241
|
-
var
|
|
1242
|
-
var Toggle = (0,
|
|
1416
|
+
var import_react11 = require("react");
|
|
1417
|
+
var import_jsx_runtime46 = require("react/jsx-runtime");
|
|
1418
|
+
var Toggle = (0, import_react11.forwardRef)(
|
|
1243
1419
|
({ label, size = "md", className = "", disabled, checked, ...props }, ref) => {
|
|
1244
1420
|
const { theme } = useTheme();
|
|
1245
1421
|
const toggleClasses = {
|
|
@@ -1257,9 +1433,9 @@ var Toggle = (0, import_react10.forwardRef)(
|
|
|
1257
1433
|
}
|
|
1258
1434
|
};
|
|
1259
1435
|
const currentSize = toggleClasses[size];
|
|
1260
|
-
return /* @__PURE__ */ (0,
|
|
1261
|
-
/* @__PURE__ */ (0,
|
|
1262
|
-
/* @__PURE__ */ (0,
|
|
1436
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("label", { className: `inline-flex items-center gap-3 cursor-pointer ${disabled ? "opacity-50 cursor-not-allowed" : ""} ${className}`, children: [
|
|
1437
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "relative", children: [
|
|
1438
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
1263
1439
|
"input",
|
|
1264
1440
|
{
|
|
1265
1441
|
ref,
|
|
@@ -1270,27 +1446,27 @@ var Toggle = (0, import_react10.forwardRef)(
|
|
|
1270
1446
|
...props
|
|
1271
1447
|
}
|
|
1272
1448
|
),
|
|
1273
|
-
/* @__PURE__ */ (0,
|
|
1449
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
1274
1450
|
"div",
|
|
1275
1451
|
{
|
|
1276
1452
|
className: `${currentSize.switch} bg-gray-300 dark:bg-gray-700 peer-focus:ring-2 peer-focus:ring-blue-500 rounded-full peer peer-checked:bg-blue-600 dark:peer-checked:bg-blue-500 transition-colors`
|
|
1277
1453
|
}
|
|
1278
1454
|
),
|
|
1279
|
-
/* @__PURE__ */ (0,
|
|
1455
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
1280
1456
|
"div",
|
|
1281
1457
|
{
|
|
1282
1458
|
className: `${currentSize.thumb} bg-white rounded-full shadow-md absolute top-0.5 left-0.5 transition-transform`
|
|
1283
1459
|
}
|
|
1284
1460
|
)
|
|
1285
1461
|
] }),
|
|
1286
|
-
label && /* @__PURE__ */ (0,
|
|
1462
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: label })
|
|
1287
1463
|
] });
|
|
1288
1464
|
}
|
|
1289
1465
|
);
|
|
1290
1466
|
Toggle.displayName = "Toggle";
|
|
1291
1467
|
|
|
1292
1468
|
// src/components/Badge.tsx
|
|
1293
|
-
var
|
|
1469
|
+
var import_jsx_runtime47 = require("react/jsx-runtime");
|
|
1294
1470
|
var variantStyles2 = {
|
|
1295
1471
|
default: "bg-gray-100 dark:bg-gray-700 text-gray-800 dark:text-gray-200",
|
|
1296
1472
|
primary: "bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-200",
|
|
@@ -1313,12 +1489,12 @@ var Badge = ({
|
|
|
1313
1489
|
const { theme } = useTheme();
|
|
1314
1490
|
const variantClass = variantStyles2[variant];
|
|
1315
1491
|
const sizeClass = sizeStyles[size];
|
|
1316
|
-
return /* @__PURE__ */ (0,
|
|
1492
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: `inline-flex items-center font-medium rounded-full ${variantClass} ${sizeClass} ${className}`, children });
|
|
1317
1493
|
};
|
|
1318
1494
|
|
|
1319
1495
|
// src/components/Spinner.tsx
|
|
1320
|
-
var
|
|
1321
|
-
var
|
|
1496
|
+
var import_jsx_runtime48 = require("react/jsx-runtime");
|
|
1497
|
+
var sizeClasses6 = {
|
|
1322
1498
|
sm: "w-4 h-4 border-2",
|
|
1323
1499
|
md: "w-8 h-8 border-2",
|
|
1324
1500
|
lg: "w-12 h-12 border-3",
|
|
@@ -1335,22 +1511,22 @@ var Spinner = ({
|
|
|
1335
1511
|
className = ""
|
|
1336
1512
|
}) => {
|
|
1337
1513
|
const { theme } = useTheme();
|
|
1338
|
-
const sizeClass =
|
|
1514
|
+
const sizeClass = sizeClasses6[size];
|
|
1339
1515
|
const colorClass = colorClasses[color];
|
|
1340
|
-
return /* @__PURE__ */ (0,
|
|
1516
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
1341
1517
|
"div",
|
|
1342
1518
|
{
|
|
1343
1519
|
className: `inline-block rounded-full animate-spin ${sizeClass} ${colorClass} ${className}`,
|
|
1344
1520
|
role: "status",
|
|
1345
1521
|
"aria-label": "Loading",
|
|
1346
|
-
children: /* @__PURE__ */ (0,
|
|
1522
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "sr-only", children: "Loading..." })
|
|
1347
1523
|
}
|
|
1348
1524
|
);
|
|
1349
1525
|
};
|
|
1350
1526
|
|
|
1351
1527
|
// src/components/Tabs.tsx
|
|
1352
|
-
var
|
|
1353
|
-
var
|
|
1528
|
+
var import_react12 = require("react");
|
|
1529
|
+
var import_jsx_runtime49 = require("react/jsx-runtime");
|
|
1354
1530
|
var Tabs = ({
|
|
1355
1531
|
tabs,
|
|
1356
1532
|
defaultIndex = 0,
|
|
@@ -1358,14 +1534,14 @@ var Tabs = ({
|
|
|
1358
1534
|
className = ""
|
|
1359
1535
|
}) => {
|
|
1360
1536
|
const { theme } = useTheme();
|
|
1361
|
-
const [activeIndex, setActiveIndex] = (0,
|
|
1537
|
+
const [activeIndex, setActiveIndex] = (0, import_react12.useState)(defaultIndex);
|
|
1362
1538
|
const handleTabClick = (index) => {
|
|
1363
1539
|
if (tabs[index].disabled) return;
|
|
1364
1540
|
setActiveIndex(index);
|
|
1365
1541
|
onChange?.(index);
|
|
1366
1542
|
};
|
|
1367
|
-
return /* @__PURE__ */ (0,
|
|
1368
|
-
/* @__PURE__ */ (0,
|
|
1543
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className, children: [
|
|
1544
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "border-b border-gray-200 dark:border-gray-700", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("nav", { className: "flex gap-8 px-6", "aria-label": "Tabs", children: tabs.map((tab, index) => /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
1369
1545
|
"button",
|
|
1370
1546
|
{
|
|
1371
1547
|
onClick: () => handleTabClick(index),
|
|
@@ -1376,12 +1552,12 @@ var Tabs = ({
|
|
|
1376
1552
|
},
|
|
1377
1553
|
index
|
|
1378
1554
|
)) }) }),
|
|
1379
|
-
/* @__PURE__ */ (0,
|
|
1555
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { children: tabs[activeIndex]?.content })
|
|
1380
1556
|
] });
|
|
1381
1557
|
};
|
|
1382
1558
|
|
|
1383
1559
|
// src/components/Table.tsx
|
|
1384
|
-
var
|
|
1560
|
+
var import_jsx_runtime50 = require("react/jsx-runtime");
|
|
1385
1561
|
function Table({
|
|
1386
1562
|
columns,
|
|
1387
1563
|
data,
|
|
@@ -1391,11 +1567,11 @@ function Table({
|
|
|
1391
1567
|
className = ""
|
|
1392
1568
|
}) {
|
|
1393
1569
|
const { theme } = useTheme();
|
|
1394
|
-
return /* @__PURE__ */ (0,
|
|
1395
|
-
/* @__PURE__ */ (0,
|
|
1396
|
-
/* @__PURE__ */ (0,
|
|
1570
|
+
return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("div", { className: `overflow-x-auto ${className}`, children: [
|
|
1571
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("table", { className: "w-full text-left", children: [
|
|
1572
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)("thead", { className: "bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700", children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("tr", { children: columns.map((column, colIndex) => {
|
|
1397
1573
|
const isLast = colIndex === columns.length - 1;
|
|
1398
|
-
return /* @__PURE__ */ (0,
|
|
1574
|
+
return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
|
|
1399
1575
|
"th",
|
|
1400
1576
|
{
|
|
1401
1577
|
className: isLast ? "px-6 py-3 text-xs font-medium text-gray-700 dark:text-gray-300 uppercase tracking-wider relative" : "px-6 py-3 text-xs font-medium text-gray-700 dark:text-gray-300 uppercase tracking-wider",
|
|
@@ -1405,18 +1581,18 @@ function Table({
|
|
|
1405
1581
|
column.key
|
|
1406
1582
|
);
|
|
1407
1583
|
}) }) }),
|
|
1408
|
-
/* @__PURE__ */ (0,
|
|
1584
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)("tbody", { className: "bg-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-700", children: data.map((row, rowIndex) => {
|
|
1409
1585
|
const rowClasses = [
|
|
1410
1586
|
striped && rowIndex % 2 === 1 ? "bg-gray-50 dark:bg-gray-800/50" : "",
|
|
1411
1587
|
hoverable ? "hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors" : ""
|
|
1412
1588
|
].filter(Boolean).join(" ");
|
|
1413
|
-
return /* @__PURE__ */ (0,
|
|
1589
|
+
return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
|
|
1414
1590
|
"tr",
|
|
1415
1591
|
{
|
|
1416
1592
|
className: rowClasses,
|
|
1417
1593
|
children: columns.map((column, colIndex) => {
|
|
1418
1594
|
const isLast = colIndex === columns.length - 1;
|
|
1419
|
-
return /* @__PURE__ */ (0,
|
|
1595
|
+
return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
|
|
1420
1596
|
"td",
|
|
1421
1597
|
{
|
|
1422
1598
|
className: isLast ? "px-6 py-4 text-sm text-gray-900 dark:text-gray-100 overflow-visible" : "px-6 py-4 text-sm text-gray-900 dark:text-gray-100",
|
|
@@ -1430,12 +1606,12 @@ function Table({
|
|
|
1430
1606
|
);
|
|
1431
1607
|
}) })
|
|
1432
1608
|
] }),
|
|
1433
|
-
data.length === 0 && /* @__PURE__ */ (0,
|
|
1609
|
+
data.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "text-center py-8 text-gray-500 dark:text-gray-400", children: "No data available" })
|
|
1434
1610
|
] });
|
|
1435
1611
|
}
|
|
1436
1612
|
|
|
1437
1613
|
// src/components/Pagination.tsx
|
|
1438
|
-
var
|
|
1614
|
+
var import_jsx_runtime51 = require("react/jsx-runtime");
|
|
1439
1615
|
var Pagination = ({
|
|
1440
1616
|
currentPage,
|
|
1441
1617
|
totalPages,
|
|
@@ -1476,8 +1652,8 @@ var Pagination = ({
|
|
|
1476
1652
|
return range(1, totalPages);
|
|
1477
1653
|
};
|
|
1478
1654
|
const pages = paginationRange();
|
|
1479
|
-
return /* @__PURE__ */ (0,
|
|
1480
|
-
/* @__PURE__ */ (0,
|
|
1655
|
+
return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("nav", { className: `flex items-center gap-1 ${className}`, "aria-label": "Pagination", children: [
|
|
1656
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
1481
1657
|
"button",
|
|
1482
1658
|
{
|
|
1483
1659
|
onClick: () => onPageChange(currentPage - 1),
|
|
@@ -1489,7 +1665,7 @@ var Pagination = ({
|
|
|
1489
1665
|
),
|
|
1490
1666
|
pages.map((page, index) => {
|
|
1491
1667
|
if (page === "...") {
|
|
1492
|
-
return /* @__PURE__ */ (0,
|
|
1668
|
+
return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
1493
1669
|
"span",
|
|
1494
1670
|
{
|
|
1495
1671
|
className: "px-3 py-2 text-gray-700 dark:text-gray-300",
|
|
@@ -1498,7 +1674,7 @@ var Pagination = ({
|
|
|
1498
1674
|
`dots-${index}`
|
|
1499
1675
|
);
|
|
1500
1676
|
}
|
|
1501
|
-
return /* @__PURE__ */ (0,
|
|
1677
|
+
return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
1502
1678
|
"button",
|
|
1503
1679
|
{
|
|
1504
1680
|
onClick: () => onPageChange(page),
|
|
@@ -1510,7 +1686,7 @@ var Pagination = ({
|
|
|
1510
1686
|
page
|
|
1511
1687
|
);
|
|
1512
1688
|
}),
|
|
1513
|
-
/* @__PURE__ */ (0,
|
|
1689
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
1514
1690
|
"button",
|
|
1515
1691
|
{
|
|
1516
1692
|
onClick: () => onPageChange(currentPage + 1),
|
|
@@ -1524,9 +1700,9 @@ var Pagination = ({
|
|
|
1524
1700
|
};
|
|
1525
1701
|
|
|
1526
1702
|
// src/components/DatePicker.tsx
|
|
1527
|
-
var
|
|
1703
|
+
var import_react13 = require("react");
|
|
1528
1704
|
var import_react_dom2 = require("react-dom");
|
|
1529
|
-
var
|
|
1705
|
+
var import_jsx_runtime52 = require("react/jsx-runtime");
|
|
1530
1706
|
var DAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
1531
1707
|
var MONTHS = [
|
|
1532
1708
|
"January",
|
|
@@ -1555,16 +1731,16 @@ var DatePicker = ({
|
|
|
1555
1731
|
placeholder = "Select date..."
|
|
1556
1732
|
}) => {
|
|
1557
1733
|
const { theme } = useTheme();
|
|
1558
|
-
const [isOpen, setIsOpen] = (0,
|
|
1559
|
-
const [viewDate, setViewDate] = (0,
|
|
1560
|
-
const [mounted, setMounted] = (0,
|
|
1561
|
-
const [calendarPosition, setCalendarPosition] = (0,
|
|
1562
|
-
const inputRef = (0,
|
|
1563
|
-
const calendarRef = (0,
|
|
1564
|
-
(0,
|
|
1734
|
+
const [isOpen, setIsOpen] = (0, import_react13.useState)(false);
|
|
1735
|
+
const [viewDate, setViewDate] = (0, import_react13.useState)(value || /* @__PURE__ */ new Date());
|
|
1736
|
+
const [mounted, setMounted] = (0, import_react13.useState)(false);
|
|
1737
|
+
const [calendarPosition, setCalendarPosition] = (0, import_react13.useState)(null);
|
|
1738
|
+
const inputRef = (0, import_react13.useRef)(null);
|
|
1739
|
+
const calendarRef = (0, import_react13.useRef)(null);
|
|
1740
|
+
(0, import_react13.useEffect)(() => {
|
|
1565
1741
|
setMounted(true);
|
|
1566
1742
|
}, []);
|
|
1567
|
-
(0,
|
|
1743
|
+
(0, import_react13.useEffect)(() => {
|
|
1568
1744
|
const handleClickOutside = (event) => {
|
|
1569
1745
|
if (calendarRef.current && !calendarRef.current.contains(event.target) && inputRef.current && !inputRef.current.contains(event.target)) {
|
|
1570
1746
|
setIsOpen(false);
|
|
@@ -1575,7 +1751,7 @@ var DatePicker = ({
|
|
|
1575
1751
|
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
1576
1752
|
}
|
|
1577
1753
|
}, [isOpen]);
|
|
1578
|
-
(0,
|
|
1754
|
+
(0, import_react13.useEffect)(() => {
|
|
1579
1755
|
if (isOpen && inputRef.current) {
|
|
1580
1756
|
const rect = inputRef.current.getBoundingClientRect();
|
|
1581
1757
|
setCalendarPosition({
|
|
@@ -1647,7 +1823,7 @@ var DatePicker = ({
|
|
|
1647
1823
|
const baseStyles = "w-full appearance-none rounded-lg border border-gray-300 bg-white text-gray-900 px-4 py-2.5 text-base transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500 cursor-pointer";
|
|
1648
1824
|
const errorStyles = error ? "border-red-500 focus:ring-red-500 dark:border-red-500" : "";
|
|
1649
1825
|
const disabledStyles = disabled ? "opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900" : "";
|
|
1650
|
-
const calendar = isOpen && mounted && calendarPosition ? /* @__PURE__ */ (0,
|
|
1826
|
+
const calendar = isOpen && mounted && calendarPosition ? /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
|
|
1651
1827
|
"div",
|
|
1652
1828
|
{
|
|
1653
1829
|
ref: calendarRef,
|
|
@@ -1658,23 +1834,23 @@ var DatePicker = ({
|
|
|
1658
1834
|
minWidth: "320px"
|
|
1659
1835
|
},
|
|
1660
1836
|
children: [
|
|
1661
|
-
/* @__PURE__ */ (0,
|
|
1662
|
-
/* @__PURE__ */ (0,
|
|
1837
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { className: "flex items-center justify-between mb-4", children: [
|
|
1838
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
1663
1839
|
"button",
|
|
1664
1840
|
{
|
|
1665
1841
|
onClick: handlePrevMonth,
|
|
1666
1842
|
className: "p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors",
|
|
1667
1843
|
"aria-label": "Previous month",
|
|
1668
|
-
children: /* @__PURE__ */ (0,
|
|
1844
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("svg", { className: "w-5 h-5 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 19l-7-7 7-7" }) })
|
|
1669
1845
|
}
|
|
1670
1846
|
),
|
|
1671
|
-
/* @__PURE__ */ (0,
|
|
1672
|
-
/* @__PURE__ */ (0,
|
|
1847
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
1848
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("h2", { className: "text-base font-semibold text-gray-900 dark:text-gray-100", children: [
|
|
1673
1849
|
MONTHS[month],
|
|
1674
1850
|
" ",
|
|
1675
1851
|
year
|
|
1676
1852
|
] }),
|
|
1677
|
-
/* @__PURE__ */ (0,
|
|
1853
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
1678
1854
|
"button",
|
|
1679
1855
|
{
|
|
1680
1856
|
onClick: handleToday,
|
|
@@ -1683,23 +1859,23 @@ var DatePicker = ({
|
|
|
1683
1859
|
}
|
|
1684
1860
|
)
|
|
1685
1861
|
] }),
|
|
1686
|
-
/* @__PURE__ */ (0,
|
|
1862
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
1687
1863
|
"button",
|
|
1688
1864
|
{
|
|
1689
1865
|
onClick: handleNextMonth,
|
|
1690
1866
|
className: "p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors",
|
|
1691
1867
|
"aria-label": "Next month",
|
|
1692
|
-
children: /* @__PURE__ */ (0,
|
|
1868
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("svg", { className: "w-5 h-5 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
|
|
1693
1869
|
}
|
|
1694
1870
|
)
|
|
1695
1871
|
] }),
|
|
1696
|
-
/* @__PURE__ */ (0,
|
|
1697
|
-
/* @__PURE__ */ (0,
|
|
1872
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "grid grid-cols-7 gap-1 mb-2", children: DAYS.map((day) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "text-center text-xs font-semibold text-gray-600 dark:text-gray-400 py-1", children: day }, day)) }),
|
|
1873
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "grid grid-cols-7 gap-1", children: calendarDays.map((date, index) => {
|
|
1698
1874
|
const isCurrentMonthDay = isCurrentMonth(date);
|
|
1699
1875
|
const isTodayDay = isToday(date);
|
|
1700
1876
|
const isSelectedDay = isSelected(date);
|
|
1701
1877
|
const isDisabledDay = isDisabled(date);
|
|
1702
|
-
return /* @__PURE__ */ (0,
|
|
1878
|
+
return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
1703
1879
|
"button",
|
|
1704
1880
|
{
|
|
1705
1881
|
onClick: () => handleDateClick(date),
|
|
@@ -1720,39 +1896,39 @@ var DatePicker = ({
|
|
|
1720
1896
|
]
|
|
1721
1897
|
}
|
|
1722
1898
|
) : null;
|
|
1723
|
-
return /* @__PURE__ */ (0,
|
|
1724
|
-
label && /* @__PURE__ */ (0,
|
|
1725
|
-
/* @__PURE__ */ (0,
|
|
1899
|
+
return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { className, children: [
|
|
1900
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", children: label }),
|
|
1901
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(
|
|
1726
1902
|
"div",
|
|
1727
1903
|
{
|
|
1728
1904
|
ref: inputRef,
|
|
1729
1905
|
onClick: () => !disabled && setIsOpen(!isOpen),
|
|
1730
1906
|
className: `${baseStyles} ${errorStyles} ${disabledStyles} flex items-center justify-between`.trim(),
|
|
1731
1907
|
children: [
|
|
1732
|
-
/* @__PURE__ */ (0,
|
|
1733
|
-
/* @__PURE__ */ (0,
|
|
1908
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)("span", { className: !value ? "text-gray-500 dark:text-gray-400" : "", children: value ? formatDate(value) : placeholder }),
|
|
1909
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)("svg", { className: "w-5 h-5 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) })
|
|
1734
1910
|
]
|
|
1735
1911
|
}
|
|
1736
1912
|
),
|
|
1737
|
-
error && /* @__PURE__ */ (0,
|
|
1738
|
-
helperText && !error && /* @__PURE__ */ (0,
|
|
1913
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("p", { className: "mt-1 text-sm text-red-600 dark:text-red-400", children: error }),
|
|
1914
|
+
helperText && !error && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("p", { className: "mt-1 text-sm text-gray-500 dark:text-gray-400", children: helperText }),
|
|
1739
1915
|
mounted && (0, import_react_dom2.createPortal)(calendar, document.body)
|
|
1740
1916
|
] });
|
|
1741
1917
|
};
|
|
1742
1918
|
DatePicker.displayName = "DatePicker";
|
|
1743
1919
|
|
|
1744
1920
|
// src/components/TimePicker.tsx
|
|
1745
|
-
var
|
|
1746
|
-
var
|
|
1747
|
-
var TimePicker = (0,
|
|
1921
|
+
var import_react14 = require("react");
|
|
1922
|
+
var import_jsx_runtime53 = require("react/jsx-runtime");
|
|
1923
|
+
var TimePicker = (0, import_react14.forwardRef)(
|
|
1748
1924
|
({ label, error, helperText, className = "", disabled, ...props }, ref) => {
|
|
1749
1925
|
const { theme } = useTheme();
|
|
1750
1926
|
const baseStyles = "w-full appearance-none rounded-lg border border-gray-300 bg-white text-gray-900 px-4 py-2.5 text-base transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500";
|
|
1751
1927
|
const errorStyles = error ? "border-red-500 focus:ring-red-500 dark:border-red-500" : "";
|
|
1752
1928
|
const disabledStyles = disabled ? "opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900" : "";
|
|
1753
|
-
return /* @__PURE__ */ (0,
|
|
1754
|
-
label && /* @__PURE__ */ (0,
|
|
1755
|
-
/* @__PURE__ */ (0,
|
|
1929
|
+
return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className, children: [
|
|
1930
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", children: label }),
|
|
1931
|
+
/* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
|
|
1756
1932
|
"input",
|
|
1757
1933
|
{
|
|
1758
1934
|
ref,
|
|
@@ -1762,17 +1938,17 @@ var TimePicker = (0, import_react13.forwardRef)(
|
|
|
1762
1938
|
...props
|
|
1763
1939
|
}
|
|
1764
1940
|
),
|
|
1765
|
-
error && /* @__PURE__ */ (0,
|
|
1766
|
-
helperText && !error && /* @__PURE__ */ (0,
|
|
1941
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("p", { className: "mt-1 text-sm text-red-600 dark:text-red-400", children: error }),
|
|
1942
|
+
helperText && !error && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("p", { className: "mt-1 text-sm text-gray-500 dark:text-gray-400", children: helperText })
|
|
1767
1943
|
] });
|
|
1768
1944
|
}
|
|
1769
1945
|
);
|
|
1770
1946
|
TimePicker.displayName = "TimePicker";
|
|
1771
1947
|
|
|
1772
1948
|
// src/components/DateTimePicker.tsx
|
|
1773
|
-
var
|
|
1949
|
+
var import_react15 = require("react");
|
|
1774
1950
|
var import_react_dom3 = require("react-dom");
|
|
1775
|
-
var
|
|
1951
|
+
var import_jsx_runtime54 = require("react/jsx-runtime");
|
|
1776
1952
|
var DAYS2 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
1777
1953
|
var MONTHS2 = [
|
|
1778
1954
|
"January",
|
|
@@ -1801,19 +1977,19 @@ var DateTimePicker = ({
|
|
|
1801
1977
|
placeholder = "Select date and time..."
|
|
1802
1978
|
}) => {
|
|
1803
1979
|
const { theme } = useTheme();
|
|
1804
|
-
const [isOpen, setIsOpen] = (0,
|
|
1805
|
-
const [viewDate, setViewDate] = (0,
|
|
1806
|
-
const [selectedTime, setSelectedTime] = (0,
|
|
1980
|
+
const [isOpen, setIsOpen] = (0, import_react15.useState)(false);
|
|
1981
|
+
const [viewDate, setViewDate] = (0, import_react15.useState)(value || /* @__PURE__ */ new Date());
|
|
1982
|
+
const [selectedTime, setSelectedTime] = (0, import_react15.useState)(
|
|
1807
1983
|
value ? { hours: value.getHours(), minutes: value.getMinutes() } : { hours: 12, minutes: 0 }
|
|
1808
1984
|
);
|
|
1809
|
-
const [mounted, setMounted] = (0,
|
|
1810
|
-
const [pickerPosition, setPickerPosition] = (0,
|
|
1811
|
-
const inputRef = (0,
|
|
1812
|
-
const pickerRef = (0,
|
|
1813
|
-
(0,
|
|
1985
|
+
const [mounted, setMounted] = (0, import_react15.useState)(false);
|
|
1986
|
+
const [pickerPosition, setPickerPosition] = (0, import_react15.useState)(null);
|
|
1987
|
+
const inputRef = (0, import_react15.useRef)(null);
|
|
1988
|
+
const pickerRef = (0, import_react15.useRef)(null);
|
|
1989
|
+
(0, import_react15.useEffect)(() => {
|
|
1814
1990
|
setMounted(true);
|
|
1815
1991
|
}, []);
|
|
1816
|
-
(0,
|
|
1992
|
+
(0, import_react15.useEffect)(() => {
|
|
1817
1993
|
const handleClickOutside = (event) => {
|
|
1818
1994
|
if (pickerRef.current && !pickerRef.current.contains(event.target) && inputRef.current && !inputRef.current.contains(event.target)) {
|
|
1819
1995
|
setIsOpen(false);
|
|
@@ -1824,7 +2000,7 @@ var DateTimePicker = ({
|
|
|
1824
2000
|
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
1825
2001
|
}
|
|
1826
2002
|
}, [isOpen]);
|
|
1827
|
-
(0,
|
|
2003
|
+
(0, import_react15.useEffect)(() => {
|
|
1828
2004
|
if (isOpen && inputRef.current) {
|
|
1829
2005
|
const rect = inputRef.current.getBoundingClientRect();
|
|
1830
2006
|
setPickerPosition({
|
|
@@ -1929,7 +2105,7 @@ var DateTimePicker = ({
|
|
|
1929
2105
|
const baseStyles = "w-full appearance-none rounded-lg border border-gray-300 bg-white text-gray-900 px-4 py-2.5 text-base transition-all duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent shadow-sm hover:border-gray-400 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-100 dark:hover:border-gray-500 cursor-pointer";
|
|
1930
2106
|
const errorStyles = error ? "border-red-500 focus:ring-red-500 dark:border-red-500" : "";
|
|
1931
2107
|
const disabledStyles = disabled ? "opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-900" : "";
|
|
1932
|
-
const picker = isOpen && mounted && pickerPosition ? /* @__PURE__ */ (0,
|
|
2108
|
+
const picker = isOpen && mounted && pickerPosition ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
1933
2109
|
"div",
|
|
1934
2110
|
{
|
|
1935
2111
|
ref: pickerRef,
|
|
@@ -1940,23 +2116,23 @@ var DateTimePicker = ({
|
|
|
1940
2116
|
minWidth: "360px"
|
|
1941
2117
|
},
|
|
1942
2118
|
children: [
|
|
1943
|
-
/* @__PURE__ */ (0,
|
|
1944
|
-
/* @__PURE__ */ (0,
|
|
2119
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center justify-between mb-4", children: [
|
|
2120
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
1945
2121
|
"button",
|
|
1946
2122
|
{
|
|
1947
2123
|
onClick: handlePrevMonth,
|
|
1948
2124
|
className: "p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors",
|
|
1949
2125
|
"aria-label": "Previous month",
|
|
1950
|
-
children: /* @__PURE__ */ (0,
|
|
2126
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("svg", { className: "w-5 h-5 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 19l-7-7 7-7" }) })
|
|
1951
2127
|
}
|
|
1952
2128
|
),
|
|
1953
|
-
/* @__PURE__ */ (0,
|
|
1954
|
-
/* @__PURE__ */ (0,
|
|
2129
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
2130
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("h2", { className: "text-base font-semibold text-gray-900 dark:text-gray-100", children: [
|
|
1955
2131
|
MONTHS2[month],
|
|
1956
2132
|
" ",
|
|
1957
2133
|
year
|
|
1958
2134
|
] }),
|
|
1959
|
-
/* @__PURE__ */ (0,
|
|
2135
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
1960
2136
|
"button",
|
|
1961
2137
|
{
|
|
1962
2138
|
onClick: handleToday,
|
|
@@ -1965,23 +2141,23 @@ var DateTimePicker = ({
|
|
|
1965
2141
|
}
|
|
1966
2142
|
)
|
|
1967
2143
|
] }),
|
|
1968
|
-
/* @__PURE__ */ (0,
|
|
2144
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
1969
2145
|
"button",
|
|
1970
2146
|
{
|
|
1971
2147
|
onClick: handleNextMonth,
|
|
1972
2148
|
className: "p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors",
|
|
1973
2149
|
"aria-label": "Next month",
|
|
1974
|
-
children: /* @__PURE__ */ (0,
|
|
2150
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("svg", { className: "w-5 h-5 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
|
|
1975
2151
|
}
|
|
1976
2152
|
)
|
|
1977
2153
|
] }),
|
|
1978
|
-
/* @__PURE__ */ (0,
|
|
1979
|
-
/* @__PURE__ */ (0,
|
|
2154
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "grid grid-cols-7 gap-1 mb-2", children: DAYS2.map((day) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "text-center text-xs font-semibold text-gray-600 dark:text-gray-400 py-1", children: day }, day)) }),
|
|
2155
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "grid grid-cols-7 gap-1 mb-4", children: calendarDays.map((date, index) => {
|
|
1980
2156
|
const isCurrentMonthDay = isCurrentMonth(date);
|
|
1981
2157
|
const isTodayDay = isToday(date);
|
|
1982
2158
|
const isSelectedDay = isSelected(date);
|
|
1983
2159
|
const isDisabledDay = isDisabled(date);
|
|
1984
|
-
return /* @__PURE__ */ (0,
|
|
2160
|
+
return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
1985
2161
|
"button",
|
|
1986
2162
|
{
|
|
1987
2163
|
onClick: () => handleDateClick(date),
|
|
@@ -1999,21 +2175,21 @@ var DateTimePicker = ({
|
|
|
1999
2175
|
index
|
|
2000
2176
|
);
|
|
2001
2177
|
}) }),
|
|
2002
|
-
/* @__PURE__ */ (0,
|
|
2003
|
-
/* @__PURE__ */ (0,
|
|
2004
|
-
/* @__PURE__ */ (0,
|
|
2005
|
-
/* @__PURE__ */ (0,
|
|
2006
|
-
/* @__PURE__ */ (0,
|
|
2007
|
-
/* @__PURE__ */ (0,
|
|
2178
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "border-t border-gray-200 dark:border-gray-700 pt-4", children: [
|
|
2179
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center justify-center gap-4 mb-4", children: [
|
|
2180
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex flex-col items-center", children: [
|
|
2181
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("label", { className: "text-xs font-semibold text-gray-600 dark:text-gray-400 mb-2", children: "Hour" }),
|
|
2182
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex flex-col items-center gap-1", children: [
|
|
2183
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
2008
2184
|
"button",
|
|
2009
2185
|
{
|
|
2010
2186
|
type: "button",
|
|
2011
2187
|
onClick: () => handleTimeChange((selectedTime.hours + 1) % 24, selectedTime.minutes),
|
|
2012
2188
|
className: "p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors",
|
|
2013
|
-
children: /* @__PURE__ */ (0,
|
|
2189
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("svg", { className: "w-4 h-4 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 15l7-7 7 7" }) })
|
|
2014
2190
|
}
|
|
2015
2191
|
),
|
|
2016
|
-
/* @__PURE__ */ (0,
|
|
2192
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
2017
2193
|
"input",
|
|
2018
2194
|
{
|
|
2019
2195
|
type: "number",
|
|
@@ -2029,31 +2205,31 @@ var DateTimePicker = ({
|
|
|
2029
2205
|
className: "w-16 px-2 py-2 text-center border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 text-lg font-semibold [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none"
|
|
2030
2206
|
}
|
|
2031
2207
|
),
|
|
2032
|
-
/* @__PURE__ */ (0,
|
|
2208
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
2033
2209
|
"button",
|
|
2034
2210
|
{
|
|
2035
2211
|
type: "button",
|
|
2036
2212
|
onClick: () => handleTimeChange((selectedTime.hours - 1 + 24) % 24, selectedTime.minutes),
|
|
2037
2213
|
className: "p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors",
|
|
2038
|
-
children: /* @__PURE__ */ (0,
|
|
2214
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("svg", { className: "w-4 h-4 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }) })
|
|
2039
2215
|
}
|
|
2040
2216
|
)
|
|
2041
2217
|
] })
|
|
2042
2218
|
] }),
|
|
2043
|
-
/* @__PURE__ */ (0,
|
|
2044
|
-
/* @__PURE__ */ (0,
|
|
2045
|
-
/* @__PURE__ */ (0,
|
|
2046
|
-
/* @__PURE__ */ (0,
|
|
2047
|
-
/* @__PURE__ */ (0,
|
|
2219
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "text-2xl font-bold text-gray-600 dark:text-gray-400 mt-8", children: ":" }),
|
|
2220
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex flex-col items-center", children: [
|
|
2221
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("label", { className: "text-xs font-semibold text-gray-600 dark:text-gray-400 mb-2", children: "Minute" }),
|
|
2222
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex flex-col items-center gap-1", children: [
|
|
2223
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
2048
2224
|
"button",
|
|
2049
2225
|
{
|
|
2050
2226
|
type: "button",
|
|
2051
2227
|
onClick: () => handleTimeChange(selectedTime.hours, (selectedTime.minutes + 1) % 60),
|
|
2052
2228
|
className: "p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors",
|
|
2053
|
-
children: /* @__PURE__ */ (0,
|
|
2229
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("svg", { className: "w-4 h-4 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 15l7-7 7 7" }) })
|
|
2054
2230
|
}
|
|
2055
2231
|
),
|
|
2056
|
-
/* @__PURE__ */ (0,
|
|
2232
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
2057
2233
|
"input",
|
|
2058
2234
|
{
|
|
2059
2235
|
type: "number",
|
|
@@ -2069,20 +2245,20 @@ var DateTimePicker = ({
|
|
|
2069
2245
|
className: "w-16 px-2 py-2 text-center border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 text-lg font-semibold [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none"
|
|
2070
2246
|
}
|
|
2071
2247
|
),
|
|
2072
|
-
/* @__PURE__ */ (0,
|
|
2248
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
2073
2249
|
"button",
|
|
2074
2250
|
{
|
|
2075
2251
|
type: "button",
|
|
2076
2252
|
onClick: () => handleTimeChange(selectedTime.hours, (selectedTime.minutes - 1 + 60) % 60),
|
|
2077
2253
|
className: "p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors",
|
|
2078
|
-
children: /* @__PURE__ */ (0,
|
|
2254
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("svg", { className: "w-4 h-4 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }) })
|
|
2079
2255
|
}
|
|
2080
2256
|
)
|
|
2081
2257
|
] })
|
|
2082
2258
|
] })
|
|
2083
2259
|
] }),
|
|
2084
|
-
/* @__PURE__ */ (0,
|
|
2085
|
-
/* @__PURE__ */ (0,
|
|
2260
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "text-center text-sm text-gray-600 dark:text-gray-400 mb-4", children: formatTime(selectedTime.hours, selectedTime.minutes) }),
|
|
2261
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
2086
2262
|
"button",
|
|
2087
2263
|
{
|
|
2088
2264
|
onClick: handleDone,
|
|
@@ -2094,30 +2270,30 @@ var DateTimePicker = ({
|
|
|
2094
2270
|
]
|
|
2095
2271
|
}
|
|
2096
2272
|
) : null;
|
|
2097
|
-
return /* @__PURE__ */ (0,
|
|
2098
|
-
label && /* @__PURE__ */ (0,
|
|
2099
|
-
/* @__PURE__ */ (0,
|
|
2273
|
+
return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className, children: [
|
|
2274
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", children: label }),
|
|
2275
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
2100
2276
|
"div",
|
|
2101
2277
|
{
|
|
2102
2278
|
ref: inputRef,
|
|
2103
2279
|
onClick: () => !disabled && setIsOpen(!isOpen),
|
|
2104
2280
|
className: `${baseStyles} ${errorStyles} ${disabledStyles} flex items-center justify-between`.trim(),
|
|
2105
2281
|
children: [
|
|
2106
|
-
/* @__PURE__ */ (0,
|
|
2107
|
-
/* @__PURE__ */ (0,
|
|
2282
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: !value ? "text-gray-500 dark:text-gray-400" : "", children: value ? formatDateTime(value) : placeholder }),
|
|
2283
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("svg", { className: "w-5 h-5 text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) })
|
|
2108
2284
|
]
|
|
2109
2285
|
}
|
|
2110
2286
|
),
|
|
2111
|
-
error && /* @__PURE__ */ (0,
|
|
2112
|
-
helperText && !error && /* @__PURE__ */ (0,
|
|
2287
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "mt-1 text-sm text-red-600 dark:text-red-400", children: error }),
|
|
2288
|
+
helperText && !error && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "mt-1 text-sm text-gray-500 dark:text-gray-400", children: helperText }),
|
|
2113
2289
|
mounted && (0, import_react_dom3.createPortal)(picker, document.body)
|
|
2114
2290
|
] });
|
|
2115
2291
|
};
|
|
2116
2292
|
DateTimePicker.displayName = "DateTimePicker";
|
|
2117
2293
|
|
|
2118
2294
|
// src/components/Calendar.tsx
|
|
2119
|
-
var
|
|
2120
|
-
var
|
|
2295
|
+
var import_react16 = require("react");
|
|
2296
|
+
var import_jsx_runtime55 = require("react/jsx-runtime");
|
|
2121
2297
|
var DAYS3 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
2122
2298
|
var MONTHS3 = [
|
|
2123
2299
|
"January",
|
|
@@ -2141,8 +2317,8 @@ var Calendar = ({
|
|
|
2141
2317
|
className = ""
|
|
2142
2318
|
}) => {
|
|
2143
2319
|
const { theme } = useTheme();
|
|
2144
|
-
const [currentDate, setCurrentDate] = (0,
|
|
2145
|
-
const [viewDate, setViewDate] = (0,
|
|
2320
|
+
const [currentDate, setCurrentDate] = (0, import_react16.useState)(value || /* @__PURE__ */ new Date());
|
|
2321
|
+
const [viewDate, setViewDate] = (0, import_react16.useState)(value || /* @__PURE__ */ new Date());
|
|
2146
2322
|
const year = viewDate.getFullYear();
|
|
2147
2323
|
const month = viewDate.getMonth();
|
|
2148
2324
|
const firstDayOfMonth = new Date(year, month, 1).getDay();
|
|
@@ -2193,24 +2369,24 @@ var Calendar = ({
|
|
|
2193
2369
|
setCurrentDate(today);
|
|
2194
2370
|
onChange?.(today);
|
|
2195
2371
|
};
|
|
2196
|
-
return /* @__PURE__ */ (0,
|
|
2197
|
-
/* @__PURE__ */ (0,
|
|
2198
|
-
/* @__PURE__ */ (0,
|
|
2372
|
+
return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: `bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-4 ${className}`, children: [
|
|
2373
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "flex items-center justify-between mb-4", children: [
|
|
2374
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
2199
2375
|
"button",
|
|
2200
2376
|
{
|
|
2201
2377
|
onClick: handlePrevMonth,
|
|
2202
2378
|
className: "p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors",
|
|
2203
2379
|
"aria-label": "Previous month",
|
|
2204
|
-
children: /* @__PURE__ */ (0,
|
|
2380
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("svg", { className: "w-5 h-5 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 19l-7-7 7-7" }) })
|
|
2205
2381
|
}
|
|
2206
2382
|
),
|
|
2207
|
-
/* @__PURE__ */ (0,
|
|
2208
|
-
/* @__PURE__ */ (0,
|
|
2383
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
2384
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("h2", { className: "text-lg font-semibold text-gray-900 dark:text-gray-100", children: [
|
|
2209
2385
|
MONTHS3[month],
|
|
2210
2386
|
" ",
|
|
2211
2387
|
year
|
|
2212
2388
|
] }),
|
|
2213
|
-
/* @__PURE__ */ (0,
|
|
2389
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
2214
2390
|
"button",
|
|
2215
2391
|
{
|
|
2216
2392
|
onClick: handleToday,
|
|
@@ -2219,17 +2395,17 @@ var Calendar = ({
|
|
|
2219
2395
|
}
|
|
2220
2396
|
)
|
|
2221
2397
|
] }),
|
|
2222
|
-
/* @__PURE__ */ (0,
|
|
2398
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
2223
2399
|
"button",
|
|
2224
2400
|
{
|
|
2225
2401
|
onClick: handleNextMonth,
|
|
2226
2402
|
className: "p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors",
|
|
2227
2403
|
"aria-label": "Next month",
|
|
2228
|
-
children: /* @__PURE__ */ (0,
|
|
2404
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("svg", { className: "w-5 h-5 text-gray-600 dark:text-gray-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
|
|
2229
2405
|
}
|
|
2230
2406
|
)
|
|
2231
2407
|
] }),
|
|
2232
|
-
/* @__PURE__ */ (0,
|
|
2408
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "grid grid-cols-7 gap-1 mb-2", children: DAYS3.map((day) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
2233
2409
|
"div",
|
|
2234
2410
|
{
|
|
2235
2411
|
className: "text-center text-xs font-semibold text-gray-600 dark:text-gray-400 py-2",
|
|
@@ -2237,13 +2413,13 @@ var Calendar = ({
|
|
|
2237
2413
|
},
|
|
2238
2414
|
day
|
|
2239
2415
|
)) }),
|
|
2240
|
-
/* @__PURE__ */ (0,
|
|
2241
|
-
if (!date) return /* @__PURE__ */ (0,
|
|
2416
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "grid grid-cols-7 gap-1", children: calendarDays.map((date, index) => {
|
|
2417
|
+
if (!date) return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", {}, index);
|
|
2242
2418
|
const isCurrentMonthDay = isCurrentMonth(date);
|
|
2243
2419
|
const isTodayDay = isToday(date);
|
|
2244
2420
|
const isSelectedDay = isSelected(date);
|
|
2245
2421
|
const isDisabledDay = isDisabled(date);
|
|
2246
|
-
return /* @__PURE__ */ (0,
|
|
2422
|
+
return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
2247
2423
|
"button",
|
|
2248
2424
|
{
|
|
2249
2425
|
onClick: () => handleDateClick(date),
|
|
@@ -2265,8 +2441,8 @@ var Calendar = ({
|
|
|
2265
2441
|
};
|
|
2266
2442
|
|
|
2267
2443
|
// src/components/Radio.tsx
|
|
2268
|
-
var
|
|
2269
|
-
var
|
|
2444
|
+
var import_react17 = __toESM(require("react"));
|
|
2445
|
+
var import_jsx_runtime56 = require("react/jsx-runtime");
|
|
2270
2446
|
var Radio = ({
|
|
2271
2447
|
name,
|
|
2272
2448
|
options,
|
|
@@ -2277,7 +2453,7 @@ var Radio = ({
|
|
|
2277
2453
|
orientation = "vertical",
|
|
2278
2454
|
className = ""
|
|
2279
2455
|
}) => {
|
|
2280
|
-
const [internalValue, setInternalValue] =
|
|
2456
|
+
const [internalValue, setInternalValue] = import_react17.default.useState(defaultValue || "");
|
|
2281
2457
|
const value = controlledValue !== void 0 ? controlledValue : internalValue;
|
|
2282
2458
|
const handleChange = (optionValue) => {
|
|
2283
2459
|
if (disabled) return;
|
|
@@ -2285,17 +2461,17 @@ var Radio = ({
|
|
|
2285
2461
|
onChange?.(optionValue);
|
|
2286
2462
|
};
|
|
2287
2463
|
const containerClass = orientation === "horizontal" ? "flex flex-wrap gap-4" : "flex flex-col gap-2";
|
|
2288
|
-
return /* @__PURE__ */ (0,
|
|
2464
|
+
return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("div", { className: `${containerClass} ${className}`, role: "radiogroup", children: options.map((option) => {
|
|
2289
2465
|
const isDisabled = disabled || option.disabled;
|
|
2290
2466
|
const isChecked = value === option.value;
|
|
2291
2467
|
const id = `${name}-${option.value}`;
|
|
2292
|
-
return /* @__PURE__ */ (0,
|
|
2468
|
+
return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
|
|
2293
2469
|
"label",
|
|
2294
2470
|
{
|
|
2295
2471
|
htmlFor: id,
|
|
2296
2472
|
className: `flex items-center gap-2 cursor-pointer ${isDisabled ? "opacity-50 cursor-not-allowed" : ""}`,
|
|
2297
2473
|
children: [
|
|
2298
|
-
/* @__PURE__ */ (0,
|
|
2474
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
|
|
2299
2475
|
"input",
|
|
2300
2476
|
{
|
|
2301
2477
|
type: "radio",
|
|
@@ -2308,7 +2484,7 @@ var Radio = ({
|
|
|
2308
2484
|
className: "w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600 cursor-pointer disabled:cursor-not-allowed"
|
|
2309
2485
|
}
|
|
2310
2486
|
),
|
|
2311
|
-
/* @__PURE__ */ (0,
|
|
2487
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "text-sm font-medium text-gray-900 dark:text-gray-300", children: option.label })
|
|
2312
2488
|
]
|
|
2313
2489
|
},
|
|
2314
2490
|
option.value
|
|
@@ -2317,7 +2493,7 @@ var Radio = ({
|
|
|
2317
2493
|
};
|
|
2318
2494
|
|
|
2319
2495
|
// src/components/ProgressBar.tsx
|
|
2320
|
-
var
|
|
2496
|
+
var import_jsx_runtime57 = require("react/jsx-runtime");
|
|
2321
2497
|
var ProgressBar = ({
|
|
2322
2498
|
value,
|
|
2323
2499
|
max = 100,
|
|
@@ -2328,7 +2504,7 @@ var ProgressBar = ({
|
|
|
2328
2504
|
className = ""
|
|
2329
2505
|
}) => {
|
|
2330
2506
|
const percentage = Math.min(Math.max(value / max * 100, 0), 100);
|
|
2331
|
-
const
|
|
2507
|
+
const sizeClasses7 = {
|
|
2332
2508
|
sm: "h-1",
|
|
2333
2509
|
md: "h-2",
|
|
2334
2510
|
lg: "h-3"
|
|
@@ -2339,26 +2515,26 @@ var ProgressBar = ({
|
|
|
2339
2515
|
warning: "bg-yellow-500 dark:bg-yellow-400",
|
|
2340
2516
|
danger: "bg-red-600 dark:bg-red-500"
|
|
2341
2517
|
};
|
|
2342
|
-
return /* @__PURE__ */ (0,
|
|
2343
|
-
(showLabel || label) && /* @__PURE__ */ (0,
|
|
2344
|
-
label && /* @__PURE__ */ (0,
|
|
2345
|
-
showLabel && /* @__PURE__ */ (0,
|
|
2518
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: `w-full ${className}`, children: [
|
|
2519
|
+
(showLabel || label) && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex justify-between items-center mb-1", children: [
|
|
2520
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: label }),
|
|
2521
|
+
showLabel && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: [
|
|
2346
2522
|
Math.round(percentage),
|
|
2347
2523
|
"%"
|
|
2348
2524
|
] })
|
|
2349
2525
|
] }),
|
|
2350
|
-
/* @__PURE__ */ (0,
|
|
2526
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
2351
2527
|
"div",
|
|
2352
2528
|
{
|
|
2353
|
-
className: `w-full bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden ${
|
|
2529
|
+
className: `w-full bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden ${sizeClasses7[size]}`,
|
|
2354
2530
|
role: "progressbar",
|
|
2355
2531
|
"aria-valuenow": value,
|
|
2356
2532
|
"aria-valuemin": 0,
|
|
2357
2533
|
"aria-valuemax": max,
|
|
2358
|
-
children: /* @__PURE__ */ (0,
|
|
2534
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
2359
2535
|
"div",
|
|
2360
2536
|
{
|
|
2361
|
-
className: `${
|
|
2537
|
+
className: `${sizeClasses7[size]} ${variantClasses[variant]} rounded-full transition-all duration-300 ease-out`,
|
|
2362
2538
|
style: { width: `${percentage}%` }
|
|
2363
2539
|
}
|
|
2364
2540
|
)
|
|
@@ -2368,8 +2544,8 @@ var ProgressBar = ({
|
|
|
2368
2544
|
};
|
|
2369
2545
|
|
|
2370
2546
|
// src/components/Slider.tsx
|
|
2371
|
-
var
|
|
2372
|
-
var
|
|
2547
|
+
var import_react18 = __toESM(require("react"));
|
|
2548
|
+
var import_jsx_runtime58 = require("react/jsx-runtime");
|
|
2373
2549
|
var Slider = ({
|
|
2374
2550
|
value: controlledValue,
|
|
2375
2551
|
defaultValue = 50,
|
|
@@ -2382,7 +2558,7 @@ var Slider = ({
|
|
|
2382
2558
|
label,
|
|
2383
2559
|
className = ""
|
|
2384
2560
|
}) => {
|
|
2385
|
-
const [internalValue, setInternalValue] =
|
|
2561
|
+
const [internalValue, setInternalValue] = import_react18.default.useState(defaultValue);
|
|
2386
2562
|
const value = controlledValue !== void 0 ? controlledValue : internalValue;
|
|
2387
2563
|
const handleChange = (e) => {
|
|
2388
2564
|
const newValue = Number(e.target.value);
|
|
@@ -2390,21 +2566,21 @@ var Slider = ({
|
|
|
2390
2566
|
onChange?.(newValue);
|
|
2391
2567
|
};
|
|
2392
2568
|
const percentage = (value - min) / (max - min) * 100;
|
|
2393
|
-
return /* @__PURE__ */ (0,
|
|
2394
|
-
(label || showValue) && /* @__PURE__ */ (0,
|
|
2395
|
-
label && /* @__PURE__ */ (0,
|
|
2396
|
-
showValue && /* @__PURE__ */ (0,
|
|
2569
|
+
return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: `w-full ${className}`, children: [
|
|
2570
|
+
(label || showValue) && /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex justify-between items-center mb-2", children: [
|
|
2571
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("label", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: label }),
|
|
2572
|
+
showValue && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: value })
|
|
2397
2573
|
] }),
|
|
2398
|
-
/* @__PURE__ */ (0,
|
|
2399
|
-
/* @__PURE__ */ (0,
|
|
2400
|
-
/* @__PURE__ */ (0,
|
|
2574
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "relative", children: [
|
|
2575
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "absolute inset-0 h-2 bg-gray-200 dark:bg-gray-700 rounded-full top-1/2 -translate-y-1/2" }),
|
|
2576
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
2401
2577
|
"div",
|
|
2402
2578
|
{
|
|
2403
2579
|
className: "absolute h-2 bg-blue-600 dark:bg-blue-500 rounded-full top-1/2 -translate-y-1/2 pointer-events-none",
|
|
2404
2580
|
style: { width: `${percentage}%` }
|
|
2405
2581
|
}
|
|
2406
2582
|
),
|
|
2407
|
-
/* @__PURE__ */ (0,
|
|
2583
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
2408
2584
|
"input",
|
|
2409
2585
|
{
|
|
2410
2586
|
type: "range",
|
|
@@ -2426,8 +2602,8 @@ var Slider = ({
|
|
|
2426
2602
|
};
|
|
2427
2603
|
|
|
2428
2604
|
// src/components/Avatar.tsx
|
|
2429
|
-
var
|
|
2430
|
-
var
|
|
2605
|
+
var import_react19 = __toESM(require("react"));
|
|
2606
|
+
var import_jsx_runtime59 = require("react/jsx-runtime");
|
|
2431
2607
|
var Avatar = ({
|
|
2432
2608
|
src,
|
|
2433
2609
|
alt,
|
|
@@ -2437,8 +2613,8 @@ var Avatar = ({
|
|
|
2437
2613
|
className = "",
|
|
2438
2614
|
fallbackColor = "bg-blue-600"
|
|
2439
2615
|
}) => {
|
|
2440
|
-
const [imageError, setImageError] =
|
|
2441
|
-
const
|
|
2616
|
+
const [imageError, setImageError] = import_react19.default.useState(false);
|
|
2617
|
+
const sizeClasses7 = {
|
|
2442
2618
|
xs: "w-6 h-6 text-xs",
|
|
2443
2619
|
sm: "w-8 h-8 text-sm",
|
|
2444
2620
|
md: "w-10 h-10 text-base",
|
|
@@ -2455,11 +2631,11 @@ var Avatar = ({
|
|
|
2455
2631
|
};
|
|
2456
2632
|
const showImage = src && !imageError;
|
|
2457
2633
|
const showInitials = !showImage && name;
|
|
2458
|
-
return /* @__PURE__ */ (0,
|
|
2634
|
+
return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
|
|
2459
2635
|
"div",
|
|
2460
2636
|
{
|
|
2461
|
-
className: `${
|
|
2462
|
-
children: showImage ? /* @__PURE__ */ (0,
|
|
2637
|
+
className: `${sizeClasses7[size]} ${shapeClass} flex items-center justify-center overflow-hidden ${showImage ? "bg-gray-200 dark:bg-gray-700" : `${fallbackColor} text-white`} ${className}`,
|
|
2638
|
+
children: showImage ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
|
|
2463
2639
|
"img",
|
|
2464
2640
|
{
|
|
2465
2641
|
src,
|
|
@@ -2467,13 +2643,13 @@ var Avatar = ({
|
|
|
2467
2643
|
className: "w-full h-full object-cover",
|
|
2468
2644
|
onError: () => setImageError(true)
|
|
2469
2645
|
}
|
|
2470
|
-
) : showInitials ? /* @__PURE__ */ (0,
|
|
2646
|
+
) : showInitials ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: "font-semibold select-none", children: getInitials(name) }) : /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
|
|
2471
2647
|
"svg",
|
|
2472
2648
|
{
|
|
2473
2649
|
className: "w-full h-full text-gray-400 dark:text-gray-600",
|
|
2474
2650
|
fill: "currentColor",
|
|
2475
2651
|
viewBox: "0 0 24 24",
|
|
2476
|
-
children: /* @__PURE__ */ (0,
|
|
2652
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("path", { d: "M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" })
|
|
2477
2653
|
}
|
|
2478
2654
|
)
|
|
2479
2655
|
}
|
|
@@ -2481,7 +2657,7 @@ var Avatar = ({
|
|
|
2481
2657
|
};
|
|
2482
2658
|
|
|
2483
2659
|
// src/components/Textarea.tsx
|
|
2484
|
-
var
|
|
2660
|
+
var import_jsx_runtime60 = require("react/jsx-runtime");
|
|
2485
2661
|
var Textarea = ({
|
|
2486
2662
|
label,
|
|
2487
2663
|
error,
|
|
@@ -2492,7 +2668,7 @@ var Textarea = ({
|
|
|
2492
2668
|
disabled,
|
|
2493
2669
|
...props
|
|
2494
2670
|
}) => {
|
|
2495
|
-
const
|
|
2671
|
+
const sizeClasses7 = {
|
|
2496
2672
|
sm: "px-3 py-1.5 text-sm min-h-[80px]",
|
|
2497
2673
|
md: "px-4 py-2 text-base min-h-[100px]",
|
|
2498
2674
|
lg: "px-4 py-3 text-lg min-h-[120px]"
|
|
@@ -2508,35 +2684,35 @@ var Textarea = ({
|
|
|
2508
2684
|
bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100
|
|
2509
2685
|
placeholder:text-gray-500 dark:placeholder:text-gray-400
|
|
2510
2686
|
disabled:opacity-50 disabled:cursor-not-allowed disabled:bg-gray-50 dark:disabled:bg-gray-900`;
|
|
2511
|
-
return /* @__PURE__ */ (0,
|
|
2512
|
-
label && /* @__PURE__ */ (0,
|
|
2513
|
-
/* @__PURE__ */ (0,
|
|
2687
|
+
return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { className: `w-full ${className}`, children: [
|
|
2688
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", children: label }),
|
|
2689
|
+
/* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
|
|
2514
2690
|
"textarea",
|
|
2515
2691
|
{
|
|
2516
|
-
className: `${baseClasses} ${
|
|
2692
|
+
className: `${baseClasses} ${sizeClasses7[size]} ${resizeClasses[resize]}`,
|
|
2517
2693
|
disabled,
|
|
2518
2694
|
...props
|
|
2519
2695
|
}
|
|
2520
2696
|
),
|
|
2521
|
-
error && /* @__PURE__ */ (0,
|
|
2522
|
-
helperText && !error && /* @__PURE__ */ (0,
|
|
2697
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("p", { className: "mt-1 text-sm text-red-600 dark:text-red-400", children: error }),
|
|
2698
|
+
helperText && !error && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("p", { className: "mt-1 text-sm text-gray-500 dark:text-gray-400", children: helperText })
|
|
2523
2699
|
] });
|
|
2524
2700
|
};
|
|
2525
2701
|
|
|
2526
2702
|
// src/components/Toast.tsx
|
|
2527
|
-
var
|
|
2528
|
-
var
|
|
2529
|
-
var ToastContext = (0,
|
|
2703
|
+
var import_react20 = require("react");
|
|
2704
|
+
var import_jsx_runtime61 = require("react/jsx-runtime");
|
|
2705
|
+
var ToastContext = (0, import_react20.createContext)(void 0);
|
|
2530
2706
|
var useToast = () => {
|
|
2531
|
-
const context = (0,
|
|
2707
|
+
const context = (0, import_react20.useContext)(ToastContext);
|
|
2532
2708
|
if (!context) {
|
|
2533
2709
|
throw new Error("useToast must be used within a ToastProvider");
|
|
2534
2710
|
}
|
|
2535
2711
|
return context;
|
|
2536
2712
|
};
|
|
2537
2713
|
var ToastProvider = ({ children, position = "top-right" }) => {
|
|
2538
|
-
const [toasts, setToasts] = (0,
|
|
2539
|
-
const addToast = (0,
|
|
2714
|
+
const [toasts, setToasts] = (0, import_react20.useState)([]);
|
|
2715
|
+
const addToast = (0, import_react20.useCallback)((toast2) => {
|
|
2540
2716
|
const id = Math.random().toString(36).substring(7);
|
|
2541
2717
|
const newToast = { ...toast2, id };
|
|
2542
2718
|
setToasts((prev) => [...prev, newToast]);
|
|
@@ -2545,7 +2721,7 @@ var ToastProvider = ({ children, position = "top-right" }) => {
|
|
|
2545
2721
|
removeToast(id);
|
|
2546
2722
|
}, duration);
|
|
2547
2723
|
}, []);
|
|
2548
|
-
const removeToast = (0,
|
|
2724
|
+
const removeToast = (0, import_react20.useCallback)((id) => {
|
|
2549
2725
|
setToasts((prev) => prev.filter((toast2) => toast2.id !== id));
|
|
2550
2726
|
}, []);
|
|
2551
2727
|
const positionClasses2 = {
|
|
@@ -2556,9 +2732,9 @@ var ToastProvider = ({ children, position = "top-right" }) => {
|
|
|
2556
2732
|
"top-center": "top-4 left-1/2 -translate-x-1/2",
|
|
2557
2733
|
"bottom-center": "bottom-4 left-1/2 -translate-x-1/2"
|
|
2558
2734
|
};
|
|
2559
|
-
return /* @__PURE__ */ (0,
|
|
2735
|
+
return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(ToastContext.Provider, { value: { toasts, addToast, removeToast }, children: [
|
|
2560
2736
|
children,
|
|
2561
|
-
/* @__PURE__ */ (0,
|
|
2737
|
+
/* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: `fixed ${positionClasses2[position]} z-50 flex flex-col gap-2 max-w-md`, children: toasts.map((toast2) => /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(ToastItem, { toast: toast2, onClose: () => removeToast(toast2.id) }, toast2.id)) })
|
|
2562
2738
|
] });
|
|
2563
2739
|
};
|
|
2564
2740
|
var ToastItem = ({ toast: toast2, onClose }) => {
|
|
@@ -2569,27 +2745,27 @@ var ToastItem = ({ toast: toast2, onClose }) => {
|
|
|
2569
2745
|
info: "bg-blue-50 dark:bg-blue-900/30 border-blue-500 text-blue-800 dark:text-blue-200"
|
|
2570
2746
|
};
|
|
2571
2747
|
const typeIcons = {
|
|
2572
|
-
success: /* @__PURE__ */ (0,
|
|
2573
|
-
error: /* @__PURE__ */ (0,
|
|
2574
|
-
warning: /* @__PURE__ */ (0,
|
|
2575
|
-
info: /* @__PURE__ */ (0,
|
|
2748
|
+
success: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(CheckIcon, { size: "sm", className: "text-green-600 dark:text-green-400" }),
|
|
2749
|
+
error: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(CloseIcon, { size: "sm", className: "text-red-600 dark:text-red-400" }),
|
|
2750
|
+
warning: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("svg", { className: "w-4 h-4 text-yellow-600 dark:text-yellow-400", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("path", { fillRule: "evenodd", d: "M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z", clipRule: "evenodd" }) }),
|
|
2751
|
+
info: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("svg", { className: "w-4 h-4 text-blue-600 dark:text-blue-400", fill: "currentColor", viewBox: "0 0 20 20", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z", clipRule: "evenodd" }) })
|
|
2576
2752
|
};
|
|
2577
2753
|
const type = toast2.type || "info";
|
|
2578
|
-
return /* @__PURE__ */ (0,
|
|
2754
|
+
return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(
|
|
2579
2755
|
"div",
|
|
2580
2756
|
{
|
|
2581
2757
|
className: `flex items-start gap-3 p-4 rounded-lg border-l-4 shadow-lg backdrop-blur-sm ${typeStyles[type]} animate-slide-in`,
|
|
2582
2758
|
role: "alert",
|
|
2583
2759
|
children: [
|
|
2584
|
-
/* @__PURE__ */ (0,
|
|
2585
|
-
/* @__PURE__ */ (0,
|
|
2586
|
-
/* @__PURE__ */ (0,
|
|
2760
|
+
/* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: "flex-shrink-0 mt-0.5", children: typeIcons[type] }),
|
|
2761
|
+
/* @__PURE__ */ (0, import_jsx_runtime61.jsx)("p", { className: "flex-1 text-sm font-medium", children: toast2.message }),
|
|
2762
|
+
/* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
|
|
2587
2763
|
"button",
|
|
2588
2764
|
{
|
|
2589
2765
|
onClick: onClose,
|
|
2590
2766
|
className: "flex-shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 transition-colors",
|
|
2591
2767
|
"aria-label": "Close",
|
|
2592
|
-
children: /* @__PURE__ */ (0,
|
|
2768
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(CloseIcon, { size: "sm" })
|
|
2593
2769
|
}
|
|
2594
2770
|
)
|
|
2595
2771
|
]
|
|
@@ -2620,8 +2796,8 @@ var toast = {
|
|
|
2620
2796
|
};
|
|
2621
2797
|
|
|
2622
2798
|
// src/components/Stepper.tsx
|
|
2623
|
-
var
|
|
2624
|
-
var
|
|
2799
|
+
var import_react21 = __toESM(require("react"));
|
|
2800
|
+
var import_jsx_runtime62 = require("react/jsx-runtime");
|
|
2625
2801
|
var Stepper = ({
|
|
2626
2802
|
steps,
|
|
2627
2803
|
currentStep,
|
|
@@ -2629,18 +2805,18 @@ var Stepper = ({
|
|
|
2629
2805
|
className = ""
|
|
2630
2806
|
}) => {
|
|
2631
2807
|
const isHorizontal = orientation === "horizontal";
|
|
2632
|
-
return /* @__PURE__ */ (0,
|
|
2808
|
+
return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: `${isHorizontal ? "flex items-center" : "flex flex-col"} ${className}`, children: steps.map((step, index) => {
|
|
2633
2809
|
const stepNumber = index + 1;
|
|
2634
2810
|
const isActive = stepNumber === currentStep;
|
|
2635
2811
|
const isCompleted = stepNumber < currentStep;
|
|
2636
2812
|
const isLast = index === steps.length - 1;
|
|
2637
|
-
return /* @__PURE__ */ (0,
|
|
2638
|
-
/* @__PURE__ */ (0,
|
|
2639
|
-
/* @__PURE__ */ (0,
|
|
2813
|
+
return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_react21.default.Fragment, { children: [
|
|
2814
|
+
/* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: `flex ${isHorizontal ? "flex-col items-center" : "flex-row items-start"} ${isHorizontal ? "" : "flex-1"}`, children: [
|
|
2815
|
+
/* @__PURE__ */ (0, import_jsx_runtime62.jsx)("div", { className: "flex items-center", children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
|
|
2640
2816
|
"div",
|
|
2641
2817
|
{
|
|
2642
2818
|
className: `flex items-center justify-center w-10 h-10 rounded-full border-2 transition-all ${isCompleted ? "bg-blue-600 border-blue-600 dark:bg-blue-500 dark:border-blue-500" : isActive ? "border-blue-600 bg-white dark:border-blue-500 dark:bg-gray-800" : "border-gray-300 bg-white dark:border-gray-600 dark:bg-gray-800"}`,
|
|
2643
|
-
children: isCompleted ? /* @__PURE__ */ (0,
|
|
2819
|
+
children: isCompleted ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(CheckIcon, { size: "sm", className: "text-white" }) : /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
|
|
2644
2820
|
"span",
|
|
2645
2821
|
{
|
|
2646
2822
|
className: `text-sm font-semibold ${isActive ? "text-blue-600 dark:text-blue-400" : "text-gray-500 dark:text-gray-400"}`,
|
|
@@ -2649,18 +2825,18 @@ var Stepper = ({
|
|
|
2649
2825
|
)
|
|
2650
2826
|
}
|
|
2651
2827
|
) }),
|
|
2652
|
-
/* @__PURE__ */ (0,
|
|
2653
|
-
/* @__PURE__ */ (0,
|
|
2828
|
+
/* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: `${isHorizontal ? "mt-2 text-center" : "ml-4 pb-8"} ${isLast && !isHorizontal ? "pb-0" : ""}`, children: [
|
|
2829
|
+
/* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
|
|
2654
2830
|
"p",
|
|
2655
2831
|
{
|
|
2656
2832
|
className: `text-sm font-medium ${isActive || isCompleted ? "text-gray-900 dark:text-gray-100" : "text-gray-500 dark:text-gray-400"}`,
|
|
2657
2833
|
children: step.label
|
|
2658
2834
|
}
|
|
2659
2835
|
),
|
|
2660
|
-
step.description && /* @__PURE__ */ (0,
|
|
2836
|
+
step.description && /* @__PURE__ */ (0, import_jsx_runtime62.jsx)("p", { className: "text-xs text-gray-500 dark:text-gray-400 mt-1", children: step.description })
|
|
2661
2837
|
] })
|
|
2662
2838
|
] }),
|
|
2663
|
-
!isLast && /* @__PURE__ */ (0,
|
|
2839
|
+
!isLast && /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(
|
|
2664
2840
|
"div",
|
|
2665
2841
|
{
|
|
2666
2842
|
className: `${isHorizontal ? "flex-1 h-0.5 mx-4" : "w-0.5 h-full ml-5 -mt-8"} ${isCompleted || isActive && stepNumber < currentStep ? "bg-blue-600 dark:bg-blue-500" : "bg-gray-300 dark:bg-gray-600"}`
|
|
@@ -2671,7 +2847,7 @@ var Stepper = ({
|
|
|
2671
2847
|
};
|
|
2672
2848
|
|
|
2673
2849
|
// src/components/Divider.tsx
|
|
2674
|
-
var
|
|
2850
|
+
var import_jsx_runtime63 = require("react/jsx-runtime");
|
|
2675
2851
|
var Divider = ({
|
|
2676
2852
|
orientation = "horizontal",
|
|
2677
2853
|
variant = "solid",
|
|
@@ -2690,14 +2866,14 @@ var Divider = ({
|
|
|
2690
2866
|
center: "justify-center",
|
|
2691
2867
|
right: "justify-end"
|
|
2692
2868
|
};
|
|
2693
|
-
return /* @__PURE__ */ (0,
|
|
2694
|
-
labelPosition !== "left" && /* @__PURE__ */ (0,
|
|
2695
|
-
/* @__PURE__ */ (0,
|
|
2696
|
-
labelPosition !== "right" && /* @__PURE__ */ (0,
|
|
2869
|
+
return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { className: `flex items-center ${alignmentClasses[labelPosition]} ${className}`, role: "separator", children: [
|
|
2870
|
+
labelPosition !== "left" && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: `flex-1 border-t ${variantClasses[variant]} border-gray-300 dark:border-gray-600` }),
|
|
2871
|
+
/* @__PURE__ */ (0, import_jsx_runtime63.jsx)("span", { className: "px-4 text-sm text-gray-500 dark:text-gray-400", children: label }),
|
|
2872
|
+
labelPosition !== "right" && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: `flex-1 border-t ${variantClasses[variant]} border-gray-300 dark:border-gray-600` })
|
|
2697
2873
|
] });
|
|
2698
2874
|
}
|
|
2699
2875
|
if (orientation === "vertical") {
|
|
2700
|
-
return /* @__PURE__ */ (0,
|
|
2876
|
+
return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
|
|
2701
2877
|
"div",
|
|
2702
2878
|
{
|
|
2703
2879
|
className: `inline-block h-full border-l ${variantClasses[variant]} border-gray-300 dark:border-gray-600 ${className}`,
|
|
@@ -2706,7 +2882,7 @@ var Divider = ({
|
|
|
2706
2882
|
}
|
|
2707
2883
|
);
|
|
2708
2884
|
}
|
|
2709
|
-
return /* @__PURE__ */ (0,
|
|
2885
|
+
return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
|
|
2710
2886
|
"hr",
|
|
2711
2887
|
{
|
|
2712
2888
|
className: `border-t ${variantClasses[variant]} border-gray-300 dark:border-gray-600 ${className}`,
|
|
@@ -2716,8 +2892,8 @@ var Divider = ({
|
|
|
2716
2892
|
};
|
|
2717
2893
|
|
|
2718
2894
|
// src/components/FileUpload.tsx
|
|
2719
|
-
var
|
|
2720
|
-
var
|
|
2895
|
+
var import_react22 = require("react");
|
|
2896
|
+
var import_jsx_runtime64 = require("react/jsx-runtime");
|
|
2721
2897
|
var FileUpload = ({
|
|
2722
2898
|
accept,
|
|
2723
2899
|
multiple = false,
|
|
@@ -2730,9 +2906,9 @@ var FileUpload = ({
|
|
|
2730
2906
|
label,
|
|
2731
2907
|
helperText
|
|
2732
2908
|
}) => {
|
|
2733
|
-
const [files, setFiles] = (0,
|
|
2734
|
-
const [isDragging, setIsDragging] = (0,
|
|
2735
|
-
const fileInputRef = (0,
|
|
2909
|
+
const [files, setFiles] = (0, import_react22.useState)([]);
|
|
2910
|
+
const [isDragging, setIsDragging] = (0, import_react22.useState)(false);
|
|
2911
|
+
const fileInputRef = (0, import_react22.useRef)(null);
|
|
2736
2912
|
const formatFileSize = (bytes) => {
|
|
2737
2913
|
if (bytes === 0) return "0 Bytes";
|
|
2738
2914
|
const k = 1024;
|
|
@@ -2790,9 +2966,9 @@ var FileUpload = ({
|
|
|
2790
2966
|
setFiles(newFiles);
|
|
2791
2967
|
onChange?.(newFiles);
|
|
2792
2968
|
};
|
|
2793
|
-
return /* @__PURE__ */ (0,
|
|
2794
|
-
label && /* @__PURE__ */ (0,
|
|
2795
|
-
/* @__PURE__ */ (0,
|
|
2969
|
+
return /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)("div", { className: `w-full ${className}`, children: [
|
|
2970
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2", children: label }),
|
|
2971
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsxs)(
|
|
2796
2972
|
"div",
|
|
2797
2973
|
{
|
|
2798
2974
|
onDrop: handleDrop,
|
|
@@ -2801,7 +2977,7 @@ var FileUpload = ({
|
|
|
2801
2977
|
onClick: handleClick,
|
|
2802
2978
|
className: `relative border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-all ${isDragging ? "border-blue-500 bg-blue-50 dark:bg-blue-900/20" : "border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"} ${disabled ? "opacity-50 cursor-not-allowed" : ""}`,
|
|
2803
2979
|
children: [
|
|
2804
|
-
/* @__PURE__ */ (0,
|
|
2980
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
|
|
2805
2981
|
"input",
|
|
2806
2982
|
{
|
|
2807
2983
|
ref: fileInputRef,
|
|
@@ -2813,14 +2989,14 @@ var FileUpload = ({
|
|
|
2813
2989
|
className: "hidden"
|
|
2814
2990
|
}
|
|
2815
2991
|
),
|
|
2816
|
-
/* @__PURE__ */ (0,
|
|
2817
|
-
/* @__PURE__ */ (0,
|
|
2818
|
-
/* @__PURE__ */ (0,
|
|
2819
|
-
/* @__PURE__ */ (0,
|
|
2820
|
-
/* @__PURE__ */ (0,
|
|
2992
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsxs)("div", { className: "flex flex-col items-center gap-2", children: [
|
|
2993
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsx)("div", { className: "w-12 h-12 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(UploadIcon, { size: "lg", className: "text-gray-400 dark:text-gray-500" }) }),
|
|
2994
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsxs)("div", { children: [
|
|
2995
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsxs)("p", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: [
|
|
2996
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsx)("span", { className: "text-blue-600 dark:text-blue-400", children: "Click to upload" }),
|
|
2821
2997
|
" or drag and drop"
|
|
2822
2998
|
] }),
|
|
2823
|
-
/* @__PURE__ */ (0,
|
|
2999
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsxs)("p", { className: "text-xs text-gray-500 dark:text-gray-400 mt-1", children: [
|
|
2824
3000
|
accept ? `Accepted: ${accept}` : "Any file type",
|
|
2825
3001
|
maxSize && ` \u2022 Max size: ${formatFileSize(maxSize)}`
|
|
2826
3002
|
] })
|
|
@@ -2829,17 +3005,17 @@ var FileUpload = ({
|
|
|
2829
3005
|
]
|
|
2830
3006
|
}
|
|
2831
3007
|
),
|
|
2832
|
-
helperText && /* @__PURE__ */ (0,
|
|
2833
|
-
files.length > 0 && /* @__PURE__ */ (0,
|
|
3008
|
+
helperText && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("p", { className: "mt-2 text-sm text-gray-500 dark:text-gray-400", children: helperText }),
|
|
3009
|
+
files.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)("div", { className: "mt-4 space-y-2", children: files.map((file, index) => /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)(
|
|
2834
3010
|
"div",
|
|
2835
3011
|
{
|
|
2836
3012
|
className: "flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700",
|
|
2837
3013
|
children: [
|
|
2838
|
-
/* @__PURE__ */ (0,
|
|
2839
|
-
/* @__PURE__ */ (0,
|
|
2840
|
-
/* @__PURE__ */ (0,
|
|
3014
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
3015
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsx)("p", { className: "text-sm font-medium text-gray-900 dark:text-gray-100 truncate", children: file.name }),
|
|
3016
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsx)("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: formatFileSize(file.size) })
|
|
2841
3017
|
] }),
|
|
2842
|
-
/* @__PURE__ */ (0,
|
|
3018
|
+
/* @__PURE__ */ (0, import_jsx_runtime64.jsx)(
|
|
2843
3019
|
"button",
|
|
2844
3020
|
{
|
|
2845
3021
|
onClick: (e) => {
|
|
@@ -2848,7 +3024,7 @@ var FileUpload = ({
|
|
|
2848
3024
|
},
|
|
2849
3025
|
className: "ml-4 text-gray-400 hover:text-red-600 dark:hover:text-red-400 transition-colors",
|
|
2850
3026
|
"aria-label": "Remove file",
|
|
2851
|
-
children: /* @__PURE__ */ (0,
|
|
3027
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(CloseIcon, { size: "sm" })
|
|
2852
3028
|
}
|
|
2853
3029
|
)
|
|
2854
3030
|
]
|
|
@@ -2927,6 +3103,7 @@ function getThemeScript() {
|
|
|
2927
3103
|
MenuIcon,
|
|
2928
3104
|
Modal,
|
|
2929
3105
|
Navbar,
|
|
3106
|
+
NumberInput,
|
|
2930
3107
|
Pagination,
|
|
2931
3108
|
PlusIcon,
|
|
2932
3109
|
ProgressBar,
|