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

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 (554) 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-4AZHFLOM.cjs → chunk-4O2KYY4K.cjs} +3 -3
  8. package/dist/{chunk-6XP6RNFD.cjs → chunk-6KEJQR6L.cjs} +1875 -2116
  9. package/dist/{chunk-JNBOQ7F2.cjs → chunk-7RCTOWBA.cjs} +24 -24
  10. package/dist/{chunk-U6XWGK53.cjs → chunk-ALPRQ3ZX.cjs} +56 -46
  11. package/dist/{chunk-TRXCQADV.cjs → chunk-AW6GP3JK.cjs} +103 -98
  12. package/dist/{chunk-GE4PCDNZ.cjs → chunk-BO6ZOAPB.cjs} +12 -12
  13. package/dist/{chunk-HNLI4OU5.cjs → chunk-C6LPOYDM.cjs} +24 -24
  14. package/dist/{chunk-4MGZYY6U.cjs → chunk-CLAJIQ7E.cjs} +26 -18
  15. package/dist/{chunk-EH3LOWGY.cjs → chunk-CNUZLOVA.cjs} +48 -40
  16. package/dist/{chunk-QPSQ5WLG.cjs → chunk-DGEB5GUZ.cjs} +2 -2
  17. package/dist/{chunk-OZUJYBQ2.cjs → chunk-E3KFEOFA.cjs} +9 -6
  18. package/dist/{chunk-PSSGIZXZ.cjs → chunk-FHT7SMA7.cjs} +49 -46
  19. package/dist/{chunk-JOPFX3PJ.cjs → chunk-FP6HAJQV.cjs} +137 -122
  20. package/dist/{chunk-YKJQM2O6.cjs → chunk-GVETSV7H.cjs} +56 -53
  21. package/dist/{chunk-UNR74CAC.cjs → chunk-HOEVD6EN.cjs} +4 -4
  22. package/dist/{chunk-H34A2765.cjs → chunk-JPUTILTV.cjs} +104 -118
  23. package/dist/{chunk-46EIXJFC.cjs → chunk-KVSEWACW.cjs} +44 -27
  24. package/dist/{chunk-AKTPO2DN.cjs → chunk-L4UI63K6.cjs} +2 -2
  25. package/dist/{chunk-PSIKUDUV.cjs → chunk-LVO7FALW.cjs} +5 -5
  26. package/dist/{chunk-L2RMTGOK.cjs → chunk-MGF3FUKD.cjs} +7 -7
  27. package/dist/{chunk-P7KTAXXE.cjs → chunk-OFO75R2O.cjs} +169 -175
  28. package/dist/{chunk-B27QEHYR.cjs → chunk-P6F6PHVK.cjs} +9 -9
  29. package/dist/chunk-RB6BSE3O.cjs +21 -0
  30. package/dist/chunk-UGCRLRCT.cjs +25 -0
  31. package/dist/{chunk-BBTSJYTR.cjs → chunk-V3UJ6NDR.cjs} +243 -429
  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-D4XZL27V.cjs → chunk-YL62VAHC.cjs} +6 -6
  35. package/dist/{cloud-tenants-V5727B7F.cjs → cloud-tenants-E4JSG3GH.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/auth/login-form.d.ts +34 -21
  143. package/dist/components/features/auth/login-form.d.ts.map +1 -1
  144. package/dist/components/features/auth/login-form.js +77 -39
  145. package/dist/components/features/auth/sso-providers.d.ts +7 -1
  146. package/dist/components/features/auth/sso-providers.d.ts.map +1 -1
  147. package/dist/components/features/auth/sso-providers.js +22 -4
  148. package/dist/components/features/board/ticket-card-skeleton.js +8 -8
  149. package/dist/components/features/capability-explorer.d.ts +3 -1
  150. package/dist/components/features/capability-explorer.d.ts.map +1 -1
  151. package/dist/components/features/capability-explorer.js +27 -24
  152. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts +5 -2
  153. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts.map +1 -1
  154. package/dist/components/features/devices/device-selector/device-selector-skeleton.js +2 -2
  155. package/dist/components/features/devices/device-selector/device-selector.d.ts +1 -1
  156. package/dist/components/features/devices/device-selector/device-selector.d.ts.map +1 -1
  157. package/dist/components/features/devices/device-selector/device-selector.js +2 -0
  158. package/dist/components/features/devices/device-selector/device-selector.types.d.ts +2 -0
  159. package/dist/components/features/devices/device-selector/device-selector.types.d.ts.map +1 -1
  160. package/dist/components/features/devices/devices-grid.d.ts +3 -1
  161. package/dist/components/features/devices/devices-grid.d.ts.map +1 -1
  162. package/dist/components/features/devices/devices-grid.js +3 -2
  163. package/dist/components/features/devices/devices-panel-view.d.ts +6 -1
  164. package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -1
  165. package/dist/components/features/devices/devices-panel-view.js +4 -1
  166. package/dist/components/features/devices/devices-table-columns.d.ts +3 -1
  167. package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -1
  168. package/dist/components/features/devices/devices-table-columns.js +2 -0
  169. package/dist/components/features/index.cjs +18 -14
  170. package/dist/components/features/logs/logs-table-view.d.ts +3 -1
  171. package/dist/components/features/logs/logs-table-view.d.ts.map +1 -1
  172. package/dist/components/features/logs/logs-table-view.js +2 -2
  173. package/dist/components/features/model-token-rates.d.ts +4 -1
  174. package/dist/components/features/model-token-rates.d.ts.map +1 -1
  175. package/dist/components/features/model-token-rates.js +18 -23
  176. package/dist/components/features/notifications/index.d.ts +2 -2
  177. package/dist/components/features/notifications/index.d.ts.map +1 -1
  178. package/dist/components/features/notifications/index.js +2 -1
  179. package/dist/components/features/notifications/notification-drawer.d.ts.map +1 -1
  180. package/dist/components/features/notifications/notification-drawer.js +9 -16
  181. package/dist/components/features/notifications/notification-tile.d.ts +14 -0
  182. package/dist/components/features/notifications/notification-tile.d.ts.map +1 -1
  183. package/dist/components/features/notifications/notification-tile.js +36 -1
  184. package/dist/components/features/policies/policy-summary-cards.js +2 -2
  185. package/dist/components/features/push-button-selector.d.ts.map +1 -1
  186. package/dist/components/features/push-button-selector.js +12 -7
  187. package/dist/components/features/remote-session/remote-desktop-view.d.ts +4 -1
  188. package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -1
  189. package/dist/components/features/remote-session/remote-desktop-view.js +14 -10
  190. package/dist/components/features/waitlist-form.d.ts.map +1 -1
  191. package/dist/components/features/waitlist-form.js +6 -5
  192. package/dist/components/help-center-pages/download-apps-page.d.ts.map +1 -1
  193. package/dist/components/help-center-pages/download-apps-page.js +2 -1
  194. package/dist/components/help-center-pages/index.cjs +127 -119
  195. package/dist/components/help-center-pages/trust-center-page.d.ts +4 -1
  196. package/dist/components/help-center-pages/trust-center-page.d.ts.map +1 -1
  197. package/dist/components/help-center-pages/trust-center-page.js +3 -2
  198. package/dist/components/help-center-pages/trust-center-sections.d.ts +4 -1
  199. package/dist/components/help-center-pages/trust-center-sections.d.ts.map +1 -1
  200. package/dist/components/help-center-pages/trust-center-sections.js +5 -2
  201. package/dist/components/index.cjs +70 -112
  202. package/dist/components/index.d.ts +0 -2
  203. package/dist/components/index.d.ts.map +1 -1
  204. package/dist/components/index.js +0 -2
  205. package/dist/components/layout/title-block.d.ts.map +1 -1
  206. package/dist/components/layout/title-block.js +18 -11
  207. package/dist/components/loading/card-skeleton.d.ts +6 -3
  208. package/dist/components/loading/card-skeleton.d.ts.map +1 -1
  209. package/dist/components/loading/card-skeleton.js +7 -27
  210. package/dist/components/loading/category-card-skeleton.d.ts.map +1 -1
  211. package/dist/components/loading/category-card-skeleton.js +2 -4
  212. package/dist/components/loading/category-vendor-selector-skeleton.d.ts +3 -1
  213. package/dist/components/loading/category-vendor-selector-skeleton.d.ts.map +1 -1
  214. package/dist/components/loading/category-vendor-selector-skeleton.js +9 -4
  215. package/dist/components/loading/device-card-skeleton.d.ts +18 -9
  216. package/dist/components/loading/device-card-skeleton.d.ts.map +1 -1
  217. package/dist/components/loading/device-card-skeleton.js +30 -21
  218. package/dist/components/loading/index.d.ts +3 -4
  219. package/dist/components/loading/index.d.ts.map +1 -1
  220. package/dist/components/loading/index.js +6 -29
  221. package/dist/components/loading/loading-region.d.ts +33 -0
  222. package/dist/components/loading/loading-region.d.ts.map +1 -0
  223. package/dist/components/loading/loading-region.js +22 -0
  224. package/dist/components/loading/margin-report-skeleton.d.ts +3 -1
  225. package/dist/components/loading/margin-report-skeleton.d.ts.map +1 -1
  226. package/dist/components/loading/margin-report-skeleton.js +70 -61
  227. package/dist/components/loading/msp-profile-form-skeleton.d.ts +3 -1
  228. package/dist/components/loading/msp-profile-form-skeleton.d.ts.map +1 -1
  229. package/dist/components/loading/msp-profile-form-skeleton.js +6 -5
  230. package/dist/components/loading/organization-card-skeleton.d.ts +3 -1
  231. package/dist/components/loading/organization-card-skeleton.d.ts.map +1 -1
  232. package/dist/components/loading/organization-card-skeleton.js +5 -5
  233. package/dist/components/loading/organization-icon-skeleton.d.ts.map +1 -1
  234. package/dist/components/loading/organization-icon-skeleton.js +2 -1
  235. package/dist/components/loading/page-layout-skeleton.d.ts +21 -6
  236. package/dist/components/loading/page-layout-skeleton.d.ts.map +1 -1
  237. package/dist/components/loading/page-layout-skeleton.js +283 -266
  238. package/dist/components/loading/settings-form-skeleton.d.ts +17 -0
  239. package/dist/components/loading/settings-form-skeleton.d.ts.map +1 -0
  240. package/dist/components/loading/settings-form-skeleton.js +42 -0
  241. package/dist/components/loading/unified-skeleton.d.ts +11 -4
  242. package/dist/components/loading/unified-skeleton.d.ts.map +1 -1
  243. package/dist/components/loading/unified-skeleton.js +14 -89
  244. package/dist/components/loading/wizard-layout-skeleton.d.ts +3 -1
  245. package/dist/components/loading/wizard-layout-skeleton.d.ts.map +1 -1
  246. package/dist/components/loading/wizard-layout-skeleton.js +3 -2
  247. package/dist/components/media-carousel.d.ts.map +1 -1
  248. package/dist/components/media-carousel.js +2 -1
  249. package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
  250. package/dist/components/meeting-scheduler/booking-form.js +14 -8
  251. package/dist/components/meeting-scheduler/context-panel.d.ts.map +1 -1
  252. package/dist/components/meeting-scheduler/context-panel.js +8 -7
  253. package/dist/components/meeting-scheduler/directory.d.ts.map +1 -1
  254. package/dist/components/meeting-scheduler/directory.js +10 -9
  255. package/dist/components/meeting-scheduler/index.cjs +85 -75
  256. package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
  257. package/dist/components/meeting-scheduler/index.js +3 -2
  258. package/dist/components/meeting-scheduler/modal-header.d.ts.map +1 -1
  259. package/dist/components/meeting-scheduler/modal-header.js +8 -7
  260. package/dist/components/meeting-scheduler/slot-picker.d.ts.map +1 -1
  261. package/dist/components/meeting-scheduler/slot-picker.js +4 -3
  262. package/dist/components/navigation/app-header.d.ts.map +1 -1
  263. package/dist/components/navigation/app-header.js +8 -7
  264. package/dist/components/navigation/index.cjs +19 -17
  265. package/dist/components/navigation/multi-level-navigation.d.ts.map +1 -1
  266. package/dist/components/navigation/multi-level-navigation.js +3 -2
  267. package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
  268. package/dist/components/navigation/navigation-sidebar-item.js +3 -2
  269. package/dist/components/onboarding-guides/index.cjs +19 -17
  270. package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts +4 -1
  271. package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts.map +1 -1
  272. package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.js +12 -8
  273. package/dist/components/product-demo/index.cjs +16 -15
  274. package/dist/components/product-demo/product-screen.d.ts.map +1 -1
  275. package/dist/components/product-demo/product-screen.js +4 -4
  276. package/dist/components/profile/ProfileLoadingSkeleton.d.ts +3 -1
  277. package/dist/components/profile/ProfileLoadingSkeleton.d.ts.map +1 -1
  278. package/dist/components/profile/ProfileLoadingSkeleton.js +10 -8
  279. package/dist/components/related-content/index.cjs +7 -5
  280. package/dist/components/related-content/related-content-section.d.ts.map +1 -1
  281. package/dist/components/related-content/related-content-section.js +3 -2
  282. package/dist/components/shared/delivery/delivery-table.d.ts.map +1 -1
  283. package/dist/components/shared/delivery/delivery-table.js +8 -7
  284. package/dist/components/shared/detail-page-skeleton.d.ts +5 -1
  285. package/dist/components/shared/detail-page-skeleton.d.ts.map +1 -1
  286. package/dist/components/shared/detail-page-skeleton.js +18 -14
  287. package/dist/components/shared/dev-section/dev-card-row.d.ts +3 -1
  288. package/dist/components/shared/dev-section/dev-card-row.d.ts.map +1 -1
  289. package/dist/components/shared/dev-section/dev-card-row.js +22 -9
  290. package/dist/components/shared/legal-document/legal-document-page.d.ts.map +1 -1
  291. package/dist/components/shared/legal-document/legal-document-page.js +8 -7
  292. package/dist/components/shared/onboarding/onboarding-step-card.d.ts.map +1 -1
  293. package/dist/components/shared/onboarding/onboarding-step-card.js +3 -2
  294. package/dist/components/shared/onboarding/onboarding-walkthrough.d.ts.map +1 -1
  295. package/dist/components/shared/onboarding/onboarding-walkthrough.js +2 -1
  296. package/dist/components/shared/product-release/index.d.ts +0 -1
  297. package/dist/components/shared/product-release/index.d.ts.map +1 -1
  298. package/dist/components/shared/product-release/index.js +1 -3
  299. package/dist/components/shared/product-release/product-release-card-skeleton.d.ts.map +1 -1
  300. package/dist/components/shared/product-release/product-release-card-skeleton.js +21 -20
  301. package/dist/components/shared/product-release/product-releases-view.d.ts.map +1 -1
  302. package/dist/components/shared/product-release/product-releases-view.js +2 -1
  303. package/dist/components/shared/roadmap/roadmap-grid-skeleton.d.ts +6 -13
  304. package/dist/components/shared/roadmap/roadmap-grid-skeleton.d.ts.map +1 -1
  305. package/dist/components/shared/roadmap/roadmap-grid-skeleton.js +13 -25
  306. package/dist/components/tickets/help-center-create-form.d.ts +4 -1
  307. package/dist/components/tickets/help-center-create-form.d.ts.map +1 -1
  308. package/dist/components/tickets/help-center-create-form.js +38 -26
  309. package/dist/components/tickets/index.cjs +22 -20
  310. package/dist/components/tickets/ticket-center.d.ts.map +1 -1
  311. package/dist/components/tickets/ticket-center.js +13 -10
  312. package/dist/components/tickets/ticket-detail-drawer.d.ts.map +1 -1
  313. package/dist/components/tickets/ticket-detail-drawer.js +2 -1
  314. package/dist/components/ui/admin-form-drawer.d.ts.map +1 -1
  315. package/dist/components/ui/admin-form-drawer.js +6 -8
  316. package/dist/components/ui/admin-form-modal.d.ts.map +1 -1
  317. package/dist/components/ui/admin-form-modal.js +12 -11
  318. package/dist/components/ui/analyzing-state.d.ts +1 -1
  319. package/dist/components/ui/analyzing-state.d.ts.map +1 -1
  320. package/dist/components/ui/analyzing-state.js +4 -10
  321. package/dist/components/ui/content-loader.d.ts +5 -1
  322. package/dist/components/ui/content-loader.d.ts.map +1 -1
  323. package/dist/components/ui/content-loader.js +27 -23
  324. package/dist/components/ui/dashboard-info-card.d.ts +17 -3
  325. package/dist/components/ui/dashboard-info-card.d.ts.map +1 -1
  326. package/dist/components/ui/dashboard-info-card.js +30 -10
  327. package/dist/components/ui/data-attribution.d.ts +6 -0
  328. package/dist/components/ui/data-attribution.d.ts.map +1 -1
  329. package/dist/components/ui/data-attribution.js +12 -1
  330. package/dist/components/ui/data-table/data-table-body.d.ts +6 -1
  331. package/dist/components/ui/data-table/data-table-body.d.ts.map +1 -1
  332. package/dist/components/ui/data-table/data-table-body.js +3 -1
  333. package/dist/components/ui/data-table/data-table-infinite-footer.d.ts.map +1 -1
  334. package/dist/components/ui/data-table/data-table-infinite-footer.js +3 -1
  335. package/dist/components/ui/data-table/data-table-skeleton.d.ts.map +1 -1
  336. package/dist/components/ui/data-table/data-table-skeleton.js +7 -5
  337. package/dist/components/ui/feature-card.d.ts.map +1 -1
  338. package/dist/components/ui/feature-card.js +7 -9
  339. package/dist/components/ui/file-manager/file-manager-skeleton.d.ts +3 -1
  340. package/dist/components/ui/file-manager/file-manager-skeleton.d.ts.map +1 -1
  341. package/dist/components/ui/file-manager/file-manager-skeleton.js +27 -21
  342. package/dist/components/ui/file-manager/file-manager-table.js +10 -10
  343. package/dist/components/ui/file-manager/index.cjs +45 -36
  344. package/dist/components/ui/filter-modal.d.ts.map +1 -1
  345. package/dist/components/ui/filter-modal.js +5 -5
  346. package/dist/components/ui/filter-pill-row.d.ts +10 -0
  347. package/dist/components/ui/filter-pill-row.d.ts.map +1 -1
  348. package/dist/components/ui/filter-pill-row.js +8 -1
  349. package/dist/components/ui/index.cjs +19 -28
  350. package/dist/components/ui/index.d.ts +0 -1
  351. package/dist/components/ui/index.d.ts.map +1 -1
  352. package/dist/components/ui/index.js +0 -1
  353. package/dist/components/ui/layout-hold.d.ts +5 -4
  354. package/dist/components/ui/layout-hold.d.ts.map +1 -1
  355. package/dist/components/ui/layout-hold.js +20 -29
  356. package/dist/components/ui/markdown/base-components.js +1 -1
  357. package/dist/components/ui/page-actions.d.ts.map +1 -1
  358. package/dist/components/ui/page-actions.js +6 -8
  359. package/dist/components/ui/photo-wall.d.ts.map +1 -1
  360. package/dist/components/ui/photo-wall.js +11 -18
  361. package/dist/components/ui/query-report-table/query-report-table-skeleton.d.ts +1 -1
  362. package/dist/components/ui/query-report-table/query-report-table-skeleton.d.ts.map +1 -1
  363. package/dist/components/ui/query-report-table/query-report-table-skeleton.js +28 -18
  364. package/dist/components/ui/query-report-table/query-report-table.d.ts +1 -1
  365. package/dist/components/ui/query-report-table/query-report-table.d.ts.map +1 -1
  366. package/dist/components/ui/query-report-table/query-report-table.js +3 -1
  367. package/dist/components/ui/query-report-table/types.d.ts +4 -0
  368. package/dist/components/ui/query-report-table/types.d.ts.map +1 -1
  369. package/dist/components/ui/skeleton-surface.d.ts +7 -0
  370. package/dist/components/ui/skeleton-surface.d.ts.map +1 -0
  371. package/dist/components/ui/skeleton-surface.js +5 -0
  372. package/dist/components/ui/table/table-skeleton.d.ts.map +1 -1
  373. package/dist/components/ui/table/table-skeleton.js +11 -13
  374. package/dist/components/ui/test-run.d.ts +6 -4
  375. package/dist/components/ui/test-run.d.ts.map +1 -1
  376. package/dist/components/ui/test-run.js +9 -5
  377. package/dist/{devices-WWMXIIHI.cjs → devices-AVRQGB2N.cjs} +17 -15
  378. package/dist/{embeddable-chat-IJHCGQ24.cjs → embeddable-chat-SNYQSMS7.cjs} +79 -77
  379. package/dist/index.cjs +24 -31
  380. package/dist/{knowledge-JZP4RIXB.cjs → knowledge-S3CNISQH.cjs} +17 -15
  381. package/dist/{logs-WIRYFNUC.cjs → logs-WDLOKDXT.cjs} +24 -22
  382. package/dist/{policies-X7OJYA7G.cjs → policies-STML7NEZ.cjs} +20 -18
  383. package/dist/{remote-session-IYT4LWJC.cjs → remote-session-ZKP2W3IS.cjs} +9 -7
  384. package/dist/{scripts-GRMT2NGW.cjs → scripts-HO53VYGX.cjs} +23 -21
  385. package/dist/{software-update-G3QOB7RT.cjs → software-update-4VTK7LWQ.cjs} +20 -18
  386. package/dist/{tickets-board-4MT6ZB4F.cjs → tickets-board-BNW4AYFL.cjs} +11 -10
  387. package/package.json +1 -1
  388. package/src/components/categories-cart.tsx +2 -4
  389. package/src/components/chat/chat-container.tsx +4 -4
  390. package/src/components/chat/chat-context-picker.tsx +3 -2
  391. package/src/components/chat/chat-message-row.tsx +6 -7
  392. package/src/components/chat/chat-message-skeleton.tsx +11 -6
  393. package/src/components/chat/chat-sidebar-skeleton.tsx +4 -3
  394. package/src/components/chat/chat-top-navigation.tsx +4 -4
  395. package/src/components/chat/context-items-list.tsx +9 -3
  396. package/src/components/chat/entity-cards/admin-content-card-grid.tsx +65 -18
  397. package/src/components/chat/entity-cards/admin-content-card.tsx +2 -1
  398. package/src/components/chat/entity-cards/blog-card.tsx +13 -12
  399. package/src/components/chat/entity-cards/campaign-card-admin.tsx +5 -4
  400. package/src/components/chat/entity-cards/case-study-card.tsx +19 -18
  401. package/src/components/chat/entity-cards/chat-ticket-item.tsx +5 -5
  402. package/src/components/chat/entity-cards/customer-interview-card.tsx +15 -14
  403. package/src/components/chat/entity-cards/data-room-doc-card.tsx +7 -6
  404. package/src/components/chat/entity-cards/design-doc-card.tsx +0 -2
  405. package/src/components/chat/entity-cards/generic-entity-card.tsx +8 -7
  406. package/src/components/chat/entity-cards/github-activity-card.tsx +11 -10
  407. package/src/components/chat/entity-cards/hubspot-ticket-card.tsx +16 -15
  408. package/src/components/chat/entity-cards/index.ts +2 -0
  409. package/src/components/chat/entity-cards/investor-update-card.tsx +12 -11
  410. package/src/components/chat/entity-cards/onboarding-guide-card.tsx +21 -22
  411. package/src/components/chat/entity-cards/program-card.tsx +29 -28
  412. package/src/components/chat/entity-cards/roadmap-card.tsx +22 -23
  413. package/src/components/chat/entity-cards/slack-message-card.tsx +12 -11
  414. package/src/components/chat/guide-welcome.tsx +2 -2
  415. package/src/components/chat/mingo-archive-list.tsx +2 -1
  416. package/src/components/chat/mingo-chat-history.tsx +18 -9
  417. package/src/components/chat/mingo-chat-rail.tsx +2 -1
  418. package/src/components/chat/mingo-info-card.tsx +6 -5
  419. package/src/components/chat/mingo-onboarding-card-skeleton.tsx +15 -13
  420. package/src/components/chat/model-display.tsx +4 -4
  421. package/src/components/chat/msp-organization-card-skeleton.tsx +5 -5
  422. package/src/components/chat/quick-action-chip.tsx +17 -14
  423. package/src/components/chat/utils/compact-card-classes.ts +4 -5
  424. package/src/components/content-loading-container.tsx +7 -8
  425. package/src/components/docs/doc-viewer.tsx +3 -2
  426. package/src/components/docs/skeletons.tsx +64 -63
  427. package/src/components/embeds/embed-iframe.tsx +16 -9
  428. package/src/components/embeds/index.ts +2 -2
  429. package/src/components/embeds/linkedin-embed-client.tsx +7 -6
  430. package/src/components/embeds/markdown-image.tsx +5 -3
  431. package/src/components/embeds/og-link-preview.tsx +162 -79
  432. package/src/components/embeds/reddit-embed-client.tsx +10 -9
  433. package/src/components/embeds/twitter-embed-client.tsx +10 -9
  434. package/src/components/faq/faq-section.tsx +13 -6
  435. package/src/components/features/auth/login-form.tsx +121 -64
  436. package/src/components/features/auth/sso-providers.tsx +21 -0
  437. package/src/components/features/board/ticket-card-skeleton.tsx +8 -8
  438. package/src/components/features/capability-explorer.tsx +61 -30
  439. package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +9 -3
  440. package/src/components/features/devices/device-selector/device-selector.tsx +2 -0
  441. package/src/components/features/devices/device-selector/device-selector.types.ts +2 -0
  442. package/src/components/features/devices/devices-grid.tsx +4 -1
  443. package/src/components/features/devices/devices-panel-view.tsx +9 -1
  444. package/src/components/features/devices/devices-table-columns.tsx +4 -0
  445. package/src/components/features/logs/logs-table-view.tsx +4 -2
  446. package/src/components/features/model-token-rates.tsx +27 -24
  447. package/src/components/features/notifications/index.ts +2 -2
  448. package/src/components/features/notifications/notification-drawer.tsx +7 -10
  449. package/src/components/features/notifications/notification-tile.tsx +57 -0
  450. package/src/components/features/policies/policy-summary-cards.tsx +2 -2
  451. package/src/components/features/push-button-selector.tsx +20 -11
  452. package/src/components/features/remote-session/remote-desktop-view.tsx +26 -16
  453. package/src/components/features/waitlist-form.tsx +6 -5
  454. package/src/components/help-center-pages/download-apps-page.tsx +3 -2
  455. package/src/components/help-center-pages/trust-center-page.tsx +6 -2
  456. package/src/components/help-center-pages/trust-center-sections.tsx +9 -3
  457. package/src/components/index.ts +0 -2
  458. package/src/components/layout/title-block.tsx +17 -15
  459. package/src/components/loading/card-skeleton.tsx +14 -46
  460. package/src/components/loading/category-card-skeleton.tsx +2 -4
  461. package/src/components/loading/category-vendor-selector-skeleton.tsx +12 -5
  462. package/src/components/loading/device-card-skeleton.tsx +58 -51
  463. package/src/components/loading/index.ts +5 -19
  464. package/src/components/loading/loading-region.tsx +60 -0
  465. package/src/components/loading/margin-report-skeleton.tsx +45 -34
  466. package/src/components/loading/msp-profile-form-skeleton.tsx +9 -6
  467. package/src/components/loading/organization-card-skeleton.tsx +8 -6
  468. package/src/components/loading/organization-icon-skeleton.tsx +3 -2
  469. package/src/components/loading/page-layout-skeleton.tsx +162 -133
  470. package/src/components/loading/settings-form-skeleton.tsx +52 -0
  471. package/src/components/loading/unified-skeleton.tsx +26 -71
  472. package/src/components/loading/wizard-layout-skeleton.tsx +6 -3
  473. package/src/components/media-carousel.tsx +2 -1
  474. package/src/components/meeting-scheduler/booking-form.tsx +10 -7
  475. package/src/components/meeting-scheduler/context-panel.tsx +8 -7
  476. package/src/components/meeting-scheduler/directory.tsx +10 -9
  477. package/src/components/meeting-scheduler/index.tsx +5 -4
  478. package/src/components/meeting-scheduler/modal-header.tsx +8 -7
  479. package/src/components/meeting-scheduler/slot-picker.tsx +4 -3
  480. package/src/components/navigation/app-header.tsx +8 -7
  481. package/src/components/navigation/multi-level-navigation.tsx +3 -2
  482. package/src/components/navigation/navigation-sidebar-item.tsx +3 -2
  483. package/src/components/onboarding-guides/onboarding-guides-catalog-skeleton.tsx +17 -10
  484. package/src/components/product-demo/product-screen.tsx +4 -4
  485. package/src/components/profile/ProfileLoadingSkeleton.tsx +13 -9
  486. package/src/components/related-content/related-content-section.tsx +5 -4
  487. package/src/components/shared/delivery/delivery-table.tsx +8 -7
  488. package/src/components/shared/detail-page-skeleton.tsx +22 -14
  489. package/src/components/shared/dev-section/dev-card-row.tsx +23 -10
  490. package/src/components/shared/legal-document/legal-document-page.tsx +8 -7
  491. package/src/components/shared/onboarding/onboarding-step-card.tsx +3 -2
  492. package/src/components/shared/onboarding/onboarding-walkthrough.tsx +2 -1
  493. package/src/components/shared/product-release/index.ts +0 -1
  494. package/src/components/shared/product-release/product-release-card-skeleton.tsx +23 -25
  495. package/src/components/shared/product-release/product-releases-view.tsx +3 -2
  496. package/src/components/shared/roadmap/roadmap-grid-skeleton.tsx +14 -56
  497. package/src/components/tickets/help-center-create-form.tsx +23 -12
  498. package/src/components/tickets/ticket-center.tsx +17 -11
  499. package/src/components/tickets/ticket-detail-drawer.tsx +3 -2
  500. package/src/components/ui/admin-form-drawer.tsx +7 -7
  501. package/src/components/ui/admin-form-modal.tsx +9 -8
  502. package/src/components/ui/analyzing-state.tsx +5 -8
  503. package/src/components/ui/content-loader.tsx +31 -23
  504. package/src/components/ui/dashboard-info-card.tsx +81 -20
  505. package/src/components/ui/data-attribution.tsx +18 -0
  506. package/src/components/ui/data-table/data-table-body.tsx +9 -2
  507. package/src/components/ui/data-table/data-table-infinite-footer.tsx +4 -2
  508. package/src/components/ui/data-table/data-table-skeleton.tsx +8 -5
  509. package/src/components/ui/feature-card.tsx +27 -11
  510. package/src/components/ui/file-manager/file-manager-skeleton.tsx +30 -22
  511. package/src/components/ui/file-manager/file-manager-table.tsx +10 -10
  512. package/src/components/ui/filter-modal.tsx +5 -5
  513. package/src/components/ui/filter-pill-row.tsx +19 -0
  514. package/src/components/ui/index.ts +0 -1
  515. package/src/components/ui/layout-hold.tsx +30 -38
  516. package/src/components/ui/markdown/base-components.tsx +1 -1
  517. package/src/components/ui/page-actions.tsx +10 -8
  518. package/src/components/ui/photo-wall.tsx +4 -7
  519. package/src/components/ui/query-report-table/query-report-table-skeleton.tsx +13 -7
  520. package/src/components/ui/query-report-table/query-report-table.tsx +2 -0
  521. package/src/components/ui/query-report-table/types.ts +4 -0
  522. package/src/components/ui/skeleton-surface.ts +6 -0
  523. package/src/components/ui/table/table-skeleton.tsx +11 -13
  524. package/src/components/ui/test-run.tsx +30 -22
  525. package/src/styles/ods-colors.css +2 -2
  526. package/dist/chunk-5M5C6UV4.cjs +0 -125
  527. package/dist/components/dynamic-skeleton.d.ts +0 -108
  528. package/dist/components/dynamic-skeleton.d.ts.map +0 -1
  529. package/dist/components/dynamic-skeleton.js +0 -221
  530. package/dist/components/loading/content-skeleton.d.ts +0 -73
  531. package/dist/components/loading/content-skeleton.d.ts.map +0 -1
  532. package/dist/components/loading/content-skeleton.js +0 -217
  533. package/dist/components/loading/users-grid-skeleton.d.ts +0 -7
  534. package/dist/components/loading/users-grid-skeleton.d.ts.map +0 -1
  535. package/dist/components/loading/users-grid-skeleton.js +0 -13
  536. package/dist/components/shared/product-release/release-detail-skeleton.d.ts +0 -2
  537. package/dist/components/shared/product-release/release-detail-skeleton.d.ts.map +0 -1
  538. package/dist/components/shared/product-release/release-detail-skeleton.js +0 -9
  539. package/dist/components/skeleton.d.ts +0 -4
  540. package/dist/components/skeleton.d.ts.map +0 -1
  541. package/dist/components/skeleton.js +0 -9
  542. package/dist/components/ui/skeleton.d.ts +0 -44
  543. package/dist/components/ui/skeleton.d.ts.map +0 -1
  544. package/dist/components/ui/skeleton.js +0 -103
  545. package/dist/components/vendor-page-skeleton.d.ts +0 -2
  546. package/dist/components/vendor-page-skeleton.d.ts.map +0 -1
  547. package/dist/components/vendor-page-skeleton.js +0 -9
  548. package/src/components/dynamic-skeleton.tsx +0 -365
  549. package/src/components/loading/content-skeleton.tsx +0 -374
  550. package/src/components/loading/users-grid-skeleton.tsx +0 -36
  551. package/src/components/shared/product-release/release-detail-skeleton.tsx +0 -7
  552. package/src/components/skeleton.tsx +0 -8
  553. package/src/components/ui/skeleton.tsx +0 -173
  554. package/src/components/vendor-page-skeleton.tsx +0 -7
@@ -1,12 +1,13 @@
1
1
  import { cn } from '../../utils/cn';
2
- import { TextSkeleton, MediaSkeleton, InteractiveSkeleton } from './unified-skeleton';
2
+ import { LoadingRegion } from './loading-region';
3
+ import { UnifiedSkeleton, TextSkeleton, MediaSkeleton, InteractiveSkeleton } from './unified-skeleton';
3
4
 
4
5
  interface CardSkeletonProps {
5
6
  className?: string;
6
7
  /**
7
8
  * Card layout variant
8
9
  */
9
- variant?: 'vendor' | 'blog' | 'category' | 'alternative';
10
+ variant?: 'vendor' | 'blog' | 'alternative';
10
11
  /**
11
12
  * Show action buttons area
12
13
  */
@@ -24,9 +25,10 @@ interface CardSkeletonProps {
24
25
  *
25
26
  * Supports different card types used across the application:
26
27
  * - vendor: Vendor cards with logo, title, description, and actions
27
- * - blog: Blog post cards with image, title, summary, and metadata
28
- * - category: Category cards with icon, title, and description
28
+ * - blog: Blog post cards with image, title, summary, and metadata
29
29
  * - alternative: Alternative vendor cards in comparison lists
30
+ *
31
+ * A category card's loading box is `CategoryCardSkeleton`.
30
32
  */
31
33
  export function CardSkeleton({
32
34
  className,
@@ -39,7 +41,6 @@ export function CardSkeleton({
39
41
  const cardContent = {
40
42
  vendor: <VendorCardContent showMetadata={showMetadata} />,
41
43
  blog: <BlogCardContent showActions={showActions} showMetadata={showMetadata} />,
42
- category: <CategoryCardContent />,
43
44
  alternative: <AlternativeCardContent showActions={showActions} />,
44
45
  };
45
46
 
@@ -53,8 +54,6 @@ export function CardSkeleton({
53
54
  variant === 'vendor' && 'flex h-full flex-col',
54
55
  className,
55
56
  )}
56
- role="status"
57
- aria-label={`Loading ${variant} card`}
58
57
  {...props}
59
58
  >
60
59
  {cardContent[variant]}
@@ -181,7 +180,7 @@ function BlogCardContent({ showActions, showMetadata }: { showActions: boolean;
181
180
  <div className="flex shrink-0 items-center gap-3 text-ods-text-muted">
182
181
  <TextSkeleton.Caption className="w-12" />
183
182
  {/* Separator dot */}
184
- <div className="h-1 w-1 rounded-full bg-ods-skeleton"></div>
183
+ <UnifiedSkeleton variant="circular" className="h-1 w-1" />
185
184
  <TextSkeleton.Caption className="w-16" />
186
185
  </div>
187
186
  </div>
@@ -192,39 +191,6 @@ function BlogCardContent({ showActions, showMetadata }: { showActions: boolean;
192
191
  );
193
192
  }
194
193
 
195
- /**
196
- * Category card skeleton content
197
- */
198
- function CategoryCardContent() {
199
- return (
200
- <div className="space-y-4 p-4 content-md:p-6">
201
- {/* Icon grid */}
202
- <div className="flex gap-2 content-md:gap-3">
203
- {Array.from({ length: 6 }).map((_, index) => (
204
- <MediaSkeleton.Icon key={index} size="lg" className="flex-shrink-0" />
205
- ))}
206
- </div>
207
-
208
- {/* Content */}
209
- <div className="space-y-2">
210
- <div className="space-y-1">
211
- <TextSkeleton.Subheading className="w-3/4" />
212
- <TextSkeleton.Caption className="w-1/2" />
213
- </div>
214
-
215
- <div className="flex items-start justify-between gap-4 content-md:items-end content-md:gap-6">
216
- <div className="flex-1 space-y-2">
217
- <TextSkeleton.Body className="w-full" />
218
- <TextSkeleton.Body className="w-2/3" />
219
- </div>
220
-
221
- <InteractiveSkeleton.Button className="h-10 w-10 flex-shrink-0 content-md:h-12 content-md:w-12" />
222
- </div>
223
- </div>
224
- </div>
225
- );
226
- }
227
-
228
194
  /**
229
195
  * Alternative card skeleton content (for vendor alternatives/comparisons)
230
196
  */
@@ -258,34 +224,36 @@ function AlternativeCardContent({ showActions }: { showActions: boolean }) {
258
224
  * Grid of card skeletons for loading lists
259
225
  */
260
226
  export function CardSkeletonGrid({
227
+ region = true,
261
228
  count = 6,
262
229
  variant = 'vendor',
263
230
  className,
264
231
  containerClassName,
265
232
  ...props
266
233
  }: {
234
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
235
+ region?: boolean;
267
236
  count?: number;
268
237
  variant?: CardSkeletonProps['variant'];
269
238
  className?: string;
270
239
  containerClassName?: string;
271
240
  } & Omit<CardSkeletonProps, 'variant'>) {
272
241
  return (
273
- <div
242
+ <LoadingRegion
243
+ label={`Loading ${variant} cards`}
244
+ announce={region}
274
245
  className={cn(
275
246
  'grid gap-4 content-md:gap-6',
276
247
  // Responsive grid based on card type
277
248
  variant === 'vendor' && 'grid-cols-1 content-md:grid-cols-2 content-lg:grid-cols-3',
278
249
  variant === 'blog' && 'grid-cols-1 content-md:grid-cols-2',
279
- variant === 'category' && 'grid-cols-1 content-md:grid-cols-2 content-lg:grid-cols-4',
280
250
  variant === 'alternative' && 'grid-cols-1',
281
251
  className,
282
252
  )}
283
- role="status"
284
- aria-label={`Loading ${count} ${variant} cards`}
285
253
  >
286
254
  {Array.from({ length: count }, (_, index) => (
287
255
  <CardSkeleton key={index} variant={variant} containerClassName={containerClassName} {...props} />
288
256
  ))}
289
- </div>
257
+ </LoadingRegion>
290
258
  );
291
259
  }
@@ -12,13 +12,11 @@ export function CategoryCardSkeleton({ className }: CategoryCardSkeletonProps) {
12
12
  'box-border flex min-w-0 flex-col rounded-[12px] border border-ods-border bg-ods-card p-8',
13
13
  className,
14
14
  )}
15
- role="status"
16
- aria-label="Loading category card"
17
15
  >
18
16
  {/* Icons row */}
19
17
  <div className="mb-8 flex items-center justify-center gap-6">
20
18
  {Array.from({ length: 10 }).map((_, i) => (
21
- <UnifiedSkeleton key={i} variant="circular" className="h-10 w-10 flex-shrink-0" aria-label="Loading icon" />
19
+ <UnifiedSkeleton key={i} variant="circular" className="h-10 w-10 flex-shrink-0" />
22
20
  ))}
23
21
  </div>
24
22
 
@@ -31,7 +29,7 @@ export function CategoryCardSkeleton({ className }: CategoryCardSkeletonProps) {
31
29
 
32
30
  {/* Arrow button placeholder */}
33
31
  <div className="mt-4 flex justify-end">
34
- <UnifiedSkeleton className="h-12 w-12 rounded-[6px]" aria-label="Loading button" />
32
+ <UnifiedSkeleton className="h-12 w-12 rounded-[6px]" />
35
33
  </div>
36
34
  </article>
37
35
  );
@@ -1,18 +1,25 @@
1
1
  import { cn } from '../../utils/cn';
2
+ import { LoadingRegion } from './loading-region';
2
3
  import { TextSkeleton, UnifiedSkeleton } from './unified-skeleton';
3
4
 
4
5
  interface CategoryVendorSelectorSkeletonProps {
6
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
7
+ region?: boolean;
5
8
  /** number of subcategory blocks to render */
6
9
  subcategories?: number;
7
10
  className?: string;
8
11
  }
9
12
 
10
- export function CategoryVendorSelectorSkeleton({ subcategories = 3, className }: CategoryVendorSelectorSkeletonProps) {
13
+ export function CategoryVendorSelectorSkeleton({
14
+ region = true,
15
+ subcategories = 3,
16
+ className,
17
+ }: CategoryVendorSelectorSkeletonProps) {
11
18
  return (
12
- <div
19
+ <LoadingRegion
20
+ label="Loading categories"
21
+ announce={region}
13
22
  className={cn('rounded-lg border border-ods-border bg-ods-card p-6', className)}
14
- role="status"
15
- aria-label="Loading category section"
16
23
  >
17
24
  {/* Header */}
18
25
  <div className="mb-6 max-w-xl space-y-2">
@@ -35,6 +42,6 @@ export function CategoryVendorSelectorSkeleton({ subcategories = 3, className }:
35
42
  </div>
36
43
  ))}
37
44
  </div>
38
- </div>
45
+ </LoadingRegion>
39
46
  );
40
47
  }
@@ -1,68 +1,66 @@
1
1
  import { cn } from '../../utils/cn';
2
- import { OrganizationIconSkeleton } from './organization-icon-skeleton';
2
+ import { LoadingRegion } from './loading-region';
3
+ import { UnifiedSkeleton } from './unified-skeleton';
3
4
 
4
5
  export interface DeviceCardSkeletonProps {
5
6
  /**
6
7
  * Additional CSS classes
7
8
  */
8
9
  className?: string;
10
+ /** Hold `DeviceCard`'s "more" button (its `actions.moreButton`). Default `true`. */
11
+ moreButton?: boolean;
12
+ /**
13
+ * Hold the box of `DeviceCard`'s `actions.detailsButton.component` with these size classes
14
+ * (e.g. `'h-12 w-[88px]'`). Omit when the card has no details button.
15
+ */
16
+ detailsButtonClassName?: string;
9
17
  }
10
18
 
11
19
  /**
12
- * DeviceCardSkeleton - Loading skeleton matching DeviceCard exact layout
20
+ * DeviceCardSkeleton: the loading box of `DeviceCard` (`ui/device-card.tsx`), box for box:
21
+ * the same container classes, then
22
+ * - Row 1: the bordered device-icon box, the OS icon and name line (`text-h4`) over the
23
+ * organization line (`text-h6`), the bordered "more" button (`moreButton`) and/or the details
24
+ * button's box (`detailsButtonClassName`);
25
+ * - Row 2: the status tag (`Tag`'s `h-8`) and the "Last seen" line (`text-h6`).
13
26
  *
14
- * Matches the structure of DeviceCard:
15
- * - Row 1: Device icon + Device name + More button
16
- * - Row 2: OS badge + Organization icon + Organization name
17
- * - Row 3: Status badge + Last seen
18
- *
19
- * Prevents layout jumps by matching exact dimensions.
27
+ * The loaded card replaces it with no movement.
20
28
  */
21
- export function DeviceCardSkeleton({ className }: DeviceCardSkeletonProps) {
29
+ export function DeviceCardSkeleton({ className, moreButton = true, detailsButtonClassName }: DeviceCardSkeletonProps) {
22
30
  return (
23
31
  <div
24
- className={cn('h-full rounded-[6px] border border-ods-border bg-ods-card', className)}
25
- role="status"
26
- aria-label="Loading device card"
32
+ className={cn(
33
+ 'overflow-clip rounded-[6px] border border-ods-border bg-ods-card',
34
+ 'flex flex-col gap-4 p-4',
35
+ className,
36
+ )}
27
37
  >
28
- {/* Row 1: Device icon + Device name + More button */}
29
- <div className="flex items-center gap-4 px-4 py-3">
30
- {/* Device type icon (8x8 container) */}
31
- <div className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-[6px] border border-ods-border bg-ods-bg">
32
- <div className="h-4 w-4 animate-pulse rounded bg-ods-border" />
38
+ {/* Row 1: device icon | name over organization | more button */}
39
+ <div className="flex w-full items-center gap-4">
40
+ <div className="flex shrink-0 items-center justify-center rounded-[6px] border border-ods-border p-2">
41
+ <UnifiedSkeleton className="size-4 rounded" />
33
42
  </div>
34
-
35
- {/* Device name */}
36
- <div className="min-w-0 flex-1">
37
- <div className="h-6 w-3/4 animate-pulse rounded bg-ods-border" />
38
- </div>
39
-
40
- {/* More button */}
41
- <div className="h-12 w-12 flex-shrink-0 animate-pulse rounded-[6px] bg-ods-border" />
42
- </div>
43
-
44
- {/* Row 2: OS badge + Organization */}
45
- <div className="flex items-center gap-4 px-4 py-2">
46
- {/* OS badge */}
47
- <div className="h-6 w-24 flex-shrink-0 animate-pulse rounded bg-ods-border" />
48
-
49
- {/* Organization icon */}
50
- <OrganizationIconSkeleton size="sm" />
51
-
52
- {/* Organization name */}
53
- <div className="min-w-0 flex-1">
54
- <div className="h-5 w-1/2 animate-pulse rounded bg-ods-border" />
43
+ <div className="flex min-w-0 flex-1 flex-col justify-center">
44
+ {/* OS icon (16px) + name, one `text-h4` line */}
45
+ <div className="flex items-center gap-1 text-h4">
46
+ <UnifiedSkeleton className="size-4 shrink-0 rounded" />
47
+ <UnifiedSkeleton className="h-[1lh] w-3/4 rounded" />
48
+ </div>
49
+ <UnifiedSkeleton className="h-[1lh] w-1/2 rounded text-h6" />
55
50
  </div>
51
+ {moreButton && (
52
+ <div className="flex shrink-0 items-center justify-center rounded-[6px] border border-ods-border p-3">
53
+ <UnifiedSkeleton className="size-6 rounded" />
54
+ </div>
55
+ )}
56
+ {detailsButtonClassName && <UnifiedSkeleton className={cn('shrink-0 rounded-[6px]', detailsButtonClassName)} />}
56
57
  </div>
57
58
 
58
- {/* Row 3: Status badge + Last seen */}
59
- <div className="flex items-center gap-4 px-4 py-2">
60
- {/* Status badge */}
61
- <div className="h-6 w-20 flex-shrink-0 animate-pulse rounded-full bg-ods-border" />
62
-
63
- {/* Last seen */}
64
- <div className="flex-1">
65
- <div className="h-5 w-40 animate-pulse rounded bg-ods-border" />
59
+ {/* Row 2: status tag | last seen */}
60
+ <div className="flex w-full items-center gap-2">
61
+ <UnifiedSkeleton className="h-8 w-20 shrink-0 rounded-md" />
62
+ <div className="min-w-0 flex-1 text-h6">
63
+ <UnifiedSkeleton className="h-[1lh] w-40 max-w-full rounded" />
66
64
  </div>
67
65
  </div>
68
66
  </div>
@@ -78,16 +76,25 @@ export function DeviceCardSkeleton({ className }: DeviceCardSkeletonProps) {
78
76
  * - Desktop (lg): 3 columns
79
77
  * - Large (xl): 4 columns
80
78
  */
81
- export function DeviceCardSkeletonGrid({ count = 12, className }: { count?: number; className?: string }) {
79
+ export function DeviceCardSkeletonGrid({
80
+ region = true,
81
+ count = 12,
82
+ className,
83
+ }: {
84
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
85
+ region?: boolean;
86
+ count?: number;
87
+ className?: string;
88
+ }) {
82
89
  return (
83
- <div
90
+ <LoadingRegion
91
+ label="Loading devices"
92
+ announce={region}
84
93
  className={cn('grid grid-cols-1 gap-4 content-md:grid-cols-2 content-lg:grid-cols-4', className)}
85
- role="status"
86
- aria-label={`Loading ${count} device cards`}
87
94
  >
88
95
  {Array.from({ length: count }, (_, index) => (
89
96
  <DeviceCardSkeleton key={index} />
90
97
  ))}
91
- </div>
98
+ </LoadingRegion>
92
99
  );
93
100
  }
@@ -7,6 +7,7 @@ export {
7
7
  SearchContainerSkeleton,
8
8
  CategorySidebarSkeleton,
9
9
  BreadcrumbSkeleton,
10
+ BreadcrumbLinkSkeleton,
10
11
  ResultsHeaderSkeleton,
11
12
  TwoColumnLayoutSkeleton,
12
13
  ArticleLayoutSkeleton,
@@ -26,25 +27,13 @@ export { UnifiedSkeleton, TextSkeleton, MediaSkeleton, InteractiveSkeleton } fro
26
27
  // New unified loading components
27
28
  export { ContentLoadingContainer, useContentLoading } from '../content-loading-container';
28
29
 
29
- // Content skeleton components
30
- export {
31
- ParagraphSkeleton,
32
- ListSkeleton,
33
- TableSkeleton,
34
- FormSkeleton,
35
- NavigationSkeleton,
36
- ProfileSkeleton,
37
- CommentSkeleton,
38
- FeatureListSkeleton,
39
- TimelineSkeleton,
40
- PricingSkeleton,
41
- } from './content-skeleton';
42
-
43
30
  // Profile system loading skeleton
44
31
  export { ProfileLoadingSkeleton } from '../profile/ProfileLoadingSkeleton';
45
32
 
46
33
  export { MspProfileFormSkeleton } from './msp-profile-form-skeleton';
47
34
 
35
+ export { SettingsFormSkeleton, type SettingsFormSkeletonProps } from './settings-form-skeleton';
36
+
48
37
  export { CategoryCardSkeleton } from './category-card-skeleton';
49
38
 
50
39
  export { CategoryVendorSelectorSkeleton } from './category-vendor-selector-skeleton';
@@ -56,12 +45,9 @@ export { WizardLayoutSkeleton } from './wizard-layout-skeleton';
56
45
  // export it here, otherwise server components that import this index will
57
46
  // break due to client-only code.
58
47
 
59
- export { MarginReportSkeleton } from './margin-report-skeleton';
60
-
61
- export { UsersGridSkeleton } from './users-grid-skeleton';
48
+ export { LoadingRegion, type LoadingRegionProps } from './loading-region';
62
49
 
63
- // Dynamic ODS-aware skeleton components
64
- export { DynamicSkeleton, SkeletonPresets, PlatformSkeletonContainer, ProgressiveSkeleton } from '../dynamic-skeleton';
50
+ export { MarginReportSkeleton } from './margin-report-skeleton';
65
51
 
66
52
  // Organization & Device skeleton components
67
53
  export { OrganizationIconSkeleton } from './organization-icon-skeleton';
@@ -0,0 +1,60 @@
1
+ import type { ElementType, HTMLAttributes, ReactNode } from 'react';
2
+
3
+ /**
4
+ * THE container of a loading state: the one thing a screen reader hears while it loads.
5
+ *
6
+ * Skeleton bars (`UnifiedSkeleton`, `TextHold`) are decoration and are hidden from assistive technology;
7
+ * a page with forty bars must not announce "loading" forty times. The region around them says it ONCE:
8
+ * `aria-busy` on the container, and one polite status with the label. Few screen readers honour
9
+ * `aria-busy` alone, so the status is what is actually read. When the content replaces the region, the
10
+ * status goes with it.
11
+ *
12
+ * Put it on the top of a loading state (a page's skeleton, a card grid's, a Suspense fallback), never on
13
+ * every card inside it: nested regions would announce again.
14
+ */
15
+ export interface LoadingRegionProps extends HTMLAttributes<HTMLElement> {
16
+ /** What is loading, read once by a screen reader. */
17
+ label?: string;
18
+ /** The container element, so the region keeps the layout element it replaces (a `section`, a `li`, a `span` in text). */
19
+ as?: ElementType;
20
+ /**
21
+ * `false`: only the container is drawn (no `aria-busy`, no status), for a loading state rendered inside
22
+ * another region, which announces for both. Components expose it as their `region` / `loadingRegion` prop.
23
+ * Default `true`.
24
+ */
25
+ announce?: boolean;
26
+ /**
27
+ * `false`: `aria-busy` without a status of its own, for a container whose loading is already announced by a
28
+ * status elsewhere (a table footer's "Loading more results"). Default `true`.
29
+ */
30
+ status?: boolean;
31
+ children?: ReactNode;
32
+ }
33
+
34
+ export function LoadingRegion({
35
+ label = 'Loading',
36
+ as: Tag = 'div',
37
+ announce = true,
38
+ status = true,
39
+ className,
40
+ children,
41
+ ...props
42
+ }: LoadingRegionProps) {
43
+ if (!announce) {
44
+ return (
45
+ <Tag className={className} {...props}>
46
+ {children}
47
+ </Tag>
48
+ );
49
+ }
50
+ return (
51
+ <Tag aria-busy="true" className={className} {...props}>
52
+ {status && (
53
+ <span role="status" aria-live="polite" className="sr-only">
54
+ {label}
55
+ </span>
56
+ )}
57
+ {children}
58
+ </Tag>
59
+ );
60
+ }
@@ -1,6 +1,10 @@
1
1
  import type React from 'react';
2
+ import { LoadingRegion } from './loading-region';
3
+ import { UnifiedSkeleton } from './unified-skeleton';
2
4
 
3
5
  interface MarginReportSkeletonProps {
6
+ /** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
7
+ region?: boolean;
4
8
  /** Enable pulse animation (default: true) */
5
9
  animate?: boolean;
6
10
  /** Optional explanation text shown above overlay content */
@@ -9,63 +13,70 @@ interface MarginReportSkeletonProps {
9
13
  overlayContent?: React.ReactNode;
10
14
  }
11
15
 
12
- export function MarginReportSkeleton({ animate = true, description, overlayContent }: MarginReportSkeletonProps) {
16
+ export function MarginReportSkeleton({
17
+ region = true,
18
+ animate = true,
19
+ description,
20
+ overlayContent,
21
+ }: MarginReportSkeletonProps) {
13
22
  return (
14
- <main className={`bg-ods-bg ${animate ? 'animate-pulse' : ''} relative min-h-screen`}>
23
+ <LoadingRegion
24
+ label="Loading the report"
25
+ as="main"
26
+ announce={region && !overlayContent}
27
+ className="relative min-h-screen bg-ods-bg"
28
+ >
15
29
  <div className="mx-auto max-w-[1920px] space-y-10 px-6 py-6 content-md:px-20 content-md:py-10">
16
30
  {/* Header */}
17
31
  <div className="space-y-3">
18
- <div className="h-10 w-72 rounded bg-ods-skeleton" />
19
- <div className="h-4 w-80 rounded bg-ods-skeleton" />
32
+ <UnifiedSkeleton className="h-10 w-72 rounded" animate={animate} />
33
+ <UnifiedSkeleton className="h-4 w-80 rounded" animate={animate} />
20
34
  </div>
21
35
 
22
36
  {/* Summary cards */}
23
37
  <div className="grid grid-cols-1 gap-6 content-md:grid-cols-3">
24
38
  {Array.from({ length: 3 }).map((_, i) => (
25
- <div key={i} className="h-32 rounded border border-ods-border bg-ods-card" />
39
+ <UnifiedSkeleton key={i} className="h-32 rounded border border-ods-border" animate={animate} />
26
40
  ))}
27
41
  </div>
28
42
 
29
43
  {/* MSP Profile & Report Info cards */}
30
44
  <div className="grid grid-cols-1 gap-6 content-md:grid-cols-2">
31
45
  {/* MSP profile skeleton */}
32
- <div className="flex animate-pulse items-center gap-4 rounded-lg border border-ods-border bg-ods-card p-6">
33
- <div className="h-14 w-14 rounded-lg bg-ods-skeleton" />
46
+ <div className="flex items-center gap-4 rounded-lg border border-ods-border bg-ods-card p-6">
47
+ <UnifiedSkeleton className="h-14 w-14 rounded-lg" animate={animate} />
34
48
  <div className="flex-1 space-y-2">
35
- <div className="h-4 w-3/4 rounded bg-ods-skeleton" />
36
- <div className="h-3 w-1/2 rounded bg-ods-skeleton" />
49
+ <UnifiedSkeleton className="h-4 w-3/4 rounded" animate={animate} />
50
+ <UnifiedSkeleton className="h-3 w-1/2 rounded" animate={animate} />
37
51
  </div>
38
52
  </div>
39
53
 
40
54
  {/* Report info skeleton */}
41
- <div className="flex animate-pulse flex-col gap-4 rounded-lg border border-ods-border bg-ods-card p-6">
55
+ <div className="flex flex-col gap-4 rounded-lg border border-ods-border bg-ods-card p-6">
42
56
  <div className="flex items-center justify-between gap-4">
43
57
  <div className="flex items-center gap-2">
44
- <div className="h-10 w-10 rounded-lg bg-ods-skeleton" />
58
+ <UnifiedSkeleton className="h-10 w-10 rounded-lg" animate={animate} />
45
59
  <div className="space-y-1">
46
- <div className="h-4 w-32 rounded bg-ods-skeleton" />
47
- <div className="h-3 w-20 rounded bg-ods-skeleton" />
60
+ <UnifiedSkeleton className="h-4 w-32 rounded" animate={animate} />
61
+ <UnifiedSkeleton className="h-3 w-20 rounded" animate={animate} />
48
62
  </div>
49
63
  </div>
50
- <div className="h-6 w-36 rounded bg-ods-skeleton" />
64
+ <UnifiedSkeleton className="h-6 w-36 rounded" animate={animate} />
51
65
  </div>
52
- <div className="mt-4 h-4 w-40 rounded bg-ods-skeleton" />
66
+ <UnifiedSkeleton className="mt-4 h-4 w-40 rounded" animate={animate} />
53
67
  </div>
54
68
  </div>
55
69
 
56
70
  {/* Vendor solution lists (Commercial & Open-Source) */}
57
71
  <div className="grid grid-cols-1 gap-6 content-md:grid-cols-2">
58
72
  {['Commercial Stack', 'Open-Source Stack'].map((label, idx) => (
59
- <div
60
- key={idx}
61
- className="flex animate-pulse flex-col overflow-hidden rounded-lg border border-ods-border bg-ods-card"
62
- >
73
+ <div key={idx} className="flex flex-col overflow-hidden rounded-lg border border-ods-border bg-ods-card">
63
74
  {/* list header */}
64
75
  <div className="flex items-center justify-between px-6 py-4">
65
- <div className="h-6 w-40 rounded bg-ods-skeleton" />
76
+ <UnifiedSkeleton className="h-6 w-40 rounded" animate={animate} />
66
77
  <div className="flex items-center gap-2">
67
- <div className="h-5 w-20 rounded bg-ods-skeleton" />
68
- <div className="h-4 w-10 rounded bg-ods-skeleton" />
78
+ <UnifiedSkeleton className="h-5 w-20 rounded" animate={animate} />
79
+ <UnifiedSkeleton className="h-4 w-10 rounded" animate={animate} />
69
80
  </div>
70
81
  </div>
71
82
 
@@ -78,16 +89,16 @@ export function MarginReportSkeleton({ animate = true, description, overlayConte
78
89
  >
79
90
  {/* left section: icon + text */}
80
91
  <div className="flex min-w-0 items-center gap-3">
81
- <div className="h-12 w-12 flex-shrink-0 rounded-lg bg-ods-skeleton" />
92
+ <UnifiedSkeleton className="h-12 w-12 flex-shrink-0 rounded-lg" animate={animate} />
82
93
  <div className="flex min-w-0 flex-col">
83
- <div className="h-4 w-32 rounded bg-ods-skeleton" />
84
- <div className="mt-1 hidden h-3 w-24 rounded bg-ods-skeleton content-md:block" />
94
+ <UnifiedSkeleton className="h-4 w-32 rounded" animate={animate} />
95
+ <UnifiedSkeleton className="mt-1 hidden h-3 w-24 rounded content-md:block" animate={animate} />
85
96
  </div>
86
97
  </div>
87
98
  {/* right addon: cost text */}
88
99
  <div className="flex flex-shrink-0 items-center gap-1">
89
- <div className="h-4 w-16 rounded bg-ods-skeleton" />
90
- <div className="h-3 w-8 rounded bg-ods-skeleton" />
100
+ <UnifiedSkeleton className="h-4 w-16 rounded" animate={animate} />
101
+ <UnifiedSkeleton className="h-3 w-8 rounded" animate={animate} />
91
102
  </div>
92
103
  </div>
93
104
  ))}
@@ -97,12 +108,12 @@ export function MarginReportSkeleton({ animate = true, description, overlayConte
97
108
  </div>
98
109
 
99
110
  {/* Strategic Recommendations header placeholder */}
100
- <div className="h-6 w-60 rounded bg-ods-skeleton" />
111
+ <UnifiedSkeleton className="h-6 w-60 rounded" animate={animate} />
101
112
 
102
113
  {/* Recommendations grid */}
103
114
  <div className="grid grid-cols-1 gap-6 content-md:grid-cols-2 content-lg:grid-cols-3">
104
115
  {Array.from({ length: 3 }).map((_, i) => (
105
- <div key={i} className="h-48 rounded border border-ods-border bg-ods-card" />
116
+ <UnifiedSkeleton key={i} className="h-48 rounded border border-ods-border" animate={animate} />
106
117
  ))}
107
118
  </div>
108
119
 
@@ -111,17 +122,17 @@ export function MarginReportSkeleton({ animate = true, description, overlayConte
111
122
  {/* Section header */}
112
123
  <div className="flex items-start gap-6">
113
124
  <div className="min-w-0 flex-1 space-y-2">
114
- <div className="h-8 w-72 rounded bg-ods-skeleton" />
115
- <div className="h-4 w-3/4 rounded bg-ods-skeleton" />
125
+ <UnifiedSkeleton className="h-8 w-72 rounded" animate={animate} />
126
+ <UnifiedSkeleton className="h-4 w-3/4 rounded" animate={animate} />
116
127
  </div>
117
128
  {/* Logo placeholder */}
118
- <div className="h-12 w-12 shrink-0 rounded-md bg-ods-skeleton" />
129
+ <UnifiedSkeleton className="h-12 w-12 shrink-0 rounded-md" animate={animate} />
119
130
  </div>
120
131
 
121
132
  {/* Value cards grid */}
122
133
  <div className="grid grid-cols-1 gap-6 content-md:grid-cols-2 content-lg:grid-cols-3">
123
134
  {Array.from({ length: 3 }).map((_, i) => (
124
- <div key={i} className="h-32 rounded border border-ods-border bg-ods-card" />
135
+ <UnifiedSkeleton key={i} className="h-32 rounded border border-ods-border" animate={animate} />
125
136
  ))}
126
137
  </div>
127
138
  </div>
@@ -137,6 +148,6 @@ export function MarginReportSkeleton({ animate = true, description, overlayConte
137
148
  </div>
138
149
  </div>
139
150
  )}
140
- </main>
151
+ </LoadingRegion>
141
152
  );
142
153
  }