@flamingo-stack/openframe-frontend-core 0.0.703 → 0.0.704-snapshot.20261006133653

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 (336) hide show
  1. package/dist/{chunk-3L7KCOGO.cjs → chunk-2QEUFXNS.cjs} +30 -30
  2. package/dist/{chunk-BMJUKS6S.cjs → chunk-3256UJXS.cjs} +47 -47
  3. package/dist/{chunk-GZYLZ4MB.js → chunk-4S7TJYRQ.js} +3 -3
  4. package/dist/{chunk-ENGBNKUJ.js → chunk-5EFZO5EB.js} +675 -569
  5. package/dist/{chunk-TCZCMD5Q.js → chunk-5HBHO5TB.js} +1 -1
  6. package/dist/{chunk-BOUPNYUV.js → chunk-64HOMVYC.js} +5 -5
  7. package/dist/{chunk-YR6JPJF4.js → chunk-6XIF2Z7I.js} +4 -4
  8. package/dist/{chunk-NU724ZVN.cjs → chunk-7GHB2IK6.cjs} +121 -121
  9. package/dist/{chunk-GX3OUTFO.cjs → chunk-7ZYIC7NA.cjs} +69 -55
  10. package/dist/{chunk-53AC23ZN.js → chunk-A6WVQKOZ.js} +24 -24
  11. package/dist/{chunk-4OGAXAEG.cjs → chunk-ABU3TGXA.cjs} +3 -3
  12. package/dist/{chunk-RTXTGLGB.cjs → chunk-ACV4DFQ3.cjs} +4 -4
  13. package/dist/{chunk-RLDAYA2A.cjs → chunk-BH6PJP66.cjs} +29 -29
  14. package/dist/{chunk-BRXOGCH3.cjs → chunk-BIZNSF3U.cjs} +3 -3
  15. package/dist/{chunk-2A4XES7R.cjs → chunk-BM5MVGH3.cjs} +3 -3
  16. package/dist/{chunk-6YCXA7CN.js → chunk-CH5232HV.js} +20 -19
  17. package/dist/{chunk-UIBSSVON.cjs → chunk-D7BTSVMS.cjs} +2 -2
  18. package/dist/{chunk-YBGEPKC2.cjs → chunk-F7Y2ZS5U.cjs} +6 -6
  19. package/dist/{chunk-5V6O73EH.js → chunk-FLKJYMVB.js} +3 -3
  20. package/dist/{chunk-NMGX2ZTU.js → chunk-IFUQVZF4.js} +17 -17
  21. package/dist/{chunk-2NE3DNXY.js → chunk-IKCQK67U.js} +2 -2
  22. package/dist/{chunk-KFDP3DUL.cjs → chunk-IXPUM3AW.cjs} +98 -98
  23. package/dist/{chunk-QGTDWFT6.js → chunk-IZHZMBIX.js} +2469 -1928
  24. package/dist/{chunk-67CXGPTW.cjs → chunk-JKEEFQOX.cjs} +505 -72
  25. package/dist/{chunk-NYSYSKSH.cjs → chunk-M6HTJTFH.cjs} +15 -15
  26. package/dist/{chunk-OGLCD3UL.js → chunk-MFFCUVWG.js} +6 -6
  27. package/dist/{chunk-KJ5LWATV.js → chunk-MKXO4Q5P.js} +7 -7
  28. package/dist/{chunk-EMCQGFXD.cjs → chunk-MMOODW57.cjs} +28 -27
  29. package/dist/{chunk-Q76ZTHNV.js → chunk-MP2C3LJ4.js} +1 -1
  30. package/dist/{chunk-J4K5JOLI.js → chunk-MV4HYG3B.js} +25 -11
  31. package/dist/{chunk-2T6QWNXU.js → chunk-NDESEPW5.js} +99 -11
  32. package/dist/{chunk-HHFPQNP3.js → chunk-NJDHFC55.js} +15 -15
  33. package/dist/{chunk-HUOLB7ZN.cjs → chunk-OHFS7VOU.cjs} +9 -9
  34. package/dist/{chunk-7632TNE7.js → chunk-OSNIZNVH.js} +7 -7
  35. package/dist/{chunk-UTW4SQDI.js → chunk-OUHMD6EU.js} +10 -10
  36. package/dist/{chunk-MXHJROXJ.cjs → chunk-P23CRLU4.cjs} +1245 -1139
  37. package/dist/{chunk-64O4L7WN.js → chunk-PDWVPI3S.js} +11 -55
  38. package/dist/{chunk-DAW6TDZB.js → chunk-PFC2HWQA.js} +30 -16
  39. package/dist/{chunk-G55W76S6.js → chunk-POZ7F77D.js} +12 -13
  40. package/dist/{chunk-PJP5SMOU.js → chunk-PPEZGUL7.js} +500 -67
  41. package/dist/{chunk-SFGXIFYO.cjs → chunk-QC7Q3XCE.cjs} +24 -24
  42. package/dist/{chunk-MDBHZBW7.cjs → chunk-RKV5B7EU.cjs} +92 -4
  43. package/dist/{chunk-5VPIC5MD.cjs → chunk-SAAZEWUR.cjs} +12 -12
  44. package/dist/{chunk-IIMICN7L.cjs → chunk-TYWLNCNH.cjs} +4 -48
  45. package/dist/{chunk-HYLIQMZH.cjs → chunk-UBP5RNGK.cjs} +33 -33
  46. package/dist/{chunk-HUMWQMCU.js → chunk-UT4YHQZW.js} +3 -3
  47. package/dist/{chunk-BSEIEWM5.cjs → chunk-V3H26CNS.cjs} +28 -14
  48. package/dist/{chunk-NGJCWEYX.cjs → chunk-VHCACDKP.cjs} +46 -46
  49. package/dist/{chunk-SL2FOFT2.js → chunk-VMAZCLX4.js} +7 -7
  50. package/dist/{chunk-5FFNNJM7.js → chunk-VR2ZLFCP.js} +1 -1
  51. package/dist/{chunk-NCTYD7HL.js → chunk-VYWMEL5F.js} +14 -14
  52. package/dist/{chunk-HY5YL3U5.cjs → chunk-XBWE423R.cjs} +1994 -1453
  53. package/dist/{chunk-XCIFHW4E.cjs → chunk-XOYH2YQE.cjs} +2 -2
  54. package/dist/{chunk-S6V7A5FS.cjs → chunk-ZQZFIE2K.cjs} +32 -33
  55. package/dist/components/case-studies/index.cjs +24 -24
  56. package/dist/components/case-studies/index.js +10 -10
  57. package/dist/components/chat/chat-archive-page.d.ts +3 -3
  58. package/dist/components/chat/chat-archive-page.d.ts.map +1 -1
  59. package/dist/components/chat/chat-input.d.ts.map +1 -1
  60. package/dist/components/chat/chat-nav-sidebar.d.ts +4 -0
  61. package/dist/components/chat/chat-nav-sidebar.d.ts.map +1 -1
  62. package/dist/components/chat/chat-panel-header.d.ts +3 -2
  63. package/dist/components/chat/chat-panel-header.d.ts.map +1 -1
  64. package/dist/components/chat/embeddable-chat.d.ts +36 -2
  65. package/dist/components/chat/embeddable-chat.d.ts.map +1 -1
  66. package/dist/components/chat/index.cjs +14 -6
  67. package/dist/components/chat/index.d.ts +4 -1
  68. package/dist/components/chat/index.d.ts.map +1 -1
  69. package/dist/components/chat/index.js +13 -5
  70. package/dist/components/chat/mingo-archive-list.d.ts +17 -0
  71. package/dist/components/chat/mingo-archive-list.d.ts.map +1 -0
  72. package/dist/components/chat/mingo-chat-header.d.ts +31 -0
  73. package/dist/components/chat/mingo-chat-header.d.ts.map +1 -0
  74. package/dist/components/chat/mingo-chat-rail.d.ts +54 -0
  75. package/dist/components/chat/mingo-chat-rail.d.ts.map +1 -0
  76. package/dist/components/chat/model-display.d.ts.map +1 -1
  77. package/dist/components/contact/contact-form.d.ts.map +1 -1
  78. package/dist/components/contact/index.cjs +11 -11
  79. package/dist/components/contact/index.js +10 -10
  80. package/dist/components/content-loading-container.d.ts +1 -1
  81. package/dist/components/content-loading-container.d.ts.map +1 -1
  82. package/dist/components/docs/index.cjs +14 -14
  83. package/dist/components/docs/index.js +13 -13
  84. package/dist/components/docs/skeletons.d.ts.map +1 -1
  85. package/dist/components/embeds/index.cjs +11 -11
  86. package/dist/components/embeds/index.js +10 -10
  87. package/dist/components/faq/index.cjs +12 -12
  88. package/dist/components/faq/index.js +11 -11
  89. package/dist/components/features/figma-prototype-viewer.d.ts.map +1 -1
  90. package/dist/components/features/index.cjs +10 -10
  91. package/dist/components/features/index.js +9 -9
  92. package/dist/components/features/media-gallery-manager.d.ts.map +1 -1
  93. package/dist/components/features/parallax-image-showcase.d.ts.map +1 -1
  94. package/dist/components/features/policy-configuration-panel.d.ts.map +1 -1
  95. package/dist/components/features/section-selector.d.ts.map +1 -1
  96. package/dist/components/help-center-pages/index.cjs +119 -119
  97. package/dist/components/help-center-pages/index.js +39 -39
  98. package/dist/components/help-center-pages/trust-center-sections.d.ts +2 -2
  99. package/dist/components/help-center-pages/trust-center-sections.d.ts.map +1 -1
  100. package/dist/components/index.cjs +94 -86
  101. package/dist/components/index.js +32 -24
  102. package/dist/components/layout/article-detail-layout.d.ts +1 -1
  103. package/dist/components/layout/article-detail-layout.d.ts.map +1 -1
  104. package/dist/components/layout/page-container.d.ts.map +1 -1
  105. package/dist/components/layout/title-block.d.ts +2 -2
  106. package/dist/components/layout/title-block.d.ts.map +1 -1
  107. package/dist/components/loading/page-layout-skeleton.d.ts.map +1 -1
  108. package/dist/components/loading/unified-skeleton.d.ts.map +1 -1
  109. package/dist/components/meeting-scheduler/booking-form.d.ts +4 -4
  110. package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
  111. package/dist/components/meeting-scheduler/context-panel.d.ts.map +1 -1
  112. package/dist/components/meeting-scheduler/index.cjs +127 -127
  113. package/dist/components/meeting-scheduler/index.d.ts +2 -2
  114. package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
  115. package/dist/components/meeting-scheduler/index.js +50 -50
  116. package/dist/components/navigation/app-header.d.ts +4 -0
  117. package/dist/components/navigation/app-header.d.ts.map +1 -1
  118. package/dist/components/navigation/app-layout-side-panel.d.ts +142 -0
  119. package/dist/components/navigation/app-layout-side-panel.d.ts.map +1 -0
  120. package/dist/components/navigation/app-layout.d.ts +11 -1
  121. package/dist/components/navigation/app-layout.d.ts.map +1 -1
  122. package/dist/components/navigation/header-mingo-button.d.ts +4 -1
  123. package/dist/components/navigation/header-mingo-button.d.ts.map +1 -1
  124. package/dist/components/navigation/index.cjs +13 -13
  125. package/dist/components/navigation/index.d.ts +1 -0
  126. package/dist/components/navigation/index.d.ts.map +1 -1
  127. package/dist/components/navigation/index.js +12 -12
  128. package/dist/components/navigation/navigation-sidebar.d.ts +8 -1
  129. package/dist/components/navigation/navigation-sidebar.d.ts.map +1 -1
  130. package/dist/components/navigation/sliding-sidebar.d.ts.map +1 -1
  131. package/dist/components/onboarding-guides/index.cjs +14 -14
  132. package/dist/components/onboarding-guides/index.js +13 -13
  133. package/dist/components/persistent-filter-controls.d.ts.map +1 -1
  134. package/dist/components/related-content/index.cjs +7 -7
  135. package/dist/components/related-content/index.js +6 -6
  136. package/dist/components/shared/detail-page-skeleton.d.ts.map +1 -1
  137. package/dist/components/tickets/help-center-create-form.d.ts +4 -4
  138. package/dist/components/tickets/index.cjs +15 -15
  139. package/dist/components/tickets/index.js +14 -14
  140. package/dist/components/ui/announcement-bar-view.d.ts.map +1 -1
  141. package/dist/components/ui/breadcrumb.d.ts.map +1 -1
  142. package/dist/components/ui/checkbox-block.d.ts.map +1 -1
  143. package/dist/components/ui/dashboard-info-card.d.ts +1 -1
  144. package/dist/components/ui/dashboard-info-card.d.ts.map +1 -1
  145. package/dist/components/ui/data-table/data-table-body.d.ts +2 -2
  146. package/dist/components/ui/data-table/data-table-skeleton.d.ts +2 -2
  147. package/dist/components/ui/data-table/data-table-skeleton.d.ts.map +1 -1
  148. package/dist/components/ui/data-table/utils.d.ts +2 -2
  149. package/dist/components/ui/dialog.d.ts.map +1 -1
  150. package/dist/components/ui/drawer.d.ts.map +1 -1
  151. package/dist/components/ui/entity-image.d.ts +2 -2
  152. package/dist/components/ui/file-manager/index.cjs +36 -36
  153. package/dist/components/ui/file-manager/index.js +3 -3
  154. package/dist/components/ui/filter-modal.d.ts.map +1 -1
  155. package/dist/components/ui/index.cjs +18 -10
  156. package/dist/components/ui/index.js +17 -9
  157. package/dist/components/ui/info-card-row.d.ts.map +1 -1
  158. package/dist/components/ui/menubar.d.ts +1 -1
  159. package/dist/components/ui/menubar.d.ts.map +1 -1
  160. package/dist/components/ui/modal-v2.d.ts.map +1 -1
  161. package/dist/components/ui/modal.d.ts.map +1 -1
  162. package/dist/components/ui/no-data/no-data-actions.d.ts.map +1 -1
  163. package/dist/components/ui/no-data/no-data-styles.d.ts +1 -1
  164. package/dist/components/ui/no-data/no-data-styles.d.ts.map +1 -1
  165. package/dist/components/ui/page-actions.d.ts.map +1 -1
  166. package/dist/components/ui/sheet.d.ts.map +1 -1
  167. package/dist/components/ui/table/table-skeleton.d.ts +1 -1
  168. package/dist/components/ui/table/table-skeleton.d.ts.map +1 -1
  169. package/dist/hooks/index.cjs +23 -9
  170. package/dist/hooks/index.js +24 -10
  171. package/dist/hooks/ui/index.d.ts +1 -0
  172. package/dist/hooks/ui/index.d.ts.map +1 -1
  173. package/dist/hooks/ui/use-content-breakpoint.d.ts +32 -0
  174. package/dist/hooks/ui/use-content-breakpoint.d.ts.map +1 -0
  175. package/dist/hooks/ui/use-isomorphic-layout-effect.d.ts +2 -2
  176. package/dist/hooks/ui/use-isomorphic-layout-effect.d.ts.map +1 -1
  177. package/dist/hooks/ui/use-media-query.d.ts.map +1 -1
  178. package/dist/index.cjs +39 -17
  179. package/dist/index.js +41 -19
  180. package/dist/styles/layout-steps.d.ts +30 -0
  181. package/dist/styles/layout-steps.d.ts.map +1 -0
  182. package/dist/tailwind.config.cjs +36 -11
  183. package/dist/tailwind.config.js +36 -11
  184. package/eslint-config/README.md +9 -0
  185. package/eslint-config/base.js +17 -1
  186. package/eslint-config/layout-variants.js +57 -0
  187. package/package.json +3 -1
  188. package/src/ODS_TOKEN_RULES.md +40 -0
  189. package/src/components/chat/chat-archive-page.tsx +9 -7
  190. package/src/components/chat/chat-input.tsx +5 -1
  191. package/src/components/chat/chat-nav-sidebar.tsx +10 -4
  192. package/src/components/chat/chat-panel-header.tsx +8 -5
  193. package/src/components/chat/embeddable-chat.tsx +675 -485
  194. package/src/components/chat/index.ts +4 -0
  195. package/src/components/chat/mingo-archive-list.tsx +108 -0
  196. package/src/components/chat/mingo-chat-header.tsx +104 -0
  197. package/src/components/chat/mingo-chat-rail.tsx +361 -0
  198. package/src/components/chat/model-display.tsx +8 -1
  199. package/src/components/contact/contact-form.tsx +11 -9
  200. package/src/components/content-loading-container.tsx +4 -2
  201. package/src/components/docs/doc-viewer.tsx +7 -7
  202. package/src/components/docs/skeletons.tsx +7 -4
  203. package/src/components/dynamic-skeleton.tsx +1 -1
  204. package/src/components/embeds/claude-embed.tsx +1 -1
  205. package/src/components/embeds/embed-viewer-frame.tsx +4 -4
  206. package/src/components/embeds/figma-embed.tsx +2 -2
  207. package/src/components/embeds/google-sheets-viewer.tsx +1 -1
  208. package/src/components/embeds/pdf-viewer.tsx +3 -3
  209. package/src/components/empty-state.tsx +6 -6
  210. package/src/components/faq/faq-section.tsx +2 -2
  211. package/src/components/faq-accordion.tsx +1 -1
  212. package/src/components/features/board/board-column-header.tsx +1 -1
  213. package/src/components/features/command-box.tsx +3 -3
  214. package/src/components/features/entity-video-section.tsx +2 -2
  215. package/src/components/features/figma-prototype-viewer.tsx +4 -1
  216. package/src/components/features/media-gallery-manager.tsx +3 -1
  217. package/src/components/features/parallax-image-showcase.tsx +9 -6
  218. package/src/components/features/policy-configuration-panel.tsx +9 -7
  219. package/src/components/features/provider-button.tsx +1 -1
  220. package/src/components/features/section-selector.tsx +11 -6
  221. package/src/components/features/select-button.tsx +4 -4
  222. package/src/components/features/seo-editor-preview.tsx +2 -2
  223. package/src/components/features/video-ratio-tabs.tsx +3 -3
  224. package/src/components/features/waitlist-form.tsx +1 -1
  225. package/src/components/help-center-pages/trust-center-page.tsx +1 -1
  226. package/src/components/help-center-pages/trust-center-sections.tsx +14 -14
  227. package/src/components/icon-display.tsx +1 -1
  228. package/src/components/layout/article-detail-layout.tsx +4 -2
  229. package/src/components/layout/list-page-layout.tsx +2 -2
  230. package/src/components/layout/page-container.tsx +26 -14
  231. package/src/components/layout/page-heading.tsx +1 -1
  232. package/src/components/layout/page-layout.tsx +1 -1
  233. package/src/components/layout/title-block.tsx +13 -13
  234. package/src/components/loading/card-skeleton.tsx +11 -11
  235. package/src/components/loading/category-vendor-selector-skeleton.tsx +1 -1
  236. package/src/components/loading/content-skeleton.tsx +6 -6
  237. package/src/components/loading/device-card-skeleton.tsx +1 -1
  238. package/src/components/loading/margin-report-skeleton.tsx +7 -7
  239. package/src/components/loading/msp-profile-form-skeleton.tsx +3 -3
  240. package/src/components/loading/organization-card-skeleton.tsx +2 -2
  241. package/src/components/loading/page-layout-skeleton.tsx +80 -68
  242. package/src/components/loading/unified-skeleton.tsx +16 -6
  243. package/src/components/media-carousel.tsx +3 -3
  244. package/src/components/meeting-scheduler/booking-form.tsx +9 -8
  245. package/src/components/meeting-scheduler/context-panel.tsx +8 -6
  246. package/src/components/meeting-scheduler/directory.tsx +4 -4
  247. package/src/components/meeting-scheduler/index.tsx +15 -15
  248. package/src/components/meeting-scheduler/slot-picker.tsx +12 -12
  249. package/src/components/navigation/app-header.tsx +6 -0
  250. package/src/components/navigation/app-layout-side-panel.tsx +594 -0
  251. package/src/components/navigation/app-layout.tsx +69 -4
  252. package/src/components/navigation/header-mingo-button.tsx +13 -3
  253. package/src/components/navigation/index.ts +5 -0
  254. package/src/components/navigation/navigation-sidebar.tsx +17 -3
  255. package/src/components/navigation/sliding-sidebar.tsx +2 -1
  256. package/src/components/pagination.tsx +3 -3
  257. package/src/components/persistent-filter-controls.tsx +6 -2
  258. package/src/components/platform/ScriptArguments.tsx +1 -1
  259. package/src/components/platform/ScriptInfoSection.tsx +4 -4
  260. package/src/components/platform/SoftwareSourceBadge.tsx +1 -1
  261. package/src/components/shared/article-author-byline.tsx +1 -1
  262. package/src/components/shared/delivery/delivery-lists.tsx +2 -2
  263. package/src/components/shared/delivery/delivery-row.tsx +7 -7
  264. package/src/components/shared/delivery/delivery-table.tsx +3 -3
  265. package/src/components/shared/detail-page-skeleton.tsx +11 -5
  266. package/src/components/shared/dev-section/dev-card-row.tsx +6 -6
  267. package/src/components/shared/dev-section/dev-section-view.tsx +1 -1
  268. package/src/components/shared/product-release/product-release-card-skeleton.tsx +8 -8
  269. package/src/components/shared/product-release/product-release-card.tsx +9 -9
  270. package/src/components/shared/product-release/product-releases-view.tsx +1 -1
  271. package/src/components/shared/product-release/release-detail-page.tsx +5 -5
  272. package/src/components/shared/roadmap/roadmap-grid-skeleton.tsx +1 -1
  273. package/src/components/shared/roadmap/roadmap-grid.tsx +3 -3
  274. package/src/components/tickets/help-center-card.tsx +1 -1
  275. package/src/components/tickets/help-center-create-form.tsx +12 -12
  276. package/src/components/ui/announcement-bar-view.tsx +2 -10
  277. package/src/components/ui/benefit-card.tsx +18 -18
  278. package/src/components/ui/brand-association-grid.tsx +4 -4
  279. package/src/components/ui/breadcrumb.tsx +4 -1
  280. package/src/components/ui/card.tsx +1 -1
  281. package/src/components/ui/checkbox-block.tsx +9 -7
  282. package/src/components/ui/content-loader.tsx +3 -3
  283. package/src/components/ui/cursor-pagination.tsx +3 -3
  284. package/src/components/ui/dashboard-info-card.tsx +13 -9
  285. package/src/components/ui/data-attribution.tsx +2 -2
  286. package/src/components/ui/data-table/data-table-body.tsx +2 -2
  287. package/src/components/ui/data-table/data-table-header.tsx +15 -15
  288. package/src/components/ui/data-table/data-table-skeleton.tsx +6 -6
  289. package/src/components/ui/data-table/utils.ts +5 -5
  290. package/src/components/ui/dialog.tsx +4 -1
  291. package/src/components/ui/drawer.tsx +2 -1
  292. package/src/components/ui/duration-input.tsx +1 -1
  293. package/src/components/ui/entity-image.tsx +3 -3
  294. package/src/components/ui/feature-card.tsx +10 -10
  295. package/src/components/ui/file-manager/file-manager-action-bar.tsx +1 -1
  296. package/src/components/ui/file-manager/file-manager.tsx +1 -1
  297. package/src/components/ui/filter-modal.tsx +8 -1
  298. package/src/components/ui/highlight-card.tsx +7 -7
  299. package/src/components/ui/info-card-row.tsx +10 -6
  300. package/src/components/ui/modal-v2.tsx +7 -2
  301. package/src/components/ui/modal.tsx +3 -2
  302. package/src/components/ui/no-data/no-data-actions.tsx +10 -4
  303. package/src/components/ui/no-data/no-data-styles.ts +1 -1
  304. package/src/components/ui/no-data/no-data.tsx +1 -1
  305. package/src/components/ui/organization-card.tsx +1 -1
  306. package/src/components/ui/page-actions.tsx +34 -5
  307. package/src/components/ui/progress-bar.tsx +2 -2
  308. package/src/components/ui/query-report-table/query-report-table.tsx +1 -1
  309. package/src/components/ui/search-input.tsx +2 -2
  310. package/src/components/ui/service-card.tsx +2 -2
  311. package/src/components/ui/sheet.tsx +2 -1
  312. package/src/components/ui/skeleton.tsx +3 -3
  313. package/src/components/ui/stacked-rows-panel.tsx +4 -4
  314. package/src/components/ui/tab-navigation.tsx +2 -2
  315. package/src/components/ui/tab-selector.tsx +2 -2
  316. package/src/components/ui/table/table-header.tsx +3 -3
  317. package/src/components/ui/table/table-skeleton.tsx +3 -3
  318. package/src/components/ui/table/utils.ts +5 -5
  319. package/src/components/ui/tag-search-input.tsx +3 -3
  320. package/src/components/ui/tags-manager.tsx +5 -5
  321. package/src/components/ui/test-run.tsx +2 -2
  322. package/src/components/ui/ticket-info-section.tsx +1 -1
  323. package/src/components/ui/ticket-notes-section.tsx +1 -1
  324. package/src/components/ui/ticket-status-config-row.tsx +15 -15
  325. package/src/hooks/ui/index.ts +1 -0
  326. package/src/hooks/ui/use-content-breakpoint.ts +58 -0
  327. package/src/hooks/ui/use-media-query.ts +3 -2
  328. package/src/styles/app-globals.css +13 -0
  329. package/src/styles/index.css +2 -0
  330. package/src/styles/layout-steps.ts +14 -0
  331. package/src/styles/ods-colors.css +15 -0
  332. package/src/styles/ods-content-area-tokens.css +27 -0
  333. package/src/styles/ods-content-area.css +31 -0
  334. package/src/styles/ods-effects.css +4 -2
  335. package/src/styles/ods-responsive-tokens.css +14 -4
  336. package/tailwind.config.ts +42 -7
@@ -14,14 +14,14 @@ export function AnnouncementBarSkeleton() {
14
14
  return (
15
15
  <div className="relative w-full animate-pulse bg-ods-skeleton">
16
16
  <div className="relative flex w-full flex-row items-center">
17
- <div className="relative box-border flex w-full flex-row items-center justify-start gap-4 py-3 pl-4 pr-12 md:gap-6 md:py-4 md:pl-6 md:pr-16">
17
+ <div className="relative box-border flex w-full flex-row items-center justify-start gap-4 py-3 pl-4 pr-12 content-md:gap-6 content-md:py-4 content-md:pl-6 content-md:pr-16">
18
18
  {/* Logo skeleton */}
19
- <div className="relative h-6 w-6 shrink-0 rounded bg-ods-border md:h-8 md:w-8"></div>
19
+ <div className="relative h-6 w-6 shrink-0 rounded bg-ods-border content-md:h-8 content-md:w-8"></div>
20
20
 
21
21
  {/* Text content skeleton */}
22
- <div className="min-w-0 flex-1 space-y-1 md:space-y-2">
23
- <div className="h-[14px] w-3/4 max-w-md rounded bg-ods-border md:h-[18px]"></div>
24
- <div className="hidden h-[12px] w-full max-w-lg rounded bg-ods-border md:block md:h-[18px]"></div>
22
+ <div className="min-w-0 flex-1 space-y-1 content-md:space-y-2">
23
+ <div className="h-[14px] w-3/4 max-w-md rounded bg-ods-border content-md:h-[18px]"></div>
24
+ <div className="hidden h-[12px] w-full max-w-lg rounded bg-ods-border content-md:block content-md:h-[18px]"></div>
25
25
  </div>
26
26
 
27
27
  {/* Close button skeleton */}
@@ -37,14 +37,14 @@ export function AnnouncementBarSkeleton() {
37
37
  */
38
38
  export function HeaderSkeleton() {
39
39
  return (
40
- <header className="sticky top-0 z-40 flex w-full animate-pulse items-center justify-between border-b border-ods-border bg-ods-card bg-ods-card/95 px-4 py-3 backdrop-blur-sm md:px-[80px] md:py-[12px]">
40
+ <header className="sticky top-0 z-40 flex w-full animate-pulse items-center justify-between border-b border-ods-border bg-ods-card bg-ods-card/95 px-4 py-3 backdrop-blur-sm content-md:px-[80px] content-md:py-[12px]">
41
41
  {/* Left: Logo skeleton */}
42
42
  <div className="flex min-w-0 flex-1 items-center justify-start">
43
- <div className="h-[26px] w-[110px] rounded bg-ods-skeleton md:h-8 md:w-[137px]"></div>
43
+ <div className="h-[26px] w-[110px] rounded bg-ods-skeleton content-md:h-8 content-md:w-[137px]"></div>
44
44
  </div>
45
45
 
46
46
  {/* Center: Navigation skeleton - hidden on mobile, visible on desktop */}
47
- <nav className="hidden min-w-0 flex-1 basis-1/3 items-center justify-center gap-2 md:flex">
47
+ <nav className="hidden min-w-0 flex-1 basis-1/3 items-center justify-center gap-2 content-md:flex">
48
48
  <div className="flex items-center gap-2">
49
49
  <InteractiveSkeleton.Button className="h-10 w-24" />
50
50
  <InteractiveSkeleton.Button className="h-10 w-24" />
@@ -55,12 +55,12 @@ export function HeaderSkeleton() {
55
55
  {/* Right: Actions skeleton */}
56
56
  <div className="flex min-w-0 flex-1 items-center justify-end gap-4">
57
57
  {/* Mobile: Show hamburger skeleton */}
58
- <div className="md:hidden">
58
+ <div className="content-md:hidden">
59
59
  <InteractiveSkeleton.Button className="h-10 w-10" />
60
60
  </div>
61
61
 
62
62
  {/* Desktop: Show action buttons skeletons */}
63
- <div className="hidden items-center gap-4 md:flex">
63
+ <div className="hidden items-center gap-4 content-md:flex">
64
64
  <InteractiveSkeleton.Button className="h-10 w-10" />
65
65
  <InteractiveSkeleton.Button className="h-10 w-32" />
66
66
  <InteractiveSkeleton.Button className="h-10 w-20" />
@@ -76,22 +76,22 @@ export function HeaderSkeleton() {
76
76
  export function HeroSkeleton() {
77
77
  return (
78
78
  <section
79
- className="flex w-full animate-pulse flex-col items-center justify-center px-4 py-12 text-center md:px-8 md:py-20"
79
+ className="flex w-full animate-pulse flex-col items-center justify-center px-4 py-12 text-center content-md:px-8 content-md:py-20"
80
80
  style={{
81
81
  background: 'radial-gradient(circle at 50% 0%, #242323 0%, #1A1A1A 100%)',
82
82
  }}
83
83
  >
84
84
  {/* Title skeleton */}
85
- <TextSkeleton.Heading className="mb-4 h-12 w-full max-w-4xl md:mb-6 md:h-20 lg:h-24" />
85
+ <TextSkeleton.Heading className="mb-4 h-12 w-full max-w-4xl content-md:mb-6 content-md:h-20 content-lg:h-24" />
86
86
 
87
87
  {/* Subtitle skeleton */}
88
- <div className="mb-8 w-full max-w-4xl space-y-3 px-2 md:mb-10">
89
- <TextSkeleton.Body className="h-5 md:h-7" />
90
- <TextSkeleton.Body className="mx-auto h-5 w-3/4 md:h-7" />
88
+ <div className="mb-8 w-full max-w-4xl space-y-3 px-2 content-md:mb-10">
89
+ <TextSkeleton.Body className="h-5 content-md:h-7" />
90
+ <TextSkeleton.Body className="mx-auto h-5 w-3/4 content-md:h-7" />
91
91
  </div>
92
92
 
93
93
  {/* CTA Button skeleton */}
94
- <InteractiveSkeleton.Button className="h-12 w-full md:w-64" />
94
+ <InteractiveSkeleton.Button className="h-12 w-full content-md:w-64" />
95
95
  </section>
96
96
  );
97
97
  }
@@ -106,9 +106,9 @@ export function SearchContainerSkeleton({
106
106
  return (
107
107
  <div className={cn('space-y-4', className || '')}>
108
108
  {/* Search input and button */}
109
- <div className="flex gap-2 md:gap-4">
109
+ <div className="flex gap-2 content-md:gap-4">
110
110
  <InteractiveSkeleton.Input className="flex-1" />
111
- <InteractiveSkeleton.Button className="w-32 md:w-40" />
111
+ <InteractiveSkeleton.Button className="w-32 content-md:w-40" />
112
112
  </div>
113
113
 
114
114
  {/* Filter chips */}
@@ -144,7 +144,7 @@ export function CategorySidebarSkeleton({ className }: PageLayoutSkeletonProps)
144
144
  ];
145
145
 
146
146
  return (
147
- <div className={cn('w-full lg:w-[320px]', className)}>
147
+ <div className={cn('w-full content-lg:w-[320px]', className)}>
148
148
  {/* DATA ROOM label */}
149
149
  <UnifiedSkeleton className="mb-4 h-[14px] w-24 rounded" />
150
150
 
@@ -195,7 +195,12 @@ export function BreadcrumbSkeleton({ className }: PageLayoutSkeletonProps) {
195
195
  */
196
196
  export function ResultsHeaderSkeleton({ className }: PageLayoutSkeletonProps) {
197
197
  return (
198
- <div className={cn('mb-6 flex flex-col items-start justify-between gap-4 md:flex-row md:items-center', className)}>
198
+ <div
199
+ className={cn(
200
+ 'mb-6 flex flex-col items-start justify-between gap-4 content-md:flex-row content-md:items-center',
201
+ className,
202
+ )}
203
+ >
199
204
  <div className="space-y-1">
200
205
  <TextSkeleton.Body className="w-48" />
201
206
  {/* <TextSkeleton.Caption className="w-32" /> */}
@@ -223,15 +228,15 @@ export function TwoColumnLayoutSkeleton({
223
228
  return (
224
229
  <div
225
230
  className={cn(
226
- 'grid grid-cols-1 gap-6 lg:grid-cols-[320px_1fr] lg:gap-8',
227
- sidebarPosition === 'right' && 'lg:grid-cols-[1fr_320px]',
231
+ 'grid grid-cols-1 gap-6 content-lg:grid-cols-[320px_1fr] content-lg:gap-8',
232
+ sidebarPosition === 'right' && 'content-lg:grid-cols-[1fr_320px]',
228
233
  className,
229
234
  )}
230
235
  >
231
236
  {sidebarPosition === 'left' ? (
232
237
  <>
233
- <aside className="order-2 lg:order-1">{sidebar}</aside>
234
- <main className="order-1 lg:order-2">{main}</main>
238
+ <aside className="order-2 content-lg:order-1">{sidebar}</aside>
239
+ <main className="order-1 content-lg:order-2">{main}</main>
235
240
  </>
236
241
  ) : (
237
242
  <>
@@ -250,7 +255,7 @@ export function ArticleLayoutSkeleton({ className }: PageLayoutSkeletonProps) {
250
255
  return (
251
256
  <article className={cn('mx-auto max-w-4xl', className)}>
252
257
  {/* Article header */}
253
- <header className="mb-8 space-y-4 md:mb-12 md:space-y-6">
258
+ <header className="mb-8 space-y-4 content-md:mb-12 content-md:space-y-6">
254
259
  {/* Category/tags */}
255
260
  <div className="flex gap-2">
256
261
  <InteractiveSkeleton.Chip />
@@ -275,8 +280,8 @@ export function ArticleLayoutSkeleton({ className }: PageLayoutSkeletonProps) {
275
280
  </header>
276
281
 
277
282
  {/* Featured image */}
278
- <div className="mb-8 md:mb-12">
279
- <MediaSkeleton.CardImage className="h-64 w-full md:h-96" />
283
+ <div className="mb-8 content-md:mb-12">
284
+ <MediaSkeleton.CardImage className="h-64 w-full content-md:h-96" />
280
285
  </div>
281
286
 
282
287
  {/* Article content */}
@@ -311,12 +316,12 @@ export function ArticleLayoutSkeleton({ className }: PageLayoutSkeletonProps) {
311
316
  export function VendorDetailLayoutSkeleton({ className }: PageLayoutSkeletonProps) {
312
317
  return (
313
318
  <main className={cn('min-h-screen bg-ods-bg', className)}>
314
- <div className="mx-auto max-w-[1920px] px-6 py-6 md:px-20 md:py-10">
319
+ <div className="mx-auto max-w-[1920px] px-6 py-6 content-md:px-20 content-md:py-10">
315
320
  {/* Breadcrumb */}
316
321
  <BreadcrumbSkeleton className="mb-6" />
317
322
 
318
323
  {/* Main Layout Container */}
319
- <div className="flex flex-col lg:flex-row lg:gap-10">
324
+ <div className="flex flex-col content-lg:flex-row content-lg:gap-10">
320
325
  {/* Left Content Area */}
321
326
  <div className="min-w-0 flex-1">
322
327
  {/* Vendor Hero Section */}
@@ -328,9 +333,9 @@ export function VendorDetailLayoutSkeleton({ className }: PageLayoutSkeletonProp
328
333
  <div className="flex flex-col gap-3">
329
334
  <div className="flex flex-col gap-2">
330
335
  {/* Large title skeleton */}
331
- <div className="h-12 w-80 max-w-full animate-pulse rounded bg-ods-skeleton md:h-16 lg:h-20"></div>
336
+ <div className="h-12 w-80 max-w-full animate-pulse rounded bg-ods-skeleton content-md:h-16 content-lg:h-20"></div>
332
337
  {/* Category text */}
333
- <div className="h-5 w-32 animate-pulse rounded bg-ods-skeleton md:h-6"></div>
338
+ <div className="h-5 w-32 animate-pulse rounded bg-ods-skeleton content-md:h-6"></div>
334
339
  </div>
335
340
 
336
341
  {/* Pricing tags */}
@@ -342,14 +347,14 @@ export function VendorDetailLayoutSkeleton({ className }: PageLayoutSkeletonProp
342
347
  </div>
343
348
 
344
349
  {/* Vendor Image Display Skeleton */}
345
- <div className="mb-2 h-[300px] w-full animate-pulse rounded-lg border border-ods-border bg-ods-card md:h-[400px] lg:h-[500px]"></div>
350
+ <div className="mb-2 h-[300px] w-full animate-pulse rounded-lg border border-ods-border bg-ods-card content-md:h-[400px] content-lg:h-[500px]"></div>
346
351
  <div className="text-center">
347
352
  <div className="mx-auto h-4 w-24 animate-pulse rounded bg-ods-skeleton"></div>
348
353
  </div>
349
354
  </div>
350
355
 
351
356
  {/* Mobile Sidebar - Show on mobile only, positioned after title */}
352
- <div className="mb-10 lg:hidden">
357
+ <div className="mb-10 content-lg:hidden">
353
358
  <div className="space-y-4">
354
359
  {/* Deploy Button */}
355
360
  <div className="h-12 animate-pulse rounded-lg border border-ods-border bg-ods-card"></div>
@@ -396,7 +401,7 @@ export function VendorDetailLayoutSkeleton({ className }: PageLayoutSkeletonProp
396
401
 
397
402
  {/* Alternatives Container */}
398
403
  <div className="mb-20 flex flex-col gap-6">
399
- <div className="h-8 w-48 animate-pulse rounded bg-ods-skeleton md:h-10"></div>
404
+ <div className="h-8 w-48 animate-pulse rounded bg-ods-skeleton content-md:h-10"></div>
400
405
 
401
406
  {/* Open Source Alternatives */}
402
407
  <div className="flex flex-col gap-4">
@@ -427,9 +432,9 @@ export function VendorDetailLayoutSkeleton({ className }: PageLayoutSkeletonProp
427
432
 
428
433
  {/* About Section */}
429
434
  <div className="mb-20 flex flex-col gap-6">
430
- <div className="h-8 w-64 animate-pulse rounded bg-ods-skeleton md:h-10"></div>
435
+ <div className="h-8 w-64 animate-pulse rounded bg-ods-skeleton content-md:h-10"></div>
431
436
 
432
- <div className="rounded-lg border border-ods-border bg-ods-card p-6 md:p-8">
437
+ <div className="rounded-lg border border-ods-border bg-ods-card p-6 content-md:p-8">
433
438
  <div className="space-y-4">
434
439
  <div className="h-6 animate-pulse rounded bg-ods-skeleton"></div>
435
440
  <div className="h-6 animate-pulse rounded bg-ods-skeleton"></div>
@@ -441,8 +446,8 @@ export function VendorDetailLayoutSkeleton({ className }: PageLayoutSkeletonProp
441
446
 
442
447
  {/* Key Features Section */}
443
448
  <div className="mb-20 flex flex-col gap-6">
444
- <div className="h-8 w-72 animate-pulse rounded bg-ods-skeleton md:h-10"></div>
445
- <div className="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
449
+ <div className="h-8 w-72 animate-pulse rounded bg-ods-skeleton content-md:h-10"></div>
450
+ <div className="grid grid-cols-1 gap-6 content-md:grid-cols-2 content-lg:grid-cols-3">
446
451
  {Array.from({ length: 6 }).map((_, i) => (
447
452
  <div key={i} className="flex gap-4 rounded-lg border border-ods-border bg-ods-card p-4">
448
453
  <div className="h-12 w-12 flex-shrink-0 animate-pulse rounded bg-ods-skeleton"></div>
@@ -457,8 +462,8 @@ export function VendorDetailLayoutSkeleton({ className }: PageLayoutSkeletonProp
457
462
 
458
463
  {/* Pros and Cons Section */}
459
464
  <div className="mb-20 flex flex-col gap-6">
460
- <div className="h-8 w-80 animate-pulse rounded bg-ods-skeleton md:h-10"></div>
461
- <div className="grid grid-cols-1 gap-6 lg:grid-cols-2">
465
+ <div className="h-8 w-80 animate-pulse rounded bg-ods-skeleton content-md:h-10"></div>
466
+ <div className="grid grid-cols-1 gap-6 content-lg:grid-cols-2">
462
467
  {/* Pros Column */}
463
468
  <div className="flex flex-col gap-6">
464
469
  <div className="h-5 w-16 animate-pulse rounded bg-ods-skeleton"></div>
@@ -490,8 +495,8 @@ export function VendorDetailLayoutSkeleton({ className }: PageLayoutSkeletonProp
490
495
 
491
496
  {/* Alternatives Section */}
492
497
  <div className="mb-20 flex flex-col gap-6">
493
- <div className="h-8 w-72 animate-pulse rounded bg-ods-skeleton md:h-10"></div>
494
- <div className="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
498
+ <div className="h-8 w-72 animate-pulse rounded bg-ods-skeleton content-md:h-10"></div>
499
+ <div className="grid grid-cols-1 gap-6 content-md:grid-cols-2 content-lg:grid-cols-3">
495
500
  {Array.from({ length: 6 }).map((_, i) => (
496
501
  <div key={i} className="space-y-4 rounded-lg border border-ods-border bg-ods-card p-6">
497
502
  {/* Header */}
@@ -525,7 +530,7 @@ export function VendorDetailLayoutSkeleton({ className }: PageLayoutSkeletonProp
525
530
 
526
531
  {/* Comments Section */}
527
532
  <div className="mb-20 flex flex-col gap-6">
528
- <div className="h-8 w-64 animate-pulse rounded bg-ods-skeleton md:h-10"></div>
533
+ <div className="h-8 w-64 animate-pulse rounded bg-ods-skeleton content-md:h-10"></div>
529
534
 
530
535
  {/* Comment Form Skeleton */}
531
536
  <div className="space-y-3">
@@ -589,7 +594,7 @@ export function VendorDetailLayoutSkeleton({ className }: PageLayoutSkeletonProp
589
594
  </div>
590
595
 
591
596
  {/* Right Sidebar - Desktop Only */}
592
- <div className="hidden w-[290px] flex-shrink-0 lg:block">
597
+ <div className="hidden w-[290px] flex-shrink-0 content-lg:block">
593
598
  <div className="space-y-4">
594
599
  {/* Deploy Button */}
595
600
  <div className="h-12 animate-pulse rounded-lg border border-ods-border bg-ods-card"></div>
@@ -646,9 +651,9 @@ export function StatsSectionSkeleton({ className, columns = 3 }: PageLayoutSkele
646
651
  return (
647
652
  <div
648
653
  className={cn(
649
- 'mb-12 grid gap-6 md:mb-16',
650
- columns === 3 && 'grid-cols-1 md:grid-cols-3',
651
- columns === 4 && 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4',
654
+ 'mb-12 grid gap-6 content-md:mb-16',
655
+ columns === 3 && 'grid-cols-1 content-md:grid-cols-3',
656
+ columns === 4 && 'grid-cols-1 content-md:grid-cols-2 content-lg:grid-cols-4',
652
657
  className,
653
658
  )}
654
659
  >
@@ -675,7 +680,7 @@ export function StatsSectionSkeleton({ className, columns = 3 }: PageLayoutSkele
675
680
  export function BlogCardGridSkeleton({ className }: PageLayoutSkeletonProps) {
676
681
  return (
677
682
  <div className={cn('space-y-6', className)}>
678
- <CardSkeletonGrid count={4} variant="blog" className="grid-cols-1 md:grid-cols-2" />
683
+ <CardSkeletonGrid count={4} variant="blog" className="grid-cols-1 content-md:grid-cols-2" />
679
684
  </div>
680
685
  );
681
686
  }
@@ -687,7 +692,11 @@ export function BlogCardGridSkeleton({ className }: PageLayoutSkeletonProps) {
687
692
  export function VendorGridSkeleton({ className }: PageLayoutSkeletonProps) {
688
693
  return (
689
694
  <div className={cn('space-y-6', className)}>
690
- <CardSkeletonGrid count={12} variant="vendor" className="grid-cols-1 md:grid-cols-2 lg:grid-cols-3" />
695
+ <CardSkeletonGrid
696
+ count={12}
697
+ variant="vendor"
698
+ className="grid-cols-1 content-md:grid-cols-2 content-lg:grid-cols-3"
699
+ />
691
700
  </div>
692
701
  );
693
702
  }
@@ -698,18 +707,21 @@ export function VendorGridSkeleton({ className }: PageLayoutSkeletonProps) {
698
707
  */
699
708
  export function SlackCommunitySkeleton() {
700
709
  return (
701
- <section className="w-full bg-ods-bg px-4 py-12 md:px-20 md:py-20 lg:px-20" aria-label="Slack Community Loading">
710
+ <section
711
+ className="w-full bg-ods-bg px-4 py-12 content-md:px-20 content-md:py-20 content-lg:px-20"
712
+ aria-label="Slack Community Loading"
713
+ >
702
714
  {/* Frame 651 Container */}
703
- <div className="flex w-full flex-col gap-4 md:gap-6">
715
+ <div className="flex w-full flex-col gap-4 content-md:gap-6">
704
716
  {/* Title Skeleton */}
705
717
  <div className="w-full">
706
- <div className="h-8 max-w-md animate-pulse rounded-lg bg-ods-skeleton md:h-12 lg:h-14"></div>
718
+ <div className="h-8 max-w-md animate-pulse rounded-lg bg-ods-skeleton content-md:h-12 content-lg:h-14"></div>
707
719
  </div>
708
720
 
709
721
  {/* Content Area - Channel List + Chat Interface */}
710
- <div className="flex w-full min-w-0 flex-col gap-4 md:gap-6 lg:flex-row lg:items-start lg:justify-end">
722
+ <div className="flex w-full min-w-0 flex-col gap-4 content-md:gap-6 content-lg:flex-row content-lg:items-start content-lg:justify-end">
711
723
  {/* Channel List Skeleton */}
712
- <div className="flex w-full flex-shrink-0 animate-pulse flex-col overflow-hidden rounded border border-ods-border bg-ods-bg lg:w-[290px] lg:max-w-[290px]">
724
+ <div className="flex w-full flex-shrink-0 animate-pulse flex-col overflow-hidden rounded border border-ods-border bg-ods-bg content-lg:w-[290px] content-lg:max-w-[290px]">
713
725
  <div className="space-y-4 p-4">
714
726
  {/* Header */}
715
727
  <div className="flex flex-col gap-2">
@@ -751,36 +763,36 @@ export function SlackCommunitySkeleton() {
751
763
  </div>
752
764
 
753
765
  {/* Chat Interface Skeleton */}
754
- <div className="flex h-[450px] min-h-[450px] min-w-0 flex-1 animate-pulse flex-col rounded-lg border border-ods-border bg-ods-card md:h-[500px] md:min-h-[500px] lg:h-[600px] lg:min-h-[600px]">
766
+ <div className="flex h-[450px] min-h-[450px] min-w-0 flex-1 animate-pulse flex-col rounded-lg border border-ods-border bg-ods-card content-md:h-[500px] content-md:min-h-[500px] content-lg:h-[600px] content-lg:min-h-[600px]">
755
767
  {/* Header */}
756
- <div className="flex h-[56px] flex-shrink-0 items-center justify-between border-b border-ods-border bg-ods-bg p-4 md:h-[60px] md:p-6">
768
+ <div className="flex h-[56px] flex-shrink-0 items-center justify-between border-b border-ods-border bg-ods-bg p-4 content-md:h-[60px] content-md:p-6">
757
769
  <div className="flex items-center gap-2">
758
- <div className="h-3 w-3 rounded bg-ods-skeleton md:h-4 md:w-4"></div>
759
- <div className="h-3 w-24 rounded bg-ods-skeleton md:h-4 md:w-32"></div>
770
+ <div className="h-3 w-3 rounded bg-ods-skeleton content-md:h-4 content-md:w-4"></div>
771
+ <div className="h-3 w-24 rounded bg-ods-skeleton content-md:h-4 content-md:w-32"></div>
760
772
  </div>
761
- <div className="h-3 w-12 rounded bg-ods-skeleton md:w-16"></div>
773
+ <div className="h-3 w-12 rounded bg-ods-skeleton content-md:w-16"></div>
762
774
  </div>
763
775
 
764
776
  {/* Messages */}
765
- <div className="min-h-[280px] flex-1 space-y-3 overflow-hidden bg-ods-bg p-4 md:min-h-[320px] md:space-y-4 md:p-6 lg:min-h-[420px]">
777
+ <div className="min-h-[280px] flex-1 space-y-3 overflow-hidden bg-ods-bg p-4 content-md:min-h-[320px] content-md:space-y-4 content-md:p-6 content-lg:min-h-[420px]">
766
778
  {Array.from({ length: 6 }).map((_, i) => (
767
- <div key={i} className="flex gap-2 md:gap-3">
768
- <div className="h-10 w-10 flex-shrink-0 rounded-lg bg-ods-skeleton md:h-12 md:w-12"></div>
779
+ <div key={i} className="flex gap-2 content-md:gap-3">
780
+ <div className="h-10 w-10 flex-shrink-0 rounded-lg bg-ods-skeleton content-md:h-12 content-md:w-12"></div>
769
781
  <div className="flex-1">
770
782
  <div className="mb-1 flex items-center gap-2">
771
- <div className="h-3 w-16 rounded bg-ods-skeleton md:w-20"></div>
772
- <div className="h-3 w-12 rounded bg-ods-skeleton md:w-16"></div>
783
+ <div className="h-3 w-16 rounded bg-ods-skeleton content-md:w-20"></div>
784
+ <div className="h-3 w-12 rounded bg-ods-skeleton content-md:w-16"></div>
773
785
  </div>
774
- <div className="h-3 w-full rounded bg-ods-skeleton md:h-4"></div>
786
+ <div className="h-3 w-full rounded bg-ods-skeleton content-md:h-4"></div>
775
787
  </div>
776
788
  </div>
777
789
  ))}
778
790
  </div>
779
791
 
780
792
  {/* Input Area */}
781
- <div className="h-[72px] flex-shrink-0 border-t border-ods-border bg-ods-card p-4 md:h-[80px] md:p-6">
782
- <div className="flex items-end justify-center gap-3 md:justify-end">
783
- <div className="h-10 w-28 rounded-lg bg-ods-skeleton md:h-12 md:w-32"></div>
793
+ <div className="h-[72px] flex-shrink-0 border-t border-ods-border bg-ods-card p-4 content-md:h-[80px] content-md:p-6">
794
+ <div className="flex items-end justify-center gap-3 content-md:justify-end">
795
+ <div className="h-10 w-28 rounded-lg bg-ods-skeleton content-md:h-12 content-md:w-32"></div>
784
796
  </div>
785
797
  </div>
786
798
  </div>
@@ -97,7 +97,7 @@ export const TextSkeleton = {
97
97
  Heading: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
98
98
  <UnifiedSkeleton
99
99
  variant="text"
100
- className={cn('h-8 md:h-10 lg:h-12', className)}
100
+ className={cn('h-8 content-md:h-10 content-lg:h-12', className)}
101
101
  aria-label="Loading heading"
102
102
  {...props}
103
103
  />
@@ -109,7 +109,7 @@ export const TextSkeleton = {
109
109
  Subheading: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
110
110
  <UnifiedSkeleton
111
111
  variant="text"
112
- className={cn('h-6 md:h-7 lg:h-8', className)}
112
+ className={cn('h-6 content-md:h-7 content-lg:h-8', className)}
113
113
  aria-label="Loading subheading"
114
114
  {...props}
115
115
  />
@@ -119,14 +119,24 @@ export const TextSkeleton = {
119
119
  * Body text skeleton
120
120
  */
121
121
  Body: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
122
- <UnifiedSkeleton variant="text" className={cn('h-4 md:h-5', className)} aria-label="Loading text" {...props} />
122
+ <UnifiedSkeleton
123
+ variant="text"
124
+ className={cn('h-4 content-md:h-5', className)}
125
+ aria-label="Loading text"
126
+ {...props}
127
+ />
123
128
  ),
124
129
 
125
130
  /**
126
131
  * Small text skeleton (captions, metadata)
127
132
  */
128
133
  Caption: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
129
- <UnifiedSkeleton variant="text" className={cn('h-3 md:h-4', className)} aria-label="Loading caption" {...props} />
134
+ <UnifiedSkeleton
135
+ variant="text"
136
+ className={cn('h-3 content-md:h-4', className)}
137
+ aria-label="Loading caption"
138
+ {...props}
139
+ />
130
140
  ),
131
141
  };
132
142
 
@@ -140,7 +150,7 @@ export const InteractiveSkeleton = {
140
150
  Button: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
141
151
  <UnifiedSkeleton
142
152
  variant="default"
143
- className={cn('h-10 w-32 md:h-12 md:w-40', className)}
153
+ className={cn('h-10 w-32 content-md:h-12 content-md:w-40', className)}
144
154
  aria-label="Loading button"
145
155
  {...props}
146
156
  />
@@ -152,7 +162,7 @@ export const InteractiveSkeleton = {
152
162
  Input: ({ className, ...props }: Omit<UnifiedSkeletonProps, 'variant'>) => (
153
163
  <UnifiedSkeleton
154
164
  variant="default"
155
- className={cn('h-10 w-full md:h-12', className)}
165
+ className={cn('h-10 w-full content-md:h-12', className)}
156
166
  aria-label="Loading input field"
157
167
  {...props}
158
168
  />
@@ -293,7 +293,7 @@ export const MediaCarousel = memo(function MediaCarouselImpl({
293
293
  <Button
294
294
  variant="transparent"
295
295
  onClick={prevSlide}
296
- className="absolute left-3 top-1/2 z-10 h-auto -translate-y-1/2 rounded-full bg-black/50 p-2 text-ods-text-on-dark opacity-0 transition-opacity duration-200 hover:bg-black/70 group-hover:opacity-100 md:h-auto"
296
+ className="absolute left-3 top-1/2 z-10 h-auto -translate-y-1/2 rounded-full bg-black/50 p-2 text-ods-text-on-dark opacity-0 transition-opacity duration-200 hover:bg-black/70 group-hover:opacity-100 content-md:h-auto"
297
297
  aria-label="Previous media"
298
298
  >
299
299
  <ChevronLeftIcon />
@@ -302,7 +302,7 @@ export const MediaCarousel = memo(function MediaCarouselImpl({
302
302
  <Button
303
303
  variant="transparent"
304
304
  onClick={nextSlide}
305
- className="absolute right-3 top-1/2 z-10 h-auto -translate-y-1/2 rounded-full bg-black/50 p-2 text-ods-text-on-dark opacity-0 transition-opacity duration-200 hover:bg-black/70 group-hover:opacity-100 md:h-auto"
305
+ className="absolute right-3 top-1/2 z-10 h-auto -translate-y-1/2 rounded-full bg-black/50 p-2 text-ods-text-on-dark opacity-0 transition-opacity duration-200 hover:bg-black/70 group-hover:opacity-100 content-md:h-auto"
306
306
  aria-label="Next media"
307
307
  >
308
308
  <ChevronRightIcon />
@@ -326,7 +326,7 @@ export const MediaCarousel = memo(function MediaCarouselImpl({
326
326
  aria-current={isActive ? 'true' : undefined}
327
327
  aria-label={`Go to slide ${index + 1}`}
328
328
  onClick={() => selectSlide(index)}
329
- className="flex h-6 w-6 shrink-0 items-center justify-center rounded-full p-0 md:h-6"
329
+ className="flex h-6 w-6 shrink-0 items-center justify-center rounded-full p-0 content-md:h-6"
330
330
  >
331
331
  <span
332
332
  className={cn(
@@ -104,26 +104,27 @@ const FORM_STACK = 'flex flex-col gap-[var(--spacing-system-l)]';
104
104
  /** The row grid: two columns on a phone, four from `md`. The row gap is one step
105
105
  * wider than the column gap because field messages hang ~16px below their
106
106
  * control and would print over the next row's label at the column gap. */
107
- const ROW_GRID = 'grid grid-cols-2 gap-x-[var(--spacing-system-m)] gap-y-[var(--spacing-system-lf)] md:grid-cols-4';
107
+ const ROW_GRID =
108
+ 'grid grid-cols-2 gap-x-[var(--spacing-system-m)] gap-y-[var(--spacing-system-lf)] content-md:grid-cols-4';
108
109
 
109
110
  /** The wire key of the host consent tick (stripped server-side, never sent to HubSpot). */
110
111
  const HOST_CONSENT_KEY = 'hostConsent';
111
112
 
112
- /** The row grid's column count at `md` and up. `ROW_GRID`'s `md:grid-cols-4`
113
+ /** The row grid's column count at `md` and up. `ROW_GRID`'s `content-md:grid-cols-4`
113
114
  * and `SPAN_CLASS` are its Tailwind twins (literal so the scanner sees them). */
114
115
  const GRID_COLUMNS = 4;
115
116
 
116
117
  /** Static so Tailwind's scanner sees every class — a template built from a
117
118
  * runtime span would compile to nothing. */
118
119
  const SPAN_CLASS = {
119
- 1: 'md:col-span-1',
120
- 2: 'md:col-span-2',
121
- 3: 'md:col-span-3',
122
- 4: 'md:col-span-4',
120
+ 1: 'content-md:col-span-1',
121
+ 2: 'content-md:col-span-2',
122
+ 3: 'content-md:col-span-3',
123
+ 4: 'content-md:col-span-4',
123
124
  } as const;
124
125
 
125
126
  /** One field's skeleton: label + control footprint — the CSS twin of `FieldWrapper`'s
126
- * label row over `Input`'s `h-11 md:h-12` (the other skeleton heights below are
127
+ * label row over `Input`'s `h-11 content-md:h-12` (the other skeleton heights below are
127
128
  * the same kind of twin: the textarea, the consent row, the `Button`). */
128
129
  const FIELD_SKELETON_CLASS = 'h-[4.75rem] w-full';
129
130
 
@@ -135,7 +136,7 @@ const FOOTER_ROW_CLASS = 'flex flex-wrap items-center justify-between gap-[var(-
135
136
  /** The bare footer: the button stays LEFT, where the form's reading order ends. */
136
137
  const FOOTER_BARE_CLASS = 'flex';
137
138
  /** The submit's width when a note sits beside it. */
138
- const SUBMIT_WIDE_CLASS = 'md:w-60';
139
+ const SUBMIT_WIDE_CLASS = 'content-md:w-60';
139
140
 
140
141
  /** The built-in layout when a host passes no rows — what the skeleton draws for it. */
141
142
  const DEFAULT_FIELD_ROWS: BookingFieldRow[] = [[{ name: 'email' }], [{ name: 'firstName' }, { name: 'lastName' }]];
@@ -70,7 +70,7 @@ const PANEL_STACK = 'flex flex-col gap-[var(--spacing-system-l)]';
70
70
  * two children, different axis; nothing is hidden at any width.
71
71
  */
72
72
  const IDENTITY_ROW =
73
- 'flex items-center justify-between gap-[var(--spacing-system-m)] lg:flex-col lg:items-stretch lg:gap-[var(--spacing-system-l)]';
73
+ 'flex items-center justify-between gap-[var(--spacing-system-m)] content-lg:flex-col content-lg:items-stretch content-lg:gap-[var(--spacing-system-l)]';
74
74
 
75
75
  /**
76
76
  * Everything under the back edge, in TWO groups: identity/title/duration, and
@@ -85,11 +85,13 @@ const IDENTITY_ROW =
85
85
  * Below `md` (phone) and from `lg` up (280px sidebar) there is no horizontal
86
86
  * room to spend, so both fall back to the plain stack.
87
87
  */
88
- const STRIP_BODY = 'flex flex-col gap-[var(--spacing-system-l)] md:flex-row md:items-start lg:flex-col';
89
- const STRIP_MAIN = 'flex min-w-0 flex-col gap-[var(--spacing-system-l)] md:flex-1';
88
+ const STRIP_BODY =
89
+ 'flex flex-col gap-[var(--spacing-system-l)] content-md:flex-row content-md:items-start content-lg:flex-col';
90
+ const STRIP_MAIN = 'flex min-w-0 flex-col gap-[var(--spacing-system-l)] content-md:flex-1';
90
91
  /** 280px — the same width this panel has as a sidebar, so the field is the
91
92
  * size the visitor meets at every other breakpoint. */
92
- const STRIP_ASIDE = 'flex flex-col gap-[var(--spacing-system-xxs)] md:w-[280px] md:shrink-0 lg:w-full';
93
+ const STRIP_ASIDE =
94
+ 'flex flex-col gap-[var(--spacing-system-xxs)] content-md:w-[280px] content-md:shrink-0 content-lg:w-full';
93
95
 
94
96
  /** The back affordance sits flush with the panel's top padding: `BackButton`'s
95
97
  * own 12px block padding would otherwise double the 24px stack gap under it. */
@@ -124,7 +126,7 @@ export function ContextPanelSkeleton({
124
126
  <div className={STRIP_BODY}>
125
127
  <div className={STRIP_MAIN}>
126
128
  <div className={IDENTITY_ROW}>
127
- <div className="flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xs)] lg:flex-none">
129
+ <div className="flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xs)] content-lg:flex-none">
128
130
  <Skeleton className="h-8 w-8 shrink-0 rounded-full" />
129
131
  <div className="flex flex-1 flex-col gap-[var(--spacing-system-xxs)]">
130
132
  <Skeleton className="h-5 w-32" />
@@ -241,7 +243,7 @@ export function SchedulerContextPanel({
241
243
  // summary line states the zone one row below — so the fact survives,
242
244
  // only the control steps aside. The 280px sidebar has the room, so
243
245
  // there it stays.
244
- <div className={cn(STRIP_ASIDE, locked && 'max-lg:hidden')}>
246
+ <div className={cn(STRIP_ASIDE, locked && 'content-max-lg:hidden')}>
245
247
  <p className={FIELD_LABEL_CLASS}>Timezone</p>
246
248
  {timezone ? (
247
249
  <TimezoneSelect
@@ -98,7 +98,7 @@ function DirectoryRow({
98
98
 
99
99
  {/* No audience entity (scope=all "other" group) → no chip. */}
100
100
  {audienceLabel && (
101
- <StatusBadge text={`For ${audienceLabel}`} singleLine className="hidden shrink-0 sm:inline-flex" />
101
+ <StatusBadge text={`For ${audienceLabel}`} singleLine className="hidden shrink-0 content-sm:inline-flex" />
102
102
  )}
103
103
 
104
104
  {/* Hosts stay visible on mobile too — the facepile is the row's "who
@@ -106,7 +106,7 @@ function DirectoryRow({
106
106
  collapse on narrow widths. */}
107
107
  <AvatarStack people={link.hosts} max={3} size="md" label="Hosts" className="flex shrink-0" />
108
108
 
109
- <div className="hidden w-44 shrink-0 flex-col items-end justify-center md:flex">
109
+ <div className="hidden w-44 shrink-0 flex-col items-end justify-center content-md:flex">
110
110
  <p className="text-ods-text-secondary text-h6">Next available</p>
111
111
  <p className="min-h-5 text-ods-text-primary text-h6">
112
112
  {link.nextAvailableMs == null ? 'No times published' : (nextLabel ?? ' ')}
@@ -130,9 +130,9 @@ export function MeetingSchedulerDirectoryRowSkeleton() {
130
130
  <Skeleton className="h-5 w-1/2" />
131
131
  <Skeleton className="h-4 w-1/3" />
132
132
  </div>
133
- <Skeleton className="hidden h-6 w-28 shrink-0 sm:block" />
133
+ <Skeleton className="hidden h-6 w-28 shrink-0 content-sm:block" />
134
134
  <Skeleton className="h-10 w-10 shrink-0 rounded-full" />
135
- <div className="hidden w-44 shrink-0 flex-col items-end gap-1 md:flex">
135
+ <div className="hidden w-44 shrink-0 flex-col items-end gap-1 content-md:flex">
136
136
  <Skeleton className="h-4 w-24" />
137
137
  <Skeleton className="h-5 w-32" />
138
138
  </div>