@jmruthers/pace-core 0.4.1 → 0.5.1

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 (601) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/README.md +231 -229
  3. package/dist/{DataTable-2LB6HI6V.js → DataTable-GX3XERFJ.js} +14 -17
  4. package/dist/{DataTable-BDBqkU-i.d.ts → DataTable-ltTFXHS3.d.ts} +25 -51
  5. package/dist/{Table-CIm9IWqk.d.ts → PublicLoadingSpinner-DztrzuJr.d.ts} +635 -122
  6. package/dist/UnifiedAuthProvider-w66zSCUf.d.ts +160 -0
  7. package/dist/{api-AIJ3IJX3.js → api-ETQ6YJ3C.js} +6 -4
  8. package/dist/{appConfig-fB1pP_v3.d.ts → appConfig-BVGyuvI7.d.ts} +1 -1
  9. package/dist/appNameResolver-7GHF5ED2.js +22 -0
  10. package/dist/{audit-PD5L5ZSC.js → audit-BUW3LMJB.js} +3 -3
  11. package/dist/chunk-5EL3KHOQ.js +388 -0
  12. package/dist/chunk-5EL3KHOQ.js.map +1 -0
  13. package/dist/{chunk-4MCJAK7J.js → chunk-6CR3MRZN.js} +1827 -4886
  14. package/dist/chunk-6CR3MRZN.js.map +1 -0
  15. package/dist/{chunk-YNU5QJ4S.js → chunk-7BNPOCLL.js} +22 -5
  16. package/dist/chunk-7BNPOCLL.js.map +1 -0
  17. package/dist/chunk-AUE24LVR.js +268 -0
  18. package/dist/chunk-AUE24LVR.js.map +1 -0
  19. package/dist/chunk-C5G2A4PO.js +1349 -0
  20. package/dist/chunk-C5G2A4PO.js.map +1 -0
  21. package/dist/{chunk-4ZTIEYU2.js → chunk-CDQ3PX7L.js} +1 -1
  22. package/dist/chunk-CDQ3PX7L.js.map +1 -0
  23. package/dist/chunk-COBPIXXQ.js +379 -0
  24. package/dist/chunk-COBPIXXQ.js.map +1 -0
  25. package/dist/chunk-GSNM5D6H.js +5441 -0
  26. package/dist/chunk-GSNM5D6H.js.map +1 -0
  27. package/dist/chunk-MZBUOP4P.js +119 -0
  28. package/dist/chunk-MZBUOP4P.js.map +1 -0
  29. package/dist/chunk-N2EUGZRW.js +98 -0
  30. package/dist/chunk-N2EUGZRW.js.map +1 -0
  31. package/dist/chunk-NQ4TOOO6.js +20 -0
  32. package/dist/chunk-NQ4TOOO6.js.map +1 -0
  33. package/dist/{chunk-KK6WIDK6.js → chunk-OEGRKULD.js} +12 -2
  34. package/dist/{chunk-KK6WIDK6.js.map → chunk-OEGRKULD.js.map} +1 -1
  35. package/dist/chunk-OYRY44Q2.js +62 -0
  36. package/dist/chunk-OYRY44Q2.js.map +1 -0
  37. package/dist/{chunk-DC5AMYBS.js → chunk-PLDDJCW6.js} +15 -5
  38. package/dist/chunk-PLDDJCW6.js.map +1 -0
  39. package/dist/{chunk-WHLSWC6W.js → chunk-SS3E6QLB.js} +16 -61
  40. package/dist/chunk-SS3E6QLB.js.map +1 -0
  41. package/dist/chunk-T3XIA4AJ.js +3295 -0
  42. package/dist/chunk-T3XIA4AJ.js.map +1 -0
  43. package/dist/{chunk-H4PZ4B3Y.js → chunk-TGDCLPP2.js} +129 -28
  44. package/dist/chunk-TGDCLPP2.js.map +1 -0
  45. package/dist/{chunk-IOX76PSM.js → chunk-U6JDHVC2.js} +273 -29
  46. package/dist/chunk-U6JDHVC2.js.map +1 -0
  47. package/dist/{chunk-JUUNUW3O.js → chunk-XJK2J4N6.js} +17 -6
  48. package/dist/chunk-XJK2J4N6.js.map +1 -0
  49. package/dist/chunk-YDJW5XTN.js +84 -0
  50. package/dist/chunk-YDJW5XTN.js.map +1 -0
  51. package/dist/components.d.ts +906 -10
  52. package/dist/components.js +3263 -84
  53. package/dist/components.js.map +1 -1
  54. package/dist/{database-CAMsquLm.d.ts → database-C3Szpi5J.d.ts} +28 -11
  55. package/dist/hooks.d.ts +7 -6
  56. package/dist/hooks.js +35 -11
  57. package/dist/hooks.js.map +1 -1
  58. package/dist/index.d.ts +245 -111
  59. package/dist/index.js +195 -185
  60. package/dist/index.js.map +1 -1
  61. package/dist/{organisation-DLNNQhPB.d.ts → organisation-CO3Sh3_D.d.ts} +1 -1
  62. package/dist/providers.d.ts +4 -4
  63. package/dist/providers.js +21 -6
  64. package/dist/rbac/index.d.ts +862 -806
  65. package/dist/rbac/index.js +953 -1032
  66. package/dist/rbac/index.js.map +1 -1
  67. package/dist/styles/core.css +422 -0
  68. package/dist/styles/fonts/georama-italic.woff2 +0 -0
  69. package/dist/styles/fonts/georama.woff2 +0 -0
  70. package/dist/styles/fonts/open-sans-italic.woff2 +0 -0
  71. package/dist/styles/fonts/open-sans.woff2 +0 -0
  72. package/dist/styles/fonts/reddit-mono.woff2 +0 -0
  73. package/dist/styles/index.d.ts +36 -0
  74. package/dist/styles/index.js +24 -0
  75. package/dist/styles/index.js.map +1 -0
  76. package/dist/theming/runtime.d.ts +73 -0
  77. package/dist/theming/runtime.js +16 -0
  78. package/dist/theming/runtime.js.map +1 -0
  79. package/dist/{types-Bavn44NW.d.ts → types-BRDU7N6w.d.ts} +79 -33
  80. package/dist/types.d.ts +5 -5
  81. package/dist/types.js +7 -2
  82. package/dist/types.js.map +1 -1
  83. package/dist/{unified-BtRpPbmp.d.ts → unified-CM7T0aTK.d.ts} +1 -2
  84. package/dist/usePublicRouteParams-B6i0KtXW.d.ts +477 -0
  85. package/dist/utils.d.ts +83 -60
  86. package/dist/utils.js +301 -55657
  87. package/dist/utils.js.map +1 -1
  88. package/dist/validation.d.ts +1 -1
  89. package/dist/validation.js +1 -1
  90. package/docs/INDEX.md +192 -0
  91. package/docs/README.md +46 -32
  92. package/docs/api/README.md +231 -229
  93. package/docs/api/classes/ErrorBoundary.md +1 -1
  94. package/docs/api/classes/PublicErrorBoundary.md +132 -0
  95. package/docs/api/interfaces/AggregateConfig.md +4 -4
  96. package/docs/api/interfaces/ButtonProps.md +2 -2
  97. package/docs/api/interfaces/CardProps.md +2 -2
  98. package/docs/api/interfaces/ColorPalette.md +1 -1
  99. package/docs/api/interfaces/ColorShade.md +1 -1
  100. package/docs/api/interfaces/DataTableAction.md +98 -7
  101. package/docs/api/interfaces/DataTableColumn.md +131 -12
  102. package/docs/api/interfaces/DataTableProps.md +77 -274
  103. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  104. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  105. package/docs/api/interfaces/EventContextType.md +7 -7
  106. package/docs/api/interfaces/EventLogoProps.md +152 -0
  107. package/docs/api/interfaces/EventProviderProps.md +2 -2
  108. package/docs/api/interfaces/FileSizeLimits.md +7 -0
  109. package/docs/api/interfaces/FileUploadProps.md +154 -0
  110. package/docs/api/interfaces/FooterProps.md +1 -1
  111. package/docs/api/interfaces/InactivityWarningModalProps.md +115 -0
  112. package/docs/api/interfaces/InputProps.md +2 -2
  113. package/docs/api/interfaces/LabelProps.md +1 -1
  114. package/docs/api/interfaces/LoginFormProps.md +1 -1
  115. package/docs/api/interfaces/NavigationItem.md +1 -1
  116. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  117. package/docs/api/interfaces/Organisation.md +1 -1
  118. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  119. package/docs/api/interfaces/OrganisationMembership.md +2 -2
  120. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  121. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  122. package/docs/api/interfaces/PaceAppLayoutProps.md +26 -26
  123. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  124. package/docs/api/interfaces/PaletteData.md +1 -1
  125. package/docs/api/interfaces/PublicErrorBoundaryProps.md +94 -0
  126. package/docs/api/interfaces/PublicErrorBoundaryState.md +68 -0
  127. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +86 -0
  128. package/docs/api/interfaces/PublicPageFooterProps.md +112 -0
  129. package/docs/api/interfaces/PublicPageHeaderProps.md +138 -0
  130. package/docs/api/interfaces/PublicPageLayoutProps.md +138 -0
  131. package/docs/api/interfaces/StorageConfig.md +41 -0
  132. package/docs/api/interfaces/StorageFileInfo.md +74 -0
  133. package/docs/api/interfaces/StorageFileMetadata.md +140 -0
  134. package/docs/api/interfaces/StorageListOptions.md +86 -0
  135. package/docs/api/interfaces/StorageListResult.md +41 -0
  136. package/docs/api/interfaces/StorageUploadOptions.md +88 -0
  137. package/docs/api/interfaces/StorageUploadResult.md +63 -0
  138. package/docs/api/interfaces/StorageUrlOptions.md +47 -0
  139. package/docs/api/interfaces/StyleImport.md +2 -2
  140. package/docs/api/interfaces/ToastActionElement.md +1 -1
  141. package/docs/api/interfaces/ToastProps.md +1 -1
  142. package/docs/api/interfaces/UnifiedAuthContextType.md +447 -46
  143. package/docs/api/interfaces/UnifiedAuthProviderProps.md +95 -9
  144. package/docs/api/interfaces/UseInactivityTrackerOptions.md +136 -0
  145. package/docs/api/interfaces/UseInactivityTrackerReturn.md +123 -0
  146. package/docs/api/interfaces/UsePublicEventLogoOptions.md +87 -0
  147. package/docs/api/interfaces/UsePublicEventLogoReturn.md +81 -0
  148. package/docs/api/interfaces/UsePublicEventOptions.md +34 -0
  149. package/docs/api/interfaces/UsePublicEventReturn.md +68 -0
  150. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +94 -0
  151. package/docs/api/interfaces/UserEventAccess.md +14 -14
  152. package/docs/api/interfaces/UserMenuProps.md +6 -6
  153. package/docs/api/interfaces/UserProfile.md +1 -1
  154. package/docs/api/modules.md +1626 -768
  155. package/docs/api-reference/components.md +761 -43
  156. package/docs/api-reference/hooks.md +126 -0
  157. package/docs/api-reference/providers.md +141 -65
  158. package/docs/api-reference/types.md +66 -36
  159. package/docs/api-reference/utilities.md +1 -1
  160. package/docs/architecture/README.md +1 -2
  161. package/docs/best-practices/README.md +400 -0
  162. package/docs/consuming-app-example.md +42 -96
  163. package/docs/consuming-app-vite-config.md +233 -0
  164. package/docs/core-concepts/events.md +3 -3
  165. package/docs/core-concepts/organisations.md +0 -1
  166. package/docs/core-concepts/rbac-system.md +23 -10
  167. package/docs/documentation-style-checklist.md +8 -2
  168. package/docs/examples/navigation-menu-auth-fix.md +344 -0
  169. package/docs/getting-started/examples/README.md +15 -1
  170. package/docs/getting-started/examples/basic-auth-app.md +444 -119
  171. package/docs/getting-started/examples/full-featured-app.md +6 -6
  172. package/docs/getting-started/installation.md +231 -52
  173. package/docs/getting-started/quick-start.md +121 -24
  174. package/docs/implementation-guides/app-layout.md +133 -108
  175. package/docs/implementation-guides/data-tables.md +1011 -29
  176. package/docs/implementation-guides/forms.md +3 -3
  177. package/docs/implementation-guides/hierarchical-datatable.md +850 -0
  178. package/docs/implementation-guides/large-datasets.md +2 -2
  179. package/docs/implementation-guides/navigation.md +1 -1
  180. package/docs/implementation-guides/permission-enforcement.md +4 -4
  181. package/docs/implementation-guides/public-pages.md +752 -0
  182. package/docs/migration/README.md +18 -8
  183. package/docs/migration/quick-migration-guide.md +320 -0
  184. package/docs/migration/rbac-migration.md +50 -0
  185. package/docs/migration/v0.4.15-tailwind-scanning.md +272 -0
  186. package/docs/migration/v0.4.16-css-first-approach.md +306 -0
  187. package/docs/migration/v0.4.17-source-path-fix.md +229 -0
  188. package/docs/migration-guide.md +51 -104
  189. package/docs/performance/README.md +1 -4
  190. package/docs/print-components/README.md +258 -0
  191. package/docs/print-components/api-reference.md +636 -0
  192. package/docs/print-components/examples/README.md +204 -0
  193. package/docs/print-components/examples/basic-report.tsx +92 -0
  194. package/docs/print-components/examples/card-catalog.tsx +149 -0
  195. package/docs/print-components/examples/cover-page-report.tsx +163 -0
  196. package/docs/print-components/quick-start.md +363 -0
  197. package/docs/quick-reference.md +53 -36
  198. package/docs/rbac/README.md +136 -69
  199. package/docs/rbac/api-reference.md +39 -8
  200. package/docs/rbac/examples.md +237 -66
  201. package/docs/rbac/getting-started.md +131 -16
  202. package/docs/rbac/quick-start.md +499 -323
  203. package/docs/rbac/troubleshooting.md +240 -262
  204. package/docs/security/README.md +50 -1
  205. package/docs/styles/README.md +143 -117
  206. package/docs/testing/README.md +6 -10
  207. package/docs/troubleshooting/README.md +497 -0
  208. package/docs/troubleshooting/common-issues.md +604 -14
  209. package/docs/troubleshooting/styling-issues.md +219 -0
  210. package/docs/troubleshooting/tailwind-content-scanning.md +213 -0
  211. package/docs/usage.md +28 -90
  212. package/docs/visual-testing.md +0 -7
  213. package/package.json +46 -24
  214. package/src/__mocks__/lucide-react.ts +181 -0
  215. package/src/__tests__/REBUILD_PLAN.md +223 -0
  216. package/src/__tests__/TESTING_GUIDELINES.md +341 -0
  217. package/src/__tests__/fixtures/mocks.ts +93 -0
  218. package/src/__tests__/helpers/component-test-utils.tsx +145 -0
  219. package/src/__tests__/helpers/test-utils.tsx +117 -0
  220. package/src/__tests__/integration/UserProfile.test.tsx +128 -0
  221. package/src/__tests__/setup.ts +71 -0
  222. package/src/__tests__/templates/accessibility.test.template.tsx +279 -0
  223. package/src/__tests__/templates/component.test.template.tsx +144 -0
  224. package/src/__tests__/templates/hook.test.template.ts +173 -0
  225. package/src/__tests__/templates/integration.test.template.tsx +199 -0
  226. package/src/__tests__/types/test.types.ts +106 -0
  227. package/src/components/Alert/Alert.test.tsx +496 -0
  228. package/src/components/Alert/Alert.tsx +134 -0
  229. package/src/components/Alert/index.ts +2 -0
  230. package/src/components/Avatar/Avatar.test.tsx +484 -0
  231. package/src/components/Avatar/Avatar.tsx +84 -0
  232. package/src/components/Avatar/index.ts +2 -0
  233. package/src/components/Button/Button.test.tsx +662 -0
  234. package/src/components/Button/Button.tsx +270 -0
  235. package/src/components/Button/index.ts +2 -0
  236. package/src/components/Card/Card.test.tsx +593 -0
  237. package/src/components/Card/Card.tsx +271 -0
  238. package/src/components/Card/index.ts +1 -0
  239. package/src/components/Checkbox/Checkbox.test.tsx +461 -0
  240. package/src/components/Checkbox/Checkbox.tsx +75 -0
  241. package/src/components/Checkbox/__mocks__/Checkbox.tsx +2 -0
  242. package/src/components/Checkbox/index.ts +2 -0
  243. package/src/components/DataTable/DataTable.tsx +446 -0
  244. package/src/components/DataTable/__tests__/README.md +145 -0
  245. package/src/components/DataTable/__tests__/mocks/MockRBACProvider.tsx +66 -0
  246. package/src/components/DataTable/__tests__/test-utils/dataFactories.ts +103 -0
  247. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +381 -0
  248. package/src/components/DataTable/__tests__/test-utils.ts +94 -0
  249. package/src/components/DataTable/components/AccessDeniedPage.tsx +168 -0
  250. package/src/components/DataTable/components/ActionButtons.tsx +194 -0
  251. package/src/components/DataTable/components/BulkOperationsDropdown.tsx +160 -0
  252. package/src/components/DataTable/components/ColumnFilter.tsx +114 -0
  253. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +100 -0
  254. package/src/components/DataTable/components/DataTableBody.tsx +461 -0
  255. package/src/components/DataTable/components/DataTableCore.tsx +1027 -0
  256. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +214 -0
  257. package/src/components/DataTable/components/DataTableModals.tsx +87 -0
  258. package/src/components/DataTable/components/DataTableToolbar.tsx +262 -0
  259. package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
  260. package/src/components/DataTable/components/EditableRow.tsx +159 -0
  261. package/src/components/DataTable/components/EmptyState.tsx +64 -0
  262. package/src/components/DataTable/components/ExpandButton.tsx +113 -0
  263. package/src/components/DataTable/components/FilterRow.tsx +100 -0
  264. package/src/components/DataTable/components/GroupHeader.tsx +42 -0
  265. package/src/components/DataTable/components/GroupingDropdown.tsx +96 -0
  266. package/src/components/DataTable/components/ImportModal.tsx +345 -0
  267. package/src/components/DataTable/components/LoadingState.tsx +12 -0
  268. package/src/components/DataTable/components/PaginationControls.tsx +332 -0
  269. package/src/components/DataTable/components/UnifiedTableBody.tsx +742 -0
  270. package/src/components/DataTable/components/ViewRowModal.tsx +68 -0
  271. package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
  272. package/src/components/DataTable/components/index.ts +16 -0
  273. package/src/components/DataTable/context/DataTableContext.tsx +97 -0
  274. package/src/components/DataTable/core/ActionManager.ts +235 -0
  275. package/src/components/DataTable/core/ColumnFactory.ts +268 -0
  276. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  277. package/src/components/DataTable/core/DataManager.ts +188 -0
  278. package/src/components/DataTable/core/DataTableContext.tsx +181 -0
  279. package/src/components/DataTable/core/LocalDataAdapter.ts +264 -0
  280. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  281. package/src/components/DataTable/core/StateManager.ts +311 -0
  282. package/src/components/DataTable/core/index.ts +8 -0
  283. package/src/components/DataTable/core/interfaces.ts +338 -0
  284. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +419 -0
  285. package/src/components/DataTable/examples/HierarchicalExample.tsx +475 -0
  286. package/src/components/DataTable/examples/InitialPageSizeExample.tsx +176 -0
  287. package/src/components/DataTable/examples/PerformanceExample.tsx +505 -0
  288. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +95 -0
  289. package/src/components/DataTable/hooks/useColumnReordering.ts +110 -0
  290. package/src/components/DataTable/hooks/useDataTableState.ts +325 -0
  291. package/src/components/DataTable/hooks/useHierarchicalState.ts +174 -0
  292. package/src/components/DataTable/index.ts +68 -0
  293. package/src/components/DataTable/styles.ts +171 -0
  294. package/src/components/DataTable/types.ts +511 -0
  295. package/src/components/DataTable/utils/debugTools.ts +583 -0
  296. package/src/components/DataTable/utils/errorHandling.ts +494 -0
  297. package/src/components/DataTable/utils/exportUtils.ts +126 -0
  298. package/src/components/DataTable/utils/flexibleImport.ts +510 -0
  299. package/src/components/DataTable/utils/hierarchicalSorting.ts +151 -0
  300. package/src/components/DataTable/utils/hierarchicalUtils.ts +218 -0
  301. package/src/components/DataTable/utils/index.ts +1 -0
  302. package/src/components/DataTable/utils/performanceUtils.ts +351 -0
  303. package/src/components/Dialog/Dialog.test.tsx +1139 -0
  304. package/src/components/Dialog/Dialog.tsx +782 -0
  305. package/src/components/Dialog/README.md +804 -0
  306. package/src/components/Dialog/examples/BasicHtmlTest.tsx +55 -0
  307. package/src/components/Dialog/examples/DebugHtmlExample.tsx +68 -0
  308. package/src/components/Dialog/examples/HtmlDialogExample.tsx +202 -0
  309. package/src/components/Dialog/examples/SimpleHtmlTest.tsx +61 -0
  310. package/src/components/Dialog/examples/SmartDialogExample.tsx +322 -0
  311. package/src/components/Dialog/index.ts +12 -0
  312. package/src/components/Dialog/utils/safeHtml.ts +185 -0
  313. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +752 -0
  314. package/src/components/ErrorBoundary/ErrorBoundary.tsx +312 -0
  315. package/src/components/ErrorBoundary/index.ts +8 -0
  316. package/src/components/EventSelector/EventSelector.tsx +360 -0
  317. package/src/components/EventSelector/index.ts +3 -0
  318. package/src/components/EventSelector/types.ts +79 -0
  319. package/src/components/FileUpload/FileUpload.example.tsx +218 -0
  320. package/src/components/FileUpload/FileUpload.test.tsx +665 -0
  321. package/src/components/FileUpload/FileUpload.tsx +237 -0
  322. package/src/components/FileUpload/index.ts +6 -0
  323. package/src/components/Footer/Footer.tsx +197 -0
  324. package/src/components/Footer/index.ts +17 -0
  325. package/src/components/Form/Form.tsx +166 -0
  326. package/src/components/Form/FormErrorSummary.tsx +113 -0
  327. package/src/components/Form/FormField.tsx +249 -0
  328. package/src/components/Form/FormFieldset.tsx +127 -0
  329. package/src/components/Form/FormLiveRegion.tsx +198 -0
  330. package/src/components/Form/index.ts +26 -0
  331. package/src/components/Header/Header.tsx +301 -0
  332. package/src/components/Header/index.ts +4 -0
  333. package/src/components/InactivityWarningModal/InactivityWarningModal.tsx +164 -0
  334. package/src/components/InactivityWarningModal/index.ts +9 -0
  335. package/src/components/Input/Input.tsx +201 -0
  336. package/src/components/Input/__mocks__/Input.tsx +2 -0
  337. package/src/components/Input/index.ts +9 -0
  338. package/src/components/Label/Label.tsx +186 -0
  339. package/src/components/Label/index.ts +2 -0
  340. package/src/components/LoadingSpinner/LoadingSpinner.tsx +98 -0
  341. package/src/components/LoadingSpinner/index.ts +3 -0
  342. package/src/components/LoginForm/LoginForm.tsx +273 -0
  343. package/src/components/LoginForm/index.ts +3 -0
  344. package/src/components/NavigationMenu/NavigationMenu.tsx +698 -0
  345. package/src/components/NavigationMenu/index.ts +10 -0
  346. package/src/components/NavigationMenu/types.ts +85 -0
  347. package/src/components/OrganisationSelector/OrganisationSelector.tsx +304 -0
  348. package/src/components/OrganisationSelector/index.ts +9 -0
  349. package/src/components/PaceAppLayout/PaceAppLayout.tsx +699 -0
  350. package/src/components/PaceAppLayout/README.md +278 -0
  351. package/src/components/PaceAppLayout/index.ts +1 -0
  352. package/src/components/PaceLoginPage/PaceLoginPage.tsx +221 -0
  353. package/src/components/PaceLoginPage/index.ts +1 -0
  354. package/src/components/PasswordReset/PasswordChangeForm.tsx +186 -0
  355. package/src/components/PasswordReset/PasswordResetForm.tsx +201 -0
  356. package/src/components/PasswordReset/index.ts +4 -0
  357. package/src/components/PrintButton/PrintButton.tsx +321 -0
  358. package/src/components/PrintButton/PrintButtonGroup.tsx +84 -0
  359. package/src/components/PrintButton/PrintToolbar.tsx +94 -0
  360. package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +438 -0
  361. package/src/components/PrintButton/index.ts +33 -0
  362. package/src/components/PrintButton/types.ts +173 -0
  363. package/src/components/PrintCard/PrintCard.tsx +154 -0
  364. package/src/components/PrintCard/PrintCardContent.tsx +57 -0
  365. package/src/components/PrintCard/PrintCardFooter.tsx +60 -0
  366. package/src/components/PrintCard/PrintCardGrid.tsx +91 -0
  367. package/src/components/PrintCard/PrintCardHeader.tsx +78 -0
  368. package/src/components/PrintCard/PrintCardImage.tsx +81 -0
  369. package/src/components/PrintCard/examples/PrintCardShowcase.tsx +239 -0
  370. package/src/components/PrintCard/index.ts +34 -0
  371. package/src/components/PrintCard/types.ts +171 -0
  372. package/src/components/PrintDataTable/PrintDataTable.tsx +215 -0
  373. package/src/components/PrintDataTable/PrintTableGroup.tsx +90 -0
  374. package/src/components/PrintDataTable/PrintTableRow.tsx +76 -0
  375. package/src/components/PrintDataTable/index.ts +25 -0
  376. package/src/components/PrintDataTable/types.ts +67 -0
  377. package/src/components/PrintFooter/PrintFooter.tsx +183 -0
  378. package/src/components/PrintFooter/PrintFooterContent.tsx +71 -0
  379. package/src/components/PrintFooter/PrintFooterInfo.tsx +86 -0
  380. package/src/components/PrintFooter/PrintPageNumber.tsx +90 -0
  381. package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +390 -0
  382. package/src/components/PrintFooter/index.ts +30 -0
  383. package/src/components/PrintFooter/types.ts +149 -0
  384. package/src/components/PrintGrid/PrintGrid.tsx +180 -0
  385. package/src/components/PrintGrid/PrintGridBreakpoint.tsx +109 -0
  386. package/src/components/PrintGrid/PrintGridContainer.tsx +128 -0
  387. package/src/components/PrintGrid/PrintGridItem.tsx +220 -0
  388. package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +359 -0
  389. package/src/components/PrintGrid/index.ts +31 -0
  390. package/src/components/PrintGrid/types.ts +159 -0
  391. package/src/components/PrintHeader/PrintCoverHeader.tsx +230 -0
  392. package/src/components/PrintHeader/PrintHeader.tsx +150 -0
  393. package/src/components/PrintHeader/index.ts +17 -0
  394. package/src/components/PrintHeader/types.ts +42 -0
  395. package/src/components/PrintLayout/PrintLayout.tsx +122 -0
  396. package/src/components/PrintLayout/PrintLayoutContext.tsx +66 -0
  397. package/src/components/PrintLayout/PrintPageBreak.tsx +52 -0
  398. package/src/components/PrintLayout/examples/PrintShowcase.tsx +230 -0
  399. package/src/components/PrintLayout/index.ts +19 -0
  400. package/src/components/PrintLayout/types.ts +37 -0
  401. package/src/components/PrintPageBreak/PrintPageBreak.tsx +120 -0
  402. package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +90 -0
  403. package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +112 -0
  404. package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +279 -0
  405. package/src/components/PrintPageBreak/index.ts +23 -0
  406. package/src/components/PrintPageBreak/types.ts +94 -0
  407. package/src/components/PrintSection/PrintColumn.tsx +104 -0
  408. package/src/components/PrintSection/PrintDivider.tsx +101 -0
  409. package/src/components/PrintSection/PrintSection.tsx +129 -0
  410. package/src/components/PrintSection/PrintSectionContent.tsx +75 -0
  411. package/src/components/PrintSection/PrintSectionHeader.tsx +97 -0
  412. package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +258 -0
  413. package/src/components/PrintSection/index.ts +33 -0
  414. package/src/components/PrintSection/types.ts +155 -0
  415. package/src/components/PrintText/PrintText.tsx +116 -0
  416. package/src/components/PrintText/index.ts +16 -0
  417. package/src/components/PrintText/types.ts +24 -0
  418. package/src/components/Progress/Progress.tsx +116 -0
  419. package/src/components/Progress/index.ts +3 -0
  420. package/src/components/PublicLayout/EventLogo.tsx +287 -0
  421. package/src/components/PublicLayout/PublicErrorBoundary.tsx +279 -0
  422. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +208 -0
  423. package/src/components/PublicLayout/PublicPageContextChecker.tsx +130 -0
  424. package/src/components/PublicLayout/PublicPageDebugger.tsx +104 -0
  425. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +162 -0
  426. package/src/components/PublicLayout/PublicPageFooter.tsx +124 -0
  427. package/src/components/PublicLayout/PublicPageHeader.tsx +178 -0
  428. package/src/components/PublicLayout/PublicPageLayout.tsx +232 -0
  429. package/src/components/PublicLayout/PublicPageProvider.tsx +137 -0
  430. package/src/components/PublicLayout/index.ts +51 -0
  431. package/src/components/RBAC/PagePermissionGuard.tsx +287 -0
  432. package/src/components/RBAC/RBACGuard.tsx +143 -0
  433. package/src/components/RBAC/RBACProvider.tsx +186 -0
  434. package/src/components/RBAC/RoleBasedContent.tsx +129 -0
  435. package/src/components/RBAC/index.ts +23 -0
  436. package/src/components/Select/Select.tsx +660 -0
  437. package/src/components/Select/index.ts +1 -0
  438. package/src/components/SuperAdminGuard.tsx +116 -0
  439. package/src/components/Table/Table.tsx +222 -0
  440. package/src/components/Table/index.ts +11 -0
  441. package/src/components/Toast/Toast.tsx +339 -0
  442. package/src/components/Toast/index.ts +14 -0
  443. package/src/components/Tooltip/Tooltip.tsx +167 -0
  444. package/src/components/Tooltip/index.ts +7 -0
  445. package/src/components/UserMenu/UserMenu.tsx +243 -0
  446. package/src/components/UserMenu/index.ts +3 -0
  447. package/src/components/examples/PermissionExample.tsx +150 -0
  448. package/src/components/index.ts +434 -0
  449. package/src/components.ts +19 -0
  450. package/src/constants/performance.ts +14 -0
  451. package/src/examples/CorrectPublicPageImplementation.tsx +301 -0
  452. package/src/examples/PublicEventPage.tsx +274 -0
  453. package/src/examples/PublicPageApp.tsx +308 -0
  454. package/src/examples/PublicPageUsageExample.tsx +216 -0
  455. package/src/hooks/index.ts +56 -0
  456. package/src/hooks/public/index.ts +34 -0
  457. package/src/hooks/public/usePublicEvent.ts +261 -0
  458. package/src/hooks/public/usePublicEventLogo.ts +285 -0
  459. package/src/hooks/public/usePublicRouteParams.ts +259 -0
  460. package/src/hooks/useAppConfig.ts +94 -0
  461. package/src/hooks/useComponentPerformance.ts +39 -0
  462. package/src/hooks/useCounter.test.ts +135 -0
  463. package/src/hooks/useDataTablePerformance.ts +387 -0
  464. package/src/hooks/useDataTableState.ts +110 -0
  465. package/src/hooks/useDebounce.ts +18 -0
  466. package/src/hooks/useFocusManagement.ts +161 -0
  467. package/src/hooks/useFocusTrap.ts +155 -0
  468. package/src/hooks/useInactivityTracker.ts +372 -0
  469. package/src/hooks/useIsMobile.ts +42 -0
  470. package/src/hooks/useKeyboardShortcuts.ts +237 -0
  471. package/src/hooks/useOrganisationPermissions.ts +208 -0
  472. package/src/hooks/useOrganisationSecurity.ts +262 -0
  473. package/src/hooks/usePerformanceMonitor.ts +128 -0
  474. package/src/hooks/usePermissionCache.ts +455 -0
  475. package/src/hooks/useRBAC.ts +262 -0
  476. package/src/hooks/useSecureDataAccess.ts +586 -0
  477. package/src/hooks/useStorage.ts +274 -0
  478. package/src/hooks/useToast.ts +242 -0
  479. package/src/hooks/useZodForm.ts +28 -0
  480. package/src/index.ts +200 -0
  481. package/src/providers/AuthProvider.tsx +369 -0
  482. package/src/providers/EventProvider.tsx +324 -0
  483. package/src/providers/InactivityProvider.tsx +238 -0
  484. package/src/providers/OrganisationProvider.tsx +588 -0
  485. package/src/providers/RBACProvider.tsx +634 -0
  486. package/src/providers/UnifiedAuthProvider.tsx +327 -0
  487. package/src/providers/index.ts +15 -0
  488. package/src/rbac/README.md +885 -0
  489. package/src/rbac/adapters.tsx +726 -0
  490. package/src/rbac/api.ts +339 -0
  491. package/src/rbac/audit-enhanced.ts +339 -0
  492. package/src/rbac/audit.ts +338 -0
  493. package/src/rbac/cache.ts +215 -0
  494. package/src/rbac/components/EnhancedNavigationMenu.tsx +294 -0
  495. package/src/rbac/components/NavigationGuard.tsx +294 -0
  496. package/src/rbac/components/NavigationProvider.tsx +314 -0
  497. package/src/rbac/components/PagePermissionGuard.tsx +430 -0
  498. package/src/rbac/components/PagePermissionProvider.tsx +274 -0
  499. package/src/rbac/components/PermissionEnforcer.tsx +307 -0
  500. package/src/rbac/components/RoleBasedRouter.tsx +425 -0
  501. package/src/rbac/components/SecureDataProvider.tsx +319 -0
  502. package/src/rbac/components/index.ts +64 -0
  503. package/src/rbac/config.ts +133 -0
  504. package/src/rbac/docs/event-based-apps.md +285 -0
  505. package/src/rbac/engine.ts +1026 -0
  506. package/src/rbac/eslint-rules.js +285 -0
  507. package/src/rbac/examples/CompleteRBACExample.tsx +323 -0
  508. package/src/rbac/examples/EventBasedApp.tsx +238 -0
  509. package/src/rbac/hooks.ts +570 -0
  510. package/src/rbac/index.ts +114 -0
  511. package/src/rbac/permissions.ts +293 -0
  512. package/src/rbac/secureClient.ts +244 -0
  513. package/src/rbac/security.ts +346 -0
  514. package/src/rbac/testing/index.tsx +340 -0
  515. package/src/rbac/types.ts +343 -0
  516. package/src/rbac/utils/eventContext.ts +83 -0
  517. package/src/styles/core.css +422 -0
  518. package/src/styles/index.ts +51 -0
  519. package/src/theming/runtime.ts +187 -0
  520. package/src/types/database.ts +472 -0
  521. package/src/types/guards.ts +30 -0
  522. package/src/types/index.ts +25 -0
  523. package/src/types/organisation.ts +184 -0
  524. package/src/types/security.ts +70 -0
  525. package/src/types/supabase.ts +166 -0
  526. package/src/types/theme.ts +6 -0
  527. package/src/types/unified.ts +262 -0
  528. package/src/types/validation.ts +164 -0
  529. package/src/types/vitest-globals.d.ts +43 -0
  530. package/src/utils/__mocks__/supabaseMock.ts +75 -0
  531. package/src/utils/__mocks__/supabaseMock.tsx +198 -0
  532. package/src/utils/appConfig.ts +47 -0
  533. package/src/utils/appIdResolver.ts +130 -0
  534. package/src/utils/appNameResolver.ts +190 -0
  535. package/src/utils/audit.ts +127 -0
  536. package/src/utils/auth-utils.ts +96 -0
  537. package/src/utils/bundleAnalysis.ts +129 -0
  538. package/src/utils/cn.ts +7 -0
  539. package/src/utils/debugLogger.ts +46 -0
  540. package/src/utils/deviceFingerprint.ts +215 -0
  541. package/src/utils/dynamicUtils.ts +105 -0
  542. package/src/utils/formatting.ts +77 -0
  543. package/src/utils/index.ts +145 -0
  544. package/src/utils/lazyLoad.tsx +44 -0
  545. package/src/utils/organisationContext.ts +135 -0
  546. package/src/utils/performanceBenchmark.ts +64 -0
  547. package/src/utils/performanceBudgets.ts +111 -0
  548. package/src/utils/permissionTypes.ts +37 -0
  549. package/src/utils/permissionUtils.ts +31 -0
  550. package/src/utils/print/PrintDataProcessor.ts +390 -0
  551. package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +397 -0
  552. package/src/utils/print/index.ts +29 -0
  553. package/src/utils/print/types.ts +196 -0
  554. package/src/utils/print/usePrintOptimization.ts +272 -0
  555. package/src/utils/sanitization.ts +264 -0
  556. package/src/utils/schemaUtils.ts +37 -0
  557. package/src/utils/secureDataAccess.ts +361 -0
  558. package/src/utils/secureErrors.ts +79 -0
  559. package/src/utils/secureStorage.ts +244 -0
  560. package/src/utils/security.ts +156 -0
  561. package/src/utils/securityMonitor.ts +45 -0
  562. package/src/utils/sessionTracking.ts +170 -0
  563. package/src/utils/storage/README.md +348 -0
  564. package/src/utils/storage/config.ts +100 -0
  565. package/src/utils/storage/helpers.ts +359 -0
  566. package/src/utils/storage/index.ts +36 -0
  567. package/src/utils/storage/types.ts +90 -0
  568. package/src/utils/validation.ts +111 -0
  569. package/src/utils/validationUtils.ts +120 -0
  570. package/src/validation/common.ts +53 -0
  571. package/src/validation/csrf.ts +214 -0
  572. package/src/validation/index.ts +43 -0
  573. package/src/validation/passwordSchema.ts +125 -0
  574. package/src/validation/sanitization.ts +96 -0
  575. package/src/validation/schemaUtils.ts +42 -0
  576. package/src/validation/sqlInjectionProtection.ts +242 -0
  577. package/src/validation/user.ts +34 -0
  578. package/dist/UnifiedAuthProvider-V7y63NjT.d.ts +0 -88
  579. package/dist/chunk-4MCJAK7J.js.map +0 -1
  580. package/dist/chunk-4ZTIEYU2.js.map +0 -1
  581. package/dist/chunk-H4PZ4B3Y.js.map +0 -1
  582. package/dist/chunk-IOX76PSM.js.map +0 -1
  583. package/dist/chunk-JUUNUW3O.js.map +0 -1
  584. package/dist/chunk-U7DY5T33.js +0 -11
  585. package/dist/chunk-U7DY5T33.js.map +0 -1
  586. package/dist/chunk-WHLSWC6W.js.map +0 -1
  587. package/dist/chunk-XI7QFSSC.js +0 -790
  588. package/dist/chunk-XI7QFSSC.js.map +0 -1
  589. package/dist/chunk-XIJMMBDD.js +0 -73
  590. package/dist/chunk-XIJMMBDD.js.map +0 -1
  591. package/dist/chunk-YNU5QJ4S.js.map +0 -1
  592. package/dist/chunk-YWYCNGWH.js +0 -2070
  593. package/dist/chunk-YWYCNGWH.js.map +0 -1
  594. package/dist/chunk-ZJ3UKPIW.js +0 -952
  595. package/dist/chunk-ZJ3UKPIW.js.map +0 -1
  596. package/dist/useAppConfig-CZNJJsT_.d.ts +0 -148
  597. package/dist/{DataTable-2LB6HI6V.js.map → DataTable-GX3XERFJ.js.map} +0 -0
  598. package/dist/{api-AIJ3IJX3.js.map → api-ETQ6YJ3C.js.map} +0 -0
  599. package/dist/{audit-PD5L5ZSC.js.map → appNameResolver-7GHF5ED2.js.map} +0 -0
  600. package/dist/{chunk-DC5AMYBS.js.map → audit-BUW3LMJB.js.map} +0 -0
  601. package/dist/{validation-D2-NNCCE.d.ts → validation-PM_iOaTI.d.ts} +6 -6
@@ -0,0 +1,233 @@
1
+ # Consuming App Vite Configuration
2
+
3
+ This document shows the **CRITICAL** Vite configuration for consuming apps using pace-core with Tailwind v4. Proper configuration is essential to ensure pace-core components are styled correctly.
4
+
5
+ ## ⚠️ Critical: Why This Configuration Matters
6
+
7
+ Pace-core components contain Tailwind classes that **MUST** be scanned during the build process. Without proper configuration:
8
+
9
+ - ❌ Component styles will be missing or broken
10
+ - ❌ Colors, spacing, and typography won't work
11
+ - ❌ The UI will be severely compromised
12
+ - ❌ The entire point of using this UI library is undermined
13
+
14
+ ## ✅ Solution: CSS-First Approach (v0.4.16+)
15
+
16
+ **NEW**: Pace-core v0.4.16+ uses Tailwind v4's CSS-first approach with `@source` directives in `core.css`. This automatically scans the published source files without requiring complex Vite configuration.
17
+
18
+ ### Method 1: CSS-First Configuration (Recommended)
19
+
20
+ ```ts
21
+ // vite.config.ts
22
+ import { defineConfig } from 'vite'
23
+ import react from '@vitejs/plugin-react'
24
+ import tailwindcss from '@tailwindcss/vite'
25
+ import path from 'path'
26
+
27
+ export default defineConfig({
28
+ plugins: [
29
+ react(),
30
+ tailwindcss({
31
+ // Only need to scan your app's source files
32
+ // pace-core source files are automatically scanned via @source directives
33
+ content: [
34
+ './src/**/*.{js,ts,jsx,tsx}'
35
+ ]
36
+ })
37
+ ],
38
+ resolve: {
39
+ alias: {
40
+ "@": path.resolve(__dirname, "./src"),
41
+ },
42
+ },
43
+ server: {
44
+ port: 3000,
45
+ open: true,
46
+ },
47
+ build: {
48
+ outDir: 'dist',
49
+ sourcemap: true,
50
+ },
51
+ })
52
+ ```
53
+
54
+ ### Method 2: Explicit Source File Scanning (Fallback)
55
+
56
+ If the CSS-first approach doesn't work, you can explicitly include pace-core source files:
57
+
58
+ ```ts
59
+ // vite.config.ts
60
+ import { defineConfig } from 'vite'
61
+ import react from '@vitejs/plugin-react'
62
+ import tailwindcss from '@tailwindcss/vite'
63
+ import path from 'path'
64
+
65
+ export default defineConfig({
66
+ plugins: [
67
+ react(),
68
+ tailwindcss({
69
+ // Explicitly include pace-core source files for scanning
70
+ content: [
71
+ './src/**/*.{js,ts,jsx,tsx}',
72
+ './node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}'
73
+ ]
74
+ })
75
+ ],
76
+ resolve: {
77
+ alias: {
78
+ "@": path.resolve(__dirname, "./src"),
79
+ },
80
+ },
81
+ server: {
82
+ port: 3000,
83
+ open: true,
84
+ },
85
+ build: {
86
+ outDir: 'dist',
87
+ sourcemap: true,
88
+ },
89
+ })
90
+ ```
91
+
92
+ ### Alternative: PostCSS Configuration
93
+
94
+ If you prefer PostCSS over Vite plugin:
95
+
96
+ ```javascript
97
+ // tailwind.config.js
98
+ /** @type {import('tailwindcss').Config} */
99
+ module.exports = {
100
+ content: [
101
+ './src/**/*.{js,ts,jsx,tsx}',
102
+ './node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}'
103
+ ],
104
+ theme: {
105
+ extend: {},
106
+ },
107
+ plugins: [],
108
+ }
109
+ ```
110
+
111
+ ## 🔄 Fallback: Hybrid Approach
112
+
113
+ If source file scanning doesn't work, try this hybrid approach:
114
+
115
+ ```ts
116
+ // vite.config.ts
117
+ import { defineConfig } from 'vite'
118
+ import react from '@vitejs/plugin-react'
119
+ import tailwindcss from '@tailwindcss/vite'
120
+
121
+ export default defineConfig({
122
+ plugins: [
123
+ react(),
124
+ tailwindcss({
125
+ content: [
126
+ './src/**/*.{js,ts,jsx,tsx}',
127
+ // Try source files first
128
+ './node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}',
129
+ // Fallback: also scan dist files
130
+ './node_modules/@jmruthers/pace-core/dist/**/*.{js,ts,jsx,tsx}'
131
+ ]
132
+ })
133
+ ],
134
+ })
135
+ ```
136
+
137
+ ## 🚨 Legacy Configuration (v0.4.14 and below)
138
+
139
+ If you're using an older version, use this configuration:
140
+
141
+ ```ts
142
+ // vite.config.ts
143
+ import { defineConfig } from 'vite'
144
+ import react from '@vitejs/plugin-react'
145
+ import tailwindcss from '@tailwindcss/vite'
146
+
147
+ export default defineConfig({
148
+ plugins: [
149
+ react(),
150
+ tailwindcss({
151
+ content: [
152
+ './src/**/*.{js,ts,jsx,tsx}',
153
+ './node_modules/@jmruthers/pace-core/**/*.{js,ts,jsx,tsx}'
154
+ ]
155
+ })
156
+ ],
157
+ })
158
+ ```
159
+
160
+ ## What This Configuration Does
161
+
162
+ 1. **Scans Your Source Files**: Detects Tailwind classes in your app's source code
163
+ 2. **Scans Pace-Core Source Files**: Ensures all Tailwind classes used in pace-core components are included
164
+ 3. **Generates Complete CSS**: Creates a CSS file with all necessary utility classes
165
+ 4. **Enables Proper Styling**: Allows pace-core components to render with correct styles
166
+
167
+ ## Verification Steps
168
+
169
+ After configuration, verify everything works:
170
+
171
+ 1. **Import the CSS file** in your main entry point:
172
+ ```tsx
173
+ import '@jmruthers/pace-core/styles/core.css';
174
+ ```
175
+
176
+ 2. **Create a test component**:
177
+ ```tsx
178
+ import { Button, Card } from '@jmruthers/pace-core';
179
+
180
+ function TestComponent() {
181
+ return (
182
+ <Card className="p-4">
183
+ <Button variant="primary" className="bg-main-600 text-main-50">
184
+ Test Button
185
+ </Button>
186
+ </Card>
187
+ );
188
+ }
189
+ ```
190
+
191
+ 3. **Check the result**: The component should render with proper PACE Core styling
192
+
193
+ 4. **Verify CSS size**: Your CSS file should be 50-100+ kB (not 20-30 kB)
194
+
195
+ ## Common Issues and Solutions
196
+
197
+ ### Issue: Components appear unstyled
198
+ **Solution**: Ensure pace-core source files are included in content scanning
199
+
200
+ ### Issue: Colors don't work (text-main-900, bg-sec-500, etc.)
201
+ **Solution**: Verify the CSS file is imported and content scanning includes pace-core source files
202
+
203
+ ### Issue: Build errors about missing classes
204
+ **Solution**: Check that your content paths are correct and include both source files and pace-core source files
205
+
206
+ ### Issue: Still only 292 CSS rules instead of 800+
207
+ **Solution**:
208
+ 1. Update to pace-core v0.4.15+
209
+ 2. Use source file paths: `./node_modules/@jmruthers/pace-core/src/**/*.{js,ts,jsx,tsx}`
210
+ 3. Clear build cache and rebuild
211
+
212
+ ### Issue: Source files not found
213
+ **Solution**: Ensure you're using pace-core v0.4.15+ which includes source files in the published package
214
+
215
+ ## Key Points
216
+
217
+ - ✅ **Required**: Must include pace-core source files in content scanning
218
+ - ✅ **Critical**: Without this, components won't be styled
219
+ - ✅ **Simple**: Just add the source file paths to your content array
220
+ - ✅ **Reliable**: Works with any project structure when configured correctly
221
+
222
+ ## What NOT to Do
223
+
224
+ - ❌ **Don't skip content configuration** - pace-core won't be scanned
225
+ - ❌ **Don't rely on automatic scanning only** - it may not catch node_modules
226
+ - ❌ **Don't forget to import the CSS file** - styles won't be available
227
+ - ❌ **Don't assume it works without testing** - always verify with a test component
228
+
229
+ ## Next Steps
230
+
231
+ - [Installation Guide](./getting-started/installation.md) - Complete setup instructions
232
+ - [Tailwind Content Scanning Guide](./troubleshooting/tailwind-content-scanning.md) - Detailed troubleshooting
233
+ - [Troubleshooting Guide](./troubleshooting/styling-issues.md) - Fix common problems
@@ -492,15 +492,15 @@ function EventStatusIndicator() {
492
492
  const status = getEventStatus(selectedEvent.event_date);
493
493
  const statusConfig = {
494
494
  past: { label: 'Past Event', color: 'text-muted-foreground' },
495
- today: { label: 'Today', color: 'text-green-600' },
496
- upcoming: { label: 'Upcoming', color: 'text-blue-600' },
495
+ today: { label: 'Today', color: 'text-main-600' },
496
+ upcoming: { label: 'Upcoming', color: 'text-main-600' },
497
497
  };
498
498
 
499
499
  return (
500
500
  <div className={`flex items-center space-x-2 ${statusConfig[status].color}`}>
501
501
  <div className={`w-2 h-2 rounded-full ${
502
502
  status === 'past' ? 'bg-muted' :
503
- status === 'today' ? 'bg-green-500' : 'bg-blue-500'
503
+ status === 'today' ? 'bg-main-500' : 'bg-main-500'
504
504
  }`} />
505
505
  <span className="text-sm font-medium">
506
506
  {statusConfig[status].label}
@@ -38,7 +38,6 @@ interface Organisation {
38
38
 
39
39
  ```typescript
40
40
  interface OrganisationSettings {
41
- theme: 'light' | 'dark' | 'auto';
42
41
  timezone: string;
43
42
  date_format: string;
44
43
  time_format: '12h' | '24h';
@@ -62,12 +62,12 @@ Permissions define specific actions users can perform on resources.
62
62
  - **settings** - Configuration management
63
63
 
64
64
  #### Permission Examples
65
- - `view_basic` - View basic organisation information
66
- - `view_details` - View detailed organisation information
67
- - `moderate_content` - Moderate content within organisation
68
- - `manage_events` - Create and manage events
69
- - `manage_members` - Manage organisation members
70
- - `manage_settings` - Manage organisation settings
65
+ - `read:page.dashboard` - View dashboard page
66
+ - `create:page.users` - Create users on users page
67
+ - `update:page.settings` - Modify settings page
68
+ - `delete:page.admin` - Remove content from admin page
69
+ - `manage:page.system` - Full system page management
70
+ - `read:events` - View event information (event-app permission)
71
71
 
72
72
  ### Permission Hierarchy
73
73
 
@@ -75,16 +75,20 @@ Permissions follow a hierarchical structure based on organisation roles:
75
75
 
76
76
  ```
77
77
  Organisation Admin
78
- ├── All permissions (view_basic, view_details, moderate_content, manage_events, manage_members, manage_settings)
78
+ ├── All page permissions (read:page.*, create:page.*, update:page.*, delete:page.*, manage:page.*)
79
+ ├── All event-app permissions (read:events, create:events, update:events, delete:events)
79
80
 
80
81
  Leader
81
- ├── view_basic, view_details, moderate_content, manage_events
82
+ ├── Most page permissions (read:page.*, create:page.*, update:page.*)
83
+ ├── Event management (read:events, create:events, update:events)
82
84
 
83
85
  Member
84
- ├── view_basic, view_details
86
+ ├── Basic page permissions (read:page.dashboard, read:page.users)
87
+ ├── Basic event access (read:events)
85
88
 
86
89
  Supporter
87
- ├── view_basic
90
+ ├── Limited page permissions (read:page.dashboard)
91
+ ├── No event access
88
92
  ```
89
93
 
90
94
  ### Role-Based Permission Mapping
@@ -150,6 +154,15 @@ Permissions can be scoped to specific resources:
150
154
 
151
155
  ## Security Features
152
156
 
157
+ ### Database-First Architecture
158
+
159
+ The RBAC system uses a **database-first architecture** where all permission logic resides in PostgreSQL functions:
160
+
161
+ - **RPC Functions** - All permission checks use `get_rbac_permissions()` RPC function
162
+ - **RLS Protection** - Direct table access is blocked by Row Level Security policies
163
+ - **Elevated Privileges** - RPC functions run with elevated privileges to bypass RLS
164
+ - **Single Source of Truth** - All permission logic centralized in database functions
165
+
153
166
  ### Permission Validation
154
167
 
155
168
  - **Runtime Checking** - Permissions are validated on every request
@@ -20,7 +20,10 @@ Comprehensive checklist for maintaining consistent, high-quality documentation a
20
20
  // ✅ Good - Complete, runnable example
21
21
  import React, { useState } from 'react';
22
22
  import { DataTable, Button } from '@jmruthers/pace-core';
23
- import '@jmruthers/pace-core/styles/tokens';
23
+
24
+ // Import the core CSS file (in your app's entry point)
25
+ import './app.css'; // Your app's color palette (must come first)
26
+ import '@jmruthers/pace-core/styles/core.css';
24
27
 
25
28
  interface User {
26
29
  id: string;
@@ -119,7 +122,10 @@ function MyComponent() {
119
122
  // ✅ Good - Complete imports
120
123
  import React, { useState, useEffect } from 'react';
121
124
  import { DataTable, Button, useUnifiedAuth } from '@jmruthers/pace-core';
122
- import '@jmruthers/pace-core/styles/tokens';
125
+
126
+ // Import the core CSS file (in your app's entry point)
127
+ import './app.css'; // Your app's color palette (must come first)
128
+ import '@jmruthers/pace-core/styles/core.css';
123
129
 
124
130
  // ❌ Bad - Incomplete imports
125
131
  import { DataTable } from '@jmruthers/pace-core';
@@ -0,0 +1,344 @@
1
+ # NavigationMenu Authentication Fix Example
2
+
3
+ This example shows how to fix the NavigationMenu authentication context issue reported in the bug report.
4
+
5
+ ## Problem
6
+
7
+ The consuming app was getting `permissions: undefined`, `roles: undefined`, `accessLevel: undefined` in console logs from the NavigationMenu component.
8
+
9
+ ## Root Cause
10
+
11
+ The NavigationMenu component was not properly connected to the authentication context from `useUnifiedAuth`.
12
+
13
+ ## Solution
14
+
15
+ ### 1. Updated NavigationMenu Component
16
+
17
+ The NavigationMenu component now properly uses the authentication context:
18
+
19
+ ```tsx
20
+ // packages/core/src/components/NavigationMenu/NavigationMenu.tsx
21
+ import { useUnifiedAuth } from "../../providers/UnifiedAuthProvider";
22
+
23
+ export const NavigationMenu = React.forwardRef<HTMLDivElement, NavigationMenuProps>(({
24
+ items,
25
+ filterByPermissions = true,
26
+ auditLog = true,
27
+ ...props
28
+ }, ref) => {
29
+ // Get authentication context
30
+ const authContext = React.useMemo(() => {
31
+ try {
32
+ return useUnifiedAuth();
33
+ } catch (error) {
34
+ console.warn('[NavigationMenu] useUnifiedAuth not available, running in unauthenticated mode');
35
+ return null;
36
+ }
37
+ }, []);
38
+
39
+ // Filter navigation items based on permissions
40
+ const filteredItems = React.useMemo(() => {
41
+ if (!filterByPermissions || !authContext) return items;
42
+
43
+ return items.filter(item => {
44
+ // Check permissions if available
45
+ if (item.permissions && item.permissions.length > 0) {
46
+ const hasPermission = item.permissions.some(permission =>
47
+ authContext.hasPermission(permission)
48
+ );
49
+ if (!hasPermission) return false;
50
+ }
51
+
52
+ // Check roles if available
53
+ if (item.roles && item.roles.length > 0) {
54
+ const hasRole = item.roles.some(role =>
55
+ authContext.hasRole(role)
56
+ );
57
+ if (!hasRole) return false;
58
+ }
59
+
60
+ return true;
61
+ });
62
+ }, [items, filterByPermissions, authContext]);
63
+
64
+ // Log navigation access attempts for debugging
65
+ React.useEffect(() => {
66
+ if (auditLog && authContext) {
67
+ console.log('[NavigationMenu] Navigation access attempt:', {
68
+ itemId: 'navigation-menu',
69
+ label: 'Navigation Menu',
70
+ href: currentPath,
71
+ permissions: authContext.permissions,
72
+ roles: authContext.roles,
73
+ accessLevel: authContext.accessLevel,
74
+ timestamp: new Date().toISOString()
75
+ });
76
+ }
77
+ }, [auditLog, authContext, currentPath]);
78
+
79
+ // ... rest of component
80
+ });
81
+ ```
82
+
83
+ ### 2. Updated NavigationItem Type
84
+
85
+ Navigation items now support permission requirements:
86
+
87
+ ```typescript
88
+ interface NavigationItem {
89
+ id: string;
90
+ label: string;
91
+ href?: string;
92
+ icon?: string;
93
+ children?: NavigationItem[];
94
+ isActive?: boolean;
95
+ permissions?: string[];
96
+ roles?: string[];
97
+ accessLevel?: string;
98
+ pageId?: string;
99
+ strictMode?: boolean;
100
+ meta?: {
101
+ title?: string;
102
+ description?: string;
103
+ hidden?: boolean;
104
+ order?: number;
105
+ };
106
+ }
107
+ ```
108
+
109
+ ### 3. Correct App Structure
110
+
111
+ The consuming app should use this structure:
112
+
113
+ ```tsx
114
+ // App.tsx
115
+ import React from 'react';
116
+ import { BrowserRouter, Routes, Route } from 'react-router-dom';
117
+ import {
118
+ UnifiedAuthProvider,
119
+ OrganisationProvider,
120
+ EventProvider,
121
+ PaceAppLayout
122
+ } from '@jmruthers/pace-core';
123
+ import { supabase } from './integrations/supabase/client';
124
+ import { AuthenticatedApp } from './AuthenticatedApp';
125
+
126
+ function App() {
127
+ return (
128
+ <BrowserRouter>
129
+ <Routes>
130
+ <Route path="/*" element={
131
+ <UnifiedAuthProvider supabaseClient={supabase} appName="CAKE">
132
+ <OrganisationProvider>
133
+ <EventProvider>
134
+ <AuthenticatedApp />
135
+ </EventProvider>
136
+ </OrganisationProvider>
137
+ </UnifiedAuthProvider>
138
+ } />
139
+ </Routes>
140
+ </BrowserRouter>
141
+ );
142
+ }
143
+
144
+ export default App;
145
+ ```
146
+
147
+ ### 4. Updated AuthenticatedApp
148
+
149
+ ```tsx
150
+ // AuthenticatedApp.tsx
151
+ import React from 'react';
152
+ import { Routes, Route } from 'react-router-dom';
153
+ import {
154
+ useUnifiedAuth,
155
+ PaceAppLayout,
156
+ NavigationItem,
157
+ PaceLoginPage
158
+ } from "@jmruthers/pace-core";
159
+
160
+ export function AuthenticatedApp() {
161
+ const { isAuthenticated, user, isLoading, accessLevel, roles } = useUnifiedAuth();
162
+
163
+ if (!isAuthenticated) {
164
+ return <PaceLoginPage appName="CAKE" />;
165
+ }
166
+
167
+ // Define navigation items with permission requirements
168
+ const navItems: NavigationItem[] = [
169
+ {
170
+ id: 'meals',
171
+ label: 'Meals',
172
+ href: '/meals',
173
+ permissions: ['meals:read']
174
+ },
175
+ {
176
+ id: 'dishes',
177
+ label: 'Dishes',
178
+ href: '/dishes',
179
+ permissions: ['dishes:read']
180
+ },
181
+ {
182
+ id: 'items',
183
+ label: 'Items',
184
+ href: '/items',
185
+ permissions: ['items:read']
186
+ },
187
+ {
188
+ id: 'diners',
189
+ label: 'Diners',
190
+ href: '/diners',
191
+ permissions: ['diners:read']
192
+ },
193
+ {
194
+ id: 'menus',
195
+ label: 'Menus',
196
+ href: '/menus',
197
+ permissions: ['menus:read']
198
+ },
199
+ {
200
+ id: 'distribution',
201
+ label: 'Distribution',
202
+ href: '/distribution',
203
+ permissions: ['distribution:read']
204
+ },
205
+ {
206
+ id: 'suppliers',
207
+ label: 'Suppliers',
208
+ href: '/suppliers',
209
+ permissions: ['suppliers:read']
210
+ },
211
+ ];
212
+
213
+ return (
214
+ <PaceAppLayout
215
+ key="main-layout"
216
+ appName="CAKE"
217
+ navItems={navItems}
218
+ showEventSelector={true}
219
+ >
220
+ <Routes>
221
+ <Route index element={<div>Meals Page</div>} />
222
+ <Route path="meals" element={<div>Meals Page</div>} />
223
+ <Route path="dishes" element={<div>Dishes Page</div>} />
224
+ <Route path="items" element={<div>Items Page</div>} />
225
+ <Route path="diners" element={<div>Diners Page</div>} />
226
+ <Route path="menus" element={<div>Menus Page</div>} />
227
+ <Route path="distribution" element={<div>Distribution Page</div>} />
228
+ <Route path="suppliers" element={<div>Suppliers Page</div>} />
229
+ <Route path="*" element={<div>Not Found</div>} />
230
+ </Routes>
231
+ </PaceAppLayout>
232
+ );
233
+ }
234
+ ```
235
+
236
+ ### 5. Alternative: Direct NavigationMenu Usage
237
+
238
+ If you want to use NavigationMenu directly without PaceAppLayout:
239
+
240
+ ```tsx
241
+ import { NavigationMenu } from '@jmruthers/pace-core';
242
+ import { useUnifiedAuth } from '@jmruthers/pace-core/providers';
243
+
244
+ function CustomNavigation() {
245
+ const { hasPermission, hasRole } = useUnifiedAuth();
246
+
247
+ const navItems: NavigationItem[] = [
248
+ {
249
+ id: 'meals',
250
+ label: 'Meals',
251
+ href: '/meals',
252
+ permissions: ['meals:read']
253
+ },
254
+ {
255
+ id: 'admin',
256
+ label: 'Admin Panel',
257
+ href: '/admin',
258
+ roles: ['admin', 'super_admin']
259
+ }
260
+ ];
261
+
262
+ return (
263
+ <NavigationMenu
264
+ items={navItems}
265
+ currentPath={location.pathname}
266
+ onNavigate={(item) => navigate(item.href)}
267
+ buttonText="Menu"
268
+ filterByPermissions={true}
269
+ auditLog={true}
270
+ />
271
+ );
272
+ }
273
+ ```
274
+
275
+ ## Expected Results
276
+
277
+ After implementing this fix:
278
+
279
+ 1. **Console logs will show proper authentication context**:
280
+ ```javascript
281
+ [NavigationMenu] Navigation access attempt: {
282
+ itemId: "navigation-menu",
283
+ label: "Navigation Menu",
284
+ href: "/meals",
285
+ permissions: { "meals:read": true, "dishes:read": true },
286
+ roles: ["user", "admin"],
287
+ accessLevel: "super",
288
+ timestamp: "2025-10-06T04:38:15.2012"
289
+ }
290
+ ```
291
+
292
+ 2. **Navigation items will be filtered based on permissions**:
293
+ - Items with `permissions: ['meals:read']` will only show if user has that permission
294
+ - Items with `roles: ['admin']` will only show if user has that role
295
+
296
+ 3. **No more "useUnifiedAuth not available" warnings**
297
+
298
+ ## Testing
299
+
300
+ To test the fix:
301
+
302
+ 1. **Check console logs**: Should show proper authentication context
303
+ 2. **Test permission filtering**: Remove permissions from user and verify items are hidden
304
+ 3. **Test role filtering**: Change user roles and verify admin items show/hide
305
+ 4. **Test audit logging**: Enable `auditLog={true}` and verify logs are generated
306
+
307
+ ## Migration Guide
308
+
309
+ If you're updating from the old NavigationMenu:
310
+
311
+ 1. **Add permission requirements to navigation items**:
312
+ ```tsx
313
+ // Old way
314
+ const navItems = [
315
+ { id: 'meals', label: 'Meals', href: '/meals' }
316
+ ];
317
+
318
+ // New way
319
+ const navItems = [
320
+ { id: 'meals', label: 'Meals', href: '/meals', permissions: ['meals:read'] }
321
+ ];
322
+ ```
323
+
324
+ 2. **Enable permission filtering**:
325
+ ```tsx
326
+ <NavigationMenu
327
+ items={navItems}
328
+ filterByPermissions={true}
329
+ auditLog={true}
330
+ />
331
+ ```
332
+
333
+ 3. **Ensure proper provider hierarchy**:
334
+ ```tsx
335
+ <UnifiedAuthProvider>
336
+ <OrganisationProvider>
337
+ <EventProvider>
338
+ <NavigationMenu items={navItems} />
339
+ </EventProvider>
340
+ </OrganisationProvider>
341
+ </UnifiedAuthProvider>
342
+ ```
343
+
344
+ This fix resolves the authentication context issue and provides proper permission-based navigation filtering.