@jmruthers/pace-core 0.2.4
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 +202 -0
- package/README.md +299 -0
- package/dist/DataTable-BHlzyKZP.d.ts +116 -0
- package/dist/DataTable-GEY5U7OI.js +100 -0
- package/dist/DataTable-GEY5U7OI.js.map +1 -0
- package/dist/PublicLoadingSpinner-DztrzuJr.d.ts +3430 -0
- package/dist/UnifiedAuthProvider-w66zSCUf.d.ts +160 -0
- package/dist/api-GZHIDA4X.js +41 -0
- package/dist/api-GZHIDA4X.js.map +1 -0
- package/dist/appConfig-BVGyuvI7.d.ts +71 -0
- package/dist/appNameResolver-7GHF5ED2.js +22 -0
- package/dist/appNameResolver-7GHF5ED2.js.map +1 -0
- package/dist/audit-BUW3LMJB.js +16 -0
- package/dist/audit-BUW3LMJB.js.map +1 -0
- package/dist/chunk-22KLBHPS.js +29 -0
- package/dist/chunk-22KLBHPS.js.map +1 -0
- package/dist/chunk-24MKLB7U.js +81 -0
- package/dist/chunk-24MKLB7U.js.map +1 -0
- package/dist/chunk-2MKP6IYD.js +388 -0
- package/dist/chunk-2MKP6IYD.js.map +1 -0
- package/dist/chunk-2V3Y6YBC.js +114 -0
- package/dist/chunk-2V3Y6YBC.js.map +1 -0
- package/dist/chunk-5CDJCTOO.js +190 -0
- package/dist/chunk-5CDJCTOO.js.map +1 -0
- package/dist/chunk-6ZQVSHKL.js +1345 -0
- package/dist/chunk-6ZQVSHKL.js.map +1 -0
- package/dist/chunk-74C6SNEC.js +77 -0
- package/dist/chunk-74C6SNEC.js.map +1 -0
- package/dist/chunk-7BNPOCLL.js +178 -0
- package/dist/chunk-7BNPOCLL.js.map +1 -0
- package/dist/chunk-7JL3T7BO.js +3344 -0
- package/dist/chunk-7JL3T7BO.js.map +1 -0
- package/dist/chunk-CDQ3PX7L.js +18 -0
- package/dist/chunk-CDQ3PX7L.js.map +1 -0
- package/dist/chunk-DY5E3AT7.js +1734 -0
- package/dist/chunk-DY5E3AT7.js.map +1 -0
- package/dist/chunk-ETEJVKYK.js +6032 -0
- package/dist/chunk-ETEJVKYK.js.map +1 -0
- package/dist/chunk-I5Z3QH5X.js +32 -0
- package/dist/chunk-I5Z3QH5X.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-OHXGNT3K.js +21 -0
- package/dist/chunk-OHXGNT3K.js.map +1 -0
- package/dist/chunk-OKXMUYIB.js +522 -0
- package/dist/chunk-OKXMUYIB.js.map +1 -0
- package/dist/chunk-PFRRIDYA.js +382 -0
- package/dist/chunk-PFRRIDYA.js.map +1 -0
- package/dist/chunk-PLDDJCW6.js +49 -0
- package/dist/chunk-PLDDJCW6.js.map +1 -0
- package/dist/chunk-SS3E6QLB.js +695 -0
- package/dist/chunk-SS3E6QLB.js.map +1 -0
- package/dist/chunk-TMRLB2LA.js +326 -0
- package/dist/chunk-TMRLB2LA.js.map +1 -0
- package/dist/chunk-WYB6MBZA.js +5533 -0
- package/dist/chunk-WYB6MBZA.js.map +1 -0
- package/dist/chunk-YDJW5XTN.js +84 -0
- package/dist/chunk-YDJW5XTN.js.map +1 -0
- package/dist/components.d.ts +1308 -0
- package/dist/components.js +3759 -0
- package/dist/components.js.map +1 -0
- package/dist/database-C3Szpi5J.d.ts +470 -0
- package/dist/hooks.d.ts +449 -0
- package/dist/hooks.js +612 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +385 -0
- package/dist/index.js +569 -0
- package/dist/index.js.map +1 -0
- package/dist/organisation-CO3Sh3_D.d.ts +99 -0
- package/dist/providers.d.ts +45 -0
- package/dist/providers.js +36 -0
- package/dist/providers.js.map +1 -0
- package/dist/rbac/eslint-rules.d.ts +52 -0
- package/dist/rbac/eslint-rules.js +252 -0
- package/dist/rbac/eslint-rules.js.map +1 -0
- package/dist/rbac/index.d.ts +1918 -0
- package/dist/rbac/index.js +2212 -0
- package/dist/rbac/index.js.map +1 -0
- package/dist/styles/core.css +401 -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-CInEi-ng.d.ts +316 -0
- package/dist/types.d.ts +196 -0
- package/dist/types.js +83 -0
- package/dist/types.js.map +1 -0
- package/dist/unified-CM7T0aTK.d.ts +198 -0
- package/dist/useComponentPerformance-DE9l5RkL.d.ts +11 -0
- package/dist/usePublicRouteParams-B6i0KtXW.d.ts +477 -0
- package/dist/utils.d.ts +639 -0
- package/dist/utils.js +1103 -0
- package/dist/utils.js.map +1 -0
- package/dist/validation-PM_iOaTI.d.ts +159 -0
- package/dist/validation.d.ts +138 -0
- package/dist/validation.js +477 -0
- package/dist/validation.js.map +1 -0
- package/docs/INDEX.md +192 -0
- package/docs/README.md +165 -0
- package/docs/api/.nojekyll +1 -0
- package/docs/api/README.md +301 -0
- package/docs/api/classes/ErrorBoundary.md +144 -0
- package/docs/api/classes/PublicErrorBoundary.md +132 -0
- package/docs/api/interfaces/AggregateConfig.md +43 -0
- package/docs/api/interfaces/ButtonProps.md +53 -0
- package/docs/api/interfaces/CardProps.md +40 -0
- package/docs/api/interfaces/ColorPalette.md +7 -0
- package/docs/api/interfaces/ColorShade.md +41 -0
- package/docs/api/interfaces/DataTableAction.md +200 -0
- package/docs/api/interfaces/DataTableColumn.md +300 -0
- package/docs/api/interfaces/DataTableProps.md +517 -0
- package/docs/api/interfaces/DataTableToolbarButton.md +96 -0
- package/docs/api/interfaces/EmptyStateConfig.md +61 -0
- package/docs/api/interfaces/EventContextType.md +96 -0
- package/docs/api/interfaces/EventLogoProps.md +152 -0
- package/docs/api/interfaces/EventProviderProps.md +19 -0
- package/docs/api/interfaces/FileSizeLimits.md +7 -0
- package/docs/api/interfaces/FileUploadProps.md +154 -0
- package/docs/api/interfaces/FooterProps.md +105 -0
- package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
- package/docs/api/interfaces/InputProps.md +53 -0
- package/docs/api/interfaces/LabelProps.md +107 -0
- package/docs/api/interfaces/LoginFormProps.md +184 -0
- package/docs/api/interfaces/NavigationItem.md +176 -0
- package/docs/api/interfaces/NavigationMenuProps.md +236 -0
- package/docs/api/interfaces/Organisation.md +140 -0
- package/docs/api/interfaces/OrganisationContextType.md +377 -0
- package/docs/api/interfaces/OrganisationMembership.md +140 -0
- package/docs/api/interfaces/OrganisationProviderProps.md +19 -0
- package/docs/api/interfaces/OrganisationSecurityError.md +62 -0
- package/docs/api/interfaces/PaceAppLayoutProps.md +393 -0
- package/docs/api/interfaces/PaceLoginPageProps.md +34 -0
- package/docs/api/interfaces/PaletteData.md +41 -0
- 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 +19 -0
- package/docs/api/interfaces/ToastActionElement.md +9 -0
- package/docs/api/interfaces/ToastProps.md +9 -0
- package/docs/api/interfaces/UnifiedAuthContextType.md +1108 -0
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +171 -0
- 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 +118 -0
- package/docs/api/interfaces/UserMenuProps.md +86 -0
- package/docs/api/interfaces/UserProfile.md +63 -0
- package/docs/api/modules.md +4153 -0
- package/docs/api-reference/components.md +1623 -0
- package/docs/api-reference/hooks.md +627 -0
- package/docs/api-reference/providers.md +487 -0
- package/docs/api-reference/types.md +1005 -0
- package/docs/api-reference/utilities.md +1104 -0
- package/docs/app.css.example +53 -0
- package/docs/architecture/README.md +577 -0
- package/docs/best-practices/README.md +400 -0
- package/docs/best-practices/deployment.md +1042 -0
- package/docs/best-practices/performance.md +789 -0
- package/docs/best-practices/security.md +881 -0
- package/docs/best-practices/testing.md +981 -0
- package/docs/consuming-app-example.md +290 -0
- package/docs/consuming-app-vite-config.md +233 -0
- package/docs/core-concepts/authentication.md +98 -0
- package/docs/core-concepts/events.md +756 -0
- package/docs/core-concepts/organisations.md +790 -0
- package/docs/core-concepts/permissions.md +729 -0
- package/docs/core-concepts/rbac-system.md +233 -0
- package/docs/database-schema-requirements.md +172 -0
- package/docs/documentation-style-checklist.md +294 -0
- package/docs/examples/navigation-menu-auth-fix.md +344 -0
- package/docs/getting-started/examples/README.md +106 -0
- package/docs/getting-started/examples/basic-auth-app.md +521 -0
- package/docs/getting-started/examples/full-featured-app.md +616 -0
- package/docs/getting-started/installation.md +269 -0
- package/docs/getting-started/quick-start.md +401 -0
- package/docs/implementation-guides/app-layout.md +983 -0
- package/docs/implementation-guides/data-tables.md +1898 -0
- package/docs/implementation-guides/dynamic-colors.md +195 -0
- package/docs/implementation-guides/forms.md +578 -0
- package/docs/implementation-guides/hierarchical-datatable.md +850 -0
- package/docs/implementation-guides/large-datasets.md +281 -0
- package/docs/implementation-guides/navigation.md +844 -0
- package/docs/implementation-guides/performance.md +403 -0
- package/docs/implementation-guides/permission-enforcement.md +764 -0
- package/docs/implementation-guides/public-pages.md +752 -0
- package/docs/migration/README.md +493 -0
- package/docs/migration/organisation-context-timing-fix.md +217 -0
- package/docs/migration/quick-migration-guide.md +320 -0
- package/docs/migration/rbac-migration.md +571 -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 +168 -0
- package/docs/performance/README.md +551 -0
- 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 +576 -0
- package/docs/rbac/README.md +265 -0
- package/docs/rbac/advanced-patterns.md +776 -0
- package/docs/rbac/api-reference.md +1033 -0
- package/docs/rbac/examples.md +883 -0
- package/docs/rbac/getting-started.md +679 -0
- package/docs/rbac/quick-start.md +619 -0
- package/docs/rbac/super-admin-guide.md +592 -0
- package/docs/rbac/troubleshooting.md +316 -0
- package/docs/security/README.md +680 -0
- package/docs/security/checklist.md +343 -0
- package/docs/style-guide.md +522 -0
- package/docs/styles/README.md +319 -0
- package/docs/testing/README.md +874 -0
- package/docs/troubleshooting/README.md +497 -0
- package/docs/troubleshooting/common-issues.md +1563 -0
- package/docs/troubleshooting/database-view-compatibility.md +119 -0
- package/docs/troubleshooting/debugging.md +1117 -0
- package/docs/troubleshooting/migration.md +918 -0
- package/docs/troubleshooting/organisation-context-setup.md +277 -0
- package/docs/troubleshooting/react-hooks-issue-analysis.md +166 -0
- package/docs/troubleshooting/styling-issues.md +219 -0
- package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
- package/docs/usage.md +175 -0
- package/docs/visual-testing.md +114 -0
- package/package.json +211 -0
- package/src/__mocks__/lucide-react.ts +181 -0
- package/src/__tests__/README.md +404 -0
- package/src/__tests__/debug-provider.unit.test.tsx +67 -0
- package/src/__tests__/e2e/workflows.test.tsx +373 -0
- package/src/__tests__/hybridPermissions.unit.test.tsx +474 -0
- package/src/__tests__/index.integration.test.ts +491 -0
- package/src/__tests__/mocks/MockAuthProvider-standalone.tsx +47 -0
- package/src/__tests__/mocks/MockAuthProvider.tsx +63 -0
- package/src/__tests__/mocks/enhancedSupabaseMock.ts +252 -0
- package/src/__tests__/mocks/index.test.ts +23 -0
- package/src/__tests__/mocks/index.ts +16 -0
- package/src/__tests__/mocks/mockAuth.ts +155 -0
- package/src/__tests__/mocks/mockSupabase.ts +83 -0
- package/src/__tests__/mocks/mockSupabaseClient.ts +63 -0
- package/src/__tests__/mocks/providers.tsx +22 -0
- package/src/__tests__/patterns/__tests__/testPatterns.test.ts +394 -0
- package/src/__tests__/patterns/testPatterns.ts +124 -0
- package/src/__tests__/performance/componentPerformance.performance.test.ts +27 -0
- package/src/__tests__/performance/index.ts +24 -0
- package/src/__tests__/performance/performanceValidation.performance.test.ts +15 -0
- package/src/__tests__/security/security.unit.test.tsx +7 -0
- package/src/__tests__/security/securityValidation.security.test.tsx +153 -0
- package/src/__tests__/setup.ts +259 -0
- package/src/__tests__/setupTests.d.ts +1 -0
- package/src/__tests__/shared/componentTestUtils.tsx +475 -0
- package/src/__tests__/shared/errorHandlingTestUtils.ts +107 -0
- package/src/__tests__/shared/index.ts +81 -0
- package/src/__tests__/shared/integrationTestUtils.tsx +375 -0
- package/src/__tests__/shared/performanceTestUtils.tsx +476 -0
- package/src/__tests__/shared/testUtils.optimized.tsx +627 -0
- package/src/__tests__/simple.test.tsx +20 -0
- package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
- package/src/__tests__/templates/component.test.template.tsx +122 -0
- package/src/__tests__/templates/integration.test.template.tsx +199 -0
- package/src/__tests__/test-utils/dataFactories.ts +60 -0
- package/src/__tests__/test-utils/index.ts +6 -0
- package/src/__tests__/typeSafety.unit.test.ts +65 -0
- package/src/__tests__/unifiedAuth.unit.test.tsx +151 -0
- package/src/__tests__/utils/accessibilityHelpers.ts +254 -0
- package/src/__tests__/utils/assertions.ts +50 -0
- package/src/__tests__/utils/deterministicHelpers.ts +31 -0
- package/src/__tests__/utils/edgeCaseConfig.test.ts +75 -0
- package/src/__tests__/utils/edgeCaseConfig.ts +98 -0
- package/src/__tests__/utils/mockHelpers.ts +149 -0
- package/src/__tests__/utils/mockLoader.ts +101 -0
- package/src/__tests__/utils/performanceHelpers.ts +55 -0
- package/src/__tests__/utils/performanceTestHelpers.ts +68 -0
- package/src/__tests__/utils/testDataFactories.ts +28 -0
- package/src/__tests__/utils/testIsolation.ts +67 -0
- package/src/__tests__/utils/visualTestHelpers.ts +20 -0
- package/src/__tests__/visual/__snapshots__/componentSnapshots.visual.test.tsx.snap +68 -0
- package/src/__tests__/visual/__snapshots__/componentVisuals.visual.test.tsx.snap +14 -0
- package/src/__tests__/visual/__snapshots__/visualRegression.test.tsx.snap +217 -0
- package/src/__tests__/visual/__snapshots__/visualRegression.visual.test.tsx.snap +24 -0
- package/src/__tests__/visual/componentSnapshots.visual.test.tsx +33 -0
- package/src/__tests__/visual/componentVisuals.visual.test.tsx +12 -0
- package/src/__tests__/visual/visualRegression.visual.test.tsx +20 -0
- package/src/components/Alert/Alert.tsx +134 -0
- package/src/components/Alert/__tests__/Alert.unit.test.tsx +381 -0
- package/src/components/Alert/index.ts +2 -0
- package/src/components/Avatar/Avatar.tsx +84 -0
- package/src/components/Avatar/__tests__/Avatar.unit.test.tsx +232 -0
- package/src/components/Avatar/index.ts +2 -0
- package/src/components/Button/Button.tsx +270 -0
- package/src/components/Button/__tests__/Button.accessibility.test.tsx +131 -0
- package/src/components/Button/__tests__/Button.comprehensive.test.tsx +721 -0
- package/src/components/Button/__tests__/Button.unit.test.tsx +189 -0
- package/src/components/Button/__tests__/EventSelector.integration.test.tsx +285 -0
- package/src/components/Button/index.ts +2 -0
- package/src/components/Card/Card.tsx +271 -0
- package/src/components/Card/__tests__/Card.accessibility.test.tsx +394 -0
- package/src/components/Card/__tests__/Card.comprehensive.test.tsx +599 -0
- package/src/components/Card/__tests__/Card.integration.test.tsx +673 -0
- package/src/components/Card/__tests__/Card.performance.test.tsx +546 -0
- package/src/components/Card/__tests__/Card.unit.test.tsx +330 -0
- package/src/components/Card/__tests__/Card.visual.test.tsx +599 -0
- package/src/components/Card/__tests__/README.md +211 -0
- package/src/components/Card/index.ts +1 -0
- package/src/components/Checkbox/Checkbox.tsx +75 -0
- package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
- package/src/components/Checkbox/__tests__/Checkbox.unit.test.tsx +520 -0
- package/src/components/Checkbox/index.ts +2 -0
- package/src/components/DataTable/DataTable.tsx +440 -0
- package/src/components/DataTable/__tests__/DataTable.autoSizing.test.tsx +526 -0
- package/src/components/DataTable/__tests__/DataTable.errorHandling.test.tsx +259 -0
- package/src/components/DataTable/__tests__/DataTable.hierarchical.test.tsx +675 -0
- package/src/components/DataTable/__tests__/DataTable.infinite-loop.test.tsx +324 -0
- package/src/components/DataTable/__tests__/DataTable.integration.test.tsx +724 -0
- package/src/components/DataTable/__tests__/DataTable.performance.test.tsx +597 -0
- package/src/components/DataTable/__tests__/DataTable.permissions.test.tsx +306 -0
- package/src/components/DataTable/__tests__/DataTable.regressionFixes.test.tsx +546 -0
- package/src/components/DataTable/__tests__/DataTable.selection.controlled.test.tsx +386 -0
- package/src/components/DataTable/__tests__/DataTable.selection.test.tsx +338 -0
- package/src/components/DataTable/__tests__/DataTable.userWorkflows.test.tsx +310 -0
- package/src/components/DataTable/__tests__/DataTable.workflowValidation.test.tsx +489 -0
- package/src/components/DataTable/__tests__/DataTable.workflows.test.tsx +701 -0
- package/src/components/DataTable/__tests__/README.md +136 -0
- package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
- package/src/components/DataTable/__tests__/performance-regression.test.tsx +788 -0
- package/src/components/DataTable/__tests__/performance.test.tsx +365 -0
- package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +382 -0
- package/src/components/DataTable/__tests__/test-utils.ts +94 -0
- package/src/components/DataTable/components/ActionButtons.tsx +177 -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 +462 -0
- package/src/components/DataTable/components/DataTableCore.tsx +869 -0
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
- package/src/components/DataTable/components/DataTableHeader.tsx +31 -0
- package/src/components/DataTable/components/DataTableModals.tsx +87 -0
- package/src/components/DataTable/components/DataTableToolbar.tsx +251 -0
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +148 -0
- package/src/components/DataTable/components/EditableRow.tsx +160 -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 +101 -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 +911 -0
- package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +593 -0
- package/src/components/DataTable/components/__tests__/ActionButtons.unit.test.tsx +150 -0
- package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +224 -0
- package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.unit.test.tsx +244 -0
- package/src/components/DataTable/components/__tests__/DataTable.accessibility.test.tsx +523 -0
- package/src/components/DataTable/components/__tests__/DataTable.integration.test.tsx +401 -0
- package/src/components/DataTable/components/__tests__/DataTable.performance.test.tsx +161 -0
- package/src/components/DataTable/components/__tests__/DataTable.real.test.tsx +251 -0
- package/src/components/DataTable/components/__tests__/DataTable.security.test.tsx +172 -0
- package/src/components/DataTable/components/__tests__/DataTable.unit.test.tsx +290 -0
- package/src/components/DataTable/components/__tests__/DataTableBody.unit.test.tsx +147 -0
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.unit.test.tsx +182 -0
- package/src/components/DataTable/components/__tests__/DataTableHeader.unit.test.tsx +143 -0
- package/src/components/DataTable/components/__tests__/DataTableModals.unit.test.tsx +123 -0
- package/src/components/DataTable/components/__tests__/EditableRow.unit.test.tsx +660 -0
- package/src/components/DataTable/components/__tests__/EmptyState.unit.test.tsx +256 -0
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +498 -0
- package/src/components/DataTable/components/__tests__/FilterRow.unit.test.tsx +112 -0
- package/src/components/DataTable/components/__tests__/FilteringToggle.unit.test.tsx +130 -0
- package/src/components/DataTable/components/__tests__/GroupHeader.unit.test.tsx +172 -0
- package/src/components/DataTable/components/__tests__/GroupingDropdown.unit.test.tsx +222 -0
- package/src/components/DataTable/components/__tests__/ImportModal.unit.test.tsx +780 -0
- package/src/components/DataTable/components/__tests__/LoadingState.unit.test.tsx +65 -0
- package/src/components/DataTable/components/__tests__/PaginationControls.unit.test.tsx +634 -0
- package/src/components/DataTable/components/__tests__/StateComponents.unit.test.tsx +48 -0
- package/src/components/DataTable/components/__tests__/UnifiedTableBody.hierarchical.test.tsx +541 -0
- package/src/components/DataTable/components/__tests__/ViewRowModal.unit.test.tsx +228 -0
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.unit.test.tsx +568 -0
- package/src/components/DataTable/components/index.ts +17 -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 +182 -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/__tests__/ActionManager.unit.test.ts +405 -0
- package/src/components/DataTable/core/__tests__/ArchitectureIntegration.unit.test.tsx +445 -0
- package/src/components/DataTable/core/__tests__/ColumnFactory.unit.test.ts +288 -0
- package/src/components/DataTable/core/__tests__/ColumnManager.unit.test.ts +623 -0
- package/src/components/DataTable/core/__tests__/DataManager.unit.test.ts +431 -0
- package/src/components/DataTable/core/__tests__/DataTableContext.unit.test.tsx +433 -0
- package/src/components/DataTable/core/__tests__/LocalDataAdapter.unit.test.ts +422 -0
- package/src/components/DataTable/core/__tests__/PluginRegistry.unit.test.tsx +207 -0
- package/src/components/DataTable/core/__tests__/StateManager.unit.test.ts +278 -0
- package/src/components/DataTable/core/index.ts +8 -0
- package/src/components/DataTable/core/interfaces.ts +338 -0
- package/src/components/DataTable/examples/AutoSizingExample.tsx +180 -0
- package/src/components/DataTable/examples/ColumnSizingComparison.tsx +235 -0
- package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +418 -0
- package/src/components/DataTable/examples/HierarchicalExample.tsx +472 -0
- package/src/components/DataTable/examples/InitialPageSizeExample.tsx +173 -0
- package/src/components/DataTable/examples/PerformanceExample.tsx +502 -0
- package/src/components/DataTable/examples/__tests__/PerformanceExample.unit.test.tsx +281 -0
- package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.unit.test.ts +407 -0
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.unit.test.ts +679 -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 +70 -0
- package/src/components/DataTable/styles.ts +171 -0
- package/src/components/DataTable/types.ts +475 -0
- package/src/components/DataTable/utils/__tests__/columnSizing.test.ts +237 -0
- package/src/components/DataTable/utils/__tests__/debugTools.unit.test.ts +267 -0
- package/src/components/DataTable/utils/__tests__/errorHandling.unit.test.ts +467 -0
- package/src/components/DataTable/utils/__tests__/exportUtils.unit.test.ts +380 -0
- package/src/components/DataTable/utils/__tests__/flexibleImport.unit.test.ts +233 -0
- package/src/components/DataTable/utils/__tests__/performanceUtils.unit.test.ts +414 -0
- package/src/components/DataTable/utils/columnSizing.ts +125 -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.tsx +782 -0
- package/src/components/Dialog/README.md +804 -0
- package/src/components/Dialog/__tests__/Dialog.accessibility.test.tsx +521 -0
- package/src/components/Dialog/__tests__/Dialog.auto-size.example.tsx +157 -0
- package/src/components/Dialog/__tests__/Dialog.enhanced.test.tsx +538 -0
- package/src/components/Dialog/__tests__/Dialog.unit.test.tsx +1373 -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/examples/__tests__/SmartDialogExample.unit.test.tsx +151 -0
- package/src/components/Dialog/index.ts +12 -0
- package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +611 -0
- package/src/components/Dialog/utils/safeHtml.ts +185 -0
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.accessibility.test.tsx +517 -0
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.integration.test.tsx +572 -0
- package/src/components/ErrorBoundary/__tests__/ErrorBoundary.unit.test.tsx +579 -0
- package/src/components/ErrorBoundary/index.ts +8 -0
- package/src/components/EventSelector/EventSelector.tsx +360 -0
- package/src/components/EventSelector/__tests__/EventSelector.test.tsx +528 -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.tsx +237 -0
- package/src/components/FileUpload/__tests__/FileUpload.integration.test.tsx +992 -0
- package/src/components/FileUpload/__tests__/FileUpload.real.test.tsx +927 -0
- package/src/components/FileUpload/__tests__/FileUpload.test.tsx +855 -0
- package/src/components/FileUpload/__tests__/FileUpload.unit.test.tsx +1311 -0
- package/src/components/FileUpload/__tests__/FileUpload.unmocked.test.tsx +937 -0
- package/src/components/FileUpload/index.ts +6 -0
- package/src/components/Footer/Footer.tsx +197 -0
- package/src/components/Footer/__tests__/Footer.accessibility.test.tsx +359 -0
- package/src/components/Footer/__tests__/Footer.integration.test.tsx +353 -0
- package/src/components/Footer/__tests__/Footer.performance.test.tsx +309 -0
- package/src/components/Footer/__tests__/Footer.unit.test.tsx +309 -0
- package/src/components/Footer/__tests__/Footer.visual.test.tsx +335 -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/__tests__/Form.accessibility.test.tsx +820 -0
- package/src/components/Form/__tests__/Form.unit.test.tsx +305 -0
- package/src/components/Form/__tests__/FormErrorSummary.unit.test.tsx +285 -0
- package/src/components/Form/__tests__/FormFieldset.unit.test.tsx +241 -0
- package/src/components/Form/index.ts +26 -0
- package/src/components/Header/Header.tsx +301 -0
- package/src/components/Header/__tests__/Header.accessibility.test.tsx +382 -0
- package/src/components/Header/__tests__/Header.comprehensive.test.tsx +509 -0
- package/src/components/Header/__tests__/Header.unit.test.tsx +335 -0
- package/src/components/Header/index.ts +4 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +196 -0
- package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
- package/src/components/InactivityWarningModal/__tests__/InactivityWarningModal.unit.test.tsx +224 -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/__tests__/Input.accessibility.test.tsx +632 -0
- package/src/components/Input/__tests__/Input.unit.test.tsx +1121 -0
- package/src/components/Input/index.ts +9 -0
- package/src/components/Label/Label.tsx +186 -0
- package/src/components/Label/__tests__/Label.accessibility.test.tsx +239 -0
- package/src/components/Label/__tests__/Label.unit.test.tsx +331 -0
- package/src/components/Label/index.ts +2 -0
- package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
- package/src/components/LoadingSpinner/__tests__/LoadingSpinner.accessibility.test.tsx +116 -0
- package/src/components/LoadingSpinner/__tests__/LoadingSpinner.unit.test.tsx +144 -0
- package/src/components/LoadingSpinner/index.ts +3 -0
- package/src/components/LoginForm/LoginForm.tsx +273 -0
- package/src/components/LoginForm/__tests__/LoginForm.accessibility.test.tsx +201 -0
- package/src/components/LoginForm/__tests__/LoginForm.unit.test.tsx +119 -0
- package/src/components/LoginForm/index.ts +3 -0
- package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.accessibility.test.tsx +378 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.enhanced.test.tsx +768 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.integration.test.tsx +576 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.performance.test.tsx +585 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.real.component.test.tsx +783 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.security.enhanced.test.tsx +810 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.security.test.tsx +494 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.unit.test.tsx +331 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.userWorkflows.test.tsx +347 -0
- package/src/components/NavigationMenu/__tests__/NavigationMenu.workflows.test.tsx +584 -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/__tests__/OrganisationSelector.unit.test.tsx +664 -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/__tests__/PaceAppLayout.accessibility.test.tsx +288 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +889 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +629 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +782 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +904 -0
- package/src/components/PaceAppLayout/index.ts +1 -0
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.accessibility.test.tsx +463 -0
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.integration.test.tsx +586 -0
- package/src/components/PaceLoginPage/__tests__/PaceLoginPage.unit.test.tsx +533 -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/__tests__/PasswordChangeForm.accessibility.test.tsx +408 -0
- package/src/components/PasswordReset/__tests__/PasswordChangeForm.unit.test.tsx +561 -0
- package/src/components/PasswordReset/__tests__/PasswordReset.integration.test.tsx +304 -0
- package/src/components/PasswordReset/__tests__/PasswordResetForm.accessibility.test.tsx +20 -0
- package/src/components/PasswordReset/__tests__/PasswordResetForm.unit.test.tsx +523 -0
- package/src/components/PasswordReset/__tests__/__mocks__/UnifiedAuthProvider.ts +29 -0
- package/src/components/PasswordReset/index.ts +4 -0
- package/src/components/Print/__tests__/Print.comprehensive.test.tsx +331 -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/__tests__/PrintButton.unit.test.tsx +429 -0
- package/src/components/PrintButton/__tests__/PrintButtonGroup.unit.test.tsx +277 -0
- package/src/components/PrintButton/__tests__/PrintToolbar.unit.test.tsx +264 -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/__tests__/PrintCard.unit.test.tsx +233 -0
- package/src/components/PrintCard/__tests__/PrintCardContent.test.tsx +284 -0
- package/src/components/PrintCard/__tests__/PrintCardGrid.unit.test.tsx +214 -0
- package/src/components/PrintCard/__tests__/PrintCardImage.unit.test.tsx +264 -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/__tests__/PrintDataTable.unit.test.tsx +361 -0
- package/src/components/PrintDataTable/__tests__/PrintTableGroup.unit.test.tsx +314 -0
- package/src/components/PrintDataTable/__tests__/PrintTableRow.unit.test.tsx +362 -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/__tests__/PrintFooter.unit.test.tsx +500 -0
- package/src/components/PrintFooter/__tests__/PrintFooterContent.unit.test.tsx +321 -0
- package/src/components/PrintFooter/__tests__/PrintFooterInfo.unit.test.tsx +335 -0
- package/src/components/PrintFooter/__tests__/PrintPageNumber.unit.test.tsx +340 -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/__tests__/PrintGrid.unit.test.tsx +340 -0
- package/src/components/PrintGrid/__tests__/PrintGridBreakpoint.unit.test.tsx +261 -0
- package/src/components/PrintGrid/__tests__/PrintGridContainer.unit.test.tsx +338 -0
- package/src/components/PrintGrid/__tests__/PrintGridItem.unit.test.tsx +338 -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/__tests__/PrintCoverHeader.unit.test.tsx +309 -0
- package/src/components/PrintHeader/__tests__/PrintHeader.unit.test.tsx +202 -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/__tests__/PrintLayout.unit.test.tsx +238 -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/__tests__/PrintPageBreak.unit.test.tsx +263 -0
- package/src/components/PrintPageBreak/__tests__/PrintPageBreakGroup.unit.test.tsx +239 -0
- package/src/components/PrintPageBreak/__tests__/PrintPageBreakIndicator.unit.test.tsx +235 -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/__tests__/PrintColumn.unit.test.tsx +385 -0
- package/src/components/PrintSection/__tests__/PrintDivider.unit.test.tsx +373 -0
- package/src/components/PrintSection/__tests__/PrintSection.unit.test.tsx +390 -0
- package/src/components/PrintSection/__tests__/PrintSectionContent.unit.test.tsx +321 -0
- package/src/components/PrintSection/__tests__/PrintSectionHeader.unit.test.tsx +334 -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/__tests__/PrintText.unit.test.tsx +351 -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/__tests__/Progress.accessibility.test.tsx +240 -0
- package/src/components/Progress/__tests__/Progress.unit.test.tsx +242 -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/__tests__/EventLogo.test.tsx +761 -0
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.simplified.test.tsx +228 -0
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +228 -0
- package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +459 -0
- package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +362 -0
- package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +522 -0
- package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +599 -0
- package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +513 -0
- package/src/components/PublicLayout/index.ts +51 -0
- package/src/components/RBAC/PagePermissionGuard.tsx +274 -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/__tests__/PagePermissionGuard.unit.test.tsx +674 -0
- package/src/components/RBAC/__tests__/RBAC.integration.test.tsx +573 -0
- package/src/components/RBAC/__tests__/RBACGuard.unit.test.tsx +467 -0
- package/src/components/RBAC/__tests__/RBACProvider.accessibility.test.tsx +475 -0
- package/src/components/RBAC/__tests__/RBACProvider.advanced.test.tsx +569 -0
- package/src/components/RBAC/__tests__/RBACProvider.integration.test.tsx +352 -0
- package/src/components/RBAC/__tests__/RBACProvider.unit.test.tsx +128 -0
- package/src/components/RBAC/__tests__/RoleBasedContent.unit.test.tsx +657 -0
- package/src/components/RBAC/index.ts +23 -0
- package/src/components/Select/Select.tsx +654 -0
- package/src/components/Select/__tests__/SearchableSelect.unit.test.tsx +437 -0
- package/src/components/Select/__tests__/Select.accessibility.test.tsx +1202 -0
- package/src/components/Select/__tests__/Select.actual.test.tsx +774 -0
- package/src/components/Select/__tests__/Select.comprehensive.test.tsx +837 -0
- package/src/components/Select/__tests__/Select.enhanced.test.tsx +1101 -0
- package/src/components/Select/__tests__/Select.integration.test.tsx +772 -0
- package/src/components/Select/__tests__/Select.performance.test.tsx +695 -0
- package/src/components/Select/__tests__/Select.real-world.test.tsx +1046 -0
- package/src/components/Select/__tests__/Select.search-algorithms.test.tsx +968 -0
- package/src/components/Select/__tests__/Select.unit.test.tsx +647 -0
- package/src/components/Select/__tests__/Select.utils.test.tsx +890 -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/__tests__/Table.accessibility.test.tsx +233 -0
- package/src/components/Table/__tests__/Table.unit.test.tsx +235 -0
- package/src/components/Table/index.ts +11 -0
- package/src/components/Toast/Toast.tsx +339 -0
- package/src/components/Toast/__tests__/Toast.accessibility.test.tsx +238 -0
- package/src/components/Toast/__tests__/Toast.integration.test.tsx +699 -0
- package/src/components/Toast/__tests__/Toast.unit.test.tsx +750 -0
- package/src/components/Toast/index.ts +14 -0
- package/src/components/Tooltip/Tooltip.tsx +167 -0
- package/src/components/Tooltip/__tests__/Tooltip.accessibility.test.tsx +121 -0
- package/src/components/Tooltip/__tests__/Tooltip.unit.test.tsx +185 -0
- package/src/components/Tooltip/index.ts +7 -0
- package/src/components/UserMenu/UserMenu.tsx +243 -0
- package/src/components/UserMenu/__tests__/UserMenu.accessibility.test.tsx +139 -0
- package/src/components/UserMenu/__tests__/UserMenu.integration.test.tsx +188 -0
- package/src/components/UserMenu/__tests__/UserMenu.unit.test.tsx +458 -0
- package/src/components/UserMenu/index.ts +3 -0
- package/src/components/__tests__/EdgeCaseTesting.enhanced.test.tsx +523 -0
- package/src/components/__tests__/ErrorTesting.enhanced.test.tsx +455 -0
- package/src/components/__tests__/SuperAdminGuard.test.tsx +456 -0
- package/src/components/__tests__/SuperAdminGuard.unit.test.tsx +456 -0
- package/src/components/examples/PermissionExample.tsx +150 -0
- package/src/components/examples/__tests__/PermissionExample.unit.test.tsx +360 -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/fonts/georama-italic.woff2 +0 -0
- package/src/fonts/georama.woff2 +0 -0
- package/src/fonts/open-sans-italic.woff2 +0 -0
- package/src/fonts/open-sans.woff2 +0 -0
- package/src/fonts/reddit-mono.woff2 +0 -0
- package/src/hooks/__tests__/hooks.integration.test.tsx +575 -0
- package/src/hooks/__tests__/useApiFetch.unit.test.ts +115 -0
- package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +133 -0
- package/src/hooks/__tests__/useDebounce.unit.test.ts +82 -0
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +293 -0
- package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +385 -0
- package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +286 -0
- package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +838 -0
- package/src/hooks/__tests__/usePermissionCache.unit.test.ts +627 -0
- package/src/hooks/__tests__/useRBAC.unit.test.ts +903 -0
- package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +537 -0
- package/src/hooks/__tests__/useToast.unit.test.tsx +62 -0
- package/src/hooks/__tests__/useZodForm.unit.test.tsx +37 -0
- package/src/hooks/index.ts +56 -0
- package/src/hooks/public/__tests__/usePublicEvent.test.tsx +397 -0
- package/src/hooks/public/__tests__/usePublicEventLogo.test.tsx +690 -0
- package/src/hooks/public/__tests__/usePublicRouteParams.test.tsx +449 -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/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 +622 -0
- package/src/providers/UnifiedAuthProvider.tsx +327 -0
- package/src/providers/__tests__/EventProvider.unit.test.tsx +768 -0
- package/src/providers/__tests__/OrganisationProvider.basic.test.tsx +116 -0
- package/src/providers/__tests__/OrganisationProvider.unit.test.tsx +1312 -0
- package/src/providers/__tests__/UnifiedAuthProvider.inactivity.test.tsx +601 -0
- package/src/providers/__tests__/UnifiedAuthProvider.unit.test.tsx +675 -0
- package/src/providers/__tests__/index.unit.test.ts +78 -0
- package/src/providers/index.ts +15 -0
- package/src/rbac/README.md +885 -0
- package/src/rbac/__tests__/PagePermissionGuard.test.tsx +673 -0
- package/src/rbac/__tests__/README.md +170 -0
- package/src/rbac/__tests__/RoleBasedRouter.test.tsx +709 -0
- package/src/rbac/__tests__/TestContext.tsx +72 -0
- package/src/rbac/__tests__/__mocks__/cache.ts +144 -0
- package/src/rbac/__tests__/__mocks__/supabase.ts +152 -0
- package/src/rbac/__tests__/adapters-hooks-comprehensive.test.tsx +782 -0
- package/src/rbac/__tests__/adapters-hooks.test.tsx +561 -0
- package/src/rbac/__tests__/adapters.comprehensive.test.tsx +963 -0
- package/src/rbac/__tests__/adapters.test.tsx +444 -0
- package/src/rbac/__tests__/api.test.ts +620 -0
- package/src/rbac/__tests__/audit-observability-comprehensive.test.ts +792 -0
- package/src/rbac/__tests__/audit-observability.test.ts +549 -0
- package/src/rbac/__tests__/audit.test.ts +616 -0
- package/src/rbac/__tests__/build-contract-compliance-simple.test.ts +230 -0
- package/src/rbac/__tests__/cache-invalidation-comprehensive.test.ts +889 -0
- package/src/rbac/__tests__/cache-invalidation.test.ts +457 -0
- package/src/rbac/__tests__/cache.test.ts +458 -0
- package/src/rbac/__tests__/components-navigation-guard.enhanced.test.tsx +859 -0
- package/src/rbac/__tests__/components-navigation-guard.test.tsx +895 -0
- package/src/rbac/__tests__/components-navigation-provider.test.tsx +692 -0
- package/src/rbac/__tests__/components-page-permission-guard.test.tsx +673 -0
- package/src/rbac/__tests__/components-page-permission-provider.test.tsx +614 -0
- package/src/rbac/__tests__/components-permission-enforcer.enhanced.fixed.test.tsx +836 -0
- package/src/rbac/__tests__/components-permission-enforcer.enhanced.test.tsx +837 -0
- package/src/rbac/__tests__/components-permission-enforcer.test.tsx +825 -0
- package/src/rbac/__tests__/components-role-based-router.test.tsx +709 -0
- package/src/rbac/__tests__/components-secure-data-provider.test.tsx +607 -0
- package/src/rbac/__tests__/config.test.ts +583 -0
- package/src/rbac/__tests__/core-logic-unit.test.ts +190 -0
- package/src/rbac/__tests__/core-permission-logic-comprehensive.test.ts +1467 -0
- package/src/rbac/__tests__/core-permission-logic-fixed.test.ts +151 -0
- package/src/rbac/__tests__/core-permission-logic-simple.test.ts +968 -0
- package/src/rbac/__tests__/core-permission-logic.test.ts +966 -0
- package/src/rbac/__tests__/edge-cases-comprehensive.test.ts +988 -0
- package/src/rbac/__tests__/edge-cases.test.ts +654 -0
- package/src/rbac/__tests__/engine.test.ts +361 -0
- package/src/rbac/__tests__/engine.unit.test.ts +361 -0
- package/src/rbac/__tests__/hooks.enhanced.test.tsx +979 -0
- package/src/rbac/__tests__/hooks.fixed.test.tsx +475 -0
- package/src/rbac/__tests__/hooks.test.tsx +385 -0
- package/src/rbac/__tests__/index.test.ts +269 -0
- package/src/rbac/__tests__/integration.enhanced.test.tsx +824 -0
- package/src/rbac/__tests__/page-permission-guard-super-admin.test.tsx +261 -0
- package/src/rbac/__tests__/performance.enhanced.test.tsx +724 -0
- package/src/rbac/__tests__/permissions.test.ts +383 -0
- package/src/rbac/__tests__/requires-event.test.ts +330 -0
- package/src/rbac/__tests__/scope-isolation-comprehensive.test.ts +1349 -0
- package/src/rbac/__tests__/scope-isolation.test.ts +755 -0
- package/src/rbac/__tests__/secure-client-rls-comprehensive.test.ts +592 -0
- package/src/rbac/__tests__/secure-client-rls.test.ts +377 -0
- package/src/rbac/__tests__/security.test.ts +296 -0
- package/src/rbac/__tests__/setup.ts +228 -0
- package/src/rbac/__tests__/test-utils-enhanced.tsx +400 -0
- package/src/rbac/__tests__/types.test.ts +685 -0
- package/src/rbac/adapters.tsx +726 -0
- package/src/rbac/api.ts +337 -0
- package/src/rbac/audit-enhanced.ts +339 -0
- package/src/rbac/audit.ts +338 -0
- package/src/rbac/cache.ts +213 -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/__tests__/EnhancedNavigationMenu.test.tsx +631 -0
- package/src/rbac/components/__tests__/NavigationProvider.test.tsx +667 -0
- package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +647 -0
- package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +496 -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 +555 -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/__tests__/index.test.tsx +342 -0
- package/src/rbac/testing/index.tsx +340 -0
- package/src/rbac/types.ts +341 -0
- package/src/rbac/utils/__tests__/eventContext.test.ts +428 -0
- package/src/rbac/utils/__tests__/eventContext.unit.test.ts +428 -0
- package/src/rbac/utils/eventContext.ts +83 -0
- package/src/styles/__tests__/styles.unit.test.ts +164 -0
- package/src/styles/core.css +401 -0
- package/src/styles/index.ts +51 -0
- package/src/test-dom-cleanup.test.tsx +38 -0
- package/src/theming/__tests__/README.md +335 -0
- package/src/theming/__tests__/runtime.accessibility.test.ts +474 -0
- package/src/theming/__tests__/runtime.error.test.ts +616 -0
- package/src/theming/__tests__/runtime.integration.test.ts +376 -0
- package/src/theming/__tests__/runtime.performance.test.ts +411 -0
- package/src/theming/__tests__/runtime.unit.test.ts +470 -0
- package/src/theming/runtime.ts +187 -0
- package/src/types/__tests__/database.unit.test.ts +489 -0
- package/src/types/__tests__/guards.unit.test.ts +146 -0
- package/src/types/__tests__/index.unit.test.ts +77 -0
- package/src/types/__tests__/organisation.unit.test.ts +713 -0
- package/src/types/__tests__/rbac.unit.test.ts +621 -0
- package/src/types/__tests__/security.unit.test.ts +347 -0
- package/src/types/__tests__/supabase.unit.test.ts +658 -0
- package/src/types/__tests__/theme.unit.test.ts +218 -0
- package/src/types/__tests__/unified.unit.test.ts +537 -0
- package/src/types/__tests__/validation.unit.test.ts +616 -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/__tests__/appConfig.unit.test.ts +55 -0
- package/src/utils/__tests__/appNameResolver.unit.test.ts +137 -0
- package/src/utils/__tests__/audit.unit.test.ts +69 -0
- package/src/utils/__tests__/auth-utils.unit.test.ts +70 -0
- package/src/utils/__tests__/bundleAnalysis.unit.test.ts +317 -0
- package/src/utils/__tests__/cn.unit.test.ts +34 -0
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +480 -0
- package/src/utils/__tests__/dynamicUtils.unit.test.ts +322 -0
- package/src/utils/__tests__/formatDate.unit.test.ts +109 -0
- package/src/utils/__tests__/formatting.unit.test.ts +66 -0
- package/src/utils/__tests__/index.unit.test.ts +251 -0
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +309 -0
- package/src/utils/__tests__/organisationContext.unit.test.ts +192 -0
- package/src/utils/__tests__/performanceBudgets.unit.test.ts +259 -0
- package/src/utils/__tests__/permissionTypes.unit.test.ts +250 -0
- package/src/utils/__tests__/permissionUtils.unit.test.ts +362 -0
- package/src/utils/__tests__/sanitization.unit.test.ts +346 -0
- package/src/utils/__tests__/schemaUtils.unit.test.ts +441 -0
- package/src/utils/__tests__/secureDataAccess.unit.test.ts +334 -0
- package/src/utils/__tests__/secureErrors.unit.test.ts +377 -0
- package/src/utils/__tests__/secureStorage.unit.test.ts +293 -0
- package/src/utils/__tests__/security.unit.test.ts +127 -0
- package/src/utils/__tests__/securityMonitor.unit.test.ts +280 -0
- package/src/utils/__tests__/sessionTracking.unit.test.ts +370 -0
- package/src/utils/__tests__/validation.unit.test.ts +84 -0
- package/src/utils/__tests__/validationUtils.unit.test.ts +571 -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/__tests__/PrintDataProcessor.unit.test.ts +219 -0
- package/src/utils/print/__tests__/usePrintOptimization.unit.test.tsx +353 -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/__tests__/config.unit.test.ts +206 -0
- package/src/utils/storage/__tests__/helpers.unit.test.ts +646 -0
- package/src/utils/storage/__tests__/index.unit.test.ts +167 -0
- package/src/utils/storage/__tests__/types.unit.test.ts +441 -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/__tests__/common.unit.test.ts +101 -0
- package/src/validation/__tests__/csrf.unit.test.ts +302 -0
- package/src/validation/__tests__/passwordSchema.unit.test.ts +98 -0
- package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +466 -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
|
@@ -0,0 +1,1623 @@
|
|
|
1
|
+
# Components API Reference
|
|
2
|
+
|
|
3
|
+
> **📚 Complete API Reference** | [← Back to Documentation](../README.md) | [↑ Table of Contents](#table-of-contents)
|
|
4
|
+
|
|
5
|
+
This section provides detailed API documentation for all UI components in `@jmruthers/pace-core`.
|
|
6
|
+
|
|
7
|
+
## Button
|
|
8
|
+
|
|
9
|
+
A versatile button component with multiple variants and states.
|
|
10
|
+
|
|
11
|
+
### Props
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
15
|
+
variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';
|
|
16
|
+
size?: 'default' | 'sm' | 'lg' | 'icon';
|
|
17
|
+
asChild?: boolean;
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Usage
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { Button } from '@jmruthers/pace-core';
|
|
26
|
+
|
|
27
|
+
// Default button
|
|
28
|
+
<Button onClick={handleClick}>
|
|
29
|
+
Click me
|
|
30
|
+
</Button>
|
|
31
|
+
|
|
32
|
+
// Destructive button
|
|
33
|
+
<Button variant="destructive" size="lg">
|
|
34
|
+
Delete
|
|
35
|
+
</Button>
|
|
36
|
+
|
|
37
|
+
// Button as child (composition)
|
|
38
|
+
<Button asChild>
|
|
39
|
+
<Link href="/dashboard">Go to Dashboard</Link>
|
|
40
|
+
</Button>
|
|
41
|
+
|
|
42
|
+
// Icon button
|
|
43
|
+
<Button size="icon" aria-label="Settings">
|
|
44
|
+
<Settings className="h-4 w-4" />
|
|
45
|
+
</Button>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Variants
|
|
49
|
+
|
|
50
|
+
- **default**: Primary button with solid background
|
|
51
|
+
- **destructive**: Red button for dangerous actions
|
|
52
|
+
- **outline**: Bordered button with transparent background
|
|
53
|
+
- **secondary**: Secondary button with muted styling
|
|
54
|
+
- **ghost**: Minimal styling for subtle actions
|
|
55
|
+
- **link**: Text button with underline on hover
|
|
56
|
+
|
|
57
|
+
### Sizes
|
|
58
|
+
|
|
59
|
+
- **default**: Standard button size (h-9 px-4 py-2)
|
|
60
|
+
- **sm**: Small button (h-8 px-3 text-xs)
|
|
61
|
+
- **lg**: Large button (h-10 px-8)
|
|
62
|
+
- **icon**: Square icon button (h-8 w-8)
|
|
63
|
+
|
|
64
|
+
## DataTable
|
|
65
|
+
|
|
66
|
+
A comprehensive, enterprise-grade data table with advanced features and performance optimizations.
|
|
67
|
+
|
|
68
|
+
### Props
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
interface DataTableFeatureConfig {
|
|
72
|
+
// Search and filtering
|
|
73
|
+
search?: boolean;
|
|
74
|
+
filtering?: boolean;
|
|
75
|
+
|
|
76
|
+
// Pagination and sorting
|
|
77
|
+
pagination?: boolean;
|
|
78
|
+
sorting?: boolean;
|
|
79
|
+
|
|
80
|
+
// Row operations
|
|
81
|
+
selection?: boolean;
|
|
82
|
+
creation?: boolean;
|
|
83
|
+
editing?: boolean;
|
|
84
|
+
deletion?: boolean;
|
|
85
|
+
deleteSelected?: boolean;
|
|
86
|
+
|
|
87
|
+
// Data operations
|
|
88
|
+
export?: boolean;
|
|
89
|
+
import?: boolean;
|
|
90
|
+
|
|
91
|
+
// Advanced features
|
|
92
|
+
grouping?: boolean;
|
|
93
|
+
columnVisibility?: boolean;
|
|
94
|
+
columnReordering?: boolean;
|
|
95
|
+
autoColumnSizing?: boolean;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
interface DataTableProps<TData extends DataRecord> {
|
|
99
|
+
// Core data
|
|
100
|
+
data: TData[];
|
|
101
|
+
columns: (DataTableColumn<TData> | SimpleColumn<TData>)[];
|
|
102
|
+
|
|
103
|
+
// Display
|
|
104
|
+
title?: string;
|
|
105
|
+
description?: string;
|
|
106
|
+
variant?: 'default' | 'compact' | 'spacious';
|
|
107
|
+
className?: string;
|
|
108
|
+
|
|
109
|
+
// Column ordering
|
|
110
|
+
columnOrder?: string[];
|
|
111
|
+
|
|
112
|
+
// Feature configuration (required)
|
|
113
|
+
features: DataTableFeatureConfig;
|
|
114
|
+
|
|
115
|
+
// Event handlers
|
|
116
|
+
onEditRow?: (row: TData, data: Partial<TData>) => void;
|
|
117
|
+
onDeleteRow?: (row: TData) => void;
|
|
118
|
+
onCreateRow?: (data: Partial<TData>) => void;
|
|
119
|
+
onImport?: (data: TData[]) => void | Promise<void>;
|
|
120
|
+
onDeleteSelected?: (selectedRows: Record<string, boolean>) => void;
|
|
121
|
+
|
|
122
|
+
// Performance
|
|
123
|
+
performance?: PerformanceConfig;
|
|
124
|
+
serverSide?: ServerSideConfig<TData>;
|
|
125
|
+
isLoading?: boolean;
|
|
126
|
+
|
|
127
|
+
// Utilities
|
|
128
|
+
getRowId?: GetRowId<TData>;
|
|
129
|
+
emptyState?: EmptyStateConfig;
|
|
130
|
+
|
|
131
|
+
// Hierarchical configuration
|
|
132
|
+
hierarchical?: HierarchicalConfig;
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### HierarchicalConfig
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
interface HierarchicalConfig {
|
|
140
|
+
/** Enable/disable hierarchical functionality */
|
|
141
|
+
enabled: boolean;
|
|
142
|
+
/** Initial expansion state - false = all collapsed, true = all expanded, string[] = specific IDs */
|
|
143
|
+
defaultExpanded?: boolean | string[];
|
|
144
|
+
/** Callback when expansion state changes */
|
|
145
|
+
onExpandedChange?: (expandedIds: string[]) => void;
|
|
146
|
+
/** Custom expand/collapse button component */
|
|
147
|
+
expandButton?: React.ComponentType<ExpandButtonProps>;
|
|
148
|
+
/** Indentation for child rows in pixels */
|
|
149
|
+
indentSize?: number;
|
|
150
|
+
/** CSS classes for parent rows */
|
|
151
|
+
parentRowClassName?: string;
|
|
152
|
+
/** CSS classes for child rows */
|
|
153
|
+
childRowClassName?: string;
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### DataTableColumn (Hierarchical Properties)
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
interface DataTableColumn<TData> {
|
|
161
|
+
// ... standard column properties
|
|
162
|
+
|
|
163
|
+
// Hierarchical-specific properties
|
|
164
|
+
/** Custom renderer for parent rows */
|
|
165
|
+
renderForParent?: (row: TData) => React.ReactNode;
|
|
166
|
+
/** Custom renderer for child rows */
|
|
167
|
+
renderForChild?: (row: TData) => React.ReactNode;
|
|
168
|
+
/** Hide this column for parent rows */
|
|
169
|
+
hideForParent?: boolean;
|
|
170
|
+
/** Hide this column for child rows */
|
|
171
|
+
hideForChild?: boolean;
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### DataTableAction
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
interface DataTableAction<TData extends DataRecord> {
|
|
179
|
+
/** Display label for the action */
|
|
180
|
+
label: string;
|
|
181
|
+
/** Icon component */
|
|
182
|
+
icon?: React.ComponentType<{ className?: string }>;
|
|
183
|
+
/** Action handler */
|
|
184
|
+
onClick: (row: TData) => void;
|
|
185
|
+
/** Visual variant */
|
|
186
|
+
variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost';
|
|
187
|
+
/** Whether action is disabled */
|
|
188
|
+
disabled?: (row: TData) => boolean;
|
|
189
|
+
/** Test ID for testing */
|
|
190
|
+
testId?: string;
|
|
191
|
+
/** Whether this action should only show for parent rows (hierarchical mode) */
|
|
192
|
+
showForParent?: boolean;
|
|
193
|
+
/** Whether this action should only show for child rows (hierarchical mode) */
|
|
194
|
+
showForChild?: boolean;
|
|
195
|
+
/** Icon component for parent rows (overrides icon when showForParent is true) */
|
|
196
|
+
parentIcon?: React.ComponentType<{ className?: string }>;
|
|
197
|
+
/** Icon component for child rows (overrides icon when showForChild is true) */
|
|
198
|
+
childIcon?: React.ComponentType<{ className?: string }>;
|
|
199
|
+
/** Label for parent rows (overrides label when showForParent is true) */
|
|
200
|
+
parentLabel?: string;
|
|
201
|
+
/** Label for child rows (overrides label when showForChild is true) */
|
|
202
|
+
childLabel?: string;
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Usage
|
|
207
|
+
|
|
208
|
+
```tsx
|
|
209
|
+
import { DataTable, type DataTableColumn } from '@jmruthers/pace-core';
|
|
210
|
+
|
|
211
|
+
interface User {
|
|
212
|
+
id: string;
|
|
213
|
+
name: string;
|
|
214
|
+
email: string;
|
|
215
|
+
role: string;
|
|
216
|
+
status: 'active' | 'inactive';
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const columns: DataTableColumn<User>[] = [
|
|
220
|
+
{
|
|
221
|
+
accessorKey: 'name',
|
|
222
|
+
header: 'Name',
|
|
223
|
+
sortable: true,
|
|
224
|
+
searchable: true,
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
accessorKey: 'email',
|
|
228
|
+
header: 'Email',
|
|
229
|
+
sortable: true,
|
|
230
|
+
searchable: true,
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
accessorKey: 'role',
|
|
234
|
+
header: 'Role',
|
|
235
|
+
sortable: true,
|
|
236
|
+
enableGrouping: true,
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
accessorKey: 'status',
|
|
240
|
+
header: 'Status',
|
|
241
|
+
sortable: true,
|
|
242
|
+
cell: ({ row }) => (
|
|
243
|
+
<span className={`px-2 py-1 rounded text-xs ${
|
|
244
|
+
row.original.status === 'active'
|
|
245
|
+
? 'bg-main-100 text-main-800'
|
|
246
|
+
: 'bg-acc-100 text-acc-800'
|
|
247
|
+
}`}>
|
|
248
|
+
{row.original.status}
|
|
249
|
+
</span>
|
|
250
|
+
),
|
|
251
|
+
},
|
|
252
|
+
];
|
|
253
|
+
|
|
254
|
+
<DataTable
|
|
255
|
+
data={users}
|
|
256
|
+
columns={columns}
|
|
257
|
+
title="Users"
|
|
258
|
+
description="Manage your users"
|
|
259
|
+
features={{
|
|
260
|
+
search: true,
|
|
261
|
+
pagination: true,
|
|
262
|
+
sorting: true,
|
|
263
|
+
filtering: true,
|
|
264
|
+
creation: true,
|
|
265
|
+
editing: true,
|
|
266
|
+
deletion: true,
|
|
267
|
+
autoColumnSizing: true, // Enable automatic column width adjustment
|
|
268
|
+
}}
|
|
269
|
+
columnOrder={['name', 'email', 'role', 'status']} // Control column order
|
|
270
|
+
onEditRow={handleEdit}
|
|
271
|
+
onDeleteRow={handleDelete}
|
|
272
|
+
onCreateRow={handleCreate}
|
|
273
|
+
/>
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Features
|
|
277
|
+
|
|
278
|
+
- **🚀 Performance**: Virtual scrolling, smart pagination, memory optimization
|
|
279
|
+
- **📊 Data Management**: Sorting, filtering, search, export/import
|
|
280
|
+
- **🌳 Hierarchical Rows**: Parent/child relationships with expand/collapse all
|
|
281
|
+
- **✏️ Editing**: Inline row editing, creation, and deletion
|
|
282
|
+
- **🎯 Actions**: Custom row actions and toolbar buttons
|
|
283
|
+
- **📈 Grouping**: Data grouping with aggregation functions
|
|
284
|
+
- **📏 Auto Sizing**: Automatic column width adjustment based on content
|
|
285
|
+
- **🎨 Customization**: Column visibility, responsive design
|
|
286
|
+
- **♿ Accessibility**: WCAG 2.1 AA compliant with keyboard navigation
|
|
287
|
+
- **🔧 TypeScript**: Full TypeScript support with strict typing
|
|
288
|
+
|
|
289
|
+
## Form
|
|
290
|
+
|
|
291
|
+
Form components with React Hook Form integration and Zod validation.
|
|
292
|
+
|
|
293
|
+
### Props
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
interface FormProps<TFieldValues extends FieldValues = FieldValues> {
|
|
297
|
+
schema?: z.ZodType<TFieldValues>;
|
|
298
|
+
defaultValues?: DefaultValues<TFieldValues>;
|
|
299
|
+
onSubmit: SubmitHandler<TFieldValues>;
|
|
300
|
+
onError?: SubmitErrorHandler<TFieldValues>;
|
|
301
|
+
mode?: "onSubmit" | "onChange" | "onBlur" | "onTouched" | "all";
|
|
302
|
+
children: React.ReactNode | ((methods: UseFormReturn<TFieldValues>) => React.ReactNode);
|
|
303
|
+
className?: string;
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Usage
|
|
308
|
+
|
|
309
|
+
```tsx
|
|
310
|
+
import { Form, FormField, Button } from '@jmruthers/pace-core';
|
|
311
|
+
import { z } from 'zod';
|
|
312
|
+
|
|
313
|
+
const userSchema = z.object({
|
|
314
|
+
name: z.string().min(2, "Name must be at least 2 characters"),
|
|
315
|
+
email: z.string().email("Invalid email address"),
|
|
316
|
+
age: z.number().min(18, "Must be at least 18 years old")
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
<Form
|
|
320
|
+
schema={userSchema}
|
|
321
|
+
defaultValues={{ name: "", email: "", age: 0 }}
|
|
322
|
+
onSubmit={(data) => console.log(data)}
|
|
323
|
+
onError={(errors) => console.error(errors)}
|
|
324
|
+
>
|
|
325
|
+
<FormField name="name" label="Name" />
|
|
326
|
+
<FormField name="email" label="Email" type="email" />
|
|
327
|
+
<FormField name="age" label="Age" type="number" />
|
|
328
|
+
<Button type="submit">Submit</Button>
|
|
329
|
+
</Form>
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Form Components
|
|
333
|
+
|
|
334
|
+
- **FormField**: Individual form fields with validation
|
|
335
|
+
- **FormErrorSummary**: Error display for forms
|
|
336
|
+
- **FormLiveRegion**: Live region for accessibility
|
|
337
|
+
- **FormFieldset**: Grouped form fields
|
|
338
|
+
|
|
339
|
+
## Dialog
|
|
340
|
+
|
|
341
|
+
A comprehensive, accessible dialog component system with enhanced features for modern web applications. Built on Radix UI primitives with semantic HTML structure and smart height management.
|
|
342
|
+
|
|
343
|
+
### Props
|
|
344
|
+
|
|
345
|
+
```typescript
|
|
346
|
+
interface DialogProps {
|
|
347
|
+
children: React.ReactNode;
|
|
348
|
+
open?: boolean;
|
|
349
|
+
onOpenChange?: (open: boolean) => void;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
interface DialogContentProps {
|
|
353
|
+
children: React.ReactNode;
|
|
354
|
+
className?: string;
|
|
355
|
+
/** Dialog size variant */
|
|
356
|
+
size?: 'sm' | 'md' | 'lg' | 'xl' | 'full' | 'auto';
|
|
357
|
+
/** Whether to show the close button */
|
|
358
|
+
showCloseButton?: boolean;
|
|
359
|
+
/** Custom className for the overlay */
|
|
360
|
+
overlayClassName?: string;
|
|
361
|
+
/** Whether to prevent closing on escape key */
|
|
362
|
+
preventCloseOnEscape?: boolean;
|
|
363
|
+
/** Whether to prevent closing on outside click */
|
|
364
|
+
preventCloseOnOutsideClick?: boolean;
|
|
365
|
+
/** Maximum height as percentage of viewport height (0-100) */
|
|
366
|
+
maxHeightPercent?: number;
|
|
367
|
+
/** Maximum width as percentage of viewport width (0-100) */
|
|
368
|
+
maxWidthPercent?: number;
|
|
369
|
+
/** Enable smart scrolling with sticky header/footer */
|
|
370
|
+
enableScrolling?: boolean;
|
|
371
|
+
/** Custom max height in CSS units (overrides maxHeightPercent) */
|
|
372
|
+
maxHeight?: string;
|
|
373
|
+
/** Custom max width in CSS units (overrides maxWidthPercent and size) */
|
|
374
|
+
maxWidth?: string;
|
|
375
|
+
/** Minimum height in CSS units */
|
|
376
|
+
minHeight?: string;
|
|
377
|
+
/** Minimum width in CSS units */
|
|
378
|
+
minWidth?: string;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
interface DialogHeaderProps {
|
|
382
|
+
children: React.ReactNode;
|
|
383
|
+
className?: string;
|
|
384
|
+
/** Whether this header should be sticky when scrolling is enabled */
|
|
385
|
+
sticky?: boolean;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
interface DialogBodyProps {
|
|
389
|
+
children: React.ReactNode;
|
|
390
|
+
className?: string;
|
|
391
|
+
/** Custom max height for the scrollable area */
|
|
392
|
+
maxHeight?: string;
|
|
393
|
+
/** HTML content to render (will be sanitized for security) */
|
|
394
|
+
htmlContent?: string;
|
|
395
|
+
/** Whether to allow HTML content rendering (default: true) */
|
|
396
|
+
allowHtml?: boolean;
|
|
397
|
+
/** Whether to use strict HTML sanitization (default: true) */
|
|
398
|
+
strictSanitization?: boolean;
|
|
399
|
+
/** Whether to log HTML sanitization warnings to console (default: false) */
|
|
400
|
+
logWarnings?: boolean;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
interface DialogFooterProps {
|
|
404
|
+
children: React.ReactNode;
|
|
405
|
+
className?: string;
|
|
406
|
+
/** Whether this footer should be sticky when scrolling is enabled */
|
|
407
|
+
sticky?: boolean;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
interface DialogTriggerProps {
|
|
411
|
+
children: React.ReactNode;
|
|
412
|
+
asChild?: boolean;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
interface DialogTitleProps {
|
|
416
|
+
children: React.ReactNode;
|
|
417
|
+
className?: string;
|
|
418
|
+
/** HTML content to render as title (will be sanitized for security) */
|
|
419
|
+
htmlContent?: string;
|
|
420
|
+
/** Whether to allow HTML content rendering (default: true) */
|
|
421
|
+
allowHtml?: boolean;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
interface DialogDescriptionProps {
|
|
425
|
+
children: React.ReactNode;
|
|
426
|
+
className?: string;
|
|
427
|
+
/** HTML content to render as description (will be sanitized for security) */
|
|
428
|
+
htmlContent?: string;
|
|
429
|
+
/** Whether to allow HTML content rendering (default: true) */
|
|
430
|
+
allowHtml?: boolean;
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### Usage
|
|
435
|
+
|
|
436
|
+
#### Basic Dialog
|
|
437
|
+
|
|
438
|
+
```tsx
|
|
439
|
+
import {
|
|
440
|
+
Dialog,
|
|
441
|
+
DialogTrigger,
|
|
442
|
+
DialogContent,
|
|
443
|
+
DialogHeader,
|
|
444
|
+
DialogTitle,
|
|
445
|
+
DialogDescription,
|
|
446
|
+
DialogBody,
|
|
447
|
+
DialogFooter,
|
|
448
|
+
Button
|
|
449
|
+
} from '@jmruthers/pace-core';
|
|
450
|
+
|
|
451
|
+
<Dialog>
|
|
452
|
+
<DialogTrigger asChild>
|
|
453
|
+
<Button>Open Dialog</Button>
|
|
454
|
+
</DialogTrigger>
|
|
455
|
+
<DialogContent size="lg">
|
|
456
|
+
<DialogHeader>
|
|
457
|
+
<DialogTitle>Edit Profile</DialogTitle>
|
|
458
|
+
<DialogDescription>
|
|
459
|
+
Make changes to your profile here. Click save when you're done.
|
|
460
|
+
</DialogDescription>
|
|
461
|
+
</DialogHeader>
|
|
462
|
+
<DialogBody>
|
|
463
|
+
<section className="space-y-4">
|
|
464
|
+
<p>Your content goes here...</p>
|
|
465
|
+
</section>
|
|
466
|
+
</DialogBody>
|
|
467
|
+
<DialogFooter>
|
|
468
|
+
<Button variant="outline">Cancel</Button>
|
|
469
|
+
<Button>Save changes</Button>
|
|
470
|
+
</DialogFooter>
|
|
471
|
+
</DialogContent>
|
|
472
|
+
</Dialog>
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
#### Scrollable Dialog with Sticky Elements
|
|
476
|
+
|
|
477
|
+
```tsx
|
|
478
|
+
<Dialog>
|
|
479
|
+
<DialogTrigger asChild>
|
|
480
|
+
<Button>Scrollable Dialog</Button>
|
|
481
|
+
</DialogTrigger>
|
|
482
|
+
<DialogContent
|
|
483
|
+
size="lg"
|
|
484
|
+
enableScrolling={true}
|
|
485
|
+
maxHeightPercent={80}
|
|
486
|
+
>
|
|
487
|
+
<DialogHeader sticky={true}>
|
|
488
|
+
<DialogTitle>Large Content Dialog</DialogTitle>
|
|
489
|
+
<DialogDescription>
|
|
490
|
+
This dialog has lots of content and will scroll if needed.
|
|
491
|
+
</DialogDescription>
|
|
492
|
+
</DialogHeader>
|
|
493
|
+
<DialogBody>
|
|
494
|
+
<section className="space-y-4">
|
|
495
|
+
{Array.from({ length: 50 }, (_, i) => (
|
|
496
|
+
<article key={i}>
|
|
497
|
+
<h4>Content Item {i + 1}</h4>
|
|
498
|
+
<p>This is semantic content within the dialog body.</p>
|
|
499
|
+
</article>
|
|
500
|
+
))}
|
|
501
|
+
</section>
|
|
502
|
+
</DialogBody>
|
|
503
|
+
<DialogFooter sticky={true}>
|
|
504
|
+
<Button>Save</Button>
|
|
505
|
+
</DialogFooter>
|
|
506
|
+
</DialogContent>
|
|
507
|
+
</Dialog>
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
#### Auto-Sizing Dialog
|
|
511
|
+
|
|
512
|
+
```tsx
|
|
513
|
+
<Dialog>
|
|
514
|
+
<DialogTrigger asChild>
|
|
515
|
+
<Button>Auto Size Dialog</Button>
|
|
516
|
+
</DialogTrigger>
|
|
517
|
+
<DialogContent size="auto">
|
|
518
|
+
<DialogHeader>
|
|
519
|
+
<DialogTitle>Auto-Sized Dialog</DialogTitle>
|
|
520
|
+
<DialogDescription>
|
|
521
|
+
This dialog automatically adjusts its width to fit the content.
|
|
522
|
+
</DialogDescription>
|
|
523
|
+
</DialogHeader>
|
|
524
|
+
<DialogBody>
|
|
525
|
+
<section>
|
|
526
|
+
<p>Content that determines the dialog width...</p>
|
|
527
|
+
</section>
|
|
528
|
+
</DialogBody>
|
|
529
|
+
</DialogContent>
|
|
530
|
+
</Dialog>
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
#### HTML Content Dialog
|
|
534
|
+
|
|
535
|
+
```tsx
|
|
536
|
+
<Dialog>
|
|
537
|
+
<DialogTrigger asChild>
|
|
538
|
+
<Button>Import Instructions</Button>
|
|
539
|
+
</DialogTrigger>
|
|
540
|
+
<DialogContent size="lg">
|
|
541
|
+
<DialogHeader>
|
|
542
|
+
<DialogTitle htmlContent="Import Dishes or Recipes" />
|
|
543
|
+
<DialogDescription htmlContent="Follow the <strong>instructions below</strong> to upload your CSV file." />
|
|
544
|
+
</DialogHeader>
|
|
545
|
+
<DialogBody
|
|
546
|
+
htmlContent="<h2>Required Columns</h2><ul><li><code>dish_code</code></li><li><code>dish_name</code></li><li><code>mealtype_name</code></li></ul><p><strong>Note:</strong> All HTML content is automatically sanitized for security.</p>"
|
|
547
|
+
allowHtml={true}
|
|
548
|
+
strictSanitization={true}
|
|
549
|
+
/>
|
|
550
|
+
<DialogFooter>
|
|
551
|
+
<Button variant="outline">Cancel</Button>
|
|
552
|
+
<Button>Upload File</Button>
|
|
553
|
+
</DialogFooter>
|
|
554
|
+
</DialogContent>
|
|
555
|
+
</Dialog>
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
### Features
|
|
559
|
+
|
|
560
|
+
#### Core Features
|
|
561
|
+
- **Semantic HTML Structure**: Uses native `<dialog>` element with proper header, main, footer elements
|
|
562
|
+
- **Accessibility First**: WCAG 2.1 AA compliant with full screen reader support
|
|
563
|
+
- **Focus Management**: Automatic focus trapping and restoration
|
|
564
|
+
- **Keyboard Navigation**: Escape to close, Tab for focus management
|
|
565
|
+
- **Responsive Design**: Adapts to all screen sizes with smart constraints
|
|
566
|
+
|
|
567
|
+
#### Advanced Features
|
|
568
|
+
- **Smart Height Management**: Automatic viewport-based height constraints
|
|
569
|
+
- **Scrollable Content**: Long content scrolls while keeping headers/footers visible
|
|
570
|
+
- **Sticky Headers/Footers**: Important UI elements remain accessible during scrolling
|
|
571
|
+
- **HTML Content Rendering**: Safe HTML content with automatic sanitization
|
|
572
|
+
- **Multiple Size Variants**: sm, md, lg, xl, full, auto sizing options
|
|
573
|
+
- **Custom Dimensions**: Fine-grained control over width and height
|
|
574
|
+
- **Configurable Close Behavior**: Control escape key and outside click behavior
|
|
575
|
+
- **Smooth Animations**: Polished transitions and micro-interactions
|
|
576
|
+
|
|
577
|
+
### Size Variants
|
|
578
|
+
|
|
579
|
+
| Size | Max Width | Use Case |
|
|
580
|
+
|------|-----------|----------|
|
|
581
|
+
| `sm` | 384px | Simple confirmations, alerts |
|
|
582
|
+
| `md` | 448px | Standard forms, basic content |
|
|
583
|
+
| `lg` | 512px | Complex forms, detailed content |
|
|
584
|
+
| `xl` | 576px | Large forms, data tables |
|
|
585
|
+
| `full` | 100% | Full screen experiences |
|
|
586
|
+
| `auto` | Content-based | Dynamic content sizing |
|
|
587
|
+
|
|
588
|
+
## Select
|
|
589
|
+
|
|
590
|
+
A dropdown select component with search functionality and keyboard navigation.
|
|
591
|
+
|
|
592
|
+
### Props
|
|
593
|
+
|
|
594
|
+
```typescript
|
|
595
|
+
interface SelectProps {
|
|
596
|
+
value?: string;
|
|
597
|
+
defaultValue?: string;
|
|
598
|
+
onValueChange?: (value: string) => void;
|
|
599
|
+
open?: boolean;
|
|
600
|
+
defaultOpen?: boolean;
|
|
601
|
+
onOpenChange?: (open: boolean) => void;
|
|
602
|
+
disabled?: boolean;
|
|
603
|
+
children: React.ReactNode;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
interface SelectTriggerProps extends Omit<ButtonProps, 'onClick' | 'onKeyDown'> {
|
|
607
|
+
children: React.ReactNode;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
interface SelectContentProps {
|
|
611
|
+
children: React.ReactNode;
|
|
612
|
+
className?: string;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
interface SelectItemProps {
|
|
616
|
+
value: string;
|
|
617
|
+
children: React.ReactNode;
|
|
618
|
+
disabled?: boolean;
|
|
619
|
+
className?: string;
|
|
620
|
+
}
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
### Usage
|
|
624
|
+
|
|
625
|
+
```tsx
|
|
626
|
+
import {
|
|
627
|
+
Select,
|
|
628
|
+
SelectTrigger,
|
|
629
|
+
SelectContent,
|
|
630
|
+
SelectItem,
|
|
631
|
+
SelectValue
|
|
632
|
+
} from '@jmruthers/pace-core';
|
|
633
|
+
|
|
634
|
+
<Select value={selectedValue} onValueChange={setSelectedValue}>
|
|
635
|
+
<SelectTrigger>
|
|
636
|
+
<SelectValue placeholder="Select an option" />
|
|
637
|
+
</SelectTrigger>
|
|
638
|
+
<SelectContent>
|
|
639
|
+
<SelectItem value="option1">Option 1</SelectItem>
|
|
640
|
+
<SelectItem value="option2">Option 2</SelectItem>
|
|
641
|
+
<SelectItem value="option3">Option 3</SelectItem>
|
|
642
|
+
</SelectContent>
|
|
643
|
+
</Select>
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
### Features
|
|
647
|
+
|
|
648
|
+
- **Search**: Built-in search functionality with fuzzy matching
|
|
649
|
+
- **Keyboard Navigation**: Full keyboard support with arrow keys
|
|
650
|
+
- **Accessibility**: ARIA attributes and screen reader support
|
|
651
|
+
- **Custom Styling**: Consistent with @jmruthers/pace-core design system
|
|
652
|
+
- **Composition**: Flexible component composition
|
|
653
|
+
|
|
654
|
+
## Alert
|
|
655
|
+
|
|
656
|
+
A flexible and accessible alert component for displaying important messages.
|
|
657
|
+
|
|
658
|
+
### Props
|
|
659
|
+
|
|
660
|
+
```typescript
|
|
661
|
+
interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
662
|
+
variant?: 'default' | 'destructive' | 'inline';
|
|
663
|
+
className?: string;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
interface AlertTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {
|
|
667
|
+
className?: string;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
interface AlertDescriptionProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
671
|
+
className?: string;
|
|
672
|
+
}
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
### Usage
|
|
676
|
+
|
|
677
|
+
```tsx
|
|
678
|
+
import { Alert, AlertTitle, AlertDescription } from '@jmruthers/pace-core';
|
|
679
|
+
|
|
680
|
+
// Basic alert
|
|
681
|
+
<Alert>
|
|
682
|
+
<AlertTitle>Success</AlertTitle>
|
|
683
|
+
<AlertDescription>Your changes have been saved.</AlertDescription>
|
|
684
|
+
</Alert>
|
|
685
|
+
|
|
686
|
+
// Destructive alert
|
|
687
|
+
<Alert variant="destructive">
|
|
688
|
+
<AlertTitle>Error</AlertTitle>
|
|
689
|
+
<AlertDescription>Something went wrong.</AlertDescription>
|
|
690
|
+
</Alert>
|
|
691
|
+
|
|
692
|
+
// Inline alert (renders as fragment)
|
|
693
|
+
<Alert variant="inline">
|
|
694
|
+
<AlertTitle>Note:</AlertTitle>
|
|
695
|
+
<AlertDescription>This is an inline message.</AlertDescription>
|
|
696
|
+
</Alert>
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
### Variants
|
|
700
|
+
|
|
701
|
+
- **default**: Standard alert with background and border
|
|
702
|
+
- **destructive**: Red alert for errors and warnings
|
|
703
|
+
- **inline**: Lightweight text formatting without background
|
|
704
|
+
|
|
705
|
+
## Card
|
|
706
|
+
|
|
707
|
+
A flexible card component suite for displaying content with consistent styling and semantic HTML structure.
|
|
708
|
+
|
|
709
|
+
### Props
|
|
710
|
+
|
|
711
|
+
```typescript
|
|
712
|
+
interface CardProps extends React.HTMLAttributes<HTMLElement> {
|
|
713
|
+
className?: string;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
interface CardHeaderProps extends React.HTMLAttributes<HTMLElement> {
|
|
717
|
+
className?: string;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {
|
|
721
|
+
className?: string;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
interface CardDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {
|
|
725
|
+
className?: string;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
interface CardContentProps extends React.HTMLAttributes<HTMLElement> {
|
|
729
|
+
className?: string;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
interface CardFooterProps extends React.HTMLAttributes<HTMLElement> {
|
|
733
|
+
className?: string;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
interface CardActionsProps extends React.HTMLAttributes<HTMLElement> {
|
|
737
|
+
className?: string;
|
|
738
|
+
}
|
|
739
|
+
```
|
|
740
|
+
|
|
741
|
+
### Usage
|
|
742
|
+
|
|
743
|
+
```tsx
|
|
744
|
+
import {
|
|
745
|
+
Card,
|
|
746
|
+
CardHeader,
|
|
747
|
+
CardTitle,
|
|
748
|
+
CardDescription,
|
|
749
|
+
CardContent,
|
|
750
|
+
CardFooter,
|
|
751
|
+
CardActions
|
|
752
|
+
} from '@jmruthers/pace-core';
|
|
753
|
+
|
|
754
|
+
<Card>
|
|
755
|
+
<CardHeader>
|
|
756
|
+
<CardTitle>Article Title</CardTitle>
|
|
757
|
+
<CardDescription>Brief description of the article content</CardDescription>
|
|
758
|
+
</CardHeader>
|
|
759
|
+
<CardContent>
|
|
760
|
+
<p>Main content goes here with proper semantic structure.</p>
|
|
761
|
+
<p>Additional paragraphs and content.</p>
|
|
762
|
+
</CardContent>
|
|
763
|
+
<CardFooter>
|
|
764
|
+
<CardActions>
|
|
765
|
+
<Button>Primary Action</Button>
|
|
766
|
+
<Button variant="outline">Secondary Action</Button>
|
|
767
|
+
</CardActions>
|
|
768
|
+
</CardFooter>
|
|
769
|
+
</Card>
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
### Semantic Structure
|
|
773
|
+
|
|
774
|
+
- **Card**: `<article>` element for self-contained content
|
|
775
|
+
- **CardHeader**: `<header>` element for card heading area
|
|
776
|
+
- **CardContent**: `<div>` element for primary card content
|
|
777
|
+
- **CardFooter**: `<footer>` element for card footer area
|
|
778
|
+
- **CardActions**: `<nav>` element for action buttons
|
|
779
|
+
|
|
780
|
+
## LoadingSpinner
|
|
781
|
+
|
|
782
|
+
A simple, accessible loading spinner component for indicating loading states.
|
|
783
|
+
|
|
784
|
+
### Props
|
|
785
|
+
|
|
786
|
+
```typescript
|
|
787
|
+
interface LoadingSpinnerProps {
|
|
788
|
+
size?: 'sm' | 'md' | 'lg';
|
|
789
|
+
className?: string;
|
|
790
|
+
}
|
|
791
|
+
```
|
|
792
|
+
|
|
793
|
+
### Usage
|
|
794
|
+
|
|
795
|
+
```tsx
|
|
796
|
+
import { LoadingSpinner } from '@jmruthers/pace-core';
|
|
797
|
+
|
|
798
|
+
// Basic loading spinner
|
|
799
|
+
<LoadingSpinner />
|
|
800
|
+
|
|
801
|
+
// Different sizes
|
|
802
|
+
<LoadingSpinner size="sm" />
|
|
803
|
+
<LoadingSpinner size="md" />
|
|
804
|
+
<LoadingSpinner size="lg" />
|
|
805
|
+
|
|
806
|
+
// With custom styling
|
|
807
|
+
<LoadingSpinner
|
|
808
|
+
size="lg"
|
|
809
|
+
className="text-main-500"
|
|
810
|
+
/>
|
|
811
|
+
|
|
812
|
+
// In a button
|
|
813
|
+
<Button disabled>
|
|
814
|
+
<LoadingSpinner size="sm" className="mr-2" />
|
|
815
|
+
Loading...
|
|
816
|
+
</Button>
|
|
817
|
+
```
|
|
818
|
+
|
|
819
|
+
### Features
|
|
820
|
+
|
|
821
|
+
- **Accessibility**: WCAG 2.1 AA compliant with proper ARIA attributes
|
|
822
|
+
- **Reduced Motion**: Supports users with vestibular disorders
|
|
823
|
+
- **Screen Reader**: Announces "Loading..." to screen readers
|
|
824
|
+
- **Performance**: CSS-only animations for optimal performance
|
|
825
|
+
|
|
826
|
+
## Toast
|
|
827
|
+
|
|
828
|
+
A comprehensive toast notification system with accessible, customizable notifications.
|
|
829
|
+
|
|
830
|
+
### Props
|
|
831
|
+
|
|
832
|
+
```typescript
|
|
833
|
+
interface ToastProps extends React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> {
|
|
834
|
+
className?: string;
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
interface ToastActionElement extends React.ReactElement<typeof ToastAction> {}
|
|
838
|
+
|
|
839
|
+
// useToast hook
|
|
840
|
+
interface ToastOptions {
|
|
841
|
+
title?: string;
|
|
842
|
+
description?: string;
|
|
843
|
+
variant?: 'default' | 'destructive' | 'success' | 'warning' | 'info';
|
|
844
|
+
action?: ToastActionElement;
|
|
845
|
+
duration?: number;
|
|
846
|
+
}
|
|
847
|
+
```
|
|
848
|
+
|
|
849
|
+
### Usage
|
|
850
|
+
|
|
851
|
+
```tsx
|
|
852
|
+
import { useToast, Toast, ToastTitle, ToastDescription, ToastAction } from '@jmruthers/pace-core';
|
|
853
|
+
|
|
854
|
+
function MyComponent() {
|
|
855
|
+
const { toast } = useToast();
|
|
856
|
+
|
|
857
|
+
const handleSuccess = () => {
|
|
858
|
+
toast({
|
|
859
|
+
title: "Success!",
|
|
860
|
+
description: "Your changes have been saved.",
|
|
861
|
+
variant: "success"
|
|
862
|
+
});
|
|
863
|
+
};
|
|
864
|
+
|
|
865
|
+
const handleError = () => {
|
|
866
|
+
toast({
|
|
867
|
+
title: "Error",
|
|
868
|
+
description: "Something went wrong.",
|
|
869
|
+
variant: "destructive",
|
|
870
|
+
action: <ToastAction altText="Retry">Retry</ToastAction>
|
|
871
|
+
});
|
|
872
|
+
};
|
|
873
|
+
|
|
874
|
+
return (
|
|
875
|
+
<div>
|
|
876
|
+
<Button onClick={handleSuccess}>Save Changes</Button>
|
|
877
|
+
<Button onClick={handleError}>Trigger Error</Button>
|
|
878
|
+
</div>
|
|
879
|
+
);
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
// Custom toast component
|
|
883
|
+
<Toast>
|
|
884
|
+
<ToastTitle>Custom Toast</ToastTitle>
|
|
885
|
+
<ToastDescription>This is a custom toast message.</ToastDescription>
|
|
886
|
+
<ToastAction altText="Close">Close</ToastAction>
|
|
887
|
+
</Toast>
|
|
888
|
+
```
|
|
889
|
+
|
|
890
|
+
### Features
|
|
891
|
+
|
|
892
|
+
- **Multiple Variants**: Success, error, warning, info, and default
|
|
893
|
+
- **Action Buttons**: Add custom actions to toasts
|
|
894
|
+
- **Auto-dismiss**: Configurable duration with auto-dismiss
|
|
895
|
+
- **Swipe Gestures**: Swipe to dismiss on mobile
|
|
896
|
+
- **Keyboard Navigation**: Full keyboard support
|
|
897
|
+
- **Accessibility**: WCAG 2.1 AA compliant
|
|
898
|
+
|
|
899
|
+
## Tooltip
|
|
900
|
+
|
|
901
|
+
A comprehensive tooltip component system with accessible, customizable tooltips.
|
|
902
|
+
|
|
903
|
+
### Props
|
|
904
|
+
|
|
905
|
+
```typescript
|
|
906
|
+
interface TooltipProps {
|
|
907
|
+
children: React.ReactNode;
|
|
908
|
+
content: React.ReactNode;
|
|
909
|
+
delayDuration?: number;
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
interface TooltipContentProps {
|
|
913
|
+
children: React.ReactNode;
|
|
914
|
+
className?: string;
|
|
915
|
+
side?: 'top' | 'bottom' | 'left' | 'right';
|
|
916
|
+
align?: 'start' | 'center' | 'end';
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
interface TooltipTriggerProps {
|
|
920
|
+
children: React.ReactNode;
|
|
921
|
+
asChild?: boolean;
|
|
922
|
+
}
|
|
923
|
+
```
|
|
924
|
+
|
|
925
|
+
### Usage
|
|
926
|
+
|
|
927
|
+
```tsx
|
|
928
|
+
import {
|
|
929
|
+
Tooltip,
|
|
930
|
+
TooltipProvider,
|
|
931
|
+
TooltipRoot,
|
|
932
|
+
TooltipTrigger,
|
|
933
|
+
TooltipContent
|
|
934
|
+
} from '@jmruthers/pace-core';
|
|
935
|
+
|
|
936
|
+
// Basic tooltip
|
|
937
|
+
<Tooltip content="This is a helpful tooltip">
|
|
938
|
+
<Button>Hover me</Button>
|
|
939
|
+
</Tooltip>
|
|
940
|
+
|
|
941
|
+
// Tooltip with custom delay
|
|
942
|
+
<Tooltip content="Custom delay" delayDuration={500}>
|
|
943
|
+
<IconButton icon={<Info />} />
|
|
944
|
+
</Tooltip>
|
|
945
|
+
|
|
946
|
+
// Advanced tooltip with custom content
|
|
947
|
+
<TooltipProvider>
|
|
948
|
+
<TooltipRoot>
|
|
949
|
+
<TooltipTrigger asChild>
|
|
950
|
+
<Button>Advanced Tooltip</Button>
|
|
951
|
+
</TooltipTrigger>
|
|
952
|
+
<TooltipContent side="top" className="bg-main-500 text-main-50">
|
|
953
|
+
<div className="space-y-1">
|
|
954
|
+
<p className="font-semibold">Advanced Tooltip</p>
|
|
955
|
+
<p className="text-xs">With custom styling</p>
|
|
956
|
+
</div>
|
|
957
|
+
</TooltipContent>
|
|
958
|
+
</TooltipRoot>
|
|
959
|
+
</TooltipProvider>
|
|
960
|
+
```
|
|
961
|
+
|
|
962
|
+
### Features
|
|
963
|
+
|
|
964
|
+
- **Multiple Positioning**: Top, bottom, left, right positioning
|
|
965
|
+
- **Custom Delay**: Configurable delay duration
|
|
966
|
+
- **Smooth Animations**: CSS transitions and animations
|
|
967
|
+
- **Keyboard Support**: Full keyboard navigation
|
|
968
|
+
- **Screen Reader**: Proper ARIA attributes
|
|
969
|
+
- **Responsive**: Adapts to screen size
|
|
970
|
+
|
|
971
|
+
## Dynamic Theming
|
|
972
|
+
|
|
973
|
+
### Runtime Theming API
|
|
974
|
+
|
|
975
|
+
For dynamic theming with organisation/event colors, use the runtime theming API:
|
|
976
|
+
|
|
977
|
+
```tsx
|
|
978
|
+
import { applyPalette, clearPalette } from '@jmruthers/pace-core/theming/runtime';
|
|
979
|
+
|
|
980
|
+
// Apply organisation colors
|
|
981
|
+
applyPalette({
|
|
982
|
+
main: orgData.colors.main,
|
|
983
|
+
sec: orgData.colors.sec,
|
|
984
|
+
acc: orgData.colors.acc
|
|
985
|
+
});
|
|
986
|
+
|
|
987
|
+
// Clear dynamic theming (return to app defaults)
|
|
988
|
+
clearPalette();
|
|
989
|
+
```
|
|
990
|
+
|
|
991
|
+
|
|
992
|
+
## Layout Components
|
|
993
|
+
|
|
994
|
+
### PaceAppLayout
|
|
995
|
+
|
|
996
|
+
A complete application layout with header, navigation, and content area.
|
|
997
|
+
|
|
998
|
+
```tsx
|
|
999
|
+
import { PaceAppLayout } from '@jmruthers/pace-core';
|
|
1000
|
+
|
|
1001
|
+
<PaceAppLayout>
|
|
1002
|
+
<div>Your app content</div>
|
|
1003
|
+
</PaceAppLayout>
|
|
1004
|
+
```
|
|
1005
|
+
|
|
1006
|
+
### Header
|
|
1007
|
+
|
|
1008
|
+
Application header with navigation and user menu.
|
|
1009
|
+
|
|
1010
|
+
```tsx
|
|
1011
|
+
import { Header } from '@jmruthers/pace-core';
|
|
1012
|
+
|
|
1013
|
+
<Header
|
|
1014
|
+
title="My App"
|
|
1015
|
+
user={currentUser}
|
|
1016
|
+
onLogout={handleLogout}
|
|
1017
|
+
/>
|
|
1018
|
+
```
|
|
1019
|
+
|
|
1020
|
+
### Footer
|
|
1021
|
+
|
|
1022
|
+
Application footer component.
|
|
1023
|
+
|
|
1024
|
+
```tsx
|
|
1025
|
+
import { Footer } from '@jmruthers/pace-core';
|
|
1026
|
+
|
|
1027
|
+
<Footer>
|
|
1028
|
+
<p>© 2024 My App. All rights reserved.</p>
|
|
1029
|
+
</Footer>
|
|
1030
|
+
```
|
|
1031
|
+
|
|
1032
|
+
## Navigation Components
|
|
1033
|
+
|
|
1034
|
+
### NavigationMenu
|
|
1035
|
+
|
|
1036
|
+
A flexible navigation menu component that supports both dropdown and hierarchical modes with built-in authentication and permission filtering.
|
|
1037
|
+
|
|
1038
|
+
```typescript
|
|
1039
|
+
interface NavigationMenuProps {
|
|
1040
|
+
items: NavigationItem[];
|
|
1041
|
+
mode?: 'dropdown' | 'hierarchical';
|
|
1042
|
+
currentPath?: string;
|
|
1043
|
+
onNavigate?: (item: NavigationItem) => void;
|
|
1044
|
+
className?: string;
|
|
1045
|
+
disabled?: boolean;
|
|
1046
|
+
buttonText?: string;
|
|
1047
|
+
showIcons?: boolean;
|
|
1048
|
+
navigationLabel?: string;
|
|
1049
|
+
strictMode?: boolean;
|
|
1050
|
+
auditLog?: boolean;
|
|
1051
|
+
onNavigationAccessDenied?: (itemId: string, reason: string) => void;
|
|
1052
|
+
onStrictModeViolation?: (itemId: string, reason: string) => void;
|
|
1053
|
+
filterByPermissions?: boolean;
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
interface NavigationItem {
|
|
1057
|
+
id: string;
|
|
1058
|
+
label: string;
|
|
1059
|
+
href?: string;
|
|
1060
|
+
icon?: string;
|
|
1061
|
+
children?: NavigationItem[];
|
|
1062
|
+
isActive?: boolean;
|
|
1063
|
+
permissions?: string[];
|
|
1064
|
+
roles?: string[];
|
|
1065
|
+
accessLevel?: string;
|
|
1066
|
+
pageId?: string;
|
|
1067
|
+
strictMode?: boolean;
|
|
1068
|
+
meta?: {
|
|
1069
|
+
title?: string;
|
|
1070
|
+
description?: string;
|
|
1071
|
+
hidden?: boolean;
|
|
1072
|
+
order?: number;
|
|
1073
|
+
};
|
|
1074
|
+
}
|
|
1075
|
+
```
|
|
1076
|
+
|
|
1077
|
+
#### Usage
|
|
1078
|
+
|
|
1079
|
+
**Basic Usage:**
|
|
1080
|
+
```tsx
|
|
1081
|
+
import { NavigationMenu } from '@jmruthers/pace-core';
|
|
1082
|
+
|
|
1083
|
+
const navItems = [
|
|
1084
|
+
{ id: 'home', label: 'Home', href: '/', icon: 'Home' },
|
|
1085
|
+
{ id: 'dashboard', label: 'Dashboard', href: '/dashboard', icon: 'LayoutDashboard' },
|
|
1086
|
+
{ id: 'settings', label: 'Settings', href: '/settings', icon: 'Settings' }
|
|
1087
|
+
];
|
|
1088
|
+
|
|
1089
|
+
<NavigationMenu
|
|
1090
|
+
items={navItems}
|
|
1091
|
+
mode="dropdown"
|
|
1092
|
+
currentPath={location.pathname}
|
|
1093
|
+
onNavigate={(item) => navigate(item.href)}
|
|
1094
|
+
buttonText="Menu"
|
|
1095
|
+
showIcons={true}
|
|
1096
|
+
/>
|
|
1097
|
+
```
|
|
1098
|
+
|
|
1099
|
+
**With Authentication and Permissions:**
|
|
1100
|
+
```tsx
|
|
1101
|
+
import { NavigationMenu } from '@jmruthers/pace-core';
|
|
1102
|
+
import { useUnifiedAuth } from '@jmruthers/pace-core/providers';
|
|
1103
|
+
|
|
1104
|
+
function AuthenticatedNavigation() {
|
|
1105
|
+
const { hasPermission, hasRole } = useUnifiedAuth();
|
|
1106
|
+
|
|
1107
|
+
const navItems = [
|
|
1108
|
+
{
|
|
1109
|
+
id: 'dashboard',
|
|
1110
|
+
label: 'Dashboard',
|
|
1111
|
+
href: '/dashboard',
|
|
1112
|
+
icon: 'LayoutDashboard',
|
|
1113
|
+
permissions: ['dashboard:read']
|
|
1114
|
+
},
|
|
1115
|
+
{
|
|
1116
|
+
id: 'meals',
|
|
1117
|
+
label: 'Meals',
|
|
1118
|
+
href: '/meals',
|
|
1119
|
+
icon: 'UtensilsCrossed',
|
|
1120
|
+
permissions: ['meals:read']
|
|
1121
|
+
},
|
|
1122
|
+
{
|
|
1123
|
+
id: 'admin',
|
|
1124
|
+
label: 'Admin Panel',
|
|
1125
|
+
href: '/admin',
|
|
1126
|
+
icon: 'Shield',
|
|
1127
|
+
roles: ['admin', 'super_admin']
|
|
1128
|
+
},
|
|
1129
|
+
{
|
|
1130
|
+
id: 'profile',
|
|
1131
|
+
label: 'Profile',
|
|
1132
|
+
href: '/profile',
|
|
1133
|
+
icon: 'User'
|
|
1134
|
+
}
|
|
1135
|
+
];
|
|
1136
|
+
|
|
1137
|
+
return (
|
|
1138
|
+
<NavigationMenu
|
|
1139
|
+
items={navItems}
|
|
1140
|
+
mode="dropdown"
|
|
1141
|
+
currentPath={location.pathname}
|
|
1142
|
+
onNavigate={(item) => navigate(item.href)}
|
|
1143
|
+
buttonText="Navigation"
|
|
1144
|
+
filterByPermissions={true}
|
|
1145
|
+
auditLog={true}
|
|
1146
|
+
/>
|
|
1147
|
+
);
|
|
1148
|
+
}
|
|
1149
|
+
```
|
|
1150
|
+
|
|
1151
|
+
### UserMenu
|
|
1152
|
+
|
|
1153
|
+
A user menu component with profile and logout options.
|
|
1154
|
+
|
|
1155
|
+
```tsx
|
|
1156
|
+
import { UserMenu } from '@jmruthers/pace-core';
|
|
1157
|
+
|
|
1158
|
+
<UserMenu
|
|
1159
|
+
user={currentUser}
|
|
1160
|
+
onLogout={handleLogout}
|
|
1161
|
+
onProfile={handleProfile}
|
|
1162
|
+
/>
|
|
1163
|
+
```
|
|
1164
|
+
|
|
1165
|
+
## Form Components
|
|
1166
|
+
|
|
1167
|
+
### Input
|
|
1168
|
+
|
|
1169
|
+
Text input component with validation.
|
|
1170
|
+
|
|
1171
|
+
```tsx
|
|
1172
|
+
import { Input } from '@jmruthers/pace-core';
|
|
1173
|
+
|
|
1174
|
+
<Input
|
|
1175
|
+
name="email"
|
|
1176
|
+
label="Email"
|
|
1177
|
+
type="email"
|
|
1178
|
+
placeholder="Enter your email"
|
|
1179
|
+
required
|
|
1180
|
+
/>
|
|
1181
|
+
```
|
|
1182
|
+
|
|
1183
|
+
### Checkbox
|
|
1184
|
+
|
|
1185
|
+
Checkbox component for boolean inputs.
|
|
1186
|
+
|
|
1187
|
+
```tsx
|
|
1188
|
+
import { Checkbox } from '@jmruthers/pace-core';
|
|
1189
|
+
|
|
1190
|
+
<Checkbox
|
|
1191
|
+
name="terms"
|
|
1192
|
+
label="I agree to the terms and conditions"
|
|
1193
|
+
required
|
|
1194
|
+
/>
|
|
1195
|
+
```
|
|
1196
|
+
|
|
1197
|
+
### Label
|
|
1198
|
+
|
|
1199
|
+
Form label component.
|
|
1200
|
+
|
|
1201
|
+
```tsx
|
|
1202
|
+
import { Label } from '@jmruthers/pace-core';
|
|
1203
|
+
|
|
1204
|
+
<Label htmlFor="email">Email Address</Label>
|
|
1205
|
+
```
|
|
1206
|
+
|
|
1207
|
+
## Security Components
|
|
1208
|
+
|
|
1209
|
+
### SuperAdminGuard
|
|
1210
|
+
|
|
1211
|
+
Conditionally renders content based on super admin status.
|
|
1212
|
+
|
|
1213
|
+
```tsx
|
|
1214
|
+
import { SuperAdminGuard, SuperAdminBadge, SuperAdminDebugPanel } from '@jmruthers/pace-core';
|
|
1215
|
+
|
|
1216
|
+
// Guard content for super admins only
|
|
1217
|
+
<SuperAdminGuard fallback={<div>Access denied</div>}>
|
|
1218
|
+
<AdminPanel />
|
|
1219
|
+
</SuperAdminGuard>
|
|
1220
|
+
|
|
1221
|
+
// Show super admin badge
|
|
1222
|
+
<SuperAdminBadge />
|
|
1223
|
+
|
|
1224
|
+
// Debug panel (development only)
|
|
1225
|
+
<SuperAdminDebugPanel />
|
|
1226
|
+
```
|
|
1227
|
+
|
|
1228
|
+
### PasswordChangeForm
|
|
1229
|
+
|
|
1230
|
+
Form component for changing user passwords.
|
|
1231
|
+
|
|
1232
|
+
```tsx
|
|
1233
|
+
import { PasswordChangeForm } from '@jmruthers/pace-core';
|
|
1234
|
+
|
|
1235
|
+
<PasswordChangeForm
|
|
1236
|
+
onSubmit={(values) => {
|
|
1237
|
+
// Handle password change
|
|
1238
|
+
console.log('New password:', values.newPassword);
|
|
1239
|
+
}}
|
|
1240
|
+
/>
|
|
1241
|
+
```
|
|
1242
|
+
|
|
1243
|
+
## Print Components
|
|
1244
|
+
|
|
1245
|
+
PACE Core includes a comprehensive set of print-optimized components for creating reports and documents.
|
|
1246
|
+
|
|
1247
|
+
### PrintLayout
|
|
1248
|
+
|
|
1249
|
+
The main container for print documents with A4 optimization.
|
|
1250
|
+
|
|
1251
|
+
```typescript
|
|
1252
|
+
interface PrintLayoutProps {
|
|
1253
|
+
children: React.ReactNode;
|
|
1254
|
+
orientation?: 'portrait' | 'landscape';
|
|
1255
|
+
pageSize?: 'A4' | 'A3' | 'Letter';
|
|
1256
|
+
className?: string;
|
|
1257
|
+
}
|
|
1258
|
+
```
|
|
1259
|
+
|
|
1260
|
+
### PrintHeader
|
|
1261
|
+
|
|
1262
|
+
Document header with title and branding.
|
|
1263
|
+
|
|
1264
|
+
```typescript
|
|
1265
|
+
interface PrintHeaderProps {
|
|
1266
|
+
title: string;
|
|
1267
|
+
subtitle?: string;
|
|
1268
|
+
branding?: {
|
|
1269
|
+
companyName: string;
|
|
1270
|
+
projectName?: string;
|
|
1271
|
+
logo?: string;
|
|
1272
|
+
};
|
|
1273
|
+
className?: string;
|
|
1274
|
+
}
|
|
1275
|
+
```
|
|
1276
|
+
|
|
1277
|
+
### PrintDataTable
|
|
1278
|
+
|
|
1279
|
+
Print-optimized data table with pagination and styling.
|
|
1280
|
+
|
|
1281
|
+
```typescript
|
|
1282
|
+
interface PrintDataTableProps<TData> {
|
|
1283
|
+
data: TData[];
|
|
1284
|
+
columns: PrintColumn<TData>[];
|
|
1285
|
+
title?: string;
|
|
1286
|
+
showPagination?: boolean;
|
|
1287
|
+
pageSize?: number;
|
|
1288
|
+
className?: string;
|
|
1289
|
+
}
|
|
1290
|
+
```
|
|
1291
|
+
|
|
1292
|
+
### PrintCard
|
|
1293
|
+
|
|
1294
|
+
Print-optimized card component.
|
|
1295
|
+
|
|
1296
|
+
```typescript
|
|
1297
|
+
interface PrintCardProps {
|
|
1298
|
+
children: React.ReactNode;
|
|
1299
|
+
title?: string;
|
|
1300
|
+
className?: string;
|
|
1301
|
+
}
|
|
1302
|
+
```
|
|
1303
|
+
|
|
1304
|
+
### PrintSection
|
|
1305
|
+
|
|
1306
|
+
Section divider for print documents.
|
|
1307
|
+
|
|
1308
|
+
```typescript
|
|
1309
|
+
interface PrintSectionProps {
|
|
1310
|
+
children: React.ReactNode;
|
|
1311
|
+
title?: string;
|
|
1312
|
+
level?: 1 | 2 | 3;
|
|
1313
|
+
className?: string;
|
|
1314
|
+
}
|
|
1315
|
+
```
|
|
1316
|
+
|
|
1317
|
+
### PrintGrid
|
|
1318
|
+
|
|
1319
|
+
Grid layout for print documents.
|
|
1320
|
+
|
|
1321
|
+
```typescript
|
|
1322
|
+
interface PrintGridProps {
|
|
1323
|
+
children: React.ReactNode;
|
|
1324
|
+
columns?: 1 | 2 | 3 | 4;
|
|
1325
|
+
gap?: 'sm' | 'md' | 'lg';
|
|
1326
|
+
className?: string;
|
|
1327
|
+
}
|
|
1328
|
+
```
|
|
1329
|
+
|
|
1330
|
+
### PrintButton
|
|
1331
|
+
|
|
1332
|
+
Print-optimized button (appears as text in print).
|
|
1333
|
+
|
|
1334
|
+
```typescript
|
|
1335
|
+
interface PrintButtonProps {
|
|
1336
|
+
children: React.ReactNode;
|
|
1337
|
+
onClick?: () => void;
|
|
1338
|
+
className?: string;
|
|
1339
|
+
}
|
|
1340
|
+
```
|
|
1341
|
+
|
|
1342
|
+
### PrintPageBreak
|
|
1343
|
+
|
|
1344
|
+
Forces a page break in print documents.
|
|
1345
|
+
|
|
1346
|
+
```tsx
|
|
1347
|
+
<PrintPageBreak />
|
|
1348
|
+
```
|
|
1349
|
+
|
|
1350
|
+
### PrintDivider
|
|
1351
|
+
|
|
1352
|
+
Visual divider for print documents.
|
|
1353
|
+
|
|
1354
|
+
```tsx
|
|
1355
|
+
<PrintDivider />
|
|
1356
|
+
```
|
|
1357
|
+
|
|
1358
|
+
### Print Usage Example
|
|
1359
|
+
|
|
1360
|
+
```tsx
|
|
1361
|
+
import {
|
|
1362
|
+
PrintLayout,
|
|
1363
|
+
PrintHeader,
|
|
1364
|
+
PrintDataTable,
|
|
1365
|
+
PrintCard,
|
|
1366
|
+
PrintSection,
|
|
1367
|
+
PrintPageBreak
|
|
1368
|
+
} from '@jmruthers/pace-core';
|
|
1369
|
+
|
|
1370
|
+
function ReportPage() {
|
|
1371
|
+
return (
|
|
1372
|
+
<PrintLayout orientation="portrait" pageSize="A4">
|
|
1373
|
+
<PrintHeader
|
|
1374
|
+
title="Monthly Report"
|
|
1375
|
+
subtitle="Q4 2024"
|
|
1376
|
+
branding={{
|
|
1377
|
+
companyName: "Your Company",
|
|
1378
|
+
projectName: "Analytics Dashboard"
|
|
1379
|
+
}}
|
|
1380
|
+
/>
|
|
1381
|
+
|
|
1382
|
+
<PrintSection title="Executive Summary" level={1}>
|
|
1383
|
+
<PrintCard title="Key Metrics">
|
|
1384
|
+
<p>Total revenue: $1,234,567</p>
|
|
1385
|
+
<p>Growth rate: 15.3%</p>
|
|
1386
|
+
</PrintCard>
|
|
1387
|
+
</PrintSection>
|
|
1388
|
+
|
|
1389
|
+
<PrintPageBreak />
|
|
1390
|
+
|
|
1391
|
+
<PrintSection title="Detailed Data" level={1}>
|
|
1392
|
+
<PrintDataTable
|
|
1393
|
+
data={reportData}
|
|
1394
|
+
columns={columns}
|
|
1395
|
+
title="Revenue by Region"
|
|
1396
|
+
showPagination={true}
|
|
1397
|
+
pageSize={20}
|
|
1398
|
+
/>
|
|
1399
|
+
</PrintSection>
|
|
1400
|
+
</PrintLayout>
|
|
1401
|
+
);
|
|
1402
|
+
}
|
|
1403
|
+
```
|
|
1404
|
+
|
|
1405
|
+
For detailed print component usage, see [Print Components Guide](../print-components/README.md).
|
|
1406
|
+
|
|
1407
|
+
## Public Page Components
|
|
1408
|
+
|
|
1409
|
+
PACE Core includes a complete set of components for creating public pages that work independently of your main application's authentication context.
|
|
1410
|
+
|
|
1411
|
+
### PublicPageProvider
|
|
1412
|
+
|
|
1413
|
+
**Required wrapper for all public pages.** Provides environment variables and context without authentication.
|
|
1414
|
+
|
|
1415
|
+
```typescript
|
|
1416
|
+
interface PublicPageProviderProps {
|
|
1417
|
+
children: React.ReactNode;
|
|
1418
|
+
environment?: {
|
|
1419
|
+
supabaseUrl?: string;
|
|
1420
|
+
supabaseKey?: string;
|
|
1421
|
+
};
|
|
1422
|
+
}
|
|
1423
|
+
```
|
|
1424
|
+
|
|
1425
|
+
### PublicPageLayout
|
|
1426
|
+
|
|
1427
|
+
**Main layout component for public pages.** Handles event data and provides consistent styling.
|
|
1428
|
+
|
|
1429
|
+
```typescript
|
|
1430
|
+
interface PublicPageLayoutProps {
|
|
1431
|
+
eventCode: string;
|
|
1432
|
+
children: React.ReactNode;
|
|
1433
|
+
event?: Event | null;
|
|
1434
|
+
showFooter?: boolean;
|
|
1435
|
+
className?: string;
|
|
1436
|
+
errorFallback?: React.ComponentType<{ error: Error; resetError: () => void }>;
|
|
1437
|
+
loadingFallback?: React.ComponentType;
|
|
1438
|
+
customHeader?: React.ReactNode;
|
|
1439
|
+
customFooter?: React.ReactNode;
|
|
1440
|
+
showValidationErrors?: boolean;
|
|
1441
|
+
}
|
|
1442
|
+
```
|
|
1443
|
+
|
|
1444
|
+
### PublicPageHeader
|
|
1445
|
+
|
|
1446
|
+
**Header component with event branding and information.**
|
|
1447
|
+
|
|
1448
|
+
```typescript
|
|
1449
|
+
interface PublicPageHeaderProps {
|
|
1450
|
+
event: Event;
|
|
1451
|
+
eventCode: string;
|
|
1452
|
+
title?: string;
|
|
1453
|
+
description?: string;
|
|
1454
|
+
showEventLogo?: boolean;
|
|
1455
|
+
showAppLogo?: boolean;
|
|
1456
|
+
className?: string;
|
|
1457
|
+
children?: React.ReactNode;
|
|
1458
|
+
customAppLogo?: React.ReactNode;
|
|
1459
|
+
customEventLogo?: React.ReactNode;
|
|
1460
|
+
}
|
|
1461
|
+
```
|
|
1462
|
+
|
|
1463
|
+
### PublicPageFooter
|
|
1464
|
+
|
|
1465
|
+
**Footer component with event and app information.**
|
|
1466
|
+
|
|
1467
|
+
```typescript
|
|
1468
|
+
interface PublicPageFooterProps {
|
|
1469
|
+
event: Event;
|
|
1470
|
+
showEventInfo?: boolean;
|
|
1471
|
+
showCopyright?: boolean;
|
|
1472
|
+
showAppBranding?: boolean;
|
|
1473
|
+
className?: string;
|
|
1474
|
+
children?: React.ReactNode;
|
|
1475
|
+
customCopyright?: string;
|
|
1476
|
+
customAppName?: string;
|
|
1477
|
+
}
|
|
1478
|
+
```
|
|
1479
|
+
|
|
1480
|
+
### PublicLoadingSpinner
|
|
1481
|
+
|
|
1482
|
+
**Loading spinner component for public pages.**
|
|
1483
|
+
|
|
1484
|
+
```typescript
|
|
1485
|
+
interface PublicLoadingSpinnerProps {
|
|
1486
|
+
message?: string;
|
|
1487
|
+
size?: 'sm' | 'md' | 'lg';
|
|
1488
|
+
className?: string;
|
|
1489
|
+
}
|
|
1490
|
+
```
|
|
1491
|
+
|
|
1492
|
+
### PublicErrorBoundary
|
|
1493
|
+
|
|
1494
|
+
**Error boundary component for public pages.**
|
|
1495
|
+
|
|
1496
|
+
```typescript
|
|
1497
|
+
interface PublicErrorBoundaryProps {
|
|
1498
|
+
children: React.ReactNode;
|
|
1499
|
+
fallback?: React.ComponentType<{ error: Error; resetError: () => void }>;
|
|
1500
|
+
onError?: (error: Error, errorInfo: React.ErrorInfo) => void;
|
|
1501
|
+
}
|
|
1502
|
+
```
|
|
1503
|
+
|
|
1504
|
+
### Public Page Usage Example
|
|
1505
|
+
|
|
1506
|
+
```tsx
|
|
1507
|
+
import {
|
|
1508
|
+
PublicPageProvider,
|
|
1509
|
+
PublicPageLayout,
|
|
1510
|
+
PublicPageHeader,
|
|
1511
|
+
PublicPageFooter,
|
|
1512
|
+
usePublicEvent,
|
|
1513
|
+
usePublicRouteParams,
|
|
1514
|
+
PublicLoadingSpinner
|
|
1515
|
+
} from '@jmruthers/pace-core';
|
|
1516
|
+
|
|
1517
|
+
function PublicPageApp() {
|
|
1518
|
+
return (
|
|
1519
|
+
<PublicPageProvider>
|
|
1520
|
+
<Routes>
|
|
1521
|
+
<Route path="/events/:eventCode" element={<PublicEventPage />} />
|
|
1522
|
+
</Routes>
|
|
1523
|
+
</PublicPageProvider>
|
|
1524
|
+
);
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
function PublicEventPage() {
|
|
1528
|
+
const { eventCode } = usePublicRouteParams({ fetchEventData: false });
|
|
1529
|
+
const { event, isLoading, error } = usePublicEvent(eventCode || '');
|
|
1530
|
+
|
|
1531
|
+
if (isLoading) {
|
|
1532
|
+
return <PublicLoadingSpinner message="Loading event..." />;
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
if (error || !event) {
|
|
1536
|
+
return <div>Event not found</div>;
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
return (
|
|
1540
|
+
<PublicPageLayout eventCode={eventCode || ''} event={event}>
|
|
1541
|
+
<PublicPageHeader
|
|
1542
|
+
event={event}
|
|
1543
|
+
eventCode={eventCode || ''}
|
|
1544
|
+
title="Event Details"
|
|
1545
|
+
description="Public information about this event"
|
|
1546
|
+
/>
|
|
1547
|
+
|
|
1548
|
+
<main>
|
|
1549
|
+
{/* Your public page content */}
|
|
1550
|
+
</main>
|
|
1551
|
+
|
|
1552
|
+
<PublicPageFooter event={event} />
|
|
1553
|
+
</PublicPageLayout>
|
|
1554
|
+
);
|
|
1555
|
+
}
|
|
1556
|
+
```
|
|
1557
|
+
|
|
1558
|
+
For detailed public page implementation, see [Public Pages Guide](../implementation-guides/public-pages.md).
|
|
1559
|
+
|
|
1560
|
+
## Utility Components
|
|
1561
|
+
|
|
1562
|
+
### ErrorBoundary
|
|
1563
|
+
|
|
1564
|
+
Catches and displays React errors gracefully.
|
|
1565
|
+
|
|
1566
|
+
```tsx
|
|
1567
|
+
import { ErrorBoundary } from '@jmruthers/pace-core';
|
|
1568
|
+
|
|
1569
|
+
<ErrorBoundary fallback={<ErrorComponent />}>
|
|
1570
|
+
<ComponentThatMightError />
|
|
1571
|
+
</ErrorBoundary>
|
|
1572
|
+
```
|
|
1573
|
+
|
|
1574
|
+
|
|
1575
|
+
## Component Styling
|
|
1576
|
+
|
|
1577
|
+
All components use Tailwind CSS for styling and support:
|
|
1578
|
+
|
|
1579
|
+
- **Responsive Design**: Mobile-first approach
|
|
1580
|
+
- **Accessibility**: WCAG 2.1 AA compliant
|
|
1581
|
+
- **Customization**: Extensible with className prop
|
|
1582
|
+
- **Consistent Spacing**: Design system spacing
|
|
1583
|
+
- **Typography**: Consistent font hierarchy
|
|
1584
|
+
|
|
1585
|
+
## Component Testing
|
|
1586
|
+
|
|
1587
|
+
All components include:
|
|
1588
|
+
|
|
1589
|
+
- **Unit Tests**: Component behavior testing
|
|
1590
|
+
- **Integration Tests**: Component interaction testing
|
|
1591
|
+
- **Accessibility Tests**: Screen reader compatibility
|
|
1592
|
+
- **Visual Tests**: Visual regression testing
|
|
1593
|
+
- **Performance Tests**: Rendering performance
|
|
1594
|
+
|
|
1595
|
+
For more information about testing components, see the [Testing Guide](../best-practices/testing.md).
|
|
1596
|
+
|
|
1597
|
+
## 🔗 Related Documentation
|
|
1598
|
+
|
|
1599
|
+
### Component Usage
|
|
1600
|
+
- **[Data Tables Implementation](../implementation-guides/data-tables.md)** - Complete data table guide
|
|
1601
|
+
- **[Forms Implementation](../implementation-guides/forms.md)** - Form handling patterns
|
|
1602
|
+
- **[App Layout Implementation](../implementation-guides/app-layout.md)** - Layout patterns
|
|
1603
|
+
- **[Navigation Implementation](../implementation-guides/navigation.md)** - Navigation systems
|
|
1604
|
+
|
|
1605
|
+
### Styling & Theming
|
|
1606
|
+
- **[Styling Overview](../styles/README.md)** - Design system and theming
|
|
1607
|
+
- **[Component Styling](../styles/component-styling.md)** - How components are styled
|
|
1608
|
+
- **[Custom Themes](../styles/custom-themes.md)** - Creating custom themes
|
|
1609
|
+
|
|
1610
|
+
### Best Practices
|
|
1611
|
+
- **[Component Best Practices](../best-practices/README.md#component-usage)** - Component usage guidelines
|
|
1612
|
+
- **[Performance Best Practices](../best-practices/performance.md)** - Performance optimization
|
|
1613
|
+
- **[Accessibility Guidelines](../best-practices/README.md#accessibility)** - Accessibility best practices
|
|
1614
|
+
|
|
1615
|
+
### Troubleshooting
|
|
1616
|
+
- **[Common Issues](../troubleshooting/common-issues.md)** - Component-related problems
|
|
1617
|
+
- **[Styling Issues](../troubleshooting/styling-issues.md)** - Styling problems
|
|
1618
|
+
- **[Debugging Guide](../troubleshooting/debugging.md)** - Debugging techniques
|
|
1619
|
+
|
|
1620
|
+
### Examples
|
|
1621
|
+
- **[Basic Auth App](../getting-started/examples/basic-auth-app.md)** - Simple component usage
|
|
1622
|
+
- **[Full-Featured App](../getting-started/examples/full-featured-app.md)** - Advanced patterns
|
|
1623
|
+
- **[Component Examples](../getting-started/examples/)** - Complete working examples
|