pixelize-design-library 2.3.1-beta.8 → 2.3.2

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 (193) hide show
  1. package/.cursor/TASK-SETUP.md +43 -0
  2. package/.cursor/agents/be-impl.md +37 -0
  3. package/.cursor/agents/fe-impl.md +39 -0
  4. package/.cursor/agents/task-plan.md +56 -0
  5. package/.cursor/agents/test-create.md +31 -0
  6. package/.cursor/agents/test-exec.md +26 -0
  7. package/.cursor/hooks/task-hint.env +1 -0
  8. package/.cursor/hooks/task-skill-nudge.sh +71 -0
  9. package/.cursor/hooks/task-slash-guard.sh +31 -0
  10. package/.cursor/hooks.json +13 -0
  11. package/.cursor/modules/account-management/MODULE.md +16 -0
  12. package/.cursor/modules/buttons/MODULE.md +13 -0
  13. package/.cursor/modules/cards/MODULE.md +13 -0
  14. package/.cursor/modules/charts/MODULE.md +13 -0
  15. package/.cursor/modules/common/MODULE.md +13 -0
  16. package/.cursor/modules/contact-auth/MODULE.md +13 -0
  17. package/.cursor/modules/data-display/MODULE.md +18 -0
  18. package/.cursor/modules/feedback/MODULE.md +14 -0
  19. package/.cursor/modules/form/MODULE.md +13 -0
  20. package/.cursor/modules/inputs-basic/MODULE.md +13 -0
  21. package/.cursor/modules/inputs-date-file/MODULE.md +19 -0
  22. package/.cursor/modules/inputs-select/MODULE.md +14 -0
  23. package/.cursor/modules/inputs-toggle/MODULE.md +13 -0
  24. package/.cursor/modules/kanban/MODULE.md +14 -0
  25. package/.cursor/modules/layout-navigation/MODULE.md +14 -0
  26. package/.cursor/modules/overlays/MODULE.md +13 -0
  27. package/.cursor/modules/playground/MODULE.md +15 -0
  28. package/.cursor/modules/table/MODULE.md +15 -0
  29. package/.cursor/modules/theme/MODULE.md +15 -0
  30. package/.cursor/modules/types-exports/MODULE.md +17 -0
  31. package/.cursor/modules/utility-ui/MODULE.md +15 -0
  32. package/.cursor/modules/utils-hooks/MODULE.md +13 -0
  33. package/.cursor/pixelize-task-statusline.sh +64 -0
  34. package/.cursor/plans/blocked/.gitkeep +0 -0
  35. package/.cursor/plans/current.md +35 -0
  36. package/.cursor/plans/done/.gitkeep +0 -0
  37. package/.cursor/rules +31 -0
  38. package/.cursor/skills/task/SKILL.md +167 -0
  39. package/CLAUDE.md +122 -0
  40. package/dist/Components/Card/PaymentCard/PaymentCard.d.ts +1 -1
  41. package/dist/Components/Card/PaymentCard/PaymentCard.js +3 -3
  42. package/dist/Components/Card/PaymentCard/PaymentCardProps.d.ts +1 -0
  43. package/dist/Components/CopyButton/CopyButton.d.ts +22 -0
  44. package/dist/Components/CopyButton/CopyButton.js +126 -0
  45. package/dist/Components/CustomModulesTable/CustomModulesTable.d.ts +4 -0
  46. package/dist/Components/CustomModulesTable/CustomModulesTable.js +182 -0
  47. package/dist/Components/CustomModulesTable/CustomModulesTable.test.d.ts +1 -0
  48. package/dist/Components/CustomModulesTable/CustomModulesTable.test.js +84 -0
  49. package/dist/Components/CustomModulesTable/CustomModulesTableProps.d.ts +54 -0
  50. package/dist/Components/CustomModulesTable/CustomModulesTableProps.js +2 -0
  51. package/dist/Components/CustomModulesTable/DeleteModuleModal.d.ts +4 -0
  52. package/dist/Components/CustomModulesTable/DeleteModuleModal.js +33 -0
  53. package/dist/Components/CustomModulesTable/EditModuleModal.d.ts +4 -0
  54. package/dist/Components/CustomModulesTable/EditModuleModal.js +63 -0
  55. package/dist/Components/Dropdown/DropDown.js +110 -28
  56. package/dist/Components/Dropdown/Dropdown.test.d.ts +1 -0
  57. package/dist/Components/Dropdown/Dropdown.test.js +102 -0
  58. package/dist/Components/Dropdown/DropdownProps.d.ts +4 -1
  59. package/dist/Components/EmptyState/EmptyState.d.ts +4 -0
  60. package/dist/Components/EmptyState/EmptyState.js +65 -0
  61. package/dist/Components/EmptyState/EmptyStateProps.d.ts +28 -0
  62. package/dist/Components/EmptyState/EmptyStateProps.js +2 -0
  63. package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts +26 -0
  64. package/dist/Components/FieldSelectModal/FieldSelectModal.js +107 -0
  65. package/dist/Components/FilePreview/FilePreview.d.ts +6 -0
  66. package/dist/Components/FilePreview/FilePreview.js +190 -0
  67. package/dist/Components/FilePreview/FilePreviewProps.d.ts +26 -0
  68. package/dist/Components/FilePreview/FilePreviewProps.js +2 -0
  69. package/dist/Components/LazyWrapper/LazyWrapper.d.ts +10 -0
  70. package/dist/Components/LazyWrapper/LazyWrapper.js +50 -0
  71. package/dist/Components/MoreItems/MoreItems.d.ts +4 -0
  72. package/dist/Components/MoreItems/MoreItems.js +35 -0
  73. package/dist/Components/MoreItems/MoreItemsProps.d.ts +29 -0
  74. package/dist/Components/MoreItems/MoreItemsProps.js +2 -0
  75. package/dist/Components/OrgSwitcher/OrgSwitcher.d.ts +4 -0
  76. package/dist/Components/OrgSwitcher/OrgSwitcher.js +121 -0
  77. package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts +41 -0
  78. package/dist/Components/OrgSwitcher/OrgSwitcherProps.js +25 -0
  79. package/dist/Components/OrganizationDetails/CreateOrgModal.d.ts +4 -0
  80. package/dist/Components/OrganizationDetails/CreateOrgModal.js +122 -0
  81. package/dist/Components/OrganizationDetails/DeleteOrgModal.d.ts +4 -0
  82. package/dist/Components/OrganizationDetails/DeleteOrgModal.js +29 -0
  83. package/dist/Components/OrganizationDetails/OrganizationDetails.d.ts +4 -0
  84. package/dist/Components/OrganizationDetails/OrganizationDetails.js +264 -0
  85. package/dist/Components/OrganizationDetails/OrganizationDetails.test.d.ts +1 -0
  86. package/dist/Components/OrganizationDetails/OrganizationDetails.test.js +122 -0
  87. package/dist/Components/OrganizationDetails/OrganizationDetailsProps.d.ts +88 -0
  88. package/dist/Components/OrganizationDetails/OrganizationDetailsProps.js +2 -0
  89. package/dist/Components/PdfViewer/PdfViewer.d.ts +15 -0
  90. package/dist/Components/PdfViewer/PdfViewer.js +29 -0
  91. package/dist/Components/RolesPermission/DeleteRoleModal.d.ts +4 -0
  92. package/dist/Components/RolesPermission/DeleteRoleModal.js +29 -0
  93. package/dist/Components/RolesPermission/RolesPermission.d.ts +4 -0
  94. package/dist/Components/RolesPermission/RolesPermission.js +243 -0
  95. package/dist/Components/RolesPermission/RolesPermission.test.d.ts +1 -0
  96. package/dist/Components/RolesPermission/RolesPermission.test.js +150 -0
  97. package/dist/Components/RolesPermission/RolesPermissionProps.d.ts +117 -0
  98. package/dist/Components/RolesPermission/RolesPermissionProps.js +2 -0
  99. package/dist/Components/ScrollToTop/ScrollToTop.d.ts +19 -0
  100. package/dist/Components/ScrollToTop/ScrollToTop.js +104 -0
  101. package/dist/Components/SideBar/components/OtherApps.test.js +3 -2
  102. package/dist/Components/SignInActivityTable/SignInActivityTable.d.ts +4 -0
  103. package/dist/Components/SignInActivityTable/SignInActivityTable.js +95 -0
  104. package/dist/Components/SignInActivityTable/SignInActivityTable.test.d.ts +1 -0
  105. package/dist/Components/SignInActivityTable/SignInActivityTable.test.js +63 -0
  106. package/dist/Components/SignInActivityTable/SignInActivityTableProps.d.ts +21 -0
  107. package/dist/Components/SignInActivityTable/SignInActivityTableProps.js +2 -0
  108. package/dist/Components/StageProgress/StageItem.d.ts +4 -0
  109. package/dist/Components/StageProgress/StageItem.js +137 -0
  110. package/dist/Components/StageProgress/StageProgress.d.ts +4 -0
  111. package/dist/Components/StageProgress/StageProgress.js +59 -0
  112. package/dist/Components/StageProgress/StageProgressProps.d.ts +85 -0
  113. package/dist/Components/StageProgress/StageProgressProps.js +27 -0
  114. package/dist/Components/StageProgress/StepperStage.d.ts +4 -0
  115. package/dist/Components/StageProgress/StepperStage.js +78 -0
  116. package/dist/Components/Table/Table.js +81 -34
  117. package/dist/Components/Table/TableProps.d.ts +4 -2
  118. package/dist/Components/Table/components/Pagination.js +1 -1
  119. package/dist/Components/Table/components/TableBody.js +15 -12
  120. package/dist/Components/Table/components/TableBody.virtualize.test.js +13 -3
  121. package/dist/Components/Table/components/TableHeader.d.ts +1 -1
  122. package/dist/Components/Table/components/TableHeader.js +9 -9
  123. package/dist/Components/Table/hooks/useTable.d.ts +1 -0
  124. package/dist/Components/Table/hooks/useTable.js +21 -8
  125. package/dist/Components/Table/settings/ManageColumns.test.js +1 -0
  126. package/dist/Components/Tag/Tag.d.ts +3 -11
  127. package/dist/Components/Tag/Tag.js +10 -2
  128. package/dist/Components/Tag/Tag.styles.d.ts +2 -2
  129. package/dist/Components/Tag/Tag.styles.js +58 -33
  130. package/dist/Components/Tag/Tag.test.d.ts +1 -0
  131. package/dist/Components/Tag/Tag.test.js +68 -0
  132. package/dist/Components/Tag/TagProps.d.ts +13 -0
  133. package/dist/Components/Tag/TagProps.js +2 -0
  134. package/dist/Components/UpgradeButton/UpgradeButton.d.ts +4 -0
  135. package/dist/Components/UpgradeButton/UpgradeButton.js +73 -0
  136. package/dist/Components/UpgradeButton/UpgradeButtonProps.d.ts +43 -0
  137. package/dist/Components/UpgradeButton/UpgradeButtonProps.js +2 -0
  138. package/dist/Components/UserDetails/AddUserModal.d.ts +4 -0
  139. package/dist/Components/UserDetails/AddUserModal.js +218 -0
  140. package/dist/Components/UserDetails/ChangeRoleModal.d.ts +4 -0
  141. package/dist/Components/UserDetails/ChangeRoleModal.js +150 -0
  142. package/dist/Components/UserDetails/DeactivateConfirmModal.d.ts +4 -0
  143. package/dist/Components/UserDetails/DeactivateConfirmModal.js +34 -0
  144. package/dist/Components/UserDetails/UserDetails.d.ts +4 -0
  145. package/dist/Components/UserDetails/UserDetails.js +263 -0
  146. package/dist/Components/UserDetails/UserDetails.test.d.ts +1 -0
  147. package/dist/Components/UserDetails/UserDetails.test.js +129 -0
  148. package/dist/Components/UserDetails/UserDetailsProps.d.ts +151 -0
  149. package/dist/Components/UserDetails/UserDetailsProps.js +2 -0
  150. package/dist/Theme/componentStyles.d.ts +1 -1
  151. package/dist/Theme/index.d.ts +4 -4
  152. package/dist/Theme/index.js +4 -4
  153. package/dist/index.d.ts +23 -1
  154. package/dist/index.js +37 -2
  155. package/package.json +2 -2
  156. package/.claude/settings.local.json +0 -44
  157. package/coverage/clover.xml +0 -638
  158. package/coverage/coverage-final.json +0 -20
  159. package/coverage/lcov-report/Table/CompactSelect.tsx.html +0 -379
  160. package/coverage/lcov-report/Table/Components/ActiveFilters.tsx.html +0 -514
  161. package/coverage/lcov-report/Table/Components/HeaderActions.tsx.html +0 -373
  162. package/coverage/lcov-report/Table/Components/Pagination.tsx.html +0 -574
  163. package/coverage/lcov-report/Table/Components/TableActions.tsx.html +0 -574
  164. package/coverage/lcov-report/Table/Components/TableBody.tsx.html +0 -1027
  165. package/coverage/lcov-report/Table/Components/TableFilters.tsx.html +0 -397
  166. package/coverage/lcov-report/Table/Components/TableHeader.tsx.html +0 -1060
  167. package/coverage/lcov-report/Table/Components/TableLoading.tsx.html +0 -361
  168. package/coverage/lcov-report/Table/Components/TableSearch.tsx.html +0 -337
  169. package/coverage/lcov-report/Table/Components/index.html +0 -266
  170. package/coverage/lcov-report/Table/Components/useDebounce.ts.html +0 -178
  171. package/coverage/lcov-report/Table/Components/useTable.ts.html +0 -778
  172. package/coverage/lcov-report/Table/LeftFilterPane.tsx.html +0 -1810
  173. package/coverage/lcov-report/Table/SelectOperationControls.tsx.html +0 -178
  174. package/coverage/lcov-report/Table/Table.tsx.html +0 -1567
  175. package/coverage/lcov-report/Table/TableProps.tsx.html +0 -658
  176. package/coverage/lcov-report/Table/TableSettings/ManageColumns.tsx.html +0 -619
  177. package/coverage/lcov-report/Table/TableSettings/TableFilters.tsx.html +0 -229
  178. package/coverage/lcov-report/Table/TableSettings/TableSettings.tsx.html +0 -532
  179. package/coverage/lcov-report/Table/TableSettings/index.html +0 -146
  180. package/coverage/lcov-report/Table/TableToDo.tsx.html +0 -973
  181. package/coverage/lcov-report/Table/TextOperationControls.tsx.html +0 -271
  182. package/coverage/lcov-report/Table/filterTypes.ts.html +0 -97
  183. package/coverage/lcov-report/Table/index.html +0 -176
  184. package/coverage/lcov-report/base.css +0 -224
  185. package/coverage/lcov-report/block-navigation.js +0 -87
  186. package/coverage/lcov-report/favicon.png +0 -0
  187. package/coverage/lcov-report/index.html +0 -146
  188. package/coverage/lcov-report/prettify.css +0 -1
  189. package/coverage/lcov-report/prettify.js +0 -2
  190. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  191. package/coverage/lcov-report/sorter.js +0 -210
  192. package/coverage/lcov.info +0 -1836
  193. package/dist/Assets/defaultLogo.tsx +0 -31
@@ -0,0 +1,102 @@
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("@testing-library/react");
8
+ require("@testing-library/jest-dom");
9
+ var react_3 = require("@chakra-ui/react");
10
+ var DropDown_1 = __importDefault(require("./DropDown"));
11
+ jest.mock("../../Theme/useCustomTheme", function () { return ({
12
+ useCustomTheme: function () { return ({
13
+ colors: {
14
+ white: "#ffffff",
15
+ gray: { 100: "#f0f0f0", 200: "#e2e8f0", 300: "#cbd5e1", 400: "#94a3b8", 500: "#64748b", 700: "#334155" },
16
+ primary: { 600: "#4f46e5", 700: "#4338ca", opacity: { 8: "rgba(99,102,241,0.08)" } },
17
+ boxborder: { 100: "#eef2f6", 200: "#e2e8f0" },
18
+ text: { 700: "#334155" },
19
+ },
20
+ shadows: { lg: "0 10px 15px rgba(0,0,0,0.1)" },
21
+ }); },
22
+ }); });
23
+ beforeAll(function () {
24
+ Object.defineProperty(window, "matchMedia", {
25
+ writable: true,
26
+ configurable: true,
27
+ value: jest.fn().mockImplementation(function (query) { return ({
28
+ matches: false,
29
+ media: query,
30
+ onchange: null,
31
+ addListener: jest.fn(),
32
+ removeListener: jest.fn(),
33
+ addEventListener: jest.fn(),
34
+ removeEventListener: jest.fn(),
35
+ dispatchEvent: jest.fn(),
36
+ }); }),
37
+ });
38
+ Object.defineProperty(window, "innerWidth", { writable: true, configurable: true, value: 1000 });
39
+ Object.defineProperty(window, "innerHeight", { writable: true, configurable: true, value: 800 });
40
+ });
41
+ var options = [
42
+ { id: 1, label: "Upload file" },
43
+ { id: 2, label: "Documents" },
44
+ ];
45
+ var renderWithChakra = function (ui) {
46
+ return (0, react_2.render)(react_1.default.createElement(react_3.ChakraProvider, null, ui));
47
+ };
48
+ describe("Dropdown", function () {
49
+ it("renders the trigger and opens the menu on click", function () {
50
+ var onSelect = jest.fn();
51
+ renderWithChakra(react_1.default.createElement(DropDown_1.default, { ButtonText: "Actions", options: options, handleOptionSelect: onSelect }));
52
+ var trigger = react_2.screen.getByRole("button", { name: /actions/i });
53
+ expect(trigger).toBeInTheDocument();
54
+ expect(react_2.screen.queryByText("Upload file")).not.toBeInTheDocument();
55
+ react_2.fireEvent.click(trigger);
56
+ expect(react_2.screen.getByText("Upload file")).toBeInTheDocument();
57
+ expect(react_2.screen.getByText("Documents")).toBeInTheDocument();
58
+ });
59
+ it("calls handleOptionSelect with the chosen option", function () {
60
+ var onSelect = jest.fn();
61
+ renderWithChakra(react_1.default.createElement(DropDown_1.default, { ButtonText: "Actions", options: options, handleOptionSelect: onSelect }));
62
+ react_2.fireEvent.click(react_2.screen.getByRole("button", { name: /actions/i }));
63
+ react_2.fireEvent.click(react_2.screen.getByText("Documents"));
64
+ expect(onSelect).toHaveBeenCalledWith(2, "Documents");
65
+ });
66
+ it("clamps the menu within the viewport when the trigger is near the right edge", function () {
67
+ var onSelect = jest.fn();
68
+ var container = renderWithChakra(react_1.default.createElement(DropDown_1.default, { ButtonText: "Actions", options: options, handleOptionSelect: onSelect })).container;
69
+ var trigger = react_2.screen.getByRole("button", { name: /actions/i });
70
+ var anchor = container.querySelector("div");
71
+ // Trigger sits flush against the right edge (viewport width = 1000).
72
+ jest
73
+ .spyOn(anchor, "getBoundingClientRect")
74
+ .mockReturnValue({
75
+ top: 100,
76
+ bottom: 140,
77
+ left: 960,
78
+ right: 1000,
79
+ width: 40,
80
+ height: 40,
81
+ x: 960,
82
+ y: 100,
83
+ toJSON: function () { return ({}); },
84
+ });
85
+ react_2.fireEvent.click(trigger);
86
+ // Walk up from the rendered option to the fixed-position menu container.
87
+ var node = react_2.screen.getByText("Upload file");
88
+ var menu = null;
89
+ while (node) {
90
+ if (getComputedStyle(node).position === "fixed") {
91
+ menu = node;
92
+ break;
93
+ }
94
+ node = node.parentElement;
95
+ }
96
+ expect(menu).toBeTruthy();
97
+ var left = parseFloat(getComputedStyle(menu).left);
98
+ // Must be pulled left of the trigger so it does not overflow the right edge.
99
+ expect(left).toBeLessThan(960);
100
+ expect(left).toBeGreaterThanOrEqual(8);
101
+ });
102
+ });
@@ -14,7 +14,10 @@ export type DropdownProps = {
14
14
  ItemStyle?: React.CSSProperties;
15
15
  LabelStyle?: React.CSSProperties;
16
16
  ImageStyle?: React.CSSProperties;
17
- optionsSize?: "sm" | "md";
17
+ /** Overall size of the trigger + options (like Button sizes). */
18
+ size?: "xs" | "sm" | "md" | "lg" | "xl";
19
+ /** @deprecated Use `size` instead. Kept for backward compatibility. */
20
+ optionsSize?: "sm" | "md" | "lg";
18
21
  divider?: boolean;
19
22
  };
20
23
  type Option = {
@@ -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 });
@@ -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;