@jmruthers/pace-core 0.4.1 → 0.5.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/CHANGELOG.md +26 -1
- package/README.md +231 -229
- package/dist/{DataTable-2LB6HI6V.js → DataTable-GX3XERFJ.js} +14 -17
- package/dist/{DataTable-BDBqkU-i.d.ts → DataTable-ltTFXHS3.d.ts} +25 -51
- package/dist/{Table-CIm9IWqk.d.ts → PublicLoadingSpinner-DztrzuJr.d.ts} +635 -122
- package/dist/UnifiedAuthProvider-w66zSCUf.d.ts +160 -0
- package/dist/{api-AIJ3IJX3.js → api-ETQ6YJ3C.js} +6 -4
- package/dist/{appConfig-fB1pP_v3.d.ts → appConfig-BVGyuvI7.d.ts} +1 -1
- package/dist/appNameResolver-7GHF5ED2.js +22 -0
- package/dist/{audit-PD5L5ZSC.js → audit-BUW3LMJB.js} +3 -3
- package/dist/chunk-5EL3KHOQ.js +388 -0
- package/dist/chunk-5EL3KHOQ.js.map +1 -0
- package/dist/{chunk-4MCJAK7J.js → chunk-6CR3MRZN.js} +1827 -4886
- package/dist/chunk-6CR3MRZN.js.map +1 -0
- package/dist/{chunk-YNU5QJ4S.js → chunk-7BNPOCLL.js} +22 -5
- package/dist/chunk-7BNPOCLL.js.map +1 -0
- package/dist/chunk-AUE24LVR.js +268 -0
- package/dist/chunk-AUE24LVR.js.map +1 -0
- package/dist/chunk-C5G2A4PO.js +1349 -0
- package/dist/chunk-C5G2A4PO.js.map +1 -0
- package/dist/{chunk-4ZTIEYU2.js → chunk-CDQ3PX7L.js} +1 -1
- package/dist/chunk-CDQ3PX7L.js.map +1 -0
- package/dist/chunk-COBPIXXQ.js +379 -0
- package/dist/chunk-COBPIXXQ.js.map +1 -0
- package/dist/chunk-GSNM5D6H.js +5441 -0
- package/dist/chunk-GSNM5D6H.js.map +1 -0
- package/dist/chunk-MZBUOP4P.js +119 -0
- package/dist/chunk-MZBUOP4P.js.map +1 -0
- package/dist/chunk-N2EUGZRW.js +98 -0
- package/dist/chunk-N2EUGZRW.js.map +1 -0
- package/dist/chunk-NQ4TOOO6.js +20 -0
- package/dist/chunk-NQ4TOOO6.js.map +1 -0
- package/dist/{chunk-KK6WIDK6.js → chunk-OEGRKULD.js} +12 -2
- package/dist/{chunk-KK6WIDK6.js.map → chunk-OEGRKULD.js.map} +1 -1
- package/dist/chunk-OYRY44Q2.js +62 -0
- package/dist/chunk-OYRY44Q2.js.map +1 -0
- package/dist/{chunk-DC5AMYBS.js → chunk-PLDDJCW6.js} +15 -5
- package/dist/chunk-PLDDJCW6.js.map +1 -0
- package/dist/{chunk-WHLSWC6W.js → chunk-SS3E6QLB.js} +16 -61
- package/dist/chunk-SS3E6QLB.js.map +1 -0
- package/dist/chunk-T3XIA4AJ.js +3295 -0
- package/dist/chunk-T3XIA4AJ.js.map +1 -0
- package/dist/{chunk-H4PZ4B3Y.js → chunk-TGDCLPP2.js} +129 -28
- package/dist/chunk-TGDCLPP2.js.map +1 -0
- package/dist/{chunk-IOX76PSM.js → chunk-U6JDHVC2.js} +273 -29
- package/dist/chunk-U6JDHVC2.js.map +1 -0
- package/dist/{chunk-JUUNUW3O.js → chunk-XJK2J4N6.js} +17 -6
- package/dist/chunk-XJK2J4N6.js.map +1 -0
- package/dist/chunk-YDJW5XTN.js +84 -0
- package/dist/chunk-YDJW5XTN.js.map +1 -0
- package/dist/components.d.ts +906 -10
- package/dist/components.js +3263 -84
- package/dist/components.js.map +1 -1
- package/dist/{database-CAMsquLm.d.ts → database-C3Szpi5J.d.ts} +28 -11
- package/dist/hooks.d.ts +7 -6
- package/dist/hooks.js +35 -11
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +245 -111
- package/dist/index.js +195 -185
- package/dist/index.js.map +1 -1
- package/dist/{organisation-DLNNQhPB.d.ts → organisation-CO3Sh3_D.d.ts} +1 -1
- package/dist/providers.d.ts +4 -4
- package/dist/providers.js +21 -6
- package/dist/rbac/index.d.ts +862 -806
- package/dist/rbac/index.js +953 -1032
- package/dist/rbac/index.js.map +1 -1
- package/dist/styles/core.css +422 -0
- package/dist/styles/fonts/georama-italic.woff2 +0 -0
- package/dist/styles/fonts/georama.woff2 +0 -0
- package/dist/styles/fonts/open-sans-italic.woff2 +0 -0
- package/dist/styles/fonts/open-sans.woff2 +0 -0
- package/dist/styles/fonts/reddit-mono.woff2 +0 -0
- package/dist/styles/index.d.ts +36 -0
- package/dist/styles/index.js +24 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/theming/runtime.d.ts +73 -0
- package/dist/theming/runtime.js +16 -0
- package/dist/theming/runtime.js.map +1 -0
- package/dist/{types-Bavn44NW.d.ts → types-BRDU7N6w.d.ts} +79 -33
- package/dist/types.d.ts +5 -5
- package/dist/types.js +7 -2
- package/dist/types.js.map +1 -1
- package/dist/{unified-BtRpPbmp.d.ts → unified-CM7T0aTK.d.ts} +1 -2
- package/dist/usePublicRouteParams-B6i0KtXW.d.ts +477 -0
- package/dist/utils.d.ts +83 -60
- package/dist/utils.js +301 -55657
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts +1 -1
- package/dist/validation.js +1 -1
- package/docs/INDEX.md +192 -0
- package/docs/README.md +46 -32
- package/docs/api/README.md +231 -229
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +132 -0
- package/docs/api/interfaces/AggregateConfig.md +4 -4
- package/docs/api/interfaces/ButtonProps.md +2 -2
- package/docs/api/interfaces/CardProps.md +2 -2
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +98 -7
- package/docs/api/interfaces/DataTableColumn.md +131 -12
- package/docs/api/interfaces/DataTableProps.md +77 -274
- package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
- package/docs/api/interfaces/EmptyStateConfig.md +5 -5
- package/docs/api/interfaces/EventContextType.md +7 -7
- package/docs/api/interfaces/EventLogoProps.md +152 -0
- package/docs/api/interfaces/EventProviderProps.md +2 -2
- package/docs/api/interfaces/FileSizeLimits.md +7 -0
- package/docs/api/interfaces/FileUploadProps.md +154 -0
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
- package/docs/api/interfaces/InputProps.md +2 -2
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +2 -2
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +26 -26
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +94 -0
- package/docs/api/interfaces/PublicErrorBoundaryState.md +68 -0
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +86 -0
- package/docs/api/interfaces/PublicPageFooterProps.md +112 -0
- package/docs/api/interfaces/PublicPageHeaderProps.md +138 -0
- package/docs/api/interfaces/PublicPageLayoutProps.md +138 -0
- package/docs/api/interfaces/StorageConfig.md +41 -0
- package/docs/api/interfaces/StorageFileInfo.md +74 -0
- package/docs/api/interfaces/StorageFileMetadata.md +140 -0
- package/docs/api/interfaces/StorageListOptions.md +86 -0
- package/docs/api/interfaces/StorageListResult.md +41 -0
- package/docs/api/interfaces/StorageUploadOptions.md +88 -0
- package/docs/api/interfaces/StorageUploadResult.md +63 -0
- package/docs/api/interfaces/StorageUrlOptions.md +47 -0
- package/docs/api/interfaces/StyleImport.md +2 -2
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +447 -46
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +95 -9
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +136 -0
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +123 -0
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
- package/docs/api/interfaces/UsePublicEventOptions.md +34 -0
- package/docs/api/interfaces/UsePublicEventReturn.md +68 -0
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +94 -0
- package/docs/api/interfaces/UserEventAccess.md +14 -14
- package/docs/api/interfaces/UserMenuProps.md +6 -6
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +1626 -768
- package/docs/api-reference/components.md +761 -43
- package/docs/api-reference/hooks.md +126 -0
- package/docs/api-reference/providers.md +141 -65
- package/docs/api-reference/types.md +66 -36
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -2
- package/docs/best-practices/README.md +400 -0
- package/docs/consuming-app-example.md +42 -96
- package/docs/consuming-app-vite-config.md +233 -0
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +0 -1
- package/docs/core-concepts/rbac-system.md +23 -10
- package/docs/documentation-style-checklist.md +8 -2
- package/docs/examples/navigation-menu-auth-fix.md +344 -0
- package/docs/getting-started/examples/README.md +15 -1
- package/docs/getting-started/examples/basic-auth-app.md +444 -119
- package/docs/getting-started/examples/full-featured-app.md +6 -6
- package/docs/getting-started/installation.md +231 -52
- package/docs/getting-started/quick-start.md +121 -24
- package/docs/implementation-guides/app-layout.md +133 -108
- package/docs/implementation-guides/data-tables.md +1011 -29
- package/docs/implementation-guides/forms.md +3 -3
- package/docs/implementation-guides/hierarchical-datatable.md +850 -0
- package/docs/implementation-guides/large-datasets.md +2 -2
- package/docs/implementation-guides/navigation.md +1 -1
- package/docs/implementation-guides/permission-enforcement.md +4 -4
- package/docs/implementation-guides/public-pages.md +752 -0
- package/docs/migration/README.md +18 -8
- package/docs/migration/quick-migration-guide.md +320 -0
- package/docs/migration/rbac-migration.md +50 -0
- package/docs/migration/v0.4.15-tailwind-scanning.md +272 -0
- package/docs/migration/v0.4.16-css-first-approach.md +306 -0
- package/docs/migration/v0.4.17-source-path-fix.md +229 -0
- package/docs/migration-guide.md +51 -104
- package/docs/performance/README.md +1 -4
- package/docs/print-components/README.md +258 -0
- package/docs/print-components/api-reference.md +636 -0
- package/docs/print-components/examples/README.md +204 -0
- package/docs/print-components/examples/basic-report.tsx +92 -0
- package/docs/print-components/examples/card-catalog.tsx +149 -0
- package/docs/print-components/examples/cover-page-report.tsx +163 -0
- package/docs/print-components/quick-start.md +363 -0
- package/docs/quick-reference.md +53 -36
- package/docs/rbac/README.md +136 -69
- package/docs/rbac/api-reference.md +39 -8
- package/docs/rbac/examples.md +237 -66
- package/docs/rbac/getting-started.md +131 -16
- package/docs/rbac/quick-start.md +499 -323
- package/docs/rbac/troubleshooting.md +240 -262
- package/docs/security/README.md +50 -1
- package/docs/styles/README.md +143 -117
- package/docs/testing/README.md +6 -10
- package/docs/troubleshooting/README.md +497 -0
- package/docs/troubleshooting/common-issues.md +604 -14
- package/docs/troubleshooting/styling-issues.md +219 -0
- package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
- package/docs/usage.md +28 -90
- package/docs/visual-testing.md +0 -7
- package/package.json +46 -24
- package/src/__mocks__/lucide-react.ts +181 -0
- package/src/__tests__/REBUILD_PLAN.md +223 -0
- package/src/__tests__/TESTING_GUIDELINES.md +341 -0
- package/src/__tests__/fixtures/mocks.ts +93 -0
- package/src/__tests__/helpers/component-test-utils.tsx +145 -0
- package/src/__tests__/helpers/test-utils.tsx +117 -0
- package/src/__tests__/integration/UserProfile.test.tsx +128 -0
- package/src/__tests__/setup.ts +71 -0
- package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
- package/src/__tests__/templates/component.test.template.tsx +144 -0
- package/src/__tests__/templates/hook.test.template.ts +173 -0
- package/src/__tests__/templates/integration.test.template.tsx +199 -0
- package/src/__tests__/types/test.types.ts +106 -0
- package/src/components/Alert/Alert.test.tsx +496 -0
- package/src/components/Alert/Alert.tsx +134 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/Avatar/Avatar.test.tsx +484 -0
- package/src/components/Avatar/Avatar.tsx +84 -0
- package/src/components/Avatar/index.ts +2 -0
- package/src/components/Button/Button.test.tsx +662 -0
- package/src/components/Button/Button.tsx +270 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/Card/Card.test.tsx +593 -0
- package/src/components/Card/Card.tsx +271 -0
- package/src/components/Card/index.ts +1 -0
- package/src/components/Checkbox/Checkbox.test.tsx +461 -0
- package/src/components/Checkbox/Checkbox.tsx +75 -0
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/DataTable/DataTable.tsx +446 -0
- package/src/components/DataTable/__tests__/README.md +145 -0
- package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
- package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +381 -0
- package/src/components/DataTable/__tests__/test-utils.ts +94 -0
- package/src/components/DataTable/components/AccessDeniedPage.tsx +168 -0
- package/src/components/DataTable/components/ActionButtons.tsx +194 -0
- package/src/components/DataTable/components/BulkOperationsDropdown.tsx +160 -0
- package/src/components/DataTable/components/ColumnFilter.tsx +114 -0
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +100 -0
- package/src/components/DataTable/components/DataTableBody.tsx +461 -0
- package/src/components/DataTable/components/DataTableCore.tsx +1027 -0
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
- package/src/components/DataTable/components/DataTableModals.tsx +87 -0
- package/src/components/DataTable/components/DataTableToolbar.tsx +262 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
- package/src/components/DataTable/components/EditableRow.tsx +159 -0
- package/src/components/DataTable/components/EmptyState.tsx +64 -0
- package/src/components/DataTable/components/ExpandButton.tsx +113 -0
- package/src/components/DataTable/components/FilterRow.tsx +100 -0
- package/src/components/DataTable/components/GroupHeader.tsx +42 -0
- package/src/components/DataTable/components/GroupingDropdown.tsx +96 -0
- package/src/components/DataTable/components/ImportModal.tsx +345 -0
- package/src/components/DataTable/components/LoadingState.tsx +12 -0
- package/src/components/DataTable/components/PaginationControls.tsx +332 -0
- package/src/components/DataTable/components/UnifiedTableBody.tsx +742 -0
- package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
- package/src/components/DataTable/components/index.ts +16 -0
- package/src/components/DataTable/context/DataTableContext.tsx +97 -0
- package/src/components/DataTable/core/ActionManager.ts +235 -0
- package/src/components/DataTable/core/ColumnFactory.ts +268 -0
- package/src/components/DataTable/core/ColumnManager.ts +205 -0
- package/src/components/DataTable/core/DataManager.ts +188 -0
- package/src/components/DataTable/core/DataTableContext.tsx +181 -0
- package/src/components/DataTable/core/LocalDataAdapter.ts +264 -0
- package/src/components/DataTable/core/PluginRegistry.ts +229 -0
- package/src/components/DataTable/core/StateManager.ts +311 -0
- package/src/components/DataTable/core/index.ts +8 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +419 -0
- package/src/components/DataTable/examples/HierarchicalExample.tsx +475 -0
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +176 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +505 -0
- package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +95 -0
- package/src/components/DataTable/hooks/useColumnReordering.ts +110 -0
- package/src/components/DataTable/hooks/useDataTableState.ts +325 -0
- package/src/components/DataTable/hooks/useHierarchicalState.ts +174 -0
- package/src/components/DataTable/index.ts +68 -0
- package/src/components/DataTable/styles.ts +171 -0
- package/src/components/DataTable/types.ts +511 -0
- package/src/components/DataTable/utils/debugTools.ts +583 -0
- package/src/components/DataTable/utils/errorHandling.ts +494 -0
- package/src/components/DataTable/utils/exportUtils.ts +126 -0
- package/src/components/DataTable/utils/flexibleImport.ts +510 -0
- package/src/components/DataTable/utils/hierarchicalSorting.ts +151 -0
- package/src/components/DataTable/utils/hierarchicalUtils.ts +218 -0
- package/src/components/DataTable/utils/index.ts +1 -0
- package/src/components/DataTable/utils/performanceUtils.ts +351 -0
- package/src/components/Dialog/Dialog.test.tsx +1139 -0
- package/src/components/Dialog/Dialog.tsx +782 -0
- package/src/components/Dialog/README.md +804 -0
- package/src/components/Dialog/examples/BasicHtmlTest.tsx +55 -0
- package/src/components/Dialog/examples/DebugHtmlExample.tsx +68 -0
- package/src/components/Dialog/examples/HtmlDialogExample.tsx +202 -0
- package/src/components/Dialog/examples/SimpleHtmlTest.tsx +61 -0
- package/src/components/Dialog/examples/SmartDialogExample.tsx +322 -0
- package/src/components/Dialog/index.ts +12 -0
- package/src/components/Dialog/utils/safeHtml.ts +185 -0
- package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +752 -0
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
- package/src/components/ErrorBoundary/index.ts +8 -0
- package/src/components/EventSelector/EventSelector.tsx +360 -0
- package/src/components/EventSelector/index.ts +3 -0
- package/src/components/EventSelector/types.ts +79 -0
- package/src/components/FileUpload/FileUpload.example.tsx +218 -0
- package/src/components/FileUpload/FileUpload.test.tsx +665 -0
- package/src/components/FileUpload/FileUpload.tsx +237 -0
- package/src/components/FileUpload/index.ts +6 -0
- package/src/components/Footer/Footer.tsx +197 -0
- package/src/components/Footer/index.ts +17 -0
- package/src/components/Form/Form.tsx +166 -0
- package/src/components/Form/FormErrorSummary.tsx +113 -0
- package/src/components/Form/FormField.tsx +249 -0
- package/src/components/Form/FormFieldset.tsx +127 -0
- package/src/components/Form/FormLiveRegion.tsx +198 -0
- package/src/components/Form/index.ts +26 -0
- package/src/components/Header/Header.tsx +301 -0
- package/src/components/Header/index.ts +4 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
- package/src/components/InactivityWarningModal/index.ts +9 -0
- package/src/components/Input/Input.tsx +201 -0
- package/src/components/Input/__mocks__/Input.tsx +2 -0
- package/src/components/Input/index.ts +9 -0
- package/src/components/Label/Label.tsx +186 -0
- package/src/components/Label/index.ts +2 -0
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
- package/src/components/LoadingSpinner/index.ts +3 -0
- package/src/components/LoginForm/LoginForm.tsx +273 -0
- package/src/components/LoginForm/index.ts +3 -0
- package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
- package/src/components/NavigationMenu/index.ts +10 -0
- package/src/components/NavigationMenu/types.ts +85 -0
- package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
- package/src/components/OrganisationSelector/index.ts +9 -0
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
- package/src/components/PaceAppLayout/README.md +278 -0
- package/src/components/PaceAppLayout/index.ts +1 -0
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
- package/src/components/PaceLoginPage/index.ts +1 -0
- package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
- package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
- package/src/components/PasswordReset/index.ts +4 -0
- package/src/components/PrintButton/PrintButton.tsx +321 -0
- package/src/components/PrintButton/PrintButtonGroup.tsx +84 -0
- package/src/components/PrintButton/PrintToolbar.tsx +94 -0
- package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +438 -0
- package/src/components/PrintButton/index.ts +33 -0
- package/src/components/PrintButton/types.ts +173 -0
- package/src/components/PrintCard/PrintCard.tsx +154 -0
- package/src/components/PrintCard/PrintCardContent.tsx +57 -0
- package/src/components/PrintCard/PrintCardFooter.tsx +60 -0
- package/src/components/PrintCard/PrintCardGrid.tsx +91 -0
- package/src/components/PrintCard/PrintCardHeader.tsx +78 -0
- package/src/components/PrintCard/PrintCardImage.tsx +81 -0
- package/src/components/PrintCard/examples/PrintCardShowcase.tsx +239 -0
- package/src/components/PrintCard/index.ts +34 -0
- package/src/components/PrintCard/types.ts +171 -0
- package/src/components/PrintDataTable/PrintDataTable.tsx +215 -0
- package/src/components/PrintDataTable/PrintTableGroup.tsx +90 -0
- package/src/components/PrintDataTable/PrintTableRow.tsx +76 -0
- package/src/components/PrintDataTable/index.ts +25 -0
- package/src/components/PrintDataTable/types.ts +67 -0
- package/src/components/PrintFooter/PrintFooter.tsx +183 -0
- package/src/components/PrintFooter/PrintFooterContent.tsx +71 -0
- package/src/components/PrintFooter/PrintFooterInfo.tsx +86 -0
- package/src/components/PrintFooter/PrintPageNumber.tsx +90 -0
- package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +390 -0
- package/src/components/PrintFooter/index.ts +30 -0
- package/src/components/PrintFooter/types.ts +149 -0
- package/src/components/PrintGrid/PrintGrid.tsx +180 -0
- package/src/components/PrintGrid/PrintGridBreakpoint.tsx +109 -0
- package/src/components/PrintGrid/PrintGridContainer.tsx +128 -0
- package/src/components/PrintGrid/PrintGridItem.tsx +220 -0
- package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +359 -0
- package/src/components/PrintGrid/index.ts +31 -0
- package/src/components/PrintGrid/types.ts +159 -0
- package/src/components/PrintHeader/PrintCoverHeader.tsx +230 -0
- package/src/components/PrintHeader/PrintHeader.tsx +150 -0
- package/src/components/PrintHeader/index.ts +17 -0
- package/src/components/PrintHeader/types.ts +42 -0
- package/src/components/PrintLayout/PrintLayout.tsx +122 -0
- package/src/components/PrintLayout/PrintLayoutContext.tsx +66 -0
- package/src/components/PrintLayout/PrintPageBreak.tsx +52 -0
- package/src/components/PrintLayout/examples/PrintShowcase.tsx +230 -0
- package/src/components/PrintLayout/index.ts +19 -0
- package/src/components/PrintLayout/types.ts +37 -0
- package/src/components/PrintPageBreak/PrintPageBreak.tsx +120 -0
- package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +90 -0
- package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +112 -0
- package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +279 -0
- package/src/components/PrintPageBreak/index.ts +23 -0
- package/src/components/PrintPageBreak/types.ts +94 -0
- package/src/components/PrintSection/PrintColumn.tsx +104 -0
- package/src/components/PrintSection/PrintDivider.tsx +101 -0
- package/src/components/PrintSection/PrintSection.tsx +129 -0
- package/src/components/PrintSection/PrintSectionContent.tsx +75 -0
- package/src/components/PrintSection/PrintSectionHeader.tsx +97 -0
- package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +258 -0
- package/src/components/PrintSection/index.ts +33 -0
- package/src/components/PrintSection/types.ts +155 -0
- package/src/components/PrintText/PrintText.tsx +116 -0
- package/src/components/PrintText/index.ts +16 -0
- package/src/components/PrintText/types.ts +24 -0
- package/src/components/Progress/Progress.tsx +116 -0
- package/src/components/Progress/index.ts +3 -0
- package/src/components/PublicLayout/EventLogo.tsx +287 -0
- package/src/components/PublicLayout/PublicErrorBoundary.tsx +279 -0
- package/src/components/PublicLayout/PublicLoadingSpinner.tsx +208 -0
- package/src/components/PublicLayout/PublicPageContextChecker.tsx +130 -0
- package/src/components/PublicLayout/PublicPageDebugger.tsx +104 -0
- package/src/components/PublicLayout/PublicPageDiagnostic.tsx +162 -0
- package/src/components/PublicLayout/PublicPageFooter.tsx +124 -0
- package/src/components/PublicLayout/PublicPageHeader.tsx +178 -0
- package/src/components/PublicLayout/PublicPageLayout.tsx +232 -0
- package/src/components/PublicLayout/PublicPageProvider.tsx +137 -0
- package/src/components/PublicLayout/index.ts +51 -0
- package/src/components/RBAC/PagePermissionGuard.tsx +287 -0
- package/src/components/RBAC/RBACGuard.tsx +143 -0
- package/src/components/RBAC/RBACProvider.tsx +186 -0
- package/src/components/RBAC/RoleBasedContent.tsx +129 -0
- package/src/components/RBAC/index.ts +23 -0
- package/src/components/Select/Select.tsx +660 -0
- package/src/components/Select/index.ts +1 -0
- package/src/components/SuperAdminGuard.tsx +116 -0
- package/src/components/Table/Table.tsx +222 -0
- package/src/components/Table/index.ts +11 -0
- package/src/components/Toast/Toast.tsx +339 -0
- package/src/components/Toast/index.ts +14 -0
- package/src/components/Tooltip/Tooltip.tsx +167 -0
- package/src/components/Tooltip/index.ts +7 -0
- package/src/components/UserMenu/UserMenu.tsx +243 -0
- package/src/components/UserMenu/index.ts +3 -0
- package/src/components/examples/PermissionExample.tsx +150 -0
- package/src/components/index.ts +434 -0
- package/src/components.ts +19 -0
- package/src/constants/performance.ts +14 -0
- package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
- package/src/examples/PublicEventPage.tsx +274 -0
- package/src/examples/PublicPageApp.tsx +308 -0
- package/src/examples/PublicPageUsageExample.tsx +216 -0
- package/src/hooks/index.ts +56 -0
- package/src/hooks/public/index.ts +34 -0
- package/src/hooks/public/usePublicEvent.ts +261 -0
- package/src/hooks/public/usePublicEventLogo.ts +285 -0
- package/src/hooks/public/usePublicRouteParams.ts +259 -0
- package/src/hooks/useAppConfig.ts +94 -0
- package/src/hooks/useComponentPerformance.ts +39 -0
- package/src/hooks/useCounter.test.ts +135 -0
- package/src/hooks/useDataTablePerformance.ts +387 -0
- package/src/hooks/useDataTableState.ts +110 -0
- package/src/hooks/useDebounce.ts +18 -0
- package/src/hooks/useFocusManagement.ts +161 -0
- package/src/hooks/useFocusTrap.ts +155 -0
- package/src/hooks/useInactivityTracker.ts +372 -0
- package/src/hooks/useIsMobile.ts +42 -0
- package/src/hooks/useKeyboardShortcuts.ts +237 -0
- package/src/hooks/useOrganisationPermissions.ts +208 -0
- package/src/hooks/useOrganisationSecurity.ts +262 -0
- package/src/hooks/usePerformanceMonitor.ts +128 -0
- package/src/hooks/usePermissionCache.ts +455 -0
- package/src/hooks/useRBAC.ts +262 -0
- package/src/hooks/useSecureDataAccess.ts +586 -0
- package/src/hooks/useStorage.ts +274 -0
- package/src/hooks/useToast.ts +242 -0
- package/src/hooks/useZodForm.ts +28 -0
- package/src/index.ts +200 -0
- package/src/providers/AuthProvider.tsx +369 -0
- package/src/providers/EventProvider.tsx +324 -0
- package/src/providers/InactivityProvider.tsx +238 -0
- package/src/providers/OrganisationProvider.tsx +588 -0
- package/src/providers/RBACProvider.tsx +634 -0
- package/src/providers/UnifiedAuthProvider.tsx +327 -0
- package/src/providers/index.ts +15 -0
- package/src/rbac/README.md +885 -0
- package/src/rbac/adapters.tsx +726 -0
- package/src/rbac/api.ts +339 -0
- package/src/rbac/audit-enhanced.ts +339 -0
- package/src/rbac/audit.ts +338 -0
- package/src/rbac/cache.ts +215 -0
- package/src/rbac/components/EnhancedNavigationMenu.tsx +294 -0
- package/src/rbac/components/NavigationGuard.tsx +294 -0
- package/src/rbac/components/NavigationProvider.tsx +314 -0
- package/src/rbac/components/PagePermissionGuard.tsx +430 -0
- package/src/rbac/components/PagePermissionProvider.tsx +274 -0
- package/src/rbac/components/PermissionEnforcer.tsx +307 -0
- package/src/rbac/components/RoleBasedRouter.tsx +425 -0
- package/src/rbac/components/SecureDataProvider.tsx +319 -0
- package/src/rbac/components/index.ts +64 -0
- package/src/rbac/config.ts +133 -0
- package/src/rbac/docs/event-based-apps.md +285 -0
- package/src/rbac/engine.ts +1026 -0
- package/src/rbac/eslint-rules.js +285 -0
- package/src/rbac/examples/CompleteRBACExample.tsx +323 -0
- package/src/rbac/examples/EventBasedApp.tsx +238 -0
- package/src/rbac/hooks.ts +570 -0
- package/src/rbac/index.ts +114 -0
- package/src/rbac/permissions.ts +293 -0
- package/src/rbac/secureClient.ts +244 -0
- package/src/rbac/security.ts +346 -0
- package/src/rbac/testing/index.tsx +340 -0
- package/src/rbac/types.ts +343 -0
- package/src/rbac/utils/eventContext.ts +83 -0
- package/src/styles/core.css +422 -0
- package/src/styles/index.ts +51 -0
- package/src/theming/runtime.ts +187 -0
- package/src/types/database.ts +472 -0
- package/src/types/guards.ts +30 -0
- package/src/types/index.ts +25 -0
- package/src/types/organisation.ts +184 -0
- package/src/types/security.ts +70 -0
- package/src/types/supabase.ts +166 -0
- package/src/types/theme.ts +6 -0
- package/src/types/unified.ts +262 -0
- package/src/types/validation.ts +164 -0
- package/src/types/vitest-globals.d.ts +43 -0
- package/src/utils/__mocks__/supabaseMock.ts +75 -0
- package/src/utils/__mocks__/supabaseMock.tsx +198 -0
- package/src/utils/appConfig.ts +47 -0
- package/src/utils/appIdResolver.ts +130 -0
- package/src/utils/appNameResolver.ts +190 -0
- package/src/utils/audit.ts +127 -0
- package/src/utils/auth-utils.ts +96 -0
- package/src/utils/bundleAnalysis.ts +129 -0
- package/src/utils/cn.ts +7 -0
- package/src/utils/debugLogger.ts +46 -0
- package/src/utils/deviceFingerprint.ts +215 -0
- package/src/utils/dynamicUtils.ts +105 -0
- package/src/utils/formatting.ts +77 -0
- package/src/utils/index.ts +145 -0
- package/src/utils/lazyLoad.tsx +44 -0
- package/src/utils/organisationContext.ts +135 -0
- package/src/utils/performanceBenchmark.ts +64 -0
- package/src/utils/performanceBudgets.ts +111 -0
- package/src/utils/permissionTypes.ts +37 -0
- package/src/utils/permissionUtils.ts +31 -0
- package/src/utils/print/PrintDataProcessor.ts +390 -0
- package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +397 -0
- package/src/utils/print/index.ts +29 -0
- package/src/utils/print/types.ts +196 -0
- package/src/utils/print/usePrintOptimization.ts +272 -0
- package/src/utils/sanitization.ts +264 -0
- package/src/utils/schemaUtils.ts +37 -0
- package/src/utils/secureDataAccess.ts +361 -0
- package/src/utils/secureErrors.ts +79 -0
- package/src/utils/secureStorage.ts +244 -0
- package/src/utils/security.ts +156 -0
- package/src/utils/securityMonitor.ts +45 -0
- package/src/utils/sessionTracking.ts +170 -0
- package/src/utils/storage/README.md +348 -0
- package/src/utils/storage/config.ts +100 -0
- package/src/utils/storage/helpers.ts +359 -0
- package/src/utils/storage/index.ts +36 -0
- package/src/utils/storage/types.ts +90 -0
- package/src/utils/validation.ts +111 -0
- package/src/utils/validationUtils.ts +120 -0
- package/src/validation/common.ts +53 -0
- package/src/validation/csrf.ts +214 -0
- package/src/validation/index.ts +43 -0
- package/src/validation/passwordSchema.ts +125 -0
- package/src/validation/sanitization.ts +96 -0
- package/src/validation/schemaUtils.ts +42 -0
- package/src/validation/sqlInjectionProtection.ts +242 -0
- package/src/validation/user.ts +34 -0
- package/dist/UnifiedAuthProvider-V7y63NjT.d.ts +0 -88
- package/dist/chunk-4MCJAK7J.js.map +0 -1
- package/dist/chunk-4ZTIEYU2.js.map +0 -1
- package/dist/chunk-H4PZ4B3Y.js.map +0 -1
- package/dist/chunk-IOX76PSM.js.map +0 -1
- package/dist/chunk-JUUNUW3O.js.map +0 -1
- package/dist/chunk-U7DY5T33.js +0 -11
- package/dist/chunk-U7DY5T33.js.map +0 -1
- package/dist/chunk-WHLSWC6W.js.map +0 -1
- package/dist/chunk-XI7QFSSC.js +0 -790
- package/dist/chunk-XI7QFSSC.js.map +0 -1
- package/dist/chunk-XIJMMBDD.js +0 -73
- package/dist/chunk-XIJMMBDD.js.map +0 -1
- package/dist/chunk-YNU5QJ4S.js.map +0 -1
- package/dist/chunk-YWYCNGWH.js +0 -2070
- package/dist/chunk-YWYCNGWH.js.map +0 -1
- package/dist/chunk-ZJ3UKPIW.js +0 -952
- package/dist/chunk-ZJ3UKPIW.js.map +0 -1
- package/dist/useAppConfig-CZNJJsT_.d.ts +0 -148
- package/dist/{DataTable-2LB6HI6V.js.map → DataTable-GX3XERFJ.js.map} +0 -0
- package/dist/{api-AIJ3IJX3.js.map → api-ETQ6YJ3C.js.map} +0 -0
- package/dist/{audit-PD5L5ZSC.js.map → appNameResolver-7GHF5ED2.js.map} +0 -0
- package/dist/{chunk-DC5AMYBS.js.map → audit-BUW3LMJB.js.map} +0 -0
- package/dist/{validation-D2-NNCCE.d.ts → validation-PM_iOaTI.d.ts} +6 -6
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# Consuming App Vite Configuration
|
|
2
|
+
|
|
3
|
+
This document shows the **CRITICAL** Vite configuration for consuming apps using pace-core with Tailwind v4. Proper configuration is essential to ensure pace-core components are styled correctly.
|
|
4
|
+
|
|
5
|
+
## ⚠️ Critical: Why This Configuration Matters
|
|
6
|
+
|
|
7
|
+
Pace-core components contain Tailwind classes that **MUST** be scanned during the build process. Without proper configuration:
|
|
8
|
+
|
|
9
|
+
- ❌ Component styles will be missing or broken
|
|
10
|
+
- ❌ Colors, spacing, and typography won't work
|
|
11
|
+
- ❌ The UI will be severely compromised
|
|
12
|
+
- ❌ The entire point of using this UI library is undermined
|
|
13
|
+
|
|
14
|
+
## ✅ Solution: CSS-First Approach (v0.4.16+)
|
|
15
|
+
|
|
16
|
+
**NEW**: Pace-core v0.4.16+ uses Tailwind v4's CSS-first approach with `@source` directives in `core.css`. This automatically scans the published source files without requiring complex Vite configuration.
|
|
17
|
+
|
|
18
|
+
### Method 1: CSS-First Configuration (Recommended)
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
// vite.config.ts
|
|
22
|
+
import { defineConfig } from 'vite'
|
|
23
|
+
import react from '@vitejs/plugin-react'
|
|
24
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
25
|
+
import path from 'path'
|
|
26
|
+
|
|
27
|
+
export default defineConfig({
|
|
28
|
+
plugins: [
|
|
29
|
+
react(),
|
|
30
|
+
tailwindcss({
|
|
31
|
+
// Only need to scan your app's source files
|
|
32
|
+
// pace-core source files are automatically scanned via @source directives
|
|
33
|
+
content: [
|
|
34
|
+
'./src/**/*.{js,ts,jsx,tsx}'
|
|
35
|
+
]
|
|
36
|
+
})
|
|
37
|
+
],
|
|
38
|
+
resolve: {
|
|
39
|
+
alias: {
|
|
40
|
+
"@": path.resolve(__dirname, "./src"),
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
server: {
|
|
44
|
+
port: 3000,
|
|
45
|
+
open: true,
|
|
46
|
+
},
|
|
47
|
+
build: {
|
|
48
|
+
outDir: 'dist',
|
|
49
|
+
sourcemap: true,
|
|
50
|
+
},
|
|
51
|
+
})
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Method 2: Explicit Source File Scanning (Fallback)
|
|
55
|
+
|
|
56
|
+
If the CSS-first approach doesn't work, you can explicitly include pace-core source files:
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
// vite.config.ts
|
|
60
|
+
import { defineConfig } from 'vite'
|
|
61
|
+
import react from '@vitejs/plugin-react'
|
|
62
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
63
|
+
import path from 'path'
|
|
64
|
+
|
|
65
|
+
export default defineConfig({
|
|
66
|
+
plugins: [
|
|
67
|
+
react(),
|
|
68
|
+
tailwindcss({
|
|
69
|
+
// Explicitly include pace-core source files for scanning
|
|
70
|
+
content: [
|
|
71
|
+
'./src/**/*.{js,ts,jsx,tsx}',
|
|
72
|
+
'./node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}'
|
|
73
|
+
]
|
|
74
|
+
})
|
|
75
|
+
],
|
|
76
|
+
resolve: {
|
|
77
|
+
alias: {
|
|
78
|
+
"@": path.resolve(__dirname, "./src"),
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
server: {
|
|
82
|
+
port: 3000,
|
|
83
|
+
open: true,
|
|
84
|
+
},
|
|
85
|
+
build: {
|
|
86
|
+
outDir: 'dist',
|
|
87
|
+
sourcemap: true,
|
|
88
|
+
},
|
|
89
|
+
})
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Alternative: PostCSS Configuration
|
|
93
|
+
|
|
94
|
+
If you prefer PostCSS over Vite plugin:
|
|
95
|
+
|
|
96
|
+
```javascript
|
|
97
|
+
// tailwind.config.js
|
|
98
|
+
/** @type {import('tailwindcss').Config} */
|
|
99
|
+
module.exports = {
|
|
100
|
+
content: [
|
|
101
|
+
'./src/**/*.{js,ts,jsx,tsx}',
|
|
102
|
+
'./node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}'
|
|
103
|
+
],
|
|
104
|
+
theme: {
|
|
105
|
+
extend: {},
|
|
106
|
+
},
|
|
107
|
+
plugins: [],
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## 🔄 Fallback: Hybrid Approach
|
|
112
|
+
|
|
113
|
+
If source file scanning doesn't work, try this hybrid approach:
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
// vite.config.ts
|
|
117
|
+
import { defineConfig } from 'vite'
|
|
118
|
+
import react from '@vitejs/plugin-react'
|
|
119
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
120
|
+
|
|
121
|
+
export default defineConfig({
|
|
122
|
+
plugins: [
|
|
123
|
+
react(),
|
|
124
|
+
tailwindcss({
|
|
125
|
+
content: [
|
|
126
|
+
'./src/**/*.{js,ts,jsx,tsx}',
|
|
127
|
+
// Try source files first
|
|
128
|
+
'./node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}',
|
|
129
|
+
// Fallback: also scan dist files
|
|
130
|
+
'./node_modules/@jmruthers/pace-core/dist/**/*.{js,ts,jsx,tsx}'
|
|
131
|
+
]
|
|
132
|
+
})
|
|
133
|
+
],
|
|
134
|
+
})
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## 🚨 Legacy Configuration (v0.4.14 and below)
|
|
138
|
+
|
|
139
|
+
If you're using an older version, use this configuration:
|
|
140
|
+
|
|
141
|
+
```ts
|
|
142
|
+
// vite.config.ts
|
|
143
|
+
import { defineConfig } from 'vite'
|
|
144
|
+
import react from '@vitejs/plugin-react'
|
|
145
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
146
|
+
|
|
147
|
+
export default defineConfig({
|
|
148
|
+
plugins: [
|
|
149
|
+
react(),
|
|
150
|
+
tailwindcss({
|
|
151
|
+
content: [
|
|
152
|
+
'./src/**/*.{js,ts,jsx,tsx}',
|
|
153
|
+
'./node_modules/@jmruthers/pace-core/**/*.{js,ts,jsx,tsx}'
|
|
154
|
+
]
|
|
155
|
+
})
|
|
156
|
+
],
|
|
157
|
+
})
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## What This Configuration Does
|
|
161
|
+
|
|
162
|
+
1. **Scans Your Source Files**: Detects Tailwind classes in your app's source code
|
|
163
|
+
2. **Scans Pace-Core Source Files**: Ensures all Tailwind classes used in pace-core components are included
|
|
164
|
+
3. **Generates Complete CSS**: Creates a CSS file with all necessary utility classes
|
|
165
|
+
4. **Enables Proper Styling**: Allows pace-core components to render with correct styles
|
|
166
|
+
|
|
167
|
+
## Verification Steps
|
|
168
|
+
|
|
169
|
+
After configuration, verify everything works:
|
|
170
|
+
|
|
171
|
+
1. **Import the CSS file** in your main entry point:
|
|
172
|
+
```tsx
|
|
173
|
+
import '@jmruthers/pace-core/styles/core.css';
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
2. **Create a test component**:
|
|
177
|
+
```tsx
|
|
178
|
+
import { Button, Card } from '@jmruthers/pace-core';
|
|
179
|
+
|
|
180
|
+
function TestComponent() {
|
|
181
|
+
return (
|
|
182
|
+
<Card className="p-4">
|
|
183
|
+
<Button variant="primary" className="bg-main-600 text-main-50">
|
|
184
|
+
Test Button
|
|
185
|
+
</Button>
|
|
186
|
+
</Card>
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
3. **Check the result**: The component should render with proper PACE Core styling
|
|
192
|
+
|
|
193
|
+
4. **Verify CSS size**: Your CSS file should be 50-100+ kB (not 20-30 kB)
|
|
194
|
+
|
|
195
|
+
## Common Issues and Solutions
|
|
196
|
+
|
|
197
|
+
### Issue: Components appear unstyled
|
|
198
|
+
**Solution**: Ensure pace-core source files are included in content scanning
|
|
199
|
+
|
|
200
|
+
### Issue: Colors don't work (text-main-900, bg-sec-500, etc.)
|
|
201
|
+
**Solution**: Verify the CSS file is imported and content scanning includes pace-core source files
|
|
202
|
+
|
|
203
|
+
### Issue: Build errors about missing classes
|
|
204
|
+
**Solution**: Check that your content paths are correct and include both source files and pace-core source files
|
|
205
|
+
|
|
206
|
+
### Issue: Still only 292 CSS rules instead of 800+
|
|
207
|
+
**Solution**:
|
|
208
|
+
1. Update to pace-core v0.4.15+
|
|
209
|
+
2. Use source file paths: `./node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}`
|
|
210
|
+
3. Clear build cache and rebuild
|
|
211
|
+
|
|
212
|
+
### Issue: Source files not found
|
|
213
|
+
**Solution**: Ensure you're using pace-core v0.4.15+ which includes source files in the published package
|
|
214
|
+
|
|
215
|
+
## Key Points
|
|
216
|
+
|
|
217
|
+
- ✅ **Required**: Must include pace-core source files in content scanning
|
|
218
|
+
- ✅ **Critical**: Without this, components won't be styled
|
|
219
|
+
- ✅ **Simple**: Just add the source file paths to your content array
|
|
220
|
+
- ✅ **Reliable**: Works with any project structure when configured correctly
|
|
221
|
+
|
|
222
|
+
## What NOT to Do
|
|
223
|
+
|
|
224
|
+
- ❌ **Don't skip content configuration** - pace-core won't be scanned
|
|
225
|
+
- ❌ **Don't rely on automatic scanning only** - it may not catch node_modules
|
|
226
|
+
- ❌ **Don't forget to import the CSS file** - styles won't be available
|
|
227
|
+
- ❌ **Don't assume it works without testing** - always verify with a test component
|
|
228
|
+
|
|
229
|
+
## Next Steps
|
|
230
|
+
|
|
231
|
+
- [Installation Guide](./getting-started/installation.md) - Complete setup instructions
|
|
232
|
+
- [Tailwind Content Scanning Guide](./troubleshooting/tailwind-content-scanning.md) - Detailed troubleshooting
|
|
233
|
+
- [Troubleshooting Guide](./troubleshooting/styling-issues.md) - Fix common problems
|
|
@@ -492,15 +492,15 @@ function EventStatusIndicator() {
|
|
|
492
492
|
const status = getEventStatus(selectedEvent.event_date);
|
|
493
493
|
const statusConfig = {
|
|
494
494
|
past: { label: 'Past Event', color: 'text-muted-foreground' },
|
|
495
|
-
today: { label: 'Today', color: 'text-
|
|
496
|
-
upcoming: { label: 'Upcoming', color: 'text-
|
|
495
|
+
today: { label: 'Today', color: 'text-main-600' },
|
|
496
|
+
upcoming: { label: 'Upcoming', color: 'text-main-600' },
|
|
497
497
|
};
|
|
498
498
|
|
|
499
499
|
return (
|
|
500
500
|
<div className={`flex items-center space-x-2 ${statusConfig[status].color}`}>
|
|
501
501
|
<div className={`w-2 h-2 rounded-full ${
|
|
502
502
|
status === 'past' ? 'bg-muted' :
|
|
503
|
-
status === 'today' ? 'bg-
|
|
503
|
+
status === 'today' ? 'bg-main-500' : 'bg-main-500'
|
|
504
504
|
}`} />
|
|
505
505
|
<span className="text-sm font-medium">
|
|
506
506
|
{statusConfig[status].label}
|
|
@@ -62,12 +62,12 @@ Permissions define specific actions users can perform on resources.
|
|
|
62
62
|
- **settings** - Configuration management
|
|
63
63
|
|
|
64
64
|
#### Permission Examples
|
|
65
|
-
- `
|
|
66
|
-
- `
|
|
67
|
-
- `
|
|
68
|
-
- `
|
|
69
|
-
- `
|
|
70
|
-
- `
|
|
65
|
+
- `read:page.dashboard` - View dashboard page
|
|
66
|
+
- `create:page.users` - Create users on users page
|
|
67
|
+
- `update:page.settings` - Modify settings page
|
|
68
|
+
- `delete:page.admin` - Remove content from admin page
|
|
69
|
+
- `manage:page.system` - Full system page management
|
|
70
|
+
- `read:events` - View event information (event-app permission)
|
|
71
71
|
|
|
72
72
|
### Permission Hierarchy
|
|
73
73
|
|
|
@@ -75,16 +75,20 @@ Permissions follow a hierarchical structure based on organisation roles:
|
|
|
75
75
|
|
|
76
76
|
```
|
|
77
77
|
Organisation Admin
|
|
78
|
-
├── All permissions (
|
|
78
|
+
├── All page permissions (read:page.*, create:page.*, update:page.*, delete:page.*, manage:page.*)
|
|
79
|
+
├── All event-app permissions (read:events, create:events, update:events, delete:events)
|
|
79
80
|
|
|
80
81
|
Leader
|
|
81
|
-
├──
|
|
82
|
+
├── Most page permissions (read:page.*, create:page.*, update:page.*)
|
|
83
|
+
├── Event management (read:events, create:events, update:events)
|
|
82
84
|
|
|
83
85
|
Member
|
|
84
|
-
├──
|
|
86
|
+
├── Basic page permissions (read:page.dashboard, read:page.users)
|
|
87
|
+
├── Basic event access (read:events)
|
|
85
88
|
|
|
86
89
|
Supporter
|
|
87
|
-
├──
|
|
90
|
+
├── Limited page permissions (read:page.dashboard)
|
|
91
|
+
├── No event access
|
|
88
92
|
```
|
|
89
93
|
|
|
90
94
|
### Role-Based Permission Mapping
|
|
@@ -150,6 +154,15 @@ Permissions can be scoped to specific resources:
|
|
|
150
154
|
|
|
151
155
|
## Security Features
|
|
152
156
|
|
|
157
|
+
### Database-First Architecture
|
|
158
|
+
|
|
159
|
+
The RBAC system uses a **database-first architecture** where all permission logic resides in PostgreSQL functions:
|
|
160
|
+
|
|
161
|
+
- **RPC Functions** - All permission checks use `get_rbac_permissions()` RPC function
|
|
162
|
+
- **RLS Protection** - Direct table access is blocked by Row Level Security policies
|
|
163
|
+
- **Elevated Privileges** - RPC functions run with elevated privileges to bypass RLS
|
|
164
|
+
- **Single Source of Truth** - All permission logic centralized in database functions
|
|
165
|
+
|
|
153
166
|
### Permission Validation
|
|
154
167
|
|
|
155
168
|
- **Runtime Checking** - Permissions are validated on every request
|
|
@@ -20,7 +20,10 @@ Comprehensive checklist for maintaining consistent, high-quality documentation a
|
|
|
20
20
|
// ✅ Good - Complete, runnable example
|
|
21
21
|
import React, { useState } from 'react';
|
|
22
22
|
import { DataTable, Button } from '@jmruthers/pace-core';
|
|
23
|
-
|
|
23
|
+
|
|
24
|
+
// Import the core CSS file (in your app's entry point)
|
|
25
|
+
import './app.css'; // Your app's color palette (must come first)
|
|
26
|
+
import '@jmruthers/pace-core/styles/core.css';
|
|
24
27
|
|
|
25
28
|
interface User {
|
|
26
29
|
id: string;
|
|
@@ -119,7 +122,10 @@ function MyComponent() {
|
|
|
119
122
|
// ✅ Good - Complete imports
|
|
120
123
|
import React, { useState, useEffect } from 'react';
|
|
121
124
|
import { DataTable, Button, useUnifiedAuth } from '@jmruthers/pace-core';
|
|
122
|
-
|
|
125
|
+
|
|
126
|
+
// Import the core CSS file (in your app's entry point)
|
|
127
|
+
import './app.css'; // Your app's color palette (must come first)
|
|
128
|
+
import '@jmruthers/pace-core/styles/core.css';
|
|
123
129
|
|
|
124
130
|
// ❌ Bad - Incomplete imports
|
|
125
131
|
import { DataTable } from '@jmruthers/pace-core';
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
# NavigationMenu Authentication Fix Example
|
|
2
|
+
|
|
3
|
+
This example shows how to fix the NavigationMenu authentication context issue reported in the bug report.
|
|
4
|
+
|
|
5
|
+
## Problem
|
|
6
|
+
|
|
7
|
+
The consuming app was getting `permissions: undefined`, `roles: undefined`, `accessLevel: undefined` in console logs from the NavigationMenu component.
|
|
8
|
+
|
|
9
|
+
## Root Cause
|
|
10
|
+
|
|
11
|
+
The NavigationMenu component was not properly connected to the authentication context from `useUnifiedAuth`.
|
|
12
|
+
|
|
13
|
+
## Solution
|
|
14
|
+
|
|
15
|
+
### 1. Updated NavigationMenu Component
|
|
16
|
+
|
|
17
|
+
The NavigationMenu component now properly uses the authentication context:
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
// packages/core/src/components/NavigationMenu/NavigationMenu.tsx
|
|
21
|
+
import { useUnifiedAuth } from "../../providers/UnifiedAuthProvider";
|
|
22
|
+
|
|
23
|
+
export const NavigationMenu = React.forwardRef<HTMLDivElement, NavigationMenuProps>(({
|
|
24
|
+
items,
|
|
25
|
+
filterByPermissions = true,
|
|
26
|
+
auditLog = true,
|
|
27
|
+
...props
|
|
28
|
+
}, ref) => {
|
|
29
|
+
// Get authentication context
|
|
30
|
+
const authContext = React.useMemo(() => {
|
|
31
|
+
try {
|
|
32
|
+
return useUnifiedAuth();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.warn('[NavigationMenu] useUnifiedAuth not available, running in unauthenticated mode');
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}, []);
|
|
38
|
+
|
|
39
|
+
// Filter navigation items based on permissions
|
|
40
|
+
const filteredItems = React.useMemo(() => {
|
|
41
|
+
if (!filterByPermissions || !authContext) return items;
|
|
42
|
+
|
|
43
|
+
return items.filter(item => {
|
|
44
|
+
// Check permissions if available
|
|
45
|
+
if (item.permissions && item.permissions.length > 0) {
|
|
46
|
+
const hasPermission = item.permissions.some(permission =>
|
|
47
|
+
authContext.hasPermission(permission)
|
|
48
|
+
);
|
|
49
|
+
if (!hasPermission) return false;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Check roles if available
|
|
53
|
+
if (item.roles && item.roles.length > 0) {
|
|
54
|
+
const hasRole = item.roles.some(role =>
|
|
55
|
+
authContext.hasRole(role)
|
|
56
|
+
);
|
|
57
|
+
if (!hasRole) return false;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return true;
|
|
61
|
+
});
|
|
62
|
+
}, [items, filterByPermissions, authContext]);
|
|
63
|
+
|
|
64
|
+
// Log navigation access attempts for debugging
|
|
65
|
+
React.useEffect(() => {
|
|
66
|
+
if (auditLog && authContext) {
|
|
67
|
+
console.log('[NavigationMenu] Navigation access attempt:', {
|
|
68
|
+
itemId: 'navigation-menu',
|
|
69
|
+
label: 'Navigation Menu',
|
|
70
|
+
href: currentPath,
|
|
71
|
+
permissions: authContext.permissions,
|
|
72
|
+
roles: authContext.roles,
|
|
73
|
+
accessLevel: authContext.accessLevel,
|
|
74
|
+
timestamp: new Date().toISOString()
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}, [auditLog, authContext, currentPath]);
|
|
78
|
+
|
|
79
|
+
// ... rest of component
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 2. Updated NavigationItem Type
|
|
84
|
+
|
|
85
|
+
Navigation items now support permission requirements:
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
interface NavigationItem {
|
|
89
|
+
id: string;
|
|
90
|
+
label: string;
|
|
91
|
+
href?: string;
|
|
92
|
+
icon?: string;
|
|
93
|
+
children?: NavigationItem[];
|
|
94
|
+
isActive?: boolean;
|
|
95
|
+
permissions?: string[];
|
|
96
|
+
roles?: string[];
|
|
97
|
+
accessLevel?: string;
|
|
98
|
+
pageId?: string;
|
|
99
|
+
strictMode?: boolean;
|
|
100
|
+
meta?: {
|
|
101
|
+
title?: string;
|
|
102
|
+
description?: string;
|
|
103
|
+
hidden?: boolean;
|
|
104
|
+
order?: number;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 3. Correct App Structure
|
|
110
|
+
|
|
111
|
+
The consuming app should use this structure:
|
|
112
|
+
|
|
113
|
+
```tsx
|
|
114
|
+
// App.tsx
|
|
115
|
+
import React from 'react';
|
|
116
|
+
import { BrowserRouter, Routes, Route } from 'react-router-dom';
|
|
117
|
+
import {
|
|
118
|
+
UnifiedAuthProvider,
|
|
119
|
+
OrganisationProvider,
|
|
120
|
+
EventProvider,
|
|
121
|
+
PaceAppLayout
|
|
122
|
+
} from '@jmruthers/pace-core';
|
|
123
|
+
import { supabase } from './integrations/supabase/client';
|
|
124
|
+
import { AuthenticatedApp } from './AuthenticatedApp';
|
|
125
|
+
|
|
126
|
+
function App() {
|
|
127
|
+
return (
|
|
128
|
+
<BrowserRouter>
|
|
129
|
+
<Routes>
|
|
130
|
+
<Route path="/*" element={
|
|
131
|
+
<UnifiedAuthProvider supabaseClient={supabase} appName="CAKE">
|
|
132
|
+
<OrganisationProvider>
|
|
133
|
+
<EventProvider>
|
|
134
|
+
<AuthenticatedApp />
|
|
135
|
+
</EventProvider>
|
|
136
|
+
</OrganisationProvider>
|
|
137
|
+
</UnifiedAuthProvider>
|
|
138
|
+
} />
|
|
139
|
+
</Routes>
|
|
140
|
+
</BrowserRouter>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export default App;
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 4. Updated AuthenticatedApp
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
// AuthenticatedApp.tsx
|
|
151
|
+
import React from 'react';
|
|
152
|
+
import { Routes, Route } from 'react-router-dom';
|
|
153
|
+
import {
|
|
154
|
+
useUnifiedAuth,
|
|
155
|
+
PaceAppLayout,
|
|
156
|
+
NavigationItem,
|
|
157
|
+
PaceLoginPage
|
|
158
|
+
} from "@jmruthers/pace-core";
|
|
159
|
+
|
|
160
|
+
export function AuthenticatedApp() {
|
|
161
|
+
const { isAuthenticated, user, isLoading, accessLevel, roles } = useUnifiedAuth();
|
|
162
|
+
|
|
163
|
+
if (!isAuthenticated) {
|
|
164
|
+
return <PaceLoginPage appName="CAKE" />;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Define navigation items with permission requirements
|
|
168
|
+
const navItems: NavigationItem[] = [
|
|
169
|
+
{
|
|
170
|
+
id: 'meals',
|
|
171
|
+
label: 'Meals',
|
|
172
|
+
href: '/meals',
|
|
173
|
+
permissions: ['meals:read']
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: 'dishes',
|
|
177
|
+
label: 'Dishes',
|
|
178
|
+
href: '/dishes',
|
|
179
|
+
permissions: ['dishes:read']
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
id: 'items',
|
|
183
|
+
label: 'Items',
|
|
184
|
+
href: '/items',
|
|
185
|
+
permissions: ['items:read']
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: 'diners',
|
|
189
|
+
label: 'Diners',
|
|
190
|
+
href: '/diners',
|
|
191
|
+
permissions: ['diners:read']
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
id: 'menus',
|
|
195
|
+
label: 'Menus',
|
|
196
|
+
href: '/menus',
|
|
197
|
+
permissions: ['menus:read']
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
id: 'distribution',
|
|
201
|
+
label: 'Distribution',
|
|
202
|
+
href: '/distribution',
|
|
203
|
+
permissions: ['distribution:read']
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: 'suppliers',
|
|
207
|
+
label: 'Suppliers',
|
|
208
|
+
href: '/suppliers',
|
|
209
|
+
permissions: ['suppliers:read']
|
|
210
|
+
},
|
|
211
|
+
];
|
|
212
|
+
|
|
213
|
+
return (
|
|
214
|
+
<PaceAppLayout
|
|
215
|
+
key="main-layout"
|
|
216
|
+
appName="CAKE"
|
|
217
|
+
navItems={navItems}
|
|
218
|
+
showEventSelector={true}
|
|
219
|
+
>
|
|
220
|
+
<Routes>
|
|
221
|
+
<Route index element={<div>Meals Page</div>} />
|
|
222
|
+
<Route path="meals" element={<div>Meals Page</div>} />
|
|
223
|
+
<Route path="dishes" element={<div>Dishes Page</div>} />
|
|
224
|
+
<Route path="items" element={<div>Items Page</div>} />
|
|
225
|
+
<Route path="diners" element={<div>Diners Page</div>} />
|
|
226
|
+
<Route path="menus" element={<div>Menus Page</div>} />
|
|
227
|
+
<Route path="distribution" element={<div>Distribution Page</div>} />
|
|
228
|
+
<Route path="suppliers" element={<div>Suppliers Page</div>} />
|
|
229
|
+
<Route path="*" element={<div>Not Found</div>} />
|
|
230
|
+
</Routes>
|
|
231
|
+
</PaceAppLayout>
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### 5. Alternative: Direct NavigationMenu Usage
|
|
237
|
+
|
|
238
|
+
If you want to use NavigationMenu directly without PaceAppLayout:
|
|
239
|
+
|
|
240
|
+
```tsx
|
|
241
|
+
import { NavigationMenu } from '@jmruthers/pace-core';
|
|
242
|
+
import { useUnifiedAuth } from '@jmruthers/pace-core/providers';
|
|
243
|
+
|
|
244
|
+
function CustomNavigation() {
|
|
245
|
+
const { hasPermission, hasRole } = useUnifiedAuth();
|
|
246
|
+
|
|
247
|
+
const navItems: NavigationItem[] = [
|
|
248
|
+
{
|
|
249
|
+
id: 'meals',
|
|
250
|
+
label: 'Meals',
|
|
251
|
+
href: '/meals',
|
|
252
|
+
permissions: ['meals:read']
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
id: 'admin',
|
|
256
|
+
label: 'Admin Panel',
|
|
257
|
+
href: '/admin',
|
|
258
|
+
roles: ['admin', 'super_admin']
|
|
259
|
+
}
|
|
260
|
+
];
|
|
261
|
+
|
|
262
|
+
return (
|
|
263
|
+
<NavigationMenu
|
|
264
|
+
items={navItems}
|
|
265
|
+
currentPath={location.pathname}
|
|
266
|
+
onNavigate={(item) => navigate(item.href)}
|
|
267
|
+
buttonText="Menu"
|
|
268
|
+
filterByPermissions={true}
|
|
269
|
+
auditLog={true}
|
|
270
|
+
/>
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Expected Results
|
|
276
|
+
|
|
277
|
+
After implementing this fix:
|
|
278
|
+
|
|
279
|
+
1. **Console logs will show proper authentication context**:
|
|
280
|
+
```javascript
|
|
281
|
+
[NavigationMenu] Navigation access attempt: {
|
|
282
|
+
itemId: "navigation-menu",
|
|
283
|
+
label: "Navigation Menu",
|
|
284
|
+
href: "/meals",
|
|
285
|
+
permissions: { "meals:read": true, "dishes:read": true },
|
|
286
|
+
roles: ["user", "admin"],
|
|
287
|
+
accessLevel: "super",
|
|
288
|
+
timestamp: "2025-10-06T04:38:15.2012"
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
2. **Navigation items will be filtered based on permissions**:
|
|
293
|
+
- Items with `permissions: ['meals:read']` will only show if user has that permission
|
|
294
|
+
- Items with `roles: ['admin']` will only show if user has that role
|
|
295
|
+
|
|
296
|
+
3. **No more "useUnifiedAuth not available" warnings**
|
|
297
|
+
|
|
298
|
+
## Testing
|
|
299
|
+
|
|
300
|
+
To test the fix:
|
|
301
|
+
|
|
302
|
+
1. **Check console logs**: Should show proper authentication context
|
|
303
|
+
2. **Test permission filtering**: Remove permissions from user and verify items are hidden
|
|
304
|
+
3. **Test role filtering**: Change user roles and verify admin items show/hide
|
|
305
|
+
4. **Test audit logging**: Enable `auditLog={true}` and verify logs are generated
|
|
306
|
+
|
|
307
|
+
## Migration Guide
|
|
308
|
+
|
|
309
|
+
If you're updating from the old NavigationMenu:
|
|
310
|
+
|
|
311
|
+
1. **Add permission requirements to navigation items**:
|
|
312
|
+
```tsx
|
|
313
|
+
// Old way
|
|
314
|
+
const navItems = [
|
|
315
|
+
{ id: 'meals', label: 'Meals', href: '/meals' }
|
|
316
|
+
];
|
|
317
|
+
|
|
318
|
+
// New way
|
|
319
|
+
const navItems = [
|
|
320
|
+
{ id: 'meals', label: 'Meals', href: '/meals', permissions: ['meals:read'] }
|
|
321
|
+
];
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
2. **Enable permission filtering**:
|
|
325
|
+
```tsx
|
|
326
|
+
<NavigationMenu
|
|
327
|
+
items={navItems}
|
|
328
|
+
filterByPermissions={true}
|
|
329
|
+
auditLog={true}
|
|
330
|
+
/>
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
3. **Ensure proper provider hierarchy**:
|
|
334
|
+
```tsx
|
|
335
|
+
<UnifiedAuthProvider>
|
|
336
|
+
<OrganisationProvider>
|
|
337
|
+
<EventProvider>
|
|
338
|
+
<NavigationMenu items={navItems} />
|
|
339
|
+
</EventProvider>
|
|
340
|
+
</OrganisationProvider>
|
|
341
|
+
</UnifiedAuthProvider>
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
This fix resolves the authentication context issue and provides proper permission-based navigation filtering.
|