pixelize-design-library 2.3.1-beta.9 → 2.3.3

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 (199) 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 +15 -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/SearchSelect/SearchSelect.dropdownPosition.test.d.ts +1 -0
  102. package/dist/Components/SearchSelect/SearchSelect.dropdownPosition.test.js +195 -0
  103. package/dist/Components/SearchSelect/SearchSelect.insideSelect.test.d.ts +1 -0
  104. package/dist/Components/SearchSelect/SearchSelect.insideSelect.test.js +274 -0
  105. package/dist/Components/SearchSelect/SearchSelect.js +133 -39
  106. package/dist/Components/SearchSelect/SearchSelectProps.d.ts +2 -0
  107. package/dist/Components/SideBar/components/OtherApps.test.js +3 -2
  108. package/dist/Components/SignInActivityTable/SignInActivityTable.d.ts +4 -0
  109. package/dist/Components/SignInActivityTable/SignInActivityTable.js +95 -0
  110. package/dist/Components/SignInActivityTable/SignInActivityTable.test.d.ts +1 -0
  111. package/dist/Components/SignInActivityTable/SignInActivityTable.test.js +63 -0
  112. package/dist/Components/SignInActivityTable/SignInActivityTableProps.d.ts +21 -0
  113. package/dist/Components/SignInActivityTable/SignInActivityTableProps.js +2 -0
  114. package/dist/Components/StageProgress/StageItem.d.ts +4 -0
  115. package/dist/Components/StageProgress/StageItem.js +137 -0
  116. package/dist/Components/StageProgress/StageProgress.d.ts +4 -0
  117. package/dist/Components/StageProgress/StageProgress.js +59 -0
  118. package/dist/Components/StageProgress/StageProgressProps.d.ts +85 -0
  119. package/dist/Components/StageProgress/StageProgressProps.js +27 -0
  120. package/dist/Components/StageProgress/StepperStage.d.ts +4 -0
  121. package/dist/Components/StageProgress/StepperStage.js +78 -0
  122. package/dist/Components/Table/Table.js +66 -45
  123. package/dist/Components/Table/TableProps.d.ts +4 -2
  124. package/dist/Components/Table/components/Pagination.js +1 -1
  125. package/dist/Components/Table/components/TableBody.js +15 -12
  126. package/dist/Components/Table/components/TableBody.virtualize.test.js +13 -3
  127. package/dist/Components/Table/components/TableHeader.d.ts +1 -1
  128. package/dist/Components/Table/components/TableHeader.js +9 -9
  129. package/dist/Components/Table/hooks/useTable.d.ts +1 -0
  130. package/dist/Components/Table/hooks/useTable.js +21 -8
  131. package/dist/Components/Table/settings/ManageColumns.test.js +1 -0
  132. package/dist/Components/Tag/Tag.d.ts +3 -11
  133. package/dist/Components/Tag/Tag.js +10 -2
  134. package/dist/Components/Tag/Tag.styles.d.ts +2 -2
  135. package/dist/Components/Tag/Tag.styles.js +58 -33
  136. package/dist/Components/Tag/Tag.test.d.ts +1 -0
  137. package/dist/Components/Tag/Tag.test.js +68 -0
  138. package/dist/Components/Tag/TagProps.d.ts +13 -0
  139. package/dist/Components/Tag/TagProps.js +2 -0
  140. package/dist/Components/UpgradeButton/UpgradeButton.d.ts +4 -0
  141. package/dist/Components/UpgradeButton/UpgradeButton.js +73 -0
  142. package/dist/Components/UpgradeButton/UpgradeButtonProps.d.ts +43 -0
  143. package/dist/Components/UpgradeButton/UpgradeButtonProps.js +2 -0
  144. package/dist/Components/UserDetails/AddUserModal.d.ts +4 -0
  145. package/dist/Components/UserDetails/AddUserModal.js +218 -0
  146. package/dist/Components/UserDetails/ChangeRoleModal.d.ts +4 -0
  147. package/dist/Components/UserDetails/ChangeRoleModal.js +150 -0
  148. package/dist/Components/UserDetails/DeactivateConfirmModal.d.ts +4 -0
  149. package/dist/Components/UserDetails/DeactivateConfirmModal.js +34 -0
  150. package/dist/Components/UserDetails/UserDetails.d.ts +4 -0
  151. package/dist/Components/UserDetails/UserDetails.js +263 -0
  152. package/dist/Components/UserDetails/UserDetails.test.d.ts +1 -0
  153. package/dist/Components/UserDetails/UserDetails.test.js +129 -0
  154. package/dist/Components/UserDetails/UserDetailsProps.d.ts +151 -0
  155. package/dist/Components/UserDetails/UserDetailsProps.js +2 -0
  156. package/dist/Theme/componentStyles.d.ts +1 -1
  157. package/dist/Theme/index.d.ts +4 -4
  158. package/dist/Theme/index.js +4 -4
  159. package/dist/index.d.ts +23 -1
  160. package/dist/index.js +37 -2
  161. package/package.json +2 -2
  162. package/.claude/settings.local.json +0 -44
  163. package/coverage/clover.xml +0 -638
  164. package/coverage/coverage-final.json +0 -20
  165. package/coverage/lcov-report/Table/CompactSelect.tsx.html +0 -379
  166. package/coverage/lcov-report/Table/Components/ActiveFilters.tsx.html +0 -514
  167. package/coverage/lcov-report/Table/Components/HeaderActions.tsx.html +0 -373
  168. package/coverage/lcov-report/Table/Components/Pagination.tsx.html +0 -574
  169. package/coverage/lcov-report/Table/Components/TableActions.tsx.html +0 -574
  170. package/coverage/lcov-report/Table/Components/TableBody.tsx.html +0 -1027
  171. package/coverage/lcov-report/Table/Components/TableFilters.tsx.html +0 -397
  172. package/coverage/lcov-report/Table/Components/TableHeader.tsx.html +0 -1060
  173. package/coverage/lcov-report/Table/Components/TableLoading.tsx.html +0 -361
  174. package/coverage/lcov-report/Table/Components/TableSearch.tsx.html +0 -337
  175. package/coverage/lcov-report/Table/Components/index.html +0 -266
  176. package/coverage/lcov-report/Table/Components/useDebounce.ts.html +0 -178
  177. package/coverage/lcov-report/Table/Components/useTable.ts.html +0 -778
  178. package/coverage/lcov-report/Table/LeftFilterPane.tsx.html +0 -1810
  179. package/coverage/lcov-report/Table/SelectOperationControls.tsx.html +0 -178
  180. package/coverage/lcov-report/Table/Table.tsx.html +0 -1567
  181. package/coverage/lcov-report/Table/TableProps.tsx.html +0 -658
  182. package/coverage/lcov-report/Table/TableSettings/ManageColumns.tsx.html +0 -619
  183. package/coverage/lcov-report/Table/TableSettings/TableFilters.tsx.html +0 -229
  184. package/coverage/lcov-report/Table/TableSettings/TableSettings.tsx.html +0 -532
  185. package/coverage/lcov-report/Table/TableSettings/index.html +0 -146
  186. package/coverage/lcov-report/Table/TableToDo.tsx.html +0 -973
  187. package/coverage/lcov-report/Table/TextOperationControls.tsx.html +0 -271
  188. package/coverage/lcov-report/Table/filterTypes.ts.html +0 -97
  189. package/coverage/lcov-report/Table/index.html +0 -176
  190. package/coverage/lcov-report/base.css +0 -224
  191. package/coverage/lcov-report/block-navigation.js +0 -87
  192. package/coverage/lcov-report/favicon.png +0 -0
  193. package/coverage/lcov-report/index.html +0 -146
  194. package/coverage/lcov-report/prettify.css +0 -1
  195. package/coverage/lcov-report/prettify.js +0 -2
  196. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  197. package/coverage/lcov-report/sorter.js +0 -210
  198. package/coverage/lcov.info +0 -1836
  199. 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;