pixelize-design-library 2.3.1-beta.12 → 2.3.1-beta.13
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/.claude/settings.local.json +2 -1
- package/dist/Components/CopyButton/CopyButton.d.ts +22 -0
- package/dist/Components/CopyButton/CopyButton.js +126 -0
- package/dist/Components/EmptyState/EmptyState.d.ts +4 -0
- package/dist/Components/EmptyState/EmptyState.js +65 -0
- package/dist/Components/EmptyState/EmptyStateProps.d.ts +28 -0
- package/dist/Components/EmptyState/EmptyStateProps.js +2 -0
- package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts +26 -0
- package/dist/Components/FieldSelectModal/FieldSelectModal.js +107 -0
- package/dist/Components/FilePreview/FilePreview.d.ts +6 -0
- package/dist/Components/FilePreview/FilePreview.js +190 -0
- package/dist/Components/FilePreview/FilePreviewProps.d.ts +26 -0
- package/dist/Components/FilePreview/FilePreviewProps.js +2 -0
- package/dist/Components/LazyWrapper/LazyWrapper.d.ts +10 -0
- package/dist/Components/LazyWrapper/LazyWrapper.js +50 -0
- package/dist/Components/MoreItems/MoreItems.d.ts +4 -0
- package/dist/Components/MoreItems/MoreItems.js +35 -0
- package/dist/Components/MoreItems/MoreItemsProps.d.ts +29 -0
- package/dist/Components/MoreItems/MoreItemsProps.js +2 -0
- package/dist/Components/PdfViewer/PdfViewer.d.ts +15 -0
- package/dist/Components/PdfViewer/PdfViewer.js +29 -0
- package/dist/Components/ScrollToTop/ScrollToTop.d.ts +19 -0
- package/dist/Components/ScrollToTop/ScrollToTop.js +104 -0
- package/dist/Components/Table/components/TableHeader.js +2 -2
- package/dist/index.d.ts +9 -1
- package/dist/index.js +19 -2
- package/package.json +1 -1
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
"Bash(node -e \"console.log\\(require\\('./node_modules/pixelize-design-library/package.json'\\).version\\)\")",
|
|
35
35
|
"Bash(node -e \"console.log\\(JSON.stringify\\(require\\('./node_modules/pixelize-authenticator/package.json'\\).dependencies\\)\\)\")",
|
|
36
36
|
"Bash(node -e \"console.log\\(require\\('./node_modules/pixelize-authenticator/package.json'\\).version\\)\")",
|
|
37
|
-
"Bash(node -e \"console.log\\(require\\('./node_modules/pixelize-authenticator/node_modules/pixelize-design-library/package.json'\\).version\\)\")"
|
|
37
|
+
"Bash(node -e \"console.log\\(require\\('./node_modules/pixelize-authenticator/node_modules/pixelize-design-library/package.json'\\).version\\)\")",
|
|
38
|
+
"Bash(echo \"tsc exit code: $?\")"
|
|
38
39
|
],
|
|
39
40
|
"additionalDirectories": [
|
|
40
41
|
"/private/tmp",
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface CopyButtonProps {
|
|
3
|
+
/** Text to write to the clipboard. */
|
|
4
|
+
value: string;
|
|
5
|
+
/** "icon" floating icon button, "button" icon + text, "menu-item" full-width row. */
|
|
6
|
+
variant?: "icon" | "button" | "menu-item";
|
|
7
|
+
/** Visible label for "button" / "menu-item" variants. */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Label shown briefly after a successful copy. */
|
|
10
|
+
copiedLabel?: string;
|
|
11
|
+
/** Tooltip text (icon variant). */
|
|
12
|
+
tooltip?: string;
|
|
13
|
+
/** ms to keep the "copied" state. */
|
|
14
|
+
feedbackDuration?: number;
|
|
15
|
+
/** Icon px size. */
|
|
16
|
+
iconSize?: number;
|
|
17
|
+
size?: "xs" | "sm" | "md";
|
|
18
|
+
/** Called after a successful copy. */
|
|
19
|
+
onCopy?: (value: string) => void;
|
|
20
|
+
}
|
|
21
|
+
declare const CopyButton: React.FC<CopyButtonProps>;
|
|
22
|
+
export default CopyButton;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
45
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
46
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
47
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
48
|
+
function step(op) {
|
|
49
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
50
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
51
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
52
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
53
|
+
switch (op[0]) {
|
|
54
|
+
case 0: case 1: t = op; break;
|
|
55
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
56
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
57
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
58
|
+
default:
|
|
59
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
60
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
61
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
62
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
63
|
+
if (t[2]) _.ops.pop();
|
|
64
|
+
_.trys.pop(); continue;
|
|
65
|
+
}
|
|
66
|
+
op = body.call(thisArg, _);
|
|
67
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
68
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
72
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
73
|
+
};
|
|
74
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
75
|
+
var react_1 = __importStar(require("react"));
|
|
76
|
+
var react_2 = require("@chakra-ui/react");
|
|
77
|
+
var lucide_react_1 = require("lucide-react");
|
|
78
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
79
|
+
var ToolTip_1 = __importDefault(require("../ToolTip/ToolTip"));
|
|
80
|
+
var CopyButton = function (_a) {
|
|
81
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
82
|
+
var value = _a.value, _o = _a.variant, variant = _o === void 0 ? "icon" : _o, _p = _a.label, label = _p === void 0 ? "Copy" : _p, _q = _a.copiedLabel, copiedLabel = _q === void 0 ? "Copied!" : _q, _r = _a.tooltip, tooltip = _r === void 0 ? "Copy" : _r, _s = _a.feedbackDuration, feedbackDuration = _s === void 0 ? 1500 : _s, _t = _a.iconSize, iconSize = _t === void 0 ? 16 : _t, _u = _a.size, size = _u === void 0 ? "sm" : _u, onCopy = _a.onCopy;
|
|
83
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
84
|
+
var _v = (0, react_1.useState)(false), copied = _v[0], setCopied = _v[1];
|
|
85
|
+
var timer = (0, react_1.useRef)();
|
|
86
|
+
(0, react_1.useEffect)(function () { return function () { return clearTimeout(timer.current); }; }, []);
|
|
87
|
+
var handleCopy = function (e) { return __awaiter(void 0, void 0, void 0, function () {
|
|
88
|
+
var _a;
|
|
89
|
+
return __generator(this, function (_b) {
|
|
90
|
+
switch (_b.label) {
|
|
91
|
+
case 0:
|
|
92
|
+
e.stopPropagation();
|
|
93
|
+
_b.label = 1;
|
|
94
|
+
case 1:
|
|
95
|
+
_b.trys.push([1, 3, , 4]);
|
|
96
|
+
return [4 /*yield*/, navigator.clipboard.writeText(value)];
|
|
97
|
+
case 2:
|
|
98
|
+
_b.sent();
|
|
99
|
+
setCopied(true);
|
|
100
|
+
onCopy === null || onCopy === void 0 ? void 0 : onCopy(value);
|
|
101
|
+
clearTimeout(timer.current);
|
|
102
|
+
timer.current = setTimeout(function () { return setCopied(false); }, feedbackDuration);
|
|
103
|
+
return [3 /*break*/, 4];
|
|
104
|
+
case 3:
|
|
105
|
+
_a = _b.sent();
|
|
106
|
+
return [3 /*break*/, 4];
|
|
107
|
+
case 4: return [2 /*return*/];
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}); };
|
|
111
|
+
var accent = theme.colors.primary[500];
|
|
112
|
+
var success = (_d = (_c = (_b = theme.colors.semantic) === null || _b === void 0 ? void 0 : _b.success) === null || _c === void 0 ? void 0 : _c[500]) !== null && _d !== void 0 ? _d : "#16A34A";
|
|
113
|
+
if (variant === "menu-item") {
|
|
114
|
+
return (react_1.default.createElement(react_2.Flex, { align: "center", gap: "0.5rem", px: "12px", py: "8px", width: "100%", cursor: "pointer", borderRadius: "6px", transition: "background 0.15s ease", _hover: { bg: (_f = (_e = theme.colors.gray) === null || _e === void 0 ? void 0 : _e[100]) !== null && _f !== void 0 ? _f : "#F1F5F9" }, onClick: handleCopy },
|
|
115
|
+
copied ? react_1.default.createElement(lucide_react_1.Check, { size: iconSize, color: success }) : react_1.default.createElement(lucide_react_1.Copy, { size: iconSize, color: accent }),
|
|
116
|
+
react_1.default.createElement(react_2.Box, { fontSize: "14px", fontWeight: 500, color: copied ? success : accent }, copied ? copiedLabel : label)));
|
|
117
|
+
}
|
|
118
|
+
if (variant === "button") {
|
|
119
|
+
return (react_1.default.createElement(react_2.Flex, { as: "button", align: "center", gap: "6px", px: "12px", py: "6px", borderRadius: "8px", border: "1px solid", borderColor: copied ? success : (_h = (_g = theme.colors.gray) === null || _g === void 0 ? void 0 : _g[200]) !== null && _h !== void 0 ? _h : "#E2E8F0", bg: "transparent", color: copied ? success : (_k = (_j = theme.colors.gray) === null || _j === void 0 ? void 0 : _j[700]) !== null && _k !== void 0 ? _k : "#2D3748", fontSize: "14px", fontWeight: 500, transition: "all 0.15s ease", _hover: { borderColor: accent, color: accent }, onClick: handleCopy },
|
|
120
|
+
copied ? react_1.default.createElement(lucide_react_1.Check, { size: iconSize }) : react_1.default.createElement(lucide_react_1.Copy, { size: iconSize }),
|
|
121
|
+
react_1.default.createElement(react_2.Text, null, copied ? copiedLabel : label)));
|
|
122
|
+
}
|
|
123
|
+
return (react_1.default.createElement(ToolTip_1.default, { label: copied ? copiedLabel : tooltip, placement: "top" },
|
|
124
|
+
react_1.default.createElement(react_2.IconButton, { "aria-label": tooltip, size: size, variant: "ghost", onClick: handleCopy, color: copied ? success : (_m = (_l = theme.colors.gray) === null || _l === void 0 ? void 0 : _l[500]) !== null && _m !== void 0 ? _m : "#718096", _hover: { color: accent, bg: theme.colors.primary[50] }, icon: copied ? react_1.default.createElement(lucide_react_1.Check, { size: iconSize }) : react_1.default.createElement(lucide_react_1.Copy, { size: iconSize }) })));
|
|
125
|
+
};
|
|
126
|
+
exports.default = CopyButton;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
|
|
3
|
+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
4
|
+
return cooked;
|
|
5
|
+
};
|
|
6
|
+
var __assign = (this && this.__assign) || function () {
|
|
7
|
+
__assign = Object.assign || function(t) {
|
|
8
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
9
|
+
s = arguments[i];
|
|
10
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
11
|
+
t[p] = s[p];
|
|
12
|
+
}
|
|
13
|
+
return t;
|
|
14
|
+
};
|
|
15
|
+
return __assign.apply(this, arguments);
|
|
16
|
+
};
|
|
17
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
18
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
var react_1 = __importDefault(require("react"));
|
|
22
|
+
var react_2 = require("@chakra-ui/react");
|
|
23
|
+
var lucide_react_1 = require("lucide-react");
|
|
24
|
+
var react_3 = require("@emotion/react");
|
|
25
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
26
|
+
var float = (0, react_3.keyframes)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-8px); }\n"], ["\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-8px); }\n"])));
|
|
27
|
+
var sizeMap = {
|
|
28
|
+
sm: { badge: "48px", icon: 20, title: "0.95rem", desc: "0.8rem", gap: 2, pad: 6 },
|
|
29
|
+
md: { badge: "72px", icon: 30, title: "1.1rem", desc: "0.9rem", gap: 3, pad: 10 },
|
|
30
|
+
lg: { badge: "96px", icon: 40, title: "1.35rem", desc: "1rem", gap: 4, pad: 14 },
|
|
31
|
+
};
|
|
32
|
+
var EmptyState = function (_a) {
|
|
33
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
34
|
+
var _m = _a.title, title = _m === void 0 ? "No data found" : _m, description = _a.description, _o = _a.icon, IconComp = _o === void 0 ? lucide_react_1.Inbox : _o, image = _a.image, _p = _a.size, size = _p === void 0 ? "md" : _p, _q = _a.colorScheme, colorScheme = _q === void 0 ? "primary" : _q, _r = _a.variant, variant = _r === void 0 ? "default" : _r, action = _a.action, _s = _a.animate, animate = _s === void 0 ? false : _s, _t = _a.minH, minH = _t === void 0 ? "240px" : _t, sx = _a.sx;
|
|
35
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
36
|
+
var s = sizeMap[size];
|
|
37
|
+
// Resolve accent palette: theme.colors[colorScheme] or theme.colors.semantic[*]
|
|
38
|
+
var semantic = ["success", "error", "warning", "info"];
|
|
39
|
+
var palette = semantic.includes(colorScheme)
|
|
40
|
+
? theme.colors.semantic[colorScheme]
|
|
41
|
+
: theme.colors[colorScheme];
|
|
42
|
+
var accent = (_b = palette === null || palette === void 0 ? void 0 : palette[500]) !== null && _b !== void 0 ? _b : theme.colors.primary[500];
|
|
43
|
+
var accentSoft = (_c = palette === null || palette === void 0 ? void 0 : palette[50]) !== null && _c !== void 0 ? _c : theme.colors.primary[50];
|
|
44
|
+
var containerStyles = variant === "subtle"
|
|
45
|
+
? { bg: (_e = (_d = theme.colors.gray) === null || _d === void 0 ? void 0 : _d[50]) !== null && _e !== void 0 ? _e : "#F8FAFC", borderRadius: "16px" }
|
|
46
|
+
: variant === "dashed"
|
|
47
|
+
? {
|
|
48
|
+
border: "2px dashed",
|
|
49
|
+
borderColor: (_g = (_f = theme.colors.gray) === null || _f === void 0 ? void 0 : _f[200]) !== null && _g !== void 0 ? _g : "#E2E8F0",
|
|
50
|
+
borderRadius: "16px",
|
|
51
|
+
bg: "transparent",
|
|
52
|
+
}
|
|
53
|
+
: {};
|
|
54
|
+
return (react_1.default.createElement(react_2.Flex, { direction: "column", align: "center", justify: "center", textAlign: "center", minH: minH, px: s.pad, py: s.pad, gap: s.gap, width: "100%", sx: __assign(__assign({}, containerStyles), sx) },
|
|
55
|
+
image ? (react_1.default.createElement(react_2.Image, { src: image, alt: title, boxSize: s.badge, objectFit: "contain", animation: animate ? "".concat(float, " 3s ease-in-out infinite") : undefined })) : (react_1.default.createElement(react_2.Flex, { align: "center", justify: "center", boxSize: s.badge, borderRadius: "full", bg: accentSoft, color: accent, animation: animate ? "".concat(float, " 3s ease-in-out infinite") : undefined, sx: {
|
|
56
|
+
boxShadow: "0 0 0 8px ".concat(accentSoft, "55"),
|
|
57
|
+
} },
|
|
58
|
+
react_1.default.createElement(IconComp, { size: s.icon, strokeWidth: 1.75 }))),
|
|
59
|
+
react_1.default.createElement(react_2.Box, null,
|
|
60
|
+
react_1.default.createElement(react_2.Text, { fontSize: s.title, fontWeight: 600, color: (_j = (_h = theme.colors.gray) === null || _h === void 0 ? void 0 : _h[800]) !== null && _j !== void 0 ? _j : "#1A202C", mt: 1 }, title),
|
|
61
|
+
description && (react_1.default.createElement(react_2.Text, { fontSize: s.desc, color: (_l = (_k = theme.colors.gray) === null || _k === void 0 ? void 0 : _k[500]) !== null && _l !== void 0 ? _l : "#718096", mt: 1, maxW: "380px" }, description))),
|
|
62
|
+
action && (react_1.default.createElement(react_2.Flex, { gap: 3, mt: 2, wrap: "wrap", justify: "center" }, action))));
|
|
63
|
+
};
|
|
64
|
+
exports.default = EmptyState;
|
|
65
|
+
var templateObject_1;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ElementType, ReactNode } from "react";
|
|
2
|
+
import { BoxProps } from "@chakra-ui/react";
|
|
3
|
+
export type EmptyStateSize = "sm" | "md" | "lg";
|
|
4
|
+
export type EmptyStateColorScheme = "primary" | "secondary" | "tertiary" | "gray" | "success" | "error" | "warning" | "info";
|
|
5
|
+
export interface EmptyStateProps {
|
|
6
|
+
/** Heading text. Defaults to "No data found". */
|
|
7
|
+
title?: string;
|
|
8
|
+
/** Supporting line under the title. */
|
|
9
|
+
description?: string;
|
|
10
|
+
/** A lucide-react (or any) icon component rendered inside the badge. */
|
|
11
|
+
icon?: ElementType;
|
|
12
|
+
/** Illustration image URL. When provided it replaces the icon badge. */
|
|
13
|
+
image?: string;
|
|
14
|
+
/** Controls spacing, icon and font sizes. */
|
|
15
|
+
size?: EmptyStateSize;
|
|
16
|
+
/** Accent color for the icon badge. */
|
|
17
|
+
colorScheme?: EmptyStateColorScheme;
|
|
18
|
+
/** "default" plain, "subtle" tinted card, "dashed" dashed-border drop zone. */
|
|
19
|
+
variant?: "default" | "subtle" | "dashed";
|
|
20
|
+
/** Action node(s) — usually a Button or a pair of buttons. */
|
|
21
|
+
action?: ReactNode;
|
|
22
|
+
/** Float the icon gently to draw attention. */
|
|
23
|
+
animate?: boolean;
|
|
24
|
+
/** Minimum height of the container. */
|
|
25
|
+
minH?: BoxProps["minH"];
|
|
26
|
+
/** Escape hatch for extra Chakra styles on the outer container. */
|
|
27
|
+
sx?: BoxProps["sx"];
|
|
28
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface SelectableField {
|
|
3
|
+
/** Unique value committed on confirm. */
|
|
4
|
+
field_name: string;
|
|
5
|
+
/** Human-readable label. */
|
|
6
|
+
field_label: string;
|
|
7
|
+
}
|
|
8
|
+
export interface FieldSelectModalProps {
|
|
9
|
+
isOpen: boolean;
|
|
10
|
+
onClose: () => void;
|
|
11
|
+
fields: SelectableField[];
|
|
12
|
+
/** Called with the chosen field_name values. */
|
|
13
|
+
onConfirm: (selected: string[]) => void;
|
|
14
|
+
title?: string;
|
|
15
|
+
confirmText?: string;
|
|
16
|
+
loadingText?: string;
|
|
17
|
+
isLoading?: boolean;
|
|
18
|
+
/** Pre-selected field_name values. Defaults to all selected. */
|
|
19
|
+
defaultSelected?: string[];
|
|
20
|
+
/** Columns in the field grid. */
|
|
21
|
+
columns?: number;
|
|
22
|
+
/** Show the search box (auto-hidden under 8 fields by default). */
|
|
23
|
+
searchable?: boolean;
|
|
24
|
+
}
|
|
25
|
+
declare const FieldSelectModal: React.FC<FieldSelectModalProps>;
|
|
26
|
+
export default FieldSelectModal;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
36
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
37
|
+
if (ar || !(i in from)) {
|
|
38
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
39
|
+
ar[i] = from[i];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
var react_1 = __importStar(require("react"));
|
|
46
|
+
var react_2 = require("@chakra-ui/react");
|
|
47
|
+
var framer_motion_1 = require("framer-motion");
|
|
48
|
+
var lucide_react_1 = require("lucide-react");
|
|
49
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
50
|
+
var MotionModalContent = (0, framer_motion_1.motion)(react_2.ModalContent);
|
|
51
|
+
var FieldSelectModal = function (_a) {
|
|
52
|
+
var _b, _c, _d, _e, _f, _g;
|
|
53
|
+
var isOpen = _a.isOpen, onClose = _a.onClose, fields = _a.fields, onConfirm = _a.onConfirm, _h = _a.title, title = _h === void 0 ? "Select Fields" : _h, _j = _a.confirmText, confirmText = _j === void 0 ? "Apply" : _j, _k = _a.loadingText, loadingText = _k === void 0 ? "Applying..." : _k, _l = _a.isLoading, isLoading = _l === void 0 ? false : _l, defaultSelected = _a.defaultSelected, _m = _a.columns, columns = _m === void 0 ? 2 : _m, searchable = _a.searchable;
|
|
54
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
55
|
+
var _o = (0, react_1.useState)([]), selected = _o[0], setSelected = _o[1];
|
|
56
|
+
var _p = (0, react_1.useState)(""), query = _p[0], setQuery = _p[1];
|
|
57
|
+
(0, react_1.useEffect)(function () {
|
|
58
|
+
if (isOpen) {
|
|
59
|
+
setSelected(defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : fields.map(function (f) { return f.field_name; }));
|
|
60
|
+
setQuery("");
|
|
61
|
+
}
|
|
62
|
+
}, [isOpen, fields, defaultSelected]);
|
|
63
|
+
var showSearch = searchable !== null && searchable !== void 0 ? searchable : fields.length >= 8;
|
|
64
|
+
var visibleFields = (0, react_1.useMemo)(function () {
|
|
65
|
+
if (!query.trim())
|
|
66
|
+
return fields;
|
|
67
|
+
var q = query.toLowerCase();
|
|
68
|
+
return fields.filter(function (f) { return f.field_label.toLowerCase().includes(q); });
|
|
69
|
+
}, [fields, query]);
|
|
70
|
+
var toggle = function (name) {
|
|
71
|
+
return setSelected(function (prev) {
|
|
72
|
+
return prev.includes(name) ? prev.filter(function (f) { return f !== name; }) : __spreadArray(__spreadArray([], prev, true), [name], false);
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
var isAllSelected = selected.length === fields.length && fields.length > 0;
|
|
76
|
+
var isIndeterminate = selected.length > 0 && selected.length < fields.length;
|
|
77
|
+
return (react_1.default.createElement(react_2.Modal, { isOpen: isOpen, onClose: onClose, size: "xl", isCentered: true },
|
|
78
|
+
react_1.default.createElement(react_2.ModalOverlay, { bg: "blackAlpha.400", backdropFilter: "blur(4px)" }),
|
|
79
|
+
react_1.default.createElement(MotionModalContent, { borderRadius: "16px", overflow: "hidden", maxH: "85vh", initial: { opacity: 0, scale: 0.96, y: 8 }, animate: { opacity: 1, scale: 1, y: 0 }, transition: { duration: 0.2, ease: "easeOut" } },
|
|
80
|
+
react_1.default.createElement(react_2.ModalHeader, { pb: 2 },
|
|
81
|
+
react_1.default.createElement(react_2.Text, { fontSize: "lg", fontWeight: 600 }, title),
|
|
82
|
+
react_1.default.createElement(react_2.Text, { fontSize: "sm", color: (_c = (_b = theme.colors.gray) === null || _b === void 0 ? void 0 : _b[500]) !== null && _c !== void 0 ? _c : "#718096", fontWeight: 400 },
|
|
83
|
+
selected.length,
|
|
84
|
+
" of ",
|
|
85
|
+
fields.length,
|
|
86
|
+
" selected")),
|
|
87
|
+
react_1.default.createElement(react_2.ModalCloseButton, null),
|
|
88
|
+
react_1.default.createElement(react_2.ModalBody, { overflowY: "auto" },
|
|
89
|
+
react_1.default.createElement(react_2.Flex, { align: "center", justify: "space-between", mb: 3, gap: 3, wrap: "wrap" },
|
|
90
|
+
react_1.default.createElement(react_2.Checkbox, { isChecked: isAllSelected, isIndeterminate: isIndeterminate, onChange: function (e) {
|
|
91
|
+
return setSelected(e.target.checked ? fields.map(function (f) { return f.field_name; }) : []);
|
|
92
|
+
}, fontWeight: 500 }, "Select all"),
|
|
93
|
+
showSearch && (react_1.default.createElement(react_2.InputGroup, { size: "sm", maxW: "220px" },
|
|
94
|
+
react_1.default.createElement(react_2.InputLeftElement, { pointerEvents: "none" },
|
|
95
|
+
react_1.default.createElement(lucide_react_1.Search, { size: 15, color: (_e = (_d = theme.colors.gray) === null || _d === void 0 ? void 0 : _d[400]) !== null && _e !== void 0 ? _e : "#A0AEC0" })),
|
|
96
|
+
react_1.default.createElement(react_2.Input, { placeholder: "Search fields", value: query, onChange: function (e) { return setQuery(e.target.value); }, borderRadius: "8px" })))),
|
|
97
|
+
react_1.default.createElement(react_2.SimpleGrid, { columns: columns, spacingX: 4, spacingY: 3 }, visibleFields.map(function (field) { return (react_1.default.createElement(react_2.Checkbox, { key: field.field_name, isChecked: selected.includes(field.field_name), onChange: function () { return toggle(field.field_name); } },
|
|
98
|
+
react_1.default.createElement(react_2.Text, { fontSize: "sm" }, field.field_label))); })),
|
|
99
|
+
visibleFields.length === 0 && (react_1.default.createElement(react_2.Text, { fontSize: "sm", color: (_g = (_f = theme.colors.gray) === null || _f === void 0 ? void 0 : _f[500]) !== null && _g !== void 0 ? _g : "#718096", textAlign: "center", py: 6 },
|
|
100
|
+
"No fields match \"",
|
|
101
|
+
query,
|
|
102
|
+
"\""))),
|
|
103
|
+
react_1.default.createElement(react_2.ModalFooter, { gap: 3 },
|
|
104
|
+
react_1.default.createElement(react_2.Button, { variant: "outline", colorScheme: "gray", size: "sm", onClick: onClose }, "Cancel"),
|
|
105
|
+
react_1.default.createElement(react_2.Button, { colorScheme: "primary", size: "sm", isLoading: isLoading, loadingText: loadingText, isDisabled: selected.length === 0, onClick: function () { return onConfirm(selected); } }, confirmText)))));
|
|
106
|
+
};
|
|
107
|
+
exports.default = FieldSelectModal;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { FilePreviewProps, FilePreviewTriggerProps } from "./FilePreviewProps";
|
|
3
|
+
export declare const FilePreview: React.FC<FilePreviewProps>;
|
|
4
|
+
/** Thumbnail with a hover "preview" affordance that opens {@link FilePreview}. */
|
|
5
|
+
export declare const FilePreviewTrigger: React.FC<FilePreviewTriggerProps>;
|
|
6
|
+
export default FilePreview;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
45
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
46
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
47
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
48
|
+
function step(op) {
|
|
49
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
50
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
51
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
52
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
53
|
+
switch (op[0]) {
|
|
54
|
+
case 0: case 1: t = op; break;
|
|
55
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
56
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
57
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
58
|
+
default:
|
|
59
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
60
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
61
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
62
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
63
|
+
if (t[2]) _.ops.pop();
|
|
64
|
+
_.trys.pop(); continue;
|
|
65
|
+
}
|
|
66
|
+
op = body.call(thisArg, _);
|
|
67
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
68
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
72
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
73
|
+
};
|
|
74
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
75
|
+
exports.FilePreviewTrigger = exports.FilePreview = void 0;
|
|
76
|
+
var react_1 = __importStar(require("react"));
|
|
77
|
+
var react_2 = require("@chakra-ui/react");
|
|
78
|
+
var framer_motion_1 = require("framer-motion");
|
|
79
|
+
var lucide_react_1 = require("lucide-react");
|
|
80
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
81
|
+
var ToolTip_1 = __importDefault(require("../ToolTip/ToolTip"));
|
|
82
|
+
var MotionContent = (0, framer_motion_1.motion)(react_2.ModalContent);
|
|
83
|
+
var inferKind = function (url, fileName) {
|
|
84
|
+
var src = (fileName || url).split("?")[0].toLowerCase();
|
|
85
|
+
if (/\.(png|jpe?g|gif|webp|svg|bmp|avif)$/.test(src))
|
|
86
|
+
return "image";
|
|
87
|
+
if (/\.pdf$/.test(src))
|
|
88
|
+
return "pdf";
|
|
89
|
+
if (/\.(mp4|webm|ogg|mov)$/.test(src))
|
|
90
|
+
return "video";
|
|
91
|
+
return "other";
|
|
92
|
+
};
|
|
93
|
+
var downloadFile = function (fileUrl, fileName) { return __awaiter(void 0, void 0, void 0, function () {
|
|
94
|
+
var res, blob, url, link, _a;
|
|
95
|
+
return __generator(this, function (_b) {
|
|
96
|
+
switch (_b.label) {
|
|
97
|
+
case 0:
|
|
98
|
+
_b.trys.push([0, 3, , 4]);
|
|
99
|
+
return [4 /*yield*/, fetch(fileUrl)];
|
|
100
|
+
case 1:
|
|
101
|
+
res = _b.sent();
|
|
102
|
+
return [4 /*yield*/, res.blob()];
|
|
103
|
+
case 2:
|
|
104
|
+
blob = _b.sent();
|
|
105
|
+
url = window.URL.createObjectURL(blob);
|
|
106
|
+
link = document.createElement("a");
|
|
107
|
+
link.href = url;
|
|
108
|
+
link.download = fileName || "file";
|
|
109
|
+
document.body.appendChild(link);
|
|
110
|
+
link.click();
|
|
111
|
+
document.body.removeChild(link);
|
|
112
|
+
window.URL.revokeObjectURL(url);
|
|
113
|
+
return [3 /*break*/, 4];
|
|
114
|
+
case 3:
|
|
115
|
+
_a = _b.sent();
|
|
116
|
+
window.open(fileUrl, "_blank", "noopener,noreferrer");
|
|
117
|
+
return [3 /*break*/, 4];
|
|
118
|
+
case 4: return [2 /*return*/];
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}); };
|
|
122
|
+
var FilePreview = function (_a) {
|
|
123
|
+
var _b, _c, _d, _e, _f;
|
|
124
|
+
var isOpen = _a.isOpen, onClose = _a.onClose, fileUrl = _a.fileUrl, fileName = _a.fileName, fileType = _a.fileType, _g = _a.hideDownload, hideDownload = _g === void 0 ? false : _g, _h = _a.size, size = _h === void 0 ? "xl" : _h;
|
|
125
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
126
|
+
var _j = (0, react_1.useState)(1), zoom = _j[0], setZoom = _j[1];
|
|
127
|
+
var _k = (0, react_1.useState)(0), rotation = _k[0], setRotation = _k[1];
|
|
128
|
+
var kind = fileType || inferKind(fileUrl, fileName);
|
|
129
|
+
var reset = function () {
|
|
130
|
+
setZoom(1);
|
|
131
|
+
setRotation(0);
|
|
132
|
+
};
|
|
133
|
+
var handleClose = function () {
|
|
134
|
+
reset();
|
|
135
|
+
onClose();
|
|
136
|
+
};
|
|
137
|
+
var renderBody = function () {
|
|
138
|
+
var _a, _b, _c, _d;
|
|
139
|
+
if (kind === "image") {
|
|
140
|
+
return (react_1.default.createElement(react_2.Flex, { justify: "center", align: "center", minH: "200px", overflow: "hidden" },
|
|
141
|
+
react_1.default.createElement(react_2.Image, { src: fileUrl, alt: fileName || "preview", maxW: "100%", transform: "scale(".concat(zoom, ") rotate(").concat(rotation, "deg)"), transition: "transform 0.2s ease", objectFit: "contain" })));
|
|
142
|
+
}
|
|
143
|
+
if (kind === "pdf") {
|
|
144
|
+
return (react_1.default.createElement(react_2.Box, { as: "embed", src: fileUrl, type: "application/pdf", width: "100%", height: "70vh", borderRadius: "8px" }));
|
|
145
|
+
}
|
|
146
|
+
if (kind === "video") {
|
|
147
|
+
return (react_1.default.createElement(react_2.Box, { as: "video", src: fileUrl, controls: true, width: "100%", borderRadius: "8px" }));
|
|
148
|
+
}
|
|
149
|
+
return (react_1.default.createElement(react_2.Flex, { direction: "column", align: "center", justify: "center", py: 12, gap: 3 },
|
|
150
|
+
react_1.default.createElement(lucide_react_1.FileQuestion, { size: 48, color: (_b = (_a = theme.colors.gray) === null || _a === void 0 ? void 0 : _a[400]) !== null && _b !== void 0 ? _b : "#A0AEC0" }),
|
|
151
|
+
react_1.default.createElement(react_2.Text, { color: (_d = (_c = theme.colors.gray) === null || _c === void 0 ? void 0 : _c[600]) !== null && _d !== void 0 ? _d : "#4A5568", fontSize: "sm" }, "Preview isn't available for this file type."),
|
|
152
|
+
!hideDownload && (react_1.default.createElement(react_2.Flex, { as: "button", align: "center", gap: 2, px: 4, py: 2, borderRadius: "8px", bg: theme.colors.primary[500], color: theme.colors.white, fontSize: "sm", fontWeight: 500, onClick: function () { return downloadFile(fileUrl, fileName); } },
|
|
153
|
+
react_1.default.createElement(lucide_react_1.Download, { size: 16 }),
|
|
154
|
+
" Download file"))));
|
|
155
|
+
};
|
|
156
|
+
return (react_1.default.createElement(react_2.Modal, { isOpen: isOpen, onClose: handleClose, size: size, isCentered: true },
|
|
157
|
+
react_1.default.createElement(react_2.ModalOverlay, { bg: "blackAlpha.600", backdropFilter: "blur(4px)" }),
|
|
158
|
+
react_1.default.createElement(MotionContent, { borderRadius: "16px", overflow: "hidden", initial: { opacity: 0, scale: 0.96, y: 8 }, animate: { opacity: 1, scale: 1, y: 0 }, transition: { duration: 0.2, ease: "easeOut" } },
|
|
159
|
+
react_1.default.createElement(react_2.Flex, { align: "center", justify: "space-between", px: 4, py: 3, borderBottom: "1px solid", borderColor: (_c = (_b = theme.colors.gray) === null || _b === void 0 ? void 0 : _b[100]) !== null && _c !== void 0 ? _c : "#EDF2F7" },
|
|
160
|
+
react_1.default.createElement(ToolTip_1.default, { label: fileName || "File", placement: "bottom" },
|
|
161
|
+
react_1.default.createElement(react_2.Text, { fontSize: "sm", fontWeight: 600, maxW: "60%", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, fileName || "Preview")),
|
|
162
|
+
react_1.default.createElement(react_2.Flex, { align: "center", gap: 1 },
|
|
163
|
+
kind === "image" && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
164
|
+
react_1.default.createElement(ToolTip_1.default, { label: "Zoom out", placement: "bottom" },
|
|
165
|
+
react_1.default.createElement(react_2.IconButton, { "aria-label": "Zoom out", size: "sm", variant: "ghost", icon: react_1.default.createElement(lucide_react_1.Minus, { size: 16 }), onClick: function () { return setZoom(function (z) { return Math.max(0.25, z - 0.25); }); } })),
|
|
166
|
+
react_1.default.createElement(ToolTip_1.default, { label: "Zoom in", placement: "bottom" },
|
|
167
|
+
react_1.default.createElement(react_2.IconButton, { "aria-label": "Zoom in", size: "sm", variant: "ghost", icon: react_1.default.createElement(lucide_react_1.Plus, { size: 16 }), onClick: function () { return setZoom(function (z) { return Math.min(4, z + 0.25); }); } })),
|
|
168
|
+
react_1.default.createElement(ToolTip_1.default, { label: "Rotate", placement: "bottom" },
|
|
169
|
+
react_1.default.createElement(react_2.IconButton, { "aria-label": "Rotate", size: "sm", variant: "ghost", icon: react_1.default.createElement(lucide_react_1.RotateCw, { size: 16 }), onClick: function () { return setRotation(function (r) { return (r + 90) % 360; }); } })))),
|
|
170
|
+
!hideDownload && (react_1.default.createElement(ToolTip_1.default, { label: "Download", placement: "bottom" },
|
|
171
|
+
react_1.default.createElement(react_2.IconButton, { "aria-label": "Download", size: "sm", variant: "ghost", color: (_f = (_e = (_d = theme.colors.semantic) === null || _d === void 0 ? void 0 : _d.success) === null || _e === void 0 ? void 0 : _e[500]) !== null && _f !== void 0 ? _f : "#16A34A", icon: react_1.default.createElement(lucide_react_1.Download, { size: 18 }), onClick: function () { return downloadFile(fileUrl, fileName); } }))),
|
|
172
|
+
react_1.default.createElement(react_2.ModalCloseButton, { position: "static" }))),
|
|
173
|
+
react_1.default.createElement(react_2.ModalBody, { p: 5 }, renderBody()))));
|
|
174
|
+
};
|
|
175
|
+
exports.FilePreview = FilePreview;
|
|
176
|
+
/** Thumbnail with a hover "preview" affordance that opens {@link FilePreview}. */
|
|
177
|
+
var FilePreviewTrigger = function (_a) {
|
|
178
|
+
var fileUrl = _a.fileUrl, fileName = _a.fileName, fileType = _a.fileType, _b = _a.thumbWidth, thumbWidth = _b === void 0 ? "100px" : _b, _c = _a.thumbHeight, thumbHeight = _c === void 0 ? "60px" : _c, _d = _a.hideDownload, hideDownload = _d === void 0 ? false : _d;
|
|
179
|
+
var _e = (0, react_2.useDisclosure)(), isOpen = _e.isOpen, onOpen = _e.onOpen, onClose = _e.onClose;
|
|
180
|
+
var kind = fileType || inferKind(fileUrl, fileName);
|
|
181
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
182
|
+
react_1.default.createElement(react_2.Box, { position: "relative", display: "inline-flex", alignItems: "center", justifyContent: "center", role: "group", maxW: thumbWidth, minW: "40px", minH: thumbHeight, borderRadius: "8px", overflow: "hidden", cursor: "pointer", onClick: onOpen },
|
|
183
|
+
kind === "image" ? (react_1.default.createElement(react_2.Image, { src: fileUrl, alt: fileName || "file", maxH: thumbHeight, maxW: thumbWidth, objectFit: "contain", borderRadius: "8px" })) : (react_1.default.createElement(react_2.Flex, { align: "center", justify: "center", boxSize: thumbHeight, bg: "gray.100", borderRadius: "8px" },
|
|
184
|
+
react_1.default.createElement(lucide_react_1.Eye, { size: 18 }))),
|
|
185
|
+
react_1.default.createElement(react_2.Flex, { position: "absolute", inset: 0, align: "center", justify: "center", bg: "blackAlpha.500", color: "white", opacity: 0, transition: "opacity 0.15s ease", _groupHover: { opacity: 1 } },
|
|
186
|
+
react_1.default.createElement(lucide_react_1.Eye, { size: 18 }))),
|
|
187
|
+
react_1.default.createElement(exports.FilePreview, { isOpen: isOpen, onClose: onClose, fileUrl: fileUrl, fileName: fileName, fileType: fileType, hideDownload: hideDownload })));
|
|
188
|
+
};
|
|
189
|
+
exports.FilePreviewTrigger = FilePreviewTrigger;
|
|
190
|
+
exports.default = exports.FilePreview;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type FilePreviewKind = "image" | "pdf" | "video" | "other";
|
|
2
|
+
export interface FilePreviewProps {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
/** URL of the file to preview. */
|
|
6
|
+
fileUrl: string;
|
|
7
|
+
/** Display name (also used as the download filename). */
|
|
8
|
+
fileName?: string;
|
|
9
|
+
/** Force a renderer. When omitted it is inferred from the file extension. */
|
|
10
|
+
fileType?: FilePreviewKind;
|
|
11
|
+
/** Hide the download action. */
|
|
12
|
+
hideDownload?: boolean;
|
|
13
|
+
/** Modal size. */
|
|
14
|
+
size?: "md" | "lg" | "xl" | "2xl" | "full";
|
|
15
|
+
}
|
|
16
|
+
export interface FilePreviewTriggerProps {
|
|
17
|
+
/** URL of the file. */
|
|
18
|
+
fileUrl: string;
|
|
19
|
+
fileName?: string;
|
|
20
|
+
fileType?: FilePreviewKind;
|
|
21
|
+
/** Thumbnail max width. */
|
|
22
|
+
thumbWidth?: string;
|
|
23
|
+
/** Thumbnail max height. */
|
|
24
|
+
thumbHeight?: string;
|
|
25
|
+
hideDownload?: boolean;
|
|
26
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface LazyWrapperProps {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
/** Custom fallback node. Overrides the default spinner. */
|
|
5
|
+
fallback?: React.ReactNode;
|
|
6
|
+
/** Min height of the default fallback container. */
|
|
7
|
+
minHeight?: string;
|
|
8
|
+
}
|
|
9
|
+
declare const LazyWrapper: React.FC<LazyWrapperProps>;
|
|
10
|
+
export default LazyWrapper;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
var react_1 = __importStar(require("react"));
|
|
37
|
+
var react_2 = require("@chakra-ui/react");
|
|
38
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
39
|
+
var DefaultFallback = function (_a) {
|
|
40
|
+
var _b, _c;
|
|
41
|
+
var minHeight = _a.minHeight;
|
|
42
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
43
|
+
return (react_1.default.createElement(react_2.Box, { display: "flex", alignItems: "center", justifyContent: "center", minHeight: minHeight, width: "100%", p: "2rem" },
|
|
44
|
+
react_1.default.createElement(react_2.Spinner, { thickness: "3px", speed: "0.65s", size: "lg", emptyColor: (_c = (_b = theme.colors.gray) === null || _b === void 0 ? void 0 : _b[100]) !== null && _c !== void 0 ? _c : "#EDF2F7", color: theme.colors.primary[500] })));
|
|
45
|
+
};
|
|
46
|
+
var LazyWrapper = function (_a) {
|
|
47
|
+
var children = _a.children, fallback = _a.fallback, _b = _a.minHeight, minHeight = _b === void 0 ? "400px" : _b;
|
|
48
|
+
return (react_1.default.createElement(react_1.Suspense, { fallback: fallback !== null && fallback !== void 0 ? fallback : react_1.default.createElement(DefaultFallback, { minHeight: minHeight }) }, children));
|
|
49
|
+
};
|
|
50
|
+
exports.default = LazyWrapper;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
var react_1 = __importDefault(require("react"));
|
|
7
|
+
var react_2 = require("@chakra-ui/react");
|
|
8
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
9
|
+
var MoreItems = function (_a) {
|
|
10
|
+
var _b, _c;
|
|
11
|
+
var items = _a.items, moreCount = _a.moreCount, triggerText = _a.triggerText, colorResolver = _a.colorResolver, _d = _a.hideDots, hideDots = _d === void 0 ? false : _d, _e = _a.columns, columns = _e === void 0 ? 2 : _e, _f = _a.minWidth, minWidth = _f === void 0 ? "260px" : _f, _g = _a.triggerMaxWidth, triggerMaxWidth = _g === void 0 ? "250px" : _g, _h = _a.trigger, trigger = _h === void 0 ? "hover" : _h, _j = _a.placement, placement = _j === void 0 ? "bottom-start" : _j;
|
|
12
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
13
|
+
var count = moreCount !== null && moreCount !== void 0 ? moreCount : items.length;
|
|
14
|
+
if (count <= 0)
|
|
15
|
+
return triggerText ? react_1.default.createElement(react_1.default.Fragment, null, triggerText) : null;
|
|
16
|
+
return (react_1.default.createElement(react_2.Popover, { trigger: trigger, placement: placement, isLazy: true },
|
|
17
|
+
react_1.default.createElement(react_2.PopoverTrigger, null,
|
|
18
|
+
react_1.default.createElement(react_2.Box, { display: "inline-flex", alignItems: "center", maxW: triggerMaxWidth, cursor: "pointer" },
|
|
19
|
+
triggerText !== undefined && (react_1.default.createElement(react_2.Box, { as: "span", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, triggerText)),
|
|
20
|
+
react_1.default.createElement(react_2.Box, { as: "span", ml: "6px", px: "8px", py: "1px", fontSize: "12px", fontWeight: 600, lineHeight: "1.4", borderRadius: "full", color: (_b = theme.colors.primary[600]) !== null && _b !== void 0 ? _b : theme.colors.primary[500], bg: theme.colors.primary[50], transition: "all 0.15s ease", _hover: { bg: (_c = theme.colors.primary[100]) !== null && _c !== void 0 ? _c : theme.colors.primary[50] } },
|
|
21
|
+
"+",
|
|
22
|
+
count,
|
|
23
|
+
" more"))),
|
|
24
|
+
react_1.default.createElement(react_2.PopoverContent, { width: "auto", minWidth: minWidth, maxH: "280px", overflowY: "auto", borderRadius: "12px", boxShadow: "0 8px 24px rgba(0,0,0,0.12)", _focus: { outline: "none", boxShadow: "0 8px 24px rgba(0,0,0,0.12)" } },
|
|
25
|
+
react_1.default.createElement(react_2.PopoverArrow, null),
|
|
26
|
+
react_1.default.createElement(react_2.PopoverBody, { p: 3 },
|
|
27
|
+
react_1.default.createElement(react_2.SimpleGrid, { columns: columns, spacingX: 4, spacingY: 2 }, items === null || items === void 0 ? void 0 : items.map(function (item, index) {
|
|
28
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
29
|
+
var color = (_b = (_a = item.color) !== null && _a !== void 0 ? _a : colorResolver === null || colorResolver === void 0 ? void 0 : colorResolver(item)) !== null && _b !== void 0 ? _b : ((_d = (_c = theme.colors.gray) === null || _c === void 0 ? void 0 : _c[400]) !== null && _d !== void 0 ? _d : "#A0AEC0");
|
|
30
|
+
return (react_1.default.createElement(react_2.Box, { key: (_e = item.id) !== null && _e !== void 0 ? _e : index, display: "flex", alignItems: "center", gap: "8px", minW: 0 },
|
|
31
|
+
!hideDots && (react_1.default.createElement(react_2.Box, { flexShrink: 0, width: "8px", height: "8px", borderRadius: "full", bg: color })),
|
|
32
|
+
react_1.default.createElement(react_2.Text, { fontSize: "13px", color: (_g = (_f = theme.colors.gray) === null || _f === void 0 ? void 0 : _f[700]) !== null && _g !== void 0 ? _g : "#2D3748", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, item.label)));
|
|
33
|
+
}))))));
|
|
34
|
+
};
|
|
35
|
+
exports.default = MoreItems;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
export interface MoreItem {
|
|
3
|
+
id: string | number;
|
|
4
|
+
label: string;
|
|
5
|
+
/** Optional leading dot color. Falls back to colorResolver or a neutral gray. */
|
|
6
|
+
color?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface MoreItemsProps {
|
|
9
|
+
/** Items shown inside the popover. */
|
|
10
|
+
items: MoreItem[];
|
|
11
|
+
/** Number rendered in the "+N more" trigger. Defaults to items.length. */
|
|
12
|
+
moreCount?: number;
|
|
13
|
+
/** Text shown before the "+N more" pill (e.g. the first visible value). */
|
|
14
|
+
triggerText?: ReactNode;
|
|
15
|
+
/** Derive a dot color per item; takes precedence is given to item.color. */
|
|
16
|
+
colorResolver?: (item: MoreItem) => string | undefined;
|
|
17
|
+
/** Hide the colored leading dot entirely. */
|
|
18
|
+
hideDots?: boolean;
|
|
19
|
+
/** Columns inside the popover grid. */
|
|
20
|
+
columns?: number;
|
|
21
|
+
/** Min width of the popover panel. */
|
|
22
|
+
minWidth?: string;
|
|
23
|
+
/** Max width of the trigger before truncation. */
|
|
24
|
+
triggerMaxWidth?: string;
|
|
25
|
+
/** Open on "hover" (default) or "click". */
|
|
26
|
+
trigger?: "hover" | "click";
|
|
27
|
+
/** Popover placement. */
|
|
28
|
+
placement?: "bottom-start" | "bottom-end" | "bottom" | "top" | "right" | "left";
|
|
29
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface PdfViewerProps {
|
|
3
|
+
/** URL of the PDF to embed. */
|
|
4
|
+
pdfUrl: string;
|
|
5
|
+
/** File name shown in the toolbar. */
|
|
6
|
+
fileName?: string;
|
|
7
|
+
/** Height of the embed. */
|
|
8
|
+
height?: string;
|
|
9
|
+
/** Show the toolbar (name + open + download). */
|
|
10
|
+
showToolbar?: boolean;
|
|
11
|
+
/** Border radius of the frame. */
|
|
12
|
+
borderRadius?: string;
|
|
13
|
+
}
|
|
14
|
+
declare const PdfViewer: React.FC<PdfViewerProps>;
|
|
15
|
+
export default PdfViewer;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
var react_1 = __importDefault(require("react"));
|
|
7
|
+
var react_2 = require("@chakra-ui/react");
|
|
8
|
+
var lucide_react_1 = require("lucide-react");
|
|
9
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
10
|
+
var ToolTip_1 = __importDefault(require("../ToolTip/ToolTip"));
|
|
11
|
+
var PdfViewer = function (_a) {
|
|
12
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
13
|
+
var pdfUrl = _a.pdfUrl, _p = _a.fileName, fileName = _p === void 0 ? "Document.pdf" : _p, _q = _a.height, height = _q === void 0 ? "480px" : _q, _r = _a.showToolbar, showToolbar = _r === void 0 ? true : _r, _s = _a.borderRadius, borderRadius = _s === void 0 ? "12px" : _s;
|
|
14
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
15
|
+
return (react_1.default.createElement(react_2.Box, { border: "1px solid", borderColor: (_c = (_b = theme.colors.gray) === null || _b === void 0 ? void 0 : _b[200]) !== null && _c !== void 0 ? _c : "#E2E8F0", borderRadius: borderRadius, overflow: "hidden", bg: theme.colors.white },
|
|
16
|
+
showToolbar && (react_1.default.createElement(react_2.Flex, { align: "center", justify: "space-between", px: 4, py: 2.5, borderBottom: "1px solid", borderColor: (_e = (_d = theme.colors.gray) === null || _d === void 0 ? void 0 : _d[100]) !== null && _e !== void 0 ? _e : "#EDF2F7", bg: (_g = (_f = theme.colors.gray) === null || _f === void 0 ? void 0 : _f[50]) !== null && _g !== void 0 ? _g : "#F8FAFC" },
|
|
17
|
+
react_1.default.createElement(react_2.Flex, { align: "center", gap: 2, minW: 0 },
|
|
18
|
+
react_1.default.createElement(lucide_react_1.FileText, { size: 18, color: theme.colors.primary[500] }),
|
|
19
|
+
react_1.default.createElement(react_2.Text, { fontSize: "sm", fontWeight: 500, color: (_j = (_h = theme.colors.gray) === null || _h === void 0 ? void 0 : _h[700]) !== null && _j !== void 0 ? _j : "#2D3748", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, fileName)),
|
|
20
|
+
react_1.default.createElement(react_2.Flex, { align: "center", gap: 1 },
|
|
21
|
+
react_1.default.createElement(ToolTip_1.default, { label: "Open in new tab", placement: "top" },
|
|
22
|
+
react_1.default.createElement(react_2.Box, { as: "a", href: pdfUrl, target: "_blank", rel: "noopener noreferrer", p: 2, borderRadius: "8px", color: (_l = (_k = theme.colors.gray) === null || _k === void 0 ? void 0 : _k[600]) !== null && _l !== void 0 ? _l : "#4A5568", _hover: { bg: theme.colors.primary[50], color: theme.colors.primary[500] } },
|
|
23
|
+
react_1.default.createElement(lucide_react_1.ExternalLink, { size: 16 }))),
|
|
24
|
+
react_1.default.createElement(ToolTip_1.default, { label: "Download", placement: "top" },
|
|
25
|
+
react_1.default.createElement(react_2.Box, { as: "a", href: pdfUrl, download: fileName, p: 2, borderRadius: "8px", color: (_o = (_m = theme.colors.gray) === null || _m === void 0 ? void 0 : _m[600]) !== null && _o !== void 0 ? _o : "#4A5568", _hover: { bg: theme.colors.primary[50], color: theme.colors.primary[500] } },
|
|
26
|
+
react_1.default.createElement(lucide_react_1.Download, { size: 16 })))))),
|
|
27
|
+
react_1.default.createElement(react_2.Box, { as: "embed", src: pdfUrl, type: "application/pdf", width: "100%", height: height, display: "block" })));
|
|
28
|
+
};
|
|
29
|
+
exports.default = PdfViewer;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface ScrollToTopProps {
|
|
3
|
+
/** Content to wrap. The button watches the nearest scrollable ancestor. */
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
/** Tooltip label on the button. */
|
|
6
|
+
tooltipLabel?: string;
|
|
7
|
+
/** Scroll distance (px) after which the button appears. */
|
|
8
|
+
threshold?: number;
|
|
9
|
+
/** Smooth-scroll duration in ms. */
|
|
10
|
+
duration?: number;
|
|
11
|
+
/** Pin to a window-level scroll instead of the wrapped parent. */
|
|
12
|
+
useWindow?: boolean;
|
|
13
|
+
/** Distance from the bottom edge. */
|
|
14
|
+
bottom?: string;
|
|
15
|
+
/** Distance from the right edge. */
|
|
16
|
+
right?: string;
|
|
17
|
+
}
|
|
18
|
+
declare const ScrollToTop: React.FC<ScrollToTopProps>;
|
|
19
|
+
export default ScrollToTop;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var react_1 = __importStar(require("react"));
|
|
40
|
+
var react_2 = require("@chakra-ui/react");
|
|
41
|
+
var lucide_react_1 = require("lucide-react");
|
|
42
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
43
|
+
var ToolTip_1 = __importDefault(require("../ToolTip/ToolTip"));
|
|
44
|
+
var ScrollToTop = function (_a) {
|
|
45
|
+
var _b;
|
|
46
|
+
var children = _a.children, _c = _a.tooltipLabel, tooltipLabel = _c === void 0 ? "Scroll to top" : _c, _d = _a.threshold, threshold = _d === void 0 ? 300 : _d, _e = _a.duration, duration = _e === void 0 ? 600 : _e, _f = _a.useWindow, useWindow = _f === void 0 ? false : _f, _g = _a.bottom, bottom = _g === void 0 ? "2rem" : _g, _h = _a.right, right = _h === void 0 ? "2rem" : _h;
|
|
47
|
+
var _j = (0, react_1.useState)(false), visible = _j[0], setVisible = _j[1];
|
|
48
|
+
var anchorRef = (0, react_1.useRef)(null);
|
|
49
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
50
|
+
var getScroller = function () {
|
|
51
|
+
var _a, _b;
|
|
52
|
+
if (useWindow)
|
|
53
|
+
return window;
|
|
54
|
+
return (_b = (_a = anchorRef.current) === null || _a === void 0 ? void 0 : _a.parentElement) !== null && _b !== void 0 ? _b : null;
|
|
55
|
+
};
|
|
56
|
+
var handleScroll = function () {
|
|
57
|
+
var _a;
|
|
58
|
+
var scroller = getScroller();
|
|
59
|
+
var top = scroller === window
|
|
60
|
+
? window.scrollY
|
|
61
|
+
: (_a = scroller === null || scroller === void 0 ? void 0 : scroller.scrollTop) !== null && _a !== void 0 ? _a : 0;
|
|
62
|
+
setVisible(top >= threshold);
|
|
63
|
+
};
|
|
64
|
+
var scrollToTop = function () {
|
|
65
|
+
var scroller = getScroller();
|
|
66
|
+
if (!scroller)
|
|
67
|
+
return;
|
|
68
|
+
var start = scroller === window ? window.scrollY : scroller.scrollTop;
|
|
69
|
+
var startTime = performance.now();
|
|
70
|
+
var step = function (now) {
|
|
71
|
+
var progress = Math.min((now - startTime) / duration, 1);
|
|
72
|
+
var eased = progress < 0.5
|
|
73
|
+
? 2 * progress * progress
|
|
74
|
+
: -1 + (4 - 2 * progress) * progress;
|
|
75
|
+
var next = start * (1 - eased);
|
|
76
|
+
if (scroller === window)
|
|
77
|
+
window.scrollTo(0, next);
|
|
78
|
+
else
|
|
79
|
+
scroller.scrollTop = next;
|
|
80
|
+
if (progress < 1)
|
|
81
|
+
requestAnimationFrame(step);
|
|
82
|
+
};
|
|
83
|
+
requestAnimationFrame(step);
|
|
84
|
+
};
|
|
85
|
+
(0, react_1.useEffect)(function () {
|
|
86
|
+
var scroller = getScroller();
|
|
87
|
+
if (!scroller)
|
|
88
|
+
return;
|
|
89
|
+
scroller.addEventListener("scroll", handleScroll);
|
|
90
|
+
handleScroll();
|
|
91
|
+
return function () { return scroller.removeEventListener("scroll", handleScroll); };
|
|
92
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
93
|
+
}, [useWindow, threshold]);
|
|
94
|
+
return (react_1.default.createElement(react_2.Box, { ref: anchorRef, position: "relative" },
|
|
95
|
+
children,
|
|
96
|
+
react_1.default.createElement(ToolTip_1.default, { label: tooltipLabel, placement: "left" },
|
|
97
|
+
react_1.default.createElement(react_2.Box, { onClick: scrollToTop, role: "button", "aria-label": tooltipLabel, position: "fixed", bottom: bottom, right: right, zIndex: 1000, display: "flex", alignItems: "center", justifyContent: "center", boxSize: "44px", borderRadius: "full", cursor: "pointer", bg: theme.colors.primary[500], color: theme.colors.white, boxShadow: "0 4px 14px rgba(0,0,0,0.25)", opacity: visible ? 1 : 0, transform: visible ? "translateY(0) scale(1)" : "translateY(16px) scale(0.85)", pointerEvents: visible ? "auto" : "none", transition: "all 0.25s cubic-bezier(0.16, 1, 0.3, 1)", _hover: {
|
|
98
|
+
bg: (_b = theme.colors.primary[600]) !== null && _b !== void 0 ? _b : theme.colors.primary[500],
|
|
99
|
+
transform: "translateY(-2px) scale(1.05)",
|
|
100
|
+
boxShadow: "0 6px 20px rgba(0,0,0,0.3)",
|
|
101
|
+
}, _active: { transform: "scale(0.95)" } },
|
|
102
|
+
react_1.default.createElement(lucide_react_1.ChevronUp, { size: 24, strokeWidth: 2.5 })))));
|
|
103
|
+
};
|
|
104
|
+
exports.default = ScrollToTop;
|
|
@@ -71,8 +71,8 @@ var TableHeader = function (_a) {
|
|
|
71
71
|
theme.colors,
|
|
72
72
|
]);
|
|
73
73
|
var RenderConent = (0, react_2.useCallback)(function () {
|
|
74
|
-
var _a, _b, _c;
|
|
75
|
-
return (react_2.default.createElement(react_1.Th, { w: 6, minW: "35px", p: 0, backgroundColor: (_b = (_a = theme.colors) === null || _a === void 0 ? void 0 : _a.
|
|
74
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
75
|
+
return (react_2.default.createElement(react_1.Th, { w: 6, minW: "35px", p: 0, backgroundColor: (_d = (_c = (_b = (_a = theme.colors) === null || _a === void 0 ? void 0 : _a.table) === null || _b === void 0 ? void 0 : _b.hover) === null || _c === void 0 ? void 0 : _c[200]) !== null && _d !== void 0 ? _d : (_f = (_e = theme.colors) === null || _e === void 0 ? void 0 : _e.secondary) === null || _f === void 0 ? void 0 : _f[50], borderBottom: noBorders ? "none" : "0.063rem solid ".concat((_g = theme.colors) === null || _g === void 0 ? void 0 : _g.gray[300]), position: "sticky", className: "columns sticky-columns", left: "0px", zIndex: 1 }));
|
|
76
76
|
}, [noBorders, theme.colors]);
|
|
77
77
|
var RenderView = (0, react_2.useCallback)(function () {
|
|
78
78
|
var _a, _b, _c, _d, _e, _f, _g;
|
package/dist/index.d.ts
CHANGED
|
@@ -60,5 +60,13 @@ import ApexLineChart from "./Components/Apexcharts/ApexLineChart/ApexLineChart";
|
|
|
60
60
|
import Notification from "./Components/Notification/Notification";
|
|
61
61
|
import DatePicker from "./Components/DatePicker/ThemeDatePicker";
|
|
62
62
|
import FilterSidebar from "./Components/FilterSidebar/FilterSidebar";
|
|
63
|
-
|
|
63
|
+
import EmptyState from "./Components/EmptyState/EmptyState";
|
|
64
|
+
import MoreItems from "./Components/MoreItems/MoreItems";
|
|
65
|
+
import ScrollToTop from "./Components/ScrollToTop/ScrollToTop";
|
|
66
|
+
import CopyButton from "./Components/CopyButton/CopyButton";
|
|
67
|
+
import FieldSelectModal from "./Components/FieldSelectModal/FieldSelectModal";
|
|
68
|
+
import PdfViewer from "./Components/PdfViewer/PdfViewer";
|
|
69
|
+
import LazyWrapper from "./Components/LazyWrapper/LazyWrapper";
|
|
70
|
+
import FilePreview, { FilePreviewTrigger } from "./Components/FilePreview/FilePreview";
|
|
71
|
+
export { Accordian, AlertDialog, ApexBarChart, ApexPieChart, ApexPolarChart, ApexLineChart, Breadcrumbs, Button, ButtonGroupIcon, Card, Checkbox, ContactForm, DatePicker, Drawer, DrawerHeader, DrawerBody, DrawerFooter, Dropdown, Editor, EmptyState, FieldSelectModal, FilePreview, FilePreviewTrigger, FileUpload, FileUploader, FilterSidebar, FormWrapper, LazyWrapper, MoreItems, PdfViewer, ScrollToTop, CopyButton, Header, HeaderActions, InputTextArea, InputSwitch, KanbanBoard, Loading, Modal, ModalHeader, ModalBody, ModalFooter, NavigationBar, Notification, NoteTextArea, MultiSelect, NumberInput, PaymentCard, PhoneNumberInput, PinInput, ProductCard, ProductDetails, ProfileCard, ProfileCardHeader, ProfileCardBody, ProfileCardFooter, ProfilePhotoViewer, ProgressBar, RadioButton, RadioButtonGroup, Reorder, Search, Select, SearchSelect, SelectSearch, SideBar, Slider, Skeletons, Switch, Table, TableToggle, Tag, TextInput, Timeline, Toaster, ToolTip, useToaster, VerifyEmailOtp, useCustomTheme, ThemesList, debounce, };
|
|
64
72
|
export default withTheme;
|
package/dist/index.js
CHANGED
|
@@ -37,8 +37,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
38
|
};
|
|
39
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.
|
|
41
|
-
exports.debounce = exports.ThemesList = exports.useCustomTheme = exports.VerifyEmailOtp = exports.useToaster = exports.ToolTip = exports.Toaster = exports.Timeline = exports.TextInput = exports.Tag = exports.TableToggle = exports.Table = exports.Switch = exports.Skeletons = exports.Slider = exports.SideBar = exports.SelectSearch = exports.SearchSelect = exports.Select = exports.Search = exports.Reorder = exports.RadioButtonGroup = void 0;
|
|
40
|
+
exports.PinInput = exports.PhoneNumberInput = exports.PaymentCard = exports.NumberInput = exports.MultiSelect = exports.NoteTextArea = exports.Notification = exports.NavigationBar = exports.ModalFooter = exports.ModalBody = exports.ModalHeader = exports.Modal = exports.Loading = exports.KanbanBoard = exports.InputSwitch = exports.InputTextArea = exports.HeaderActions = exports.Header = exports.CopyButton = exports.ScrollToTop = exports.PdfViewer = exports.MoreItems = exports.LazyWrapper = exports.FormWrapper = exports.FilterSidebar = exports.FileUploader = exports.FileUpload = exports.FilePreviewTrigger = exports.FilePreview = exports.FieldSelectModal = exports.EmptyState = exports.Editor = exports.Dropdown = exports.DrawerFooter = exports.DrawerBody = exports.DrawerHeader = exports.Drawer = exports.DatePicker = exports.ContactForm = exports.Checkbox = exports.Card = exports.ButtonGroupIcon = exports.Button = exports.Breadcrumbs = exports.ApexLineChart = exports.ApexPolarChart = exports.ApexPieChart = exports.ApexBarChart = exports.AlertDialog = exports.Accordian = void 0;
|
|
41
|
+
exports.debounce = exports.ThemesList = exports.useCustomTheme = exports.VerifyEmailOtp = exports.useToaster = exports.ToolTip = exports.Toaster = exports.Timeline = exports.TextInput = exports.Tag = exports.TableToggle = exports.Table = exports.Switch = exports.Skeletons = exports.Slider = exports.SideBar = exports.SelectSearch = exports.SearchSelect = exports.Select = exports.Search = exports.Reorder = exports.RadioButtonGroup = exports.RadioButton = exports.ProgressBar = exports.ProfilePhotoViewer = exports.ProfileCardFooter = exports.ProfileCardBody = exports.ProfileCardHeader = exports.ProfileCard = exports.ProductDetails = exports.ProductCard = void 0;
|
|
42
42
|
var Accordion_1 = __importDefault(require("./Components/Accordion/Accordion"));
|
|
43
43
|
exports.Accordian = Accordion_1.default;
|
|
44
44
|
var AlertDialog_1 = __importDefault(require("./Components/AlertDialog/AlertDialog"));
|
|
@@ -174,4 +174,21 @@ var ThemeDatePicker_1 = __importDefault(require("./Components/DatePicker/ThemeDa
|
|
|
174
174
|
exports.DatePicker = ThemeDatePicker_1.default;
|
|
175
175
|
var FilterSidebar_1 = __importDefault(require("./Components/FilterSidebar/FilterSidebar"));
|
|
176
176
|
exports.FilterSidebar = FilterSidebar_1.default;
|
|
177
|
+
var EmptyState_1 = __importDefault(require("./Components/EmptyState/EmptyState"));
|
|
178
|
+
exports.EmptyState = EmptyState_1.default;
|
|
179
|
+
var MoreItems_1 = __importDefault(require("./Components/MoreItems/MoreItems"));
|
|
180
|
+
exports.MoreItems = MoreItems_1.default;
|
|
181
|
+
var ScrollToTop_1 = __importDefault(require("./Components/ScrollToTop/ScrollToTop"));
|
|
182
|
+
exports.ScrollToTop = ScrollToTop_1.default;
|
|
183
|
+
var CopyButton_1 = __importDefault(require("./Components/CopyButton/CopyButton"));
|
|
184
|
+
exports.CopyButton = CopyButton_1.default;
|
|
185
|
+
var FieldSelectModal_1 = __importDefault(require("./Components/FieldSelectModal/FieldSelectModal"));
|
|
186
|
+
exports.FieldSelectModal = FieldSelectModal_1.default;
|
|
187
|
+
var PdfViewer_1 = __importDefault(require("./Components/PdfViewer/PdfViewer"));
|
|
188
|
+
exports.PdfViewer = PdfViewer_1.default;
|
|
189
|
+
var LazyWrapper_1 = __importDefault(require("./Components/LazyWrapper/LazyWrapper"));
|
|
190
|
+
exports.LazyWrapper = LazyWrapper_1.default;
|
|
191
|
+
var FilePreview_1 = __importStar(require("./Components/FilePreview/FilePreview"));
|
|
192
|
+
exports.FilePreview = FilePreview_1.default;
|
|
193
|
+
Object.defineProperty(exports, "FilePreviewTrigger", { enumerable: true, get: function () { return FilePreview_1.FilePreviewTrigger; } });
|
|
177
194
|
exports.default = withTheme_1.default;
|