@jmruthers/pace-core 0.5.134 → 0.5.136

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 (522) hide show
  1. package/dist/{DataTable-C7GaRZye.d.ts → DataTable-CWAZZcXC.d.ts} +1 -1
  2. package/dist/{DataTable-A36PJG6N.js → DataTable-CYOHOX3O.js} +25 -13
  3. package/dist/{PublicLoadingSpinner-CUAnTvcg.d.ts → EventLogo-801uofbR.d.ts} +51 -135
  4. package/dist/UnifiedAuthProvider-5E5TUNMS.js +17 -0
  5. package/dist/{UnifiedAuthProvider-BVKmQd9u.d.ts → UnifiedAuthProvider-DJxGTftH.d.ts} +1 -1
  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-CTJRBUX2.js → chunk-2TWNJ46Y.js} +2 -2
  9. package/dist/{chunk-UJI6WSMD.js → chunk-444EZN6N.js} +3 -3
  10. package/dist/chunk-444EZN6N.js.map +1 -0
  11. package/dist/{chunk-3CG5L6RN.js → chunk-4MT5BGGL.js} +90 -73
  12. package/dist/chunk-4MT5BGGL.js.map +1 -0
  13. package/dist/{chunk-PYUXFQJ3.js → chunk-56XJ3TU6.js} +2 -2
  14. package/dist/chunk-56XJ3TU6.js.map +1 -0
  15. package/dist/chunk-5DPZ5EAT.js +60 -0
  16. package/dist/chunk-5DPZ5EAT.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-APIBCTL2.js +670 -0
  20. package/dist/chunk-APIBCTL2.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-WP5I5GLN.js → chunk-BVYWGZVV.js} +112 -97
  24. package/dist/chunk-BVYWGZVV.js.map +1 -0
  25. package/dist/{chunk-GEVIB2UB.js → chunk-ERISIBYU.js} +14 -5
  26. package/dist/chunk-ERISIBYU.js.map +1 -0
  27. package/dist/{chunk-CQZU6TFE.js → chunk-FHWWBIHA.js} +100 -62
  28. package/dist/chunk-FHWWBIHA.js.map +1 -0
  29. package/dist/{chunk-O3NWNXDY.js → chunk-FMUCXFII.js} +2 -2
  30. package/dist/chunk-FMUCXFII.js.map +1 -0
  31. package/dist/{chunk-GVDR7WNV.js → chunk-HJGGOMQ6.js} +194 -518
  32. package/dist/chunk-HJGGOMQ6.js.map +1 -0
  33. package/dist/{chunk-BDZUMRBD.js → chunk-K2WWTH7O.js} +13 -6
  34. package/dist/chunk-K2WWTH7O.js.map +1 -0
  35. package/dist/{chunk-BYXRHAIF.js → chunk-L6PGMCMD.js} +23 -14
  36. package/dist/chunk-L6PGMCMD.js.map +1 -0
  37. package/dist/chunk-LMC26NLJ.js +84 -0
  38. package/dist/chunk-LMC26NLJ.js.map +1 -0
  39. package/dist/{chunk-M6DDYFUD.js → chunk-LS353YLY.js} +19 -16
  40. package/dist/chunk-LS353YLY.js.map +1 -0
  41. package/dist/{chunk-ZYZCRSBD.js → chunk-LTV3XIJJ.js} +16 -11
  42. package/dist/chunk-LTV3XIJJ.js.map +1 -0
  43. package/dist/{chunk-HMNOSGVA.js → chunk-NOHEVYVX.js} +377 -666
  44. package/dist/chunk-NOHEVYVX.js.map +1 -0
  45. package/dist/{chunk-JCQZ6LA7.js → chunk-Q5QRDWKI.js} +9 -3
  46. package/dist/chunk-Q5QRDWKI.js.map +1 -0
  47. package/dist/chunk-S5OFRT4M.js +94 -0
  48. package/dist/chunk-S5OFRT4M.js.map +1 -0
  49. package/dist/{chunk-3DBFLLLU.js → chunk-SBVILCCA.js} +14 -9
  50. package/dist/chunk-SBVILCCA.js.map +1 -0
  51. package/dist/{chunk-TGIY2AR2.js → chunk-SL2YQDR6.js} +4 -3
  52. package/dist/{chunk-TGIY2AR2.js.map → chunk-SL2YQDR6.js.map} +1 -1
  53. package/dist/{chunk-VZ5OR6HD.js → chunk-TVYPTYOY.js} +55 -179
  54. package/dist/chunk-TVYPTYOY.js.map +1 -0
  55. package/dist/{chunk-ZV77RZMU.js → chunk-XARJS7CD.js} +2 -2
  56. package/dist/chunk-XDNLUEXI.js +138 -0
  57. package/dist/chunk-XDNLUEXI.js.map +1 -0
  58. package/dist/{chunk-F64FFPOZ.js → chunk-YLKIDTUK.js} +26 -20
  59. package/dist/chunk-YLKIDTUK.js.map +1 -0
  60. package/dist/{chunk-5F3NDPJV.js → chunk-ZZ2SS7NI.js} +10 -5
  61. package/dist/chunk-ZZ2SS7NI.js.map +1 -0
  62. package/dist/components.d.ts +7 -287
  63. package/dist/components.js +26 -157
  64. package/dist/components.js.map +1 -1
  65. package/dist/{file-reference-C9isKNPn.d.ts → file-reference-C6Gkn77H.d.ts} +1 -1
  66. package/dist/{formatting-DFcCxUEk.d.ts → formatting-CvUXy2mF.d.ts} +1 -1
  67. package/dist/hooks.d.ts +3 -3
  68. package/dist/hooks.js +22 -16
  69. package/dist/hooks.js.map +1 -1
  70. package/dist/index.d.ts +219 -9
  71. package/dist/index.js +49 -31
  72. package/dist/index.js.map +1 -1
  73. package/dist/providers.d.ts +1 -1
  74. package/dist/providers.js +5 -4
  75. package/dist/rbac/index.js +13 -12
  76. package/dist/styles/index.js +2 -1
  77. package/dist/theming/runtime.d.ts +2 -19
  78. package/dist/theming/runtime.js +2 -1
  79. package/dist/{types-D5rqZQXk.d.ts → types-Dfz9dmVH.d.ts} +12 -1
  80. package/dist/types.d.ts +2 -2
  81. package/dist/types.js +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 +195 -232
  85. package/dist/utils.js +173 -331
  86. package/dist/utils.js.map +1 -1
  87. package/dist/{validation-DnhrNMju.d.ts → validation-8npbysjg.d.ts} +26 -8
  88. package/dist/validation.d.ts +261 -10
  89. package/dist/validation.js +82 -440
  90. package/dist/validation.js.map +1 -1
  91. package/docs/api/classes/ColumnFactory.md +1 -1
  92. package/docs/api/classes/ErrorBoundary.md +6 -6
  93. package/docs/api/classes/InvalidScopeError.md +1 -1
  94. package/docs/api/classes/MissingUserContextError.md +1 -1
  95. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  96. package/docs/api/classes/PermissionDeniedError.md +1 -1
  97. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  98. package/docs/api/classes/RBACAuditManager.md +6 -6
  99. package/docs/api/classes/RBACCache.md +1 -1
  100. package/docs/api/classes/RBACEngine.md +7 -7
  101. package/docs/api/classes/RBACError.md +1 -1
  102. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  103. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  104. package/docs/api/classes/StorageUtils.md +1 -1
  105. package/docs/api/enums/FileCategory.md +1 -1
  106. package/docs/api/interfaces/AggregateConfig.md +4 -4
  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 +3 -3
  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 +90 -0
  122. package/docs/api/interfaces/ExportOptions.md +126 -0
  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 +648 -212
  199. package/docs/api-reference/components.md +106 -26
  200. package/docs/architecture/README.md +0 -2
  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/examples/README.md +30 -14
  205. package/examples/STRUCTURE.md +125 -0
  206. package/examples/components/DataTable/HierarchicalActionsExample.tsx +421 -0
  207. package/examples/components/DataTable/HierarchicalExample.tsx +475 -0
  208. package/examples/components/DataTable/InitialPageSizeExample.tsx +177 -0
  209. package/examples/components/DataTable/PerformanceExample.tsx +506 -0
  210. package/examples/components/DataTable/index.ts +13 -0
  211. package/examples/components/Dialog/BasicHtmlTest.tsx +55 -0
  212. package/examples/components/Dialog/DebugHtmlExample.tsx +68 -0
  213. package/examples/components/Dialog/HtmlDialogExample.tsx +202 -0
  214. package/examples/components/Dialog/ScrollableDialogExample.tsx +290 -0
  215. package/examples/components/Dialog/SimpleHtmlTest.tsx +61 -0
  216. package/examples/components/Dialog/SmartDialogExample.tsx +322 -0
  217. package/examples/components/Dialog/index.ts +15 -0
  218. package/examples/components/index.ts +11 -0
  219. package/examples/features/index.ts +12 -0
  220. package/examples/{public-pages → features/public-pages}/CorrectPublicPageImplementation.tsx +1 -1
  221. package/examples/{public-pages → features/public-pages}/PublicEventPage.tsx +1 -1
  222. package/examples/{public-pages → features/public-pages}/PublicPageApp.tsx +1 -1
  223. package/examples/{public-pages → features/public-pages}/PublicPageUsageExample.tsx +1 -1
  224. package/examples/index.ts +11 -3
  225. package/package.json +30 -10
  226. package/src/components/Alert/Alert.tsx +1 -1
  227. package/src/components/Avatar/Avatar.tsx +1 -1
  228. package/src/components/Button/Button.tsx +1 -1
  229. package/src/components/Card/Card.tsx +1 -1
  230. package/src/components/Checkbox/Checkbox.tsx +1 -1
  231. package/src/components/DataTable/DataTable.test.tsx +1 -1
  232. package/src/components/DataTable/DataTable.tsx +1 -30
  233. package/src/components/DataTable/__tests__/DataTable.grouping-aggregation.test.tsx +562 -0
  234. package/src/components/DataTable/__tests__/styles.test.ts +2 -2
  235. package/src/components/DataTable/components/ActionButtons.tsx +0 -15
  236. package/src/components/DataTable/components/DataTableCore.tsx +4 -185
  237. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +1 -1
  238. package/src/components/DataTable/components/DataTableModals.tsx +1 -27
  239. package/src/components/DataTable/components/EditableRow.tsx +1 -1
  240. package/src/components/DataTable/components/ImportModal.tsx +2 -14
  241. package/src/components/DataTable/components/PaginationControls.tsx +1 -1
  242. package/src/components/DataTable/components/UnifiedTableBody.tsx +109 -82
  243. package/src/components/DataTable/components/__tests__/ActionButtons.test.tsx +1 -1
  244. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +1 -1
  245. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +1 -1
  246. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +1 -1
  247. package/src/components/DataTable/examples/GroupingAggregationExample.tsx +273 -0
  248. package/src/components/DataTable/examples/HierarchicalActionsExample.tsx +1 -1
  249. package/src/components/DataTable/examples/__tests__/HierarchicalActionsExample.test.tsx +1 -1
  250. package/src/components/DataTable/hooks/useColumnOrderPersistence.ts +1 -1
  251. package/src/components/DataTable/hooks/useColumnVisibilityPersistence.ts +1 -1
  252. package/src/components/DataTable/hooks/useDataTablePermissions.ts +2 -23
  253. package/src/components/DataTable/index.ts +4 -0
  254. package/src/components/DataTable/styles.ts +1 -1
  255. package/src/components/DataTable/types.ts +13 -0
  256. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +1 -1
  257. package/src/components/DataTable/utils/aggregationUtils.ts +161 -0
  258. package/src/components/DataTable/utils/exportUtils.ts +1 -1
  259. package/src/components/DataTable/utils/flexibleImport.ts +1 -11
  260. package/src/components/DataTable/utils/index.ts +1 -0
  261. package/src/components/DataTable/utils/paginationUtils.ts +1 -1
  262. package/src/components/Dialog/Dialog.tsx +2 -2
  263. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +35 -7
  264. package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -4
  265. package/src/components/EventSelector/EventSelector.tsx +3 -2
  266. package/src/components/FileDisplay/FileDisplay.tsx +2 -36
  267. package/src/components/FileUpload/FileUpload.test.tsx +2 -2
  268. package/src/components/FileUpload/FileUpload.tsx +2 -2
  269. package/src/components/Footer/Footer.tsx +1 -1
  270. package/src/components/Form/Form.test.tsx +4 -509
  271. package/src/components/Form/Form.tsx +1 -1
  272. package/src/components/Form/FormField.tsx +1 -1
  273. package/src/components/Form/index.ts +0 -12
  274. package/src/components/Header/Header.tsx +1 -1
  275. package/src/components/Input/Input.tsx +1 -1
  276. package/src/components/Label/Label.tsx +1 -1
  277. package/src/components/LoginForm/LoginForm.tsx +1 -1
  278. package/src/components/NavigationMenu/NavigationMenu.test.tsx +19 -3
  279. package/src/components/NavigationMenu/NavigationMenu.tsx +9 -8
  280. package/src/components/OrganisationSelector/OrganisationSelector.tsx +4 -3
  281. package/src/components/PaceAppLayout/PaceAppLayout.tsx +14 -12
  282. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +0 -16
  283. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +0 -1
  284. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +0 -9
  285. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +35 -3
  286. package/src/components/PaceLoginPage/PaceLoginPage.tsx +13 -12
  287. package/src/components/PasswordReset/PasswordChangeForm.tsx +1 -1
  288. package/src/components/PasswordReset/index.ts +0 -2
  289. package/src/components/Progress/Progress.tsx +1 -1
  290. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +35 -8
  291. package/src/components/ProtectedRoute/ProtectedRoute.tsx +3 -2
  292. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  293. package/src/components/PublicLayout/PublicLoadingSpinner.tsx +1 -1
  294. package/src/components/PublicLayout/PublicPageContextChecker.tsx +44 -43
  295. package/src/components/PublicLayout/PublicPageFooter.tsx +1 -1
  296. package/src/components/PublicLayout/PublicPageHeader.tsx +1 -15
  297. package/src/components/PublicLayout/PublicPageProvider.tsx +3 -2
  298. package/src/components/PublicLayout/__tests__/PublicPageContextChecker.test.tsx +2 -0
  299. package/src/components/PublicLayout/index.ts +4 -2
  300. package/src/components/Select/Select.tsx +1 -1
  301. package/src/components/{SessionRestorationLoader.tsx → SessionRestorationLoader/SessionRestorationLoader.tsx} +3 -2
  302. package/src/components/SessionRestorationLoader/index.ts +3 -0
  303. package/src/components/Switch/Switch.tsx +1 -1
  304. package/src/components/Table/Table.tsx +1 -1
  305. package/src/components/Toast/Toast.tsx +1 -1
  306. package/src/components/Tooltip/Tooltip.tsx +1 -1
  307. package/src/components/index.ts +4 -10
  308. package/src/hooks/__tests__/hooks.integration.test.tsx +37 -22
  309. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +33 -17
  310. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +28 -3
  311. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +36 -9
  312. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +26 -2
  313. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +19 -6
  314. package/src/hooks/__tests__/usePermissionCache.simple.test.ts +17 -4
  315. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +17 -4
  316. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +26 -6
  317. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +16 -6
  318. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +3 -3
  319. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +17 -3
  320. package/src/hooks/public/usePublicEvent.ts +7 -6
  321. package/src/hooks/public/usePublicEventLogo.ts +7 -4
  322. package/src/hooks/public/usePublicFileDisplay.ts +6 -150
  323. package/src/hooks/useComponentPerformance.ts +4 -1
  324. package/src/hooks/useDataTablePerformance.ts +4 -3
  325. package/src/hooks/useEventTheme.test.ts +18 -5
  326. package/src/hooks/useEventTheme.ts +4 -1
  327. package/src/hooks/useEvents.ts +2 -0
  328. package/src/hooks/useFileDisplay.ts +9 -8
  329. package/src/hooks/useFileReference.ts +4 -1
  330. package/src/hooks/useFileUrl.ts +4 -1
  331. package/src/hooks/useInactivityTracker.ts +5 -4
  332. package/src/hooks/useOrganisationSecurity.test.ts +33 -12
  333. package/src/hooks/useOrganisationSecurity.ts +8 -7
  334. package/src/hooks/usePerformanceMonitor.ts +6 -3
  335. package/src/hooks/usePermissionCache.ts +13 -6
  336. package/src/hooks/useSecureDataAccess.test.ts +2 -2
  337. package/src/hooks/useSecureDataAccess.ts +9 -8
  338. package/src/hooks/useSessionRestoration.ts +4 -1
  339. package/src/hooks/useStorage.ts +4 -1
  340. package/src/index.ts +25 -8
  341. package/src/providers/services/AuthServiceProvider.tsx +3 -2
  342. package/src/providers/services/EventServiceProvider.tsx +2 -1
  343. package/src/providers/services/InactivityServiceProvider.tsx +2 -1
  344. package/src/providers/services/OrganisationServiceProvider.tsx +2 -1
  345. package/src/providers/services/UnifiedAuthProvider.tsx +4 -3
  346. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +22 -2
  347. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +24 -2
  348. package/src/rbac/__tests__/cache-invalidation.test.ts +20 -6
  349. package/src/rbac/api.ts +5 -2
  350. package/src/rbac/audit-enhanced.ts +6 -6
  351. package/src/rbac/audit.test.ts +60 -38
  352. package/src/rbac/audit.ts +8 -8
  353. package/src/rbac/cache-invalidation.ts +7 -4
  354. package/src/rbac/components/EnhancedNavigationMenu.tsx +11 -5
  355. package/src/rbac/components/NavigationGuard.tsx +7 -3
  356. package/src/rbac/components/NavigationProvider.tsx +6 -3
  357. package/src/rbac/components/PagePermissionGuard.tsx +28 -16
  358. package/src/rbac/components/PagePermissionProvider.tsx +4 -1
  359. package/src/rbac/components/PermissionEnforcer.tsx +9 -3
  360. package/src/rbac/components/RoleBasedRouter.tsx +3 -1
  361. package/src/rbac/components/SecureDataProvider.tsx +7 -3
  362. package/src/rbac/components/__tests__/EnhancedNavigationMenu.test.tsx +87 -61
  363. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +83 -33
  364. package/src/rbac/components/__tests__/NavigationProvider.test.tsx +36 -13
  365. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +2 -2
  366. package/src/rbac/components/__tests__/PagePermissionProvider.test.tsx +22 -8
  367. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +19 -6
  368. package/src/rbac/components/__tests__/SecureDataProvider.fixed.test.tsx +43 -17
  369. package/src/rbac/components/__tests__/SecureDataProvider.test.tsx +42 -17
  370. package/src/rbac/engine.ts +15 -7
  371. package/src/rbac/hooks/usePermissions.ts +7 -3
  372. package/src/rbac/hooks/useResolvedScope.test.ts +2 -2
  373. package/src/rbac/hooks/useResolvedScope.ts +10 -7
  374. package/src/rbac/permissions.ts +5 -2
  375. package/src/rbac/security.test.ts +27 -16
  376. package/src/rbac/security.ts +5 -4
  377. package/src/services/AuthService.ts +22 -21
  378. package/src/services/EventService.ts +12 -12
  379. package/src/services/InactivityService.ts +5 -4
  380. package/src/services/OrganisationService.ts +26 -25
  381. package/src/services/__tests__/AuthService.test.ts +51 -19
  382. package/src/services/__tests__/EventService.test.ts +37 -5
  383. package/src/services/__tests__/InactivityService.test.ts +38 -4
  384. package/src/services/__tests__/OrganisationService.test.ts +3 -8
  385. package/src/services/base/BaseService.ts +3 -1
  386. package/src/theming/__tests__/runtime.test.ts +21 -12
  387. package/src/theming/parseEventColours.ts +5 -19
  388. package/src/theming/runtime.ts +8 -4
  389. package/src/types/validation.ts +2 -29
  390. package/src/utils/__tests__/appConfig.unit.test.ts +1 -1
  391. package/src/utils/__tests__/audit.unit.test.ts +1 -1
  392. package/src/utils/__tests__/auth-utils.unit.test.ts +1 -1
  393. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +19 -19
  394. package/src/utils/__tests__/cn.unit.test.ts +1 -1
  395. package/src/utils/__tests__/debugLogger.test.ts +1 -1
  396. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -1
  397. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -1
  398. package/src/utils/__tests__/formatting.unit.test.ts +1 -1
  399. package/src/utils/__tests__/lazyLoad.unit.test.tsx +1 -1
  400. package/src/utils/__tests__/logger.unit.test.ts +1 -1
  401. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -1
  402. package/src/utils/__tests__/performanceBenchmark.test.ts +1 -1
  403. package/src/utils/__tests__/performanceBudgets.unit.test.ts +1 -1
  404. package/src/utils/__tests__/permissionTypes.unit.test.ts +1 -1
  405. package/src/utils/__tests__/permissionUtils.unit.test.ts +1 -1
  406. package/src/utils/__tests__/sanitization.unit.test.ts +1 -1
  407. package/src/utils/__tests__/schemaUtils.unit.test.ts +1 -1
  408. package/src/utils/__tests__/secureDataAccess.unit.test.ts +1 -1
  409. package/src/utils/__tests__/secureErrors.unit.test.ts +33 -15
  410. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -1
  411. package/src/utils/__tests__/security.unit.test.ts +40 -18
  412. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -1
  413. package/src/utils/__tests__/sessionTracking.unit.test.ts +40 -29
  414. package/src/utils/__tests__/validationUtils.unit.test.ts +19 -6
  415. package/src/utils/{appIdResolver.test.ts → app/appIdResolver.test.ts} +28 -30
  416. package/src/utils/{appIdResolver.ts → app/appIdResolver.ts} +8 -5
  417. package/src/utils/{appNameResolver.test.ts → app/appNameResolver.test.ts} +1 -1
  418. package/src/utils/{appNameResolver.ts → app/appNameResolver.ts} +5 -1
  419. package/src/utils/{organisationContext.ts → context/organisationContext.ts} +6 -3
  420. package/src/utils/{sessionTracking.ts → context/sessionTracking.ts} +11 -12
  421. package/src/utils/{logger.ts → core/logger.ts} +4 -2
  422. package/src/utils/{deviceFingerprint.ts → device/deviceFingerprint.ts} +1 -1
  423. package/src/utils/{lazyLoad.tsx → dynamic/lazyLoad.tsx} +2 -2
  424. package/src/utils/{file-reference.test.ts → file-reference/__tests__/file-reference.test.ts} +5 -5
  425. package/src/utils/{file-reference.ts → file-reference/index.ts} +20 -38
  426. package/src/utils/index.ts +32 -54
  427. package/src/utils/{secureErrors.ts → security/secureErrors.ts} +6 -3
  428. package/src/utils/{security.ts → security/security.ts} +5 -2
  429. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -4
  430. package/src/utils/storage/helpers.ts +15 -8
  431. package/src/{components/Dialog/utils/__tests__/safeHtml.unit.test.ts → utils/validation/__tests__/htmlSanitization.unit.test.ts} +9 -15
  432. package/src/{validation → utils/validation}/csrf.ts +1 -1
  433. package/src/{components/Dialog/utils/safeHtml.ts → utils/validation/htmlSanitization.ts} +9 -10
  434. package/src/utils/validation/index.ts +79 -0
  435. package/src/utils/{sanitization.ts → validation/sanitization.ts} +71 -2
  436. package/src/{validation/schemaUtils.ts → utils/validation/schema.ts} +11 -6
  437. package/src/{validation → utils/validation}/sqlInjectionProtection.ts +2 -0
  438. package/src/utils/{validationUtils.ts → validation/validationUtils.ts} +4 -1
  439. package/src/validation/index.ts +3 -34
  440. package/dist/UnifiedAuthProvider-CQDZRJIS.js +0 -16
  441. package/dist/chunk-24MKLB7U.js +0 -81
  442. package/dist/chunk-24MKLB7U.js.map +0 -1
  443. package/dist/chunk-3CG5L6RN.js.map +0 -1
  444. package/dist/chunk-3DBFLLLU.js.map +0 -1
  445. package/dist/chunk-5F3NDPJV.js.map +0 -1
  446. package/dist/chunk-66C4BSAY.js.map +0 -1
  447. package/dist/chunk-BDZUMRBD.js.map +0 -1
  448. package/dist/chunk-BYXRHAIF.js.map +0 -1
  449. package/dist/chunk-CDQ3PX7L.js +0 -18
  450. package/dist/chunk-CDQ3PX7L.js.map +0 -1
  451. package/dist/chunk-CQZU6TFE.js.map +0 -1
  452. package/dist/chunk-F64FFPOZ.js.map +0 -1
  453. package/dist/chunk-GEVIB2UB.js.map +0 -1
  454. package/dist/chunk-GKHF54DI.js.map +0 -1
  455. package/dist/chunk-GVDR7WNV.js.map +0 -1
  456. package/dist/chunk-HMNOSGVA.js.map +0 -1
  457. package/dist/chunk-JCQZ6LA7.js.map +0 -1
  458. package/dist/chunk-M6DDYFUD.js.map +0 -1
  459. package/dist/chunk-O3NWNXDY.js.map +0 -1
  460. package/dist/chunk-PYUXFQJ3.js.map +0 -1
  461. package/dist/chunk-UJI6WSMD.js.map +0 -1
  462. package/dist/chunk-VZ5OR6HD.js.map +0 -1
  463. package/dist/chunk-WP5I5GLN.js.map +0 -1
  464. package/dist/chunk-ZYZCRSBD.js.map +0 -1
  465. package/src/components/Dialog/README.md +0 -804
  466. package/src/components/Form/FormErrorSummary.tsx +0 -113
  467. package/src/components/Form/FormFieldset.tsx +0 -127
  468. package/src/components/Form/FormLiveRegion.tsx +0 -198
  469. package/src/components/PasswordReset/PasswordResetForm.test.tsx +0 -597
  470. package/src/components/PasswordReset/PasswordResetForm.tsx +0 -201
  471. package/src/components/PublicLayout/PublicPageDebugger.tsx +0 -104
  472. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +0 -162
  473. package/src/components/PublicLayout/__tests__/PublicPageDebugger.test.tsx +0 -185
  474. package/src/examples/CorrectPublicPageImplementation.tsx +0 -304
  475. package/src/examples/PublicEventPage.tsx +0 -287
  476. package/src/examples/PublicPageApp.tsx +0 -321
  477. package/src/examples/PublicPageUsageExample.tsx +0 -218
  478. package/src/utils/schemaUtils.ts +0 -37
  479. package/src/validation/__tests__/common.unit.test.ts +0 -101
  480. package/src/validation/__tests__/csrf.unit.test.ts +0 -365
  481. package/src/validation/__tests__/passwordSchema.unit.test.ts +0 -203
  482. package/src/validation/__tests__/sanitization.unit.test.ts +0 -250
  483. package/src/validation/__tests__/schemaUtils.unit.test.ts +0 -451
  484. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +0 -462
  485. package/src/validation/__tests__/user.unit.test.ts +0 -440
  486. package/src/validation/sanitization.ts +0 -96
  487. /package/dist/{DataTable-A36PJG6N.js.map → DataTable-CYOHOX3O.js.map} +0 -0
  488. /package/dist/{UnifiedAuthProvider-CQDZRJIS.js.map → UnifiedAuthProvider-5E5TUNMS.js.map} +0 -0
  489. /package/dist/{api-TNIBJWLM.js.map → api-45XYYO2A.js.map} +0 -0
  490. /package/dist/{audit-T36HM7IM.js.map → audit-64X3VJXB.js.map} +0 -0
  491. /package/dist/{chunk-CTJRBUX2.js.map → chunk-2TWNJ46Y.js.map} +0 -0
  492. /package/dist/{chunk-ZV77RZMU.js.map → chunk-XARJS7CD.js.map} +0 -0
  493. /package/dist/{useInactivityTracker-MRUU55XI.js.map → useInactivityTracker-TO6ZOF35.js.map} +0 -0
  494. /package/examples/{public-pages → features/public-pages}/index.ts +0 -0
  495. /package/examples/{RBAC → features/rbac}/CompleteRBACExample.tsx +0 -0
  496. /package/examples/{RBAC → features/rbac}/EventBasedApp.tsx +0 -0
  497. /package/examples/{RBAC → features/rbac}/PermissionExample.tsx +0 -0
  498. /package/examples/{RBAC → features/rbac}/index.ts +0 -0
  499. /package/src/utils/{appConfig.ts → app/appConfig.ts} +0 -0
  500. /package/src/utils/{appNameResolver.simple.test.ts → app/appNameResolver.simple.test.ts} +0 -0
  501. /package/src/utils/{audit.ts → audit/audit.ts} +0 -0
  502. /package/src/utils/{organisationContext.test.ts → context/organisationContext.test.ts} +0 -0
  503. /package/src/utils/{cn.ts → core/cn.ts} +0 -0
  504. /package/src/utils/{debugLogger.ts → core/debugLogger.ts} +0 -0
  505. /package/src/utils/{dynamicUtils.ts → dynamic/dynamicUtils.ts} +0 -0
  506. /package/src/utils/{formatDate.test.ts → formatting/formatDate.test.ts} +0 -0
  507. /package/src/utils/{formatting.ts → formatting/formatting.ts} +0 -0
  508. /package/src/utils/{bundleAnalysis.ts → performance/bundleAnalysis.ts} +0 -0
  509. /package/src/utils/{performanceBenchmark.ts → performance/performanceBenchmark.ts} +0 -0
  510. /package/src/utils/{performanceBudgets.ts → performance/performanceBudgets.ts} +0 -0
  511. /package/src/utils/{permissionTypes.ts → permissions/permissionTypes.ts} +0 -0
  512. /package/src/utils/{permissionUtils.test.ts → permissions/permissionUtils.test.ts} +0 -0
  513. /package/src/utils/{permissionUtils.ts → permissions/permissionUtils.ts} +0 -0
  514. /package/src/utils/{auth-utils.ts → security/auth-utils.ts} +0 -0
  515. /package/src/utils/{secureDataAccess.test.ts → security/secureDataAccess.test.ts} +0 -0
  516. /package/src/utils/{secureDataAccess.ts → security/secureDataAccess.ts} +0 -0
  517. /package/src/utils/{secureStorage.ts → security/secureStorage.ts} +0 -0
  518. /package/src/utils/{securityMonitor.ts → security/securityMonitor.ts} +0 -0
  519. /package/src/{validation → utils/validation}/common.ts +0 -0
  520. /package/src/{validation → utils/validation}/passwordSchema.ts +0 -0
  521. /package/src/{validation → utils/validation}/user.ts +0 -0
  522. /package/src/utils/{validation.ts → validation/validation.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
+
@@ -23,7 +23,7 @@ import {
23
23
  usePublicEvent,
24
24
  usePublicRouteParams,
25
25
  PublicLoadingSpinner
26
- } from '../../src';
26
+ } from '../../../src';
27
27
 
28
28
  /**
29
29
  * MAIN APPLICATION - This is your main app with authentication
@@ -39,7 +39,7 @@ import {
39
39
  usePublicRouteParams,
40
40
  PublicLoadingSpinner,
41
41
  PublicErrorBoundary
42
- } from '../../src';
42
+ } from '../../../src';
43
43
 
44
44
  /**
45
45
  * Complete public event page example
@@ -43,7 +43,7 @@ import {
43
43
  usePublicRouteParams,
44
44
  PublicLoadingSpinner,
45
45
  PublicErrorBoundary
46
- } from '../../src';
46
+ } from '../../../src';
47
47
 
48
48
  /**
49
49
  * Complete public page application that works independently
@@ -34,7 +34,7 @@ import {
34
34
  usePublicRouteParams,
35
35
  PublicLoadingSpinner,
36
36
  PublicErrorBoundary
37
- } from '../../src';
37
+ } from '../../../src';
38
38
 
39
39
  /**
40
40
  * Correct usage pattern for public pages
package/examples/index.ts CHANGED
@@ -11,12 +11,20 @@
11
11
  *
12
12
  * @example
13
13
  * ```tsx
14
+ * // Import feature examples
14
15
  * import { PublicPageUsageExample } from '@jmruthers/pace-core/examples';
15
16
  * import { EventBasedApp } from '@jmruthers/pace-core/examples';
17
+ *
18
+ * // Import component examples
19
+ * import { HierarchicalExample } from '@jmruthers/pace-core/examples/components/DataTable';
20
+ * import { HtmlDialogExample } from '@jmruthers/pace-core/examples/components/Dialog';
16
21
  * ```
17
22
  */
18
23
 
19
- // Export all examples from subdirectories
20
- export * from './rbac';
21
- export * from './public-pages';
24
+ // Export all feature examples
25
+ export * from './features/rbac';
26
+ export * from './features/public-pages';
27
+
28
+ // Export all component examples
29
+ export * from './components';
22
30
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jmruthers/pace-core",
3
- "version": "0.5.134",
3
+ "version": "0.5.136",
4
4
  "description": "Clean, modern React component library with Tailwind v4 styling and native utilities",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -106,15 +106,35 @@
106
106
  "import": "./dist/examples/index.js",
107
107
  "default": "./dist/examples/index.js"
108
108
  },
109
- "./examples/rbac": {
110
- "types": "./dist/examples/rbac/index.d.ts",
111
- "import": "./dist/examples/rbac/index.js",
112
- "default": "./dist/examples/rbac/index.js"
113
- },
114
- "./examples/public-pages": {
115
- "types": "./dist/examples/public-pages/index.d.ts",
116
- "import": "./dist/examples/public-pages/index.js",
117
- "default": "./dist/examples/public-pages/index.js"
109
+ "./examples/features": {
110
+ "types": "./dist/examples/features/index.d.ts",
111
+ "import": "./dist/examples/features/index.js",
112
+ "default": "./dist/examples/features/index.js"
113
+ },
114
+ "./examples/features/rbac": {
115
+ "types": "./dist/examples/features/rbac/index.d.ts",
116
+ "import": "./dist/examples/features/rbac/index.js",
117
+ "default": "./dist/examples/features/rbac/index.js"
118
+ },
119
+ "./examples/features/public-pages": {
120
+ "types": "./dist/examples/features/public-pages/index.d.ts",
121
+ "import": "./dist/examples/features/public-pages/index.js",
122
+ "default": "./dist/examples/features/public-pages/index.js"
123
+ },
124
+ "./examples/components": {
125
+ "types": "./dist/examples/components/index.d.ts",
126
+ "import": "./dist/examples/components/index.js",
127
+ "default": "./dist/examples/components/index.js"
128
+ },
129
+ "./examples/components/DataTable": {
130
+ "types": "./dist/examples/components/DataTable/index.d.ts",
131
+ "import": "./dist/examples/components/DataTable/index.js",
132
+ "default": "./dist/examples/components/DataTable/index.js"
133
+ },
134
+ "./examples/components/Dialog": {
135
+ "types": "./dist/examples/components/Dialog/index.d.ts",
136
+ "import": "./dist/examples/components/Dialog/index.js",
137
+ "default": "./dist/examples/components/Dialog/index.js"
118
138
  },
119
139
  "./source/examples": {
120
140
  "import": "./examples/index.ts",
@@ -47,7 +47,7 @@
47
47
 
48
48
  import * as React from "react"
49
49
 
50
- import { cn } from "../../utils/cn"
50
+ import { cn } from "../../utils/core/cn"
51
51
 
52
52
  // Context to share variant with child components
53
53
  const AlertContext = React.createContext<{ variant?: "default" | "destructive" | "inline" | null }>({ variant: "default" })
@@ -37,7 +37,7 @@
37
37
  import * as React from "react"
38
38
  import * as AvatarPrimitive from "@radix-ui/react-avatar"
39
39
 
40
- import { cn } from "../../utils/cn"
40
+ import { cn } from "../../utils/core/cn"
41
41
 
42
42
  const Avatar = React.forwardRef<
43
43
  React.ElementRef<typeof AvatarPrimitive.Root>,
@@ -46,7 +46,7 @@
46
46
 
47
47
  import * as React from 'react';
48
48
  import { Slot } from '@radix-ui/react-slot';
49
- import { cn } from '../../utils/cn';
49
+ import { cn } from '../../utils/core/cn';
50
50
  import { Tooltip } from '../Tooltip';
51
51
 
52
52
  // ============================================================================
@@ -62,7 +62,7 @@
62
62
  */
63
63
 
64
64
  import * as React from "react"
65
- import { cn } from "../../utils/cn"
65
+ import { cn } from "../../utils/core/cn"
66
66
 
67
67
  export interface CardProps extends React.HTMLAttributes<HTMLElement> {
68
68
  /** Visual variant of the card */
@@ -49,7 +49,7 @@ import * as React from "react"
49
49
  import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
50
50
  import { Check } from "lucide-react"
51
51
 
52
- import { cn } from "../../utils/cn"
52
+ import { cn } from "../../utils/core/cn"
53
53
 
54
54
  const Checkbox = React.forwardRef<
55
55
  React.ElementRef<typeof CheckboxPrimitive.Root>,
@@ -49,7 +49,7 @@ const mockLogger = {
49
49
  };
50
50
 
51
51
  // Note: Must define mock inside factory due to hoisting
52
- vi.mock('../../utils/logger', () => {
52
+ vi.mock('../../utils/core/logger', () => {
53
53
  return {
54
54
  createLogger: () => mockLogger,
55
55
  };
@@ -282,7 +282,7 @@
282
282
 
283
283
  import React from 'react';
284
284
  import { DataTableCore } from './components/DataTableCore';
285
- import { createLogger } from '../../utils/logger';
285
+ import { createLogger } from '../../utils/core/logger';
286
286
  import { normalizeDataTableFeatures } from './types';
287
287
  import type {
288
288
  DataRecord,
@@ -471,41 +471,12 @@ export function DataTable<TData extends DataRecord>(props: DataTableProps<TData>
471
471
  [features]
472
472
  );
473
473
 
474
- React.useEffect(() => {
475
- if (!features && import.meta.env?.MODE === 'development') {
476
- logger.info('DataTable: no features provided; all capabilities default to disabled. Pass a features object to enable functionality.');
477
- }
478
- }, [features, logger]);
479
-
480
474
  React.useEffect(() => {
481
475
  if (normalizedFeatures.deleteSelected && !normalizedFeatures.deletion) {
482
476
  logger.warn('deleteSelected requires deletion to be enabled');
483
477
  }
484
478
  }, [normalizedFeatures.deleteSelected, normalizedFeatures.deletion, logger]);
485
479
 
486
- // Debug logging for onExport prop
487
- const allPropsKeys = Object.keys(props);
488
- const allRestKeys = Object.keys(rest);
489
- const tableTitle = props.title || props.description || 'unnamed';
490
-
491
- // Log all prop keys explicitly so we can see them in console
492
- console.log(`[DataTable] Wrapper prop check (${tableTitle}):`, {
493
- 'onExport in props': !!props.onExport,
494
- 'onExport in rest': !!rest.onExport,
495
- 'onExport type': typeof rest.onExport,
496
- 'rest keys': Object.keys(rest).filter(k => k.includes('Export') || k.includes('export')),
497
- 'all rest keys': allRestKeys, // All keys for debugging
498
- 'props keys': allPropsKeys, // All props keys
499
- 'has onExport key': 'onExport' in props,
500
- 'has onExport in rest': 'onExport' in rest,
501
- 'props.onExport value': props.onExport,
502
- 'rest.onExport value': rest.onExport,
503
- });
504
-
505
- // Also log the keys as separate arrays for easier inspection
506
- console.log(`[DataTable] All props keys for ${tableTitle}:`, allPropsKeys);
507
- console.log(`[DataTable] All rest keys for ${tableTitle}:`, allRestKeys);
508
-
509
480
  return <DataTableCore {...rest} features={normalizedFeatures} />;
510
481
  }
511
482