pixelize-design-library 2.2.199 → 2.3.1-beta.10

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 (163) hide show
  1. package/.claude/settings.local.json +44 -0
  2. package/coverage/clover.xml +638 -0
  3. package/coverage/coverage-final.json +20 -0
  4. package/coverage/lcov-report/Table/CompactSelect.tsx.html +379 -0
  5. package/coverage/lcov-report/Table/Components/ActiveFilters.tsx.html +514 -0
  6. package/coverage/lcov-report/Table/Components/HeaderActions.tsx.html +373 -0
  7. package/coverage/lcov-report/Table/Components/Pagination.tsx.html +574 -0
  8. package/coverage/lcov-report/Table/Components/TableActions.tsx.html +574 -0
  9. package/coverage/lcov-report/Table/Components/TableBody.tsx.html +1027 -0
  10. package/coverage/lcov-report/Table/Components/TableFilters.tsx.html +397 -0
  11. package/coverage/lcov-report/Table/Components/TableHeader.tsx.html +1060 -0
  12. package/coverage/lcov-report/Table/Components/TableLoading.tsx.html +361 -0
  13. package/coverage/lcov-report/Table/Components/TableSearch.tsx.html +337 -0
  14. package/coverage/lcov-report/Table/Components/index.html +266 -0
  15. package/coverage/lcov-report/Table/Components/useDebounce.ts.html +178 -0
  16. package/coverage/lcov-report/Table/Components/useTable.ts.html +778 -0
  17. package/coverage/lcov-report/Table/LeftFilterPane.tsx.html +1810 -0
  18. package/coverage/lcov-report/Table/SelectOperationControls.tsx.html +178 -0
  19. package/coverage/lcov-report/Table/Table.tsx.html +1567 -0
  20. package/coverage/lcov-report/Table/TableProps.tsx.html +658 -0
  21. package/coverage/lcov-report/Table/TableSettings/ManageColumns.tsx.html +619 -0
  22. package/coverage/lcov-report/Table/TableSettings/TableFilters.tsx.html +229 -0
  23. package/coverage/lcov-report/Table/TableSettings/TableSettings.tsx.html +532 -0
  24. package/coverage/lcov-report/Table/TableSettings/index.html +146 -0
  25. package/coverage/lcov-report/Table/TableToDo.tsx.html +973 -0
  26. package/coverage/lcov-report/Table/TextOperationControls.tsx.html +271 -0
  27. package/coverage/lcov-report/Table/filterTypes.ts.html +97 -0
  28. package/coverage/lcov-report/Table/index.html +176 -0
  29. package/coverage/lcov-report/base.css +224 -0
  30. package/coverage/lcov-report/block-navigation.js +87 -0
  31. package/coverage/lcov-report/favicon.png +0 -0
  32. package/coverage/lcov-report/index.html +146 -0
  33. package/coverage/lcov-report/prettify.css +1 -0
  34. package/coverage/lcov-report/prettify.js +2 -0
  35. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  36. package/coverage/lcov-report/sorter.js +210 -0
  37. package/coverage/lcov.info +1836 -0
  38. package/dist/Assets/defaultLogo.tsx +31 -0
  39. package/dist/Components/Accordion/Accordion.js +26 -5
  40. package/dist/Components/Button/Button.styles.js +44 -3
  41. package/dist/Components/Button/ButtonProps.d.ts +1 -1
  42. package/dist/Components/ButtonGroupIcon/ButtonGoupIconProps.d.ts +2 -2
  43. package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +50 -38
  44. package/dist/Components/Card/PaymentCard/PaymentCard.d.ts +1 -1
  45. package/dist/Components/Card/PaymentCard/PaymentCard.js +3 -3
  46. package/dist/Components/Card/PaymentCard/PaymentCardProps.d.ts +0 -1
  47. package/dist/Components/Checkbox/Checkbox.js +2 -2
  48. package/dist/Components/Checkbox/Checkbox.styles.js +2 -0
  49. package/dist/Components/Common/FormLabel.d.ts +2 -1
  50. package/dist/Components/Common/FormLabel.js +8 -9
  51. package/dist/Components/Common/fieldStyles.d.ts +22 -0
  52. package/dist/Components/Common/fieldStyles.js +42 -0
  53. package/dist/Components/DatePicker/CalendarPanel.d.ts +2 -0
  54. package/dist/Components/DatePicker/CalendarPanel.js +104 -65
  55. package/dist/Components/DatePicker/RangeDatePicker.js +37 -16
  56. package/dist/Components/DatePicker/SingleDatePicker.js +16 -16
  57. package/dist/Components/DatePicker/TimePicker.js +4 -4
  58. package/dist/Components/Input/Input/Input.d.ts +1 -1
  59. package/dist/Components/Input/Input/Input.js +5 -4
  60. package/dist/Components/Input/Input/InputProps.d.ts +2 -0
  61. package/dist/Components/Input/TextInput.styles.js +2 -1
  62. package/dist/Components/InputTextArea/InputTextArea.style.js +2 -1
  63. package/dist/Components/KanbanBoard/AccountCard.js +17 -14
  64. package/dist/Components/KanbanBoard/KanbanBoard.js +93 -78
  65. package/dist/Components/MultiSelect/MultiSelect.js +11 -12
  66. package/dist/Components/NavigationBar/NavigationBar.d.ts +1 -1
  67. package/dist/Components/NavigationBar/NavigationBar.js +57 -30
  68. package/dist/Components/NavigationBar/NavigationBarProps.d.ts +1 -0
  69. package/dist/Components/NoteTextArea/NoteTextArea.js +44 -40
  70. package/dist/Components/NumberInput/NumberInput.styles.js +2 -1
  71. package/dist/Components/PinInput/PinInput.d.ts +1 -1
  72. package/dist/Components/PinInput/PinInput.js +3 -2
  73. package/dist/Components/PinInput/PinInputProps.d.ts +4 -0
  74. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.d.ts +1 -1
  75. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +42 -24
  76. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewerProps.d.ts +2 -0
  77. package/dist/Components/RadioButton/RadioButton.js +1 -1
  78. package/dist/Components/SearchSelect/SearchSelect.d.ts +1 -1
  79. package/dist/Components/SearchSelect/SearchSelect.js +56 -24
  80. package/dist/Components/SearchSelect/SearchSelectProps.d.ts +2 -0
  81. package/dist/Components/Select/Select.styles.js +2 -1
  82. package/dist/Components/SelectSearch/SelectSearch.js +7 -4
  83. package/dist/Components/SideBar/SecondaryBar.js +20 -18
  84. package/dist/Components/SideBar/SideBar.d.ts +1 -1
  85. package/dist/Components/SideBar/SideBar.js +58 -43
  86. package/dist/Components/SideBar/SideBarProps.d.ts +14 -3
  87. package/dist/Components/SideBar/components/MenuItemBox.js +28 -24
  88. package/dist/Components/SideBar/components/MenuItems.js +16 -2
  89. package/dist/Components/SideBar/components/MenuPopoverContent.js +16 -16
  90. package/dist/Components/SideBar/components/OtherApps.js +16 -14
  91. package/dist/Components/Table/Table.d.ts +1 -1
  92. package/dist/Components/Table/Table.js +234 -38
  93. package/dist/Components/Table/TableProps.d.ts +42 -2
  94. package/dist/Components/Table/{Components → components}/TableActions.d.ts +2 -2
  95. package/dist/Components/Table/{Components → components}/TableActions.js +5 -4
  96. package/dist/Components/Table/{Components → components}/TableBody.d.ts +5 -1
  97. package/dist/Components/Table/components/TableBody.js +369 -0
  98. package/dist/Components/Table/components/TableGroupRow.d.ts +15 -0
  99. package/dist/Components/Table/components/TableGroupRow.js +27 -0
  100. package/dist/Components/Table/{Components → components}/TableHeader.js +18 -8
  101. package/dist/Components/Table/{LeftFilterPane.js → filters/LeftFilterPane.js} +3 -3
  102. package/dist/Components/Table/{Components → hooks}/useTable.d.ts +1 -1
  103. package/dist/Components/Table/{Components → hooks}/useTable.js +8 -7
  104. package/dist/Components/Table/settings/TableSettings.d.ts +11 -0
  105. package/dist/Components/Table/settings/TableSettings.js +165 -0
  106. package/dist/Components/Timeline/Timeline.d.ts +1 -1
  107. package/dist/Components/Timeline/Timeline.js +145 -78
  108. package/dist/Components/Toaster/Toaster.js +40 -20
  109. package/dist/Theme/Default/palette.d.ts +4 -0
  110. package/dist/Theme/Default/palette.js +3 -0
  111. package/dist/Theme/Emerald/palette.d.ts +4 -0
  112. package/dist/Theme/Emerald/palette.js +2 -1
  113. package/dist/Theme/Meadow/palette.d.ts +4 -0
  114. package/dist/Theme/Meadow/palette.js +2 -1
  115. package/dist/Theme/Radiant/palette.d.ts +4 -0
  116. package/dist/Theme/Radiant/palette.js +2 -1
  117. package/dist/Theme/Rosewood/palette.d.ts +4 -0
  118. package/dist/Theme/Rosewood/palette.js +2 -1
  119. package/dist/Theme/Skyline/palette.d.ts +4 -0
  120. package/dist/Theme/Skyline/palette.js +2 -1
  121. package/dist/Theme/Slate/palette.d.ts +4 -0
  122. package/dist/Theme/Slate/palette.js +2 -1
  123. package/dist/Theme/themeProps.d.ts +4 -0
  124. package/dist/Utils/table.d.ts +26 -0
  125. package/dist/Utils/table.js +142 -38
  126. package/package.json +2 -2
  127. package/dist/Components/Table/Components/TableBody.js +0 -201
  128. package/dist/Components/Table/TableSettings/TableFilters.d.ts +0 -10
  129. package/dist/Components/Table/TableSettings/TableFilters.js +0 -69
  130. package/dist/Components/Table/TableSettings/TableFilters.test.d.ts +0 -1
  131. package/dist/Components/Table/TableSettings/TableFilters.test.js +0 -109
  132. package/dist/Components/Table/TableSettings/TableSettings.d.ts +0 -8
  133. package/dist/Components/Table/TableSettings/TableSettings.js +0 -141
  134. package/dist/Components/Table/TableToDo.d.ts +0 -2
  135. package/dist/Components/Table/TableToDo.js +0 -291
  136. /package/dist/Components/Table/{Components → components}/HeaderActions.d.ts +0 -0
  137. /package/dist/Components/Table/{Components → components}/HeaderActions.js +0 -0
  138. /package/dist/Components/Table/{Components → components}/Pagination.d.ts +0 -0
  139. /package/dist/Components/Table/{Components → components}/Pagination.js +0 -0
  140. /package/dist/Components/Table/{Components → components}/TableBody.virtualize.test.d.ts +0 -0
  141. /package/dist/Components/Table/{Components → components}/TableBody.virtualize.test.js +0 -0
  142. /package/dist/Components/Table/{Components → components}/TableHeader.d.ts +0 -0
  143. /package/dist/Components/Table/{Components → components}/TableLoading.d.ts +0 -0
  144. /package/dist/Components/Table/{Components → components}/TableLoading.js +0 -0
  145. /package/dist/Components/Table/{Components → components}/TableSearch.d.ts +0 -0
  146. /package/dist/Components/Table/{Components → components}/TableSearch.js +0 -0
  147. /package/dist/Components/Table/{Components → filters}/ActiveFilters.d.ts +0 -0
  148. /package/dist/Components/Table/{Components → filters}/ActiveFilters.js +0 -0
  149. /package/dist/Components/Table/{CompactSelect.d.ts → filters/CompactSelect.d.ts} +0 -0
  150. /package/dist/Components/Table/{CompactSelect.js → filters/CompactSelect.js} +0 -0
  151. /package/dist/Components/Table/{LeftFilterPane.d.ts → filters/LeftFilterPane.d.ts} +0 -0
  152. /package/dist/Components/Table/{SelectOperationControls.d.ts → filters/SelectOperationControls.d.ts} +0 -0
  153. /package/dist/Components/Table/{SelectOperationControls.js → filters/SelectOperationControls.js} +0 -0
  154. /package/dist/Components/Table/{Components → filters}/TableFilters.d.ts +0 -0
  155. /package/dist/Components/Table/{Components → filters}/TableFilters.js +0 -0
  156. /package/dist/Components/Table/{TextOperationControls.d.ts → filters/TextOperationControls.d.ts} +0 -0
  157. /package/dist/Components/Table/{TextOperationControls.js → filters/TextOperationControls.js} +0 -0
  158. /package/dist/Components/Table/{Components → hooks}/useDebounce.d.ts +0 -0
  159. /package/dist/Components/Table/{Components → hooks}/useDebounce.js +0 -0
  160. /package/dist/Components/Table/{TableSettings → settings}/ManageColumns.d.ts +0 -0
  161. /package/dist/Components/Table/{TableSettings → settings}/ManageColumns.js +0 -0
  162. /package/dist/Components/Table/{TableSettings → settings}/ManageColumns.test.d.ts +0 -0
  163. /package/dist/Components/Table/{TableSettings → settings}/ManageColumns.test.js +0 -0
@@ -47,6 +47,7 @@ var react_1 = __importStar(require("react"));
47
47
  var react_2 = require("@chakra-ui/react");
48
48
  var lucide_react_1 = require("lucide-react");
49
49
  var useCustomTheme_1 = require("../../Theme/useCustomTheme");
50
+ var fieldStyles_1 = require("../Common/fieldStyles");
50
51
  var countWords = function (text) {
51
52
  if (text === void 0) { text = ""; }
52
53
  var t = text.trim();
@@ -160,43 +161,45 @@ function NoteTextArea(_a) {
160
161
  var start = nameWithoutExtension.substring(0, maxLength - extension.length - 3);
161
162
  return "".concat(start, "...").concat(extension);
162
163
  };
163
- return (react_1.default.createElement(react_2.Box, { w: width, borderRadius: "0.25rem", overflow: "hidden", border: "1px solid", borderColor: isActive ? theme.colors.primary[300] : theme.colors.gray[200], bg: isActive ? theme.colors.gray[50] : "transparent", boxShadow: isActive ? "0 0 0 0.125rem ".concat((_b = theme.colors.boxShadow) === null || _b === void 0 ? void 0 : _b.primary) : "none" },
164
- !isActive && (react_1.default.createElement(react_2.Flex, { px: 4, align: "center", cursor: "text", onClick: handleTextArea, bg: theme.colors.white, borderRadius: "0.25rem", minH: "44px" },
165
- react_1.default.createElement(react_2.Text, { color: theme.colors.gray[300], fontStyle: "italic", fontSize: "md" }, customPlaceholder))),
164
+ var noteWordCount = countWords(noteValue);
165
+ var isOverLimit = noteWordCount > maxNoteWordCount;
166
+ return (react_1.default.createElement(react_2.Box, { w: width, borderRadius: fieldStyles_1.FIELD_RADIUS, overflow: "hidden", border: "1px solid", borderColor: isActive ? theme.colors.primary[500] : (_b = theme.colors.boxborder) === null || _b === void 0 ? void 0 : _b[500], bg: isActive ? theme.colors.gray[50] : theme.colors.white, transition: "border-color 0.2s" },
167
+ !isActive && (react_1.default.createElement(react_2.Flex, { px: 3, gap: 2, align: "center", cursor: "text", onClick: handleTextArea, bg: theme.colors.white, borderRadius: fieldStyles_1.FIELD_RADIUS, minH: "2.5rem", transition: "background 0.15s", _hover: { bg: theme.colors.gray[50] } },
168
+ react_1.default.createElement(lucide_react_1.SquarePen, { size: 16, color: theme.colors.gray[500] }),
169
+ react_1.default.createElement(react_2.Text, { color: theme.colors.gray[500], fontSize: "sm" }, customPlaceholder))),
166
170
  isActive && (react_1.default.createElement(react_1.default.Fragment, null,
167
171
  react_1.default.createElement(react_2.Box, { bg: theme.colors.white },
168
- titleShow && (react_1.default.createElement(react_2.Input, { ref: inputRef, value: titleValue, onChange: function (e) {
169
- if (e.target.value.length === 0)
170
- setTitleShow(false);
171
- setTitleValue(e.target.value);
172
- }, placeholder: "Add a title...", variant: "unstyled", pl: 3, fontWeight: 500, fontSize: "0.95rem", _placeholder: {
173
- fontStyle: "italic",
174
- color: theme.colors.gray[300],
175
- background: theme.colors.white,
176
- } })),
177
- react_1.default.createElement(react_2.Box, { bg: theme.colors.white, minH: "80px", pl: 3, pt: 2, position: "relative" },
178
- react_1.default.createElement(react_2.Textarea, { ref: noteAreaRef, value: noteValue, onChange: handleNoteChange, placeholder: customPlaceholder, variant: "unstyled", resize: "none", minH: "80px", _placeholder: { fontStyle: "italic", color: theme.colors.gray[300] }, style: { overflow: "hidden" }, p: 0 }))),
179
- react_1.default.createElement(react_2.Divider, null),
180
- react_1.default.createElement(react_2.Box, { px: 4, py: 3 },
181
- react_1.default.createElement(react_2.Flex, { align: "center", justify: "space-between", w: "100%" },
182
- react_1.default.createElement(react_2.Flex, { align: "center", gap: 3, minW: 0 },
183
- react_1.default.createElement(react_2.Box, { as: "label", htmlFor: "file-upload", cursor: "pointer", display: "flex", alignItems: "center", gap: 2 },
184
- react_1.default.createElement(lucide_react_1.Paperclip, { size: 18 })),
185
- react_1.default.createElement(react_2.Box, { h: "18px", w: "1px", bg: theme.colors.gray[200] }),
186
- !titleShow ? (react_1.default.createElement(react_2.Text, { onClick: function () { return setTitleShow(true); }, cursor: "pointer", color: theme.colors.gray[600], fontWeight: 500, fontSize: "sm" }, "Add a Title")) : (react_1.default.createElement(react_2.Tooltip, { label: titleValue, hasArrow: true, isDisabled: !titleValue },
187
- react_1.default.createElement(react_2.Text, { color: theme.colors.gray[600], fontSize: "sm", fontWeight: 500, isTruncated: true, maxW: "200px", whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }, titleValue || "Title")))),
188
- react_1.default.createElement(react_2.Flex, { gap: 3, align: "center", ml: "auto", flexShrink: 0 },
189
- cancelButtonHide ? null : (react_1.default.createElement(react_1.default.Fragment, null,
190
- react_1.default.createElement(react_2.Button, { variant: "ghost", colorScheme: "gray", borderRadius: "6px", onClick: handleCloseTextArea, _hover: { bg: "transparent" } }, "Cancel"))),
191
- react_1.default.createElement(react_2.Button, { colorScheme: "purple", borderRadius: "8px", isLoading: !!saveButtonLoading, isDisabled: !noteValue || isSaveDisabled, onClick: function () { return handleSubmit(noteValue, titleValue, files); } },
172
+ titleShow && (react_1.default.createElement(react_1.default.Fragment, null,
173
+ react_1.default.createElement(react_2.Input, { ref: inputRef, value: titleValue, onChange: function (e) {
174
+ if (e.target.value.length === 0)
175
+ setTitleShow(false);
176
+ setTitleValue(e.target.value);
177
+ }, placeholder: "Add a title...", variant: "unstyled", px: 3, pt: 2.5, pb: 1.5, fontWeight: 600, fontSize: "0.875rem", color: theme.colors.text[700], _placeholder: {
178
+ fontStyle: "italic",
179
+ color: theme.colors.gray[300],
180
+ } }),
181
+ react_1.default.createElement(react_2.Divider, { borderColor: theme.colors.gray[200] }))),
182
+ react_1.default.createElement(react_2.Box, { bg: theme.colors.white, minH: "76px", px: 3, pt: 2.5, position: "relative" },
183
+ react_1.default.createElement(react_2.Textarea, { ref: noteAreaRef, value: noteValue, onChange: handleNoteChange, placeholder: customPlaceholder, variant: "unstyled", resize: "none", minH: "76px", fontSize: "0.75rem", color: theme.colors.text[700], _placeholder: { fontStyle: "italic", color: theme.colors.gray[300] }, style: { overflow: "hidden" }, p: 0 }))),
184
+ react_1.default.createElement(react_2.Divider, { borderColor: theme.colors.gray[200] }),
185
+ react_1.default.createElement(react_2.Box, { px: 3, py: 2.5 },
186
+ react_1.default.createElement(react_2.Flex, { align: "center", justify: "space-between", w: "100%", gap: 3 },
187
+ react_1.default.createElement(react_2.Flex, { align: "center", gap: 2, minW: 0 },
188
+ react_1.default.createElement(react_2.Tooltip, { label: "Attach files", hasArrow: true, placement: "top" },
189
+ react_1.default.createElement(react_2.Box, { as: "label", htmlFor: "file-upload", cursor: "pointer", display: "flex", alignItems: "center", justifyContent: "center", w: "1.75rem", h: "1.75rem", borderRadius: "md", color: theme.colors.gray[600], transition: "background 0.15s", _hover: { bg: theme.colors.gray[100] } },
190
+ react_1.default.createElement(lucide_react_1.Paperclip, { size: 16 }))),
191
+ react_1.default.createElement(react_2.Box, { h: "1rem", w: "1px", bg: theme.colors.gray[200] }),
192
+ !titleShow ? (react_1.default.createElement(react_2.Box, { as: "button", type: "button", onClick: function () { return setTitleShow(true); }, px: 2, py: 1, borderRadius: "md", color: theme.colors.gray[600], fontWeight: 500, fontSize: "sm", transition: "background 0.15s", _hover: { bg: theme.colors.gray[100] } }, "+ Add a title")) : (react_1.default.createElement(react_2.Tooltip, { label: titleValue, hasArrow: true, isDisabled: !titleValue },
193
+ react_1.default.createElement(react_2.Text, { color: theme.colors.gray[600], fontSize: "sm", fontWeight: 500, isTruncated: true, maxW: "180px" }, titleValue || "Title")))),
194
+ react_1.default.createElement(react_2.Flex, { gap: 2.5, align: "center", ml: "auto", flexShrink: 0 },
195
+ react_1.default.createElement(react_2.Text, { fontSize: "xs", fontWeight: 500, color: isOverLimit ? theme.colors.semantic.error[500] : theme.colors.gray[500], whiteSpace: "nowrap" },
196
+ noteWordCount,
197
+ "/",
198
+ maxNoteWordCount),
199
+ cancelButtonHide ? null : (react_1.default.createElement(react_2.Button, { size: "sm", variant: "ghost", colorScheme: "gray", onClick: handleCloseTextArea }, "Cancel")),
200
+ react_1.default.createElement(react_2.Button, { size: "sm", variant: "solid", isLoading: !!saveButtonLoading, isDisabled: !noteValue || isSaveDisabled, onClick: function () { return handleSubmit(noteValue, titleValue, files); } },
192
201
  saveButtonLoading ? (react_1.default.createElement(react_2.Spinner, { size: "xs", thickness: "2px", mr: 2 })) : null,
193
202
  "Save"))),
194
- react_1.default.createElement(react_2.Flex, { mt: 3, gap: 2, align: "center", color: theme.colors.gray[600], fontSize: "sm" },
195
- react_1.default.createElement(react_2.Text, { fontWeight: 600 }, "Note:"),
196
- react_1.default.createElement(react_2.Text, null,
197
- "You can add up to ",
198
- maxNoteWordCount,
199
- " words only")),
200
203
  react_1.default.createElement("input", { id: "file-upload", type: "file", style: { display: "none" }, onChange: function (e) {
201
204
  var newFiles = Array.from(e.target.files || []);
202
205
  var validFiles = newFiles.filter(function (f) { return f.size <= maxFileSize; });
@@ -211,12 +214,13 @@ function NoteTextArea(_a) {
211
214
  setFiles(function (prev) { return __spreadArray(__spreadArray([], prev, true), validFiles, true); });
212
215
  }
213
216
  }, multiple: true }),
214
- fileError && (react_1.default.createElement(react_2.Text, { color: theme.colors.red[500], mt: 2, fontSize: "sm" }, fileError)),
215
- files.length > 0 && (react_1.default.createElement(react_2.Box, { mt: 3 }, files.map(function (f, idx) { return (react_1.default.createElement(react_2.Flex, { key: idx, align: "center", justify: "space-between", w: "320px", mb: 2 },
216
- react_1.default.createElement(react_2.Flex, { gap: 3, align: "center" },
217
- react_1.default.createElement(react_2.Text, { fontSize: "sm" }, shortenFileName(f.name)),
218
- react_1.default.createElement(react_2.Text, { fontSize: "sm", color: theme.colors.gray[500] }, formatBytes(f.size))),
219
- react_1.default.createElement(lucide_react_1.X, { size: 16, cursor: "pointer", color: theme.colors.red[600], onClick: function () {
217
+ fileError && (react_1.default.createElement(react_2.Text, { color: theme.colors.semantic.error[500], mt: 2, fontSize: "xs" }, fileError)),
218
+ files.length > 0 && (react_1.default.createElement(react_2.Flex, { mt: 3, gap: 2, wrap: "wrap" }, files.map(function (f, idx) { return (react_1.default.createElement(react_2.Flex, { key: idx, align: "center", gap: 2, pl: 2.5, pr: 1.5, py: 1, borderRadius: "full", bg: theme.colors.gray[100], maxW: "100%" },
219
+ react_1.default.createElement(lucide_react_1.File, { size: 13, color: theme.colors.gray[500] }),
220
+ react_1.default.createElement(react_2.Text, { fontSize: "xs", color: theme.colors.text[700], isTruncated: true, maxW: "160px" }, shortenFileName(f.name)),
221
+ react_1.default.createElement(react_2.Text, { fontSize: "xs", color: theme.colors.gray[500], whiteSpace: "nowrap" }, formatBytes(f.size)),
222
+ react_1.default.createElement(react_2.Box, { as: "button", type: "button", display: "flex", alignItems: "center", justifyContent: "center", borderRadius: "full", p: 0.5, color: theme.colors.gray[500], transition: "all 0.15s", _hover: { bg: theme.colors.gray[200], color: theme.colors.semantic.error[500] }, onClick: function () {
220
223
  return setFiles(function (prev) { return prev.filter(function (fileItem) { return fileItem !== f; }); });
221
- } }))); }))))))));
224
+ } },
225
+ react_1.default.createElement(lucide_react_1.X, { size: 13 })))); }))))))));
222
226
  }
@@ -9,7 +9,8 @@ exports.NumberInput = {
9
9
  letterSpacing: "0.044rem",
10
10
  pt: "0.813rem",
11
11
  pb: "0.813rem",
12
- borderRadius: "0.25rem",
12
+ borderRadius: "0.5rem",
13
+ transition: "border-color 0.2s, box-shadow 0.2s",
13
14
  _placeholder: {
14
15
  fontStyle: "italic",
15
16
  },
@@ -1,3 +1,3 @@
1
1
  import React from "react";
2
2
  import { ChakraPinInputProps } from "./PinInputProps";
3
- export default function PinInputs({ otp, mask, defaultValue, placeholder, manageFocus, errorBorderColor, focusBorderColor, onChange, onComplete, type, color, variant, pins, label, }: ChakraPinInputProps): React.JSX.Element;
3
+ export default function PinInputs({ otp, mask, defaultValue, placeholder, manageFocus, errorBorderColor, focusBorderColor, onChange, onComplete, type, color, variant, pins, label, id, isRequired, isInformation, informationMessage, }: ChakraPinInputProps): React.JSX.Element;
@@ -7,11 +7,12 @@ exports.default = PinInputs;
7
7
  var react_1 = __importDefault(require("react"));
8
8
  var react_2 = require("@chakra-ui/react");
9
9
  var useCustomTheme_1 = require("../../Theme/useCustomTheme");
10
+ var FormLabel_1 = require("../Common/FormLabel");
10
11
  function PinInputs(_a) {
11
- var otp = _a.otp, mask = _a.mask, defaultValue = _a.defaultValue, placeholder = _a.placeholder, manageFocus = _a.manageFocus, errorBorderColor = _a.errorBorderColor, focusBorderColor = _a.focusBorderColor, onChange = _a.onChange, onComplete = _a.onComplete, type = _a.type, _b = _a.color, color = _b === void 0 ? "primary" : _b, variant = _a.variant, _c = _a.pins, pins = _c === void 0 ? 3 : _c, label = _a.label;
12
+ var otp = _a.otp, mask = _a.mask, defaultValue = _a.defaultValue, placeholder = _a.placeholder, manageFocus = _a.manageFocus, errorBorderColor = _a.errorBorderColor, focusBorderColor = _a.focusBorderColor, onChange = _a.onChange, onComplete = _a.onComplete, type = _a.type, _b = _a.color, color = _b === void 0 ? "primary" : _b, variant = _a.variant, _c = _a.pins, pins = _c === void 0 ? 3 : _c, label = _a.label, id = _a.id, isRequired = _a.isRequired, isInformation = _a.isInformation, informationMessage = _a.informationMessage;
12
13
  var theme = (0, useCustomTheme_1.useCustomTheme)();
13
14
  return (react_1.default.createElement(react_1.default.Fragment, null,
14
- label && (react_1.default.createElement(react_2.Text, { fontWeight: "bold", marginBottom: "8px" }, label)),
15
+ label && (react_1.default.createElement(FormLabel_1.TextLabel, { label: label, id: id, isRequired: isRequired, isInformation: isInformation, informationMessage: informationMessage })),
15
16
  react_1.default.createElement(react_2.HStack, null,
16
17
  react_1.default.createElement(react_2.PinInput, { otp: otp, mask: mask, defaultValue: defaultValue, placeholder: placeholder, manageFocus: manageFocus, errorBorderColor: errorBorderColor, focusBorderColor: focusBorderColor, onChange: onChange, onComplete: onComplete, type: type, colorScheme: color, variant: variant }, Array.from({ length: pins }).map(function (_, index) { return (react_1.default.createElement(react_2.PinInputField, { key: index, backgroundColor: theme.colors.background[100], borderColor: theme.colors.boxborder[300], _focus: {
17
18
  borderColor: theme.colors.primary[500],
@@ -6,4 +6,8 @@ export type ChakraPinInputProps = Pick<PinInputProps, "otp" | "mask" | "defaultV
6
6
  color?: "gray" | "red" | "orange" | "yellow" | "green" | "teal" | "blue" | "cyan" | "purple" | "pink" | "whiteAlpha" | "blackAlpha" | "primary";
7
7
  pins: number;
8
8
  label?: string;
9
+ id?: string;
10
+ isRequired?: boolean;
11
+ isInformation?: boolean;
12
+ informationMessage?: string;
9
13
  };
@@ -1,3 +1,3 @@
1
1
  import React from "react";
2
2
  import { ProfilePhotoViewerProps } from "./ProfilePhotoViewerProps";
3
- export default function ProfilePhotoViewer({ photoUrl, onPhotoChange, imageWidth, imageAlt, imageObjectFit, imageBorderRadius, editIconSize, editIconPositionRight, editIconPositionBottom, isRound, boxStyle, isEditable, isView, style, handleIsView, fallbackText, }: ProfilePhotoViewerProps): React.JSX.Element;
3
+ export default function ProfilePhotoViewer({ photoUrl, onPhotoChange, imageWidth, imageAlt, imageObjectFit, imageBorderRadius, editIconSize, editIconPositionRight, editIconPositionBottom, isRound, boxStyle, isEditable, isView, style, handleIsView, fallbackText, revealOnHover, }: ProfilePhotoViewerProps): React.JSX.Element;
@@ -50,10 +50,12 @@ var react_2 = require("@chakra-ui/react");
50
50
  var lucide_react_1 = require("lucide-react");
51
51
  var useCustomTheme_1 = require("../../Theme/useCustomTheme");
52
52
  function ProfilePhotoViewer(_a) {
53
- var photoUrl = _a.photoUrl, onPhotoChange = _a.onPhotoChange, _b = _a.imageWidth, imageWidth = _b === void 0 ? "100px" : _b, _c = _a.imageAlt, imageAlt = _c === void 0 ? "Profile Photo" : _c, _d = _a.imageObjectFit, imageObjectFit = _d === void 0 ? "cover" : _d, _e = _a.imageBorderRadius, imageBorderRadius = _e === void 0 ? "full" : _e, _f = _a.editIconSize, editIconSize = _f === void 0 ? "sm" : _f, _g = _a.editIconPositionRight, editIconPositionRight = _g === void 0 ? "0px" : _g, _h = _a.editIconPositionBottom, editIconPositionBottom = _h === void 0 ? "0px" : _h, _j = _a.isRound, isRound = _j === void 0 ? true : _j, boxStyle = _a.boxStyle, _k = _a.isEditable, isEditable = _k === void 0 ? false : _k, _l = _a.isView, isView = _l === void 0 ? false : _l, style = _a.style, handleIsView = _a.handleIsView, fallbackText = _a.fallbackText;
54
- var _m = (0, react_1.useState)(photoUrl), photo = _m[0], setPhoto = _m[1];
53
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y;
54
+ var photoUrl = _a.photoUrl, onPhotoChange = _a.onPhotoChange, _z = _a.imageWidth, imageWidth = _z === void 0 ? "100px" : _z, _0 = _a.imageAlt, imageAlt = _0 === void 0 ? "Profile Photo" : _0, _1 = _a.imageObjectFit, imageObjectFit = _1 === void 0 ? "cover" : _1, _2 = _a.imageBorderRadius, imageBorderRadius = _2 === void 0 ? "full" : _2, _3 = _a.editIconSize, editIconSize = _3 === void 0 ? "sm" : _3, _4 = _a.editIconPositionRight, editIconPositionRight = _4 === void 0 ? "0px" : _4, _5 = _a.editIconPositionBottom, editIconPositionBottom = _5 === void 0 ? "0px" : _5, _6 = _a.isRound, isRound = _6 === void 0 ? true : _6, boxStyle = _a.boxStyle, _7 = _a.isEditable, isEditable = _7 === void 0 ? false : _7, _8 = _a.isView, isView = _8 === void 0 ? false : _8, style = _a.style, handleIsView = _a.handleIsView, fallbackText = _a.fallbackText, _9 = _a.revealOnHover, revealOnHover = _9 === void 0 ? true : _9;
55
+ var _10 = (0, react_1.useState)(photoUrl), photo = _10[0], setPhoto = _10[1];
55
56
  var fileInputRef = (0, react_1.useRef)(null);
56
57
  var theme = (0, useCustomTheme_1.useCustomTheme)();
58
+ var c = (_b = theme.colors) !== null && _b !== void 0 ? _b : {};
57
59
  var handlePhotoChange = function (event) {
58
60
  var _a;
59
61
  if (!isEditable)
@@ -76,31 +78,47 @@ function ProfilePhotoViewer(_a) {
76
78
  (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click();
77
79
  };
78
80
  var isPdf = photo === null || photo === void 0 ? void 0 : photo.endsWith(".pdf");
79
- return (react_1.default.createElement(react_2.Box, { position: "relative", display: "inline-block", style: boxStyle, sx: {
80
- "&:hover .icon-button": {
81
- opacity: 1,
81
+ var border = (_d = (_c = c.boxborder) === null || _c === void 0 ? void 0 : _c[300]) !== null && _d !== void 0 ? _d : (_e = c.gray) === null || _e === void 0 ? void 0 : _e[200];
82
+ // Shared modern frame for whichever media we render (photo / pdf / fallback).
83
+ var mediaFrame = {
84
+ boxSize: imageWidth,
85
+ borderRadius: imageBorderRadius,
86
+ border: "0.063rem solid ".concat(border),
87
+ boxShadow: (_f = theme.shadows) === null || _f === void 0 ? void 0 : _f.sm,
88
+ };
89
+ var renderMedia = function () {
90
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
91
+ if (photo) {
92
+ return isPdf ? (react_1.default.createElement(react_2.Box, __assign({}, mediaFrame, { bg: (_b = (_a = c.gray) === null || _a === void 0 ? void 0 : _a[100]) !== null && _b !== void 0 ? _b : "gray.100", color: (_c = c.gray) === null || _c === void 0 ? void 0 : _c[500], display: "flex", alignItems: "center", justifyContent: "center", overflow: "hidden" }),
93
+ react_1.default.createElement(lucide_react_1.FileText, { size: "45%" }))) : (react_1.default.createElement(react_2.Image, __assign({ src: photo, alt: imageAlt, objectFit: imageObjectFit }, mediaFrame)));
94
+ }
95
+ // Fallback: branded tinted avatar (initials or user glyph).
96
+ return (react_1.default.createElement(react_2.Box, __assign({}, mediaFrame, { display: "flex", alignItems: "center", justifyContent: "center", bg: (_f = (_e = (_d = c.primary) === null || _d === void 0 ? void 0 : _d.opacity) === null || _e === void 0 ? void 0 : _e[16]) !== null && _f !== void 0 ? _f : (_g = c.gray) === null || _g === void 0 ? void 0 : _g[100], color: (_j = (_h = c.primary) === null || _h === void 0 ? void 0 : _h[600]) !== null && _j !== void 0 ? _j : (_k = c.gray) === null || _k === void 0 ? void 0 : _k[500] }), fallbackText ? (react_1.default.createElement(react_2.Text, { fontSize: "1.75rem", fontWeight: 700, lineHeight: "1" }, fallbackText)) : (react_1.default.createElement(lucide_react_1.User, { size: "48%" }))));
97
+ };
98
+ var hasActions = isEditable || isView;
99
+ return (react_1.default.createElement(react_2.Box, { position: "relative", display: "inline-block", style: boxStyle, borderRadius: imageBorderRadius, transition: "box-shadow 0.2s ease", sx: {
100
+ "&:hover .ppv-overlay": { opacity: 1 },
101
+ "&:hover .ppv-actions": { opacity: 1 },
102
+ "&:hover .ppv-media": {
103
+ boxShadow: "0 0 0 0.1875rem ".concat((_j = (_h = (_g = c.primary) === null || _g === void 0 ? void 0 : _g.opacity) === null || _h === void 0 ? void 0 : _h[24]) !== null && _j !== void 0 ? _j : "transparent"),
82
104
  },
83
105
  } },
84
- photo ? (isPdf ? (react_1.default.createElement(react_2.Box, { width: imageWidth, height: imageWidth, borderRadius: imageBorderRadius, bg: "gray.200", display: "flex", alignItems: "center", justifyContent: "center", overflow: "hidden" },
85
- react_1.default.createElement(lucide_react_1.FileText, { size: "50%" }))) : (react_1.default.createElement(react_2.Image, { src: photo, alt: imageAlt, boxSize: imageWidth, objectFit: imageObjectFit, borderRadius: imageBorderRadius }))) : fallbackText ? (react_1.default.createElement(react_2.Box, { boxSize: imageWidth, display: "flex", alignItems: "center", justifyContent: "center", borderRadius: imageBorderRadius, bg: "gray.200" },
86
- react_1.default.createElement(react_2.Text, { fontSize: "2xl", fontWeight: "bold" }, fallbackText))) : (react_1.default.createElement(react_2.Box, { boxSize: imageWidth, display: "flex", alignItems: "center", justifyContent: "center", borderRadius: imageBorderRadius, bg: "gray.200" },
87
- react_1.default.createElement(lucide_react_1.User, { size: "50%" }))),
88
- (isEditable || isView) && (react_1.default.createElement(react_1.default.Fragment, null,
89
- react_1.default.createElement(react_2.Box, { className: "icon-button", position: "absolute", right: editIconPositionRight, bottom: editIconPositionBottom, transform: "translate(-25%, -25%)", sx: {
90
- opacity: 0,
91
- transition: "opacity 0.3s",
92
- } },
93
- isEditable && (react_1.default.createElement(react_2.Tooltip, { label: "Edit", "aria-label": "Edit" },
94
- react_1.default.createElement(react_2.IconButton, { icon: react_1.default.createElement(lucide_react_1.SquarePen, { size: 14 }), isRound: isRound, size: editIconSize, onClick: handleClick, "aria-label": "Edit photo", color: theme.colors.gray[200], style: __assign(__assign({}, style), { transition: "transform 0.3s, box-shadow 0.3s", boxShadow: theme.shadows.md, marginRight: "3px" }), _hover: {
106
+ react_1.default.createElement(react_2.Box, { className: "ppv-media", borderRadius: imageBorderRadius, transition: "box-shadow 0.2s ease" }, renderMedia()),
107
+ hasActions && (react_1.default.createElement(react_1.default.Fragment, null,
108
+ react_1.default.createElement(react_2.Box, { className: "ppv-overlay", position: "absolute", inset: 0, borderRadius: imageBorderRadius, bg: "blackAlpha.300", opacity: 0, transition: "opacity 0.2s ease", pointerEvents: "none" }),
109
+ react_1.default.createElement(react_2.HStack, { className: "ppv-actions", position: "absolute", right: editIconPositionRight, bottom: editIconPositionBottom, transform: "translate(-15%, -15%)", spacing: 1.5, opacity: revealOnHover ? 0 : 1, transition: "opacity 0.2s ease" },
110
+ isEditable && (react_1.default.createElement(react_2.Tooltip, { label: "Edit", "aria-label": "Edit", hasArrow: true },
111
+ react_1.default.createElement(react_2.IconButton, { icon: react_1.default.createElement(lucide_react_1.SquarePen, { size: 14 }), isRound: isRound, size: editIconSize, onClick: handleClick, "aria-label": "Edit photo", bg: (_k = c.primary) === null || _k === void 0 ? void 0 : _k[500], color: (_l = c.white) !== null && _l !== void 0 ? _l : "#fff", border: "0.125rem solid ".concat((_m = c.white) !== null && _m !== void 0 ? _m : "#fff"), boxShadow: (_o = theme.shadows) === null || _o === void 0 ? void 0 : _o.md, style: style, transition: "transform 0.2s ease, background 0.2s ease, box-shadow 0.2s ease", _hover: {
112
+ bg: (_p = c.primary) === null || _p === void 0 ? void 0 : _p[600],
95
113
  transform: "scale(1.1)",
96
- color: theme.colors.white,
97
- boxShadow: theme.shadows.lg,
98
- } }))),
99
- isView && (react_1.default.createElement(react_2.Tooltip, { label: "View", "aria-label": "View" },
100
- react_1.default.createElement(react_2.IconButton, { icon: react_1.default.createElement(lucide_react_1.Eye, { size: 14 }), isRound: isRound, size: editIconSize, onClick: handleIsView, "aria-label": "View photo", color: theme.colors.gray[200], style: __assign(__assign({}, style), { transition: "transform 0.3s, box-shadow 0.3s", boxShadow: theme.shadows.md }), _hover: {
114
+ boxShadow: (_q = theme.shadows) === null || _q === void 0 ? void 0 : _q.lg,
115
+ }, _active: { bg: (_r = c.primary) === null || _r === void 0 ? void 0 : _r[700] } }))),
116
+ isView && (react_1.default.createElement(react_2.Tooltip, { label: "View", "aria-label": "View", hasArrow: true },
117
+ react_1.default.createElement(react_2.IconButton, { icon: react_1.default.createElement(lucide_react_1.Eye, { size: 14 }), isRound: isRound, size: editIconSize, onClick: handleIsView, "aria-label": "View photo", bg: (_s = c.white) !== null && _s !== void 0 ? _s : "#fff", color: (_t = c.gray) === null || _t === void 0 ? void 0 : _t[700], border: "0.063rem solid ".concat(border), boxShadow: (_u = theme.shadows) === null || _u === void 0 ? void 0 : _u.md, style: style, transition: "transform 0.2s ease, background 0.2s ease, box-shadow 0.2s ease", _hover: {
118
+ bg: (_v = c.gray) === null || _v === void 0 ? void 0 : _v[50],
119
+ color: (_w = c.primary) === null || _w === void 0 ? void 0 : _w[600],
101
120
  transform: "scale(1.1)",
102
- color: theme.colors.white,
103
- boxShadow: theme.shadows.lg,
104
- } })))),
121
+ boxShadow: (_x = theme.shadows) === null || _x === void 0 ? void 0 : _x.lg,
122
+ }, _active: { bg: (_y = c.gray) === null || _y === void 0 ? void 0 : _y[100] } })))),
105
123
  isEditable && (react_1.default.createElement(react_2.Input, { type: "file", accept: "image/*", onChange: handlePhotoChange, hidden: true, ref: fileInputRef }))))));
106
124
  }
@@ -15,4 +15,6 @@ export type ProfilePhotoViewerProps = {
15
15
  style?: React.CSSProperties;
16
16
  handleIsView?: () => void;
17
17
  fallbackText?: string;
18
+ /** When true, the edit/view icons are hidden and revealed on hover. Defaults to false (always visible). */
19
+ revealOnHover?: boolean;
18
20
  };
@@ -25,7 +25,7 @@ var RadioButton = function (_a) {
25
25
  boxShadow: "0 0 0 2px ".concat(theme.colors.primary[200]),
26
26
  },
27
27
  } },
28
- react_1.default.createElement(FormLabel_1.TextLabel, { label: label, fontSize: labelFontSize, showTooltip: showLabelTooltip, tooltipLabel: labelTooltip, clampLines: labelClampLines })));
28
+ react_1.default.createElement(FormLabel_1.TextLabel, { label: label, fontSize: labelFontSize, showTooltip: showLabelTooltip, tooltipLabel: labelTooltip, clampLines: labelClampLines, inline: true })));
29
29
  };
30
30
  exports.RadioButton = RadioButton;
31
31
  var RadioButtonGroup = function (_a) {
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
2
  import { SearchSelectProps } from "./SearchSelectProps";
3
- declare const SearchSelect: ({ id, label, options, onSelect, onSearch, isOptionLoading, isLoading, loadingText, placeholder, value, searchQuery, isMultiple, isRequired, error, errorMessage, helperText, width, height, size, chip, information, rightIcon, addNew, isSelectAll, pagination, insideSelect, isRemoveAllIcon, }: SearchSelectProps) => React.JSX.Element;
3
+ declare const SearchSelect: ({ id, label, options, onSelect, onSearch, isOptionLoading, isLoading, loadingText, placeholder, value, searchQuery, isMultiple, isRequired, error, errorMessage, helperText, width, height, size, chip, information, isInformation, informationMessage, rightIcon, addNew, isSelectAll, pagination, insideSelect, isRemoveAllIcon, }: SearchSelectProps) => React.JSX.Element;
4
4
  export default SearchSelect;
@@ -82,7 +82,7 @@ var normalizeMultiValue = function (val) {
82
82
  };
83
83
  var SearchSelect = function (_a) {
84
84
  var _b, _c, _d, _e, _f, _g, _h, _j;
85
- var id = _a.id, label = _a.label, options = _a.options, onSelect = _a.onSelect, onSearch = _a.onSearch, _k = _a.isOptionLoading, isOptionLoading = _k === void 0 ? false : _k, _l = _a.isLoading, isLoading = _l === void 0 ? false : _l, _m = _a.loadingText, loadingText = _m === void 0 ? "Loading..." : _m, _o = _a.placeholder, placeholder = _o === void 0 ? "Select" : _o, value = _a.value, _p = _a.searchQuery, searchQuery = _p === void 0 ? "" : _p, _q = _a.isMultiple, isMultiple = _q === void 0 ? false : _q, _r = _a.isRequired, isRequired = _r === void 0 ? false : _r, _s = _a.error, error = _s === void 0 ? false : _s, errorMessage = _a.errorMessage, helperText = _a.helperText, _t = _a.width, width = _t === void 0 ? "100%" : _t, height = _a.height, _u = _a.size, size = _u === void 0 ? "md" : _u, chip = _a.chip, information = _a.information, rightIcon = _a.rightIcon, addNew = _a.addNew, _v = _a.isSelectAll, isSelectAll = _v === void 0 ? false : _v, pagination = _a.pagination, insideSelect = _a.insideSelect, isRemoveAllIcon = _a.isRemoveAllIcon;
85
+ var id = _a.id, label = _a.label, options = _a.options, onSelect = _a.onSelect, onSearch = _a.onSearch, _k = _a.isOptionLoading, isOptionLoading = _k === void 0 ? false : _k, _l = _a.isLoading, isLoading = _l === void 0 ? false : _l, _m = _a.loadingText, loadingText = _m === void 0 ? "Loading..." : _m, _o = _a.placeholder, placeholder = _o === void 0 ? "Select" : _o, value = _a.value, _p = _a.searchQuery, searchQuery = _p === void 0 ? "" : _p, _q = _a.isMultiple, isMultiple = _q === void 0 ? false : _q, _r = _a.isRequired, isRequired = _r === void 0 ? false : _r, _s = _a.error, error = _s === void 0 ? false : _s, errorMessage = _a.errorMessage, helperText = _a.helperText, _t = _a.width, width = _t === void 0 ? "100%" : _t, height = _a.height, _u = _a.size, size = _u === void 0 ? "md" : _u, chip = _a.chip, information = _a.information, isInformation = _a.isInformation, informationMessage = _a.informationMessage, rightIcon = _a.rightIcon, addNew = _a.addNew, _v = _a.isSelectAll, isSelectAll = _v === void 0 ? false : _v, pagination = _a.pagination, insideSelect = _a.insideSelect, isRemoveAllIcon = _a.isRemoveAllIcon;
86
86
  var s = (0, searchSelectSize_1.getSearchSelectSizeStyles)((size || "md"));
87
87
  var insideSelectBoxHeight = height !== null && height !== void 0 ? height : s.insideSelectDefaultHeight;
88
88
  var _w = (0, react_1.useState)(searchQuery), inputValue = _w[0], setInputValue = _w[1];
@@ -90,19 +90,26 @@ var SearchSelect = function (_a) {
90
90
  var _y = (0, react_1.useState)(true), hasMore = _y[0], setHasMore = _y[1];
91
91
  var inputRef = (0, react_1.useRef)(null);
92
92
  var containerRef = (0, react_1.useRef)(null);
93
+ var controlRef = (0, react_1.useRef)(null);
94
+ var _z = (0, react_1.useState)({ top: 0, left: 0, width: 0 }), dropdownPos = _z[0], setDropdownPos = _z[1];
93
95
  var scrollTimeoutRef = (0, react_1.useRef)(null);
94
- var _z = (0, react_1.useState)(false), focused = _z[0], setFocused = _z[1];
95
- var _0 = (0, react_1.useState)(false), customSelectOpen = _0[0], setCustomSelectOpen = _0[1];
96
+ var _0 = (0, react_1.useState)(false), focused = _0[0], setFocused = _0[1];
97
+ var _1 = (0, react_1.useState)(false), customSelectOpen = _1[0], setCustomSelectOpen = _1[1];
96
98
  var customSelectRef = (0, react_1.useRef)(null);
97
- var _1 = (0, react_1.useState)({
99
+ var _2 = (0, react_1.useState)({
98
100
  top: 0,
99
101
  left: 0,
100
102
  width: 0,
101
- }), customSelectPos = _1[0], setCustomSelectPos = _1[1];
103
+ }), customSelectPos = _2[0], setCustomSelectPos = _2[1];
102
104
  var theme = (0, useCustomTheme_1.useCustomTheme)();
103
105
  (0, react_2.useOutsideClick)({
104
106
  ref: containerRef,
105
- handler: function () {
107
+ handler: function (e) {
108
+ // The options dropdown is portaled to <body>, so a click on it is "outside"
109
+ // the container — ignore those so selecting an option doesn't close first.
110
+ var dropdown = document.getElementById("searchselect-dropdown-portal");
111
+ if (dropdown && dropdown.contains(e.target))
112
+ return;
106
113
  setIsOpen(false);
107
114
  },
108
115
  });
@@ -223,14 +230,38 @@ var SearchSelect = function (_a) {
223
230
  });
224
231
  }
225
232
  }, [customSelectOpen]);
233
+ // Keep the portaled options dropdown anchored to the control (on open + while
234
+ // open if the page/modal scrolls or resizes).
235
+ var updateDropdownPos = (0, react_1.useCallback)(function () {
236
+ if (!controlRef.current)
237
+ return;
238
+ var rect = controlRef.current.getBoundingClientRect();
239
+ setDropdownPos({
240
+ top: rect.bottom + window.scrollY,
241
+ left: rect.left + window.scrollX,
242
+ width: rect.width,
243
+ });
244
+ }, []);
245
+ (0, react_1.useEffect)(function () {
246
+ if (!isOpen)
247
+ return;
248
+ updateDropdownPos();
249
+ // `true` (capture) catches scrolling inside any ancestor (e.g. modal body).
250
+ window.addEventListener("scroll", updateDropdownPos, true);
251
+ window.addEventListener("resize", updateDropdownPos);
252
+ return function () {
253
+ window.removeEventListener("scroll", updateDropdownPos, true);
254
+ window.removeEventListener("resize", updateDropdownPos);
255
+ };
256
+ }, [isOpen, updateDropdownPos]);
226
257
  return (react_1.default.createElement(react_2.Box, { ref: containerRef, width: width, position: "relative" },
227
- label && (react_1.default.createElement(FormLabel_1.TextLabel, { label: label, id: id, isRequired: isRequired, isInformation: information === null || information === void 0 ? void 0 : information.isInformation, informationMessage: information === null || information === void 0 ? void 0 : information.informationMessage })),
258
+ label && (react_1.default.createElement(FormLabel_1.TextLabel, { label: label, id: id, isRequired: isRequired, isInformation: isInformation !== null && isInformation !== void 0 ? isInformation : information === null || information === void 0 ? void 0 : information.isInformation, informationMessage: informationMessage !== null && informationMessage !== void 0 ? informationMessage : information === null || information === void 0 ? void 0 : information.informationMessage })),
228
259
  react_1.default.createElement(react_2.InputGroup, { size: size },
229
- react_1.default.createElement(react_2.Box, { as: "div", w: "100%", minH: s.minH, px: s.px, pr: s.pr, position: "relative", display: "flex", alignItems: "center", flexWrap: "wrap", gap: s.gap, border: "0.063rem solid", borderColor: error
260
+ react_1.default.createElement(react_2.Box, { as: "div", ref: controlRef, w: "100%", minH: s.minH, px: s.px, pr: s.pr, position: "relative", display: "flex", alignItems: "center", flexWrap: "wrap", gap: s.gap, border: "0.063rem solid", borderColor: error
230
261
  ? theme.colors.semantic.error[500]
231
262
  : focused
232
263
  ? theme.colors.primary[500]
233
- : (_b = theme.colors.boxborder) === null || _b === void 0 ? void 0 : _b[500], borderRadius: "0.25rem", bg: (_c = theme.colors.gray) === null || _c === void 0 ? void 0 : _c[50], boxShadow: focused
264
+ : (_b = theme.colors.boxborder) === null || _b === void 0 ? void 0 : _b[500], borderRadius: "0.5rem", bg: (_c = theme.colors.gray) === null || _c === void 0 ? void 0 : _c[50], boxShadow: focused
234
265
  ? error
235
266
  ? "0 0 0 0.125rem ".concat((_d = theme.colors.boxShadow) === null || _d === void 0 ? void 0 : _d.error)
236
267
  : "0 0 0 0.125rem ".concat((_e = theme.colors.boxShadow) === null || _e === void 0 ? void 0 : _e.primary)
@@ -275,22 +306,23 @@ var SearchSelect = function (_a) {
275
306
  e.stopPropagation();
276
307
  setIsOpen(function (prev) { return !prev; });
277
308
  }, "aria-label": "toggle-dropdown", display: "flex", alignItems: "center" }, isOpen ? (react_1.default.createElement(lucide_react_1.ChevronUp, { size: s.chevronSize })) : (react_1.default.createElement(lucide_react_1.ChevronDown, { size: s.chevronSize }))))))),
278
- isOpen && (react_1.default.createElement(react_2.Box, { position: "absolute", zIndex: 10, width: "100%", maxH: "20rem", borderWidth: 1, borderRadius: "sm", bg: theme.colors.white, boxShadow: "md", display: "flex", flexDirection: "column" },
279
- isMultiple && isSelectAll && (react_1.default.createElement(react_2.Box, { py: s.optionRowPy, px: 3, cursor: "pointer", onClick: handleSelectAll, display: "flex", alignItems: "center", gap: 2, borderBottom: "0.063rem solid ".concat(theme.colors.gray[100]) },
280
- react_1.default.createElement(Checkbox_1.default, { isChecked: allFilteredSelected, sx: { pointerEvents: "none" }, size: s.checkboxSize }),
281
- react_1.default.createElement(react_2.Text, { fontSize: s.dropdownTextFontSize }, allFilteredSelected ? "Unselect All" : "Select All"))),
282
- react_1.default.createElement(react_2.Box, { flex: "1", overflowY: "auto", onScroll: handleScroll, maxH: "15rem", borderBottom: "0.063rem solid", borderColor: theme.colors.gray[200] }, isOptionLoading && filteredOptions.length === 0 ? (react_1.default.createElement(react_2.Box, { py: s.optionRowPy, px: 3, display: "flex", alignItems: "center", gap: 2, minH: s.optionRowMinH },
283
- react_1.default.createElement(react_2.Spinner, { size: s.spinnerSize }),
284
- react_1.default.createElement(react_2.Text, { fontSize: s.dropdownTextFontSize }, loadingText))) : !isOptionLoading && filteredOptions.length === 0 ? (react_1.default.createElement(react_2.Text, { p: 3, fontSize: s.dropdownTextFontSize, color: theme.colors.gray[500] }, "No results found")) : (react_1.default.createElement(react_1.default.Fragment, null,
285
- filteredOptions.map(function (option) { return (react_1.default.createElement(react_2.Box, { key: option.id, py: s.optionRowPy, px: 3, minH: s.optionRowMinH, cursor: "pointer", bg: isSelected(option.id) ? theme.colors.gray[100] : "transparent", _hover: { bg: theme.colors.gray[50] }, onClick: function () { return handleSelect(option); }, display: "flex", alignItems: "center", gap: 2, borderBottom: "0.063rem solid ".concat(theme.colors.gray[100]) },
286
- isMultiple && (react_1.default.createElement(Checkbox_1.default, { isChecked: isSelected(option.id), sx: { pointerEvents: "none" }, size: s.checkboxSize })),
287
- option.view ? (react_1.default.createElement(react_1.default.Fragment, null, option.view)) : (react_1.default.createElement(react_2.Text, { fontSize: s.dropdownTextFontSize }, option.label)))); }),
288
- ((pagination === null || pagination === void 0 ? void 0 : pagination.scrollLoading) || (isOptionLoading && filteredOptions.length > 0)) && (react_1.default.createElement(react_2.Box, { py: s.optionRowPy, px: 3, display: "flex", alignItems: "center", justifyContent: "center", gap: 2, minH: s.optionRowMinH },
309
+ isOpen && (react_1.default.createElement(react_2.Portal, null,
310
+ react_1.default.createElement(react_2.Box, { id: "searchselect-dropdown-portal", position: "absolute", top: "".concat(dropdownPos.top, "px"), left: "".concat(dropdownPos.left, "px"), width: "".concat(dropdownPos.width, "px"), zIndex: 1500, maxH: "20rem", borderWidth: 1, borderColor: theme.colors.gray[200], borderRadius: "sm", bg: theme.colors.white, boxShadow: "md", display: "flex", flexDirection: "column" },
311
+ isMultiple && isSelectAll && (react_1.default.createElement(react_2.Box, { py: s.optionRowPy, px: 3, cursor: "pointer", onClick: handleSelectAll, display: "flex", alignItems: "center", gap: 2, borderBottom: "0.063rem solid ".concat(theme.colors.gray[100]) },
312
+ react_1.default.createElement(Checkbox_1.default, { isChecked: allFilteredSelected, sx: { pointerEvents: "none" }, size: s.checkboxSize }),
313
+ react_1.default.createElement(react_2.Text, { fontSize: s.dropdownTextFontSize }, allFilteredSelected ? "Unselect All" : "Select All"))),
314
+ react_1.default.createElement(react_2.Box, { flex: "1", overflowY: "auto", onScroll: handleScroll, maxH: "15rem", borderBottom: "0.063rem solid", borderColor: theme.colors.gray[200] }, isOptionLoading && filteredOptions.length === 0 ? (react_1.default.createElement(react_2.Box, { py: s.optionRowPy, px: 3, display: "flex", alignItems: "center", gap: 2, minH: s.optionRowMinH },
289
315
  react_1.default.createElement(react_2.Spinner, { size: s.spinnerSize }),
290
- react_1.default.createElement(react_2.Text, { fontSize: s.dropdownTextFontSize }, loadingText)))))),
291
- (addNew === null || addNew === void 0 ? void 0 : addNew.enabled) && (react_1.default.createElement(react_2.Box, { py: s.optionRowPy, px: 3, borderTop: "0.063rem solid", borderColor: theme.colors.gray[200], bg: theme.colors.white, display: "flex", alignItems: "center", gap: 2, minH: s.optionRowMinH, cursor: "pointer", onClick: addNew.onClick, _hover: { bg: theme.colors.gray[50] } },
292
- addNew.icon || react_1.default.createElement(lucide_react_1.Plus, { size: s.addNewIconSize }),
293
- react_1.default.createElement(react_2.Text, { fontSize: s.dropdownTextFontSize }, addNew.text || "Add New"))))),
316
+ react_1.default.createElement(react_2.Text, { fontSize: s.dropdownTextFontSize }, loadingText))) : !isOptionLoading && filteredOptions.length === 0 ? (react_1.default.createElement(react_2.Text, { p: 3, fontSize: s.dropdownTextFontSize, color: theme.colors.gray[500] }, "No results found")) : (react_1.default.createElement(react_1.default.Fragment, null,
317
+ filteredOptions.map(function (option) { return (react_1.default.createElement(react_2.Box, { key: option.id, py: s.optionRowPy, px: 3, minH: s.optionRowMinH, cursor: "pointer", bg: isSelected(option.id) ? theme.colors.gray[100] : "transparent", _hover: { bg: theme.colors.gray[50] }, onClick: function () { return handleSelect(option); }, display: "flex", alignItems: "center", gap: 2, borderBottom: "0.063rem solid ".concat(theme.colors.gray[100]) },
318
+ isMultiple && (react_1.default.createElement(Checkbox_1.default, { isChecked: isSelected(option.id), sx: { pointerEvents: "none" }, size: s.checkboxSize })),
319
+ option.view ? (react_1.default.createElement(react_1.default.Fragment, null, option.view)) : (react_1.default.createElement(react_2.Text, { fontSize: s.dropdownTextFontSize }, option.label)))); }),
320
+ ((pagination === null || pagination === void 0 ? void 0 : pagination.scrollLoading) || (isOptionLoading && filteredOptions.length > 0)) && (react_1.default.createElement(react_2.Box, { py: s.optionRowPy, px: 3, display: "flex", alignItems: "center", justifyContent: "center", gap: 2, minH: s.optionRowMinH },
321
+ react_1.default.createElement(react_2.Spinner, { size: s.spinnerSize }),
322
+ react_1.default.createElement(react_2.Text, { fontSize: s.dropdownTextFontSize }, loadingText)))))),
323
+ (addNew === null || addNew === void 0 ? void 0 : addNew.enabled) && (react_1.default.createElement(react_2.Box, { py: s.optionRowPy, px: 3, borderTop: "0.063rem solid", borderColor: theme.colors.gray[200], bg: theme.colors.white, display: "flex", alignItems: "center", gap: 2, minH: s.optionRowMinH, cursor: "pointer", onClick: addNew.onClick, _hover: { bg: theme.colors.gray[50] } },
324
+ addNew.icon || react_1.default.createElement(lucide_react_1.Plus, { size: s.addNewIconSize }),
325
+ react_1.default.createElement(react_2.Text, { fontSize: s.dropdownTextFontSize }, addNew.text || "Add New")))))),
294
326
  helperText && !error && react_1.default.createElement(HelperText_1.default, { helperText: helperText }),
295
327
  error && react_1.default.createElement(ErrorMessage_1.default, { errorMessage: errorMessage })));
296
328
  };
@@ -27,6 +27,8 @@ export type SearchSelectProps = {
27
27
  isInformation?: boolean;
28
28
  informationMessage?: string;
29
29
  };
30
+ isInformation?: boolean;
31
+ informationMessage?: string;
30
32
  rightIcon?: {
31
33
  icon?: React.ReactNode;
32
34
  onClick?: () => void;
@@ -7,7 +7,8 @@ exports.Select = {
7
7
  fontWeight: 500,
8
8
  fontSize: "0.875rem",
9
9
  letterSpacing: "0.044rem",
10
- borderRadius: "0.25rem",
10
+ borderRadius: "0.5rem",
11
+ transition: "border-color 0.2s, box-shadow 0.2s",
11
12
  minWidth: "0", // allow shrinking inside flex
12
13
  width: "100%", // full container width
13
14
  maxWidth: "100%",
@@ -60,6 +60,7 @@ exports.default = SelectSearch;
60
60
  var react_1 = __importStar(require("react"));
61
61
  var react_2 = require("@chakra-ui/react");
62
62
  var FormLabel_1 = require("../Common/FormLabel");
63
+ var fieldStyles_1 = require("../Common/fieldStyles");
63
64
  var useCustomTheme_1 = require("../../Theme/useCustomTheme");
64
65
  var lucide_react_1 = require("lucide-react");
65
66
  var ErrorMessage_1 = __importDefault(require("../Common/ErrorMessage"));
@@ -90,7 +91,6 @@ function SelectSearch(_a) {
90
91
  BottomIcon = _l === void 0 ? false : _l, BottomText = _a.BottomText, handleBottomClick = _a.handleBottomClick, BottomTextColor = _a.BottomTextColor, isColorOptions = _a.isColorOptions;
91
92
  var theme = (0, useCustomTheme_1.useCustomTheme)();
92
93
  var errorBorder = "2px solid ".concat(theme.colors.semantic.error[500]);
93
- var defaultBorderThick = "2px solid ".concat(theme.colors.boxborder[500]);
94
94
  var defaultBorderThin = "1px solid ".concat(theme.colors.boxborder[500]);
95
95
  var _m = (0, react_1.useState)(initialSelectedOption ? [initialSelectedOption] : []), selectedOptions = _m[0], setSelectedOptions = _m[1];
96
96
  var _o = (0, react_1.useState)(searchQuery), inputValue = _o[0], setInputValue = _o[1];
@@ -239,13 +239,16 @@ function SelectSearch(_a) {
239
239
  react_1.default.createElement(react_2.TagLabel, { width: "50px" }, option.label),
240
240
  react_1.default.createElement(react_2.TagCloseButton, { onClick: function () { return handleRemoveOption(option); } }))); }))),
241
241
  react_1.default.createElement(react_2.InputGroup, null,
242
- react_1.default.createElement(react_2.Input, { ref: inputRef, border: error ? errorBorder : defaultBorderThick, variant: "flushed", value: inputValue ? inputValue : "", onClick: function () { return setIsOpen(true); }, onFocus: function () { return setIsOpen(true); }, onChange: function (e) { return handleInputChange(e.target.value); }, placeholder: placeholder, onKeyDown: handleKeyDown, id: id, name: name, cursor: "pointer", borderColor: "gray.300", _hover: {
242
+ react_1.default.createElement(react_2.Input, { ref: inputRef, variant: "outline", borderRadius: fieldStyles_1.FIELD_RADIUS, value: inputValue ? inputValue : "", onClick: function () { return setIsOpen(true); }, onFocus: function () { return setIsOpen(true); }, onChange: function (e) { return handleInputChange(e.target.value); }, placeholder: placeholder, onKeyDown: handleKeyDown, id: id, name: name, cursor: "pointer", borderColor: theme.colors.boxborder[500], transition: "border-color 0.2s, box-shadow 0.2s", _hover: {
243
243
  borderColor: error
244
244
  ? theme.colors.semantic.error[500]
245
245
  : theme.colors.primary[500],
246
246
  }, _focus: {
247
- borderColor: error ? "none" : theme.colors.primary[500],
248
- }, style: __assign(__assign({}, inputStyle), { backgroundColor: theme.colors.backgroundColor.main, fontWeight: 600, color: theme.colors.gray[700], padding: "0 0.5rem", fontSize: 15, letterSpacing: 0.7, border: error ? errorBorder : defaultBorderThin }) }),
247
+ borderColor: error
248
+ ? theme.colors.semantic.error[500]
249
+ : theme.colors.primary[500],
250
+ boxShadow: (0, fieldStyles_1.fieldFocusRing)(theme, !!error),
251
+ }, style: __assign(__assign({}, inputStyle), { backgroundColor: theme.colors.gray[50], fontWeight: 600, color: theme.colors.gray[700], padding: "0 0.75rem", fontSize: 15, letterSpacing: 0.7, border: error ? errorBorder : defaultBorderThin }) }),
249
252
  rightIcon && (react_1.default.createElement(react_2.InputRightElement, { pointerEvents: "none", children: rightIcon, style: __assign({}, rightElementStyle) }))),
250
253
  isOpen && (react_1.default.createElement(react_2.Box, { ref: dropdownRef, marginTop: "5px", position: "absolute", top: position === "below" ? "100%" : "auto", bottom: position === "above" ? "100%" : "auto", left: 0, right: 0, border: "1px solid", borderColor: "gray.300", borderRadius: "md", bg: "white", maxHeight: "150px", overflowY: "auto", zIndex: 10 },
251
254
  react_1.default.createElement(RenderOptions, { isOptionLoading: isOptionLoading, filteredOptions: filteredOptions, loadingText: loadingText, handleOptionClick: handleOptionClick, isProfile: isProfile, isColorOptions: isColorOptions }),