@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,1563 @@
1
+ # Common Issues
2
+
3
+ This guide provides solutions to the most common issues you may encounter when using `@jmruthers/pace-core`.
4
+
5
+ ## Navigation Issues
6
+
7
+ ### NavigationMenu Not Receiving Authentication Context
8
+
9
+ **Problem**: `NavigationMenu` shows `permissions: undefined`, `roles: undefined`, `accessLevel: undefined` in console logs.
10
+
11
+ **Root Cause**: The `NavigationMenu` component is not properly connected to the authentication context.
12
+
13
+ **Solution**: Ensure `NavigationMenu` is used within the proper provider hierarchy and enable permission filtering:
14
+
15
+ ```tsx
16
+ // ❌ WRONG - NavigationMenu without proper context
17
+ <NavigationMenu
18
+ items={navItems}
19
+ currentPath={location.pathname}
20
+ onNavigate={handleNavigate}
21
+ />
22
+
23
+ // ✅ CORRECT - NavigationMenu with authentication context
24
+ <UnifiedAuthProvider supabaseClient={supabase} appName="My App">
25
+ <OrganisationProvider>
26
+ <EventProvider>
27
+ <PaceAppLayout
28
+ appName="My App"
29
+ navItems={navItems}
30
+ showEventSelector={true}
31
+ >
32
+ <Routes>
33
+ {/* Your routes */}
34
+ </Routes>
35
+ </PaceAppLayout>
36
+ </EventProvider>
37
+ </OrganisationProvider>
38
+ </UnifiedAuthProvider>
39
+ ```
40
+
41
+ **Alternative Solution**: Use `NavigationMenu` directly with permission filtering:
42
+
43
+ ```tsx
44
+ import { NavigationMenu } from '@jmruthers/pace-core';
45
+ import { useUnifiedAuth } from '@jmruthers/pace-core/providers';
46
+
47
+ function AuthenticatedNavigation() {
48
+ const { hasPermission, hasRole } = useUnifiedAuth();
49
+
50
+ const navItems = [
51
+ {
52
+ id: 'dashboard',
53
+ label: 'Dashboard',
54
+ href: '/dashboard',
55
+ permissions: ['dashboard:read']
56
+ },
57
+ {
58
+ id: 'admin',
59
+ label: 'Admin Panel',
60
+ href: '/admin',
61
+ roles: ['admin']
62
+ }
63
+ ];
64
+
65
+ return (
66
+ <NavigationMenu
67
+ items={navItems}
68
+ currentPath={location.pathname}
69
+ onNavigate={handleNavigate}
70
+ filterByPermissions={true}
71
+ auditLog={true}
72
+ />
73
+ );
74
+ }
75
+ ```
76
+
77
+ ### NavigationMenu Items Not Filtering by Permissions
78
+
79
+ **Problem**: All navigation items are shown regardless of user permissions.
80
+
81
+ **Solution**: Enable permission filtering and add permission requirements to navigation items:
82
+
83
+ ```tsx
84
+ // Add permissions to navigation items
85
+ const navItems = [
86
+ {
87
+ id: 'dashboard',
88
+ label: 'Dashboard',
89
+ href: '/dashboard',
90
+ permissions: ['dashboard:read'] // Required permission
91
+ },
92
+ {
93
+ id: 'admin',
94
+ label: 'Admin Panel',
95
+ href: '/admin',
96
+ roles: ['admin', 'super_admin'] // Required roles
97
+ }
98
+ ];
99
+
100
+ // Enable filtering
101
+ <NavigationMenu
102
+ items={navItems}
103
+ filterByPermissions={true}
104
+ auditLog={true}
105
+ />
106
+ ```
107
+
108
+ ### NavigationMenu Console Errors
109
+
110
+ **Problem**: Console shows "useUnifiedAuth not available" warnings.
111
+
112
+ **Solution**: Ensure `NavigationMenu` is used within `UnifiedAuthProvider`:
113
+
114
+ ```tsx
115
+ // ❌ WRONG - Outside of auth provider
116
+ <NavigationMenu items={navItems} />
117
+
118
+ // ✅ CORRECT - Inside auth provider
119
+ <UnifiedAuthProvider supabaseClient={supabase} appName="My App">
120
+ <NavigationMenu items={navItems} />
121
+ </UnifiedAuthProvider>
122
+ ```
123
+
124
+ ## Authentication Issues
125
+
126
+ ### 1. "User not authenticated" Error
127
+
128
+ **Problem**: Users are getting "not authenticated" errors even when they should be logged in.
129
+
130
+ **Solution**:
131
+
132
+ ```typescript
133
+ import { useUnifiedAuth } from '@jmruthers/pace-core';
134
+
135
+ function App() {
136
+ const { user, loading, error } = useUnifiedAuth();
137
+
138
+ if (loading) {
139
+ return <div>Loading...</div>;
140
+ }
141
+
142
+ if (error) {
143
+ console.error('Auth error:', error);
144
+ return <div>Authentication error: {error.message}</div>;
145
+ }
146
+
147
+ if (!user) {
148
+ return <LoginForm />;
149
+ }
150
+
151
+ return <AuthenticatedApp />;
152
+ }
153
+ ```
154
+
155
+ **Common Causes**:
156
+ - Session expired
157
+ - Invalid token
158
+ - Network connectivity issues
159
+ - Supabase configuration problems
160
+
161
+ **Debugging**:
162
+ ```typescript
163
+ // Check session status
164
+ const { session } = useUnifiedAuth();
165
+ console.log('Session:', session);
166
+ console.log('Session expires:', new Date(session?.expires_at * 1000));
167
+ ```
168
+
169
+ ### 2. Authentication Provider Not Wrapped
170
+
171
+ **Problem**: Components can't access authentication context.
172
+
173
+ **Solution**: Ensure your app is wrapped with the authentication provider:
174
+
175
+ ```typescript
176
+ import { UnifiedAuthProvider } from '@jmruthers/pace-core';
177
+
178
+ function App() {
179
+ return (
180
+ <UnifiedAuthProvider>
181
+ <YourApp />
182
+ </UnifiedAuthProvider>
183
+ );
184
+ }
185
+ ```
186
+
187
+ ### 3. Session Refresh Issues
188
+
189
+ **Problem**: Sessions are not refreshing automatically.
190
+
191
+ **Solution**:
192
+
193
+ ```typescript
194
+ import { useUnifiedAuth } from '@jmruthers/pace-core';
195
+
196
+ function SessionManager() {
197
+ const { session, refreshSession } = useUnifiedAuth();
198
+
199
+ useEffect(() => {
200
+ if (session && session.expires_at) {
201
+ const timeUntilExpiry = session.expires_at * 1000 - Date.now();
202
+ const refreshTime = Math.max(timeUntilExpiry - 5 * 60 * 1000, 0);
203
+
204
+ const timer = setTimeout(() => {
205
+ refreshSession();
206
+ }, refreshTime);
207
+
208
+ return () => clearTimeout(timer);
209
+ }
210
+ }, [session, refreshSession]);
211
+
212
+ return null;
213
+ }
214
+ ```
215
+
216
+ ## Permission Issues
217
+
218
+ ### 1. "Access denied" Errors
219
+
220
+ **Problem**: Users are getting access denied even when they should have permissions.
221
+
222
+ **Solution**:
223
+
224
+ ```typescript
225
+ import { useRBAC } from '@jmruthers/pace-core';
226
+
227
+ function DebugPermissions() {
228
+ const { user, roles, permissions, hasPermission } = useRBAC();
229
+
230
+ console.log('User:', user);
231
+ console.log('Roles:', roles);
232
+ console.log('Permissions:', permissions);
233
+
234
+ // Test specific permissions
235
+ console.log('Can read users:', hasPermission('read:users'));
236
+ console.log('Can create events:', hasPermission('create:events'));
237
+
238
+ return (
239
+ <div>
240
+ <h3>Permission Debug Info</h3>
241
+ <p>User: {user?.email}</p>
242
+ <p>Roles: {roles.map(r => r.name).join(', ')}</p>
243
+ <p>Permissions: {permissions.map(p => p.name).join(', ')}</p>
244
+ </div>
245
+ );
246
+ }
247
+ ```
248
+
249
+ ### 2. Page Permission Not Working
250
+
251
+ **Problem**: Page-level permissions are not being enforced.
252
+
253
+ **Solution**:
254
+
255
+ ```typescript
256
+ import { usePagePermission } from '@jmruthers/pace-core';
257
+
258
+ function ProtectedPage() {
259
+ const { hasAccess, loading, error } = usePagePermission('admin');
260
+
261
+ if (loading) {
262
+ return <div>Checking permissions...</div>;
263
+ }
264
+
265
+ if (error) {
266
+ console.error('Permission error:', error);
267
+ return <div>Error checking permissions</div>;
268
+ }
269
+
270
+ if (!hasAccess) {
271
+ return <div>Access denied</div>;
272
+ }
273
+
274
+ return <AdminDashboard />;
275
+ }
276
+ ```
277
+
278
+ ### 3. Organisation Context Missing
279
+
280
+ **Problem**: Organisation-based permissions are not working.
281
+
282
+ **Solution**:
283
+
284
+ ```typescript
285
+ import { useOrganisation } from '@jmruthers/pace-core';
286
+
287
+ function OrganisationAwareComponent() {
288
+ const { currentOrganisation, loading, error } = useOrganisation();
289
+
290
+ if (loading) {
291
+ return <div>Loading organisation...</div>;
292
+ }
293
+
294
+ if (error) {
295
+ console.error('Organisation error:', error);
296
+ return <div>Error loading organisation</div>;
297
+ }
298
+
299
+ if (!currentOrganisation) {
300
+ return <div>Please select an organisation</div>;
301
+ }
302
+
303
+ return (
304
+ <div>
305
+ <h1>{currentOrganisation.name}</h1>
306
+ {/* Your component content */}
307
+ </div>
308
+ );
309
+ }
310
+ ```
311
+
312
+ ### 4. Organisation Context Timing Issue (v0.3.44+ Fixed)
313
+
314
+ **Problem**: RLS policies failing on first load, super admin permissions returning false, or database queries not filtering by organisation.
315
+
316
+ **Root Cause**: Race condition where database organisation context wasn't set before other components tried to make queries.
317
+
318
+ **Solution**: This issue was fixed in v0.3.44+. The `OrganisationProvider` now:
319
+
320
+ 1. **Sets database context before rendering children**
321
+ 2. **Shows loading states during context setup**
322
+ 3. **Prevents race conditions with database queries**
323
+
324
+ If you're still experiencing this issue:
325
+
326
+ ```typescript
327
+ // ✅ Ensure proper provider hierarchy
328
+ <UnifiedAuthProvider supabaseClient={supabase} appName="my-app">
329
+ <OrganisationProvider> {/* This now handles context timing automatically */}
330
+ <EventProvider>
331
+ <YourAppContent />
332
+ </EventProvider>
333
+ </OrganisationProvider>
334
+ </UnifiedAuthProvider>
335
+ ```
336
+
337
+ **For v0.3.43 and earlier**: You may need to implement a local workaround:
338
+
339
+ ```typescript
340
+ // Temporary workaround for older versions
341
+ function OrganisationContextGuard({ children }: { children: React.ReactNode }) {
342
+ const { selectedOrganisation } = useOrganisation();
343
+ const { supabase } = useUnifiedAuth();
344
+ const [contextReady, setContextReady] = useState(false);
345
+
346
+ useEffect(() => {
347
+ if (selectedOrganisation && supabase) {
348
+ setOrganisationContext(supabase, selectedOrganisation.id)
349
+ .then(() => setContextReady(true))
350
+ .catch(console.error);
351
+ }
352
+ }, [selectedOrganisation, supabase]);
353
+
354
+ if (!contextReady) {
355
+ return <div>Setting up organisation context...</div>;
356
+ }
357
+
358
+ return <>{children}</>;
359
+ }
360
+ ```
361
+
362
+ **Detailed Setup**: If you're getting "unrecognized configuration parameter" errors, see the [Organisation Context Setup Guide](./organisation-context-setup.md) for complete database setup instructions.
363
+
364
+ ## Styling Issues
365
+
366
+ ### 1. App Looks Unstyled (Raw HTML)
367
+
368
+ **Problem**: App appears with default browser styling only - no colors, fonts, or proper layout.
369
+
370
+ **Symptoms**:
371
+ - Default browser styling only
372
+ - No colors, fonts, or layout
373
+ - Components look like plain HTML
374
+ - Header is squashed or too wide
375
+ - Main container stretches full width
376
+ - Missing colored background
377
+
378
+ **Solution**:
379
+
380
+ **CRITICAL**: Use the `PaceAppLayout` component - don't just import CSS files:
381
+
382
+ ```tsx
383
+ // ❌ Wrong - just CSS imports
384
+ import '@jmruthers/pace-core/styles/core.css';
385
+
386
+ function App() {
387
+ return (
388
+ <div>
389
+ <h1>My App</h1>
390
+ {/* This won't be styled properly */}
391
+ </div>
392
+ );
393
+ }
394
+
395
+ // ✅ Correct - use PaceAppLayout
396
+ import { PaceAppLayout } from '@jmruthers/pace-core';
397
+ import './app.css'; // Your app's color palette (must come first)
398
+ import '@jmruthers/pace-core/styles/core.css';
399
+
400
+ function App() {
401
+ return (
402
+ <PaceAppLayout appName="My Application">
403
+ <div className="container mx-auto px-4 py-6">
404
+ <h1 className="text-3xl font-bold text-main-900">My App</h1>
405
+ <p className="text-main-700">This will be properly styled</p>
406
+ </div>
407
+ </PaceAppLayout>
408
+ );
409
+ }
410
+ ```
411
+
412
+ **Common Causes**:
413
+ - Missing CSS imports
414
+ - Wrong build tool configuration (using Tailwind v3 instead of v4)
415
+ - Not using PaceAppLayout component
416
+ - Missing app.css with color palette
417
+ - CSS files not being processed
418
+
419
+ **Build Tool Configuration**:
420
+
421
+ **For Vite (Recommended):**
422
+ ```js
423
+ // vite.config.js
424
+ import { defineConfig } from 'vite'
425
+ import react from '@vitejs/plugin-react'
426
+ import tailwindcss from '@tailwindcss/vite'
427
+
428
+ export default defineConfig({
429
+ plugins: [
430
+ react(),
431
+ tailwindcss() // Tailwind v4 - no config file needed!
432
+ ],
433
+ })
434
+ ```
435
+
436
+ **Dependencies:**
437
+ ```bash
438
+ npm install -D @tailwindcss/vite tailwindcss@^4.0.0
439
+ # Remove old Tailwind v3 if installed
440
+ npm uninstall tailwindcss@^3.0.0
441
+ ```
442
+
443
+ **Create app.css with Color Palette:**
444
+ ```css
445
+ /* app.css - Your app's color palette */
446
+ @theme static {
447
+ /* MAIN palette - your primary brand color */
448
+ --color-main-raw: oklch(0.7 0.057 252.02);
449
+ --color-main-50: oklch(0.98 0.001 252.02);
450
+ --color-main-100: oklch(0.96 0.005 252.02);
451
+ --color-main-200: oklch(0.927 0.012 252.02);
452
+ --color-main-300: oklch(0.881 0.021 252.02);
453
+ --color-main-400: oklch(0.822 0.032 252.02);
454
+ --color-main-500: oklch(0.75 0.047 252.02);
455
+ --color-main-600: oklch(0.7 0.057 252.02);
456
+ --color-main-700: oklch(0.567 0.044 252.02);
457
+ --color-main-800: oklch(0.456 0.034 252.02);
458
+ --color-main-900: oklch(0.332 0.024 252.02);
459
+ --color-main-950: oklch(0.195 0.014 252.02);
460
+
461
+ /* SEC palette - your secondary brand color */
462
+ --color-sec-raw: oklch(0.58 0.23 280.75);
463
+ --color-sec-50: oklch(0.98 0.003 280.75);
464
+ --color-sec-100: oklch(0.96 0.014 280.75);
465
+ --color-sec-200: oklch(0.927 0.033 280.75);
466
+ --color-sec-300: oklch(0.881 0.059 280.75);
467
+ --color-sec-400: oklch(0.822 0.093 280.75);
468
+ --color-sec-500: oklch(0.75 0.133 280.75);
469
+ --color-sec-600: oklch(0.665 0.182 280.75);
470
+ --color-sec-700: oklch(0.58 0.23 280.75);
471
+ --color-sec-800: oklch(0.456 0.158 280.75);
472
+ --color-sec-900: oklch(0.332 0.099 280.75);
473
+ --color-sec-950: oklch(0.195 0.047 280.75);
474
+
475
+ /* ACC palette - your accent brand color */
476
+ --color-acc-raw: oklch(0.64 0.21 37.76);
477
+ --color-acc-50: oklch(0.98 0.003 37.76);
478
+ --color-acc-100: oklch(0.96 0.015 37.76);
479
+ --color-acc-200: oklch(0.927 0.035 37.76);
480
+ --color-acc-300: oklch(0.881 0.063 37.76);
481
+ --color-acc-400: oklch(0.822 0.099 37.76);
482
+ --color-acc-500: oklch(0.75 0.143 37.76);
483
+ --color-acc-600: oklch(0.64 0.21 37.76);
484
+ --color-acc-700: oklch(0.567 0.177 37.76);
485
+ --color-acc-800: oklch(0.456 0.13 37.76);
486
+ --color-acc-900: oklch(0.332 0.085 37.76);
487
+ --color-acc-950: oklch(0.195 0.044 37.76);
488
+ }
489
+ ```
490
+
491
+ **Debugging Steps**:
492
+ 1. Check Browser DevTools for CSS import errors
493
+ 2. Verify pace-core CSS files are loading in Network tab
494
+ 3. Inspect elements to see if Tailwind classes are applied
495
+ 4. Ensure Tailwind v4 is installed and configured
496
+ 5. Test CSS imports with temporary rule: `body { background-color: red !important; }`
497
+
498
+ **Quick Checklist**:
499
+ - [ ] CSS files imported in main.tsx/App.tsx
500
+ - [ ] app.css created with color palette
501
+ - [ ] Using PaceAppLayout component
502
+ - [ ] Tailwind v4 configured in build tool
503
+ - [ ] No custom CSS overriding pace-core styles
504
+ - [ ] All required dependencies installed
505
+ - [ ] No build errors in console
506
+
507
+ ### 2. App Looks Different from Demo (v0.3.47+ Fixed)
508
+
509
+ **Problem**: Your consuming app looks different from the PACE Core demo app
510
+
511
+ **Symptoms**:
512
+ - Different background colors (gray instead of blue)
513
+ - Different text colors
514
+ - Overall different visual appearance
515
+
516
+ **Root Cause**: The demo app uses a custom CSS configuration, while consuming apps use our theme file. The theme file was using neutral gray colors instead of the blue-tinted scheme from the demo.
517
+
518
+ **Solution**: This issue was fixed in v0.3.47+. The theme file now uses the same blue-tinted color scheme as the demo app:
519
+
520
+ - **Background**: Very light blue (`--color-primary-50`)
521
+ - **Foreground**: Very dark blue (`--color-primary-950`)
522
+ - **Primary**: Blue (`--color-primary-600`)
523
+ - **Borders**: Blue (`--color-primary-500`)
524
+ - **Inputs**: Light purple (`--color-secondary-200`)
525
+
526
+ **Quick Fix**:
527
+ ```bash
528
+ npm install @jmruthers/pace-core@latest
529
+ ```
530
+
531
+ ### 2. Header Layout Issues (v0.3.48+ Fixed)
532
+
533
+ **Problem**: Header elements are stacked vertically instead of being aligned horizontally across the page
534
+
535
+ **Symptoms**:
536
+ - Logo, navigation, and user menu are stacked vertically
537
+ - Header doesn't use the full width properly
538
+ - Layout looks broken compared to demo app
539
+
540
+ **Root Cause**: Missing CSS variables that the header component depends on:
541
+ - `--app-width` (for container width)
542
+ - `--color-main-*` (for header background colors)
543
+ - `--color-sec-*` and `--color-acc-*` (for other header elements)
544
+
545
+ **Solution**: This issue was fixed in v0.3.48+. The theme file now includes all required CSS variables:
546
+
547
+ - **Layout Variables**: `--app-width: 90rem`
548
+ - **App Color Variables**: `--color-main-*`, `--color-sec-*`, `--color-acc-*`
549
+ - **Complete Color Palette**: All color variants (50, 100, 200, etc.) plus `-raw` variants
550
+
551
+ **Quick Fix**:
552
+ ```bash
553
+ npm install @jmruthers/pace-core@latest
554
+ ```
555
+
556
+ ### 3. Missing CSS Variables (v0.3.49+ Fixed)
557
+
558
+ **Problem**: Components not rendering correctly due to missing CSS variables
559
+
560
+ **Symptoms**:
561
+ - Components appear unstyled or broken
562
+ - Console errors about undefined CSS variables
563
+ - Inconsistent appearance across different components
564
+ - DataTable examples not working properly
565
+
566
+ **Root Cause**: The theme file was missing many CSS variables that components depend on:
567
+ - Font variables (--font-sans, --font-serif, --font-mono)
568
+ - Design tokens (--pace-* variables)
569
+ - Event colors (--color-ev-* variables)
570
+ - Radix UI variables (--radix-toast-*)
571
+
572
+ **Solution**: This issue was fixed in v0.3.49+. The theme file now includes comprehensive variable coverage:
573
+
574
+ - **Font Variables**: All typography variables for consistent fonts
575
+ - **Design Tokens**: Complete PACE Core design token system
576
+ - **Event Colors**: Full color palette for DataTable examples
577
+ - **Component Variables**: All variables needed for component styling
578
+ - **Radix UI Variables**: Third-party component library compatibility
579
+
580
+ **Quick Fix**:
581
+ ```bash
582
+ npm install @jmruthers/pace-core@latest
583
+ ```
584
+
585
+ ### 4. Login Page Styling Issues (v0.4.4+ Fixed)
586
+
587
+ **Problem**: Login page looks different from the pace-core demo - unstyled button, wrong background, missing shadows.
588
+
589
+ **Symptoms**:
590
+ - Button appears as plain text instead of styled button
591
+ - Background is white instead of gradient
592
+ - Card has no shadow or wrong styling
593
+ - Input fields are dark instead of white
594
+ - Overall appearance doesn't match the demo
595
+
596
+ **Root Cause**: Missing theme mappings in `styles/core.css` prevented CSS variables from being processed correctly by Tailwind v4.
597
+
598
+ **Solution**: This issue was fixed in v0.4.4+. The theme file now includes complete mappings for all color palettes.
599
+
600
+ **Quick Fix**:
601
+ ```bash
602
+ npm install @jmruthers/pace-core@latest
603
+ ```
604
+
605
+ **Required Setup** (must be exactly like this):
606
+
607
+ 1. **CSS Imports** (in your main.tsx):
608
+ ```tsx
609
+ import './app.css'; // Your app's palette definitions (must come first)
610
+ import '@jmruthers/pace-core/styles/core.css';
611
+ ```
612
+
613
+ 2. **App.css** (complete palette required):
614
+ ```css
615
+ @theme static {
616
+ /* MAIN palette - your primary brand color */
617
+ --color-main-50: oklch(0.98 0.001 252.02);
618
+ --color-main-100: oklch(0.96 0.005 252.02);
619
+ /* ... all shades 50-950 + raw */
620
+
621
+ /* SEC palette - your secondary brand color */
622
+ --color-sec-50: oklch(0.98 0.003 280.75);
623
+ /* ... all shades 50-950 + raw */
624
+
625
+ /* ACC palette - your accent brand color */
626
+ --color-acc-50: oklch(0.98 0.003 37.76);
627
+ /* ... all shades 50-950 + raw */
628
+ }
629
+
630
+ @layer base {
631
+ .appGradient {
632
+ background: radial-gradient(var(--color-main-200), oklch(from var(--color-main-200) l c h / 0%) 30%),
633
+ conic-gradient(var(--color-main-200), var(--color-sec-200), var(--color-acc-200), var(--color-main-200));
634
+ background-attachment: fixed;
635
+ }
636
+ }
637
+ ```
638
+
639
+ 3. **HTML Structure** (in your index.html):
640
+ ```html
641
+ <body class="appGradient">
642
+ <div id="root" class="grid grid-rows-[auto_1fr_auto] min-h-screen"></div>
643
+ </body>
644
+ ```
645
+
646
+ 4. **Vite Configuration** (Tailwind v4 required):
647
+ ```ts
648
+ // vite.config.ts
649
+ import { defineConfig } from 'vite';
650
+ import react from '@vitejs/plugin-react';
651
+ import tailwindcss from '@tailwindcss/vite';
652
+
653
+ export default defineConfig({
654
+ plugins: [
655
+ react(),
656
+ tailwindcss() // Tailwind v4 - no config file needed!
657
+ ],
658
+ });
659
+ ```
660
+
661
+ **Debugging Steps**:
662
+ 1. Check browser dev tools for CSS import errors
663
+ 2. Verify `bg-main-600` class resolves to actual color value
664
+ 3. Ensure all CSS files are imported in correct order
665
+ 4. Confirm Tailwind v4 is installed (not v3)
666
+ 5. Test with minimal setup to isolate the issue
667
+
668
+ ### 5. Tailwind v4 Theme File Issues (v0.3.45+ Fixed)
669
+
670
+ **Problem**: Build failures when using `@import '@jmruthers/pace-core/styles/core.css'`
671
+
672
+ **Root Cause**: The theme file was missing semantic colors and had circular references in component classes.
673
+
674
+ **Solution**: This issue was fixed in v0.3.45+. The theme file now includes:
675
+
676
+ - **Complete semantic colors** (ring, border, background, foreground, etc.)
677
+ - **Fixed component classes** (no circular @apply references)
678
+ - **All required Tailwind v4 colors**
679
+
680
+ **Quick Fix**:
681
+ ```bash
682
+ npm install @jmruthers/pace-core@latest
683
+ ```
684
+
685
+ **Usage**:
686
+ ```css
687
+ /* index.css */
688
+ @import '@jmruthers/pace-core/styles/core.css';
689
+ ```
690
+
691
+ **Vite Configuration**:
692
+ ```ts
693
+ // vite.config.ts
694
+ import { defineConfig } from 'vite';
695
+ import react from '@vitejs/plugin-react';
696
+ import tailwindcss from '@tailwindcss/vite';
697
+
698
+ export default defineConfig({
699
+ plugins: [
700
+ react(),
701
+ tailwindcss() // ✅ Simple - theme is in CSS
702
+ ],
703
+ });
704
+ ```
705
+
706
+ ### 2. Missing Semantic Colors
707
+
708
+ **Problem**: Colors like `ring-ring`, `border`, `background` not working
709
+
710
+ **Solution**: The theme file now includes all semantic colors:
711
+
712
+ ```css
713
+ /* These are now included in the theme file */
714
+ --color-ring: var(--color-primary-600);
715
+ --color-border: var(--color-neutral-300);
716
+ --color-background: var(--color-neutral-50);
717
+ --color-foreground: var(--color-neutral-950);
718
+ /* ... and more */
719
+ ```
720
+
721
+ ### 3. Component Classes Not Working
722
+
723
+ **Problem**: `.pace-button`, `.pace-input` classes not applying styles
724
+
725
+ **Solution**: Component classes are now self-contained:
726
+
727
+ ```css
728
+ /* ✅ Fixed - no circular references */
729
+ .pace-button-primary {
730
+ @apply inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background bg-primary-600 text-main-50 hover:bg-primary-700 active:bg-primary-800;
731
+ }
732
+ ```
733
+
734
+ ## Event Management Issues
735
+
736
+ ### 1. Events Not Loading
737
+
738
+ **Problem**: Events are not being fetched or displayed.
739
+
740
+ **Solution**:
741
+
742
+ ```typescript
743
+ import { useEvents } from '@jmruthers/pace-core';
744
+
745
+ function EventList() {
746
+ const { events, loading, error, refreshEvents } = useEvents();
747
+
748
+ if (loading) {
749
+ return <div>Loading events...</div>;
750
+ }
751
+
752
+ if (error) {
753
+ console.error('Events error:', error);
754
+ return (
755
+ <div>
756
+ <div>Error loading events: {error}</div>
757
+ <button onClick={refreshEvents}>Retry</button>
758
+ </div>
759
+ );
760
+ }
761
+
762
+ if (!events || events.length === 0) {
763
+ return <div>No events found</div>;
764
+ }
765
+
766
+ return (
767
+ <div>
768
+ {events.map(event => (
769
+ <div key={event.id}>
770
+ <h3>{event.name}</h3>
771
+ <p>{event.description}</p>
772
+ </div>
773
+ ))}
774
+ </div>
775
+ );
776
+ }
777
+ ```
778
+
779
+ ### 2. Event Selection Not Working
780
+
781
+ **Problem**: Users can't select events or the selection is not persisting.
782
+
783
+ **Solution**:
784
+
785
+ ```typescript
786
+ import { useEvents } from '@jmruthers/pace-core';
787
+
788
+ function EventSelector() {
789
+ const { events, selectedEvent, setSelectedEvent, hasAccess } = useEvents();
790
+
791
+ const handleEventSelect = (event) => {
792
+ if (hasAccess(event.id)) {
793
+ setSelectedEvent(event);
794
+ } else {
795
+ console.warn('User does not have access to this event');
796
+ }
797
+ };
798
+
799
+ return (
800
+ <div>
801
+ <h2>Select Event</h2>
802
+ {events.map(event => (
803
+ <div key={event.id}>
804
+ <span>{event.name}</span>
805
+ {hasAccess(event.id) ? (
806
+ <button onClick={() => handleEventSelect(event)}>
807
+ {selectedEvent?.id === event.id ? 'Selected' : 'Select'}
808
+ </button>
809
+ ) : (
810
+ <span>No access</span>
811
+ )}
812
+ </div>
813
+ ))}
814
+ </div>
815
+ );
816
+ }
817
+ ```
818
+
819
+ ## Form Issues
820
+
821
+ ### 1. Form Validation Not Working
822
+
823
+ **Problem**: Form validation is not triggering or showing errors.
824
+
825
+ **Solution**:
826
+
827
+ ```typescript
828
+ import { useZodForm } from '@jmruthers/pace-core';
829
+ import { z } from 'zod';
830
+
831
+ const schema = z.object({
832
+ name: z.string().min(1, 'Name is required'),
833
+ email: z.string().email('Invalid email'),
834
+ });
835
+
836
+ function UserForm() {
837
+ const {
838
+ register,
839
+ handleSubmit,
840
+ formState: { errors, isSubmitting },
841
+ reset,
842
+ } = useZodForm(schema);
843
+
844
+ const onSubmit = async (data) => {
845
+ try {
846
+ await createUser(data);
847
+ reset();
848
+ } catch (error) {
849
+ console.error('Form submission error:', error);
850
+ }
851
+ };
852
+
853
+ return (
854
+ <form onSubmit={handleSubmit(onSubmit)}>
855
+ <div>
856
+ <input {...register('name')} placeholder="Name" />
857
+ {errors.name && <span className="error">{errors.name.message}</span>}
858
+ </div>
859
+
860
+ <div>
861
+ <input type="email" {...register('email')} placeholder="Email" />
862
+ {errors.email && <span className="error">{errors.email.message}</span>}
863
+ </div>
864
+
865
+ <button type="submit" disabled={isSubmitting}>
866
+ {isSubmitting ? 'Submitting...' : 'Submit'}
867
+ </button>
868
+ </form>
869
+ );
870
+ }
871
+ ```
872
+
873
+ ### 2. Form Data Not Saving
874
+
875
+ **Problem**: Form data is not being saved to the database.
876
+
877
+ **Solution**:
878
+
879
+ ```typescript
880
+ import { useZodForm } from '@jmruthers/pace-core';
881
+ import { useSupabase } from '@jmruthers/pace-core';
882
+
883
+ function UserForm() {
884
+ const { supabase } = useSupabase();
885
+ const { currentOrganisation } = useOrganisation();
886
+
887
+ const onSubmit = async (data) => {
888
+ try {
889
+ const { error } = await supabase
890
+ .from('users')
891
+ .insert({
892
+ ...data,
893
+ organisation_id: currentOrganisation.id,
894
+ });
895
+
896
+ if (error) {
897
+ console.error('Database error:', error);
898
+ throw error;
899
+ }
900
+
901
+ console.log('User created successfully');
902
+ } catch (error) {
903
+ console.error('Form submission error:', error);
904
+ }
905
+ };
906
+
907
+ // ... rest of form component
908
+ }
909
+ ```
910
+
911
+ ## Component Issues
912
+
913
+ ### 1. Components Not Rendering
914
+
915
+ **Problem**: Components are not rendering or showing blank content.
916
+
917
+ **Solution**:
918
+
919
+ ```typescript
920
+ import { ErrorBoundary } from '@jmruthers/pace-core';
921
+
922
+ function App() {
923
+ return (
924
+ <ErrorBoundary fallback={<div>Something went wrong</div>}>
925
+ <YourComponents />
926
+ </ErrorBoundary>
927
+ );
928
+ }
929
+ ```
930
+
931
+ ### 2. Styling Issues
932
+
933
+ **Problem**: Components are not styled correctly or styles are missing.
934
+
935
+ **Solution**:
936
+
937
+ ```typescript
938
+ // Ensure Tailwind CSS is imported
939
+ // Import the core CSS file
940
+ import './app.css'; // Your app's color palette (must come first)
941
+ import '@jmruthers/pace-core/styles/core.css';
942
+
943
+ // Check if your app is properly set up
944
+ function App() {
945
+ return (
946
+ <div>
947
+ <YourApp />
948
+ </div>
949
+ );
950
+ }
951
+ ```
952
+
953
+ ### 3. Component Props Issues
954
+
955
+ **Problem**: Components are not receiving the correct props or props are undefined.
956
+
957
+ **Solution**:
958
+
959
+ ```typescript
960
+ import { Button } from '@jmruthers/pace-core';
961
+
962
+ function MyComponent() {
963
+ // Always provide required props
964
+ return (
965
+ <Button
966
+ variant="primary"
967
+ onClick={() => console.log('clicked')}
968
+ >
969
+ Click me
970
+ </Button>
971
+ );
972
+ }
973
+ ```
974
+
975
+ ## Database Issues
976
+
977
+ ### 1. Database Connection Errors
978
+
979
+ **Problem**: Cannot connect to Supabase database.
980
+
981
+ **Solution**:
982
+
983
+ ```typescript
984
+ import { createSupabaseClient } from '@jmruthers/pace-core';
985
+
986
+ // Check environment variables
987
+ const supabaseUrl = process.env.SUPABASE_URL;
988
+ const supabaseKey = process.env.SUPABASE_ANON_KEY;
989
+
990
+ if (!supabaseUrl || !supabaseKey) {
991
+ console.error('Missing Supabase environment variables');
992
+ throw new Error('Supabase configuration missing');
993
+ }
994
+
995
+ const supabase = createSupabaseClient(supabaseUrl, supabaseKey);
996
+
997
+ // Test connection
998
+ supabase.from('users').select('count').single()
999
+ .then(() => console.log('Database connected'))
1000
+ .catch(error => console.error('Database connection failed:', error));
1001
+ ```
1002
+
1003
+ ### 2. RLS Policy Issues
1004
+
1005
+ **Problem**: Row Level Security policies are blocking legitimate access.
1006
+
1007
+ **Solution**:
1008
+
1009
+ ```sql
1010
+ -- Check if RLS is enabled
1011
+ SELECT schemaname, tablename, rowsecurity
1012
+ FROM pg_tables
1013
+ WHERE tablename = 'your_table_name';
1014
+
1015
+ -- Check policies
1016
+ SELECT * FROM pg_policies WHERE tablename = 'your_table_name';
1017
+
1018
+ -- Test policy
1019
+ SELECT * FROM your_table_name WHERE organisation_id = 'your_org_id';
1020
+ ```
1021
+
1022
+ ### 3. Data Not Filtered by Organisation
1023
+
1024
+ **Problem**: Data is not being filtered by the current organisation.
1025
+
1026
+ **Solution**:
1027
+
1028
+ ```typescript
1029
+ import { useOrganisation } from '@jmruthers/pace-core';
1030
+ import { useSupabase } from '@jmruthers/pace-core';
1031
+
1032
+ function DataComponent() {
1033
+ const { supabase } = useSupabase();
1034
+ const { currentOrganisation } = useOrganisation();
1035
+
1036
+ const fetchData = async () => {
1037
+ if (!currentOrganisation) {
1038
+ console.warn('No organisation selected');
1039
+ return;
1040
+ }
1041
+
1042
+ const { data, error } = await supabase
1043
+ .from('your_table')
1044
+ .select('*')
1045
+ .eq('organisation_id', currentOrganisation.id);
1046
+
1047
+ if (error) {
1048
+ console.error('Database error:', error);
1049
+ return;
1050
+ }
1051
+
1052
+ console.log('Filtered data:', data);
1053
+ };
1054
+
1055
+ return (
1056
+ <div>
1057
+ <button onClick={fetchData}>Load Data</button>
1058
+ </div>
1059
+ );
1060
+ }
1061
+ ```
1062
+
1063
+ ## Performance Issues
1064
+
1065
+ ### 1. Slow Loading Times
1066
+
1067
+ **Problem**: Components are taking too long to load.
1068
+
1069
+ **Solution**:
1070
+
1071
+ ```typescript
1072
+ import { useMemo } from 'react';
1073
+ import { useEvents } from '@jmruthers/pace-core';
1074
+
1075
+ function OptimizedEventList() {
1076
+ const { events, loading } = useEvents();
1077
+
1078
+ // Memoize expensive calculations
1079
+ const sortedEvents = useMemo(() => {
1080
+ return events?.sort((a, b) =>
1081
+ new Date(a.start_date).getTime() - new Date(b.start_date).getTime()
1082
+ ) || [];
1083
+ }, [events]);
1084
+
1085
+ if (loading) {
1086
+ return <div>Loading events...</div>;
1087
+ }
1088
+
1089
+ return (
1090
+ <div>
1091
+ {sortedEvents.map(event => (
1092
+ <EventCard key={event.id} event={event} />
1093
+ ))}
1094
+ </div>
1095
+ );
1096
+ }
1097
+ ```
1098
+
1099
+ ### 2. Memory Leaks
1100
+
1101
+ **Problem**: Memory usage is increasing over time.
1102
+
1103
+ **Solution**:
1104
+
1105
+ ```typescript
1106
+ import { useEffect, useCallback } from 'react';
1107
+ import { useEvents } from '@jmruthers/pace-core';
1108
+
1109
+ function EventManager() {
1110
+ const { events, refreshEvents } = useEvents();
1111
+
1112
+ // Clean up on unmount
1113
+ useEffect(() => {
1114
+ return () => {
1115
+ // Cleanup function
1116
+ console.log('Component unmounting');
1117
+ };
1118
+ }, []);
1119
+
1120
+ // Memoize callbacks
1121
+ const handleRefresh = useCallback(() => {
1122
+ refreshEvents();
1123
+ }, [refreshEvents]);
1124
+
1125
+ return (
1126
+ <div>
1127
+ <button onClick={handleRefresh}>Refresh Events</button>
1128
+ {/* Event list */}
1129
+ </div>
1130
+ );
1131
+ }
1132
+ ```
1133
+
1134
+ ## Network Issues
1135
+
1136
+ ### 1. API Request Failures
1137
+
1138
+ **Problem**: API requests are failing with network errors.
1139
+
1140
+ **Solution**:
1141
+
1142
+ ```typescript
1143
+ import { useUnifiedAuth } from '@jmruthers/pace-core';
1144
+
1145
+ function NetworkAwareComponent() {
1146
+ const { error } = useUnifiedAuth();
1147
+
1148
+ useEffect(() => {
1149
+ if (error) {
1150
+ console.error('Network error:', error);
1151
+
1152
+ // Check if it's a network issue
1153
+ if (error.message.includes('network') || error.message.includes('fetch')) {
1154
+ console.log('Network connectivity issue detected');
1155
+ // Implement retry logic or show offline message
1156
+ }
1157
+ }
1158
+ }, [error]);
1159
+
1160
+ return (
1161
+ <div>
1162
+ {error && (
1163
+ <div className="error">
1164
+ <p>Connection error: {error.message}</p>
1165
+ <button onClick={() => window.location.reload()}>
1166
+ Retry
1167
+ </button>
1168
+ </div>
1169
+ )}
1170
+ </div>
1171
+ );
1172
+ }
1173
+ ```
1174
+
1175
+ ### 2. CORS Issues
1176
+
1177
+ **Problem**: Getting CORS errors when making requests.
1178
+
1179
+ **Solution**:
1180
+
1181
+ ```typescript
1182
+ // Check Supabase configuration
1183
+ const supabase = createSupabaseClient(
1184
+ process.env.SUPABASE_URL!,
1185
+ process.env.SUPABASE_ANON_KEY!,
1186
+ {
1187
+ auth: {
1188
+ autoRefreshToken: true,
1189
+ persistSession: true,
1190
+ detectSessionInUrl: true,
1191
+ },
1192
+ }
1193
+ );
1194
+ ```
1195
+
1196
+ ## Environment Issues
1197
+
1198
+ ### 1. Environment Variables Missing
1199
+
1200
+ **Problem**: Application is failing due to missing environment variables.
1201
+
1202
+ **Solution**:
1203
+
1204
+ ```typescript
1205
+ // Validate environment variables
1206
+ const requiredEnvVars = [
1207
+ 'SUPABASE_URL',
1208
+ 'SUPABASE_ANON_KEY',
1209
+ 'NODE_ENV',
1210
+ ];
1211
+
1212
+ requiredEnvVars.forEach(varName => {
1213
+ if (!process.env[varName]) {
1214
+ console.error(`Missing environment variable: ${varName}`);
1215
+ throw new Error(`Missing required environment variable: ${varName}`);
1216
+ }
1217
+ });
1218
+
1219
+ console.log('Environment variables validated');
1220
+ ```
1221
+
1222
+ ### 2. Development vs Production Issues
1223
+
1224
+ **Problem**: Application works in development but not in production.
1225
+
1226
+ **Solution**:
1227
+
1228
+ ```typescript
1229
+ // Environment-specific configuration
1230
+ const config = {
1231
+ development: {
1232
+ supabaseUrl: process.env.SUPABASE_URL,
1233
+ supabaseKey: process.env.SUPABASE_ANON_KEY,
1234
+ debug: true,
1235
+ },
1236
+ production: {
1237
+ supabaseUrl: process.env.SUPABASE_URL,
1238
+ supabaseKey: process.env.SUPABASE_ANON_KEY,
1239
+ debug: false,
1240
+ },
1241
+ };
1242
+
1243
+ const currentConfig = config[process.env.NODE_ENV || 'development'];
1244
+ ```
1245
+
1246
+ ## Debugging Tools
1247
+
1248
+ ### 1. Debug Component
1249
+
1250
+ ```typescript
1251
+ function DebugPanel() {
1252
+ const { user, session } = useUnifiedAuth();
1253
+ const { currentOrganisation } = useOrganisation();
1254
+ const { events, selectedEvent } = useEvents();
1255
+
1256
+ return (
1257
+ <div className="debug-panel">
1258
+ <h3>Debug Information</h3>
1259
+ <pre>
1260
+ {JSON.stringify({
1261
+ user: user?.email,
1262
+ session: session?.expires_at,
1263
+ organisation: currentOrganisation?.name,
1264
+ events: events?.length,
1265
+ selectedEvent: selectedEvent?.name,
1266
+ }, null, 2)}
1267
+ </pre>
1268
+ </div>
1269
+ );
1270
+ }
1271
+ ```
1272
+
1273
+ ### 2. Error Boundary with Logging
1274
+
1275
+ ```typescript
1276
+ import { ErrorBoundary } from '@jmruthers/pace-core';
1277
+
1278
+ function LoggingErrorBoundary({ children }) {
1279
+ return (
1280
+ <ErrorBoundary
1281
+ fallback={<div>Something went wrong</div>}
1282
+ onError={(error, errorInfo) => {
1283
+ console.error('Error caught by boundary:', error);
1284
+ console.error('Error info:', errorInfo);
1285
+
1286
+ // Send to error reporting service
1287
+ // reportError(error, errorInfo);
1288
+ }}
1289
+ >
1290
+ {children}
1291
+ </ErrorBoundary>
1292
+ );
1293
+ }
1294
+ ```
1295
+
1296
+ ## 🌐 Public Pages Issues
1297
+
1298
+ ### Public Pages Not Working
1299
+
1300
+ **Problem**: Public pages show authentication errors or don't load properly
1301
+
1302
+ **Root Cause**: Public pages are being rendered inside the authentication context
1303
+
1304
+ **Solution**: Public pages MUST be completely separate from your main app
1305
+
1306
+ ```tsx
1307
+ // ❌ WRONG - This will break
1308
+ <UnifiedAuthProvider>
1309
+ <Routes>
1310
+ <Route path="/events/:eventCode" element={<PublicPage />} />
1311
+ </Routes>
1312
+ </UnifiedAuthProvider>
1313
+
1314
+ // ✅ CORRECT - Separate applications
1315
+ <BrowserRouter>
1316
+ <Routes>
1317
+ <Route path="/events/*" element={<PublicPageApp />} />
1318
+ <Route path="/*" element={
1319
+ <UnifiedAuthProvider>
1320
+ <AuthenticatedApp />
1321
+ </UnifiedAuthProvider>
1322
+ } />
1323
+ </Routes>
1324
+ </BrowserRouter>
1325
+ ```
1326
+
1327
+ **Complete Setup:**
1328
+ ```tsx
1329
+ // PublicPageApp.tsx
1330
+ import { PublicPageProvider } from '@jmruthers/pace-core';
1331
+
1332
+ export function PublicPageApp() {
1333
+ return (
1334
+ <PublicPageProvider>
1335
+ <Routes>
1336
+ <Route path="/events/:eventCode" element={<PublicEventPage />} />
1337
+ </Routes>
1338
+ </PublicPageProvider>
1339
+ );
1340
+ }
1341
+ ```
1342
+
1343
+ ### Public Page Hooks Not Working
1344
+
1345
+ **Problem**: `usePublicEvent` or `usePublicRouteParams` return null/undefined
1346
+
1347
+ **Root Cause**: Not using the hooks inside `PublicPageProvider`
1348
+
1349
+ **Solution**: Ensure all public page components are wrapped in `PublicPageProvider`
1350
+
1351
+ ```tsx
1352
+ // ❌ WRONG - Hooks won't work
1353
+ function PublicPage() {
1354
+ const { eventCode } = usePublicRouteParams(); // Returns null
1355
+ // ...
1356
+ }
1357
+
1358
+ // ✅ CORRECT - Hooks work properly
1359
+ <PublicPageProvider>
1360
+ <PublicPage /> {/* Hooks work here */}
1361
+ </PublicPageProvider>
1362
+ ```
1363
+
1364
+ ### Public Page Loading Forever
1365
+
1366
+ **Problem**: Public pages show loading spinner indefinitely
1367
+
1368
+ **Root Cause**: Event data not found or API errors
1369
+
1370
+ **Solution**: Add proper error handling and fallbacks
1371
+
1372
+ ```tsx
1373
+ function PublicEventPage() {
1374
+ const { eventCode } = usePublicRouteParams({ fetchEventData: false });
1375
+ const { event, isLoading, error, refetch } = usePublicEvent(eventCode || '');
1376
+
1377
+ // Handle loading
1378
+ if (isLoading) {
1379
+ return <PublicLoadingSpinner message="Loading event..." />;
1380
+ }
1381
+
1382
+ // Handle error
1383
+ if (error) {
1384
+ return (
1385
+ <div className="min-h-screen bg-white flex items-center justify-center">
1386
+ <div className="text-center">
1387
+ <h1 className="text-2xl font-bold text-gray-900 mb-4">
1388
+ Event Not Found
1389
+ </h1>
1390
+ <p className="text-gray-600 mb-6">
1391
+ The event code "{eventCode}" is invalid or not available for public viewing.
1392
+ </p>
1393
+ <button
1394
+ onClick={refetch}
1395
+ className="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700"
1396
+ >
1397
+ Try Again
1398
+ </button>
1399
+ </div>
1400
+ </div>
1401
+ );
1402
+ }
1403
+
1404
+ // Handle missing event
1405
+ if (!event) {
1406
+ return <div>Event not found</div>;
1407
+ }
1408
+
1409
+ // Render the page
1410
+ return (
1411
+ <PublicPageLayout eventCode={eventCode || ''} event={event}>
1412
+ {/* Your content */}
1413
+ </PublicPageLayout>
1414
+ );
1415
+ }
1416
+ ```
1417
+
1418
+ ### Public Page Styling Issues
1419
+
1420
+ **Problem**: Public pages appear unstyled or broken
1421
+
1422
+ **Root Cause**: Missing CSS import or Tailwind configuration
1423
+
1424
+ **Solution**: Ensure CSS is imported and Tailwind is configured
1425
+
1426
+ ```tsx
1427
+ // Make sure to import CSS
1428
+ import '@jmruthers/pace-core/styles/core.css';
1429
+
1430
+ // And configure Tailwind properly
1431
+ // vite.config.ts
1432
+ import tailwindcss from '@tailwindcss/vite'
1433
+ export default defineConfig({
1434
+ plugins: [
1435
+ react(),
1436
+ tailwindcss({
1437
+ content: [
1438
+ './src/**/*.{js,ts,jsx,tsx}',
1439
+ './node_modules/@jmruthers/pace-core/**/*.{js,ts,jsx,tsx}'
1440
+ ]
1441
+ })
1442
+ ],
1443
+ })
1444
+ ```
1445
+
1446
+ ### Public Page Environment Variables
1447
+
1448
+ **Problem**: Public pages can't access Supabase or environment variables
1449
+
1450
+ **Root Cause**: Missing environment variables or incorrect configuration
1451
+
1452
+ **Solution**: Set up environment variables and pass them to `PublicPageProvider`
1453
+
1454
+ ```tsx
1455
+ // .env.local
1456
+ VITE_SUPABASE_URL=your_supabase_url
1457
+ VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
1458
+ VITE_APP_NAME=Your App Name
1459
+
1460
+ // PublicPageApp.tsx
1461
+ import { PublicPageProvider } from '@jmruthers/pace-core';
1462
+
1463
+ export function PublicPageApp() {
1464
+ return (
1465
+ <PublicPageProvider
1466
+ environment={{
1467
+ supabaseUrl: import.meta.env.VITE_SUPABASE_URL,
1468
+ supabaseKey: import.meta.env.VITE_SUPABASE_ANON_KEY,
1469
+ }}
1470
+ >
1471
+ <Routes>
1472
+ <Route path="/events/:eventCode" element={<PublicEventPage />} />
1473
+ </Routes>
1474
+ </PublicPageProvider>
1475
+ );
1476
+ }
1477
+ ```
1478
+
1479
+ ### Public Page "process is not defined" Error
1480
+
1481
+ **Problem**: `ReferenceError: process is not defined` when using `PublicPageProvider` in Vite-based applications
1482
+
1483
+ **Root Cause**: The component is trying to access Node.js globals (`process`) that aren't available in browser environments
1484
+
1485
+ **Solution**: This has been fixed in pace-core v0.4.61+. The `PublicPageProvider` now safely handles both browser and Node.js environments.
1486
+
1487
+ **If you're still seeing this error:**
1488
+
1489
+ 1. **Update pace-core** to the latest version:
1490
+ ```bash
1491
+ npm update @jmruthers/pace-core
1492
+ ```
1493
+
1494
+ 2. **Verify your Vite configuration** includes environment variable support:
1495
+ ```ts
1496
+ // vite.config.ts
1497
+ export default defineConfig({
1498
+ plugins: [react(), tailwindcss()],
1499
+ envDir: '.', // Look for .env files in root
1500
+ envPrefix: 'VITE_', // Only load VITE_ prefixed variables
1501
+ })
1502
+ ```
1503
+
1504
+ 3. **Set up environment variables** in your `.env` file:
1505
+ ```bash
1506
+ # .env.local
1507
+ VITE_SUPABASE_URL=your_supabase_url
1508
+ VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
1509
+ ```
1510
+
1511
+ 4. **Use the correct environment variable names**:
1512
+ - ✅ `VITE_SUPABASE_URL` (Vite)
1513
+ - ✅ `NEXT_PUBLIC_SUPABASE_URL` (Next.js)
1514
+ - ❌ `SUPABASE_URL` (not prefixed for Vite)
1515
+
1516
+ **The fix ensures:**
1517
+ - ✅ Safe access to `import.meta.env` (Vite/browser)
1518
+ - ✅ Safe access to `process.env` (Node.js/server)
1519
+ - ✅ Proper fallback handling
1520
+ - ✅ No "process is not defined" errors
1521
+
1522
+ ### Public Page Database Access
1523
+
1524
+ **Problem**: Public pages can't access event data from database
1525
+
1526
+ **Root Cause**: Missing RLS policies or incorrect database setup
1527
+
1528
+ **Solution**: Set up proper RLS policies for public access
1529
+
1530
+ ```sql
1531
+ -- Enable RLS on events table
1532
+ ALTER TABLE events ENABLE ROW LEVEL SECURITY;
1533
+
1534
+ -- Create policy for public events
1535
+ CREATE POLICY "Public events are viewable by anyone" ON events
1536
+ FOR SELECT USING (is_public = true);
1537
+
1538
+ -- Or allow specific event codes
1539
+ CREATE POLICY "Specific event codes are public" ON events
1540
+ FOR SELECT USING (event_code IN ('EVENT123', 'EVENT456'));
1541
+ ```
1542
+
1543
+ ## Getting Help
1544
+
1545
+ If you're still experiencing issues:
1546
+
1547
+ 1. **Check the console** for error messages
1548
+ 2. **Verify your configuration** (environment variables, Supabase setup)
1549
+ 3. **Test with minimal setup** to isolate the issue
1550
+ 4. **Check the documentation** for specific component usage
1551
+ 5. **Search existing issues** in the GitHub repository
1552
+ 6. **Create a new issue** with detailed information about your problem
1553
+
1554
+ When reporting an issue, include:
1555
+
1556
+ - **Environment**: Node.js version, package versions
1557
+ - **Steps to reproduce**: Clear steps to recreate the issue
1558
+ - **Expected behavior**: What you expected to happen
1559
+ - **Actual behavior**: What actually happened
1560
+ - **Error messages**: Full error messages from console
1561
+ - **Code example**: Minimal code that reproduces the issue
1562
+
1563
+ For more specific troubleshooting, see the [Debugging Guide](./debugging.md).