@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
@@ -6,7 +6,8 @@ import { cn } from '../../utils/cn';
6
6
  import { EntityIcon } from '../icon-display';
7
7
  import { Chevron02RightIcon } from '../icons-v2-generated/arrows/chevron-02-right-icon';
8
8
  import { CheckIcon } from '../icons-v2-generated/signs-and-symbols/check-icon';
9
- import { Skeleton } from '../ui/skeleton';
9
+ import { LoadingRegion } from '../loading/loading-region';
10
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
10
11
  import { SnapCarousel, SnapCarouselControlsSkeleton } from '../ui/snap-carousel';
11
12
  import { TruncateText } from '../ui/truncate-text';
12
13
 
@@ -167,25 +168,28 @@ function Example({
167
168
  );
168
169
  }
169
170
 
170
- /** A text placeholder in its line's own box (`text-h…` on the line), so a placeholder line is the loaded line's height. */
171
- function LineBar({ line, width }: { line: string; width: string }) {
172
- return (
173
- <div className={line}>
174
- <span className={cn('inline-block h-[0.7em] animate-pulse rounded bg-ods-border align-middle', width)} />
175
- </div>
176
- );
177
- }
171
+ /**
172
+ * A text placeholder in its line's own box (`text-h…` on the line, the bar inline in it), so a
173
+ * placeholder line is the loaded line's height.
174
+ */
175
+ const LINE_SKELETON_CLASS = 'inline-block h-[0.7em] rounded align-middle';
178
176
 
179
177
  /** The example's two turns, in the loaded example's own box. */
180
178
  function ExampleSkeleton({ className }: { className?: string }) {
181
179
  const turn = (first: boolean) => (
182
180
  <div className={cn('flex min-w-0 gap-2.5', !first && 'border-t border-ods-border pt-3')}>
183
- <Skeleton className="size-6 shrink-0 rounded-full" />
181
+ <UnifiedSkeleton className="size-6 shrink-0 rounded-full" />
184
182
  <div className="flex min-w-0 flex-1 flex-col gap-1">
185
- <LineBar line="text-h6" width="w-28" />
183
+ <div className="text-h6">
184
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-28')} />
185
+ </div>
186
186
  <div className="min-h-[2lh] text-h4">
187
- <LineBar line="text-h4" width="w-full" />
188
- <LineBar line="text-h4" width="w-2/3" />
187
+ <div className="text-h4">
188
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-full')} />
189
+ </div>
190
+ <div className="text-h4">
191
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-2/3')} />
192
+ </div>
189
193
  </div>
190
194
  </div>
191
195
  </div>
@@ -207,11 +211,15 @@ function ExampleSkeleton({ className }: { className?: string }) {
207
211
  function JobHeadSkeleton() {
208
212
  return (
209
213
  <>
210
- <Skeleton className="size-9 shrink-0 rounded-lg" />
214
+ <UnifiedSkeleton className="size-9 shrink-0 rounded-lg" />
211
215
  <div className="flex min-w-0 flex-1 flex-col">
212
- <LineBar line="text-h4" width="w-32" />
216
+ <div className="text-h4">
217
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-32')} />
218
+ </div>
213
219
  <div className="mt-0.5">
214
- <LineBar line="text-h6" width="w-40" />
220
+ <div className="text-h6">
221
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-40')} />
222
+ </div>
215
223
  </div>
216
224
  </div>
217
225
  </>
@@ -225,9 +233,18 @@ function JobHeadSkeleton() {
225
233
  * first card over the carousel's controls. Every box is the loaded one's, so
226
234
  * nothing moves when the jobs arrive.
227
235
  */
228
- export function CapabilityExplorerSkeleton({ className, count = 8 }: { className?: string; count?: number }) {
236
+ export function CapabilityExplorerSkeleton({
237
+ region = true,
238
+ className,
239
+ count = 8,
240
+ }: {
241
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
242
+ region?: boolean;
243
+ className?: string;
244
+ count?: number;
245
+ }) {
229
246
  return (
230
- <div className={className} aria-hidden>
247
+ <LoadingRegion label="Loading capabilities" announce={region} className={className}>
231
248
  <div className="content-lg:hidden">
232
249
  <div className="flex gap-[var(--spacing-system-sf)] overflow-hidden">
233
250
  <div
@@ -240,10 +257,14 @@ export function CapabilityExplorerSkeleton({ className, count = 8 }: { className
240
257
  <JobHeadSkeleton />
241
258
  </div>
242
259
  <div className="min-h-[3lh] text-h6">
243
- <LineBar line="text-h6" width="w-full" />
244
- <LineBar line="text-h6" width="w-5/6" />
260
+ <div className="text-h6">
261
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-full')} />
262
+ </div>
263
+ <div className="text-h6">
264
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-5/6')} />
265
+ </div>
245
266
  </div>
246
- <Skeleton className="h-[300px] shrink-0 rounded-lg" />
267
+ <UnifiedSkeleton className="h-[300px] shrink-0 rounded-lg" />
247
268
  <ExampleSkeleton className="shrink-0" />
248
269
  </div>
249
270
  </div>
@@ -273,36 +294,46 @@ export function CapabilityExplorerSkeleton({ className, count = 8 }: { className
273
294
  <div className={cn('grid shrink-0 grid-cols-[minmax(0,1fr)_minmax(0,380px)] gap-8', PANEL_TOP_HEIGHT_CLASS)}>
274
295
  <div className="flex min-w-0 flex-col overflow-hidden">
275
296
  <div className="mb-2">
276
- <LineBar line="text-h2" width="w-64" />
297
+ <div className="text-h2">
298
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-64')} />
299
+ </div>
277
300
  </div>
278
301
  <div className="min-h-[3lh] text-h4">
279
- <LineBar line="text-h4" width="w-full" />
280
- <LineBar line="text-h4" width="w-4/5" />
302
+ <div className="text-h4">
303
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-full')} />
304
+ </div>
305
+ <div className="text-h4">
306
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-4/5')} />
307
+ </div>
281
308
  </div>
282
309
  <div className="mt-auto grid grid-cols-1 gap-2">
283
310
  {[0, 1, 2].map(i => (
284
311
  <div key={i} className="flex min-w-0 items-center gap-2.5">
285
- <Skeleton className="size-4 shrink-0 rounded-full" />
286
- <LineBar line="text-h6" width={i === 1 ? 'w-56' : 'w-48'} />
312
+ <UnifiedSkeleton className="size-4 shrink-0 rounded-full" />
313
+ <div className="text-h6">
314
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, i === 1 ? 'w-56' : 'w-48')} />
315
+ </div>
287
316
  </div>
288
317
  ))}
289
318
  </div>
290
319
  </div>
291
320
  <ExampleSkeleton />
292
321
  </div>
293
- <Skeleton className={cn('shrink-0 rounded-xl', PANEL_SCREEN_HEIGHT_CLASS)} />
322
+ <UnifiedSkeleton className={cn('shrink-0 rounded-xl', PANEL_SCREEN_HEIGHT_CLASS)} />
294
323
  <div
295
324
  className={cn(
296
325
  'flex min-w-0 shrink-0 items-center gap-[var(--spacing-system-sf)]',
297
326
  PANEL_FOOTER_HEIGHT_CLASS,
298
327
  )}
299
328
  >
300
- <LineBar line="text-h5" width="w-16" />
301
- <Skeleton className="h-7 w-36 rounded-md" />
329
+ <div className="text-h5">
330
+ <UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-16')} />
331
+ </div>
332
+ <UnifiedSkeleton className="h-7 w-36 rounded-md" />
302
333
  </div>
303
334
  </div>
304
335
  </div>
305
- </div>
336
+ </LoadingRegion>
306
337
  );
307
338
  }
308
339
 
@@ -10,7 +10,13 @@ const NO_DEVICES: never[] = [];
10
10
  * whichever the caller hands its real `DeviceSelector` it must hand this one too,
11
11
  * or the two disagree on how tall the block is.
12
12
  */
13
- type DeviceSelectorSkeletonProps = Pick<DeviceSelectorProps, 'showSelectionModeRadio' | 'singleSelect' | 'hideColumns'>;
13
+ type DeviceSelectorSkeletonProps = Pick<
14
+ DeviceSelectorProps,
15
+ 'showSelectionModeRadio' | 'singleSelect' | 'hideColumns'
16
+ > & {
17
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
18
+ region?: boolean;
19
+ };
14
20
 
15
21
  /**
16
22
  * Suspense fallback for a `DeviceSelector` whose devices come from a suspending
@@ -27,6 +33,6 @@ type DeviceSelectorSkeletonProps = Pick<DeviceSelectorProps, 'showSelectionModeR
27
33
  * stands in for, and everything below it jumped down the moment the devices
28
34
  * landed.
29
35
  */
30
- export function DeviceSelectorSkeleton(props: DeviceSelectorSkeletonProps) {
31
- return <DeviceSelector {...props} devices={NO_DEVICES} loading disabled />;
36
+ export function DeviceSelectorSkeleton({ region = true, ...props }: DeviceSelectorSkeletonProps) {
37
+ return <DeviceSelector {...props} devices={NO_DEVICES} loading loadingRegion={region} disabled />;
32
38
  }
@@ -94,6 +94,7 @@ function CustomerCell({ device }: { device: DeviceRow }) {
94
94
  export function DeviceSelector<T extends DeviceRow = DeviceRow>({
95
95
  devices,
96
96
  loading,
97
+ loadingRegion,
97
98
  selectedIds: selectedIdsProp,
98
99
  onSelectionChange: onSelectionChangeProp,
99
100
  getDeviceKey: getDeviceKeyProp,
@@ -708,6 +709,7 @@ export function DeviceSelector<T extends DeviceRow = DeviceRow>({
708
709
  )}
709
710
  <DataTable.Body
710
711
  loading={loading}
712
+ loadingRegion={loadingRegion}
711
713
  skeletonRows={8}
712
714
  emptyMessage={
713
715
  isCriteria
@@ -68,6 +68,8 @@ export interface DeviceSelectorProps<T extends DeviceRow = DeviceRow> {
68
68
  devices: T[];
69
69
  /** Whether the device list is loading. */
70
70
  loading: boolean;
71
+ /** The loading state announces itself ("Loading results"). `false` inside another loading region. Default `true`. */
72
+ loadingRegion?: boolean;
71
73
  /**
72
74
  * Currently selected device keys. Optional so a skeleton can render the real
73
75
  * picker with nothing selected, the component falls back to an empty set and
@@ -16,6 +16,8 @@ export interface DevicesGridProps<T extends DeviceRow = DeviceRow> {
16
16
  isFetchingNextPage?: boolean;
17
17
  sentinelRef?: React.RefObject<HTMLDivElement | null>;
18
18
  emptyMessage?: string;
19
+ /** The loading state announces itself ("Loading devices"). `false` inside another loading region. Default `true`. */
20
+ loadingRegion?: boolean;
19
21
  }
20
22
 
21
23
  export function DevicesGrid<T extends DeviceRow = DeviceRow>({
@@ -25,6 +27,7 @@ export function DevicesGrid<T extends DeviceRow = DeviceRow>({
25
27
  isFetchingNextPage,
26
28
  sentinelRef,
27
29
  emptyMessage = 'No devices found. Try adjusting your search or filters.',
30
+ loadingRegion = true,
28
31
  }: DevicesGridProps<T>) {
29
32
  const router = useRouter();
30
33
  const { getDeviceHref } = useDevicesViewConfig();
@@ -37,7 +40,7 @@ export function DevicesGrid<T extends DeviceRow = DeviceRow>({
37
40
  return (
38
41
  <div className="space-y-4">
39
42
  {isLoading && devices.length === 0 ? (
40
- <DeviceCardSkeletonGrid count={12} />
43
+ <DeviceCardSkeletonGrid count={12} region={loadingRegion} />
41
44
  ) : devices.length === 0 ? (
42
45
  <div className="flex h-64 items-center justify-center rounded-[6px] border border-ods-border bg-ods-card">
43
46
  <p className="text-ods-text-secondary">{emptyMessage}</p>
@@ -70,6 +70,11 @@ export interface DevicesPanelViewProps<T extends DeviceRow = DeviceRow> {
70
70
  * are the real ones, locked, and only the rows are skeletons.
71
71
  */
72
72
  loading?: boolean;
73
+ /**
74
+ * The loading state announces itself, once ("Loading devices…"; the table or grid inside it stays quiet).
75
+ * `false` inside another loading region. Default `true`.
76
+ */
77
+ loadingRegion?: boolean;
73
78
  /** The rows on screen answer the previous narrowing while the next loads: dimmed, not replaced. */
74
79
  isNarrowing?: boolean;
75
80
  /** Server-side total for the current narrowing. */
@@ -127,6 +132,7 @@ export function DevicesPanelView<T extends DeviceRow = DeviceRow>({
127
132
  actions,
128
133
  devices,
129
134
  loading = false,
135
+ loadingRegion = true,
130
136
  isNarrowing = false,
131
137
  totalCount,
132
138
  deviceFilters = null,
@@ -157,6 +163,7 @@ export function DevicesPanelView<T extends DeviceRow = DeviceRow>({
157
163
  <DevicesTableBody
158
164
  devices={devices}
159
165
  isLoading={loading}
166
+ loadingRegion={false}
160
167
  emptyMessage={loading ? '' : emptyMessage}
161
168
  skeletonRows={10}
162
169
  stickyHeaderOffset="top-[96px]"
@@ -198,6 +205,7 @@ export function DevicesPanelView<T extends DeviceRow = DeviceRow>({
198
205
  <DevicesGrid
199
206
  devices={devices}
200
207
  isLoading={loading}
208
+ loadingRegion={false}
201
209
  hasNextPage={hasNextPage}
202
210
  isFetchingNextPage={isFetchingNextPage}
203
211
  sentinelRef={gridSentinelRef}
@@ -227,7 +235,7 @@ export function DevicesPanelView<T extends DeviceRow = DeviceRow>({
227
235
  contentClassName="flex flex-col"
228
236
  >
229
237
  {headerSlot}
230
- {loading && (
238
+ {loading && loadingRegion && (
231
239
  <span role="status" className="sr-only">
232
240
  Loading devices…
233
241
  </span>
@@ -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} />