@jmruthers/pace-core 0.4.1 → 0.5.3

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 (660) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/README.md +231 -229
  3. package/dist/{DataTable-2LB6HI6V.js → DataTable-ZQDRE46Q.js} +15 -17
  4. package/dist/{DataTable-BDBqkU-i.d.ts → DataTable-ltTFXHS3.d.ts} +25 -51
  5. package/dist/{Table-CIm9IWqk.d.ts → PublicLoadingSpinner-Bq_-BeK-.d.ts} +635 -122
  6. package/dist/{UnifiedAuthProvider-V7y63NjT.d.ts → RBACProvider-BO4ilsQB.d.ts} +11 -36
  7. package/dist/UnifiedAuthProvider-DGQsy-vY.d.ts +103 -0
  8. package/dist/{api-AIJ3IJX3.js → api-H5A3H4IR.js} +6 -4
  9. package/dist/{appConfig-fB1pP_v3.d.ts → appConfig-BVGyuvI7.d.ts} +1 -1
  10. package/dist/appNameResolver-7GHF5ED2.js +22 -0
  11. package/dist/{audit-PD5L5ZSC.js → audit-BUW3LMJB.js} +3 -3
  12. package/dist/chunk-5H3C2SWM.js +3293 -0
  13. package/dist/chunk-5H3C2SWM.js.map +1 -0
  14. package/dist/chunk-5SIXIV7R.js +1925 -0
  15. package/dist/chunk-5SIXIV7R.js.map +1 -0
  16. package/dist/{chunk-YNU5QJ4S.js → chunk-7BNPOCLL.js} +22 -5
  17. package/dist/chunk-7BNPOCLL.js.map +1 -0
  18. package/dist/{chunk-4ZTIEYU2.js → chunk-CDQ3PX7L.js} +1 -1
  19. package/dist/chunk-CDQ3PX7L.js.map +1 -0
  20. package/dist/chunk-GNTALZV3.js +17 -0
  21. package/dist/chunk-GNTALZV3.js.map +1 -0
  22. package/dist/chunk-GWSBHC4J.js +1349 -0
  23. package/dist/chunk-GWSBHC4J.js.map +1 -0
  24. package/dist/{chunk-JUUNUW3O.js → chunk-HD7PYDUV.js} +14 -5
  25. package/dist/chunk-HD7PYDUV.js.map +1 -0
  26. package/dist/{chunk-H4PZ4B3Y.js → chunk-HXX35Q2M.js} +113 -27
  27. package/dist/chunk-HXX35Q2M.js.map +1 -0
  28. package/dist/chunk-K6B7BLSE.js +388 -0
  29. package/dist/chunk-K6B7BLSE.js.map +1 -0
  30. package/dist/chunk-M4RW7PIP.js +5441 -0
  31. package/dist/chunk-M4RW7PIP.js.map +1 -0
  32. package/dist/chunk-MZBUOP4P.js +119 -0
  33. package/dist/chunk-MZBUOP4P.js.map +1 -0
  34. package/dist/chunk-N2EUGZRW.js +98 -0
  35. package/dist/chunk-N2EUGZRW.js.map +1 -0
  36. package/dist/chunk-NQ4TOOO6.js +20 -0
  37. package/dist/chunk-NQ4TOOO6.js.map +1 -0
  38. package/dist/{chunk-DC5AMYBS.js → chunk-PLDDJCW6.js} +15 -5
  39. package/dist/chunk-PLDDJCW6.js.map +1 -0
  40. package/dist/{chunk-IOX76PSM.js → chunk-PVMYVQSM.js} +270 -28
  41. package/dist/chunk-PVMYVQSM.js.map +1 -0
  42. package/dist/{chunk-4MCJAK7J.js → chunk-QKHFMQ5R.js} +2155 -4853
  43. package/dist/chunk-QKHFMQ5R.js.map +1 -0
  44. package/dist/chunk-QVYBYGT2.js +428 -0
  45. package/dist/chunk-QVYBYGT2.js.map +1 -0
  46. package/dist/{chunk-WHLSWC6W.js → chunk-SS3E6QLB.js} +16 -61
  47. package/dist/chunk-SS3E6QLB.js.map +1 -0
  48. package/dist/chunk-WJARTBCT.js +128 -0
  49. package/dist/chunk-WJARTBCT.js.map +1 -0
  50. package/dist/chunk-YDJW5XTN.js +84 -0
  51. package/dist/chunk-YDJW5XTN.js.map +1 -0
  52. package/dist/components.d.ts +907 -10
  53. package/dist/components.js +3237 -204
  54. package/dist/components.js.map +1 -1
  55. package/dist/{database-CAMsquLm.d.ts → database-C3Szpi5J.d.ts} +28 -11
  56. package/dist/hooks.d.ts +7 -6
  57. package/dist/hooks.js +33 -11
  58. package/dist/hooks.js.map +1 -1
  59. package/dist/index.d.ts +247 -111
  60. package/dist/index.js +330 -185
  61. package/dist/index.js.map +1 -1
  62. package/dist/{organisation-DLNNQhPB.d.ts → organisation-CO3Sh3_D.d.ts} +1 -1
  63. package/dist/providers.d.ts +5 -4
  64. package/dist/providers.js +14 -5
  65. package/dist/rbac/index.d.ts +964 -839
  66. package/dist/rbac/index.js +58 -1970
  67. package/dist/rbac/index.js.map +1 -1
  68. package/dist/styles/core.css +364 -0
  69. package/dist/styles/fonts/georama-italic.woff2 +0 -0
  70. package/dist/styles/fonts/georama.woff2 +0 -0
  71. package/dist/styles/fonts/open-sans-italic.woff2 +0 -0
  72. package/dist/styles/fonts/open-sans.woff2 +0 -0
  73. package/dist/styles/fonts/reddit-mono.woff2 +0 -0
  74. package/dist/styles/index.d.ts +36 -0
  75. package/dist/styles/index.js +24 -0
  76. package/dist/styles/index.js.map +1 -0
  77. package/dist/theming/runtime.d.ts +73 -0
  78. package/dist/theming/runtime.js +16 -0
  79. package/dist/theming/runtime.js.map +1 -0
  80. package/dist/{types-Bavn44NW.d.ts → types-BRDU7N6w.d.ts} +79 -33
  81. package/dist/types.d.ts +5 -5
  82. package/dist/types.js +7 -2
  83. package/dist/types.js.map +1 -1
  84. package/dist/{unified-BtRpPbmp.d.ts → unified-CMPjE_fv.d.ts} +0 -1
  85. package/dist/usePublicRouteParams-B2OcAsur.d.ts +477 -0
  86. package/dist/utils.d.ts +83 -60
  87. package/dist/utils.js +293 -55651
  88. package/dist/utils.js.map +1 -1
  89. package/dist/validation.d.ts +1 -1
  90. package/dist/validation.js +1 -1
  91. package/docs/INDEX.md +192 -0
  92. package/docs/README.md +46 -32
  93. package/docs/api/README.md +231 -229
  94. package/docs/api/classes/ErrorBoundary.md +1 -1
  95. package/docs/api/classes/InvalidScopeError.md +73 -0
  96. package/docs/api/classes/MissingUserContextError.md +66 -0
  97. package/docs/api/classes/OrganisationContextRequiredError.md +66 -0
  98. package/docs/api/classes/PermissionDeniedError.md +73 -0
  99. package/docs/api/classes/PublicErrorBoundary.md +132 -0
  100. package/docs/api/classes/RBACAuditManager.md +270 -0
  101. package/docs/api/classes/RBACCache.md +284 -0
  102. package/docs/api/classes/RBACEngine.md +141 -0
  103. package/docs/api/classes/RBACError.md +76 -0
  104. package/docs/api/classes/RBACNotInitializedError.md +66 -0
  105. package/docs/api/classes/SecureSupabaseClient.md +135 -0
  106. package/docs/api/interfaces/AggregateConfig.md +4 -4
  107. package/docs/api/interfaces/ButtonProps.md +2 -2
  108. package/docs/api/interfaces/CardProps.md +2 -2
  109. package/docs/api/interfaces/ColorPalette.md +1 -1
  110. package/docs/api/interfaces/ColorShade.md +1 -1
  111. package/docs/api/interfaces/DataAccessRecord.md +96 -0
  112. package/docs/api/interfaces/DataTableAction.md +98 -7
  113. package/docs/api/interfaces/DataTableColumn.md +131 -12
  114. package/docs/api/interfaces/DataTableProps.md +77 -274
  115. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  116. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  117. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +235 -0
  118. package/docs/api/interfaces/EventContextType.md +7 -7
  119. package/docs/api/interfaces/EventLogoProps.md +152 -0
  120. package/docs/api/interfaces/EventProviderProps.md +2 -2
  121. package/docs/api/interfaces/FileSizeLimits.md +7 -0
  122. package/docs/api/interfaces/FileUploadProps.md +154 -0
  123. package/docs/api/interfaces/FooterProps.md +1 -1
  124. package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
  125. package/docs/api/interfaces/InputProps.md +2 -2
  126. package/docs/api/interfaces/LabelProps.md +1 -1
  127. package/docs/api/interfaces/LoginFormProps.md +1 -1
  128. package/docs/api/interfaces/NavigationAccessRecord.md +107 -0
  129. package/docs/api/interfaces/NavigationContextType.md +164 -0
  130. package/docs/api/interfaces/NavigationGuardProps.md +139 -0
  131. package/docs/api/interfaces/NavigationItem.md +1 -1
  132. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  133. package/docs/api/interfaces/NavigationProviderProps.md +117 -0
  134. package/docs/api/interfaces/Organisation.md +1 -1
  135. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  136. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  137. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  138. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  139. package/docs/api/interfaces/PaceAppLayoutProps.md +26 -26
  140. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  141. package/docs/api/interfaces/PageAccessRecord.md +85 -0
  142. package/docs/api/interfaces/PagePermissionContextType.md +140 -0
  143. package/docs/api/interfaces/PagePermissionGuardProps.md +153 -0
  144. package/docs/api/interfaces/PagePermissionProviderProps.md +119 -0
  145. package/docs/api/interfaces/PaletteData.md +1 -1
  146. package/docs/api/interfaces/PermissionEnforcerProps.md +153 -0
  147. package/docs/api/interfaces/PublicErrorBoundaryProps.md +94 -0
  148. package/docs/api/interfaces/PublicErrorBoundaryState.md +68 -0
  149. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +86 -0
  150. package/docs/api/interfaces/PublicPageFooterProps.md +112 -0
  151. package/docs/api/interfaces/PublicPageHeaderProps.md +138 -0
  152. package/docs/api/interfaces/PublicPageLayoutProps.md +138 -0
  153. package/docs/api/interfaces/RBACConfig.md +99 -0
  154. package/docs/api/interfaces/RBACContextType.md +474 -0
  155. package/docs/api/interfaces/RBACLogger.md +112 -0
  156. package/docs/api/interfaces/RBACProviderProps.md +107 -0
  157. package/docs/api/interfaces/RoleBasedRouterContextType.md +151 -0
  158. package/docs/api/interfaces/RoleBasedRouterProps.md +156 -0
  159. package/docs/api/interfaces/RouteAccessRecord.md +107 -0
  160. package/docs/api/interfaces/RouteConfig.md +121 -0
  161. package/docs/api/interfaces/SecureDataContextType.md +168 -0
  162. package/docs/api/interfaces/SecureDataProviderProps.md +132 -0
  163. package/docs/api/interfaces/StorageConfig.md +41 -0
  164. package/docs/api/interfaces/StorageFileInfo.md +74 -0
  165. package/docs/api/interfaces/StorageFileMetadata.md +140 -0
  166. package/docs/api/interfaces/StorageListOptions.md +86 -0
  167. package/docs/api/interfaces/StorageListResult.md +41 -0
  168. package/docs/api/interfaces/StorageUploadOptions.md +88 -0
  169. package/docs/api/interfaces/StorageUploadResult.md +63 -0
  170. package/docs/api/interfaces/StorageUrlOptions.md +47 -0
  171. package/docs/api/interfaces/StyleImport.md +2 -2
  172. package/docs/api/interfaces/ToastActionElement.md +1 -1
  173. package/docs/api/interfaces/ToastProps.md +1 -1
  174. package/docs/api/interfaces/UnifiedAuthContextType.md +465 -64
  175. package/docs/api/interfaces/UnifiedAuthProviderProps.md +95 -9
  176. package/docs/api/interfaces/UseInactivityTrackerOptions.md +136 -0
  177. package/docs/api/interfaces/UseInactivityTrackerReturn.md +123 -0
  178. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  179. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  180. package/docs/api/interfaces/UsePublicEventOptions.md +34 -0
  181. package/docs/api/interfaces/UsePublicEventReturn.md +68 -0
  182. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +94 -0
  183. package/docs/api/interfaces/UserEventAccess.md +14 -14
  184. package/docs/api/interfaces/UserMenuProps.md +6 -6
  185. package/docs/api/interfaces/UserProfile.md +1 -1
  186. package/docs/api/modules.md +4233 -1134
  187. package/docs/api-reference/components.md +761 -43
  188. package/docs/api-reference/hooks.md +126 -0
  189. package/docs/api-reference/providers.md +141 -65
  190. package/docs/api-reference/types.md +66 -36
  191. package/docs/api-reference/utilities.md +1 -1
  192. package/docs/architecture/README.md +1 -2
  193. package/docs/best-practices/README.md +400 -0
  194. package/docs/consuming-app-example.md +42 -96
  195. package/docs/consuming-app-vite-config.md +233 -0
  196. package/docs/core-concepts/events.md +3 -3
  197. package/docs/core-concepts/organisations.md +0 -1
  198. package/docs/core-concepts/rbac-system.md +23 -10
  199. package/docs/documentation-style-checklist.md +8 -2
  200. package/docs/examples/navigation-menu-auth-fix.md +344 -0
  201. package/docs/getting-started/examples/README.md +15 -1
  202. package/docs/getting-started/examples/basic-auth-app.md +444 -119
  203. package/docs/getting-started/examples/full-featured-app.md +6 -6
  204. package/docs/getting-started/installation.md +231 -52
  205. package/docs/getting-started/quick-start.md +121 -24
  206. package/docs/implementation-guides/app-layout.md +133 -108
  207. package/docs/implementation-guides/data-tables.md +1011 -29
  208. package/docs/implementation-guides/forms.md +3 -3
  209. package/docs/implementation-guides/hierarchical-datatable.md +850 -0
  210. package/docs/implementation-guides/large-datasets.md +2 -2
  211. package/docs/implementation-guides/navigation.md +1 -1
  212. package/docs/implementation-guides/permission-enforcement.md +4 -4
  213. package/docs/implementation-guides/public-pages.md +752 -0
  214. package/docs/migration/README.md +18 -8
  215. package/docs/migration/quick-migration-guide.md +320 -0
  216. package/docs/migration/rbac-migration.md +50 -0
  217. package/docs/migration/v0.4.15-tailwind-scanning.md +272 -0
  218. package/docs/migration/v0.4.16-css-first-approach.md +306 -0
  219. package/docs/migration/v0.4.17-source-path-fix.md +229 -0
  220. package/docs/migration-guide.md +77 -105
  221. package/docs/performance/README.md +1 -4
  222. package/docs/print-components/README.md +258 -0
  223. package/docs/print-components/api-reference.md +636 -0
  224. package/docs/print-components/examples/README.md +204 -0
  225. package/docs/print-components/examples/basic-report.tsx +92 -0
  226. package/docs/print-components/examples/card-catalog.tsx +149 -0
  227. package/docs/print-components/examples/cover-page-report.tsx +163 -0
  228. package/docs/print-components/quick-start.md +363 -0
  229. package/docs/quick-reference.md +53 -36
  230. package/docs/rbac/README.md +136 -69
  231. package/docs/rbac/api-reference.md +39 -8
  232. package/docs/rbac/examples.md +237 -66
  233. package/docs/rbac/getting-started.md +131 -16
  234. package/docs/rbac/quick-start.md +499 -323
  235. package/docs/rbac/troubleshooting.md +240 -262
  236. package/docs/security/README.md +50 -1
  237. package/docs/styles/README.md +226 -111
  238. package/docs/testing/README.md +6 -10
  239. package/docs/troubleshooting/README.md +497 -0
  240. package/docs/troubleshooting/common-issues.md +604 -14
  241. package/docs/troubleshooting/styling-issues.md +219 -0
  242. package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
  243. package/docs/usage.md +54 -91
  244. package/docs/visual-testing.md +0 -7
  245. package/package.json +47 -25
  246. package/src/__mocks__/lucide-react.ts +181 -0
  247. package/src/__tests__/REBUILD_PLAN.md +223 -0
  248. package/src/__tests__/TESTING_GUIDELINES.md +341 -0
  249. package/src/__tests__/fixtures/mocks.ts +93 -0
  250. package/src/__tests__/helpers/component-test-utils.tsx +145 -0
  251. package/src/__tests__/helpers/test-utils.tsx +117 -0
  252. package/src/__tests__/integration/UserProfile.test.tsx +128 -0
  253. package/src/__tests__/setup.ts +71 -0
  254. package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
  255. package/src/__tests__/templates/component.test.template.tsx +144 -0
  256. package/src/__tests__/templates/hook.test.template.ts +173 -0
  257. package/src/__tests__/templates/integration.test.template.tsx +199 -0
  258. package/src/__tests__/types/test.types.ts +106 -0
  259. package/src/components/Alert/Alert.test.tsx +496 -0
  260. package/src/components/Alert/Alert.tsx +134 -0
  261. package/src/components/Alert/index.ts +2 -0
  262. package/src/components/Avatar/Avatar.test.tsx +484 -0
  263. package/src/components/Avatar/Avatar.tsx +84 -0
  264. package/src/components/Avatar/index.ts +2 -0
  265. package/src/components/Button/Button.test.tsx +662 -0
  266. package/src/components/Button/Button.tsx +270 -0
  267. package/src/components/Button/index.ts +2 -0
  268. package/src/components/Card/Card.test.tsx +593 -0
  269. package/src/components/Card/Card.tsx +271 -0
  270. package/src/components/Card/index.ts +1 -0
  271. package/src/components/Checkbox/Checkbox.test.tsx +461 -0
  272. package/src/components/Checkbox/Checkbox.tsx +75 -0
  273. package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
  274. package/src/components/Checkbox/index.ts +2 -0
  275. package/src/components/DataTable/DataTable.tsx +446 -0
  276. package/src/components/DataTable/__tests__/README.md +145 -0
  277. package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
  278. package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
  279. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +381 -0
  280. package/src/components/DataTable/__tests__/test-utils.ts +94 -0
  281. package/src/components/DataTable/components/AccessDeniedPage.tsx +168 -0
  282. package/src/components/DataTable/components/ActionButtons.tsx +194 -0
  283. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +160 -0
  284. package/src/components/DataTable/components/ColumnFilter.tsx +114 -0
  285. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +100 -0
  286. package/src/components/DataTable/components/DataTableBody.tsx +461 -0
  287. package/src/components/DataTable/components/DataTableCore.tsx +1027 -0
  288. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
  289. package/src/components/DataTable/components/DataTableModals.tsx +87 -0
  290. package/src/components/DataTable/components/DataTableToolbar.tsx +262 -0
  291. package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
  292. package/src/components/DataTable/components/EditableRow.tsx +159 -0
  293. package/src/components/DataTable/components/EmptyState.tsx +64 -0
  294. package/src/components/DataTable/components/ExpandButton.tsx +113 -0
  295. package/src/components/DataTable/components/FilterRow.tsx +100 -0
  296. package/src/components/DataTable/components/GroupHeader.tsx +42 -0
  297. package/src/components/DataTable/components/GroupingDropdown.tsx +96 -0
  298. package/src/components/DataTable/components/ImportModal.tsx +345 -0
  299. package/src/components/DataTable/components/LoadingState.tsx +12 -0
  300. package/src/components/DataTable/components/PaginationControls.tsx +332 -0
  301. package/src/components/DataTable/components/UnifiedTableBody.tsx +742 -0
  302. package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
  303. package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
  304. package/src/components/DataTable/components/index.ts +16 -0
  305. package/src/components/DataTable/context/DataTableContext.tsx +97 -0
  306. package/src/components/DataTable/core/ActionManager.ts +235 -0
  307. package/src/components/DataTable/core/ColumnFactory.ts +268 -0
  308. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  309. package/src/components/DataTable/core/DataManager.ts +188 -0
  310. package/src/components/DataTable/core/DataTableContext.tsx +181 -0
  311. package/src/components/DataTable/core/LocalDataAdapter.ts +264 -0
  312. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  313. package/src/components/DataTable/core/StateManager.ts +311 -0
  314. package/src/components/DataTable/core/index.ts +8 -0
  315. package/src/components/DataTable/core/interfaces.ts +338 -0
  316. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +419 -0
  317. package/src/components/DataTable/examples/HierarchicalExample.tsx +475 -0
  318. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +176 -0
  319. package/src/components/DataTable/examples/PerformanceExample.tsx +505 -0
  320. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +95 -0
  321. package/src/components/DataTable/hooks/useColumnReordering.ts +110 -0
  322. package/src/components/DataTable/hooks/useDataTableState.ts +325 -0
  323. package/src/components/DataTable/hooks/useHierarchicalState.ts +174 -0
  324. package/src/components/DataTable/index.ts +68 -0
  325. package/src/components/DataTable/styles.ts +171 -0
  326. package/src/components/DataTable/types.ts +511 -0
  327. package/src/components/DataTable/utils/debugTools.ts +583 -0
  328. package/src/components/DataTable/utils/errorHandling.ts +494 -0
  329. package/src/components/DataTable/utils/exportUtils.ts +126 -0
  330. package/src/components/DataTable/utils/flexibleImport.ts +510 -0
  331. package/src/components/DataTable/utils/hierarchicalSorting.ts +151 -0
  332. package/src/components/DataTable/utils/hierarchicalUtils.ts +218 -0
  333. package/src/components/DataTable/utils/index.ts +1 -0
  334. package/src/components/DataTable/utils/performanceUtils.ts +351 -0
  335. package/src/components/Dialog/Dialog.test.tsx +1139 -0
  336. package/src/components/Dialog/Dialog.tsx +782 -0
  337. package/src/components/Dialog/README.md +804 -0
  338. package/src/components/Dialog/examples/BasicHtmlTest.tsx +55 -0
  339. package/src/components/Dialog/examples/DebugHtmlExample.tsx +68 -0
  340. package/src/components/Dialog/examples/HtmlDialogExample.tsx +202 -0
  341. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +61 -0
  342. package/src/components/Dialog/examples/SmartDialogExample.tsx +322 -0
  343. package/src/components/Dialog/index.ts +12 -0
  344. package/src/components/Dialog/utils/safeHtml.ts +185 -0
  345. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +752 -0
  346. package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
  347. package/src/components/ErrorBoundary/index.ts +8 -0
  348. package/src/components/EventSelector/EventSelector.tsx +360 -0
  349. package/src/components/EventSelector/index.ts +3 -0
  350. package/src/components/EventSelector/types.ts +79 -0
  351. package/src/components/FileUpload/FileUpload.example.tsx +218 -0
  352. package/src/components/FileUpload/FileUpload.test.tsx +665 -0
  353. package/src/components/FileUpload/FileUpload.tsx +237 -0
  354. package/src/components/FileUpload/index.ts +6 -0
  355. package/src/components/Footer/Footer.test.tsx +482 -0
  356. package/src/components/Footer/Footer.tsx +197 -0
  357. package/src/components/Footer/index.ts +17 -0
  358. package/src/components/Form/Form.test.tsx +1158 -0
  359. package/src/components/Form/Form.tsx +166 -0
  360. package/src/components/Form/FormErrorSummary.tsx +113 -0
  361. package/src/components/Form/FormField.tsx +249 -0
  362. package/src/components/Form/FormFieldset.tsx +127 -0
  363. package/src/components/Form/FormLiveRegion.tsx +198 -0
  364. package/src/components/Form/index.ts +26 -0
  365. package/src/components/Header/Header.test.tsx +582 -0
  366. package/src/components/Header/Header.tsx +301 -0
  367. package/src/components/Header/index.ts +4 -0
  368. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +489 -0
  369. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
  370. package/src/components/InactivityWarningModal/index.ts +9 -0
  371. package/src/components/Input/Input.test.tsx +466 -0
  372. package/src/components/Input/Input.tsx +201 -0
  373. package/src/components/Input/__mocks__/Input.tsx +2 -0
  374. package/src/components/Input/index.ts +9 -0
  375. package/src/components/Label/Label.tsx +186 -0
  376. package/src/components/Label/index.ts +2 -0
  377. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +450 -0
  378. package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
  379. package/src/components/LoadingSpinner/index.ts +3 -0
  380. package/src/components/LoginForm/LoginForm.test.tsx +816 -0
  381. package/src/components/LoginForm/LoginForm.tsx +273 -0
  382. package/src/components/LoginForm/index.ts +3 -0
  383. package/src/components/NavigationMenu/NavigationMenu.test.tsx +883 -0
  384. package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
  385. package/src/components/NavigationMenu/index.ts +10 -0
  386. package/src/components/NavigationMenu/types.ts +85 -0
  387. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +748 -0
  388. package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
  389. package/src/components/OrganisationSelector/index.ts +9 -0
  390. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +891 -0
  391. package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
  392. package/src/components/PaceAppLayout/README.md +278 -0
  393. package/src/components/PaceAppLayout/index.ts +1 -0
  394. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +475 -0
  395. package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
  396. package/src/components/PaceLoginPage/index.ts +1 -0
  397. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +621 -0
  398. package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
  399. package/src/components/PasswordReset/PasswordResetForm.test.tsx +605 -0
  400. package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
  401. package/src/components/PasswordReset/index.ts +4 -0
  402. package/src/components/PrintButton/PrintButton.tsx +321 -0
  403. package/src/components/PrintButton/PrintButtonGroup.tsx +84 -0
  404. package/src/components/PrintButton/PrintToolbar.tsx +94 -0
  405. package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +438 -0
  406. package/src/components/PrintButton/index.ts +33 -0
  407. package/src/components/PrintButton/types.ts +173 -0
  408. package/src/components/PrintCard/PrintCard.tsx +154 -0
  409. package/src/components/PrintCard/PrintCardContent.tsx +57 -0
  410. package/src/components/PrintCard/PrintCardFooter.tsx +60 -0
  411. package/src/components/PrintCard/PrintCardGrid.tsx +91 -0
  412. package/src/components/PrintCard/PrintCardHeader.tsx +78 -0
  413. package/src/components/PrintCard/PrintCardImage.tsx +81 -0
  414. package/src/components/PrintCard/examples/PrintCardShowcase.tsx +239 -0
  415. package/src/components/PrintCard/index.ts +34 -0
  416. package/src/components/PrintCard/types.ts +171 -0
  417. package/src/components/PrintDataTable/PrintDataTable.tsx +215 -0
  418. package/src/components/PrintDataTable/PrintTableGroup.tsx +90 -0
  419. package/src/components/PrintDataTable/PrintTableRow.tsx +76 -0
  420. package/src/components/PrintDataTable/index.ts +25 -0
  421. package/src/components/PrintDataTable/types.ts +67 -0
  422. package/src/components/PrintFooter/PrintFooter.tsx +183 -0
  423. package/src/components/PrintFooter/PrintFooterContent.tsx +71 -0
  424. package/src/components/PrintFooter/PrintFooterInfo.tsx +86 -0
  425. package/src/components/PrintFooter/PrintPageNumber.tsx +90 -0
  426. package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +390 -0
  427. package/src/components/PrintFooter/index.ts +30 -0
  428. package/src/components/PrintFooter/types.ts +149 -0
  429. package/src/components/PrintGrid/PrintGrid.tsx +180 -0
  430. package/src/components/PrintGrid/PrintGridBreakpoint.tsx +109 -0
  431. package/src/components/PrintGrid/PrintGridContainer.tsx +128 -0
  432. package/src/components/PrintGrid/PrintGridItem.tsx +220 -0
  433. package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +359 -0
  434. package/src/components/PrintGrid/index.ts +31 -0
  435. package/src/components/PrintGrid/types.ts +159 -0
  436. package/src/components/PrintHeader/PrintCoverHeader.tsx +230 -0
  437. package/src/components/PrintHeader/PrintHeader.tsx +150 -0
  438. package/src/components/PrintHeader/index.ts +17 -0
  439. package/src/components/PrintHeader/types.ts +42 -0
  440. package/src/components/PrintLayout/PrintLayout.tsx +122 -0
  441. package/src/components/PrintLayout/PrintLayoutContext.tsx +66 -0
  442. package/src/components/PrintLayout/PrintPageBreak.tsx +52 -0
  443. package/src/components/PrintLayout/examples/PrintShowcase.tsx +230 -0
  444. package/src/components/PrintLayout/index.ts +19 -0
  445. package/src/components/PrintLayout/types.ts +37 -0
  446. package/src/components/PrintPageBreak/PrintPageBreak.tsx +120 -0
  447. package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +90 -0
  448. package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +112 -0
  449. package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +279 -0
  450. package/src/components/PrintPageBreak/index.ts +23 -0
  451. package/src/components/PrintPageBreak/types.ts +94 -0
  452. package/src/components/PrintSection/PrintColumn.tsx +104 -0
  453. package/src/components/PrintSection/PrintDivider.tsx +101 -0
  454. package/src/components/PrintSection/PrintSection.tsx +129 -0
  455. package/src/components/PrintSection/PrintSectionContent.tsx +75 -0
  456. package/src/components/PrintSection/PrintSectionHeader.tsx +97 -0
  457. package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +258 -0
  458. package/src/components/PrintSection/index.ts +33 -0
  459. package/src/components/PrintSection/types.ts +155 -0
  460. package/src/components/PrintText/PrintText.tsx +116 -0
  461. package/src/components/PrintText/index.ts +16 -0
  462. package/src/components/PrintText/types.ts +24 -0
  463. package/src/components/Progress/Progress.tsx +116 -0
  464. package/src/components/Progress/index.ts +3 -0
  465. package/src/components/PublicLayout/EventLogo.tsx +287 -0
  466. package/src/components/PublicLayout/PublicErrorBoundary.tsx +279 -0
  467. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +208 -0
  468. package/src/components/PublicLayout/PublicPageContextChecker.tsx +130 -0
  469. package/src/components/PublicLayout/PublicPageDebugger.tsx +104 -0
  470. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +162 -0
  471. package/src/components/PublicLayout/PublicPageFooter.tsx +124 -0
  472. package/src/components/PublicLayout/PublicPageHeader.tsx +178 -0
  473. package/src/components/PublicLayout/PublicPageLayout.tsx +232 -0
  474. package/src/components/PublicLayout/PublicPageProvider.tsx +137 -0
  475. package/src/components/PublicLayout/index.ts +51 -0
  476. package/src/components/Select/Select.test.tsx +948 -0
  477. package/src/components/Select/Select.tsx +660 -0
  478. package/src/components/Select/index.ts +1 -0
  479. package/src/components/SuperAdminGuard.tsx +116 -0
  480. package/src/components/Table/Table.tsx +222 -0
  481. package/src/components/Table/index.ts +11 -0
  482. package/src/components/Toast/Toast.test.tsx +586 -0
  483. package/src/components/Toast/Toast.tsx +339 -0
  484. package/src/components/Toast/index.ts +14 -0
  485. package/src/components/Tooltip/Tooltip.test.tsx +852 -0
  486. package/src/components/Tooltip/Tooltip.tsx +167 -0
  487. package/src/components/Tooltip/index.ts +7 -0
  488. package/src/components/UserMenu/UserMenu.test.tsx +702 -0
  489. package/src/components/UserMenu/UserMenu.tsx +243 -0
  490. package/src/components/UserMenu/index.ts +3 -0
  491. package/src/components/examples/PermissionExample.tsx +150 -0
  492. package/src/components/index.ts +434 -0
  493. package/src/components.ts +19 -0
  494. package/src/constants/performance.ts +14 -0
  495. package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
  496. package/src/examples/PublicEventPage.tsx +274 -0
  497. package/src/examples/PublicPageApp.tsx +308 -0
  498. package/src/examples/PublicPageUsageExample.tsx +216 -0
  499. package/src/hooks/index.ts +56 -0
  500. package/src/hooks/public/index.ts +34 -0
  501. package/src/hooks/public/usePublicEvent.ts +261 -0
  502. package/src/hooks/public/usePublicEventLogo.ts +285 -0
  503. package/src/hooks/public/usePublicRouteParams.ts +259 -0
  504. package/src/hooks/useAppConfig.ts +94 -0
  505. package/src/hooks/useComponentPerformance.ts +39 -0
  506. package/src/hooks/useCounter.test.ts +135 -0
  507. package/src/hooks/useDataTablePerformance.ts +387 -0
  508. package/src/hooks/useDataTableState.ts +110 -0
  509. package/src/hooks/useDebounce.test.ts +375 -0
  510. package/src/hooks/useDebounce.ts +18 -0
  511. package/src/hooks/useFocusManagement.ts +161 -0
  512. package/src/hooks/useFocusTrap.ts +155 -0
  513. package/src/hooks/useInactivityTracker.ts +372 -0
  514. package/src/hooks/useIsMobile.ts +42 -0
  515. package/src/hooks/useKeyboardShortcuts.ts +237 -0
  516. package/src/hooks/useOrganisationPermissions.test.ts +528 -0
  517. package/src/hooks/useOrganisationPermissions.ts +208 -0
  518. package/src/hooks/useOrganisationSecurity.test.ts +734 -0
  519. package/src/hooks/useOrganisationSecurity.ts +262 -0
  520. package/src/hooks/usePerformanceMonitor.ts +128 -0
  521. package/src/hooks/usePermissionCache.test.ts +542 -0
  522. package/src/hooks/usePermissionCache.ts +455 -0
  523. package/src/hooks/useSecureDataAccess.ts +586 -0
  524. package/src/hooks/useStorage.ts +274 -0
  525. package/src/hooks/useToast.ts +242 -0
  526. package/src/hooks/useZodForm.ts +28 -0
  527. package/src/index.ts +199 -0
  528. package/src/providers/AuthProvider.tsx +369 -0
  529. package/src/providers/EventProvider.tsx +324 -0
  530. package/src/providers/InactivityProvider.tsx +238 -0
  531. package/src/providers/OrganisationProvider.tsx +588 -0
  532. package/src/providers/UnifiedAuthProvider.tsx +327 -0
  533. package/src/providers/index.ts +17 -0
  534. package/src/rbac/README.md +885 -0
  535. package/src/rbac/__tests__/integration.test.tsx +218 -0
  536. package/src/rbac/adapters.tsx +726 -0
  537. package/src/rbac/api.test.ts +441 -0
  538. package/src/rbac/api.ts +339 -0
  539. package/src/rbac/audit-enhanced.ts +339 -0
  540. package/src/rbac/audit.ts +338 -0
  541. package/src/rbac/cache.ts +215 -0
  542. package/src/rbac/components/EnhancedNavigationMenu.tsx +294 -0
  543. package/src/rbac/components/NavigationGuard.tsx +294 -0
  544. package/src/rbac/components/NavigationProvider.tsx +314 -0
  545. package/src/rbac/components/PagePermissionGuard.tsx +430 -0
  546. package/src/rbac/components/PagePermissionProvider.tsx +274 -0
  547. package/src/rbac/components/PermissionEnforcer.tsx +307 -0
  548. package/src/rbac/components/RoleBasedRouter.tsx +425 -0
  549. package/src/rbac/components/SecureDataProvider.tsx +319 -0
  550. package/src/rbac/components/index.ts +64 -0
  551. package/src/rbac/config.ts +133 -0
  552. package/src/rbac/docs/event-based-apps.md +285 -0
  553. package/src/rbac/engine.ts +1026 -0
  554. package/src/rbac/eslint-rules.js +285 -0
  555. package/src/rbac/examples/CompleteRBACExample.tsx +323 -0
  556. package/src/rbac/examples/EventBasedApp.tsx +238 -0
  557. package/src/rbac/hooks/index.ts +21 -0
  558. package/src/rbac/hooks/useCan.test.ts +461 -0
  559. package/src/rbac/hooks/usePermissions.test.ts +359 -0
  560. package/src/rbac/hooks/usePermissions.ts +567 -0
  561. package/src/rbac/hooks/useRBAC.simple.test.ts +90 -0
  562. package/src/rbac/hooks/useRBAC.test.ts +503 -0
  563. package/src/rbac/hooks/useRBAC.ts +262 -0
  564. package/src/rbac/index.ts +109 -0
  565. package/src/rbac/permissions.ts +293 -0
  566. package/src/rbac/providers/RBACProvider.tsx +634 -0
  567. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +687 -0
  568. package/src/rbac/providers/index.ts +11 -0
  569. package/src/rbac/secureClient.ts +244 -0
  570. package/src/rbac/security.ts +346 -0
  571. package/src/rbac/testing/index.tsx +340 -0
  572. package/src/rbac/types.ts +343 -0
  573. package/src/rbac/utils/eventContext.ts +83 -0
  574. package/src/styles/core.css +364 -0
  575. package/src/styles/index.ts +51 -0
  576. package/src/theming/runtime.ts +187 -0
  577. package/src/types/database.ts +472 -0
  578. package/src/types/guards.ts +30 -0
  579. package/src/types/index.ts +25 -0
  580. package/src/types/organisation.ts +184 -0
  581. package/src/types/security.ts +70 -0
  582. package/src/types/supabase.ts +166 -0
  583. package/src/types/theme.ts +6 -0
  584. package/src/types/unified.ts +262 -0
  585. package/src/types/validation.ts +164 -0
  586. package/src/types/vitest-globals.d.ts +43 -0
  587. package/src/utils/__mocks__/supabaseMock.ts +75 -0
  588. package/src/utils/__mocks__/supabaseMock.tsx +198 -0
  589. package/src/utils/appConfig.ts +47 -0
  590. package/src/utils/appIdResolver.ts +130 -0
  591. package/src/utils/appNameResolver.ts +190 -0
  592. package/src/utils/audit.ts +127 -0
  593. package/src/utils/auth-utils.ts +96 -0
  594. package/src/utils/bundleAnalysis.ts +129 -0
  595. package/src/utils/cn.ts +7 -0
  596. package/src/utils/debugLogger.ts +46 -0
  597. package/src/utils/deviceFingerprint.ts +215 -0
  598. package/src/utils/dynamicUtils.ts +105 -0
  599. package/src/utils/formatDate.test.ts +241 -0
  600. package/src/utils/formatting.ts +77 -0
  601. package/src/utils/index.ts +145 -0
  602. package/src/utils/lazyLoad.tsx +44 -0
  603. package/src/utils/organisationContext.ts +135 -0
  604. package/src/utils/performanceBenchmark.ts +64 -0
  605. package/src/utils/performanceBudgets.ts +111 -0
  606. package/src/utils/permissionTypes.ts +37 -0
  607. package/src/utils/permissionUtils.ts +31 -0
  608. package/src/utils/print/PrintDataProcessor.ts +390 -0
  609. package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +397 -0
  610. package/src/utils/print/index.ts +29 -0
  611. package/src/utils/print/types.ts +196 -0
  612. package/src/utils/print/usePrintOptimization.ts +272 -0
  613. package/src/utils/sanitization.ts +264 -0
  614. package/src/utils/schemaUtils.ts +37 -0
  615. package/src/utils/secureDataAccess.ts +361 -0
  616. package/src/utils/secureErrors.ts +79 -0
  617. package/src/utils/secureStorage.ts +244 -0
  618. package/src/utils/security.ts +156 -0
  619. package/src/utils/securityMonitor.ts +45 -0
  620. package/src/utils/sessionTracking.ts +170 -0
  621. package/src/utils/storage/README.md +348 -0
  622. package/src/utils/storage/config.ts +100 -0
  623. package/src/utils/storage/helpers.ts +359 -0
  624. package/src/utils/storage/index.ts +36 -0
  625. package/src/utils/storage/types.ts +90 -0
  626. package/src/utils/validation.ts +111 -0
  627. package/src/utils/validationUtils.ts +120 -0
  628. package/src/validation/common.ts +53 -0
  629. package/src/validation/csrf.ts +214 -0
  630. package/src/validation/index.ts +43 -0
  631. package/src/validation/passwordSchema.ts +125 -0
  632. package/src/validation/sanitization.ts +96 -0
  633. package/src/validation/schemaUtils.ts +42 -0
  634. package/src/validation/sqlInjectionProtection.ts +242 -0
  635. package/src/validation/user.ts +34 -0
  636. package/dist/chunk-4MCJAK7J.js.map +0 -1
  637. package/dist/chunk-4ZTIEYU2.js.map +0 -1
  638. package/dist/chunk-H4PZ4B3Y.js.map +0 -1
  639. package/dist/chunk-IOX76PSM.js.map +0 -1
  640. package/dist/chunk-JUUNUW3O.js.map +0 -1
  641. package/dist/chunk-KK6WIDK6.js +0 -63
  642. package/dist/chunk-KK6WIDK6.js.map +0 -1
  643. package/dist/chunk-U7DY5T33.js +0 -11
  644. package/dist/chunk-U7DY5T33.js.map +0 -1
  645. package/dist/chunk-WHLSWC6W.js.map +0 -1
  646. package/dist/chunk-XI7QFSSC.js +0 -790
  647. package/dist/chunk-XI7QFSSC.js.map +0 -1
  648. package/dist/chunk-XIJMMBDD.js +0 -73
  649. package/dist/chunk-XIJMMBDD.js.map +0 -1
  650. package/dist/chunk-YNU5QJ4S.js.map +0 -1
  651. package/dist/chunk-YWYCNGWH.js +0 -2070
  652. package/dist/chunk-YWYCNGWH.js.map +0 -1
  653. package/dist/chunk-ZJ3UKPIW.js +0 -952
  654. package/dist/chunk-ZJ3UKPIW.js.map +0 -1
  655. package/dist/useAppConfig-CZNJJsT_.d.ts +0 -148
  656. package/dist/{DataTable-2LB6HI6V.js.map → DataTable-ZQDRE46Q.js.map} +0 -0
  657. package/dist/{api-AIJ3IJX3.js.map → api-H5A3H4IR.js.map} +0 -0
  658. package/dist/{audit-PD5L5ZSC.js.map → appNameResolver-7GHF5ED2.js.map} +0 -0
  659. package/dist/{chunk-DC5AMYBS.js.map → audit-BUW3LMJB.js.map} +0 -0
  660. package/dist/{validation-D2-NNCCE.d.ts → validation-PM_iOaTI.d.ts} +6 -6
@@ -2,6 +2,125 @@
2
2
 
3
3
  This guide provides solutions to the most common issues you may encounter when using `@jmruthers/pace-core`.
4
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
+
5
124
  ## Authentication Issues
6
125
 
7
126
  ### 1. "User not authenticated" Error
@@ -244,7 +363,148 @@ function OrganisationContextGuard({ children }: { children: React.ReactNode }) {
244
363
 
245
364
  ## Styling Issues
246
365
 
247
- ### 1. App Looks Different from Demo (v0.3.47+ Fixed)
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)
248
508
 
249
509
  **Problem**: Your consuming app looks different from the PACE Core demo app
250
510
 
@@ -279,13 +539,13 @@ npm install @jmruthers/pace-core@latest
279
539
 
280
540
  **Root Cause**: Missing CSS variables that the header component depends on:
281
541
  - `--app-width` (for container width)
282
- - `--color-app-main-*` (for header background colors)
283
- - `--color-app-sec-*` and `--color-app-acc-*` (for other header elements)
542
+ - `--color-main-*` (for header background colors)
543
+ - `--color-sec-*` and `--color-acc-*` (for other header elements)
284
544
 
285
545
  **Solution**: This issue was fixed in v0.3.48+. The theme file now includes all required CSS variables:
286
546
 
287
547
  - **Layout Variables**: `--app-width: 90rem`
288
- - **App Color Variables**: `--color-app-main-*`, `--color-app-sec-*`, `--color-app-acc-*`
548
+ - **App Color Variables**: `--color-main-*`, `--color-sec-*`, `--color-acc-*`
289
549
  - **Complete Color Palette**: All color variants (50, 100, 200, etc.) plus `-raw` variants
290
550
 
291
551
  **Quick Fix**:
@@ -322,9 +582,92 @@ npm install @jmruthers/pace-core@latest
322
582
  npm install @jmruthers/pace-core@latest
323
583
  ```
324
584
 
325
- ### 4. Tailwind v4 Theme File Issues (v0.3.45+ Fixed)
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)
326
669
 
327
- **Problem**: Build failures when using `@import '@jmruthers/pace-core/styles/tailwind-v4-theme'`
670
+ **Problem**: Build failures when using `@import '@jmruthers/pace-core/styles/core.css'`
328
671
 
329
672
  **Root Cause**: The theme file was missing semantic colors and had circular references in component classes.
330
673
 
@@ -342,7 +685,7 @@ npm install @jmruthers/pace-core@latest
342
685
  **Usage**:
343
686
  ```css
344
687
  /* index.css */
345
- @import '@jmruthers/pace-core/styles/tailwind-v4-theme';
688
+ @import '@jmruthers/pace-core/styles/core.css';
346
689
  ```
347
690
 
348
691
  **Vite Configuration**:
@@ -384,7 +727,7 @@ export default defineConfig({
384
727
  ```css
385
728
  /* ✅ Fixed - no circular references */
386
729
  .pace-button-primary {
387
- @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-white hover:bg-primary-700 active:bg-primary-800;
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;
388
731
  }
389
732
  ```
390
733
 
@@ -593,16 +936,16 @@ function App() {
593
936
 
594
937
  ```typescript
595
938
  // Ensure Tailwind CSS is imported
596
- import '@jmruthers/pace-core/styles.css';
597
-
598
- // Check if theme provider is set up
599
- import { ThemeProvider } from '@jmruthers/pace-core';
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';
600
942
 
943
+ // Check if your app is properly set up
601
944
  function App() {
602
945
  return (
603
- <ThemeProvider>
946
+ <div>
604
947
  <YourApp />
605
- </ThemeProvider>
948
+ </div>
606
949
  );
607
950
  }
608
951
  ```
@@ -950,6 +1293,253 @@ function LoggingErrorBoundary({ children }) {
950
1293
  }
951
1294
  ```
952
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
+
953
1543
  ## Getting Help
954
1544
 
955
1545
  If you're still experiencing issues: