@jmruthers/pace-core 0.5.135 → 0.5.137

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 (544) hide show
  1. package/dist/{DataTable-A36PJG6N.js → DataTable-6M4L6BI2.js} +26 -13
  2. package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
  3. package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-rFL_kRjk.d.ts} +123 -135
  4. package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
  5. package/dist/{UnifiedAuthProvider-CQDZRJIS.js → UnifiedAuthProvider-XIQQ7LVU.js} +5 -5
  6. package/dist/{api-TNIBJWLM.js → api-45XYYO2A.js} +4 -3
  7. package/dist/{audit-T36HM7IM.js → audit-64X3VJXB.js} +3 -2
  8. package/dist/{chunk-F64FFPOZ.js → chunk-22WKWKRX.js} +26 -20
  9. package/dist/chunk-22WKWKRX.js.map +1 -0
  10. package/dist/{chunk-VZ5OR6HD.js → chunk-4C7EXCAR.js} +62 -150
  11. package/dist/chunk-4C7EXCAR.js.map +1 -0
  12. package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
  13. package/dist/chunk-56XJ3TU6.js.map +1 -0
  14. package/dist/{chunk-CTJRBUX2.js → chunk-6LAAY47Q.js} +2 -2
  15. package/dist/{chunk-UJI6WSMD.js → chunk-7QCC6MCP.js} +90 -3
  16. package/dist/chunk-7QCC6MCP.js.map +1 -0
  17. package/dist/{chunk-66C4BSAY.js → chunk-ANBQRTPX.js} +9 -2
  18. package/dist/chunk-ANBQRTPX.js.map +1 -0
  19. package/dist/{chunk-CQZU6TFE.js → chunk-BCIBECNB.js} +100 -62
  20. package/dist/chunk-BCIBECNB.js.map +1 -0
  21. package/dist/{chunk-GKHF54DI.js → chunk-BESYRHQM.js} +10 -4
  22. package/dist/chunk-BESYRHQM.js.map +1 -0
  23. package/dist/chunk-BJPBT3CU.js +21 -0
  24. package/dist/chunk-BJPBT3CU.js.map +1 -0
  25. package/dist/{chunk-BYXRHAIF.js → chunk-BLCXZEYF.js} +23 -14
  26. package/dist/chunk-BLCXZEYF.js.map +1 -0
  27. package/dist/{chunk-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
  28. package/dist/chunk-BVYWGZVV.js.map +1 -0
  29. package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
  30. package/dist/chunk-ERISIBYU.js.map +1 -0
  31. package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
  32. package/dist/chunk-FMUCXFII.js.map +1 -0
  33. package/dist/{chunk-GVDR7WNV.js → chunk-HAWZXGR2.js} +334 -614
  34. package/dist/chunk-HAWZXGR2.js.map +1 -0
  35. package/dist/{chunk-ZV77RZMU.js → chunk-INQLMHPF.js} +2 -2
  36. package/dist/chunk-JISYG63F.js +70 -0
  37. package/dist/chunk-JISYG63F.js.map +1 -0
  38. package/dist/{chunk-HMNOSGVA.js → chunk-KYRHUBIU.js} +576 -767
  39. package/dist/chunk-KYRHUBIU.js.map +1 -0
  40. package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
  41. package/dist/chunk-LS353YLY.js.map +1 -0
  42. package/dist/{chunk-TGIY2AR2.js → chunk-MA6EPSGZ.js} +4 -3
  43. package/dist/{chunk-TGIY2AR2.js.map → chunk-MA6EPSGZ.js.map} +1 -1
  44. package/dist/chunk-OWAG3GSU.js +58 -0
  45. package/dist/chunk-OWAG3GSU.js.map +1 -0
  46. package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
  47. package/dist/chunk-Q5QRDWKI.js.map +1 -0
  48. package/dist/chunk-S5OFRT4M.js +94 -0
  49. package/dist/chunk-S5OFRT4M.js.map +1 -0
  50. package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
  51. package/dist/chunk-SBVILCCA.js.map +1 -0
  52. package/dist/{chunk-ZYZCRSBD.js → chunk-T6JN6LH6.js} +16 -11
  53. package/dist/chunk-T6JN6LH6.js.map +1 -0
  54. package/dist/chunk-XDNLUEXI.js +138 -0
  55. package/dist/chunk-XDNLUEXI.js.map +1 -0
  56. package/dist/{chunk-3CG5L6RN.js → chunk-YCWDTTUK.js} +90 -75
  57. package/dist/chunk-YCWDTTUK.js.map +1 -0
  58. package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
  59. package/dist/chunk-ZZ2SS7NI.js.map +1 -0
  60. package/dist/components.d.ts +7 -287
  61. package/dist/components.js +27 -157
  62. package/dist/components.js.map +1 -1
  63. package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
  64. package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
  65. package/dist/hooks.d.ts +3 -3
  66. package/dist/hooks.js +21 -16
  67. package/dist/hooks.js.map +1 -1
  68. package/dist/index.d.ts +101 -9
  69. package/dist/index.js +44 -31
  70. package/dist/index.js.map +1 -1
  71. package/dist/providers.d.ts +1 -1
  72. package/dist/providers.js +4 -4
  73. package/dist/rbac/index.js +12 -12
  74. package/dist/schema-DTDZQe2u.d.ts +28 -0
  75. package/dist/styles/index.js +2 -1
  76. package/dist/theming/runtime.d.ts +2 -19
  77. package/dist/theming/runtime.js +2 -1
  78. package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
  79. package/dist/types.d.ts +153 -4
  80. package/dist/types.js +51 -16
  81. package/dist/types.js.map +1 -1
  82. package/dist/{useInactivityTracker-MRUU55XI.js → useInactivityTracker-TO6ZOF35.js} +3 -2
  83. package/dist/{usePublicRouteParams-Dyt1tzI9.d.ts → usePublicRouteParams-B7PabvuH.d.ts} +1 -1
  84. package/dist/utils.d.ts +221 -173
  85. package/dist/utils.js +185 -225
  86. package/dist/utils.js.map +1 -1
  87. package/dist/validation.d.ts +24 -115
  88. package/dist/validation.js +19 -474
  89. package/dist/validation.js.map +1 -1
  90. package/docs/api/classes/ColumnFactory.md +1 -1
  91. package/docs/api/classes/ErrorBoundary.md +6 -6
  92. package/docs/api/classes/InvalidScopeError.md +1 -1
  93. package/docs/api/classes/MissingUserContextError.md +1 -1
  94. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  95. package/docs/api/classes/PermissionDeniedError.md +1 -1
  96. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  97. package/docs/api/classes/RBACAuditManager.md +6 -6
  98. package/docs/api/classes/RBACCache.md +1 -1
  99. package/docs/api/classes/RBACEngine.md +7 -7
  100. package/docs/api/classes/RBACError.md +1 -1
  101. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  102. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  103. package/docs/api/classes/StorageUtils.md +1 -1
  104. package/docs/api/enums/FileCategory.md +1 -1
  105. package/docs/api/interfaces/AggregateConfig.md +4 -4
  106. package/docs/api/interfaces/BadgeProps.md +27 -0
  107. package/docs/api/interfaces/ButtonProps.md +1 -1
  108. package/docs/api/interfaces/CardProps.md +1 -1
  109. package/docs/api/interfaces/ColorPalette.md +1 -1
  110. package/docs/api/interfaces/ColorShade.md +29 -4
  111. package/docs/api/interfaces/DataAccessRecord.md +9 -9
  112. package/docs/api/interfaces/DataRecord.md +1 -1
  113. package/docs/api/interfaces/DataTableAction.md +18 -18
  114. package/docs/api/interfaces/DataTableColumn.md +61 -1
  115. package/docs/api/interfaces/DataTableProps.md +1 -1
  116. package/docs/api/interfaces/DataTableToolbarButton.md +7 -7
  117. package/docs/api/interfaces/EmptyStateConfig.md +5 -5
  118. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +14 -14
  119. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  120. package/docs/api/interfaces/EventLogoProps.md +152 -0
  121. package/docs/api/interfaces/ExportColumn.md +1 -1
  122. package/docs/api/interfaces/ExportOptions.md +8 -8
  123. package/docs/api/interfaces/FileDisplayProps.md +15 -15
  124. package/docs/api/interfaces/FileMetadata.md +1 -1
  125. package/docs/api/interfaces/FileReference.md +1 -1
  126. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  127. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  128. package/docs/api/interfaces/FileUploadProps.md +1 -1
  129. package/docs/api/interfaces/FooterProps.md +1 -1
  130. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  131. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  132. package/docs/api/interfaces/InputProps.md +1 -1
  133. package/docs/api/interfaces/LabelProps.md +1 -1
  134. package/docs/api/interfaces/LoginFormProps.md +1 -1
  135. package/docs/api/interfaces/NavigationAccessRecord.md +10 -10
  136. package/docs/api/interfaces/NavigationContextType.md +9 -9
  137. package/docs/api/interfaces/NavigationGuardProps.md +10 -10
  138. package/docs/api/interfaces/NavigationItem.md +1 -1
  139. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  140. package/docs/api/interfaces/NavigationProviderProps.md +7 -7
  141. package/docs/api/interfaces/Organisation.md +1 -1
  142. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  143. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  144. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  145. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  146. package/docs/api/interfaces/PaceAppLayoutProps.md +27 -27
  147. package/docs/api/interfaces/PaceLoginPageProps.md +4 -4
  148. package/docs/api/interfaces/PageAccessRecord.md +8 -8
  149. package/docs/api/interfaces/PagePermissionContextType.md +8 -8
  150. package/docs/api/interfaces/PagePermissionGuardProps.md +11 -11
  151. package/docs/api/interfaces/PagePermissionProviderProps.md +7 -7
  152. package/docs/api/interfaces/PaletteData.md +4 -4
  153. package/docs/api/interfaces/PermissionEnforcerProps.md +11 -11
  154. package/docs/api/interfaces/ProtectedRouteProps.md +6 -6
  155. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  156. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  157. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  158. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  159. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  160. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  161. package/docs/api/interfaces/RBACConfig.md +1 -1
  162. package/docs/api/interfaces/RBACLogger.md +1 -1
  163. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  164. package/docs/api/interfaces/RoleBasedRouterContextType.md +8 -8
  165. package/docs/api/interfaces/RoleBasedRouterProps.md +10 -10
  166. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  167. package/docs/api/interfaces/RouteAccessRecord.md +10 -10
  168. package/docs/api/interfaces/RouteConfig.md +10 -10
  169. package/docs/api/interfaces/SecureDataContextType.md +9 -9
  170. package/docs/api/interfaces/SecureDataProviderProps.md +8 -8
  171. package/docs/api/interfaces/SessionRestorationLoaderProps.md +21 -0
  172. package/docs/api/interfaces/StorageConfig.md +1 -1
  173. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  174. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  175. package/docs/api/interfaces/StorageListOptions.md +1 -1
  176. package/docs/api/interfaces/StorageListResult.md +1 -1
  177. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  178. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  179. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  180. package/docs/api/interfaces/StyleImport.md +1 -1
  181. package/docs/api/interfaces/SwitchProps.md +1 -1
  182. package/docs/api/interfaces/ToastActionElement.md +1 -1
  183. package/docs/api/interfaces/ToastProps.md +1 -1
  184. package/docs/api/interfaces/UnifiedAuthContextType.md +53 -53
  185. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  186. package/docs/api/interfaces/UseInactivityTrackerOptions.md +9 -9
  187. package/docs/api/interfaces/UseInactivityTrackerReturn.md +8 -8
  188. package/docs/api/interfaces/UsePublicEventOptions.md +3 -3
  189. package/docs/api/interfaces/UsePublicEventReturn.md +5 -5
  190. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +4 -4
  191. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +9 -9
  192. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  193. package/docs/api/interfaces/UseResolvedScopeOptions.md +4 -4
  194. package/docs/api/interfaces/UseResolvedScopeReturn.md +4 -4
  195. package/docs/api/interfaces/UserEventAccess.md +11 -11
  196. package/docs/api/interfaces/UserMenuProps.md +1 -1
  197. package/docs/api/interfaces/UserProfile.md +1 -1
  198. package/docs/api/modules.md +591 -220
  199. package/docs/api-reference/components.md +106 -26
  200. package/docs/architecture/README.md +0 -3
  201. package/docs/implementation-guides/data-tables.md +277 -13
  202. package/docs/implementation-guides/forms.md +1 -16
  203. package/docs/implementation-guides/permission-enforcement.md +8 -2
  204. package/docs/styles/README.md +0 -2
  205. package/examples/README.md +30 -14
  206. package/examples/STRUCTURE.md +125 -0
  207. package/examples/components 2/DataTable/HierarchicalActionsExample.tsx +421 -0
  208. package/examples/components 2/DataTable/HierarchicalExample.tsx +475 -0
  209. package/examples/components 2/DataTable/InitialPageSizeExample.tsx +177 -0
  210. package/examples/components 2/DataTable/PerformanceExample.tsx +506 -0
  211. package/examples/components 2/DataTable/index.ts +13 -0
  212. package/examples/components 2/Dialog/BasicHtmlTest.tsx +55 -0
  213. package/examples/components 2/Dialog/DebugHtmlExample.tsx +68 -0
  214. package/examples/components 2/Dialog/HtmlDialogExample.tsx +202 -0
  215. package/examples/components 2/Dialog/ScrollableDialogExample.tsx +290 -0
  216. package/examples/components 2/Dialog/SimpleHtmlTest.tsx +61 -0
  217. package/examples/components 2/Dialog/SmartDialogExample.tsx +322 -0
  218. package/examples/components 2/Dialog/index.ts +15 -0
  219. package/examples/components 2/index.ts +11 -0
  220. package/examples/features/index.ts +12 -0
  221. package/{src/examples → examples/features/public-pages}/CorrectPublicPageImplementation.tsx +14 -17
  222. package/{src/examples → examples/features/public-pages}/PublicEventPage.tsx +14 -27
  223. package/{src/examples → examples/features/public-pages}/PublicPageApp.tsx +15 -28
  224. package/{src/examples → examples/features/public-pages}/PublicPageUsageExample.tsx +8 -10
  225. package/examples/features/public-pages/index.ts +14 -0
  226. package/examples/features/rbac/CompleteRBACExample.tsx +324 -0
  227. package/examples/features/rbac/EventBasedApp.tsx +239 -0
  228. package/examples/features/rbac/PermissionExample.tsx +151 -0
  229. package/examples/features/rbac/index.ts +13 -0
  230. package/examples/index.ts +11 -3
  231. package/package.json +30 -19
  232. package/src/__tests__/TEST_STANDARD.md +92 -0
  233. package/src/components/Alert/Alert.tsx +1 -1
  234. package/src/components/Avatar/Avatar.tsx +1 -1
  235. package/src/components/Badge/Badge.test.tsx +314 -0
  236. package/src/components/Badge/Badge.tsx +304 -0
  237. package/src/components/Badge/index.ts +3 -0
  238. package/src/components/Button/Button.tsx +1 -1
  239. package/src/components/Card/Card.tsx +1 -1
  240. package/src/components/Checkbox/Checkbox.tsx +1 -1
  241. package/src/components/DataTable/DataTable.test.tsx +1 -1
  242. package/src/components/DataTable/DataTable.tsx +1 -30
  243. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
  244. package/src/components/DataTable/__tests__/DataTableCore.test-setup.ts +217 -0
  245. package/src/components/DataTable/__tests__/styles.test.ts +3 -3
  246. package/src/components/DataTable/components/ActionButtons.tsx +0 -15
  247. package/src/components/DataTable/components/ColumnFilter.tsx +8 -4
  248. package/src/components/DataTable/components/DataTableBody.tsx +461 -0
  249. package/src/components/DataTable/components/DataTableCore.tsx +4 -185
  250. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
  251. package/src/components/DataTable/components/DataTableModals.tsx +1 -27
  252. package/src/components/DataTable/components/DraggableColumnHeader.tsx +144 -0
  253. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  254. package/src/components/DataTable/components/FilterRow.tsx +9 -3
  255. package/src/components/DataTable/components/ImportModal.tsx +2 -14
  256. package/src/components/DataTable/components/PaginationControls.tsx +2 -1
  257. package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
  258. package/src/components/DataTable/components/VirtualizedDataTable.tsx +513 -0
  259. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +14 -68
  260. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
  261. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +62 -0
  262. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
  263. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
  264. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +43 -0
  265. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
  266. package/src/components/DataTable/core/ActionManager.ts +235 -0
  267. package/src/components/DataTable/core/ColumnManager.ts +205 -0
  268. package/src/components/DataTable/core/DataManager.ts +188 -0
  269. package/src/components/DataTable/core/DataTableContext.tsx +181 -0
  270. package/src/components/DataTable/core/LocalDataAdapter.ts +273 -0
  271. package/src/components/DataTable/core/PluginRegistry.ts +229 -0
  272. package/src/components/DataTable/core/StateManager.ts +311 -0
  273. package/src/components/DataTable/core/interfaces.ts +338 -0
  274. package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
  275. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
  276. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
  277. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
  278. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
  279. package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
  280. package/src/components/DataTable/index.ts +4 -0
  281. package/src/components/DataTable/styles.ts +28 -7
  282. package/src/components/DataTable/types.ts +13 -0
  283. package/src/components/DataTable/utils/__tests__/columnUtils.test.ts +94 -0
  284. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
  285. package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
  286. package/src/components/DataTable/utils/columnUtils.ts +40 -0
  287. package/src/components/DataTable/utils/debugTools.ts +609 -0
  288. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  289. package/src/components/DataTable/utils/flexibleImport.ts +1 -11
  290. package/src/components/DataTable/utils/index.ts +2 -0
  291. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  292. package/src/components/Dialog/Dialog.tsx +2 -2
  293. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +8 -1
  294. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
  295. package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
  296. package/src/components/EventSelector/EventSelector.tsx +3 -2
  297. package/src/components/FileDisplay/FileDisplay.tsx +2 -36
  298. package/src/components/FileUpload/FileUpload.test.tsx +2 -2
  299. package/src/components/FileUpload/FileUpload.tsx +2 -2
  300. package/src/components/Footer/Footer.test.tsx +1 -1
  301. package/src/components/Footer/Footer.tsx +1 -1
  302. package/src/components/Form/Form.test.tsx +5 -510
  303. package/src/components/Form/Form.tsx +1 -1
  304. package/src/components/Form/FormField.tsx +1 -1
  305. package/src/components/Form/index.ts +0 -12
  306. package/src/components/Header/Header.tsx +1 -1
  307. package/src/components/Input/Input.tsx +1 -1
  308. package/src/components/Label/Label.tsx +1 -1
  309. package/src/components/LoginForm/LoginForm.test.tsx +1 -1
  310. package/src/components/LoginForm/LoginForm.tsx +1 -1
  311. package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
  312. package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
  313. package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
  314. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
  315. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
  316. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +76 -10
  317. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
  318. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
  319. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
  320. package/src/components/PaceLoginPage/PaceLoginPage.tsx +14 -13
  321. package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
  322. package/src/components/PasswordReset/index.ts +0 -2
  323. package/src/components/Progress/Progress.tsx +1 -1
  324. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
  325. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
  326. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  327. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
  328. package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
  329. package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
  330. package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
  331. package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
  332. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
  333. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +1 -1
  334. package/src/components/PublicLayout/index.ts +4 -2
  335. package/src/components/Select/Select.test.tsx +1 -1
  336. package/src/components/Select/Select.tsx +21 -9
  337. package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
  338. package/src/components/SessionRestorationLoader/index.ts +3 -0
  339. package/src/components/Switch/Switch.tsx +1 -1
  340. package/src/components/Table/Table.tsx +1 -1
  341. package/src/components/Table/__tests__/Table.test.tsx +1 -1
  342. package/src/components/Toast/Toast.tsx +1 -1
  343. package/src/components/Tooltip/Tooltip.tsx +1 -1
  344. package/src/components/index.ts +7 -10
  345. package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
  346. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
  347. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
  348. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
  349. package/src/hooks/__tests__/useFileUrl.unit.test.ts +83 -85
  350. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
  351. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
  352. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
  353. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
  354. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
  355. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
  356. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
  357. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
  358. package/src/hooks/public/usePublicEvent.ts +7 -6
  359. package/src/hooks/public/usePublicEventLogo.ts +7 -4
  360. package/src/hooks/public/usePublicFileDisplay.ts +6 -150
  361. package/src/hooks/useComponentPerformance.ts +4 -1
  362. package/src/hooks/useDataTablePerformance.ts +4 -3
  363. package/src/hooks/useEventTheme.test.ts +18 -5
  364. package/src/hooks/useEventTheme.ts +4 -1
  365. package/src/hooks/useEvents.ts +2 -0
  366. package/src/hooks/useFileDisplay.ts +9 -8
  367. package/src/hooks/useFileReference.ts +4 -1
  368. package/src/hooks/useFileUrl.ts +4 -1
  369. package/src/hooks/useInactivityTracker.ts +5 -4
  370. package/src/hooks/useOrganisationSecurity.test.ts +33 -12
  371. package/src/hooks/useOrganisationSecurity.ts +8 -7
  372. package/src/hooks/usePerformanceMonitor.ts +6 -3
  373. package/src/hooks/usePermissionCache.ts +13 -6
  374. package/src/hooks/useSecureDataAccess.test.ts +2 -2
  375. package/src/hooks/useSecureDataAccess.ts +9 -8
  376. package/src/hooks/useSessionRestoration.ts +4 -1
  377. package/src/hooks/useStorage.ts +4 -1
  378. package/src/index.ts +20 -7
  379. package/src/providers/services/AuthServiceProvider.tsx +3 -2
  380. package/src/providers/services/EventServiceProvider.tsx +2 -1
  381. package/src/providers/services/InactivityServiceProvider.tsx +2 -1
  382. package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
  383. package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
  384. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
  385. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
  386. package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
  387. package/src/rbac/api.ts +5 -2
  388. package/src/rbac/audit-enhanced.ts +6 -6
  389. package/src/rbac/audit.test.ts +60 -38
  390. package/src/rbac/audit.ts +8 -8
  391. package/src/rbac/cache-invalidation.ts +7 -4
  392. package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
  393. package/src/rbac/components/NavigationGuard.tsx +7 -3
  394. package/src/rbac/components/NavigationProvider.tsx +6 -3
  395. package/src/rbac/components/PagePermissionGuard.tsx +28 -16
  396. package/src/rbac/components/PagePermissionProvider.tsx +4 -1
  397. package/src/rbac/components/PermissionEnforcer.tsx +9 -3
  398. package/src/rbac/components/RoleBasedRouter.tsx +3 -1
  399. package/src/rbac/components/SecureDataProvider.tsx +7 -3
  400. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
  401. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
  402. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
  403. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
  404. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
  405. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
  406. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
  407. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
  408. package/src/rbac/engine.ts +15 -7
  409. package/src/rbac/hooks/usePermissions.ts +7 -3
  410. package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
  411. package/src/rbac/hooks/useResolvedScope.ts +10 -7
  412. package/src/rbac/permissions.ts +5 -2
  413. package/src/rbac/security.test.ts +27 -16
  414. package/src/rbac/security.ts +5 -4
  415. package/src/services/AuthService.ts +22 -21
  416. package/src/services/EventService.ts +12 -12
  417. package/src/services/InactivityService.ts +5 -4
  418. package/src/services/OrganisationService.ts +26 -25
  419. package/src/services/__tests__/AuthService.test.ts +51 -19
  420. package/src/services/__tests__/EventService.test.ts +37 -5
  421. package/src/services/__tests__/InactivityService.test.ts +38 -4
  422. package/src/services/__tests__/OrganisationService.test.ts +3 -8
  423. package/src/services/base/BaseService.ts +3 -1
  424. package/src/styles/core.css +3 -0
  425. package/src/theming/__tests__/runtime.test.ts +21 -12
  426. package/src/theming/parseEventColours.ts +5 -19
  427. package/src/theming/runtime.ts +8 -4
  428. package/src/types/validation.ts +2 -29
  429. package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
  430. package/src/utils/__tests__/audit.unit.test.ts +1 -1
  431. package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
  432. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
  433. package/src/utils/__tests__/cn.unit.test.ts +1 -1
  434. package/src/utils/__tests__/debugLogger.test.ts +1 -1
  435. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
  436. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
  437. package/src/utils/__tests__/formatting.unit.test.ts +1 -1
  438. package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
  439. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  440. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
  441. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
  442. package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
  443. package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
  444. package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
  445. package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
  446. package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
  447. package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
  448. package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
  449. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
  450. package/src/utils/__tests__/security.unit.test.ts +40 -18
  451. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
  452. package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
  453. package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
  454. package/src/utils/app/appConfig.ts +47 -0
  455. package/src/utils/app/appIdResolver.test.ts +497 -0
  456. package/src/utils/app/appIdResolver.ts +133 -0
  457. package/src/utils/app/appNameResolver.simple.test.ts +212 -0
  458. package/src/utils/app/appNameResolver.test.ts +121 -0
  459. package/src/utils/app/appNameResolver.ts +195 -0
  460. package/src/utils/audit/audit.ts +127 -0
  461. package/src/utils/context/organisationContext.test.ts +322 -0
  462. package/src/utils/context/organisationContext.ts +156 -0
  463. package/src/utils/context/sessionTracking.ts +125 -0
  464. package/src/utils/core/cn.ts +7 -0
  465. package/src/utils/core/debugLogger.ts +67 -0
  466. package/src/utils/core/logger.ts +181 -0
  467. package/src/utils/device/deviceFingerprint.ts +215 -0
  468. package/src/utils/dynamic/dynamicUtils.ts +105 -0
  469. package/src/utils/dynamic/lazyLoad.tsx +44 -0
  470. package/src/utils/file-reference/__tests__/file-reference.test.ts +788 -0
  471. package/src/utils/file-reference/index.ts +501 -0
  472. package/src/utils/formatting/formatDate.test.ts +237 -0
  473. package/src/utils/formatting/formatting.ts +133 -0
  474. package/src/utils/index.ts +39 -54
  475. package/src/utils/performance/bundleAnalysis.ts +129 -0
  476. package/src/utils/performance/performanceBenchmark.ts +64 -0
  477. package/src/utils/performance/performanceBudgets.ts +110 -0
  478. package/src/utils/permissions/permissionTypes.ts +37 -0
  479. package/src/utils/permissions/permissionUtils.test.ts +393 -0
  480. package/src/utils/permissions/permissionUtils.ts +34 -0
  481. package/src/utils/security/auth-utils.ts +96 -0
  482. package/src/utils/security/secureDataAccess.test.ts +711 -0
  483. package/src/utils/security/secureDataAccess.ts +377 -0
  484. package/src/utils/security/secureErrors.ts +82 -0
  485. package/src/utils/security/secureStorage.ts +244 -0
  486. package/src/utils/security/security.ts +159 -0
  487. package/src/utils/security/securityMonitor.ts +45 -0
  488. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
  489. package/src/utils/storage/helpers.ts +15 -8
  490. package/src/utils/validation/__tests__/htmlSanitization.unit.test.ts +598 -0
  491. package/src/{validation → utils/validation}/csrf.ts +1 -1
  492. package/src/utils/validation/htmlSanitization.ts +184 -0
  493. package/src/utils/validation/index.ts +79 -0
  494. package/src/utils/validation/sanitization.ts +333 -0
  495. package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
  496. package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
  497. package/src/utils/validation/validation.ts +111 -0
  498. package/src/utils/validation/validationUtils.ts +123 -0
  499. package/src/validation/index.ts +3 -34
  500. package/dist/chunk-24MKLB7U.js +0 -81
  501. package/dist/chunk-24MKLB7U.js.map +0 -1
  502. package/dist/chunk-3CG5L6RN.js.map +0 -1
  503. package/dist/chunk-3DBFLLLU.js.map +0 -1
  504. package/dist/chunk-5F3NDPJV.js.map +0 -1
  505. package/dist/chunk-66C4BSAY.js.map +0 -1
  506. package/dist/chunk-BDZUMRBD.js +0 -87
  507. package/dist/chunk-BDZUMRBD.js.map +0 -1
  508. package/dist/chunk-BYXRHAIF.js.map +0 -1
  509. package/dist/chunk-CDQ3PX7L.js +0 -18
  510. package/dist/chunk-CDQ3PX7L.js.map +0 -1
  511. package/dist/chunk-CQZU6TFE.js.map +0 -1
  512. package/dist/chunk-F64FFPOZ.js.map +0 -1
  513. package/dist/chunk-GEVIB2UB.js.map +0 -1
  514. package/dist/chunk-GKHF54DI.js.map +0 -1
  515. package/dist/chunk-GVDR7WNV.js.map +0 -1
  516. package/dist/chunk-HMNOSGVA.js.map +0 -1
  517. package/dist/chunk-JCQZ6LA7.js.map +0 -1
  518. package/dist/chunk-M6DDYFUD.js.map +0 -1
  519. package/dist/chunk-O3NWNXDY.js.map +0 -1
  520. package/dist/chunk-PYUXFQJ3.js.map +0 -1
  521. package/dist/chunk-UJI6WSMD.js.map +0 -1
  522. package/dist/chunk-VZ5OR6HD.js.map +0 -1
  523. package/dist/chunk-WP5I5GLN.js.map +0 -1
  524. package/dist/chunk-ZYZCRSBD.js.map +0 -1
  525. package/dist/validation-DnhrNMju.d.ts +0 -159
  526. package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
  527. package/src/validation/__tests__/common.unit.test.ts +0 -101
  528. package/src/validation/__tests__/csrf.unit.test.ts +0 -365
  529. package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
  530. package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
  531. package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
  532. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
  533. package/src/validation/__tests__/user.unit.test.ts +0 -440
  534. package/src/validation/sanitization.ts +0 -96
  535. /package/dist/{DataTable-A36PJG6N.js.map → DataTable-6M4L6BI2.js.map} +0 -0
  536. /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-XIQQ7LVU.js.map} +0 -0
  537. /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
  538. /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
  539. /package/dist/{chunk-CTJRBUX2.js.map → chunk-6LAAY47Q.js.map} +0 -0
  540. /package/dist/{chunk-ZV77RZMU.js.map → chunk-INQLMHPF.js.map} +0 -0
  541. /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
  542. /package/src/{validation → utils/validation}/common.ts +0 -0
  543. /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
  544. /package/src/{validation → utils/validation}/user.ts +0 -0
@@ -0,0 +1,322 @@
1
+ /**
2
+ * @file Smart Dialog Example
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/Dialog/Examples
5
+ * @since 0.1.0
6
+ */
7
+
8
+ import React, { useState } from 'react';
9
+ import {
10
+ Dialog,
11
+ DialogTrigger,
12
+ DialogContent,
13
+ DialogHeader,
14
+ DialogBody,
15
+ DialogFooter,
16
+ DialogTitle,
17
+ DialogDescription,
18
+ Button,
19
+ Input,
20
+ Label,
21
+ } from '../../../index';
22
+
23
+ /**
24
+ * Example demonstrating the enhanced Dialog component with all advanced features
25
+ */
26
+ export function SmartDialogExample() {
27
+ const [formData, setFormData] = useState({
28
+ name: '',
29
+ email: '',
30
+ message: ''
31
+ });
32
+
33
+ // Generate long content for scrolling demo
34
+ const longContent = Array.from({ length: 50 }, (_, i) => (
35
+ <div key={i} className="p-4 border rounded-lg mb-4">
36
+ <h4>Content Section {i + 1}</h4>
37
+ <p className="text-sm text-muted-foreground">
38
+ This is content section {i + 1}. In a real application, this could be form fields,
39
+ data displays, or any other content that might make the dialog tall.
40
+ </p>
41
+ </div>
42
+ ));
43
+
44
+ return (
45
+ <div className="p-6 space-y-6">
46
+ <div>
47
+ <h2 className="text-2xl font-bold">Enhanced Dialog Examples</h2>
48
+ <p className="text-muted-foreground">
49
+ Demonstrating all the advanced features of the Dialog component including smart height management,
50
+ scrolling, responsive behavior, and accessibility features.
51
+ </p>
52
+ </div>
53
+
54
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
55
+ {/* Basic Dialog */}
56
+ <Dialog>
57
+ <DialogTrigger asChild>
58
+ <Button variant="outline" className="w-full">Basic Dialog</Button>
59
+ </DialogTrigger>
60
+ <DialogContent size="md">
61
+ <DialogHeader>
62
+ <DialogTitle>Basic Dialog</DialogTitle>
63
+ <DialogDescription>
64
+ This is a standard dialog without scrolling enabled.
65
+ </DialogDescription>
66
+ </DialogHeader>
67
+ <DialogBody>
68
+ <section className="py-4">
69
+ <p>Simple content that fits nicely in the dialog.</p>
70
+ </section>
71
+ </DialogBody>
72
+ <DialogFooter>
73
+ <Button variant="outline">Cancel</Button>
74
+ <Button>Save</Button>
75
+ </DialogFooter>
76
+ </DialogContent>
77
+ </Dialog>
78
+
79
+ {/* Scrollable Dialog with Sticky Elements */}
80
+ <Dialog>
81
+ <DialogTrigger asChild>
82
+ <Button variant="outline" className="w-full">Scrollable Dialog</Button>
83
+ </DialogTrigger>
84
+ <DialogContent
85
+ size="lg"
86
+ enableScrolling={true}
87
+ maxHeightPercent={80}
88
+ >
89
+ <DialogHeader sticky={true}>
90
+ <DialogTitle>Scrollable Dialog</DialogTitle>
91
+ <DialogDescription>
92
+ This dialog has lots of content and will scroll if needed.
93
+ The header stays sticky at the top.
94
+ </DialogDescription>
95
+ </DialogHeader>
96
+ <DialogBody>
97
+ <div className="space-y-4">
98
+ {longContent.slice(0, 30)}
99
+ </div>
100
+ </DialogBody>
101
+ <DialogFooter sticky={true}>
102
+ <Button variant="outline">Cancel</Button>
103
+ <Button>Save Changes</Button>
104
+ </DialogFooter>
105
+ </DialogContent>
106
+ </Dialog>
107
+
108
+ {/* Custom Height Dialog */}
109
+ <Dialog>
110
+ <DialogTrigger asChild>
111
+ <Button variant="outline" className="w-full">Custom Height</Button>
112
+ </DialogTrigger>
113
+ <DialogContent
114
+ size="xl"
115
+ enableScrolling={true}
116
+ maxHeight="400px"
117
+ >
118
+ <DialogHeader>
119
+ <DialogTitle>Custom Height Dialog</DialogTitle>
120
+ <DialogDescription>
121
+ This dialog has a fixed maximum height of 400px.
122
+ </DialogDescription>
123
+ </DialogHeader>
124
+ <DialogBody>
125
+ <div className="space-y-4">
126
+ {longContent.slice(0, 20)}
127
+ </div>
128
+ </DialogBody>
129
+ <DialogFooter>
130
+ <Button>Done</Button>
131
+ </DialogFooter>
132
+ </DialogContent>
133
+ </Dialog>
134
+
135
+ {/* Auto-Sizing Dialog */}
136
+ <Dialog>
137
+ <DialogTrigger asChild>
138
+ <Button variant="outline" className="w-full">Auto Size</Button>
139
+ </DialogTrigger>
140
+ <DialogContent size="auto">
141
+ <DialogHeader>
142
+ <DialogTitle>Auto-Sized Dialog</DialogTitle>
143
+ <DialogDescription>
144
+ This dialog automatically adjusts its width to fit the content.
145
+ </DialogDescription>
146
+ </DialogHeader>
147
+ <DialogBody>
148
+ <section className="space-y-4">
149
+ <p>Content that determines the dialog width...</p>
150
+ <div className="p-4 bg-muted rounded-lg">
151
+ <p className="text-sm">This dialog will size itself based on this content.</p>
152
+ </div>
153
+ </section>
154
+ </DialogBody>
155
+ <DialogFooter>
156
+ <Button>Close</Button>
157
+ </DialogFooter>
158
+ </DialogContent>
159
+ </Dialog>
160
+
161
+ {/* Form Dialog with Custom Dimensions */}
162
+ <Dialog>
163
+ <DialogTrigger asChild>
164
+ <Button variant="outline" className="w-full">Form Dialog</Button>
165
+ </DialogTrigger>
166
+ <DialogContent
167
+ maxWidth="600px"
168
+ maxHeight="500px"
169
+ enableScrolling={true}
170
+ >
171
+ <DialogHeader>
172
+ <DialogTitle>Contact Form</DialogTitle>
173
+ <DialogDescription>
174
+ Fill out the form below to get in touch with us.
175
+ </DialogDescription>
176
+ </DialogHeader>
177
+ <DialogBody>
178
+ <section className="space-y-4">
179
+ <div className="space-y-2">
180
+ <Label htmlFor="name">Name</Label>
181
+ <Input
182
+ id="name"
183
+ value={formData.name}
184
+ onChange={(e) => setFormData(prev => ({ ...prev, name: e.target.value }))}
185
+ placeholder="Enter your name"
186
+ />
187
+ </div>
188
+ <div className="space-y-2">
189
+ <Label htmlFor="email">Email</Label>
190
+ <Input
191
+ id="email"
192
+ type="email"
193
+ value={formData.email}
194
+ onChange={(e) => setFormData(prev => ({ ...prev, email: e.target.value }))}
195
+ placeholder="Enter your email"
196
+ />
197
+ </div>
198
+ <div className="space-y-2">
199
+ <Label htmlFor="message">Message</Label>
200
+ <textarea
201
+ id="message"
202
+ value={formData.message}
203
+ onChange={(e) => setFormData(prev => ({ ...prev, message: e.target.value }))}
204
+ placeholder="Enter your message"
205
+ className="w-full min-h-[100px] p-2 border rounded-md resize-none"
206
+ />
207
+ </div>
208
+ </section>
209
+ </DialogBody>
210
+ <DialogFooter>
211
+ <Button variant="outline">Cancel</Button>
212
+ <Button>Send Message</Button>
213
+ </DialogFooter>
214
+ </DialogContent>
215
+ </Dialog>
216
+
217
+ {/* Dialog with Prevented Close Actions */}
218
+ <Dialog>
219
+ <DialogTrigger asChild>
220
+ <Button variant="outline" className="w-full">Important Dialog</Button>
221
+ </DialogTrigger>
222
+ <DialogContent
223
+ size="lg"
224
+ preventCloseOnEscape={true}
225
+ preventCloseOnOutsideClick={true}
226
+ showCloseButton={false}
227
+ >
228
+ <DialogHeader>
229
+ <DialogTitle>Important Action Required</DialogTitle>
230
+ <DialogDescription>
231
+ This dialog cannot be closed accidentally. You must complete the action below.
232
+ </DialogDescription>
233
+ </DialogHeader>
234
+ <DialogBody>
235
+ <section className="space-y-4">
236
+ <p>Please confirm that you want to proceed with this important action.</p>
237
+ <div className="p-4 bg-destructive/10 border border-destructive/20 rounded-lg">
238
+ <p className="text-sm text-destructive font-medium">
239
+ ⚠️ This action cannot be undone.
240
+ </p>
241
+ </div>
242
+ </section>
243
+ </DialogBody>
244
+ <DialogFooter>
245
+ <Button
246
+ variant="destructive"
247
+ onClick={() => {
248
+ alert('Action completed!');
249
+ // In a real app, you'd close the dialog here
250
+ }}
251
+ >
252
+ Confirm Action
253
+ </Button>
254
+ </DialogFooter>
255
+ </DialogContent>
256
+ </Dialog>
257
+
258
+ {/* Full Screen Dialog */}
259
+ <Dialog>
260
+ <DialogTrigger asChild>
261
+ <Button variant="outline" className="w-full">Full Screen</Button>
262
+ </DialogTrigger>
263
+ <DialogContent size="full" enableScrolling={true}>
264
+ <DialogHeader sticky={true}>
265
+ <DialogTitle>Full Screen Dialog</DialogTitle>
266
+ <DialogDescription>
267
+ This dialog takes up the full screen on mobile and large size on desktop.
268
+ </DialogDescription>
269
+ </DialogHeader>
270
+ <DialogBody>
271
+ <div className="space-y-6">
272
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
273
+ <div className="space-y-4">
274
+ <h3 className="text-lg font-semibold">Left Column</h3>
275
+ {longContent.slice(0, 15)}
276
+ </div>
277
+ <div className="space-y-4">
278
+ <h3 className="text-lg font-semibold">Right Column</h3>
279
+ {longContent.slice(15, 30)}
280
+ </div>
281
+ </div>
282
+ </div>
283
+ </DialogBody>
284
+ <DialogFooter sticky={true}>
285
+ <Button variant="outline">Cancel</Button>
286
+ <Button>Save All Changes</Button>
287
+ </DialogFooter>
288
+ </DialogContent>
289
+ </Dialog>
290
+ </div>
291
+
292
+ <div className="mt-8 p-6 bg-muted rounded-lg">
293
+ <h3 className="text-lg font-semibold mb-4">Key Features Demonstrated:</h3>
294
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
295
+ <div>
296
+ <h4 className="font-medium mb-2">Core Features</h4>
297
+ <ul className="list-disc list-inside space-y-1 text-sm text-muted-foreground">
298
+ <li><strong>Semantic HTML Structure:</strong> Native dialog element with proper landmarks</li>
299
+ <li><strong>Accessibility First:</strong> WCAG 2.1 AA compliant with screen reader support</li>
300
+ <li><strong>Focus Management:</strong> Automatic focus trapping and restoration</li>
301
+ <li><strong>Keyboard Navigation:</strong> Escape to close, Tab for focus management</li>
302
+ <li><strong>Responsive Design:</strong> Adapts to all screen sizes</li>
303
+ </ul>
304
+ </div>
305
+ <div>
306
+ <h4 className="font-medium mb-2">Advanced Features</h4>
307
+ <ul className="list-disc list-inside space-y-1 text-sm text-muted-foreground">
308
+ <li><strong>Smart Height Management:</strong> Automatic viewport-based constraints</li>
309
+ <li><strong>Scrollable Content:</strong> Long content scrolls while keeping headers/footers visible</li>
310
+ <li><strong>Sticky Headers/Footers:</strong> Important UI elements remain accessible</li>
311
+ <li><strong>Custom Dimensions:</strong> Fine-grained control over width and height</li>
312
+ <li><strong>Configurable Close Behavior:</strong> Control escape key and outside click</li>
313
+ <li><strong>Multiple Size Variants:</strong> sm, md, lg, xl, full, auto sizing options</li>
314
+ </ul>
315
+ </div>
316
+ </div>
317
+ </div>
318
+ </div>
319
+ );
320
+ }
321
+
322
+ export default SmartDialogExample;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @file Dialog Examples
3
+ * @package @jmruthers/pace-core
4
+ * @module Examples/Components/Dialog
5
+ * @since 1.0.0
6
+ *
7
+ * Dialog component examples demonstrating various features and use cases.
8
+ */
9
+
10
+ export { HtmlDialogExample } from './HtmlDialogExample';
11
+ export { ScrollableDialogExample } from './ScrollableDialogExample';
12
+ export { SmartDialogExample } from './SmartDialogExample';
13
+ export { SimpleHtmlTest } from './SimpleHtmlTest';
14
+ export { BasicHtmlTest } from './BasicHtmlTest';
15
+ export { DebugHtmlExample } from './DebugHtmlExample';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @file Component Examples
3
+ * @package @jmruthers/pace-core
4
+ * @module Examples/Components
5
+ * @since 1.0.0
6
+ *
7
+ * Component-specific examples organized by component.
8
+ */
9
+
10
+ export * from './DataTable';
11
+ export * from './Dialog';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @file Feature Examples
3
+ * @package @jmruthers/pace-core
4
+ * @module Examples/Features
5
+ * @since 1.0.0
6
+ *
7
+ * Feature-based examples that demonstrate cross-component workflows.
8
+ */
9
+
10
+ export * from './rbac';
11
+ export * from './public-pages';
12
+
@@ -19,12 +19,11 @@ import {
19
19
  PublicPageLayout,
20
20
  PublicPageHeader,
21
21
  PublicPageFooter,
22
- FileDisplay,
22
+ EventLogo,
23
23
  usePublicEvent,
24
24
  usePublicRouteParams,
25
25
  PublicLoadingSpinner
26
- } from '../index';
27
- import { FileCategory } from '../types/file-reference';
26
+ } from '../../../src';
28
27
 
29
28
  /**
30
29
  * MAIN APPLICATION - This is your main app with authentication
@@ -220,13 +219,12 @@ function PublicRecipeGridReportPage() {
220
219
  {/* Event Logo */}
221
220
  <div className="flex justify-center lg:justify-start">
222
221
  <div className="text-center">
223
- <FileDisplay
224
- table_name="event"
225
- record_id={event.event_id}
226
- organisation_id={event.organisation_id}
227
- category={FileCategory.EVENT_LOGOS}
228
- showDelete={false}
229
- className="rounded-lg shadow-lg [&_img]:h-20 [&_img]:w-20 [&_img]:object-contain"
222
+ <EventLogo
223
+ eventId={event.event_id}
224
+ eventName={event.event_name}
225
+ organisationId={event.organisation_id}
226
+ size="2xl"
227
+ className="rounded-lg shadow-lg"
230
228
  />
231
229
  <p className="mt-4 text-sm text-sec-600">Event Logo</p>
232
230
  </div>
@@ -261,13 +259,12 @@ function PublicEventPage() {
261
259
 
262
260
  <main className="max-w-4xl mx-auto px-4 py-6">
263
261
  <div className="text-center mb-6">
264
- <FileDisplay
265
- table_name="event"
266
- record_id={event.event_id}
267
- organisation_id={event.organisation_id}
268
- category={FileCategory.EVENT_LOGOS}
269
- showDelete={false}
270
- className="mx-auto mb-4 [&_img]:h-16 [&_img]:w-16 [&_img]:object-contain"
262
+ <EventLogo
263
+ eventId={event.event_id}
264
+ eventName={event.event_name}
265
+ organisationId={event.organisation_id}
266
+ size="xl"
267
+ className="mx-auto mb-4"
271
268
  />
272
269
  <h1 className="text-2xl font-bold text-sec-900">{event.event_name}</h1>
273
270
  {event.event_date && (
@@ -34,13 +34,12 @@ import {
34
34
  PublicPageLayout,
35
35
  PublicPageHeader,
36
36
  PublicPageFooter,
37
- FileDisplay,
37
+ EventLogo,
38
38
  usePublicEvent,
39
39
  usePublicRouteParams,
40
40
  PublicLoadingSpinner,
41
41
  PublicErrorBoundary
42
- } from '../index';
43
- import { FileCategory } from '../types/file-reference';
42
+ } from '../../../src';
44
43
 
45
44
  /**
46
45
  * Complete public event page example
@@ -171,13 +170,12 @@ export function PublicEventPage() {
171
170
  {/* Event Logo */}
172
171
  <div className="flex justify-center lg:justify-start">
173
172
  <div className="text-center">
174
- <FileDisplay
175
- table_name="event"
176
- record_id={event.event_id}
177
- organisation_id={event.organisation_id}
178
- category={FileCategory.EVENT_LOGOS}
179
- showDelete={false}
180
- className="rounded-lg shadow-lg [&_img]:h-20 [&_img]:w-20 [&_img]:object-contain"
173
+ <EventLogo
174
+ eventId={event.event_id}
175
+ eventName={event.event_name}
176
+ organisationId={event.organisation_id}
177
+ size="2xl"
178
+ className="rounded-lg shadow-lg"
181
179
  />
182
180
  <p className="mt-4 text-sm text-sec-600">Event Logo</p>
183
181
  </div>
@@ -233,23 +231,12 @@ export function PublicEventPageCompact() {
233
231
 
234
232
  <main className="max-w-4xl mx-auto px-4 py-6">
235
233
  <div className="text-center mb-6">
236
- <FileDisplay
237
- table_name="event"
238
- record_id={event.event_id}
239
- organisation_id={event.organisation_id}
240
- category={FileCategory.EVENT_LOGOS}
241
- displayOnly={true}
242
- showFallback={true}
243
- fallbackSize="xl"
244
- className="h-24 w-24 mx-auto mb-4 object-contain rounded"
245
- generateFallbackText={(fileName) => {
246
- if (!event.event_name) return 'EV';
247
- return event.event_name
248
- .split(/[\s\-_]+/)
249
- .map(word => word.charAt(0).toUpperCase())
250
- .join('')
251
- .substring(0, 3);
252
- }}
234
+ <EventLogo
235
+ eventId={event.event_id}
236
+ eventName={event.event_name}
237
+ organisationId={event.organisation_id}
238
+ size="xl"
239
+ className="mx-auto mb-4"
253
240
  />
254
241
  <h1 className="text-2xl font-bold text-sec-900">{event.event_name}</h1>
255
242
  {event.event_date && (
@@ -38,13 +38,12 @@ import {
38
38
  PublicPageLayout,
39
39
  PublicPageHeader,
40
40
  PublicPageFooter,
41
- FileDisplay,
41
+ EventLogo,
42
42
  usePublicEvent,
43
43
  usePublicRouteParams,
44
44
  PublicLoadingSpinner,
45
45
  PublicErrorBoundary
46
- } from '../index';
47
- import { FileCategory } from '../types/file-reference';
46
+ } from '../../../src';
48
47
 
49
48
  /**
50
49
  * Complete public page application that works independently
@@ -210,13 +209,12 @@ function PublicRecipeGridReportPage() {
210
209
  {/* Event Logo */}
211
210
  <div className="flex justify-center lg:justify-start">
212
211
  <div className="text-center">
213
- <FileDisplay
214
- table_name="event"
215
- record_id={event.event_id}
216
- organisation_id={event.organisation_id}
217
- category={FileCategory.EVENT_LOGOS}
218
- showDelete={false}
219
- className="rounded-lg shadow-lg [&_img]:h-20 [&_img]:w-20 [&_img]:object-contain"
212
+ <EventLogo
213
+ eventId={event.event_id}
214
+ eventName={event.event_name}
215
+ organisationId={event.organisation_id}
216
+ size="2xl"
217
+ className="rounded-lg shadow-lg"
220
218
  />
221
219
  <p className="mt-4 text-sm text-sec-600">Event Logo</p>
222
220
  </div>
@@ -250,24 +248,13 @@ function PublicEventPage() {
250
248
 
251
249
  <main className="max-w-4xl mx-auto px-4 py-6">
252
250
  <div className="text-center mb-6">
253
- <FileDisplay
254
- table_name="event"
255
- record_id={event.event_id}
256
- organisation_id={event.organisation_id}
257
- category={FileCategory.EVENT_LOGOS}
258
- displayOnly={true}
259
- showFallback={true}
260
- fallbackSize="xl"
261
- className="h-24 w-24 mx-auto mb-4 object-contain rounded"
262
- generateFallbackText={(fileName) => {
263
- if (!event.event_name) return 'EV';
264
- return event.event_name
265
- .split(/[\s\-_]+/)
266
- .map(word => word.charAt(0).toUpperCase())
267
- .join('')
268
- .substring(0, 3);
269
- }}
270
- />
251
+ <EventLogo
252
+ eventId={event.event_id}
253
+ eventName={event.event_name}
254
+ organisationId={event.organisation_id}
255
+ size="xl"
256
+ className="mx-auto mb-4"
257
+ />
271
258
  <h1 className="text-2xl font-bold text-sec-900">{event.event_name}</h1>
272
259
  {event.event_date && (
273
260
  <p className="text-sec-600 mt-2">
@@ -29,13 +29,12 @@ import {
29
29
  PublicPageLayout,
30
30
  PublicPageHeader,
31
31
  PublicPageFooter,
32
- FileDisplay,
32
+ EventLogo,
33
33
  usePublicEvent,
34
34
  usePublicRouteParams,
35
35
  PublicLoadingSpinner,
36
36
  PublicErrorBoundary
37
- } from '../index';
38
- import { FileCategory } from '../types/file-reference';
37
+ } from '../../../src';
39
38
 
40
39
  /**
41
40
  * Correct usage pattern for public pages
@@ -171,13 +170,12 @@ export function PublicPageUsageExample() {
171
170
  {/* Event Logo */}
172
171
  <div className="flex justify-center lg:justify-start">
173
172
  <div className="text-center">
174
- <FileDisplay
175
- table_name="event"
176
- record_id={event.event_id}
177
- organisation_id={event.organisation_id}
178
- category={FileCategory.EVENT_LOGOS}
179
- showDelete={false}
180
- className="rounded-lg shadow-lg [&_img]:h-20 [&_img]:w-20 [&_img]:object-contain"
173
+ <EventLogo
174
+ eventId={event.event_id}
175
+ eventName={event.event_name}
176
+ organisationId={event.organisation_id}
177
+ size="2xl"
178
+ className="rounded-lg shadow-lg"
181
179
  />
182
180
  <p className="mt-4 text-sm text-sec-600">Event Logo</p>
183
181
  </div>
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @file Public Pages Examples
3
+ * @package @jmruthers/pace-core
4
+ * @module Examples/PublicPages
5
+ * @since 1.0.0
6
+ *
7
+ * Public page workflow examples
8
+ */
9
+
10
+ export { PublicPageUsageExample } from './PublicPageUsageExample';
11
+ export { PublicEventPage, PublicEventPageCompact } from './PublicEventPage';
12
+ export { PublicPageApp } from './PublicPageApp';
13
+ export { RootApp as CorrectPublicPageImplementation } from './CorrectPublicPageImplementation';
14
+