@jmruthers/pace-core 0.5.180 → 0.5.182

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 (750) 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-4VSEJQ7D.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-6HLVGAZG.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-CPTUD43C.js → chunk-MI7HBHN3.js} +164 -243
  36. package/dist/chunk-MI7HBHN3.js.map +1 -0
  37. package/dist/{chunk-N5YCCUG5.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-P6UUHOIF.js → chunk-QETLRQI6.js} +526 -887
  44. package/dist/chunk-QETLRQI6.js.map +1 -0
  45. package/dist/{chunk-GQA2LIAE.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-ONI7Y733.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-R53TUSFK.js → chunk-W22JP75J.js} +5 -13
  60. package/dist/{chunk-R53TUSFK.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/examples/{components 2/DataTable/HierarchicalExample.tsx → 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/usePublicRouteParams.ts +1 -1
  470. package/src/hooks/services/useAuth.ts +2 -4
  471. package/src/hooks/services/useCurrentEvent.ts +1 -1
  472. package/src/hooks/useAppConfig.ts +1 -1
  473. package/src/hooks/useDataTablePerformance.ts +2 -2
  474. package/src/hooks/useEventTheme.ts +1 -1
  475. package/src/hooks/useEvents.ts +51 -10
  476. package/src/hooks/useOrganisationPermissions.test.ts +3 -3
  477. package/src/hooks/useOrganisationPermissions.ts +1 -1
  478. package/src/hooks/useOrganisationSecurity.ts +2 -2
  479. package/src/hooks/usePermissionCache.test.ts +9 -9
  480. package/src/hooks/usePermissionCache.ts +2 -2
  481. package/src/index.ts +19 -12
  482. package/src/providers/OrganisationProvider.tsx +73 -9
  483. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +113 -13
  484. package/src/providers/__tests__/AuthProvider.test.tsx +2 -1
  485. package/src/providers/__tests__/EventProvider.test.tsx +24 -15
  486. package/src/providers/__tests__/OrganisationProvider.test.tsx +87 -36
  487. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +80 -24
  488. package/src/providers/index.ts +0 -3
  489. package/src/providers/services/AuthServiceProvider.tsx +2 -17
  490. package/src/providers/services/EventServiceProvider.tsx +11 -16
  491. package/src/providers/services/InactivityServiceProvider.tsx +9 -12
  492. package/src/providers/services/OrganisationServiceProvider.tsx +9 -12
  493. package/src/providers/services/UnifiedAuthProvider.tsx +85 -18
  494. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +11 -4
  495. package/src/rbac/__tests__/scenarios.user-role.test.tsx +105 -21
  496. package/src/rbac/adapters.tsx +1 -1
  497. package/src/rbac/api.ts +20 -4
  498. package/src/rbac/audit-enhanced.ts +47 -2
  499. package/src/rbac/audit.ts +47 -2
  500. package/src/rbac/components/NavigationGuard.tsx +1 -1
  501. package/src/rbac/components/NavigationProvider.test.tsx +7 -6
  502. package/src/rbac/components/NavigationProvider.tsx +1 -1
  503. package/src/rbac/components/PagePermissionGuard.tsx +1 -1
  504. package/src/rbac/components/PagePermissionProvider.test.tsx +7 -6
  505. package/src/rbac/components/PagePermissionProvider.tsx +1 -1
  506. package/src/rbac/components/PermissionEnforcer.tsx +1 -1
  507. package/src/rbac/components/RoleBasedRouter.tsx +1 -1
  508. package/src/rbac/components/SecureDataProvider.test.tsx +7 -6
  509. package/src/rbac/components/SecureDataProvider.tsx +1 -1
  510. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +6 -6
  511. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +11 -10
  512. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +10 -11
  513. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +19 -15
  514. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +13 -12
  515. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +19 -15
  516. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +18 -18
  517. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +11 -10
  518. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +8 -7
  519. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +10 -11
  520. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +48 -19
  521. package/src/rbac/hooks/__tests__/useSecureSupabase.test.ts +476 -0
  522. package/src/rbac/hooks/index.ts +3 -0
  523. package/src/rbac/hooks/usePermissions.ts +31 -85
  524. package/src/rbac/hooks/useRBAC.test.ts +13 -1
  525. package/src/rbac/hooks/useRBAC.ts +13 -67
  526. package/src/rbac/hooks/useResolvedScope.ts +11 -0
  527. package/src/rbac/hooks/useSecureSupabase.ts +308 -0
  528. package/src/rbac/index.ts +3 -0
  529. package/src/rbac/secureClient.ts +53 -6
  530. package/src/rbac/security.ts +37 -1
  531. package/src/{types/rbac-functions.ts → rbac/types/functions.ts} +30 -30
  532. package/src/rbac/types.ts +3 -2
  533. package/src/services/AuthService.ts +33 -25
  534. package/src/services/EventService.ts +57 -31
  535. package/src/services/InactivityService.ts +33 -53
  536. package/src/services/OrganisationService.ts +36 -40
  537. package/src/services/__tests__/AuthService.restoreSession.test.ts +6 -2
  538. package/src/services/__tests__/EventService.test.ts +67 -33
  539. package/src/services/interfaces/IEventService.ts +1 -1
  540. package/src/styles/core.css +2 -2
  541. package/src/styles/index.ts +1 -5
  542. package/src/types/__tests__/guards.test.ts +1 -1
  543. package/src/types/__tests__/type-validation.test.ts +0 -1
  544. package/src/types/auth.ts +42 -2
  545. package/src/types/core.ts +251 -0
  546. package/src/types/database.ts +11 -496
  547. package/src/types/event.ts +102 -0
  548. package/src/types/file-reference.ts +6 -4
  549. package/src/types/guards.ts +2 -1
  550. package/src/types/index.ts +48 -14
  551. package/src/types/lodash.debounce.d.ts +15 -0
  552. package/src/types/organisation.ts +14 -10
  553. package/src/types/supabase.ts +15 -17
  554. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -1
  555. package/src/utils/__tests__/validationUtils.unit.test.ts +0 -29
  556. package/src/utils/app/appNameResolver.ts +1 -1
  557. package/src/utils/dynamic/dynamicUtils.ts +3 -2
  558. package/src/utils/file-reference/index.ts +25 -6
  559. package/src/utils/security/secureErrors.ts +1 -1
  560. package/src/utils/validation/index.ts +6 -12
  561. package/src/utils/validation/validationUtils.ts +0 -13
  562. package/dist/UnifiedAuthProvider-BMJAP6Z7.js +0 -16
  563. package/dist/auth-DReDSLq9.d.ts +0 -16
  564. package/dist/chunk-56XJ3TU6.js +0 -11
  565. package/dist/chunk-56XJ3TU6.js.map +0 -1
  566. package/dist/chunk-6HLVGAZG.js.map +0 -1
  567. package/dist/chunk-7QCC6MCP.js +0 -288
  568. package/dist/chunk-BESYRHQM.js.map +0 -1
  569. package/dist/chunk-BJPBT3CU.js +0 -21
  570. package/dist/chunk-BJPBT3CU.js.map +0 -1
  571. package/dist/chunk-BVYWGZVV.js.map +0 -1
  572. package/dist/chunk-CPTUD43C.js.map +0 -1
  573. package/dist/chunk-CX5M4ZAG.js.map +0 -1
  574. package/dist/chunk-ERGKJX4D.js +0 -15
  575. package/dist/chunk-ERGKJX4D.js.map +0 -1
  576. package/dist/chunk-ERISIBYU.js.map +0 -1
  577. package/dist/chunk-GQA2LIAE.js.map +0 -1
  578. package/dist/chunk-JISYG63F.js +0 -70
  579. package/dist/chunk-JISYG63F.js.map +0 -1
  580. package/dist/chunk-MSHEVJXS.js +0 -27
  581. package/dist/chunk-MSHEVJXS.js.map +0 -1
  582. package/dist/chunk-N5YCCUG5.js.map +0 -1
  583. package/dist/chunk-ONI7Y733.js.map +0 -1
  584. package/dist/chunk-OWAG3GSU.js.map +0 -1
  585. package/dist/chunk-P6UUHOIF.js.map +0 -1
  586. package/dist/chunk-PKW27QVS.js +0 -61
  587. package/dist/chunk-PKW27QVS.js.map +0 -1
  588. package/dist/chunk-Q5QRDWKI.js.map +0 -1
  589. package/dist/chunk-S5OFRT4M.js.map +0 -1
  590. package/dist/chunk-SBVILCCA.js.map +0 -1
  591. package/dist/chunk-WM26XK7I.js +0 -2432
  592. package/dist/chunk-WM26XK7I.js.map +0 -1
  593. package/dist/chunk-XDNLUEXI.js +0 -138
  594. package/dist/chunk-XJ2HZOBU.js.map +0 -1
  595. package/dist/chunk-ZZ2SS7NI.js +0 -237
  596. package/dist/chunk-ZZ2SS7NI.js.map +0 -1
  597. package/dist/database-C6jy7EOu.d.ts +0 -500
  598. package/dist/organisation-D6qRDtbF.d.ts +0 -93
  599. package/dist/schema-DTDZQe2u.d.ts +0 -28
  600. package/dist/unified-DQ4VcT7H.d.ts +0 -198
  601. package/dist/useInactivityTracker-TO6ZOF35.js +0 -11
  602. package/dist/validation.d.ts +0 -47
  603. package/dist/validation.js +0 -24
  604. package/dist/validation.js.map +0 -1
  605. package/docs/DOCUMENTATION_AUDIT.md +0 -172
  606. package/docs/DOCUMENTATION_STANDARD.md +0 -137
  607. package/docs/api/classes/PublicErrorBoundary.md +0 -132
  608. package/docs/api/interfaces/EventLogoProps.md +0 -152
  609. package/docs/api/interfaces/PublicErrorBoundaryProps.md +0 -94
  610. package/docs/api/interfaces/PublicErrorBoundaryState.md +0 -68
  611. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +0 -86
  612. package/docs/architecture/rpc-function-standards.md +0 -1106
  613. package/docs/getting-started/consuming-app-vite-config.md +0 -239
  614. package/docs/implementation-guides/event-theming-summary.md +0 -226
  615. package/docs/implementation-guides/public-pages-advanced.md +0 -1038
  616. package/docs/migration/v0.4.15-tailwind-scanning.md +0 -278
  617. package/docs/migration/v0.4.16-css-first-approach.md +0 -312
  618. package/docs/migration/v0.4.17-source-path-fix.md +0 -235
  619. package/docs/rbac/RBAC_EVENT_CONTEXT_LOADING.md +0 -222
  620. package/docs/rbac/RBAC_LOGIN_SAFETY_FIX.md +0 -95
  621. package/docs/rbac/RBAC_V0.5.147_FIX.md +0 -117
  622. package/docs/rbac/README-rbac-rls-integration.md +0 -374
  623. package/docs/styles/usage.md +0 -227
  624. package/docs/testing/visual-testing.md +0 -120
  625. package/docs/troubleshooting/DEBUG_NETWORK_ERROR.md +0 -152
  626. package/docs/troubleshooting/FIX_SUPABASE_CORS.md +0 -184
  627. package/docs/troubleshooting/cake-page-permission-guard-issue-summary.md +0 -193
  628. package/docs/troubleshooting/database-view-compatibility.md +0 -125
  629. package/docs/troubleshooting/react-hooks-issue-analysis.md +0 -172
  630. package/docs/troubleshooting/tailwind-content-scanning.md +0 -219
  631. package/examples/RBAC/EventBasedApp.tsx +0 -239
  632. package/examples/RBAC/PermissionExample.tsx +0 -151
  633. package/examples/STRUCTURE.md +0 -125
  634. package/examples/components 2/Dialog/BasicHtmlTest.tsx +0 -55
  635. package/examples/components 2/Dialog/DebugHtmlExample.tsx +0 -68
  636. package/examples/components 2/Dialog/HtmlDialogExample.tsx +0 -202
  637. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +0 -61
  638. package/examples/components 2/Dialog/SmartDialogExample.tsx +0 -322
  639. package/examples/components 2/index.ts +0 -11
  640. package/examples/features/index.ts +0 -12
  641. package/examples/features/rbac/CompleteRBACExample.tsx +0 -324
  642. package/examples/features/rbac/index.ts +0 -13
  643. package/examples/public-pages/CorrectPublicPageImplementation.tsx +0 -301
  644. package/examples/public-pages/PublicEventPage.tsx +0 -274
  645. package/examples/public-pages/PublicPageApp.tsx +0 -308
  646. package/examples/public-pages/PublicPageUsageExample.tsx +0 -216
  647. package/examples/public-pages/index.ts +0 -14
  648. package/src/__tests__/TEST_STANDARD.md +0 -1008
  649. package/src/components/Checkbox/__mocks__/Checkbox.tsx +0 -2
  650. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +0 -421
  651. package/src/components/DataTable/examples/HierarchicalExample.tsx +0 -475
  652. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +0 -177
  653. package/src/components/DataTable/examples/PerformanceExample.tsx +0 -506
  654. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +0 -316
  655. package/src/components/DataTable/examples/__tests__/HierarchicalExample.test.tsx +0 -45
  656. package/src/components/DataTable/examples/__tests__/InitialPageSizeExample.test.tsx +0 -211
  657. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +0 -126
  658. package/src/components/Dialog/README.md +0 -804
  659. package/src/components/Dialog/examples/BasicHtmlTest.tsx +0 -55
  660. package/src/components/Dialog/examples/DebugHtmlExample.tsx +0 -68
  661. package/src/components/Dialog/examples/ScrollableDialogExample.tsx +0 -290
  662. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +0 -61
  663. package/src/components/Dialog/examples/__tests__/HtmlDialogExample.test.tsx +0 -71
  664. package/src/components/Dialog/examples/__tests__/SimpleHtmlTest.test.tsx +0 -122
  665. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +0 -147
  666. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +0 -611
  667. package/src/components/Dialog/utils/safeHtml.ts +0 -185
  668. package/src/components/EventSelector/types.ts +0 -79
  669. package/src/components/Form/FormErrorSummary.tsx +0 -113
  670. package/src/components/Form/FormField.tsx +0 -249
  671. package/src/components/Form/FormFieldset.tsx +0 -127
  672. package/src/components/Form/FormLiveRegion.tsx +0 -198
  673. package/src/components/Input/__mocks__/Input.tsx +0 -2
  674. package/src/components/NavigationMenu/types.ts +0 -85
  675. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +0 -326
  676. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -1078
  677. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  678. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  679. package/src/components/PasswordReset/index.ts +0 -2
  680. package/src/components/ProtectedRoute/README.md +0 -164
  681. package/src/components/PublicLayout/EventLogo.tsx +0 -175
  682. package/src/components/PublicLayout/PublicErrorBoundary.tsx +0 -282
  683. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +0 -216
  684. package/src/components/PublicLayout/PublicPageContextChecker.tsx +0 -131
  685. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  686. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  687. package/src/components/PublicLayout/PublicPageFooter.tsx +0 -124
  688. package/src/components/PublicLayout/PublicPageHeader.tsx +0 -209
  689. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +0 -449
  690. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +0 -393
  691. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +0 -192
  692. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +0 -351
  693. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +0 -402
  694. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +0 -460
  695. package/src/components/PublicLayout/__tests__/PublicPageProvider.test.tsx +0 -313
  696. package/src/components/Select/hooks.ts +0 -289
  697. package/src/hooks/useCounter.test.ts +0 -131
  698. package/src/hooks/useDebounce.test.ts +0 -375
  699. package/src/providers/AuthProvider.tsx +0 -15
  700. package/src/providers/EventProvider.tsx +0 -16
  701. package/src/providers/InactivityProvider.tsx +0 -15
  702. package/src/providers/OrganisationProvider.context.test.tsx +0 -169
  703. package/src/providers/UnifiedAuthProvider.tsx +0 -15
  704. package/src/types/theme.ts +0 -6
  705. package/src/types/unified.ts +0 -265
  706. package/src/utils/appConfig.ts +0 -47
  707. package/src/utils/appIdResolver.test.ts +0 -499
  708. package/src/utils/appIdResolver.ts +0 -130
  709. package/src/utils/appNameResolver.simple.test.ts +0 -212
  710. package/src/utils/appNameResolver.test.ts +0 -121
  711. package/src/utils/appNameResolver.ts +0 -191
  712. package/src/utils/audit.ts +0 -127
  713. package/src/utils/auth-utils.ts +0 -96
  714. package/src/utils/bundleAnalysis.ts +0 -129
  715. package/src/utils/debugLogger.ts +0 -67
  716. package/src/utils/deviceFingerprint.ts +0 -215
  717. package/src/utils/dynamicUtils.ts +0 -105
  718. package/src/utils/file-reference.test.ts +0 -788
  719. package/src/utils/file-reference.ts +0 -519
  720. package/src/utils/formatDate.test.ts +0 -237
  721. package/src/utils/formatting.ts +0 -170
  722. package/src/utils/lazyLoad.tsx +0 -44
  723. package/src/utils/logger.ts +0 -179
  724. package/src/utils/organisationContext.test.ts +0 -322
  725. package/src/utils/organisationContext.ts +0 -153
  726. package/src/utils/performanceBenchmark.ts +0 -64
  727. package/src/utils/performanceBudgets.ts +0 -110
  728. package/src/utils/permissionTypes.ts +0 -37
  729. package/src/utils/permissionUtils.test.ts +0 -393
  730. package/src/utils/permissionUtils.ts +0 -34
  731. package/src/utils/sanitization.ts +0 -264
  732. package/src/utils/schemaUtils.ts +0 -37
  733. package/src/utils/secureDataAccess.test.ts +0 -711
  734. package/src/utils/secureDataAccess.ts +0 -377
  735. package/src/utils/secureErrors.ts +0 -79
  736. package/src/utils/security.ts +0 -156
  737. package/src/utils/securityMonitor.ts +0 -45
  738. package/src/utils/sessionTracking.ts +0 -126
  739. package/src/utils/validation.ts +0 -111
  740. package/src/utils/validationUtils.ts +0 -120
  741. package/src/validation/index.ts +0 -12
  742. /package/dist/{DataTable-4VSEJQ7D.js.map → DataTable-QAB34V6K.js.map} +0 -0
  743. /package/dist/{UnifiedAuthProvider-BMJAP6Z7.js.map → UnifiedAuthProvider-7F6T4B6K.js.map} +0 -0
  744. /package/dist/{api-45XYYO2A.js.map → api-ROMBCNKU.js.map} +0 -0
  745. /package/dist/{audit-64X3VJXB.js.map → audit-WRS3KJKI.js.map} +0 -0
  746. /package/dist/{chunk-PLDDJCW6.js.map → chunk-7D4SUZUM.js.map} +0 -0
  747. /package/dist/{useInactivityTracker-TO6ZOF35.js.map → chunk-KQCRWDSA.js.map} +0 -0
  748. /package/examples/{components 2/DataTable → DataTable}/InitialPageSizeExample.tsx +0 -0
  749. /package/examples/{features/public-pages → PublicPages}/index.ts +0 -0
  750. /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