@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
@@ -2,6 +2,7 @@ import type { ReactNode } from 'react';
2
2
  import Link from '../../embed-shims/next-link';
3
3
  import { cn } from '../../utils/cn';
4
4
  import { QuestionCircleIcon } from '../icons-v2-generated/signs-and-symbols/question-circle-icon';
5
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
5
6
  import { CircularProgress, type CircularProgressOverflow, type CircularProgressVariant } from './circular-progress';
6
7
  import { FloatingTooltip } from './floating-tooltip';
7
8
  import { Tag } from './tag';
@@ -84,10 +85,24 @@ export interface DashboardInfoCardProps {
84
85
  */
85
86
  caption?: ReactNode;
86
87
  /**
87
- * The figure is still being fetched: the SAME card, its title, value and caption
88
- * drawn as bars of their own line heights, so the loaded card replaces it in place.
88
+ * The figure is still being fetched: the SAME card, so the loaded card replaces it in
89
+ * place. `title` / `titleSlot` / `titleTag` / `icon` are drawn as they are (they are known
90
+ * before the data; with neither title a bar holds the title line), the value and caption are
91
+ * bars of their own line heights, the progress ring is held when `showProgress` is set, and
92
+ * the percentage when `loadingShowsPercentage` is set, the sub-value when `loadingShowsSubValue` is set.
89
93
  */
90
94
  loading?: boolean;
95
+ /**
96
+ * While `loading`: hold the percentage's box (plain "(NN%)" text, or a `Tag` when
97
+ * `percentageDisplay` / `progressVariant` would draw one), because the loaded card will show
98
+ * a percentage. Default `false`.
99
+ */
100
+ loadingShowsPercentage?: boolean;
101
+ /**
102
+ * While `loading`: hold the `subValue`'s box (one `text-h6` line beside the value) for a card
103
+ * whose loaded state will carry one. Default `false`.
104
+ */
105
+ loadingShowsSubValue?: boolean;
91
106
  }
92
107
 
93
108
  export function DashboardInfoCard({
@@ -109,17 +124,30 @@ export function DashboardInfoCard({
109
124
  subValue,
110
125
  caption,
111
126
  loading = false,
127
+ loadingShowsPercentage = false,
128
+ loadingShowsSubValue = false,
112
129
  }: DashboardInfoCardProps) {
113
130
  const formattedValue = typeof value === 'number' ? value.toLocaleString() : value;
114
131
 
132
+ const percentageAsTag =
133
+ percentageDisplay === 'tag' ||
134
+ (percentageDisplay === 'auto' && (progressVariant === 'warning' || progressVariant === 'error'));
135
+
115
136
  const renderPercentage = () => {
137
+ if (loading) {
138
+ if (!loadingShowsPercentage) return null;
139
+ // The box the loaded percentage takes: a `Tag` (h-8) or one `text-h4` line.
140
+ return percentageAsTag ? (
141
+ <UnifiedSkeleton className="h-8 w-12 shrink-0 rounded-md" />
142
+ ) : (
143
+ <p className="text-h4">
144
+ <UnifiedSkeleton as="span" className="block h-[1lh] w-12 rounded" />
145
+ </p>
146
+ );
147
+ }
116
148
  if (percentage === undefined) return null;
117
149
 
118
- const asTag =
119
- percentageDisplay === 'tag' ||
120
- (percentageDisplay === 'auto' && (progressVariant === 'warning' || progressVariant === 'error'));
121
-
122
- if (asTag) {
150
+ if (percentageAsTag) {
123
151
  const tagVariant =
124
152
  progressVariant === 'warning' || progressVariant === 'error'
125
153
  ? progressVariant
@@ -133,13 +161,13 @@ export function DashboardInfoCard({
133
161
  };
134
162
 
135
163
  const renderProgress = () => {
136
- if (!showProgress || percentage === undefined) return null;
164
+ if (!showProgress || (percentage === undefined && !loading)) return null;
137
165
 
138
166
  // Keep the ring proportionally weighted (10px stroke at the 56px default).
139
167
  const strokeFor = (size: number) => Math.max(2, Math.round((size * 10) / 56));
140
168
 
141
169
  const common = {
142
- percentage,
170
+ percentage: percentage ?? 0,
143
171
  variant: progressVariant,
144
172
  overflow: progressOverflow,
145
173
  showLabel: false,
@@ -174,6 +202,23 @@ export function DashboardInfoCard({
174
202
  rings.push({ key: 'lg', size: lg, className: 'hidden content-lg:block' });
175
203
  }
176
204
 
205
+ if (loading) {
206
+ // The ring's own box at each breakpoint, as a circle.
207
+ return (
208
+ <>
209
+ {rings.map(ring => (
210
+ <UnifiedSkeleton
211
+ key={ring.key}
212
+ variant="circular"
213
+ width={ring.size}
214
+ height={ring.size}
215
+ className={cn('shrink-0', ring.className)}
216
+ />
217
+ ))}
218
+ </>
219
+ );
220
+ }
221
+
177
222
  return (
178
223
  <>
179
224
  {rings.map(ring => (
@@ -203,22 +248,31 @@ export function DashboardInfoCard({
203
248
  <div className="flex min-w-0 flex-1 flex-col">
204
249
  {/* Title row: caption and/or tag (Figma "status" variant) */}
205
250
  <div className="flex items-center gap-[var(--spacing-system-xxs)]">
206
- {loading ? (
207
- <p className="text-h5">
208
- <span className="block h-[1lh] w-20 animate-pulse rounded bg-ods-border" />
209
- </p>
210
- ) : (
211
- (titleSlot ?? (title !== undefined && <p className="truncate text-ods-text-secondary text-h5">{title}</p>))
212
- )}
251
+ {titleSlot ??
252
+ (title !== undefined ? (
253
+ <p className="truncate text-ods-text-secondary text-h5">{title}</p>
254
+ ) : (
255
+ loading && (
256
+ <p className="text-h5">
257
+ <UnifiedSkeleton as="span" className="block h-[1lh] w-20 rounded" />
258
+ </p>
259
+ )
260
+ ))}
213
261
  {titleTag}
214
262
  </div>
215
263
 
216
264
  {/* Value and percentage */}
217
265
  <div className="flex items-center gap-[var(--spacing-system-xs)]">
218
266
  <p className={cn('truncate text-ods-text-primary text-h3 content-md:text-h2', valueClassName)}>
219
- {loading ? <span className="block h-[1lh] w-24 animate-pulse rounded bg-ods-border" /> : formattedValue}
267
+ {loading ? <UnifiedSkeleton as="span" className="block h-[1lh] w-24 rounded" /> : formattedValue}
220
268
  </p>
221
- {subValue && <p className="text-ods-text-secondary text-h6">{subValue}</p>}
269
+ {loading
270
+ ? loadingShowsSubValue && (
271
+ <p className="text-h6">
272
+ <UnifiedSkeleton as="span" className="block h-[1lh] w-16 rounded" />
273
+ </p>
274
+ )
275
+ : subValue && <p className="text-ods-text-secondary text-h6">{subValue}</p>}
222
276
  {renderPercentage()}
223
277
  {tooltip && (
224
278
  <FloatingTooltip content={tooltip} side="top">
@@ -232,7 +286,7 @@ export function DashboardInfoCard({
232
286
  {/* Two lines kept for the caption, loading or loaded, so a narrow tile is one height. */}
233
287
  {caption && (
234
288
  <p className="line-clamp-2 min-h-[2lh] text-ods-text-secondary text-h6">
235
- {loading ? <span className="block h-[1lh] w-32 animate-pulse rounded bg-ods-border" /> : caption}
289
+ {loading ? <UnifiedSkeleton as="span" className="block h-[1lh] w-32 rounded" /> : caption}
236
290
  </p>
237
291
  )}
238
292
  </div>
@@ -256,6 +310,7 @@ export function DashboardInfoCard({
256
310
  return (
257
311
  <Link
258
312
  href={href}
313
+ aria-busy={loading || undefined}
259
314
  className={cn(
260
315
  baseClassName,
261
316
  captionClassName,
@@ -269,5 +324,11 @@ export function DashboardInfoCard({
269
324
  );
270
325
  }
271
326
 
272
- return <div className={cn(baseClassName, captionClassName, className)}>{cardContent}</div>;
327
+ // Loading, the card is busy: one card announces nothing of its own (a grid of them would say it once per
328
+ // card); the region it sits in does.
329
+ return (
330
+ <div aria-busy={loading || undefined} className={cn(baseClassName, captionClassName, className)}>
331
+ {cardContent}
332
+ </div>
333
+ );
273
334
  }
@@ -1,5 +1,6 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import { formatDate } from '../../utils/format';
3
+ import { TextSkeleton, UnifiedSkeleton } from '../loading/unified-skeleton';
3
4
 
4
5
  export interface DataAttributionProps {
5
6
  /** The source's mark, sized by the caller (e.g. `<CartaIcon className="h-4 w-4" />`). */
@@ -43,3 +44,20 @@ export function DataAttribution({ icon, source, lastUpdated, action }: DataAttri
43
44
  </div>
44
45
  );
45
46
  }
47
+
48
+ /**
49
+ * `DataAttribution` while its date loads: the same line (two lines below
50
+ * `content-sm`, one row above it) with text bars, so the line does not move
51
+ * when it fills in.
52
+ */
53
+ export function DataAttributionSkeleton() {
54
+ return (
55
+ <div className={LINE_CLASS} aria-hidden="true">
56
+ <div className={ITEM_CLASS}>
57
+ <UnifiedSkeleton className="size-4 rounded" />
58
+ <TextSkeleton.Body className="w-40" />
59
+ </div>
60
+ <TextSkeleton.Body className="w-52" />
61
+ </div>
62
+ );
63
+ }
@@ -3,6 +3,7 @@
3
3
  import { useSyncExternalStore, type ReactNode } from 'react';
4
4
  import { useIsomorphicLayoutEffect } from '../../../hooks/ui/use-isomorphic-layout-effect';
5
5
  import { cn } from '../../../utils/cn';
6
+ import { LoadingRegion } from '../../loading/loading-region';
6
7
  import type { NoDataProps } from '../no-data';
7
8
  import { useDataTableContext } from './data-table';
8
9
  import { DataTableEmpty } from './data-table-empty';
@@ -19,6 +20,11 @@ export interface DataTableBodyProps<T = unknown> {
19
20
  emptyState?: NoDataProps;
20
21
  /** Skeleton row count when loading. Default `10`. */
21
22
  skeletonRows?: number;
23
+ /**
24
+ * The loading state announces itself (`LoadingRegion`: aria-busy plus one "Loading results" status).
25
+ * `false` when the table sits inside a loading region of its own (a page skeleton). Default `true`.
26
+ */
27
+ loadingRegion?: boolean;
22
28
  className?: string;
23
29
  /**
24
30
  * Per-row class name. Prefer `useCallback` for function form to avoid
@@ -95,6 +101,7 @@ export function DataTableBody<T = unknown>({
95
101
  emptyMessage,
96
102
  emptyState,
97
103
  skeletonRows = 10,
104
+ loadingRegion = true,
98
105
  className,
99
106
  rowClassName,
100
107
  compact,
@@ -121,13 +128,13 @@ export function DataTableBody<T = unknown>({
121
128
 
122
129
  if (loading && !hasRows) {
123
130
  return (
124
- <div className={cn(ROW_STACK_CLASSES, className)}>
131
+ <LoadingRegion label="Loading results" announce={loadingRegion} className={cn(ROW_STACK_CLASSES, className)}>
125
132
  <DataTableSkeleton
126
133
  rows={skeletonRows}
127
134
  className={skeletonRowClassName}
128
135
  rowHeightClassName={rowHeightClassName}
129
136
  />
130
- </div>
137
+ </LoadingRegion>
131
138
  );
132
139
  }
133
140
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useEffect, useRef, useState, useSyncExternalStore } from 'react';
4
4
  import { useIsomorphicLayoutEffect } from '../../../hooks/ui/use-isomorphic-layout-effect';
5
+ import { LoadingRegion } from '../../loading/loading-region';
5
6
  import { Button } from '../button';
6
7
  import { useOptionalDataTableContext } from './data-table';
7
8
  import { useDataTableLoadMoreStore } from './data-table-load-more';
@@ -163,9 +164,10 @@ export function DataTableInfiniteFooter({
163
164
  return (
164
165
  <>
165
166
  {isFetchingNextPage && !bodyDrawsRows && (
166
- <div className={ROW_STACK_CLASSES}>
167
+ // Busy, without a second status: the footer's own one below says "Loading more results".
168
+ <LoadingRegion status={false} className={ROW_STACK_CLASSES}>
167
169
  <DataTableSkeleton rows={skeletonRows} />
168
- </div>
170
+ </LoadingRegion>
169
171
  )}
170
172
  {isStalled && (
171
173
  <div className="flex justify-center pt-[var(--spacing-system-mf)]">
@@ -2,6 +2,7 @@
2
2
 
3
3
  import type { ReactNode } from 'react';
4
4
  import { cn } from '../../../utils/cn';
5
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
5
6
  import { useDataTableContext } from './data-table';
6
7
  import { getHideClasses } from './utils';
7
8
 
@@ -60,8 +61,10 @@ export function DataTableSkeleton({ rows = 10, className, rowClassName, rowHeigh
60
61
  {Array.from({ length: rows }).map((_, index) => (
61
62
  <div
62
63
  key={index}
64
+ // Decoration: the table's own status line says it is loading.
65
+ aria-hidden="true"
63
66
  className={cn(
64
- 'relative animate-pulse overflow-hidden rounded-md border border-ods-border bg-ods-card',
67
+ 'relative overflow-hidden rounded-md border border-ods-border bg-ods-card',
65
68
  // The slot height sits on the card, matching a real row.
66
69
  rowHeightClassName,
67
70
  className,
@@ -91,9 +94,9 @@ export function DataTableSkeleton({ rows = 10, className, rowClassName, rowHeigh
91
94
  getHideClasses(meta?.hideAt),
92
95
  )}
93
96
  >
94
- <div className="mb-[var(--spacing-system-xxs)] h-5 w-3/4 rounded-sm bg-ods-bg-surface" />
97
+ <UnifiedSkeleton className="mb-[var(--spacing-system-xxs)] h-5 w-3/4 rounded-sm" />
95
98
  {index % 2 === 0 && column.id === firstColumnId && (
96
- <div className="h-4 w-1/2 rounded-sm bg-ods-bg-surface opacity-60" />
99
+ <UnifiedSkeleton className="h-4 w-1/2 rounded-sm opacity-60" />
97
100
  )}
98
101
  </div>
99
102
  );
@@ -108,8 +111,8 @@ export function DataTableSkeleton({ rows = 10, className, rowClassName, rowHeigh
108
111
  )}
109
112
  >
110
113
  <div className="flex min-w-0 flex-1 flex-col justify-center py-[var(--spacing-system-sf)]">
111
- <div className="mb-[var(--spacing-system-xsf)] h-4 w-3/4 rounded-sm bg-ods-bg-surface" />
112
- <div className="h-3 w-1/2 rounded-sm bg-ods-bg-surface opacity-60" />
114
+ <UnifiedSkeleton className="mb-[var(--spacing-system-xsf)] h-4 w-3/4 rounded-sm" />
115
+ <UnifiedSkeleton className="h-3 w-1/2 rounded-sm opacity-60" />
113
116
  </div>
114
117
  </div>
115
118
  </div>
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import type React from 'react';
4
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
4
5
  import { Card } from './card';
5
6
  import { StatusBadge } from './status-badge';
6
7
 
@@ -82,11 +83,6 @@ function fourColumnBorders(index: number, count: number): string {
82
83
  return ` ${classes.join(' ')}`;
83
84
  }
84
85
 
85
- /** A text row's placeholder: a bar exactly one line of its element's own typography tall. */
86
- function LineBar({ width }: { width: string }) {
87
- return <span className={`block h-[1lh] ${width} animate-pulse rounded bg-ods-border`} />;
88
- }
89
-
90
86
  export function FeatureCardGrid({
91
87
  items,
92
88
  columns = 3,
@@ -230,15 +226,27 @@ export function FeatureCardGrid({
230
226
  <div className="flex min-w-0 flex-1 flex-col gap-[var(--spacing-system-xsf)]">
231
227
  {item.eyebrow && (
232
228
  <span className="text-ods-text-secondary text-h5">
233
- {loading ? <LineBar width="w-6" /> : item.eyebrow}
229
+ {loading ? (
230
+ <UnifiedSkeleton as="span" className="block h-[1lh] w-6 rounded" />
231
+ ) : (
232
+ item.eyebrow
233
+ )}
234
234
  </span>
235
235
  )}
236
236
  <h3 className={`text-ods-text-primary text-h2 ${titleClassName}`}>
237
- {loading ? <LineBar width="w-1/2" /> : item.title}
237
+ {loading ? (
238
+ <UnifiedSkeleton as="span" className="block h-[1lh] w-1/2 rounded" />
239
+ ) : (
240
+ item.title
241
+ )}
238
242
  </h3>
239
243
  {item.subtitle && (
240
244
  <p className={`text-h4 ${accentClassName} ${subtitleClassName}`}>
241
- {loading ? <LineBar width="w-3/4" /> : item.subtitle}
245
+ {loading ? (
246
+ <UnifiedSkeleton as="span" className="block h-[1lh] w-3/4 rounded" />
247
+ ) : (
248
+ item.subtitle
249
+ )}
242
250
  </p>
243
251
  )}
244
252
  {item.content}
@@ -248,15 +256,23 @@ export function FeatureCardGrid({
248
256
  <div className="flex flex-col gap-[var(--spacing-system-xsf)]">
249
257
  {item.eyebrow && (
250
258
  <span className="text-ods-text-secondary text-h5">
251
- {loading ? <LineBar width="w-6" /> : item.eyebrow}
259
+ {loading ? (
260
+ <UnifiedSkeleton as="span" className="block h-[1lh] w-6 rounded" />
261
+ ) : (
262
+ item.eyebrow
263
+ )}
252
264
  </span>
253
265
  )}
254
266
  <h3 className={`whitespace-pre-line text-ods-text-primary text-h2 ${titleClassName}`}>
255
- {loading ? <LineBar width="w-1/2" /> : item.title}
267
+ {loading ? <UnifiedSkeleton as="span" className="block h-[1lh] w-1/2 rounded" /> : item.title}
256
268
  </h3>
257
269
  {item.subtitle && (
258
270
  <p className={`text-h4 ${accentClassName} ${subtitleClassName}`}>
259
- {loading ? <LineBar width="w-3/4" /> : item.subtitle}
271
+ {loading ? (
272
+ <UnifiedSkeleton as="span" className="block h-[1lh] w-3/4 rounded" />
273
+ ) : (
274
+ item.subtitle
275
+ )}
260
276
  </p>
261
277
  )}
262
278
  </div>
@@ -1,43 +1,51 @@
1
1
  'use client';
2
2
 
3
- import { Skeleton } from '../skeleton';
3
+ import { LoadingRegion } from '../../loading/loading-region';
4
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
4
5
 
5
6
  interface FileManagerSkeletonProps {
7
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
8
+ region?: boolean;
6
9
  rows?: number;
7
10
  showSearch?: boolean;
8
11
  showActions?: boolean;
9
12
  }
10
13
 
11
- export function FileManagerSkeleton({ rows = 8, showSearch = true, showActions = true }: FileManagerSkeletonProps) {
14
+ export function FileManagerSkeleton({
15
+ region = true,
16
+ rows = 8,
17
+ showSearch = true,
18
+ showActions = true,
19
+ }: FileManagerSkeletonProps) {
12
20
  const rowPlaceholders = Array.from({ length: rows });
13
21
 
14
22
  return (
15
- <div className="flex h-full flex-col bg-ods-bg">
23
+ <LoadingRegion label="Loading files" announce={region} className="flex h-full flex-col bg-ods-bg">
16
24
  <div className="flex min-h-0 flex-1 flex-col space-y-6 py-6">
17
25
  {/* Breadcrumb and Action Bar */}
18
26
  <div className="flex flex-wrap items-start justify-between gap-4">
19
27
  {/* Breadcrumb skeleton */}
20
28
  <div className="flex min-w-0 flex-1 items-center gap-2">
21
- <Skeleton className="h-5 w-12" />
22
- <Skeleton className="h-4 w-4 rounded-full" />
23
- <Skeleton className="h-5 w-20" />
24
- <Skeleton className="h-4 w-4 rounded-full" />
25
- <Skeleton className="h-5 w-24" />
29
+ <UnifiedSkeleton className="h-5 w-12" />
30
+ <UnifiedSkeleton className="h-4 w-4 rounded-full" />
31
+ <UnifiedSkeleton className="h-5 w-20" />
32
+ <UnifiedSkeleton className="h-4 w-4 rounded-full" />
33
+ <UnifiedSkeleton className="h-5 w-24" />
26
34
  </div>
27
35
 
28
36
  {/* Action buttons skeleton */}
29
37
  {showActions && (
30
38
  <div className="flex flex-shrink-0 items-center gap-2">
31
- <Skeleton className="h-9 w-24" />
32
- <Skeleton className="h-9 w-20" />
33
- <Skeleton className="h-9 w-20" />
34
- <Skeleton className="h-9 w-28" />
39
+ <UnifiedSkeleton className="h-9 w-24" />
40
+ <UnifiedSkeleton className="h-9 w-20" />
41
+ <UnifiedSkeleton className="h-9 w-20" />
42
+ <UnifiedSkeleton className="h-9 w-28" />
35
43
  </div>
36
44
  )}
37
45
  </div>
38
46
 
39
47
  {/* Search bar skeleton */}
40
- {showSearch && <Skeleton className="h-10 w-full rounded-lg" />}
48
+ {showSearch && <UnifiedSkeleton className="h-10 w-full rounded-lg" />}
41
49
 
42
50
  {/* Table skeleton */}
43
51
  <div className="min-h-0 flex-1">
@@ -46,7 +54,7 @@ export function FileManagerSkeleton({ rows = 8, showSearch = true, showActions =
46
54
  <div className="flex h-12 items-center rounded-t-lg border-b border-ods-border bg-ods-bg-surface px-4">
47
55
  {/* Checkbox */}
48
56
  <div className="mr-4">
49
- <Skeleton className="h-5 w-5 rounded" />
57
+ <UnifiedSkeleton className="h-5 w-5 rounded" />
50
58
  </div>
51
59
 
52
60
  {/* Column headers */}
@@ -65,31 +73,31 @@ export function FileManagerSkeleton({ rows = 8, showSearch = true, showActions =
65
73
  <div key={idx} className="flex h-16 items-center border-ods-border bg-ods-card px-4">
66
74
  {/* Checkbox */}
67
75
  <div className="mr-4">
68
- <Skeleton className="h-5 w-5 rounded" />
76
+ <UnifiedSkeleton className="h-5 w-5 rounded" />
69
77
  </div>
70
78
 
71
79
  {/* File icon and name */}
72
80
  <div className="flex min-w-0 flex-1 items-center gap-3">
73
- <Skeleton className="h-6 w-6 rounded" />
81
+ <UnifiedSkeleton className="h-6 w-6 rounded" />
74
82
  <div className="flex min-w-0 flex-col">
75
- <Skeleton className="h-4 w-32" />
83
+ <UnifiedSkeleton className="h-4 w-32" />
76
84
  </div>
77
85
  </div>
78
86
 
79
87
  {/* Size */}
80
88
  <div className="w-24 shrink-0 pr-4">
81
- <Skeleton className="h-4 w-16" />
89
+ <UnifiedSkeleton className="h-4 w-16" />
82
90
  </div>
83
91
 
84
92
  {/* Modified date */}
85
93
  <div className="w-36 shrink-0 pl-4">
86
- <Skeleton className="h-4 w-24" />
94
+ <UnifiedSkeleton className="h-4 w-24" />
87
95
  </div>
88
96
 
89
97
  {/* Action buttons */}
90
98
  <div className="flex w-48 shrink-0 items-center justify-end gap-1 pl-4">
91
- <Skeleton className="h-8 w-8 rounded" />
92
- <Skeleton className="h-8 w-8 rounded" />
99
+ <UnifiedSkeleton className="h-8 w-8 rounded" />
100
+ <UnifiedSkeleton className="h-8 w-8 rounded" />
93
101
  </div>
94
102
  </div>
95
103
  ))}
@@ -97,6 +105,6 @@ export function FileManagerSkeleton({ rows = 8, showSearch = true, showActions =
97
105
  </div>
98
106
  </div>
99
107
  </div>
100
- </div>
108
+ </LoadingRegion>
101
109
  );
102
110
  }
@@ -2,8 +2,8 @@
2
2
 
3
3
  import { useLayoutEffect, useMemo, useRef, useState } from 'react';
4
4
  import { cn } from '../../../utils/cn';
5
+ import { UnifiedSkeleton } from '../../loading/unified-skeleton';
5
6
  import { Checkbox } from '../checkbox';
6
- import { Skeleton } from '../skeleton';
7
7
  import { FileManagerEmpty } from './file-manager-empty';
8
8
  import { FileManagerTableRow } from './file-manager-table-row';
9
9
  import type { FileManagerTableProps } from './types';
@@ -81,7 +81,7 @@ export function FileManagerTable({
81
81
  <div className="flex h-12 items-center rounded-t-lg border-b border-ods-border bg-ods-bg-surface px-4">
82
82
  {showCheckboxes && (
83
83
  <div className="mr-4">
84
- <Skeleton className="h-5 w-5 rounded" />
84
+ <UnifiedSkeleton className="h-5 w-5 rounded" />
85
85
  </div>
86
86
  )}
87
87
 
@@ -100,33 +100,33 @@ export function FileManagerTable({
100
100
  <div key={idx} className="group flex h-16 items-center border-ods-border bg-ods-card px-4">
101
101
  {showCheckboxes && (
102
102
  <div className="mr-4">
103
- <Skeleton className="h-5 w-5 rounded" />
103
+ <UnifiedSkeleton className="h-5 w-5 rounded" />
104
104
  </div>
105
105
  )}
106
106
 
107
107
  {/* File icon and name column */}
108
108
  <div className="flex min-w-0 flex-1 items-center gap-3">
109
- <Skeleton className="h-6 w-6 rounded" />
109
+ <UnifiedSkeleton className="h-6 w-6 rounded" />
110
110
  <div className="flex min-w-0 flex-col">
111
- <Skeleton className="h-4 w-32" />
112
- {isSearchResult && <Skeleton className="mt-1 h-3 w-48" />}
111
+ <UnifiedSkeleton className="h-4 w-32" />
112
+ {isSearchResult && <UnifiedSkeleton className="mt-1 h-3 w-48" />}
113
113
  </div>
114
114
  </div>
115
115
 
116
116
  {/* Size column */}
117
117
  <div className="w-24 shrink-0 pr-4">
118
- <Skeleton className="h-4 w-16" />
118
+ <UnifiedSkeleton className="h-4 w-16" />
119
119
  </div>
120
120
 
121
121
  {/* Modified date column */}
122
122
  <div className="w-36 shrink-0 pl-4">
123
- <Skeleton className="h-4 w-24" />
123
+ <UnifiedSkeleton className="h-4 w-24" />
124
124
  </div>
125
125
 
126
126
  {/* Action buttons column */}
127
127
  <div className="flex w-48 shrink-0 items-center justify-end gap-1 pl-4">
128
- <Skeleton className="h-8 w-8 rounded" />
129
- <Skeleton className="h-8 w-8 rounded" />
128
+ <UnifiedSkeleton className="h-8 w-8 rounded" />
129
+ <UnifiedSkeleton className="h-8 w-8 rounded" />
130
130
  </div>
131
131
  </div>
132
132
  ))}
@@ -4,12 +4,12 @@ import { useEffect, useRef, useState } from 'react';
4
4
 
5
5
  import { cn } from '../../utils/cn';
6
6
  import { Filter02Icon } from '../icons-v2-generated/sort-and-filter/filter-02-icon';
7
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
7
8
  import { Button } from './button';
8
9
  import { DateFilterPanel, type DateFilterResult, type DateRange } from './date-picker';
9
10
  import { FilterCheckboxItem } from './filter-checkbox-item';
10
11
  import { ModalV2, ModalV2Content, ModalV2Footer, ModalV2Header, ModalV2Title } from './modal-v2';
11
12
  import { ScrollFadeOverlay, useScrollFade } from './scroll-fade';
12
- import { Skeleton } from './skeleton';
13
13
  import { SortColumnItem, type SortConfig, type SortDirection } from './sort-column-item';
14
14
  import type { TableFilters } from './table/types';
15
15
  import { TagKeyValueFilter, type TagKeyConfig } from './tag-key-value-filter';
@@ -203,16 +203,16 @@ export function FilterModal({
203
203
  <>
204
204
  {[0, 1].map(group => (
205
205
  <div key={group} className="flex flex-col gap-1">
206
- <Skeleton className="h-5 w-24" />
206
+ <UnifiedSkeleton className="h-5 w-24" />
207
207
  <div className="overflow-hidden rounded-md border border-ods-border">
208
208
  {[0, 1, 2].map(row => (
209
209
  <div
210
210
  key={row}
211
211
  className="flex items-center gap-3 border-b border-ods-border bg-ods-card px-4 py-3 last:border-b-0"
212
212
  >
213
- <Skeleton className="h-6 w-6 shrink-0 rounded-[6px]" />
214
- <Skeleton className="h-4 max-w-[60%] flex-1" />
215
- <Skeleton className="h-4 w-10 shrink-0" />
213
+ <UnifiedSkeleton className="h-6 w-6 shrink-0 rounded-[6px]" />
214
+ <UnifiedSkeleton className="h-4 max-w-[60%] flex-1" />
215
+ <UnifiedSkeleton className="h-4 w-10 shrink-0" />
216
216
  </div>
217
217
  ))}
218
218
  </div>
@@ -14,6 +14,7 @@
14
14
 
15
15
  import { Filter } from 'lucide-react';
16
16
  import type { ReactNode } from 'react';
17
+ import { UnifiedSkeleton } from '../loading/unified-skeleton';
17
18
  import { Button } from './button';
18
19
 
19
20
  export interface FilterPillRowOption {
@@ -67,3 +68,21 @@ export function FilterPillRow({
67
68
  </div>
68
69
  );
69
70
  }
71
+
72
+ const noop = () => {};
73
+
74
+ /**
75
+ * The loading state of a SERVED pill row (facets that arrive with the data):
76
+ * the same row shell with placeholder pills, so the filters never pop in under
77
+ * the content. The row renders its children INSTEAD of options, which is
78
+ * exactly what a skeleton wants.
79
+ */
80
+ export function FilterPillRowSkeleton({ label, pills = 5 }: { label: string; pills?: number }) {
81
+ return (
82
+ <FilterPillRow label={label} selectedValue="" onValueChange={noop} options={[]}>
83
+ {Array.from({ length: pills }, (_, i) => (
84
+ <UnifiedSkeleton key={i} className="h-8 w-24 rounded" />
85
+ ))}
86
+ </FilterPillRow>
87
+ );
88
+ }
@@ -77,7 +77,6 @@ export * from './mobile-app-qr';
77
77
  export * from './status-indicator';
78
78
  export * from './toaster';
79
79
  // TODO: Add other UI components as they are moved to ui-kit
80
- export * from './skeleton';
81
80
  export * from './hover-dropdown';
82
81
  // Chat components
83
82
  export * from '../chat';