pixelize-design-library 2.3.1-beta.11 → 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.
Files changed (30) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/dist/Components/CopyButton/CopyButton.d.ts +22 -0
  3. package/dist/Components/CopyButton/CopyButton.js +126 -0
  4. package/dist/Components/EmptyState/EmptyState.d.ts +4 -0
  5. package/dist/Components/EmptyState/EmptyState.js +65 -0
  6. package/dist/Components/EmptyState/EmptyStateProps.d.ts +28 -0
  7. package/dist/Components/EmptyState/EmptyStateProps.js +2 -0
  8. package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts +26 -0
  9. package/dist/Components/FieldSelectModal/FieldSelectModal.js +107 -0
  10. package/dist/Components/FilePreview/FilePreview.d.ts +6 -0
  11. package/dist/Components/FilePreview/FilePreview.js +190 -0
  12. package/dist/Components/FilePreview/FilePreviewProps.d.ts +26 -0
  13. package/dist/Components/FilePreview/FilePreviewProps.js +2 -0
  14. package/dist/Components/LazyWrapper/LazyWrapper.d.ts +10 -0
  15. package/dist/Components/LazyWrapper/LazyWrapper.js +50 -0
  16. package/dist/Components/MoreItems/MoreItems.d.ts +4 -0
  17. package/dist/Components/MoreItems/MoreItems.js +35 -0
  18. package/dist/Components/MoreItems/MoreItemsProps.d.ts +29 -0
  19. package/dist/Components/MoreItems/MoreItemsProps.js +2 -0
  20. package/dist/Components/PdfViewer/PdfViewer.d.ts +15 -0
  21. package/dist/Components/PdfViewer/PdfViewer.js +29 -0
  22. package/dist/Components/ScrollToTop/ScrollToTop.d.ts +19 -0
  23. package/dist/Components/ScrollToTop/ScrollToTop.js +104 -0
  24. package/dist/Components/Table/Table.js +19 -19
  25. package/dist/Components/Table/TableProps.d.ts +2 -2
  26. package/dist/Components/Table/components/TableHeader.d.ts +1 -1
  27. package/dist/Components/Table/components/TableHeader.js +9 -9
  28. package/dist/index.d.ts +9 -1
  29. package/dist/index.js +19 -2
  30. 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,4 @@
1
+ import React from "react";
2
+ import { EmptyStateProps } from "./EmptyStateProps";
3
+ declare const EmptyState: React.FC<EmptyStateProps>;
4
+ export default EmptyState;
@@ -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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });