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.
- package/.claude/settings.local.json +51 -0
- package/.cursor/TASK-SETUP.md +43 -0
- package/.cursor/agents/be-impl.md +37 -0
- package/.cursor/agents/fe-impl.md +39 -0
- package/.cursor/agents/task-plan.md +56 -0
- package/.cursor/agents/test-create.md +31 -0
- package/.cursor/agents/test-exec.md +26 -0
- package/.cursor/hooks/task-hint.env +1 -0
- package/.cursor/hooks/task-skill-nudge.sh +71 -0
- package/.cursor/hooks/task-slash-guard.sh +31 -0
- package/.cursor/hooks.json +13 -0
- package/.cursor/modules/account-management/MODULE.md +34 -0
- package/.cursor/modules/buttons/MODULE.md +47 -0
- package/.cursor/modules/cards/MODULE.md +55 -0
- package/.cursor/modules/charts/MODULE.md +40 -0
- package/.cursor/modules/common/MODULE.md +36 -0
- package/.cursor/modules/contact-auth/MODULE.md +19 -0
- package/.cursor/modules/data-display/MODULE.md +42 -0
- package/.cursor/modules/feedback/MODULE.md +32 -0
- package/.cursor/modules/form/MODULE.md +13 -0
- package/.cursor/modules/inputs-basic/MODULE.md +42 -0
- package/.cursor/modules/inputs-date-file/MODULE.md +56 -0
- package/.cursor/modules/inputs-select/MODULE.md +27 -0
- package/.cursor/modules/inputs-toggle/MODULE.md +18 -0
- package/.cursor/modules/kanban/MODULE.md +22 -0
- package/.cursor/modules/layout-navigation/MODULE.md +269 -0
- package/.cursor/modules/overlays/MODULE.md +69 -0
- package/.cursor/modules/playground/MODULE.md +28 -0
- package/.cursor/modules/table/MODULE.md +78 -0
- package/.cursor/modules/theme/MODULE.md +314 -0
- package/.cursor/modules/types-exports/MODULE.md +17 -0
- package/.cursor/modules/utility-ui/MODULE.md +50 -0
- package/.cursor/modules/utils-hooks/MODULE.md +35 -0
- package/.cursor/pixelize-task-statusline.sh +64 -0
- package/.cursor/plans/blocked/.gitkeep +0 -0
- package/.cursor/plans/current.md +12 -0
- package/.cursor/plans/current.theme-tokens-dark-mode.md +77 -0
- package/.cursor/plans/current.theme-tokens-dark.md +155 -0
- package/.cursor/plans/done/.gitkeep +0 -0
- package/.cursor/rules +31 -0
- package/.cursor/skills/task/SKILL.md +167 -0
- package/CLAUDE.md +148 -0
- package/README.md +77 -10
- package/__mocks__/styleMock.js +8 -0
- package/coverage/clover.xml +405 -0
- package/coverage/coverage-final.json +16 -0
- package/coverage/coverage-summary.json +50 -0
- package/coverage/lcov-report/Button/Button.tsx.html +244 -0
- package/coverage/lcov-report/Button/index.html +116 -0
- package/coverage/lcov-report/Checkbox/Checkbox.tsx.html +433 -0
- package/coverage/lcov-report/Checkbox/index.html +116 -0
- package/coverage/lcov-report/Common/ErrorMessage.tsx.html +148 -0
- package/coverage/lcov-report/Common/FormLabel.tsx.html +331 -0
- package/coverage/lcov-report/Common/HelperText.tsx.html +124 -0
- package/coverage/lcov-report/Common/index.html +146 -0
- package/coverage/lcov-report/Components/Button/Button.tsx.html +244 -0
- package/coverage/lcov-report/Components/Button/index.html +116 -0
- package/coverage/lcov-report/Components/Checkbox/Checkbox.tsx.html +433 -0
- package/coverage/lcov-report/Components/Checkbox/index.html +116 -0
- package/coverage/lcov-report/Components/Common/ErrorMessage.tsx.html +148 -0
- package/coverage/lcov-report/Components/Common/FormLabel.tsx.html +331 -0
- package/coverage/lcov-report/Components/Common/HelperText.tsx.html +124 -0
- package/coverage/lcov-report/Components/Common/index.html +146 -0
- package/coverage/lcov-report/Components/CustomModulesTable/CustomModulesTable.tsx.html +712 -0
- package/coverage/lcov-report/Components/CustomModulesTable/DeleteModuleModal.tsx.html +343 -0
- package/coverage/lcov-report/Components/CustomModulesTable/EditModuleModal.tsx.html +313 -0
- package/coverage/lcov-report/Components/CustomModulesTable/index.html +146 -0
- package/coverage/lcov-report/Components/Divider/Divider.tsx.html +133 -0
- package/coverage/lcov-report/Components/Divider/index.html +116 -0
- package/coverage/lcov-report/Components/Dropdown/DropDown.tsx.html +994 -0
- package/coverage/lcov-report/Components/Dropdown/index.html +116 -0
- package/coverage/lcov-report/Components/EmptyState/EmptyState.tsx.html +466 -0
- package/coverage/lcov-report/Components/EmptyState/index.html +116 -0
- package/coverage/lcov-report/Components/Header/HeaderActions.tsx.html +373 -0
- package/coverage/lcov-report/Components/Header/index.html +116 -0
- package/coverage/lcov-report/Components/Input/TextInput.tsx.html +487 -0
- package/coverage/lcov-report/Components/Input/index.html +116 -0
- package/coverage/lcov-report/Components/Input/textInputIconSize.ts.html +205 -0
- package/coverage/lcov-report/Components/KanbanBoard/AccountCard.tsx.html +547 -0
- package/coverage/lcov-report/Components/KanbanBoard/AccountRow.tsx.html +190 -0
- package/coverage/lcov-report/Components/KanbanBoard/KanbanActions/KanbanActions.tsx.html +247 -0
- package/coverage/lcov-report/Components/KanbanBoard/KanbanActions/index.html +116 -0
- package/coverage/lcov-report/Components/KanbanBoard/KanbanBoard.tsx.html +3598 -0
- package/coverage/lcov-report/Components/KanbanBoard/MeasuredItem.tsx.html +283 -0
- package/coverage/lcov-report/Components/KanbanBoard/index.html +161 -0
- package/coverage/lcov-report/Components/OrganizationDetails/CreateOrgModal.tsx.html +511 -0
- package/coverage/lcov-report/Components/OrganizationDetails/DeleteOrgModal.tsx.html +334 -0
- package/coverage/lcov-report/Components/OrganizationDetails/OrganizationDetails.tsx.html +1519 -0
- package/coverage/lcov-report/Components/OrganizationDetails/index.html +146 -0
- package/coverage/lcov-report/Components/RolesPermission/DeleteRoleModal.tsx.html +328 -0
- package/coverage/lcov-report/Components/RolesPermission/RolesPermission.tsx.html +1732 -0
- package/coverage/lcov-report/Components/RolesPermission/index.html +131 -0
- package/coverage/lcov-report/Components/SearchSelect/SearchSelect.tsx.html +2575 -0
- package/coverage/lcov-report/Components/SearchSelect/SelectTruncatedLabel.tsx.html +202 -0
- package/coverage/lcov-report/Components/SearchSelect/index.html +146 -0
- package/coverage/lcov-report/Components/SearchSelect/searchSelectSize.ts.html +496 -0
- package/coverage/lcov-report/Components/Select/Select.tsx.html +361 -0
- package/coverage/lcov-report/Components/Select/index.html +116 -0
- package/coverage/lcov-report/Components/SideBar/components/OtherApps.tsx.html +562 -0
- package/coverage/lcov-report/Components/SideBar/components/OverflowTooltipText.tsx.html +346 -0
- package/coverage/lcov-report/Components/SideBar/components/index.html +116 -0
- package/coverage/lcov-report/Components/SignInActivityTable/SignInActivityTable.tsx.html +490 -0
- package/coverage/lcov-report/Components/SignInActivityTable/index.html +116 -0
- package/coverage/lcov-report/Components/Table/components/TableActions.tsx.html +595 -0
- package/coverage/lcov-report/Components/Table/components/TableBody.tsx.html +2212 -0
- package/coverage/lcov-report/Components/Table/components/TableGroupRow.tsx.html +358 -0
- package/coverage/lcov-report/Components/Table/components/TableLoading.tsx.html +358 -0
- package/coverage/lcov-report/Components/Table/components/index.html +161 -0
- package/coverage/lcov-report/Components/Table/settings/ManageColumns.tsx.html +856 -0
- package/coverage/lcov-report/Components/Table/settings/index.html +116 -0
- package/coverage/lcov-report/Components/Tag/Tag.styles.tsx.html +331 -0
- package/coverage/lcov-report/Components/Tag/Tag.tsx.html +256 -0
- package/coverage/lcov-report/Components/Tag/index.html +131 -0
- package/coverage/lcov-report/Components/ToolTip/ToolTip.tsx.html +286 -0
- package/coverage/lcov-report/Components/ToolTip/index.html +116 -0
- package/coverage/lcov-report/Components/UserDetails/AddUserModal.tsx.html +709 -0
- package/coverage/lcov-report/Components/UserDetails/ChangeRoleModal.tsx.html +505 -0
- package/coverage/lcov-report/Components/UserDetails/DeactivateConfirmModal.tsx.html +379 -0
- package/coverage/lcov-report/Components/UserDetails/UserDetails.tsx.html +1900 -0
- package/coverage/lcov-report/Components/UserDetails/index.html +161 -0
- package/coverage/lcov-report/EmptyState/EmptyState.tsx.html +466 -0
- package/coverage/lcov-report/EmptyState/index.html +116 -0
- package/coverage/lcov-report/Hooks/index.html +116 -0
- package/coverage/lcov-report/Hooks/usePreferences.ts.html +421 -0
- package/coverage/lcov-report/Input/TextInput.tsx.html +487 -0
- package/coverage/lcov-report/Input/index.html +131 -0
- package/coverage/lcov-report/Input/textInputIconSize.ts.html +205 -0
- package/coverage/lcov-report/KanbanBoard.tsx.html +3481 -0
- package/coverage/lcov-report/OrganizationDetails/CreateOrgModal.tsx.html +511 -0
- package/coverage/lcov-report/OrganizationDetails/DeleteOrgModal.tsx.html +334 -0
- package/coverage/lcov-report/OrganizationDetails/OrganizationDetails.tsx.html +1519 -0
- package/coverage/lcov-report/OrganizationDetails/index.html +146 -0
- package/coverage/lcov-report/RolesPermission/DeleteRoleModal.tsx.html +328 -0
- package/coverage/lcov-report/RolesPermission/RolesPermission.tsx.html +1732 -0
- package/coverage/lcov-report/RolesPermission/index.html +116 -0
- package/coverage/lcov-report/SearchSelect/SearchSelect.tsx.html +2575 -0
- package/coverage/lcov-report/SearchSelect/SelectTruncatedLabel.tsx.html +202 -0
- package/coverage/lcov-report/SearchSelect/index.html +146 -0
- package/coverage/lcov-report/SearchSelect/searchSelectSize.ts.html +496 -0
- package/coverage/lcov-report/Table/CompactSelect.tsx.html +379 -0
- package/coverage/lcov-report/Table/Components/ActiveFilters.tsx.html +514 -0
- package/coverage/lcov-report/Table/Components/HeaderActions.tsx.html +373 -0
- package/coverage/lcov-report/Table/Components/Pagination.tsx.html +574 -0
- package/coverage/lcov-report/Table/Components/TableActions.tsx.html +574 -0
- package/coverage/lcov-report/Table/Components/TableBody.tsx.html +1027 -0
- package/coverage/lcov-report/Table/Components/TableFilters.tsx.html +397 -0
- package/coverage/lcov-report/Table/Components/TableHeader.tsx.html +1060 -0
- package/coverage/lcov-report/Table/Components/TableLoading.tsx.html +361 -0
- package/coverage/lcov-report/Table/Components/TableSearch.tsx.html +337 -0
- package/coverage/lcov-report/Table/Components/index.html +266 -0
- package/coverage/lcov-report/Table/Components/useDebounce.ts.html +178 -0
- package/coverage/lcov-report/Table/Components/useTable.ts.html +778 -0
- package/coverage/lcov-report/Table/LeftFilterPane.tsx.html +1810 -0
- package/coverage/lcov-report/Table/SelectOperationControls.tsx.html +178 -0
- package/coverage/lcov-report/Table/Table.tsx.html +1567 -0
- package/coverage/lcov-report/Table/TableProps.tsx.html +658 -0
- package/coverage/lcov-report/Table/TableSettings/ManageColumns.tsx.html +619 -0
- package/coverage/lcov-report/Table/TableSettings/TableFilters.tsx.html +229 -0
- package/coverage/lcov-report/Table/TableSettings/TableSettings.tsx.html +532 -0
- package/coverage/lcov-report/Table/TableSettings/index.html +146 -0
- package/coverage/lcov-report/Table/TableToDo.tsx.html +973 -0
- package/coverage/lcov-report/Table/TextOperationControls.tsx.html +271 -0
- package/coverage/lcov-report/Table/filterTypes.ts.html +97 -0
- package/coverage/lcov-report/Table/index.html +176 -0
- package/coverage/lcov-report/Table/settings/ManageColumns.tsx.html +856 -0
- package/coverage/lcov-report/Table/settings/index.html +116 -0
- package/coverage/lcov-report/Tag/Tag.tsx.html +256 -0
- package/coverage/lcov-report/Tag/index.html +116 -0
- package/coverage/lcov-report/Theme/buildBrandTokens.ts.html +175 -0
- package/coverage/lcov-report/Theme/chartColorsFromTheme.ts.html +214 -0
- package/coverage/lcov-report/Theme/index.html +131 -0
- package/coverage/lcov-report/Theme/useCustomTheme.ts.html +100 -0
- package/coverage/lcov-report/ToolTip/ToolTip.tsx.html +286 -0
- package/coverage/lcov-report/ToolTip/index.html +116 -0
- package/coverage/lcov-report/UserDetails/AddUserModal.tsx.html +709 -0
- package/coverage/lcov-report/UserDetails/ChangeRoleModal.tsx.html +505 -0
- package/coverage/lcov-report/UserDetails/index.html +116 -0
- package/coverage/lcov-report/Utils/functions.ts.html +106 -0
- package/coverage/lcov-report/Utils/index.html +116 -0
- package/coverage/lcov-report/Utils/table.ts.html +1189 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +251 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +981 -0
- package/dist/App.d.ts.map +1 -1
- package/dist/Assets/defaultLogo.tsx +30 -0
- package/dist/Components/Accordion/Accordion.d.ts.map +1 -1
- package/dist/Components/Accordion/Accordion.js +15 -12
- package/dist/Components/Accordion/accordionColors.d.ts +6 -0
- package/dist/Components/Accordion/accordionColors.d.ts.map +1 -0
- package/dist/Components/Accordion/accordionColors.js +20 -0
- package/dist/Components/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/Components/AlertDialog/AlertDialog.js +4 -1
- package/dist/Components/Apexcharts/ApexBarChart/ApexBarChart.d.ts.map +1 -1
- package/dist/Components/Apexcharts/ApexBarChart/ApexBarChart.js +5 -1
- package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.d.ts.map +1 -1
- package/dist/Components/Apexcharts/ApexLineChart/ApexLineChart.js +6 -4
- package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.d.ts.map +1 -1
- package/dist/Components/Apexcharts/ApexPieChart/ApexPieChart.js +5 -1
- package/dist/Components/Apexcharts/ApexPolarCharts/ApexPolarCharts.d.ts.map +1 -1
- package/dist/Components/Apexcharts/ApexPolarCharts/ApexPolarCharts.js +5 -1
- package/dist/Components/Button/Button.styles.d.ts.map +1 -1
- package/dist/Components/Button/Button.styles.js +100 -47
- package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.d.ts.map +1 -1
- package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +11 -3
- package/dist/Components/Card/PaymentCard/PaymentCard.d.ts.map +1 -1
- package/dist/Components/Card/PaymentCard/PaymentCard.js +17 -12
- package/dist/Components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/Components/Checkbox/Checkbox.js +2 -1
- package/dist/Components/Common/ErrorComponent.d.ts.map +1 -1
- package/dist/Components/Common/ErrorComponent.js +7 -3
- package/dist/Components/Common/ErrorMessage.d.ts.map +1 -1
- package/dist/Components/Common/ErrorMessage.js +7 -1
- package/dist/Components/Common/FormLabel.d.ts.map +1 -1
- package/dist/Components/Common/FormLabel.js +7 -1
- package/dist/Components/Common/Label.d.ts.map +1 -1
- package/dist/Components/Common/Label.js +4 -2
- package/dist/Components/Common/fieldStyles.d.ts.map +1 -1
- package/dist/Components/Common/fieldStyles.js +3 -1
- package/dist/Components/CopyButton/CopyButton.d.ts.map +1 -1
- package/dist/Components/CopyButton/CopyButton.js +14 -6
- package/dist/Components/CustomModulesTable/CustomModulesTable.d.ts.map +1 -1
- package/dist/Components/CustomModulesTable/CustomModulesTable.js +9 -6
- package/dist/Components/CustomModulesTable/DeleteModuleModal.d.ts.map +1 -1
- package/dist/Components/CustomModulesTable/DeleteModuleModal.js +2 -2
- package/dist/Components/CustomModulesTable/EditModuleModal.d.ts.map +1 -1
- package/dist/Components/CustomModulesTable/EditModuleModal.js +2 -2
- package/dist/Components/DatePicker/CalendarPanel.js +1 -1
- package/dist/Components/DatePicker/DatePicker.js +1 -1
- package/dist/Components/DatePicker/RangeDatePicker.d.ts.map +1 -1
- package/dist/Components/DatePicker/RangeDatePicker.js +1 -1
- package/dist/Components/DatePicker/SingleDatePicker.d.ts.map +1 -1
- package/dist/Components/DatePicker/SingleDatePicker.js +1 -1
- package/dist/Components/DatePicker/TimeOnlyPicker.d.ts.map +1 -1
- package/dist/Components/DatePicker/TimeOnlyPicker.js +3 -1
- package/dist/Components/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Components/Drawer/Drawer.js +4 -1
- package/dist/Components/Dropdown/DropDown.js +5 -5
- package/dist/Components/Editor/Editor.d.ts.map +1 -1
- package/dist/Components/Editor/Editor.js +32 -2
- package/dist/Components/Editor/joditThemeVars.d.ts +21 -0
- package/dist/Components/Editor/joditThemeVars.d.ts.map +1 -0
- package/dist/Components/Editor/joditThemeVars.js +70 -0
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.d.ts.map +1 -1
- package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +5 -1
- package/dist/Components/EmptyState/EmptyState.js +3 -3
- package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts.map +1 -1
- package/dist/Components/FieldSelectModal/FieldSelectModal.js +4 -2
- package/dist/Components/FilePreview/FilePreview.d.ts.map +1 -1
- package/dist/Components/FilePreview/FilePreview.js +7 -1
- package/dist/Components/FileUpload/FileUpload.js +4 -4
- package/dist/Components/FileUploader/FileUploader.d.ts.map +1 -1
- package/dist/Components/FileUploader/FileUploader.js +7 -2
- package/dist/Components/FilterSidebar/FilterSidebar.d.ts.map +1 -1
- package/dist/Components/FilterSidebar/FilterSidebar.js +166 -142
- package/dist/Components/FilterSidebar/filterHoverStyle.d.ts +12 -0
- package/dist/Components/FilterSidebar/filterHoverStyle.d.ts.map +1 -0
- package/dist/Components/FilterSidebar/filterHoverStyle.js +14 -0
- package/dist/Components/Form/FormWrapper.js +2 -2
- package/dist/Components/Header/Header.d.ts +17 -0
- package/dist/Components/Header/Header.d.ts.map +1 -1
- package/dist/Components/Header/Header.js +34 -6
- package/dist/Components/Header/HeaderActions.d.ts.map +1 -1
- package/dist/Components/Header/HeaderActions.js +3 -2
- package/dist/Components/Header/components/desktopMenu.d.ts.map +1 -1
- package/dist/Components/Header/components/desktopMenu.js +21 -5
- package/dist/Components/Input/Input/Input.d.ts.map +1 -1
- package/dist/Components/Input/Input/Input.js +6 -2
- package/dist/Components/Input/Switch/InputSwitch.d.ts.map +1 -1
- package/dist/Components/Input/Switch/InputSwitch.js +4 -2
- package/dist/Components/Input/TextInput.styles.d.ts.map +1 -1
- package/dist/Components/Input/TextInput.styles.js +6 -1
- package/dist/Components/InputTextArea/InputTextArea.style.d.ts.map +1 -1
- package/dist/Components/InputTextArea/InputTextArea.style.js +4 -1
- package/dist/Components/KanbanBoard/AccountCard.js +4 -4
- package/dist/Components/LazyWrapper/LazyWrapper.js +1 -2
- package/dist/Components/Modal/Modal.d.ts.map +1 -1
- package/dist/Components/Modal/Modal.js +4 -1
- package/dist/Components/MoreItems/MoreItems.d.ts.map +1 -1
- package/dist/Components/MoreItems/MoreItems.js +10 -4
- package/dist/Components/MultiSelect/MultiSelect.d.ts.map +1 -1
- package/dist/Components/MultiSelect/MultiSelect.js +5 -2
- package/dist/Components/NavigationBar/NavigationBar.d.ts.map +1 -1
- package/dist/Components/NavigationBar/NavigationBar.js +8 -2
- package/dist/Components/NoteTextArea/NoteTextArea.d.ts.map +1 -1
- package/dist/Components/NoteTextArea/NoteTextArea.js +5 -2
- package/dist/Components/Notification/Notification.d.ts.map +1 -1
- package/dist/Components/Notification/Notification.js +9 -5
- package/dist/Components/NumberInput/NumberInput.styles.d.ts.map +1 -1
- package/dist/Components/NumberInput/NumberInput.styles.js +4 -1
- package/dist/Components/OrgSwitcher/OrgSwitcher.d.ts.map +1 -1
- package/dist/Components/OrgSwitcher/OrgSwitcher.js +14 -7
- package/dist/Components/OrganizationDetails/CreateOrgModal.d.ts.map +1 -1
- package/dist/Components/OrganizationDetails/CreateOrgModal.js +1 -1
- package/dist/Components/OrganizationDetails/DeleteOrgModal.js +2 -2
- package/dist/Components/OrganizationDetails/OrganizationDetails.js +11 -11
- package/dist/Components/PdfViewer/PdfViewer.js +1 -2
- package/dist/Components/PinInput/PinInput.d.ts.map +1 -1
- package/dist/Components/PinInput/PinInput.js +5 -1
- package/dist/Components/PinInputs/PinInputs.d.ts.map +1 -1
- package/dist/Components/PinInputs/PinInputs.js +3 -1
- package/dist/Components/ProductCard/ProductCard.js +1 -1
- package/dist/Components/ProductCard/ProductPrice.d.ts.map +1 -1
- package/dist/Components/ProductCard/ProductPrice.js +7 -4
- package/dist/Components/ProductCard/ProductReview.d.ts.map +1 -1
- package/dist/Components/ProductCard/ProductReview.js +7 -3
- package/dist/Components/ProductCard/ProductTags.js +1 -1
- package/dist/Components/ProductDetails/ProductDtlPrice.d.ts.map +1 -1
- package/dist/Components/ProductDetails/ProductDtlPrice.js +4 -1
- package/dist/Components/ProductDetails/ProductImageSlider.js +4 -4
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.d.ts.map +1 -1
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +10 -7
- package/dist/Components/Reorder/Reorder.js +2 -1
- package/dist/Components/RolesPermission/DeleteRoleModal.d.ts.map +1 -1
- package/dist/Components/RolesPermission/DeleteRoleModal.js +4 -2
- package/dist/Components/RolesPermission/RolesPermission.js +6 -6
- package/dist/Components/SearchSelect/SearchSelect.d.ts.map +1 -1
- package/dist/Components/SearchSelect/SearchSelect.js +4 -4
- package/dist/Components/Select/Select.styles.d.ts.map +1 -1
- package/dist/Components/Select/Select.styles.js +4 -1
- package/dist/Components/SelectSearch/SelectSearch.d.ts.map +1 -1
- package/dist/Components/SelectSearch/SelectSearch.js +5 -3
- package/dist/Components/SideBar/SecondaryBar.d.ts.map +1 -1
- package/dist/Components/SideBar/SecondaryBar.js +14 -3
- package/dist/Components/SideBar/SideBar.d.ts.map +1 -1
- package/dist/Components/SideBar/SideBar.js +18 -4
- package/dist/Components/SideBar/components/MenuItemBox.d.ts.map +1 -1
- package/dist/Components/SideBar/components/MenuItemBox.js +13 -9
- package/dist/Components/SideBar/components/MenuPopoverContent.d.ts.map +1 -1
- package/dist/Components/SideBar/components/MenuPopoverContent.js +7 -2
- package/dist/Components/SideBar/sidebarAccentColors.d.ts +21 -0
- package/dist/Components/SideBar/sidebarAccentColors.d.ts.map +1 -0
- package/dist/Components/SideBar/sidebarAccentColors.js +36 -0
- package/dist/Components/SignInActivityTable/SignInActivityTable.d.ts.map +1 -1
- package/dist/Components/SignInActivityTable/SignInActivityTable.js +7 -6
- package/dist/Components/StageProgress/StageProgress.d.ts.map +1 -1
- package/dist/Components/StageProgress/StageProgress.js +9 -4
- package/dist/Components/StageProgress/StageProgressProps.d.ts.map +1 -1
- package/dist/Components/StageProgress/StageProgressProps.js +13 -4
- package/dist/Components/StageProgress/StepperStage.js +1 -1
- package/dist/Components/Switch/Switch.d.ts.map +1 -1
- package/dist/Components/Switch/Switch.js +5 -3
- package/dist/Components/Table/Table.d.ts.map +1 -1
- package/dist/Components/Table/Table.js +9 -9
- package/dist/Components/Table/TableProps.d.ts +1 -0
- package/dist/Components/Table/TableProps.d.ts.map +1 -1
- package/dist/Components/Table/components/HeaderActions.d.ts.map +1 -1
- package/dist/Components/Table/components/HeaderActions.js +2 -1
- package/dist/Components/Table/components/TableActions.js +1 -1
- package/dist/Components/Table/components/TableBody.d.ts.map +1 -1
- package/dist/Components/Table/components/TableBody.js +21 -15
- package/dist/Components/Table/components/TableHeader.d.ts.map +1 -1
- package/dist/Components/Table/components/TableHeader.js +7 -4
- package/dist/Components/Table/components/tableRowHoverStyle.d.ts +13 -0
- package/dist/Components/Table/components/tableRowHoverStyle.d.ts.map +1 -0
- package/dist/Components/Table/components/tableRowHoverStyle.js +26 -0
- package/dist/Components/Table/filters/CompactSelect.d.ts.map +1 -1
- package/dist/Components/Table/filters/CompactSelect.js +4 -1
- package/dist/Components/Table/filters/LeftFilterPane.d.ts.map +1 -1
- package/dist/Components/Table/filters/LeftFilterPane.js +5 -4
- package/dist/Components/Tag/Tag.styles.d.ts.map +1 -1
- package/dist/Components/Tag/Tag.styles.js +21 -8
- package/dist/Components/Timeline/Timeline.d.ts.map +1 -1
- package/dist/Components/Timeline/Timeline.js +18 -17
- package/dist/Components/Toaster/Toaster.d.ts.map +1 -1
- package/dist/Components/Toaster/Toaster.js +8 -5
- package/dist/Components/Toggle/TableToggle.js +2 -2
- package/dist/Components/ToolTip/ToolTip.d.ts.map +1 -1
- package/dist/Components/ToolTip/ToolTip.js +14 -2
- package/dist/Components/Trail/EditableCell.js +1 -1
- package/dist/Components/UpgradeButton/UpgradeButton.d.ts.map +1 -1
- package/dist/Components/UpgradeButton/UpgradeButton.js +9 -4
- package/dist/Components/UserDetails/AddUserModal.d.ts.map +1 -1
- package/dist/Components/UserDetails/AddUserModal.js +1 -1
- package/dist/Components/UserDetails/ChangeRoleModal.js +2 -2
- package/dist/Components/UserDetails/DeactivateConfirmModal.d.ts.map +1 -1
- package/dist/Components/UserDetails/DeactivateConfirmModal.js +5 -2
- package/dist/Components/UserDetails/UserDetails.d.ts.map +1 -1
- package/dist/Components/UserDetails/UserDetails.js +15 -8
- package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.d.ts.map +1 -1
- package/dist/Components/WorkspaceWindow/WorkspaceTrayPreview.js +3 -1
- package/dist/Components/WorkspaceWindow/WorkspaceWindow.d.ts.map +1 -1
- package/dist/Components/WorkspaceWindow/WorkspaceWindow.js +5 -1
- package/dist/Theme/chakra/common.web.d.ts +171 -0
- package/dist/Theme/chakra/common.web.d.ts.map +1 -0
- package/dist/Theme/chakra/common.web.js +21 -0
- package/dist/Theme/chakra/componentStyles.d.ts +13 -0
- package/dist/Theme/chakra/componentStyles.d.ts.map +1 -0
- package/dist/Theme/chakra/componentStyles.js +88 -0
- package/dist/Theme/chakra/createBrandTheme.d.ts +18 -0
- package/dist/Theme/chakra/createBrandTheme.d.ts.map +1 -0
- package/dist/Theme/chakra/createBrandTheme.js +78 -0
- package/dist/Theme/chakra/fonts.web.d.ts +42 -0
- package/dist/Theme/chakra/fonts.web.d.ts.map +1 -0
- package/dist/Theme/chakra/fonts.web.js +15 -0
- package/dist/Theme/index.d.ts +29 -8
- package/dist/Theme/index.d.ts.map +1 -1
- package/dist/Theme/index.js +54 -22
- package/dist/Theme/provider/PixelizeThemeProvider.d.ts +36 -0
- package/dist/Theme/provider/PixelizeThemeProvider.d.ts.map +1 -0
- package/dist/Theme/provider/PixelizeThemeProvider.js +91 -0
- package/dist/Theme/provider/ThemeSwitcher.d.ts +8 -0
- package/dist/Theme/provider/ThemeSwitcher.d.ts.map +1 -0
- package/dist/Theme/provider/ThemeSwitcher.js +99 -0
- package/dist/Theme/provider/colorModeStorage.d.ts +10 -0
- package/dist/Theme/provider/colorModeStorage.d.ts.map +1 -0
- package/dist/Theme/provider/colorModeStorage.js +106 -0
- package/dist/Theme/provider/index.d.ts +6 -0
- package/dist/Theme/provider/index.d.ts.map +1 -0
- package/dist/Theme/provider/index.js +9 -0
- package/dist/Theme/provider/useThemeMode.d.ts +3 -0
- package/dist/Theme/provider/useThemeMode.d.ts.map +1 -0
- package/dist/Theme/provider/useThemeMode.js +13 -0
- package/dist/Theme/themeProps.d.ts +10 -373
- package/dist/Theme/themeProps.d.ts.map +1 -1
- package/dist/Theme/tokens/brands/emerald/palette.dark.d.ts +7 -0
- package/dist/Theme/tokens/brands/emerald/palette.dark.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/emerald/palette.dark.js +13 -0
- package/dist/Theme/tokens/brands/emerald/palette.light.d.ts +375 -0
- package/dist/Theme/tokens/brands/emerald/palette.light.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/emerald/palette.light.js +135 -0
- package/dist/Theme/tokens/brands/index.d.ts +28 -0
- package/dist/Theme/tokens/brands/index.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/index.js +93 -0
- package/dist/Theme/tokens/brands/lavender/palette.dark.d.ts +7 -0
- package/dist/Theme/tokens/brands/lavender/palette.dark.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/lavender/palette.dark.js +13 -0
- package/dist/Theme/tokens/brands/lavender/palette.light.d.ts +375 -0
- package/dist/Theme/tokens/brands/lavender/palette.light.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/lavender/palette.light.js +316 -0
- package/dist/Theme/tokens/brands/meadow/palette.dark.d.ts +7 -0
- package/dist/Theme/tokens/brands/meadow/palette.dark.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/meadow/palette.dark.js +13 -0
- package/dist/Theme/tokens/brands/meadow/palette.light.d.ts +375 -0
- package/dist/Theme/tokens/brands/meadow/palette.light.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/meadow/palette.light.js +133 -0
- package/dist/Theme/tokens/brands/radiant/palette.dark.d.ts +7 -0
- package/dist/Theme/tokens/brands/radiant/palette.dark.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/radiant/palette.dark.js +13 -0
- package/dist/Theme/tokens/brands/radiant/palette.light.d.ts +375 -0
- package/dist/Theme/tokens/brands/radiant/palette.light.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/radiant/palette.light.js +135 -0
- package/dist/Theme/tokens/brands/rosewood/palette.dark.d.ts +7 -0
- package/dist/Theme/tokens/brands/rosewood/palette.dark.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/rosewood/palette.dark.js +13 -0
- package/dist/Theme/tokens/brands/rosewood/palette.light.d.ts +375 -0
- package/dist/Theme/tokens/brands/rosewood/palette.light.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/rosewood/palette.light.js +139 -0
- package/dist/Theme/tokens/brands/skyline/palette.dark.d.ts +7 -0
- package/dist/Theme/tokens/brands/skyline/palette.dark.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/skyline/palette.dark.js +13 -0
- package/dist/Theme/tokens/brands/skyline/palette.light.d.ts +375 -0
- package/dist/Theme/tokens/brands/skyline/palette.light.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/skyline/palette.light.js +133 -0
- package/dist/Theme/tokens/brands/slate/palette.dark.d.ts +7 -0
- package/dist/Theme/tokens/brands/slate/palette.dark.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/slate/palette.dark.js +13 -0
- package/dist/Theme/tokens/brands/slate/palette.light.d.ts +375 -0
- package/dist/Theme/tokens/brands/slate/palette.light.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/slate/palette.light.js +137 -0
- package/dist/Theme/tokens/brands/storefront/palette.dark.d.ts +7 -0
- package/dist/Theme/tokens/brands/storefront/palette.dark.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/storefront/palette.dark.js +13 -0
- package/dist/Theme/tokens/brands/storefront/palette.light.d.ts +375 -0
- package/dist/Theme/tokens/brands/storefront/palette.light.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/storefront/palette.light.js +127 -0
- package/dist/Theme/tokens/brands/zinc/palette.dark.d.ts +204 -0
- package/dist/Theme/tokens/brands/zinc/palette.dark.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/zinc/palette.dark.js +204 -0
- package/dist/Theme/tokens/brands/zinc/palette.light.d.ts +375 -0
- package/dist/Theme/tokens/brands/zinc/palette.light.d.ts.map +1 -0
- package/dist/Theme/tokens/brands/zinc/palette.light.js +383 -0
- package/dist/Theme/tokens/builders/accentText.d.ts +56 -0
- package/dist/Theme/tokens/builders/accentText.d.ts.map +1 -0
- package/dist/Theme/tokens/builders/accentText.js +92 -0
- package/dist/Theme/tokens/builders/buildBrandTokens.d.ts +16 -0
- package/dist/Theme/tokens/builders/buildBrandTokens.d.ts.map +1 -0
- package/dist/Theme/tokens/builders/buildBrandTokens.js +33 -0
- package/dist/Theme/tokens/builders/buildDarkPalette.d.ts +23 -0
- package/dist/Theme/tokens/builders/buildDarkPalette.d.ts.map +1 -0
- package/dist/Theme/tokens/builders/buildDarkPalette.js +282 -0
- package/dist/Theme/tokens/builders/chartColorsFromTheme.d.ts +17 -0
- package/dist/Theme/tokens/builders/chartColorsFromTheme.d.ts.map +1 -0
- package/dist/Theme/tokens/builders/chartColorsFromTheme.js +26 -0
- package/dist/Theme/tokens/builders/color.d.ts +50 -0
- package/dist/Theme/tokens/builders/color.d.ts.map +1 -0
- package/dist/Theme/tokens/builders/color.js +156 -0
- package/dist/Theme/tokens/builders/index.d.ts +6 -0
- package/dist/Theme/tokens/builders/index.d.ts.map +1 -0
- package/dist/Theme/tokens/builders/index.js +21 -0
- package/dist/Theme/tokens/index.d.ts +15 -0
- package/dist/Theme/tokens/index.d.ts.map +1 -0
- package/dist/Theme/tokens/index.js +30 -0
- package/dist/Theme/tokens/primitives/breakpoints.d.ts +9 -0
- package/dist/Theme/tokens/primitives/breakpoints.d.ts.map +1 -0
- package/dist/Theme/tokens/primitives/breakpoints.js +10 -0
- package/dist/Theme/tokens/primitives/index.d.ts +10 -0
- package/dist/Theme/tokens/primitives/index.d.ts.map +1 -0
- package/dist/Theme/tokens/primitives/index.js +27 -0
- package/dist/Theme/tokens/primitives/letterSpacings.d.ts +10 -0
- package/dist/Theme/tokens/primitives/letterSpacings.d.ts.map +1 -0
- package/dist/Theme/tokens/primitives/letterSpacings.js +11 -0
- package/dist/Theme/tokens/primitives/lineHeights.d.ts +19 -0
- package/dist/Theme/tokens/primitives/lineHeights.d.ts.map +1 -0
- package/dist/Theme/tokens/primitives/lineHeights.js +20 -0
- package/dist/Theme/tokens/primitives/radii.d.ts +13 -0
- package/dist/Theme/tokens/primitives/radii.d.ts.map +1 -0
- package/dist/Theme/tokens/primitives/radii.js +14 -0
- package/dist/Theme/tokens/primitives/shadows.d.ts +16 -0
- package/dist/Theme/tokens/primitives/shadows.d.ts.map +1 -0
- package/dist/Theme/tokens/primitives/shadows.js +17 -0
- package/dist/Theme/tokens/primitives/sizes.d.ts +63 -0
- package/dist/Theme/tokens/primitives/sizes.d.ts.map +1 -0
- package/dist/Theme/tokens/primitives/sizes.js +39 -0
- package/dist/Theme/tokens/primitives/space.d.ts +34 -0
- package/dist/Theme/tokens/primitives/space.d.ts.map +1 -0
- package/dist/Theme/tokens/primitives/space.js +35 -0
- package/dist/Theme/tokens/primitives/typography.d.ts +73 -0
- package/dist/Theme/tokens/primitives/typography.d.ts.map +1 -0
- package/dist/Theme/tokens/primitives/typography.js +43 -0
- package/dist/Theme/tokens/primitives/zIndices.d.ts +17 -0
- package/dist/Theme/tokens/primitives/zIndices.d.ts.map +1 -0
- package/dist/Theme/tokens/primitives/zIndices.js +18 -0
- package/dist/Theme/tokens/types.d.ts +116 -0
- package/dist/Theme/tokens/types.d.ts.map +1 -0
- package/dist/Theme/tokens/types.js +8 -0
- package/dist/Utils/table.d.ts +9 -2
- package/dist/Utils/table.d.ts.map +1 -1
- package/dist/Utils/table.js +23 -7
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -1
- package/eslint.config.js +48 -0
- package/index.html +13 -0
- package/package.json +1 -5
- 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`
|