pixelize-design-library 2.3.22 → 2.4.1

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 (541) hide show
  1. package/.claude/settings.local.json +51 -0
  2. package/.cursor/TASK-SETUP.md +43 -0
  3. package/.cursor/agents/be-impl.md +37 -0
  4. package/.cursor/agents/fe-impl.md +39 -0
  5. package/.cursor/agents/task-plan.md +56 -0
  6. package/.cursor/agents/test-create.md +31 -0
  7. package/.cursor/agents/test-exec.md +26 -0
  8. package/.cursor/hooks/task-hint.env +1 -0
  9. package/.cursor/hooks/task-skill-nudge.sh +71 -0
  10. package/.cursor/hooks/task-slash-guard.sh +31 -0
  11. package/.cursor/hooks.json +13 -0
  12. package/.cursor/modules/account-management/MODULE.md +34 -0
  13. package/.cursor/modules/buttons/MODULE.md +47 -0
  14. package/.cursor/modules/cards/MODULE.md +55 -0
  15. package/.cursor/modules/charts/MODULE.md +40 -0
  16. package/.cursor/modules/common/MODULE.md +36 -0
  17. package/.cursor/modules/contact-auth/MODULE.md +19 -0
  18. package/.cursor/modules/data-display/MODULE.md +42 -0
  19. package/.cursor/modules/feedback/MODULE.md +32 -0
  20. package/.cursor/modules/form/MODULE.md +13 -0
  21. package/.cursor/modules/inputs-basic/MODULE.md +42 -0
  22. package/.cursor/modules/inputs-date-file/MODULE.md +56 -0
  23. package/.cursor/modules/inputs-select/MODULE.md +27 -0
  24. package/.cursor/modules/inputs-toggle/MODULE.md +18 -0
  25. package/.cursor/modules/kanban/MODULE.md +22 -0
  26. package/.cursor/modules/layout-navigation/MODULE.md +269 -0
  27. package/.cursor/modules/overlays/MODULE.md +69 -0
  28. package/.cursor/modules/playground/MODULE.md +28 -0
  29. package/.cursor/modules/table/MODULE.md +78 -0
  30. package/.cursor/modules/theme/MODULE.md +314 -0
  31. package/.cursor/modules/types-exports/MODULE.md +17 -0
  32. package/.cursor/modules/utility-ui/MODULE.md +50 -0
  33. package/.cursor/modules/utils-hooks/MODULE.md +35 -0
  34. package/.cursor/pixelize-task-statusline.sh +64 -0
  35. package/.cursor/plans/blocked/.gitkeep +0 -0
  36. package/.cursor/plans/current.md +12 -0
  37. package/.cursor/plans/current.theme-tokens-dark-mode.md +77 -0
  38. package/.cursor/plans/current.theme-tokens-dark.md +155 -0
  39. package/.cursor/plans/done/.gitkeep +0 -0
  40. package/.cursor/rules +31 -0
  41. package/.cursor/skills/task/SKILL.md +167 -0
  42. package/CLAUDE.md +148 -0
  43. package/README.md +77 -10
  44. package/__mocks__/styleMock.js +8 -0
  45. package/coverage/clover.xml +405 -0
  46. package/coverage/coverage-final.json +16 -0
  47. package/coverage/coverage-summary.json +50 -0
  48. package/coverage/lcov-report/Button/Button.tsx.html +244 -0
  49. package/coverage/lcov-report/Button/index.html +116 -0
  50. package/coverage/lcov-report/Checkbox/Checkbox.tsx.html +433 -0
  51. package/coverage/lcov-report/Checkbox/index.html +116 -0
  52. package/coverage/lcov-report/Common/ErrorMessage.tsx.html +148 -0
  53. package/coverage/lcov-report/Common/FormLabel.tsx.html +331 -0
  54. package/coverage/lcov-report/Common/HelperText.tsx.html +124 -0
  55. package/coverage/lcov-report/Common/index.html +146 -0
  56. package/coverage/lcov-report/Components/Button/Button.tsx.html +244 -0
  57. package/coverage/lcov-report/Components/Button/index.html +116 -0
  58. package/coverage/lcov-report/Components/Checkbox/Checkbox.tsx.html +433 -0
  59. package/coverage/lcov-report/Components/Checkbox/index.html +116 -0
  60. package/coverage/lcov-report/Components/Common/ErrorMessage.tsx.html +148 -0
  61. package/coverage/lcov-report/Components/Common/FormLabel.tsx.html +331 -0
  62. package/coverage/lcov-report/Components/Common/HelperText.tsx.html +124 -0
  63. package/coverage/lcov-report/Components/Common/index.html +146 -0
  64. package/coverage/lcov-report/Components/CustomModulesTable/CustomModulesTable.tsx.html +712 -0
  65. package/coverage/lcov-report/Components/CustomModulesTable/DeleteModuleModal.tsx.html +343 -0
  66. package/coverage/lcov-report/Components/CustomModulesTable/EditModuleModal.tsx.html +313 -0
  67. package/coverage/lcov-report/Components/CustomModulesTable/index.html +146 -0
  68. package/coverage/lcov-report/Components/Divider/Divider.tsx.html +133 -0
  69. package/coverage/lcov-report/Components/Divider/index.html +116 -0
  70. package/coverage/lcov-report/Components/Dropdown/DropDown.tsx.html +994 -0
  71. package/coverage/lcov-report/Components/Dropdown/index.html +116 -0
  72. package/coverage/lcov-report/Components/EmptyState/EmptyState.tsx.html +466 -0
  73. package/coverage/lcov-report/Components/EmptyState/index.html +116 -0
  74. package/coverage/lcov-report/Components/Header/HeaderActions.tsx.html +373 -0
  75. package/coverage/lcov-report/Components/Header/index.html +116 -0
  76. package/coverage/lcov-report/Components/Input/TextInput.tsx.html +487 -0
  77. package/coverage/lcov-report/Components/Input/index.html +116 -0
  78. package/coverage/lcov-report/Components/Input/textInputIconSize.ts.html +205 -0
  79. package/coverage/lcov-report/Components/KanbanBoard/AccountCard.tsx.html +547 -0
  80. package/coverage/lcov-report/Components/KanbanBoard/AccountRow.tsx.html +190 -0
  81. package/coverage/lcov-report/Components/KanbanBoard/KanbanActions/KanbanActions.tsx.html +247 -0
  82. package/coverage/lcov-report/Components/KanbanBoard/KanbanActions/index.html +116 -0
  83. package/coverage/lcov-report/Components/KanbanBoard/KanbanBoard.tsx.html +3598 -0
  84. package/coverage/lcov-report/Components/KanbanBoard/MeasuredItem.tsx.html +283 -0
  85. package/coverage/lcov-report/Components/KanbanBoard/index.html +161 -0
  86. package/coverage/lcov-report/Components/OrganizationDetails/CreateOrgModal.tsx.html +511 -0
  87. package/coverage/lcov-report/Components/OrganizationDetails/DeleteOrgModal.tsx.html +334 -0
  88. package/coverage/lcov-report/Components/OrganizationDetails/OrganizationDetails.tsx.html +1519 -0
  89. package/coverage/lcov-report/Components/OrganizationDetails/index.html +146 -0
  90. package/coverage/lcov-report/Components/RolesPermission/DeleteRoleModal.tsx.html +328 -0
  91. package/coverage/lcov-report/Components/RolesPermission/RolesPermission.tsx.html +1732 -0
  92. package/coverage/lcov-report/Components/RolesPermission/index.html +131 -0
  93. package/coverage/lcov-report/Components/SearchSelect/SearchSelect.tsx.html +2575 -0
  94. package/coverage/lcov-report/Components/SearchSelect/SelectTruncatedLabel.tsx.html +202 -0
  95. package/coverage/lcov-report/Components/SearchSelect/index.html +146 -0
  96. package/coverage/lcov-report/Components/SearchSelect/searchSelectSize.ts.html +496 -0
  97. package/coverage/lcov-report/Components/Select/Select.tsx.html +361 -0
  98. package/coverage/lcov-report/Components/Select/index.html +116 -0
  99. package/coverage/lcov-report/Components/SideBar/components/OtherApps.tsx.html +562 -0
  100. package/coverage/lcov-report/Components/SideBar/components/OverflowTooltipText.tsx.html +346 -0
  101. package/coverage/lcov-report/Components/SideBar/components/index.html +116 -0
  102. package/coverage/lcov-report/Components/SignInActivityTable/SignInActivityTable.tsx.html +490 -0
  103. package/coverage/lcov-report/Components/SignInActivityTable/index.html +116 -0
  104. package/coverage/lcov-report/Components/Table/components/TableActions.tsx.html +595 -0
  105. package/coverage/lcov-report/Components/Table/components/TableBody.tsx.html +2212 -0
  106. package/coverage/lcov-report/Components/Table/components/TableGroupRow.tsx.html +358 -0
  107. package/coverage/lcov-report/Components/Table/components/TableLoading.tsx.html +358 -0
  108. package/coverage/lcov-report/Components/Table/components/index.html +161 -0
  109. package/coverage/lcov-report/Components/Table/settings/ManageColumns.tsx.html +856 -0
  110. package/coverage/lcov-report/Components/Table/settings/index.html +116 -0
  111. package/coverage/lcov-report/Components/Tag/Tag.styles.tsx.html +331 -0
  112. package/coverage/lcov-report/Components/Tag/Tag.tsx.html +256 -0
  113. package/coverage/lcov-report/Components/Tag/index.html +131 -0
  114. package/coverage/lcov-report/Components/ToolTip/ToolTip.tsx.html +286 -0
  115. package/coverage/lcov-report/Components/ToolTip/index.html +116 -0
  116. package/coverage/lcov-report/Components/UserDetails/AddUserModal.tsx.html +709 -0
  117. package/coverage/lcov-report/Components/UserDetails/ChangeRoleModal.tsx.html +505 -0
  118. package/coverage/lcov-report/Components/UserDetails/DeactivateConfirmModal.tsx.html +379 -0
  119. package/coverage/lcov-report/Components/UserDetails/UserDetails.tsx.html +1900 -0
  120. package/coverage/lcov-report/Components/UserDetails/index.html +161 -0
  121. package/coverage/lcov-report/EmptyState/EmptyState.tsx.html +466 -0
  122. package/coverage/lcov-report/EmptyState/index.html +116 -0
  123. package/coverage/lcov-report/Hooks/index.html +116 -0
  124. package/coverage/lcov-report/Hooks/usePreferences.ts.html +421 -0
  125. package/coverage/lcov-report/Input/TextInput.tsx.html +487 -0
  126. package/coverage/lcov-report/Input/index.html +131 -0
  127. package/coverage/lcov-report/Input/textInputIconSize.ts.html +205 -0
  128. package/coverage/lcov-report/KanbanBoard.tsx.html +3481 -0
  129. package/coverage/lcov-report/OrganizationDetails/CreateOrgModal.tsx.html +511 -0
  130. package/coverage/lcov-report/OrganizationDetails/DeleteOrgModal.tsx.html +334 -0
  131. package/coverage/lcov-report/OrganizationDetails/OrganizationDetails.tsx.html +1519 -0
  132. package/coverage/lcov-report/OrganizationDetails/index.html +146 -0
  133. package/coverage/lcov-report/RolesPermission/DeleteRoleModal.tsx.html +328 -0
  134. package/coverage/lcov-report/RolesPermission/RolesPermission.tsx.html +1732 -0
  135. package/coverage/lcov-report/RolesPermission/index.html +116 -0
  136. package/coverage/lcov-report/SearchSelect/SearchSelect.tsx.html +2575 -0
  137. package/coverage/lcov-report/SearchSelect/SelectTruncatedLabel.tsx.html +202 -0
  138. package/coverage/lcov-report/SearchSelect/index.html +146 -0
  139. package/coverage/lcov-report/SearchSelect/searchSelectSize.ts.html +496 -0
  140. package/coverage/lcov-report/Table/CompactSelect.tsx.html +379 -0
  141. package/coverage/lcov-report/Table/Components/ActiveFilters.tsx.html +514 -0
  142. package/coverage/lcov-report/Table/Components/HeaderActions.tsx.html +373 -0
  143. package/coverage/lcov-report/Table/Components/Pagination.tsx.html +574 -0
  144. package/coverage/lcov-report/Table/Components/TableActions.tsx.html +574 -0
  145. package/coverage/lcov-report/Table/Components/TableBody.tsx.html +1027 -0
  146. package/coverage/lcov-report/Table/Components/TableFilters.tsx.html +397 -0
  147. package/coverage/lcov-report/Table/Components/TableHeader.tsx.html +1060 -0
  148. package/coverage/lcov-report/Table/Components/TableLoading.tsx.html +361 -0
  149. package/coverage/lcov-report/Table/Components/TableSearch.tsx.html +337 -0
  150. package/coverage/lcov-report/Table/Components/index.html +266 -0
  151. package/coverage/lcov-report/Table/Components/useDebounce.ts.html +178 -0
  152. package/coverage/lcov-report/Table/Components/useTable.ts.html +778 -0
  153. package/coverage/lcov-report/Table/LeftFilterPane.tsx.html +1810 -0
  154. package/coverage/lcov-report/Table/SelectOperationControls.tsx.html +178 -0
  155. package/coverage/lcov-report/Table/Table.tsx.html +1567 -0
  156. package/coverage/lcov-report/Table/TableProps.tsx.html +658 -0
  157. package/coverage/lcov-report/Table/TableSettings/ManageColumns.tsx.html +619 -0
  158. package/coverage/lcov-report/Table/TableSettings/TableFilters.tsx.html +229 -0
  159. package/coverage/lcov-report/Table/TableSettings/TableSettings.tsx.html +532 -0
  160. package/coverage/lcov-report/Table/TableSettings/index.html +146 -0
  161. package/coverage/lcov-report/Table/TableToDo.tsx.html +973 -0
  162. package/coverage/lcov-report/Table/TextOperationControls.tsx.html +271 -0
  163. package/coverage/lcov-report/Table/filterTypes.ts.html +97 -0
  164. package/coverage/lcov-report/Table/index.html +176 -0
  165. package/coverage/lcov-report/Table/settings/ManageColumns.tsx.html +856 -0
  166. package/coverage/lcov-report/Table/settings/index.html +116 -0
  167. package/coverage/lcov-report/Tag/Tag.tsx.html +256 -0
  168. package/coverage/lcov-report/Tag/index.html +116 -0
  169. package/coverage/lcov-report/Theme/buildBrandTokens.ts.html +175 -0
  170. package/coverage/lcov-report/Theme/chartColorsFromTheme.ts.html +214 -0
  171. package/coverage/lcov-report/Theme/index.html +131 -0
  172. package/coverage/lcov-report/Theme/useCustomTheme.ts.html +100 -0
  173. package/coverage/lcov-report/ToolTip/ToolTip.tsx.html +286 -0
  174. package/coverage/lcov-report/ToolTip/index.html +116 -0
  175. package/coverage/lcov-report/UserDetails/AddUserModal.tsx.html +709 -0
  176. package/coverage/lcov-report/UserDetails/ChangeRoleModal.tsx.html +505 -0
  177. package/coverage/lcov-report/UserDetails/index.html +116 -0
  178. package/coverage/lcov-report/Utils/functions.ts.html +106 -0
  179. package/coverage/lcov-report/Utils/index.html +116 -0
  180. package/coverage/lcov-report/Utils/table.ts.html +1189 -0
  181. package/coverage/lcov-report/base.css +224 -0
  182. package/coverage/lcov-report/block-navigation.js +87 -0
  183. package/coverage/lcov-report/favicon.png +0 -0
  184. package/coverage/lcov-report/index.html +251 -0
  185. package/coverage/lcov-report/prettify.css +1 -0
  186. package/coverage/lcov-report/prettify.js +2 -0
  187. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  188. package/coverage/lcov-report/sorter.js +210 -0
  189. package/coverage/lcov.info +981 -0
  190. package/dist/App.d.ts.map +1 -1
  191. package/dist/Assets/defaultLogo.tsx +30 -0
  192. package/dist/Components/Accordion/Accordion.d.ts.map +1 -1
  193. package/dist/Components/Accordion/Accordion.js +15 -12
  194. package/dist/Components/Accordion/accordionColors.d.ts +6 -0
  195. package/dist/Components/Accordion/accordionColors.d.ts.map +1 -0
  196. package/dist/Components/Accordion/accordionColors.js +20 -0
  197. package/dist/Components/AlertDialog/AlertDialog.d.ts.map +1 -1
  198. package/dist/Components/AlertDialog/AlertDialog.js +4 -1
  199. package/dist/Components/Apexcharts/ApexBarChart/ApexBarChart.d.ts.map +1 -1
  200. package/dist/Components/Apexcharts/ApexBarChart/ApexBarChart.js +5 -1
  201. package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.d.ts.map +1 -1
  202. package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.js +6 -4
  203. package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.d.ts.map +1 -1
  204. package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.js +5 -1
  205. package/dist/Components/Apexcharts/ApexPolarCharts/ApexPolarCharts.d.ts.map +1 -1
  206. package/dist/Components/Apexcharts/ApexPolarCharts/ApexPolarCharts.js +5 -1
  207. package/dist/Components/Button/Button.styles.d.ts.map +1 -1
  208. package/dist/Components/Button/Button.styles.js +100 -47
  209. package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.d.ts.map +1 -1
  210. package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +11 -3
  211. package/dist/Components/Card/PaymentCard/PaymentCard.d.ts.map +1 -1
  212. package/dist/Components/Card/PaymentCard/PaymentCard.js +17 -12
  213. package/dist/Components/Checkbox/Checkbox.d.ts.map +1 -1
  214. package/dist/Components/Checkbox/Checkbox.js +2 -1
  215. package/dist/Components/Common/ErrorComponent.d.ts.map +1 -1
  216. package/dist/Components/Common/ErrorComponent.js +7 -3
  217. package/dist/Components/Common/ErrorMessage.d.ts.map +1 -1
  218. package/dist/Components/Common/ErrorMessage.js +7 -1
  219. package/dist/Components/Common/FormLabel.d.ts.map +1 -1
  220. package/dist/Components/Common/FormLabel.js +7 -1
  221. package/dist/Components/Common/Label.d.ts.map +1 -1
  222. package/dist/Components/Common/Label.js +4 -2
  223. package/dist/Components/Common/fieldStyles.d.ts.map +1 -1
  224. package/dist/Components/Common/fieldStyles.js +3 -1
  225. package/dist/Components/CopyButton/CopyButton.d.ts.map +1 -1
  226. package/dist/Components/CopyButton/CopyButton.js +14 -6
  227. package/dist/Components/CustomModulesTable/CustomModulesTable.d.ts.map +1 -1
  228. package/dist/Components/CustomModulesTable/CustomModulesTable.js +9 -6
  229. package/dist/Components/CustomModulesTable/DeleteModuleModal.d.ts.map +1 -1
  230. package/dist/Components/CustomModulesTable/DeleteModuleModal.js +2 -2
  231. package/dist/Components/CustomModulesTable/EditModuleModal.d.ts.map +1 -1
  232. package/dist/Components/CustomModulesTable/EditModuleModal.js +2 -2
  233. package/dist/Components/DatePicker/CalendarPanel.js +1 -1
  234. package/dist/Components/DatePicker/DatePicker.js +1 -1
  235. package/dist/Components/DatePicker/RangeDatePicker.d.ts.map +1 -1
  236. package/dist/Components/DatePicker/RangeDatePicker.js +1 -1
  237. package/dist/Components/DatePicker/SingleDatePicker.d.ts.map +1 -1
  238. package/dist/Components/DatePicker/SingleDatePicker.js +1 -1
  239. package/dist/Components/DatePicker/TimeOnlyPicker.d.ts.map +1 -1
  240. package/dist/Components/DatePicker/TimeOnlyPicker.js +3 -1
  241. package/dist/Components/Drawer/Drawer.d.ts.map +1 -1
  242. package/dist/Components/Drawer/Drawer.js +4 -1
  243. package/dist/Components/Dropdown/DropDown.js +5 -5
  244. package/dist/Components/Editor/Editor.d.ts.map +1 -1
  245. package/dist/Components/Editor/Editor.js +32 -2
  246. package/dist/Components/Editor/joditThemeVars.d.ts +21 -0
  247. package/dist/Components/Editor/joditThemeVars.d.ts.map +1 -0
  248. package/dist/Components/Editor/joditThemeVars.js +70 -0
  249. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.d.ts.map +1 -1
  250. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +5 -1
  251. package/dist/Components/EmptyState/EmptyState.js +3 -3
  252. package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts.map +1 -1
  253. package/dist/Components/FieldSelectModal/FieldSelectModal.js +4 -2
  254. package/dist/Components/FilePreview/FilePreview.d.ts.map +1 -1
  255. package/dist/Components/FilePreview/FilePreview.js +7 -1
  256. package/dist/Components/FileUpload/FileUpload.js +4 -4
  257. package/dist/Components/FileUploader/FileUploader.d.ts.map +1 -1
  258. package/dist/Components/FileUploader/FileUploader.js +7 -2
  259. package/dist/Components/FilterSidebar/FilterSidebar.d.ts.map +1 -1
  260. package/dist/Components/FilterSidebar/FilterSidebar.js +166 -142
  261. package/dist/Components/FilterSidebar/filterHoverStyle.d.ts +12 -0
  262. package/dist/Components/FilterSidebar/filterHoverStyle.d.ts.map +1 -0
  263. package/dist/Components/FilterSidebar/filterHoverStyle.js +14 -0
  264. package/dist/Components/Form/FormWrapper.js +2 -2
  265. package/dist/Components/Header/Header.d.ts +17 -0
  266. package/dist/Components/Header/Header.d.ts.map +1 -1
  267. package/dist/Components/Header/Header.js +34 -6
  268. package/dist/Components/Header/HeaderActions.d.ts.map +1 -1
  269. package/dist/Components/Header/HeaderActions.js +3 -2
  270. package/dist/Components/Header/components/desktopMenu.d.ts.map +1 -1
  271. package/dist/Components/Header/components/desktopMenu.js +21 -5
  272. package/dist/Components/Input/Input/Input.d.ts.map +1 -1
  273. package/dist/Components/Input/Input/Input.js +6 -2
  274. package/dist/Components/Input/Switch/InputSwitch.d.ts.map +1 -1
  275. package/dist/Components/Input/Switch/InputSwitch.js +4 -2
  276. package/dist/Components/Input/TextInput.styles.d.ts.map +1 -1
  277. package/dist/Components/Input/TextInput.styles.js +6 -1
  278. package/dist/Components/InputTextArea/InputTextArea.style.d.ts.map +1 -1
  279. package/dist/Components/InputTextArea/InputTextArea.style.js +4 -1
  280. package/dist/Components/KanbanBoard/AccountCard.js +4 -4
  281. package/dist/Components/LazyWrapper/LazyWrapper.js +1 -2
  282. package/dist/Components/Modal/Modal.d.ts.map +1 -1
  283. package/dist/Components/Modal/Modal.js +4 -1
  284. package/dist/Components/MoreItems/MoreItems.d.ts.map +1 -1
  285. package/dist/Components/MoreItems/MoreItems.js +10 -4
  286. package/dist/Components/MultiSelect/MultiSelect.d.ts.map +1 -1
  287. package/dist/Components/MultiSelect/MultiSelect.js +5 -2
  288. package/dist/Components/NavigationBar/NavigationBar.d.ts.map +1 -1
  289. package/dist/Components/NavigationBar/NavigationBar.js +8 -2
  290. package/dist/Components/NoteTextArea/NoteTextArea.d.ts.map +1 -1
  291. package/dist/Components/NoteTextArea/NoteTextArea.js +5 -2
  292. package/dist/Components/Notification/Notification.d.ts.map +1 -1
  293. package/dist/Components/Notification/Notification.js +9 -5
  294. package/dist/Components/NumberInput/NumberInput.styles.d.ts.map +1 -1
  295. package/dist/Components/NumberInput/NumberInput.styles.js +4 -1
  296. package/dist/Components/OrgSwitcher/OrgSwitcher.d.ts.map +1 -1
  297. package/dist/Components/OrgSwitcher/OrgSwitcher.js +14 -7
  298. package/dist/Components/OrganizationDetails/CreateOrgModal.d.ts.map +1 -1
  299. package/dist/Components/OrganizationDetails/CreateOrgModal.js +1 -1
  300. package/dist/Components/OrganizationDetails/DeleteOrgModal.js +2 -2
  301. package/dist/Components/OrganizationDetails/OrganizationDetails.js +11 -11
  302. package/dist/Components/PdfViewer/PdfViewer.js +1 -2
  303. package/dist/Components/PinInput/PinInput.d.ts.map +1 -1
  304. package/dist/Components/PinInput/PinInput.js +5 -1
  305. package/dist/Components/PinInputs/PinInputs.d.ts.map +1 -1
  306. package/dist/Components/PinInputs/PinInputs.js +3 -1
  307. package/dist/Components/ProductCard/ProductCard.js +1 -1
  308. package/dist/Components/ProductCard/ProductPrice.d.ts.map +1 -1
  309. package/dist/Components/ProductCard/ProductPrice.js +7 -4
  310. package/dist/Components/ProductCard/ProductReview.d.ts.map +1 -1
  311. package/dist/Components/ProductCard/ProductReview.js +7 -3
  312. package/dist/Components/ProductCard/ProductTags.js +1 -1
  313. package/dist/Components/ProductDetails/ProductDtlPrice.d.ts.map +1 -1
  314. package/dist/Components/ProductDetails/ProductDtlPrice.js +4 -1
  315. package/dist/Components/ProductDetails/ProductImageSlider.js +4 -4
  316. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.d.ts.map +1 -1
  317. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +10 -7
  318. package/dist/Components/Reorder/Reorder.js +2 -1
  319. package/dist/Components/RolesPermission/DeleteRoleModal.d.ts.map +1 -1
  320. package/dist/Components/RolesPermission/DeleteRoleModal.js +4 -2
  321. package/dist/Components/RolesPermission/RolesPermission.js +6 -6
  322. package/dist/Components/SearchSelect/SearchSelect.d.ts.map +1 -1
  323. package/dist/Components/SearchSelect/SearchSelect.js +4 -4
  324. package/dist/Components/Select/Select.styles.d.ts.map +1 -1
  325. package/dist/Components/Select/Select.styles.js +4 -1
  326. package/dist/Components/SelectSearch/SelectSearch.d.ts.map +1 -1
  327. package/dist/Components/SelectSearch/SelectSearch.js +5 -3
  328. package/dist/Components/SideBar/SecondaryBar.d.ts.map +1 -1
  329. package/dist/Components/SideBar/SecondaryBar.js +14 -3
  330. package/dist/Components/SideBar/SideBar.d.ts.map +1 -1
  331. package/dist/Components/SideBar/SideBar.js +18 -4
  332. package/dist/Components/SideBar/components/MenuItemBox.d.ts.map +1 -1
  333. package/dist/Components/SideBar/components/MenuItemBox.js +13 -9
  334. package/dist/Components/SideBar/components/MenuPopoverContent.d.ts.map +1 -1
  335. package/dist/Components/SideBar/components/MenuPopoverContent.js +7 -2
  336. package/dist/Components/SideBar/sidebarAccentColors.d.ts +21 -0
  337. package/dist/Components/SideBar/sidebarAccentColors.d.ts.map +1 -0
  338. package/dist/Components/SideBar/sidebarAccentColors.js +36 -0
  339. package/dist/Components/SignInActivityTable/SignInActivityTable.d.ts.map +1 -1
  340. package/dist/Components/SignInActivityTable/SignInActivityTable.js +7 -6
  341. package/dist/Components/StageProgress/StageProgress.d.ts.map +1 -1
  342. package/dist/Components/StageProgress/StageProgress.js +9 -4
  343. package/dist/Components/StageProgress/StageProgressProps.d.ts.map +1 -1
  344. package/dist/Components/StageProgress/StageProgressProps.js +13 -4
  345. package/dist/Components/StageProgress/StepperStage.js +1 -1
  346. package/dist/Components/Switch/Switch.d.ts.map +1 -1
  347. package/dist/Components/Switch/Switch.js +5 -3
  348. package/dist/Components/Table/Table.d.ts.map +1 -1
  349. package/dist/Components/Table/Table.js +9 -9
  350. package/dist/Components/Table/TableProps.d.ts +1 -0
  351. package/dist/Components/Table/TableProps.d.ts.map +1 -1
  352. package/dist/Components/Table/components/HeaderActions.d.ts.map +1 -1
  353. package/dist/Components/Table/components/HeaderActions.js +2 -1
  354. package/dist/Components/Table/components/TableActions.js +1 -1
  355. package/dist/Components/Table/components/TableBody.d.ts.map +1 -1
  356. package/dist/Components/Table/components/TableBody.js +21 -15
  357. package/dist/Components/Table/components/TableHeader.d.ts.map +1 -1
  358. package/dist/Components/Table/components/TableHeader.js +7 -4
  359. package/dist/Components/Table/components/tableRowHoverStyle.d.ts +13 -0
  360. package/dist/Components/Table/components/tableRowHoverStyle.d.ts.map +1 -0
  361. package/dist/Components/Table/components/tableRowHoverStyle.js +26 -0
  362. package/dist/Components/Table/filters/CompactSelect.d.ts.map +1 -1
  363. package/dist/Components/Table/filters/CompactSelect.js +4 -1
  364. package/dist/Components/Table/filters/LeftFilterPane.d.ts.map +1 -1
  365. package/dist/Components/Table/filters/LeftFilterPane.js +5 -4
  366. package/dist/Components/Tag/Tag.styles.d.ts.map +1 -1
  367. package/dist/Components/Tag/Tag.styles.js +21 -8
  368. package/dist/Components/Timeline/Timeline.d.ts.map +1 -1
  369. package/dist/Components/Timeline/Timeline.js +18 -17
  370. package/dist/Components/Toaster/Toaster.d.ts.map +1 -1
  371. package/dist/Components/Toaster/Toaster.js +8 -5
  372. package/dist/Components/Toggle/TableToggle.js +2 -2
  373. package/dist/Components/ToolTip/ToolTip.d.ts.map +1 -1
  374. package/dist/Components/ToolTip/ToolTip.js +14 -2
  375. package/dist/Components/Trail/EditableCell.js +1 -1
  376. package/dist/Components/UpgradeButton/UpgradeButton.d.ts.map +1 -1
  377. package/dist/Components/UpgradeButton/UpgradeButton.js +9 -4
  378. package/dist/Components/UserDetails/AddUserModal.d.ts.map +1 -1
  379. package/dist/Components/UserDetails/AddUserModal.js +1 -1
  380. package/dist/Components/UserDetails/ChangeRoleModal.js +2 -2
  381. package/dist/Components/UserDetails/DeactivateConfirmModal.d.ts.map +1 -1
  382. package/dist/Components/UserDetails/DeactivateConfirmModal.js +5 -2
  383. package/dist/Components/UserDetails/UserDetails.d.ts.map +1 -1
  384. package/dist/Components/UserDetails/UserDetails.js +15 -8
  385. package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.d.ts.map +1 -1
  386. package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.js +3 -1
  387. package/dist/Components/WorkspaceWindow/WorkspaceWindow.d.ts.map +1 -1
  388. package/dist/Components/WorkspaceWindow/WorkspaceWindow.js +5 -1
  389. package/dist/Theme/chakra/common.web.d.ts +171 -0
  390. package/dist/Theme/chakra/common.web.d.ts.map +1 -0
  391. package/dist/Theme/chakra/common.web.js +21 -0
  392. package/dist/Theme/chakra/componentStyles.d.ts +13 -0
  393. package/dist/Theme/chakra/componentStyles.d.ts.map +1 -0
  394. package/dist/Theme/chakra/componentStyles.js +88 -0
  395. package/dist/Theme/chakra/createBrandTheme.d.ts +18 -0
  396. package/dist/Theme/chakra/createBrandTheme.d.ts.map +1 -0
  397. package/dist/Theme/chakra/createBrandTheme.js +78 -0
  398. package/dist/Theme/chakra/fonts.web.d.ts +42 -0
  399. package/dist/Theme/chakra/fonts.web.d.ts.map +1 -0
  400. package/dist/Theme/chakra/fonts.web.js +15 -0
  401. package/dist/Theme/index.d.ts +29 -8
  402. package/dist/Theme/index.d.ts.map +1 -1
  403. package/dist/Theme/index.js +54 -22
  404. package/dist/Theme/provider/PixelizeThemeProvider.d.ts +36 -0
  405. package/dist/Theme/provider/PixelizeThemeProvider.d.ts.map +1 -0
  406. package/dist/Theme/provider/PixelizeThemeProvider.js +91 -0
  407. package/dist/Theme/provider/ThemeSwitcher.d.ts +8 -0
  408. package/dist/Theme/provider/ThemeSwitcher.d.ts.map +1 -0
  409. package/dist/Theme/provider/ThemeSwitcher.js +99 -0
  410. package/dist/Theme/provider/colorModeStorage.d.ts +10 -0
  411. package/dist/Theme/provider/colorModeStorage.d.ts.map +1 -0
  412. package/dist/Theme/provider/colorModeStorage.js +106 -0
  413. package/dist/Theme/provider/index.d.ts +6 -0
  414. package/dist/Theme/provider/index.d.ts.map +1 -0
  415. package/dist/Theme/provider/index.js +9 -0
  416. package/dist/Theme/provider/useThemeMode.d.ts +3 -0
  417. package/dist/Theme/provider/useThemeMode.d.ts.map +1 -0
  418. package/dist/Theme/provider/useThemeMode.js +13 -0
  419. package/dist/Theme/themeProps.d.ts +10 -373
  420. package/dist/Theme/themeProps.d.ts.map +1 -1
  421. package/dist/Theme/tokens/brands/emerald/palette.dark.d.ts +7 -0
  422. package/dist/Theme/tokens/brands/emerald/palette.dark.d.ts.map +1 -0
  423. package/dist/Theme/tokens/brands/emerald/palette.dark.js +13 -0
  424. package/dist/Theme/tokens/brands/emerald/palette.light.d.ts +375 -0
  425. package/dist/Theme/tokens/brands/emerald/palette.light.d.ts.map +1 -0
  426. package/dist/Theme/tokens/brands/emerald/palette.light.js +135 -0
  427. package/dist/Theme/tokens/brands/index.d.ts +28 -0
  428. package/dist/Theme/tokens/brands/index.d.ts.map +1 -0
  429. package/dist/Theme/tokens/brands/index.js +93 -0
  430. package/dist/Theme/tokens/brands/lavender/palette.dark.d.ts +7 -0
  431. package/dist/Theme/tokens/brands/lavender/palette.dark.d.ts.map +1 -0
  432. package/dist/Theme/tokens/brands/lavender/palette.dark.js +13 -0
  433. package/dist/Theme/tokens/brands/lavender/palette.light.d.ts +375 -0
  434. package/dist/Theme/tokens/brands/lavender/palette.light.d.ts.map +1 -0
  435. package/dist/Theme/tokens/brands/lavender/palette.light.js +316 -0
  436. package/dist/Theme/tokens/brands/meadow/palette.dark.d.ts +7 -0
  437. package/dist/Theme/tokens/brands/meadow/palette.dark.d.ts.map +1 -0
  438. package/dist/Theme/tokens/brands/meadow/palette.dark.js +13 -0
  439. package/dist/Theme/tokens/brands/meadow/palette.light.d.ts +375 -0
  440. package/dist/Theme/tokens/brands/meadow/palette.light.d.ts.map +1 -0
  441. package/dist/Theme/tokens/brands/meadow/palette.light.js +133 -0
  442. package/dist/Theme/tokens/brands/radiant/palette.dark.d.ts +7 -0
  443. package/dist/Theme/tokens/brands/radiant/palette.dark.d.ts.map +1 -0
  444. package/dist/Theme/tokens/brands/radiant/palette.dark.js +13 -0
  445. package/dist/Theme/tokens/brands/radiant/palette.light.d.ts +375 -0
  446. package/dist/Theme/tokens/brands/radiant/palette.light.d.ts.map +1 -0
  447. package/dist/Theme/tokens/brands/radiant/palette.light.js +135 -0
  448. package/dist/Theme/tokens/brands/rosewood/palette.dark.d.ts +7 -0
  449. package/dist/Theme/tokens/brands/rosewood/palette.dark.d.ts.map +1 -0
  450. package/dist/Theme/tokens/brands/rosewood/palette.dark.js +13 -0
  451. package/dist/Theme/tokens/brands/rosewood/palette.light.d.ts +375 -0
  452. package/dist/Theme/tokens/brands/rosewood/palette.light.d.ts.map +1 -0
  453. package/dist/Theme/tokens/brands/rosewood/palette.light.js +139 -0
  454. package/dist/Theme/tokens/brands/skyline/palette.dark.d.ts +7 -0
  455. package/dist/Theme/tokens/brands/skyline/palette.dark.d.ts.map +1 -0
  456. package/dist/Theme/tokens/brands/skyline/palette.dark.js +13 -0
  457. package/dist/Theme/tokens/brands/skyline/palette.light.d.ts +375 -0
  458. package/dist/Theme/tokens/brands/skyline/palette.light.d.ts.map +1 -0
  459. package/dist/Theme/tokens/brands/skyline/palette.light.js +133 -0
  460. package/dist/Theme/tokens/brands/slate/palette.dark.d.ts +7 -0
  461. package/dist/Theme/tokens/brands/slate/palette.dark.d.ts.map +1 -0
  462. package/dist/Theme/tokens/brands/slate/palette.dark.js +13 -0
  463. package/dist/Theme/tokens/brands/slate/palette.light.d.ts +375 -0
  464. package/dist/Theme/tokens/brands/slate/palette.light.d.ts.map +1 -0
  465. package/dist/Theme/tokens/brands/slate/palette.light.js +137 -0
  466. package/dist/Theme/tokens/brands/storefront/palette.dark.d.ts +7 -0
  467. package/dist/Theme/tokens/brands/storefront/palette.dark.d.ts.map +1 -0
  468. package/dist/Theme/tokens/brands/storefront/palette.dark.js +13 -0
  469. package/dist/Theme/tokens/brands/storefront/palette.light.d.ts +375 -0
  470. package/dist/Theme/tokens/brands/storefront/palette.light.d.ts.map +1 -0
  471. package/dist/Theme/tokens/brands/storefront/palette.light.js +127 -0
  472. package/dist/Theme/tokens/brands/zinc/palette.dark.d.ts +204 -0
  473. package/dist/Theme/tokens/brands/zinc/palette.dark.d.ts.map +1 -0
  474. package/dist/Theme/tokens/brands/zinc/palette.dark.js +204 -0
  475. package/dist/Theme/tokens/brands/zinc/palette.light.d.ts +375 -0
  476. package/dist/Theme/tokens/brands/zinc/palette.light.d.ts.map +1 -0
  477. package/dist/Theme/tokens/brands/zinc/palette.light.js +383 -0
  478. package/dist/Theme/tokens/builders/accentText.d.ts +56 -0
  479. package/dist/Theme/tokens/builders/accentText.d.ts.map +1 -0
  480. package/dist/Theme/tokens/builders/accentText.js +92 -0
  481. package/dist/Theme/tokens/builders/buildBrandTokens.d.ts +16 -0
  482. package/dist/Theme/tokens/builders/buildBrandTokens.d.ts.map +1 -0
  483. package/dist/Theme/tokens/builders/buildBrandTokens.js +33 -0
  484. package/dist/Theme/tokens/builders/buildDarkPalette.d.ts +23 -0
  485. package/dist/Theme/tokens/builders/buildDarkPalette.d.ts.map +1 -0
  486. package/dist/Theme/tokens/builders/buildDarkPalette.js +282 -0
  487. package/dist/Theme/tokens/builders/chartColorsFromTheme.d.ts +17 -0
  488. package/dist/Theme/tokens/builders/chartColorsFromTheme.d.ts.map +1 -0
  489. package/dist/Theme/tokens/builders/chartColorsFromTheme.js +26 -0
  490. package/dist/Theme/tokens/builders/color.d.ts +50 -0
  491. package/dist/Theme/tokens/builders/color.d.ts.map +1 -0
  492. package/dist/Theme/tokens/builders/color.js +156 -0
  493. package/dist/Theme/tokens/builders/index.d.ts +6 -0
  494. package/dist/Theme/tokens/builders/index.d.ts.map +1 -0
  495. package/dist/Theme/tokens/builders/index.js +21 -0
  496. package/dist/Theme/tokens/index.d.ts +15 -0
  497. package/dist/Theme/tokens/index.d.ts.map +1 -0
  498. package/dist/Theme/tokens/index.js +30 -0
  499. package/dist/Theme/tokens/primitives/breakpoints.d.ts +9 -0
  500. package/dist/Theme/tokens/primitives/breakpoints.d.ts.map +1 -0
  501. package/dist/Theme/tokens/primitives/breakpoints.js +10 -0
  502. package/dist/Theme/tokens/primitives/index.d.ts +10 -0
  503. package/dist/Theme/tokens/primitives/index.d.ts.map +1 -0
  504. package/dist/Theme/tokens/primitives/index.js +27 -0
  505. package/dist/Theme/tokens/primitives/letterSpacings.d.ts +10 -0
  506. package/dist/Theme/tokens/primitives/letterSpacings.d.ts.map +1 -0
  507. package/dist/Theme/tokens/primitives/letterSpacings.js +11 -0
  508. package/dist/Theme/tokens/primitives/lineHeights.d.ts +19 -0
  509. package/dist/Theme/tokens/primitives/lineHeights.d.ts.map +1 -0
  510. package/dist/Theme/tokens/primitives/lineHeights.js +20 -0
  511. package/dist/Theme/tokens/primitives/radii.d.ts +13 -0
  512. package/dist/Theme/tokens/primitives/radii.d.ts.map +1 -0
  513. package/dist/Theme/tokens/primitives/radii.js +14 -0
  514. package/dist/Theme/tokens/primitives/shadows.d.ts +16 -0
  515. package/dist/Theme/tokens/primitives/shadows.d.ts.map +1 -0
  516. package/dist/Theme/tokens/primitives/shadows.js +17 -0
  517. package/dist/Theme/tokens/primitives/sizes.d.ts +63 -0
  518. package/dist/Theme/tokens/primitives/sizes.d.ts.map +1 -0
  519. package/dist/Theme/tokens/primitives/sizes.js +39 -0
  520. package/dist/Theme/tokens/primitives/space.d.ts +34 -0
  521. package/dist/Theme/tokens/primitives/space.d.ts.map +1 -0
  522. package/dist/Theme/tokens/primitives/space.js +35 -0
  523. package/dist/Theme/tokens/primitives/typography.d.ts +73 -0
  524. package/dist/Theme/tokens/primitives/typography.d.ts.map +1 -0
  525. package/dist/Theme/tokens/primitives/typography.js +43 -0
  526. package/dist/Theme/tokens/primitives/zIndices.d.ts +17 -0
  527. package/dist/Theme/tokens/primitives/zIndices.d.ts.map +1 -0
  528. package/dist/Theme/tokens/primitives/zIndices.js +18 -0
  529. package/dist/Theme/tokens/types.d.ts +116 -0
  530. package/dist/Theme/tokens/types.d.ts.map +1 -0
  531. package/dist/Theme/tokens/types.js +8 -0
  532. package/dist/Utils/table.d.ts +9 -2
  533. package/dist/Utils/table.d.ts.map +1 -1
  534. package/dist/Utils/table.js +23 -7
  535. package/dist/index.d.ts +10 -0
  536. package/dist/index.d.ts.map +1 -1
  537. package/dist/index.js +52 -1
  538. package/eslint.config.js +48 -0
  539. package/index.html +13 -0
  540. package/package.json +1 -5
  541. package/vite.config.ts +13 -0
@@ -0,0 +1,28 @@
1
+ # Playground
2
+
3
+ ## Purpose
4
+
5
+ Vite dev playground — demo pages not published to npm.
6
+
7
+ ## Key paths
8
+
9
+ - `src/Pages/` (49 demo files), `src/App.tsx`, `src/Layout.tsx`
10
+ - `npm start` launches playground
11
+
12
+ ## Key rules
13
+
14
+ - Demo API calls to dev.pixelizetech.com are playground-only
15
+ - Not included in `dist/` publish output
16
+
17
+ ## Recent changes (WCAG contrast + dark-mode pass)
18
+
19
+ - `stageProgress.tsx`, `tier1.tsx`, `upgradeButton.tsx`, `orgSwitcher.tsx`: local `Section` demo
20
+ wrapper switched from hardcoded `bg="white"` / `border="1px solid #E2E8F0"` / `color="gray.700"`
21
+ to `useCustomTheme()` tokens (`background[50]` / `boxborder[300]` / `text[900]`) — previously
22
+ stayed white regardless of the active theme.
23
+ - `stageProgress.tsx` (4 captions) and `tier1.tsx` (1 caption): `color="gray.400"` →
24
+ `theme.colors.gray[500]`, the library's verified muted-text token (`gray.400` fails contrast in
25
+ dark mode).
26
+ - `card.tsx`: swapped the raw Chakra `Button` (`color="blue"`) for the library's own `Button`
27
+ (`colorScheme="primary"`) — a component-choice fix, not a Section/caption token pass.
28
+ - Demo-only — no `src/index.ts` export or library API changed.
@@ -0,0 +1,78 @@
1
+ # Table
2
+
3
+ ## Purpose
4
+
5
+ Data table with virtualization, filters, pagination, column management.
6
+
7
+ ## Key paths
8
+
9
+ - `src/Components/Table/`, `Table/components/`, `Table/settings/`, `Table/filters/`, `Table/hooks/`
10
+ - Tests: `components/TableBody.virtualize.test.tsx`, `settings/ManageColumns.test.tsx`
11
+
12
+ ## Key rules
13
+
14
+ - Core CRM list UI — high change frequency
15
+ - `src/Utils/table.ts` helpers
16
+
17
+ ## Dark mode
18
+
19
+ Surfaces read `theme.colors.background[50]` via `useCustomTheme()`, so the table follows the
20
+ active palette: `Table` (pagination popover), `TableBody` (expanded-row panel), `CompactSelect`
21
+ (trigger), `LeftFilterPane` (pane + apply/clear footer).
22
+
23
+ - **`white` is a foreground token, not a surface.** It stays `#fff` in dark, so `bg="white"` /
24
+ `bg={theme.colors.white}` renders a white slab on the dark canvas — that was the defect this
25
+ migration fixed. Use `background[50]` (`#ffffff` light, dark-aware) for any surface.
26
+ `color="white"` on the filter-count badge is correct — it is a label on `primary[500]`.
27
+ - Chakra scale literals (`borderColor="gray.200"`, `_hover={{ bg: "gray.50" }}`) are **already
28
+ dark-aware** — `createBrandTheme` passes `colors: palette`, so they resolve against the
29
+ swapped palette. Only for scales the palette defines: `whiteAlpha`/`blackAlpha` are not in it,
30
+ so they keep Chakra's fixed rgba — `TableGroupRow`'s `_hover={{ bg: "whiteAlpha.500" }}` is
31
+ still a white wash in dark.
32
+ - `LeftFilterPane` takes `theme` as a **prop** (from `Table`), not from the hook — pass it down.
33
+
34
+ ## WCAG contrast pass (this session)
35
+
36
+ - `HeaderActions` action-list ink and `TableHeader`'s sort-chevron hover ink + column-header ink
37
+ now use `accentTextOnCanvas(secondary, canvas)` (from `Theme/tokens/builders/accentText`)
38
+ instead of a bare `colors.secondary?.[500]` — picks a text color that clears AA against the
39
+ actual canvas instead of assuming secondary-on-white always passes. Relies on the shared
40
+ `accentText.ts` guard (theme module) to stay crash-safe when `secondary`/canvas are undefined.
41
+ - `TableBody`'s `StatusCell` ink is no longer hardcoded `white` — it resolves
42
+ `statusColor.onSolid ?? onFilled(statusColor.solid, white, black)` so the label clears AA
43
+ against light and dark status fills alike; falls back for callers whose `statusColor` predates
44
+ `onSolid`.
45
+ - `TableRenderGroup.color` gained an optional `onSolid?: string` (additive, non-breaking).
46
+ - `LeftFilterPane`'s `SectionLabel` tooltip swapped Chakra `Tooltip` → design-library `ToolTip`
47
+ (drops the manual `bg`/`color`/`theme`-prop overrides — `ToolTip` themes itself).
48
+ - **Filter-sidebar `ModalContent` surface bug (QA-caught, blocking):** `Table.tsx`'s mobile
49
+ filter-sidebar modal had no explicit `bg=` on `ModalContent`, hitting the same
50
+ Chakra-hardcoded-`colors.white`-behind-`_dark` bug as `Modal`/`AlertDialog`/`Drawer` (overlays,
51
+ layout-navigation modules). Fixed with `bg={theme.colors?.background?.[50]}`.
52
+ `TableSettings.tsx`'s `MotionModalContent` already had this fix from an earlier pass.
53
+ - **`LeftFilterPane`'s date filter (user-reported, blocking):** `LeftFilterPane.tsx` imports the
54
+ legacy `DatePicker/DatePicker.tsx` directly (not the public `ThemeDatePicker` export) — its
55
+ `PopoverContent` had the identical missing-`bg=` bug, fixed alongside the other three date/time
56
+ pickers (see `inputs-date-file` MODULE.md). It's easy to assume this file is dead because the
57
+ playground's `datePick.tsx` import of it is commented out — it isn't; `LeftFilterPane` is a real
58
+ consumer.
59
+ - **Row hover invisible in dark mode (QA-reported, fixed):** `TableBody`'s per-cell `_hover`
60
+ painted `table.hover[300]`, a token built for a light-mode white canvas — in dark mode that rung
61
+ sits within ~10 lightness points of the near-black canvas (both compressed near L7-15), computing
62
+ to ~1.2:1 contrast (verified numerically), i.e. no visible hover at all. Fixed via a new pure
63
+ helper, `getTableRowHoverStyle(colors, isDark)` (`components/tableRowHoverStyle.ts`, same pattern
64
+ as `Editor/joditThemeVars.ts`): dark mode now fills with `background[900]` (this palette's dark-
65
+ mode "bright highlight" rung, ~9.7-10.7:1 against the canvas across brands) **and** flips `color`
66
+ to `backgroundColor.main`, since the row's resting ink (`text[500]`) is tuned for a near-black
67
+ backdrop and would go illegible against a bright fill — mirrors how Jodit's own dark-mode hover
68
+ rule flips text to its canvas color alongside a brighter fill. Light mode is untouched
69
+ (`table.hover[300]`, same as before). Regression tests: `tableRowHoverStyle.test.ts` (lavender +
70
+ rosewood). Scoped to the per-cell hover mechanism already in place — not restructured to a
71
+ `<Tr>`-level highlight, since that wasn't the reported defect.
72
+ - **Known gap (found by code review, not fixed this pass):** `Table/filters/CompactSelect.tsx`,
73
+ `Table/filters/TableFilters.tsx`, and `Table/components/TableActions.tsx` each render a raw
74
+ Chakra `PopoverContent` with no `bg=` — the identical bug class just fixed in `Table.tsx`'s
75
+ filter-sidebar modal, `FilterSidebar.tsx`'s two price popovers (layout-navigation module), and
76
+ `Modal`/`AlertDialog`/`Drawer` (overlays module). Not in this session's diff and not covered by
77
+ any test, so deliberately deferred rather than expanding this pass's scope — worth a follow-up
78
+ ticket to make the `ModalContent`/`PopoverContent`/`MenuList` sweep exhaustive across the repo.
@@ -0,0 +1,314 @@
1
+ # Theme
2
+
3
+ ## Purpose
4
+
5
+ Nine brand presets (lavender, meadow, radiant, skyline, slate, emerald, rosewood, storefront, zinc),
6
+ each with a **light and dark palette**; `useCustomTheme`, the legacy `withTheme` HOC,
7
+ `PixelizeThemeProvider` + `useThemeMode` + `ThemeSwitcher`, and the pure token layer shared with the
8
+ mobile design library.
9
+
10
+ ## Key paths
11
+
12
+ - `src/Theme/tokens/` — **pure, platform-agnostic** (no Chakra/React/CSS imports)
13
+ - `types.ts` — `PaletteProps`, `ThemeName`, `ColorMode`, `ColorScale`
14
+ - `primitives/` — space, sizes, radii, shadows, typography, breakpoints, zIndices
15
+ - `builders/` — `color.ts` (hex/HSL/WCAG math), `buildDarkPalette.ts`
16
+ - `brands/<brand>/palette.light.ts` + `palette.dark.ts`
17
+ - `src/Theme/chakra/` — **web-only** binding: `createBrandTheme`, `componentStyles`, `fonts.web.ts`
18
+ - `src/Theme/provider/` — `PixelizeThemeProvider`, `useThemeMode`, `ThemeSwitcher`
19
+ - `src/Theme/useCustomTheme.ts` — hook read by ~127 components
20
+ - `src/Theme/index.ts` — `ThemesList` (light) + `brandThemes` (light+dark)
21
+ - `src/withTheme.tsx`
22
+ - Exports: `useCustomTheme`, `ThemesList`, `withTheme`, `PixelizeThemeProvider`, `useThemeMode`,
23
+ `ThemeSwitcher`, `brandThemes`, `lightPalettes`, `darkPalettes`, `palettes`, `themeNames`,
24
+ `buildDarkPalette`
25
+ - Also exported (Wave D follow-up, see below): the WCAG contrast helpers `isDarkCanvas`,
26
+ `onFilled`, `onGradient`, `accentTextOnCanvas`, `pickAccentText`, `AA_NORMAL_TEXT`,
27
+ `DARK_CANVAS_LUMINANCE` (`builders/accentText.ts`) and the pure color-math primitives
28
+ `relativeLuminance`, `contrastRatio`, `hexToRgb`, `hexToRgba`, `compositeOver`, `rgbToHex`,
29
+ `rgbToHsl`, `hslToRgb`, `hexToHsl`, `hslToHex`, `withLightness`, `mix` + types `Rgb`/`Hsl`
30
+ (`builders/color.ts`)
31
+
32
+ ## How dark mode works
33
+
34
+ Dark mode **swaps which palette the theme carries** (`brandThemes[brand][light|dark]`) rather than
35
+ using Chakra `semanticTokens` / `_dark`. This is deliberate: components interpolate **resolved hex**
36
+ from `useCustomTheme()`, and `componentStyles` variants are functions of `({ theme })` — so both
37
+ follow the active palette with **zero per-component edits**.
38
+
39
+ Dark palettes are **derived** from each brand's own light palette by `buildDarkPalette`, so brand hue
40
+ carries through. Structural ramps (background/text/border/…) are rebuilt at explicit lightness
41
+ targets around the brand hue; utility hues are reversed; accents are **adaptively lifted** to
42
+ maximize canvas contrast without ever regressing the white-on-accent label below
43
+ `min(4.5, lightModeContrast)`.
44
+
45
+ ## Key rules
46
+
47
+ - **`tokens/` must never import Chakra, React, or CSS** — it is copy-paste portable to the mobile
48
+ design library. Web-only concerns live in `chakra/`.
49
+ - **Never hardcode a hex in a component** — read from `useCustomTheme()`, or it is stuck in light mode.
50
+ - **`colors.white` is a foreground token** (the label on a filled button) and stays white in dark.
51
+ For a white *surface* use `colors.background[50]` — identical `#ffffff` in light, dark-aware.
52
+ - `withTheme` stays **light-only** so existing consumer apps are visually unchanged; dark is opt-in
53
+ via `PixelizeThemeProvider` (defaults to **`system`**).
54
+ - `src/index.ts` is **append-only** — `src/index.publicApi.test.ts` asserts every previously
55
+ published name still exists (consumer contract guard).
56
+ - Chart colors from theme via `chartColorsFromTheme`.
57
+
58
+ ## Recent changes (WCAG contrast + dark-mode pass)
59
+
60
+ - **Badge** is now themed in `chakra/componentStyles.ts` (no `Components/Badge/` family — style
61
+ config lives here). `solid`/`subtle` variants guard non-hex `colorScheme` swatches (Chakra's
62
+ built-in `blackAlpha`/`whiteAlpha` are `rgba()` strings, not hex — `isHexColor()` falls back to
63
+ `swatch?.[800]` instead of throwing). `subtle` also verifies `contrastRatio(accent, bg) >= 4.5`
64
+ before using the brand-hue accent from `accentTextOnCanvas`, else falls back to `onFilled()`
65
+ (provably-always-AA) — fixes a near-miss (measured 4.42, needs 4.5) on the yellow scale in dark mode.
66
+ - `tokens/builders/accentText.ts`: `pickAccentText`/`accentTextOnCanvas` now take
67
+ `primary: ColorScale | undefined` and return a safe white/black fallback instead of throwing
68
+ when the scale is missing (regression: some call sites had dropped defensive `?.` chaining).
69
+ New `onFilled(fill, white, black)` export — provably clears AA against any fill; used by Badge.
70
+ - 4x `brands/{emerald,meadow,radiant,rosewood}/palette.light.ts`: `gray[500]` (the de-facto
71
+ muted-text token, ~43 call sites) retuned to clear AA (>=4.5) against every `backgroundColor`
72
+ surface actually rendered as a `bg=` today (main/secondary/light/subtle), while staying
73
+ lighter than `gray[600]` (ramp order preserved). See "Known gaps" below for what this did
74
+ **not** cover.
75
+ - `tokens/builders/chartColorsFromTheme.ts`: removed unused `chartTooltipBackground`/
76
+ `chartTooltipForeground` exports (dead code — no callers after `ApexLineChart.tsx` stopped
77
+ using them in this same pass).
78
+
79
+ ## Wave D — WCAG follow-up pass
80
+
81
+ - `gray[500]` retune (same methodology as the four brands above) extended to
82
+ `brands/{lavender,skyline,slate}/palette.light.ts` — these three had the identical unfixed gap
83
+ (lavender failed all 4 `backgroundColor` surfaces at 3.96-4.45; skyline/slate failed
84
+ `secondary`/`subtle`), missed by the earlier pass.
85
+ - **Gradient stop retune (7 brands)** — every brand's `gradient: {from, to}` token had a stop pair
86
+ where neither pure white nor pure black cleared AA at both ends. Darkened the lighter stop per
87
+ brand (user-approved trade-off — this is the only Wave D change that visibly shifts brand
88
+ identity, not just a muted/secondary token) so white gradient-button text clears AA at both ends.
89
+ `accentText.ts` gained `onGradient(from, to, white, black)` — picks `onFilled` against whichever
90
+ stop has the higher `relativeLuminance` (the harder case); safe **once** the gradient's own stops
91
+ are tuned this way, not guaranteed for an arbitrary caller-overridden gradient (see
92
+ `account-management` MODULE.md — `UpgradeButton`'s `gradient` prop).
93
+ - **`error`/`red[500]` AA gap** — architecturally different from `gray[500]`: a saturated red's low
94
+ WCAG luminance weight makes a single-value retune mathematically impossible within the
95
+ `error600` lightness boundary. Fixed instead by routing every hardcoded `red[500]`/`error[500]`
96
+ text call site through `accentTextOnCanvas`, which walks to `error[700]` (clears 5.46-6.21 across
97
+ all 7 brands) automatically. No palette edits needed — `red`/`semantic.error` are identical
98
+ across brands (only `lavender` defines them; others inherit via spread).
99
+ - **`pickAccentText` hardened against a partial `ColorScale`** — the rung-walk in
100
+ `accentText.ts` previously assumed every caller supplies all of rungs 500-900 and crashed
101
+ (`hexToRgb(undefined)`) on a sparse scale (a real risk for any consumer with a hand-built or
102
+ test-mock theme, not just this repo's own tests). Now treats a missing rung as "doesn't clear
103
+ AA" and keeps walking; falls back to the nearest defined rung, then to safe white/black if the
104
+ scale is empty.
105
+
106
+ ## Wave D — QA-driven follow-up (user ran a Chrome-extension-based contrast/AA pass against the live playground)
107
+
108
+ - **Margin-safety correction on the 7-brand gradient retune above.** Direct re-measurement found
109
+ every brand's darkened stop cleared AA by **less than 0.02** (e.g. 4.502 vs the 4.5 cutoff) —
110
+ too thin to trust against rounding/rendering variance, and a systemic gap across all 7 brands'
111
+ first-pass tuning (the search stopped the instant AA was crossed, with no margin built in).
112
+ Rebuilt every brand's thin-margin stop(s) with a **safe ≥4.6 target** instead of the bare 4.5
113
+ cutoff, using the same HSL-preserving-hue/saturation darkening search. Final margins verified
114
+ live via Playwright: 4.581–4.834 across all 7 brands. Established going forward: **a contrast
115
+ value that clears AA by <0.02 should be treated as failing**, not passing.
116
+ - **`Modal`/`AlertDialog`/`Drawer` dark-mode surface bug** — see overlays / layout-navigation
117
+ MODULE.md. Root cause: these hardcode Chakra's literal `colors.white` baseStyle (gated behind
118
+ `_dark`), unlike `Card`, which already routes through the patched `chakra-body-bg`/
119
+ `chakra-body-text` semantic tokens — the QA report's claim that `Card` was also broken did not
120
+ reproduce under direct Playwright measurement **at the time**, in a fresh browser context. See
121
+ the correction below: `Card` *can* break, conditionally, and the real fix was one level up
122
+ from any single component.
123
+ - **`Card`/`ProfileCard` dark-mode surface bug (user-reported via screenshot, blocking) — corrects
124
+ the claim above.** The claim that this app's theme-swap dark mode "never triggers" Chakra's
125
+ `_dark:` selector was wrong: `_dark:` maps to `.chakra-ui-dark &` / `[data-theme=dark] &`, and
126
+ Chakra's own `ColorModeProvider` (which every `ChakraProvider` wraps internally, regardless of
127
+ this app's separate palette-swap mechanism) sets that class/attribute from its **own**
128
+ `localStorage["chakra-ui-color-mode"]` key — entirely separate from this app's own
129
+ `"pixelize-theme"` storage key — and that stored value **wins over** `theme.config
130
+ .initialColorMode: "light"` on every load if present. A fresh browser context has no such
131
+ stored value, so the earlier Playwright measurement never saw the bug; a browser where
132
+ Chakra's native color mode was ever toggled to `"dark"` on this origin (by this app or an
133
+ earlier version of it) does, permanently, until that one key is cleared. Confirmed live:
134
+ seeding `localStorage["chakra-ui-color-mode"] = "dark"` reproduces the exact reported symptom —
135
+ `Card`'s default `"elevated"` variant carries Chakra's own un-migrated
136
+ `_dark: { bg: "colors.gray.700" }`, and this app's dark ramp runs dark→light, so `gray[700]`
137
+ resolves to L≈79% (a light, brand-tinted gray) instead of the correct dark `chakra-body-bg`.
138
+ `ProfileCard` hits the identical path (also a bare `ChakraCard` with no explicit `bg=`).
139
+ `PricingCard`/`PaymentCard` were never affected — they set an explicit `bg={theme.colors
140
+ .background[50]}` themselves, which wins over the variant's `_dark:` block regardless.
141
+ **Fixed at the root, not per-component:** `PixelizeThemeProvider` now passes a
142
+ `colorModeManager` to `ChakraProvider` that always returns `"light"` and never persists,
143
+ severing Chakra's native color mode from `localStorage` entirely — so no un-migrated `_dark:`
144
+ block anywhere (present or future, not just `Card`) can fire regardless of what's stored.
145
+ Verified live via Playwright: reproduced the bug by seeding the stale key, confirmed the fix
146
+ neutralizes it (`Card` background back to the correct dark canvas color in both the fresh and
147
+ stale-storage cases).
148
+ - Same "text-as-scale-rung fails AA against its canvas" pattern (established by the `error`/
149
+ `red[500]` fix above) applied to two more call sites found by the QA pass: `Notification`'s
150
+ time-elapsed orange icon/text (feedback module) and `FileUploader`'s blue accent text
151
+ (inputs-date-file module).
152
+ - **`gray[500]` margin widen (`slate`/`rosewood`), code-review catch:** the same "<0.02 margin
153
+ should be treated as failing" rule established above for the gradient stops also applied to
154
+ the earlier `gray[500]` retune — `slate` measured 4.509 and `rosewood` 4.516 against their
155
+ `secondary` `backgroundColor` surface, both too thin. Darkened each by ~0.7 lightness points
156
+ (hue/saturation preserved, same HSL search as the gradient fix) to a safe ≥4.6 margin against
157
+ all four surfaces; the other 5 brands' `gray[500]` already cleared ≥4.6 and needed no change.
158
+ All 7 brands' `gray[500]` comment updated to state the ≥4.6 standard explicitly.
159
+ - **`FormError` (`chakra/componentStyles.ts`), code-review catch:** Chakra's stock
160
+ `FormErrorMessage`/`FormErrorIcon` both hardcode `colors.red.500` via a shared `--form-error-color`
161
+ CSS var — the library's `FormError` override (added earlier this pass) fixed the `text` anatomy
162
+ part via `accentTextOnCanvas` but missed the `icon` part, which stayed on Chakra's raw
163
+ `red.500` and kept the same AA gap for any consumer rendering `<FormErrorIcon/>`. Both parts now
164
+ share one computed `color`.
165
+
166
+ ## Wave D — public export of the WCAG contrast helpers (user request: "export anything useful for consumers")
167
+
168
+ - `accentText.ts`'s helpers and `color.ts`'s pure color math were internal-only (imported by
169
+ ~25 components + `chakra/componentStyles.ts`) despite being generic, dependency-free, and
170
+ already the load-bearing logic behind this whole pass's AA fixes. Promoted to `src/index.ts`
171
+ as additive exports (append-only guard test updated) so a consumer building a custom component
172
+ against this library's `ColorScale`/`PaletteProps` tokens can reuse the same contrast logic
173
+ instead of re-deriving WCAG math themselves.
174
+ - **Deliberately NOT exported:** `pickActiveAccent` (`Header.tsx`, this pass's BLOCKING fix) — it's
175
+ a narrow, Header-specific non-text-accent picker (hardcoded `ACTIVE_ACCENT_TARGET = 3`, a search
176
+ order tuned for one component's underline accent), not a general-purpose public utility.
177
+ - `accentTextOnCanvas`'s search-direction assumption (canvas darkness implies a dark-mode-shaped
178
+ scale — see the Header bug in layout-navigation MODULE.md) holds for every one of its ~25
179
+ internal call sites because both the scale and the canvas always come from the SAME active
180
+ theme mode there. A consumer passing an unrelated custom scale/canvas pairing could still hit
181
+ the same edge case Header did; `pickAccentText(primary, canvas, mode)` (explicit mode, no
182
+ guessing) is the safer of the two for that case and is exported alongside it for that reason.
183
+
184
+ ## Wave B — 8th brand (`storefront`), cross-repo coordination with the mobile design library
185
+
186
+ - Added `brands/storefront/palette.{light,dark}.ts`, registered in `types.ts` (`ThemeName`),
187
+ `brands/index.ts` (`lightPalettes`/`darkPalettes`/`palettes`/`themeNames`), `Theme/index.ts`
188
+ (`ThemesList`/`brandThemes`), and `provider/colorModeStorage.ts`'s `VALID_BRANDS` allowlist (a
189
+ hand-maintained literal array, **not** derived from `themeNames` — easy to miss; a stale stored
190
+ `brand: "storefront"` would otherwise be silently rejected back to the default brand).
191
+ - Anchor `primary[500] = "#004f4b"` (deep spruce teal, H≈177° S=100% L≈15.5%) — decided in
192
+ cross-repo coordination with the sibling `Mobile-Components` design library, which owns and has
193
+ already shipped the separate `zinc` brand (the true shadcn-clone) across all 8 brands; do not
194
+ conflate the two — `storefront` is this repo's own brand, `zinc` is mobile's.
195
+ - Structural ramps (`gray`, `background`, `border`, `boxborder`, `table.hover`, `backgroundColor`,
196
+ `sidebar.background`) were derived by **rehuing `emerald`'s exact ramp** (same lightness/
197
+ saturation curve per stop, hue rotated to storefront's 177°) rather than a fresh hand-tune —
198
+ emerald is the closest existing single-hue teal brand, so this reuses an already-AA-verified
199
+ shape instead of guessing new numbers. `primary` itself uses a custom lightness curve (500 pinned
200
+ to the exact anchor hex; 50-400 and 600-900 solved so the anchor sits proportionally where the
201
+ curve requires — emerald's own anchor is far lighter (L=33.7) than storefront's (L=15.5), so its
202
+ literal curve doesn't transplant; only the *shape* (fractional position + step ratios) carries
203
+ over). `gradient` mirrors emerald's "same hue, darker `to` stop" pattern, tuned to a ≥4.6 white-
204
+ text-contrast margin at both stops per the Wave D "don't trust a <0.02 margin" rule (measured
205
+ 4.98 / 6.96).
206
+ - **Zero hand-tuning needed post-registration** — unlike the 7 existing brands (which each needed a
207
+ `gray[500]`/gradient retune pass, see Wave D above), `storefront` passed every existing
208
+ `it.each(themeNames)` AA assertion (`accentText.test.ts`, `buildDarkPalette.test.ts`, etc.) on the
209
+ first run, because the rehue-from-emerald approach inherited an already-AA-clean shape. Full gate
210
+ green: `tsc --noEmit` clean, `jest` 791/791 (65 suites), lint clean.
211
+ - Dark palette is the plain `buildDarkPalette(light)` derivation (matches `slate`'s pattern) — no
212
+ bespoke override needed. The generic derivation's `accentLightnessDelta` cap (which assumes a
213
+ white button label) is architecturally incompatible with a true "near-white primary in dark mode"
214
+ requirement, but `storefront` doesn't need that — that requirement belongs to mobile's `zinc`.
215
+
216
+ ## Wave E — ThemeSwitcher brand-list `MenuList` dark-mode fix (user-reported, blocking)
217
+
218
+ `ThemeSwitcher.tsx`'s brand-picker (`BrandMenu` + `MenuVariant`) `MenuList` had no explicit `bg=`,
219
+ so in dark mode it fell through to Chakra's `Menu` baseStyle hardcoded `--menu-bg: #fff` (gated
220
+ behind `_dark`, same bug class as `NavigationBar`/`ButtonGroupIcon`'s `MenuList` fix above) — a
221
+ white dropdown with only the checked item's checkmark-opacity change to distinguish rows, so every
222
+ unselected brand name read as near-white-on-white. Fixed with the same pattern: both `bg=` (colors
223
+ the list's own box) **and** `sx={{ "--menu-bg": ... }}` (colors the var other pseudo-states read)
224
+ on both `MenuList`s, plus an explicit `color=` for the item text (was inheriting ambient
225
+ `text[900]`, now reads `menuColor` from the same theme-derived palette). New `useSwitcherColors()`
226
+ hook centralizes all of `ThemeSwitcher`'s token reads. Verified: `tsc`/lint clean, all 63 existing
227
+ `Theme/provider` tests still pass (no behavior regression, dark-mode-only fix).
228
+
229
+ ## Wave F — 9th brand (`zinc`), ported from the mobile design library's shadcn clone
230
+
231
+ User request: "add zinc theme exactly same as mobile," then "both mobile and web's zinc theme
232
+ should me similar to shadcn theme as close as possible" — so the goal is maximum fidelity to
233
+ mobile's `zinc` (itself "the shadcn look"), adapted only where web's own invariants require it.
234
+
235
+ - Added `brands/zinc/palette.{light,dark}.ts`, registered in `types.ts` (`ThemeName`),
236
+ `brands/index.ts`, `Theme/index.ts` (`ThemesList`/`brandThemes`), and
237
+ `provider/colorModeStorage.ts`'s `VALID_BRANDS` allowlist — same 4-file wiring as `storefront`
238
+ (Wave B).
239
+ - **Light palette**: ported verbatim from `Mobile-Components/src/theme/tokens/brands/zinc/
240
+ palette.light.ts` — no web-side changes needed, passed every existing AA sweep unmodified.
241
+ - **Dark palette — INVERTS the primary**, unlike every other brand: the filled button is
242
+ near-white (`#e4e4e7`) carrying a near-black label (`#18181b`, 13.96:1), the opposite of every
243
+ other brand's "lifted-but-still-dark" dark primary. `primary`/`secondary`/the numeric
244
+ `background` ramp/`text`/`header`/`gray`/`border`/`boxborder`/`placeholder`/`disabled`/`table`
245
+ are pinned as literals ported verbatim from mobile to preserve the authentic shadcn look;
246
+ `accentText` is recomputed against the overridden `primary` (not spread from the generic
247
+ derivation, which would be stale).
248
+ - **`backgroundColor` (named surfaces) and `sidebar` intentionally do NOT port mobile's literal
249
+ values** — the one deliberate deviation from "exactly same as mobile," found by running zinc
250
+ through web's existing `it.each(themeNames)` test sweeps:
251
+ - Mobile's zinc dark `backgroundColor` maps its 12 named surfaces onto only 5 distinct hexes
252
+ (e.g. `quaternary`/`medium`/`neutral` are all `#18181b`), which fails web's
253
+ `darkSurfaces.test.ts` invariant that every named surface is a visually distinct elevation
254
+ step (`ALIASED_SURFACES = ["light","tertiary"]` is the only sanctioned exception, shared by
255
+ every brand). Retuning each collision by hand would be arbitrary; instead `backgroundColor`
256
+ falls through to `...derived` (the same generic `buildDarkPalette` staircase every other
257
+ brand gets) — zinc's hue (~240°, near-zero saturation) survives the derivation as a
258
+ visually-identical cool neutral, just with distinct steps.
259
+ - Mobile's zinc dark `sidebar` is separately tuned from its light `sidebar` — but every web
260
+ brand's dark `sidebar` is identical to its light `sidebar` (`buildDarkPalette.ts`: "sidebar is
261
+ already near-black in light mode, so it needs no inversion"), an invariant the SideBar
262
+ dark-mode accent fix (this repo, same branch) depends on. `sidebar` falls through to
263
+ `derived.sidebar` instead, matching every other brand.
264
+ - **Fixed 3 test assertions that hardcoded a white filled-button label**, a bar only zinc's
265
+ inverted primary fails (every other brand's dark primary still carries a white label, so this
266
+ was never exercised before): `accentText.test.ts` ("dark filled-button label never regresses
267
+ below its light-mode contrast") and `buildDarkPalette.test.ts` (2 assertions: "never lifts the
268
+ accent past what light theme already ships" + "keeps solid-button labels readable against the
269
+ accent fill"). All 3 now check via `onFilled(fill, white, black)` — whichever ink clears AA —
270
+ instead of assuming white specifically, which is the correct brand-agnostic contract (the same
271
+ one components already use) and a strictly more correct check, not a loosened one.
272
+ - **Fixed a pre-existing bug in `ButtonGroupIcon.tsx`'s gradient variant** (2 spots, both hardcoded
273
+ `theme.colors.white` for the label), independent of zinc but only caught because zinc's near-
274
+ white gradient stops (originally `{from:"#fafafa", to:"#a1a1aa"}`) make the failure visible —
275
+ same bug class already fixed elsewhere per `Button.styles.ts`'s own comment ("was a hardcoded
276
+ `theme.colors.white` — fails AA for any colorScheme whose [500] doesn't clear white contrast").
277
+ Now uses `onGradient(from, to, white, black)`, matching the established pattern.
278
+ - Full gate green: `tsc --noEmit` clean, lint clean, `jest` 902/902 (72 suites, up from 869/72 pre-
279
+ zinc — 33 new tests from the added `zinc` sweep, zero regressions).
280
+
281
+ **2026-07-18 — dark primary corrected to shadcn's actual value.** The original port used `#fafafa`
282
+ for the dark-mode filled primary, approximated as "near-white" rather than checked against shadcn's
283
+ real registry. Fetched shadcn's live zinc theme (`ui.shadcn.com/r/colors/zinc.json`, OKLCH tokens)
284
+ and converted precisely: shadcn's dark `--primary` is `oklch(0.92 0.004 286.32)` → `#e4e4e7`
285
+ (zinc-200), one shade dimmer than pure white — `#fafafa` is actually shadcn's `--foreground`
286
+ (default dark-mode body text), not `--primary`. Updated `PRIMARY_500` and the dependent
287
+ `gradient.from` (now references the constant instead of a duplicated literal) in both this repo and
288
+ Mobile-Components; `accentText`/`boxShadow.primary` recompute automatically since they already
289
+ derive from `PRIMARY_500` rather than being spread from the generic derivation. Light mode's
290
+ primary (`#18181b`) already matched shadcn's `--primary` exactly — no change there. Verified every
291
+ other light/dark role against the same live registry (`background`, `card`, `muted`/`secondary`/
292
+ `accent`, `border`/`input`, `muted-foreground`) — all already matched shadcn within rounding.
293
+ `fg.default`/`text[500]` (light `#18181b` vs shadcn `--foreground` `#09090b`) and the dark `bg.surface`
294
+ elevation step (`#0e0e11` vs shadcn's card `#18181b`) were deliberately left as-is: both are
295
+ shared-shape/shared-role values that would require restructuring the 10-step ramp or the
296
+ cross-brand `roles/bg.surface` mapping, not a zinc-only anchor swap — out of scope for a
297
+ change scoped to "don't break anything."
298
+
299
+ ## Known gaps
300
+
301
+ - `KanbanBoard.tsx` uses `var(--chakra-colors-gray-300)`, but `cssVarPrefix` is `"ck"` — that
302
+ variable has never resolved (pre-existing; out of scope for the dark-mode task).
303
+ - `backgroundColor.muted`/`accent`/`tertiary`/`quaternary`/etc. are **not** covered by the
304
+ `gray[500]` retune above — 0-1 live usages in the whole codebase, and the one live
305
+ `backgroundColor.muted` usage pairs with `gray[600]` text, not `gray[500]`. Intentionally
306
+ deferred, not fixed.
307
+ - **Found during Wave D live re-verification, NOT fixed (outside the QA report's scope, flagging
308
+ for a follow-up pass):** the SideBar's notification-count badge ("10") measures ≈1.2-1.6:1
309
+ against its translucent primary-tinted pill background — fails badly. The playground's own
310
+ `/header` demo bar's raw-Chakra "Logout" ghost button measures ≈3.5:1 — same root cause as the
311
+ already-documented Header Bug B ("Login" button, layout-navigation MODULE.md): a raw Chakra
312
+ `Button` picking up the library's ghost-variant ink tuned for the page canvas, not Header's own
313
+ dark bar. Neither was in the QA report or its established follow-up patterns, so left untouched
314
+ rather than silently expanding this pass's scope.
@@ -0,0 +1,17 @@
1
+ # Types & Exports
2
+
3
+ ## Purpose
4
+
5
+ Public API surface — semver-sensitive.
6
+
7
+ ## Key paths
8
+
9
+ - `src/index.ts` (~80 value exports + typed Props groups for UserDetails, RolesPermission, CustomModulesTable, SignInActivityTable, OrganizationDetails)
10
+ - `src/types/`
11
+ - `src/withTheme.tsx`
12
+
13
+ ## Key rules
14
+
15
+ - Every public component must be exported here
16
+ - Breaking export changes require major version bump
17
+ - Run `npm run build` after export changes
@@ -0,0 +1,50 @@
1
+ # Utility UI
2
+
3
+ ## Purpose
4
+
5
+ Generic standalone UI helpers: CopyButton, ScrollToTop, LazyWrapper, MoreItems, EmptyState, PdfViewer, FilePreview, FieldSelectModal, ProfilePhotoViewer, StageProgress.
6
+
7
+ ## Key paths
8
+
9
+ - `src/Components/CopyButton/`, `ScrollToTop/`, `LazyWrapper/`, `MoreItems/`, `EmptyState/`, `PdfViewer/`, `FilePreview/`, `FieldSelectModal/`, `ProfilePhotoViewer/`, `StageProgress/`
10
+
11
+ ## Key rules
12
+
13
+ - FilePreview also exports `FilePreviewTrigger`; StageProgress also exports `StageItem` (StepperStage is internal)
14
+ - LazyWrapper wraps lazy/Suspense loading; ScrollToTop is a scroll-position helper — keep them framework-agnostic (props in, events out)
15
+ - Single-file components (CopyButton, ScrollToTop, LazyWrapper, PdfViewer, FieldSelectModal) have no colocated Props file — types are inline
16
+
17
+ ## Dark mode
18
+
19
+ CopyButton, EmptyState, FieldSelectModal, FilePreview, LazyWrapper, MoreItems, PdfViewer,
20
+ ProfilePhotoViewer and StageProgress take their colors from `useCustomTheme()` or from Chakra scale
21
+ tokens (FilePreviewTrigger's `bg="gray.100"`) — both resolve against the swapped palette. The `#…` literals
22
+ left in FilePreview / StageProgressProps are `??` fallbacks behind optional token reads — never live
23
+ colors. `blackAlpha.*` scrims are deliberate: a scrim stays black in both modes.
24
+
25
+ - **Portalled overlay surfaces must pin their own `bg`.** Chakra drives Modal/Popover panels off its
26
+ own default (`colors.white`, or `gray.700` under `_dark` — a *light* grey in our derived dark
27
+ palettes), which does not track the swapped palette. FieldSelectModal, FilePreview and MoreItems
28
+ each set `bg={theme.colors.background[50]}`; MoreItems' `PopoverArrow` needs its own `bg` too
29
+ (that prop is what sets `--popper-arrow-bg`).
30
+ - StageProgress colors resolve through `resolveStagePalette(theme, colorScheme)` in
31
+ `StageProgressProps.tsx` — StageItem and StepperStage share it, so add a stage color there, not in
32
+ a component. Its `onStrong` (label on a filled stage) is now `onFilled(strong, white, black)` —
33
+ picks whichever of white/black clears AA against that scheme's actual `strong` rung, instead of
34
+ assuming white always works; StepperStage's *unfilled* circle still uses `background[50]` because
35
+ that one is a surface.
36
+ - LazyWrapper's default spinner lives in a `DefaultFallback` subcomponent — `useCustomTheme()` is a
37
+ hook, so it cannot be called from the plain `fallback` node.
38
+
39
+ ### WCAG-contrast fixes (this pass)
40
+
41
+ - **CopyButton "menu-item" ink**: `accent` now resolves via `accentTextOnCanvas(theme.colors.primary,
42
+ theme.colors.backgroundColor.main)` instead of raw `primary[500]` — `primary[500]` is tuned for a
43
+ label *on* a filled button, not ink read directly off the canvas, and was failing AA (as low as
44
+ 4.07 measured) in 5 of 7 brands in dark mode.
45
+ - **MoreItems popover item label**: reads `gray[500]` (the library's verified muted-text token) in
46
+ place of a locally-picked, non-standard rung.
47
+ - **Control-boundary borders** (WCAG 1.4.11, needs >=3.0 against any named surface up to `muted`)
48
+ bumped to `boxborder[800]`: CopyButton's "button"-variant border (was raw `gray[200]`) and
49
+ ProfilePhotoViewer's edit-icon border (was `boxborder[300]`) — both render as an actual control
50
+ boundary, not decoration, so they need the stronger rung.
@@ -0,0 +1,35 @@
1
+ # Utils & Hooks
2
+
3
+ ## Purpose
4
+
5
+ Shared utilities and hooks: debounce, table helpers, preferences, ref merging,
6
+ truncation detection.
7
+
8
+ ## Key paths
9
+
10
+ - `src/Utils/table.ts`, `src/Utils/mergeRefs.ts`, `src/Hooks/usePreferences.ts`,
11
+ `src/Hooks/useIsTruncated.ts`, `src/services/feedback.ts`
12
+
13
+ ## Key rules
14
+
15
+ - `debounce` exported from index.ts
16
+ - **`useIsTruncated(content?, enabled?)`** (exported) — returns `{ ref, isTruncated }`;
17
+ attach `ref` to a clamped element to detect real overflow (`scrollWidth/Height`
18
+ vs `clientWidth/Height`, single- and multi-line). Re-measures on mount, element
19
+ resize (`ResizeObserver`), and `content` change — never on hover/scroll. Pass
20
+ `enabled=false` to make it fully inert. Powers `ToolTip overflowOnly` (see
21
+ `overlays`).
22
+ - **`mergeRefs(...refs)`** (internal) — combine a caller ref with an injected one
23
+ when cloning an element.
24
+
25
+ ## Recent changes
26
+
27
+ - **`table.ts` — AA-safe `onSolid` ink.** `TablePaletteColor` gained an optional
28
+ `onSolid` field; `buildTablePalette` and `pickTableColor` now compute it via
29
+ `onFilled()` (`Theme/tokens/builders/accentText.ts`) against the theme's
30
+ `white`/`black`, instead of assuming a fixed ink color. `pickTableColor` gained
31
+ an optional trailing `theme` param to supply this — both additions are
32
+ backward-compatible; existing callers without `theme` still work (fall back to
33
+ `#FFFFFF`/`#000000`). `table.test.ts` updated to assert the `onFilled()` math,
34
+ e.g. `#8B3FC8` clears white at 5.765 (onSolid stays white) while `#ff0000`
35
+ fails white at 3.998 and falls back to black at 5.252.
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env bash
2
+ # Local status line only — never sent to the model. See .cursor/TASK-SETUP.md
3
+ set -euo pipefail
4
+
5
+ STATE_FILE="${HOME}/.cursor/pixelize-skill-session-state.json"
6
+
7
+ payload=$(cat)
8
+ dir=$(echo "$payload" | jq -r ".cwd // .workspace.current_dir // empty")
9
+ session_id=$(echo "$payload" | jq -r ".session_id // empty")
10
+ base=$(basename "$dir")
11
+
12
+ show_no_skill_warning=false
13
+ if [[ -n "$session_id" && -f "$STATE_FILE" ]]; then
14
+ if jq -e --arg id "$session_id" '.[$id].chatting_without_skill == true' "$STATE_FILE" >/dev/null 2>&1; then
15
+ show_no_skill_warning=true
16
+ fi
17
+ fi
18
+
19
+ case "$base" in
20
+ account-frontend|account-service)
21
+ line1="/ → task (Account FE + BE)"
22
+ line2=""
23
+ ;;
24
+ crm-frontend|crm-service)
25
+ line1="/ → task (this repo)"
26
+ line2="/ → crm-task (CRM FE + BE)"
27
+ ;;
28
+ social-frontend|social-service)
29
+ line1="/ → task (this repo)"
30
+ line2="/ → social-task (Social FE + BE)"
31
+ ;;
32
+ tickets-frontend)
33
+ line1="/ → task (this repo)"
34
+ line2="/ → tickets-task"
35
+ ;;
36
+ crm-mobile)
37
+ line1="/ → task (this repo)"
38
+ line2="/ → crm-mobile-task"
39
+ ;;
40
+ Micro-Components)
41
+ line1="/ → task (this repo)"
42
+ line2="/ → design-task"
43
+ ;;
44
+ hrms)
45
+ line1="/ → task (this repo)"
46
+ line2="/ → hrms-task (HRMS FE + BE)"
47
+ ;;
48
+ *)
49
+ line1="Open a Pixelize repo root for / → task"
50
+ line2=""
51
+ ;;
52
+ esac
53
+
54
+ if [[ "$show_no_skill_warning" == "true" ]]; then
55
+ echo -e "\033[1;33m\033[7m ⚠ CHATTING WITHOUT TASK SKILL — use / menu ⚠ \033[0m"
56
+ echo -e "\033[1;33m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\033[0m"
57
+ fi
58
+
59
+ echo -e "\033[1;33m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\033[0m"
60
+ echo -e "\033[1;33m FEATURE WORK → $line1\033[0m"
61
+ if [ -n "$line2" ]; then
62
+ echo -e "\033[1;33m Full pipeline → $line2\033[0m"
63
+ fi
64
+ echo -e "\033[1;33m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\033[0m"
File without changes
@@ -0,0 +1,12 @@
1
+ # Fix Kanban collapsed column reset on drag
2
+
3
+ ## Problem
4
+ `collapsedColumns` is re-hydrated from stale `kanbanPreferencesJson` whenever `mergedColumns` changes (e.g. after drag when parent updates `data`).
5
+
6
+ ## Solution
7
+ 1. Hydrate `collapsedColumns` from preferences **once** (when prefs load and columns exist).
8
+ 2. On `mergedColumns` change, only **prune** keys for removed columns — never re-apply saved prefs.
9
+
10
+ ## Files
11
+ - `src/Components/KanbanBoard/KanbanBoard.tsx`
12
+ - `src/Components/KanbanBoard/KanbanBoard.test.tsx`