@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
@@ -0,0 +1,52 @@
1
+ import { cn } from '../../utils/cn';
2
+ import { LoadingRegion } from './loading-region';
3
+ import { InteractiveSkeleton, TextSkeleton, UnifiedSkeleton } from './unified-skeleton';
4
+
5
+ export interface SettingsFormSkeletonProps {
6
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
7
+ region?: boolean;
8
+ /**
9
+ * How many fields each card holds, one entry per card, so the skeleton has the
10
+ * real shape of the screen behind it rather than a generic block.
11
+ */
12
+ cards?: number[];
13
+ className?: string;
14
+ }
15
+
16
+ /**
17
+ * A settings FORM while it loads: cards of labelled controls (a title and a
18
+ * line, then label, help line and control per field), and the save row under
19
+ * them.
20
+ */
21
+ export function SettingsFormSkeleton({ region = true, cards = [2, 3, 2, 2], className }: SettingsFormSkeletonProps) {
22
+ return (
23
+ <LoadingRegion
24
+ label="Loading settings"
25
+ announce={region}
26
+ className={cn('space-y-[var(--spacing-system-lf)]', className)}
27
+ >
28
+ {cards.map((fields, cardIndex) => (
29
+ <div
30
+ key={`settings-card-${cardIndex}`}
31
+ className="space-y-[var(--spacing-system-lf)] rounded-lg border border-ods-border bg-ods-card p-[var(--spacing-system-lf)]"
32
+ >
33
+ <div>
34
+ <TextSkeleton.Subheading className="mb-[var(--spacing-system-xsf)] w-32" />
35
+ <TextSkeleton.Caption className="w-full max-w-md" />
36
+ </div>
37
+ {Array.from({ length: fields }, (_, fieldIndex) => (
38
+ <div key={`settings-field-${cardIndex}-${fieldIndex}`} className="space-y-[var(--spacing-system-xsf)]">
39
+ <TextSkeleton.Caption className="w-40" />
40
+ <TextSkeleton.Caption className="w-full max-w-lg" />
41
+ <UnifiedSkeleton className="h-10 w-full rounded-md" />
42
+ </div>
43
+ ))}
44
+ </div>
45
+ ))}
46
+ <div className="flex items-center gap-[var(--spacing-system-mf)]">
47
+ <InteractiveSkeleton.Button className="w-32" />
48
+ <TextSkeleton.Caption className="w-64" />
49
+ </div>
50
+ </LoadingRegion>
51
+ );
52
+ }
@@ -1,5 +1,6 @@
1
1
  import type React from 'react';
2
2
  import { cn } from '../../utils/cn';
3
+ import { SKELETON_SURFACE_CLASS } from '../ui/skeleton-surface';
3
4
 
4
5
  interface UnifiedSkeletonProps extends React.HTMLAttributes<HTMLDivElement> {
5
6
  className?: string;
@@ -11,9 +12,15 @@ interface UnifiedSkeletonProps extends React.HTMLAttributes<HTMLDivElement> {
11
12
  */
12
13
  animate?: boolean;
13
14
  /**
14
- * Accessibility label for screen readers
15
+ * Names what is loading for screen readers. Only a bar that stands alone sets it: it then becomes a
16
+ * `role="status"`. Without it the bar is `aria-hidden`, and its `LoadingRegion` announces the loading once.
15
17
  */
16
18
  'aria-label'?: string;
19
+ /**
20
+ * The element drawn. `span` keeps the placeholder valid phrasing content where
21
+ * a `div` may not stand (inside a `p`, a heading, a label or an inline card).
22
+ */
23
+ as?: 'div' | 'span';
17
24
  }
18
25
 
19
26
  /**
@@ -25,13 +32,14 @@ interface UnifiedSkeletonProps extends React.HTMLAttributes<HTMLDivElement> {
25
32
  * - Color: #2A2A2A base with #3A3A3A pulse highlight
26
33
  * - Animation: 1.5s pulse duration, ease-in-out timing
27
34
  * - Responsive: Mobile-first approach with proper scaling
28
- * - Accessibility: ARIA labels and reduced motion support
35
+ * - Accessibility: hidden from assistive technology (the `LoadingRegion` around it announces), reduced motion support
29
36
  *
30
37
  * @param variant - Shape variant: default (rounded), text (rounded-sm), circular, rectangular
31
38
  * @param width - Custom width (defaults to full width)
32
39
  * @param height - Custom height (defaults to auto based on variant)
33
40
  * @param animate - Enable/disable animation (respects prefers-reduced-motion)
34
- * @param aria-label - Accessibility label for screen readers
41
+ * @param aria-label - Makes this one bar a `role="status"` with that name; otherwise it is `aria-hidden`
42
+ * @param as - The element drawn: `div` (default) or `span` for phrasing content
35
43
  */
36
44
  export function UnifiedSkeleton({
37
45
  className,
@@ -40,10 +48,9 @@ export function UnifiedSkeleton({
40
48
  height,
41
49
  animate = true,
42
50
  'aria-label': ariaLabel,
51
+ as: Tag = 'div',
43
52
  ...props
44
53
  }: UnifiedSkeletonProps) {
45
- const baseClasses = 'bg-ods-skeleton';
46
-
47
54
  const variantClasses = {
48
55
  default: 'rounded-md',
49
56
  text: 'rounded-sm',
@@ -58,8 +65,6 @@ export function UnifiedSkeleton({
58
65
  rectangular: 'h-4',
59
66
  };
60
67
 
61
- const animationClasses = animate ? 'animate-pulse motion-reduce:animate-none' : '';
62
-
63
68
  // An `aspect-*` utility sizes the box itself; a default height would win
64
69
  // over it (explicit height beats aspect-ratio) and collapse the box to 16px.
65
70
  const sizedByAspect = /(?:^|\s)aspect-/.test(className ?? '');
@@ -70,18 +75,18 @@ export function UnifiedSkeleton({
70
75
  };
71
76
 
72
77
  return (
73
- <div
78
+ <Tag
74
79
  className={cn(
75
- baseClasses,
80
+ animate ? SKELETON_SURFACE_CLASS : 'bg-ods-skeleton',
76
81
  variantClasses[variant],
77
82
  !height && !style.height && !sizedByAspect && defaultHeights[variant],
78
83
  !width && !style.width && variant !== 'circular' && 'w-full',
79
- animationClasses,
80
84
  className,
81
85
  )}
82
86
  style={style}
83
- role="status"
84
- aria-label={ariaLabel || 'Loading content'}
87
+ // A bar is decoration: hidden from assistive technology unless the caller names what is loading.
88
+ // The loading CONTAINER says it once (`LoadingRegion`: aria-busy plus one polite status).
89
+ {...(ariaLabel ? { role: 'status', 'aria-label': ariaLabel } : { 'aria-hidden': true })}
85
90
  {...props}
86
91
  />
87
92
  );
@@ -95,48 +100,28 @@ export const TextSkeleton = {
95
100
  * Large heading skeleton (h1, h2)
96
101
  */
97
102
  Heading: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
98
- <UnifiedSkeleton
99
- variant="text"
100
- className={cn('h-8 content-md:h-10 content-lg:h-12', className)}
101
- aria-label="Loading heading"
102
- {...props}
103
- />
103
+ <UnifiedSkeleton variant="text" className={cn('h-8 content-md:h-10 content-lg:h-12', className)} {...props} />
104
104
  ),
105
105
 
106
106
  /**
107
107
  * Medium heading skeleton (h3, h4)
108
108
  */
109
109
  Subheading: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
110
- <UnifiedSkeleton
111
- variant="text"
112
- className={cn('h-6 content-md:h-7 content-lg:h-8', className)}
113
- aria-label="Loading subheading"
114
- {...props}
115
- />
110
+ <UnifiedSkeleton variant="text" className={cn('h-6 content-md:h-7 content-lg:h-8', className)} {...props} />
116
111
  ),
117
112
 
118
113
  /**
119
114
  * Body text skeleton
120
115
  */
121
116
  Body: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
122
- <UnifiedSkeleton
123
- variant="text"
124
- className={cn('h-4 content-md:h-5', className)}
125
- aria-label="Loading text"
126
- {...props}
127
- />
117
+ <UnifiedSkeleton variant="text" className={cn('h-4 content-md:h-5', className)} {...props} />
128
118
  ),
129
119
 
130
120
  /**
131
121
  * Small text skeleton (captions, metadata)
132
122
  */
133
123
  Caption: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
134
- <UnifiedSkeleton
135
- variant="text"
136
- className={cn('h-3 content-md:h-4', className)}
137
- aria-label="Loading caption"
138
- {...props}
139
- />
124
+ <UnifiedSkeleton variant="text" className={cn('h-3 content-md:h-4', className)} {...props} />
140
125
  ),
141
126
  };
142
127
 
@@ -151,7 +136,6 @@ export const InteractiveSkeleton = {
151
136
  <UnifiedSkeleton
152
137
  variant="default"
153
138
  className={cn('h-10 w-32 content-md:h-12 content-md:w-40', className)}
154
- aria-label="Loading button"
155
139
  {...props}
156
140
  />
157
141
  ),
@@ -160,24 +144,14 @@ export const InteractiveSkeleton = {
160
144
  * Input field skeleton
161
145
  */
162
146
  Input: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
163
- <UnifiedSkeleton
164
- variant="default"
165
- className={cn('h-10 w-full content-md:h-12', className)}
166
- aria-label="Loading input field"
167
- {...props}
168
- />
147
+ <UnifiedSkeleton variant="default" className={cn('h-10 w-full content-md:h-12', className)} {...props} />
169
148
  ),
170
149
 
171
150
  /**
172
151
  * Filter chip skeleton
173
152
  */
174
153
  Chip: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
175
- <UnifiedSkeleton
176
- variant="default"
177
- className={cn('h-8 w-20 rounded-full', className)}
178
- aria-label="Loading filter"
179
- {...props}
180
- />
154
+ <UnifiedSkeleton variant="default" className={cn('h-8 w-20 rounded-full', className)} {...props} />
181
155
  ),
182
156
  };
183
157
 
@@ -199,14 +173,7 @@ export const MediaSkeleton = {
199
173
  lg: 'h-16 w-16',
200
174
  };
201
175
 
202
- return (
203
- <UnifiedSkeleton
204
- variant="circular"
205
- className={cn(sizeClasses[size], className)}
206
- aria-label="Loading profile image"
207
- {...props}
208
- />
209
- );
176
+ return <UnifiedSkeleton variant="circular" className={cn(sizeClasses[size], className)} {...props} />;
210
177
  },
211
178
 
212
179
  /**
@@ -214,12 +181,7 @@ export const MediaSkeleton = {
214
181
  * so loading state never causes a height shift when card data arrives)
215
182
  */
216
183
  CardImage: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
217
- <UnifiedSkeleton
218
- variant="default"
219
- className={cn('aspect-[1200/630] w-full', className)}
220
- aria-label="Loading image"
221
- {...props}
222
- />
184
+ <UnifiedSkeleton variant="default" className={cn('aspect-[1200/630] w-full', className)} {...props} />
223
185
  ),
224
186
 
225
187
  /**
@@ -236,13 +198,6 @@ export const MediaSkeleton = {
236
198
  lg: 'h-8 w-8',
237
199
  };
238
200
 
239
- return (
240
- <UnifiedSkeleton
241
- variant="default"
242
- className={cn(sizeClasses[size], className)}
243
- aria-label="Loading icon"
244
- {...props}
245
- />
246
- );
201
+ return <UnifiedSkeleton variant="default" className={cn(sizeClasses[size], className)} {...props} />;
247
202
  },
248
203
  };
@@ -1,14 +1,17 @@
1
1
  import { cn } from '../../utils/cn';
2
+ import { LoadingRegion } from './loading-region';
2
3
  import { UnifiedSkeleton, TextSkeleton } from './unified-skeleton';
3
4
 
4
5
  interface WizardLayoutSkeletonProps {
6
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
7
+ region?: boolean;
5
8
  steps?: number;
6
9
  className?: string;
7
10
  }
8
11
 
9
- export function WizardLayoutSkeleton({ steps = 6, className }: WizardLayoutSkeletonProps) {
12
+ export function WizardLayoutSkeleton({ region = true, steps = 6, className }: WizardLayoutSkeletonProps) {
10
13
  return (
11
- <div className={cn('space-y-6', className)} role="status" aria-label="Loading wizard layout">
14
+ <LoadingRegion label="Loading the wizard" announce={region} className={cn('space-y-6', className)}>
12
15
  {/* Progress bar */}
13
16
  <div className="flex flex-wrap items-center gap-2">
14
17
  {Array.from({ length: steps }).map((_, i) => (
@@ -27,6 +30,6 @@ export function WizardLayoutSkeleton({ steps = 6, className }: WizardLayoutSkele
27
30
  <UnifiedSkeleton className="h-10 w-24 rounded" />
28
31
  <UnifiedSkeleton className="h-10 w-32 rounded" />
29
32
  </div>
30
- </div>
33
+ </LoadingRegion>
31
34
  );
32
35
  }
@@ -6,6 +6,7 @@ import { cn } from '../utils/cn';
6
6
  import type { MediaItem } from '../utils/media-carousel-utils-stub';
7
7
  import { Video } from './features/video';
8
8
  import { ImageOffIcon } from './icons-v2-generated/audio-and-visual/image-off-icon';
9
+ import { UnifiedSkeleton } from './loading/unified-skeleton';
9
10
  import { Button } from './ui/button';
10
11
 
11
12
  // Navigation icons
@@ -214,7 +215,7 @@ export const MediaCarousel = memo(function MediaCarouselImpl({
214
215
  const imageLoaded = loadedImageSrc === rawSrc;
215
216
  return (
216
217
  <div className="absolute inset-0 bg-ods-bg">
217
- {!imageLoaded && <div className="absolute inset-0 z-[1] animate-pulse bg-ods-card/90" aria-hidden />}
218
+ {!imageLoaded && <UnifiedSkeleton className="absolute inset-0 z-[1] h-full rounded-none" aria-hidden />}
218
219
  <Image
219
220
  src={displayImageSrc(rawSrc)}
220
221
  alt={item.alt || `Media ${index + 1}`}
@@ -29,6 +29,7 @@ import {
29
29
  import { cn } from '../../utils/cn';
30
30
  import type { FormRescueDefinition } from '../../utils/form-rescue';
31
31
  import { HUBSPOT_DO_NOT_COLLECT_FORM_PROPS } from '../../utils/hubspot-collected-forms';
32
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
32
33
  import {
33
34
  Button,
34
35
  FieldWrapper,
@@ -44,7 +45,6 @@ import {
44
45
  CheckboxBlock,
45
46
  RadioGroup,
46
47
  RadioGroupItem,
47
- Skeleton,
48
48
  } from '../ui';
49
49
  import { HoneypotField } from '../ui/honeypot-field';
50
50
 
@@ -874,21 +874,24 @@ export function BookingFormSkeleton({
874
874
  {skeletonRows(fieldRows ?? DEFAULT_FIELD_ROWS).map(row => (
875
875
  <div key={row.map(s => s.name).join('|')} className={ROW_GRID}>
876
876
  {row.map((slot, slotIndex) => (
877
- <Skeleton key={slot.name} className={cn(FIELD_SKELETON_CLASS, slotColumnClass(row, slot, slotIndex))} />
877
+ <UnifiedSkeleton
878
+ key={slot.name}
879
+ className={cn(FIELD_SKELETON_CLASS, slotColumnClass(row, slot, slotIndex))}
880
+ />
878
881
  ))}
879
882
  </div>
880
883
  ))}
881
884
  {/* Without rows there is no telling how many questions the link declares: one long answer stands for them. */}
882
- {!fieldRows && <Skeleton className="h-[7.75rem] w-full" />}
883
- {consent && <Skeleton className="h-[4.25rem] w-full" />}
885
+ {!fieldRows && <UnifiedSkeleton className="h-[7.75rem] w-full" />}
886
+ {consent && <UnifiedSkeleton className="h-[4.25rem] w-full" />}
884
887
  {footerNote ? (
885
888
  <div className={FOOTER_ROW_CLASS}>
886
- <Skeleton className="h-5 min-w-40 flex-1" />
887
- <Skeleton className={cn('h-12 w-full', SUBMIT_WIDE_CLASS)} />
889
+ <UnifiedSkeleton className="h-5 min-w-40 flex-1" />
890
+ <UnifiedSkeleton className={cn('h-12 w-full', SUBMIT_WIDE_CLASS)} />
888
891
  </div>
889
892
  ) : (
890
893
  <div className={FOOTER_BARE_CLASS}>
891
- <Skeleton className="h-12 w-40" />
894
+ <UnifiedSkeleton className="h-12 w-40" />
892
895
  </div>
893
896
  )}
894
897
  </div>
@@ -4,7 +4,8 @@ import type { MeetingHost } from '../../schemas/meeting-booking-schema';
4
4
  import { cn } from '../../utils/cn';
5
5
  import { formatDurationCompact } from '../../utils/format';
6
6
  import { BackButton } from '../layout/back-button';
7
- import { SquareAvatar, AvatarStack, Button, Skeleton } from '../ui';
7
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
8
+ import { SquareAvatar, AvatarStack, Button } from '../ui';
8
9
  import { TimezoneSelect } from '../ui/timezone-select';
9
10
 
10
11
  /**
@@ -127,18 +128,18 @@ export function ContextPanelSkeleton({
127
128
  <div className={STRIP_MAIN}>
128
129
  <div className={IDENTITY_ROW}>
129
130
  <div className="flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xs)] content-lg:flex-none">
130
- <Skeleton className="h-8 w-8 shrink-0 rounded-full" />
131
+ <UnifiedSkeleton className="h-8 w-8 shrink-0 rounded-full" />
131
132
  <div className="flex flex-1 flex-col gap-[var(--spacing-system-xxs)]">
132
- <Skeleton className="h-5 w-32" />
133
- <Skeleton className="h-4 w-24" />
133
+ <UnifiedSkeleton className="h-5 w-32" />
134
+ <UnifiedSkeleton className="h-4 w-24" />
134
135
  </div>
135
136
  </div>
136
- <Skeleton className="h-4 w-20 shrink-0" />
137
+ <UnifiedSkeleton className="h-4 w-20 shrink-0" />
137
138
  </div>
138
139
  </div>
139
140
  <div className={STRIP_ASIDE}>
140
141
  <p className={FIELD_LABEL_CLASS}>Timezone</p>
141
- <Skeleton className="h-12 w-full" />
142
+ <UnifiedSkeleton className="h-12 w-full" />
142
143
  </div>
143
144
  </div>
144
145
  </div>
@@ -254,7 +255,7 @@ export function SchedulerContextPanel({
254
255
  }}
255
256
  />
256
257
  ) : (
257
- <Skeleton className="h-12 w-full" />
258
+ <UnifiedSkeleton className="h-12 w-full" />
258
259
  )}
259
260
  </div>
260
261
  )}
@@ -30,8 +30,9 @@ import { contentFetch } from '../../utils/embed-content-fetch';
30
30
  import { formatDurationCompact, formatDateWithTimezone, VIEWER_TIMEZONE } from '../../utils/format';
31
31
  import { pageCount } from '../../utils/search-params';
32
32
  import { EmptyState } from '../empty-state';
33
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
33
34
  import { PersistentPaginationWrapper } from '../persistent-pagination';
34
- import { AvatarStack, StatusBadge, Skeleton } from '../ui';
35
+ import { AvatarStack, StatusBadge } from '../ui';
35
36
 
36
37
  export interface MeetingSchedulerDirectoryProps {
37
38
  /** Endpoints prefix, default '' (same-origin `/api/meetings`). */
@@ -127,16 +128,16 @@ export function MeetingSchedulerDirectoryRowSkeleton() {
127
128
  return (
128
129
  <div className="flex min-h-20 w-full items-center gap-4 rounded-lg border border-ods-border bg-ods-card px-4 py-3">
129
130
  <div className="flex min-w-0 flex-1 flex-col justify-center gap-1">
130
- <Skeleton className="h-5 w-1/2" />
131
- <Skeleton className="h-4 w-1/3" />
131
+ <UnifiedSkeleton className="h-5 w-1/2" />
132
+ <UnifiedSkeleton className="h-4 w-1/3" />
132
133
  </div>
133
- <Skeleton className="hidden h-6 w-28 shrink-0 content-sm:block" />
134
- <Skeleton className="h-10 w-10 shrink-0 rounded-full" />
134
+ <UnifiedSkeleton className="hidden h-6 w-28 shrink-0 content-sm:block" />
135
+ <UnifiedSkeleton className="h-10 w-10 shrink-0 rounded-full" />
135
136
  <div className="hidden w-44 shrink-0 flex-col items-end gap-1 content-md:flex">
136
- <Skeleton className="h-4 w-24" />
137
- <Skeleton className="h-5 w-32" />
137
+ <UnifiedSkeleton className="h-4 w-24" />
138
+ <UnifiedSkeleton className="h-5 w-32" />
138
139
  </div>
139
- <Skeleton className="size-12 shrink-0 rounded-md" />
140
+ <UnifiedSkeleton className="size-12 shrink-0 rounded-md" />
140
141
  </div>
141
142
  );
142
143
  }
@@ -205,7 +206,7 @@ export function MeetingSchedulerDirectory({
205
206
  ))}
206
207
  </div>
207
208
  <div className={cn('mt-8 flex w-full items-center justify-center', PAGINATION_SLOT_H)}>
208
- <Skeleton className="h-10 w-64" />
209
+ <UnifiedSkeleton className="h-10 w-64" />
209
210
  </div>
210
211
  </div>
211
212
  );
@@ -57,6 +57,7 @@ import { cn } from '../../utils/cn';
57
57
  import { FORM_RESCUE_ATTEMPT_FIELD, type FormRescueDefinition } from '../../utils/form-rescue';
58
58
  import { formatDurationCompact, formatDateWithTimezone } from '../../utils/format';
59
59
  import { BackButton } from '../layout/back-button';
60
+ import { LoadingRegion } from '../loading/loading-region';
60
61
  import { Alert, AlertDescription, Button } from '../ui';
61
62
  import {
62
63
  BookingForm,
@@ -808,10 +809,10 @@ export function HubSpotMeetingScheduler({
808
809
  if (modal && isLoadingAvailability && !availability) {
809
810
  return (
810
811
  <div className={cn(MODAL_STACK_CLASS, className)}>
811
- <div className={MODAL_CARD_CLASS}>
812
+ <LoadingRegion label="Loading available times" className={MODAL_CARD_CLASS}>
812
813
  <SchedulerModalHeaderSkeleton />
813
814
  <SlotPickerSkeleton monthOffset={monthOffset} layout="modal" />
814
- </div>
815
+ </LoadingRegion>
815
816
  <ModalFooter
816
817
  onCancel={onBack}
817
818
  primary={
@@ -831,7 +832,7 @@ export function HubSpotMeetingScheduler({
831
832
  // shifts when it swaps.
832
833
  return (
833
834
  <div className={cardClass}>
834
- <div className={innerClass}>
835
+ <LoadingRegion label="Loading available times" className={innerClass}>
835
836
  {!formOnly && <ContextPanelSkeleton onBack={backEdge} className={CONTEXT_PANEL_CLASS} />}
836
837
  <div className={actionPanelClass}>
837
838
  {/* Both terms matter. Without `flow` this stays a calendar where
@@ -852,7 +853,7 @@ export function HubSpotMeetingScheduler({
852
853
  <SlotPickerSkeleton monthOffset={monthOffset} />
853
854
  )}
854
855
  </div>
855
- </div>
856
+ </LoadingRegion>
856
857
  </div>
857
858
  );
858
859
  }
@@ -3,7 +3,8 @@
3
3
  import type { MeetingHost } from '../../schemas/meeting-booking-schema';
4
4
  import { cn } from '../../utils/cn';
5
5
  import { formatDurationCompact } from '../../utils/format';
6
- import { SquareAvatar, AvatarStack, Button, Skeleton } from '../ui';
6
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
7
+ import { SquareAvatar, AvatarStack, Button } from '../ui';
7
8
  import { TimezoneSelect } from '../ui/timezone-select';
8
9
 
9
10
  /**
@@ -114,7 +115,7 @@ export function SchedulerModalHeader({
114
115
  }}
115
116
  />
116
117
  ) : (
117
- <Skeleton className="h-12 w-full" />
118
+ <UnifiedSkeleton className="h-12 w-full" />
118
119
  )}
119
120
  </div>
120
121
  )}
@@ -128,17 +129,17 @@ export function SchedulerModalHeaderSkeleton() {
128
129
  <>
129
130
  <div className={STRIP_CLASS}>
130
131
  <div className="flex items-center gap-[var(--spacing-system-xs)]">
131
- <Skeleton className="h-8 w-8 shrink-0 rounded-full" />
132
+ <UnifiedSkeleton className="h-8 w-8 shrink-0 rounded-full" />
132
133
  <div className="flex flex-col gap-[var(--spacing-system-xxs)]">
133
- <Skeleton className="h-5 w-32" />
134
- <Skeleton className="h-4 w-24" />
134
+ <UnifiedSkeleton className="h-5 w-32" />
135
+ <UnifiedSkeleton className="h-4 w-24" />
135
136
  </div>
136
137
  </div>
137
- <Skeleton className="h-4 w-20 shrink-0" />
138
+ <UnifiedSkeleton className="h-4 w-20 shrink-0" />
138
139
  </div>
139
140
  <div className={cn(ROW_CLASS, 'flex flex-col gap-[var(--spacing-system-xxs)]')}>
140
141
  <p className={FIELD_LABEL_CLASS}>Timezone</p>
141
- <Skeleton className="h-12 w-full" />
142
+ <UnifiedSkeleton className="h-12 w-full" />
142
143
  </div>
143
144
  </>
144
145
  );
@@ -5,7 +5,8 @@ import { useCallback, useMemo } from 'react';
5
5
  import { cn } from '../../utils/cn';
6
6
  import { formatDateWithTimezone, formatTimeWithTimezone, VIEWER_TIMEZONE } from '../../utils/format';
7
7
  import { MAX_MONTH_OFFSET } from '../../utils/hubspot-meetings-convention';
8
- import { Button, DatePickerCalendar, Skeleton } from '../ui';
8
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
9
+ import { Button, DatePickerCalendar } from '../ui';
9
10
 
10
11
  /**
11
12
  * SlotPicker — day layer + time-chip grid for the meeting scheduler.
@@ -363,7 +364,7 @@ export function TimeChipsSkeleton() {
363
364
  {/* The day label is data — but it is held inside the REAL heading line
364
365
  box, so the skeleton's first row sits exactly where the label lands. */}
365
366
  <div className={COLUMN_HEADING_CLASS}>
366
- <Skeleton className="inline-block h-4 w-40 align-middle" />
367
+ <UnifiedSkeleton className="inline-block h-4 w-40 align-middle" />
367
368
  </div>
368
369
  <div className={CHIP_GRID_CLASS}>
369
370
  {/* Enough to fill the visible scroll box at any column count — the
@@ -371,7 +372,7 @@ export function TimeChipsSkeleton() {
371
372
  lands flush and a partial last row is the honest shape anyway. */}
372
373
  {Array.from({ length: 16 }, (_, i) => (
373
374
  // h-11 content-md:h-12 — the loaded chip's own default-size height.
374
- <Skeleton key={i} className={cn(CHIP_CLASS, 'h-11 content-md:h-12')} />
375
+ <UnifiedSkeleton key={i} className={cn(CHIP_CLASS, 'h-11 content-md:h-12')} />
375
376
  ))}
376
377
  </div>
377
378
  </>
@@ -11,6 +11,7 @@ import { LogOutIcon } from '../icons-v2-generated/interface/log-out-icon';
11
11
  import { OpenframeLogoIcon } from '../icons-v2-generated/logos/openframe-logo-icon';
12
12
  import { OpenframeTextIcon } from '../icons-v2-generated/logos/openframe-text-icon';
13
13
  import { UserClassicIcon } from '../icons-v2-generated/users/user-classic-icon';
14
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
14
15
  import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, SquareAvatar } from '../ui';
15
16
  import { HeaderButton } from './header-button';
16
17
  import { HeaderGlobalSearch } from './header-global-search';
@@ -387,7 +388,7 @@ const CELL_VISIBILITY: Record<Exclude<HeaderLoadingCell, 'wide'>, string | undef
387
388
  function HeaderCellSkeleton({ className }: { className?: string }) {
388
389
  return (
389
390
  <div className={cn('flex h-full w-14 shrink-0 items-center justify-center border-l border-ods-border', className)}>
390
- <div className="h-6 w-6 animate-pulse rounded bg-ods-border" />
391
+ <UnifiedSkeleton className="h-6 w-6 rounded" />
391
392
  </div>
392
393
  );
393
394
  }
@@ -403,8 +404,8 @@ function HeaderCellSkeleton({ className }: { className?: string }) {
403
404
  function HeaderWideCellSkeleton() {
404
405
  return (
405
406
  <div className="flex h-full w-14 shrink-0 items-center justify-center gap-2 border-l border-ods-border md:w-[140px] md:px-4">
406
- <div className="h-6 w-6 shrink-0 animate-pulse rounded bg-ods-border" />
407
- <div className="hidden h-5 animate-pulse rounded bg-ods-border md:block md:w-[72px]" />
407
+ <UnifiedSkeleton className="h-6 w-6 shrink-0 rounded" />
408
+ <UnifiedSkeleton className="hidden h-5 rounded md:block md:w-[72px]" />
408
409
  </div>
409
410
  );
410
411
  }
@@ -438,13 +439,13 @@ function AppHeaderSkeleton({
438
439
  leading={
439
440
  // Burger cell: mobile only, in CSS.
440
441
  <div className="flex h-full w-14 shrink-0 items-center justify-center border-r border-ods-border md:hidden">
441
- <div className="h-6 w-6 animate-pulse rounded bg-ods-border" />
442
+ <UnifiedSkeleton className="h-6 w-6 rounded" />
442
443
  </div>
443
444
  }
444
445
  logo={
445
446
  <>
446
- <div className="h-6 w-6 shrink-0 animate-pulse rounded bg-ods-border" />
447
- <div className="h-4 w-24 animate-pulse rounded bg-ods-border" />
447
+ <UnifiedSkeleton className="h-6 w-6 shrink-0 rounded" />
448
+ <UnifiedSkeleton className="h-4 w-24 rounded" />
448
449
  </>
449
450
  }
450
451
  // `md:hidden` belongs on the WRAPPER, not the placeholder inside it:
@@ -455,7 +456,7 @@ function AppHeaderSkeleton({
455
456
  // it back on handoff, which is the exact jump this branch removes.
456
457
  logoClassName="gap-2 md:hidden"
457
458
  // `TopNavigation` already hides the center zone below `centerBreakpoint`.
458
- center={showSearch ? <div className="h-10 w-full animate-pulse rounded-md bg-ods-border" /> : undefined}
459
+ center={showSearch ? <UnifiedSkeleton className="h-10 w-full rounded-md" /> : undefined}
459
460
  sideActions={
460
461
  <>
461
462
  {/* Mobile-only search trigger; from md the search lives in the center zone. */}
@@ -3,6 +3,7 @@
3
3
  import { ChevronDown, ChevronUp, FileText, Folder, FolderOpen } from 'lucide-react';
4
4
  import { cn } from '../../utils/cn';
5
5
  import { DEFAULT_FOLDER_INDEX_FILE as CANONICAL_FOLDER_INDEX_FILE } from '../../utils/doc-tree-nav';
6
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
6
7
 
7
8
  export interface NavigationNode {
8
9
  id: string;
@@ -93,7 +94,7 @@ export function MultiLevelNavigation({
93
94
  return (
94
95
  <div className={cn('space-y-2', className)}>
95
96
  {[1, 2, 3, 4].map(i => (
96
- <div key={i} className="h-12 animate-pulse rounded-lg bg-ods-skeleton p-3" />
97
+ <UnifiedSkeleton key={i} className="h-12 rounded-lg p-3" />
97
98
  ))}
98
99
  </div>
99
100
  );
@@ -241,7 +242,7 @@ export function MobileNavigationDropdown({
241
242
  return (
242
243
  <div className={cn('space-y-2', className)}>
243
244
  {[1, 2, 3].map(i => (
244
- <div key={i} className="h-10 animate-pulse rounded-lg bg-ods-skeleton p-3" />
245
+ <UnifiedSkeleton key={i} className="h-10 rounded-lg p-3" />
245
246
  ))}
246
247
  </div>
247
248
  );