@antelopejs/dms 0.8.3 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/data/module-store/catalog.json +71 -0
  3. package/dist/config.d.ts +7 -0
  4. package/dist/config.js +8 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/implementations/dms/frontend-backend-proxies.d.ts +3 -0
  7. package/dist/implementations/dms/frontend-backend-proxies.js +39 -0
  8. package/dist/implementations/dms/frontend-backend-proxies.js.map +1 -0
  9. package/dist/implementations/dms/frontend-bootstrap.d.ts +1 -0
  10. package/dist/implementations/dms/frontend-bootstrap.js +13 -0
  11. package/dist/implementations/dms/frontend-bootstrap.js.map +1 -1
  12. package/dist/implementations/dms/frontend-modules.d.ts +6 -2
  13. package/dist/implementations/dms/frontend-modules.js +37 -8
  14. package/dist/implementations/dms/frontend-modules.js.map +1 -1
  15. package/dist/implementations/dms/frontend-ready.d.ts +8 -0
  16. package/dist/implementations/dms/frontend-ready.js +34 -0
  17. package/dist/implementations/dms/frontend-ready.js.map +1 -0
  18. package/dist/implementations/dms/manifest.d.ts +7 -0
  19. package/dist/implementations/dms/manifest.js +13 -0
  20. package/dist/implementations/dms/manifest.js.map +1 -1
  21. package/dist/implementations/dms/menu-categories.d.ts +16 -0
  22. package/dist/implementations/dms/menu-categories.js +30 -0
  23. package/dist/implementations/dms/menu-categories.js.map +1 -0
  24. package/dist/implementations/dms/nav-badges.d.ts +0 -8
  25. package/dist/implementations/dms/nav-badges.js +0 -16
  26. package/dist/implementations/dms/nav-badges.js.map +1 -1
  27. package/dist/implementations/dms/page.d.ts +13 -5
  28. package/dist/implementations/dms/page.js +72 -41
  29. package/dist/implementations/dms/page.js.map +1 -1
  30. package/dist/implementations/dms-html-render/index.js +5 -2
  31. package/dist/implementations/dms-html-render/index.js.map +1 -1
  32. package/dist/implementations/dms-notifications/index.d.ts +4 -3
  33. package/dist/implementations/dms-notifications/index.js +14 -6
  34. package/dist/implementations/dms-notifications/index.js.map +1 -1
  35. package/dist/pages/settings/settings-index.js +3 -2
  36. package/dist/pages/settings/settings-index.js.map +1 -1
  37. package/dist/pages/settings/users/invites.js +2 -2
  38. package/dist/pages/settings/users/invites.js.map +1 -1
  39. package/dist/pages/settings/users/member-change-notifications.js +17 -6
  40. package/dist/pages/settings/users/member-change-notifications.js.map +1 -1
  41. package/dist/pages/settings/users/member-invite-form.d.ts +3 -2
  42. package/dist/pages/settings/users/member-invite-form.js +7 -4
  43. package/dist/pages/settings/users/member-invite-form.js.map +1 -1
  44. package/dist/pages/settings/users/member-roles-field.js +2 -1
  45. package/dist/pages/settings/users/member-roles-field.js.map +1 -1
  46. package/dist/pages/settings/users/members.js +4 -1
  47. package/dist/pages/settings/users/members.js.map +1 -1
  48. package/dist/pages/settings/users/notifications.d.ts +6 -0
  49. package/dist/pages/settings/users/notifications.js +23 -15
  50. package/dist/pages/settings/users/notifications.js.map +1 -1
  51. package/dist/pages/settings/users/profile.js +1 -1
  52. package/dist/pages/settings/users/profile.js.map +1 -1
  53. package/dist/pages/settings/users/region-form.d.ts +1 -1
  54. package/dist/pages/settings/users/region-form.js +2 -1
  55. package/dist/pages/settings/users/region-form.js.map +1 -1
  56. package/dist/pages/settings/users/role-editor-store.d.ts +3 -1
  57. package/dist/pages/settings/users/role-editor-store.js +17 -4
  58. package/dist/pages/settings/users/role-editor-store.js.map +1 -1
  59. package/dist/pages/settings/users/roles.js +1 -0
  60. package/dist/pages/settings/users/roles.js.map +1 -1
  61. package/dist/realtime/registry.d.ts +1 -0
  62. package/dist/realtime/registry.js +5 -0
  63. package/dist/realtime/registry.js.map +1 -1
  64. package/dist/routes/index.d.ts +1 -0
  65. package/dist/routes/index.js +1 -0
  66. package/dist/routes/index.js.map +1 -1
  67. package/dist/routes/realtime.d.ts +5 -1
  68. package/dist/routes/realtime.js +16 -9
  69. package/dist/routes/realtime.js.map +1 -1
  70. package/dist/routes/store.d.ts +21 -0
  71. package/dist/routes/store.js +130 -0
  72. package/dist/routes/store.js.map +1 -0
  73. package/dist/store/activity.d.ts +2 -0
  74. package/dist/store/activity.js +12 -0
  75. package/dist/store/activity.js.map +1 -0
  76. package/dist/store/cache.d.ts +8 -0
  77. package/dist/store/cache.js +29 -0
  78. package/dist/store/cache.js.map +1 -0
  79. package/dist/store/catalog.d.ts +4 -0
  80. package/dist/store/catalog.js +69 -0
  81. package/dist/store/catalog.js.map +1 -0
  82. package/dist/store/compatibility.d.ts +3 -0
  83. package/dist/store/compatibility.js +45 -0
  84. package/dist/store/compatibility.js.map +1 -0
  85. package/dist/store/declarations.d.ts +18 -0
  86. package/dist/store/declarations.js +116 -0
  87. package/dist/store/declarations.js.map +1 -0
  88. package/dist/store/frontend-compatibility.d.ts +18 -0
  89. package/dist/store/frontend-compatibility.js +93 -0
  90. package/dist/store/frontend-compatibility.js.map +1 -0
  91. package/dist/store/interfaces.d.ts +6 -0
  92. package/dist/store/interfaces.js +126 -0
  93. package/dist/store/interfaces.js.map +1 -0
  94. package/dist/store/listing.d.ts +2 -0
  95. package/dist/store/listing.js +180 -0
  96. package/dist/store/listing.js.map +1 -0
  97. package/dist/store/operations.d.ts +8 -0
  98. package/dist/store/operations.js +254 -0
  99. package/dist/store/operations.js.map +1 -0
  100. package/dist/store/registry.d.ts +4 -0
  101. package/dist/store/registry.js +61 -0
  102. package/dist/store/registry.js.map +1 -0
  103. package/dist/store/requirements.d.ts +14 -0
  104. package/dist/store/requirements.js +81 -0
  105. package/dist/store/requirements.js.map +1 -0
  106. package/dist/store/runtime.d.ts +11 -0
  107. package/dist/store/runtime.js +78 -0
  108. package/dist/store/runtime.js.map +1 -0
  109. package/dist/store/tarball.d.ts +2 -0
  110. package/dist/store/tarball.js +80 -0
  111. package/dist/store/tarball.js.map +1 -0
  112. package/dist/store/types.d.ts +98 -0
  113. package/dist/store/types.js +3 -0
  114. package/dist/store/types.js.map +1 -0
  115. package/dist/test/integration/account-deletion.test.js +2 -2
  116. package/dist/test/integration/account-deletion.test.js.map +1 -1
  117. package/dist/test/integration/auth/auth-key-rotation.test.js +2 -1
  118. package/dist/test/integration/auth/auth-key-rotation.test.js.map +1 -1
  119. package/dist/test/integration/auth/current-password.test.js +2 -1
  120. package/dist/test/integration/auth/current-password.test.js.map +1 -1
  121. package/dist/test/integration/auth/session-revocation.test.js +2 -1
  122. package/dist/test/integration/auth/session-revocation.test.js.map +1 -1
  123. package/dist/test/integration/auth/sign-in-country.test.js +2 -1
  124. package/dist/test/integration/auth/sign-in-country.test.js.map +1 -1
  125. package/dist/test/integration/auth/two-factor-codes.test.js +2 -1
  126. package/dist/test/integration/auth/two-factor-codes.test.js.map +1 -1
  127. package/dist/test/integration/auth/two-factor-password.test.js +3 -2
  128. package/dist/test/integration/auth/two-factor-password.test.js.map +1 -1
  129. package/dist/test/integration/email-change.test.js +2 -1
  130. package/dist/test/integration/email-change.test.js.map +1 -1
  131. package/dist/test/integration/files/component-files.test.js +2 -2
  132. package/dist/test/integration/files/component-files.test.js.map +1 -1
  133. package/dist/test/integration/member-settings-access.test.js +8 -7
  134. package/dist/test/integration/member-settings-access.test.js.map +1 -1
  135. package/dist/test/integration/menu-access-events.test.d.ts +1 -0
  136. package/dist/test/integration/menu-access-events.test.js +148 -0
  137. package/dist/test/integration/menu-access-events.test.js.map +1 -0
  138. package/dist/test/integration/notification-inbox.test.js +4 -1
  139. package/dist/test/integration/notification-inbox.test.js.map +1 -1
  140. package/dist/test/integration/notification-locked-subjects.test.js +3 -2
  141. package/dist/test/integration/notification-locked-subjects.test.js.map +1 -1
  142. package/dist/test/integration/notification-unread-badge.test.js +51 -5
  143. package/dist/test/integration/notification-unread-badge.test.js.map +1 -1
  144. package/dist/test/integration/page-layout-route-guard.test.d.ts +1 -0
  145. package/dist/test/integration/page-layout-route-guard.test.js +56 -0
  146. package/dist/test/integration/page-layout-route-guard.test.js.map +1 -0
  147. package/dist/test/integration/permission-warnings.test.js +3 -2
  148. package/dist/test/integration/permission-warnings.test.js.map +1 -1
  149. package/dist/test/integration/removed-member-notifications.test.js +3 -2
  150. package/dist/test/integration/removed-member-notifications.test.js.map +1 -1
  151. package/dist/test/integration/role-delete-reassign.test.js +2 -1
  152. package/dist/test/integration/role-delete-reassign.test.js.map +1 -1
  153. package/dist/test/integration/role-permission-ancestors.test.js +2 -1
  154. package/dist/test/integration/role-permission-ancestors.test.js.map +1 -1
  155. package/dist/test/unit/frontend-bootstrap.test.js +13 -0
  156. package/dist/test/unit/frontend-bootstrap.test.js.map +1 -1
  157. package/dist/test/unit/implementations/dms/category-slug-registry.test.js +14 -5
  158. package/dist/test/unit/implementations/dms/category-slug-registry.test.js.map +1 -1
  159. package/dist/test/unit/implementations/dms/frontend-backend-proxies.test.d.ts +1 -0
  160. package/dist/test/unit/implementations/dms/frontend-backend-proxies.test.js +66 -0
  161. package/dist/test/unit/implementations/dms/frontend-backend-proxies.test.js.map +1 -0
  162. package/dist/test/unit/implementations/dms/manifest-strip.test.js +26 -0
  163. package/dist/test/unit/implementations/dms/manifest-strip.test.js.map +1 -1
  164. package/dist/test/unit/implementations/dms/nav-badges.test.js +23 -9
  165. package/dist/test/unit/implementations/dms/nav-badges.test.js.map +1 -1
  166. package/dist/test/unit/implementations/dms-html-render/generate-html.test.js +22 -4
  167. package/dist/test/unit/implementations/dms-html-render/generate-html.test.js.map +1 -1
  168. package/dist/test/unit/interfaces/dms/page-layout-query.test.js +12 -0
  169. package/dist/test/unit/interfaces/dms/page-layout-query.test.js.map +1 -1
  170. package/dist/test/unit/interfaces/dms/page-teardown.test.js +1 -1
  171. package/dist/test/unit/interfaces/dms/page-teardown.test.js.map +1 -1
  172. package/dist/test/unit/pages/settings/member-roles-field.test.js +1 -1
  173. package/dist/test/unit/pages/settings/member-roles-field.test.js.map +1 -1
  174. package/dist/test/unit/pages/settings/role-delete-confirm.test.js.map +1 -1
  175. package/dist/test/unit/realtime/menu-topics.test.d.ts +1 -0
  176. package/dist/test/unit/realtime/menu-topics.test.js +26 -0
  177. package/dist/test/unit/realtime/menu-topics.test.js.map +1 -0
  178. package/dist/test/unit/store/store.test.d.ts +1 -0
  179. package/dist/test/unit/store/store.test.js +127 -0
  180. package/dist/test/unit/store/store.test.js.map +1 -0
  181. package/dist/validation/store.schema.d.ts +39 -0
  182. package/dist/validation/store.schema.js +27 -0
  183. package/dist/validation/store.schema.js.map +1 -0
  184. package/frontend-vue/deferred-plugins.ts +3 -4
  185. package/frontend-vue/dms.email.ts +5 -1
  186. package/frontend-vue/dms.frontend.ts +15 -5
  187. package/frontend-vue/dms.server.ts +74 -0
  188. package/frontend-vue/layers/dms-auth/app/composables/useLogout.ts +1 -1
  189. package/frontend-vue/layers/dms-auth/app/composables/usePostLoginRedirect.ts +16 -3
  190. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/2fa.vue +3 -1
  191. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/backup.vue +3 -1
  192. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/forgot-validation.vue +1 -1
  193. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/oauth-complete.vue +26 -3
  194. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/recover.vue +1 -1
  195. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/signup.vue +22 -25
  196. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/validate.vue +1 -1
  197. package/frontend-vue/layers/dms-auth/app/middleware/auth.ts +5 -7
  198. package/frontend-vue/layers/dms-auth/app/plugins/permissions-preload.ts +17 -0
  199. package/frontend-vue/layers/dms-auth/server/accounts.ts +135 -0
  200. package/frontend-vue/layers/dms-auth/server/actions.ts +251 -0
  201. package/frontend-vue/layers/dms-auth/server/oauth.ts +260 -0
  202. package/frontend-vue/layers/dms-auth/server/session.ts +158 -0
  203. package/frontend-vue/layers/dms-core/app/build/utils/asyncDataScope.ts +47 -0
  204. package/frontend-vue/layers/dms-core/app/build/utils/permission-preview.ts +6 -2
  205. package/frontend-vue/layers/dms-core/app/composables/auth/useApiData.ts +148 -0
  206. package/frontend-vue/layers/dms-core/app/composables/auth/useAuthFetch.ts +7 -20
  207. package/frontend-vue/layers/dms-core/app/composables/auth/useCurrentUser.ts +2 -2
  208. package/frontend-vue/layers/dms-core/app/composables/auth/useMultiAccount.ts +18 -5
  209. package/frontend-vue/layers/dms-core/app/composables/auth/usePermissions.ts +35 -6
  210. package/frontend-vue/layers/dms-core/app/composables/auth/useSessionRecovery.ts +1 -1
  211. package/frontend-vue/layers/dms-core/app/composables/period/compareResolvers.ts +20 -14
  212. package/frontend-vue/layers/dms-core/app/composables/period/periodClock.ts +121 -0
  213. package/frontend-vue/layers/dms-core/app/composables/period/periodRenderNow.ts +42 -0
  214. package/frontend-vue/layers/dms-core/app/composables/period/periodTimeZone.ts +31 -0
  215. package/frontend-vue/layers/dms-core/app/composables/period/presetResolvers.ts +48 -19
  216. package/frontend-vue/layers/dms-core/app/composables/period/usePeriod.ts +33 -4
  217. package/frontend-vue/layers/dms-core/app/composables/period/usePeriodScope.ts +78 -25
  218. package/frontend-vue/layers/dms-core/app/composables/realtime/usePageRealtime.ts +3 -0
  219. package/frontend-vue/layers/dms-core/app/composables/realtime/useUserRealtime.ts +36 -6
  220. package/frontend-vue/layers/dms-core/app/composables/user/useUserRegionalPreferences.ts +1 -1
  221. package/frontend-vue/layers/dms-core/app/plugins/async-data-scope.ts +26 -0
  222. package/frontend-vue/layers/dms-core/app/utils/pageRoutes.ts +22 -0
  223. package/frontend-vue/layers/dms-core/app/utils/regional.ts +36 -3
  224. package/frontend-vue/layers/dms-core/app/utils/trailingDeduper.ts +10 -1
  225. package/frontend-vue/layers/dms-core/shared/types/app-config.ts +48 -4
  226. package/frontend-vue/layers/dms-layout/app/app.config.ts +42 -23
  227. package/frontend-vue/layers/dms-layout/app/assets/css/main.css +72 -20
  228. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardFrame.vue +9 -0
  229. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidebar.vue +0 -3
  230. package/frontend-vue/layers/dms-layout/app/build/components/notification/NotificationPopover.vue +9 -3
  231. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreDependencyPicker.vue +136 -0
  232. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreRequirements.vue +98 -0
  233. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreTile.vue +247 -29
  234. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleTile.vue +19 -2
  235. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/members/MemberRolePicker.vue +13 -12
  236. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationInboxDisplay.vue +17 -7
  237. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationPreferencesForm.vue +0 -1
  238. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfilePersonalInfo.vue +36 -33
  239. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfileSecuritySummary.vue +1 -2
  240. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/role-types.ts +5 -4
  241. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecuritySessions.vue +35 -28
  242. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityStatus.vue +0 -1
  243. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityTwoFactor.vue +1 -1
  244. package/frontend-vue/layers/dms-layout/app/build/composables/dev-reload/useDevReloadHolder.ts +7 -6
  245. package/frontend-vue/layers/dms-layout/app/build/composables/layout/sidePanelState.ts +1 -1
  246. package/frontend-vue/layers/dms-layout/app/build/composables/navigation/useVisitNavBadges.ts +26 -0
  247. package/frontend-vue/layers/dms-layout/app/build/composables/notification/useNotificationCatalog.ts +25 -23
  248. package/frontend-vue/layers/dms-layout/app/build/composables/notification/useNotificationPreferences.ts +44 -23
  249. package/frontend-vue/layers/dms-layout/app/build/composables/security/useSessionHandoff.ts +1 -1
  250. package/frontend-vue/layers/dms-layout/app/build/composables/settings/profile/preferencesSummary.ts +1 -1
  251. package/frontend-vue/layers/dms-layout/app/build/composables/settings/profile/useAccountData.ts +3 -2
  252. package/frontend-vue/layers/dms-layout/app/build/composables/settings/profile/useProfileAvatar.ts +1 -18
  253. package/frontend-vue/layers/dms-layout/app/build/composables/settings/profile/useProfilePreferences.ts +19 -23
  254. package/frontend-vue/layers/dms-layout/app/build/composables/settings/security/useSecurityFormat.ts +6 -3
  255. package/frontend-vue/layers/dms-layout/app/build/composables/settings/security/useSecurityOverview.ts +13 -18
  256. package/frontend-vue/layers/dms-layout/app/build/utils/module-store-catalog.ts +186 -120
  257. package/frontend-vue/layers/dms-layout/app/build/utils/module-store-install.ts +146 -0
  258. package/frontend-vue/layers/dms-layout/app/build/utils/modules-catalog.ts +8 -6
  259. package/frontend-vue/layers/dms-layout/app/build/utils/publicErrorMessage.ts +19 -0
  260. package/frontend-vue/layers/dms-layout/app/components/navigation/CollapsedMenuItem.vue +0 -11
  261. package/frontend-vue/layers/dms-layout/app/components/navigation/NavigationMenu.vue +3 -13
  262. package/frontend-vue/layers/dms-layout/app/composables/general/useSystemState.ts +7 -11
  263. package/frontend-vue/layers/dms-layout/app/composables/notification/useNotifications.ts +103 -22
  264. package/frontend-vue/layers/dms-layout/app/composables/page/useModuleStore.ts +109 -0
  265. package/frontend-vue/layers/dms-layout/app/composables/page/useModulesListing.ts +25 -102
  266. package/frontend-vue/layers/dms-layout/app/composables/page/usePageComponentPreload.ts +0 -10
  267. package/frontend-vue/layers/dms-layout/app/composables/page/useSiteLayout.ts +177 -96
  268. package/frontend-vue/layers/dms-layout/app/composables/profile/useUserLanguage.ts +3 -2
  269. package/frontend-vue/layers/dms-layout/app/custom-pages/modules.vue +341 -62
  270. package/frontend-vue/layers/dms-layout/app/emails/components/EmailLayout.vue +31 -11
  271. package/frontend-vue/layers/dms-layout/app/error.vue +5 -2
  272. package/frontend-vue/layers/dms-layout/app/middleware/module-routing.global.ts +1 -1
  273. package/frontend-vue/layers/dms-layout/app/middleware/page-leave-guard.global.ts +2 -2
  274. package/frontend-vue/layers/dms-layout/app/pages/[...slug].vue +12 -9
  275. package/frontend-vue/layers/dms-layout/app/plugins/dms-menu-sync.client.ts +31 -3
  276. package/frontend-vue/layers/dms-layout/app/plugins/favicon.ts +58 -0
  277. package/frontend-vue/layers/dms-layout/app/plugins/notification-stream.client.ts +15 -7
  278. package/frontend-vue/layers/dms-layout/app/plugins/profile-sync.client.ts +5 -1
  279. package/frontend-vue/layers/dms-layout/app/plugins/regional-preferences.ts +10 -4
  280. package/frontend-vue/layers/dms-layout/app/plugins/time-zone-cookie.client.ts +12 -0
  281. package/frontend-vue/layers/dms-layout/app/types/module-store.ts +134 -0
  282. package/frontend-vue/layers/dms-layout/app/types/page.ts +13 -0
  283. package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +107 -9
  284. package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +107 -9
  285. package/frontend-vue/layers/dms-layout/server/html-render.ts +58 -0
  286. package/frontend-vue/layers/dms-layout/server/render-token.ts +95 -0
  287. package/frontend-vue/layers/dms-onboarding/app/composables/onboarding/useOnboarding.ts +25 -21
  288. package/frontend-vue/layers/dms-onboarding/app/middleware/onboarding.global.ts +1 -1
  289. package/frontend-vue/layers/dms-onboarding/app/plugins/onboarding-preload.ts +9 -0
  290. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/registerDefaults.ts +4 -1
  291. package/frontend-vue/layers/dms-ui/app/build/composables/files/useFileMetadata.ts +162 -0
  292. package/frontend-vue/layers/dms-ui/app/build/composables/form/formRecordLoad.ts +23 -4
  293. package/frontend-vue/layers/dms-ui/app/build/composables/live/usePageDataRefresh.ts +101 -0
  294. package/frontend-vue/layers/dms-ui/app/build/composables/navigation/useNavBadges.ts +33 -6
  295. package/frontend-vue/layers/dms-ui/app/build/composables/period/periodDisplay.ts +19 -16
  296. package/frontend-vue/layers/dms-ui/app/build/composables/period/periodQuery.ts +40 -20
  297. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableFooter.ts +6 -8
  298. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableListData.ts +42 -14
  299. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableRows.ts +19 -8
  300. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViews.ts +1 -1
  301. package/frontend-vue/layers/dms-ui/app/components/chart/ChartCard.vue +5 -2
  302. package/frontend-vue/layers/dms-ui/app/components/flow-canvas/FlowCanvas.vue +9 -9
  303. package/frontend-vue/layers/dms-ui/app/components/form/Form.vue +20 -18
  304. package/frontend-vue/layers/dms-ui/app/components/form/components/Cascader.vue +2 -1
  305. package/frontend-vue/layers/dms-ui/app/components/form/components/File.vue +26 -132
  306. package/frontend-vue/layers/dms-ui/app/components/form/components/Image.vue +40 -105
  307. package/frontend-vue/layers/dms-ui/app/components/form/components/InputAddress.vue +2 -0
  308. package/frontend-vue/layers/dms-ui/app/components/form/components/Relation.vue +4 -4
  309. package/frontend-vue/layers/dms-ui/app/components/period/PeriodSelector.vue +9 -13
  310. package/frontend-vue/layers/dms-ui/app/components/table-view/CascaderPath.vue +2 -1
  311. package/frontend-vue/layers/dms-ui/app/components/table-view/FilePreview.vue +12 -24
  312. package/frontend-vue/layers/dms-ui/app/components/table-view/ImagePreview.vue +17 -29
  313. package/frontend-vue/layers/dms-ui/app/components/table-view/KanbanBoard.vue +7 -3
  314. package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +20 -8
  315. package/frontend-vue/layers/dms-ui/app/components/top-list/TopListCard.vue +8 -11
  316. package/frontend-vue/layers/dms-ui/app/composables/chart/useChartFetch.ts +146 -182
  317. package/frontend-vue/layers/dms-ui/app/composables/live/usePageLiveRefresh.ts +8 -2
  318. package/frontend-vue/layers/dms-ui/app/composables/useFileReadUrls.ts +11 -99
  319. package/frontend-vue/layers/dms-ui/app/utils/blockRefresh.ts +32 -3
  320. package/frontend-vue/package.json +3 -3
  321. package/frontend-vue/pnpm-lock.yaml +16 -22
  322. package/frontend-vue/server/private-options.ts +27 -0
  323. package/frontend-vue/tests/async-data-scope.test.ts +121 -0
  324. package/frontend-vue/tests/auth-middleware-error.test.ts +3 -3
  325. package/frontend-vue/tests/banner-block-fetch.test.ts +3 -0
  326. package/frontend-vue/tests/block-fetch-options-forwarding.test.ts +3 -0
  327. package/frontend-vue/tests/block-items-period-realtime.test.ts +3 -0
  328. package/frontend-vue/tests/block-not-found.test.ts +16 -2
  329. package/frontend-vue/tests/block-page-refresh.test.ts +3 -0
  330. package/frontend-vue/tests/block-route-params.test.ts +3 -0
  331. package/frontend-vue/tests/branding-defaults.test.ts +34 -0
  332. package/frontend-vue/tests/builtin-emails.test.ts +23 -2
  333. package/frontend-vue/tests/chart-live-pause.test.ts +4 -1
  334. package/frontend-vue/tests/chart-value-propagation.test.ts +4 -1
  335. package/frontend-vue/tests/composed-text-blocks.test.ts +3 -0
  336. package/frontend-vue/tests/email-layout.test.ts +66 -4
  337. package/frontend-vue/tests/error-page-message.test.ts +25 -2
  338. package/frontend-vue/tests/favicon.test.ts +131 -0
  339. package/frontend-vue/tests/file-fields-ssr.test.ts +145 -0
  340. package/frontend-vue/tests/file-read-urls.test.ts +145 -34
  341. package/frontend-vue/tests/file-unavailable.test.ts +5 -1
  342. package/frontend-vue/tests/fixtures/dataEngine.ts +44 -0
  343. package/frontend-vue/tests/form-load-error.test.ts +55 -1
  344. package/frontend-vue/tests/helpers/api-data-runtime.ts +77 -0
  345. package/frontend-vue/tests/image-hydration-ids.test.ts +21 -16
  346. package/frontend-vue/tests/image-reference-preservation.test.ts +59 -53
  347. package/frontend-vue/tests/input-number-adjust.test.ts +14 -0
  348. package/frontend-vue/tests/key-value-list-copy.test.ts +3 -0
  349. package/frontend-vue/tests/member-role-picker.test.ts +4 -2
  350. package/frontend-vue/tests/menu-sync-reconnect.test.ts +47 -0
  351. package/frontend-vue/tests/metadata-retry.test.ts +5 -1
  352. package/frontend-vue/tests/module-routing.test.ts +2 -5
  353. package/frontend-vue/tests/module-store-catalog.test.ts +270 -51
  354. package/frontend-vue/tests/modules-catalog.test.ts +17 -4
  355. package/frontend-vue/tests/modules-listing-transfer.test.ts +95 -0
  356. package/frontend-vue/tests/multi-account-validate.test.ts +23 -1
  357. package/frontend-vue/tests/nav-badge-tones.test.ts +66 -3
  358. package/frontend-vue/tests/notification-counts-from-writes.test.ts +223 -0
  359. package/frontend-vue/tests/notification-counts-transfer.test.ts +88 -0
  360. package/frontend-vue/tests/notification-inbox-display.test.ts +57 -5
  361. package/frontend-vue/tests/notification-popover-errors.test.ts +21 -1
  362. package/frontend-vue/tests/oauth-complete-handoff.test.ts +209 -0
  363. package/frontend-vue/tests/onboarding-middleware.test.ts +1 -1
  364. package/frontend-vue/tests/onboarding-transfer.test.ts +106 -0
  365. package/frontend-vue/tests/page-data-refresh.test.ts +141 -0
  366. package/frontend-vue/tests/page-fill-height.test.ts +16 -3
  367. package/frontend-vue/tests/page-no-visible-blocks.test.ts +12 -2
  368. package/frontend-vue/tests/page-realtime-remount.test.ts +1 -1
  369. package/frontend-vue/tests/page-record-label.test.ts +0 -7
  370. package/frontend-vue/tests/page-validation-redirect.test.ts +12 -2
  371. package/frontend-vue/tests/period-hydration-now.test.ts +185 -0
  372. package/frontend-vue/tests/period-live-pause.test.ts +3 -0
  373. package/frontend-vue/tests/period-reader-zone.test.ts +137 -0
  374. package/frontend-vue/tests/period-scope-first-fetch.test.ts +17 -1
  375. package/frontend-vue/tests/period-ssr.test.ts +195 -0
  376. package/frontend-vue/tests/permission-preview-partial.test.ts +0 -2
  377. package/frontend-vue/tests/permissions-transfer.test.ts +194 -0
  378. package/frontend-vue/tests/post-login-redirect.test.ts +10 -5
  379. package/frontend-vue/tests/profile-personal-info-ssr.test.ts +150 -0
  380. package/frontend-vue/tests/profile-preferences-summary.test.ts +15 -11
  381. package/frontend-vue/tests/realtime-reconnect.test.ts +22 -3
  382. package/frontend-vue/tests/roles-name-errors.test.ts +1 -1
  383. package/frontend-vue/tests/row-side-panel.test.ts +1 -1
  384. package/frontend-vue/tests/security-sessions-load-error.test.ts +3 -1
  385. package/frontend-vue/tests/server-routes-vs-pages.test.ts +26 -0
  386. package/frontend-vue/tests/server-routes.test.ts +582 -0
  387. package/frontend-vue/tests/session-handoff.test.ts +1 -1
  388. package/frontend-vue/tests/settings-reads-ssr.test.ts +232 -0
  389. package/frontend-vue/tests/side-panels.test.ts +8 -1
  390. package/frontend-vue/tests/sign-in-exit-history.test.ts +219 -0
  391. package/frontend-vue/tests/signup-invitation-link.test.ts +56 -8
  392. package/frontend-vue/tests/site-layout-categories.test.ts +42 -0
  393. package/frontend-vue/tests/site-layout-hydration.test.ts +3 -3
  394. package/frontend-vue/tests/site-layout-rendered.test.ts +103 -0
  395. package/frontend-vue/tests/site-layout-resync.test.ts +87 -0
  396. package/frontend-vue/tests/ssr-guard-preload.test.ts +188 -0
  397. package/frontend-vue/tests/table-cell-tones.test.ts +36 -1
  398. package/frontend-vue/tests/table-data-ssr.test.ts +195 -0
  399. package/frontend-vue/tests/table-list-data-requests.test.ts +154 -0
  400. package/frontend-vue/tests/table-retry-loading.test.ts +37 -0
  401. package/frontend-vue/tests/table-source-navigation.test.ts +0 -1
  402. package/frontend-vue/tests/table-source-period-scope.test.ts +0 -1
  403. package/frontend-vue/tests/table-view-views.test.ts +1 -1
  404. package/frontend-vue/tests/top-list-card-actions.test.ts +3 -0
  405. package/frontend-vue/tests/top-list-card-period-badge-ssr.test.ts +212 -0
  406. package/frontend-vue/tests/top-list-card-period-badge.test.ts +79 -0
  407. package/frontend-vue/tests/top-list-card-value-suffix.test.ts +3 -0
  408. package/frontend-vue/tests/trailing-deduper.test.ts +22 -0
  409. package/frontend-vue/tests/use-api-data-update.test.ts +119 -0
  410. package/frontend-vue/tests/use-api-data.test.ts +410 -0
  411. package/frontend-vue/tests/user-language.test.ts +8 -5
  412. package/frontend-vue/tests/widget-label-i18n.test.ts +4 -1
  413. package/frontend-vue/vitest.config.ts +6 -0
  414. package/package.json +2 -2
  415. package/skills/dms/SKILL.md +2 -1
  416. package/skills/dms-module/SKILL.md +1 -1
  417. package/skills/dms-pages/SKILL.md +4 -1
  418. package/frontend-vue/layers/dms-core/app/build/composables/page/usePageRecordLabel.ts +0 -9
  419. package/frontend-vue/layers/dms-layout/app/composables/page/usePrefetch.ts +0 -21
  420. package/frontend-vue/layers/dms-ui/app/build/composables/form/useControlError.ts +0 -10
  421. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useServerRenderedAsyncData.ts +0 -23
  422. package/frontend-vue/tests/control-error-path.test.ts +0 -11
  423. package/frontend-vue/tests/modules-listing-per-request.test.ts +0 -104
  424. package/frontend-vue/tests/page-layout-background-refresh.test.ts +0 -321
@@ -12,6 +12,51 @@ export interface DmsLogoSources {
12
12
  dark: string;
13
13
  }
14
14
 
15
+ /** The logos of an instance, one per place it is drawn. */
16
+ export interface DmsBrandingLogo {
17
+ /** The expanded sidebar and the auth pages. */
18
+ default: DmsLogoSources;
19
+ /** The icon-only sidebar. */
20
+ collapsed: DmsLogoSources;
21
+ /**
22
+ * The header of the emails, in place of `default.light`. A PNG or a JPEG:
23
+ * Gmail and Outlook refuse SVG, and an email leaves out a logo they cannot
24
+ * load. `dark` goes to the mail clients that follow the reader's dark mode.
25
+ */
26
+ email?: DmsLogoSources;
27
+ /**
28
+ * The browser tab icon. `light` and `dark` follow the operating system's
29
+ * color scheme, not the dashboard's color mode: the browser draws the tab
30
+ * outside the page.
31
+ */
32
+ favicon?: DmsLogoSources;
33
+ }
34
+
35
+ /**
36
+ * The Tailwind palette each Nuxt UI color role resolves to (`ui.colors`): a
37
+ * stock palette name, or one whose `--color-<name>-*` shades a stylesheet
38
+ * declares.
39
+ */
40
+ export interface DmsUiColors {
41
+ primary: string;
42
+ secondary: string;
43
+ neutral: string;
44
+ success: string;
45
+ warning: string;
46
+ error: string;
47
+ info: string;
48
+ }
49
+
50
+ /**
51
+ * The DMS's own logos and palettes, kept whatever a layer sets in their place,
52
+ * so a tool can preview a return to the DMS look (the builder's theme editor).
53
+ * A layer overrides `branding.logo` and `ui.colors`, never these.
54
+ */
55
+ export interface DmsBrandingDefaults {
56
+ logo: DmsBrandingLogo;
57
+ colors: DmsUiColors;
58
+ }
59
+
15
60
  /**
16
61
  * What the footer of the public and auth pages shows besides its links
17
62
  * (`registerFooterLink`).
@@ -33,11 +78,10 @@ export interface DmsBrandingConfig {
33
78
  * Absent when an instance ships no logo of its own; the layer's app config
34
79
  * supplies the AntelopeJS one by default.
35
80
  */
36
- logo?: {
37
- default: DmsLogoSources;
38
- collapsed: DmsLogoSources;
39
- };
81
+ logo?: DmsBrandingLogo;
40
82
  footer?: DmsFooterConfig;
83
+ /** Supplied by the DMS layout layer's app config. */
84
+ defaults?: DmsBrandingDefaults;
41
85
  }
42
86
 
43
87
  export interface DmsAppConfig {
@@ -1,3 +1,7 @@
1
+ import type {
2
+ DmsBrandingLogo,
3
+ DmsUiColors,
4
+ } from "#dms-core/shared/types/app-config";
1
5
  import { EYEBROW_CLASS } from "#dms-ui/app/build/utils/eyebrow";
2
6
  import { actionsTheme } from "./theme/actions";
3
7
  import { dataTheme } from "./theme/data";
@@ -8,21 +12,44 @@ import {
8
12
  } from "./theme/navigation";
9
13
  import { surfacesTheme } from "./theme/surfaces";
10
14
 
15
+ const ANTELOPE_ICON = "/images/antelope-logo/icon.svg";
16
+
17
+ // The palettes and logos are built afresh for each place that holds them: a
18
+ // merged app config keeps the very objects no layer overrides, so a live edit
19
+ // of `ui.colors` or `branding.logo` would otherwise rewrite
20
+ // `branding.defaults` too.
21
+
22
+ function dmsColors(): DmsUiColors {
23
+ return {
24
+ primary: "dms",
25
+ // The AI accent of the v2 design.
26
+ secondary: "violet",
27
+ neutral: "neutral",
28
+ // Design semantic hexes map exactly onto these Tailwind palettes:
29
+ // success #10b981 (emerald), warning #f59e0b (amber),
30
+ // error #ef4444 (red), info #06b6d4 (cyan).
31
+ success: "emerald",
32
+ warning: "amber",
33
+ error: "red",
34
+ info: "cyan",
35
+ };
36
+ }
37
+
38
+ // No email logo: the AntelopeJS logos are SVG, which mail clients refuse.
39
+ function dmsLogo(): DmsBrandingLogo {
40
+ return {
41
+ default: {
42
+ light: "/images/antelope-logo/light.svg",
43
+ dark: "/images/antelope-logo/dark.svg",
44
+ },
45
+ collapsed: { light: ANTELOPE_ICON, dark: ANTELOPE_ICON },
46
+ favicon: { light: ANTELOPE_ICON, dark: ANTELOPE_ICON },
47
+ };
48
+ }
49
+
11
50
  export default {
12
51
  ui: {
13
- colors: {
14
- primary: "dms",
15
- // The AI accent of the v2 design.
16
- secondary: "violet",
17
- neutral: "neutral",
18
- // Design semantic hexes map exactly onto these Tailwind palettes:
19
- // success #10b981 (emerald), warning #f59e0b (amber),
20
- // error #ef4444 (red), info #06b6d4 (cyan).
21
- success: "emerald",
22
- warning: "amber",
23
- error: "red",
24
- info: "cyan",
25
- },
52
+ colors: dmsColors(),
26
53
  icons: {
27
54
  arrowDown: "i-ph-arrow-down-light",
28
55
  arrowLeft: "i-ph-arrow-left-light",
@@ -184,16 +211,8 @@ export default {
184
211
  },
185
212
  },
186
213
  branding: {
187
- logo: {
188
- default: {
189
- light: "/images/antelope-logo/light.svg",
190
- dark: "/images/antelope-logo/dark.svg",
191
- },
192
- collapsed: {
193
- light: "/images/antelope-logo/icon.svg",
194
- dark: "/images/antelope-logo/icon.svg",
195
- },
196
- },
214
+ logo: dmsLogo(),
215
+ defaults: { logo: dmsLogo(), colors: dmsColors() },
197
216
  footer: {
198
217
  copyright: "Antelope",
199
218
  githubStar: true,
@@ -125,11 +125,23 @@
125
125
 
126
126
  /* Accent for text, icons and lines. The light theme needs the deep dms-700
127
127
  to stay readable on white; solid fills keep the bright dms-400 through
128
- --dms-accent-fill instead, with dark ink on top, in both themes. */
128
+ --dms-accent-fill instead, with dark ink on top, in both themes. The
129
+ whole accent family derives from the primary palette, so pointing
130
+ `ui.colors.primary` elsewhere leaves no cyan behind. The fill hover and
131
+ its ink sit between shades: on the dms palette they come within a few
132
+ units of the v2 design's #5fe0ec and #04181b. */
129
133
  --ui-primary: var(--ui-color-primary-700);
130
134
  --dms-accent-fill: var(--ui-color-primary-400);
131
- --dms-accent-fill-hover: #5fe0ec;
132
- --dms-accent-on-fill: #04181b;
135
+ --dms-accent-fill-hover: color-mix(
136
+ in srgb,
137
+ var(--ui-color-primary-400) 75%,
138
+ var(--ui-color-primary-200)
139
+ );
140
+ --dms-accent-on-fill: color-mix(
141
+ in srgb,
142
+ var(--ui-color-primary-950) 50%,
143
+ black
144
+ );
133
145
 
134
146
  /* v2 status inks: the light theme uses the 700 shades so success, warning
135
147
  and error text stays readable on white; tints and lines stay bright. */
@@ -191,11 +203,13 @@
191
203
  0 0 0 1px color-mix(in srgb, var(--dms-accent) 30%, transparent),
192
204
  0 0 24px -4px color-mix(in srgb, var(--dms-accent) 45%, transparent);
193
205
  --dms-focus-ring:
194
- 0 0 0 2px var(--ui-bg-muted), 0 0 0 4px rgb(27 162 175 / 0.55);
206
+ 0 0 0 2px var(--ui-bg-muted),
207
+ 0 0 0 4px color-mix(in srgb, var(--ui-color-primary-600) 55%, transparent);
195
208
  /* Command palette: the deepest shadow, plus an accent halo ring. */
196
209
  --dms-shadow-cmdk:
197
210
  0 1px 2px rgb(11 17 20 / 0.06), 0 30px 80px rgb(11 17 20 / 0.18);
198
- --dms-halo-accent: 0 0 0 6px rgb(27 162 175 / 0.12);
211
+ --dms-halo-accent: 0 0 0 6px
212
+ color-mix(in srgb, var(--ui-color-primary-600) 12%, transparent);
199
213
  /* Assistant mode swaps the accent halo for a violet (secondary) one,
200
214
  and tints its surfaces and lines with the same violet. Plain rgb():
201
215
  Chromium fringes the anti-aliased edge of an oklab colour-mix border
@@ -213,16 +227,30 @@
213
227
  0 1px 2px rgb(11 17 20 / 0.06), 0 24px 64px rgb(11 17 20 / 0.16);
214
228
  --dms-overlay: rgb(11 17 20 / 0.28);
215
229
  --dms-glow-accent:
216
- 0 0 0 1px var(--ui-color-primary-600), 0 4px 16px rgb(27 162 175 / 0.18);
230
+ 0 0 0 1px var(--ui-color-primary-600),
231
+ 0 4px 16px
232
+ color-mix(in srgb, var(--ui-color-primary-600) 18%, transparent);
217
233
 
218
234
  --dms-accent: var(--ui-color-primary-500);
219
235
 
220
236
  /* Form controls (v2 --accent-tint*, --error-tint, --border-top,
221
237
  --btn-highlight): the 3px focus halo around fields, the strongest border
222
238
  (unchecked boxes, dropzones) and the highlight on accent fills. */
223
- --dms-accent-tint: rgb(27 162 175 / 0.09);
224
- --dms-accent-tint-strong: rgb(27 162 175 / 0.15);
225
- --dms-accent-line: rgb(27 162 175 / 0.35);
239
+ --dms-accent-tint: color-mix(
240
+ in srgb,
241
+ var(--ui-color-primary-600) 9%,
242
+ transparent
243
+ );
244
+ --dms-accent-tint-strong: color-mix(
245
+ in srgb,
246
+ var(--ui-color-primary-600) 15%,
247
+ transparent
248
+ );
249
+ --dms-accent-line: color-mix(
250
+ in srgb,
251
+ var(--ui-color-primary-600) 35%,
252
+ transparent
253
+ );
226
254
  --dms-error-tint: rgb(220 38 38 / 0.08);
227
255
  --dms-border-top: #c9d1d7;
228
256
  --dms-field-border-hover: color-mix(
@@ -231,7 +259,8 @@
231
259
  var(--ui-text-muted)
232
260
  );
233
261
  --dms-fill-highlight:
234
- inset 0 1px 0 rgb(255 255 255 / 0.45), 0 1px 2px rgb(6 46 53 / 0.18);
262
+ inset 0 1px 0 rgb(255 255 255 / 0.45),
263
+ 0 1px 2px color-mix(in srgb, var(--ui-color-primary-950) 18%, transparent);
235
264
 
236
265
  /* Charts and dashboards (v2 --chart-*, --sparkline, --skeleton): step 1
237
266
  is the main series, step 2 (violet) always the comparison. Lines use
@@ -285,12 +314,12 @@
285
314
  --dms-bg-muted: #0d1114;
286
315
  --dms-canvas-glow: radial-gradient(
287
316
  900px 600px at 85% -10%,
288
- rgb(77 217 230 / 0.055),
317
+ color-mix(in srgb, var(--ui-color-primary-400) 5.5%, transparent),
289
318
  transparent 70%
290
319
  );
291
320
  --dms-stage-glow: radial-gradient(
292
321
  closest-side,
293
- rgb(77 217 230 / 0.1),
322
+ color-mix(in srgb, var(--ui-color-primary-400) 10%, transparent),
294
323
  transparent
295
324
  );
296
325
 
@@ -316,10 +345,12 @@
316
345
  0 0 0 1px color-mix(in srgb, var(--dms-accent) 35%, transparent),
317
346
  0 0 32px -4px color-mix(in srgb, var(--dms-accent) 45%, transparent);
318
347
  --dms-focus-ring:
319
- 0 0 0 2px var(--ui-bg-muted), 0 0 0 4px rgb(77 217 230 / 0.6);
348
+ 0 0 0 2px var(--ui-bg-muted),
349
+ 0 0 0 4px color-mix(in srgb, var(--ui-color-primary-400) 60%, transparent);
320
350
  --dms-shadow-cmdk:
321
351
  0 50px 140px rgb(0 0 0 / 0.7), inset 0 1px 0 rgb(255 255 255 / 0.04);
322
- --dms-halo-accent: 0 0 0 8px rgb(77 217 230 / 0.07);
352
+ --dms-halo-accent: 0 0 0 8px
353
+ color-mix(in srgb, var(--ui-color-primary-400) 7%, transparent);
323
354
  --dms-assistant-halo: 0 0 0 8px rgb(167 139 250 / 0.09);
324
355
  --dms-assistant-tint: rgb(167 139 250 / 0.12);
325
356
  --dms-assistant-line: rgb(167 139 250 / 0.4);
@@ -329,12 +360,25 @@
329
360
  0 40px 120px rgb(0 0 0 / 0.7), inset 0 1px 0 rgb(255 255 255 / 0.04);
330
361
  --dms-overlay: rgb(3 5 6 / 0.62);
331
362
  --dms-glow-accent:
332
- 0 0 0 1px var(--ui-color-primary-400), 0 0 40px rgb(77 217 230 / 0.25);
363
+ 0 0 0 1px var(--ui-color-primary-400),
364
+ 0 0 40px color-mix(in srgb, var(--ui-color-primary-400) 25%, transparent);
333
365
  --dms-accent: var(--ui-color-primary-400);
334
366
 
335
- --dms-accent-tint: rgb(77 217 230 / 0.1);
336
- --dms-accent-tint-strong: rgb(77 217 230 / 0.16);
337
- --dms-accent-line: rgb(77 217 230 / 0.35);
367
+ --dms-accent-tint: color-mix(
368
+ in srgb,
369
+ var(--ui-color-primary-400) 10%,
370
+ transparent
371
+ );
372
+ --dms-accent-tint-strong: color-mix(
373
+ in srgb,
374
+ var(--ui-color-primary-400) 16%,
375
+ transparent
376
+ );
377
+ --dms-accent-line: color-mix(
378
+ in srgb,
379
+ var(--ui-color-primary-400) 35%,
380
+ transparent
381
+ );
338
382
  --dms-error-tint: rgb(248 113 113 / 0.13);
339
383
  --dms-border-top: #3a4550;
340
384
  --dms-field-border-hover: color-mix(
@@ -380,7 +424,11 @@
380
424
  --ui-border-accented: #8a949d;
381
425
  --dms-border-top: #8a949d;
382
426
  --dms-chart-grid: #dfe4e8;
383
- --dms-accent-line: rgb(27 162 175 / 0.6);
427
+ --dms-accent-line: color-mix(
428
+ in srgb,
429
+ var(--ui-color-primary-600) 60%,
430
+ transparent
431
+ );
384
432
  --dms-success-line: rgb(22 163 74 / 0.55);
385
433
  --dms-warning-line: rgb(217 119 6 / 0.6);
386
434
  --dms-error-line: rgb(220 38 38 / 0.55);
@@ -398,7 +446,11 @@
398
446
  --ui-border-accented: #5f6b76;
399
447
  --dms-border-top: #6b7782;
400
448
  --dms-chart-grid: #262e36;
401
- --dms-accent-line: rgb(77 217 230 / 0.6);
449
+ --dms-accent-line: color-mix(
450
+ in srgb,
451
+ var(--ui-color-primary-400) 60%,
452
+ transparent
453
+ );
402
454
  --dms-success-line: rgb(74 222 128 / 0.6);
403
455
  --dms-warning-line: rgb(251 191 36 / 0.6);
404
456
  --dms-error-line: rgb(248 113 113 / 0.6);
@@ -6,6 +6,7 @@ import DashboardBanners from "./DashboardBanners.vue";
6
6
  import GithubStarPrompt from "./GithubStarPrompt.vue";
7
7
  import RolePreviewBar from "./RolePreviewBar.vue";
8
8
  import { useAppWidgets } from "../../../composables/useAppWidgets";
9
+ import { useVisitNavBadges } from "../../composables/navigation/useVisitNavBadges";
9
10
  import {
10
11
  sidePanelWidthStyle,
11
12
  useActiveSidePanel,
@@ -45,6 +46,14 @@ const props = withDefaults(defineProps<Props>(), {
45
46
  });
46
47
 
47
48
  providePageFillHeight(toRef(props, "fillHeight"));
49
+ // A custom page brings no site layout: read with the page, and taken over by
50
+ // the browser before the sidebar, the header and the banners render it.
51
+ useRenderedSiteLayout();
52
+ // The bell's counts, read with the page too, before the header and the page
53
+ // (the inbox, the profile's summary) show them.
54
+ useRenderedBellCounts();
55
+
56
+ useVisitNavBadges();
48
57
 
49
58
  const { widgets: appWidgets } = useAppWidgets();
50
59
  // A fill-height page has nothing to scroll past the dock: no clearance.
@@ -84,9 +84,6 @@ onBeforeUnmount(() =>
84
84
  );
85
85
 
86
86
  const siteLayout = useSiteLayout();
87
- if (!siteLayout.siteLayout.value) {
88
- void siteLayout.loadSiteLayout();
89
- }
90
87
 
91
88
  const favoritePages = useFavoritePages();
92
89
 
@@ -3,7 +3,10 @@ import { formatRelativeTime } from "#dms-core/app/utils/formatter";
3
3
  import NotificationCard from "./NotificationCard.vue";
4
4
  import { useNavBadges } from "#dms-ui/app/build/composables/navigation/useNavBadges";
5
5
  import { settleWidgetRequest } from "./widgetRequest";
6
- import type { UserNotification } from "../../../composables/notification/useNotifications";
6
+ import {
7
+ settledRenderedBellCounts,
8
+ type UserNotification,
9
+ } from "../../../composables/notification/useNotifications";
7
10
  import { resolveNotificationTone } from "../pages/settings/notification/notificationDisplay";
8
11
  import { DMS_TONE_SOLID, iconWellToneOf } from "#dms-ui/app/build/utils/tone";
9
12
  import DmsRowSkeleton from "#dms-ui/app/build/components/skeleton/RowSkeleton.vue";
@@ -20,11 +23,12 @@ const SKELETON_ROW_COUNT = 4;
20
23
  const NOTIFICATIONS_SETTINGS_PAGE = "settings.user.notifications";
21
24
 
22
25
  const { t, locale } = useI18n();
23
- const { loggedIn } = useUserSession();
26
+ const { loggedIn } = useDmsUserSession();
24
27
  const { processI18n } = useTranslation();
25
28
  const {
26
29
  unreadCount,
27
30
  unreadTone,
31
+ areCountsLoaded,
28
32
  notifications,
29
33
  hasMore,
30
34
  fetchBellCounts,
@@ -89,7 +93,9 @@ const handleFormSubmitSuccess = async (event: Event) => {
89
93
 
90
94
  onMounted(async () => {
91
95
  if (!loggedIn.value) return;
92
- await refreshCounts();
96
+ // Read with the page (`useRenderedBellCounts`) unless that read failed.
97
+ if (!areCountsLoaded.value) await settledRenderedBellCounts();
98
+ if (!areCountsLoaded.value) await refreshCounts();
93
99
 
94
100
  window.addEventListener(
95
101
  FormEvents.SUBMIT_SUCCESS,
@@ -0,0 +1,136 @@
1
+ <script setup lang="ts">
2
+ import { MONO_CHIP_CLASS } from "#dms-ui/app/build/utils/monoChip";
3
+ import type { MissingInterface } from "../../../../types/module-store";
4
+ import {
5
+ type DependencyDraft,
6
+ type DependencyDraftError,
7
+ OTHER_PACKAGE_CHOICE,
8
+ validateDependencyDraft,
9
+ } from "../../../utils/module-store-install";
10
+
11
+ interface ModuleStoreDependencyPickerProps {
12
+ /** The interfaces the release needs and no running module implements. */
13
+ missing: MissingInterface[];
14
+ /** One draft per missing interface, in the same order. */
15
+ drafts: DependencyDraft[];
16
+ /** Confirm was tried: the fields say what is wrong. */
17
+ showErrors?: boolean;
18
+ }
19
+
20
+ interface ModuleStoreDependencyPickerEmits {
21
+ update: [index: number, patch: Partial<DependencyDraft>];
22
+ }
23
+
24
+ const props = withDefaults(defineProps<ModuleStoreDependencyPickerProps>(), {
25
+ showErrors: false,
26
+ });
27
+ const emit = defineEmits<ModuleStoreDependencyPickerEmits>();
28
+ const { t } = useI18n();
29
+
30
+ const CONFIG_PLACEHOLDER = "{}";
31
+ const CONFIG_ROWS = 3;
32
+
33
+ const groups = computed(() =>
34
+ props.missing.map((missing, index) => {
35
+ const draft = props.drafts[index];
36
+ const errors =
37
+ props.showErrors && draft ? validateDependencyDraft(draft) : {};
38
+ return {
39
+ missing,
40
+ draft,
41
+ errors,
42
+ items: [
43
+ ...missing.candidates.map((candidate) => ({
44
+ label: candidate.name,
45
+ description: candidate.package,
46
+ value: candidate.package,
47
+ })),
48
+ {
49
+ label: t("modules.store.install_dialog.other"),
50
+ value: OTHER_PACKAGE_CHOICE,
51
+ },
52
+ ],
53
+ };
54
+ }),
55
+ );
56
+
57
+ function errorText(error: DependencyDraftError | undefined) {
58
+ return error ? t(`modules.store.install_dialog.errors.${error}`) : undefined;
59
+ }
60
+
61
+ /** Sends `field` of draft `index` as the control typed it. */
62
+ function updateField(
63
+ index: number,
64
+ field: keyof DependencyDraft,
65
+ value: unknown,
66
+ ): void {
67
+ emit("update", index, { [field]: String(value ?? "") });
68
+ }
69
+
70
+ function fieldId(index: number, field: string): string {
71
+ return `store-dependency-${index}-${field}`;
72
+ }
73
+ </script>
74
+
75
+ <template>
76
+ <div class="flex flex-col gap-4">
77
+ <section
78
+ v-for="(group, index) in groups"
79
+ :key="group.missing.interfacePackage"
80
+ class="flex flex-col gap-2.5"
81
+ :aria-labelledby="fieldId(index, 'title')"
82
+ >
83
+ <h4
84
+ :id="fieldId(index, 'title')"
85
+ class="text-highlighted text-[13px] font-semibold"
86
+ >
87
+ <code :class="[MONO_CHIP_CLASS, 'bg-elevated text-xs']">
88
+ {{ group.missing.interfacePackage }}
89
+ </code>
90
+ </h4>
91
+ <template v-if="group.draft">
92
+ <URadioGroup
93
+ :model-value="group.draft.choice"
94
+ :items="group.items"
95
+ size="sm"
96
+ :aria-labelledby="fieldId(index, 'title')"
97
+ @update:model-value="updateField(index, 'choice', $event)"
98
+ />
99
+ <UFormField
100
+ v-if="group.draft.choice === OTHER_PACKAGE_CHOICE"
101
+ :label="t('modules.store.install_dialog.package_label')"
102
+ :error="errorText(group.errors.package)"
103
+ >
104
+ <UInput
105
+ :id="fieldId(index, 'package')"
106
+ :model-value="group.draft.otherPackage"
107
+ class="w-full font-mono"
108
+ autocomplete="off"
109
+ spellcheck="false"
110
+ :placeholder="t('modules.store.install_dialog.package_placeholder')"
111
+ @update:model-value="updateField(index, 'otherPackage', $event)"
112
+ />
113
+ </UFormField>
114
+ <UFormField
115
+ :label="t('modules.store.install_dialog.config_label')"
116
+ :hint="t('modules.store.install_dialog.config_hint')"
117
+ :error="errorText(group.errors.config)"
118
+ >
119
+ <UTextarea
120
+ :id="fieldId(index, 'config')"
121
+ :model-value="group.draft.config"
122
+ class="w-full font-mono text-xs"
123
+ :rows="CONFIG_ROWS"
124
+ autoresize
125
+ spellcheck="false"
126
+ :placeholder="CONFIG_PLACEHOLDER"
127
+ @update:model-value="updateField(index, 'config', $event)"
128
+ />
129
+ </UFormField>
130
+ </template>
131
+ </section>
132
+ <p class="text-muted text-xs">
133
+ {{ t("modules.store.install_dialog.note") }}
134
+ </p>
135
+ </div>
136
+ </template>
@@ -0,0 +1,98 @@
1
+ <script setup lang="ts">
2
+ import DmsCopyButton from "#dms-ui/app/components/copy/CopyButton.vue";
3
+ import type { StoreListingEntry } from "../../../../types/module-store";
4
+
5
+ interface ModuleStoreRequirementsProps {
6
+ /** The store module whose requirements the tile spells out. */
7
+ entry: StoreListingEntry;
8
+ }
9
+
10
+ const props = defineProps<ModuleStoreRequirementsProps>();
11
+ const { t } = useI18n();
12
+
13
+ const LIST_SEPARATOR = ", ";
14
+
15
+ const requirement = computed(() => props.entry.frontendRequirement);
16
+ const missingInterfaces = computed(() =>
17
+ props.entry.missingInterfaces
18
+ .map((missing) => missing.interfacePackage)
19
+ .join(LIST_SEPARATOR),
20
+ );
21
+ const dependents = computed(() => props.entry.dependents.join(LIST_SEPARATOR));
22
+ </script>
23
+
24
+ <template>
25
+ <!-- The release needs another dms-frontend: what to run, what it breaks.
26
+ The store never moves dms-frontend itself. -->
27
+ <div
28
+ v-if="requirement"
29
+ class="flex flex-col gap-1.5 rounded-[8px] bg-(--ui-warning)/8 px-2.5 py-1.5 text-xs text-(--ui-warning)"
30
+ >
31
+ <p>
32
+ {{
33
+ t("modules.store.frontend_requirement.needs", {
34
+ range: requirement.range,
35
+ running: requirement.running,
36
+ })
37
+ }}
38
+ </p>
39
+ <template v-if="requirement.target">
40
+ <p v-if="requirement.command" class="text-toned">
41
+ {{
42
+ t("modules.store.frontend_requirement.run", {
43
+ target: requirement.target,
44
+ })
45
+ }}
46
+ </p>
47
+ <div
48
+ v-if="requirement.command"
49
+ class="text-highlighted flex min-w-0 items-center gap-1 rounded-[6px] border border-(--ui-border) bg-(--dms-bg-muted) ps-2 font-mono text-[11px]"
50
+ >
51
+ <code class="min-w-0 flex-1 truncate" :title="requirement.command">
52
+ {{ requirement.command }}
53
+ </code>
54
+ <DmsCopyButton :value="requirement.command" />
55
+ </div>
56
+ <template v-if="requirement.breaks.length > 0">
57
+ <p>
58
+ {{
59
+ t("modules.store.frontend_requirement.breaks", {
60
+ target: requirement.target,
61
+ })
62
+ }}
63
+ </p>
64
+ <ul class="text-toned flex flex-col gap-0.5">
65
+ <li
66
+ v-for="layer in requirement.breaks"
67
+ :key="layer.name"
68
+ class="flex min-w-0 items-baseline gap-1.5"
69
+ >
70
+ <span class="truncate font-mono">{{ layer.name }}</span>
71
+ <span class="text-dimmed shrink-0">
72
+ {{
73
+ t("modules.store.frontend_requirement.supports", {
74
+ range: layer.range,
75
+ })
76
+ }}
77
+ </span>
78
+ </li>
79
+ </ul>
80
+ </template>
81
+ </template>
82
+ <p v-else class="text-toned">
83
+ {{ t("modules.store.frontend_requirement.no_target") }}
84
+ </p>
85
+ </div>
86
+
87
+ <p
88
+ v-if="missingInterfaces"
89
+ class="text-toned truncate text-xs"
90
+ :title="missingInterfaces"
91
+ >
92
+ {{ t("modules.store.requires", { interfaces: missingInterfaces }) }}
93
+ </p>
94
+
95
+ <p v-if="dependents" class="text-xs text-(--ui-warning)">
96
+ {{ t("modules.store.used_by", { modules: dependents }) }}
97
+ </p>
98
+ </template>