@jmruthers/pace-core 0.6.5 → 0.6.7

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 (473) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -403
  3. package/audit-tool/00-dependencies.cjs +394 -0
  4. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  5. package/audit-tool/audits/02-project-structure.cjs +255 -0
  6. package/audit-tool/audits/03-architecture.cjs +196 -0
  7. package/audit-tool/audits/04-code-quality.cjs +149 -0
  8. package/audit-tool/audits/05-styling.cjs +224 -0
  9. package/audit-tool/audits/06-security-rbac.cjs +544 -0
  10. package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
  11. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  12. package/audit-tool/audits/09-operations.cjs +208 -0
  13. package/audit-tool/index.cjs +291 -0
  14. package/audit-tool/utils/code-utils.cjs +218 -0
  15. package/audit-tool/utils/file-utils.cjs +230 -0
  16. package/audit-tool/utils/report-utils.cjs +241 -0
  17. package/core-usage-manifest.json +93 -0
  18. package/cursor-rules/00-standards-overview.mdc +156 -0
  19. package/cursor-rules/01-pace-core-compliance.mdc +586 -0
  20. package/cursor-rules/02-project-structure.mdc +42 -4
  21. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +126 -10
  22. package/cursor-rules/04-code-quality.mdc +419 -0
  23. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +104 -34
  24. package/cursor-rules/06-security-rbac.mdc +518 -0
  25. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  26. package/cursor-rules/08-testing-documentation.mdc +324 -0
  27. package/cursor-rules/09-operations.mdc +365 -0
  28. package/dist/{AuthService-Cb34EQs3.d.ts → AuthService-DmfO5rGS.d.ts} +10 -0
  29. package/dist/DataTable-7PMH7XN7.js +15 -0
  30. package/dist/{DataTable-BMRU8a1j.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  31. package/dist/{PublicPageProvider-QTFVrL-Z.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +33 -72
  32. package/dist/UnifiedAuthProvider-ZT6TIGM7.js +7 -0
  33. package/dist/api-Y4MQWOFW.js +4 -0
  34. package/dist/audit-MYQXYZFU.js +3 -0
  35. package/dist/{chunk-DGUM43GV.js → chunk-3RG5ZIWI.js} +1 -4
  36. package/dist/{chunk-QXHPKYJV.js → chunk-4SXLQIZO.js} +1 -26
  37. package/dist/{chunk-UPPMRMYG.js → chunk-5X4QLXRG.js} +73 -151
  38. package/dist/chunk-6F3IILHI.js +62 -0
  39. package/dist/{chunk-E66EQZE6.js → chunk-6GLLNA6U.js} +3 -9
  40. package/dist/{chunk-ZSAAAMVR.js → chunk-6QYDGKQY.js} +1 -4
  41. package/dist/{chunk-FMUCXFII.js → chunk-7ILTDCL2.js} +9 -5
  42. package/dist/{chunk-M43Y4SSO.js → chunk-A3W6LW53.js} +15 -13
  43. package/dist/{chunk-63FOKYGO.js → chunk-AHU7G2R5.js} +2 -11
  44. package/dist/{chunk-HU2C6SSC.js → chunk-BM4CQ5P3.js} +606 -559
  45. package/dist/chunk-C7NSAPTL.js +1 -0
  46. package/dist/{chunk-J36DSWQK.js → chunk-FEJLJNWA.js} +7 -41
  47. package/dist/{chunk-IHB5DR3H.js → chunk-FTCRZOG2.js} +188 -387
  48. package/dist/{chunk-G37KK66H.js → chunk-FYHN4DD5.js} +60 -19
  49. package/dist/chunk-GHYHJTYV.js +994 -0
  50. package/dist/{chunk-VBXEHIUJ.js → chunk-HF6O3O37.js} +6 -88
  51. package/dist/{chunk-FFQEQTNW.js → chunk-IUBRCBSY.js} +134 -45
  52. package/dist/{chunk-6COVEUS7.js → chunk-JGWDVX64.js} +983 -1034
  53. package/dist/{chunk-RGAWHO7N.js → chunk-L4XMVJKY.js} +77 -222
  54. package/dist/chunk-MBADTM7L.js +64 -0
  55. package/dist/{chunk-M7MPQISP.js → chunk-OJ4SKRSV.js} +3 -16
  56. package/dist/{chunk-IVOFDYWT.js → chunk-Q7Q7V5NV.js} +2109 -1604
  57. package/dist/{chunk-JGRYX5UX.js → chunk-S7DKJPLT.js} +29 -58
  58. package/dist/{chunk-PWLANIRT.js → chunk-TTRFSOKR.js} +1 -7
  59. package/dist/{chunk-5DRSZLL2.js → chunk-UH3NTO3F.js} +1 -6
  60. package/dist/{chunk-NTM7ZSB6.js → chunk-VBCS3DUA.js} +261 -168
  61. package/dist/{chunk-EFN2EIMK.js → chunk-ZFYPMX46.js} +271 -87
  62. package/dist/{chunk-L4OXEN46.js → chunk-ZKAWKYT4.js} +10 -24
  63. package/dist/components.d.ts +7 -5
  64. package/dist/components.js +46 -257
  65. package/dist/{database.generated-CzIvgcPu.d.ts → database.generated-CcnC_DRc.d.ts} +4795 -3691
  66. package/dist/eslint-rules/index.cjs +35 -0
  67. package/{src/eslint-rules/pace-core-compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +234 -235
  68. package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
  69. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  70. package/dist/eslint-rules/rules/06-security-rbac.cjs +806 -0
  71. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
  72. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  73. package/dist/eslint-rules/utils/helpers.cjs +42 -0
  74. package/dist/eslint-rules/utils/manifest-loader.cjs +75 -0
  75. package/dist/hooks.d.ts +6 -6
  76. package/dist/hooks.js +62 -172
  77. package/dist/icons/index.d.ts +1 -0
  78. package/dist/icons/index.js +1 -0
  79. package/dist/index.d.ts +12 -11
  80. package/dist/index.js +67 -660
  81. package/dist/providers.d.ts +2 -2
  82. package/dist/providers.js +8 -35
  83. package/dist/rbac/eslint-rules.d.ts +46 -44
  84. package/dist/rbac/eslint-rules.js +7 -4
  85. package/dist/rbac/index.d.ts +109 -586
  86. package/dist/rbac/index.js +14 -207
  87. package/dist/styles/index.js +2 -12
  88. package/dist/theming/runtime.d.ts +14 -1
  89. package/dist/theming/runtime.js +3 -19
  90. package/dist/{timezone-CHhWg6b4.d.ts → timezone-BZe_eUxx.d.ts} +175 -1
  91. package/dist/{types-CkbwOr4Y.d.ts → types-DXstZpNI.d.ts} +4 -17
  92. package/dist/types-t9H8qKRw.d.ts +55 -0
  93. package/dist/types.d.ts +1 -1
  94. package/dist/types.js +7 -94
  95. package/dist/{usePublicRouteParams-ClnV4tnv.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +20 -20
  96. package/dist/utils.d.ts +24 -117
  97. package/dist/utils.js +54 -392
  98. package/docs/README.md +17 -7
  99. package/docs/api/README.md +4 -402
  100. package/docs/api/modules.md +301 -871
  101. package/docs/api-reference/components.md +21 -21
  102. package/docs/api-reference/deprecated.md +31 -6
  103. package/docs/api-reference/hooks.md +80 -80
  104. package/docs/api-reference/rpc-functions.md +78 -3
  105. package/docs/api-reference/types.md +1 -1
  106. package/docs/api-reference/utilities.md +1 -1
  107. package/docs/architecture/README.md +1 -1
  108. package/docs/core-concepts/events.md +3 -3
  109. package/docs/core-concepts/organisations.md +6 -6
  110. package/docs/core-concepts/permissions.md +6 -6
  111. package/docs/documentation-index.md +12 -18
  112. package/docs/getting-started/cursor-rules.md +3 -23
  113. package/docs/getting-started/dependencies.md +650 -0
  114. package/docs/getting-started/documentation-index.md +1 -1
  115. package/docs/getting-started/examples/README.md +4 -4
  116. package/docs/getting-started/examples/full-featured-app.md +1 -1
  117. package/docs/getting-started/faq.md +2 -2
  118. package/docs/getting-started/installation-guide.md +20 -7
  119. package/docs/getting-started/quick-reference.md +4 -4
  120. package/docs/getting-started/quick-start.md +23 -12
  121. package/docs/implementation-guides/authentication.md +15 -15
  122. package/docs/implementation-guides/component-styling.md +1 -1
  123. package/docs/implementation-guides/data-tables.md +126 -33
  124. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  125. package/docs/implementation-guides/dynamic-colors.md +3 -3
  126. package/docs/implementation-guides/file-upload-storage.md +2 -2
  127. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  128. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  129. package/docs/implementation-guides/large-datasets.md +3 -2
  130. package/docs/implementation-guides/organisation-security.md +2 -2
  131. package/docs/implementation-guides/performance.md +2 -2
  132. package/docs/implementation-guides/permission-enforcement.md +5 -1
  133. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  134. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  135. package/docs/rbac/MIGRATION_GUIDE.md +819 -0
  136. package/docs/rbac/RBAC_CONTRACT.md +724 -0
  137. package/docs/rbac/README.md +17 -8
  138. package/docs/rbac/advanced-patterns.md +6 -6
  139. package/docs/rbac/api-reference.md +20 -20
  140. package/docs/rbac/edge-functions-guide.md +376 -0
  141. package/docs/rbac/event-based-apps.md +3 -3
  142. package/docs/rbac/examples.md +41 -41
  143. package/docs/rbac/getting-started.md +37 -37
  144. package/docs/rbac/performance.md +1 -1
  145. package/docs/rbac/quick-start.md +52 -52
  146. package/docs/rbac/secure-client-protection.md +1 -35
  147. package/docs/rbac/troubleshooting.md +1 -1
  148. package/docs/security/README.md +5 -5
  149. package/docs/standards/0-standards-overview.md +220 -0
  150. package/docs/standards/1-pace-core-compliance-standards.md +986 -0
  151. package/docs/standards/2-project-structure-standards.md +949 -0
  152. package/docs/standards/3-architecture-standards.md +606 -0
  153. package/docs/standards/4-code-quality-standards.md +728 -0
  154. package/docs/standards/5-styling-standards.md +348 -0
  155. package/docs/standards/{07-rbac-and-rls-standard.md → 6-security-rbac-standards.md} +269 -66
  156. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  157. package/docs/standards/8-testing-documentation-standards.md +401 -0
  158. package/docs/standards/9-operations-standards.md +1102 -0
  159. package/docs/standards/README.md +185 -57
  160. package/docs/troubleshooting/README.md +4 -4
  161. package/docs/troubleshooting/common-issues.md +2 -2
  162. package/docs/troubleshooting/debugging.md +9 -9
  163. package/docs/troubleshooting/migration.md +4 -4
  164. package/docs/troubleshooting/organisation-context-setup.md +42 -19
  165. package/eslint-config-pace-core.cjs +33 -6
  166. package/package.json +35 -23
  167. package/scripts/install-cursor-rules.cjs +25 -6
  168. package/scripts/install-eslint-config.cjs +284 -0
  169. package/src/__tests__/fixtures/supabase.ts +1 -1
  170. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +3 -3
  171. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +1 -1
  172. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +1 -1
  173. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  174. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +13 -13
  175. package/src/__tests__/helpers/component-test-utils.tsx +1 -1
  176. package/src/__tests__/helpers/supabaseMock.ts +2 -2
  177. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  178. package/src/__tests__/public-recipe-view.test.ts +38 -9
  179. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  180. package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
  181. package/src/__tests__/templates/component.test.template.tsx +18 -15
  182. package/src/components/Button/Button.tsx +5 -1
  183. package/src/components/Calendar/Calendar.tsx +201 -47
  184. package/src/components/ContextSelector/ContextSelector.tsx +106 -119
  185. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  186. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
  187. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
  188. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  189. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  190. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  191. package/src/components/DataTable/components/DataTableCore.tsx +186 -13
  192. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  193. package/src/components/DataTable/components/DataTableLayout.tsx +35 -21
  194. package/src/components/DataTable/components/EditFields.tsx +23 -3
  195. package/src/components/DataTable/components/EditableRow.tsx +12 -9
  196. package/src/components/DataTable/components/EmptyState.tsx +10 -9
  197. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  198. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  199. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  200. package/src/components/DataTable/components/RowComponent.tsx +12 -0
  201. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  202. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  203. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  204. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  205. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  206. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  207. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
  208. package/src/components/DataTable/components/hooks/usePermissionTracking.ts +0 -4
  209. package/src/components/DataTable/components/index.ts +2 -1
  210. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +51 -47
  211. package/src/components/DataTable/hooks/useDataTablePermissions.ts +24 -21
  212. package/src/components/DataTable/hooks/useDataTableState.ts +125 -9
  213. package/src/components/DataTable/hooks/useTableColumns.ts +40 -2
  214. package/src/components/DataTable/hooks/useTableHandlers.ts +11 -0
  215. package/src/components/DataTable/types.ts +5 -18
  216. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  217. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
  218. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  219. package/src/components/DateTimeField/DateTimeField.tsx +10 -9
  220. package/src/components/Dialog/Dialog.test.tsx +128 -104
  221. package/src/components/Dialog/Dialog.tsx +742 -24
  222. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  223. package/src/components/FileDisplay/FileDisplay.test.tsx +4 -2
  224. package/src/components/FileDisplay/FileDisplay.tsx +23 -17
  225. package/src/components/FileUpload/FileUpload.test.tsx +52 -14
  226. package/src/components/FileUpload/FileUpload.tsx +112 -130
  227. package/src/components/Form/Form.test.tsx +6 -8
  228. package/src/components/Form/Form.tsx +365 -4
  229. package/src/components/NavigationMenu/NavigationMenu.test.tsx +14 -13
  230. package/src/components/NavigationMenu/useNavigationFiltering.ts +11 -21
  231. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +6 -4
  232. package/src/components/PaceAppLayout/PaceAppLayout.tsx +11 -15
  233. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +108 -61
  234. package/src/components/PaceLoginPage/PaceLoginPage.tsx +27 -3
  235. package/src/components/Progress/Progress.tsx +2 -4
  236. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  237. package/src/components/Select/Select.tsx +109 -98
  238. package/src/components/Select/types.ts +4 -1
  239. package/src/components/UserMenu/UserMenu.tsx +9 -6
  240. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  241. package/src/hooks/__tests__/hooks.integration.test.tsx +55 -57
  242. package/src/hooks/__tests__/useAppConfig.unit.test.ts +129 -67
  243. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
  244. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +149 -67
  245. package/src/hooks/__tests__/usePublicEvent.test.ts +149 -79
  246. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +158 -109
  247. package/src/hooks/__tests__/useSessionDraft.test.ts +163 -0
  248. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +10 -5
  249. package/src/hooks/public/usePublicEvent.ts +67 -195
  250. package/src/hooks/public/usePublicEventLogo.test.ts +70 -17
  251. package/src/hooks/public/usePublicEventLogo.ts +24 -14
  252. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  253. package/src/hooks/public/usePublicRouteParams.ts +5 -5
  254. package/src/hooks/useAppConfig.ts +28 -26
  255. package/src/hooks/useEventTheme.test.ts +217 -239
  256. package/src/hooks/useEventTheme.ts +16 -28
  257. package/src/hooks/useFileDisplay.ts +2 -2
  258. package/src/hooks/useOrganisationPermissions.ts +5 -7
  259. package/src/hooks/useQueryCache.ts +0 -1
  260. package/src/hooks/useSessionDraft.ts +380 -0
  261. package/src/hooks/useSessionRestoration.ts +3 -1
  262. package/src/icons/index.ts +27 -0
  263. package/src/index.ts +5 -0
  264. package/src/providers/OrganisationProvider.tsx +23 -14
  265. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  266. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  267. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  268. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  269. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  270. package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
  271. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  272. package/src/providers/services/EventServiceProvider.tsx +1 -24
  273. package/src/providers/services/UnifiedAuthProvider.tsx +5 -48
  274. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  275. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +13 -10
  276. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +7 -457
  277. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +33 -7
  278. package/src/rbac/adapters.tsx +7 -295
  279. package/src/rbac/api.test.ts +44 -56
  280. package/src/rbac/api.ts +10 -17
  281. package/src/rbac/cache-invalidation.ts +0 -1
  282. package/src/rbac/compliance/index.ts +10 -0
  283. package/src/rbac/compliance/pattern-detector.ts +553 -0
  284. package/src/rbac/compliance/runtime-compliance.ts +22 -0
  285. package/src/rbac/components/AccessDenied.tsx +150 -0
  286. package/src/rbac/components/NavigationGuard.tsx +12 -20
  287. package/src/rbac/components/PagePermissionGuard.tsx +4 -24
  288. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +21 -8
  289. package/src/rbac/components/index.ts +3 -41
  290. package/src/rbac/eslint-rules.js +1 -1
  291. package/src/rbac/hooks/index.ts +0 -3
  292. package/src/rbac/hooks/permissions/index.ts +0 -3
  293. package/src/rbac/hooks/permissions/useAccessLevel.ts +4 -8
  294. package/src/rbac/hooks/usePermissions.ts +0 -3
  295. package/src/rbac/hooks/useResolvedScope.test.ts +57 -47
  296. package/src/rbac/hooks/useResolvedScope.ts +58 -140
  297. package/src/rbac/hooks/useResourcePermissions.test.ts +124 -38
  298. package/src/rbac/hooks/useResourcePermissions.ts +139 -48
  299. package/src/rbac/hooks/useRoleManagement.test.ts +65 -22
  300. package/src/rbac/hooks/useRoleManagement.ts +147 -19
  301. package/src/rbac/hooks/useSecureSupabase.ts +4 -8
  302. package/src/rbac/index.ts +7 -9
  303. package/src/rbac/utils/contextValidator.ts +9 -7
  304. package/src/services/AuthService.ts +130 -18
  305. package/src/services/EventService.ts +4 -97
  306. package/src/services/InactivityService.ts +16 -0
  307. package/src/services/OrganisationService.ts +7 -44
  308. package/src/services/__tests__/OrganisationService.test.ts +26 -8
  309. package/src/services/base/BaseService.ts +0 -3
  310. package/src/styles/core.css +7 -0
  311. package/src/theming/__tests__/parseEventColours.test.ts +9 -3
  312. package/src/theming/parseEventColours.ts +22 -10
  313. package/src/types/database.generated.ts +4733 -3809
  314. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  315. package/src/utils/__tests__/organisationContext.unit.test.ts +9 -10
  316. package/src/utils/context/organisationContext.test.ts +13 -28
  317. package/src/utils/context/organisationContext.ts +21 -52
  318. package/src/utils/dynamic/dynamicUtils.ts +1 -1
  319. package/src/utils/file-reference/index.ts +39 -15
  320. package/src/utils/formatting/formatDateTime.test.ts +3 -2
  321. package/src/utils/google-places/loadGoogleMapsScript.ts +29 -4
  322. package/src/utils/index.ts +4 -1
  323. package/src/utils/persistence/__tests__/keyDerivation.test.ts +135 -0
  324. package/src/utils/persistence/__tests__/sensitiveFieldDetection.test.ts +123 -0
  325. package/src/utils/persistence/keyDerivation.ts +304 -0
  326. package/src/utils/persistence/sensitiveFieldDetection.ts +212 -0
  327. package/src/utils/security/secureStorage.ts +5 -5
  328. package/src/utils/storage/README.md +1 -1
  329. package/src/utils/storage/helpers.ts +3 -3
  330. package/src/utils/supabase/createBaseClient.ts +147 -0
  331. package/src/utils/timezone/timezone.test.ts +1 -2
  332. package/src/utils/timezone/timezone.ts +1 -1
  333. package/src/utils/validation/csrf.ts +4 -4
  334. package/cursor-rules/00-pace-core-compliance.mdc +0 -331
  335. package/cursor-rules/01-standards-compliance.mdc +0 -244
  336. package/cursor-rules/04-testing-standards.mdc +0 -268
  337. package/cursor-rules/05-bug-reports-and-features.mdc +0 -246
  338. package/cursor-rules/06-code-quality.mdc +0 -309
  339. package/cursor-rules/07-tech-stack-compliance.mdc +0 -214
  340. package/cursor-rules/CHANGELOG.md +0 -119
  341. package/cursor-rules/README.md +0 -192
  342. package/dist/DataTable-AOVNCPTX.js +0 -175
  343. package/dist/DataTable-AOVNCPTX.js.map +0 -1
  344. package/dist/UnifiedAuthProvider-4SBX4LU5.js +0 -18
  345. package/dist/UnifiedAuthProvider-4SBX4LU5.js.map +0 -1
  346. package/dist/api-O6HTBX5Y.js +0 -52
  347. package/dist/api-O6HTBX5Y.js.map +0 -1
  348. package/dist/audit-V53FV5AG.js +0 -17
  349. package/dist/audit-V53FV5AG.js.map +0 -1
  350. package/dist/chunk-5DRSZLL2.js.map +0 -1
  351. package/dist/chunk-63FOKYGO.js.map +0 -1
  352. package/dist/chunk-6COVEUS7.js.map +0 -1
  353. package/dist/chunk-AFVQODI2.js +0 -263
  354. package/dist/chunk-AFVQODI2.js.map +0 -1
  355. package/dist/chunk-DGUM43GV.js.map +0 -1
  356. package/dist/chunk-E66EQZE6.js.map +0 -1
  357. package/dist/chunk-EFN2EIMK.js.map +0 -1
  358. package/dist/chunk-FFQEQTNW.js.map +0 -1
  359. package/dist/chunk-FMUCXFII.js.map +0 -1
  360. package/dist/chunk-G37KK66H.js.map +0 -1
  361. package/dist/chunk-G7QEZTYQ.js +0 -2053
  362. package/dist/chunk-G7QEZTYQ.js.map +0 -1
  363. package/dist/chunk-HU2C6SSC.js.map +0 -1
  364. package/dist/chunk-IHB5DR3H.js.map +0 -1
  365. package/dist/chunk-IVOFDYWT.js.map +0 -1
  366. package/dist/chunk-J36DSWQK.js.map +0 -1
  367. package/dist/chunk-JGRYX5UX.js.map +0 -1
  368. package/dist/chunk-KQCRWDSA.js +0 -1
  369. package/dist/chunk-KQCRWDSA.js.map +0 -1
  370. package/dist/chunk-L4OXEN46.js.map +0 -1
  371. package/dist/chunk-LMC26NLJ.js +0 -84
  372. package/dist/chunk-LMC26NLJ.js.map +0 -1
  373. package/dist/chunk-M43Y4SSO.js.map +0 -1
  374. package/dist/chunk-M7MPQISP.js.map +0 -1
  375. package/dist/chunk-NTM7ZSB6.js.map +0 -1
  376. package/dist/chunk-PWLANIRT.js.map +0 -1
  377. package/dist/chunk-QXHPKYJV.js.map +0 -1
  378. package/dist/chunk-RGAWHO7N.js.map +0 -1
  379. package/dist/chunk-UPPMRMYG.js.map +0 -1
  380. package/dist/chunk-VBXEHIUJ.js.map +0 -1
  381. package/dist/chunk-ZSAAAMVR.js.map +0 -1
  382. package/dist/components.js.map +0 -1
  383. package/dist/contextValidator-5OGXSPKS.js +0 -9
  384. package/dist/contextValidator-5OGXSPKS.js.map +0 -1
  385. package/dist/eslint-rules/pace-core-compliance.cjs +0 -510
  386. package/dist/hooks.js.map +0 -1
  387. package/dist/index.js.map +0 -1
  388. package/dist/providers.js.map +0 -1
  389. package/dist/rbac/eslint-rules.js.map +0 -1
  390. package/dist/rbac/index.js.map +0 -1
  391. package/dist/styles/index.js.map +0 -1
  392. package/dist/theming/runtime.js.map +0 -1
  393. package/dist/types.js.map +0 -1
  394. package/dist/utils.js.map +0 -1
  395. package/docs/best-practices/README.md +0 -472
  396. package/docs/best-practices/accessibility.md +0 -601
  397. package/docs/best-practices/common-patterns.md +0 -516
  398. package/docs/best-practices/deployment.md +0 -1103
  399. package/docs/best-practices/performance.md +0 -1328
  400. package/docs/best-practices/security.md +0 -940
  401. package/docs/best-practices/testing.md +0 -1034
  402. package/docs/rbac/compliance/compliance-guide.md +0 -544
  403. package/docs/standards/01-architecture-standard.md +0 -44
  404. package/docs/standards/02-api-and-rpc-standard.md +0 -39
  405. package/docs/standards/03-component-standard.md +0 -32
  406. package/docs/standards/04-code-style-standard.md +0 -32
  407. package/docs/standards/05-security-standard.md +0 -44
  408. package/docs/standards/06-testing-and-docs-standard.md +0 -29
  409. package/docs/standards/pace-core-compliance.md +0 -432
  410. package/scripts/audit/core/checks/accessibility.cjs +0 -197
  411. package/scripts/audit/core/checks/api-usage.cjs +0 -191
  412. package/scripts/audit/core/checks/bundle.cjs +0 -142
  413. package/scripts/audit/core/checks/compliance.cjs +0 -2706
  414. package/scripts/audit/core/checks/config.cjs +0 -54
  415. package/scripts/audit/core/checks/coverage.cjs +0 -84
  416. package/scripts/audit/core/checks/dependencies.cjs +0 -994
  417. package/scripts/audit/core/checks/documentation.cjs +0 -268
  418. package/scripts/audit/core/checks/environment.cjs +0 -116
  419. package/scripts/audit/core/checks/error-handling.cjs +0 -340
  420. package/scripts/audit/core/checks/forms.cjs +0 -172
  421. package/scripts/audit/core/checks/heuristics.cjs +0 -68
  422. package/scripts/audit/core/checks/hooks.cjs +0 -334
  423. package/scripts/audit/core/checks/imports.cjs +0 -244
  424. package/scripts/audit/core/checks/performance.cjs +0 -325
  425. package/scripts/audit/core/checks/routes.cjs +0 -117
  426. package/scripts/audit/core/checks/state.cjs +0 -130
  427. package/scripts/audit/core/checks/structure.cjs +0 -65
  428. package/scripts/audit/core/checks/style.cjs +0 -584
  429. package/scripts/audit/core/checks/testing.cjs +0 -122
  430. package/scripts/audit/core/checks/typescript.cjs +0 -61
  431. package/scripts/audit/core/scanner.cjs +0 -199
  432. package/scripts/audit/core/utils.cjs +0 -137
  433. package/scripts/audit/index.cjs +0 -223
  434. package/scripts/audit/reporters/console.cjs +0 -151
  435. package/scripts/audit/reporters/json.cjs +0 -54
  436. package/scripts/audit/reporters/markdown.cjs +0 -124
  437. package/scripts/audit-consuming-app.cjs +0 -86
  438. package/src/components/DataTable/components/DataTableBody.tsx +0 -454
  439. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  440. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  441. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  442. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  443. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  444. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  445. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  446. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  447. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  448. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  449. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  450. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  451. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  452. package/src/components/DataTable/utils/debugTools.ts +0 -514
  453. package/src/eslint-rules/pace-core-compliance.js +0 -638
  454. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +0 -555
  455. package/src/rbac/components/EnhancedNavigationMenu.tsx +0 -293
  456. package/src/rbac/components/NavigationProvider.test.tsx +0 -481
  457. package/src/rbac/components/NavigationProvider.tsx +0 -345
  458. package/src/rbac/components/PagePermissionProvider.test.tsx +0 -476
  459. package/src/rbac/components/PagePermissionProvider.tsx +0 -279
  460. package/src/rbac/components/PermissionEnforcer.tsx +0 -312
  461. package/src/rbac/components/RoleBasedRouter.tsx +0 -440
  462. package/src/rbac/components/SecureDataProvider.test.tsx +0 -543
  463. package/src/rbac/components/SecureDataProvider.tsx +0 -339
  464. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +0 -620
  465. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +0 -726
  466. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +0 -661
  467. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +0 -881
  468. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +0 -783
  469. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +0 -645
  470. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +0 -659
  471. package/src/rbac/hooks/permissions/useCachedPermissions.ts +0 -79
  472. package/src/rbac/hooks/permissions/useHasAllPermissions.ts +0 -90
  473. package/src/rbac/hooks/permissions/useHasAnyPermission.ts +0 -90
@@ -71,13 +71,15 @@ import { Settings } from 'lucide-react'; // for icon example
71
71
 
72
72
  ### Accessibility
73
73
 
74
- - **Keyboard Navigation**: Fully keyboard accessible. Use `Enter` or `Space` to activate.
74
+ - **Keyboard Navigation**: Fully keyboard accessible via native HTML `<button>` element behavior. The `Enter` and `Space` keys automatically trigger button activation without requiring custom keyboard handlers. This is standard browser behavior for native button elements.
75
75
  - **ARIA Attributes**: Supports all standard ARIA attributes via `React.ButtonHTMLAttributes`.
76
76
  - **Disabled State**: When disabled, button is not focusable and has `aria-disabled="true"`.
77
77
  - **Icon Buttons**: Always provide `aria-label` for icon-only buttons for screen readers.
78
78
  - **Focus Management**: Visible focus indicators via `focus-visible` styles.
79
79
  - **Screen Readers**: Button text is automatically announced. Use descriptive labels.
80
80
 
81
+ **Note**: The Button component renders a native HTML `<button>` element, which provides built-in keyboard accessibility. No additional keyboard event handlers are required - the browser handles `Enter` and `Space` key activation automatically.
82
+
81
83
  ### Edge Cases
82
84
 
83
85
  - **asChild Prop**: When using `asChild`, the button renders as the child element (e.g., `<Link>`). The `type` attribute is not applied in this case.
@@ -282,8 +284,6 @@ interface HierarchicalConfig {
282
284
  defaultExpanded?: boolean | string[];
283
285
  /** Callback when expansion state changes */
284
286
  onExpandedChange?: (expandedIds: string[]) => void;
285
- /** Custom expand/collapse button component */
286
- expandButton?: React.ComponentType<ExpandButtonProps>;
287
287
  /** Indentation for child rows in pixels */
288
288
  indentSize?: number;
289
289
  /** CSS classes for parent rows */
@@ -1160,10 +1160,10 @@ function MyComponent() {
1160
1160
  };
1161
1161
 
1162
1162
  return (
1163
- <div>
1163
+ <section>
1164
1164
  <Button onClick={handleSuccess}>Save Changes</Button>
1165
1165
  <Button onClick={handleError}>Trigger Error</Button>
1166
- </div>
1166
+ </section>
1167
1167
  );
1168
1168
  }
1169
1169
 
@@ -1238,10 +1238,10 @@ import {
1238
1238
  <Button>Advanced Tooltip</Button>
1239
1239
  </TooltipTrigger>
1240
1240
  <TooltipContent side="top" className="bg-main-500 text-main-50">
1241
- <div className="space-y-1">
1241
+ <section className="space-y-1">
1242
1242
  <p className="font-semibold">Advanced Tooltip</p>
1243
1243
  <p className="text-xs">With custom styling</p>
1244
- </div>
1244
+ </section>
1245
1245
  </TooltipContent>
1246
1246
  </TooltipRoot>
1247
1247
  </TooltipProvider>
@@ -1287,7 +1287,7 @@ A complete application layout with header, navigation, and content area.
1287
1287
  import { PaceAppLayout } from '@jmruthers/pace-core';
1288
1288
 
1289
1289
  <PaceAppLayout>
1290
- <div>Your app content</div>
1290
+ <main>Your app content</main>
1291
1291
  </PaceAppLayout>
1292
1292
  ```
1293
1293
 
@@ -1573,10 +1573,10 @@ function App() {
1573
1573
  loginPath="/login"
1574
1574
  loadingFallback={<CustomLoader />}
1575
1575
  noEventsFallback={
1576
- <div>
1576
+ <section>
1577
1577
  <h2>No Events Available</h2>
1578
1578
  <p>Contact your administrator for access.</p>
1579
- </div>
1579
+ </section>
1580
1580
  }
1581
1581
  />
1582
1582
  }>
@@ -1787,7 +1787,7 @@ function PublicEventPage() {
1787
1787
  }
1788
1788
 
1789
1789
  if (error || !event) {
1790
- return <div>Event not found</div>;
1790
+ return <p>Event not found</p>;
1791
1791
  }
1792
1792
 
1793
1793
  return (
@@ -1883,9 +1883,9 @@ function MyFileUpload() {
1883
1883
  console.log('URL:', result.file_url);
1884
1884
  }}
1885
1885
  >
1886
- <div className="border-2 border-dashed border-main-300 rounded-lg p-8 text-center">
1886
+ <section className="border-2 border-dashed border-main-300 rounded-lg p-8 text-center">
1887
1887
  <p>Drag and drop files here or click to browse</p>
1888
- </div>
1888
+ </section>
1889
1889
  </FileUpload>
1890
1890
  );
1891
1891
  }
@@ -1925,7 +1925,7 @@ function MyApp() {
1925
1925
  });
1926
1926
 
1927
1927
  return (
1928
- <div>
1928
+ <main>
1929
1929
  <h1>My App</h1>
1930
1930
 
1931
1931
  <InactivityWarningModal
@@ -1936,7 +1936,7 @@ function MyApp() {
1936
1936
  title="Session Timeout Warning"
1937
1937
  message="You will be signed out due to inactivity."
1938
1938
  />
1939
- </div>
1939
+ </main>
1940
1940
  );
1941
1941
  }
1942
1942
  ```
@@ -1967,14 +1967,14 @@ import { EventLogo } from '@jmruthers/pace-core';
1967
1967
 
1968
1968
  function EventHeader({ eventId }: { eventId: string }) {
1969
1969
  return (
1970
- <div className="text-center">
1970
+ <section className="text-center">
1971
1971
  <EventLogo
1972
1972
  eventId={eventId}
1973
1973
  size="large"
1974
1974
  className="mx-auto mb-4"
1975
1975
  />
1976
1976
  <h1>Event Name</h1>
1977
- </div>
1977
+ </section>
1978
1978
  );
1979
1979
  }
1980
1980
  ```
@@ -2238,10 +2238,10 @@ import {
2238
2238
  - **[Component Styling](../styles/component-styling.md)** - How components are styled
2239
2239
  - **[Custom Themes](../styles/custom-themes.md)** - Creating custom themes
2240
2240
 
2241
- ### Best Practices
2242
- - **[Component Best Practices](../best-practices/README.md#component-usage)** - Component usage guidelines
2243
- - **[Performance Best Practices](../best-practices/performance.md)** - Performance optimization
2244
- - **[Accessibility Guidelines](../best-practices/README.md#accessibility)** - Accessibility best practices
2241
+ ### Standards & Best Practices
2242
+ - **[Architecture Standards](../standards/3-architecture-standards.md)** - Component design principles
2243
+ - **[Performance Optimization](../standards/9-operations-standards.md#performance-optimization)** - Performance optimization
2244
+ - **[Accessibility Requirements](../standards/4-code-quality-standards.md#accessibility-requirements)** - Accessibility requirements
2245
2245
 
2246
2246
  ### Troubleshooting
2247
2247
  - **[Common Issues](../troubleshooting/common-issues.md)** - Component-related problems
@@ -276,28 +276,53 @@ const { data: roleId } = await supabase.rpc('rbac_role_grant', { ... });
276
276
 
277
277
  ### Legacy Event RPCs
278
278
 
279
- **Status**: Deprecated
279
+ **Status**: Removed
280
280
  **Since**: v0.5.x
281
- **Removal**: v0.7.x
281
+ **Removed**: v0.6.x
282
282
 
283
- **Deprecated Functions**:
284
- - `get_pace_user_events` → Use `data_user_events_get`
283
+ **Removed Functions**:
284
+ - `get_pace_user_events` → Use `data_user_events_get` or `useEvents()` hook
285
+ - `get_public_event_by_code` → Use direct table queries or `usePublicEvent()` hook
286
+ - `get_public_event_logo` → Use direct table queries or `usePublicEventLogo()` hook
285
287
 
286
288
  **Migration**:
287
289
  ```typescript
288
- // Old
290
+ // Old - get_pace_user_events
289
291
  const { data } = await supabase.rpc('get_pace_user_events', {
290
292
  user_uuid: userId,
291
293
  app_name: appName,
292
294
  p_organisation_id: orgId
293
295
  });
294
296
 
295
- // New
297
+ // New - Modern RPC
296
298
  const { data, error } = await supabase.rpc('data_user_events_get', {
297
299
  p_user_id: userId,
298
300
  p_app_id: appId, // Use app ID instead of app name
299
301
  p_organisation_id: orgId
300
302
  });
303
+
304
+ // Better - Use pace-core hook
305
+ import { useEvents } from '@jmruthers/pace-core';
306
+ const { events } = useEvents();
307
+
308
+ // Old - get_public_event_by_code
309
+ const { data } = await supabase.rpc('get_public_event_by_code', {
310
+ event_code_param: eventCode
311
+ });
312
+
313
+ // New - Direct table query (pace-core handles this internally)
314
+ import { usePublicEvent } from '@jmruthers/pace-core';
315
+ const { event, isLoading, error } = usePublicEvent(eventCode);
316
+
317
+ // Old - get_public_event_logo
318
+ const { data } = await supabase.rpc('get_public_event_logo', {
319
+ event_id_param: eventId,
320
+ organisation_id_param: organisationId
321
+ });
322
+
323
+ // New - Direct table query (pace-core handles this internally)
324
+ import { usePublicEventLogo } from '@jmruthers/pace-core';
325
+ const { logoUrl, loading, error } = usePublicEventLogo(eventId, eventName, organisationId);
301
326
  ```
302
327
 
303
328
  ### Legacy Data Access RPCs
@@ -111,11 +111,11 @@ function App() {
111
111
  handleSignOutNow,
112
112
  } = useUnifiedAuth();
113
113
 
114
- if (isLoading) return <div>Loading...</div>;
115
- if (authError) return <div>Error: {authError.message}</div>;
114
+ if (isLoading) return <p>Loading...</p>;
115
+ if (authError) return <p>Error: {authError.message}</p>;
116
116
 
117
117
  return (
118
- <div>
118
+ <main>
119
119
  {user ? (
120
120
  <>
121
121
  <p>Welcome, {user.email}</p>
@@ -129,7 +129,7 @@ function App() {
129
129
  ) : (
130
130
  <LoginForm onSignIn={signIn} />
131
131
  )}
132
- </div>
132
+ </main>
133
133
  );
134
134
  }
135
135
  ```
@@ -220,22 +220,22 @@ function EventManager() {
220
220
  hasAccess,
221
221
  } = useEvents();
222
222
 
223
- if (loading) return <div>Loading events...</div>;
223
+ if (loading) return <p>Loading events...</p>;
224
224
 
225
225
  return (
226
- <div>
226
+ <section>
227
227
  <h2>Available Events</h2>
228
228
  {events.map(event => (
229
- <div key={event.id}>
229
+ <section key={event.id}>
230
230
  <span>{event.name}</span>
231
231
  {hasAccess(event.id) && (
232
232
  <button onClick={() => setSelectedEvent(event)}>
233
233
  Select
234
234
  </button>
235
235
  )}
236
- </div>
236
+ </section>
237
237
  ))}
238
- </div>
238
+ </section>
239
239
  );
240
240
  }
241
241
  ```
@@ -281,9 +281,9 @@ function UserActions({ userId, scope }) {
281
281
  }, [hasPermission, isLoading, userId, scope]);
282
282
 
283
283
  return (
284
- <div>
284
+ <section>
285
285
  {canEdit && <EditButton />}
286
- </div>
286
+ </section>
287
287
  );
288
288
  }
289
289
  ```
@@ -312,18 +312,18 @@ function PermissionDisplay({ userId, scope }) {
312
312
  scope
313
313
  });
314
314
 
315
- if (isLoading) return <div>Loading permissions...</div>;
316
- if (error) return <div>Error: {error.message}</div>;
315
+ if (isLoading) return <p>Loading permissions...</p>;
316
+ if (error) return <p>Error: {error.message}</p>;
317
317
 
318
318
  return (
319
- <div>
319
+ <section>
320
320
  <h3>User Permissions</h3>
321
321
  {Object.entries(permissions).map(([pageId, operations]) => (
322
- <div key={pageId}>
322
+ <p key={pageId}>
323
323
  <strong>{pageId}:</strong> {operations.join(', ')}
324
- </div>
324
+ </p>
325
325
  ))}
326
- </div>
326
+ </section>
327
327
  );
328
328
  }
329
329
  ```
@@ -352,13 +352,13 @@ function AccessLevelDisplay({ userId, scope }) {
352
352
  scope
353
353
  });
354
354
 
355
- if (isLoading) return <div>Loading access level...</div>;
356
- if (error) return <div>Error: {error.message}</div>;
355
+ if (isLoading) return <p>Loading access level...</p>;
356
+ if (error) return <p>Error: {error.message}</p>;
357
357
 
358
358
  return (
359
- <div>
359
+ <section>
360
360
  <p>Access Level: {accessLevel || 'None'}</p>
361
- </div>
361
+ </section>
362
362
  );
363
363
  }
364
364
  ```
@@ -406,10 +406,10 @@ function NotificationExample() {
406
406
  };
407
407
 
408
408
  return (
409
- <div>
409
+ <section>
410
410
  <button onClick={handleSuccess}>Show Success</button>
411
411
  <button onClick={handleError}>Show Error</button>
412
- </div>
412
+ </section>
413
413
  );
414
414
  }
415
415
  ```
@@ -460,23 +460,23 @@ function UserForm() {
460
460
 
461
461
  return (
462
462
  <form onSubmit={handleSubmit(onSubmit)}>
463
- <div>
463
+ <section>
464
464
  <label>Name</label>
465
465
  <input {...register('name')} />
466
466
  {errors.name && <span>{errors.name.message}</span>}
467
- </div>
467
+ </section>
468
468
 
469
- <div>
469
+ <section>
470
470
  <label>Email</label>
471
471
  <input type="email" {...register('email')} />
472
472
  {errors.email && <span>{errors.email.message}</span>}
473
- </div>
473
+ </section>
474
474
 
475
- <div>
475
+ <section>
476
476
  <label>Age</label>
477
477
  <input type="number" {...register('age')} />
478
478
  {errors.age && <span>{errors.age.message}</span>}
479
- </div>
479
+ </section>
480
480
 
481
481
  <button type="submit" disabled={isSubmitting}>
482
482
  {isSubmitting ? 'Submitting...' : 'Submit'}
@@ -654,18 +654,18 @@ function Dropdown() {
654
654
  useClickOutside(dropdownRef, () => setIsOpen(false));
655
655
 
656
656
  return (
657
- <div ref={dropdownRef}>
657
+ <nav ref={dropdownRef}>
658
658
  <button onClick={() => setIsOpen(!isOpen)}>
659
659
  Toggle Dropdown
660
660
  </button>
661
661
  {isOpen && (
662
- <div className="dropdown-content">
663
- <div>Option 1</div>
664
- <div>Option 2</div>
665
- <div>Option 3</div>
666
- </div>
662
+ <section className="dropdown-content">
663
+ <button>Option 1</button>
664
+ <button>Option 2</button>
665
+ <button>Option 3</button>
666
+ </section>
667
667
  )}
668
- </div>
668
+ </nav>
669
669
  );
670
670
  }
671
671
  ```
@@ -696,11 +696,11 @@ function PerformanceDashboard() {
696
696
  const metrics = usePerformanceMonitor();
697
697
 
698
698
  return (
699
- <div>
699
+ <section>
700
700
  <p>Render time: {metrics.renderTime}ms</p>
701
701
  <p>Memory usage: {metrics.memoryUsage}MB</p>
702
702
  <p>Components: {metrics.componentCount}</p>
703
- </div>
703
+ </section>
704
704
  );
705
705
  }
706
706
  ```
@@ -829,7 +829,7 @@ function PublicEventPage() {
829
829
  console.log('Event Code:', eventCode);
830
830
  console.log('Report ID:', reportId);
831
831
 
832
- return <div>Event: {eventCode}</div>;
832
+ return <p>Event: {eventCode}</p>;
833
833
  }
834
834
  ```
835
835
 
@@ -856,11 +856,11 @@ function PublicEventPage() {
856
856
  const { eventCode } = usePublicRouteParams({ fetchEventData: false });
857
857
  const { event, isLoading, error, refetch } = usePublicEvent(eventCode || '');
858
858
 
859
- if (isLoading) return <div>Loading...</div>;
860
- if (error) return <div>Error: {error.message}</div>;
861
- if (!event) return <div>Event not found</div>;
862
-
863
- return <div>Event: {event.event_name}</div>;
859
+ if (isLoading) return <p>Loading...</p>;
860
+ if (error) return <p>Error: {error.message}</p>;
861
+ if (!event) return <p>Event not found</p>;
862
+
863
+ return <p>Event: {event.event_name}</p>;
864
864
  }
865
865
  ```
866
866
 
@@ -880,10 +880,10 @@ function MyComponent() {
880
880
  const isPublicPage = useIsPublicPage();
881
881
 
882
882
  if (isPublicPage) {
883
- return <div>This is a public page</div>;
883
+ return <section>This is a public page</section>;
884
884
  }
885
885
 
886
- return <div>This is an authenticated page</div>;
886
+ return <section>This is an authenticated page</section>;
887
887
  }
888
888
  ```
889
889
 
@@ -912,7 +912,7 @@ function PublicComponent() {
912
912
 
913
913
  console.log('Supabase URL:', environment.supabaseUrl);
914
914
 
915
- return <div>Public component</div>;
915
+ return <section>Public component</section>;
916
916
  }
917
917
  ```
918
918
 
@@ -973,16 +973,16 @@ function MyComponent() {
973
973
  });
974
974
 
975
975
  return (
976
- <div>
976
+ <section>
977
977
  <p>Idle: {isIdle ? 'Yes' : 'No'}</p>
978
978
  <p>Time remaining: {Math.floor(timeRemaining / 1000)}s</p>
979
979
  {showWarning && (
980
- <div>
980
+ <section>
981
981
  <p>You will be signed out soon due to inactivity.</p>
982
982
  <button onClick={resetActivity}>Stay Active</button>
983
- </div>
983
+ </section>
984
984
  )}
985
- </div>
985
+ </section>
986
986
  );
987
987
  }
988
988
  ```
@@ -1050,10 +1050,10 @@ function SecureComponent() {
1050
1050
  };
1051
1051
 
1052
1052
  return (
1053
- <div>
1053
+ <section>
1054
1054
  <p>Super Admin: {superAdminContext.isSuperAdmin ? 'Yes' : 'No'}</p>
1055
1055
  <button onClick={handleSecureAction}>Perform Secure Action</button>
1056
- </div>
1056
+ </section>
1057
1057
  );
1058
1058
  }
1059
1059
  ```
@@ -1105,15 +1105,15 @@ function FileUpload() {
1105
1105
  };
1106
1106
 
1107
1107
  return (
1108
- <div>
1108
+ <section>
1109
1109
  <input
1110
1110
  type="file"
1111
1111
  onChange={(e) => e.target.files?.[0] && handleFileUpload(e.target.files[0])}
1112
1112
  disabled={isLoading}
1113
1113
  />
1114
- {isLoading && <div>Uploading...</div>}
1115
- {error && <div>Error: {error.message}</div>}
1116
- </div>
1114
+ {isLoading && <p>Uploading...</p>}
1115
+ {error && <p>Error: {error.message}</p>}
1116
+ </section>
1117
1117
  );
1118
1118
  }
1119
1119
  ```
@@ -1160,30 +1160,30 @@ function FileUploadWithProgress() {
1160
1160
  };
1161
1161
 
1162
1162
  return (
1163
- <div>
1163
+ <section>
1164
1164
  <input
1165
1165
  type="file"
1166
1166
  onChange={(e) => e.target.files?.[0] && handleFileUpload(e.target.files[0])}
1167
1167
  disabled={isUploading}
1168
1168
  />
1169
1169
  {isUploading && (
1170
- <div>
1171
- <div>Uploading... {uploadProgress}%</div>
1172
- <div className="w-full bg-sec-200 rounded-full h-2">
1173
- <div
1170
+ <section>
1171
+ <p>Uploading... {uploadProgress}%</p>
1172
+ <section className="w-full bg-sec-200 rounded-full h-2" role="progressbar" aria-valuenow={uploadProgress} aria-valuemin={0} aria-valuemax={100}>
1173
+ <section
1174
1174
  className="bg-main-600 h-2 rounded-full transition-all duration-300"
1175
1175
  style={{ width: `${uploadProgress}%` }}
1176
1176
  />
1177
- </div>
1178
- </div>
1177
+ </section>
1178
+ </section>
1179
1179
  )}
1180
1180
  {error && (
1181
- <div>
1182
- <div>Error: {error.message}</div>
1181
+ <section>
1182
+ <p>Error: {error.message}</p>
1183
1183
  <button onClick={reset}>Try Again</button>
1184
- </div>
1184
+ </section>
1185
1185
  )}
1186
- </div>
1186
+ </section>
1187
1187
  );
1188
1188
  }
1189
1189
  ```
@@ -1235,12 +1235,12 @@ function AppSettings() {
1235
1235
  });
1236
1236
  };
1237
1237
 
1238
- if (isLoading) return <div>Loading configuration...</div>;
1239
- if (error) return <div>Error: {error.message}</div>;
1240
- if (!config) return <div>No configuration available</div>;
1238
+ if (isLoading) return <p>Loading configuration...</p>;
1239
+ if (error) return <p>Error: {error.message}</p>;
1240
+ if (!config) return <p>No configuration available</p>;
1241
1241
 
1242
1242
  return (
1243
- <div>
1243
+ <section>
1244
1244
  <h2>App Configuration</h2>
1245
1245
  <p>App Name: {config.appName}</p>
1246
1246
  <p>Version: {config.version}</p>
@@ -1257,7 +1257,7 @@ function AppSettings() {
1257
1257
  {name}
1258
1258
  </label>
1259
1259
  ))}
1260
- </div>
1260
+ </section>
1261
1261
  );
1262
1262
  }
1263
1263
  ```
@@ -1295,9 +1295,9 @@ function Modal({ children, onClose }) {
1295
1295
  });
1296
1296
 
1297
1297
  return (
1298
- <div ref={containerRef}>
1298
+ <section ref={containerRef}>
1299
1299
  {children}
1300
- </div>
1300
+ </section>
1301
1301
  );
1302
1302
  }
1303
1303
  ```
@@ -1333,9 +1333,9 @@ function Dialog({ isOpen, children, onClose }) {
1333
1333
  if (!isOpen) return null;
1334
1334
 
1335
1335
  return (
1336
- <div ref={containerRef}>
1336
+ <section ref={containerRef}>
1337
1337
  {children}
1338
- </div>
1338
+ </section>
1339
1339
  );
1340
1340
  }
1341
1341
  ```
@@ -1391,9 +1391,9 @@ function ResponsiveLayout({ children }) {
1391
1391
  const isMobile = useIsMobile();
1392
1392
 
1393
1393
  return (
1394
- <div className={isMobile ? 'mobile' : 'desktop'}>
1394
+ <section className={isMobile ? 'mobile' : 'desktop'}>
1395
1395
  {children}
1396
- </div>
1396
+ </section>
1397
1397
  );
1398
1398
  }
1399
1399
  ```
@@ -1491,7 +1491,7 @@ import { usePerformanceMonitor } from '@jmruthers/pace-core';
1491
1491
  function PerformanceDashboard() {
1492
1492
  const metrics = usePerformanceMonitor();
1493
1493
 
1494
- return <div>Render time: {metrics.renderTime}ms</div>;
1494
+ return <p>Render time: {metrics.renderTime}ms</p>;
1495
1495
  }
1496
1496
  ```
1497
1497