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

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 (546) 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-U6XWGK53.cjs → chunk-ALPRQ3ZX.cjs} +56 -46
  8. package/dist/{chunk-YKJQM2O6.cjs → chunk-BN6NA5RM.cjs} +56 -53
  9. package/dist/{chunk-HNLI4OU5.cjs → chunk-C6LPOYDM.cjs} +24 -24
  10. package/dist/{chunk-4MGZYY6U.cjs → chunk-CLAJIQ7E.cjs} +26 -18
  11. package/dist/{chunk-H34A2765.cjs → chunk-CXV7VBSI.cjs} +104 -118
  12. package/dist/{chunk-QPSQ5WLG.cjs → chunk-DGEB5GUZ.cjs} +2 -2
  13. package/dist/{chunk-OZUJYBQ2.cjs → chunk-E3KFEOFA.cjs} +9 -6
  14. package/dist/{chunk-PSSGIZXZ.cjs → chunk-FHT7SMA7.cjs} +49 -46
  15. package/dist/{chunk-46EIXJFC.cjs → chunk-GOFEOCQN.cjs} +44 -27
  16. package/dist/{chunk-UNR74CAC.cjs → chunk-HOEVD6EN.cjs} +4 -4
  17. package/dist/{chunk-EH3LOWGY.cjs → chunk-KRAQEZPB.cjs} +48 -40
  18. package/dist/{chunk-AKTPO2DN.cjs → chunk-L4UI63K6.cjs} +2 -2
  19. package/dist/{chunk-D4XZL27V.cjs → chunk-LQT2ITMG.cjs} +6 -6
  20. package/dist/{chunk-PSIKUDUV.cjs → chunk-LVO7FALW.cjs} +5 -5
  21. package/dist/{chunk-L2RMTGOK.cjs → chunk-MGF3FUKD.cjs} +7 -7
  22. package/dist/{chunk-P7KTAXXE.cjs → chunk-OFO75R2O.cjs} +169 -175
  23. package/dist/{chunk-JNBOQ7F2.cjs → chunk-OZLIKBKC.cjs} +24 -24
  24. package/dist/{chunk-B27QEHYR.cjs → chunk-P6F6PHVK.cjs} +9 -9
  25. package/dist/chunk-RB6BSE3O.cjs +21 -0
  26. package/dist/{chunk-6XP6RNFD.cjs → chunk-SECT4H34.cjs} +1780 -2076
  27. package/dist/{chunk-GE4PCDNZ.cjs → chunk-SGL47BS2.cjs} +12 -12
  28. package/dist/{chunk-4AZHFLOM.cjs → chunk-SOPVUD2Y.cjs} +3 -3
  29. package/dist/chunk-UGCRLRCT.cjs +25 -0
  30. package/dist/{chunk-BBTSJYTR.cjs → chunk-V3UJ6NDR.cjs} +243 -429
  31. package/dist/{chunk-JOPFX3PJ.cjs → chunk-VEVIMDNK.cjs} +137 -122
  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-TRXCQADV.cjs → chunk-ZLF55RDR.cjs} +103 -98
  35. package/dist/{cloud-tenants-V5727B7F.cjs → cloud-tenants-2MYFHEYY.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/board/ticket-card-skeleton.js +8 -8
  143. package/dist/components/features/capability-explorer.d.ts +3 -1
  144. package/dist/components/features/capability-explorer.d.ts.map +1 -1
  145. package/dist/components/features/capability-explorer.js +27 -24
  146. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts +5 -2
  147. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts.map +1 -1
  148. package/dist/components/features/devices/device-selector/device-selector-skeleton.js +2 -2
  149. package/dist/components/features/devices/device-selector/device-selector.d.ts +1 -1
  150. package/dist/components/features/devices/device-selector/device-selector.d.ts.map +1 -1
  151. package/dist/components/features/devices/device-selector/device-selector.js +2 -0
  152. package/dist/components/features/devices/device-selector/device-selector.types.d.ts +2 -0
  153. package/dist/components/features/devices/device-selector/device-selector.types.d.ts.map +1 -1
  154. package/dist/components/features/devices/devices-grid.d.ts +3 -1
  155. package/dist/components/features/devices/devices-grid.d.ts.map +1 -1
  156. package/dist/components/features/devices/devices-grid.js +3 -2
  157. package/dist/components/features/devices/devices-panel-view.d.ts +6 -1
  158. package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -1
  159. package/dist/components/features/devices/devices-panel-view.js +4 -1
  160. package/dist/components/features/devices/devices-table-columns.d.ts +3 -1
  161. package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -1
  162. package/dist/components/features/devices/devices-table-columns.js +2 -0
  163. package/dist/components/features/index.cjs +18 -14
  164. package/dist/components/features/logs/logs-table-view.d.ts +3 -1
  165. package/dist/components/features/logs/logs-table-view.d.ts.map +1 -1
  166. package/dist/components/features/logs/logs-table-view.js +2 -2
  167. package/dist/components/features/model-token-rates.d.ts +4 -1
  168. package/dist/components/features/model-token-rates.d.ts.map +1 -1
  169. package/dist/components/features/model-token-rates.js +18 -23
  170. package/dist/components/features/notifications/index.d.ts +2 -2
  171. package/dist/components/features/notifications/index.d.ts.map +1 -1
  172. package/dist/components/features/notifications/index.js +2 -1
  173. package/dist/components/features/notifications/notification-drawer.d.ts.map +1 -1
  174. package/dist/components/features/notifications/notification-drawer.js +9 -16
  175. package/dist/components/features/notifications/notification-tile.d.ts +14 -0
  176. package/dist/components/features/notifications/notification-tile.d.ts.map +1 -1
  177. package/dist/components/features/notifications/notification-tile.js +36 -1
  178. package/dist/components/features/policies/policy-summary-cards.js +2 -2
  179. package/dist/components/features/push-button-selector.d.ts.map +1 -1
  180. package/dist/components/features/push-button-selector.js +12 -7
  181. package/dist/components/features/remote-session/remote-desktop-view.d.ts +4 -1
  182. package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -1
  183. package/dist/components/features/remote-session/remote-desktop-view.js +14 -10
  184. package/dist/components/features/waitlist-form.d.ts.map +1 -1
  185. package/dist/components/features/waitlist-form.js +6 -5
  186. package/dist/components/help-center-pages/download-apps-page.d.ts.map +1 -1
  187. package/dist/components/help-center-pages/download-apps-page.js +2 -1
  188. package/dist/components/help-center-pages/index.cjs +127 -119
  189. package/dist/components/help-center-pages/trust-center-page.d.ts +4 -1
  190. package/dist/components/help-center-pages/trust-center-page.d.ts.map +1 -1
  191. package/dist/components/help-center-pages/trust-center-page.js +3 -2
  192. package/dist/components/help-center-pages/trust-center-sections.d.ts +4 -1
  193. package/dist/components/help-center-pages/trust-center-sections.d.ts.map +1 -1
  194. package/dist/components/help-center-pages/trust-center-sections.js +5 -2
  195. package/dist/components/index.cjs +70 -112
  196. package/dist/components/index.d.ts +0 -2
  197. package/dist/components/index.d.ts.map +1 -1
  198. package/dist/components/index.js +0 -2
  199. package/dist/components/layout/title-block.d.ts.map +1 -1
  200. package/dist/components/layout/title-block.js +18 -11
  201. package/dist/components/loading/card-skeleton.d.ts +6 -3
  202. package/dist/components/loading/card-skeleton.d.ts.map +1 -1
  203. package/dist/components/loading/card-skeleton.js +7 -27
  204. package/dist/components/loading/category-card-skeleton.d.ts.map +1 -1
  205. package/dist/components/loading/category-card-skeleton.js +2 -4
  206. package/dist/components/loading/category-vendor-selector-skeleton.d.ts +3 -1
  207. package/dist/components/loading/category-vendor-selector-skeleton.d.ts.map +1 -1
  208. package/dist/components/loading/category-vendor-selector-skeleton.js +9 -4
  209. package/dist/components/loading/device-card-skeleton.d.ts +18 -9
  210. package/dist/components/loading/device-card-skeleton.d.ts.map +1 -1
  211. package/dist/components/loading/device-card-skeleton.js +30 -21
  212. package/dist/components/loading/index.d.ts +3 -4
  213. package/dist/components/loading/index.d.ts.map +1 -1
  214. package/dist/components/loading/index.js +6 -29
  215. package/dist/components/loading/loading-region.d.ts +33 -0
  216. package/dist/components/loading/loading-region.d.ts.map +1 -0
  217. package/dist/components/loading/loading-region.js +22 -0
  218. package/dist/components/loading/margin-report-skeleton.d.ts +3 -1
  219. package/dist/components/loading/margin-report-skeleton.d.ts.map +1 -1
  220. package/dist/components/loading/margin-report-skeleton.js +70 -61
  221. package/dist/components/loading/msp-profile-form-skeleton.d.ts +3 -1
  222. package/dist/components/loading/msp-profile-form-skeleton.d.ts.map +1 -1
  223. package/dist/components/loading/msp-profile-form-skeleton.js +6 -5
  224. package/dist/components/loading/organization-card-skeleton.d.ts +3 -1
  225. package/dist/components/loading/organization-card-skeleton.d.ts.map +1 -1
  226. package/dist/components/loading/organization-card-skeleton.js +5 -5
  227. package/dist/components/loading/organization-icon-skeleton.d.ts.map +1 -1
  228. package/dist/components/loading/organization-icon-skeleton.js +2 -1
  229. package/dist/components/loading/page-layout-skeleton.d.ts +21 -6
  230. package/dist/components/loading/page-layout-skeleton.d.ts.map +1 -1
  231. package/dist/components/loading/page-layout-skeleton.js +283 -266
  232. package/dist/components/loading/settings-form-skeleton.d.ts +17 -0
  233. package/dist/components/loading/settings-form-skeleton.d.ts.map +1 -0
  234. package/dist/components/loading/settings-form-skeleton.js +42 -0
  235. package/dist/components/loading/unified-skeleton.d.ts +11 -4
  236. package/dist/components/loading/unified-skeleton.d.ts.map +1 -1
  237. package/dist/components/loading/unified-skeleton.js +14 -89
  238. package/dist/components/loading/wizard-layout-skeleton.d.ts +3 -1
  239. package/dist/components/loading/wizard-layout-skeleton.d.ts.map +1 -1
  240. package/dist/components/loading/wizard-layout-skeleton.js +3 -2
  241. package/dist/components/media-carousel.d.ts.map +1 -1
  242. package/dist/components/media-carousel.js +2 -1
  243. package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
  244. package/dist/components/meeting-scheduler/booking-form.js +14 -8
  245. package/dist/components/meeting-scheduler/context-panel.d.ts.map +1 -1
  246. package/dist/components/meeting-scheduler/context-panel.js +8 -7
  247. package/dist/components/meeting-scheduler/directory.d.ts.map +1 -1
  248. package/dist/components/meeting-scheduler/directory.js +10 -9
  249. package/dist/components/meeting-scheduler/index.cjs +85 -75
  250. package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
  251. package/dist/components/meeting-scheduler/index.js +3 -2
  252. package/dist/components/meeting-scheduler/modal-header.d.ts.map +1 -1
  253. package/dist/components/meeting-scheduler/modal-header.js +8 -7
  254. package/dist/components/meeting-scheduler/slot-picker.d.ts.map +1 -1
  255. package/dist/components/meeting-scheduler/slot-picker.js +4 -3
  256. package/dist/components/navigation/app-header.d.ts.map +1 -1
  257. package/dist/components/navigation/app-header.js +8 -7
  258. package/dist/components/navigation/index.cjs +19 -17
  259. package/dist/components/navigation/multi-level-navigation.d.ts.map +1 -1
  260. package/dist/components/navigation/multi-level-navigation.js +3 -2
  261. package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
  262. package/dist/components/navigation/navigation-sidebar-item.js +3 -2
  263. package/dist/components/onboarding-guides/index.cjs +19 -17
  264. package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts +4 -1
  265. package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts.map +1 -1
  266. package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.js +12 -8
  267. package/dist/components/product-demo/index.cjs +16 -15
  268. package/dist/components/product-demo/product-screen.d.ts.map +1 -1
  269. package/dist/components/product-demo/product-screen.js +4 -4
  270. package/dist/components/profile/ProfileLoadingSkeleton.d.ts +3 -1
  271. package/dist/components/profile/ProfileLoadingSkeleton.d.ts.map +1 -1
  272. package/dist/components/profile/ProfileLoadingSkeleton.js +10 -8
  273. package/dist/components/related-content/index.cjs +7 -5
  274. package/dist/components/related-content/related-content-section.d.ts.map +1 -1
  275. package/dist/components/related-content/related-content-section.js +3 -2
  276. package/dist/components/shared/delivery/delivery-table.d.ts.map +1 -1
  277. package/dist/components/shared/delivery/delivery-table.js +8 -7
  278. package/dist/components/shared/detail-page-skeleton.d.ts +5 -1
  279. package/dist/components/shared/detail-page-skeleton.d.ts.map +1 -1
  280. package/dist/components/shared/detail-page-skeleton.js +18 -14
  281. package/dist/components/shared/dev-section/dev-card-row.d.ts +3 -1
  282. package/dist/components/shared/dev-section/dev-card-row.d.ts.map +1 -1
  283. package/dist/components/shared/dev-section/dev-card-row.js +22 -9
  284. package/dist/components/shared/legal-document/legal-document-page.d.ts.map +1 -1
  285. package/dist/components/shared/legal-document/legal-document-page.js +8 -7
  286. package/dist/components/shared/onboarding/onboarding-step-card.d.ts.map +1 -1
  287. package/dist/components/shared/onboarding/onboarding-step-card.js +3 -2
  288. package/dist/components/shared/onboarding/onboarding-walkthrough.d.ts.map +1 -1
  289. package/dist/components/shared/onboarding/onboarding-walkthrough.js +2 -1
  290. package/dist/components/shared/product-release/index.d.ts +0 -1
  291. package/dist/components/shared/product-release/index.d.ts.map +1 -1
  292. package/dist/components/shared/product-release/index.js +1 -3
  293. package/dist/components/shared/product-release/product-release-card-skeleton.d.ts.map +1 -1
  294. package/dist/components/shared/product-release/product-release-card-skeleton.js +21 -20
  295. package/dist/components/shared/product-release/product-releases-view.d.ts.map +1 -1
  296. package/dist/components/shared/product-release/product-releases-view.js +2 -1
  297. package/dist/components/shared/roadmap/roadmap-grid-skeleton.d.ts +6 -13
  298. package/dist/components/shared/roadmap/roadmap-grid-skeleton.d.ts.map +1 -1
  299. package/dist/components/shared/roadmap/roadmap-grid-skeleton.js +13 -25
  300. package/dist/components/tickets/help-center-create-form.d.ts +4 -1
  301. package/dist/components/tickets/help-center-create-form.d.ts.map +1 -1
  302. package/dist/components/tickets/help-center-create-form.js +38 -26
  303. package/dist/components/tickets/index.cjs +22 -20
  304. package/dist/components/tickets/ticket-center.d.ts.map +1 -1
  305. package/dist/components/tickets/ticket-center.js +13 -10
  306. package/dist/components/tickets/ticket-detail-drawer.d.ts.map +1 -1
  307. package/dist/components/tickets/ticket-detail-drawer.js +2 -1
  308. package/dist/components/ui/admin-form-drawer.d.ts.map +1 -1
  309. package/dist/components/ui/admin-form-drawer.js +6 -8
  310. package/dist/components/ui/admin-form-modal.d.ts.map +1 -1
  311. package/dist/components/ui/admin-form-modal.js +12 -11
  312. package/dist/components/ui/analyzing-state.d.ts +1 -1
  313. package/dist/components/ui/analyzing-state.d.ts.map +1 -1
  314. package/dist/components/ui/analyzing-state.js +4 -10
  315. package/dist/components/ui/content-loader.d.ts +5 -1
  316. package/dist/components/ui/content-loader.d.ts.map +1 -1
  317. package/dist/components/ui/content-loader.js +27 -23
  318. package/dist/components/ui/dashboard-info-card.d.ts +17 -3
  319. package/dist/components/ui/dashboard-info-card.d.ts.map +1 -1
  320. package/dist/components/ui/dashboard-info-card.js +30 -10
  321. package/dist/components/ui/data-attribution.d.ts +6 -0
  322. package/dist/components/ui/data-attribution.d.ts.map +1 -1
  323. package/dist/components/ui/data-attribution.js +12 -1
  324. package/dist/components/ui/data-table/data-table-body.d.ts +6 -1
  325. package/dist/components/ui/data-table/data-table-body.d.ts.map +1 -1
  326. package/dist/components/ui/data-table/data-table-body.js +3 -1
  327. package/dist/components/ui/data-table/data-table-infinite-footer.d.ts.map +1 -1
  328. package/dist/components/ui/data-table/data-table-infinite-footer.js +3 -1
  329. package/dist/components/ui/data-table/data-table-skeleton.d.ts.map +1 -1
  330. package/dist/components/ui/data-table/data-table-skeleton.js +7 -5
  331. package/dist/components/ui/feature-card.d.ts.map +1 -1
  332. package/dist/components/ui/feature-card.js +7 -9
  333. package/dist/components/ui/file-manager/file-manager-skeleton.d.ts +3 -1
  334. package/dist/components/ui/file-manager/file-manager-skeleton.d.ts.map +1 -1
  335. package/dist/components/ui/file-manager/file-manager-skeleton.js +27 -21
  336. package/dist/components/ui/file-manager/file-manager-table.js +10 -10
  337. package/dist/components/ui/file-manager/index.cjs +45 -36
  338. package/dist/components/ui/filter-modal.d.ts.map +1 -1
  339. package/dist/components/ui/filter-modal.js +5 -5
  340. package/dist/components/ui/filter-pill-row.d.ts +10 -0
  341. package/dist/components/ui/filter-pill-row.d.ts.map +1 -1
  342. package/dist/components/ui/filter-pill-row.js +8 -1
  343. package/dist/components/ui/index.cjs +19 -28
  344. package/dist/components/ui/index.d.ts +0 -1
  345. package/dist/components/ui/index.d.ts.map +1 -1
  346. package/dist/components/ui/index.js +0 -1
  347. package/dist/components/ui/layout-hold.d.ts +5 -4
  348. package/dist/components/ui/layout-hold.d.ts.map +1 -1
  349. package/dist/components/ui/layout-hold.js +20 -29
  350. package/dist/components/ui/markdown/base-components.js +1 -1
  351. package/dist/components/ui/page-actions.d.ts.map +1 -1
  352. package/dist/components/ui/page-actions.js +6 -8
  353. package/dist/components/ui/photo-wall.d.ts.map +1 -1
  354. package/dist/components/ui/photo-wall.js +11 -18
  355. package/dist/components/ui/query-report-table/query-report-table-skeleton.d.ts +1 -1
  356. package/dist/components/ui/query-report-table/query-report-table-skeleton.d.ts.map +1 -1
  357. package/dist/components/ui/query-report-table/query-report-table-skeleton.js +28 -18
  358. package/dist/components/ui/query-report-table/query-report-table.d.ts +1 -1
  359. package/dist/components/ui/query-report-table/query-report-table.d.ts.map +1 -1
  360. package/dist/components/ui/query-report-table/query-report-table.js +3 -1
  361. package/dist/components/ui/query-report-table/types.d.ts +4 -0
  362. package/dist/components/ui/query-report-table/types.d.ts.map +1 -1
  363. package/dist/components/ui/skeleton-surface.d.ts +7 -0
  364. package/dist/components/ui/skeleton-surface.d.ts.map +1 -0
  365. package/dist/components/ui/skeleton-surface.js +5 -0
  366. package/dist/components/ui/table/table-skeleton.d.ts.map +1 -1
  367. package/dist/components/ui/table/table-skeleton.js +11 -13
  368. package/dist/components/ui/test-run.d.ts +6 -4
  369. package/dist/components/ui/test-run.d.ts.map +1 -1
  370. package/dist/components/ui/test-run.js +9 -5
  371. package/dist/{devices-WWMXIIHI.cjs → devices-FVXAGKVX.cjs} +17 -15
  372. package/dist/{embeddable-chat-IJHCGQ24.cjs → embeddable-chat-SNYQSMS7.cjs} +79 -77
  373. package/dist/index.cjs +24 -31
  374. package/dist/{knowledge-JZP4RIXB.cjs → knowledge-ZL3ZHBSL.cjs} +17 -15
  375. package/dist/{logs-WIRYFNUC.cjs → logs-KQCWDIOB.cjs} +24 -22
  376. package/dist/{policies-X7OJYA7G.cjs → policies-ARDCZ3CT.cjs} +20 -18
  377. package/dist/{remote-session-IYT4LWJC.cjs → remote-session-ZKP2W3IS.cjs} +9 -7
  378. package/dist/{scripts-GRMT2NGW.cjs → scripts-ZAMVWCY4.cjs} +23 -21
  379. package/dist/{software-update-G3QOB7RT.cjs → software-update-6F7BIYS3.cjs} +20 -18
  380. package/dist/{tickets-board-4MT6ZB4F.cjs → tickets-board-BNW4AYFL.cjs} +11 -10
  381. package/package.json +1 -1
  382. package/src/components/categories-cart.tsx +2 -4
  383. package/src/components/chat/chat-container.tsx +4 -4
  384. package/src/components/chat/chat-context-picker.tsx +3 -2
  385. package/src/components/chat/chat-message-row.tsx +6 -7
  386. package/src/components/chat/chat-message-skeleton.tsx +11 -6
  387. package/src/components/chat/chat-sidebar-skeleton.tsx +4 -3
  388. package/src/components/chat/chat-top-navigation.tsx +4 -4
  389. package/src/components/chat/context-items-list.tsx +9 -3
  390. package/src/components/chat/entity-cards/admin-content-card-grid.tsx +65 -18
  391. package/src/components/chat/entity-cards/admin-content-card.tsx +2 -1
  392. package/src/components/chat/entity-cards/blog-card.tsx +13 -12
  393. package/src/components/chat/entity-cards/campaign-card-admin.tsx +5 -4
  394. package/src/components/chat/entity-cards/case-study-card.tsx +19 -18
  395. package/src/components/chat/entity-cards/chat-ticket-item.tsx +5 -5
  396. package/src/components/chat/entity-cards/customer-interview-card.tsx +15 -14
  397. package/src/components/chat/entity-cards/data-room-doc-card.tsx +7 -6
  398. package/src/components/chat/entity-cards/design-doc-card.tsx +0 -2
  399. package/src/components/chat/entity-cards/generic-entity-card.tsx +8 -7
  400. package/src/components/chat/entity-cards/github-activity-card.tsx +11 -10
  401. package/src/components/chat/entity-cards/hubspot-ticket-card.tsx +16 -15
  402. package/src/components/chat/entity-cards/index.ts +2 -0
  403. package/src/components/chat/entity-cards/investor-update-card.tsx +12 -11
  404. package/src/components/chat/entity-cards/onboarding-guide-card.tsx +21 -22
  405. package/src/components/chat/entity-cards/program-card.tsx +29 -28
  406. package/src/components/chat/entity-cards/roadmap-card.tsx +22 -23
  407. package/src/components/chat/entity-cards/slack-message-card.tsx +12 -11
  408. package/src/components/chat/guide-welcome.tsx +2 -2
  409. package/src/components/chat/mingo-archive-list.tsx +2 -1
  410. package/src/components/chat/mingo-chat-history.tsx +18 -9
  411. package/src/components/chat/mingo-chat-rail.tsx +2 -1
  412. package/src/components/chat/mingo-info-card.tsx +6 -5
  413. package/src/components/chat/mingo-onboarding-card-skeleton.tsx +15 -13
  414. package/src/components/chat/model-display.tsx +4 -4
  415. package/src/components/chat/msp-organization-card-skeleton.tsx +5 -5
  416. package/src/components/chat/quick-action-chip.tsx +17 -14
  417. package/src/components/chat/utils/compact-card-classes.ts +4 -5
  418. package/src/components/content-loading-container.tsx +7 -8
  419. package/src/components/docs/doc-viewer.tsx +3 -2
  420. package/src/components/docs/skeletons.tsx +64 -63
  421. package/src/components/embeds/embed-iframe.tsx +16 -9
  422. package/src/components/embeds/index.ts +2 -2
  423. package/src/components/embeds/linkedin-embed-client.tsx +7 -6
  424. package/src/components/embeds/markdown-image.tsx +5 -3
  425. package/src/components/embeds/og-link-preview.tsx +162 -79
  426. package/src/components/embeds/reddit-embed-client.tsx +10 -9
  427. package/src/components/embeds/twitter-embed-client.tsx +10 -9
  428. package/src/components/faq/faq-section.tsx +13 -6
  429. package/src/components/features/board/ticket-card-skeleton.tsx +8 -8
  430. package/src/components/features/capability-explorer.tsx +61 -30
  431. package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +9 -3
  432. package/src/components/features/devices/device-selector/device-selector.tsx +2 -0
  433. package/src/components/features/devices/device-selector/device-selector.types.ts +2 -0
  434. package/src/components/features/devices/devices-grid.tsx +4 -1
  435. package/src/components/features/devices/devices-panel-view.tsx +9 -1
  436. package/src/components/features/devices/devices-table-columns.tsx +4 -0
  437. package/src/components/features/logs/logs-table-view.tsx +4 -2
  438. package/src/components/features/model-token-rates.tsx +27 -24
  439. package/src/components/features/notifications/index.ts +2 -2
  440. package/src/components/features/notifications/notification-drawer.tsx +7 -10
  441. package/src/components/features/notifications/notification-tile.tsx +57 -0
  442. package/src/components/features/policies/policy-summary-cards.tsx +2 -2
  443. package/src/components/features/push-button-selector.tsx +20 -11
  444. package/src/components/features/remote-session/remote-desktop-view.tsx +26 -16
  445. package/src/components/features/waitlist-form.tsx +6 -5
  446. package/src/components/help-center-pages/download-apps-page.tsx +3 -2
  447. package/src/components/help-center-pages/trust-center-page.tsx +6 -2
  448. package/src/components/help-center-pages/trust-center-sections.tsx +9 -3
  449. package/src/components/index.ts +0 -2
  450. package/src/components/layout/title-block.tsx +17 -15
  451. package/src/components/loading/card-skeleton.tsx +14 -46
  452. package/src/components/loading/category-card-skeleton.tsx +2 -4
  453. package/src/components/loading/category-vendor-selector-skeleton.tsx +12 -5
  454. package/src/components/loading/device-card-skeleton.tsx +58 -51
  455. package/src/components/loading/index.ts +5 -19
  456. package/src/components/loading/loading-region.tsx +60 -0
  457. package/src/components/loading/margin-report-skeleton.tsx +45 -34
  458. package/src/components/loading/msp-profile-form-skeleton.tsx +9 -6
  459. package/src/components/loading/organization-card-skeleton.tsx +8 -6
  460. package/src/components/loading/organization-icon-skeleton.tsx +3 -2
  461. package/src/components/loading/page-layout-skeleton.tsx +162 -133
  462. package/src/components/loading/settings-form-skeleton.tsx +52 -0
  463. package/src/components/loading/unified-skeleton.tsx +26 -71
  464. package/src/components/loading/wizard-layout-skeleton.tsx +6 -3
  465. package/src/components/media-carousel.tsx +2 -1
  466. package/src/components/meeting-scheduler/booking-form.tsx +10 -7
  467. package/src/components/meeting-scheduler/context-panel.tsx +8 -7
  468. package/src/components/meeting-scheduler/directory.tsx +10 -9
  469. package/src/components/meeting-scheduler/index.tsx +5 -4
  470. package/src/components/meeting-scheduler/modal-header.tsx +8 -7
  471. package/src/components/meeting-scheduler/slot-picker.tsx +4 -3
  472. package/src/components/navigation/app-header.tsx +8 -7
  473. package/src/components/navigation/multi-level-navigation.tsx +3 -2
  474. package/src/components/navigation/navigation-sidebar-item.tsx +3 -2
  475. package/src/components/onboarding-guides/onboarding-guides-catalog-skeleton.tsx +17 -10
  476. package/src/components/product-demo/product-screen.tsx +4 -4
  477. package/src/components/profile/ProfileLoadingSkeleton.tsx +13 -9
  478. package/src/components/related-content/related-content-section.tsx +5 -4
  479. package/src/components/shared/delivery/delivery-table.tsx +8 -7
  480. package/src/components/shared/detail-page-skeleton.tsx +22 -14
  481. package/src/components/shared/dev-section/dev-card-row.tsx +23 -10
  482. package/src/components/shared/legal-document/legal-document-page.tsx +8 -7
  483. package/src/components/shared/onboarding/onboarding-step-card.tsx +3 -2
  484. package/src/components/shared/onboarding/onboarding-walkthrough.tsx +2 -1
  485. package/src/components/shared/product-release/index.ts +0 -1
  486. package/src/components/shared/product-release/product-release-card-skeleton.tsx +23 -25
  487. package/src/components/shared/product-release/product-releases-view.tsx +3 -2
  488. package/src/components/shared/roadmap/roadmap-grid-skeleton.tsx +14 -56
  489. package/src/components/tickets/help-center-create-form.tsx +23 -12
  490. package/src/components/tickets/ticket-center.tsx +17 -11
  491. package/src/components/tickets/ticket-detail-drawer.tsx +3 -2
  492. package/src/components/ui/admin-form-drawer.tsx +7 -7
  493. package/src/components/ui/admin-form-modal.tsx +9 -8
  494. package/src/components/ui/analyzing-state.tsx +5 -8
  495. package/src/components/ui/content-loader.tsx +31 -23
  496. package/src/components/ui/dashboard-info-card.tsx +81 -20
  497. package/src/components/ui/data-attribution.tsx +18 -0
  498. package/src/components/ui/data-table/data-table-body.tsx +9 -2
  499. package/src/components/ui/data-table/data-table-infinite-footer.tsx +4 -2
  500. package/src/components/ui/data-table/data-table-skeleton.tsx +8 -5
  501. package/src/components/ui/feature-card.tsx +27 -11
  502. package/src/components/ui/file-manager/file-manager-skeleton.tsx +30 -22
  503. package/src/components/ui/file-manager/file-manager-table.tsx +10 -10
  504. package/src/components/ui/filter-modal.tsx +5 -5
  505. package/src/components/ui/filter-pill-row.tsx +19 -0
  506. package/src/components/ui/index.ts +0 -1
  507. package/src/components/ui/layout-hold.tsx +30 -38
  508. package/src/components/ui/markdown/base-components.tsx +1 -1
  509. package/src/components/ui/page-actions.tsx +10 -8
  510. package/src/components/ui/photo-wall.tsx +4 -7
  511. package/src/components/ui/query-report-table/query-report-table-skeleton.tsx +13 -7
  512. package/src/components/ui/query-report-table/query-report-table.tsx +2 -0
  513. package/src/components/ui/query-report-table/types.ts +4 -0
  514. package/src/components/ui/skeleton-surface.ts +6 -0
  515. package/src/components/ui/table/table-skeleton.tsx +11 -13
  516. package/src/components/ui/test-run.tsx +30 -22
  517. package/src/styles/ods-colors.css +2 -2
  518. package/dist/chunk-5M5C6UV4.cjs +0 -125
  519. package/dist/components/dynamic-skeleton.d.ts +0 -108
  520. package/dist/components/dynamic-skeleton.d.ts.map +0 -1
  521. package/dist/components/dynamic-skeleton.js +0 -221
  522. package/dist/components/loading/content-skeleton.d.ts +0 -73
  523. package/dist/components/loading/content-skeleton.d.ts.map +0 -1
  524. package/dist/components/loading/content-skeleton.js +0 -217
  525. package/dist/components/loading/users-grid-skeleton.d.ts +0 -7
  526. package/dist/components/loading/users-grid-skeleton.d.ts.map +0 -1
  527. package/dist/components/loading/users-grid-skeleton.js +0 -13
  528. package/dist/components/shared/product-release/release-detail-skeleton.d.ts +0 -2
  529. package/dist/components/shared/product-release/release-detail-skeleton.d.ts.map +0 -1
  530. package/dist/components/shared/product-release/release-detail-skeleton.js +0 -9
  531. package/dist/components/skeleton.d.ts +0 -4
  532. package/dist/components/skeleton.d.ts.map +0 -1
  533. package/dist/components/skeleton.js +0 -9
  534. package/dist/components/ui/skeleton.d.ts +0 -44
  535. package/dist/components/ui/skeleton.d.ts.map +0 -1
  536. package/dist/components/ui/skeleton.js +0 -103
  537. package/dist/components/vendor-page-skeleton.d.ts +0 -2
  538. package/dist/components/vendor-page-skeleton.d.ts.map +0 -1
  539. package/dist/components/vendor-page-skeleton.js +0 -9
  540. package/src/components/dynamic-skeleton.tsx +0 -365
  541. package/src/components/loading/content-skeleton.tsx +0 -374
  542. package/src/components/loading/users-grid-skeleton.tsx +0 -36
  543. package/src/components/shared/product-release/release-detail-skeleton.tsx +0 -7
  544. package/src/components/skeleton.tsx +0 -8
  545. package/src/components/ui/skeleton.tsx +0 -173
  546. package/src/components/vendor-page-skeleton.tsx +0 -7
@@ -4,6 +4,7 @@ import { cloneElement, memo, type ReactElement, type ReactNode, type MouseEvent
4
4
  import Link from '../../embed-shims/next-link';
5
5
  import type { NavigationSidebarItem } from '../../types/navigation';
6
6
  import { cn } from '../../utils';
7
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
7
8
  import { NavigationItemBadge } from './navigation-item-badge';
8
9
  import { UnreadDot } from './unread-dot';
9
10
 
@@ -164,9 +165,9 @@ export function NavigationSidebarItemSkeleton({ showLabel }: { showLabel: boolea
164
165
  return (
165
166
  <div className="flex h-14 w-full items-center justify-start p-[var(--spacing-system-m)]" aria-hidden="true">
166
167
  <div className="relative flex flex-shrink-0 items-center justify-center">
167
- <div className="h-6 w-6 animate-pulse rounded bg-ods-border" />
168
+ <UnifiedSkeleton className="h-6 w-6 rounded" />
168
169
  </div>
169
- {showLabel && <div className="ml-[var(--spacing-system-xs)] h-4 flex-1 animate-pulse rounded bg-ods-border" />}
170
+ {showLabel && <UnifiedSkeleton className="ml-[var(--spacing-system-xs)] h-4 flex-1 rounded" />}
170
171
  </div>
171
172
  );
172
173
  }
@@ -1,6 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { OnboardingGuideCardSkeleton } from '../chat/entity-cards/onboarding-guide-card';
4
+ import { LoadingRegion } from '../loading/loading-region';
5
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
4
6
 
5
7
  /**
6
8
  * Loading skeleton for `/onboarding-guides` — CHROME-LESS, exactly like the
@@ -17,28 +19,33 @@ import { OnboardingGuideCardSkeleton } from '../chat/entity-cards/onboarding-gui
17
19
  * Wrapper mirrors the loaded view's `w-full flex flex-col gap-10`; per-card
18
20
  * height matches the loaded catalog card so resolve shifts are zero.
19
21
  */
20
- export function OnboardingGuidesCatalogSkeleton() {
22
+ export function OnboardingGuidesCatalogSkeleton({
23
+ region = true,
24
+ }: {
25
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
26
+ region?: boolean;
27
+ } = {}) {
21
28
  return (
22
- <div className="flex w-full animate-pulse flex-col gap-10">
29
+ <LoadingRegion label="Loading onboarding guides" announce={region} className="flex w-full flex-col gap-10">
23
30
  {/* Search input placeholder — matches `<SearchInput>` h-12 — plus the
24
31
  section pill row (~74 px incl. padding), same as the loaded
25
32
  preControls block. */}
26
33
  <div className="space-y-4">
27
- <div className="h-12 w-full rounded-md border border-ods-border bg-ods-card" />
34
+ <UnifiedSkeleton className="h-12 w-full rounded-md" />
28
35
  <div className="flex flex-wrap items-center gap-3 rounded-lg border border-ods-border bg-ods-card p-4">
29
- <div className="h-4 w-14 rounded bg-ods-border/60" />
36
+ <UnifiedSkeleton className="h-4 w-14 rounded" />
30
37
  {[0, 1, 2, 3].map(i => (
31
- <div key={i} className="h-10 w-24 rounded-md border border-ods-border bg-ods-card" />
38
+ <UnifiedSkeleton key={i} className="h-10 w-24 rounded-md" />
32
39
  ))}
33
40
  </div>
34
41
  </div>
35
42
  <div className="space-y-10">
36
43
  {[4, 3, 3].map((cardCount, sectionIdx) => (
37
44
  <section key={sectionIdx} className="space-y-4">
38
- <h2 className="flex items-center gap-2 tracking-[-0.36px] text-ods-text-primary text-h3">
39
- <span className="h-6 w-40 rounded bg-ods-border/70" />
40
- <span className="h-5 w-8 rounded-full bg-ods-text-secondary/20" />
41
- </h2>
45
+ <div className="flex items-center gap-2 tracking-[-0.36px] text-ods-text-primary text-h3">
46
+ <UnifiedSkeleton className="h-6 w-40 rounded" />
47
+ <UnifiedSkeleton className="h-5 w-8 rounded-full" />
48
+ </div>
42
49
  <ul className="flex flex-col gap-4">
43
50
  {Array.from({ length: cardCount }).map((_, cardIdx) => (
44
51
  <li key={cardIdx}>
@@ -49,6 +56,6 @@ export function OnboardingGuidesCatalogSkeleton() {
49
56
  </section>
50
57
  ))}
51
58
  </div>
52
- </div>
59
+ </LoadingRegion>
53
60
  );
54
61
  }
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { lazy, type LazyExoticComponent, Suspense } from 'react';
4
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
4
5
  import { ProductScreenFrame, type ProductScreenFrameProps } from '../ui/product-screen-frame';
5
- import { Skeleton } from '../ui/skeleton';
6
6
  import { PRODUCT_SCREEN_LOADERS } from './registry';
7
7
  import { PRODUCT_SCREEN_KEYS, PRODUCT_SCREEN_LABELS, type ProductScreenKey } from './screen-keys';
8
8
  import type { ProductScreenComponent } from './types';
@@ -59,9 +59,9 @@ export function ProductScreenSkeleton({
59
59
  className,
60
60
  }: Pick<ProductScreenProps, 'compact' | 'height' | 'className'>) {
61
61
  return (
62
- <Skeleton
62
+ <UnifiedSkeleton
63
63
  className={className}
64
- style={{ height: height ?? (compact ? PRODUCT_SCREEN_COMPACT_HEIGHT : PRODUCT_SCREEN_HEIGHT) }}
64
+ height={height ?? (compact ? PRODUCT_SCREEN_COMPACT_HEIGHT : PRODUCT_SCREEN_HEIGHT)}
65
65
  />
66
66
  );
67
67
  }
@@ -88,7 +88,7 @@ export function ProductScreen({ screen, compact = false, label, height, designWi
88
88
  label={label ?? PRODUCT_SCREEN_LABELS[screen]}
89
89
  height={frameHeight}
90
90
  >
91
- <Suspense fallback={<Skeleton className="h-full w-full" />}>
91
+ <Suspense fallback={<UnifiedSkeleton className="h-full w-full" />}>
92
92
  <Screen compact={compact} />
93
93
  </Suspense>
94
94
  </ProductScreenFrame>
@@ -1,27 +1,31 @@
1
1
  import { cn } from '../../utils/cn';
2
+ import { LoadingRegion } from '../loading/loading-region';
3
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
2
4
 
3
5
  interface ProfileLoadingSkeletonProps {
6
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
7
+ region?: boolean;
4
8
  className?: string;
5
9
  }
6
10
 
7
- export function ProfileLoadingSkeleton({ className }: ProfileLoadingSkeletonProps) {
11
+ export function ProfileLoadingSkeleton({ region = true, className }: ProfileLoadingSkeletonProps) {
8
12
  return (
9
- <div className={cn('space-y-6', className)}>
13
+ <LoadingRegion label="Loading the profile" announce={region} className={cn('space-y-6', className)}>
10
14
  {/* Header skeleton */}
11
15
  <div className="flex items-center space-x-4">
12
- <div className="h-16 w-16 animate-pulse rounded-full bg-ods-skeleton" />
16
+ <UnifiedSkeleton className="h-16 w-16 rounded-full" />
13
17
  <div className="space-y-2">
14
- <div className="h-4 w-32 animate-pulse rounded bg-ods-skeleton" />
15
- <div className="h-3 w-24 animate-pulse rounded bg-ods-skeleton" />
18
+ <UnifiedSkeleton className="h-4 w-32 rounded" />
19
+ <UnifiedSkeleton className="h-3 w-24 rounded" />
16
20
  </div>
17
21
  </div>
18
22
 
19
23
  {/* Content skeleton */}
20
24
  <div className="space-y-4">
21
- <div className="h-4 w-full animate-pulse rounded bg-ods-skeleton" />
22
- <div className="h-4 w-3/4 animate-pulse rounded bg-ods-skeleton" />
23
- <div className="h-4 w-1/2 animate-pulse rounded bg-ods-skeleton" />
25
+ <UnifiedSkeleton className="h-4 w-full rounded" />
26
+ <UnifiedSkeleton className="h-4 w-3/4 rounded" />
27
+ <UnifiedSkeleton className="h-4 w-1/2 rounded" />
24
28
  </div>
25
- </div>
29
+ </LoadingRegion>
26
30
  );
27
31
  }
@@ -66,6 +66,7 @@ import { buildSuggestionUrl } from '../../utils/suggestion-url';
66
66
  import type { ChatCardDispatchExtras } from '../chat/entity-cards/dispatch';
67
67
  import { decideNewTab } from '../chat/utils/decide-new-tab';
68
68
  import { accentSentenceMarks } from '../layout/page-heading';
69
+ import { LoadingRegion } from '../loading/loading-region';
69
70
  import { Pagination } from '../pagination';
70
71
  // The per-type card dispatch — one registry entry per content type, each
71
72
  // carrying its OWN row type — plus the DEEP card imports that keep this
@@ -361,7 +362,7 @@ function ContentGroup({
361
362
  <div key={r.id}>{renderSkeletonForType(type, cardSize, adminCampaignCard)}</div>
362
363
  ));
363
364
  return (
364
- <div className="space-y-4">
365
+ <LoadingRegion label="Loading related content" className="space-y-4">
365
366
  {heading}
366
367
  {isListLayout ? (
367
368
  <div className="space-y-4">{skeletons}</div>
@@ -369,7 +370,7 @@ function ContentGroup({
369
370
  <div className={gridClassFor(columns)}>{skeletons}</div>
370
371
  )}
371
372
  {groupPagination}
372
- </div>
373
+ </LoadingRegion>
373
374
  );
374
375
  }
375
376
 
@@ -652,14 +653,14 @@ export function RelatedContentSection({
652
653
  if (isLoading) {
653
654
  const skeletonType = includeTypes?.[0] ?? entityType ?? 'blog_post_existing';
654
655
  return (
655
- <div className="space-y-8">
656
+ <LoadingRegion label="Loading related content" className="space-y-8">
656
657
  <h2 className="text-ods-text-primary text-h2">{accentSentenceMarks(title)}</h2>
657
658
  <div className={gridClassFor(columns)}>
658
659
  {Array.from({ length: 3 }).map((_, i) => (
659
660
  <div key={i}>{renderSkeletonForType(skeletonType, 'default', adminCampaignCard)}</div>
660
661
  ))}
661
662
  </div>
662
- </div>
663
+ </LoadingRegion>
663
664
  );
664
665
  }
665
666
  return (
@@ -20,6 +20,7 @@
20
20
  import type { DeliveryItem } from '../../../types/delivery';
21
21
  import { devSectionAnchorId } from '../../../utils/dev-sections/dev-section-param-keys';
22
22
  import { CONTENT_CARD_SKELETON_FRAME_CLASS } from '../../chat/entity-cards/content-card-frame';
23
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
23
24
  import { DeliveryRow } from './delivery-row';
24
25
 
25
26
  interface DeliveryTableProps {
@@ -38,26 +39,26 @@ function SkeletonRow() {
38
39
  <div className="flex w-full min-w-0 flex-1 flex-col gap-[12px] content-md:w-auto content-md:gap-[16px]">
39
40
  {/* Title skeleton - responsive */}
40
41
  <div className="flex min-h-[24px] items-center">
41
- <div className="h-[20px] w-full animate-pulse rounded bg-ods-border"></div>
42
+ <UnifiedSkeleton className="h-[20px] w-full rounded" />
42
43
  </div>
43
44
  {/* Subtitle skeleton - 1 line */}
44
45
  <div className="flex min-h-[20px] items-center">
45
- <div className="h-[20px] w-1/2 animate-pulse rounded bg-ods-border"></div>
46
+ <UnifiedSkeleton className="h-[20px] w-1/2 rounded" />
46
47
  </div>
47
48
  {/* Description skeleton - 3 lines */}
48
49
  <div className="flex min-h-[72px] items-center">
49
50
  <div className="flex-1 space-y-1">
50
- <div className="h-[20px] w-full animate-pulse rounded bg-ods-border"></div>
51
- <div className="h-[20px] w-full animate-pulse rounded bg-ods-border"></div>
52
- <div className="h-[20px] w-2/3 animate-pulse rounded bg-ods-border"></div>
51
+ <UnifiedSkeleton className="h-[20px] w-full rounded" />
52
+ <UnifiedSkeleton className="h-[20px] w-full rounded" />
53
+ <UnifiedSkeleton className="h-[20px] w-2/3 rounded" />
53
54
  </div>
54
55
  </div>
55
56
  </div>
56
57
 
57
58
  {/* Right: Badge skeleton - two stacked badges */}
58
59
  <div className="flex flex-shrink-0 flex-col gap-2 self-start">
59
- <div className="h-[32px] w-[100px] animate-pulse rounded bg-ods-border"></div>
60
- <div className="h-[32px] w-[120px] animate-pulse rounded bg-ods-border"></div>
60
+ <UnifiedSkeleton className="h-[32px] w-[100px] rounded" />
61
+ <UnifiedSkeleton className="h-[32px] w-[120px] rounded" />
61
62
  </div>
62
63
  </div>
63
64
  </div>
@@ -1,6 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { PageLayout } from '../layout/page-layout';
4
+ import { LoadingRegion } from '../loading/loading-region';
5
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
4
6
 
5
7
  export interface DetailPageSkeletonProps {
6
8
  metadataColumns?: number; // Number of metadata grid columns (default 4)
@@ -10,25 +12,31 @@ export interface DetailPageSkeletonProps {
10
12
  * matches the loaded page's width, padding, and min-height. Default false
11
13
  * (self-contained `<PageLayout>` at the hub article width). */
12
14
  bare?: boolean;
15
+ /** What is loading, read once by a screen reader. Default "Loading". */
16
+ label?: string;
17
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
18
+ region?: boolean;
13
19
  }
14
20
 
15
21
  export function DetailPageSkeleton({
16
22
  metadataColumns = 4,
17
23
  showImageGallery = true,
18
24
  bare = false,
25
+ label = 'Loading',
26
+ region = true,
19
27
  }: DetailPageSkeletonProps = {}) {
20
28
  const content = (
21
- <div className="animate-pulse space-y-6 content-md:space-y-10">
29
+ <LoadingRegion label={label} announce={region} className="space-y-6 content-md:space-y-10">
22
30
  {/* Title Block */}
23
31
  <div className="flex w-full flex-col gap-6">
24
- <div className="h-16 w-full max-w-3xl rounded bg-ods-card content-md:h-20"></div>
32
+ <UnifiedSkeleton className="h-16 w-full max-w-3xl rounded content-md:h-20" />
25
33
  </div>
26
34
 
27
35
  {/* Category Tags Skeleton */}
28
36
  <div className="flex w-full flex-wrap gap-2">
29
- <div className="h-8 w-32 rounded bg-ods-card"></div>
30
- <div className="h-8 w-28 rounded bg-ods-card"></div>
31
- <div className="h-8 w-36 rounded bg-ods-card"></div>
37
+ <UnifiedSkeleton className="h-8 w-32 rounded" />
38
+ <UnifiedSkeleton className="h-8 w-28 rounded" />
39
+ <UnifiedSkeleton className="h-8 w-36 rounded" />
32
40
  </div>
33
41
 
34
42
  {/* Metadata Grid Skeleton */}
@@ -40,8 +48,8 @@ export function DetailPageSkeleton({
40
48
  key={i}
41
49
  className="border-b border-ods-border bg-ods-card p-4 last:border-r-0 content-md:border-b-0 content-md:border-r"
42
50
  >
43
- <div className="mb-2 h-6 w-24 rounded bg-ods-border"></div>
44
- <div className="h-5 w-20 rounded bg-ods-border"></div>
51
+ <UnifiedSkeleton className="mb-2 h-6 w-24 rounded" />
52
+ <UnifiedSkeleton className="h-5 w-20 rounded" />
45
53
  </div>
46
54
  ))}
47
55
  </div>
@@ -50,26 +58,26 @@ export function DetailPageSkeleton({
50
58
  {showImageGallery && (
51
59
  <div className="flex w-full gap-6 overflow-x-auto">
52
60
  {[1, 2, 3, 4, 5].map(i => (
53
- <div key={i} className="h-[200px] w-[240px] shrink-0 rounded-md border border-ods-border bg-ods-card"></div>
61
+ <UnifiedSkeleton key={i} className="h-[200px] w-[240px] shrink-0 rounded-md border border-ods-border" />
54
62
  ))}
55
63
  </div>
56
64
  )}
57
65
 
58
66
  {/* Featured Image Skeleton (for case studies) */}
59
- {!showImageGallery && <div className="aspect-[2560/1366] w-full rounded-md bg-ods-card"></div>}
67
+ {!showImageGallery && <UnifiedSkeleton className="aspect-[2560/1366] w-full rounded-md" />}
60
68
 
61
69
  {/* Content Sections Skeleton */}
62
70
  {[1, 2, 3].map(section => (
63
71
  <div key={section} className="space-y-6">
64
- <div className="h-16 w-64 rounded bg-ods-card"></div>
72
+ <UnifiedSkeleton className="h-16 w-64 rounded" />
65
73
  <div className="space-y-3">
66
- <div className="h-6 w-full rounded bg-ods-card"></div>
67
- <div className="h-6 w-full rounded bg-ods-card"></div>
68
- <div className="h-6 w-4/5 rounded bg-ods-card"></div>
74
+ <UnifiedSkeleton className="h-6 w-full rounded" />
75
+ <UnifiedSkeleton className="h-6 w-full rounded" />
76
+ <UnifiedSkeleton className="h-6 w-4/5 rounded" />
69
77
  </div>
70
78
  </div>
71
79
  ))}
72
- </div>
80
+ </LoadingRegion>
73
81
  );
74
82
  if (bare) return content;
75
83
  return (
@@ -26,6 +26,8 @@
26
26
  */
27
27
 
28
28
  import type { ReactNode } from 'react';
29
+ import { LoadingRegion } from '../../loading/loading-region';
30
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
29
31
 
30
32
  export interface DevCardRowContentProps {
31
33
  title: string;
@@ -78,22 +80,22 @@ export function DevCardRowSkeleton() {
78
80
  <div className="flex w-full flex-col items-start justify-between gap-[12px] content-md:flex-row content-md:gap-[16px]">
79
81
  <div className="flex w-full min-w-0 flex-1 flex-col gap-[12px] content-md:w-auto content-md:gap-[16px]">
80
82
  <div className="flex min-h-[24px] items-center">
81
- <div className="h-[20px] w-full animate-pulse rounded bg-ods-border" />
83
+ <UnifiedSkeleton className="h-[20px] w-full rounded" />
82
84
  </div>
83
85
  <div className="flex min-h-[20px] items-center">
84
- <div className="h-[20px] w-1/2 animate-pulse rounded bg-ods-border" />
86
+ <UnifiedSkeleton className="h-[20px] w-1/2 rounded" />
85
87
  </div>
86
88
  <div className="flex min-h-[72px] items-center">
87
89
  <div className="flex-1 space-y-1">
88
- <div className="h-[20px] w-full animate-pulse rounded bg-ods-border" />
89
- <div className="h-[20px] w-full animate-pulse rounded bg-ods-border" />
90
- <div className="h-[20px] w-2/3 animate-pulse rounded bg-ods-border" />
90
+ <UnifiedSkeleton className="h-[20px] w-full rounded" />
91
+ <UnifiedSkeleton className="h-[20px] w-full rounded" />
92
+ <UnifiedSkeleton className="h-[20px] w-2/3 rounded" />
91
93
  </div>
92
94
  </div>
93
95
  </div>
94
96
  <div className="flex flex-shrink-0 flex-col gap-2 self-start">
95
- <div className="h-[32px] w-[100px] animate-pulse rounded bg-ods-border" />
96
- <div className="h-[32px] w-[120px] animate-pulse rounded bg-ods-border" />
97
+ <UnifiedSkeleton className="h-[32px] w-[100px] rounded" />
98
+ <UnifiedSkeleton className="h-[32px] w-[120px] rounded" />
97
99
  </div>
98
100
  </div>
99
101
  </div>
@@ -105,12 +107,23 @@ export function DevCardRowSkeleton() {
105
107
  * used by every list shell. Both delivery (`delivery-table.tsx`) and
106
108
  * tickets (`tickets-list.tsx`) mount this directly.
107
109
  */
108
- export function DevCardRowSkeletonList({ rows = 5 }: { rows?: number }) {
110
+ export function DevCardRowSkeletonList({
111
+ region = true,
112
+ rows = 5,
113
+ }: {
114
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
115
+ region?: boolean;
116
+ rows?: number;
117
+ }) {
109
118
  return (
110
- <div className="w-full overflow-hidden rounded-[6px] border border-ods-border bg-ods-card">
119
+ <LoadingRegion
120
+ label="Loading"
121
+ announce={region}
122
+ className="w-full overflow-hidden rounded-[6px] border border-ods-border bg-ods-card"
123
+ >
111
124
  {Array.from({ length: rows }, (_, i) => (
112
125
  <DevCardRowSkeleton key={i} />
113
126
  ))}
114
- </div>
127
+ </LoadingRegion>
115
128
  );
116
129
  }
@@ -22,6 +22,7 @@ import Link from '../../../embed-shims/next-link';
22
22
  import { useRouter } from '../../../embed-shims/next-navigation';
23
23
  import { formatLegalDate } from '../../../utils/format';
24
24
  import { FaqSection, pageFaqProps, type PageFaqSlot } from '../../faq/faq-section';
25
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
25
26
  import { PageShell, PageLayout } from '../../ui';
26
27
  import { RichMarkdownRenderer } from '../../ui/markdown';
27
28
  import { useLegalDocs, type LegalDocument } from './use-legal-docs';
@@ -161,16 +162,16 @@ export function LegalDocumentPage({
161
162
  {isLoading ? (
162
163
  // Loading skeleton matching Knowledge Hub pattern
163
164
  <div className="space-y-6">
164
- <div className="h-10 w-3/4 animate-pulse rounded-lg bg-ods-skeleton"></div>
165
+ <UnifiedSkeleton className="h-10 w-3/4 rounded-lg" />
165
166
  <div className="space-y-4">
166
- <div className="h-4 w-full animate-pulse rounded bg-ods-skeleton"></div>
167
- <div className="h-4 w-full animate-pulse rounded bg-ods-skeleton"></div>
168
- <div className="h-4 w-5/6 animate-pulse rounded bg-ods-skeleton"></div>
167
+ <UnifiedSkeleton className="h-4 w-full rounded" />
168
+ <UnifiedSkeleton className="h-4 w-full rounded" />
169
+ <UnifiedSkeleton className="h-4 w-5/6 rounded" />
169
170
  </div>
170
- <div className="h-32 animate-pulse rounded-lg border border-ods-border bg-ods-card"></div>
171
+ <UnifiedSkeleton className="h-32 rounded-lg border border-ods-border" />
171
172
  <div className="space-y-4">
172
- <div className="h-4 w-full animate-pulse rounded bg-ods-skeleton"></div>
173
- <div className="h-4 w-4/5 animate-pulse rounded bg-ods-skeleton"></div>
173
+ <UnifiedSkeleton className="h-4 w-full rounded" />
174
+ <UnifiedSkeleton className="h-4 w-4/5 rounded" />
174
175
  </div>
175
176
  </div>
176
177
  ) : error ? (
@@ -2,6 +2,7 @@
2
2
 
3
3
  import React from 'react';
4
4
  import { cn } from '../../../utils/cn';
5
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
5
6
  import { Button } from '../../ui/button';
6
7
  import { InteractiveCard } from '../../ui/interactive-card';
7
8
  import { StatusBadge } from '../../ui/status-badge';
@@ -81,8 +82,8 @@ export function OnboardingStepCard({
81
82
  >
82
83
  {isCheckingCompletion ? (
83
84
  <>
84
- <div className="h-[32px] w-[100px] animate-pulse rounded-[6px] bg-ods-border" />
85
- <div className="h-[32px] w-[120px] animate-pulse rounded-[6px] bg-ods-border" />
85
+ <UnifiedSkeleton className="h-[32px] w-[100px] rounded-[6px]" />
86
+ <UnifiedSkeleton className="h-[32px] w-[120px] rounded-[6px]" />
86
87
  </>
87
88
  ) : isCompleted ? (
88
89
  <>
@@ -4,6 +4,7 @@ import React, { useRef, useCallback } from 'react';
4
4
  import { useOnboardingState, type OnboardingStepConfig } from '../../../hooks/ui/use-onboarding-state';
5
5
  import { cn } from '../../../utils/cn';
6
6
  import { accentSentenceMarks, SECTION_HEADING_CLASS } from '../../layout/page-heading';
7
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
7
8
  import { Button } from '../../ui/button';
8
9
  import { OnboardingStepCard } from './onboarding-step-card';
9
10
 
@@ -194,7 +195,7 @@ export function OnboardingWalkthrough({
194
195
  <h2 className={SECTION_HEADING_CLASS}>{accentSentenceMarks(title)}</h2>
195
196
 
196
197
  {isLoadingCompletion ? (
197
- <div className="h-[48px] w-full animate-pulse rounded-[6px] bg-ods-border md:w-[160px]" />
198
+ <UnifiedSkeleton className="h-[48px] w-full rounded-[6px] md:w-[160px]" />
198
199
  ) : isAllComplete ? (
199
200
  <Button variant="accent" onClick={handleDismiss} className="w-full md:w-auto">
200
201
  Close Onboarding
@@ -28,4 +28,3 @@ export {
28
28
  // keeps resolving (hub's components/releases/release-detail-page.tsx
29
29
  // imports it through this barrel).
30
30
  export type { DeliveryResponse } from '../../../types/delivery';
31
- export { ReleaseDetailSkeleton } from './release-detail-skeleton';
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { cn } from '../../../utils/cn';
4
4
  import { CONTENT_CARD_SKELETON_FRAME_CLASS } from '../../chat/entity-cards/content-card-frame';
5
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
5
6
 
6
7
  export interface ProductReleaseCardSkeletonProps {
7
8
  /** Additional CSS classes */
@@ -23,8 +24,8 @@ export function ProductReleaseCardSkeleton({ className, size = 'lg' }: ProductRe
23
24
  // skeleton's shape matches exactly with zero load-to-resolve reflow.
24
25
  if (size === 'lg') {
25
26
  return (
26
- <div className={cn(CONTENT_CARD_SKELETON_FRAME_CLASS, 'flex flex-col gap-4 p-6', 'animate-pulse', className)}>
27
- {/* HERO: placeholders are `bg-ods-border` bars on the page background.
27
+ <div className={cn(CONTENT_CARD_SKELETON_FRAME_CLASS, 'flex flex-col gap-4 p-6', className)}>
28
+ {/* HERO: placeholders are `UnifiedSkeleton` bars on the page background.
28
29
 
29
30
  CRITICAL: title + summary use the SAME min-h containers as
30
31
  the loaded card so total card height is byte-identical
@@ -32,30 +33,27 @@ export function ProductReleaseCardSkeleton({ className, size = 'lg' }: ProductRe
32
33
  individual placeholder heights underrun the loaded card's
33
34
  min-h reservations and the page jumps on resolve. */}
34
35
  <div className="flex flex-col gap-4 content-md:flex-row content-md:gap-6">
35
- <div className="aspect-[1200/630] w-full flex-shrink-0 rounded-lg bg-ods-border content-md:w-[256px]" />
36
+ <UnifiedSkeleton className="aspect-[1200/630] w-full flex-shrink-0 rounded-lg content-md:w-[256px]" />
36
37
  <div className="flex min-w-0 flex-1 flex-col">
37
38
  {/* Version pill — mirrors `flex items-center gap-3 mb-3` in
38
39
  the loaded card. The loaded `<span text-lg>` renders at
39
40
  line-height 28 px (Tailwind text-lg = 18 px / 28 px LH);
40
41
  placeholder uses `h-7` (28 px) to match exactly. */}
41
42
  <div className="mb-3 flex items-center gap-3">
42
- <div className="h-7 w-20 rounded bg-ods-border" />
43
+ <UnifiedSkeleton className="h-7 w-20 rounded" />
43
44
  </div>
44
45
  {/* Title container — SAME min-h as the loaded card so the
45
46
  card height contributed by this region matches exactly. */}
46
47
  <div className="mb-3 flex min-h-[60px] flex-col justify-start gap-1.5 content-md:min-h-[72px]">
47
- <div className="h-[25px] w-3/4 rounded bg-ods-border content-md:h-[30px]" />
48
- <div className="h-[25px] w-1/2 rounded bg-ods-border content-md:h-[30px]" />
48
+ <UnifiedSkeleton className="h-[25px] w-3/4 rounded content-md:h-[30px]" />
49
+ <UnifiedSkeleton className="h-[25px] w-1/2 rounded content-md:h-[30px]" />
49
50
  </div>
50
51
  {/* Summary container — SAME min-h as the loaded card. The
51
- 3 placeholder lines mirror the rendered 3-line clamp;
52
- `bg-ods-border/70` keeps summary placeholders slightly
53
- dimmer than title placeholders (primary vs secondary
54
- text hierarchy). */}
52
+ 3 placeholder lines mirror the rendered 3-line clamp. */}
55
53
  <div className="flex min-h-[68px] flex-col justify-start gap-2 content-md:min-h-[78px]">
56
- <div className="h-3 w-full rounded bg-ods-border/70" />
57
- <div className="h-3 w-11/12 rounded bg-ods-border/70" />
58
- <div className="h-3 w-5/6 rounded bg-ods-border/70" />
54
+ <UnifiedSkeleton className="h-3 w-full rounded" />
55
+ <UnifiedSkeleton className="h-3 w-11/12 rounded" />
56
+ <UnifiedSkeleton className="h-3 w-5/6 rounded" />
59
57
  </div>
60
58
  </div>
61
59
  </div>
@@ -65,7 +63,7 @@ export function ProductReleaseCardSkeleton({ className, size = 'lg' }: ProductRe
65
63
  line-height (20 px) so total height is consistent with the
66
64
  loaded `border-t pt-3 + text content` (~32-33 px). */}
67
65
  <div className="border-t border-ods-border pt-3">
68
- <div className="h-5 w-2/3 rounded bg-ods-border/70" />
66
+ <UnifiedSkeleton className="h-5 w-2/3 rounded" />
69
67
  </div>
70
68
 
71
69
  {/* METADATA GRID: 4-cell placeholder, the loaded cells' own boxes (no surface of
@@ -77,17 +75,17 @@ export function ProductReleaseCardSkeleton({ className, size = 'lg' }: ProductRe
77
75
  className="flex flex-col gap-3 border-b border-ods-border p-4 content-md:border-b-0 content-md:border-r"
78
76
  >
79
77
  <div className="flex flex-col gap-2">
80
- <div className="h-7 w-24 rounded bg-ods-border" />
81
- <div className="h-4 w-16 rounded bg-ods-border" />
78
+ <UnifiedSkeleton className="h-7 w-24 rounded" />
79
+ <UnifiedSkeleton className="h-4 w-16 rounded" />
82
80
  </div>
83
81
  </div>
84
82
  ))}
85
83
  {/* Author cell */}
86
84
  <div className="flex items-center gap-3 p-4">
87
- <div className="h-10 w-10 shrink-0 rounded-full bg-ods-border" />
85
+ <UnifiedSkeleton className="h-10 w-10 shrink-0 rounded-full" />
88
86
  <div className="flex min-w-0 flex-1 flex-col gap-2">
89
- <div className="h-5 w-3/4 rounded bg-ods-border" />
90
- <div className="h-4 w-1/2 rounded bg-ods-border" />
87
+ <UnifiedSkeleton className="h-5 w-3/4 rounded" />
88
+ <UnifiedSkeleton className="h-4 w-1/2 rounded" />
91
89
  </div>
92
90
  </div>
93
91
  </div>
@@ -107,12 +105,12 @@ export function ProductReleaseCardSkeleton({ className, size = 'lg' }: ProductRe
107
105
  return (
108
106
  <span
109
107
  className={cn(
110
- 'my-1.5 flex w-full animate-pulse items-start gap-3',
108
+ 'my-1.5 flex w-full items-start gap-3',
111
109
  'rounded-lg border border-ods-border bg-ods-card p-2',
112
110
  className,
113
111
  )}
114
112
  >
115
- <span className="block aspect-square h-14 w-14 shrink-0 self-start rounded-md bg-ods-bg" />
113
+ <UnifiedSkeleton as="span" className="block aspect-square h-14 w-14 shrink-0 self-start rounded-md" />
116
114
  {/* Text column: 3 rows with FIXED heights matching the loaded
117
115
  card (h-5 title, h-4 + h-4 meta + summary). Skeleton bars
118
116
  sit centered inside each row container so a placeholder
@@ -120,14 +118,14 @@ export function ProductReleaseCardSkeleton({ className, size = 'lg' }: ProductRe
120
118
  on resolve. */}
121
119
  <span className="flex min-h-14 min-w-0 flex-1 flex-col gap-0.5">
122
120
  <span className="flex h-5 min-w-0 items-center gap-2">
123
- <span className="h-3.5 w-3/5 rounded bg-ods-bg" />
124
- <span className="h-4 w-12 shrink-0 rounded bg-ods-bg/70" />
121
+ <UnifiedSkeleton as="span" className="h-3.5 w-3/5 rounded" />
122
+ <UnifiedSkeleton as="span" className="h-4 w-12 shrink-0 rounded" />
125
123
  </span>
126
124
  <span className="flex h-4 min-w-0 items-center">
127
- <span className="h-3 w-1/3 rounded bg-ods-bg/70" />
125
+ <UnifiedSkeleton as="span" className="h-3 w-1/3 rounded" />
128
126
  </span>
129
127
  <span className="flex h-4 min-w-0 items-center">
130
- <span className="h-3 w-11/12 rounded bg-ods-bg/40" />
128
+ <UnifiedSkeleton as="span" className="h-3 w-11/12 rounded" />
131
129
  </span>
132
130
  </span>
133
131
  </span>
@@ -33,6 +33,7 @@ import { useEntityCardLink } from '../../chat/entity-cards/use-entity-card-link'
33
33
  import { isModifierClick } from '../../chat/utils/chat-nav-resolution';
34
34
  import { executeNavigationImperative } from '../../chat/utils/execute-navigation';
35
35
  import { ListEmptyState } from '../../list-empty-state';
36
+ import { LoadingRegion } from '../../loading/loading-region';
36
37
  import { PersistentPaginationWrapper } from '../../persistent-pagination';
37
38
  import { LoadError } from '../../ui/error-state';
38
39
  import { ProductReleaseCard, type ProductReleaseCardProps } from './product-release-card';
@@ -209,7 +210,7 @@ export function ProductReleasesView({
209
210
  <>
210
211
  {/* ALWAYS render `itemsPerPage` slots — visibility toggles so the
211
212
  list height is stable across loading ↔ loaded. */}
212
- <div className="flex flex-col gap-6">
213
+ <LoadingRegion label="Loading releases" announce={isLoading} className="flex flex-col gap-6">
213
214
  {Array.from({ length: itemsPerPage }).map((_, i) => {
214
215
  const release = releases[i];
215
216
  const hasData = !!release;
@@ -228,7 +229,7 @@ export function ProductReleasesView({
228
229
  </div>
229
230
  );
230
231
  })}
231
- </div>
232
+ </LoadingRegion>
232
233
 
233
234
  {/* Pagination — always present at the bottom for consistent spacing. */}
234
235
  <div className="mt-6 flex justify-center content-md:mt-8">