@flamingo-stack/openframe-frontend-core 0.0.748 → 0.0.750

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 (554) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/{chunk-7Y3VMMJB.cjs → chunk-2J2OBP4N.cjs} +26 -18
  3. package/dist/chunk-2YXOD2KL.cjs +137 -0
  4. package/dist/{chunk-BEC43GHL.cjs → chunk-34TWK3JE.cjs} +3 -3
  5. package/dist/{chunk-BBM2ICOY.cjs → chunk-3TELPOVH.cjs} +2 -2
  6. package/dist/{chunk-G2ELX3DG.cjs → chunk-45YRDD7W.cjs} +22 -19
  7. package/dist/{chunk-4AZHFLOM.cjs → chunk-4O2KYY4K.cjs} +3 -3
  8. package/dist/{chunk-6XP6RNFD.cjs → chunk-6KEJQR6L.cjs} +1875 -2116
  9. package/dist/{chunk-JNBOQ7F2.cjs → chunk-7RCTOWBA.cjs} +24 -24
  10. package/dist/{chunk-U6XWGK53.cjs → chunk-ALPRQ3ZX.cjs} +56 -46
  11. package/dist/{chunk-TRXCQADV.cjs → chunk-AW6GP3JK.cjs} +103 -98
  12. package/dist/{chunk-GE4PCDNZ.cjs → chunk-BO6ZOAPB.cjs} +12 -12
  13. package/dist/{chunk-HNLI4OU5.cjs → chunk-C6LPOYDM.cjs} +24 -24
  14. package/dist/{chunk-4MGZYY6U.cjs → chunk-CLAJIQ7E.cjs} +26 -18
  15. package/dist/{chunk-EH3LOWGY.cjs → chunk-CNUZLOVA.cjs} +48 -40
  16. package/dist/{chunk-QPSQ5WLG.cjs → chunk-DGEB5GUZ.cjs} +2 -2
  17. package/dist/{chunk-OZUJYBQ2.cjs → chunk-E3KFEOFA.cjs} +9 -6
  18. package/dist/{chunk-PSSGIZXZ.cjs → chunk-FHT7SMA7.cjs} +49 -46
  19. package/dist/{chunk-JOPFX3PJ.cjs → chunk-FP6HAJQV.cjs} +137 -122
  20. package/dist/{chunk-YKJQM2O6.cjs → chunk-GVETSV7H.cjs} +56 -53
  21. package/dist/{chunk-UNR74CAC.cjs → chunk-HOEVD6EN.cjs} +4 -4
  22. package/dist/{chunk-H34A2765.cjs → chunk-JPUTILTV.cjs} +104 -118
  23. package/dist/{chunk-46EIXJFC.cjs → chunk-KVSEWACW.cjs} +44 -27
  24. package/dist/{chunk-AKTPO2DN.cjs → chunk-L4UI63K6.cjs} +2 -2
  25. package/dist/{chunk-PSIKUDUV.cjs → chunk-LVO7FALW.cjs} +5 -5
  26. package/dist/{chunk-L2RMTGOK.cjs → chunk-MGF3FUKD.cjs} +7 -7
  27. package/dist/{chunk-P7KTAXXE.cjs → chunk-OFO75R2O.cjs} +169 -175
  28. package/dist/{chunk-B27QEHYR.cjs → chunk-P6F6PHVK.cjs} +9 -9
  29. package/dist/chunk-RB6BSE3O.cjs +21 -0
  30. package/dist/chunk-UGCRLRCT.cjs +25 -0
  31. package/dist/{chunk-BBTSJYTR.cjs → chunk-V3UJ6NDR.cjs} +243 -429
  32. package/dist/{chunk-ZNUSYMH7.cjs → chunk-WZX26ODJ.cjs} +121 -121
  33. package/dist/{chunk-YIRX6C7V.cjs → chunk-XJ3J4UIS.cjs} +57 -22
  34. package/dist/{chunk-D4XZL27V.cjs → chunk-YL62VAHC.cjs} +6 -6
  35. package/dist/{cloud-tenants-V5727B7F.cjs → cloud-tenants-E4JSG3GH.cjs} +16 -14
  36. package/dist/components/case-studies/index.cjs +29 -27
  37. package/dist/components/categories-cart.d.ts.map +1 -1
  38. package/dist/components/categories-cart.js +2 -7
  39. package/dist/components/chat/chat-container.js +4 -4
  40. package/dist/components/chat/chat-context-picker.d.ts.map +1 -1
  41. package/dist/components/chat/chat-context-picker.js +2 -1
  42. package/dist/components/chat/chat-message-row.d.ts.map +1 -1
  43. package/dist/components/chat/chat-message-row.js +6 -5
  44. package/dist/components/chat/chat-message-skeleton.d.ts +3 -1
  45. package/dist/components/chat/chat-message-skeleton.d.ts.map +1 -1
  46. package/dist/components/chat/chat-message-skeleton.js +8 -5
  47. package/dist/components/chat/chat-sidebar-skeleton.d.ts.map +1 -1
  48. package/dist/components/chat/chat-sidebar-skeleton.js +4 -3
  49. package/dist/components/chat/chat-top-navigation.js +4 -4
  50. package/dist/components/chat/context-items-list.d.ts.map +1 -1
  51. package/dist/components/chat/context-items-list.js +5 -3
  52. package/dist/components/chat/entity-cards/admin-content-card-grid.d.ts +24 -1
  53. package/dist/components/chat/entity-cards/admin-content-card-grid.d.ts.map +1 -1
  54. package/dist/components/chat/entity-cards/admin-content-card-grid.js +46 -15
  55. package/dist/components/chat/entity-cards/admin-content-card.d.ts.map +1 -1
  56. package/dist/components/chat/entity-cards/admin-content-card.js +2 -1
  57. package/dist/components/chat/entity-cards/blog-card.d.ts.map +1 -1
  58. package/dist/components/chat/entity-cards/blog-card.js +13 -12
  59. package/dist/components/chat/entity-cards/campaign-card-admin.d.ts.map +1 -1
  60. package/dist/components/chat/entity-cards/campaign-card-admin.js +5 -4
  61. package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -1
  62. package/dist/components/chat/entity-cards/case-study-card.js +19 -18
  63. package/dist/components/chat/entity-cards/chat-ticket-item.js +5 -5
  64. package/dist/components/chat/entity-cards/customer-interview-card.d.ts.map +1 -1
  65. package/dist/components/chat/entity-cards/customer-interview-card.js +15 -14
  66. package/dist/components/chat/entity-cards/data-room-doc-card.d.ts.map +1 -1
  67. package/dist/components/chat/entity-cards/data-room-doc-card.js +7 -6
  68. package/dist/components/chat/entity-cards/design-doc-card.d.ts.map +1 -1
  69. package/dist/components/chat/entity-cards/design-doc-card.js +0 -2
  70. package/dist/components/chat/entity-cards/generic-entity-card.d.ts.map +1 -1
  71. package/dist/components/chat/entity-cards/generic-entity-card.js +8 -7
  72. package/dist/components/chat/entity-cards/github-activity-card.d.ts.map +1 -1
  73. package/dist/components/chat/entity-cards/github-activity-card.js +11 -10
  74. package/dist/components/chat/entity-cards/hubspot-ticket-card.d.ts.map +1 -1
  75. package/dist/components/chat/entity-cards/hubspot-ticket-card.js +16 -15
  76. package/dist/components/chat/entity-cards/index.d.ts +1 -1
  77. package/dist/components/chat/entity-cards/index.d.ts.map +1 -1
  78. package/dist/components/chat/entity-cards/index.js +2 -0
  79. package/dist/components/chat/entity-cards/investor-update-card.d.ts.map +1 -1
  80. package/dist/components/chat/entity-cards/investor-update-card.js +12 -11
  81. package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts.map +1 -1
  82. package/dist/components/chat/entity-cards/onboarding-guide-card.js +25 -30
  83. package/dist/components/chat/entity-cards/program-card.d.ts.map +1 -1
  84. package/dist/components/chat/entity-cards/program-card.js +29 -28
  85. package/dist/components/chat/entity-cards/roadmap-card.d.ts.map +1 -1
  86. package/dist/components/chat/entity-cards/roadmap-card.js +37 -39
  87. package/dist/components/chat/entity-cards/slack-message-card.d.ts.map +1 -1
  88. package/dist/components/chat/entity-cards/slack-message-card.js +12 -11
  89. package/dist/components/chat/guide-welcome.js +2 -2
  90. package/dist/components/chat/index.cjs +13 -9
  91. package/dist/components/chat/mingo-archive-list.d.ts.map +1 -1
  92. package/dist/components/chat/mingo-archive-list.js +2 -1
  93. package/dist/components/chat/mingo-chat-history.d.ts +4 -2
  94. package/dist/components/chat/mingo-chat-history.d.ts.map +1 -1
  95. package/dist/components/chat/mingo-chat-history.js +11 -5
  96. package/dist/components/chat/mingo-chat-rail.d.ts.map +1 -1
  97. package/dist/components/chat/mingo-chat-rail.js +2 -1
  98. package/dist/components/chat/mingo-info-card.d.ts.map +1 -1
  99. package/dist/components/chat/mingo-info-card.js +6 -5
  100. package/dist/components/chat/mingo-onboarding-card-skeleton.d.ts +3 -1
  101. package/dist/components/chat/mingo-onboarding-card-skeleton.d.ts.map +1 -1
  102. package/dist/components/chat/mingo-onboarding-card-skeleton.js +12 -12
  103. package/dist/components/chat/model-display.js +4 -4
  104. package/dist/components/chat/msp-organization-card-skeleton.js +5 -5
  105. package/dist/components/chat/quick-action-chip.d.ts +3 -3
  106. package/dist/components/chat/quick-action-chip.d.ts.map +1 -1
  107. package/dist/components/chat/quick-action-chip.js +12 -6
  108. package/dist/components/chat/utils/compact-card-classes.d.ts +4 -4
  109. package/dist/components/chat/utils/compact-card-classes.d.ts.map +1 -1
  110. package/dist/components/chat/utils/compact-card-classes.js +2 -2
  111. package/dist/components/contact/index.cjs +17 -15
  112. package/dist/components/content-loading-container.d.ts +1 -1
  113. package/dist/components/content-loading-container.d.ts.map +1 -1
  114. package/dist/components/content-loading-container.js +6 -7
  115. package/dist/components/docs/doc-viewer.d.ts.map +1 -1
  116. package/dist/components/docs/doc-viewer.js +3 -2
  117. package/dist/components/docs/index.cjs +20 -18
  118. package/dist/components/docs/skeletons.d.ts +7 -8
  119. package/dist/components/docs/skeletons.d.ts.map +1 -1
  120. package/dist/components/docs/skeletons.js +62 -61
  121. package/dist/components/embeds/embed-iframe.d.ts +6 -6
  122. package/dist/components/embeds/embed-iframe.d.ts.map +1 -1
  123. package/dist/components/embeds/embed-iframe.js +9 -4
  124. package/dist/components/embeds/index.cjs +19 -15
  125. package/dist/components/embeds/index.d.ts +2 -2
  126. package/dist/components/embeds/index.d.ts.map +1 -1
  127. package/dist/components/embeds/index.js +2 -1
  128. package/dist/components/embeds/linkedin-embed-client.d.ts.map +1 -1
  129. package/dist/components/embeds/linkedin-embed-client.js +7 -6
  130. package/dist/components/embeds/markdown-image.d.ts.map +1 -1
  131. package/dist/components/embeds/markdown-image.js +5 -3
  132. package/dist/components/embeds/og-link-preview.d.ts +19 -18
  133. package/dist/components/embeds/og-link-preview.d.ts.map +1 -1
  134. package/dist/components/embeds/og-link-preview.js +143 -88
  135. package/dist/components/embeds/reddit-embed-client.d.ts.map +1 -1
  136. package/dist/components/embeds/reddit-embed-client.js +10 -9
  137. package/dist/components/embeds/twitter-embed-client.d.ts.map +1 -1
  138. package/dist/components/embeds/twitter-embed-client.js +10 -9
  139. package/dist/components/faq/faq-section.d.ts.map +1 -1
  140. package/dist/components/faq/faq-section.js +9 -5
  141. package/dist/components/faq/index.cjs +18 -16
  142. package/dist/components/features/auth/login-form.d.ts +34 -21
  143. package/dist/components/features/auth/login-form.d.ts.map +1 -1
  144. package/dist/components/features/auth/login-form.js +77 -39
  145. package/dist/components/features/auth/sso-providers.d.ts +7 -1
  146. package/dist/components/features/auth/sso-providers.d.ts.map +1 -1
  147. package/dist/components/features/auth/sso-providers.js +22 -4
  148. package/dist/components/features/board/ticket-card-skeleton.js +8 -8
  149. package/dist/components/features/capability-explorer.d.ts +3 -1
  150. package/dist/components/features/capability-explorer.d.ts.map +1 -1
  151. package/dist/components/features/capability-explorer.js +27 -24
  152. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts +5 -2
  153. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts.map +1 -1
  154. package/dist/components/features/devices/device-selector/device-selector-skeleton.js +2 -2
  155. package/dist/components/features/devices/device-selector/device-selector.d.ts +1 -1
  156. package/dist/components/features/devices/device-selector/device-selector.d.ts.map +1 -1
  157. package/dist/components/features/devices/device-selector/device-selector.js +2 -0
  158. package/dist/components/features/devices/device-selector/device-selector.types.d.ts +2 -0
  159. package/dist/components/features/devices/device-selector/device-selector.types.d.ts.map +1 -1
  160. package/dist/components/features/devices/devices-grid.d.ts +3 -1
  161. package/dist/components/features/devices/devices-grid.d.ts.map +1 -1
  162. package/dist/components/features/devices/devices-grid.js +3 -2
  163. package/dist/components/features/devices/devices-panel-view.d.ts +6 -1
  164. package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -1
  165. package/dist/components/features/devices/devices-panel-view.js +4 -1
  166. package/dist/components/features/devices/devices-table-columns.d.ts +3 -1
  167. package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -1
  168. package/dist/components/features/devices/devices-table-columns.js +2 -0
  169. package/dist/components/features/index.cjs +18 -14
  170. package/dist/components/features/logs/logs-table-view.d.ts +3 -1
  171. package/dist/components/features/logs/logs-table-view.d.ts.map +1 -1
  172. package/dist/components/features/logs/logs-table-view.js +2 -2
  173. package/dist/components/features/model-token-rates.d.ts +4 -1
  174. package/dist/components/features/model-token-rates.d.ts.map +1 -1
  175. package/dist/components/features/model-token-rates.js +18 -23
  176. package/dist/components/features/notifications/index.d.ts +2 -2
  177. package/dist/components/features/notifications/index.d.ts.map +1 -1
  178. package/dist/components/features/notifications/index.js +2 -1
  179. package/dist/components/features/notifications/notification-drawer.d.ts.map +1 -1
  180. package/dist/components/features/notifications/notification-drawer.js +9 -16
  181. package/dist/components/features/notifications/notification-tile.d.ts +14 -0
  182. package/dist/components/features/notifications/notification-tile.d.ts.map +1 -1
  183. package/dist/components/features/notifications/notification-tile.js +36 -1
  184. package/dist/components/features/policies/policy-summary-cards.js +2 -2
  185. package/dist/components/features/push-button-selector.d.ts.map +1 -1
  186. package/dist/components/features/push-button-selector.js +12 -7
  187. package/dist/components/features/remote-session/remote-desktop-view.d.ts +4 -1
  188. package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -1
  189. package/dist/components/features/remote-session/remote-desktop-view.js +14 -10
  190. package/dist/components/features/waitlist-form.d.ts.map +1 -1
  191. package/dist/components/features/waitlist-form.js +6 -5
  192. package/dist/components/help-center-pages/download-apps-page.d.ts.map +1 -1
  193. package/dist/components/help-center-pages/download-apps-page.js +2 -1
  194. package/dist/components/help-center-pages/index.cjs +127 -119
  195. package/dist/components/help-center-pages/trust-center-page.d.ts +4 -1
  196. package/dist/components/help-center-pages/trust-center-page.d.ts.map +1 -1
  197. package/dist/components/help-center-pages/trust-center-page.js +3 -2
  198. package/dist/components/help-center-pages/trust-center-sections.d.ts +4 -1
  199. package/dist/components/help-center-pages/trust-center-sections.d.ts.map +1 -1
  200. package/dist/components/help-center-pages/trust-center-sections.js +5 -2
  201. package/dist/components/index.cjs +70 -112
  202. package/dist/components/index.d.ts +0 -2
  203. package/dist/components/index.d.ts.map +1 -1
  204. package/dist/components/index.js +0 -2
  205. package/dist/components/layout/title-block.d.ts.map +1 -1
  206. package/dist/components/layout/title-block.js +18 -11
  207. package/dist/components/loading/card-skeleton.d.ts +6 -3
  208. package/dist/components/loading/card-skeleton.d.ts.map +1 -1
  209. package/dist/components/loading/card-skeleton.js +7 -27
  210. package/dist/components/loading/category-card-skeleton.d.ts.map +1 -1
  211. package/dist/components/loading/category-card-skeleton.js +2 -4
  212. package/dist/components/loading/category-vendor-selector-skeleton.d.ts +3 -1
  213. package/dist/components/loading/category-vendor-selector-skeleton.d.ts.map +1 -1
  214. package/dist/components/loading/category-vendor-selector-skeleton.js +9 -4
  215. package/dist/components/loading/device-card-skeleton.d.ts +18 -9
  216. package/dist/components/loading/device-card-skeleton.d.ts.map +1 -1
  217. package/dist/components/loading/device-card-skeleton.js +30 -21
  218. package/dist/components/loading/index.d.ts +3 -4
  219. package/dist/components/loading/index.d.ts.map +1 -1
  220. package/dist/components/loading/index.js +6 -29
  221. package/dist/components/loading/loading-region.d.ts +33 -0
  222. package/dist/components/loading/loading-region.d.ts.map +1 -0
  223. package/dist/components/loading/loading-region.js +22 -0
  224. package/dist/components/loading/margin-report-skeleton.d.ts +3 -1
  225. package/dist/components/loading/margin-report-skeleton.d.ts.map +1 -1
  226. package/dist/components/loading/margin-report-skeleton.js +70 -61
  227. package/dist/components/loading/msp-profile-form-skeleton.d.ts +3 -1
  228. package/dist/components/loading/msp-profile-form-skeleton.d.ts.map +1 -1
  229. package/dist/components/loading/msp-profile-form-skeleton.js +6 -5
  230. package/dist/components/loading/organization-card-skeleton.d.ts +3 -1
  231. package/dist/components/loading/organization-card-skeleton.d.ts.map +1 -1
  232. package/dist/components/loading/organization-card-skeleton.js +5 -5
  233. package/dist/components/loading/organization-icon-skeleton.d.ts.map +1 -1
  234. package/dist/components/loading/organization-icon-skeleton.js +2 -1
  235. package/dist/components/loading/page-layout-skeleton.d.ts +21 -6
  236. package/dist/components/loading/page-layout-skeleton.d.ts.map +1 -1
  237. package/dist/components/loading/page-layout-skeleton.js +283 -266
  238. package/dist/components/loading/settings-form-skeleton.d.ts +17 -0
  239. package/dist/components/loading/settings-form-skeleton.d.ts.map +1 -0
  240. package/dist/components/loading/settings-form-skeleton.js +42 -0
  241. package/dist/components/loading/unified-skeleton.d.ts +11 -4
  242. package/dist/components/loading/unified-skeleton.d.ts.map +1 -1
  243. package/dist/components/loading/unified-skeleton.js +14 -89
  244. package/dist/components/loading/wizard-layout-skeleton.d.ts +3 -1
  245. package/dist/components/loading/wizard-layout-skeleton.d.ts.map +1 -1
  246. package/dist/components/loading/wizard-layout-skeleton.js +3 -2
  247. package/dist/components/media-carousel.d.ts.map +1 -1
  248. package/dist/components/media-carousel.js +2 -1
  249. package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
  250. package/dist/components/meeting-scheduler/booking-form.js +14 -8
  251. package/dist/components/meeting-scheduler/context-panel.d.ts.map +1 -1
  252. package/dist/components/meeting-scheduler/context-panel.js +8 -7
  253. package/dist/components/meeting-scheduler/directory.d.ts.map +1 -1
  254. package/dist/components/meeting-scheduler/directory.js +10 -9
  255. package/dist/components/meeting-scheduler/index.cjs +85 -75
  256. package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
  257. package/dist/components/meeting-scheduler/index.js +3 -2
  258. package/dist/components/meeting-scheduler/modal-header.d.ts.map +1 -1
  259. package/dist/components/meeting-scheduler/modal-header.js +8 -7
  260. package/dist/components/meeting-scheduler/slot-picker.d.ts.map +1 -1
  261. package/dist/components/meeting-scheduler/slot-picker.js +4 -3
  262. package/dist/components/navigation/app-header.d.ts.map +1 -1
  263. package/dist/components/navigation/app-header.js +8 -7
  264. package/dist/components/navigation/index.cjs +19 -17
  265. package/dist/components/navigation/multi-level-navigation.d.ts.map +1 -1
  266. package/dist/components/navigation/multi-level-navigation.js +3 -2
  267. package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
  268. package/dist/components/navigation/navigation-sidebar-item.js +3 -2
  269. package/dist/components/onboarding-guides/index.cjs +19 -17
  270. package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts +4 -1
  271. package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts.map +1 -1
  272. package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.js +12 -8
  273. package/dist/components/product-demo/index.cjs +16 -15
  274. package/dist/components/product-demo/product-screen.d.ts.map +1 -1
  275. package/dist/components/product-demo/product-screen.js +4 -4
  276. package/dist/components/profile/ProfileLoadingSkeleton.d.ts +3 -1
  277. package/dist/components/profile/ProfileLoadingSkeleton.d.ts.map +1 -1
  278. package/dist/components/profile/ProfileLoadingSkeleton.js +10 -8
  279. package/dist/components/related-content/index.cjs +7 -5
  280. package/dist/components/related-content/related-content-section.d.ts.map +1 -1
  281. package/dist/components/related-content/related-content-section.js +3 -2
  282. package/dist/components/shared/delivery/delivery-table.d.ts.map +1 -1
  283. package/dist/components/shared/delivery/delivery-table.js +8 -7
  284. package/dist/components/shared/detail-page-skeleton.d.ts +5 -1
  285. package/dist/components/shared/detail-page-skeleton.d.ts.map +1 -1
  286. package/dist/components/shared/detail-page-skeleton.js +18 -14
  287. package/dist/components/shared/dev-section/dev-card-row.d.ts +3 -1
  288. package/dist/components/shared/dev-section/dev-card-row.d.ts.map +1 -1
  289. package/dist/components/shared/dev-section/dev-card-row.js +22 -9
  290. package/dist/components/shared/legal-document/legal-document-page.d.ts.map +1 -1
  291. package/dist/components/shared/legal-document/legal-document-page.js +8 -7
  292. package/dist/components/shared/onboarding/onboarding-step-card.d.ts.map +1 -1
  293. package/dist/components/shared/onboarding/onboarding-step-card.js +3 -2
  294. package/dist/components/shared/onboarding/onboarding-walkthrough.d.ts.map +1 -1
  295. package/dist/components/shared/onboarding/onboarding-walkthrough.js +2 -1
  296. package/dist/components/shared/product-release/index.d.ts +0 -1
  297. package/dist/components/shared/product-release/index.d.ts.map +1 -1
  298. package/dist/components/shared/product-release/index.js +1 -3
  299. package/dist/components/shared/product-release/product-release-card-skeleton.d.ts.map +1 -1
  300. package/dist/components/shared/product-release/product-release-card-skeleton.js +21 -20
  301. package/dist/components/shared/product-release/product-releases-view.d.ts.map +1 -1
  302. package/dist/components/shared/product-release/product-releases-view.js +2 -1
  303. package/dist/components/shared/roadmap/roadmap-grid-skeleton.d.ts +6 -13
  304. package/dist/components/shared/roadmap/roadmap-grid-skeleton.d.ts.map +1 -1
  305. package/dist/components/shared/roadmap/roadmap-grid-skeleton.js +13 -25
  306. package/dist/components/tickets/help-center-create-form.d.ts +4 -1
  307. package/dist/components/tickets/help-center-create-form.d.ts.map +1 -1
  308. package/dist/components/tickets/help-center-create-form.js +38 -26
  309. package/dist/components/tickets/index.cjs +22 -20
  310. package/dist/components/tickets/ticket-center.d.ts.map +1 -1
  311. package/dist/components/tickets/ticket-center.js +13 -10
  312. package/dist/components/tickets/ticket-detail-drawer.d.ts.map +1 -1
  313. package/dist/components/tickets/ticket-detail-drawer.js +2 -1
  314. package/dist/components/ui/admin-form-drawer.d.ts.map +1 -1
  315. package/dist/components/ui/admin-form-drawer.js +6 -8
  316. package/dist/components/ui/admin-form-modal.d.ts.map +1 -1
  317. package/dist/components/ui/admin-form-modal.js +12 -11
  318. package/dist/components/ui/analyzing-state.d.ts +1 -1
  319. package/dist/components/ui/analyzing-state.d.ts.map +1 -1
  320. package/dist/components/ui/analyzing-state.js +4 -10
  321. package/dist/components/ui/content-loader.d.ts +5 -1
  322. package/dist/components/ui/content-loader.d.ts.map +1 -1
  323. package/dist/components/ui/content-loader.js +27 -23
  324. package/dist/components/ui/dashboard-info-card.d.ts +17 -3
  325. package/dist/components/ui/dashboard-info-card.d.ts.map +1 -1
  326. package/dist/components/ui/dashboard-info-card.js +30 -10
  327. package/dist/components/ui/data-attribution.d.ts +6 -0
  328. package/dist/components/ui/data-attribution.d.ts.map +1 -1
  329. package/dist/components/ui/data-attribution.js +12 -1
  330. package/dist/components/ui/data-table/data-table-body.d.ts +6 -1
  331. package/dist/components/ui/data-table/data-table-body.d.ts.map +1 -1
  332. package/dist/components/ui/data-table/data-table-body.js +3 -1
  333. package/dist/components/ui/data-table/data-table-infinite-footer.d.ts.map +1 -1
  334. package/dist/components/ui/data-table/data-table-infinite-footer.js +3 -1
  335. package/dist/components/ui/data-table/data-table-skeleton.d.ts.map +1 -1
  336. package/dist/components/ui/data-table/data-table-skeleton.js +7 -5
  337. package/dist/components/ui/feature-card.d.ts.map +1 -1
  338. package/dist/components/ui/feature-card.js +7 -9
  339. package/dist/components/ui/file-manager/file-manager-skeleton.d.ts +3 -1
  340. package/dist/components/ui/file-manager/file-manager-skeleton.d.ts.map +1 -1
  341. package/dist/components/ui/file-manager/file-manager-skeleton.js +27 -21
  342. package/dist/components/ui/file-manager/file-manager-table.js +10 -10
  343. package/dist/components/ui/file-manager/index.cjs +45 -36
  344. package/dist/components/ui/filter-modal.d.ts.map +1 -1
  345. package/dist/components/ui/filter-modal.js +5 -5
  346. package/dist/components/ui/filter-pill-row.d.ts +10 -0
  347. package/dist/components/ui/filter-pill-row.d.ts.map +1 -1
  348. package/dist/components/ui/filter-pill-row.js +8 -1
  349. package/dist/components/ui/index.cjs +19 -28
  350. package/dist/components/ui/index.d.ts +0 -1
  351. package/dist/components/ui/index.d.ts.map +1 -1
  352. package/dist/components/ui/index.js +0 -1
  353. package/dist/components/ui/layout-hold.d.ts +5 -4
  354. package/dist/components/ui/layout-hold.d.ts.map +1 -1
  355. package/dist/components/ui/layout-hold.js +20 -29
  356. package/dist/components/ui/markdown/base-components.js +1 -1
  357. package/dist/components/ui/page-actions.d.ts.map +1 -1
  358. package/dist/components/ui/page-actions.js +6 -8
  359. package/dist/components/ui/photo-wall.d.ts.map +1 -1
  360. package/dist/components/ui/photo-wall.js +11 -18
  361. package/dist/components/ui/query-report-table/query-report-table-skeleton.d.ts +1 -1
  362. package/dist/components/ui/query-report-table/query-report-table-skeleton.d.ts.map +1 -1
  363. package/dist/components/ui/query-report-table/query-report-table-skeleton.js +28 -18
  364. package/dist/components/ui/query-report-table/query-report-table.d.ts +1 -1
  365. package/dist/components/ui/query-report-table/query-report-table.d.ts.map +1 -1
  366. package/dist/components/ui/query-report-table/query-report-table.js +3 -1
  367. package/dist/components/ui/query-report-table/types.d.ts +4 -0
  368. package/dist/components/ui/query-report-table/types.d.ts.map +1 -1
  369. package/dist/components/ui/skeleton-surface.d.ts +7 -0
  370. package/dist/components/ui/skeleton-surface.d.ts.map +1 -0
  371. package/dist/components/ui/skeleton-surface.js +5 -0
  372. package/dist/components/ui/table/table-skeleton.d.ts.map +1 -1
  373. package/dist/components/ui/table/table-skeleton.js +11 -13
  374. package/dist/components/ui/test-run.d.ts +6 -4
  375. package/dist/components/ui/test-run.d.ts.map +1 -1
  376. package/dist/components/ui/test-run.js +9 -5
  377. package/dist/{devices-WWMXIIHI.cjs → devices-AVRQGB2N.cjs} +17 -15
  378. package/dist/{embeddable-chat-IJHCGQ24.cjs → embeddable-chat-SNYQSMS7.cjs} +79 -77
  379. package/dist/index.cjs +24 -31
  380. package/dist/{knowledge-JZP4RIXB.cjs → knowledge-S3CNISQH.cjs} +17 -15
  381. package/dist/{logs-WIRYFNUC.cjs → logs-WDLOKDXT.cjs} +24 -22
  382. package/dist/{policies-X7OJYA7G.cjs → policies-STML7NEZ.cjs} +20 -18
  383. package/dist/{remote-session-IYT4LWJC.cjs → remote-session-ZKP2W3IS.cjs} +9 -7
  384. package/dist/{scripts-GRMT2NGW.cjs → scripts-HO53VYGX.cjs} +23 -21
  385. package/dist/{software-update-G3QOB7RT.cjs → software-update-4VTK7LWQ.cjs} +20 -18
  386. package/dist/{tickets-board-4MT6ZB4F.cjs → tickets-board-BNW4AYFL.cjs} +11 -10
  387. package/package.json +1 -1
  388. package/src/components/categories-cart.tsx +2 -4
  389. package/src/components/chat/chat-container.tsx +4 -4
  390. package/src/components/chat/chat-context-picker.tsx +3 -2
  391. package/src/components/chat/chat-message-row.tsx +6 -7
  392. package/src/components/chat/chat-message-skeleton.tsx +11 -6
  393. package/src/components/chat/chat-sidebar-skeleton.tsx +4 -3
  394. package/src/components/chat/chat-top-navigation.tsx +4 -4
  395. package/src/components/chat/context-items-list.tsx +9 -3
  396. package/src/components/chat/entity-cards/admin-content-card-grid.tsx +65 -18
  397. package/src/components/chat/entity-cards/admin-content-card.tsx +2 -1
  398. package/src/components/chat/entity-cards/blog-card.tsx +13 -12
  399. package/src/components/chat/entity-cards/campaign-card-admin.tsx +5 -4
  400. package/src/components/chat/entity-cards/case-study-card.tsx +19 -18
  401. package/src/components/chat/entity-cards/chat-ticket-item.tsx +5 -5
  402. package/src/components/chat/entity-cards/customer-interview-card.tsx +15 -14
  403. package/src/components/chat/entity-cards/data-room-doc-card.tsx +7 -6
  404. package/src/components/chat/entity-cards/design-doc-card.tsx +0 -2
  405. package/src/components/chat/entity-cards/generic-entity-card.tsx +8 -7
  406. package/src/components/chat/entity-cards/github-activity-card.tsx +11 -10
  407. package/src/components/chat/entity-cards/hubspot-ticket-card.tsx +16 -15
  408. package/src/components/chat/entity-cards/index.ts +2 -0
  409. package/src/components/chat/entity-cards/investor-update-card.tsx +12 -11
  410. package/src/components/chat/entity-cards/onboarding-guide-card.tsx +21 -22
  411. package/src/components/chat/entity-cards/program-card.tsx +29 -28
  412. package/src/components/chat/entity-cards/roadmap-card.tsx +22 -23
  413. package/src/components/chat/entity-cards/slack-message-card.tsx +12 -11
  414. package/src/components/chat/guide-welcome.tsx +2 -2
  415. package/src/components/chat/mingo-archive-list.tsx +2 -1
  416. package/src/components/chat/mingo-chat-history.tsx +18 -9
  417. package/src/components/chat/mingo-chat-rail.tsx +2 -1
  418. package/src/components/chat/mingo-info-card.tsx +6 -5
  419. package/src/components/chat/mingo-onboarding-card-skeleton.tsx +15 -13
  420. package/src/components/chat/model-display.tsx +4 -4
  421. package/src/components/chat/msp-organization-card-skeleton.tsx +5 -5
  422. package/src/components/chat/quick-action-chip.tsx +17 -14
  423. package/src/components/chat/utils/compact-card-classes.ts +4 -5
  424. package/src/components/content-loading-container.tsx +7 -8
  425. package/src/components/docs/doc-viewer.tsx +3 -2
  426. package/src/components/docs/skeletons.tsx +64 -63
  427. package/src/components/embeds/embed-iframe.tsx +16 -9
  428. package/src/components/embeds/index.ts +2 -2
  429. package/src/components/embeds/linkedin-embed-client.tsx +7 -6
  430. package/src/components/embeds/markdown-image.tsx +5 -3
  431. package/src/components/embeds/og-link-preview.tsx +162 -79
  432. package/src/components/embeds/reddit-embed-client.tsx +10 -9
  433. package/src/components/embeds/twitter-embed-client.tsx +10 -9
  434. package/src/components/faq/faq-section.tsx +13 -6
  435. package/src/components/features/auth/login-form.tsx +121 -64
  436. package/src/components/features/auth/sso-providers.tsx +21 -0
  437. package/src/components/features/board/ticket-card-skeleton.tsx +8 -8
  438. package/src/components/features/capability-explorer.tsx +61 -30
  439. package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +9 -3
  440. package/src/components/features/devices/device-selector/device-selector.tsx +2 -0
  441. package/src/components/features/devices/device-selector/device-selector.types.ts +2 -0
  442. package/src/components/features/devices/devices-grid.tsx +4 -1
  443. package/src/components/features/devices/devices-panel-view.tsx +9 -1
  444. package/src/components/features/devices/devices-table-columns.tsx +4 -0
  445. package/src/components/features/logs/logs-table-view.tsx +4 -2
  446. package/src/components/features/model-token-rates.tsx +27 -24
  447. package/src/components/features/notifications/index.ts +2 -2
  448. package/src/components/features/notifications/notification-drawer.tsx +7 -10
  449. package/src/components/features/notifications/notification-tile.tsx +57 -0
  450. package/src/components/features/policies/policy-summary-cards.tsx +2 -2
  451. package/src/components/features/push-button-selector.tsx +20 -11
  452. package/src/components/features/remote-session/remote-desktop-view.tsx +26 -16
  453. package/src/components/features/waitlist-form.tsx +6 -5
  454. package/src/components/help-center-pages/download-apps-page.tsx +3 -2
  455. package/src/components/help-center-pages/trust-center-page.tsx +6 -2
  456. package/src/components/help-center-pages/trust-center-sections.tsx +9 -3
  457. package/src/components/index.ts +0 -2
  458. package/src/components/layout/title-block.tsx +17 -15
  459. package/src/components/loading/card-skeleton.tsx +14 -46
  460. package/src/components/loading/category-card-skeleton.tsx +2 -4
  461. package/src/components/loading/category-vendor-selector-skeleton.tsx +12 -5
  462. package/src/components/loading/device-card-skeleton.tsx +58 -51
  463. package/src/components/loading/index.ts +5 -19
  464. package/src/components/loading/loading-region.tsx +60 -0
  465. package/src/components/loading/margin-report-skeleton.tsx +45 -34
  466. package/src/components/loading/msp-profile-form-skeleton.tsx +9 -6
  467. package/src/components/loading/organization-card-skeleton.tsx +8 -6
  468. package/src/components/loading/organization-icon-skeleton.tsx +3 -2
  469. package/src/components/loading/page-layout-skeleton.tsx +162 -133
  470. package/src/components/loading/settings-form-skeleton.tsx +52 -0
  471. package/src/components/loading/unified-skeleton.tsx +26 -71
  472. package/src/components/loading/wizard-layout-skeleton.tsx +6 -3
  473. package/src/components/media-carousel.tsx +2 -1
  474. package/src/components/meeting-scheduler/booking-form.tsx +10 -7
  475. package/src/components/meeting-scheduler/context-panel.tsx +8 -7
  476. package/src/components/meeting-scheduler/directory.tsx +10 -9
  477. package/src/components/meeting-scheduler/index.tsx +5 -4
  478. package/src/components/meeting-scheduler/modal-header.tsx +8 -7
  479. package/src/components/meeting-scheduler/slot-picker.tsx +4 -3
  480. package/src/components/navigation/app-header.tsx +8 -7
  481. package/src/components/navigation/multi-level-navigation.tsx +3 -2
  482. package/src/components/navigation/navigation-sidebar-item.tsx +3 -2
  483. package/src/components/onboarding-guides/onboarding-guides-catalog-skeleton.tsx +17 -10
  484. package/src/components/product-demo/product-screen.tsx +4 -4
  485. package/src/components/profile/ProfileLoadingSkeleton.tsx +13 -9
  486. package/src/components/related-content/related-content-section.tsx +5 -4
  487. package/src/components/shared/delivery/delivery-table.tsx +8 -7
  488. package/src/components/shared/detail-page-skeleton.tsx +22 -14
  489. package/src/components/shared/dev-section/dev-card-row.tsx +23 -10
  490. package/src/components/shared/legal-document/legal-document-page.tsx +8 -7
  491. package/src/components/shared/onboarding/onboarding-step-card.tsx +3 -2
  492. package/src/components/shared/onboarding/onboarding-walkthrough.tsx +2 -1
  493. package/src/components/shared/product-release/index.ts +0 -1
  494. package/src/components/shared/product-release/product-release-card-skeleton.tsx +23 -25
  495. package/src/components/shared/product-release/product-releases-view.tsx +3 -2
  496. package/src/components/shared/roadmap/roadmap-grid-skeleton.tsx +14 -56
  497. package/src/components/tickets/help-center-create-form.tsx +23 -12
  498. package/src/components/tickets/ticket-center.tsx +17 -11
  499. package/src/components/tickets/ticket-detail-drawer.tsx +3 -2
  500. package/src/components/ui/admin-form-drawer.tsx +7 -7
  501. package/src/components/ui/admin-form-modal.tsx +9 -8
  502. package/src/components/ui/analyzing-state.tsx +5 -8
  503. package/src/components/ui/content-loader.tsx +31 -23
  504. package/src/components/ui/dashboard-info-card.tsx +81 -20
  505. package/src/components/ui/data-attribution.tsx +18 -0
  506. package/src/components/ui/data-table/data-table-body.tsx +9 -2
  507. package/src/components/ui/data-table/data-table-infinite-footer.tsx +4 -2
  508. package/src/components/ui/data-table/data-table-skeleton.tsx +8 -5
  509. package/src/components/ui/feature-card.tsx +27 -11
  510. package/src/components/ui/file-manager/file-manager-skeleton.tsx +30 -22
  511. package/src/components/ui/file-manager/file-manager-table.tsx +10 -10
  512. package/src/components/ui/filter-modal.tsx +5 -5
  513. package/src/components/ui/filter-pill-row.tsx +19 -0
  514. package/src/components/ui/index.ts +0 -1
  515. package/src/components/ui/layout-hold.tsx +30 -38
  516. package/src/components/ui/markdown/base-components.tsx +1 -1
  517. package/src/components/ui/page-actions.tsx +10 -8
  518. package/src/components/ui/photo-wall.tsx +4 -7
  519. package/src/components/ui/query-report-table/query-report-table-skeleton.tsx +13 -7
  520. package/src/components/ui/query-report-table/query-report-table.tsx +2 -0
  521. package/src/components/ui/query-report-table/types.ts +4 -0
  522. package/src/components/ui/skeleton-surface.ts +6 -0
  523. package/src/components/ui/table/table-skeleton.tsx +11 -13
  524. package/src/components/ui/test-run.tsx +30 -22
  525. package/src/styles/ods-colors.css +2 -2
  526. package/dist/chunk-5M5C6UV4.cjs +0 -125
  527. package/dist/components/dynamic-skeleton.d.ts +0 -108
  528. package/dist/components/dynamic-skeleton.d.ts.map +0 -1
  529. package/dist/components/dynamic-skeleton.js +0 -221
  530. package/dist/components/loading/content-skeleton.d.ts +0 -73
  531. package/dist/components/loading/content-skeleton.d.ts.map +0 -1
  532. package/dist/components/loading/content-skeleton.js +0 -217
  533. package/dist/components/loading/users-grid-skeleton.d.ts +0 -7
  534. package/dist/components/loading/users-grid-skeleton.d.ts.map +0 -1
  535. package/dist/components/loading/users-grid-skeleton.js +0 -13
  536. package/dist/components/shared/product-release/release-detail-skeleton.d.ts +0 -2
  537. package/dist/components/shared/product-release/release-detail-skeleton.d.ts.map +0 -1
  538. package/dist/components/shared/product-release/release-detail-skeleton.js +0 -9
  539. package/dist/components/skeleton.d.ts +0 -4
  540. package/dist/components/skeleton.d.ts.map +0 -1
  541. package/dist/components/skeleton.js +0 -9
  542. package/dist/components/ui/skeleton.d.ts +0 -44
  543. package/dist/components/ui/skeleton.d.ts.map +0 -1
  544. package/dist/components/ui/skeleton.js +0 -103
  545. package/dist/components/vendor-page-skeleton.d.ts +0 -2
  546. package/dist/components/vendor-page-skeleton.d.ts.map +0 -1
  547. package/dist/components/vendor-page-skeleton.js +0 -9
  548. package/src/components/dynamic-skeleton.tsx +0 -365
  549. package/src/components/loading/content-skeleton.tsx +0 -374
  550. package/src/components/loading/users-grid-skeleton.tsx +0 -36
  551. package/src/components/shared/product-release/release-detail-skeleton.tsx +0 -7
  552. package/src/components/skeleton.tsx +0 -8
  553. package/src/components/ui/skeleton.tsx +0 -173
  554. package/src/components/vendor-page-skeleton.tsx +0 -7
@@ -100,6 +100,8 @@ export function getDeviceOpenColumn<T extends DeviceRow = DeviceRow>(): ColumnDe
100
100
  export interface DevicesTableBodyProps<T extends DeviceRow = DeviceRow> {
101
101
  devices: T[];
102
102
  isLoading?: boolean;
103
+ /** The loading state announces itself ("Loading results"). `false` inside another loading region. Default `true`. */
104
+ loadingRegion?: boolean;
103
105
  /**
104
106
  * The empty state, as the design's `data-placeholder`: icon over a title over
105
107
  * a description. Wins over `emptyMessage` when both are given.
@@ -139,6 +141,7 @@ export interface DevicesTableBodyProps<T extends DeviceRow = DeviceRow> {
139
141
  export function DevicesTableBody<T extends DeviceRow = DeviceRow>({
140
142
  devices,
141
143
  isLoading,
144
+ loadingRegion,
142
145
  emptyState,
143
146
  emptyMessage = 'No devices found.',
144
147
  skeletonRows = 10,
@@ -186,6 +189,7 @@ export function DevicesTableBody<T extends DeviceRow = DeviceRow>({
186
189
  )}
187
190
  <DataTable.Body
188
191
  loading={isLoading}
192
+ loadingRegion={loadingRegion}
189
193
  skeletonRows={skeletonRows}
190
194
  emptyState={emptyState}
191
195
  emptyMessage={emptyState ? undefined : emptyMessage}
@@ -432,13 +432,15 @@ const PENDING_FILTER = { options: [] as never[], pending: true };
432
432
  export interface LogsTableSkeletonProps {
433
433
  /** The Log ID header in its inert form, so the icon does not arrive with the data. */
434
434
  logIdHeader?: ReactNode;
435
+ /** The loading state announces itself ("Loading results"). `false` inside another loading region. Default `true`. */
436
+ region?: boolean;
435
437
  }
436
438
 
437
439
  /**
438
440
  * Loading fallback of the logs table: an empty `DataTable` with the table's own
439
441
  * columns, so the header row and the column widths match the loaded table.
440
442
  */
441
- export function LogsTableSkeleton({ logIdHeader }: LogsTableSkeletonProps) {
443
+ export function LogsTableSkeleton({ logIdHeader, region = true }: LogsTableSkeletonProps) {
442
444
  const columns = useMemo<ColumnDef<unknown>[]>(() => {
443
445
  const multiSelect = multiSelectFor<unknown>();
444
446
  return [
@@ -503,7 +505,7 @@ export function LogsTableSkeleton({ logIdHeader }: LogsTableSkeletonProps) {
503
505
  return (
504
506
  <DataTable table={table}>
505
507
  <DataTable.Header stickyHeader stickyHeaderOffset="top-[96px]" />
506
- <DataTable.Body loading={true} skeletonRows={10} emptyMessage="" rowClassName="mb-1" />
508
+ <DataTable.Body loading={true} loadingRegion={region} skeletonRows={10} emptyMessage="" rowClassName="mb-1" />
507
509
  </DataTable>
508
510
  );
509
511
  }
@@ -19,10 +19,11 @@ import { AlertTriangleIcon } from '../icons-v2-generated/interface/alert-triangl
19
19
  import { Refresh02VrIcon } from '../icons-v2-generated/media-playback/refresh-02-vr-icon';
20
20
  import { QuestionCircleIcon } from '../icons-v2-generated/signs-and-symbols/question-circle-icon';
21
21
  import { XmarkCircleIcon } from '../icons-v2-generated/signs-and-symbols/xmark-circle-icon';
22
+ import { LoadingRegion } from '../loading/loading-region';
23
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
22
24
  import { Autocomplete, type AutocompleteOption } from '../ui/autocomplete';
23
25
  import { Button } from '../ui/button';
24
26
  import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '../ui/dropdown-menu';
25
- import { Skeleton } from '../ui/skeleton';
26
27
  import { Slider } from '../ui/slider';
27
28
  import { TabSelector } from '../ui/tab-selector';
28
29
  import { PushButtonSelector } from './push-button-selector';
@@ -347,31 +348,36 @@ export function ModelTokenRatesUnavailable({ className }: { className?: string }
347
348
  }
348
349
 
349
350
  /** The table's loading footprint: the provider tabs, the header and rows of the boxes the loaded rows use. */
350
- export function ModelTokenRatesSkeleton() {
351
+ export function ModelTokenRatesSkeleton({
352
+ region = true,
353
+ }: {
354
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
355
+ region?: boolean;
356
+ } = {}) {
351
357
  const cells = (
352
358
  <>
353
359
  <div className="flex-1" />
354
- <Skeleton className="h-4 w-12" />
355
- <Skeleton className="h-4 w-12" />
360
+ <UnifiedSkeleton className="h-4 w-12" />
361
+ <UnifiedSkeleton className="h-4 w-12" />
356
362
  </>
357
363
  );
358
364
  return (
359
- <div aria-busy="true" className="min-h-0 flex-1 overflow-hidden">
365
+ <LoadingRegion label="Loading the model token rates" announce={region} className="min-h-0 flex-1 overflow-hidden">
360
366
  <div className={cn('border-b border-ods-border py-[var(--spacing-system-xs)]', PAD_X)}>
361
- <Skeleton className={TABS_SKELETON_CLASS} />
367
+ <UnifiedSkeleton className={TABS_SKELETON_CLASS} />
362
368
  </div>
363
369
  <div className={cn(ROW, PAD_X, 'py-[var(--spacing-system-xs)]')}>
364
- <Skeleton className="h-4 w-14" />
370
+ <UnifiedSkeleton className="h-4 w-14" />
365
371
  {cells}
366
372
  </div>
367
373
  {Array.from({ length: TABLE_SKELETON_ROWS }, (_, index) => (
368
374
  // biome-ignore lint/suspicious/noArrayIndexKey: identical placeholder rows
369
375
  <div key={index} className={cn(ROW, PAD_X, 'py-[var(--spacing-system-xxs)]')}>
370
- <Skeleton className="h-4 w-36" />
376
+ <UnifiedSkeleton className="h-4 w-36" />
371
377
  {cells}
372
378
  </div>
373
379
  ))}
374
- </div>
380
+ </LoadingRegion>
375
381
  );
376
382
  }
377
383
 
@@ -418,15 +424,8 @@ export const MODEL_TOKEN_EXCHANGE_RANGE = { min: 1_000_000, max: 50_000_000, ste
418
424
  /** The provider rows drawn while the providers load: as many as OpenFrame has had. */
419
425
  const PROVIDER_PLACEHOLDERS = ['loading-1', 'loading-2', 'loading-3'] as const;
420
426
 
421
- /** A line of the surrounding text's own height, as a bar: what a figure is while it loads. */
422
- function Bar({ className }: { className: string }) {
423
- return (
424
- <span
425
- aria-hidden
426
- className={cn('inline-block h-[0.8lh] animate-pulse rounded bg-ods-border align-middle', className)}
427
- />
428
- );
429
- }
427
+ /** A figure while it loads: a bar of the surrounding text's own line, inside its phrasing span. */
428
+ const FIGURE_SKELETON_CLASS = 'inline-block h-[0.8lh] rounded align-middle';
430
429
 
431
430
  /** A model as a picker option: its name, its provider under it, the provider's mark beside it. */
432
431
  function modelOption(rate: ModelTokenRate): AutocompleteOption<string> {
@@ -475,10 +474,14 @@ function ExchangeFigure({
475
474
  <span
476
475
  className={cn('whitespace-nowrap tabular-nums text-ods-text-primary', size === 'hero' ? 'text-h1' : 'text-h2')}
477
476
  >
478
- {loading ? <Bar className="w-20" /> : figure}
477
+ {loading ? <UnifiedSkeleton as="span" aria-hidden className={cn(FIGURE_SKELETON_CLASS, 'w-20')} /> : figure}
479
478
  </span>
480
479
  <span className="min-h-[2lh] text-ods-text-secondary text-h4">
481
- {loading ? <Bar className="w-full max-w-xs" /> : words}
480
+ {loading ? (
481
+ <UnifiedSkeleton as="span" aria-hidden className={cn(FIGURE_SKELETON_CLASS, 'w-full max-w-xs')} />
482
+ ) : (
483
+ words
484
+ )}
482
485
  </span>
483
486
  </div>
484
487
  );
@@ -593,7 +596,7 @@ export function ModelTokenExchange({
593
596
  ? PROVIDER_PLACEHOLDERS.map(id => ({
594
597
  id,
595
598
  name: '\u00a0',
596
- icon: <Skeleton className="size-8 rounded" />,
599
+ icon: <UnifiedSkeleton className="size-8 rounded" />,
597
600
  disabled: true,
598
601
  }))
599
602
  : providers.map(providerType => {
@@ -655,7 +658,7 @@ export function ModelTokenExchange({
655
658
  >
656
659
  <span className="min-h-[2lh] text-ods-text-secondary text-h4">
657
660
  {loading || !rate ? (
658
- <Bar className="w-full max-w-xs" />
661
+ <UnifiedSkeleton as="span" aria-hidden className={cn(FIGURE_SKELETON_CLASS, 'w-full max-w-xs')} />
659
662
  ) : (
660
663
  copy.charge.so(balancePrice ?? copy.buy.tokens(tokens), model)
661
664
  )}
@@ -663,7 +666,7 @@ export function ModelTokenExchange({
663
666
  {/* The number is the headline, alone on its line: a longer number never pushes its unit to a new line and the box taller. */}
664
667
  <span className="min-h-[1lh] whitespace-nowrap tabular-nums text-ods-text-primary text-h1">
665
668
  {loading || !rate ? (
666
- <Bar className="w-40" />
669
+ <UnifiedSkeleton as="span" aria-hidden className={cn(FIGURE_SKELETON_CLASS, 'w-40')} />
667
670
  ) : (
668
671
  formatTokenAmount(tokensForBalance(balance, rate.inputTokenRate))
669
672
  )}
@@ -671,7 +674,7 @@ export function ModelTokenExchange({
671
674
  <span className="min-h-[1lh] text-ods-text-primary text-h3">{copy.charge.read}</span>
672
675
  <span className="min-h-[1lh] text-ods-text-secondary text-h4">
673
676
  {loading || !rate ? (
674
- <Bar className="w-48" />
677
+ <UnifiedSkeleton as="span" aria-hidden className={cn(FIGURE_SKELETON_CLASS, 'w-48')} />
675
678
  ) : (
676
679
  copy.charge.orWritten(formatTokenAmount(tokensForBalance(balance, rate.outputTokenRate)))
677
680
  )}
@@ -2,8 +2,8 @@ export { NotificationsProvider, useNotifications, useOptionalNotifications } fro
2
2
  export type { NotificationsProviderProps, NotificationsActions } from './notifications-context';
3
3
  export { NotificationDrawer } from './notification-drawer';
4
4
  export type { NotificationDrawerProps } from './notification-drawer';
5
- export { NotificationTile } from './notification-tile';
6
- export type { NotificationTileProps } from './notification-tile';
5
+ export { NotificationTile, NotificationTileSkeleton } from './notification-tile';
6
+ export type { NotificationTileProps, NotificationTileSkeletonProps } from './notification-tile';
7
7
  export { NotificationPopups } from './notification-popups';
8
8
  export type { NotificationPopupsProps, NotificationPopupsPosition } from './notification-popups';
9
9
  export { ApprovalRequestNotificationTile } from './approval-request-notification-tile';
@@ -5,6 +5,8 @@ import { useNotificationPermission } from '../../../hooks/ui';
5
5
  import { cn } from '../../../utils/cn';
6
6
  import { ClockHistoryIcon, ArrowRightUpIcon } from '../../icons-v2-generated';
7
7
  import { BellOffIcon } from '../../icons-v2-generated/interface/bell-off-icon';
8
+ import { LoadingRegion } from '../../loading/loading-region';
9
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
8
10
  import { useAppLayoutDrawerContainer } from '../../navigation/app-layout-context';
9
11
  import { AppLayoutDrawer, AppLayoutDrawerContent } from '../../navigation/app-layout-drawer';
10
12
  import { SplitButton } from '../../ui/button';
@@ -231,16 +233,11 @@ function DrawerScrollList({
231
233
 
232
234
  function DrawerLoadingTiles() {
233
235
  return (
234
- <>
235
- <div
236
- aria-hidden="true"
237
- className="h-16 w-full shrink-0 animate-pulse rounded-md border border-ods-border bg-ods-card"
238
- />
239
- <div
240
- aria-hidden="true"
241
- className="h-16 w-full shrink-0 animate-pulse rounded-md border border-ods-border bg-ods-card"
242
- />
243
- </>
236
+ // `contents`: the tiles stay the list's own items; the region adds the one announcement.
237
+ <LoadingRegion label="Loading more notifications" className="contents">
238
+ <UnifiedSkeleton className="h-16 w-full shrink-0 rounded-md border border-ods-border" />
239
+ <UnifiedSkeleton className="h-16 w-full shrink-0 rounded-md border border-ods-border" />
240
+ </LoadingRegion>
244
241
  );
245
242
  }
246
243
 
@@ -6,6 +6,7 @@ import { cn } from '../../../utils/cn';
6
6
  import { formatTicketRelativeTime } from '../../../utils/date-utils';
7
7
  import { CheckCircleIcon } from '../../icons-v2-generated/signs-and-symbols/check-circle-icon';
8
8
  import { XmarkIcon } from '../../icons-v2-generated/signs-and-symbols/xmark-icon';
9
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
9
10
  import { dotColorByVariant, progressColorByVariant as toastProgressColorByVariant } from '../../ui/toaster';
10
11
  import type { Notification, NotificationSeverity, NotificationVariant } from './types';
11
12
 
@@ -268,3 +269,59 @@ export function NotificationTile({
268
269
  </output>
269
270
  );
270
271
  }
272
+
273
+ export interface NotificationTileSkeletonProps {
274
+ /** `approval`: the approval tile, which adds a row of small buttons under the body. */
275
+ variant?: 'default' | 'approval';
276
+ className?: string;
277
+ }
278
+
279
+ /** One row of the tile: the LINE BOX of the text it stands in for, with its bar centred inside. */
280
+ function TileLine({ box, bar, width }: { box: string; bar: string; width: string }) {
281
+ return (
282
+ <span className={cn('flex items-center', box)}>
283
+ <UnifiedSkeleton as="span" width={width} className={bar} />
284
+ </span>
285
+ );
286
+ }
287
+
288
+ /**
289
+ * A tile while its notification is read, box for box: the tile's frame and pad,
290
+ * the header (icon, type, time, trailing control), a one-line title over a
291
+ * TWO-line description (a host that rotates tiles in one cell is as tall as its
292
+ * tallest tile), and for `approval` the button row. Each row is its text's line
293
+ * box (h5/h6 20px, the h4 title 24px), so a host panel sizes itself against the
294
+ * height it will have when loaded.
295
+ */
296
+ export function NotificationTileSkeleton({ variant = 'default', className }: NotificationTileSkeletonProps) {
297
+ return (
298
+ <output
299
+ aria-hidden
300
+ className={cn(
301
+ 'relative block w-full shrink-0 overflow-hidden rounded-md border border-ods-border bg-ods-card',
302
+ className,
303
+ )}
304
+ >
305
+ <span className="relative flex flex-col gap-[var(--spacing-system-xs)] p-[var(--spacing-system-s)]">
306
+ <span className="flex items-center gap-[var(--spacing-system-xs)]">
307
+ <TileLine box="size-4" width="1rem" bar="h-4 rounded-[2px]" />
308
+ <TileLine box="h-5" width="7rem" bar="h-3 rounded" />
309
+ <span className="min-w-0 flex-1" />
310
+ <TileLine box="h-5" width="3.5rem" bar="h-3 rounded" />
311
+ <TileLine box="size-4" width="1rem" bar="h-4 rounded-full" />
312
+ </span>
313
+ <span className="grid min-w-0 grid-cols-1">
314
+ <TileLine box="h-6" width="60%" bar="h-4 rounded" />
315
+ <TileLine box="h-5" width="88%" bar="h-3 rounded" />
316
+ <TileLine box="h-5" width="52%" bar="h-3 rounded" />
317
+ </span>
318
+ {variant === 'approval' && (
319
+ <span className="flex w-full items-center gap-[var(--spacing-system-xs)]">
320
+ <TileLine box="h-6 md:h-8" width="5.5rem" bar="h-6 rounded md:h-8" />
321
+ <TileLine box="h-6 md:h-8" width="4.5rem" bar="h-6 rounded md:h-8" />
322
+ </span>
323
+ )}
324
+ </span>
325
+ </output>
326
+ );
327
+ }
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { formatRelativeTimeFrom } from '../../../utils/date-utils';
4
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
4
5
  import { DashboardInfoCard } from '../../ui/dashboard-info-card';
5
- import { Skeleton } from '../../ui/skeleton';
6
6
  import type { PolicySummaryStats } from './compute-policy-summary';
7
7
 
8
8
  /** What a card shows when there is no value to show. */
@@ -31,7 +31,7 @@ export function PolicySummaryCards({ summary, isLoading = false, hasData = true,
31
31
  {isLoading ? (
32
32
  // `h-16 content-md:h-[104px]` is `DashboardInfoCard`'s own height, so the
33
33
  // grid does not jump when the real cards replace the placeholders.
34
- CARD_SKELETON_KEYS.map(key => <Skeleton key={key} className="h-16 w-full content-md:h-[104px]" />)
34
+ CARD_SKELETON_KEYS.map(key => <UnifiedSkeleton key={key} className="h-16 w-full content-md:h-[104px]" />)
35
35
  ) : (
36
36
  <>
37
37
  <DashboardInfoCard title="Total Policies" value={hasData ? summary.totalPolicies : EMPTY_VALUE} />
@@ -4,6 +4,7 @@ import { Check } from 'lucide-react';
4
4
  import type React from 'react';
5
5
  import { useEffect, useRef } from 'react';
6
6
  import { UnifiedSkeleton } from '../loading';
7
+ import { LoadingRegion } from '../loading/loading-region';
7
8
  import { Badge, Input } from '../ui';
8
9
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip';
9
10
 
@@ -78,32 +79,40 @@ interface PushButtonSelectorProps<Id extends SelectableOptionId = string> {
78
79
  footer?: React.ReactNode;
79
80
  }
80
81
 
81
- // Composed from the app-wide UnifiedSkeleton system (components/loading) —
82
- // the same base every other loading surface uses (bg-ods-skeleton pulse,
83
- // prefers-reduced-motion support, role="status" a11y). Each skeleton row
82
+ // Composed from the app-wide UnifiedSkeleton system (components/loading),
83
+ // announced once by its LoadingRegion. Each skeleton row
84
84
  // mirrors a LOADED option row exactly (bg-ods-bg card, p-4, icon + two
85
85
  // 20px-tall text lines + selection box) so the list never jumps on load.
86
- function PushButtonSelectorSkeleton({ count = 3, hasTitle }: { count?: number; hasTitle?: boolean }) {
86
+ function PushButtonSelectorSkeleton({
87
+ region = true,
88
+ count = 3,
89
+ hasTitle,
90
+ }: {
91
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
92
+ region?: boolean;
93
+ count?: number;
94
+ hasTitle?: boolean;
95
+ }) {
87
96
  return (
88
- <div className="space-y-3" role="status" aria-label="Loading options">
89
- {hasTitle && <UnifiedSkeleton className="h-5 w-20" aria-label="Loading title" />}
97
+ <LoadingRegion label="Loading options" announce={region} className="space-y-3">
98
+ {hasTitle && <UnifiedSkeleton className="h-5 w-20" />}
90
99
  <div className="space-y-3">
91
100
  {Array.from({ length: count }, (_, i) => (
92
101
  <div key={i} className="rounded-lg border border-ods-border bg-ods-bg p-4">
93
102
  <div className="flex items-center justify-between gap-4">
94
103
  <div className="flex items-center gap-3">
95
- <UnifiedSkeleton className="h-8 w-8" aria-label="Loading icon" />
104
+ <UnifiedSkeleton className="h-8 w-8" />
96
105
  <div>
97
- <UnifiedSkeleton variant="text" className="mb-2 h-4 w-24" aria-label="Loading name" />
98
- <UnifiedSkeleton variant="text" className="h-4 w-36" aria-label="Loading description" />
106
+ <UnifiedSkeleton variant="text" className="mb-2 h-4 w-24" />
107
+ <UnifiedSkeleton variant="text" className="h-4 w-36" />
99
108
  </div>
100
109
  </div>
101
- <UnifiedSkeleton className="h-6 w-6" aria-label="Loading selection state" />
110
+ <UnifiedSkeleton className="h-6 w-6" />
102
111
  </div>
103
112
  </div>
104
113
  ))}
105
114
  </div>
106
- </div>
115
+ </LoadingRegion>
107
116
  );
108
117
  }
109
118
 
@@ -11,9 +11,10 @@ import {
11
11
  Settings01Icon,
12
12
  } from '../../icons-v2-generated';
13
13
  import { PageLayout } from '../../layout/page-layout';
14
+ import { LoadingRegion } from '../../loading/loading-region';
15
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
14
16
  import { ActionsMenuDropdown, type ActionsMenuGroup } from '../../ui/actions-menu';
15
17
  import { Button } from '../../ui/button/button';
16
- import { Skeleton } from '../../ui/skeleton';
17
18
  import { TruncateText } from '../../ui/truncate-text';
18
19
  import { RemoteDesktopFullscreenToolbar } from './remote-desktop-fullscreen-toolbar';
19
20
 
@@ -206,27 +207,36 @@ export function RemoteDesktopView({
206
207
  }
207
208
 
208
209
  /** The page while the device is still loading: the header bar as placeholders over an empty screen. */
209
- export function RemoteDesktopViewSkeleton({ onBack }: Pick<RemoteDesktopViewProps, 'onBack'>) {
210
+ export function RemoteDesktopViewSkeleton({
211
+ onBack,
212
+ region = true,
213
+ }: Pick<RemoteDesktopViewProps, 'onBack'> & {
214
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
215
+ region?: boolean;
216
+ }) {
210
217
  return (
211
218
  <PageLayout className={PAGE_CLASS} backButton={onBack ? { label: 'Back', onClick: onBack } : undefined}>
212
- <div className={CONTROLS_BAR_CLASS}>
213
- <div className={CONTROLS_ROW_CLASS}>
214
- <div className="flex min-w-0 items-center gap-[var(--spacing-system-mf)]">
215
- <Skeleton className="h-9 w-9 flex-shrink-0 rounded-md" />
216
- <div className="flex min-w-0 flex-col gap-[var(--spacing-system-xxs)]">
217
- <Skeleton className="h-5 w-48" />
218
- <Skeleton className="h-4 w-36" />
219
+ {/* `contents`: the page's own children stay its layout items; the region adds the one announcement. */}
220
+ <LoadingRegion label="Loading the remote session" announce={region} className="contents">
221
+ <div className={CONTROLS_BAR_CLASS}>
222
+ <div className={CONTROLS_ROW_CLASS}>
223
+ <div className="flex min-w-0 items-center gap-[var(--spacing-system-mf)]">
224
+ <UnifiedSkeleton className="h-9 w-9 flex-shrink-0 rounded-md" />
225
+ <div className="flex min-w-0 flex-col gap-[var(--spacing-system-xxs)]">
226
+ <UnifiedSkeleton className="h-5 w-48" />
227
+ <UnifiedSkeleton className="h-4 w-36" />
228
+ </div>
229
+ </div>
230
+ <div className="flex flex-shrink-0 items-center gap-[var(--spacing-system-xs)]">
231
+ <UnifiedSkeleton className="h-11 w-11 rounded-lg md:h-12 md:w-12" />
232
+ <UnifiedSkeleton className="h-11 w-11 rounded-lg md:h-12 md:w-12" />
233
+ <UnifiedSkeleton className="h-11 w-11 rounded-lg md:h-12 md:w-12" />
219
234
  </div>
220
- </div>
221
- <div className="flex flex-shrink-0 items-center gap-[var(--spacing-system-xs)]">
222
- <Skeleton className="h-11 w-11 rounded-lg md:h-12 md:w-12" />
223
- <Skeleton className="h-11 w-11 rounded-lg md:h-12 md:w-12" />
224
- <Skeleton className="h-11 w-11 rounded-lg md:h-12 md:w-12" />
225
235
  </div>
226
236
  </div>
227
- </div>
228
237
 
229
- <div className="min-h-0 min-w-0 flex-1 rounded-lg bg-black" />
238
+ <div className="min-h-0 min-w-0 flex-1 rounded-lg bg-black" />
239
+ </LoadingRegion>
230
240
  </PageLayout>
231
241
  );
232
242
  }
@@ -14,6 +14,7 @@ import type { FormRescueDefinition } from '../../utils/form-rescue';
14
14
  import { hasGenericEmailDomain } from '../../utils/generic-domain-utils';
15
15
  import type { HumanitySignals } from '../../utils/humanity-signals';
16
16
  import { OpenframeLogoIcon } from '../icons-v2-generated/logos/openframe-logo-icon';
17
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
17
18
  import { Button } from '../ui/button';
18
19
  import { CheckboxBlock } from '../ui/checkbox-block';
19
20
  import { HoneypotField } from '../ui/honeypot-field';
@@ -201,16 +202,16 @@ export function WaitlistForm({
201
202
  )}
202
203
  >
203
204
  {/* Email input skeleton */}
204
- <div className="h-12 w-full animate-pulse rounded-[6px] border border-ods-border bg-ods-card" />
205
+ <UnifiedSkeleton className="h-12 w-full rounded-[6px] border border-ods-border" />
205
206
  {/* Phone input skeleton */}
206
207
  <div className="flex w-full gap-[var(--spacing-system-xs)]">
207
- <div className="h-12 w-[130px] shrink-0 animate-pulse rounded-[6px] border border-ods-border bg-ods-card" />
208
- <div className="h-12 flex-1 animate-pulse rounded-[6px] border border-ods-border bg-ods-card" />
208
+ <UnifiedSkeleton className="h-12 w-[130px] shrink-0 rounded-[6px] border border-ods-border" />
209
+ <UnifiedSkeleton className="h-12 flex-1 rounded-[6px] border border-ods-border" />
209
210
  </div>
210
211
  {/* Disclaimer + button skeleton */}
211
212
  <div className="flex w-full flex-col items-end gap-[var(--spacing-system-m)]">
212
- <div className="w-full animate-pulse rounded-[6px] border border-ods-border bg-ods-bg px-4 py-6" />
213
- <div className="h-12 w-[200px] animate-pulse rounded-[6px] border border-ods-border bg-ods-card" />
213
+ <UnifiedSkeleton className="h-auto w-full rounded-[6px] border border-ods-border px-4 py-6" />
214
+ <UnifiedSkeleton className="h-12 w-[200px] rounded-[6px] border border-ods-border" />
214
215
  </div>
215
216
  </div>
216
217
  );
@@ -59,6 +59,7 @@ import { WindowsLogoGreyIcon } from '../icons-v2-generated/brand-logos/windows-l
59
59
  import { Download01Icon } from '../icons-v2-generated/interface/download-01-icon';
60
60
  import { PageShell } from '../layout/article-detail-layout';
61
61
  import { PageLayout } from '../layout/page-layout';
62
+ import { LoadingRegion } from '../loading/loading-region';
62
63
  import { UnifiedSkeleton } from '../loading/unified-skeleton';
63
64
  import { Button } from '../ui/button/button';
64
65
  import { LoadError } from '../ui/error-state';
@@ -248,7 +249,7 @@ function WebCard({ web }: { web: DownloadAppsWebOption }) {
248
249
  /** A section's cards while the server's answer loads: the same grid and card frame, a button's box in each. */
249
250
  function CardsSkeleton({ label }: { label: string }) {
250
251
  return (
251
- <div className={CARDS_GRID_CLASS} aria-busy="true" aria-label={label}>
252
+ <LoadingRegion label={label} className={CARDS_GRID_CLASS}>
252
253
  {[0, 1].map(card => (
253
254
  <div key={card} className={CARD_CLASS}>
254
255
  <UnifiedSkeleton className="h-6 w-32 rounded" />
@@ -256,7 +257,7 @@ function CardsSkeleton({ label }: { label: string }) {
256
257
  <UnifiedSkeleton className="h-14 w-full rounded-md" />
257
258
  </div>
258
259
  ))}
259
- </div>
260
+ </LoadingRegion>
260
261
  );
261
262
  }
262
263
 
@@ -376,10 +376,14 @@ export function TrustCenterPageSkeleton({
376
376
  backButton = false,
377
377
  title = TRUST_CENTER_TITLE,
378
378
  subtitle = TRUST_CENTER_TAGLINE,
379
- }: Pick<TrustCenterPageProps, 'shell' | 'backButton' | 'title' | 'subtitle'>) {
379
+ region = true,
380
+ }: Pick<TrustCenterPageProps, 'shell' | 'backButton' | 'title' | 'subtitle'> & {
381
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
382
+ region?: boolean;
383
+ }) {
380
384
  return (
381
385
  <TrustCenterChrome shell={shell} title={title} subtitle={subtitle} backButton={backButton}>
382
- <TrustCenterSkeleton />
386
+ <TrustCenterSkeleton region={region} />
383
387
  </TrustCenterChrome>
384
388
  );
385
389
  }
@@ -46,6 +46,7 @@ import { ShieldCheckIcon } from '../icons-v2-generated/security/shield-check-ico
46
46
  import { CheckIcon } from '../icons-v2-generated/signs-and-symbols/check-icon';
47
47
  import { SECTION_HEADING_CLASS } from '../layout/page-heading';
48
48
  import { ListEmptyState } from '../list-empty-state';
49
+ import { LoadingRegion } from '../loading/loading-region';
49
50
  import { TextSkeleton, UnifiedSkeleton } from '../loading/unified-skeleton';
50
51
  import { Button } from '../ui/button/button';
51
52
  import { ComplianceLogo } from '../ui/compliance-badge';
@@ -666,7 +667,12 @@ function SectionRailSkeleton() {
666
667
  * the content replaces it. The status row, then Compliance, Controls and
667
668
  * Documents (what fills the first screens), beside the section rail.
668
669
  */
669
- export function TrustCenterSkeleton() {
670
+ export function TrustCenterSkeleton({
671
+ region = true,
672
+ }: {
673
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
674
+ region?: boolean;
675
+ } = {}) {
670
676
  return (
671
677
  <>
672
678
  <div className={TRUST_STATUS_ROW_CLASS} aria-hidden="true">
@@ -683,7 +689,7 @@ export function TrustCenterSkeleton() {
683
689
  <TextSkeleton.Body className="w-44" />
684
690
  </div>
685
691
  </div>
686
- <div className={TRUST_BODY_GRID_CLASS} aria-busy="true" aria-label="Loading the trust center">
692
+ <LoadingRegion label="Loading the trust center" announce={region} className={TRUST_BODY_GRID_CLASS}>
687
693
  <div className={TRUST_SECTIONS_COLUMN_CLASS}>
688
694
  <SkeletonSection id="compliance">
689
695
  <StackedRowsPanel rows={skeletonRows(3, { mark: 'logo', action: 'badge' })} />
@@ -698,7 +704,7 @@ export function TrustCenterSkeleton() {
698
704
  <aside className="hidden content-lg:block" aria-hidden="true">
699
705
  <SectionRailSkeleton />
700
706
  </aside>
701
- </div>
707
+ </LoadingRegion>
702
708
  </>
703
709
  );
704
710
  }
@@ -18,7 +18,6 @@ export * from './comment-card';
18
18
  export * from './comment-composer';
19
19
  export * from './comment-thread';
20
20
  export * from './content-loading-container';
21
- export * from './dynamic-skeleton';
22
21
  export * from './empty-state';
23
22
  export * from './list-empty-state';
24
23
  export * from './faq-accordion';
@@ -57,7 +56,6 @@ export * from './social-icon-row';
57
56
  export * from './user-display';
58
57
  export * from './vendor-display-button';
59
58
  export * from './vendor-icon';
60
- export * from './vendor-page-skeleton';
61
59
  export * from './vendor-tag';
62
60
  export * from './why-it-matters';
63
61
  export * from './yes-no-display';
@@ -84,6 +84,7 @@
84
84
  import type React from 'react';
85
85
  import { useIsTruncated } from '../../hooks/ui/use-is-truncated';
86
86
  import { cn } from '../../utils/cn';
87
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
87
88
  import type { ActionsMenuGroup } from '../ui/actions-menu';
88
89
  import { EntityImage } from '../ui/entity-image';
89
90
  import { FloatingTooltip } from '../ui/floating-tooltip';
@@ -159,21 +160,14 @@ export interface TitleBlockProps {
159
160
  }
160
161
 
161
162
  /**
162
- * Inline text skeleton — used only in `loading` mode, placed directly inside the real
163
- * `h1`/`p`. It is a single `inline-block` bar whose height is intentionally SHORTER than the
164
- * typography line-height, and it uses the default baseline alignment. That way the element's
163
+ * The inline text skeleton, used only in `loading` mode, placed directly inside the real
164
+ * `h1`/`p`: a single `inline-block` `UnifiedSkeleton` span whose height is intentionally SHORTER
165
+ * than the typography line-height, on the default baseline alignment. That way the element's
165
166
  * own line-box STRUT (text-h2 → 40px, text-h6 → 20px) sets the height exactly as it would for
166
- * real text — the bar fits within the ascent and never inflates the line. So a loading header
167
+ * real text: the bar fits within the ascent and never inflates the line. So a loading header
167
168
  * is pixel-identical in height to the loaded one. Phrasing-valid (`span` only).
168
169
  */
169
- function TitleTextSkeleton({ widthClass, heightClass }: { widthClass: string; heightClass: string }) {
170
- return (
171
- <span
172
- aria-hidden
173
- className={cn('inline-block max-w-full animate-pulse rounded-md bg-ods-border', widthClass, heightClass)}
174
- />
175
- );
176
- }
170
+ const TITLE_TEXT_SKELETON_CLASS = 'inline-block max-w-full rounded-md';
177
171
 
178
172
  /**
179
173
  * Bar geometry per title size, following the ODS type scale across breakpoints
@@ -184,7 +178,7 @@ function TitleTextSkeleton({ widthClass, heightClass }: { widthClass: string; he
184
178
  * 32/40 from tablet up. `text-h1` scales at both breakpoints (40 → 48 → 56), so
185
179
  * its bar does too — reusing the h2 bar there would leave a stamp-sized smudge
186
180
  * inside a 64px line. Heights stay well under the line box's ascent on purpose;
187
- * see `TitleTextSkeleton` for why that is what keeps the header height honest.
181
+ * see `TITLE_TEXT_SKELETON_CLASS` for why that is what keeps the header height honest.
188
182
  */
189
183
  const TITLE_SKELETON_SIZE = {
190
184
  h1: { width: 'w-56 content-md:w-80 content-lg:w-96', height: 'h-7 content-md:h-8 content-lg:h-9' },
@@ -226,7 +220,11 @@ export function TitleBlock({
226
220
  loading ? null : subtitle,
227
221
  );
228
222
  const titleNode = loading ? (
229
- <TitleTextSkeleton widthClass={skeletonSize.width} heightClass={skeletonSize.height} />
223
+ <UnifiedSkeleton
224
+ as="span"
225
+ aria-hidden
226
+ className={cn(TITLE_TEXT_SKELETON_CLASS, skeletonSize.width, skeletonSize.height)}
227
+ />
230
228
  ) : (
231
229
  title
232
230
  );
@@ -307,7 +305,11 @@ export function TitleBlock({
307
305
  aria-hidden={!loading && !subtitle ? true : undefined}
308
306
  >
309
307
  {loading ? (
310
- <TitleTextSkeleton widthClass="w-28 content-md:w-36" heightClass="h-2.5 content-md:h-3" />
308
+ <UnifiedSkeleton
309
+ as="span"
310
+ aria-hidden
311
+ className={cn(TITLE_TEXT_SKELETON_CLASS, 'h-2.5 w-28 content-md:h-3 content-md:w-36')}
312
+ />
311
313
  ) : (
312
314
  subtitle || '\u00A0'
313
315
  )}