@flamingo-stack/openframe-frontend-core 0.0.747 → 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 (550) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/{chunk-4DT5YXTM.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-O6QQ44I3.cjs → chunk-45YRDD7W.cjs} +22 -19
  7. package/dist/{chunk-U6XWGK53.cjs → chunk-ALPRQ3ZX.cjs} +56 -46
  8. package/dist/{chunk-4AWI6CCU.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-WY4FKKCV.cjs → chunk-CXV7VBSI.cjs} +104 -118
  12. package/dist/{chunk-QPSQ5WLG.cjs → chunk-DGEB5GUZ.cjs} +2 -2
  13. package/dist/{chunk-6RTHHU3S.cjs → chunk-E3KFEOFA.cjs} +9 -6
  14. package/dist/{chunk-PSSGIZXZ.cjs → chunk-FHT7SMA7.cjs} +49 -46
  15. package/dist/{chunk-TYW7NBP7.cjs → chunk-GOFEOCQN.cjs} +44 -27
  16. package/dist/{chunk-HTMHDEIV.cjs → chunk-HOEVD6EN.cjs} +4 -4
  17. package/dist/{chunk-2CEQGGRN.cjs → chunk-KRAQEZPB.cjs} +48 -40
  18. package/dist/{chunk-AKTPO2DN.cjs → chunk-L4UI63K6.cjs} +2 -2
  19. package/dist/{chunk-FCQCEQBY.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-IJA3OZWF.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-R3FXJXSQ.cjs → chunk-SECT4H34.cjs} +1780 -2076
  27. package/dist/{chunk-LLAKQT3B.cjs → chunk-SGL47BS2.cjs} +12 -12
  28. package/dist/{chunk-PIQRV4EQ.cjs → chunk-SOPVUD2Y.cjs} +3 -3
  29. package/dist/chunk-UGCRLRCT.cjs +25 -0
  30. package/dist/{chunk-7Y5U3Y4S.cjs → chunk-V3UJ6NDR.cjs} +281 -462
  31. package/dist/{chunk-JPSMPXCH.cjs → chunk-VEVIMDNK.cjs} +137 -122
  32. package/dist/{chunk-C7NTL2GV.cjs → chunk-WZX26ODJ.cjs} +121 -121
  33. package/dist/{chunk-YIRX6C7V.cjs → chunk-XJ3J4UIS.cjs} +57 -22
  34. package/dist/{chunk-MA7T36JY.cjs → chunk-ZLF55RDR.cjs} +103 -98
  35. package/dist/{cloud-tenants-QJZIF2JS.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-V55KQCAL.cjs → devices-FVXAGKVX.cjs} +17 -15
  372. package/dist/{embeddable-chat-5CDR4I6E.cjs → embeddable-chat-SNYQSMS7.cjs} +79 -77
  373. package/dist/index.cjs +24 -31
  374. package/dist/{knowledge-S3VGDRKR.cjs → knowledge-ZL3ZHBSL.cjs} +17 -15
  375. package/dist/{logs-K5E2BGZE.cjs → logs-KQCWDIOB.cjs} +24 -22
  376. package/dist/{policies-BWU4FRFE.cjs → policies-ARDCZ3CT.cjs} +20 -18
  377. package/dist/{remote-session-IYT4LWJC.cjs → remote-session-ZKP2W3IS.cjs} +9 -7
  378. package/dist/{scripts-25UPGXZU.cjs → scripts-ZAMVWCY4.cjs} +23 -21
  379. package/dist/{software-update-F6UC7ULZ.cjs → software-update-6F7BIYS3.cjs} +20 -18
  380. package/dist/{tickets-board-4MT6ZB4F.cjs → tickets-board-BNW4AYFL.cjs} +11 -10
  381. package/dist/utils/index.cjs +49 -48
  382. package/dist/utils/markdown-to-plain.d.ts.map +1 -1
  383. package/dist/utils/markdown-to-plain.js +12 -7
  384. package/package.json +7 -2
  385. package/src/components/categories-cart.tsx +2 -4
  386. package/src/components/chat/chat-container.tsx +4 -4
  387. package/src/components/chat/chat-context-picker.tsx +3 -2
  388. package/src/components/chat/chat-message-row.tsx +6 -7
  389. package/src/components/chat/chat-message-skeleton.tsx +11 -6
  390. package/src/components/chat/chat-sidebar-skeleton.tsx +4 -3
  391. package/src/components/chat/chat-top-navigation.tsx +4 -4
  392. package/src/components/chat/context-items-list.tsx +9 -3
  393. package/src/components/chat/entity-cards/admin-content-card-grid.tsx +65 -18
  394. package/src/components/chat/entity-cards/admin-content-card.tsx +2 -1
  395. package/src/components/chat/entity-cards/blog-card.tsx +13 -12
  396. package/src/components/chat/entity-cards/campaign-card-admin.tsx +5 -4
  397. package/src/components/chat/entity-cards/case-study-card.tsx +19 -18
  398. package/src/components/chat/entity-cards/chat-ticket-item.tsx +5 -5
  399. package/src/components/chat/entity-cards/customer-interview-card.tsx +15 -14
  400. package/src/components/chat/entity-cards/data-room-doc-card.tsx +7 -6
  401. package/src/components/chat/entity-cards/design-doc-card.tsx +0 -2
  402. package/src/components/chat/entity-cards/generic-entity-card.tsx +8 -7
  403. package/src/components/chat/entity-cards/github-activity-card.tsx +11 -10
  404. package/src/components/chat/entity-cards/hubspot-ticket-card.tsx +16 -15
  405. package/src/components/chat/entity-cards/index.ts +2 -0
  406. package/src/components/chat/entity-cards/investor-update-card.tsx +12 -11
  407. package/src/components/chat/entity-cards/onboarding-guide-card.tsx +21 -22
  408. package/src/components/chat/entity-cards/program-card.tsx +29 -28
  409. package/src/components/chat/entity-cards/roadmap-card.tsx +22 -23
  410. package/src/components/chat/entity-cards/slack-message-card.tsx +12 -11
  411. package/src/components/chat/guide-welcome.tsx +2 -2
  412. package/src/components/chat/mingo-archive-list.tsx +2 -1
  413. package/src/components/chat/mingo-chat-history.tsx +18 -9
  414. package/src/components/chat/mingo-chat-rail.tsx +2 -1
  415. package/src/components/chat/mingo-info-card.tsx +6 -5
  416. package/src/components/chat/mingo-onboarding-card-skeleton.tsx +15 -13
  417. package/src/components/chat/model-display.tsx +4 -4
  418. package/src/components/chat/msp-organization-card-skeleton.tsx +5 -5
  419. package/src/components/chat/quick-action-chip.tsx +17 -14
  420. package/src/components/chat/utils/compact-card-classes.ts +4 -5
  421. package/src/components/content-loading-container.tsx +7 -8
  422. package/src/components/docs/doc-viewer.tsx +3 -2
  423. package/src/components/docs/skeletons.tsx +64 -63
  424. package/src/components/embeds/embed-iframe.tsx +16 -9
  425. package/src/components/embeds/index.ts +2 -2
  426. package/src/components/embeds/linkedin-embed-client.tsx +7 -6
  427. package/src/components/embeds/markdown-image.tsx +5 -3
  428. package/src/components/embeds/og-link-preview.tsx +162 -79
  429. package/src/components/embeds/reddit-embed-client.tsx +10 -9
  430. package/src/components/embeds/twitter-embed-client.tsx +10 -9
  431. package/src/components/faq/faq-section.tsx +13 -6
  432. package/src/components/features/board/ticket-card-skeleton.tsx +8 -8
  433. package/src/components/features/capability-explorer.tsx +61 -30
  434. package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +9 -3
  435. package/src/components/features/devices/device-selector/device-selector.tsx +2 -0
  436. package/src/components/features/devices/device-selector/device-selector.types.ts +2 -0
  437. package/src/components/features/devices/devices-grid.tsx +4 -1
  438. package/src/components/features/devices/devices-panel-view.tsx +9 -1
  439. package/src/components/features/devices/devices-table-columns.tsx +4 -0
  440. package/src/components/features/logs/logs-table-view.tsx +4 -2
  441. package/src/components/features/model-token-rates.tsx +27 -24
  442. package/src/components/features/notifications/index.ts +2 -2
  443. package/src/components/features/notifications/notification-drawer.tsx +7 -10
  444. package/src/components/features/notifications/notification-tile.tsx +57 -0
  445. package/src/components/features/policies/policy-summary-cards.tsx +2 -2
  446. package/src/components/features/push-button-selector.tsx +20 -11
  447. package/src/components/features/remote-session/remote-desktop-view.tsx +26 -16
  448. package/src/components/features/waitlist-form.tsx +6 -5
  449. package/src/components/help-center-pages/download-apps-page.tsx +3 -2
  450. package/src/components/help-center-pages/trust-center-page.tsx +6 -2
  451. package/src/components/help-center-pages/trust-center-sections.tsx +9 -3
  452. package/src/components/index.ts +0 -2
  453. package/src/components/layout/title-block.tsx +17 -15
  454. package/src/components/loading/card-skeleton.tsx +14 -46
  455. package/src/components/loading/category-card-skeleton.tsx +2 -4
  456. package/src/components/loading/category-vendor-selector-skeleton.tsx +12 -5
  457. package/src/components/loading/device-card-skeleton.tsx +58 -51
  458. package/src/components/loading/index.ts +5 -19
  459. package/src/components/loading/loading-region.tsx +60 -0
  460. package/src/components/loading/margin-report-skeleton.tsx +45 -34
  461. package/src/components/loading/msp-profile-form-skeleton.tsx +9 -6
  462. package/src/components/loading/organization-card-skeleton.tsx +8 -6
  463. package/src/components/loading/organization-icon-skeleton.tsx +3 -2
  464. package/src/components/loading/page-layout-skeleton.tsx +162 -133
  465. package/src/components/loading/settings-form-skeleton.tsx +52 -0
  466. package/src/components/loading/unified-skeleton.tsx +26 -71
  467. package/src/components/loading/wizard-layout-skeleton.tsx +6 -3
  468. package/src/components/media-carousel.tsx +2 -1
  469. package/src/components/meeting-scheduler/booking-form.tsx +10 -7
  470. package/src/components/meeting-scheduler/context-panel.tsx +8 -7
  471. package/src/components/meeting-scheduler/directory.tsx +10 -9
  472. package/src/components/meeting-scheduler/index.tsx +5 -4
  473. package/src/components/meeting-scheduler/modal-header.tsx +8 -7
  474. package/src/components/meeting-scheduler/slot-picker.tsx +4 -3
  475. package/src/components/navigation/app-header.tsx +8 -7
  476. package/src/components/navigation/multi-level-navigation.tsx +3 -2
  477. package/src/components/navigation/navigation-sidebar-item.tsx +3 -2
  478. package/src/components/onboarding-guides/onboarding-guides-catalog-skeleton.tsx +17 -10
  479. package/src/components/product-demo/product-screen.tsx +4 -4
  480. package/src/components/profile/ProfileLoadingSkeleton.tsx +13 -9
  481. package/src/components/related-content/related-content-section.tsx +5 -4
  482. package/src/components/shared/delivery/delivery-table.tsx +8 -7
  483. package/src/components/shared/detail-page-skeleton.tsx +22 -14
  484. package/src/components/shared/dev-section/dev-card-row.tsx +23 -10
  485. package/src/components/shared/legal-document/legal-document-page.tsx +8 -7
  486. package/src/components/shared/onboarding/onboarding-step-card.tsx +3 -2
  487. package/src/components/shared/onboarding/onboarding-walkthrough.tsx +2 -1
  488. package/src/components/shared/product-release/index.ts +0 -1
  489. package/src/components/shared/product-release/product-release-card-skeleton.tsx +23 -25
  490. package/src/components/shared/product-release/product-releases-view.tsx +3 -2
  491. package/src/components/shared/roadmap/roadmap-grid-skeleton.tsx +14 -56
  492. package/src/components/tickets/help-center-create-form.tsx +23 -12
  493. package/src/components/tickets/ticket-center.tsx +17 -11
  494. package/src/components/tickets/ticket-detail-drawer.tsx +3 -2
  495. package/src/components/ui/admin-form-drawer.tsx +7 -7
  496. package/src/components/ui/admin-form-modal.tsx +9 -8
  497. package/src/components/ui/analyzing-state.tsx +5 -8
  498. package/src/components/ui/content-loader.tsx +31 -23
  499. package/src/components/ui/dashboard-info-card.tsx +81 -20
  500. package/src/components/ui/data-attribution.tsx +18 -0
  501. package/src/components/ui/data-table/data-table-body.tsx +9 -2
  502. package/src/components/ui/data-table/data-table-infinite-footer.tsx +4 -2
  503. package/src/components/ui/data-table/data-table-skeleton.tsx +8 -5
  504. package/src/components/ui/feature-card.tsx +27 -11
  505. package/src/components/ui/file-manager/file-manager-skeleton.tsx +30 -22
  506. package/src/components/ui/file-manager/file-manager-table.tsx +10 -10
  507. package/src/components/ui/filter-modal.tsx +5 -5
  508. package/src/components/ui/filter-pill-row.tsx +19 -0
  509. package/src/components/ui/index.ts +0 -1
  510. package/src/components/ui/layout-hold.tsx +30 -38
  511. package/src/components/ui/markdown/base-components.tsx +1 -1
  512. package/src/components/ui/page-actions.tsx +10 -8
  513. package/src/components/ui/photo-wall.tsx +4 -7
  514. package/src/components/ui/query-report-table/query-report-table-skeleton.tsx +13 -7
  515. package/src/components/ui/query-report-table/query-report-table.tsx +2 -0
  516. package/src/components/ui/query-report-table/types.ts +4 -0
  517. package/src/components/ui/skeleton-surface.ts +6 -0
  518. package/src/components/ui/table/table-skeleton.tsx +11 -13
  519. package/src/components/ui/test-run.tsx +30 -22
  520. package/src/styles/ods-colors.css +2 -2
  521. package/src/utils/markdown-to-plain.ts +25 -16
  522. package/dist/chunk-5M5C6UV4.cjs +0 -125
  523. package/dist/components/dynamic-skeleton.d.ts +0 -108
  524. package/dist/components/dynamic-skeleton.d.ts.map +0 -1
  525. package/dist/components/dynamic-skeleton.js +0 -221
  526. package/dist/components/loading/content-skeleton.d.ts +0 -73
  527. package/dist/components/loading/content-skeleton.d.ts.map +0 -1
  528. package/dist/components/loading/content-skeleton.js +0 -217
  529. package/dist/components/loading/users-grid-skeleton.d.ts +0 -7
  530. package/dist/components/loading/users-grid-skeleton.d.ts.map +0 -1
  531. package/dist/components/loading/users-grid-skeleton.js +0 -13
  532. package/dist/components/shared/product-release/release-detail-skeleton.d.ts +0 -2
  533. package/dist/components/shared/product-release/release-detail-skeleton.d.ts.map +0 -1
  534. package/dist/components/shared/product-release/release-detail-skeleton.js +0 -9
  535. package/dist/components/skeleton.d.ts +0 -4
  536. package/dist/components/skeleton.d.ts.map +0 -1
  537. package/dist/components/skeleton.js +0 -9
  538. package/dist/components/ui/skeleton.d.ts +0 -44
  539. package/dist/components/ui/skeleton.d.ts.map +0 -1
  540. package/dist/components/ui/skeleton.js +0 -103
  541. package/dist/components/vendor-page-skeleton.d.ts +0 -2
  542. package/dist/components/vendor-page-skeleton.d.ts.map +0 -1
  543. package/dist/components/vendor-page-skeleton.js +0 -9
  544. package/src/components/dynamic-skeleton.tsx +0 -365
  545. package/src/components/loading/content-skeleton.tsx +0 -374
  546. package/src/components/loading/users-grid-skeleton.tsx +0 -36
  547. package/src/components/shared/product-release/release-detail-skeleton.tsx +0 -7
  548. package/src/components/skeleton.tsx +0 -8
  549. package/src/components/ui/skeleton.tsx +0 -173
  550. package/src/components/vendor-page-skeleton.tsx +0 -7
@@ -1,7 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from '../../utils/cn';
4
- import { Skeleton } from '../ui/skeleton';
4
+ import { LoadingRegion } from '../loading/loading-region';
5
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
5
6
 
6
7
  export interface MingoOnboardingCardSkeletonProps {
7
8
  /** Title bar width — Tailwind width utility. Defaults to `w-32`. Vary
@@ -54,23 +55,23 @@ export function MingoOnboardingCardSkeleton({
54
55
  <div className="flex w-full flex-col gap-[var(--spacing-system-xxs)]">
55
56
  {/* Title row — icon + title bar + right-rail slash bar. */}
56
57
  <div className="flex w-full items-center gap-[var(--spacing-system-xxs)]">
57
- <Skeleton className="size-4 shrink-0 rounded-sm" />
58
- <Skeleton className={cn('h-3.5 rounded-sm', titleWidth)} />
58
+ <UnifiedSkeleton className="size-4 shrink-0 rounded-sm" />
59
+ <UnifiedSkeleton className={cn('h-3.5 rounded-sm', titleWidth)} />
59
60
  <span className="flex-1" />
60
- <Skeleton className={cn('h-3.5 shrink-0 rounded-sm', slashWidth)} />
61
+ <UnifiedSkeleton className={cn('h-3.5 shrink-0 rounded-sm', slashWidth)} />
61
62
  </div>
62
63
  {/* Description — 1 or 2 lines; second line is 70% so the
63
64
  * ragged edge mimics natural text wrapping. */}
64
65
  <div className="flex flex-col gap-[var(--spacing-system-xxs)]">
65
- <Skeleton className="h-3.5 w-full rounded-sm" />
66
- {descriptionLines === 2 ? <Skeleton className="h-3.5 w-[70%] rounded-sm" /> : null}
66
+ <UnifiedSkeleton className="h-3.5 w-full rounded-sm" />
67
+ {descriptionLines === 2 ? <UnifiedSkeleton className="h-3.5 w-[70%] rounded-sm" /> : null}
67
68
  </div>
68
69
  {/* Action chip row — `h-7` matches the live card's outline
69
70
  * chips so the skeleton sits at exactly the same height. */}
70
71
  {hasChips ? (
71
72
  <div className="mt-[var(--spacing-system-xs)] flex flex-wrap items-center gap-[var(--spacing-system-xxs)]">
72
73
  {chipWidths.map((w, i) => (
73
- <Skeleton key={i} className={cn('h-7 rounded-md', w)} />
74
+ <UnifiedSkeleton key={i} className={cn('h-7 rounded-md', w)} />
74
75
  ))}
75
76
  </div>
76
77
  ) : null}
@@ -80,6 +81,8 @@ export function MingoOnboardingCardSkeleton({
80
81
  }
81
82
 
82
83
  export interface MingoOnboardingListSkeletonProps {
84
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
85
+ region?: boolean;
83
86
  /** Row count. Defaults to 6 — fills the typical empty-state
84
87
  * viewport so the loader doesn't pop in shorter than the resolved
85
88
  * list. */
@@ -120,12 +123,11 @@ const ROW_VARIANTS: ReadonlyArray<{
120
123
  { titleWidth: 'w-24', slashWidth: 'w-16', descriptionLines: 2 },
121
124
  ];
122
125
 
123
- export function MingoOnboardingListSkeleton({ rows = 6, className }: MingoOnboardingListSkeletonProps) {
126
+ export function MingoOnboardingListSkeleton({ region = true, rows = 6, className }: MingoOnboardingListSkeletonProps) {
124
127
  return (
125
- <div
126
- role="status"
127
- aria-label="Loading slash commands"
128
- aria-busy="true"
128
+ <LoadingRegion
129
+ label="Loading slash commands"
130
+ announce={region}
129
131
  className={cn('overflow-hidden rounded-md border border-ods-border bg-ods-card', className)}
130
132
  >
131
133
  {Array.from({ length: rows }).map((_, i) => {
@@ -139,6 +141,6 @@ export function MingoOnboardingListSkeleton({ rows = 6, className }: MingoOnboar
139
141
  />
140
142
  );
141
143
  })}
142
- </div>
144
+ </LoadingRegion>
143
145
  );
144
146
  }
@@ -4,7 +4,7 @@ import React from 'react';
4
4
  import { cn } from '../../utils/cn';
5
5
  import { HoverCard, HoverCardContent, HoverCardTrigger } from '../hover-card';
6
6
  import { AnthropicLogoGreyIcon, GeminiLogoGreyIcon, OpenaiLogoGreyIcon } from '../icons-v2-generated';
7
- import { Skeleton } from '../ui/skeleton';
7
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
8
8
  import { useChatAppearance } from './chat-appearance-context';
9
9
  import type { ModelDisplayProps, ModelUsageBreakdown } from './types';
10
10
  import { CHAT_APPEARANCE } from './types/chat.types';
@@ -185,11 +185,11 @@ const ModelDisplaySkeleton = React.forwardRef<HTMLDivElement, ModelDisplaySkelet
185
185
  ({ className, showTokens = false, ...props }, ref) => (
186
186
  <div ref={ref} aria-hidden className={cn('flex items-center gap-1 text-h6', className)} {...props}>
187
187
  {/* provider icon */}
188
- <Skeleton className="h-5 w-4 shrink-0 rounded-sm" />
188
+ <UnifiedSkeleton className="h-5 w-4 shrink-0 rounded-sm" />
189
189
  {/* model name */}
190
- <Skeleton className="h-5 w-24" />
190
+ <UnifiedSkeleton className="h-5 w-24" />
191
191
  {/* "X / Y tokens used" tail — only when tokens are expected */}
192
- {showTokens && <Skeleton className="ml-auto h-3 w-32" />}
192
+ {showTokens && <UnifiedSkeleton className="ml-auto h-3 w-32" />}
193
193
  </div>
194
194
  ),
195
195
  );
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from '../../utils/cn';
4
- import { Skeleton } from '../ui/skeleton';
4
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
5
5
 
6
6
  export interface MspOrganizationCardSkeletonProps {
7
7
  /** Appended to the root element. */
@@ -22,12 +22,12 @@ export function MspOrganizationCardSkeleton({ className }: MspOrganizationCardSk
22
22
  className,
23
23
  )}
24
24
  >
25
- <Skeleton className="size-12 shrink-0 rounded-md" />
25
+ <UnifiedSkeleton className="size-12 shrink-0 rounded-md" />
26
26
  <div className="flex min-w-0 flex-1 flex-col justify-center gap-2 self-stretch">
27
- <Skeleton className="h-5 w-3/5 rounded-md" />
28
- <Skeleton className="h-4 w-2/5 rounded-md" />
27
+ <UnifiedSkeleton className="h-5 w-3/5 rounded-md" />
28
+ <UnifiedSkeleton className="h-4 w-2/5 rounded-md" />
29
29
  </div>
30
- <Skeleton className="size-12 shrink-0 rounded-md" />
30
+ <UnifiedSkeleton className="size-12 shrink-0 rounded-md" />
31
31
  </div>
32
32
  );
33
33
  }
@@ -1,8 +1,9 @@
1
1
  'use client';
2
2
 
3
- import { type CSSProperties, type ReactNode, isValidElement } from 'react';
3
+ import { type ReactNode, isValidElement } from 'react';
4
4
  import { cn } from '../../utils/cn';
5
5
  import { EntityIcon, type EntityIconValue } from '../icon-display';
6
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
6
7
  import { Tag } from '../ui/tag';
7
8
 
8
9
  // =============================================================================
@@ -201,18 +202,11 @@ export interface QuickActionChipSkeletonProps {
201
202
  className?: string;
202
203
  }
203
204
 
204
- /** Pulse bar inside the chip skeleton — the standard `ui/skeleton` treatment
205
- * (`animate-pulse bg-ods-border`), as a SPAN so it stays valid phrasing
206
- * content inside the Tag's label span. */
207
- function ChipSkelBar({ className, style }: { className?: string; style?: CSSProperties }) {
208
- return <span aria-hidden className={cn('animate-pulse rounded-md bg-ods-border', className)} style={style} />;
209
- }
210
-
211
205
  /**
212
206
  * Loading placeholder for {@link QuickActionChipButton} — renders the REAL
213
- * `Tag` (same height, padding, border, radius, icon box) with standard
214
- * skeleton pulse bars (identical animation + token as `ui/skeleton`) in the
215
- * icon/lozenge/label slots, so a skeleton chip is 1:1 with a loaded chip by
207
+ * `Tag` (same height, padding, border, radius, icon box) with `UnifiedSkeleton`
208
+ * bars (as spans, so they stay valid phrasing content inside the Tag's label
209
+ * span) in the icon/lozenge/label slots, so a skeleton chip is 1:1 with a loaded chip by
216
210
  * construction. Use anywhere quick actions stream in (chat empty states,
217
211
  * marketing walls, deck panels).
218
212
  */
@@ -231,12 +225,21 @@ export function QuickActionChipSkeleton({
231
225
  size={question ? 'sentence' : size}
232
226
  className={cn(question && 'max-w-full', className)}
233
227
  icon={
234
- icon && !question ? <ChipSkelBar className={size === 'large' ? 'block size-5' : 'block size-4'} /> : undefined
228
+ icon && !question ? (
229
+ <UnifiedSkeleton as="span" aria-hidden className={size === 'large' ? 'block size-5' : 'block size-4'} />
230
+ ) : undefined
235
231
  }
236
232
  label={
237
233
  <>
238
- {lozenge && <ChipSkelBar className="mr-2 inline-block h-[16px] w-[26px] translate-y-[2px]" />}
239
- <ChipSkelBar className="inline-block h-[0.9em] translate-y-[0.08em]" style={{ width: `${labelCh}ch` }} />
234
+ {lozenge && (
235
+ <UnifiedSkeleton as="span" aria-hidden className="mr-2 inline-block h-[16px] w-[26px] translate-y-[2px]" />
236
+ )}
237
+ <UnifiedSkeleton
238
+ as="span"
239
+ aria-hidden
240
+ className="inline-block h-[0.9em] translate-y-[0.08em]"
241
+ width={`${labelCh}ch`}
242
+ />
240
243
  </>
241
244
  }
242
245
  />
@@ -26,17 +26,16 @@ export const COMPACT_CARD_OUTER =
26
26
  export const COMPACT_CARD_OUTER_STATIC =
27
27
  'my-1.5 flex items-start gap-3 w-full p-2 rounded-lg border border-ods-border bg-ods-card no-underline cursor-default';
28
28
 
29
- /** Skeleton outer frame — same dimensions as loaded, plus `animate-pulse`. */
29
+ /** Skeleton outer frame: same dimensions as loaded. Static; its placeholders are `UnifiedSkeleton`s. */
30
30
  export const COMPACT_CARD_SKELETON_OUTER =
31
- 'my-1.5 flex w-full animate-pulse items-start gap-3 rounded-lg border border-ods-border bg-ods-card p-2';
31
+ 'my-1.5 flex w-full items-start gap-3 rounded-lg border border-ods-border bg-ods-card p-2';
32
32
 
33
33
  /** 56×56 image slot — for cards with a cover image. */
34
34
  export const COMPACT_CARD_IMAGE_SLOT =
35
35
  'relative block shrink-0 self-start w-14 h-14 aspect-square overflow-hidden rounded-md bg-ods-bg';
36
36
 
37
- /** 56×56 placeholder slot for skeletons. */
38
- export const COMPACT_CARD_SKELETON_IMAGE_SLOT =
39
- 'block h-14 w-14 aspect-square shrink-0 self-start rounded-md bg-ods-bg';
37
+ /** 56×56 placeholder slot for skeletons: the box of a `UnifiedSkeleton as="span"`, which draws the surface. */
38
+ export const COMPACT_CARD_SKELETON_IMAGE_SLOT = 'block h-14 w-14 aspect-square shrink-0 self-start rounded-md';
40
39
 
41
40
  /** 56×56 icon slot — for cards without a cover image. */
42
41
  export const COMPACT_CARD_ICON_SLOT =
@@ -2,6 +2,7 @@
2
2
 
3
3
  import type { ReactNode } from 'react';
4
4
  import { cn } from '../utils/cn';
5
+ import { LoadingRegion } from './loading/loading-region';
5
6
 
6
7
  interface ContentLoadingContainerProps {
7
8
  /**
@@ -50,7 +51,7 @@ interface ContentLoadingContainerProps {
50
51
  * ```tsx
51
52
  * <ContentLoadingContainer
52
53
  * isLoading={isLoadingVendors}
53
- * skeletonComponent={<CardSkeletonGrid variant="vendor" count={12} />}
54
+ * skeletonComponent={<CardSkeletonGrid variant="vendor" count={12} region={false} />}
54
55
  * minHeight="min-h-[800px]"
55
56
  * >
56
57
  * <VendorGrid vendors={vendors} />
@@ -72,23 +73,21 @@ export function ContentLoadingContainer({
72
73
  style={{
73
74
  transitionDuration: `${transitionDuration}ms`,
74
75
  }}
75
- role="region"
76
- aria-label={isLoading ? 'Loading content' : 'Content loaded'}
77
- aria-live="polite"
78
76
  >
79
77
  {/* Loading Skeleton Overlay */}
80
78
  {isLoading && (
81
- <div
79
+ // The one announcement for this content: a `skeletonComponent` that has a region of its own
80
+ // takes `region={false}`.
81
+ <LoadingRegion
82
+ label="Loading content"
82
83
  className="absolute inset-0 z-10 bg-ods-bg"
83
84
  style={{
84
85
  opacity: loadingOpacity,
85
86
  transition: `opacity ${transitionDuration}ms ease-in-out`,
86
87
  }}
87
- role="status"
88
- aria-label="Loading content"
89
88
  >
90
89
  {skeletonComponent}
91
- </div>
90
+ </LoadingRegion>
92
91
  )}
93
92
 
94
93
  {/* Actual Content */}
@@ -8,6 +8,7 @@ import { findDocNodeByPath } from '../../utils/doc-tree-nav';
8
8
  import { PageShell } from '../layout/article-detail-layout';
9
9
  import { PageLayout } from '../layout/page-layout';
10
10
  import { CategorySidebarSkeleton } from '../loading/page-layout-skeleton';
11
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
11
12
  import { MultiLevelNavigation, MobileNavigationDropdown } from '../navigation/multi-level-navigation';
12
13
  import { StickySectionNav } from '../navigation/sticky-section-nav';
13
14
  import { PersistentSidebar, PersistentMobileDropdown } from '../persistent-filter-controls';
@@ -368,7 +369,7 @@ function DocViewerContent({
368
369
  {isMarkdownContent && (isLoadingContent || isLoadingStructure) && (
369
370
  <div className="hidden content-lg:block">
370
371
  <div className="sticky top-24">
371
- <div className="mb-5 h-[14px] w-28 animate-pulse rounded bg-ods-border" />
372
+ <UnifiedSkeleton className="mb-5 h-[14px] w-28 rounded" />
372
373
  <div className="space-y-0">
373
374
  {[130, 170, 190, 220, 110, 200, 80, 100, 120, 140, 90].map((w, i) => (
374
375
  <div
@@ -377,7 +378,7 @@ function DocViewerContent({
377
378
  i === 0 ? 'border-ods-accent' : 'border-transparent'
378
379
  }`}
379
380
  >
380
- <div className="h-[13px] animate-pulse rounded bg-ods-border" style={{ width: w }} />
381
+ <UnifiedSkeleton className="h-[13px] rounded" width={w} />
381
382
  </div>
382
383
  ))}
383
384
  </div>
@@ -1,59 +1,67 @@
1
+ import { EmbedLoadingSkeleton } from '../embeds/embed-iframe';
2
+ import { LoadingRegion } from '../loading/loading-region';
3
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
1
4
  /**
2
5
  * Text-style skeleton — matches a rendered markdown article layout.
3
6
  * Used by `<DocsHubPage>` as the default for `markdown` (and unknown
4
7
  * document types). Embedders can override via `renderSkeleton`.
5
8
  */
6
- export function MarkdownSkeleton() {
9
+ export function MarkdownSkeleton({
10
+ region = true,
11
+ }: {
12
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
13
+ region?: boolean;
14
+ } = {}) {
7
15
  return (
8
- <div className="mt-6 space-y-7">
16
+ <LoadingRegion label="Loading the document" announce={region} className="mt-6 space-y-7">
9
17
  <div className="space-y-[14px]">
10
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
11
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
12
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
13
- <div className="h-[16px] w-3/4 animate-pulse rounded bg-ods-border" />
18
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
19
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
20
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
21
+ <UnifiedSkeleton className="h-[16px] w-3/4 rounded" />
14
22
  </div>
15
23
  <div className="space-y-[14px]">
16
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
17
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
18
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
19
- <div className="h-[16px] w-5/6 animate-pulse rounded bg-ods-border" />
24
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
25
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
26
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
27
+ <UnifiedSkeleton className="h-[16px] w-5/6 rounded" />
20
28
  </div>
21
29
  <div className="space-y-[14px]">
22
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
23
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
24
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
25
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
26
- <div className="h-[16px] w-2/3 animate-pulse rounded bg-ods-border" />
30
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
31
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
32
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
33
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
34
+ <UnifiedSkeleton className="h-[16px] w-2/3 rounded" />
27
35
  </div>
28
- <div className="h-[88px] animate-pulse rounded-lg border border-ods-border bg-ods-card" />
29
- <div className="h-7 w-1/3 animate-pulse rounded bg-ods-border" />
36
+ <UnifiedSkeleton className="h-[88px] rounded-lg border border-ods-border" />
37
+ <UnifiedSkeleton className="h-7 w-1/3 rounded" />
30
38
  <div className="space-y-[14px]">
31
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
32
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
33
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
34
- <div className="h-[16px] w-[72%] animate-pulse rounded bg-ods-border" />
39
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
40
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
41
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
42
+ <UnifiedSkeleton className="h-[16px] w-[72%] rounded" />
35
43
  </div>
36
44
  <div className="space-y-[14px]">
37
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
38
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
39
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
40
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
41
- <div className="h-[16px] w-[58%] animate-pulse rounded bg-ods-border" />
45
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
46
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
47
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
48
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
49
+ <UnifiedSkeleton className="h-[16px] w-[58%] rounded" />
42
50
  </div>
43
- <div className="h-7 w-2/5 animate-pulse rounded bg-ods-border" />
51
+ <UnifiedSkeleton className="h-7 w-2/5 rounded" />
44
52
  <div className="space-y-[14px]">
45
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
46
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
47
- <div className="h-[16px] w-[90%] animate-pulse rounded bg-ods-border" />
53
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
54
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
55
+ <UnifiedSkeleton className="h-[16px] w-[90%] rounded" />
48
56
  </div>
49
57
  <div className="space-y-[14px]">
50
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
51
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
52
- <div className="h-[16px] w-full animate-pulse rounded bg-ods-border" />
53
- <div className="h-[16px] w-[70%] animate-pulse rounded bg-ods-border" />
58
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
59
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
60
+ <UnifiedSkeleton className="h-[16px] w-full rounded" />
61
+ <UnifiedSkeleton className="h-[16px] w-[70%] rounded" />
54
62
  </div>
55
- <div className="h-[88px] animate-pulse rounded-lg border border-ods-border bg-ods-card" />
56
- </div>
63
+ <UnifiedSkeleton className="h-[88px] rounded-lg border border-ods-border" />
64
+ </LoadingRegion>
57
65
  );
58
66
  }
59
67
 
@@ -68,35 +76,35 @@ export function MarkdownSkeleton() {
68
76
  * - `google_sheet`/`figma` → header with title + ONE button/toggle
69
77
  * - `file` → centered FileDownloadCard-style box
70
78
  * - undefined / others → generic (1-button header)
71
- *
72
- * IMPORTANT: bars use `bg-ods-border` (NOT `bg-ods-skeleton`). The
73
- * `--ods-skeleton` token resolves to TRANSPARENT in this build, leaving
74
- * the skeleton box visually empty — the embed skeleton was the loudest
75
- * surface affected (a full-height iframe area showing nothing). Same fix
76
- * the chat-message-row skeleton already documents in its inline comment.
77
79
  */
78
80
  export interface EmbedSkeletonProps {
79
81
  /** When provided, the header layout matches the eventual viewer's
80
82
  * button count + arrangement, so the layout doesn't shift on load. */
81
83
  documentType?: 'pdf' | 'google_sheet' | 'figma' | 'file' | string;
84
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
85
+ region?: boolean;
82
86
  }
83
87
 
84
- export function EmbedSkeleton({ documentType }: EmbedSkeletonProps = {}) {
88
+ export function EmbedSkeleton({ documentType, region = true }: EmbedSkeletonProps = {}) {
85
89
  // Centered card shape for the `file` documentType — matches
86
90
  // `<FileDownloadCard>`'s `flex flex-col items-center justify-center py-16`
87
91
  // + bordered card with icon, name, type/size row, Download button.
88
92
  if (documentType === 'file') {
89
93
  return (
90
- <div className="flex flex-col items-center justify-center py-16">
94
+ <LoadingRegion
95
+ label="Loading the document"
96
+ announce={region}
97
+ className="flex flex-col items-center justify-center py-16"
98
+ >
91
99
  <div className="w-full max-w-md space-y-4 rounded-xl border border-ods-border bg-ods-card p-8 text-center">
92
- <div className="mx-auto h-16 w-16 animate-pulse rounded bg-ods-border" />
100
+ <UnifiedSkeleton className="mx-auto h-16 w-16 rounded" />
93
101
  <div className="space-y-2">
94
- <div className="mx-auto h-5 w-2/3 animate-pulse rounded bg-ods-border" />
95
- <div className="mx-auto h-4 w-1/2 animate-pulse rounded bg-ods-border" />
102
+ <UnifiedSkeleton className="mx-auto h-5 w-2/3 rounded" />
103
+ <UnifiedSkeleton className="mx-auto h-4 w-1/2 rounded" />
96
104
  </div>
97
- <div className="h-10 w-full animate-pulse rounded bg-ods-border" />
105
+ <UnifiedSkeleton className="h-10 w-full rounded" />
98
106
  </div>
99
- </div>
107
+ </LoadingRegion>
100
108
  );
101
109
  }
102
110
 
@@ -105,32 +113,25 @@ export function EmbedSkeleton({ documentType }: EmbedSkeletonProps = {}) {
105
113
  const buttonCount = documentType === 'pdf' ? 2 : 1;
106
114
 
107
115
  return (
108
- <div className="space-y-4">
116
+ <LoadingRegion label="Loading the document" announce={region} className="space-y-4">
109
117
  {/* Header — matches the actual viewer's
110
118
  * `flex flex-col gap-3 content-sm:flex-row content-sm:items-center content-sm:justify-between`
111
119
  * (mobile-stacked, desktop-row). */}
112
120
  <div className="flex flex-col gap-3 content-sm:flex-row content-sm:items-center content-sm:justify-between">
113
121
  {/* Left: icon + title */}
114
122
  <div className="flex min-w-0 flex-1 items-center gap-2">
115
- <div className="h-5 w-5 shrink-0 animate-pulse rounded bg-ods-border" />
116
- <div className="h-6 w-2/3 animate-pulse rounded bg-ods-border" />
123
+ <UnifiedSkeleton className="h-5 w-5 shrink-0 rounded" />
124
+ <UnifiedSkeleton className="h-6 w-2/3 rounded" />
117
125
  </div>
118
126
  {/* Right: 1 or 2 buttons. Mobile = full-width; desktop = auto. */}
119
127
  <div className="flex w-full items-center gap-2 content-sm:w-auto">
120
128
  {Array.from({ length: buttonCount }).map((_, i) => (
121
- <div
122
- key={i}
123
- className="h-10 w-full flex-1 animate-pulse rounded bg-ods-border content-sm:w-32 content-sm:flex-initial"
124
- />
129
+ <UnifiedSkeleton key={i} className="h-10 w-full flex-1 rounded content-sm:w-32 content-sm:flex-initial" />
125
130
  ))}
126
131
  </div>
127
132
  </div>
128
- {/* Body — clean iframe-sized rectangle, no fake inner placeholder
129
- * cruft. Matches the viewer's default `calc(100vh - 250px)` height. */}
130
- <div
131
- className="w-full animate-pulse rounded-lg border border-ods-border bg-ods-card"
132
- style={{ height: 'calc(100vh - 250px)' }}
133
- />
134
- </div>
133
+ {/* Body: the iframe viewer's own loading box (its default `calc(100vh - 250px)` height). */}
134
+ <EmbedLoadingSkeleton region={false} />
135
+ </LoadingRegion>
135
136
  );
136
137
  }
@@ -2,22 +2,29 @@
2
2
 
3
3
  import type React from 'react';
4
4
  import { useState, useCallback, useRef, useEffect } from 'react';
5
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
5
6
 
6
- /** Loading skeleton for iframe embeds — clean iframe-sized rectangle.
7
- * Uses `bg-ods-card` (visible token) rather than `bg-ods-skeleton`
8
- * which resolves to transparent in this build (the same gotcha
9
- * documented in `chat-message-row.tsx`'s skeleton). No fake inner
10
- * placeholder cruft — a real loading iframe shows a blank rectangle.
7
+ /** Loading skeleton for iframe embeds: a clean iframe-sized `UnifiedSkeleton`
8
+ * rectangle. No fake inner placeholder cruft: a real loading iframe shows a
9
+ * blank rectangle.
11
10
  *
12
11
  * Exported so a viewer that is still RESOLVING where its frame points
13
12
  * (ClaudeEmbed probing for a self-hosted mirror, before it has a `src`)
14
13
  * can render the IDENTICAL skeleton through `EmbedViewerFrame`, keeping
15
14
  * every embed's loading state 1:1 with the Figma/Sheets/PDF viewers. */
16
- export function EmbedLoadingSkeleton({ height }: { height?: string }) {
15
+ export function EmbedLoadingSkeleton({
16
+ height,
17
+ region = true,
18
+ }: {
19
+ height?: string;
20
+ /** The box announces itself (one named status). `false` inside another loading region. Default `true`. */
21
+ region?: boolean;
22
+ }) {
17
23
  return (
18
- <div
19
- className="w-full animate-pulse overflow-hidden rounded-lg border border-ods-border bg-ods-card"
20
- style={{ height: height || 'calc(100vh - 250px)' }}
24
+ <UnifiedSkeleton
25
+ className="w-full overflow-hidden rounded-lg border border-ods-border"
26
+ height={height || 'calc(100vh - 250px)'}
27
+ aria-label={region ? 'Loading the embed' : undefined}
21
28
  />
22
29
  );
23
30
  }
@@ -14,8 +14,8 @@ export type { FigmaEmbedProps } from './figma-embed';
14
14
  export { ClaudeEmbed } from './claude-embed';
15
15
  export type { ClaudeEmbedProps, ClaudeEmbedKind } from './claude-embed';
16
16
 
17
- export { OGLinkPreview, OGLinkErrorBoundary } from './og-link-preview';
18
- export type { OGLinkPreviewProps, OGData, BuildPlaceholderUrl } from './og-link-preview';
17
+ export { OGLinkPreview, OGLinkErrorBoundary, OGLinkTileSkeleton } from './og-link-preview';
18
+ export type { OGLinkPreviewProps, OGData } from './og-link-preview';
19
19
 
20
20
  export { FileDownloadCard } from './file-download-card';
21
21
  export type { FileDownloadCardProps } from './file-download-card';
@@ -4,6 +4,7 @@ import { ExternalLink } from 'lucide-react';
4
4
  import { useMemo, useState } from 'react';
5
5
  import Link from '../../embed-shims/next-link';
6
6
  import { LinkedinIcon } from '../icons-v2-generated/brand-logos/linkedin-icon';
7
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
7
8
  import { LinkedInContainer } from './embed-container';
8
9
 
9
10
  /**
@@ -61,17 +62,17 @@ export function LinkedInEmbedClient({ url, height = 600 }: LinkedInEmbedProps) {
61
62
  <LinkedInContainer>
62
63
  <div className="relative w-full" style={{ height }}>
63
64
  {!loaded && (
64
- <div className="absolute inset-0 animate-pulse p-6">
65
+ <div className="absolute inset-0 p-6">
65
66
  <div className="mb-4 flex items-center space-x-3">
66
- <div className="h-12 w-12 rounded-full bg-ods-border" />
67
+ <UnifiedSkeleton className="h-12 w-12 rounded-full" />
67
68
  <div>
68
- <div className="mb-2 h-4 w-32 rounded bg-ods-border" />
69
- <div className="h-3 w-24 rounded bg-ods-border" />
69
+ <UnifiedSkeleton className="mb-2 h-4 w-32 rounded" />
70
+ <UnifiedSkeleton className="h-3 w-24 rounded" />
70
71
  </div>
71
72
  </div>
72
73
  <div className="space-y-2">
73
- <div className="h-4 w-full rounded bg-ods-border" />
74
- <div className="h-4 w-3/4 rounded bg-ods-border" />
74
+ <UnifiedSkeleton className="h-4 w-full rounded" />
75
+ <UnifiedSkeleton className="h-4 w-3/4 rounded" />
75
76
  </div>
76
77
  </div>
77
78
  )}
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useEffect, useState } from 'react';
4
4
  import Image from '../../embed-shims/next-image';
5
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
5
6
  import { useRichMarkdownRuntime } from './rich-markdown-runtime';
6
7
 
7
8
  /**
@@ -63,9 +64,10 @@ export function MarkdownImage({ src, alt }: { src: string; alt?: string }) {
63
64
  // Reserve a neutral box while probing so the layout doesn't jump when the image appears.
64
65
  if (!ratio) {
65
66
  return (
66
- <span
67
- className="mx-auto my-2 block w-full max-w-full animate-pulse rounded-lg bg-ods-card"
68
- style={{ aspectRatio: '3 / 2', maxHeight: `${MAX_H_REM}rem` }}
67
+ <UnifiedSkeleton
68
+ as="span"
69
+ className="mx-auto my-2 block aspect-[3/2] w-full max-w-full rounded-lg"
70
+ style={{ maxHeight: `${MAX_H_REM}rem` }}
69
71
  aria-hidden
70
72
  />
71
73
  );