@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,202 @@
1
+ /**
2
+ * @file HTML Dialog Example
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/Dialog/Examples
5
+ * @since 0.4.36
6
+ *
7
+ * Example demonstrating HTML content rendering in Dialog components.
8
+ * Shows how to use htmlContent prop for rich text formatting.
9
+ */
10
+
11
+ import React from 'react';
12
+ import {
13
+ Dialog,
14
+ DialogTrigger,
15
+ DialogContent,
16
+ DialogHeader,
17
+ DialogTitle,
18
+ DialogDescription,
19
+ DialogBody,
20
+ DialogFooter
21
+ } from '../Dialog';
22
+ import { Button } from '../../Button';
23
+
24
+ export function HtmlDialogExample() {
25
+ const importInstructionsHtml = `
26
+ <h2>Import Dishes or Recipes</h2>
27
+ <p>Upload a CSV file with dish or recipe data. The system will automatically detect the format based on your column headers.</p>
28
+
29
+ <h3>DISH FORMAT (3 columns):</h3>
30
+ <ul>
31
+ <li><strong>Required:</strong> <code>dish_code</code>, <code>dish_name</code>, <code>mealtype_name</code></li>
32
+ <li><strong>Optional:</strong> <code>dish_description</code></li>
33
+ </ul>
34
+
35
+ <h4>Examples:</h4>
36
+ <ul>
37
+ <li><code>dish_code</code>: BBQ, PC, CTY</li>
38
+ <li><code>dish_name</code>: BBQ hamburgers and potato salad</li>
39
+ <li><code>mealtype_name</code>: Breakfast, Lunch, Dinner</li>
40
+ </ul>
41
+
42
+ <h3>RECIPE FORMAT (8 columns):</h3>
43
+ <ul>
44
+ <li><strong>Required:</strong> <code>dish_code</code>, <code>dish_name</code>, <code>mealtype_name</code>, <code>diettype_name</code>, <code>item_name</code>, <code>recipe_qtypp</code>, <code>recipe_uptake</code></li>
45
+ <li><strong>Optional:</strong> <code>item_brand</code></li>
46
+ </ul>
47
+
48
+ <h4>Examples:</h4>
49
+ <ul>
50
+ <li><code>dish_code</code>: BBQ</li>
51
+ <li><code>dish_name</code>: BBQ hamburgers and potato salad</li>
52
+ <li><code>mealtype_name</code>: Dinner</li>
53
+ <li><code>diettype_name</code>: Standard, Gluten Free, Vegan</li>
54
+ <li><code>item_name</code>: Lettuce iceberg shredded</li>
55
+ <li><code>item_brand</code>: Masterfoods, Coles</li>
56
+ <li><code>recipe_qtypp</code>: 35, 1.66</li>
57
+ <li><code>recipe_uptake</code>: 1.0, 0.75</li>
58
+ </ul>
59
+
60
+ <div style="background-color: #fef3c7; padding: 12px; border-radius: 6px; margin: 16px 0;">
61
+ <strong>⚠️ IMPORTANT:</strong> Recipe imports will replace all existing recipe data for dishes in the file.
62
+ </div>
63
+ `;
64
+
65
+ const welcomeMessageHtml = `
66
+ <h1>Welcome to <strong>PACE Core</strong>!</h1>
67
+ <p>This dialog demonstrates the new <em>HTML content rendering</em> feature.</p>
68
+
69
+ <h2>Features:</h2>
70
+ <ul>
71
+ <li>✅ <strong>Safe HTML rendering</strong> with automatic sanitization</li>
72
+ <li>✅ <strong>Rich text formatting</strong> (bold, italic, lists, etc.)</li>
73
+ <li>✅ <strong>Code highlighting</strong> with <code>&lt;code&gt;</code> tags</li>
74
+ <li>✅ <strong>Custom styling</strong> with inline styles</li>
75
+ <li>✅ <strong>Security first</strong> - dangerous content is automatically removed</li>
76
+ </ul>
77
+
78
+ <h3>Supported HTML Elements:</h3>
79
+ <p>You can use most common HTML elements including:</p>
80
+ <ul>
81
+ <li>Headings: <code>h1</code> through <code>h6</code></li>
82
+ <li>Text formatting: <strong>strong</strong>, <em>em</em>, <u>underline</u></li>
83
+ <li>Lists: <code>ul</code>, <code>ol</code>, <code>li</code></li>
84
+ <li>Code: <code>code</code>, <code>pre</code></li>
85
+ <li>Links: <a href="#" onclick="return false;">example link</a></li>
86
+ <li>Tables: <code>table</code>, <code>tr</code>, <code>td</code></li>
87
+ </ul>
88
+ `;
89
+
90
+ return (
91
+ <div className="space-y-4">
92
+ <h2 className="text-2xl font-bold">HTML Dialog Examples</h2>
93
+
94
+ {/* Example 1: Import Instructions Dialog */}
95
+ <Dialog>
96
+ <DialogTrigger asChild>
97
+ <Button variant="outline">Import Instructions</Button>
98
+ </DialogTrigger>
99
+ <DialogContent size="lg" enableScrolling={true} maxHeightPercent={80}>
100
+ <DialogHeader>
101
+ <DialogTitle htmlContent="Import Dishes or Recipes" />
102
+ <DialogDescription htmlContent="Follow the instructions below to upload your CSV file with the correct format." />
103
+ </DialogHeader>
104
+ <DialogBody
105
+ htmlContent={importInstructionsHtml}
106
+ allowHtml={true}
107
+ strictSanitization={true}
108
+ logWarnings={true}
109
+ />
110
+ <DialogFooter>
111
+ <Button variant="outline">Cancel</Button>
112
+ <Button>Select CSV File</Button>
113
+ </DialogFooter>
114
+ </DialogContent>
115
+ </Dialog>
116
+
117
+ {/* Example 2: Welcome Message Dialog */}
118
+ <Dialog>
119
+ <DialogTrigger asChild>
120
+ <Button>Welcome Message</Button>
121
+ </DialogTrigger>
122
+ <DialogContent size="md">
123
+ <DialogHeader>
124
+ <DialogTitle htmlContent="🎉 New Feature Available!" />
125
+ <DialogDescription htmlContent="Learn about the new HTML content rendering capabilities." />
126
+ </DialogHeader>
127
+ <DialogBody
128
+ htmlContent={welcomeMessageHtml}
129
+ allowHtml={true}
130
+ />
131
+ <DialogFooter>
132
+ <Button variant="outline">Learn More</Button>
133
+ <Button>Get Started</Button>
134
+ </DialogFooter>
135
+ </DialogContent>
136
+ </Dialog>
137
+
138
+ {/* Example 3: Mixed Content Dialog */}
139
+ <Dialog>
140
+ <DialogTrigger asChild>
141
+ <Button variant="secondary">Mixed Content</Button>
142
+ </DialogTrigger>
143
+ <DialogContent size="lg">
144
+ <DialogHeader>
145
+ <DialogTitle>Mixed Content Example</DialogTitle>
146
+ <DialogDescription htmlContent="This dialog shows <strong>HTML in the description</strong> and <em>React children</em> in the body." />
147
+ </DialogHeader>
148
+ <DialogBody>
149
+ <div className="space-y-4">
150
+ <h3 className="text-lg font-semibold">React Children Content</h3>
151
+ <p>This content is rendered using React children, not HTML strings.</p>
152
+ <div className="bg-main-50 p-4 rounded-lg">
153
+ <p className="text-main-800">
154
+ You can mix HTML content (via <code>htmlContent</code> prop)
155
+ with React children for maximum flexibility.
156
+ </p>
157
+ </div>
158
+ </div>
159
+ </DialogBody>
160
+ <DialogFooter>
161
+ <Button variant="outline">Cancel</Button>
162
+ <Button>Continue</Button>
163
+ </DialogFooter>
164
+ </DialogContent>
165
+ </Dialog>
166
+
167
+ {/* Example 4: Security Demo */}
168
+ <Dialog>
169
+ <DialogTrigger asChild>
170
+ <Button variant="destructive">Security Demo</Button>
171
+ </DialogTrigger>
172
+ <DialogContent size="md">
173
+ <DialogHeader>
174
+ <DialogTitle>Security Demonstration</DialogTitle>
175
+ <DialogDescription>This shows how dangerous HTML is automatically sanitized.</DialogDescription>
176
+ </DialogHeader>
177
+ <DialogBody
178
+ htmlContent={`
179
+ <h3>Safe Content</h3>
180
+ <p>This content is safe and will be rendered normally.</p>
181
+
182
+ <h3>Dangerous Content (Will Be Removed)</h3>
183
+ <p>The following dangerous elements will be automatically removed:</p>
184
+ <ul>
185
+ <li>Script tags: <script>alert('This will be removed')</script></li>
186
+ <li>Event handlers: <span onclick="alert('This will be removed')">Click me</span></li>
187
+ <li>JavaScript protocols: <a href="javascript:alert('This will be removed')">Dangerous link</a></li>
188
+ </ul>
189
+
190
+ <p><strong>Result:</strong> Only the safe content above will be displayed!</p>
191
+ `}
192
+ allowHtml={true}
193
+ logWarnings={true}
194
+ />
195
+ <DialogFooter>
196
+ <Button>Got it!</Button>
197
+ </DialogFooter>
198
+ </DialogContent>
199
+ </Dialog>
200
+ </div>
201
+ );
202
+ }
@@ -0,0 +1,290 @@
1
+ /**
2
+ * @file Scrollable Dialog Example with Height and Width Constraints
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/Dialog/Examples
5
+ * @since 0.1.0
6
+ *
7
+ * Complete example demonstrating Dialog component with:
8
+ * - Scrolling enabled
9
+ * - Height constraints (percentage and fixed)
10
+ * - Width constraints (percentage and fixed)
11
+ * - Sticky headers and footers
12
+ */
13
+
14
+ import React from 'react';
15
+ import {
16
+ Dialog,
17
+ DialogTrigger,
18
+ DialogContent,
19
+ DialogHeader,
20
+ DialogBody,
21
+ DialogFooter,
22
+ DialogTitle,
23
+ DialogDescription,
24
+ Button,
25
+ Card,
26
+ } from '../../../index';
27
+
28
+ /**
29
+ * Example demonstrating Dialog with scrolling, height, and width constraints
30
+ */
31
+ export function ScrollableDialogExample() {
32
+ // Generate long content for scrolling demonstration
33
+ const generateLongContent = (count: number) => {
34
+ return Array.from({ length: count }, (_, i) => (
35
+ <Card key={i} className="p-4">
36
+ <h4>Content Section {i + 1}</h4>
37
+ <p>
38
+ This is content section {i + 1}. In a real application, this could be form fields,
39
+ data displays, tables, or any other content that might make the dialog tall.
40
+ The dialog will automatically show a scrollbar when content exceeds the height constraints.
41
+ </p>
42
+ <p>
43
+ You can scroll through all the content while the header and footer remain visible
44
+ at the top and bottom of the dialog.
45
+ </p>
46
+ </Card>
47
+ ));
48
+ };
49
+
50
+ return (
51
+ <div className="p-6 space-y-6">
52
+ <div>
53
+ <h2>Scrollable Dialog with Constraints</h2>
54
+ <p>Examples demonstrating dialogs with scrolling, height, and width constraints.</p>
55
+ </div>
56
+
57
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
58
+ {/* Example 1: Percentage-based constraints */}
59
+ <Dialog>
60
+ <DialogTrigger asChild>
61
+ <Button variant="outline" className="w-full">
62
+ Percentage Constraints
63
+ </Button>
64
+ </DialogTrigger>
65
+ <DialogContent
66
+ enableScrolling={true}
67
+ maxHeightPercent={80}
68
+ maxWidthPercent={90}
69
+ >
70
+ <DialogHeader sticky={true}>
71
+ <DialogTitle>Percentage-Based Constraints</DialogTitle>
72
+ <DialogDescription>
73
+ This dialog uses 90% of viewport width and 80% of viewport height.
74
+ Content will scroll when it exceeds these constraints.
75
+ </DialogDescription>
76
+ </DialogHeader>
77
+ <DialogBody>
78
+ <div className="space-y-4">
79
+ {generateLongContent(25)}
80
+ </div>
81
+ </DialogBody>
82
+ <DialogFooter sticky={true}>
83
+ <Button variant="outline">Cancel</Button>
84
+ <Button>Save Changes</Button>
85
+ </DialogFooter>
86
+ </DialogContent>
87
+ </Dialog>
88
+
89
+ {/* Example 2: Fixed pixel constraints */}
90
+ <Dialog>
91
+ <DialogTrigger asChild>
92
+ <Button variant="outline" className="w-full">
93
+ Fixed Pixel Constraints
94
+ </Button>
95
+ </DialogTrigger>
96
+ <DialogContent
97
+ enableScrolling={true}
98
+ maxHeight="600px"
99
+ maxWidth="800px"
100
+ >
101
+ <DialogHeader sticky={true}>
102
+ <DialogTitle>Fixed Pixel Constraints</DialogTitle>
103
+ <DialogDescription>
104
+ This dialog has a fixed maximum height of 600px and width of 800px.
105
+ Perfect for consistent sizing regardless of viewport size.
106
+ </DialogDescription>
107
+ </DialogHeader>
108
+ <DialogBody>
109
+ <div className="space-y-4">
110
+ {generateLongContent(20)}
111
+ </div>
112
+ </DialogBody>
113
+ <DialogFooter sticky={true}>
114
+ <Button variant="outline">Cancel</Button>
115
+ <Button>Confirm</Button>
116
+ </DialogFooter>
117
+ </DialogContent>
118
+ </Dialog>
119
+
120
+ {/* Example 3: Mixed constraints (percentage height, fixed width) */}
121
+ <Dialog>
122
+ <DialogTrigger asChild>
123
+ <Button variant="outline" className="w-full">
124
+ Mixed Constraints
125
+ </Button>
126
+ </DialogTrigger>
127
+ <DialogContent
128
+ enableScrolling={true}
129
+ maxHeightPercent={75}
130
+ maxWidth="700px"
131
+ >
132
+ <DialogHeader sticky={true}>
133
+ <DialogTitle>Mixed Constraints</DialogTitle>
134
+ <DialogDescription>
135
+ This dialog uses 75% of viewport height but has a fixed width of 700px.
136
+ You can mix percentage and fixed constraints as needed.
137
+ </DialogDescription>
138
+ </DialogHeader>
139
+ <DialogBody>
140
+ <div className="space-y-4">
141
+ {generateLongContent(30)}
142
+ </div>
143
+ </DialogBody>
144
+ <DialogFooter sticky={true}>
145
+ <Button variant="outline">Close</Button>
146
+ <Button>Apply</Button>
147
+ </DialogFooter>
148
+ </DialogContent>
149
+ </Dialog>
150
+
151
+ {/* Example 4: Minimum and maximum constraints */}
152
+ <Dialog>
153
+ <DialogTrigger asChild>
154
+ <Button variant="outline" className="w-full">
155
+ Min/Max Constraints
156
+ </Button>
157
+ </DialogTrigger>
158
+ <DialogContent
159
+ enableScrolling={true}
160
+ maxHeightPercent={85}
161
+ maxWidthPercent={80}
162
+ minHeight="400px"
163
+ minWidth="500px"
164
+ >
165
+ <DialogHeader sticky={true}>
166
+ <DialogTitle>Min/Max Constraints</DialogTitle>
167
+ <DialogDescription>
168
+ This dialog has both minimum (400px height, 500px width) and maximum
169
+ (85% height, 80% width) constraints. It will never be smaller than
170
+ the minimums or larger than the maximums.
171
+ </DialogDescription>
172
+ </DialogHeader>
173
+ <DialogBody>
174
+ <div className="space-y-4">
175
+ {generateLongContent(15)}
176
+ </div>
177
+ </DialogBody>
178
+ <DialogFooter sticky={true}>
179
+ <Button variant="outline">Cancel</Button>
180
+ <Button>Save</Button>
181
+ </DialogFooter>
182
+ </DialogContent>
183
+ </Dialog>
184
+
185
+ {/* Example 5: Narrow dialog with tall content */}
186
+ <Dialog>
187
+ <DialogTrigger asChild>
188
+ <Button variant="outline" className="w-full">
189
+ Narrow & Tall
190
+ </Button>
191
+ </DialogTrigger>
192
+ <DialogContent
193
+ enableScrolling={true}
194
+ maxHeightPercent={90}
195
+ maxWidth="500px"
196
+ >
197
+ <DialogHeader sticky={true}>
198
+ <DialogTitle>Narrow Dialog with Tall Content</DialogTitle>
199
+ <DialogDescription>
200
+ A narrow dialog (500px) that uses 90% of viewport height.
201
+ Great for side panels or detail views.
202
+ </DialogDescription>
203
+ </DialogHeader>
204
+ <DialogBody>
205
+ <div className="space-y-4">
206
+ {generateLongContent(40)}
207
+ </div>
208
+ </DialogBody>
209
+ <DialogFooter sticky={true}>
210
+ <Button variant="outline">Close</Button>
211
+ <Button>Done</Button>
212
+ </DialogFooter>
213
+ </DialogContent>
214
+ </Dialog>
215
+
216
+ {/* Example 6: Wide dialog with moderate height */}
217
+ <Dialog>
218
+ <DialogTrigger asChild>
219
+ <Button variant="outline" className="w-full">
220
+ Wide & Moderate Height
221
+ </Button>
222
+ </DialogTrigger>
223
+ <DialogContent
224
+ enableScrolling={true}
225
+ maxHeight="500px"
226
+ maxWidthPercent={95}
227
+ >
228
+ <DialogHeader sticky={true}>
229
+ <DialogTitle>Wide Dialog with Moderate Height</DialogTitle>
230
+ <DialogDescription>
231
+ A wide dialog (95% width) with a fixed height of 500px.
232
+ Perfect for data tables or wide forms.
233
+ </DialogDescription>
234
+ </DialogHeader>
235
+ <DialogBody>
236
+ <div className="space-y-4">
237
+ {generateLongContent(18)}
238
+ </div>
239
+ </DialogBody>
240
+ <DialogFooter sticky={true}>
241
+ <Button variant="outline">Cancel</Button>
242
+ <Button>Submit</Button>
243
+ </DialogFooter>
244
+ </DialogContent>
245
+ </Dialog>
246
+ </div>
247
+
248
+ <Card className="p-6">
249
+ <h3>Key Features Demonstrated:</h3>
250
+ <ul className="list-disc list-inside space-y-2">
251
+ <li>
252
+ <strong>enableScrolling={true}:</strong> Enables the flex layout and scrolling
253
+ functionality. Required for proper scroll behavior.
254
+ </li>
255
+ <li>
256
+ <strong>maxHeightPercent:</strong> Maximum height as a percentage of viewport
257
+ height (0-100). Automatically capped at 95% to ensure margins.
258
+ </li>
259
+ <li>
260
+ <strong>maxWidthPercent:</strong> Maximum width as a percentage of viewport
261
+ width (0-100). Automatically capped at 95% to ensure margins.
262
+ </li>
263
+ <li>
264
+ <strong>maxHeight:</strong> Fixed maximum height in CSS units (e.g., "600px",
265
+ "50vh", "20rem"). Overrides maxHeightPercent if both are provided.
266
+ </li>
267
+ <li>
268
+ <strong>maxWidth:</strong> Fixed maximum width in CSS units. Overrides
269
+ maxWidthPercent and size prop if provided.
270
+ </li>
271
+ <li>
272
+ <strong>minHeight:</strong> Minimum height in CSS units. Ensures dialog
273
+ never gets smaller than this value.
274
+ </li>
275
+ <li>
276
+ <strong>minWidth:</strong> Minimum width in CSS units. Ensures dialog
277
+ never gets smaller than this value.
278
+ </li>
279
+ <li>
280
+ <strong>sticky={true}:</strong> On DialogHeader and DialogFooter, keeps
281
+ these elements visible while scrolling through content.
282
+ </li>
283
+ </ul>
284
+ </Card>
285
+ </div>
286
+ );
287
+ }
288
+
289
+ export default ScrollableDialogExample;
290
+
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @file Simple HTML Test
3
+ * @package @jmruthers/pace-core
4
+ * @module Components/Dialog/Examples
5
+ * @since 0.4.37
6
+ */
7
+
8
+ import React, { useState } from 'react';
9
+ import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogBody, DialogFooter } from '../Dialog';
10
+ import { Button } from '../../Button';
11
+
12
+ export function SimpleHtmlTest() {
13
+ const [isOpen, setIsOpen] = useState(false);
14
+
15
+ // Very simple HTML test
16
+ const simpleHtml = '<p>Hello <strong>world</strong>!</p>';
17
+
18
+ return (
19
+ <div className="p-4">
20
+ <h2 className="text-xl font-bold mb-4">Simple HTML Test</h2>
21
+
22
+ <div className="mb-4">
23
+ <h3 className="font-semibold mb-2">Test HTML:</h3>
24
+ <pre className="bg-sec-100 p-2 rounded text-xs">
25
+ {simpleHtml}
26
+ </pre>
27
+ </div>
28
+
29
+ <div className="mb-4">
30
+ <h3 className="font-semibold mb-2">Expected Result:</h3>
31
+ <div className="bg-main-50 p-2 rounded">
32
+ Hello <strong>world</strong>!
33
+ </div>
34
+ </div>
35
+
36
+ <Button onClick={() => setIsOpen(true)}>
37
+ Test HTML Rendering
38
+ </Button>
39
+
40
+ <Dialog open={isOpen} onOpenChange={setIsOpen}>
41
+ <DialogContent size="md">
42
+ <DialogHeader>
43
+ <DialogTitle>HTML Test</DialogTitle>
44
+ </DialogHeader>
45
+
46
+ <DialogBody htmlContent={simpleHtml} allowHtml={true}>
47
+ <div className="text-acc-500">
48
+ HTML content failed to render. This is fallback content.
49
+ </div>
50
+ </DialogBody>
51
+
52
+ <DialogFooter>
53
+ <Button variant="outline" onClick={() => setIsOpen(false)}>
54
+ Close
55
+ </Button>
56
+ </DialogFooter>
57
+ </DialogContent>
58
+ </Dialog>
59
+ </div>
60
+ );
61
+ }