@jmruthers/pace-core 0.5.68 → 0.5.70

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 (394) hide show
  1. package/dist/{DataTable-4IUY7BXB.js → DataTable-OSELOGMA.js} +6 -6
  2. package/dist/{PublicLoadingSpinner-DdKXTkCZ.d.ts → PublicLoadingSpinner-DLpF5bbs.d.ts} +78 -2
  3. package/dist/{chunk-OPCWH3A4.js → chunk-4YMVZ76F.js} +7 -6
  4. package/dist/chunk-4YMVZ76F.js.map +1 -0
  5. package/dist/{chunk-NN45OBIS.js → chunk-5G7JA3L5.js} +3 -5
  6. package/dist/{chunk-NN45OBIS.js.map → chunk-5G7JA3L5.js.map} +1 -1
  7. package/dist/{chunk-U6GPOF6J.js → chunk-5NV76BYF.js} +666 -110
  8. package/dist/chunk-5NV76BYF.js.map +1 -0
  9. package/dist/{chunk-D7ARGIA3.js → chunk-6RBH67W7.js} +23 -6
  10. package/dist/chunk-6RBH67W7.js.map +1 -0
  11. package/dist/{chunk-ZPG4XPV5.js → chunk-BHBMXMLT.js} +5 -7
  12. package/dist/chunk-BHBMXMLT.js.map +1 -0
  13. package/dist/{chunk-ZMS23NS5.js → chunk-FOT3WUV6.js} +3 -5
  14. package/dist/{chunk-ZMS23NS5.js.map → chunk-FOT3WUV6.js.map} +1 -1
  15. package/dist/{chunk-MOJXHWDE.js → chunk-GCUIIBLB.js} +382 -5
  16. package/dist/chunk-GCUIIBLB.js.map +1 -0
  17. package/dist/{chunk-PXWEDX7Y.js → chunk-KWQH4VO3.js} +3 -3
  18. package/dist/{chunk-ZPK5656W.js → chunk-O3NWNXDY.js} +4 -5
  19. package/dist/chunk-O3NWNXDY.js.map +1 -0
  20. package/dist/{chunk-KRCRNXPD.js → chunk-OTJUAYBG.js} +81 -18
  21. package/dist/chunk-OTJUAYBG.js.map +1 -0
  22. package/dist/chunk-SMJZMKYN.js +141 -0
  23. package/dist/chunk-SMJZMKYN.js.map +1 -0
  24. package/dist/{chunk-UYA6U6H7.js → chunk-V2TE7LOF.js} +4 -4
  25. package/dist/{chunk-L3RV2ALE.js → chunk-VKOCWWVY.js} +6 -1
  26. package/dist/{chunk-L3RV2ALE.js.map → chunk-VKOCWWVY.js.map} +1 -1
  27. package/dist/components.d.ts +4 -79
  28. package/dist/components.js +23 -581
  29. package/dist/components.js.map +1 -1
  30. package/dist/hooks.d.ts +1 -1
  31. package/dist/hooks.js +9 -6
  32. package/dist/hooks.js.map +1 -1
  33. package/dist/index.d.ts +4 -3
  34. package/dist/index.js +32 -19
  35. package/dist/index.js.map +1 -1
  36. package/dist/providers.js +6 -7
  37. package/dist/rbac/index.js +6 -6
  38. package/dist/styles/index.js +2 -2
  39. package/dist/theming/runtime.d.ts +4 -3
  40. package/dist/theming/runtime.js +3 -1
  41. package/dist/{usePublicRouteParams-CdoFxnJK.d.ts → usePublicRouteParams-Ua1Vz-HG.d.ts} +35 -1
  42. package/dist/utils.d.ts +4 -1
  43. package/dist/utils.js +3 -3
  44. package/docs/DOCUMENTATION_CHECKLIST.md +281 -0
  45. package/docs/README.md +22 -10
  46. package/docs/api/classes/ColumnFactory.md +1 -1
  47. package/docs/api/classes/ErrorBoundary.md +1 -1
  48. package/docs/api/classes/InvalidScopeError.md +1 -1
  49. package/docs/api/classes/MissingUserContextError.md +1 -1
  50. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  51. package/docs/api/classes/PermissionDeniedError.md +1 -1
  52. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  53. package/docs/api/classes/RBACAuditManager.md +1 -1
  54. package/docs/api/classes/RBACCache.md +1 -1
  55. package/docs/api/classes/RBACEngine.md +1 -1
  56. package/docs/api/classes/RBACError.md +1 -1
  57. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  58. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  59. package/docs/api/classes/StorageUtils.md +1 -1
  60. package/docs/api/enums/FileCategory.md +129 -0
  61. package/docs/api/interfaces/AggregateConfig.md +1 -1
  62. package/docs/api/interfaces/ButtonProps.md +1 -1
  63. package/docs/api/interfaces/CardProps.md +1 -1
  64. package/docs/api/interfaces/ColorPalette.md +1 -1
  65. package/docs/api/interfaces/ColorShade.md +1 -1
  66. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  67. package/docs/api/interfaces/DataTableAction.md +1 -1
  68. package/docs/api/interfaces/DataTableColumn.md +1 -1
  69. package/docs/api/interfaces/DataTableProps.md +1 -1
  70. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  71. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  72. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  73. package/docs/api/interfaces/EventContextType.md +7 -7
  74. package/docs/api/interfaces/EventLogoProps.md +1 -1
  75. package/docs/api/interfaces/EventProviderProps.md +2 -2
  76. package/docs/api/interfaces/FileDisplayProps.md +107 -0
  77. package/docs/api/interfaces/FileMetadata.md +129 -0
  78. package/docs/api/interfaces/FileReference.md +118 -0
  79. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  80. package/docs/api/interfaces/FileUploadOptions.md +85 -0
  81. package/docs/api/interfaces/FileUploadProps.md +1 -1
  82. package/docs/api/interfaces/FooterProps.md +1 -1
  83. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  84. package/docs/api/interfaces/InputProps.md +1 -1
  85. package/docs/api/interfaces/LabelProps.md +1 -1
  86. package/docs/api/interfaces/LoginFormProps.md +1 -1
  87. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  88. package/docs/api/interfaces/NavigationContextType.md +1 -1
  89. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  90. package/docs/api/interfaces/NavigationItem.md +1 -1
  91. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  92. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  93. package/docs/api/interfaces/Organisation.md +1 -1
  94. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  95. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  96. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  97. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  98. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  99. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  100. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  101. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  102. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  103. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  104. package/docs/api/interfaces/PaletteData.md +1 -1
  105. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  106. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  107. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  108. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  109. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  110. package/docs/api/interfaces/PublicPageHeaderProps.md +2 -2
  111. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  112. package/docs/api/interfaces/RBACConfig.md +1 -1
  113. package/docs/api/interfaces/RBACContextType.md +1 -1
  114. package/docs/api/interfaces/RBACLogger.md +1 -1
  115. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  116. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  117. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  118. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  119. package/docs/api/interfaces/RouteConfig.md +1 -1
  120. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  121. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  122. package/docs/api/interfaces/StorageConfig.md +1 -1
  123. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  124. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  125. package/docs/api/interfaces/StorageListOptions.md +1 -1
  126. package/docs/api/interfaces/StorageListResult.md +1 -1
  127. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  128. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  129. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  130. package/docs/api/interfaces/StyleImport.md +1 -1
  131. package/docs/api/interfaces/SwitchProps.md +1 -1
  132. package/docs/api/interfaces/ToastActionElement.md +1 -1
  133. package/docs/api/interfaces/ToastProps.md +1 -1
  134. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  135. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  136. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  137. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  138. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  139. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  140. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  141. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  142. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  143. package/docs/api/interfaces/UserEventAccess.md +1 -1
  144. package/docs/api/interfaces/UserMenuProps.md +1 -1
  145. package/docs/api/interfaces/UserProfile.md +1 -1
  146. package/docs/api/modules.md +228 -23
  147. package/docs/architecture/services.md +374 -0
  148. package/docs/best-practices/README.md +1 -1
  149. package/docs/best-practices/testing.md +1 -1
  150. package/docs/breaking-changes.md +182 -0
  151. package/docs/common-patterns.md +445 -0
  152. package/docs/core-concepts/authentication.md +26 -11
  153. package/docs/core-concepts/events.md +2 -0
  154. package/docs/core-concepts/organisations.md +2 -0
  155. package/docs/core-concepts/permissions.md +2 -0
  156. package/docs/{INDEX.md → documentation-index.md} +26 -38
  157. package/docs/faq.md +286 -0
  158. package/docs/{FILE_REFERENCE_SYSTEM.md → file-reference-system.md} +1 -1
  159. package/docs/getting-started/installation-guide.md +284 -0
  160. package/docs/getting-started/quick-start.md +8 -1
  161. package/docs/implementation-guides/app-layout.md +3 -1
  162. package/docs/implementation-guides/data-tables.md +2 -0
  163. package/docs/implementation-guides/dynamic-colors.md +47 -2
  164. package/docs/implementation-guides/event-theming-summary.md +220 -0
  165. package/docs/implementation-guides/forms.md +9 -7
  166. package/docs/implementation-guides/navigation.md +2 -0
  167. package/docs/migration/service-architecture.md +351 -0
  168. package/docs/rbac/README-rbac-rls-integration.md +2 -2
  169. package/docs/rbac/README.md +1 -1
  170. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  171. package/docs/rbac/quick-start.md +2 -0
  172. package/docs/rbac/rbac-rls-integration.md +2 -2
  173. package/docs/style-guide.md +136 -1
  174. package/docs/testing/README.md +1 -1
  175. package/docs/troubleshooting/authentication-issues.md +334 -0
  176. package/docs/troubleshooting/common-issues.md +2 -0
  177. package/docs/troubleshooting/styling-issues.md +199 -144
  178. package/docs/usage.md +23 -2
  179. package/package.json +3 -2
  180. package/src/__tests__/{TESTING_GUIDELINES.md → TEST_GUIDE_CURSOR.md} +20 -0
  181. package/src/__tests__/TEST_GUIDE_HUMAN.md +103 -0
  182. package/src/__tests__/fixtures/test-data.ts +90 -0
  183. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +260 -0
  184. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +224 -0
  185. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +273 -0
  186. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +98 -0
  187. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +436 -0
  188. package/src/__tests__/helpers/__tests__/timer-utils.test.ts +371 -0
  189. package/src/__tests__/helpers/component-test-utils.tsx +14 -4
  190. package/src/__tests__/helpers/optimized-test-setup.ts +68 -0
  191. package/src/__tests__/helpers/test-providers.tsx +329 -0
  192. package/src/__tests__/helpers/test-utils.tsx +91 -45
  193. package/src/__tests__/helpers/timer-utils.ts +71 -0
  194. package/src/__tests__/hooks/usePermissions.test.ts +1 -5
  195. package/src/__tests__/integration/UserProfile.test.tsx +1 -5
  196. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +42 -12
  197. package/src/__tests__/setup.ts +34 -28
  198. package/src/components/Alert/Alert.test.tsx +1 -5
  199. package/src/components/Avatar/Avatar.test.tsx +1 -5
  200. package/src/components/Button/Button.test.tsx +4 -20
  201. package/src/components/Card/Card.test.tsx +1 -5
  202. package/src/components/Checkbox/Checkbox.test.tsx +1 -5
  203. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -5
  204. package/src/components/DataTable/__tests__/DataTable.test.tsx +45 -49
  205. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +1 -5
  206. package/src/components/DataTable/__tests__/styles.test.ts +382 -0
  207. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +409 -0
  208. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +634 -0
  209. package/src/components/DataTable/core/__tests__/DataManager.test.ts +519 -0
  210. package/src/components/DataTable/core/__tests__/StateManager.test.ts +714 -0
  211. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +592 -0
  212. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +354 -0
  213. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +539 -0
  214. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +1 -5
  215. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +1 -8
  216. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +34 -38
  217. package/src/components/Footer/Footer.test.tsx +1 -5
  218. package/src/components/Form/Form.test.tsx +22 -35
  219. package/src/components/Header/Header.test.tsx +1 -9
  220. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +1 -5
  221. package/src/components/Input/Input.test.tsx +2 -10
  222. package/src/components/LoginForm/LoginForm.test.tsx +1 -5
  223. package/src/components/NavigationMenu/NavigationMenu.test.tsx +24 -24
  224. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +1 -6
  225. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +6 -16
  226. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +1 -4
  227. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +1 -5
  228. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +1 -7
  229. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +1 -9
  230. package/src/components/PasswordReset/PasswordResetForm.test.tsx +1 -9
  231. package/src/components/PublicLayout/PublicErrorBoundary.tsx +4 -5
  232. package/src/components/PublicLayout/PublicPageHeader.tsx +13 -9
  233. package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +666 -0
  234. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +457 -0
  235. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +393 -0
  236. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +351 -0
  237. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +374 -0
  238. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +388 -0
  239. package/src/components/Select/Select.bug-test.tsx +69 -0
  240. package/src/components/Select/Select.refactored.tsx +497 -0
  241. package/src/components/Select/Select.test.tsx +42 -49
  242. package/src/components/Select/Select.tsx +5 -2
  243. package/src/components/Select/hooks.ts +254 -0
  244. package/src/components/Switch/Switch.test.tsx +1 -5
  245. package/src/components/Table/__tests__/Table.test.tsx +775 -0
  246. package/src/components/Toast/Toast.test.tsx +15 -8
  247. package/src/components/Tooltip/Tooltip.test.tsx +1 -5
  248. package/src/components/UserMenu/UserMenu.test.tsx +3 -15
  249. package/src/components/__tests__/FileDisplay.test.tsx +575 -0
  250. package/src/components/__tests__/FileUpload.test.tsx +446 -0
  251. package/src/components/__tests__/SuperAdminGuard.test.tsx +422 -354
  252. package/src/hooks/__tests__/ServiceHooks.test.tsx +613 -0
  253. package/src/hooks/__tests__/hooks.integration.test.tsx +1 -10
  254. package/src/hooks/__tests__/useApiFetch.unit.test.ts +10 -14
  255. package/src/hooks/__tests__/useAppConfig.unit.test.ts +307 -0
  256. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +1 -6
  257. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +1 -5
  258. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +6 -9
  259. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +321 -0
  260. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +583 -0
  261. package/src/hooks/__tests__/usePublicEventLogo.unit.test.ts +640 -0
  262. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +435 -0
  263. package/src/hooks/__tests__/useRBAC.unit.test.ts +10 -10
  264. package/src/hooks/__tests__/useStorage.unit.test.ts +751 -0
  265. package/src/hooks/index.ts +3 -0
  266. package/src/hooks/public/usePublicEvent.ts +30 -9
  267. package/src/hooks/public/usePublicRouteParams.ts +13 -3
  268. package/src/hooks/services/useAuth.ts +50 -0
  269. package/src/hooks/services/useAuthService.ts +30 -0
  270. package/src/hooks/services/useCurrentEvent.ts +36 -0
  271. package/src/hooks/services/useCurrentOrganisation.ts +52 -0
  272. package/src/hooks/services/useEventService.ts +30 -0
  273. package/src/hooks/services/useInactivityService.ts +30 -0
  274. package/src/hooks/services/useOrganisationService.ts +30 -0
  275. package/src/hooks/services/usePermissions.ts +70 -0
  276. package/src/hooks/services/useRBACService.ts +30 -0
  277. package/src/hooks/useCounter.test.ts +1 -5
  278. package/src/hooks/useEventTheme.ts +86 -0
  279. package/src/hooks/useOrganisationPermissions.test.ts +2 -5
  280. package/src/hooks/useOrganisationSecurity.test.ts +1 -5
  281. package/src/hooks/usePermissionCache.test.ts +1 -5
  282. package/src/hooks/usePermissionCheck.ts +150 -0
  283. package/src/hooks/useSecureDataAccess.test.ts +1 -5
  284. package/src/index.ts +7 -0
  285. package/src/providers/EventProvider.tsx +58 -2
  286. package/src/providers/OrganisationProvider.test.tsx +1 -5
  287. package/src/providers/OrganisationProvider.tsx +56 -4
  288. package/src/providers/UnifiedAuthProvider.test.tsx +1 -5
  289. package/src/providers/__tests__/AuthProvider.test.tsx +105 -439
  290. package/src/providers/__tests__/AuthProvider.test.tsx.backup +771 -0
  291. package/src/providers/__tests__/EventProvider.test.tsx +211 -110
  292. package/src/providers/__tests__/EventProvider.test.tsx.backup +824 -0
  293. package/src/providers/__tests__/InactivityProvider.test.tsx +1 -5
  294. package/src/providers/__tests__/OrganisationProvider.test.tsx +97 -261
  295. package/src/providers/__tests__/OrganisationProvider.test.tsx.backup +820 -0
  296. package/src/providers/__tests__/ServiceProviders.test.tsx +477 -0
  297. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +72 -504
  298. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup +911 -0
  299. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup2 +166 -0
  300. package/src/providers/services/AuthServiceProvider.tsx +65 -0
  301. package/src/providers/services/EventServiceProvider.tsx +83 -0
  302. package/src/providers/services/InactivityServiceProvider.tsx +83 -0
  303. package/src/providers/services/OrganisationServiceProvider.tsx +77 -0
  304. package/src/providers/services/RBACServiceProvider.tsx +79 -0
  305. package/src/providers/services/UnifiedAuthProvider.tsx +368 -0
  306. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +210 -0
  307. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +269 -0
  308. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +892 -0
  309. package/src/rbac/__tests__/engine.comprehensive.test.ts +954 -0
  310. package/src/rbac/__tests__/integration.authflow.test.tsx +1 -5
  311. package/src/rbac/__tests__/integration.navigation.test.tsx +1 -4
  312. package/src/rbac/__tests__/rbac-core.test.tsx +2 -7
  313. package/src/rbac/__tests__/rbac-functions.test.ts +1 -9
  314. package/src/rbac/__tests__/rbac-integration.test.ts +1 -9
  315. package/src/rbac/api.test.ts +1 -9
  316. package/src/rbac/cache.test.ts +10 -8
  317. package/src/rbac/cli/__tests__/policy-manager.test.ts +339 -0
  318. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +1 -5
  319. package/src/rbac/components/NavigationProvider.test.tsx +1 -5
  320. package/src/rbac/components/PagePermissionProvider.test.tsx +1 -5
  321. package/src/rbac/components/SecureDataProvider.test.tsx +1 -5
  322. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +25 -29
  323. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +27 -30
  324. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +23 -27
  325. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +18 -22
  326. package/src/rbac/config.test.ts +1 -5
  327. package/src/rbac/hooks/useCan.test.ts +262 -9
  328. package/src/rbac/hooks/usePermissions.test.ts +246 -6
  329. package/src/rbac/hooks/useRBAC.simple.test.ts +1 -5
  330. package/src/rbac/hooks/useRBAC.test.ts +472 -198
  331. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +1 -9
  332. package/src/services/AuthService.ts +416 -0
  333. package/src/services/EventService.ts +366 -0
  334. package/src/services/InactivityService.ts +388 -0
  335. package/src/services/OrganisationService.ts +592 -0
  336. package/src/services/RBACService.ts +522 -0
  337. package/src/services/__tests__/AuthService.test.ts +356 -0
  338. package/src/services/__tests__/BaseService.test.ts +314 -0
  339. package/src/services/__tests__/EventService.test.ts +489 -0
  340. package/src/services/__tests__/InactivityService.test.ts +403 -0
  341. package/src/services/__tests__/OrganisationService.test.ts +660 -0
  342. package/src/services/__tests__/RBACService.test.ts +492 -0
  343. package/src/services/base/BaseService.ts +87 -0
  344. package/src/services/interfaces/IAuthService.ts +39 -0
  345. package/src/services/interfaces/IEventService.ts +30 -0
  346. package/src/services/interfaces/IInactivityService.ts +31 -0
  347. package/src/services/interfaces/IOrganisationService.ts +41 -0
  348. package/src/services/interfaces/IRBACService.ts +62 -0
  349. package/src/theming/__tests__/runtime.test.ts +560 -0
  350. package/src/theming/runtime.ts +71 -28
  351. package/src/types/__tests__/file-reference.test.ts +447 -0
  352. package/src/types/__tests__/organisation.test.ts +1133 -0
  353. package/src/types/__tests__/theme.test.ts +830 -0
  354. package/src/types/__tests__/type-validation.test.ts +527 -0
  355. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +1 -5
  356. package/src/utils/__tests__/debugLogger.test.ts +417 -0
  357. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -6
  358. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -5
  359. package/src/utils/__tests__/lazyLoad.unit.test.tsx +35 -35
  360. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -5
  361. package/src/utils/__tests__/performanceBudgets.unit.test.ts +5 -11
  362. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -6
  363. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -5
  364. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -5
  365. package/src/utils/__tests__/sessionTracking.unit.test.ts +1 -5
  366. package/src/utils/appIdResolver.test.ts +6 -10
  367. package/src/utils/appNameResolver.simple.test.ts +142 -0
  368. package/src/utils/appNameResolver.test.ts +31 -458
  369. package/src/utils/appNameResolver.test.ts.backup +494 -0
  370. package/src/utils/debugLogger.ts +26 -5
  371. package/src/utils/formatDate.test.ts +1 -5
  372. package/src/utils/organisationContext.test.ts +1 -5
  373. package/src/utils/performanceBudgets.ts +3 -4
  374. package/src/utils/secureDataAccess.test.ts +1 -5
  375. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -5
  376. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +1 -5
  377. package/dist/chunk-D7ARGIA3.js.map +0 -1
  378. package/dist/chunk-IPCH4YPT.js +0 -315
  379. package/dist/chunk-IPCH4YPT.js.map +0 -1
  380. package/dist/chunk-KRCRNXPD.js.map +0 -1
  381. package/dist/chunk-MOJXHWDE.js.map +0 -1
  382. package/dist/chunk-N2EUGZRW.js +0 -98
  383. package/dist/chunk-N2EUGZRW.js.map +0 -1
  384. package/dist/chunk-OPCWH3A4.js.map +0 -1
  385. package/dist/chunk-U6GPOF6J.js.map +0 -1
  386. package/dist/chunk-ZPG4XPV5.js.map +0 -1
  387. package/dist/chunk-ZPK5656W.js.map +0 -1
  388. package/docs/getting-started/installation.md +0 -269
  389. package/src/__tests__/REBUILD_PLAN.md +0 -223
  390. package/src/styles/base.css +0 -208
  391. package/src/styles/semantic.css +0 -24
  392. /package/dist/{DataTable-4IUY7BXB.js.map → DataTable-OSELOGMA.js.map} +0 -0
  393. /package/dist/{chunk-PXWEDX7Y.js.map → chunk-KWQH4VO3.js.map} +0 -0
  394. /package/dist/{chunk-UYA6U6H7.js.map → chunk-V2TE7LOF.js.map} +0 -0
@@ -0,0 +1,830 @@
1
+ /**
2
+ * @file Theme Type Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module Types/__tests__
5
+ * @since 1.0.0
6
+ */
7
+
8
+ import { describe, it, expect } from 'vitest';
9
+ import type {
10
+ Theme,
11
+ ThemePalette,
12
+ ThemeColors,
13
+ ThemeSpacing,
14
+ ThemeTypography,
15
+ ThemeBreakpoints,
16
+ ThemeShadows,
17
+ ThemeBorderRadius,
18
+ ThemeZIndex,
19
+ ThemeTransition,
20
+ ThemeAnimation,
21
+ ThemeConfig,
22
+ ThemeOverride,
23
+ ThemeVariant,
24
+ ThemeMode,
25
+ ThemeContext,
26
+ ThemeProviderProps,
27
+ ThemeHookReturn
28
+ } from '../theme';
29
+
30
+ describe('[types] Theme Types', () => {
31
+ describe('Theme interface', () => {
32
+ it('validates Theme type structure', () => {
33
+ const theme: Theme = {
34
+ colors: {
35
+ primary: {
36
+ 50: '#f0f9ff',
37
+ 100: '#e0f2fe',
38
+ 500: '#0ea5e9',
39
+ 900: '#0c4a6e'
40
+ },
41
+ secondary: {
42
+ 50: '#f8fafc',
43
+ 100: '#f1f5f9',
44
+ 500: '#64748b',
45
+ 900: '#0f172a'
46
+ },
47
+ accent: {
48
+ 50: '#fef2f2',
49
+ 100: '#fee2e2',
50
+ 500: '#ef4444',
51
+ 900: '#7f1d1d'
52
+ }
53
+ },
54
+ spacing: {
55
+ xs: '0.25rem',
56
+ sm: '0.5rem',
57
+ md: '1rem',
58
+ lg: '1.5rem',
59
+ xl: '2rem'
60
+ },
61
+ typography: {
62
+ fontFamily: {
63
+ sans: ['Inter', 'system-ui', 'sans-serif'],
64
+ mono: ['JetBrains Mono', 'monospace']
65
+ },
66
+ fontSize: {
67
+ xs: '0.75rem',
68
+ sm: '0.875rem',
69
+ base: '1rem',
70
+ lg: '1.125rem',
71
+ xl: '1.25rem'
72
+ },
73
+ fontWeight: {
74
+ normal: 400,
75
+ medium: 500,
76
+ semibold: 600,
77
+ bold: 700
78
+ }
79
+ },
80
+ breakpoints: {
81
+ sm: '640px',
82
+ md: '768px',
83
+ lg: '1024px',
84
+ xl: '1280px'
85
+ },
86
+ shadows: {
87
+ sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',
88
+ md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',
89
+ lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)'
90
+ },
91
+ borderRadius: {
92
+ none: '0',
93
+ sm: '0.125rem',
94
+ md: '0.375rem',
95
+ lg: '0.5rem',
96
+ full: '9999px'
97
+ },
98
+ zIndex: {
99
+ dropdown: 1000,
100
+ sticky: 1020,
101
+ fixed: 1030,
102
+ modal: 1040,
103
+ popover: 1050,
104
+ tooltip: 1060
105
+ },
106
+ transitions: {
107
+ fast: '150ms ease-in-out',
108
+ normal: '300ms ease-in-out',
109
+ slow: '500ms ease-in-out'
110
+ },
111
+ animations: {
112
+ fadeIn: 'fadeIn 0.3s ease-in-out',
113
+ slideUp: 'slideUp 0.3s ease-out',
114
+ bounce: 'bounce 1s infinite'
115
+ }
116
+ };
117
+
118
+ expect(theme).toHaveProperty('colors');
119
+ expect(theme).toHaveProperty('spacing');
120
+ expect(theme).toHaveProperty('typography');
121
+ expect(theme).toHaveProperty('breakpoints');
122
+ expect(theme).toHaveProperty('shadows');
123
+ expect(theme).toHaveProperty('borderRadius');
124
+ expect(theme).toHaveProperty('zIndex');
125
+ expect(theme).toHaveProperty('transitions');
126
+ expect(theme).toHaveProperty('animations');
127
+ expect(typeof theme.colors).toBe('object');
128
+ expect(typeof theme.spacing).toBe('object');
129
+ expect(typeof theme.typography).toBe('object');
130
+ expect(typeof theme.breakpoints).toBe('object');
131
+ expect(typeof theme.shadows).toBe('object');
132
+ expect(typeof theme.borderRadius).toBe('object');
133
+ expect(typeof theme.zIndex).toBe('object');
134
+ expect(typeof theme.transitions).toBe('object');
135
+ expect(typeof theme.animations).toBe('object');
136
+ });
137
+ });
138
+
139
+ describe('ThemePalette interface', () => {
140
+ it('validates ThemePalette type structure', () => {
141
+ const palette: ThemePalette = {
142
+ 50: '#f0f9ff',
143
+ 100: '#e0f2fe',
144
+ 200: '#bae6fd',
145
+ 300: '#7dd3fc',
146
+ 400: '#38bdf8',
147
+ 500: '#0ea5e9',
148
+ 600: '#0284c7',
149
+ 700: '#0369a1',
150
+ 800: '#075985',
151
+ 900: '#0c4a6e',
152
+ 950: '#082f49'
153
+ };
154
+
155
+ expect(palette).toHaveProperty('50');
156
+ expect(palette).toHaveProperty('100');
157
+ expect(palette).toHaveProperty('500');
158
+ expect(palette).toHaveProperty('900');
159
+ expect(palette).toHaveProperty('950');
160
+ expect(typeof palette[50]).toBe('string');
161
+ expect(typeof palette[100]).toBe('string');
162
+ expect(typeof palette[500]).toBe('string');
163
+ expect(typeof palette[900]).toBe('string');
164
+ expect(typeof palette[950]).toBe('string');
165
+ });
166
+ });
167
+
168
+ describe('ThemeColors interface', () => {
169
+ it('validates ThemeColors type structure', () => {
170
+ const colors: ThemeColors = {
171
+ primary: {
172
+ 50: '#f0f9ff',
173
+ 500: '#0ea5e9',
174
+ 900: '#0c4a6e'
175
+ },
176
+ secondary: {
177
+ 50: '#f8fafc',
178
+ 500: '#64748b',
179
+ 900: '#0f172a'
180
+ },
181
+ accent: {
182
+ 50: '#fef2f2',
183
+ 500: '#ef4444',
184
+ 900: '#7f1d1d'
185
+ }
186
+ };
187
+
188
+ expect(colors).toHaveProperty('primary');
189
+ expect(colors).toHaveProperty('secondary');
190
+ expect(colors).toHaveProperty('accent');
191
+ expect(typeof colors.primary).toBe('object');
192
+ expect(typeof colors.secondary).toBe('object');
193
+ expect(typeof colors.accent).toBe('object');
194
+ });
195
+ });
196
+
197
+ describe('ThemeSpacing interface', () => {
198
+ it('validates ThemeSpacing type structure', () => {
199
+ const spacing: ThemeSpacing = {
200
+ xs: '0.25rem',
201
+ sm: '0.5rem',
202
+ md: '1rem',
203
+ lg: '1.5rem',
204
+ xl: '2rem',
205
+ '2xl': '3rem',
206
+ '3xl': '4rem'
207
+ };
208
+
209
+ expect(spacing).toHaveProperty('xs');
210
+ expect(spacing).toHaveProperty('sm');
211
+ expect(spacing).toHaveProperty('md');
212
+ expect(spacing).toHaveProperty('lg');
213
+ expect(spacing).toHaveProperty('xl');
214
+ expect(typeof spacing.xs).toBe('string');
215
+ expect(typeof spacing.sm).toBe('string');
216
+ expect(typeof spacing.md).toBe('string');
217
+ expect(typeof spacing.lg).toBe('string');
218
+ expect(typeof spacing.xl).toBe('string');
219
+ });
220
+ });
221
+
222
+ describe('ThemeTypography interface', () => {
223
+ it('validates ThemeTypography type structure', () => {
224
+ const typography: ThemeTypography = {
225
+ fontFamily: {
226
+ sans: ['Inter', 'system-ui', 'sans-serif'],
227
+ serif: ['Georgia', 'serif'],
228
+ mono: ['JetBrains Mono', 'monospace']
229
+ },
230
+ fontSize: {
231
+ xs: '0.75rem',
232
+ sm: '0.875rem',
233
+ base: '1rem',
234
+ lg: '1.125rem',
235
+ xl: '1.25rem',
236
+ '2xl': '1.5rem',
237
+ '3xl': '1.875rem'
238
+ },
239
+ fontWeight: {
240
+ thin: 100,
241
+ light: 300,
242
+ normal: 400,
243
+ medium: 500,
244
+ semibold: 600,
245
+ bold: 700,
246
+ extrabold: 800,
247
+ black: 900
248
+ },
249
+ lineHeight: {
250
+ none: 1,
251
+ tight: 1.25,
252
+ snug: 1.375,
253
+ normal: 1.5,
254
+ relaxed: 1.625,
255
+ loose: 2
256
+ },
257
+ letterSpacing: {
258
+ tighter: '-0.05em',
259
+ tight: '-0.025em',
260
+ normal: '0em',
261
+ wide: '0.025em',
262
+ wider: '0.05em',
263
+ widest: '0.1em'
264
+ }
265
+ };
266
+
267
+ expect(typography).toHaveProperty('fontFamily');
268
+ expect(typography).toHaveProperty('fontSize');
269
+ expect(typography).toHaveProperty('fontWeight');
270
+ expect(typography).toHaveProperty('lineHeight');
271
+ expect(typography).toHaveProperty('letterSpacing');
272
+ expect(typeof typography.fontFamily).toBe('object');
273
+ expect(typeof typography.fontSize).toBe('object');
274
+ expect(typeof typography.fontWeight).toBe('object');
275
+ expect(typeof typography.lineHeight).toBe('object');
276
+ expect(typeof typography.letterSpacing).toBe('object');
277
+ });
278
+ });
279
+
280
+ describe('ThemeBreakpoints interface', () => {
281
+ it('validates ThemeBreakpoints type structure', () => {
282
+ const breakpoints: ThemeBreakpoints = {
283
+ xs: '475px',
284
+ sm: '640px',
285
+ md: '768px',
286
+ lg: '1024px',
287
+ xl: '1280px',
288
+ '2xl': '1536px'
289
+ };
290
+
291
+ expect(breakpoints).toHaveProperty('xs');
292
+ expect(breakpoints).toHaveProperty('sm');
293
+ expect(breakpoints).toHaveProperty('md');
294
+ expect(breakpoints).toHaveProperty('lg');
295
+ expect(breakpoints).toHaveProperty('xl');
296
+ expect(breakpoints).toHaveProperty('2xl');
297
+ expect(typeof breakpoints.xs).toBe('string');
298
+ expect(typeof breakpoints.sm).toBe('string');
299
+ expect(typeof breakpoints.md).toBe('string');
300
+ expect(typeof breakpoints.lg).toBe('string');
301
+ expect(typeof breakpoints.xl).toBe('string');
302
+ expect(typeof breakpoints['2xl']).toBe('string');
303
+ });
304
+ });
305
+
306
+ describe('ThemeShadows interface', () => {
307
+ it('validates ThemeShadows type structure', () => {
308
+ const shadows: ThemeShadows = {
309
+ none: 'none',
310
+ sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',
311
+ md: '0 4px 6px -1px rgb(0 0 0 / 0.1)',
312
+ lg: '0 10px 15px -3px rgb(0 0 0 / 0.1)',
313
+ xl: '0 20px 25px -5px rgb(0 0 0 / 0.1)',
314
+ '2xl': '0 25px 50px -12px rgb(0 0 0 / 0.25)',
315
+ inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)'
316
+ };
317
+
318
+ expect(shadows).toHaveProperty('none');
319
+ expect(shadows).toHaveProperty('sm');
320
+ expect(shadows).toHaveProperty('md');
321
+ expect(shadows).toHaveProperty('lg');
322
+ expect(shadows).toHaveProperty('xl');
323
+ expect(shadows).toHaveProperty('2xl');
324
+ expect(shadows).toHaveProperty('inner');
325
+ expect(typeof shadows.none).toBe('string');
326
+ expect(typeof shadows.sm).toBe('string');
327
+ expect(typeof shadows.md).toBe('string');
328
+ expect(typeof shadows.lg).toBe('string');
329
+ expect(typeof shadows.xl).toBe('string');
330
+ expect(typeof shadows['2xl']).toBe('string');
331
+ expect(typeof shadows.inner).toBe('string');
332
+ });
333
+ });
334
+
335
+ describe('ThemeBorderRadius interface', () => {
336
+ it('validates ThemeBorderRadius type structure', () => {
337
+ const borderRadius: ThemeBorderRadius = {
338
+ none: '0',
339
+ sm: '0.125rem',
340
+ md: '0.375rem',
341
+ lg: '0.5rem',
342
+ xl: '0.75rem',
343
+ '2xl': '1rem',
344
+ '3xl': '1.5rem',
345
+ full: '9999px'
346
+ };
347
+
348
+ expect(borderRadius).toHaveProperty('none');
349
+ expect(borderRadius).toHaveProperty('sm');
350
+ expect(borderRadius).toHaveProperty('md');
351
+ expect(borderRadius).toHaveProperty('lg');
352
+ expect(borderRadius).toHaveProperty('xl');
353
+ expect(borderRadius).toHaveProperty('2xl');
354
+ expect(borderRadius).toHaveProperty('3xl');
355
+ expect(borderRadius).toHaveProperty('full');
356
+ expect(typeof borderRadius.none).toBe('string');
357
+ expect(typeof borderRadius.sm).toBe('string');
358
+ expect(typeof borderRadius.md).toBe('string');
359
+ expect(typeof borderRadius.lg).toBe('string');
360
+ expect(typeof borderRadius.xl).toBe('string');
361
+ expect(typeof borderRadius['2xl']).toBe('string');
362
+ expect(typeof borderRadius['3xl']).toBe('string');
363
+ expect(typeof borderRadius.full).toBe('string');
364
+ });
365
+ });
366
+
367
+ describe('ThemeZIndex interface', () => {
368
+ it('validates ThemeZIndex type structure', () => {
369
+ const zIndex: ThemeZIndex = {
370
+ auto: 'auto',
371
+ base: 0,
372
+ dropdown: 1000,
373
+ sticky: 1020,
374
+ fixed: 1030,
375
+ modal: 1040,
376
+ popover: 1050,
377
+ tooltip: 1060,
378
+ toast: 1070
379
+ };
380
+
381
+ expect(zIndex).toHaveProperty('auto');
382
+ expect(zIndex).toHaveProperty('base');
383
+ expect(zIndex).toHaveProperty('dropdown');
384
+ expect(zIndex).toHaveProperty('sticky');
385
+ expect(zIndex).toHaveProperty('fixed');
386
+ expect(zIndex).toHaveProperty('modal');
387
+ expect(zIndex).toHaveProperty('popover');
388
+ expect(zIndex).toHaveProperty('tooltip');
389
+ expect(zIndex).toHaveProperty('toast');
390
+ expect(typeof zIndex.auto).toBe('string');
391
+ expect(typeof zIndex.base).toBe('number');
392
+ expect(typeof zIndex.dropdown).toBe('number');
393
+ expect(typeof zIndex.sticky).toBe('number');
394
+ expect(typeof zIndex.fixed).toBe('number');
395
+ expect(typeof zIndex.modal).toBe('number');
396
+ expect(typeof zIndex.popover).toBe('number');
397
+ expect(typeof zIndex.tooltip).toBe('number');
398
+ expect(typeof zIndex.toast).toBe('number');
399
+ });
400
+ });
401
+
402
+ describe('ThemeTransition interface', () => {
403
+ it('validates ThemeTransition type structure', () => {
404
+ const transitions: ThemeTransition = {
405
+ fast: '150ms ease-in-out',
406
+ normal: '300ms ease-in-out',
407
+ slow: '500ms ease-in-out',
408
+ bounce: '300ms cubic-bezier(0.68, -0.55, 0.265, 1.55)',
409
+ elastic: '500ms cubic-bezier(0.175, 0.885, 0.32, 1.275)'
410
+ };
411
+
412
+ expect(transitions).toHaveProperty('fast');
413
+ expect(transitions).toHaveProperty('normal');
414
+ expect(transitions).toHaveProperty('slow');
415
+ expect(transitions).toHaveProperty('bounce');
416
+ expect(transitions).toHaveProperty('elastic');
417
+ expect(typeof transitions.fast).toBe('string');
418
+ expect(typeof transitions.normal).toBe('string');
419
+ expect(typeof transitions.slow).toBe('string');
420
+ expect(typeof transitions.bounce).toBe('string');
421
+ expect(typeof transitions.elastic).toBe('string');
422
+ });
423
+ });
424
+
425
+ describe('ThemeAnimation interface', () => {
426
+ it('validates ThemeAnimation type structure', () => {
427
+ const animations: ThemeAnimation = {
428
+ fadeIn: 'fadeIn 0.3s ease-in-out',
429
+ fadeOut: 'fadeOut 0.3s ease-in-out',
430
+ slideUp: 'slideUp 0.3s ease-out',
431
+ slideDown: 'slideDown 0.3s ease-out',
432
+ slideLeft: 'slideLeft 0.3s ease-out',
433
+ slideRight: 'slideRight 0.3s ease-out',
434
+ scaleIn: 'scaleIn 0.2s ease-out',
435
+ scaleOut: 'scaleOut 0.2s ease-in',
436
+ bounce: 'bounce 1s infinite',
437
+ pulse: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',
438
+ spin: 'spin 1s linear infinite',
439
+ ping: 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite'
440
+ };
441
+
442
+ expect(animations).toHaveProperty('fadeIn');
443
+ expect(animations).toHaveProperty('fadeOut');
444
+ expect(animations).toHaveProperty('slideUp');
445
+ expect(animations).toHaveProperty('slideDown');
446
+ expect(animations).toHaveProperty('slideLeft');
447
+ expect(animations).toHaveProperty('slideRight');
448
+ expect(animations).toHaveProperty('scaleIn');
449
+ expect(animations).toHaveProperty('scaleOut');
450
+ expect(animations).toHaveProperty('bounce');
451
+ expect(animations).toHaveProperty('pulse');
452
+ expect(animations).toHaveProperty('spin');
453
+ expect(animations).toHaveProperty('ping');
454
+ expect(typeof animations.fadeIn).toBe('string');
455
+ expect(typeof animations.fadeOut).toBe('string');
456
+ expect(typeof animations.slideUp).toBe('string');
457
+ expect(typeof animations.slideDown).toBe('string');
458
+ expect(typeof animations.slideLeft).toBe('string');
459
+ expect(typeof animations.slideRight).toBe('string');
460
+ expect(typeof animations.scaleIn).toBe('string');
461
+ expect(typeof animations.scaleOut).toBe('string');
462
+ expect(typeof animations.bounce).toBe('string');
463
+ expect(typeof animations.pulse).toBe('string');
464
+ expect(typeof animations.spin).toBe('string');
465
+ expect(typeof animations.ping).toBe('string');
466
+ });
467
+ });
468
+ });
469
+
470
+ describe('[types] Theme Configuration Types', () => {
471
+ describe('ThemeConfig interface', () => {
472
+ it('validates ThemeConfig type structure', () => {
473
+ const config: ThemeConfig = {
474
+ defaultTheme: 'light',
475
+ enableSystemTheme: true,
476
+ enableDynamicTheming: true,
477
+ storageKey: 'pace-theme',
478
+ themes: {
479
+ light: {
480
+ colors: {
481
+ primary: { 500: '#0ea5e9' },
482
+ secondary: { 500: '#64748b' }
483
+ }
484
+ },
485
+ dark: {
486
+ colors: {
487
+ primary: { 500: '#38bdf8' },
488
+ secondary: { 500: '#94a3b8' }
489
+ }
490
+ }
491
+ }
492
+ };
493
+
494
+ expect(config).toHaveProperty('defaultTheme');
495
+ expect(config).toHaveProperty('enableSystemTheme');
496
+ expect(config).toHaveProperty('enableDynamicTheming');
497
+ expect(config).toHaveProperty('storageKey');
498
+ expect(config).toHaveProperty('themes');
499
+ expect(typeof config.defaultTheme).toBe('string');
500
+ expect(typeof config.enableSystemTheme).toBe('boolean');
501
+ expect(typeof config.enableDynamicTheming).toBe('boolean');
502
+ expect(typeof config.storageKey).toBe('string');
503
+ expect(typeof config.themes).toBe('object');
504
+ });
505
+ });
506
+
507
+ describe('ThemeOverride interface', () => {
508
+ it('validates ThemeOverride type structure', () => {
509
+ const override: ThemeOverride = {
510
+ colors: {
511
+ primary: {
512
+ 500: '#3b82f6'
513
+ }
514
+ },
515
+ spacing: {
516
+ md: '1.25rem'
517
+ },
518
+ typography: {
519
+ fontSize: {
520
+ base: '1.125rem'
521
+ }
522
+ }
523
+ };
524
+
525
+ expect(override).toHaveProperty('colors');
526
+ expect(override).toHaveProperty('spacing');
527
+ expect(override).toHaveProperty('typography');
528
+ expect(typeof override.colors).toBe('object');
529
+ expect(typeof override.spacing).toBe('object');
530
+ expect(typeof override.typography).toBe('object');
531
+ });
532
+ });
533
+
534
+ describe('ThemeVariant type', () => {
535
+ it('validates ThemeVariant values', () => {
536
+ const variants: ThemeVariant[] = ['light', 'dark', 'system'];
537
+
538
+ expect(variants).toContain('light');
539
+ expect(variants).toContain('dark');
540
+ expect(variants).toContain('system');
541
+ });
542
+
543
+ it('validates ThemeVariant type usage', () => {
544
+ const variant: ThemeVariant = 'dark';
545
+ expect(typeof variant).toBe('string');
546
+ expect(['light', 'dark', 'system']).toContain(variant);
547
+ });
548
+ });
549
+
550
+ describe('ThemeMode type', () => {
551
+ it('validates ThemeMode values', () => {
552
+ const modes: ThemeMode[] = ['light', 'dark'];
553
+
554
+ expect(modes).toContain('light');
555
+ expect(modes).toContain('dark');
556
+ });
557
+
558
+ it('validates ThemeMode type usage', () => {
559
+ const mode: ThemeMode = 'light';
560
+ expect(typeof mode).toBe('string');
561
+ expect(['light', 'dark']).toContain(mode);
562
+ });
563
+ });
564
+ });
565
+
566
+ describe('[types] Theme Context Types', () => {
567
+ describe('ThemeContext interface', () => {
568
+ it('validates ThemeContext type structure', () => {
569
+ const context: ThemeContext = {
570
+ theme: {
571
+ colors: {
572
+ primary: { 500: '#0ea5e9' },
573
+ secondary: { 500: '#64748b' }
574
+ },
575
+ spacing: { md: '1rem' },
576
+ typography: { fontSize: { base: '1rem' } },
577
+ breakpoints: { md: '768px' },
578
+ shadows: { md: '0 4px 6px -1px rgb(0 0 0 / 0.1)' },
579
+ borderRadius: { md: '0.375rem' },
580
+ zIndex: { modal: 1040 },
581
+ transitions: { normal: '300ms ease-in-out' },
582
+ animations: { fadeIn: 'fadeIn 0.3s ease-in-out' }
583
+ },
584
+ mode: 'light',
585
+ variant: 'light',
586
+ setMode: () => {},
587
+ setVariant: () => {},
588
+ toggleMode: () => {},
589
+ applyPalette: () => {},
590
+ clearPalette: () => {}
591
+ };
592
+
593
+ expect(context).toHaveProperty('theme');
594
+ expect(context).toHaveProperty('mode');
595
+ expect(context).toHaveProperty('variant');
596
+ expect(context).toHaveProperty('setMode');
597
+ expect(context).toHaveProperty('setVariant');
598
+ expect(context).toHaveProperty('toggleMode');
599
+ expect(context).toHaveProperty('applyPalette');
600
+ expect(context).toHaveProperty('clearPalette');
601
+ expect(typeof context.theme).toBe('object');
602
+ expect(typeof context.mode).toBe('string');
603
+ expect(typeof context.variant).toBe('string');
604
+ expect(typeof context.setMode).toBe('function');
605
+ expect(typeof context.setVariant).toBe('function');
606
+ expect(typeof context.toggleMode).toBe('function');
607
+ expect(typeof context.applyPalette).toBe('function');
608
+ expect(typeof context.clearPalette).toBe('function');
609
+ });
610
+ });
611
+
612
+ describe('ThemeProviderProps interface', () => {
613
+ it('validates ThemeProviderProps type structure', () => {
614
+ const props: ThemeProviderProps = {
615
+ children: 'Test children',
616
+ defaultTheme: 'light',
617
+ enableSystemTheme: true,
618
+ enableDynamicTheming: true,
619
+ storageKey: 'pace-theme',
620
+ themes: {
621
+ light: {
622
+ colors: { primary: { 500: '#0ea5e9' } },
623
+ spacing: { md: '1rem' },
624
+ typography: { fontSize: { base: '1rem' } },
625
+ breakpoints: { md: '768px' },
626
+ shadows: { md: '0 4px 6px -1px rgb(0 0 0 / 0.1)' },
627
+ borderRadius: { md: '0.375rem' },
628
+ zIndex: { modal: 1040 },
629
+ transitions: { normal: '300ms ease-in-out' },
630
+ animations: { fadeIn: 'fadeIn 0.3s ease-in-out' }
631
+ }
632
+ },
633
+ overrides: {
634
+ colors: {
635
+ primary: { 500: '#3b82f6' }
636
+ }
637
+ }
638
+ };
639
+
640
+ expect(props).toHaveProperty('children');
641
+ expect(props).toHaveProperty('defaultTheme');
642
+ expect(props).toHaveProperty('enableSystemTheme');
643
+ expect(props).toHaveProperty('enableDynamicTheming');
644
+ expect(props).toHaveProperty('storageKey');
645
+ expect(props).toHaveProperty('themes');
646
+ expect(props).toHaveProperty('overrides');
647
+ expect(typeof props.children).toBe('string');
648
+ expect(typeof props.defaultTheme).toBe('string');
649
+ expect(typeof props.enableSystemTheme).toBe('boolean');
650
+ expect(typeof props.enableDynamicTheming).toBe('boolean');
651
+ expect(typeof props.storageKey).toBe('string');
652
+ expect(typeof props.themes).toBe('object');
653
+ expect(typeof props.overrides).toBe('object');
654
+ });
655
+ });
656
+
657
+ describe('ThemeHookReturn interface', () => {
658
+ it('validates ThemeHookReturn type structure', () => {
659
+ const hookReturn: ThemeHookReturn = {
660
+ theme: {
661
+ colors: { primary: { 500: '#0ea5e9' } },
662
+ spacing: { md: '1rem' },
663
+ typography: { fontSize: { base: '1rem' } },
664
+ breakpoints: { md: '768px' },
665
+ shadows: { md: '0 4px 6px -1px rgb(0 0 0 / 0.1)' },
666
+ borderRadius: { md: '0.375rem' },
667
+ zIndex: { modal: 1040 },
668
+ transitions: { normal: '300ms ease-in-out' },
669
+ animations: { fadeIn: 'fadeIn 0.3s ease-in-out' }
670
+ },
671
+ mode: 'light',
672
+ variant: 'light',
673
+ setMode: () => {},
674
+ setVariant: () => {},
675
+ toggleMode: () => {},
676
+ applyPalette: () => {},
677
+ clearPalette: () => {},
678
+ isSystemTheme: false,
679
+ isDynamicThemingActive: true
680
+ };
681
+
682
+ expect(hookReturn).toHaveProperty('theme');
683
+ expect(hookReturn).toHaveProperty('mode');
684
+ expect(hookReturn).toHaveProperty('variant');
685
+ expect(hookReturn).toHaveProperty('setMode');
686
+ expect(hookReturn).toHaveProperty('setVariant');
687
+ expect(hookReturn).toHaveProperty('toggleMode');
688
+ expect(hookReturn).toHaveProperty('applyPalette');
689
+ expect(hookReturn).toHaveProperty('clearPalette');
690
+ expect(hookReturn).toHaveProperty('isSystemTheme');
691
+ expect(hookReturn).toHaveProperty('isDynamicThemingActive');
692
+ expect(typeof hookReturn.theme).toBe('object');
693
+ expect(typeof hookReturn.mode).toBe('string');
694
+ expect(typeof hookReturn.variant).toBe('string');
695
+ expect(typeof hookReturn.setMode).toBe('function');
696
+ expect(typeof hookReturn.setVariant).toBe('function');
697
+ expect(typeof hookReturn.toggleMode).toBe('function');
698
+ expect(typeof hookReturn.applyPalette).toBe('function');
699
+ expect(typeof hookReturn.clearPalette).toBe('function');
700
+ expect(typeof hookReturn.isSystemTheme).toBe('boolean');
701
+ expect(typeof hookReturn.isDynamicThemingActive).toBe('boolean');
702
+ });
703
+ });
704
+ });
705
+
706
+ describe('[types] Theme Usage Patterns', () => {
707
+ describe('Theme Customization', () => {
708
+ it('validates theme customization patterns', () => {
709
+ interface CustomThemeConfig {
710
+ baseTheme: Theme;
711
+ customizations: ThemeOverride;
712
+ applyCustomizations: (base: Theme, overrides: ThemeOverride) => Theme;
713
+ }
714
+
715
+ const customConfig: CustomThemeConfig = {
716
+ baseTheme: {
717
+ colors: { primary: { 500: '#0ea5e9' } },
718
+ spacing: { md: '1rem' },
719
+ typography: { fontSize: { base: '1rem' } },
720
+ breakpoints: { md: '768px' },
721
+ shadows: { md: '0 4px 6px -1px rgb(0 0 0 / 0.1)' },
722
+ borderRadius: { md: '0.375rem' },
723
+ zIndex: { modal: 1040 },
724
+ transitions: { normal: '300ms ease-in-out' },
725
+ animations: { fadeIn: 'fadeIn 0.3s ease-in-out' }
726
+ },
727
+ customizations: {
728
+ colors: {
729
+ primary: { 500: '#3b82f6' }
730
+ },
731
+ spacing: {
732
+ md: '1.25rem'
733
+ }
734
+ },
735
+ applyCustomizations: (base, overrides) => {
736
+ return {
737
+ ...base,
738
+ ...overrides,
739
+ colors: {
740
+ ...base.colors,
741
+ ...overrides.colors
742
+ },
743
+ spacing: {
744
+ ...base.spacing,
745
+ ...overrides.spacing
746
+ }
747
+ };
748
+ }
749
+ };
750
+
751
+ expect(customConfig).toHaveProperty('baseTheme');
752
+ expect(customConfig).toHaveProperty('customizations');
753
+ expect(customConfig).toHaveProperty('applyCustomizations');
754
+ expect(typeof customConfig.baseTheme).toBe('object');
755
+ expect(typeof customConfig.customizations).toBe('object');
756
+ expect(typeof customConfig.applyCustomizations).toBe('function');
757
+ });
758
+ });
759
+
760
+ describe('Theme Responsive Design', () => {
761
+ it('validates responsive theme patterns', () => {
762
+ interface ResponsiveThemeConfig {
763
+ breakpoints: ThemeBreakpoints;
764
+ getResponsiveValue: <T>(values: Partial<Record<keyof ThemeBreakpoints, T>>) => T;
765
+ isBreakpoint: (breakpoint: keyof ThemeBreakpoints) => boolean;
766
+ }
767
+
768
+ const responsiveConfig: ResponsiveThemeConfig = {
769
+ breakpoints: {
770
+ sm: '640px',
771
+ md: '768px',
772
+ lg: '1024px',
773
+ xl: '1280px'
774
+ },
775
+ getResponsiveValue: (values) => {
776
+ // Mock implementation
777
+ return values.sm || values.md || values.lg || values.xl || values.sm!;
778
+ },
779
+ isBreakpoint: (breakpoint) => {
780
+ // Mock implementation
781
+ return breakpoint === 'md';
782
+ }
783
+ };
784
+
785
+ expect(responsiveConfig).toHaveProperty('breakpoints');
786
+ expect(responsiveConfig).toHaveProperty('getResponsiveValue');
787
+ expect(responsiveConfig).toHaveProperty('isBreakpoint');
788
+ expect(typeof responsiveConfig.breakpoints).toBe('object');
789
+ expect(typeof responsiveConfig.getResponsiveValue).toBe('function');
790
+ expect(typeof responsiveConfig.isBreakpoint).toBe('function');
791
+ });
792
+ });
793
+
794
+ describe('Theme Color Utilities', () => {
795
+ it('validates theme color utility patterns', () => {
796
+ interface ColorUtility {
797
+ getColorValue: (color: string, shade: number) => string;
798
+ getContrastColor: (backgroundColor: string) => string;
799
+ generateColorPalette: (baseColor: string) => ThemePalette;
800
+ }
801
+
802
+ const colorUtility: ColorUtility = {
803
+ getColorValue: (color, shade) => {
804
+ // Mock implementation
805
+ return `#${color}${shade}`;
806
+ },
807
+ getContrastColor: (backgroundColor) => {
808
+ // Mock implementation
809
+ return backgroundColor.startsWith('#') ? '#ffffff' : '#000000';
810
+ },
811
+ generateColorPalette: (baseColor) => {
812
+ // Mock implementation
813
+ return {
814
+ 50: `${baseColor}50`,
815
+ 100: `${baseColor}100`,
816
+ 500: baseColor,
817
+ 900: `${baseColor}900`
818
+ };
819
+ }
820
+ };
821
+
822
+ expect(colorUtility).toHaveProperty('getColorValue');
823
+ expect(colorUtility).toHaveProperty('getContrastColor');
824
+ expect(colorUtility).toHaveProperty('generateColorPalette');
825
+ expect(typeof colorUtility.getColorValue).toBe('function');
826
+ expect(typeof colorUtility.getContrastColor).toBe('function');
827
+ expect(typeof colorUtility.generateColorPalette).toBe('function');
828
+ });
829
+ });
830
+ });