@jmruthers/pace-core 0.5.181 → 0.5.183

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 (756) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +16 -2
  3. package/dist/{AuthService-DYuQPJj6.d.ts → AuthService-B-cd2MA4.d.ts} +9 -11
  4. package/dist/{DataTable-CWAZZcXC.d.ts → DataTable-Bz8ffqyA.d.ts} +1 -1
  5. package/dist/{DataTable-UA6CL4JI.js → DataTable-QAB34V6K.js} +14 -15
  6. package/dist/UnifiedAuthProvider-7F6T4B6K.js +13 -0
  7. package/dist/{UnifiedAuthProvider-DJxGTftH.d.ts → UnifiedAuthProvider-F86d7dSi.d.ts} +5 -6
  8. package/dist/{api-45XYYO2A.js → api-ROMBCNKU.js} +5 -5
  9. package/dist/{audit-64X3VJXB.js → audit-WRS3KJKI.js} +4 -4
  10. package/dist/auth-BZOJqrdd.d.ts +49 -0
  11. package/dist/{chunk-CX5M4ZAG.js → chunk-5DRSZLL2.js} +1 -1
  12. package/dist/chunk-5DRSZLL2.js.map +1 -0
  13. package/dist/{chunk-BESYRHQM.js → chunk-6C4YBBJM.js} +10 -7
  14. package/dist/chunk-6C4YBBJM.js.map +1 -0
  15. package/dist/{chunk-PLDDJCW6.js → chunk-7D4SUZUM.js} +2 -13
  16. package/dist/{chunk-HRO5HWN2.js → chunk-CSOFYHAG.js} +55 -162
  17. package/dist/chunk-CSOFYHAG.js.map +1 -0
  18. package/dist/{chunk-ANBQRTPX.js → chunk-E66EQZE6.js} +3 -5
  19. package/dist/{chunk-ANBQRTPX.js.map → chunk-E66EQZE6.js.map} +1 -1
  20. package/dist/{chunk-Q5QRDWKI.js → chunk-F2IMUDXZ.js} +4 -6
  21. package/dist/chunk-F2IMUDXZ.js.map +1 -0
  22. package/dist/{chunk-SBVILCCA.js → chunk-FSFQFJCU.js} +28 -6
  23. package/dist/chunk-FSFQFJCU.js.map +1 -0
  24. package/dist/chunk-FUEYYMX5.js +2296 -0
  25. package/dist/chunk-FUEYYMX5.js.map +1 -0
  26. package/dist/{chunk-FFKNH6U5.js → chunk-HKIT6O7W.js} +3 -5
  27. package/dist/{chunk-FFKNH6U5.js.map → chunk-HKIT6O7W.js.map} +1 -1
  28. package/dist/chunk-KQCRWDSA.js +1 -0
  29. package/dist/{chunk-S5OFRT4M.js → chunk-KUEN3HFB.js} +6 -6
  30. package/dist/chunk-KUEN3HFB.js.map +1 -0
  31. package/dist/chunk-LMC26NLJ.js +84 -0
  32. package/dist/chunk-LMC26NLJ.js.map +1 -0
  33. package/dist/{chunk-BVYWGZVV.js → chunk-M7W4CP3M.js} +52 -19
  34. package/dist/chunk-M7W4CP3M.js.map +1 -0
  35. package/dist/{chunk-HZLDFOE4.js → chunk-MI7HBHN3.js} +164 -243
  36. package/dist/chunk-MI7HBHN3.js.map +1 -0
  37. package/dist/{chunk-PPMP5J6T.js → chunk-PWAHJW4G.js} +180 -29
  38. package/dist/chunk-PWAHJW4G.js.map +1 -0
  39. package/dist/chunk-PWLANIRT.js +127 -0
  40. package/dist/{chunk-XDNLUEXI.js.map → chunk-PWLANIRT.js.map} +1 -1
  41. package/dist/chunk-QCDXODCA.js +75 -0
  42. package/dist/chunk-QCDXODCA.js.map +1 -0
  43. package/dist/{chunk-D7LCGMVS.js → chunk-QETLRQI6.js} +526 -887
  44. package/dist/chunk-QETLRQI6.js.map +1 -0
  45. package/dist/{chunk-5MT24GKJ.js → chunk-QUVSNGIP.js} +264 -262
  46. package/dist/chunk-QUVSNGIP.js.map +1 -0
  47. package/dist/chunk-QXHPKYJV.js +113 -0
  48. package/dist/chunk-QXHPKYJV.js.map +1 -0
  49. package/dist/{chunk-OWAG3GSU.js → chunk-R77UEZ4E.js} +11 -1
  50. package/dist/chunk-R77UEZ4E.js.map +1 -0
  51. package/dist/{chunk-ZYTYSTO5.js → chunk-RA3JUFMW.js} +314 -161
  52. package/dist/chunk-RA3JUFMW.js.map +1 -0
  53. package/dist/{chunk-ERISIBYU.js → chunk-SQGMNID3.js} +3 -8
  54. package/dist/chunk-SQGMNID3.js.map +1 -0
  55. package/dist/{chunk-XJ2HZOBU.js → chunk-UHNYIBXL.js} +1 -1
  56. package/dist/chunk-UHNYIBXL.js.map +1 -0
  57. package/{src/utils/secureStorage.ts → dist/chunk-VBXEHIUJ.js} +113 -88
  58. package/dist/{chunk-7QCC6MCP.js.map → chunk-VBXEHIUJ.js.map} +1 -1
  59. package/dist/{chunk-VZ4VDGTB.js → chunk-W22JP75J.js} +5 -13
  60. package/dist/{chunk-VZ4VDGTB.js.map → chunk-W22JP75J.js.map} +1 -1
  61. package/dist/components.d.ts +12 -93
  62. package/dist/components.js +23 -106
  63. package/dist/components.js.map +1 -1
  64. package/dist/core-CUElvH_C.d.ts +164 -0
  65. package/dist/database.generated-CBmg2950.d.ts +8284 -0
  66. package/dist/event-CW5YB_2p.d.ts +239 -0
  67. package/dist/{file-reference-C6Gkn77H.d.ts → file-reference-D06mEEWW.d.ts} +7 -5
  68. package/dist/functions-D_kgHktt.d.ts +208 -0
  69. package/dist/hooks.d.ts +54 -7
  70. package/dist/hooks.js +204 -17
  71. package/dist/hooks.js.map +1 -1
  72. package/dist/{EventLogo-B3V3otev.d.ts → index-Bl--n7-T.d.ts} +387 -397
  73. package/dist/index.d.ts +94 -261
  74. package/dist/index.js +314 -126
  75. package/dist/index.js.map +1 -1
  76. package/dist/providers.d.ts +7 -8
  77. package/dist/providers.js +6 -13
  78. package/dist/rbac/index.d.ts +171 -101
  79. package/dist/rbac/index.js +23 -17
  80. package/dist/styles/index.d.ts +1 -3
  81. package/dist/styles/index.js +2 -17
  82. package/dist/theming/runtime.js +3 -3
  83. package/dist/types-UU913iLA.d.ts +102 -0
  84. package/dist/{types-Dfz9dmVH.d.ts → types-_x1f4QBF.d.ts} +6 -6
  85. package/dist/types.d.ts +88 -227
  86. package/dist/types.js +64 -112
  87. package/dist/types.js.map +1 -1
  88. package/dist/{usePublicRouteParams-B7PabvuH.d.ts → usePublicRouteParams-JJczomYq.d.ts} +203 -6
  89. package/dist/utils.d.ts +299 -13
  90. package/dist/utils.js +481 -55
  91. package/dist/utils.js.map +1 -1
  92. package/dist/validation-643vUDZW.d.ts +177 -0
  93. package/docs/DOCUMENTATION_REVIEW_TRACKER.md +511 -0
  94. package/docs/README.md +9 -8
  95. package/docs/api/README.md +16 -2
  96. package/docs/api/classes/ColumnFactory.md +1 -1
  97. package/docs/api/classes/ErrorBoundary.md +1 -1
  98. package/docs/api/classes/InvalidScopeError.md +4 -4
  99. package/docs/api/classes/MissingUserContextError.md +4 -4
  100. package/docs/api/classes/OrganisationContextRequiredError.md +4 -4
  101. package/docs/api/classes/PermissionDeniedError.md +4 -4
  102. package/docs/api/classes/RBACAuditManager.md +14 -14
  103. package/docs/api/classes/RBACCache.md +1 -1
  104. package/docs/api/classes/RBACEngine.md +2 -2
  105. package/docs/api/classes/RBACError.md +4 -4
  106. package/docs/api/classes/RBACNotInitializedError.md +4 -4
  107. package/docs/api/classes/SecureSupabaseClient.md +29 -9
  108. package/docs/api/classes/StorageUtils.md +1 -1
  109. package/docs/api/enums/FileCategory.md +17 -17
  110. package/docs/api/enums/RBACErrorCode.md +228 -0
  111. package/docs/api/enums/RPCFunction.md +118 -0
  112. package/docs/api/interfaces/AggregateConfig.md +1 -1
  113. package/docs/api/interfaces/BadgeProps.md +1 -1
  114. package/docs/api/interfaces/ButtonProps.md +2 -2
  115. package/docs/api/interfaces/CalendarProps.md +1 -1
  116. package/docs/api/interfaces/CardProps.md +29 -3
  117. package/docs/api/interfaces/ColorPalette.md +1 -1
  118. package/docs/api/interfaces/ColorShade.md +1 -1
  119. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  120. package/docs/api/interfaces/DataRecord.md +1 -1
  121. package/docs/api/interfaces/DataTableAction.md +2 -2
  122. package/docs/api/interfaces/DataTableColumn.md +6 -6
  123. package/docs/api/interfaces/DataTableProps.md +1 -1
  124. package/docs/api/interfaces/DataTableToolbarButton.md +2 -2
  125. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  126. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  127. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  128. package/docs/api/interfaces/ExportColumn.md +5 -5
  129. package/docs/api/interfaces/ExportOptions.md +4 -4
  130. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  131. package/docs/api/interfaces/FileMetadata.md +13 -13
  132. package/docs/api/interfaces/FileReference.md +12 -12
  133. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  134. package/docs/api/interfaces/FileUploadOptions.md +10 -10
  135. package/docs/api/interfaces/FileUploadProps.md +19 -19
  136. package/docs/api/interfaces/FooterProps.md +1 -1
  137. package/docs/api/interfaces/FormFieldProps.md +166 -0
  138. package/docs/api/interfaces/FormProps.md +113 -0
  139. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  140. package/docs/api/interfaces/InactivityWarningModalProps.md +8 -8
  141. package/docs/api/interfaces/InputProps.md +2 -2
  142. package/docs/api/interfaces/LabelProps.md +8 -8
  143. package/docs/api/interfaces/LoginFormProps.md +1 -1
  144. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  145. package/docs/api/interfaces/NavigationContextType.md +1 -1
  146. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  147. package/docs/api/interfaces/NavigationItem.md +17 -73
  148. package/docs/api/interfaces/NavigationMenuProps.md +38 -53
  149. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  150. package/docs/api/interfaces/Organisation.md +13 -13
  151. package/docs/api/interfaces/OrganisationContextType.md +21 -21
  152. package/docs/api/interfaces/OrganisationMembership.md +15 -15
  153. package/docs/api/interfaces/OrganisationProviderProps.md +59 -2
  154. package/docs/api/interfaces/OrganisationSecurityError.md +5 -5
  155. package/docs/api/interfaces/PaceAppLayoutProps.md +26 -39
  156. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  157. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  158. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  159. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  160. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  161. package/docs/api/interfaces/PaletteData.md +1 -1
  162. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  163. package/docs/api/interfaces/ProgressProps.md +50 -0
  164. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  165. package/docs/api/interfaces/PublicPageFooterProps.md +9 -9
  166. package/docs/api/interfaces/PublicPageHeaderProps.md +10 -10
  167. package/docs/api/interfaces/PublicPageLayoutProps.md +15 -15
  168. package/docs/api/interfaces/RBACAccessValidateParams.md +52 -0
  169. package/docs/api/interfaces/RBACAccessValidateResult.md +41 -0
  170. package/docs/api/interfaces/RBACAuditLogParams.md +85 -0
  171. package/docs/api/interfaces/RBACAuditLogResult.md +52 -0
  172. package/docs/api/interfaces/RBACConfig.md +2 -2
  173. package/docs/api/interfaces/RBACContext.md +52 -0
  174. package/docs/api/interfaces/RBACLogger.md +1 -1
  175. package/docs/api/interfaces/RBACPageAccessCheckParams.md +74 -0
  176. package/docs/api/interfaces/RBACPermissionCheckParams.md +74 -0
  177. package/docs/api/interfaces/RBACPermissionCheckResult.md +52 -0
  178. package/docs/api/interfaces/RBACPermissionsGetParams.md +63 -0
  179. package/docs/api/interfaces/RBACPermissionsGetResult.md +63 -0
  180. package/docs/api/interfaces/RBACResult.md +58 -0
  181. package/docs/api/interfaces/RBACRoleGrantParams.md +63 -0
  182. package/docs/api/interfaces/RBACRoleGrantResult.md +52 -0
  183. package/docs/api/interfaces/RBACRoleRevokeParams.md +63 -0
  184. package/docs/api/interfaces/RBACRoleRevokeResult.md +52 -0
  185. package/docs/api/interfaces/RBACRoleValidateParams.md +52 -0
  186. package/docs/api/interfaces/RBACRoleValidateResult.md +63 -0
  187. package/docs/api/interfaces/RBACRolesListParams.md +52 -0
  188. package/docs/api/interfaces/RBACRolesListResult.md +74 -0
  189. package/docs/api/interfaces/RBACSessionTrackParams.md +74 -0
  190. package/docs/api/interfaces/RBACSessionTrackResult.md +52 -0
  191. package/docs/api/interfaces/ResourcePermissions.md +1 -1
  192. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  193. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  194. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  195. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  196. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  197. package/docs/api/interfaces/RouteConfig.md +1 -1
  198. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  199. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  200. package/docs/api/interfaces/SessionRestorationLoaderProps.md +15 -2
  201. package/docs/api/interfaces/StorageConfig.md +1 -1
  202. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  203. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  204. package/docs/api/interfaces/StorageListOptions.md +1 -1
  205. package/docs/api/interfaces/StorageListResult.md +1 -1
  206. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  207. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  208. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  209. package/docs/api/interfaces/StyleImport.md +1 -1
  210. package/docs/api/interfaces/SwitchProps.md +1 -1
  211. package/docs/api/interfaces/TabsContentProps.md +1 -1
  212. package/docs/api/interfaces/TabsListProps.md +1 -1
  213. package/docs/api/interfaces/TabsProps.md +1 -1
  214. package/docs/api/interfaces/TabsTriggerProps.md +43 -2
  215. package/docs/api/interfaces/TextareaProps.md +2 -2
  216. package/docs/api/interfaces/ToastActionElement.md +1 -1
  217. package/docs/api/interfaces/ToastProps.md +1 -1
  218. package/docs/api/interfaces/UnifiedAuthContextType.md +61 -61
  219. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  220. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  221. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  222. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  223. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  224. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  225. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  226. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +2 -2
  227. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  228. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  229. package/docs/api/interfaces/UseResolvedScopeOptions.md +2 -2
  230. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  231. package/docs/api/interfaces/UseResourcePermissionsOptions.md +1 -1
  232. package/docs/api/interfaces/UserEventAccess.md +1 -1
  233. package/docs/api/interfaces/UserMenuProps.md +4 -4
  234. package/docs/api/interfaces/UserProfile.md +7 -7
  235. package/docs/api/modules.md +484 -462
  236. package/docs/api-reference/components.md +186 -15
  237. package/docs/api-reference/deprecated.md +376 -0
  238. package/docs/api-reference/hooks.md +149 -19
  239. package/docs/api-reference/providers.md +61 -6
  240. package/docs/api-reference/rpc-functions.md +397 -0
  241. package/docs/api-reference/types.md +135 -78
  242. package/docs/api-reference/utilities.md +51 -380
  243. package/docs/architecture/README.md +49 -3
  244. package/docs/architecture/database-schema-requirements.md +40 -3
  245. package/docs/architecture/rbac-security-architecture.md +41 -4
  246. package/docs/architecture/services.md +127 -42
  247. package/docs/best-practices/README.md +51 -5
  248. package/docs/best-practices/accessibility.md +32 -3
  249. package/docs/best-practices/common-patterns.md +50 -3
  250. package/docs/best-practices/deployment.md +50 -4
  251. package/docs/best-practices/performance.md +50 -3
  252. package/docs/best-practices/security.md +94 -41
  253. package/docs/best-practices/testing.md +33 -4
  254. package/docs/core-concepts/authentication.md +5 -5
  255. package/docs/core-concepts/events.md +3 -3
  256. package/docs/core-concepts/organisations.md +3 -3
  257. package/docs/core-concepts/permissions.md +3 -3
  258. package/docs/core-concepts/rbac-system.md +5 -5
  259. package/docs/documentation-index.md +30 -8
  260. package/docs/getting-started/documentation-index.md +1 -1
  261. package/docs/getting-started/examples/README.md +7 -5
  262. package/docs/getting-started/examples/basic-auth-app.md +3 -0
  263. package/docs/getting-started/examples/full-featured-app.md +5 -3
  264. package/docs/getting-started/faq.md +6 -6
  265. package/docs/getting-started/installation-guide.md +192 -13
  266. package/docs/getting-started/local-development.md +303 -0
  267. package/docs/getting-started/quick-reference.md +3 -3
  268. package/docs/getting-started/quick-start.md +517 -0
  269. package/docs/implementation-guides/app-layout.md +45 -3
  270. package/docs/implementation-guides/authentication.md +66 -7
  271. package/docs/implementation-guides/component-styling.md +53 -3
  272. package/docs/implementation-guides/data-tables.md +76 -7
  273. package/docs/implementation-guides/datatable-filtering.md +1 -2
  274. package/docs/implementation-guides/datatable-rbac-usage.md +0 -1
  275. package/docs/implementation-guides/dynamic-colors.md +155 -4
  276. package/docs/implementation-guides/file-reference-system.md +72 -3
  277. package/docs/implementation-guides/file-upload-storage.md +72 -3
  278. package/docs/implementation-guides/forms.md +53 -3
  279. package/docs/implementation-guides/inactivity-tracking.md +53 -3
  280. package/docs/implementation-guides/large-datasets.md +1 -1
  281. package/docs/implementation-guides/navigation.md +55 -5
  282. package/docs/implementation-guides/organisation-security.md +72 -3
  283. package/docs/implementation-guides/performance.md +57 -1
  284. package/docs/implementation-guides/permission-enforcement.md +81 -8
  285. package/docs/implementation-guides/public-pages.md +560 -14
  286. package/docs/migration/MIGRATION_GUIDE.md +409 -50
  287. package/docs/migration/README.md +37 -3
  288. package/docs/migration/organisation-context-timing-fix.md +39 -4
  289. package/docs/migration/quick-migration-guide.md +41 -5
  290. package/docs/migration/rbac-migration.md +59 -3
  291. package/docs/migration/service-architecture.md +77 -14
  292. package/docs/rbac/README.md +79 -3
  293. package/docs/rbac/advanced-patterns.md +47 -3
  294. package/docs/rbac/api-reference.md +77 -8
  295. package/docs/rbac/event-based-apps.md +50 -5
  296. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  297. package/docs/rbac/examples.md +39 -3
  298. package/docs/rbac/getting-started.md +63 -4
  299. package/docs/rbac/quick-start.md +57 -5
  300. package/docs/rbac/rbac-rls-integration.md +68 -6
  301. package/docs/rbac/super-admin-guide.md +47 -3
  302. package/docs/rbac/troubleshooting.md +3 -3
  303. package/docs/security/README.md +68 -3
  304. package/docs/security/checklist.md +50 -3
  305. package/docs/standards/01-architecture-standard.md +39 -0
  306. package/docs/standards/02-api-and-rpc-standard.md +39 -0
  307. package/docs/standards/03-component-standard.md +32 -0
  308. package/docs/standards/04-code-style-standard.md +32 -0
  309. package/docs/standards/05-security-standard.md +30 -0
  310. package/docs/standards/06-testing-and-docs-standard.md +29 -0
  311. package/docs/standards/README.md +35 -0
  312. package/docs/styles/README.md +89 -8
  313. package/docs/testing/README.md +175 -24
  314. package/docs/troubleshooting/README.md +50 -3
  315. package/docs/troubleshooting/common-issues.md +271 -5
  316. package/docs/troubleshooting/debugging.md +54 -1
  317. package/docs/troubleshooting/migration.md +54 -1
  318. package/docs/troubleshooting/organisation-context-setup.md +29 -3
  319. package/docs/troubleshooting/styling-issues.md +246 -4
  320. package/{src/components/DataTable/examples → examples/DataTable}/GroupingAggregationExample.tsx +1 -1
  321. package/examples/{components 2/DataTable/HierarchicalActionsExample.tsx → DataTable/HierarchicalActionsExample.tsx} +7 -6
  322. package/{src/components/DataTable/examples → examples/DataTable}/HierarchicalExample.tsx +8 -6
  323. package/examples/{components 2/DataTable/PerformanceExample.tsx → DataTable/PerformanceExample.tsx} +2 -2
  324. package/examples/{components 2/DataTable/index.ts → DataTable/index.ts} +1 -0
  325. package/{src/components/Dialog/examples → examples/Dialog}/HtmlDialogExample.tsx +3 -3
  326. package/examples/{components 2/Dialog/ScrollableDialogExample.tsx → Dialog/ScrollableDialogExample.tsx} +1 -1
  327. package/{src/components/Dialog/examples → examples/Dialog}/SmartDialogExample.tsx +1 -1
  328. package/examples/{components 2/Dialog/index.ts → Dialog/index.ts} +0 -3
  329. package/examples/{features/public-pages → PublicPages}/CorrectPublicPageImplementation.tsx +52 -17
  330. package/examples/{features/public-pages → PublicPages}/PublicEventPage.tsx +65 -35
  331. package/examples/{features/public-pages → PublicPages}/PublicPageApp.tsx +52 -18
  332. package/examples/{features/public-pages → PublicPages}/PublicPageUsageExample.tsx +28 -15
  333. package/examples/README.md +81 -33
  334. package/examples/index.ts +14 -12
  335. package/examples/{RBAC → rbac}/CompleteRBACExample.tsx +1 -1
  336. package/examples/{features/rbac → rbac}/EventBasedApp.tsx +4 -4
  337. package/examples/{features/rbac → rbac}/PermissionExample.tsx +5 -3
  338. package/package.json +21 -27
  339. package/src/__tests__/helpers/test-utils.tsx +29 -3
  340. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +7 -5
  341. package/src/components/Alert/Alert.test.tsx +2 -2
  342. package/src/components/Alert/Alert.tsx +4 -4
  343. package/src/components/Avatar/Avatar.test.tsx +17 -6
  344. package/src/components/Badge/Badge.test.tsx +1 -1
  345. package/src/components/Badge/Badge.tsx +2 -2
  346. package/src/components/Button/Button.test.tsx +2 -2
  347. package/src/components/Button/Button.tsx +11 -7
  348. package/src/components/Calendar/Calendar.test.tsx +41 -8
  349. package/src/components/Calendar/Calendar.tsx +39 -36
  350. package/src/components/Card/Card.tsx +51 -13
  351. package/src/components/Checkbox/Checkbox.test.tsx +36 -12
  352. package/src/components/DataTable/DataTable.test.tsx +1 -1
  353. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +13 -7
  354. package/src/components/DataTable/__tests__/DataTable.default-state.test.tsx +14 -42
  355. package/src/components/DataTable/__tests__/DataTable.export.test.tsx +13 -10
  356. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +14 -11
  357. package/src/components/DataTable/__tests__/DataTable.hooks.test.tsx +4 -2
  358. package/src/components/DataTable/__tests__/DataTable.test.tsx +13 -7
  359. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +13 -10
  360. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +15 -11
  361. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +12 -6
  362. package/src/components/DataTable/__tests__/keyboard.test.tsx +12 -6
  363. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +10 -6
  364. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +1 -1
  365. package/src/components/DataTable/components/DataTableBody.tsx +10 -25
  366. package/src/components/DataTable/components/DataTableCore.tsx +1 -1
  367. package/src/components/DataTable/components/FilterRow.tsx +3 -1
  368. package/src/components/DataTable/components/ImportModal.tsx +1 -1
  369. package/src/components/DataTable/components/VirtualizedDataTable.tsx +9 -9
  370. package/src/components/DataTable/core/ColumnFactory.ts +6 -6
  371. package/src/components/DataTable/core/DataTableContext.tsx +14 -10
  372. package/src/components/DataTable/core/LocalDataAdapter.ts +2 -1
  373. package/src/components/DataTable/core/PluginRegistry.ts +3 -3
  374. package/src/components/DataTable/core/StateManager.ts +12 -11
  375. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +104 -0
  376. package/src/components/DataTable/core/__tests__/DataManager.test.ts +101 -0
  377. package/src/components/DataTable/core/__tests__/LocalDataAdapter.test.ts +84 -0
  378. package/src/components/DataTable/core/__tests__/PluginRegistry.test.ts +102 -0
  379. package/src/components/DataTable/core/__tests__/StateManager.test.ts +104 -0
  380. package/src/components/DataTable/core/interfaces.ts +17 -17
  381. package/src/components/DataTable/hooks/__tests__/useDataTableConfiguration.test.ts +124 -0
  382. package/src/components/DataTable/hooks/__tests__/useDataTableDataPipeline.test.ts +117 -0
  383. package/src/components/DataTable/hooks/__tests__/useDataTablePermissions.test.ts +102 -0
  384. package/src/components/DataTable/hooks/__tests__/useEffectiveColumnOrder.test.ts +53 -0
  385. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +0 -2
  386. package/src/components/DataTable/hooks/useDataTablePermissions.ts +9 -8
  387. package/src/components/DataTable/types.ts +5 -5
  388. package/src/components/DataTable/utils/aggregationUtils.ts +4 -4
  389. package/src/components/DataTable/utils/columnUtils.ts +3 -2
  390. package/src/components/DataTable/utils/debugTools.ts +1 -1
  391. package/src/components/DataTable/utils/exportUtils.ts +6 -6
  392. package/src/components/DataTable/utils/hierarchicalSorting.ts +6 -6
  393. package/src/components/DataTable/utils/hierarchicalUtils.ts +0 -8
  394. package/src/components/DataTable/utils/index.ts +0 -1
  395. package/src/components/DataTable/utils/performanceUtils.ts +9 -4
  396. package/src/components/Dialog/Dialog.test.tsx +49 -27
  397. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +13 -8
  398. package/src/components/EventSelector/EventSelector.test.tsx +60 -12
  399. package/src/components/EventSelector/EventSelector.tsx +38 -15
  400. package/src/components/EventSelector/index.ts +2 -2
  401. package/src/components/FileDisplay/FileDisplay.test.tsx +143 -85
  402. package/src/components/FileDisplay/FileDisplay.tsx +1 -0
  403. package/src/components/FileUpload/FileUpload.test.tsx +532 -152
  404. package/src/components/FileUpload/FileUpload.tsx +43 -8
  405. package/src/components/Footer/Footer.test.tsx +19 -14
  406. package/src/components/Form/Form.test.tsx +96 -14
  407. package/src/components/Form/Form.tsx +210 -1
  408. package/src/components/Form/index.ts +3 -7
  409. package/src/components/Header/Header.test.tsx +24 -17
  410. package/src/components/Header/Header.tsx +3 -1
  411. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +2 -4
  412. package/src/components/Input/Input.test.tsx +61 -36
  413. package/src/components/Label/{__tests__/Label.test.tsx → Label.test.tsx} +2 -2
  414. package/src/components/Label/Label.tsx +2 -3
  415. package/src/components/LoadingSpinner/LoadingSpinner.test.tsx +6 -5
  416. package/src/components/LoadingSpinner/LoadingSpinner.tsx +6 -2
  417. package/src/components/LoginForm/LoginForm.test.tsx +14 -13
  418. package/src/components/LoginForm/LoginForm.tsx +1 -1
  419. package/src/components/LoginForm/index.ts +7 -0
  420. package/src/components/NavigationMenu/NavigationMenu.test.tsx +233 -20
  421. package/src/components/NavigationMenu/NavigationMenu.tsx +191 -55
  422. package/src/components/NavigationMenu/index.ts +1 -1
  423. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +20 -11
  424. package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
  425. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.integration.test.tsx → PaceAppLayout.integration.test.tsx} +272 -79
  426. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.performance.test.tsx → PaceAppLayout.performance.test.tsx} +155 -32
  427. package/src/components/PaceAppLayout/{__tests__/PaceAppLayout.security.test.tsx → PaceAppLayout.security.test.tsx} +211 -65
  428. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +498 -210
  429. package/src/components/PaceAppLayout/PaceAppLayout.tsx +63 -64
  430. package/src/components/PaceAppLayout/test-setup.tsx +192 -0
  431. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +193 -39
  432. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.test.tsx +2 -2
  433. package/src/components/{PasswordReset → PasswordChange}/PasswordChangeForm.tsx +10 -4
  434. package/src/components/PasswordChange/index.ts +2 -0
  435. package/src/components/Progress/Progress.test.tsx +11 -0
  436. package/src/components/Progress/Progress.tsx +1 -1
  437. package/src/components/Progress/index.ts +10 -0
  438. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +2 -1
  439. package/src/components/PublicLayout/PublicLayout.test.tsx +1210 -0
  440. package/src/components/PublicLayout/PublicPageLayout.tsx +190 -36
  441. package/src/components/PublicLayout/PublicPageProvider.tsx +8 -7
  442. package/src/components/PublicLayout/index.ts +10 -28
  443. package/src/components/Select/Select.test.tsx +7 -7
  444. package/src/components/Select/Select.tsx +277 -11
  445. package/src/components/Select/index.ts +1 -2
  446. package/src/components/SessionRestorationLoader/SessionRestorationLoader.test.tsx +232 -0
  447. package/src/components/SessionRestorationLoader/SessionRestorationLoader.tsx +40 -19
  448. package/src/components/Table/{__tests__/Table.test.tsx → Table.test.tsx} +94 -41
  449. package/src/components/Tabs/Tabs.test.tsx +10 -9
  450. package/src/components/Tabs/Tabs.tsx +61 -33
  451. package/src/components/Textarea/Textarea.test.tsx +31 -18
  452. package/src/components/Toast/Toast.tsx +2 -2
  453. package/src/components/Tooltip/Tooltip.test.tsx +1 -1
  454. package/src/components/UserMenu/UserMenu.test.tsx +7 -6
  455. package/src/components/UserMenu/UserMenu.tsx +2 -2
  456. package/src/components/index.ts +5 -4
  457. package/src/constants/performance.ts +19 -8
  458. package/src/hooks/__tests__/useAppConfig.unit.test.ts +21 -22
  459. package/src/hooks/__tests__/useEvents.unit.test.ts +5 -4
  460. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
  461. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -0
  462. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +16 -11
  463. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +1 -3
  464. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +1 -3
  465. package/src/hooks/__tests__/useRBAC.unit.test.ts +24 -2
  466. package/src/hooks/index.ts +4 -0
  467. package/src/hooks/public/index.ts +2 -0
  468. package/src/hooks/public/usePublicEvent.ts +4 -6
  469. package/src/hooks/public/usePublicEventLogo.test.ts +147 -0
  470. package/src/hooks/public/usePublicRouteParams.ts +1 -1
  471. package/src/hooks/services/useAuth.ts +2 -4
  472. package/src/hooks/services/useCurrentEvent.ts +1 -1
  473. package/src/hooks/useAppConfig.ts +1 -1
  474. package/src/hooks/useDataTablePerformance.ts +2 -2
  475. package/src/hooks/useEventTheme.ts +1 -1
  476. package/src/hooks/useEvents.ts +51 -10
  477. package/src/hooks/useOrganisationPermissions.test.ts +3 -3
  478. package/src/hooks/useOrganisationPermissions.ts +1 -1
  479. package/src/hooks/useOrganisationSecurity.ts +2 -2
  480. package/src/hooks/usePermissionCache.test.ts +9 -9
  481. package/src/hooks/usePermissionCache.ts +2 -2
  482. package/src/index.ts +19 -12
  483. package/src/providers/OrganisationProvider.tsx +73 -9
  484. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
  485. package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
  486. package/src/providers/__tests__/EventProvider.test.tsx +24 -15
  487. package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
  488. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
  489. package/src/providers/index.ts +0 -3
  490. package/src/providers/services/AuthServiceProvider.tsx +2 -17
  491. package/src/providers/services/EventServiceProvider.tsx +11 -16
  492. package/src/providers/services/InactivityServiceProvider.tsx +9 -12
  493. package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
  494. package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
  495. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
  496. package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
  497. package/src/rbac/adapters.tsx +1 -1
  498. package/src/rbac/api.ts +20 -4
  499. package/src/rbac/audit-enhanced.ts +47 -2
  500. package/src/rbac/audit.ts +47 -2
  501. package/src/rbac/components/NavigationGuard.tsx +1 -1
  502. package/src/rbac/components/NavigationProvider.test.tsx +7 -6
  503. package/src/rbac/components/NavigationProvider.tsx +1 -1
  504. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  505. package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
  506. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  507. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  508. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  509. package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
  510. package/src/rbac/components/SecureDataProvider.tsx +1 -1
  511. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
  512. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
  513. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
  514. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
  515. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
  516. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
  517. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
  518. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
  519. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
  520. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
  521. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
  522. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
  523. package/src/rbac/hooks/index.ts +3 -0
  524. package/src/rbac/hooks/usePermissions.ts +31 -85
  525. package/src/rbac/hooks/useRBAC.test.ts +13 -1
  526. package/src/rbac/hooks/useRBAC.ts +13 -67
  527. package/src/rbac/hooks/useResolvedScope.ts +11 -0
  528. package/src/rbac/hooks/useSecureSupabase.ts +308 -0
  529. package/src/rbac/index.ts +3 -0
  530. package/src/rbac/secureClient.ts +53 -6
  531. package/src/rbac/security.ts +37 -1
  532. package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
  533. package/src/rbac/types.ts +3 -2
  534. package/src/services/AuthService.ts +33 -25
  535. package/src/services/EventService.ts +56 -44
  536. package/src/services/InactivityService.ts +33 -53
  537. package/src/services/OrganisationService.ts +36 -40
  538. package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
  539. package/src/services/__tests__/EventService.test.ts +67 -33
  540. package/src/services/interfaces/IEventService.ts +1 -1
  541. package/src/styles/core.css +2 -2
  542. package/src/styles/index.test.ts +21 -0
  543. package/src/styles/index.ts +1 -5
  544. package/src/types/__tests__/guards.test.ts +1 -1
  545. package/src/types/__tests__/organisation.roles.test.ts +55 -0
  546. package/src/types/__tests__/type-validation.test.ts +0 -1
  547. package/src/types/auth.ts +42 -2
  548. package/src/types/core.ts +251 -0
  549. package/src/types/database.ts +11 -496
  550. package/src/types/event.ts +102 -0
  551. package/src/types/file-reference.ts +6 -4
  552. package/src/types/guards.ts +2 -1
  553. package/src/types/index.ts +48 -14
  554. package/src/types/lodash.debounce.d.ts +15 -0
  555. package/src/types/organisation.ts +14 -10
  556. package/src/types/supabase.ts +15 -17
  557. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
  558. package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
  559. package/src/utils/app/appNameResolver.ts +1 -1
  560. package/src/utils/audit/audit.test.ts +65 -0
  561. package/src/utils/device/deviceFingerprint.test.ts +171 -0
  562. package/src/utils/dynamic/dynamicUtils.ts +3 -2
  563. package/src/utils/file-reference/index.ts +25 -6
  564. package/src/utils/security/secureErrors.ts +1 -1
  565. package/src/utils/validation/__tests__/validationUtils.test.ts +72 -0
  566. package/src/utils/validation/index.ts +6 -12
  567. package/src/utils/validation/validationUtils.ts +0 -13
  568. package/dist/UnifiedAuthProvider-B37ATQHE.js +0 -16
  569. package/dist/auth-DReDSLq9.d.ts +0 -16
  570. package/dist/chunk-3JI76CYK.js +0 -2444
  571. package/dist/chunk-3JI76CYK.js.map +0 -1
  572. package/dist/chunk-56XJ3TU6.js +0 -11
  573. package/dist/chunk-56XJ3TU6.js.map +0 -1
  574. package/dist/chunk-5MT24GKJ.js.map +0 -1
  575. package/dist/chunk-7QCC6MCP.js +0 -288
  576. package/dist/chunk-BESYRHQM.js.map +0 -1
  577. package/dist/chunk-BJPBT3CU.js +0 -21
  578. package/dist/chunk-BJPBT3CU.js.map +0 -1
  579. package/dist/chunk-BVYWGZVV.js.map +0 -1
  580. package/dist/chunk-CX5M4ZAG.js.map +0 -1
  581. package/dist/chunk-D7LCGMVS.js.map +0 -1
  582. package/dist/chunk-EGI6MUL6.js +0 -27
  583. package/dist/chunk-EGI6MUL6.js.map +0 -1
  584. package/dist/chunk-ERISIBYU.js.map +0 -1
  585. package/dist/chunk-HRO5HWN2.js.map +0 -1
  586. package/dist/chunk-HZLDFOE4.js.map +0 -1
  587. package/dist/chunk-JISYG63F.js +0 -70
  588. package/dist/chunk-JISYG63F.js.map +0 -1
  589. package/dist/chunk-LIMSTKYD.js +0 -61
  590. package/dist/chunk-LIMSTKYD.js.map +0 -1
  591. package/dist/chunk-OWAG3GSU.js.map +0 -1
  592. package/dist/chunk-PPMP5J6T.js.map +0 -1
  593. package/dist/chunk-Q5QRDWKI.js.map +0 -1
  594. package/dist/chunk-S5OFRT4M.js.map +0 -1
  595. package/dist/chunk-SBVILCCA.js.map +0 -1
  596. package/dist/chunk-TUMEWN34.js +0 -15
  597. package/dist/chunk-TUMEWN34.js.map +0 -1
  598. package/dist/chunk-XDNLUEXI.js +0 -138
  599. package/dist/chunk-XJ2HZOBU.js.map +0 -1
  600. package/dist/chunk-ZYTYSTO5.js.map +0 -1
  601. package/dist/chunk-ZZ2SS7NI.js +0 -237
  602. package/dist/chunk-ZZ2SS7NI.js.map +0 -1
  603. package/dist/database-C6jy7EOu.d.ts +0 -500
  604. package/dist/organisation-D6qRDtbF.d.ts +0 -93
  605. package/dist/schema-DTDZQe2u.d.ts +0 -28
  606. package/dist/unified-DQ4VcT7H.d.ts +0 -198
  607. package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
  608. package/dist/validation.d.ts +0 -47
  609. package/dist/validation.js +0 -24
  610. package/dist/validation.js.map +0 -1
  611. package/docs/DOCUMENTATION_AUDIT.md +0 -172
  612. package/docs/DOCUMENTATION_STANDARD.md +0 -137
  613. package/docs/api/classes/PublicErrorBoundary.md +0 -132
  614. package/docs/api/interfaces/EventLogoProps.md +0 -152
  615. package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
  616. package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
  617. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
  618. package/docs/architecture/rpc-function-standards.md +0 -1106
  619. package/docs/getting-started/consuming-app-vite-config.md +0 -239
  620. package/docs/implementation-guides/event-theming-summary.md +0 -226
  621. package/docs/implementation-guides/public-pages-advanced.md +0 -1038
  622. package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
  623. package/docs/migration/v0.4.16-css-first-approach.md +0 -312
  624. package/docs/migration/v0.4.17-source-path-fix.md +0 -235
  625. package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
  626. package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
  627. package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
  628. package/docs/rbac/README-rbac-rls-integration.md +0 -374
  629. package/docs/styles/usage.md +0 -227
  630. package/docs/testing/visual-testing.md +0 -120
  631. package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
  632. package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
  633. package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
  634. package/docs/troubleshooting/database-view-compatibility.md +0 -125
  635. package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
  636. package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
  637. package/examples/RBAC/EventBasedApp.tsx +0 -239
  638. package/examples/RBAC/PermissionExample.tsx +0 -151
  639. package/examples/STRUCTURE.md +0 -125
  640. package/examples/components 2/DataTable/HierarchicalExample.tsx +0 -475
  641. package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
  642. package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
  643. package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
  644. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
  645. package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
  646. package/examples/components 2/index.ts +0 -11
  647. package/examples/features/index.ts +0 -12
  648. package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
  649. package/examples/features/rbac/index.ts +0 -13
  650. package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
  651. package/examples/public-pages/PublicEventPage.tsx +0 -274
  652. package/examples/public-pages/PublicPageApp.tsx +0 -308
  653. package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
  654. package/examples/public-pages/index.ts +0 -14
  655. package/src/__tests__/TEST_STANDARD.md +0 -1008
  656. package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
  657. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
  658. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
  659. package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
  660. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
  661. package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
  662. package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
  663. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
  664. package/src/components/Dialog/README.md +0 -804
  665. package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
  666. package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
  667. package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
  668. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
  669. package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
  670. package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
  671. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
  672. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
  673. package/src/components/Dialog/utils/safeHtml.ts +0 -185
  674. package/src/components/EventSelector/types.ts +0 -79
  675. package/src/components/Form/FormErrorSummary.tsx +0 -113
  676. package/src/components/Form/FormField.tsx +0 -249
  677. package/src/components/Form/FormFieldset.tsx +0 -127
  678. package/src/components/Form/FormLiveRegion.tsx +0 -198
  679. package/src/components/Input/__mocks__/Input.tsx +0 -2
  680. package/src/components/NavigationMenu/types.ts +0 -85
  681. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
  682. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
  683. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  684. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  685. package/src/components/PasswordReset/index.ts +0 -2
  686. package/src/components/ProtectedRoute/README.md +0 -164
  687. package/src/components/PublicLayout/EventLogo.tsx +0 -175
  688. package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
  689. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
  690. package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
  691. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  692. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  693. package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
  694. package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
  695. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
  696. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
  697. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
  698. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
  699. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
  700. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
  701. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
  702. package/src/components/Select/hooks.ts +0 -289
  703. package/src/hooks/useCounter.test.ts +0 -131
  704. package/src/hooks/useDebounce.test.ts +0 -375
  705. package/src/providers/AuthProvider.tsx +0 -15
  706. package/src/providers/EventProvider.tsx +0 -16
  707. package/src/providers/InactivityProvider.tsx +0 -15
  708. package/src/providers/OrganisationProvider.context.test.tsx +0 -169
  709. package/src/providers/UnifiedAuthProvider.tsx +0 -15
  710. package/src/types/theme.ts +0 -6
  711. package/src/types/unified.ts +0 -265
  712. package/src/utils/appConfig.ts +0 -47
  713. package/src/utils/appIdResolver.test.ts +0 -499
  714. package/src/utils/appIdResolver.ts +0 -130
  715. package/src/utils/appNameResolver.simple.test.ts +0 -212
  716. package/src/utils/appNameResolver.test.ts +0 -121
  717. package/src/utils/appNameResolver.ts +0 -191
  718. package/src/utils/audit.ts +0 -127
  719. package/src/utils/auth-utils.ts +0 -96
  720. package/src/utils/bundleAnalysis.ts +0 -129
  721. package/src/utils/debugLogger.ts +0 -67
  722. package/src/utils/deviceFingerprint.ts +0 -215
  723. package/src/utils/dynamicUtils.ts +0 -105
  724. package/src/utils/file-reference.test.ts +0 -788
  725. package/src/utils/file-reference.ts +0 -519
  726. package/src/utils/formatDate.test.ts +0 -237
  727. package/src/utils/formatting.ts +0 -170
  728. package/src/utils/lazyLoad.tsx +0 -44
  729. package/src/utils/logger.ts +0 -179
  730. package/src/utils/organisationContext.test.ts +0 -322
  731. package/src/utils/organisationContext.ts +0 -153
  732. package/src/utils/performanceBenchmark.ts +0 -64
  733. package/src/utils/performanceBudgets.ts +0 -110
  734. package/src/utils/permissionTypes.ts +0 -37
  735. package/src/utils/permissionUtils.test.ts +0 -393
  736. package/src/utils/permissionUtils.ts +0 -34
  737. package/src/utils/sanitization.ts +0 -264
  738. package/src/utils/schemaUtils.ts +0 -37
  739. package/src/utils/secureDataAccess.test.ts +0 -711
  740. package/src/utils/secureDataAccess.ts +0 -377
  741. package/src/utils/secureErrors.ts +0 -79
  742. package/src/utils/security.ts +0 -156
  743. package/src/utils/securityMonitor.ts +0 -45
  744. package/src/utils/sessionTracking.ts +0 -126
  745. package/src/utils/validation.ts +0 -111
  746. package/src/utils/validationUtils.ts +0 -120
  747. package/src/validation/index.ts +0 -12
  748. /package/dist/{DataTable-UA6CL4JI.js.map → DataTable-QAB34V6K.js.map} +0 -0
  749. /package/dist/{UnifiedAuthProvider-B37ATQHE.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
  750. /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
  751. /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
  752. /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
  753. /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
  754. /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
  755. /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
  756. /package/examples/{RBAC → rbac}/index.ts +0 -0
@@ -1,1038 +0,0 @@
1
- ---
2
- lastUpdated: 2025-10-29T22:43:00+11:00
3
- version: 0.5.76
4
- reviewedBy: content-audit
5
- ---
6
-
7
- # Public Pages System (Advanced)
8
-
9
- > **🌐 Public Event Pages** | [← Back to Documentation](../README.md) | [↑ Table of Contents](#table-of-contents)
10
-
11
- Complete guide to implementing public pages without authentication, including event logos, caching strategies, and SEO optimization.
12
-
13
- ## Overview
14
-
15
- PACE Core provides a comprehensive public pages system for:
16
- - **Public Event Pages** - Event information without authentication
17
- - **Event Logos** - Dynamic logo loading and caching
18
- - **Public Data Access** - Secure public data retrieval
19
- - **SEO Optimization** - Search engine friendly pages
20
- - **Performance Caching** - Optimized data loading
21
- - **Error Handling** - Graceful degradation for public users
22
-
23
- ## Architecture
24
-
25
- ```mermaid
26
- graph TD
27
- A[Public Page Request] --> B[PublicPageLayout]
28
- B --> C[PublicPageHeader]
29
- C --> D[EventLogo Component]
30
- D --> E[usePublicEvent Hook]
31
- E --> F[Public Data Cache]
32
- F --> G[Supabase Query]
33
- G --> H[RLS Policies]
34
- H --> I[Public Data]
35
- E --> J[usePublicEventLogo Hook]
36
- J --> K[Logo Cache]
37
- K --> L[Storage Bucket]
38
- ```
39
-
40
- ## Quick Start
41
-
42
- ### 1. Basic Public Event Page
43
-
44
- ```tsx
45
- import {
46
- PublicPageLayout,
47
- PublicPageHeader,
48
- EventLogo,
49
- usePublicEvent
50
- } from '@jmruthers/pace-core';
51
-
52
- function PublicEventPage({ eventId }: { eventId: string }) {
53
- const {
54
- event,
55
- loading,
56
- error,
57
- refetch
58
- } = usePublicEvent(eventId);
59
-
60
- if (loading) return <div>Loading event...</div>;
61
- if (error) return <div>Error loading event: {error.message}</div>;
62
- if (!event) return <div>Event not found</div>;
63
-
64
- return (
65
- <PublicPageLayout>
66
- <PublicPageHeader
67
- title={event.name}
68
- description={event.description}
69
- logo={<EventLogo eventId={eventId} size="large" />}
70
- />
71
-
72
- <main className="container mx-auto px-4 py-8">
73
- <h1>{event.name}</h1>
74
- <p>{event.description}</p>
75
- <p>Date: {new Date(event.start_date).toLocaleDateString()}</p>
76
- <p>Location: {event.location}</p>
77
- </main>
78
- </PublicPageLayout>
79
- );
80
- }
81
- ```
82
-
83
- ### 2. Public Event with Logo
84
-
85
- ```tsx
86
- import {
87
- PublicPageLayout,
88
- EventLogo,
89
- usePublicEvent,
90
- usePublicEventLogo
91
- } from '@jmruthers/pace-core';
92
-
93
- function EventWithLogo({ eventId }: { eventId: string }) {
94
- const { event, loading: eventLoading } = usePublicEvent(eventId);
95
- const {
96
- logoUrl,
97
- loading: logoLoading,
98
- error: logoError
99
- } = usePublicEventLogo(eventId, 'large');
100
-
101
- return (
102
- <PublicPageLayout>
103
- <header className="bg-main-50 py-8">
104
- <div className="container mx-auto px-4 text-center">
105
- {logoLoading ? (
106
- <div className="animate-pulse bg-sec-200 h-32 w-32 mx-auto rounded"></div>
107
- ) : logoError ? (
108
- <div className="text-sec-500">Logo unavailable</div>
109
- ) : (
110
- <EventLogo
111
- eventId={eventId}
112
- size="large"
113
- className="mx-auto"
114
- />
115
- )}
116
-
117
- {event && (
118
- <div className="mt-4">
119
- <h1 className="text-3xl font-bold text-main-900">
120
- {event.name}
121
- </h1>
122
- <p className="text-main-700 mt-2">
123
- {event.description}
124
- </p>
125
- </div>
126
- )}
127
- </div>
128
- </header>
129
- </PublicPageLayout>
130
- );
131
- }
132
- ```
133
-
134
- ## Components
135
-
136
- ### PublicPageLayout
137
-
138
- A layout component specifically designed for public pages without authentication.
139
-
140
- #### Props
141
-
142
- ```typescript
143
- interface PublicPageLayoutProps {
144
- children: React.ReactNode;
145
- className?: string;
146
- showHeader?: boolean;
147
- showFooter?: boolean;
148
- errorBoundary?: boolean;
149
- }
150
- ```
151
-
152
- #### Usage Examples
153
-
154
- **Basic Layout:**
155
- ```tsx
156
- <PublicPageLayout>
157
- <h1>Public Event Page</h1>
158
- <p>This page is accessible without authentication</p>
159
- </PublicPageLayout>
160
- ```
161
-
162
- **Custom Styling:**
163
- ```tsx
164
- <PublicPageLayout
165
- className="min-h-screen bg-gradient-to-br from-main-50 to-sec-50"
166
- showHeader={true}
167
- showFooter={true}
168
- >
169
- <div className="container mx-auto px-4 py-8">
170
- <h1>Custom Public Page</h1>
171
- </div>
172
- </PublicPageLayout>
173
- ```
174
-
175
- **With Error Boundary:**
176
- ```tsx
177
- <PublicPageLayout errorBoundary={true}>
178
- <PublicEventContent eventId={eventId} />
179
- </PublicPageLayout>
180
- ```
181
-
182
- ### PublicPageHeader
183
-
184
- A header component for public pages with event branding and navigation.
185
-
186
- #### Props
187
-
188
- ```typescript
189
- interface PublicPageHeaderProps {
190
- title: string;
191
- description?: string;
192
- logo?: React.ReactNode;
193
- navigation?: NavigationItem[];
194
- className?: string;
195
- }
196
- ```
197
-
198
- #### Usage Examples
199
-
200
- **Basic Header:**
201
- ```tsx
202
- <PublicPageHeader
203
- title="Event Name"
204
- description="Event description"
205
- logo={<EventLogo eventId={eventId} />}
206
- />
207
- ```
208
-
209
- **With Navigation:**
210
- ```tsx
211
- <PublicPageHeader
212
- title="Event Name"
213
- description="Event description"
214
- logo={<EventLogo eventId={eventId} />}
215
- navigation={[
216
- { label: 'Home', href: '/' },
217
- { label: 'Schedule', href: '/schedule' },
218
- { label: 'Speakers', href: '/speakers' }
219
- ]}
220
- />
221
- ```
222
-
223
- ### EventLogo
224
-
225
- A component for displaying event logos with automatic loading and caching.
226
-
227
- #### Props
228
-
229
- ```typescript
230
- interface EventLogoProps {
231
- eventId: string;
232
- size?: 'small' | 'medium' | 'large' | 'xlarge';
233
- variant?: 'default' | 'square' | 'wide';
234
- className?: string;
235
- fallback?: React.ReactNode;
236
- showLoading?: boolean;
237
- }
238
- ```
239
-
240
- #### Usage Examples
241
-
242
- **Basic Logo:**
243
- ```tsx
244
- <EventLogo eventId={eventId} size="medium" />
245
- ```
246
-
247
- **Custom Styling:**
248
- ```tsx
249
- <EventLogo
250
- eventId={eventId}
251
- size="large"
252
- variant="square"
253
- className="rounded-lg shadow-lg"
254
- />
255
- ```
256
-
257
- **With Fallback:**
258
- ```tsx
259
- <EventLogo
260
- eventId={eventId}
261
- size="medium"
262
- fallback={
263
- <div className="bg-sec-200 text-sec-500 p-4 rounded">
264
- No Logo Available
265
- </div>
266
- }
267
- />
268
- ```
269
-
270
- ## Hooks
271
-
272
- ### usePublicEvent
273
-
274
- Hook for fetching public event data without authentication.
275
-
276
- #### Interface
277
-
278
- ```typescript
279
- interface UsePublicEventReturn {
280
- event: PublicEvent | null;
281
- loading: boolean;
282
- error: Error | null;
283
- refetch: () => Promise<void>;
284
- clearCache: () => void;
285
- }
286
-
287
- interface PublicEvent {
288
- id: string;
289
- name: string;
290
- description: string;
291
- start_date: string;
292
- end_date: string;
293
- location: string;
294
- status: 'draft' | 'published' | 'cancelled';
295
- public_url?: string;
296
- logo_url?: string;
297
- metadata?: Record<string, any>;
298
- }
299
- ```
300
-
301
- #### Usage Examples
302
-
303
- **Basic Event Loading:**
304
- ```tsx
305
- import { usePublicEvent } from '@jmruthers/pace-core';
306
-
307
- function EventPage({ eventId }: { eventId: string }) {
308
- const { event, loading, error, refetch } = usePublicEvent(eventId);
309
-
310
- if (loading) return <div>Loading event...</div>;
311
- if (error) return <div>Error: {error.message}</div>;
312
- if (!event) return <div>Event not found</div>;
313
-
314
- return (
315
- <div>
316
- <h1>{event.name}</h1>
317
- <p>{event.description}</p>
318
- <p>Date: {new Date(event.start_date).toLocaleDateString()}</p>
319
- <p>Location: {event.location}</p>
320
-
321
- <Button onClick={refetch}>Refresh Event</Button>
322
- </div>
323
- );
324
- }
325
- ```
326
-
327
- **With Error Handling:**
328
- ```tsx
329
- import { usePublicEvent } from '@jmruthers/pace-core';
330
-
331
- function EventWithErrorHandling({ eventId }: { eventId: string }) {
332
- const { event, loading, error, refetch } = usePublicEvent(eventId);
333
-
334
- const handleRetry = async () => {
335
- try {
336
- await refetch();
337
- } catch (err) {
338
- console.error('Failed to refetch event:', err);
339
- }
340
- };
341
-
342
- if (loading) {
343
- return (
344
- <div className="flex items-center justify-center min-h-64">
345
- <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-main-600"></div>
346
- </div>
347
- );
348
- }
349
-
350
- if (error) {
351
- return (
352
- <div className="text-center py-8">
353
- <h2 className="text-xl font-semibold text-sec-800 mb-2">
354
- Unable to load event
355
- </h2>
356
- <p className="text-sec-600 mb-4">{error.message}</p>
357
- <Button onClick={handleRetry}>Try Again</Button>
358
- </div>
359
- );
360
- }
361
-
362
- if (!event) {
363
- return (
364
- <div className="text-center py-8">
365
- <h2 className="text-xl font-semibold text-sec-800">
366
- Event not found
367
- </h2>
368
- <p className="text-sec-600">
369
- The event you're looking for doesn't exist or isn't public.
370
- </p>
371
- </div>
372
- );
373
- }
374
-
375
- return (
376
- <div>
377
- <h1>{event.name}</h1>
378
- <p>{event.description}</p>
379
- {/* Event content */}
380
- </div>
381
- );
382
- }
383
- ```
384
-
385
- ### usePublicEventLogo
386
-
387
- Hook for loading and caching event logos.
388
-
389
- #### Interface
390
-
391
- ```typescript
392
- interface UsePublicEventLogoReturn {
393
- logoUrl: string | null;
394
- loading: boolean;
395
- error: Error | null;
396
- refetch: () => Promise<void>;
397
- clearCache: () => void;
398
- }
399
-
400
- interface LogoSize {
401
- small: 'w-8 h-8';
402
- medium: 'w-16 h-16';
403
- large: 'w-32 h-32';
404
- xlarge: 'w-48 h-48';
405
- }
406
- ```
407
-
408
- #### Usage Examples
409
-
410
- > **Storage path formats**
411
- >
412
- > When configuring `event_logo` for an event, Pace supports multiple formats:
413
- >
414
- > - A fully qualified `https://` URL will be used directly.
415
- > - A storage path like `public-files/org-123/logo.png` automatically resolves against the standard buckets configured via `pace-core`.
416
- > - If your deployment stores logos in a different bucket, prefix the path with the bucket name using `custombucket/org-123/logo.png` (alphanumeric names) or `custom-bucket::org-123/logo.png` (bucket names containing hyphens).
417
- >
418
- > The double colon form helps when your folders start with numbers (for example `2024/`), ensuring they are not mistaken for bucket names.
419
-
420
- **Basic Logo Loading:**
421
- ```tsx
422
- import { usePublicEventLogo } from '@jmruthers/pace-core';
423
-
424
- function EventLogoDisplay({ eventId }: { eventId: string }) {
425
- const { logoUrl, loading, error } = usePublicEventLogo(eventId, 'large');
426
-
427
- if (loading) {
428
- return <div className="animate-pulse bg-sec-200 w-32 h-32 rounded"></div>;
429
- }
430
-
431
- if (error) {
432
- return <div className="text-sec-500">Logo unavailable</div>;
433
- }
434
-
435
- if (!logoUrl) {
436
- return <div className="bg-sec-200 text-sec-500 p-4 rounded">No logo</div>;
437
- }
438
-
439
- return (
440
- <img
441
- src={logoUrl}
442
- alt="Event logo"
443
- className="w-32 h-32 object-contain"
444
- />
445
- );
446
- }
447
- ```
448
-
449
- **With Caching Control:**
450
- ```tsx
451
- import { usePublicEventLogo } from '@jmruthers/pace-core';
452
-
453
- function LogoWithCacheControl({ eventId }: { eventId: string }) {
454
- const {
455
- logoUrl,
456
- loading,
457
- error,
458
- refetch,
459
- clearCache
460
- } = usePublicEventLogo(eventId, 'medium');
461
-
462
- const handleRefresh = async () => {
463
- await refetch();
464
- };
465
-
466
- const handleClearCache = () => {
467
- clearCache();
468
- };
469
-
470
- return (
471
- <div className="space-y-4">
472
- {loading && <div>Loading logo...</div>}
473
- {error && <div>Error: {error.message}</div>}
474
- {logoUrl && (
475
- <img
476
- src={logoUrl}
477
- alt="Event logo"
478
- className="w-16 h-16 object-contain"
479
- />
480
- )}
481
-
482
- <div className="space-x-2">
483
- <Button onClick={handleRefresh} size="sm">
484
- Refresh Logo
485
- </Button>
486
- <Button onClick={handleClearCache} size="sm" variant="outline">
487
- Clear Cache
488
- </Button>
489
- </div>
490
- </div>
491
- );
492
- }
493
- ```
494
-
495
- ## Caching Strategies
496
-
497
- ### Client-Side Caching
498
-
499
- ```tsx
500
- import { usePublicEvent, clearPublicEventCache } from '@jmruthers/pace-core';
501
-
502
- function CachedEventPage({ eventId }: { eventId: string }) {
503
- const { event, loading } = usePublicEvent(eventId);
504
-
505
- // Cache management
506
- const handleClearCache = () => {
507
- clearPublicEventCache();
508
- console.log('Event cache cleared');
509
- };
510
-
511
- const handlePreloadEvent = async (newEventId: string) => {
512
- // Preload another event
513
- const { event: preloadedEvent } = usePublicEvent(newEventId);
514
- console.log('Preloaded event:', preloadedEvent);
515
- };
516
-
517
- return (
518
- <div>
519
- <h1>{event?.name}</h1>
520
-
521
- <div className="space-x-2">
522
- <Button onClick={handleClearCache}>
523
- Clear Cache
524
- </Button>
525
- <Button onClick={() => handlePreloadEvent('other-event-id')}>
526
- Preload Other Event
527
- </Button>
528
- </div>
529
- </div>
530
- );
531
- }
532
- ```
533
-
534
- ### Cache Statistics
535
-
536
- ```tsx
537
- import { getPublicEventCacheStats, getPublicLogoCacheStats } from '@jmruthers/pace-core';
538
-
539
- function CacheStats() {
540
- const eventStats = getPublicEventCacheStats();
541
- const logoStats = getPublicLogoCacheStats();
542
-
543
- return (
544
- <div className="bg-sec-50 p-4 rounded">
545
- <h3>Cache Statistics</h3>
546
- <div className="grid grid-cols-2 gap-4">
547
- <div>
548
- <h4>Event Cache</h4>
549
- <p>Entries: {eventStats.entryCount}</p>
550
- <p>Hit Rate: {eventStats.hitRate}%</p>
551
- <p>Memory Usage: {eventStats.memoryUsage} bytes</p>
552
- </div>
553
- <div>
554
- <h4>Logo Cache</h4>
555
- <p>Entries: {logoStats.entryCount}</p>
556
- <p>Hit Rate: {logoStats.hitRate}%</p>
557
- <p>Memory Usage: {logoStats.memoryUsage} bytes</p>
558
- </div>
559
- </div>
560
- </div>
561
- );
562
- }
563
- ```
564
-
565
- ## SEO Optimization
566
-
567
- ### Meta Tags and Structured Data
568
-
569
- ```tsx
570
- import { usePublicEvent } from '@jmruthers/pace-core';
571
-
572
- function SEOEventPage({ eventId }: { eventId: string }) {
573
- const { event } = usePublicEvent(eventId);
574
-
575
- // Generate structured data for search engines
576
- const structuredData = event ? {
577
- "@context": "https://schema.org",
578
- "@type": "Event",
579
- "name": event.name,
580
- "description": event.description,
581
- "startDate": event.start_date,
582
- "endDate": event.end_date,
583
- "location": {
584
- "@type": "Place",
585
- "name": event.location
586
- },
587
- "url": event.public_url,
588
- "image": event.logo_url
589
- } : null;
590
-
591
- return (
592
- <>
593
- {/* Meta tags */}
594
- <head>
595
- <title>{event?.name || 'Event'}</title>
596
- <meta name="description" content={event?.description} />
597
- <meta property="og:title" content={event?.name} />
598
- <meta property="og:description" content={event?.description} />
599
- <meta property="og:image" content={event?.logo_url} />
600
- <meta property="og:type" content="event" />
601
- <meta name="twitter:card" content="summary_large_image" />
602
-
603
- {/* Structured data */}
604
- {structuredData && (
605
- <script
606
- type="application/ld+json"
607
- dangerouslySetInnerHTML={{
608
- __html: JSON.stringify(structuredData)
609
- }}
610
- />
611
- )}
612
- </head>
613
-
614
- <main>
615
- <h1>{event?.name}</h1>
616
- <p>{event?.description}</p>
617
- {/* Event content */}
618
- </main>
619
- </>
620
- );
621
- }
622
- ```
623
-
624
- ### Dynamic Routes and SSG
625
-
626
- ```tsx
627
- // pages/events/[eventId].tsx
628
- import { usePublicEvent } from '@jmruthers/pace-core';
629
-
630
- export async function getStaticPaths() {
631
- // Generate static paths for all public events
632
- const { data: events } = await supabase
633
- .from('events')
634
- .select('id')
635
- .eq('status', 'published')
636
- .eq('is_public', true);
637
-
638
- const paths = events?.map(event => ({
639
- params: { eventId: event.id }
640
- })) || [];
641
-
642
- return {
643
- paths,
644
- fallback: 'blocking'
645
- };
646
- }
647
-
648
- export async function getStaticProps({ params }: { params: { eventId: string } }) {
649
- // Pre-fetch event data at build time
650
- const { data: event } = await supabase
651
- .from('events')
652
- .select('*')
653
- .eq('id', params.eventId)
654
- .eq('status', 'published')
655
- .eq('is_public', true)
656
- .single();
657
-
658
- return {
659
- props: {
660
- event,
661
- eventId: params.eventId
662
- },
663
- revalidate: 3600 // Revalidate every hour
664
- };
665
- }
666
-
667
- function EventPage({ event, eventId }: { event: any; eventId: string }) {
668
- const { event: liveEvent, loading } = usePublicEvent(eventId);
669
-
670
- // Use pre-fetched data initially, then live data
671
- const displayEvent = liveEvent || event;
672
-
673
- return (
674
- <div>
675
- <h1>{displayEvent?.name}</h1>
676
- <p>{displayEvent?.description}</p>
677
- {loading && <div>Updating...</div>}
678
- </div>
679
- );
680
- }
681
- ```
682
-
683
- ## Error Handling
684
-
685
- ### Graceful Degradation
686
-
687
- ```tsx
688
- import { usePublicEvent, usePublicEventLogo } from '@jmruthers/pace-core';
689
-
690
- function RobustEventPage({ eventId }: { eventId: string }) {
691
- const {
692
- event,
693
- loading: eventLoading,
694
- error: eventError
695
- } = usePublicEvent(eventId);
696
-
697
- const {
698
- logoUrl,
699
- loading: logoLoading,
700
- error: logoError
701
- } = usePublicEventLogo(eventId, 'large');
702
-
703
- // Graceful degradation for missing data
704
- const displayName = event?.name || 'Event';
705
- const displayDescription = event?.description || 'Event details coming soon';
706
- const displayLogo = logoUrl || '/default-event-logo.png';
707
-
708
- if (eventLoading) {
709
- return (
710
- <div className="min-h-screen flex items-center justify-center">
711
- <div className="text-center">
712
- <div className="animate-spin rounded-full h-12 w-12 border-b-2 border-main-600 mx-auto"></div>
713
- <p className="mt-4 text-sec-600">Loading event...</p>
714
- </div>
715
- </div>
716
- );
717
- }
718
-
719
- if (eventError) {
720
- return (
721
- <div className="min-h-screen flex items-center justify-center">
722
- <div className="text-center">
723
- <h1 className="text-2xl font-bold text-sec-800 mb-2">
724
- Unable to load event
725
- </h1>
726
- <p className="text-sec-600 mb-4">
727
- {eventError.message}
728
- </p>
729
- <Button onClick={() => window.location.reload()}>
730
- Try Again
731
- </Button>
732
- </div>
733
- </div>
734
- );
735
- }
736
-
737
- return (
738
- <PublicPageLayout>
739
- <header className="bg-main-50 py-8">
740
- <div className="container mx-auto px-4 text-center">
741
- {logoLoading ? (
742
- <div className="animate-pulse bg-sec-200 h-32 w-32 mx-auto rounded"></div>
743
- ) : logoError ? (
744
- <div className="bg-sec-200 text-sec-500 h-32 w-32 mx-auto rounded flex items-center justify-center">
745
- No Logo
746
- </div>
747
- ) : (
748
- <img
749
- src={displayLogo}
750
- alt={`${displayName} logo`}
751
- className="h-32 w-32 mx-auto object-contain"
752
- />
753
- )}
754
-
755
- <h1 className="text-3xl font-bold text-main-900 mt-4">
756
- {displayName}
757
- </h1>
758
- <p className="text-main-700 mt-2">
759
- {displayDescription}
760
- </p>
761
- </div>
762
- </header>
763
-
764
- <main className="container mx-auto px-4 py-8">
765
- {/* Event content */}
766
- </main>
767
- </PublicPageLayout>
768
- );
769
- }
770
- ```
771
-
772
- ## Performance Optimization
773
-
774
- ### Lazy Loading
775
-
776
- ```tsx
777
- import { lazy, Suspense } from 'react';
778
- import { usePublicEvent } from '@jmruthers/pace-core';
779
-
780
- // Lazy load heavy components
781
- const EventSchedule = lazy(() => import('./EventSchedule'));
782
- const EventSpeakers = lazy(() => import('./EventSpeakers'));
783
-
784
- function OptimizedEventPage({ eventId }: { eventId: string }) {
785
- const { event, loading } = usePublicEvent(eventId);
786
-
787
- if (loading) return <div>Loading...</div>;
788
- if (!event) return <div>Event not found</div>;
789
-
790
- return (
791
- <PublicPageLayout>
792
- <header>
793
- <h1>{event.name}</h1>
794
- <p>{event.description}</p>
795
- </header>
796
-
797
- <main>
798
- {/* Critical content loads immediately */}
799
- <section>
800
- <h2>Event Details</h2>
801
- <p>Date: {new Date(event.start_date).toLocaleDateString()}</p>
802
- <p>Location: {event.location}</p>
803
- </section>
804
-
805
- {/* Non-critical content loads lazily */}
806
- <Suspense fallback={<div>Loading schedule...</div>}>
807
- <EventSchedule eventId={eventId} />
808
- </Suspense>
809
-
810
- <Suspense fallback={<div>Loading speakers...</div>}>
811
- <EventSpeakers eventId={eventId} />
812
- </Suspense>
813
- </main>
814
- </PublicPageLayout>
815
- );
816
- }
817
- ```
818
-
819
- ### Image Optimization
820
-
821
- ```tsx
822
- import { EventLogo } from '@jmruthers/pace-core';
823
-
824
- function OptimizedEventLogo({ eventId }: { eventId: string }) {
825
- return (
826
- <EventLogo
827
- eventId={eventId}
828
- size="large"
829
- className="w-full h-auto max-w-md mx-auto"
830
- // The component handles:
831
- // - WebP format when supported
832
- // - Responsive sizing
833
- // - Lazy loading
834
- // - Error fallbacks
835
- />
836
- );
837
- }
838
- ```
839
-
840
- ## Complete Examples
841
-
842
- ### Full Event Landing Page
843
-
844
- ```tsx
845
- import {
846
- PublicPageLayout,
847
- PublicPageHeader,
848
- EventLogo,
849
- usePublicEvent,
850
- usePublicEventLogo
851
- } from '@jmruthers/pace-core';
852
-
853
- function EventLandingPage({ eventId }: { eventId: string }) {
854
- const { event, loading: eventLoading, error: eventError } = usePublicEvent(eventId);
855
- const { logoUrl, loading: logoLoading } = usePublicEventLogo(eventId, 'xlarge');
856
-
857
- if (eventLoading) {
858
- return (
859
- <PublicPageLayout>
860
- <div className="min-h-screen flex items-center justify-center">
861
- <div className="animate-spin rounded-full h-12 w-12 border-b-2 border-main-600"></div>
862
- </div>
863
- </PublicPageLayout>
864
- );
865
- }
866
-
867
- if (eventError || !event) {
868
- return (
869
- <PublicPageLayout>
870
- <div className="min-h-screen flex items-center justify-center">
871
- <div className="text-center">
872
- <h1 className="text-2xl font-bold text-sec-800 mb-2">
873
- Event Not Found
874
- </h1>
875
- <p className="text-sec-600">
876
- The event you're looking for doesn't exist or isn't public.
877
- </p>
878
- </div>
879
- </div>
880
- </PublicPageLayout>
881
- );
882
- }
883
-
884
- return (
885
- <PublicPageLayout>
886
- <PublicPageHeader
887
- title={event.name}
888
- description={event.description}
889
- logo={
890
- logoLoading ? (
891
- <div className="animate-pulse bg-sec-200 h-48 w-48 rounded"></div>
892
- ) : (
893
- <EventLogo eventId={eventId} size="xlarge" />
894
- )
895
- }
896
- navigation={[
897
- { label: 'Home', href: '/' },
898
- { label: 'Schedule', href: '#schedule' },
899
- { label: 'Speakers', href: '#speakers' },
900
- { label: 'Register', href: '#register' }
901
- ]}
902
- />
903
-
904
- <main className="container mx-auto px-4 py-8">
905
- {/* Hero Section */}
906
- <section className="text-center py-16">
907
- <h1 className="text-4xl font-bold text-main-900 mb-4">
908
- {event.name}
909
- </h1>
910
- <p className="text-xl text-main-700 mb-8 max-w-3xl mx-auto">
911
- {event.description}
912
- </p>
913
- <div className="flex flex-col sm:flex-row gap-4 justify-center">
914
- <Button size="lg" className="bg-main-600 text-main-50">
915
- Register Now
916
- </Button>
917
- <Button size="lg" variant="outline">
918
- View Schedule
919
- </Button>
920
- </div>
921
- </section>
922
-
923
- {/* Event Details */}
924
- <section className="py-16">
925
- <div className="grid md:grid-cols-2 gap-8">
926
- <div>
927
- <h2 className="text-2xl font-bold text-main-900 mb-4">
928
- Event Information
929
- </h2>
930
- <div className="space-y-4">
931
- <div>
932
- <h3 className="font-semibold text-main-800">Date</h3>
933
- <p className="text-main-600">
934
- {new Date(event.start_date).toLocaleDateString('en-US', {
935
- weekday: 'long',
936
- year: 'numeric',
937
- month: 'long',
938
- day: 'numeric'
939
- })}
940
- </p>
941
- </div>
942
- <div>
943
- <h3 className="font-semibold text-main-800">Location</h3>
944
- <p className="text-main-600">{event.location}</p>
945
- </div>
946
- <div>
947
- <h3 className="font-semibold text-main-800">Status</h3>
948
- <span className={`px-3 py-1 rounded-full text-sm ${
949
- event.status === 'published'
950
- ? 'bg-main-100 text-main-800'
951
- : 'bg-sec-100 text-sec-800'
952
- }`}>
953
- {event.status}
954
- </span>
955
- </div>
956
- </div>
957
- </div>
958
-
959
- <div>
960
- <h2 className="text-2xl font-bold text-main-900 mb-4">
961
- Event Logo
962
- </h2>
963
- {logoLoading ? (
964
- <div className="animate-pulse bg-sec-200 h-48 w-48 rounded"></div>
965
- ) : (
966
- <EventLogo
967
- eventId={eventId}
968
- size="large"
969
- className="rounded-lg shadow-lg"
970
- />
971
- )}
972
- </div>
973
- </div>
974
- </section>
975
-
976
- {/* Additional sections */}
977
- <section id="schedule" className="py-16">
978
- <h2 className="text-2xl font-bold text-main-900 mb-8">Schedule</h2>
979
- {/* Schedule content */}
980
- </section>
981
-
982
- <section id="speakers" className="py-16">
983
- <h2 className="text-2xl font-bold text-main-900 mb-8">Speakers</h2>
984
- {/* Speakers content */}
985
- </section>
986
- </main>
987
- </PublicPageLayout>
988
- );
989
- }
990
- ```
991
-
992
- ## Troubleshooting
993
-
994
- ### Common Issues
995
-
996
- **Issue: Event not loading**
997
- - Check that event exists and is published
998
- - Verify `is_public` flag is set to true
999
- - Check RLS policies allow public access
1000
-
1001
- **Issue: Logo not displaying**
1002
- - Verify logo file exists in storage bucket
1003
- - Check storage bucket policies
1004
- - Ensure logo URL is correct
1005
-
1006
- **Issue: Cache not working**
1007
- - Check browser storage permissions
1008
- - Verify cache configuration
1009
- - Clear browser cache and test
1010
-
1011
- ### Debug Mode
1012
-
1013
- ```tsx
1014
- import { usePublicEvent, usePublicEventLogo } from '@jmruthers/pace-core';
1015
-
1016
- function DebugPublicPage({ eventId }: { eventId: string }) {
1017
- const { event, loading, error } = usePublicEvent(eventId);
1018
- const { logoUrl, loading: logoLoading, error: logoError } = usePublicEventLogo(eventId, 'large');
1019
-
1020
- console.log('Event data:', { event, loading, error });
1021
- console.log('Logo data:', { logoUrl, logoLoading, logoError });
1022
-
1023
- return (
1024
- <div>
1025
- <h1>Debug Information</h1>
1026
- <pre>{JSON.stringify({ event, loading, error }, null, 2)}</pre>
1027
- <pre>{JSON.stringify({ logoUrl, logoLoading, logoError }, null, 2)}</pre>
1028
- </div>
1029
- );
1030
- }
1031
- ```
1032
-
1033
- ## Next Steps
1034
-
1035
- - **[Public Data Access](../api-reference/hooks.md#public-hooks)** - Public data hooks
1036
- - **[SEO Best Practices](../best-practices/seo.md)** - Search engine optimization
1037
- - **[Performance Optimization](./performance.md)** - Large page optimization
1038
- - **[Caching Strategies](../best-practices/caching.md)** - Advanced caching patterns