pixelize-design-library 2.4.2-beta.37 → 2.4.2-beta.39

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 (306) hide show
  1. package/COMPONENT-GOTCHAS.md +834 -1
  2. package/dist/Components/Accordion/Accordion.d.ts +1 -0
  3. package/dist/Components/Accordion/Accordion.js +1 -0
  4. package/dist/Components/Accordion/AccordionProps.d.ts +2 -0
  5. package/dist/Components/AlertDialog/AlertDialog.d.ts +1 -0
  6. package/dist/Components/AlertDialog/AlertDialog.js +1 -0
  7. package/dist/Components/AlertDialog/AlertDialogProps.d.ts +2 -0
  8. package/dist/Components/Apexcharts/ApexAreaChart/ApexAreaChart.d.ts +1 -0
  9. package/dist/Components/Apexcharts/ApexAreaChart/ApexAreaChart.js +1 -0
  10. package/dist/Components/Apexcharts/ApexAreaChart/ApexAreaChartProps.d.ts +4 -0
  11. package/dist/Components/Apexcharts/ApexBarChart/ApexBarChartProps.d.ts +6 -0
  12. package/dist/Components/Apexcharts/ApexLineChart/ApexLineChartProps.d.ts +8 -0
  13. package/dist/Components/Apexcharts/ApexPieChart/ApexPieChartProps.d.ts +6 -0
  14. package/dist/Components/Apexcharts/ApexPolarCharts/ApexPolarChartsProps.d.ts +3 -0
  15. package/dist/Components/Apexcharts/ApexRadialChart/ApexRadialChart.d.ts +1 -0
  16. package/dist/Components/Apexcharts/ApexRadialChart/ApexRadialChart.js +1 -0
  17. package/dist/Components/Apexcharts/ApexRadialChart/ApexRadialChartProps.d.ts +3 -0
  18. package/dist/Components/AppSwitcher/AppSwitcherProps.d.ts +6 -0
  19. package/dist/Components/AppearanceSettings/AppearanceSettingsProps.d.ts +2 -0
  20. package/dist/Components/Breadcrumbs/BreadcrumbsProps.d.ts +3 -0
  21. package/dist/Components/Button/ButtonProps.d.ts +3 -0
  22. package/dist/Components/ButtonGroupIcon/ButtonGoupIconProps.d.ts +7 -0
  23. package/dist/Components/Buttons/ButtonsProps.d.ts +2 -0
  24. package/dist/Components/Card/CardProps.d.ts +3 -0
  25. package/dist/Components/Card/PaymentCard/PaymentCardProps.d.ts +6 -0
  26. package/dist/Components/Checkbox/Checkbox.d.ts +1 -0
  27. package/dist/Components/Checkbox/Checkbox.js +1 -0
  28. package/dist/Components/Checkbox/CheckboxProps.d.ts +4 -0
  29. package/dist/Components/Common/ErrorComponent.d.ts +2 -0
  30. package/dist/Components/Common/ErrorComponent.js +1 -0
  31. package/dist/Components/Common/FormLabel.d.ts +4 -0
  32. package/dist/Components/Common/FormLabel.js +1 -0
  33. package/dist/Components/Common/FormattedDescription.d.ts +2 -0
  34. package/dist/Components/Common/FormattedDescription.js +1 -0
  35. package/dist/Components/Common/HelperText.d.ts +2 -0
  36. package/dist/Components/Common/HelperText.js +2 -0
  37. package/dist/Components/Common/Label.d.ts +1 -0
  38. package/dist/Components/Common/Label.js +1 -0
  39. package/dist/Components/ContactForm/ContactForm.d.ts +1 -0
  40. package/dist/Components/ContactForm/ContactForm.js +1 -0
  41. package/dist/Components/ContactForm/ContactFormProps.d.ts +4 -0
  42. package/dist/Components/CopyButton/CopyButton.d.ts +3 -1
  43. package/dist/Components/CopyButton/CopyButton.js +1 -0
  44. package/dist/Components/CustomModulesTable/CustomModulesTableProps.d.ts +8 -0
  45. package/dist/Components/DatePicker/CalendarPanel.d.ts +1 -0
  46. package/dist/Components/DatePicker/CalendarPanel.js +1 -0
  47. package/dist/Components/DatePicker/DatePicker.d.ts +1 -0
  48. package/dist/Components/DatePicker/DatePicker.js +1 -0
  49. package/dist/Components/DatePicker/DatePickerProps.d.ts +9 -0
  50. package/dist/Components/DatePicker/RangeDatePicker.d.ts +1 -0
  51. package/dist/Components/DatePicker/RangeDatePicker.js +1 -0
  52. package/dist/Components/DatePicker/SingleDatePicker.d.ts +1 -0
  53. package/dist/Components/DatePicker/SingleDatePicker.js +1 -0
  54. package/dist/Components/DatePicker/ThemeDatePicker.d.ts +1 -0
  55. package/dist/Components/DatePicker/ThemeDatePicker.js +1 -0
  56. package/dist/Components/DatePicker/TimeOnlyPicker.d.ts +1 -0
  57. package/dist/Components/DatePicker/TimeOnlyPicker.js +4 -1
  58. package/dist/Components/DatePicker/TimePicker.d.ts +1 -0
  59. package/dist/Components/DatePicker/TimePicker.js +1 -0
  60. package/dist/Components/DatePicker/TimePickerInput.d.ts +1 -0
  61. package/dist/Components/DatePicker/TimePickerInput.js +1 -0
  62. package/dist/Components/Divider/Divider.d.ts +1 -0
  63. package/dist/Components/Divider/Divider.js +1 -0
  64. package/dist/Components/Drawer/DrawerProps.d.ts +1 -0
  65. package/dist/Components/Dropdown/DropDown.d.ts +1 -0
  66. package/dist/Components/Dropdown/DropDown.js +1 -0
  67. package/dist/Components/Dropdown/DropdownProps.d.ts +3 -0
  68. package/dist/Components/Editor/Editor.d.ts +1 -0
  69. package/dist/Components/Editor/Editor.js +1 -0
  70. package/dist/Components/Editor/EditorProps.d.ts +2 -0
  71. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.d.ts +1 -0
  72. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +2 -5
  73. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtpProps.d.ts +4 -0
  74. package/dist/Components/EmptyState/EmptyState.d.ts +1 -0
  75. package/dist/Components/EmptyState/EmptyState.js +1 -0
  76. package/dist/Components/EmptyState/EmptyStateProps.d.ts +3 -0
  77. package/dist/Components/FeedbackForm/FeedbackForm.d.ts +3 -0
  78. package/dist/Components/FeedbackForm/FeedbackForm.js +1 -0
  79. package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts +3 -2
  80. package/dist/Components/FieldSelectModal/FieldSelectModal.js +1 -0
  81. package/dist/Components/FilePreview/FilePreview.d.ts +1 -0
  82. package/dist/Components/FilePreview/FilePreview.js +1 -0
  83. package/dist/Components/FilePreview/FilePreviewProps.d.ts +5 -2
  84. package/dist/Components/FileUpload/FileUpload.d.ts +1 -0
  85. package/dist/Components/FileUpload/FileUpload.js +1 -0
  86. package/dist/Components/FileUpload/FileUploadProps.d.ts +4 -0
  87. package/dist/Components/FileUploader/FileUploader.d.ts +1 -0
  88. package/dist/Components/FileUploader/FileUploader.js +1 -0
  89. package/dist/Components/FileUploader/FileUploaderProps.d.ts +2 -0
  90. package/dist/Components/FilterSidebar/FilterSidebar.d.ts +3 -0
  91. package/dist/Components/Form/FormWrapper.d.ts +3 -0
  92. package/dist/Components/Form/FormWrapper.js +2 -1
  93. package/dist/Components/Header/HeaderProps.d.ts +5 -0
  94. package/dist/Components/Input/Input/InputProps.d.ts +2 -0
  95. package/dist/Components/Input/PhoneNumberInput.d.ts +1 -0
  96. package/dist/Components/Input/PhoneNumberInput.js +1 -0
  97. package/dist/Components/Input/PhoneNumberInputProps.d.ts +3 -0
  98. package/dist/Components/Input/Switch/InputSwitch.d.ts +2 -0
  99. package/dist/Components/Input/Switch/InputSwitch.js +1 -0
  100. package/dist/Components/Input/TextInput.js +1 -0
  101. package/dist/Components/Input/TextInputProps.d.ts +2 -0
  102. package/dist/Components/InputTextArea/InputTextArea.d.ts +1 -0
  103. package/dist/Components/InputTextArea/InputTextArea.js +1 -0
  104. package/dist/Components/KanbanBoard/AccountCard.d.ts +3 -0
  105. package/dist/Components/KanbanBoard/AccountCard.js +1 -0
  106. package/dist/Components/KanbanBoard/AccountRow.d.ts +1 -0
  107. package/dist/Components/KanbanBoard/AccountRow.js +1 -0
  108. package/dist/Components/KanbanBoard/KanbanActions/KanbanActions.d.ts +2 -0
  109. package/dist/Components/KanbanBoard/KanbanActions/KanbanActions.js +1 -0
  110. package/dist/Components/KanbanBoard/KanbanBoard.d.ts +1 -0
  111. package/dist/Components/KanbanBoard/KanbanBoard.js +1 -0
  112. package/dist/Components/KanbanBoard/KanbanBoardProps.d.ts +12 -11
  113. package/dist/Components/KanbanBoard/MeasuredItem.d.ts +1 -0
  114. package/dist/Components/KanbanBoard/MeasuredItem.js +1 -0
  115. package/dist/Components/LazyWrapper/LazyWrapper.d.ts +3 -2
  116. package/dist/Components/LazyWrapper/LazyWrapper.js +1 -0
  117. package/dist/Components/LimitReachedModal/LimitReachedModalProps.d.ts +4 -1
  118. package/dist/Components/LimitReachedModal/limitReachedCopy.d.ts +2 -0
  119. package/dist/Components/LimitReachedModal/limitReachedCopy.js +2 -0
  120. package/dist/Components/Loading/Loading.d.ts +1 -0
  121. package/dist/Components/Loading/Loading.js +1 -0
  122. package/dist/Components/Loading/LoadingProps.d.ts +2 -0
  123. package/dist/Components/Modal/ModalProps.d.ts +1 -0
  124. package/dist/Components/MoreItems/MoreItems.d.ts +1 -0
  125. package/dist/Components/MoreItems/MoreItems.js +1 -0
  126. package/dist/Components/MoreItems/MoreItemsProps.d.ts +4 -2
  127. package/dist/Components/MultiSelect/MultiSelectProps.d.ts +1 -0
  128. package/dist/Components/NavigationBar/NavigationBarProps.d.ts +3 -0
  129. package/dist/Components/NoteTextArea/NoteTextArea.d.ts +1 -0
  130. package/dist/Components/NoteTextArea/NoteTextArea.js +1 -0
  131. package/dist/Components/NoteTextArea/NoteTextAreaProps.d.ts +2 -0
  132. package/dist/Components/Notification/Notification.d.ts +1 -0
  133. package/dist/Components/Notification/Notification.js +1 -0
  134. package/dist/Components/Notification/NotificationProps.d.ts +6 -0
  135. package/dist/Components/NumberInput/NumberInput.d.ts +1 -0
  136. package/dist/Components/NumberInput/NumberInput.js +1 -0
  137. package/dist/Components/NumberInput/NumberInputProps.d.ts +3 -0
  138. package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts +6 -1
  139. package/dist/Components/OrgSwitcher/OrgSwitcherProps.js +1 -0
  140. package/dist/Components/OrganizationDetails/OrganizationDetailsProps.d.ts +10 -2
  141. package/dist/Components/PdfViewer/PdfViewer.d.ts +2 -1
  142. package/dist/Components/PdfViewer/PdfViewer.js +1 -0
  143. package/dist/Components/PinInput/PinInput.d.ts +1 -0
  144. package/dist/Components/PinInput/PinInput.js +1 -0
  145. package/dist/Components/PinInput/PinInputProps.d.ts +2 -0
  146. package/dist/Components/PinInputs/PinInputs.d.ts +1 -0
  147. package/dist/Components/PinInputs/PinInputs.js +1 -0
  148. package/dist/Components/PinInputs/PinInputsProps.d.ts +1 -0
  149. package/dist/Components/PlanBadge/PlanBadgeProps.d.ts +2 -0
  150. package/dist/Components/PlanPill/PlanPillProps.d.ts +2 -0
  151. package/dist/Components/ProductCard/ProductCardProps.d.ts +10 -0
  152. package/dist/Components/ProductCard/ProductReview.d.ts +1 -0
  153. package/dist/Components/ProductDetails/ProductDetailsProps.d.ts +7 -0
  154. package/dist/Components/ProfileCard/ProfileCardProps.d.ts +2 -0
  155. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.d.ts +1 -0
  156. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +1 -0
  157. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewerProps.d.ts +9 -1
  158. package/dist/Components/ProgressBar/ProgressBar.d.ts +1 -0
  159. package/dist/Components/ProgressBar/ProgressBar.js +1 -0
  160. package/dist/Components/ProgressBar/ProgressBarProps.d.ts +2 -0
  161. package/dist/Components/RadioButton/RadioButtonProps.d.ts +1 -0
  162. package/dist/Components/Reorder/Reorder.d.ts +2 -0
  163. package/dist/Components/Reorder/Reorder.js +1 -0
  164. package/dist/Components/Reorder/ReorderProps.d.ts +3 -0
  165. package/dist/Components/RolesPermission/RolesPermissionProps.d.ts +10 -0
  166. package/dist/Components/ScrollToTop/ScrollToTop.d.ts +3 -2
  167. package/dist/Components/ScrollToTop/ScrollToTop.js +1 -0
  168. package/dist/Components/Search/Search.d.ts +1 -0
  169. package/dist/Components/Search/Search.js +1 -0
  170. package/dist/Components/Search/SearchProps.d.ts +2 -0
  171. package/dist/Components/SearchSelect/SearchSelect.d.ts +1 -0
  172. package/dist/Components/SearchSelect/SearchSelect.js +1 -0
  173. package/dist/Components/SearchSelect/SearchSelectProps.d.ts +5 -0
  174. package/dist/Components/SegmentedControl/SegmentedControl.d.ts +1 -0
  175. package/dist/Components/SegmentedControl/SegmentedControl.js +1 -0
  176. package/dist/Components/SegmentedControl/SegmentedControlProps.d.ts +4 -0
  177. package/dist/Components/Select/SelectProps.d.ts +2 -0
  178. package/dist/Components/SelectSearch/SelectSearch.d.ts +1 -0
  179. package/dist/Components/SelectSearch/SelectSearch.js +1 -0
  180. package/dist/Components/SelectSearch/SelectSearchProps.d.ts +5 -0
  181. package/dist/Components/SelectV2/SelectV2.d.ts +1 -0
  182. package/dist/Components/SelectV2/SelectV2.js +1 -0
  183. package/dist/Components/SelectV2/SelectV2Props.d.ts +6 -1
  184. package/dist/Components/SideBar/SideBarProps.d.ts +9 -0
  185. package/dist/Components/SignInActivityTable/SignInActivityTableProps.d.ts +3 -0
  186. package/dist/Components/Skeletons/SkeletonProps.d.ts +2 -0
  187. package/dist/Components/Skeletons/Skeletons.d.ts +1 -0
  188. package/dist/Components/Skeletons/Skeletons.js +1 -0
  189. package/dist/Components/Slider/Slider.d.ts +3 -0
  190. package/dist/Components/Slider/Slider.js +1 -0
  191. package/dist/Components/StageProgress/StageItem.d.ts +1 -0
  192. package/dist/Components/StageProgress/StageItem.js +1 -0
  193. package/dist/Components/StageProgress/StageProgress.d.ts +1 -0
  194. package/dist/Components/StageProgress/StageProgress.js +1 -0
  195. package/dist/Components/StageProgress/StageProgressProps.d.ts +12 -4
  196. package/dist/Components/Switch/Switch.d.ts +1 -0
  197. package/dist/Components/Switch/Switch.js +1 -0
  198. package/dist/Components/Switch/SwitchProps.d.ts +1 -0
  199. package/dist/Components/Table/TableProps.d.ts +13 -0
  200. package/dist/Components/Table/filters/CompactSelect.d.ts +1 -0
  201. package/dist/Components/Table/filters/LeftFilterPane.d.ts +9 -1
  202. package/dist/Components/Tag/Tag.d.ts +1 -0
  203. package/dist/Components/Tag/Tag.js +1 -0
  204. package/dist/Components/Tag/TagProps.d.ts +7 -0
  205. package/dist/Components/Timeline/Timeline.d.ts +1 -0
  206. package/dist/Components/Timeline/Timeline.js +1 -0
  207. package/dist/Components/Timeline/TimelineProps.d.ts +8 -0
  208. package/dist/Components/Toaster/Toaster.d.ts +1 -0
  209. package/dist/Components/Toaster/Toaster.js +1 -0
  210. package/dist/Components/Toaster/ToasterProps.d.ts +3 -0
  211. package/dist/Components/Toggle/TableToggle.d.ts +1 -0
  212. package/dist/Components/Toggle/TableToggle.js +1 -0
  213. package/dist/Components/Toggle/TableToggleProps.d.ts +3 -0
  214. package/dist/Components/ToggleSwitch/ToggleSwitch.d.ts +1 -0
  215. package/dist/Components/ToggleSwitch/ToggleSwitch.js +1 -0
  216. package/dist/Components/ToggleSwitch/ToggleSwitchProps.d.ts +2 -0
  217. package/dist/Components/ToolTip/ToolTip.d.ts +1 -0
  218. package/dist/Components/ToolTip/ToolTip.js +1 -0
  219. package/dist/Components/ToolTip/ToolTipProps.d.ts +2 -0
  220. package/dist/Components/Trail/EditableCell.d.ts +2 -0
  221. package/dist/Components/Trail/EditableCell.js +1 -0
  222. package/dist/Components/Trail/SelectAllCheckbox.d.ts +1 -0
  223. package/dist/Components/Trail/SelectAllCheckbox.js +1 -0
  224. package/dist/Components/Trail/TrailWorks.d.ts +1 -0
  225. package/dist/Components/Trail/TrailWorks.js +1 -0
  226. package/dist/Components/UpgradeButton/UpgradeButtonProps.d.ts +6 -2
  227. package/dist/Components/UserDetails/UserDetailsProps.d.ts +17 -1
  228. package/dist/Components/WorkspaceWindow/WorkspaceWindowProps.d.ts +6 -1
  229. package/dist/esm/Components/Accordion/Accordion.js +1 -0
  230. package/dist/esm/Components/AlertDialog/AlertDialog.js +1 -0
  231. package/dist/esm/Components/Apexcharts/ApexAreaChart/ApexAreaChart.js +1 -0
  232. package/dist/esm/Components/Apexcharts/ApexRadialChart/ApexRadialChart.js +1 -0
  233. package/dist/esm/Components/Checkbox/Checkbox.js +1 -0
  234. package/dist/esm/Components/Common/ErrorComponent.js +1 -0
  235. package/dist/esm/Components/Common/FormLabel.js +1 -0
  236. package/dist/esm/Components/Common/FormattedDescription.js +1 -0
  237. package/dist/esm/Components/Common/HelperText.js +2 -0
  238. package/dist/esm/Components/Common/Label.js +1 -0
  239. package/dist/esm/Components/ContactForm/ContactForm.js +1 -0
  240. package/dist/esm/Components/CopyButton/CopyButton.js +1 -0
  241. package/dist/esm/Components/DatePicker/CalendarPanel.js +1 -0
  242. package/dist/esm/Components/DatePicker/DatePicker.js +1 -0
  243. package/dist/esm/Components/DatePicker/RangeDatePicker.js +1 -0
  244. package/dist/esm/Components/DatePicker/SingleDatePicker.js +1 -0
  245. package/dist/esm/Components/DatePicker/ThemeDatePicker.js +1 -0
  246. package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +4 -1
  247. package/dist/esm/Components/DatePicker/TimePicker.js +1 -0
  248. package/dist/esm/Components/DatePicker/TimePickerInput.js +1 -0
  249. package/dist/esm/Components/Divider/Divider.js +1 -0
  250. package/dist/esm/Components/Dropdown/DropDown.js +1 -0
  251. package/dist/esm/Components/Editor/Editor.js +1 -0
  252. package/dist/esm/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +2 -5
  253. package/dist/esm/Components/EmptyState/EmptyState.js +1 -0
  254. package/dist/esm/Components/FeedbackForm/FeedbackForm.js +1 -0
  255. package/dist/esm/Components/FieldSelectModal/FieldSelectModal.js +1 -0
  256. package/dist/esm/Components/FilePreview/FilePreview.js +1 -0
  257. package/dist/esm/Components/FileUpload/FileUpload.js +1 -0
  258. package/dist/esm/Components/FileUploader/FileUploader.js +1 -0
  259. package/dist/esm/Components/Form/FormWrapper.js +2 -1
  260. package/dist/esm/Components/Input/PhoneNumberInput.js +1 -0
  261. package/dist/esm/Components/Input/Switch/InputSwitch.js +1 -0
  262. package/dist/esm/Components/Input/TextInput.js +1 -0
  263. package/dist/esm/Components/InputTextArea/InputTextArea.js +1 -0
  264. package/dist/esm/Components/KanbanBoard/AccountCard.js +1 -0
  265. package/dist/esm/Components/KanbanBoard/AccountRow.js +1 -0
  266. package/dist/esm/Components/KanbanBoard/KanbanActions/KanbanActions.js +1 -0
  267. package/dist/esm/Components/KanbanBoard/KanbanBoard.js +1 -0
  268. package/dist/esm/Components/KanbanBoard/MeasuredItem.js +1 -0
  269. package/dist/esm/Components/LazyWrapper/LazyWrapper.js +1 -0
  270. package/dist/esm/Components/LimitReachedModal/limitReachedCopy.js +2 -0
  271. package/dist/esm/Components/Loading/Loading.js +1 -0
  272. package/dist/esm/Components/MoreItems/MoreItems.js +1 -0
  273. package/dist/esm/Components/NoteTextArea/NoteTextArea.js +1 -0
  274. package/dist/esm/Components/Notification/Notification.js +1 -0
  275. package/dist/esm/Components/NumberInput/NumberInput.js +1 -0
  276. package/dist/esm/Components/OrgSwitcher/OrgSwitcherProps.js +1 -0
  277. package/dist/esm/Components/PdfViewer/PdfViewer.js +1 -0
  278. package/dist/esm/Components/PinInput/PinInput.js +1 -0
  279. package/dist/esm/Components/PinInputs/PinInputs.js +1 -0
  280. package/dist/esm/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +1 -0
  281. package/dist/esm/Components/ProgressBar/ProgressBar.js +1 -0
  282. package/dist/esm/Components/Reorder/Reorder.js +1 -0
  283. package/dist/esm/Components/ScrollToTop/ScrollToTop.js +1 -0
  284. package/dist/esm/Components/Search/Search.js +1 -0
  285. package/dist/esm/Components/SearchSelect/SearchSelect.js +1 -0
  286. package/dist/esm/Components/SegmentedControl/SegmentedControl.js +1 -0
  287. package/dist/esm/Components/SelectSearch/SelectSearch.js +1 -0
  288. package/dist/esm/Components/SelectV2/SelectV2.js +1 -0
  289. package/dist/esm/Components/Skeletons/Skeletons.js +1 -0
  290. package/dist/esm/Components/Slider/Slider.js +1 -0
  291. package/dist/esm/Components/StageProgress/StageItem.js +1 -0
  292. package/dist/esm/Components/StageProgress/StageProgress.js +1 -0
  293. package/dist/esm/Components/Switch/Switch.js +1 -0
  294. package/dist/esm/Components/Tag/Tag.js +1 -0
  295. package/dist/esm/Components/Timeline/Timeline.js +1 -0
  296. package/dist/esm/Components/Toaster/Toaster.js +1 -0
  297. package/dist/esm/Components/Toggle/TableToggle.js +1 -0
  298. package/dist/esm/Components/ToggleSwitch/ToggleSwitch.js +1 -0
  299. package/dist/esm/Components/ToolTip/ToolTip.js +1 -0
  300. package/dist/esm/Components/Trail/EditableCell.js +1 -0
  301. package/dist/esm/Components/Trail/SelectAllCheckbox.js +1 -0
  302. package/dist/esm/Components/Trail/TrailWorks.js +1 -0
  303. package/dist/esm/index.js +2 -1
  304. package/dist/index.d.ts +2 -1
  305. package/dist/index.js +5 -3
  306. package/package.json +2 -1
@@ -42,11 +42,99 @@ it on `"default"` — it's the only variant guaranteed to match previously-shipp
42
42
  | --- | --- | --- |
43
43
  | Short, always-visible list, no search needed | `Select` | Native `<select>` wrapper — lightest option, but the popup is OS-painted and can't be themed |
44
44
  | New build, want themed/custom-rendered rows (icons, descriptions), no huge list | `SelectV2` | Fully React-rendered popup — **prefer this for new work** over `Select` |
45
- | Long list needing search + chips + select-all + infinite scroll | `SearchSelect` | The full-featured picker; virtualizes |
45
+ | Long list needing search + chips + select-all + infinite scroll | `SearchSelect` | The full-featured picker; scales via consumer-driven `pagination`, not DOM virtualization — see gotcha below |
46
46
  | Search-as-you-type with avatars/colour swatches/a pinned "add new" row | `SelectSearch` | Lighter than `SearchSelect`; reach for it for that specific row-content need |
47
47
 
48
48
  Default when unsure: `SelectV2` for a themed field, `Select` if the native popup is genuinely fine.
49
49
 
50
+ ### `Slider` is an image carousel, not a numeric range input
51
+
52
+ `Slider` auto-advances a set of images/content on a timer — no numeric value, min/max, or step. The
53
+ actual range-input slider is Chakra's own, re-exported from the `Primitives` barrel as `RangeSlider`
54
+ specifically because this library's `Slider` already owns the name.
55
+
56
+ **Apply:** for a numeric/range form control, import `RangeSlider` from the `Primitives` barrel —
57
+ never `Slider`.
58
+
59
+ ### Which "switch" — `ToggleSwitch` / `SegmentedControl` / `Switch`
60
+
61
+ | Choosing | Component | Why |
62
+ | --- | --- | --- |
63
+ | A real on/off toggle | `ToggleSwitch` | `role="switch"` + `aria-checked`, full keyboard support |
64
+ | One of 2-5 named options | `SegmentedControl` | `role="radiogroup"`, keyboard-navigable, supports per-option disabling |
65
+ | — | `Switch` | Despite the name, a two-label segmented control (`leftText`/`rightText`) — no role, no keyboard handling at all (mouse-only). Kept only for backward compatibility; don't reach for it in new code |
66
+
67
+ **Apply:** if the choice is "on vs off," it's never `Switch` — use `ToggleSwitch`. For 2+ named
68
+ options, prefer `SegmentedControl` even over `Switch`.
69
+
70
+ ### Circular charts — `ApexPieChart` vs `ApexPolarCharts`
71
+
72
+ | Need | Component | Why not the other |
73
+ | --- | --- | --- |
74
+ | Proportional share of a whole — slices sum to 100% | `ApexPieChart` | The default "part of a whole" chart; donut variants support a center total label |
75
+ | Compare independent magnitudes on a shared radial grid — values need not sum to anything | `ApexPolarCharts` | Reads like a circular bar chart, not a pie; picking Pie here makes unrelated values look like they must add to 100% |
76
+
77
+ ### Which "button" — `Button` / `ButtonGroupIcon` / `Buttons`
78
+
79
+ | Need | Component | Why not the others |
80
+ | --- | --- | --- |
81
+ | A single themed, interactive button — any variant/size/colorScheme, dark-mode aware | `Button` | The only one of the three that reads design tokens at all |
82
+ | A themed row of icon + text + icon, optionally a dropdown menu on the right | `ButtonGroupIcon` | The real "group" component despite `Buttons`' plural name suggesting otherwise |
83
+ | *(avoid)* | `Buttons` (plural) | Legacy single `<button>` hardcoded to Tailwind `bg-purple-600`, not theme-aware, not exported from the package root — see gotcha below |
84
+
85
+ ### Which "card" — `Card` / `ProductCard` / `ProductDetails` / `PaymentCard`
86
+
87
+ | Need | Component | Why not the others |
88
+ | --- | --- | --- |
89
+ | Generic bordered/padded container, no commerce semantics | `Card` | Plain layout wrapper — its `header`/`footer`/divider props are dead, compose your own layout in `children` |
90
+ | Compact product tile for a grid/listing page | `ProductCard` | Fixed size presets, single-image hover-swap, no gallery |
91
+ | Full product detail page layout (gallery + description + variant picker) | `ProductDetails` | No card chrome of its own; same variant-list shape as `ProductCard` but named `price`, not `options` |
92
+ | Subscription/pricing-tier card (plans, billing cycle, feature list) | `PaymentCard` | Takes a `Plan` object, unrelated to `options`/`productImage` |
93
+
94
+ ### Managing organizations — `OrganizationDetails` vs `OrgSwitcher`
95
+
96
+ | Doing | Component | Why not the other |
97
+ | --- | --- | --- |
98
+ | Quickly changing which org is active for the current session (navbar/header) | `OrgSwitcher` | Compact trigger + searchable popover; no create/rename/delete — session-scoped |
99
+ | Managing the org list — rename, delete, accept/decline invites, create new, set a persisted default | `OrganizationDetails` | Full admin panel with bundled CRUD modals; `default`/`onSetDefault` is a persisted preference, not OrgSwitcher's session-scoped `value`/`onChange` |
100
+
101
+ ### Plan/upgrade cluster — `UpgradeButton` / `PlanPill` / `PlanBadge` / `LimitReachedModal`
102
+
103
+ | Doing | Component | Why not the others |
104
+ | --- | --- | --- |
105
+ | A prominent, animated "upgrade now" CTA button | `UpgradeButton` | Shimmer/hover-lift button with size variants |
106
+ | Showing a plan-state badge and you already have label/tone/copy decided | `PlanPill` | Presentational only — no resolution logic |
107
+ | Showing the top-bar plan-name/"upgrade" badge from raw org plan data | `PlanBadge` | Wraps `PlanPill` with `resolvePlanBadge()`; renders nothing if `canManageBilling` is falsy |
108
+ | Blocking a user who hit a plan limit, with an explanation and upgrade path | `LimitReachedModal` | Full modal, fully controlled, reuses `UpgradeButton` as its own CTA |
109
+
110
+ ### Top-of-app navigation — `NavigationBar` / `Header` / `SideBar` / `AppSwitcher` / `WorkspaceWindow`
111
+
112
+ | Need | Component | Why not the others |
113
+ | --- | --- | --- |
114
+ | Top bar: back control + user-avatar profile/logout dropdown | `NavigationBar` | No page-nav links at all — `navMenu` is only the avatar dropdown's own items |
115
+ | Top bar: horizontal page links with active-state highlighting + submenus | `Header` | Desktop submenus are hover-only, see gotcha below |
116
+ | Collapsible/dockable left rail — primary in-app navigation + secondary panel | `SideBar` | The persistent nav shell, not for switching between whole apps |
117
+ | Cross-app launcher (CRM/HRMS/Tickets/Billing/...) | `AppSwitcher` | Two-column popover grid of separate app origins — `SideBar`'s `otherApps` is the legacy predecessor; don't wire both into one shell |
118
+ | Floating Jira-style dialog to view/edit one record without leaving the page | `WorkspaceWindow` | Modal-based floating panel, not page navigation; pairs with `WorkspaceTray` |
119
+
120
+ ### File pickers — `FileUpload` vs `FileUploader`
121
+
122
+ | Need | Component | Why |
123
+ | --- | --- | --- |
124
+ | Real `File`/Blob objects to actually upload (FormData/API) | `FileUpload` | Controlled; `onFilesUploaded` carries real `File[]` and validates accept/size with rejection messages |
125
+ | Self-contained "add photos, see thumbnails, remove" list with no server upload | `FileUploader` | Manages its own state; its `onFilesChange` metadata discards the real `File` — see gotcha below |
126
+
127
+ Both export a type named `FileUploaderProps` — the one re-exported from the package root (`src/index.ts`) describes `FileUpload`, not `FileUploader`. Check which folder a type came from before trusting the name.
128
+
129
+ ### Inline file preview — `PdfViewer` vs `FilePreview`
130
+
131
+ | Need | Component | Why |
132
+ | --- | --- | --- |
133
+ | Always-visible inline PDF panel in the page flow | `PdfViewer` | Non-modal, PDF-only, small open/download toolbar |
134
+ | Click-to-open lightbox over mixed/unknown file types | `FilePreview` | Controlled modal; auto-detects image/pdf/video/other, adds zoom/rotate for images, graceful fallback for unsupported types |
135
+
136
+ Both render a PDF through the identical unstyled `<embed type="application/pdf">` with no error handling if the browser can't render it inline — neither tells you when that happens.
137
+
50
138
  ---
51
139
 
52
140
  ## Known gotchas (silent failures)
@@ -133,3 +221,748 @@ and the library component resolves that `undefined` via its own default paramete
133
221
  const AppTable = ({ variant = 'studio', ...props }: TableProps) => <Table variant={variant} {...props} />;
134
222
  ```
135
223
  Applies to any library prop with a default value, not just `Table`'s `variant`.
224
+
225
+ ### `FormWrapper` has a closed prop list — no `...rest`
226
+
227
+ It destructures exactly `{ icon, text, children }` and forwards nothing else to either the outer
228
+ wrapper or the bordered content `Box` — a `data-testid`, `id`, a margin override, or an `onClick` on
229
+ the wrapper all silently disappear, and TypeScript won't catch it since excess-property checks don't
230
+ apply to spreads.
231
+
232
+ **Apply:** wrap `FormWrapper` in your own `Box` when you need margin, a test hook, or an id on the
233
+ section — don't expect anything but `icon`/`text`/`children` to reach the DOM.
234
+
235
+ ### `ContactForm`'s `apiKey` prop is a POST URL, not an auth token
236
+
237
+ Despite the name, `apiKey` is passed straight into `fetch(apiKey, { method: "POST" })` as the submit
238
+ endpoint — never sent as a header or credential. A real API key/secret fails silently as an invalid
239
+ URL, surfaced only as a generic "Failed to send message" alert. There's no `headers` prop, so an
240
+ authenticated endpoint can't be reached through this component at all.
241
+
242
+ **Apply:** pass the full POST URL, never a token. If the endpoint needs auth headers, proxy through
243
+ your own backend instead.
244
+
245
+ ### `ContactForm` can't tell its parent the submission result
246
+
247
+ It does its own internal `fetch` and renders its own success/error alert from local state — there is
248
+ no `onSuccess`, `onSubmit`, or `onError` prop (a dead `// onSubmit(formData)` line is the only trace
249
+ one ever existed). A call site can't redirect, toast, or update its own state when the enquiry sends.
250
+ Separately, the email field is validated for format but its "required" check is commented out, so a
251
+ blank email submits successfully with no error shown.
252
+
253
+ **Apply:** if the parent needs to react to success, this component can't provide it. Don't rely on
254
+ `email` being enforced as required — validate it yourself first if that matters.
255
+
256
+ ### `VerifyEmailOtp` can't accept alphanumeric codes
257
+
258
+ It wraps Chakra's `PinInput` without forwarding a `type`, so Chakra's `type="number"` default
259
+ applies — any letter typed is silently rejected (the character never appears, no error shown).
260
+ `VerifyEmailOtpProps` has no `type` field and no `...rest` escape hatch. Its `description` text also
261
+ always gets a hardcoded second line appended — "your new Pixel Account" — with no prop to remove it.
262
+
263
+ **Apply:** only use this component for numeric-only OTPs with product copy that matches that exact
264
+ trailing phrase. Otherwise build the card from `PinInput`/`PinInputs` plus your own text.
265
+
266
+ ### `ApexLineChart` only ever renders one line, frozen at mount
267
+
268
+ `data`/`series` changes after the first render are silently ignored unless the component remounts
269
+ (no effect syncs later prop changes into state); `series` only reads index 0 for the line's name
270
+ despite the plural name; `variant="realtime"` replaces your data with random numbers on an interval
271
+ rather than animating it. Its `legendStyle` prop also type-checks but has no effect, unlike the
272
+ identical prop on `ApexPieChart`/`ApexPolarCharts`.
273
+
274
+ **Apply:** remount (`key`) `ApexLineChart` when the underlying data changes. Don't use
275
+ `variant="realtime"` expecting it to reflect a live feed.
276
+
277
+ ### `ApexPieChart`'s `showDataLabels` can be silently overridden by chart height
278
+
279
+ With the default `labelPlacement="auto"`, a **numeric** `height` under 240 forces labels off even
280
+ with `showDataLabels={true}` — no warning. Slices under `minLabelPercent` (default 8%) render blank
281
+ label text rather than being hidden as a unit.
282
+
283
+ **Apply:** pass `labelPlacement="inside"`/`"outside"` explicitly for small numeric-height charts;
284
+ lower `minLabelPercent` when every slice needs a visible value.
285
+
286
+ ### `ApexBarChart` and `ApexAreaChart` silently drop `data` when `series` is also passed
287
+
288
+ `series` always wins over `data` with no warning, on both components — a natural mistake when
289
+ migrating from single- to multi-series. Separately, `ApexBarChart`'s `barColor` array only paints one
290
+ color per bar when `distributed={true}`; with the default `false`, every bar takes `barColor[0]` and
291
+ the rest of the array is silently unused. `ApexRadialChart`'s `hollowSize` has its own unrelated trap
292
+ — it's silently overridden to a fixed `"52%"` whenever `variant="multi"`.
293
+
294
+ **Apply:** never pass `data` and `series` together on `ApexBarChart`/`ApexAreaChart`. Set
295
+ `distributed` whenever `ApexBarChart`'s `barColor` has more than one color. Don't expect
296
+ `ApexRadialChart`'s `hollowSize` to apply under `variant="multi"`.
297
+
298
+ ### `Skeletons` / `ProgressBar` have closed prop lists — no `borderRadius`, no margin, no `...rest`
299
+
300
+ Both `Pick<>` a fixed key set from their Chakra equivalents and forward nothing else — there is no
301
+ way to round a skeleton's corners, add margin, or attach a ref/`data-*` through either component.
302
+
303
+ **Apply:** for rounding, spacing, or a ref, use the Primitives barrel's raw Chakra `Skeleton`/
304
+ `Progress` instead.
305
+
306
+ ### `Skeletons`' `isLoaded` only works for `type="skeleton"`
307
+
308
+ `type="circle"`/`"text"` never receive `isLoaded` (or `children`/`bg`/`color`/`fadeDuration`) —
309
+ passing them compiles and is silently dropped; the shimmer never stops no matter what `isLoaded` is
310
+ set to.
311
+
312
+ **Apply:** for `circle`/`text`, control visibility by conditionally rendering the `Skeletons` element
313
+ itself, not via `isLoaded`.
314
+
315
+ ### `Notification`'s `onClick` only reaches the title text, and its status dot has two gates
316
+
317
+ `onClick` is wired solely to the title text — the card, avatar, and description are not clickable
318
+ despite the generic prop name. Separately, `warningColor`/`errorColor`/`successColor` only take
319
+ effect when `showStatus` is also `true`, and populating `notification.status` (e.g. `"blocked"`) has
320
+ no effect at all — the dot's color comes purely from `dueDate`/`endDate` math.
321
+
322
+ **Apply:** for a fully clickable card, wrap it yourself with your own `onClick`. Always pair the
323
+ three color overrides with `showStatus`; don't use `status` to drive dot color.
324
+
325
+ ### `FeedbackForm` shows a success toast and resets even with no `onSubmit`/`submitUrl`
326
+
327
+ Both props are optional, and when neither is provided, submit still falls through to the success
328
+ toast and form reset — validation, spinner, and reset all work end-to-end while the payload is never
329
+ sent or captured anywhere. Separately, `defaultValues` only seeds state at mount (no resync if it
330
+ arrives later from an async fetch), and its toast is Chakra's raw `useToast`, not this library's
331
+ `Toaster` — the same portal issue documented for `Toaster`/`Modal` can silently hide it when this
332
+ form is embedded in a `Modal`.
333
+
334
+ **Apply:** always pass `onSubmit` or `submitUrl` — treat a bare `<FeedbackForm />` as a bug, not a
335
+ minimal valid usage. Key the element to force a remount if `defaultValues` arrives late. Verify the
336
+ toast actually appears if embedding inside a `Modal`.
337
+
338
+ ### `Checkbox`'s `error` never sets `isInvalid`, and `variant` is a no-op
339
+
340
+ `error` doesn't set `isInvalid`/`aria-invalid`, and `errorMessage`/`helperText` aren't linked via
341
+ `aria-describedby` — confirmed by three `it.failing` cases in `Checkbox.a11y.test.tsx`. Separately,
342
+ `variant` is typed and accepted but never destructured or read; `Checkbox.styles.ts` defines no
343
+ `variants` key, so no value changes anything.
344
+
345
+ **Apply:** pass `isInvalid` explicitly alongside `error` — `error` alone never registers as invalid.
346
+ Don't expect `variant` to change a `Checkbox`'s look.
347
+
348
+ ### `Toggle`/`TableToggle` has no `aria-pressed`, and its tooltip text can silently mismatch its `aria-label`
349
+
350
+ Confirmed by three `it.failing` cases in `TableToggle.a11y.test.tsx` — a tooltip reading "Table View"
351
+ on a button whose `aria-label` is "Grid View" is a real, reachable state, not a hypothetical.
352
+
353
+ **Apply:** keep each button's tooltip text and `aria-label` in sync yourself; the component doesn't
354
+ enforce or derive one from the other.
355
+
356
+ ### `Slider`'s pagination dots can desync from the visible slide
357
+
358
+ The main track sorts `images` by `order`; the pagination dots map over the unsorted array. Passing
359
+ `images` out of `order` sequence makes the active dot point at the wrong slide.
360
+
361
+ **Apply:** pre-sort `images` by `order` before passing them in.
362
+
363
+ ### `TextLabel`'s `isInformation` alone renders no icon — it also needs `informationMessage`
364
+
365
+ The info-tooltip icon is gated on `isInformation && informationMessage` — both must be truthy or
366
+ nothing renders, not even a bare icon. `TextLabel` is the shared label engine behind most fields in
367
+ the library (`TextInput`, `NumberInput`, `PhoneNumberInput`, `RadioButton`, `PinInput`,
368
+ `InputSwitch`, `SelectV2`, the `DatePicker` family, `InputTextArea`, `SelectSearch`, `Search`,
369
+ `SearchSelect`, `MultiSelect`, `Select`), so the same silent no-op repeats at every one of them.
370
+
371
+ **Apply:** always pass `isInformation` and `informationMessage` together; never treat
372
+ `isInformation` alone as "use a default message."
373
+
374
+ ### Any field's label silently renders as an unassociated `<span>` if you omit `id`
375
+
376
+ `TextLabel` (the shared label engine behind nearly every field, see above) only renders a real
377
+ `<label htmlFor>` when given an `id` — omit it and the visible label text renders but is never
378
+ programmatically associated with its control, on any of the ~17 components that use it.
379
+
380
+ **Apply:** always pass `id` when you want a real, accessible `<label>`. (`MultiSelect` omits it on
381
+ purpose and wires `aria-label` instead — that's the pattern to copy if you skip `id` deliberately.)
382
+
383
+ ### `ErrorComponent`'s `error` prop is the message text itself — the opposite of `error`+`errorMessage`
384
+
385
+ Every other field in the library pairs a boolean `error` with a string `errorMessage`.
386
+ `ErrorComponent` (used internally by `Input`/`PinInputs`) instead takes `error: string` directly as
387
+ the message, with no internal truthy-check — passing `error=""` still draws the full icon next to
388
+ blank text. It also has no `id`, so unlike `ErrorMessage` it can't be wired to `aria-describedby`.
389
+
390
+ **Apply:** treat `ErrorComponent` as `Input`/`PinInputs`-specific, not a general error row; guard it
391
+ with a truthy-message check yourself, and use `ErrorMessage` for any other field.
392
+
393
+ ### `FormattedDescription`'s single-`*italic*` marker strips the asterisks but applies no italic style
394
+
395
+ `**bold**` works; a lone `*word*` silently renders as plain text with the markers removed, reading
396
+ as though the formatting was simply ignored.
397
+
398
+ **Apply:** don't rely on single-asterisk emphasis in `content` strings — use `**bold**` or plain text.
399
+
400
+ ### `Timeline`'s `onEditNote` editor doesn't auto-close without `editNoteLoading` — unlike add-note
401
+
402
+ Add-note has a back-compat fallback that closes its editor immediately if `addNoteLoading` is never
403
+ wired. Edit-note has no equivalent fallback — its only close path is an effect watching
404
+ `editNoteLoading` transition `true → false`. Wire `onEditNote` without `editNoteLoading` and Save
405
+ looks like it does nothing: the form stays open with no error or feedback.
406
+
407
+ **Apply:** always pass `editNoteLoading` alongside `onEditNote`, even a client-only flag flipped
408
+ right after the call resolves.
409
+
410
+ ### `Timeline`'s `events` prop is dead — only `timelineEvents` renders
411
+
412
+ `events` is typed and accepted, reads as a plausible prop name, and is never used by the component.
413
+
414
+ **Apply:** always use `timelineEvents`; treat `events`/the exported `TimelineEvent` type as vestigial.
415
+
416
+ ### `Timeline` drops events with an unparseable `created_at`, with no visible trace
417
+
418
+ An event whose formatted date resolves to `"Invalid Date"` is excluded from every date group — not
419
+ shown in a fallback bucket, just gone. The only signal is a `console.warn` inside the formatter.
420
+
421
+ **Apply:** validate/normalize `created_at` before handing events to `Timeline` — a bad timestamp is
422
+ silent, total content loss for that row.
423
+
424
+ ### `Reorder`'s `onReorder` fires even when nothing moved, and its real props aren't in its exported type
425
+
426
+ A drag that ends back at its starting index still has a drop target and still calls `onReorder` with
427
+ a new array reference in the same order. Separately, the component supports `showRemoveIcon`/
428
+ `onRemove` in practice, but the exported `ReorderListProps` type declares only
429
+ `label`/`items`/`onReorder` — neither `ReorderListProps` nor `ReorderItem` is exported from
430
+ `src/index.ts` at all, so there's no public named type to check either way.
431
+
432
+ **Apply:** compare source/destination index (or diff the array) before persisting a reorder, if a
433
+ no-op write matters. `showRemoveIcon`/`onRemove` do work — pass them despite the type gap.
434
+
435
+ ### `Divider` and `Trail`'s pieces aren't exported from the package at all
436
+
437
+ Neither `src/Components/Divider/` nor `src/Components/Trail/` appears in `src/index.ts`, though both
438
+ still compile into `dist/` and are deep-import-reachable. The library's own `Divider` is always
439
+ vertical, fixed size/color, zero props — a different thing from the general-purpose (horizontal,
440
+ styleable) `Divider` re-exported from the `Primitives` barrel. `Trail/TrailWorks` is a hardcoded
441
+ 2-row demo table, not a reusable grid.
442
+
443
+ **Apply:** for a divider in a consuming app, use the `Divider` from `Primitives`, not this library's
444
+ own. For a real data grid, use `Table` — nothing under `Trail/` is meant for reuse.
445
+
446
+ ### `KanbanActions` is not wired into `KanbanBoard`, and is not exported
447
+
448
+ `KanbanBoard`'s header select/edit/create bar is driven by its own `kanbanSelect`/`kanbanEdit`/
449
+ `kanbanCreate` props, via a different internal component. `KanbanActions` is a separate,
450
+ unconnected, unexported component whose only references are its own file and test — its
451
+ `options`-driven buttons always render with no gating, unlike the real header actions.
452
+
453
+ **Apply:** use `KanbanBoard`'s own `kanbanSelect`/`kanbanEdit`/`kanbanCreate` props for board header
454
+ actions — never reach for `KanbanActions`.
455
+
456
+ ### `KanbanBoard`'s `permissions.isEditable: false` disables card drag but not column-reorder drag
457
+
458
+ Card `Draggable`s get `isDragDisabled={!canDrag}`; the column-reorder `Draggable` (active when
459
+ `enableColumnReorder` is true) never checks it — a "read-only" board still lets users reorder whole
460
+ columns.
461
+
462
+ **Apply:** also set `enableColumnReorder={false}` to fully lock a read-only board.
463
+
464
+ ### `KanbanBoard`'s `collapsedColumns` only seeds initial state — not a live controlled prop
465
+
466
+ It seeds a `useState` lazy initializer once, on mount. Without the `preferences` feature wired, a
467
+ later render passing a different `collapsedColumns` value does nothing, despite the name implying a
468
+ controlled value.
469
+
470
+ **Apply:** to force a column open/closed post-mount without `preferences`, remount the board (change
471
+ its `key`) rather than re-passing the prop.
472
+
473
+ ### `KanbanBoard`'s `account.customNode` silently drops delete/open/expand for that one card
474
+
475
+ An item with `customNode` set renders that function instead of `AccountCard`, so `onDelete`,
476
+ `onOpen`, `isDeletable`, and expand/collapse never apply — even though they read as board-wide
477
+ props. Mixing plain and `customNode` items in one column produces inconsistent per-card behavior.
478
+
479
+ **Apply:** don't expect board-wide card actions to reach a `customNode` card; wire them inside your
480
+ custom render instead.
481
+
482
+ ### `KanbanBoard`'s `AccountCard` only renders string-typed fields, and mangles camelCase labels
483
+
484
+ A numeric field on an `Account` (explicitly allowed by its index signature) is silently never shown
485
+ in the card's field list. The auto-generated label only splits on `_` — a snake_case key
486
+ (`account_name`) renders as "Account Name," but an idiomatic camelCase key (`nextFollowUp`)
487
+ collapses into one mashed word ("Nextfollowup").
488
+
489
+ **Apply:** use snake_case keys on `Account` objects, and keep numeric display values as strings.
490
+
491
+ ### `KanbanBoard`'s `onColumnDelete` receives the deleted column's **card** ids, not the column's id
492
+
493
+ Despite the callback parameter being named `colId`-adjacent, what's actually passed is
494
+ `columns[colId].items.map(item => item.id)` — the cards that were in the column, never the column's
495
+ own id.
496
+
497
+ **Apply:** track which column was being deleted another way (e.g. hover/selection state captured
498
+ before the click) if you need the column id itself.
499
+
500
+ ### `isRequired` is decorative on some fields, native on others — same prop name, different behavior
501
+
502
+ `TextInput`, `PhoneNumberInput`, and the exported `PinInput` pass `isRequired` only to the label
503
+ (draws a `*`) — the field itself never gets `required`/`aria-required` (confirmed by an `it.failing`
504
+ case in `TextInput.a11y.test.tsx`). `NumberInput` and the internal `Input.tsx` do propagate it
505
+ natively. A form relying on `isRequired` for native HTML5/AT validation works on some fields and
506
+ silently doesn't on others.
507
+
508
+ **Apply:** don't rely on `isRequired` for native form validation — validate required fields yourself
509
+ regardless of which component you're using.
510
+
511
+ ### `PhoneNumberInput` and `NoteTextArea` type a `ref` prop that never attaches
512
+
513
+ Both are plain function components, not `forwardRef` — a `ref` passed to a plain function component
514
+ is stripped before the body runs, so the destructured ref param is always `undefined`.
515
+ `NoteTextArea` compounds this: even where it does forward a ref, it only reaches the secondary title
516
+ input, never the primary `Textarea`.
517
+
518
+ **Apply:** don't rely on a `ref` into either component; `NumberInput`/`InputTextArea` forward refs
519
+ correctly if you need that pattern.
520
+
521
+ ### `NoteTextArea`'s `saveButtonLoading` going `true → false` clears the draft even on a failed save
522
+
523
+ The effect that resets note/title/files fires whenever `saveButtonLoading` goes falsy — there's no
524
+ separate success/failure signal, so a parent that turns off the loading flag after a failed save
525
+ silently discards everything the user typed.
526
+
527
+ **Apply:** don't flip `saveButtonLoading` back to `false` on failure without your own recovery path
528
+ (e.g. keep the draft in your own state and re-seed it).
529
+
530
+ ### `PinInput` and `PinInputs` are two unrelated implementations — only one is real
531
+
532
+ The component published as `PinInput` from `index.ts` is Chakra-native, themed, supports OTP paste
533
+ and `type: "alphanumeric" | "number"`. `PinInputs` (plural) is a separate, hand-rolled,
534
+ always-numeric implementation that is **not exported** and not referenced anywhere else in the repo
535
+ — a dead-code candidate, not an alternate API. It still compiles into `dist/`, so the deep-import
536
+ pattern this repo otherwise supports would silently pull in the unmaintained one.
537
+
538
+ **Apply:** always use `PinInput` (singular); never deep-import `PinInputs`.
539
+
540
+ ### `InputSwitch`'s checked/unchecked track color is silently replaced by a caller-supplied `sx`
541
+
542
+ The component's own `sx` (sets track background from `isChecked`) is spread over first, then
543
+ `{...props}` — any `sx` a caller passes wins outright, so the switch stops changing color on toggle.
544
+
545
+ **Apply:** don't pass `sx` to override styling on `InputSwitch`; if you must, re-include the
546
+ checked/unchecked background logic yourself.
547
+
548
+ ### `TextInput`'s `placeholder` defaults to the literal word `"Placeholder"`, not empty
549
+
550
+ Omit the prop and real users see the actual text "Placeholder" in the field.
551
+
552
+ **Apply:** always pass an explicit `placeholder` (or an empty string) at every `TextInput` call site.
553
+
554
+ ### The internal `Input.tsx` silently ignores six declared props
555
+
556
+ `disabled`, `autoComplete`, `autoFocus`, `inputClassName`, `labelClassName`, and `errorClassName`
557
+ are all typed on `InputProps` but never read — passing them, `disabled` especially, compiles cleanly
558
+ and does nothing. It also has no `id` field, so its label always renders as an unassociated `<span>`.
559
+
560
+ **Apply:** this is an internal component (not exported) reachable only via deep import — prefer
561
+ `TextInput` for anything public-facing, which doesn't have this gap.
562
+
563
+ ### `AlertDialog`'s `colorScheme`/`size`/`status`/`variant`/`addRole` are dead props
564
+
565
+ Typed (`Pick`ed from Chakra's `AlertProps`) but never destructured — Cancel/Confirm are hardcoded
566
+ red/primary at `size="sm"` regardless of what you pass.
567
+
568
+ **Apply:** style Cancel/Confirm via `button1Style`/`button2Style`, not `colorScheme`/`size`/`status`/
569
+ `variant`.
570
+
571
+ ### `AlertDialog` can always be dismissed via Escape or an overlay click, not just its buttons
572
+
573
+ `closeOnOverlayClick`/`closeOnEsc` aren't exposed as props, so Chakra's `true`/`true` defaults apply
574
+ unconditionally — `onClose` fires the same way for Escape/overlay-click as for the Cancel button.
575
+
576
+ **Apply:** don't treat `onClose` as "the user explicitly chose Cancel" — that distinction isn't
577
+ available through this component.
578
+
579
+ ### `ToolTip`'s `overflowOnly` silently no-ops on non-single-element children
580
+
581
+ The truncation ref only attaches when `children` passes `React.isValidElement` — a bare string, a
582
+ Fragment, or multiple children skip that branch, so the tooltip always shows instead of
583
+ only-when-truncated (the opposite of the prop's contract).
584
+
585
+ **Apply:** give `overflowOnly`/`OverflowToolTip` exactly one real element as `children` (e.g. a
586
+ single `Text noOfLines`), never a Fragment or bare text.
587
+
588
+ ### `Toaster`'s `showToast({ children })` is a dead prop, and its two `onClose`s are different functions
589
+
590
+ `children` type-checks (Picked from Chakra's `ToastProps`) but is never read — only `title`/
591
+ `description`/`actions` render. Separately, the `onClose` you pass to `showToast` is wired to
592
+ Chakra's `onCloseComplete` (fires after the exit animation, on any dismiss path); the `onClose` your
593
+ `actions` render-prop receives is a different, immediate per-toast dismiss function.
594
+
595
+ **Apply:** pass `description`, not `children`. Don't assume your `onClose` fires the instant the
596
+ user clicks close — it fires after the exit transition completes.
597
+
598
+ ### Every `Toaster` status announces at `aria-live="polite"`, including `error`
599
+
600
+ No urgency bump for errors, and status is conveyed by icon + colour alone with no text equivalent —
601
+ confirmed by two intentionally-`it.failing` tests in `Toaster.a11y.test.tsx`.
602
+
603
+ **Apply:** don't rely on an error toast interrupting a screen reader; pair a critical failure with
604
+ another signal (e.g. an inline field error).
605
+
606
+ ### `Button`'s `loadingText` defaults to `"Loading"`, not Chakra's spinner-only style
607
+
608
+ `loadingText` defaults to the literal string `"Loading"`, so every `isLoading` button shows that
609
+ text next to the spinner instead of Chakra's native behavior (hide content, spinner only) — even
610
+ icon-only buttons, where it can break the expected square aspect ratio. Passing
611
+ `loadingText={undefined}` does not restore the native look; the default parameter still applies.
612
+
613
+ **Apply:** pass `loadingText=""` explicitly to get a spinner-only loading state.
614
+
615
+ ### `ButtonGroupIcon`'s dropdown needs `rightIcon` **and** `rightIconDropdown` both set
616
+
617
+ The `Menu`/`dropdownOptions` branch only renders inside `rightIcon && rightIconDropdown`. Supplying
618
+ `dropdownOptions` alone, or `rightIconDropdown` without `rightIcon`, silently renders nothing on the
619
+ right side. Separately, `onButtongroupClick` is wired to Chakra `ButtonGroup`'s own `onClick` on the
620
+ wrapping div — native DOM bubbling means it fires on every click inside the group (left icon, center
621
+ button, right icon/dropdown), not just a "clicked outside the buttons" signal.
622
+
623
+ **Apply:** always set `rightIcon` + `rightIconDropdown={true}` together for the dropdown. Don't use
624
+ `onButtongroupClick` to detect background clicks — inspect `event.target` if you need to distinguish.
625
+
626
+ ### `Buttons` (plural) is not a group wrapper, and not theme-aware
627
+
628
+ Despite the plural name suggesting a group, `Buttons` renders one plain `<button>` hardcoded to
629
+ Tailwind's `bg-purple-600` — it ignores brand/dark-mode entirely and isn't exported from the package
630
+ root.
631
+
632
+ **Apply:** use `Button` for a single themed button or `ButtonGroupIcon` for a themed group; there is
633
+ no good reason to reach for `Buttons`.
634
+
635
+ ### `Card` silently drops `header`, `footer`, and all three divider props
636
+
637
+ `CardProps` declares `header`, `footer`, `dividercolor`, `dividersize`, `dividervariant`, but none
638
+ are destructured by `Card` — passing them compiles cleanly and renders nothing. Padding is also
639
+ hardcoded (`p={4}`), so it can't be tuned via props either.
640
+
641
+ **Apply:** put header/footer content inside `children`; use `sx` for padding overrides.
642
+
643
+ ### `ProductCard`'s variant selection goes stale after an `options` update, and `options={[]}` crashes it
644
+
645
+ Both `ProductCard` and its internal `ProductPrice` capture `options[0]` into state only once, at
646
+ mount, with no resync effect — a later re-render with refreshed `options` (new stock/price) is
647
+ silently ignored, so Add to Cart/Notify Me act on stale data. An empty array crashes on
648
+ `selected.label`. Separately, `description` and `avalabilitys` are typed and accepted but never
649
+ read by the component.
650
+
651
+ **Apply:** treat `options` as effectively static per mount (remount via `key` if it changes), and
652
+ never pass `[]`. Don't rely on `description`/`avalabilitys` — there's currently no way to show either.
653
+
654
+ ### `ProductTags` (shared by `ProductCard`/`ProductDetails`) silently renders zero tags past 4
655
+
656
+ The row-layout helper only handles 1-4 entries — 5 or more tags renders nothing at all, no
657
+ truncation or "+N more" affordance.
658
+
659
+ **Apply:** cap `tags` at 4 entries at the call site until the component adds an overflow case.
660
+
661
+ ### `PaymentCard`'s `onHover` never fires its `"card"` variant, and the CTA hides unless `isRenewal`
662
+
663
+ `onHover`'s type promises `"card" | "button"`, but no hover handler exists on the outer plan card —
664
+ only the CTA button wires hover. Separately, the CTA (and its callbacks) disappears whenever
665
+ `isActive` is true unless `isRenewal` is also set, regardless of `plan.buttonText`.
666
+
667
+ **Apply:** don't build "card" hover analytics on this prop. Pass `isRenewal` to show a CTA on the
668
+ current/active plan.
669
+
670
+ ### `OrganizationDetails`' `defaultOrg === 1` silently overrides an explicit `canDelete: true`
671
+
672
+ `isProtected` is computed as `item.defaultOrg === 1 || canProtect` — `defaultOrg` short-circuits the
673
+ `canDelete`/role check unconditionally. An org that is both the user's default and marked
674
+ `canDelete: true` still renders a disabled delete button, with only a tooltip explaining why.
675
+
676
+ **Apply:** don't rely on `canDelete` alone to guarantee delete is enabled — check `defaultOrg` too.
677
+
678
+ ### `OrganizationDetails`, `CustomModulesTable`'s create/edit/delete modals show no error UI on rejection
679
+
680
+ `onCreateOrganization`/`onDeleteOrganization`/`onEditOrganization` (and `CustomModulesTable`'s
681
+ `onUpdateModule`/`onDeleteModule`) are `await`ed and the modal only resets on success — a rejection
682
+ is an unhandled promise rejection with zero visible feedback.
683
+
684
+ **Apply:** wrap your own handler in try/catch and show your own error toast; the library never does
685
+ it for you.
686
+
687
+ ### `OrgSwitcher`'s `onChange` doesn't fire on re-selecting the already-active org, and has a closed prop list
688
+
689
+ Re-clicking the current org closes the popover but skips `onChange` entirely (`org.id !== value` gate)
690
+ — don't rely on it for a side effect that must run on every click (analytics, refetch). Separately,
691
+ the trigger has no `...rest`/`ref` escape hatch: a `data-testid`, `id`, or positioning `ref` can't
692
+ reach it.
693
+
694
+ **Apply:** don't depend on `onChange` firing for a repeat pick. There's no supported way to attach
695
+ test hooks or a ref to the trigger.
696
+
697
+ ### `UpgradeButton`'s gold icon accent silently falls back to the label color on low contrast
698
+
699
+ The gold accent is only used when it clears AA contrast against both gradient stops; a custom
700
+ `gradient` prop can flip it to the label's own ink color with no signal.
701
+
702
+ **Apply:** don't assume the icon stays gold with a custom `gradient` — check contrast yourself if the
703
+ gold accent is load-bearing for your design.
704
+
705
+ ### `PlanPill`/`PlanBadge` always render as a real, focusable `<button>` — even with no `onClick`
706
+
707
+ `as="button"`, `cursor="pointer"`, and the hover-lift are unconditional. Omitting the optional
708
+ `onClick` does not get you a static/informational pill — it stays tabbable and screen-reader
709
+ -announced as a button regardless.
710
+
711
+ **Apply:** there is currently no way to get a non-interactive plan badge from this component.
712
+
713
+ ### `LimitReachedModal`'s `onUpgrade` never triggers `onClose`, and needs both `limit` and `used` to show usage
714
+
715
+ Clicking the CTA calls only `onUpgrade` — confirmed by the component's own test. Separately, the
716
+ inline usage line renders only when **both** `limit` and `used` are non-nullish; passing just one
717
+ silently omits the whole line.
718
+
719
+ **Apply:** close the modal yourself inside your `onUpgrade` handler if upgrading should dismiss it.
720
+ Always pass `limit`/`used` together, or neither.
721
+
722
+ ### `CustomModulesTable`'s `ModuleItem.module_id` is the one snake_case field on an otherwise camelCase type
723
+
724
+ A loosely-typed API response cast straight to `ModuleItem[]` can leave `module_id: undefined` with
725
+ no compile error, colliding React `key`s.
726
+
727
+ **Apply:** map the API field explicitly to `module_id` — don't assume this type is uniformly
728
+ camelCase like its sibling payload type (`UpdateModulePayload.moduleId`).
729
+
730
+ ### `RolesPermission`'s permission matrix silently reroutes every column for an "Automation" row
731
+
732
+ Any `permissions[]` row whose `module` case-insensitively equals `"automation"` collapses every
733
+ column onto a single `automation` boolean — only the Read cell renders/toggles, and clicking it
734
+ calls `onPermissionChange(module, "automation")`, not `"read"`. Separately, `roles_id` (typed
735
+ `string`) is coerced via `Number()` before `onDeleteRole` fires — a UUID or ObjectId silently
736
+ becomes `NaN`.
737
+
738
+ **Apply:** if a row's `module` can be `"automation"`, expect only its Read checkbox to work, toggling
739
+ `automation` — create/edit/delete/import/export are unreachable for that row. Only pass
740
+ numeric-string `roles_id` values.
741
+
742
+ ### Several delete/deactivate modals close before their async handler can be awaited
743
+
744
+ `RolesPermission`'s `DeleteRoleModal` and `UserDetails`' `DeactivateConfirmModal` call their
745
+ handlers fire-and-forget (typed plain `() => void`) and close synchronously in the same tick — the
746
+ opposite failure mode from the create/edit modals above, whose handlers are genuinely awaited.
747
+
748
+ **Apply:** any `isLoading`/spinner wiring for delete/deactivate can never be seen — handle
749
+ loading/error UI outside these two modals (e.g. a toast).
750
+
751
+ ### `UserDetails`' Change Role and Resend Invitation buttons silently no-op when `userId` is null
752
+
753
+ Only Deactivate actually disables itself when `selectedUser.userId` is null — the other two stay
754
+ visually enabled and do nothing on click. Separately, `ChangeRoleModal` pre-selects the current role
755
+ by case-insensitive **label text** match, not an id — any mismatch (whitespace, a renamed role)
756
+ silently opens the modal with nothing pre-selected, no error shown.
757
+
758
+ **Apply:** always populate `selectedUser.userId` when those two actions should be usable. Keep
759
+ `currentRole` as the exact display label kept in sync with `roleOptions[].label`.
760
+
761
+ ### `FileUploader`'s `onFilesChange` discards the real `File`, and its `acceptTypes`/`maxFiles` enforce nothing
762
+
763
+ `FileUploader` hands back lightweight `{id, name, size, previewUrl}` metadata — the original `File`
764
+ is discarded in `handleFiles`, so it can never back an actual upload. `acceptTypes` only sets the
765
+ native picker's `accept` attribute; drag-and-drop ignores it completely and no code path rejects a
766
+ wrong-type file. Exceeding `maxFiles` silently truncates the list with no error.
767
+
768
+ **Apply:** need real file bytes or enforced validation → use `FileUpload`, not `FileUploader`.
769
+
770
+ ### `FileUpload`'s default `maxSizeKB` is 5 — that's 5 **kilobytes**, not megabytes
771
+
772
+ Left at its default, `FileUpload` rejects virtually every real file, and the auto-generated
773
+ hint/error text literally reads "0.00 MB" because the KB→MB conversion divides an already-tiny value.
774
+
775
+ **Apply:** always pass an explicit `maxSizeKB` in KB (e.g. `5000` for ~5MB).
776
+
777
+ ### `DatePicker`'s `pickerType` does nothing when `isRange` is set, and no variant has a seconds control
778
+
779
+ `RangeDatePicker` never reads `pickerType` — whether time inputs show is controlled entirely by
780
+ whether `dateFormat` contains time tokens. Separately, every time-capable picker caps at minute
781
+ granularity regardless of `dateFormat` — a format containing `ss` compiles and parses but seconds
782
+ are never user-editable.
783
+
784
+ **Apply:** for a range picker, control the time row via `dateFormat`, never `pickerType`. Don't
785
+ request second-precision input from any DatePicker variant.
786
+
787
+ ### `RangeDatePicker` loses a picked range if you click outside instead of Apply
788
+
789
+ Unlike `SingleDatePicker`, its outside-click handler doesn't call `finalize()` — only the Apply
790
+ button or Escape commits a completed range via `onChange`. Clicking anywhere else outside the
791
+ popover after picking both ends discards the selection silently.
792
+
793
+ **Apply:** don't assume outside-click commits a range the way it does for `SingleDatePicker`.
794
+
795
+ ### `TimeOnlyPicker`'s label is never associated with its field, and `name` is a no-op
796
+
797
+ Passing `id`/`label` does not produce an accessible `<label for>` — the internal label call omits
798
+ `id`, so it always renders as an unassociated `<span>`. `name` (and `minDate`/`maxDate`/
799
+ `disableFutureDates`/`disablePastDates`/`autoComplete`) are also silently dropped — the rendered
800
+ `<input>` never gets a `name` attribute, breaking plain `<form>`/`FormData` submission.
801
+
802
+ **Apply:** don't rely on `TimeOnlyPicker` for native form submission or label accessibility; read its
803
+ value via `onChange` rather than form `name`.
804
+
805
+ ### `Editor`'s `config` prop can silently break dark mode, and its `key` prop can never reach Jodit
806
+
807
+ `Editor` computes `config.theme`/`config.popupRoot` itself to fix Jodit's dark-mode/popup theming,
808
+ then spreads your `config` on top — any `theme`/`popupRoot` key you pass wins and silently disables
809
+ the fix. Separately, `key` is typed as if readable, but React reserves and strips it before the
810
+ component sees `props`, so it's always `undefined` internally and can't force a remount. `editorRef`
811
+ is also `null` until Jodit's lazy-loaded chunk resolves — a mount-time effect reading it gets nothing.
812
+
813
+ **Apply:** never set `theme`/`popupRoot` inside the `config` you pass to `Editor`. To force a
814
+ remount, wrap `<Editor>` itself in a keyed parent, not via `Editor`'s own `key` prop.
815
+
816
+ ### `SelectV2`, `SearchSelect`, and `SelectSearch` all search `option.label` only
817
+
818
+ None of the three checks a rendered secondary field (`option.description`, a custom `view` node,
819
+ `option.email` on a profile row) — typing text that's visibly on-screen in a secondary field returns
820
+ no match.
821
+
822
+ **Apply:** if a secondary field needs to be searchable, fold it into `option.label` yourself, or
823
+ pre-filter `options` before passing them in.
824
+
825
+ ### `SearchSelect` never virtualizes, and `chip.maxChips={0}` is swallowed by a falsy fallback
826
+
827
+ Despite the prop name, `virtualization` does nothing — every filtered option renders as a real DOM
828
+ node; the list scales only via consumer-driven `pagination`. Separately,
829
+ `selectedValues.slice(0, chip?.maxChips || selectedValues.length)` treats a literal `0` as "no limit
830
+ set" (falsy), so every chip renders anyway instead of zero.
831
+
832
+ **Apply:** for a dataset large enough to need real virtualization, page it in via `pagination` rather
833
+ than setting `virtualization={true}`. Pass `1` or higher to `chip.maxChips`; there's no supported way
834
+ to hide all chips via this prop.
835
+
836
+ ### `SelectSearch`'s Enter key requires an exact full-label match, not the keyboard-highlighted option
837
+
838
+ Typing a partial query and pressing Enter without arrowing down first does not pick the
839
+ visually-highlighted top option — it only fires if the typed text exactly equals an option's full
840
+ label. `SelectV2`/`SearchSelect` both correctly select the highlighted option on Enter; `SelectSearch`
841
+ doesn't. Two more props (`isSearchEnabled`, `BottomIconStyle`) are typed but never read, and
842
+ `initialSelectedOption` only seeds selection at mount with no resync if the real value arrives later.
843
+
844
+ **Apply:** tell users to arrow down before Enter with this component specifically. Don't pass
845
+ `initialSelectedOption` before the real value is known (or key the component to force a remount).
846
+
847
+ ### `FieldSelectModal`'s "Select all" ignores the active search filter, and resets on any parent re-render
848
+
849
+ The header checkbox (and its indeterminate state) always operates on the complete `fields` list, not
850
+ the search-filtered subset — clicking it while filtered silently selects/clears fields the user can't
851
+ see. Separately, an effect re-seeds selection whenever `fields`/`defaultSelected` changes
852
+ **reference**, so an inline array literal for either prop silently wipes in-progress picks on the
853
+ next parent re-render.
854
+
855
+ **Apply:** clear the search before using "Select all." Memoize `fields`/`defaultSelected` in the
856
+ parent before passing them down.
857
+
858
+ ### `Dropdown`'s `ButtonText`/`text` are mutually exclusive per `dropdownType`, silently
859
+
860
+ The `"button"` trigger renders `ButtonText` only; the `"text"` trigger renders `text` only — pairing
861
+ the wrong prop with the active `dropdownType` renders an icon-only or bare-chevron trigger with no
862
+ visible label, and the `aria-label` fallback then substitutes "Open menu" as the accessible name too.
863
+ Separately, `buttonProps.sx` fully replaces the built-in trigger style rather than merging, silently
864
+ dropping the hover transition.
865
+
866
+ **Apply:** pair `ButtonText` with the default/`"button"` type and `text` with `dropdownType="text"`.
867
+ Fold custom styling into `dropDownButtonStyle`, not `buttonProps.sx`.
868
+
869
+ ### `Search`'s default `shortcut` grabs a page-global Ctrl+K with no way to opt out
870
+
871
+ Every mounted `Search` registers its own `window` Ctrl+K listener by default — the type only permits
872
+ the literal `"Ctrl+K"` or `undefined`, and `undefined` still resolves to the same default via JS
873
+ parameter defaulting. Two instances on one visible view race for the keypress.
874
+
875
+ **Apply:** avoid mounting more than one `Search` per visible view/route — there's currently no way to
876
+ scope or disable the hotkey per-instance.
877
+
878
+ ### `Header`'s desktop submenus open on hover only — no keyboard or click trigger
879
+
880
+ Dropdown children are gated on local hover state (`onMouseEnter`/`onMouseLeave`), with no `onFocus`.
881
+ A keyboard user tabbing to a parent item can never open its children on the desktop layout — the
882
+ identical data renders as a click-toggled accordion on mobile.
883
+
884
+ **Apply:** don't put anything a keyboard user must reach behind `children` on desktop; use `rightSlot`
885
+ (real focusable buttons) for critical actions until this gets a keyboard path.
886
+
887
+ ### `WorkspaceWindow`'s `state="maximized"` is indistinguishable from `"medium"`
888
+
889
+ The component only branches on `state === "minimized"` — size is always the same fixed constant, and
890
+ `onMedium`/`onMaximize` are accepted callbacks that are never invoked anywhere in the component.
891
+
892
+ **Apply:** treat `state` as effectively two-valued (open vs. `"minimized"`); don't wire a maximize
893
+ control expecting `onMaximize` to fire.
894
+
895
+ ### `FilterSidebar`'s `selected` without `onChange` makes every filter silently inert
896
+
897
+ Passing `selected` alone (uncontrolled companion `onChange` omitted) computes the next filter state
898
+ on every click and discards it — checkboxes visibly never check, forever, with no error. Separately,
899
+ `onApply`, `headerPadding`, and `sliderMode` are all typed and accepted but have zero effect —
900
+ `FilterSection.checkboxes` doesn't exist either; radio-vs-checkbox mode is actually decided by
901
+ `type === "radio" || section.radio`.
902
+
903
+ **Apply:** always pass `selected` and `onChange` together, or omit `selected` and let `FilterSidebar`
904
+ own its state. Don't reach for `onApply`/`headerPadding`/`sliderMode`/`FilterSection.checkboxes` —
905
+ none of them do anything.
906
+
907
+ ### `Breadcrumbs`' `isLastChild` prop is accepted but never read
908
+
909
+ It's declared on the type but omitted from the component's destructure entirely.
910
+
911
+ **Apply:** don't pass it expecting it to mark or style the final crumb — there's nothing it can do.
912
+
913
+ ### `Accordion`'s `items[].buttonProps`/`itemProps` replace, not merge, the expanded/hover highlight
914
+
915
+ Both spread after the built-in `bg`/`_hover` that encode `isExpanded` state — passing `bg` or
916
+ `_hover` there to tweak one item's style silently kills that item's expanded/active indication.
917
+
918
+ **Apply:** style around the defaults via `customStyles` (merged through `sx`) rather than
919
+ `buttonProps`/`itemProps` when the highlight must survive.
920
+
921
+ ### `Table`'s `LeftFilterPane` Clear All only re-applies filters in `"sidebar"` mode
922
+
923
+ `handleClear` calls `onClear` unconditionally, but only calls `onApply(cleared)` when
924
+ `filterMode === "sidebar"` — in `"modal"` mode, Clear All visually unchecks every filter but never
925
+ tells the parent the selection changed, so a consumer whose `onClear` doesn't itself reset
926
+ applied/query state keeps serving pre-clear filtered data.
927
+
928
+ **Apply:** when using `filterMode="modal"`, drive your data refetch from `onClear`, not `onApply` —
929
+ don't assume `onApply` fires on every Clear All.
930
+
931
+ ### `ScrollToTop` watches one `parentElement` hop, not "the nearest scrollable ancestor"
932
+
933
+ It reads `scrollTop` off its immediate DOM parent only, with no upward search for an `overflow:
934
+ auto/scroll` element. Wrap it in one extra layout `<div>` and the button silently never appears — no
935
+ error, no warning, `scrollTop` on a non-scrolling parent just stays `0` forever.
936
+
937
+ **Apply:** `ScrollToTop`'s JSX parent must be the actual scroll container, or pass `useWindow` when
938
+ the page itself scrolls.
939
+
940
+ ### `ProfilePhotoViewer`'s PDF detection breaks the moment a file is picked, and `photoUrl` is read once
941
+
942
+ PDF detection is a literal `.endsWith(".pdf")` check — picking a file through the built-in editor
943
+ replaces the value with a base64 data URI that never ends in `.pdf`, so a freshly-picked PDF renders
944
+ as a broken image instead of the intended file badge (only the original URL prop is detected
945
+ correctly). Separately, `photoUrl` only seeds state at mount — a later re-render with a new
946
+ `photoUrl` (list virtualization, route change without remount) keeps showing the old photo.
947
+
948
+ **Apply:** don't use the built-in edit flow for PDF documents; detect kind from `File.type` in your
949
+ own handler instead. Use `key={photoUrl}` to force a remount when the photo identity changes.
950
+
951
+ ### `FilePreview` infers file kind from `fileName`, not `fileUrl`, and never resets zoom/rotation on its own
952
+
953
+ Once `fileName` is set, `fileUrl`'s own extension is never consulted — a friendly display name with
954
+ no extension forces the "preview unavailable" fallback even when `fileUrl` points at a perfectly
955
+ renderable file. Separately, cycling `fileUrl` while the modal stays open (a gallery next/prev)
956
+ carries the previous image's zoom/rotation into the new one.
957
+
958
+ **Apply:** keep the real extension on `fileName`, or pass `fileType` explicitly to skip inference.
959
+ Remount via `key={fileUrl}` when swapping the file in place instead of just changing the prop.
960
+
961
+ ### `StageProgress`'s `tooltipThreshold`/`minStageWidth` no-op under `variant="stepper"`, and a stale `value` blanks the tracker
962
+
963
+ Both props stop having any effect the moment a tracker switches to the stepper variant. Separately,
964
+ if `value` matches no `stage.id` (e.g. `stages` was filtered/re-derived and went stale), every stage
965
+ silently renders as `"upcoming"` — no stage is ever active or completed, with no error.
966
+
967
+ **Apply:** don't rely on either prop once on the stepper variant. Re-validate `value` against the
968
+ current `stages` list whenever it's filtered.