@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.
Files changed (1009) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/README.md +299 -0
  3. package/dist/DataTable-BHlzyKZP.d.ts +116 -0
  4. package/dist/DataTable-GEY5U7OI.js +100 -0
  5. package/dist/DataTable-GEY5U7OI.js.map +1 -0
  6. package/dist/PublicLoadingSpinner-DztrzuJr.d.ts +3430 -0
  7. package/dist/UnifiedAuthProvider-w66zSCUf.d.ts +160 -0
  8. package/dist/api-GZHIDA4X.js +41 -0
  9. package/dist/api-GZHIDA4X.js.map +1 -0
  10. package/dist/appConfig-BVGyuvI7.d.ts +71 -0
  11. package/dist/appNameResolver-7GHF5ED2.js +22 -0
  12. package/dist/appNameResolver-7GHF5ED2.js.map +1 -0
  13. package/dist/audit-BUW3LMJB.js +16 -0
  14. package/dist/audit-BUW3LMJB.js.map +1 -0
  15. package/dist/chunk-22KLBHPS.js +29 -0
  16. package/dist/chunk-22KLBHPS.js.map +1 -0
  17. package/dist/chunk-24MKLB7U.js +81 -0
  18. package/dist/chunk-24MKLB7U.js.map +1 -0
  19. package/dist/chunk-2MKP6IYD.js +388 -0
  20. package/dist/chunk-2MKP6IYD.js.map +1 -0
  21. package/dist/chunk-2V3Y6YBC.js +114 -0
  22. package/dist/chunk-2V3Y6YBC.js.map +1 -0
  23. package/dist/chunk-5CDJCTOO.js +190 -0
  24. package/dist/chunk-5CDJCTOO.js.map +1 -0
  25. package/dist/chunk-6ZQVSHKL.js +1345 -0
  26. package/dist/chunk-6ZQVSHKL.js.map +1 -0
  27. package/dist/chunk-74C6SNEC.js +77 -0
  28. package/dist/chunk-74C6SNEC.js.map +1 -0
  29. package/dist/chunk-7BNPOCLL.js +178 -0
  30. package/dist/chunk-7BNPOCLL.js.map +1 -0
  31. package/dist/chunk-7JL3T7BO.js +3344 -0
  32. package/dist/chunk-7JL3T7BO.js.map +1 -0
  33. package/dist/chunk-CDQ3PX7L.js +18 -0
  34. package/dist/chunk-CDQ3PX7L.js.map +1 -0
  35. package/dist/chunk-DY5E3AT7.js +1734 -0
  36. package/dist/chunk-DY5E3AT7.js.map +1 -0
  37. package/dist/chunk-ETEJVKYK.js +6032 -0
  38. package/dist/chunk-ETEJVKYK.js.map +1 -0
  39. package/dist/chunk-I5Z3QH5X.js +32 -0
  40. package/dist/chunk-I5Z3QH5X.js.map +1 -0
  41. package/dist/chunk-MZBUOP4P.js +119 -0
  42. package/dist/chunk-MZBUOP4P.js.map +1 -0
  43. package/dist/chunk-N2EUGZRW.js +98 -0
  44. package/dist/chunk-N2EUGZRW.js.map +1 -0
  45. package/dist/chunk-NQ4TOOO6.js +20 -0
  46. package/dist/chunk-NQ4TOOO6.js.map +1 -0
  47. package/dist/chunk-OHXGNT3K.js +21 -0
  48. package/dist/chunk-OHXGNT3K.js.map +1 -0
  49. package/dist/chunk-OKXMUYIB.js +522 -0
  50. package/dist/chunk-OKXMUYIB.js.map +1 -0
  51. package/dist/chunk-PFRRIDYA.js +382 -0
  52. package/dist/chunk-PFRRIDYA.js.map +1 -0
  53. package/dist/chunk-PLDDJCW6.js +49 -0
  54. package/dist/chunk-PLDDJCW6.js.map +1 -0
  55. package/dist/chunk-SS3E6QLB.js +695 -0
  56. package/dist/chunk-SS3E6QLB.js.map +1 -0
  57. package/dist/chunk-TMRLB2LA.js +326 -0
  58. package/dist/chunk-TMRLB2LA.js.map +1 -0
  59. package/dist/chunk-WYB6MBZA.js +5533 -0
  60. package/dist/chunk-WYB6MBZA.js.map +1 -0
  61. package/dist/chunk-YDJW5XTN.js +84 -0
  62. package/dist/chunk-YDJW5XTN.js.map +1 -0
  63. package/dist/components.d.ts +1308 -0
  64. package/dist/components.js +3759 -0
  65. package/dist/components.js.map +1 -0
  66. package/dist/database-C3Szpi5J.d.ts +470 -0
  67. package/dist/hooks.d.ts +449 -0
  68. package/dist/hooks.js +612 -0
  69. package/dist/hooks.js.map +1 -0
  70. package/dist/index.d.ts +385 -0
  71. package/dist/index.js +569 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/organisation-CO3Sh3_D.d.ts +99 -0
  74. package/dist/providers.d.ts +45 -0
  75. package/dist/providers.js +36 -0
  76. package/dist/providers.js.map +1 -0
  77. package/dist/rbac/eslint-rules.d.ts +52 -0
  78. package/dist/rbac/eslint-rules.js +252 -0
  79. package/dist/rbac/eslint-rules.js.map +1 -0
  80. package/dist/rbac/index.d.ts +1918 -0
  81. package/dist/rbac/index.js +2212 -0
  82. package/dist/rbac/index.js.map +1 -0
  83. package/dist/styles/core.css +401 -0
  84. package/dist/styles/fonts/georama-italic.woff2 +0 -0
  85. package/dist/styles/fonts/georama.woff2 +0 -0
  86. package/dist/styles/fonts/open-sans-italic.woff2 +0 -0
  87. package/dist/styles/fonts/open-sans.woff2 +0 -0
  88. package/dist/styles/fonts/reddit-mono.woff2 +0 -0
  89. package/dist/styles/index.d.ts +36 -0
  90. package/dist/styles/index.js +24 -0
  91. package/dist/styles/index.js.map +1 -0
  92. package/dist/theming/runtime.d.ts +73 -0
  93. package/dist/theming/runtime.js +16 -0
  94. package/dist/theming/runtime.js.map +1 -0
  95. package/dist/types-CInEi-ng.d.ts +316 -0
  96. package/dist/types.d.ts +196 -0
  97. package/dist/types.js +83 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/unified-CM7T0aTK.d.ts +198 -0
  100. package/dist/useComponentPerformance-DE9l5RkL.d.ts +11 -0
  101. package/dist/usePublicRouteParams-B6i0KtXW.d.ts +477 -0
  102. package/dist/utils.d.ts +639 -0
  103. package/dist/utils.js +1103 -0
  104. package/dist/utils.js.map +1 -0
  105. package/dist/validation-PM_iOaTI.d.ts +159 -0
  106. package/dist/validation.d.ts +138 -0
  107. package/dist/validation.js +477 -0
  108. package/dist/validation.js.map +1 -0
  109. package/docs/INDEX.md +192 -0
  110. package/docs/README.md +165 -0
  111. package/docs/api/.nojekyll +1 -0
  112. package/docs/api/README.md +301 -0
  113. package/docs/api/classes/ErrorBoundary.md +144 -0
  114. package/docs/api/classes/PublicErrorBoundary.md +132 -0
  115. package/docs/api/interfaces/AggregateConfig.md +43 -0
  116. package/docs/api/interfaces/ButtonProps.md +53 -0
  117. package/docs/api/interfaces/CardProps.md +40 -0
  118. package/docs/api/interfaces/ColorPalette.md +7 -0
  119. package/docs/api/interfaces/ColorShade.md +41 -0
  120. package/docs/api/interfaces/DataTableAction.md +200 -0
  121. package/docs/api/interfaces/DataTableColumn.md +300 -0
  122. package/docs/api/interfaces/DataTableProps.md +517 -0
  123. package/docs/api/interfaces/DataTableToolbarButton.md +96 -0
  124. package/docs/api/interfaces/EmptyStateConfig.md +61 -0
  125. package/docs/api/interfaces/EventContextType.md +96 -0
  126. package/docs/api/interfaces/EventLogoProps.md +152 -0
  127. package/docs/api/interfaces/EventProviderProps.md +19 -0
  128. package/docs/api/interfaces/FileSizeLimits.md +7 -0
  129. package/docs/api/interfaces/FileUploadProps.md +154 -0
  130. package/docs/api/interfaces/FooterProps.md +105 -0
  131. package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
  132. package/docs/api/interfaces/InputProps.md +53 -0
  133. package/docs/api/interfaces/LabelProps.md +107 -0
  134. package/docs/api/interfaces/LoginFormProps.md +184 -0
  135. package/docs/api/interfaces/NavigationItem.md +176 -0
  136. package/docs/api/interfaces/NavigationMenuProps.md +236 -0
  137. package/docs/api/interfaces/Organisation.md +140 -0
  138. package/docs/api/interfaces/OrganisationContextType.md +377 -0
  139. package/docs/api/interfaces/OrganisationMembership.md +140 -0
  140. package/docs/api/interfaces/OrganisationProviderProps.md +19 -0
  141. package/docs/api/interfaces/OrganisationSecurityError.md +62 -0
  142. package/docs/api/interfaces/PaceAppLayoutProps.md +393 -0
  143. package/docs/api/interfaces/PaceLoginPageProps.md +34 -0
  144. package/docs/api/interfaces/PaletteData.md +41 -0
  145. package/docs/api/interfaces/PublicErrorBoundaryProps.md +94 -0
  146. package/docs/api/interfaces/PublicErrorBoundaryState.md +68 -0
  147. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +86 -0
  148. package/docs/api/interfaces/PublicPageFooterProps.md +112 -0
  149. package/docs/api/interfaces/PublicPageHeaderProps.md +138 -0
  150. package/docs/api/interfaces/PublicPageLayoutProps.md +138 -0
  151. package/docs/api/interfaces/StorageConfig.md +41 -0
  152. package/docs/api/interfaces/StorageFileInfo.md +74 -0
  153. package/docs/api/interfaces/StorageFileMetadata.md +140 -0
  154. package/docs/api/interfaces/StorageListOptions.md +86 -0
  155. package/docs/api/interfaces/StorageListResult.md +41 -0
  156. package/docs/api/interfaces/StorageUploadOptions.md +88 -0
  157. package/docs/api/interfaces/StorageUploadResult.md +63 -0
  158. package/docs/api/interfaces/StorageUrlOptions.md +47 -0
  159. package/docs/api/interfaces/StyleImport.md +19 -0
  160. package/docs/api/interfaces/ToastActionElement.md +9 -0
  161. package/docs/api/interfaces/ToastProps.md +9 -0
  162. package/docs/api/interfaces/UnifiedAuthContextType.md +1108 -0
  163. package/docs/api/interfaces/UnifiedAuthProviderProps.md +171 -0
  164. package/docs/api/interfaces/UseInactivityTrackerOptions.md +136 -0
  165. package/docs/api/interfaces/UseInactivityTrackerReturn.md +123 -0
  166. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  167. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  168. package/docs/api/interfaces/UsePublicEventOptions.md +34 -0
  169. package/docs/api/interfaces/UsePublicEventReturn.md +68 -0
  170. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +94 -0
  171. package/docs/api/interfaces/UserEventAccess.md +118 -0
  172. package/docs/api/interfaces/UserMenuProps.md +86 -0
  173. package/docs/api/interfaces/UserProfile.md +63 -0
  174. package/docs/api/modules.md +4153 -0
  175. package/docs/api-reference/components.md +1623 -0
  176. package/docs/api-reference/hooks.md +627 -0
  177. package/docs/api-reference/providers.md +487 -0
  178. package/docs/api-reference/types.md +1005 -0
  179. package/docs/api-reference/utilities.md +1104 -0
  180. package/docs/app.css.example +53 -0
  181. package/docs/architecture/README.md +577 -0
  182. package/docs/best-practices/README.md +400 -0
  183. package/docs/best-practices/deployment.md +1042 -0
  184. package/docs/best-practices/performance.md +789 -0
  185. package/docs/best-practices/security.md +881 -0
  186. package/docs/best-practices/testing.md +981 -0
  187. package/docs/consuming-app-example.md +290 -0
  188. package/docs/consuming-app-vite-config.md +233 -0
  189. package/docs/core-concepts/authentication.md +98 -0
  190. package/docs/core-concepts/events.md +756 -0
  191. package/docs/core-concepts/organisations.md +790 -0
  192. package/docs/core-concepts/permissions.md +729 -0
  193. package/docs/core-concepts/rbac-system.md +233 -0
  194. package/docs/database-schema-requirements.md +172 -0
  195. package/docs/documentation-style-checklist.md +294 -0
  196. package/docs/examples/navigation-menu-auth-fix.md +344 -0
  197. package/docs/getting-started/examples/README.md +106 -0
  198. package/docs/getting-started/examples/basic-auth-app.md +521 -0
  199. package/docs/getting-started/examples/full-featured-app.md +616 -0
  200. package/docs/getting-started/installation.md +269 -0
  201. package/docs/getting-started/quick-start.md +401 -0
  202. package/docs/implementation-guides/app-layout.md +983 -0
  203. package/docs/implementation-guides/data-tables.md +1898 -0
  204. package/docs/implementation-guides/dynamic-colors.md +195 -0
  205. package/docs/implementation-guides/forms.md +578 -0
  206. package/docs/implementation-guides/hierarchical-datatable.md +850 -0
  207. package/docs/implementation-guides/large-datasets.md +281 -0
  208. package/docs/implementation-guides/navigation.md +844 -0
  209. package/docs/implementation-guides/performance.md +403 -0
  210. package/docs/implementation-guides/permission-enforcement.md +764 -0
  211. package/docs/implementation-guides/public-pages.md +752 -0
  212. package/docs/migration/README.md +493 -0
  213. package/docs/migration/organisation-context-timing-fix.md +217 -0
  214. package/docs/migration/quick-migration-guide.md +320 -0
  215. package/docs/migration/rbac-migration.md +571 -0
  216. package/docs/migration/v0.4.15-tailwind-scanning.md +272 -0
  217. package/docs/migration/v0.4.16-css-first-approach.md +306 -0
  218. package/docs/migration/v0.4.17-source-path-fix.md +229 -0
  219. package/docs/migration-guide.md +168 -0
  220. package/docs/performance/README.md +551 -0
  221. package/docs/print-components/README.md +258 -0
  222. package/docs/print-components/api-reference.md +636 -0
  223. package/docs/print-components/examples/README.md +204 -0
  224. package/docs/print-components/examples/basic-report.tsx +92 -0
  225. package/docs/print-components/examples/card-catalog.tsx +149 -0
  226. package/docs/print-components/examples/cover-page-report.tsx +163 -0
  227. package/docs/print-components/quick-start.md +363 -0
  228. package/docs/quick-reference.md +576 -0
  229. package/docs/rbac/README.md +265 -0
  230. package/docs/rbac/advanced-patterns.md +776 -0
  231. package/docs/rbac/api-reference.md +1033 -0
  232. package/docs/rbac/examples.md +883 -0
  233. package/docs/rbac/getting-started.md +679 -0
  234. package/docs/rbac/quick-start.md +619 -0
  235. package/docs/rbac/super-admin-guide.md +592 -0
  236. package/docs/rbac/troubleshooting.md +316 -0
  237. package/docs/security/README.md +680 -0
  238. package/docs/security/checklist.md +343 -0
  239. package/docs/style-guide.md +522 -0
  240. package/docs/styles/README.md +319 -0
  241. package/docs/testing/README.md +874 -0
  242. package/docs/troubleshooting/README.md +497 -0
  243. package/docs/troubleshooting/common-issues.md +1563 -0
  244. package/docs/troubleshooting/database-view-compatibility.md +119 -0
  245. package/docs/troubleshooting/debugging.md +1117 -0
  246. package/docs/troubleshooting/migration.md +918 -0
  247. package/docs/troubleshooting/organisation-context-setup.md +277 -0
  248. package/docs/troubleshooting/react-hooks-issue-analysis.md +166 -0
  249. package/docs/troubleshooting/styling-issues.md +219 -0
  250. package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
  251. package/docs/usage.md +175 -0
  252. package/docs/visual-testing.md +114 -0
  253. package/package.json +211 -0
  254. package/src/__mocks__/lucide-react.ts +181 -0
  255. package/src/__tests__/README.md +404 -0
  256. package/src/__tests__/debug-provider.unit.test.tsx +67 -0
  257. package/src/__tests__/e2e/workflows.test.tsx +373 -0
  258. package/src/__tests__/hybridPermissions.unit.test.tsx +474 -0
  259. package/src/__tests__/index.integration.test.ts +491 -0
  260. package/src/__tests__/mocks/MockAuthProvider-standalone.tsx +47 -0
  261. package/src/__tests__/mocks/MockAuthProvider.tsx +63 -0
  262. package/src/__tests__/mocks/enhancedSupabaseMock.ts +252 -0
  263. package/src/__tests__/mocks/index.test.ts +23 -0
  264. package/src/__tests__/mocks/index.ts +16 -0
  265. package/src/__tests__/mocks/mockAuth.ts +155 -0
  266. package/src/__tests__/mocks/mockSupabase.ts +83 -0
  267. package/src/__tests__/mocks/mockSupabaseClient.ts +63 -0
  268. package/src/__tests__/mocks/providers.tsx +22 -0
  269. package/src/__tests__/patterns/__tests__/testPatterns.test.ts +394 -0
  270. package/src/__tests__/patterns/testPatterns.ts +124 -0
  271. package/src/__tests__/performance/componentPerformance.performance.test.ts +27 -0
  272. package/src/__tests__/performance/index.ts +24 -0
  273. package/src/__tests__/performance/performanceValidation.performance.test.ts +15 -0
  274. package/src/__tests__/security/security.unit.test.tsx +7 -0
  275. package/src/__tests__/security/securityValidation.security.test.tsx +153 -0
  276. package/src/__tests__/setup.ts +259 -0
  277. package/src/__tests__/setupTests.d.ts +1 -0
  278. package/src/__tests__/shared/componentTestUtils.tsx +475 -0
  279. package/src/__tests__/shared/errorHandlingTestUtils.ts +107 -0
  280. package/src/__tests__/shared/index.ts +81 -0
  281. package/src/__tests__/shared/integrationTestUtils.tsx +375 -0
  282. package/src/__tests__/shared/performanceTestUtils.tsx +476 -0
  283. package/src/__tests__/shared/testUtils.optimized.tsx +627 -0
  284. package/src/__tests__/simple.test.tsx +20 -0
  285. package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
  286. package/src/__tests__/templates/component.test.template.tsx +122 -0
  287. package/src/__tests__/templates/integration.test.template.tsx +199 -0
  288. package/src/__tests__/test-utils/dataFactories.ts +60 -0
  289. package/src/__tests__/test-utils/index.ts +6 -0
  290. package/src/__tests__/typeSafety.unit.test.ts +65 -0
  291. package/src/__tests__/unifiedAuth.unit.test.tsx +151 -0
  292. package/src/__tests__/utils/accessibilityHelpers.ts +254 -0
  293. package/src/__tests__/utils/assertions.ts +50 -0
  294. package/src/__tests__/utils/deterministicHelpers.ts +31 -0
  295. package/src/__tests__/utils/edgeCaseConfig.test.ts +75 -0
  296. package/src/__tests__/utils/edgeCaseConfig.ts +98 -0
  297. package/src/__tests__/utils/mockHelpers.ts +149 -0
  298. package/src/__tests__/utils/mockLoader.ts +101 -0
  299. package/src/__tests__/utils/performanceHelpers.ts +55 -0
  300. package/src/__tests__/utils/performanceTestHelpers.ts +68 -0
  301. package/src/__tests__/utils/testDataFactories.ts +28 -0
  302. package/src/__tests__/utils/testIsolation.ts +67 -0
  303. package/src/__tests__/utils/visualTestHelpers.ts +20 -0
  304. package/src/__tests__/visual/__snapshots__/componentSnapshots.visual.test.tsx.snap +68 -0
  305. package/src/__tests__/visual/__snapshots__/componentVisuals.visual.test.tsx.snap +14 -0
  306. package/src/__tests__/visual/__snapshots__/visualRegression.test.tsx.snap +217 -0
  307. package/src/__tests__/visual/__snapshots__/visualRegression.visual.test.tsx.snap +24 -0
  308. package/src/__tests__/visual/componentSnapshots.visual.test.tsx +33 -0
  309. package/src/__tests__/visual/componentVisuals.visual.test.tsx +12 -0
  310. package/src/__tests__/visual/visualRegression.visual.test.tsx +20 -0
  311. package/src/components/Alert/Alert.tsx +134 -0
  312. package/src/components/Alert/__tests__/Alert.unit.test.tsx +381 -0
  313. package/src/components/Alert/index.ts +2 -0
  314. package/src/components/Avatar/Avatar.tsx +84 -0
  315. package/src/components/Avatar/__tests__/Avatar.unit.test.tsx +232 -0
  316. package/src/components/Avatar/index.ts +2 -0
  317. package/src/components/Button/Button.tsx +270 -0
  318. package/src/components/Button/__tests__/Button.accessibility.test.tsx +131 -0
  319. package/src/components/Button/__tests__/Button.comprehensive.test.tsx +721 -0
  320. package/src/components/Button/__tests__/Button.unit.test.tsx +189 -0
  321. package/src/components/Button/__tests__/EventSelector.integration.test.tsx +285 -0
  322. package/src/components/Button/index.ts +2 -0
  323. package/src/components/Card/Card.tsx +271 -0
  324. package/src/components/Card/__tests__/Card.accessibility.test.tsx +394 -0
  325. package/src/components/Card/__tests__/Card.comprehensive.test.tsx +599 -0
  326. package/src/components/Card/__tests__/Card.integration.test.tsx +673 -0
  327. package/src/components/Card/__tests__/Card.performance.test.tsx +546 -0
  328. package/src/components/Card/__tests__/Card.unit.test.tsx +330 -0
  329. package/src/components/Card/__tests__/Card.visual.test.tsx +599 -0
  330. package/src/components/Card/__tests__/README.md +211 -0
  331. package/src/components/Card/index.ts +1 -0
  332. package/src/components/Checkbox/Checkbox.tsx +75 -0
  333. package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
  334. package/src/components/Checkbox/__tests__/Checkbox.unit.test.tsx +520 -0
  335. package/src/components/Checkbox/index.ts +2 -0
  336. package/src/components/DataTable/DataTable.tsx +440 -0
  337. package/src/components/DataTable/__tests__/DataTable.autoSizing.test.tsx +526 -0
  338. package/src/components/DataTable/__tests__/DataTable.errorHandling.test.tsx +259 -0
  339. package/src/components/DataTable/__tests__/DataTable.hierarchical.test.tsx +675 -0
  340. package/src/components/DataTable/__tests__/DataTable.infinite-loop.test.tsx +324 -0
  341. package/src/components/DataTable/__tests__/DataTable.integration.test.tsx +724 -0
  342. package/src/components/DataTable/__tests__/DataTable.performance.test.tsx +597 -0
  343. package/src/components/DataTable/__tests__/DataTable.permissions.test.tsx +306 -0
  344. package/src/components/DataTable/__tests__/DataTable.regressionFixes.test.tsx +546 -0
  345. package/src/components/DataTable/__tests__/DataTable.selection.controlled.test.tsx +386 -0
  346. package/src/components/DataTable/__tests__/DataTable.selection.test.tsx +338 -0
  347. package/src/components/DataTable/__tests__/DataTable.userWorkflows.test.tsx +310 -0
  348. package/src/components/DataTable/__tests__/DataTable.workflowValidation.test.tsx +489 -0
  349. package/src/components/DataTable/__tests__/DataTable.workflows.test.tsx +701 -0
  350. package/src/components/DataTable/__tests__/README.md +136 -0
  351. package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
  352. package/src/components/DataTable/__tests__/performance-regression.test.tsx +788 -0
  353. package/src/components/DataTable/__tests__/performance.test.tsx +365 -0
  354. package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
  355. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +382 -0
  356. package/src/components/DataTable/__tests__/test-utils.ts +94 -0
  357. package/src/components/DataTable/components/ActionButtons.tsx +177 -0
  358. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +160 -0
  359. package/src/components/DataTable/components/ColumnFilter.tsx +114 -0
  360. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +100 -0
  361. package/src/components/DataTable/components/DataTableBody.tsx +462 -0
  362. package/src/components/DataTable/components/DataTableCore.tsx +869 -0
  363. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
  364. package/src/components/DataTable/components/DataTableHeader.tsx +31 -0
  365. package/src/components/DataTable/components/DataTableModals.tsx +87 -0
  366. package/src/components/DataTable/components/DataTableToolbar.tsx +251 -0
  367. package/src/components/DataTable/components/DraggableColumnHeader.tsx +148 -0
  368. package/src/components/DataTable/components/EditableRow.tsx +160 -0
  369. package/src/components/DataTable/components/EmptyState.tsx +64 -0
  370. package/src/components/DataTable/components/ExpandButton.tsx +113 -0
  371. package/src/components/DataTable/components/FilterRow.tsx +101 -0
  372. package/src/components/DataTable/components/GroupHeader.tsx +42 -0
  373. package/src/components/DataTable/components/GroupingDropdown.tsx +96 -0
  374. package/src/components/DataTable/components/ImportModal.tsx +345 -0
  375. package/src/components/DataTable/components/LoadingState.tsx +12 -0
  376. package/src/components/DataTable/components/PaginationControls.tsx +332 -0
  377. package/src/components/DataTable/components/UnifiedTableBody.tsx +911 -0
  378. package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
  379. package/src/components/DataTable/components/VirtualizedDataTable.tsx +593 -0
  380. package/src/components/DataTable/components/__tests__/ActionButtons.unit.test.tsx +150 -0
  381. package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +224 -0
  382. package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.unit.test.tsx +244 -0
  383. package/src/components/DataTable/components/__tests__/DataTable.accessibility.test.tsx +523 -0
  384. package/src/components/DataTable/components/__tests__/DataTable.integration.test.tsx +401 -0
  385. package/src/components/DataTable/components/__tests__/DataTable.performance.test.tsx +161 -0
  386. package/src/components/DataTable/components/__tests__/DataTable.real.test.tsx +251 -0
  387. package/src/components/DataTable/components/__tests__/DataTable.security.test.tsx +172 -0
  388. package/src/components/DataTable/components/__tests__/DataTable.unit.test.tsx +290 -0
  389. package/src/components/DataTable/components/__tests__/DataTableBody.unit.test.tsx +147 -0
  390. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.unit.test.tsx +182 -0
  391. package/src/components/DataTable/components/__tests__/DataTableHeader.unit.test.tsx +143 -0
  392. package/src/components/DataTable/components/__tests__/DataTableModals.unit.test.tsx +123 -0
  393. package/src/components/DataTable/components/__tests__/EditableRow.unit.test.tsx +660 -0
  394. package/src/components/DataTable/components/__tests__/EmptyState.unit.test.tsx +256 -0
  395. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +498 -0
  396. package/src/components/DataTable/components/__tests__/FilterRow.unit.test.tsx +112 -0
  397. package/src/components/DataTable/components/__tests__/FilteringToggle.unit.test.tsx +130 -0
  398. package/src/components/DataTable/components/__tests__/GroupHeader.unit.test.tsx +172 -0
  399. package/src/components/DataTable/components/__tests__/GroupingDropdown.unit.test.tsx +222 -0
  400. package/src/components/DataTable/components/__tests__/ImportModal.unit.test.tsx +780 -0
  401. package/src/components/DataTable/components/__tests__/LoadingState.unit.test.tsx +65 -0
  402. package/src/components/DataTable/components/__tests__/PaginationControls.unit.test.tsx +634 -0
  403. package/src/components/DataTable/components/__tests__/StateComponents.unit.test.tsx +48 -0
  404. package/src/components/DataTable/components/__tests__/UnifiedTableBody.hierarchical.test.tsx +541 -0
  405. package/src/components/DataTable/components/__tests__/ViewRowModal.unit.test.tsx +228 -0
  406. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.unit.test.tsx +568 -0
  407. package/src/components/DataTable/components/index.ts +17 -0
  408. package/src/components/DataTable/context/DataTableContext.tsx +97 -0
  409. package/src/components/DataTable/core/ActionManager.ts +235 -0
  410. package/src/components/DataTable/core/ColumnFactory.ts +268 -0
  411. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  412. package/src/components/DataTable/core/DataManager.ts +188 -0
  413. package/src/components/DataTable/core/DataTableContext.tsx +182 -0
  414. package/src/components/DataTable/core/LocalDataAdapter.ts +264 -0
  415. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  416. package/src/components/DataTable/core/StateManager.ts +311 -0
  417. package/src/components/DataTable/core/__tests__/ActionManager.unit.test.ts +405 -0
  418. package/src/components/DataTable/core/__tests__/ArchitectureIntegration.unit.test.tsx +445 -0
  419. package/src/components/DataTable/core/__tests__/ColumnFactory.unit.test.ts +288 -0
  420. package/src/components/DataTable/core/__tests__/ColumnManager.unit.test.ts +623 -0
  421. package/src/components/DataTable/core/__tests__/DataManager.unit.test.ts +431 -0
  422. package/src/components/DataTable/core/__tests__/DataTableContext.unit.test.tsx +433 -0
  423. package/src/components/DataTable/core/__tests__/LocalDataAdapter.unit.test.ts +422 -0
  424. package/src/components/DataTable/core/__tests__/PluginRegistry.unit.test.tsx +207 -0
  425. package/src/components/DataTable/core/__tests__/StateManager.unit.test.ts +278 -0
  426. package/src/components/DataTable/core/index.ts +8 -0
  427. package/src/components/DataTable/core/interfaces.ts +338 -0
  428. package/src/components/DataTable/examples/AutoSizingExample.tsx +180 -0
  429. package/src/components/DataTable/examples/ColumnSizingComparison.tsx +235 -0
  430. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +418 -0
  431. package/src/components/DataTable/examples/HierarchicalExample.tsx +472 -0
  432. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +173 -0
  433. package/src/components/DataTable/examples/PerformanceExample.tsx +502 -0
  434. package/src/components/DataTable/examples/__tests__/PerformanceExample.unit.test.tsx +281 -0
  435. package/src/components/DataTable/hooks/__tests__/useColumnOrderPersistence.unit.test.ts +407 -0
  436. package/src/components/DataTable/hooks/__tests__/useColumnReordering.unit.test.ts +679 -0
  437. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +95 -0
  438. package/src/components/DataTable/hooks/useColumnReordering.ts +110 -0
  439. package/src/components/DataTable/hooks/useDataTableState.ts +325 -0
  440. package/src/components/DataTable/hooks/useHierarchicalState.ts +174 -0
  441. package/src/components/DataTable/index.ts +70 -0
  442. package/src/components/DataTable/styles.ts +171 -0
  443. package/src/components/DataTable/types.ts +475 -0
  444. package/src/components/DataTable/utils/__tests__/columnSizing.test.ts +237 -0
  445. package/src/components/DataTable/utils/__tests__/debugTools.unit.test.ts +267 -0
  446. package/src/components/DataTable/utils/__tests__/errorHandling.unit.test.ts +467 -0
  447. package/src/components/DataTable/utils/__tests__/exportUtils.unit.test.ts +380 -0
  448. package/src/components/DataTable/utils/__tests__/flexibleImport.unit.test.ts +233 -0
  449. package/src/components/DataTable/utils/__tests__/performanceUtils.unit.test.ts +414 -0
  450. package/src/components/DataTable/utils/columnSizing.ts +125 -0
  451. package/src/components/DataTable/utils/debugTools.ts +583 -0
  452. package/src/components/DataTable/utils/errorHandling.ts +494 -0
  453. package/src/components/DataTable/utils/exportUtils.ts +126 -0
  454. package/src/components/DataTable/utils/flexibleImport.ts +510 -0
  455. package/src/components/DataTable/utils/hierarchicalSorting.ts +151 -0
  456. package/src/components/DataTable/utils/hierarchicalUtils.ts +218 -0
  457. package/src/components/DataTable/utils/index.ts +1 -0
  458. package/src/components/DataTable/utils/performanceUtils.ts +351 -0
  459. package/src/components/Dialog/Dialog.tsx +782 -0
  460. package/src/components/Dialog/README.md +804 -0
  461. package/src/components/Dialog/__tests__/Dialog.accessibility.test.tsx +521 -0
  462. package/src/components/Dialog/__tests__/Dialog.auto-size.example.tsx +157 -0
  463. package/src/components/Dialog/__tests__/Dialog.enhanced.test.tsx +538 -0
  464. package/src/components/Dialog/__tests__/Dialog.unit.test.tsx +1373 -0
  465. package/src/components/Dialog/examples/BasicHtmlTest.tsx +55 -0
  466. package/src/components/Dialog/examples/DebugHtmlExample.tsx +68 -0
  467. package/src/components/Dialog/examples/HtmlDialogExample.tsx +202 -0
  468. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +61 -0
  469. package/src/components/Dialog/examples/SmartDialogExample.tsx +322 -0
  470. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +151 -0
  471. package/src/components/Dialog/index.ts +12 -0
  472. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +611 -0
  473. package/src/components/Dialog/utils/safeHtml.ts +185 -0
  474. package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
  475. package/src/components/ErrorBoundary/__tests__/ErrorBoundary.accessibility.test.tsx +517 -0
  476. package/src/components/ErrorBoundary/__tests__/ErrorBoundary.integration.test.tsx +572 -0
  477. package/src/components/ErrorBoundary/__tests__/ErrorBoundary.unit.test.tsx +579 -0
  478. package/src/components/ErrorBoundary/index.ts +8 -0
  479. package/src/components/EventSelector/EventSelector.tsx +360 -0
  480. package/src/components/EventSelector/__tests__/EventSelector.test.tsx +528 -0
  481. package/src/components/EventSelector/index.ts +3 -0
  482. package/src/components/EventSelector/types.ts +79 -0
  483. package/src/components/FileUpload/FileUpload.example.tsx +218 -0
  484. package/src/components/FileUpload/FileUpload.tsx +237 -0
  485. package/src/components/FileUpload/__tests__/FileUpload.integration.test.tsx +992 -0
  486. package/src/components/FileUpload/__tests__/FileUpload.real.test.tsx +927 -0
  487. package/src/components/FileUpload/__tests__/FileUpload.test.tsx +855 -0
  488. package/src/components/FileUpload/__tests__/FileUpload.unit.test.tsx +1311 -0
  489. package/src/components/FileUpload/__tests__/FileUpload.unmocked.test.tsx +937 -0
  490. package/src/components/FileUpload/index.ts +6 -0
  491. package/src/components/Footer/Footer.tsx +197 -0
  492. package/src/components/Footer/__tests__/Footer.accessibility.test.tsx +359 -0
  493. package/src/components/Footer/__tests__/Footer.integration.test.tsx +353 -0
  494. package/src/components/Footer/__tests__/Footer.performance.test.tsx +309 -0
  495. package/src/components/Footer/__tests__/Footer.unit.test.tsx +309 -0
  496. package/src/components/Footer/__tests__/Footer.visual.test.tsx +335 -0
  497. package/src/components/Footer/index.ts +17 -0
  498. package/src/components/Form/Form.tsx +166 -0
  499. package/src/components/Form/FormErrorSummary.tsx +113 -0
  500. package/src/components/Form/FormField.tsx +249 -0
  501. package/src/components/Form/FormFieldset.tsx +127 -0
  502. package/src/components/Form/FormLiveRegion.tsx +198 -0
  503. package/src/components/Form/__tests__/Form.accessibility.test.tsx +820 -0
  504. package/src/components/Form/__tests__/Form.unit.test.tsx +305 -0
  505. package/src/components/Form/__tests__/FormErrorSummary.unit.test.tsx +285 -0
  506. package/src/components/Form/__tests__/FormFieldset.unit.test.tsx +241 -0
  507. package/src/components/Form/index.ts +26 -0
  508. package/src/components/Header/Header.tsx +301 -0
  509. package/src/components/Header/__tests__/Header.accessibility.test.tsx +382 -0
  510. package/src/components/Header/__tests__/Header.comprehensive.test.tsx +509 -0
  511. package/src/components/Header/__tests__/Header.unit.test.tsx +335 -0
  512. package/src/components/Header/index.ts +4 -0
  513. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +196 -0
  514. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
  515. package/src/components/InactivityWarningModal/__tests__/InactivityWarningModal.unit.test.tsx +224 -0
  516. package/src/components/InactivityWarningModal/index.ts +9 -0
  517. package/src/components/Input/Input.tsx +201 -0
  518. package/src/components/Input/__mocks__/Input.tsx +2 -0
  519. package/src/components/Input/__tests__/Input.accessibility.test.tsx +632 -0
  520. package/src/components/Input/__tests__/Input.unit.test.tsx +1121 -0
  521. package/src/components/Input/index.ts +9 -0
  522. package/src/components/Label/Label.tsx +186 -0
  523. package/src/components/Label/__tests__/Label.accessibility.test.tsx +239 -0
  524. package/src/components/Label/__tests__/Label.unit.test.tsx +331 -0
  525. package/src/components/Label/index.ts +2 -0
  526. package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
  527. package/src/components/LoadingSpinner/__tests__/LoadingSpinner.accessibility.test.tsx +116 -0
  528. package/src/components/LoadingSpinner/__tests__/LoadingSpinner.unit.test.tsx +144 -0
  529. package/src/components/LoadingSpinner/index.ts +3 -0
  530. package/src/components/LoginForm/LoginForm.tsx +273 -0
  531. package/src/components/LoginForm/__tests__/LoginForm.accessibility.test.tsx +201 -0
  532. package/src/components/LoginForm/__tests__/LoginForm.unit.test.tsx +119 -0
  533. package/src/components/LoginForm/index.ts +3 -0
  534. package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
  535. package/src/components/NavigationMenu/__tests__/NavigationMenu.accessibility.test.tsx +378 -0
  536. package/src/components/NavigationMenu/__tests__/NavigationMenu.enhanced.test.tsx +768 -0
  537. package/src/components/NavigationMenu/__tests__/NavigationMenu.integration.test.tsx +576 -0
  538. package/src/components/NavigationMenu/__tests__/NavigationMenu.performance.test.tsx +585 -0
  539. package/src/components/NavigationMenu/__tests__/NavigationMenu.real.component.test.tsx +783 -0
  540. package/src/components/NavigationMenu/__tests__/NavigationMenu.security.enhanced.test.tsx +810 -0
  541. package/src/components/NavigationMenu/__tests__/NavigationMenu.security.test.tsx +494 -0
  542. package/src/components/NavigationMenu/__tests__/NavigationMenu.unit.test.tsx +331 -0
  543. package/src/components/NavigationMenu/__tests__/NavigationMenu.userWorkflows.test.tsx +347 -0
  544. package/src/components/NavigationMenu/__tests__/NavigationMenu.workflows.test.tsx +584 -0
  545. package/src/components/NavigationMenu/index.ts +10 -0
  546. package/src/components/NavigationMenu/types.ts +85 -0
  547. package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
  548. package/src/components/OrganisationSelector/__tests__/OrganisationSelector.unit.test.tsx +664 -0
  549. package/src/components/OrganisationSelector/index.ts +9 -0
  550. package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
  551. package/src/components/PaceAppLayout/README.md +278 -0
  552. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +288 -0
  553. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +889 -0
  554. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +629 -0
  555. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +782 -0
  556. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +904 -0
  557. package/src/components/PaceAppLayout/index.ts +1 -0
  558. package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
  559. package/src/components/PaceLoginPage/__tests__/PaceLoginPage.accessibility.test.tsx +463 -0
  560. package/src/components/PaceLoginPage/__tests__/PaceLoginPage.integration.test.tsx +586 -0
  561. package/src/components/PaceLoginPage/__tests__/PaceLoginPage.unit.test.tsx +533 -0
  562. package/src/components/PaceLoginPage/index.ts +1 -0
  563. package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
  564. package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
  565. package/src/components/PasswordReset/__tests__/PasswordChangeForm.accessibility.test.tsx +408 -0
  566. package/src/components/PasswordReset/__tests__/PasswordChangeForm.unit.test.tsx +561 -0
  567. package/src/components/PasswordReset/__tests__/PasswordReset.integration.test.tsx +304 -0
  568. package/src/components/PasswordReset/__tests__/PasswordResetForm.accessibility.test.tsx +20 -0
  569. package/src/components/PasswordReset/__tests__/PasswordResetForm.unit.test.tsx +523 -0
  570. package/src/components/PasswordReset/__tests__/__mocks__/UnifiedAuthProvider.ts +29 -0
  571. package/src/components/PasswordReset/index.ts +4 -0
  572. package/src/components/Print/__tests__/Print.comprehensive.test.tsx +331 -0
  573. package/src/components/PrintButton/PrintButton.tsx +321 -0
  574. package/src/components/PrintButton/PrintButtonGroup.tsx +84 -0
  575. package/src/components/PrintButton/PrintToolbar.tsx +94 -0
  576. package/src/components/PrintButton/__tests__/PrintButton.unit.test.tsx +429 -0
  577. package/src/components/PrintButton/__tests__/PrintButtonGroup.unit.test.tsx +277 -0
  578. package/src/components/PrintButton/__tests__/PrintToolbar.unit.test.tsx +264 -0
  579. package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +438 -0
  580. package/src/components/PrintButton/index.ts +33 -0
  581. package/src/components/PrintButton/types.ts +173 -0
  582. package/src/components/PrintCard/PrintCard.tsx +154 -0
  583. package/src/components/PrintCard/PrintCardContent.tsx +57 -0
  584. package/src/components/PrintCard/PrintCardFooter.tsx +60 -0
  585. package/src/components/PrintCard/PrintCardGrid.tsx +91 -0
  586. package/src/components/PrintCard/PrintCardHeader.tsx +78 -0
  587. package/src/components/PrintCard/PrintCardImage.tsx +81 -0
  588. package/src/components/PrintCard/__tests__/PrintCard.unit.test.tsx +233 -0
  589. package/src/components/PrintCard/__tests__/PrintCardContent.test.tsx +284 -0
  590. package/src/components/PrintCard/__tests__/PrintCardGrid.unit.test.tsx +214 -0
  591. package/src/components/PrintCard/__tests__/PrintCardImage.unit.test.tsx +264 -0
  592. package/src/components/PrintCard/examples/PrintCardShowcase.tsx +239 -0
  593. package/src/components/PrintCard/index.ts +34 -0
  594. package/src/components/PrintCard/types.ts +171 -0
  595. package/src/components/PrintDataTable/PrintDataTable.tsx +215 -0
  596. package/src/components/PrintDataTable/PrintTableGroup.tsx +90 -0
  597. package/src/components/PrintDataTable/PrintTableRow.tsx +76 -0
  598. package/src/components/PrintDataTable/__tests__/PrintDataTable.unit.test.tsx +361 -0
  599. package/src/components/PrintDataTable/__tests__/PrintTableGroup.unit.test.tsx +314 -0
  600. package/src/components/PrintDataTable/__tests__/PrintTableRow.unit.test.tsx +362 -0
  601. package/src/components/PrintDataTable/index.ts +25 -0
  602. package/src/components/PrintDataTable/types.ts +67 -0
  603. package/src/components/PrintFooter/PrintFooter.tsx +183 -0
  604. package/src/components/PrintFooter/PrintFooterContent.tsx +71 -0
  605. package/src/components/PrintFooter/PrintFooterInfo.tsx +86 -0
  606. package/src/components/PrintFooter/PrintPageNumber.tsx +90 -0
  607. package/src/components/PrintFooter/__tests__/PrintFooter.unit.test.tsx +500 -0
  608. package/src/components/PrintFooter/__tests__/PrintFooterContent.unit.test.tsx +321 -0
  609. package/src/components/PrintFooter/__tests__/PrintFooterInfo.unit.test.tsx +335 -0
  610. package/src/components/PrintFooter/__tests__/PrintPageNumber.unit.test.tsx +340 -0
  611. package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +390 -0
  612. package/src/components/PrintFooter/index.ts +30 -0
  613. package/src/components/PrintFooter/types.ts +149 -0
  614. package/src/components/PrintGrid/PrintGrid.tsx +180 -0
  615. package/src/components/PrintGrid/PrintGridBreakpoint.tsx +109 -0
  616. package/src/components/PrintGrid/PrintGridContainer.tsx +128 -0
  617. package/src/components/PrintGrid/PrintGridItem.tsx +220 -0
  618. package/src/components/PrintGrid/__tests__/PrintGrid.unit.test.tsx +340 -0
  619. package/src/components/PrintGrid/__tests__/PrintGridBreakpoint.unit.test.tsx +261 -0
  620. package/src/components/PrintGrid/__tests__/PrintGridContainer.unit.test.tsx +338 -0
  621. package/src/components/PrintGrid/__tests__/PrintGridItem.unit.test.tsx +338 -0
  622. package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +359 -0
  623. package/src/components/PrintGrid/index.ts +31 -0
  624. package/src/components/PrintGrid/types.ts +159 -0
  625. package/src/components/PrintHeader/PrintCoverHeader.tsx +230 -0
  626. package/src/components/PrintHeader/PrintHeader.tsx +150 -0
  627. package/src/components/PrintHeader/__tests__/PrintCoverHeader.unit.test.tsx +309 -0
  628. package/src/components/PrintHeader/__tests__/PrintHeader.unit.test.tsx +202 -0
  629. package/src/components/PrintHeader/index.ts +17 -0
  630. package/src/components/PrintHeader/types.ts +42 -0
  631. package/src/components/PrintLayout/PrintLayout.tsx +122 -0
  632. package/src/components/PrintLayout/PrintLayoutContext.tsx +66 -0
  633. package/src/components/PrintLayout/PrintPageBreak.tsx +52 -0
  634. package/src/components/PrintLayout/__tests__/PrintLayout.unit.test.tsx +238 -0
  635. package/src/components/PrintLayout/examples/PrintShowcase.tsx +230 -0
  636. package/src/components/PrintLayout/index.ts +19 -0
  637. package/src/components/PrintLayout/types.ts +37 -0
  638. package/src/components/PrintPageBreak/PrintPageBreak.tsx +120 -0
  639. package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +90 -0
  640. package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +112 -0
  641. package/src/components/PrintPageBreak/__tests__/PrintPageBreak.unit.test.tsx +263 -0
  642. package/src/components/PrintPageBreak/__tests__/PrintPageBreakGroup.unit.test.tsx +239 -0
  643. package/src/components/PrintPageBreak/__tests__/PrintPageBreakIndicator.unit.test.tsx +235 -0
  644. package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +279 -0
  645. package/src/components/PrintPageBreak/index.ts +23 -0
  646. package/src/components/PrintPageBreak/types.ts +94 -0
  647. package/src/components/PrintSection/PrintColumn.tsx +104 -0
  648. package/src/components/PrintSection/PrintDivider.tsx +101 -0
  649. package/src/components/PrintSection/PrintSection.tsx +129 -0
  650. package/src/components/PrintSection/PrintSectionContent.tsx +75 -0
  651. package/src/components/PrintSection/PrintSectionHeader.tsx +97 -0
  652. package/src/components/PrintSection/__tests__/PrintColumn.unit.test.tsx +385 -0
  653. package/src/components/PrintSection/__tests__/PrintDivider.unit.test.tsx +373 -0
  654. package/src/components/PrintSection/__tests__/PrintSection.unit.test.tsx +390 -0
  655. package/src/components/PrintSection/__tests__/PrintSectionContent.unit.test.tsx +321 -0
  656. package/src/components/PrintSection/__tests__/PrintSectionHeader.unit.test.tsx +334 -0
  657. package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +258 -0
  658. package/src/components/PrintSection/index.ts +33 -0
  659. package/src/components/PrintSection/types.ts +155 -0
  660. package/src/components/PrintText/PrintText.tsx +116 -0
  661. package/src/components/PrintText/__tests__/PrintText.unit.test.tsx +351 -0
  662. package/src/components/PrintText/index.ts +16 -0
  663. package/src/components/PrintText/types.ts +24 -0
  664. package/src/components/Progress/Progress.tsx +116 -0
  665. package/src/components/Progress/__tests__/Progress.accessibility.test.tsx +240 -0
  666. package/src/components/Progress/__tests__/Progress.unit.test.tsx +242 -0
  667. package/src/components/Progress/index.ts +3 -0
  668. package/src/components/PublicLayout/EventLogo.tsx +287 -0
  669. package/src/components/PublicLayout/PublicErrorBoundary.tsx +279 -0
  670. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +208 -0
  671. package/src/components/PublicLayout/PublicPageContextChecker.tsx +130 -0
  672. package/src/components/PublicLayout/PublicPageDebugger.tsx +104 -0
  673. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +162 -0
  674. package/src/components/PublicLayout/PublicPageFooter.tsx +124 -0
  675. package/src/components/PublicLayout/PublicPageHeader.tsx +178 -0
  676. package/src/components/PublicLayout/PublicPageLayout.tsx +232 -0
  677. package/src/components/PublicLayout/PublicPageProvider.tsx +137 -0
  678. package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +761 -0
  679. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.simplified.test.tsx +228 -0
  680. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +228 -0
  681. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +459 -0
  682. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +362 -0
  683. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +522 -0
  684. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +599 -0
  685. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +513 -0
  686. package/src/components/PublicLayout/index.ts +51 -0
  687. package/src/components/RBAC/PagePermissionGuard.tsx +274 -0
  688. package/src/components/RBAC/RBACGuard.tsx +143 -0
  689. package/src/components/RBAC/RBACProvider.tsx +186 -0
  690. package/src/components/RBAC/RoleBasedContent.tsx +129 -0
  691. package/src/components/RBAC/__tests__/PagePermissionGuard.unit.test.tsx +674 -0
  692. package/src/components/RBAC/__tests__/RBAC.integration.test.tsx +573 -0
  693. package/src/components/RBAC/__tests__/RBACGuard.unit.test.tsx +467 -0
  694. package/src/components/RBAC/__tests__/RBACProvider.accessibility.test.tsx +475 -0
  695. package/src/components/RBAC/__tests__/RBACProvider.advanced.test.tsx +569 -0
  696. package/src/components/RBAC/__tests__/RBACProvider.integration.test.tsx +352 -0
  697. package/src/components/RBAC/__tests__/RBACProvider.unit.test.tsx +128 -0
  698. package/src/components/RBAC/__tests__/RoleBasedContent.unit.test.tsx +657 -0
  699. package/src/components/RBAC/index.ts +23 -0
  700. package/src/components/Select/Select.tsx +654 -0
  701. package/src/components/Select/__tests__/SearchableSelect.unit.test.tsx +437 -0
  702. package/src/components/Select/__tests__/Select.accessibility.test.tsx +1202 -0
  703. package/src/components/Select/__tests__/Select.actual.test.tsx +774 -0
  704. package/src/components/Select/__tests__/Select.comprehensive.test.tsx +837 -0
  705. package/src/components/Select/__tests__/Select.enhanced.test.tsx +1101 -0
  706. package/src/components/Select/__tests__/Select.integration.test.tsx +772 -0
  707. package/src/components/Select/__tests__/Select.performance.test.tsx +695 -0
  708. package/src/components/Select/__tests__/Select.real-world.test.tsx +1046 -0
  709. package/src/components/Select/__tests__/Select.search-algorithms.test.tsx +968 -0
  710. package/src/components/Select/__tests__/Select.unit.test.tsx +647 -0
  711. package/src/components/Select/__tests__/Select.utils.test.tsx +890 -0
  712. package/src/components/Select/index.ts +1 -0
  713. package/src/components/SuperAdminGuard.tsx +116 -0
  714. package/src/components/Table/Table.tsx +222 -0
  715. package/src/components/Table/__tests__/Table.accessibility.test.tsx +233 -0
  716. package/src/components/Table/__tests__/Table.unit.test.tsx +235 -0
  717. package/src/components/Table/index.ts +11 -0
  718. package/src/components/Toast/Toast.tsx +339 -0
  719. package/src/components/Toast/__tests__/Toast.accessibility.test.tsx +238 -0
  720. package/src/components/Toast/__tests__/Toast.integration.test.tsx +699 -0
  721. package/src/components/Toast/__tests__/Toast.unit.test.tsx +750 -0
  722. package/src/components/Toast/index.ts +14 -0
  723. package/src/components/Tooltip/Tooltip.tsx +167 -0
  724. package/src/components/Tooltip/__tests__/Tooltip.accessibility.test.tsx +121 -0
  725. package/src/components/Tooltip/__tests__/Tooltip.unit.test.tsx +185 -0
  726. package/src/components/Tooltip/index.ts +7 -0
  727. package/src/components/UserMenu/UserMenu.tsx +243 -0
  728. package/src/components/UserMenu/__tests__/UserMenu.accessibility.test.tsx +139 -0
  729. package/src/components/UserMenu/__tests__/UserMenu.integration.test.tsx +188 -0
  730. package/src/components/UserMenu/__tests__/UserMenu.unit.test.tsx +458 -0
  731. package/src/components/UserMenu/index.ts +3 -0
  732. package/src/components/__tests__/EdgeCaseTesting.enhanced.test.tsx +523 -0
  733. package/src/components/__tests__/ErrorTesting.enhanced.test.tsx +455 -0
  734. package/src/components/__tests__/SuperAdminGuard.test.tsx +456 -0
  735. package/src/components/__tests__/SuperAdminGuard.unit.test.tsx +456 -0
  736. package/src/components/examples/PermissionExample.tsx +150 -0
  737. package/src/components/examples/__tests__/PermissionExample.unit.test.tsx +360 -0
  738. package/src/components/index.ts +434 -0
  739. package/src/components.ts +19 -0
  740. package/src/constants/performance.ts +14 -0
  741. package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
  742. package/src/examples/PublicEventPage.tsx +274 -0
  743. package/src/examples/PublicPageApp.tsx +308 -0
  744. package/src/examples/PublicPageUsageExample.tsx +216 -0
  745. package/src/fonts/georama-italic.woff2 +0 -0
  746. package/src/fonts/georama.woff2 +0 -0
  747. package/src/fonts/open-sans-italic.woff2 +0 -0
  748. package/src/fonts/open-sans.woff2 +0 -0
  749. package/src/fonts/reddit-mono.woff2 +0 -0
  750. package/src/hooks/__tests__/hooks.integration.test.tsx +575 -0
  751. package/src/hooks/__tests__/useApiFetch.unit.test.ts +115 -0
  752. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +133 -0
  753. package/src/hooks/__tests__/useDebounce.unit.test.ts +82 -0
  754. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +293 -0
  755. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +385 -0
  756. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +286 -0
  757. package/src/hooks/__tests__/useOrganisationSecurity.unit.test.tsx +838 -0
  758. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +627 -0
  759. package/src/hooks/__tests__/useRBAC.unit.test.ts +903 -0
  760. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +537 -0
  761. package/src/hooks/__tests__/useToast.unit.test.tsx +62 -0
  762. package/src/hooks/__tests__/useZodForm.unit.test.tsx +37 -0
  763. package/src/hooks/index.ts +56 -0
  764. package/src/hooks/public/__tests__/usePublicEvent.test.tsx +397 -0
  765. package/src/hooks/public/__tests__/usePublicEventLogo.test.tsx +690 -0
  766. package/src/hooks/public/__tests__/usePublicRouteParams.test.tsx +449 -0
  767. package/src/hooks/public/index.ts +34 -0
  768. package/src/hooks/public/usePublicEvent.ts +261 -0
  769. package/src/hooks/public/usePublicEventLogo.ts +285 -0
  770. package/src/hooks/public/usePublicRouteParams.ts +259 -0
  771. package/src/hooks/useAppConfig.ts +94 -0
  772. package/src/hooks/useComponentPerformance.ts +39 -0
  773. package/src/hooks/useDataTablePerformance.ts +387 -0
  774. package/src/hooks/useDataTableState.ts +110 -0
  775. package/src/hooks/useDebounce.ts +18 -0
  776. package/src/hooks/useFocusManagement.ts +161 -0
  777. package/src/hooks/useFocusTrap.ts +155 -0
  778. package/src/hooks/useInactivityTracker.ts +372 -0
  779. package/src/hooks/useIsMobile.ts +42 -0
  780. package/src/hooks/useKeyboardShortcuts.ts +237 -0
  781. package/src/hooks/useOrganisationPermissions.ts +208 -0
  782. package/src/hooks/useOrganisationSecurity.ts +262 -0
  783. package/src/hooks/usePerformanceMonitor.ts +128 -0
  784. package/src/hooks/usePermissionCache.ts +455 -0
  785. package/src/hooks/useRBAC.ts +262 -0
  786. package/src/hooks/useSecureDataAccess.ts +586 -0
  787. package/src/hooks/useStorage.ts +274 -0
  788. package/src/hooks/useToast.ts +242 -0
  789. package/src/hooks/useZodForm.ts +28 -0
  790. package/src/index.ts +200 -0
  791. package/src/providers/AuthProvider.tsx +369 -0
  792. package/src/providers/EventProvider.tsx +324 -0
  793. package/src/providers/InactivityProvider.tsx +238 -0
  794. package/src/providers/OrganisationProvider.tsx +588 -0
  795. package/src/providers/RBACProvider.tsx +622 -0
  796. package/src/providers/UnifiedAuthProvider.tsx +327 -0
  797. package/src/providers/__tests__/EventProvider.unit.test.tsx +768 -0
  798. package/src/providers/__tests__/OrganisationProvider.basic.test.tsx +116 -0
  799. package/src/providers/__tests__/OrganisationProvider.unit.test.tsx +1312 -0
  800. package/src/providers/__tests__/UnifiedAuthProvider.inactivity.test.tsx +601 -0
  801. package/src/providers/__tests__/UnifiedAuthProvider.unit.test.tsx +675 -0
  802. package/src/providers/__tests__/index.unit.test.ts +78 -0
  803. package/src/providers/index.ts +15 -0
  804. package/src/rbac/README.md +885 -0
  805. package/src/rbac/__tests__/PagePermissionGuard.test.tsx +673 -0
  806. package/src/rbac/__tests__/README.md +170 -0
  807. package/src/rbac/__tests__/RoleBasedRouter.test.tsx +709 -0
  808. package/src/rbac/__tests__/TestContext.tsx +72 -0
  809. package/src/rbac/__tests__/__mocks__/cache.ts +144 -0
  810. package/src/rbac/__tests__/__mocks__/supabase.ts +152 -0
  811. package/src/rbac/__tests__/adapters-hooks-comprehensive.test.tsx +782 -0
  812. package/src/rbac/__tests__/adapters-hooks.test.tsx +561 -0
  813. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +963 -0
  814. package/src/rbac/__tests__/adapters.test.tsx +444 -0
  815. package/src/rbac/__tests__/api.test.ts +620 -0
  816. package/src/rbac/__tests__/audit-observability-comprehensive.test.ts +792 -0
  817. package/src/rbac/__tests__/audit-observability.test.ts +549 -0
  818. package/src/rbac/__tests__/audit.test.ts +616 -0
  819. package/src/rbac/__tests__/build-contract-compliance-simple.test.ts +230 -0
  820. package/src/rbac/__tests__/cache-invalidation-comprehensive.test.ts +889 -0
  821. package/src/rbac/__tests__/cache-invalidation.test.ts +457 -0
  822. package/src/rbac/__tests__/cache.test.ts +458 -0
  823. package/src/rbac/__tests__/components-navigation-guard.enhanced.test.tsx +859 -0
  824. package/src/rbac/__tests__/components-navigation-guard.test.tsx +895 -0
  825. package/src/rbac/__tests__/components-navigation-provider.test.tsx +692 -0
  826. package/src/rbac/__tests__/components-page-permission-guard.test.tsx +673 -0
  827. package/src/rbac/__tests__/components-page-permission-provider.test.tsx +614 -0
  828. package/src/rbac/__tests__/components-permission-enforcer.enhanced.fixed.test.tsx +836 -0
  829. package/src/rbac/__tests__/components-permission-enforcer.enhanced.test.tsx +837 -0
  830. package/src/rbac/__tests__/components-permission-enforcer.test.tsx +825 -0
  831. package/src/rbac/__tests__/components-role-based-router.test.tsx +709 -0
  832. package/src/rbac/__tests__/components-secure-data-provider.test.tsx +607 -0
  833. package/src/rbac/__tests__/config.test.ts +583 -0
  834. package/src/rbac/__tests__/core-logic-unit.test.ts +190 -0
  835. package/src/rbac/__tests__/core-permission-logic-comprehensive.test.ts +1467 -0
  836. package/src/rbac/__tests__/core-permission-logic-fixed.test.ts +151 -0
  837. package/src/rbac/__tests__/core-permission-logic-simple.test.ts +968 -0
  838. package/src/rbac/__tests__/core-permission-logic.test.ts +966 -0
  839. package/src/rbac/__tests__/edge-cases-comprehensive.test.ts +988 -0
  840. package/src/rbac/__tests__/edge-cases.test.ts +654 -0
  841. package/src/rbac/__tests__/engine.test.ts +361 -0
  842. package/src/rbac/__tests__/engine.unit.test.ts +361 -0
  843. package/src/rbac/__tests__/hooks.enhanced.test.tsx +979 -0
  844. package/src/rbac/__tests__/hooks.fixed.test.tsx +475 -0
  845. package/src/rbac/__tests__/hooks.test.tsx +385 -0
  846. package/src/rbac/__tests__/index.test.ts +269 -0
  847. package/src/rbac/__tests__/integration.enhanced.test.tsx +824 -0
  848. package/src/rbac/__tests__/page-permission-guard-super-admin.test.tsx +261 -0
  849. package/src/rbac/__tests__/performance.enhanced.test.tsx +724 -0
  850. package/src/rbac/__tests__/permissions.test.ts +383 -0
  851. package/src/rbac/__tests__/requires-event.test.ts +330 -0
  852. package/src/rbac/__tests__/scope-isolation-comprehensive.test.ts +1349 -0
  853. package/src/rbac/__tests__/scope-isolation.test.ts +755 -0
  854. package/src/rbac/__tests__/secure-client-rls-comprehensive.test.ts +592 -0
  855. package/src/rbac/__tests__/secure-client-rls.test.ts +377 -0
  856. package/src/rbac/__tests__/security.test.ts +296 -0
  857. package/src/rbac/__tests__/setup.ts +228 -0
  858. package/src/rbac/__tests__/test-utils-enhanced.tsx +400 -0
  859. package/src/rbac/__tests__/types.test.ts +685 -0
  860. package/src/rbac/adapters.tsx +726 -0
  861. package/src/rbac/api.ts +337 -0
  862. package/src/rbac/audit-enhanced.ts +339 -0
  863. package/src/rbac/audit.ts +338 -0
  864. package/src/rbac/cache.ts +213 -0
  865. package/src/rbac/components/EnhancedNavigationMenu.tsx +294 -0
  866. package/src/rbac/components/NavigationGuard.tsx +294 -0
  867. package/src/rbac/components/NavigationProvider.tsx +314 -0
  868. package/src/rbac/components/PagePermissionGuard.tsx +430 -0
  869. package/src/rbac/components/PagePermissionProvider.tsx +274 -0
  870. package/src/rbac/components/PermissionEnforcer.tsx +307 -0
  871. package/src/rbac/components/RoleBasedRouter.tsx +425 -0
  872. package/src/rbac/components/SecureDataProvider.tsx +319 -0
  873. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +631 -0
  874. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +667 -0
  875. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +647 -0
  876. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +496 -0
  877. package/src/rbac/components/index.ts +64 -0
  878. package/src/rbac/config.ts +133 -0
  879. package/src/rbac/docs/event-based-apps.md +285 -0
  880. package/src/rbac/engine.ts +1026 -0
  881. package/src/rbac/eslint-rules.js +285 -0
  882. package/src/rbac/examples/CompleteRBACExample.tsx +323 -0
  883. package/src/rbac/examples/EventBasedApp.tsx +238 -0
  884. package/src/rbac/hooks.ts +555 -0
  885. package/src/rbac/index.ts +114 -0
  886. package/src/rbac/permissions.ts +293 -0
  887. package/src/rbac/secureClient.ts +244 -0
  888. package/src/rbac/security.ts +346 -0
  889. package/src/rbac/testing/__tests__/index.test.tsx +342 -0
  890. package/src/rbac/testing/index.tsx +340 -0
  891. package/src/rbac/types.ts +341 -0
  892. package/src/rbac/utils/__tests__/eventContext.test.ts +428 -0
  893. package/src/rbac/utils/__tests__/eventContext.unit.test.ts +428 -0
  894. package/src/rbac/utils/eventContext.ts +83 -0
  895. package/src/styles/__tests__/styles.unit.test.ts +164 -0
  896. package/src/styles/core.css +401 -0
  897. package/src/styles/index.ts +51 -0
  898. package/src/test-dom-cleanup.test.tsx +38 -0
  899. package/src/theming/__tests__/README.md +335 -0
  900. package/src/theming/__tests__/runtime.accessibility.test.ts +474 -0
  901. package/src/theming/__tests__/runtime.error.test.ts +616 -0
  902. package/src/theming/__tests__/runtime.integration.test.ts +376 -0
  903. package/src/theming/__tests__/runtime.performance.test.ts +411 -0
  904. package/src/theming/__tests__/runtime.unit.test.ts +470 -0
  905. package/src/theming/runtime.ts +187 -0
  906. package/src/types/__tests__/database.unit.test.ts +489 -0
  907. package/src/types/__tests__/guards.unit.test.ts +146 -0
  908. package/src/types/__tests__/index.unit.test.ts +77 -0
  909. package/src/types/__tests__/organisation.unit.test.ts +713 -0
  910. package/src/types/__tests__/rbac.unit.test.ts +621 -0
  911. package/src/types/__tests__/security.unit.test.ts +347 -0
  912. package/src/types/__tests__/supabase.unit.test.ts +658 -0
  913. package/src/types/__tests__/theme.unit.test.ts +218 -0
  914. package/src/types/__tests__/unified.unit.test.ts +537 -0
  915. package/src/types/__tests__/validation.unit.test.ts +616 -0
  916. package/src/types/database.ts +472 -0
  917. package/src/types/guards.ts +30 -0
  918. package/src/types/index.ts +25 -0
  919. package/src/types/organisation.ts +184 -0
  920. package/src/types/security.ts +70 -0
  921. package/src/types/supabase.ts +166 -0
  922. package/src/types/theme.ts +6 -0
  923. package/src/types/unified.ts +262 -0
  924. package/src/types/validation.ts +164 -0
  925. package/src/types/vitest-globals.d.ts +43 -0
  926. package/src/utils/__mocks__/supabaseMock.ts +75 -0
  927. package/src/utils/__mocks__/supabaseMock.tsx +198 -0
  928. package/src/utils/__tests__/appConfig.unit.test.ts +55 -0
  929. package/src/utils/__tests__/appNameResolver.unit.test.ts +137 -0
  930. package/src/utils/__tests__/audit.unit.test.ts +69 -0
  931. package/src/utils/__tests__/auth-utils.unit.test.ts +70 -0
  932. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +317 -0
  933. package/src/utils/__tests__/cn.unit.test.ts +34 -0
  934. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +480 -0
  935. package/src/utils/__tests__/dynamicUtils.unit.test.ts +322 -0
  936. package/src/utils/__tests__/formatDate.unit.test.ts +109 -0
  937. package/src/utils/__tests__/formatting.unit.test.ts +66 -0
  938. package/src/utils/__tests__/index.unit.test.ts +251 -0
  939. package/src/utils/__tests__/lazyLoad.unit.test.tsx +309 -0
  940. package/src/utils/__tests__/organisationContext.unit.test.ts +192 -0
  941. package/src/utils/__tests__/performanceBudgets.unit.test.ts +259 -0
  942. package/src/utils/__tests__/permissionTypes.unit.test.ts +250 -0
  943. package/src/utils/__tests__/permissionUtils.unit.test.ts +362 -0
  944. package/src/utils/__tests__/sanitization.unit.test.ts +346 -0
  945. package/src/utils/__tests__/schemaUtils.unit.test.ts +441 -0
  946. package/src/utils/__tests__/secureDataAccess.unit.test.ts +334 -0
  947. package/src/utils/__tests__/secureErrors.unit.test.ts +377 -0
  948. package/src/utils/__tests__/secureStorage.unit.test.ts +293 -0
  949. package/src/utils/__tests__/security.unit.test.ts +127 -0
  950. package/src/utils/__tests__/securityMonitor.unit.test.ts +280 -0
  951. package/src/utils/__tests__/sessionTracking.unit.test.ts +370 -0
  952. package/src/utils/__tests__/validation.unit.test.ts +84 -0
  953. package/src/utils/__tests__/validationUtils.unit.test.ts +571 -0
  954. package/src/utils/appConfig.ts +47 -0
  955. package/src/utils/appIdResolver.ts +130 -0
  956. package/src/utils/appNameResolver.ts +190 -0
  957. package/src/utils/audit.ts +127 -0
  958. package/src/utils/auth-utils.ts +96 -0
  959. package/src/utils/bundleAnalysis.ts +129 -0
  960. package/src/utils/cn.ts +7 -0
  961. package/src/utils/debugLogger.ts +46 -0
  962. package/src/utils/deviceFingerprint.ts +215 -0
  963. package/src/utils/dynamicUtils.ts +105 -0
  964. package/src/utils/formatting.ts +77 -0
  965. package/src/utils/index.ts +145 -0
  966. package/src/utils/lazyLoad.tsx +44 -0
  967. package/src/utils/organisationContext.ts +135 -0
  968. package/src/utils/performanceBenchmark.ts +64 -0
  969. package/src/utils/performanceBudgets.ts +111 -0
  970. package/src/utils/permissionTypes.ts +37 -0
  971. package/src/utils/permissionUtils.ts +31 -0
  972. package/src/utils/print/PrintDataProcessor.ts +390 -0
  973. package/src/utils/print/__tests__/PrintDataProcessor.unit.test.ts +219 -0
  974. package/src/utils/print/__tests__/usePrintOptimization.unit.test.tsx +353 -0
  975. package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +397 -0
  976. package/src/utils/print/index.ts +29 -0
  977. package/src/utils/print/types.ts +196 -0
  978. package/src/utils/print/usePrintOptimization.ts +272 -0
  979. package/src/utils/sanitization.ts +264 -0
  980. package/src/utils/schemaUtils.ts +37 -0
  981. package/src/utils/secureDataAccess.ts +361 -0
  982. package/src/utils/secureErrors.ts +79 -0
  983. package/src/utils/secureStorage.ts +244 -0
  984. package/src/utils/security.ts +156 -0
  985. package/src/utils/securityMonitor.ts +45 -0
  986. package/src/utils/sessionTracking.ts +170 -0
  987. package/src/utils/storage/README.md +348 -0
  988. package/src/utils/storage/__tests__/config.unit.test.ts +206 -0
  989. package/src/utils/storage/__tests__/helpers.unit.test.ts +646 -0
  990. package/src/utils/storage/__tests__/index.unit.test.ts +167 -0
  991. package/src/utils/storage/__tests__/types.unit.test.ts +441 -0
  992. package/src/utils/storage/config.ts +100 -0
  993. package/src/utils/storage/helpers.ts +359 -0
  994. package/src/utils/storage/index.ts +36 -0
  995. package/src/utils/storage/types.ts +90 -0
  996. package/src/utils/validation.ts +111 -0
  997. package/src/utils/validationUtils.ts +120 -0
  998. package/src/validation/__tests__/common.unit.test.ts +101 -0
  999. package/src/validation/__tests__/csrf.unit.test.ts +302 -0
  1000. package/src/validation/__tests__/passwordSchema.unit.test.ts +98 -0
  1001. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +466 -0
  1002. package/src/validation/common.ts +53 -0
  1003. package/src/validation/csrf.ts +214 -0
  1004. package/src/validation/index.ts +43 -0
  1005. package/src/validation/passwordSchema.ts +125 -0
  1006. package/src/validation/sanitization.ts +96 -0
  1007. package/src/validation/schemaUtils.ts +42 -0
  1008. package/src/validation/sqlInjectionProtection.ts +242 -0
  1009. 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>&copy; 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