@flamingo-stack/openframe-frontend-core 0.0.702 → 0.0.703-snapshot.20261006080901

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 (341) hide show
  1. package/dist/{chunk-CYYTD5ZK.cjs → chunk-262YQFOS.cjs} +47 -47
  2. package/dist/{chunk-SAA7B3DA.js → chunk-2G546OND.js} +500 -67
  3. package/dist/{chunk-6JPQDYYY.js → chunk-2JDVL7UV.js} +2614 -2001
  4. package/dist/{chunk-ASN65P3F.cjs → chunk-4DQMTBMK.cjs} +15 -15
  5. package/dist/{chunk-CZ34HXDW.js → chunk-4KGXLVCF.js} +686 -725
  6. package/dist/{chunk-TCZCMD5Q.js → chunk-5HBHO5TB.js} +1 -1
  7. package/dist/{chunk-446KS5BG.js → chunk-5QJDM6UV.js} +5 -5
  8. package/dist/{chunk-UJJWTJ6S.js → chunk-6WQIUQUC.js} +30 -16
  9. package/dist/{chunk-YR6JPJF4.js → chunk-6XIF2Z7I.js} +4 -4
  10. package/dist/{chunk-YGRHITPY.cjs → chunk-7JIL3WOH.cjs} +24 -24
  11. package/dist/{chunk-RS7HWAYX.js → chunk-7LFIKJX2.js} +3 -3
  12. package/dist/{chunk-4OGAXAEG.cjs → chunk-ABU3TGXA.cjs} +3 -3
  13. package/dist/{chunk-3WSFIV5G.cjs → chunk-AMYY3PNL.cjs} +69 -55
  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-IIMICN7L.cjs → chunk-C3BWIU7R.cjs} +4 -44
  17. package/dist/{chunk-LZNJH23A.cjs → chunk-C7XGRLT5.cjs} +12 -12
  18. package/dist/{chunk-6YCXA7CN.js → chunk-CH5232HV.js} +20 -19
  19. package/dist/{chunk-UIBSSVON.cjs → chunk-D7BTSVMS.cjs} +2 -2
  20. package/dist/{chunk-BO5ZHDA4.js → chunk-ERCV6HHJ.js} +7 -7
  21. package/dist/{chunk-5V6O73EH.js → chunk-FLKJYMVB.js} +3 -3
  22. package/dist/{chunk-Z5HDCZAS.js → chunk-FXENTYE5.js} +15 -15
  23. package/dist/{chunk-HIXGAY2L.cjs → chunk-HFJW24JJ.cjs} +121 -121
  24. package/dist/{chunk-HPJ4XS2L.js → chunk-HJAYVKWQ.js} +24 -24
  25. package/dist/{chunk-PLK6GHN7.js → chunk-I7DFUQMN.js} +10 -10
  26. package/dist/{chunk-KJ5LWATV.js → chunk-IHU5ANUY.js} +7 -7
  27. package/dist/{chunk-AEQANLBW.cjs → chunk-IZGDG5X6.cjs} +505 -72
  28. package/dist/{chunk-2V4Z44G6.js → chunk-JEYRXT5L.js} +17 -17
  29. package/dist/{chunk-B3LZJ6J3.cjs → chunk-L3IC42IF.cjs} +32 -32
  30. package/dist/{chunk-RTGPIHVO.cjs → chunk-LDPEQGKT.cjs} +2243 -1630
  31. package/dist/{chunk-FD4DBTFO.cjs → chunk-LTSTC3N5.cjs} +1253 -1292
  32. package/dist/{chunk-OGLCD3UL.js → chunk-MFFCUVWG.js} +6 -6
  33. package/dist/{chunk-3L7KCOGO.cjs → chunk-MGGGBHYD.cjs} +30 -30
  34. package/dist/{chunk-QFW3RUZS.cjs → chunk-MI3JUJ75.cjs} +33 -33
  35. package/dist/{chunk-EMCQGFXD.cjs → chunk-MMOODW57.cjs} +28 -27
  36. package/dist/{chunk-Q76ZTHNV.js → chunk-MP2C3LJ4.js} +1 -1
  37. package/dist/{chunk-E3DH543A.cjs → chunk-N3TO7JV3.cjs} +98 -98
  38. package/dist/{chunk-2T6QWNXU.js → chunk-NDESEPW5.js} +99 -11
  39. package/dist/{chunk-ETFFEA3J.js → chunk-NRLJUBCS.js} +7 -7
  40. package/dist/{chunk-HUOLB7ZN.cjs → chunk-OHFS7VOU.cjs} +9 -9
  41. package/dist/{chunk-MWUBBBWZ.js → chunk-QVSFBSWV.js} +10 -10
  42. package/dist/{chunk-MDBHZBW7.cjs → chunk-RKV5B7EU.cjs} +92 -4
  43. package/dist/{chunk-3G76LRGL.cjs → chunk-SYXQLETR.cjs} +29 -29
  44. package/dist/{chunk-FHM7GD5B.cjs → chunk-UK62YTH6.cjs} +28 -14
  45. package/dist/{chunk-HUMWQMCU.js → chunk-UT4YHQZW.js} +3 -3
  46. package/dist/{chunk-NGJCWEYX.cjs → chunk-VHCACDKP.cjs} +46 -46
  47. package/dist/{chunk-5FFNNJM7.js → chunk-VR2ZLFCP.js} +1 -1
  48. package/dist/{chunk-IZKOQVXO.js → chunk-VTASHWER.js} +14 -14
  49. package/dist/{chunk-64O4L7WN.js → chunk-WUJNYGO2.js} +11 -51
  50. package/dist/{chunk-JOY6HVPV.js → chunk-XATTBO5X.js} +25 -11
  51. package/dist/{chunk-L7KZA7ZD.cjs → chunk-XIFOBQRQ.cjs} +6 -6
  52. package/dist/{chunk-CXDJUKC6.cjs → chunk-XJKZ4IKT.cjs} +4 -4
  53. package/dist/{chunk-XCIFHW4E.cjs → chunk-XOYH2YQE.cjs} +2 -2
  54. package/dist/{chunk-HYFLTFFB.js → chunk-ZQFZSFQI.js} +2 -2
  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-nav-sidebar.d.ts +4 -0
  60. package/dist/components/chat/chat-nav-sidebar.d.ts.map +1 -1
  61. package/dist/components/chat/chat-panel-header.d.ts +3 -2
  62. package/dist/components/chat/chat-panel-header.d.ts.map +1 -1
  63. package/dist/components/chat/embeddable-chat.d.ts +36 -2
  64. package/dist/components/chat/embeddable-chat.d.ts.map +1 -1
  65. package/dist/components/chat/index.cjs +14 -6
  66. package/dist/components/chat/index.d.ts +4 -1
  67. package/dist/components/chat/index.d.ts.map +1 -1
  68. package/dist/components/chat/index.js +13 -5
  69. package/dist/components/chat/mingo-archive-list.d.ts +17 -0
  70. package/dist/components/chat/mingo-archive-list.d.ts.map +1 -0
  71. package/dist/components/chat/mingo-chat-header.d.ts +31 -0
  72. package/dist/components/chat/mingo-chat-header.d.ts.map +1 -0
  73. package/dist/components/chat/mingo-chat-rail.d.ts +54 -0
  74. package/dist/components/chat/mingo-chat-rail.d.ts.map +1 -0
  75. package/dist/components/chat/model-display.d.ts.map +1 -1
  76. package/dist/components/contact/contact-form.d.ts.map +1 -1
  77. package/dist/components/contact/index.cjs +11 -11
  78. package/dist/components/contact/index.js +10 -10
  79. package/dist/components/content-loading-container.d.ts +1 -1
  80. package/dist/components/content-loading-container.d.ts.map +1 -1
  81. package/dist/components/docs/index.cjs +14 -14
  82. package/dist/components/docs/index.js +13 -13
  83. package/dist/components/docs/skeletons.d.ts.map +1 -1
  84. package/dist/components/embeds/index.cjs +11 -11
  85. package/dist/components/embeds/index.js +10 -10
  86. package/dist/components/faq/index.cjs +12 -12
  87. package/dist/components/faq/index.js +11 -11
  88. package/dist/components/features/figma-prototype-viewer.d.ts.map +1 -1
  89. package/dist/components/features/index.cjs +10 -10
  90. package/dist/components/features/index.js +9 -9
  91. package/dist/components/features/media-gallery-manager.d.ts.map +1 -1
  92. package/dist/components/features/parallax-image-showcase.d.ts.map +1 -1
  93. package/dist/components/features/policy-configuration-panel.d.ts.map +1 -1
  94. package/dist/components/features/section-selector.d.ts.map +1 -1
  95. package/dist/components/help-center-pages/index.cjs +119 -119
  96. package/dist/components/help-center-pages/index.js +39 -39
  97. package/dist/components/help-center-pages/trust-center-sections.d.ts +2 -2
  98. package/dist/components/help-center-pages/trust-center-sections.d.ts.map +1 -1
  99. package/dist/components/index.cjs +94 -86
  100. package/dist/components/index.js +32 -24
  101. package/dist/components/layout/article-detail-layout.d.ts +1 -1
  102. package/dist/components/layout/article-detail-layout.d.ts.map +1 -1
  103. package/dist/components/layout/page-container.d.ts.map +1 -1
  104. package/dist/components/layout/title-block.d.ts +2 -2
  105. package/dist/components/layout/title-block.d.ts.map +1 -1
  106. package/dist/components/loading/page-layout-skeleton.d.ts.map +1 -1
  107. package/dist/components/loading/unified-skeleton.d.ts.map +1 -1
  108. package/dist/components/meeting-scheduler/booking-form.d.ts +4 -4
  109. package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
  110. package/dist/components/meeting-scheduler/context-panel.d.ts.map +1 -1
  111. package/dist/components/meeting-scheduler/index.cjs +127 -127
  112. package/dist/components/meeting-scheduler/index.d.ts +2 -2
  113. package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
  114. package/dist/components/meeting-scheduler/index.js +50 -50
  115. package/dist/components/navigation/app-header.d.ts +4 -0
  116. package/dist/components/navigation/app-header.d.ts.map +1 -1
  117. package/dist/components/navigation/app-layout-drawer.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 +7 -3
  151. package/dist/components/ui/drawer.d.ts.map +1 -1
  152. package/dist/components/ui/entity-image.d.ts +2 -2
  153. package/dist/components/ui/file-manager/index.cjs +36 -36
  154. package/dist/components/ui/file-manager/index.js +3 -3
  155. package/dist/components/ui/filter-modal.d.ts.map +1 -1
  156. package/dist/components/ui/index.cjs +18 -10
  157. package/dist/components/ui/index.js +17 -9
  158. package/dist/components/ui/info-card-row.d.ts.map +1 -1
  159. package/dist/components/ui/menubar.d.ts +1 -1
  160. package/dist/components/ui/menubar.d.ts.map +1 -1
  161. package/dist/components/ui/modal-v2.d.ts.map +1 -1
  162. package/dist/components/ui/modal.d.ts.map +1 -1
  163. package/dist/components/ui/no-data/no-data-actions.d.ts.map +1 -1
  164. package/dist/components/ui/no-data/no-data-styles.d.ts +1 -1
  165. package/dist/components/ui/no-data/no-data-styles.d.ts.map +1 -1
  166. package/dist/components/ui/page-actions.d.ts.map +1 -1
  167. package/dist/components/ui/panel-resize-handle.d.ts +25 -0
  168. package/dist/components/ui/panel-resize-handle.d.ts.map +1 -0
  169. package/dist/components/ui/sheet.d.ts.map +1 -1
  170. package/dist/components/ui/table/table-skeleton.d.ts +1 -1
  171. package/dist/components/ui/table/table-skeleton.d.ts.map +1 -1
  172. package/dist/hooks/index.cjs +23 -9
  173. package/dist/hooks/index.js +24 -10
  174. package/dist/hooks/ui/index.d.ts +1 -0
  175. package/dist/hooks/ui/index.d.ts.map +1 -1
  176. package/dist/hooks/ui/use-content-breakpoint.d.ts +32 -0
  177. package/dist/hooks/ui/use-content-breakpoint.d.ts.map +1 -0
  178. package/dist/hooks/ui/use-isomorphic-layout-effect.d.ts +2 -2
  179. package/dist/hooks/ui/use-isomorphic-layout-effect.d.ts.map +1 -1
  180. package/dist/hooks/ui/use-media-query.d.ts.map +1 -1
  181. package/dist/hooks/ui/use-resizable-panel-size.d.ts +46 -0
  182. package/dist/hooks/ui/use-resizable-panel-size.d.ts.map +1 -0
  183. package/dist/index.cjs +39 -17
  184. package/dist/index.js +41 -19
  185. package/dist/styles/layout-steps.d.ts +30 -0
  186. package/dist/styles/layout-steps.d.ts.map +1 -0
  187. package/dist/tailwind.config.cjs +36 -11
  188. package/dist/tailwind.config.js +36 -11
  189. package/eslint-config/README.md +9 -0
  190. package/eslint-config/base.js +17 -1
  191. package/eslint-config/layout-variants.js +57 -0
  192. package/package.json +3 -1
  193. package/src/ODS_TOKEN_RULES.md +40 -0
  194. package/src/components/chat/chat-archive-page.tsx +9 -7
  195. package/src/components/chat/chat-nav-sidebar.tsx +10 -4
  196. package/src/components/chat/chat-panel-header.tsx +8 -5
  197. package/src/components/chat/embeddable-chat.tsx +686 -494
  198. package/src/components/chat/index.ts +4 -0
  199. package/src/components/chat/mingo-archive-list.tsx +108 -0
  200. package/src/components/chat/mingo-chat-header.tsx +104 -0
  201. package/src/components/chat/mingo-chat-rail.tsx +361 -0
  202. package/src/components/chat/model-display.tsx +8 -1
  203. package/src/components/contact/contact-form.tsx +11 -9
  204. package/src/components/content-loading-container.tsx +4 -2
  205. package/src/components/docs/doc-viewer.tsx +7 -7
  206. package/src/components/docs/skeletons.tsx +7 -4
  207. package/src/components/dynamic-skeleton.tsx +1 -1
  208. package/src/components/embeds/claude-embed.tsx +1 -1
  209. package/src/components/embeds/embed-viewer-frame.tsx +4 -4
  210. package/src/components/embeds/figma-embed.tsx +2 -2
  211. package/src/components/embeds/google-sheets-viewer.tsx +1 -1
  212. package/src/components/embeds/pdf-viewer.tsx +3 -3
  213. package/src/components/empty-state.tsx +6 -6
  214. package/src/components/faq/faq-section.tsx +2 -2
  215. package/src/components/faq-accordion.tsx +1 -1
  216. package/src/components/features/board/board-column-header.tsx +1 -1
  217. package/src/components/features/command-box.tsx +3 -3
  218. package/src/components/features/entity-video-section.tsx +2 -2
  219. package/src/components/features/figma-prototype-viewer.tsx +4 -1
  220. package/src/components/features/media-gallery-manager.tsx +3 -1
  221. package/src/components/features/parallax-image-showcase.tsx +9 -6
  222. package/src/components/features/policy-configuration-panel.tsx +9 -7
  223. package/src/components/features/provider-button.tsx +1 -1
  224. package/src/components/features/section-selector.tsx +11 -6
  225. package/src/components/features/select-button.tsx +4 -4
  226. package/src/components/features/seo-editor-preview.tsx +2 -2
  227. package/src/components/features/video-ratio-tabs.tsx +3 -3
  228. package/src/components/features/waitlist-form.tsx +1 -1
  229. package/src/components/help-center-pages/trust-center-page.tsx +1 -1
  230. package/src/components/help-center-pages/trust-center-sections.tsx +14 -14
  231. package/src/components/icon-display.tsx +1 -1
  232. package/src/components/layout/article-detail-layout.tsx +4 -2
  233. package/src/components/layout/list-page-layout.tsx +2 -2
  234. package/src/components/layout/page-container.tsx +26 -14
  235. package/src/components/layout/page-heading.tsx +1 -1
  236. package/src/components/layout/page-layout.tsx +1 -1
  237. package/src/components/layout/title-block.tsx +13 -13
  238. package/src/components/loading/card-skeleton.tsx +11 -11
  239. package/src/components/loading/category-vendor-selector-skeleton.tsx +1 -1
  240. package/src/components/loading/content-skeleton.tsx +6 -6
  241. package/src/components/loading/device-card-skeleton.tsx +1 -1
  242. package/src/components/loading/margin-report-skeleton.tsx +7 -7
  243. package/src/components/loading/msp-profile-form-skeleton.tsx +3 -3
  244. package/src/components/loading/organization-card-skeleton.tsx +2 -2
  245. package/src/components/loading/page-layout-skeleton.tsx +80 -68
  246. package/src/components/loading/unified-skeleton.tsx +16 -6
  247. package/src/components/media-carousel.tsx +3 -3
  248. package/src/components/meeting-scheduler/booking-form.tsx +9 -8
  249. package/src/components/meeting-scheduler/context-panel.tsx +8 -6
  250. package/src/components/meeting-scheduler/directory.tsx +4 -4
  251. package/src/components/meeting-scheduler/index.tsx +15 -15
  252. package/src/components/meeting-scheduler/slot-picker.tsx +12 -12
  253. package/src/components/navigation/app-header.tsx +6 -0
  254. package/src/components/navigation/app-layout-drawer.tsx +14 -237
  255. package/src/components/navigation/app-layout-side-panel.tsx +594 -0
  256. package/src/components/navigation/app-layout.tsx +69 -4
  257. package/src/components/navigation/header-mingo-button.tsx +13 -3
  258. package/src/components/navigation/index.ts +5 -0
  259. package/src/components/navigation/navigation-sidebar.tsx +17 -3
  260. package/src/components/navigation/sliding-sidebar.tsx +2 -1
  261. package/src/components/pagination.tsx +3 -3
  262. package/src/components/persistent-filter-controls.tsx +6 -2
  263. package/src/components/platform/ScriptArguments.tsx +1 -1
  264. package/src/components/platform/ScriptInfoSection.tsx +4 -4
  265. package/src/components/shared/article-author-byline.tsx +1 -1
  266. package/src/components/shared/delivery/delivery-lists.tsx +2 -2
  267. package/src/components/shared/delivery/delivery-row.tsx +7 -7
  268. package/src/components/shared/delivery/delivery-table.tsx +3 -3
  269. package/src/components/shared/detail-page-skeleton.tsx +11 -5
  270. package/src/components/shared/dev-section/dev-card-row.tsx +6 -6
  271. package/src/components/shared/dev-section/dev-section-view.tsx +1 -1
  272. package/src/components/shared/product-release/product-release-card-skeleton.tsx +8 -8
  273. package/src/components/shared/product-release/product-release-card.tsx +9 -9
  274. package/src/components/shared/product-release/product-releases-view.tsx +1 -1
  275. package/src/components/shared/product-release/release-detail-page.tsx +5 -5
  276. package/src/components/shared/roadmap/roadmap-grid-skeleton.tsx +1 -1
  277. package/src/components/shared/roadmap/roadmap-grid.tsx +3 -3
  278. package/src/components/tickets/help-center-card.tsx +1 -1
  279. package/src/components/tickets/help-center-create-form.tsx +12 -12
  280. package/src/components/ui/announcement-bar-view.tsx +2 -10
  281. package/src/components/ui/benefit-card.tsx +18 -18
  282. package/src/components/ui/brand-association-grid.tsx +4 -4
  283. package/src/components/ui/breadcrumb.tsx +4 -1
  284. package/src/components/ui/card.tsx +1 -1
  285. package/src/components/ui/checkbox-block.tsx +9 -7
  286. package/src/components/ui/content-loader.tsx +3 -3
  287. package/src/components/ui/cursor-pagination.tsx +3 -3
  288. package/src/components/ui/dashboard-info-card.tsx +13 -9
  289. package/src/components/ui/data-attribution.tsx +2 -2
  290. package/src/components/ui/data-table/data-table-body.tsx +2 -2
  291. package/src/components/ui/data-table/data-table-header.tsx +15 -15
  292. package/src/components/ui/data-table/data-table-skeleton.tsx +6 -6
  293. package/src/components/ui/data-table/utils.ts +5 -5
  294. package/src/components/ui/dialog.tsx +4 -1
  295. package/src/components/ui/drawer.tsx +43 -189
  296. package/src/components/ui/duration-input.tsx +1 -1
  297. package/src/components/ui/entity-image.tsx +3 -3
  298. package/src/components/ui/feature-card.tsx +10 -10
  299. package/src/components/ui/file-manager/file-manager-action-bar.tsx +1 -1
  300. package/src/components/ui/file-manager/file-manager.tsx +1 -1
  301. package/src/components/ui/filter-modal.tsx +8 -1
  302. package/src/components/ui/highlight-card.tsx +7 -7
  303. package/src/components/ui/info-card-row.tsx +10 -6
  304. package/src/components/ui/modal-v2.tsx +7 -2
  305. package/src/components/ui/modal.tsx +3 -2
  306. package/src/components/ui/no-data/no-data-actions.tsx +10 -4
  307. package/src/components/ui/no-data/no-data-styles.ts +1 -1
  308. package/src/components/ui/no-data/no-data.tsx +1 -1
  309. package/src/components/ui/organization-card.tsx +1 -1
  310. package/src/components/ui/page-actions.tsx +34 -5
  311. package/src/components/ui/panel-resize-handle.tsx +184 -0
  312. package/src/components/ui/progress-bar.tsx +2 -2
  313. package/src/components/ui/query-report-table/query-report-table.tsx +1 -1
  314. package/src/components/ui/search-input.tsx +2 -2
  315. package/src/components/ui/service-card.tsx +2 -2
  316. package/src/components/ui/sheet.tsx +2 -1
  317. package/src/components/ui/skeleton.tsx +3 -3
  318. package/src/components/ui/stacked-rows-panel.tsx +4 -4
  319. package/src/components/ui/tab-navigation.tsx +2 -2
  320. package/src/components/ui/tab-selector.tsx +2 -2
  321. package/src/components/ui/table/table-header.tsx +3 -3
  322. package/src/components/ui/table/table-skeleton.tsx +3 -3
  323. package/src/components/ui/table/utils.ts +5 -5
  324. package/src/components/ui/tag-search-input.tsx +3 -3
  325. package/src/components/ui/tags-manager.tsx +5 -5
  326. package/src/components/ui/test-run.tsx +2 -2
  327. package/src/components/ui/ticket-info-section.tsx +1 -1
  328. package/src/components/ui/ticket-notes-section.tsx +1 -1
  329. package/src/components/ui/ticket-status-config-row.tsx +15 -15
  330. package/src/hooks/ui/index.ts +1 -0
  331. package/src/hooks/ui/use-content-breakpoint.ts +58 -0
  332. package/src/hooks/ui/use-media-query.ts +3 -2
  333. package/src/hooks/ui/use-resizable-panel-size.ts +114 -0
  334. package/src/styles/index.css +2 -0
  335. package/src/styles/layout-steps.ts +14 -0
  336. package/src/styles/ods-colors.css +15 -0
  337. package/src/styles/ods-content-area-tokens.css +27 -0
  338. package/src/styles/ods-content-area.css +31 -0
  339. package/src/styles/ods-effects.css +4 -2
  340. package/src/styles/ods-responsive-tokens.css +14 -4
  341. package/tailwind.config.ts +42 -7
@@ -62,7 +62,7 @@ export function ContentLoadingContainer({
62
62
  children,
63
63
  skeletonComponent,
64
64
  className,
65
- minHeight = 'min-h-[300px] md:min-h-[800px]',
65
+ minHeight = 'min-h-[300px] content-md:min-h-[800px]',
66
66
  loadingOpacity = 1,
67
67
  transitionDuration = 300,
68
68
  }: ContentLoadingContainerProps) {
@@ -120,7 +120,9 @@ export function useContentLoading(isLoading: boolean) {
120
120
 
121
121
  const getMinHeight = (contentType: 'vendor' | 'blog') => {
122
122
  // Vendor cards are typically taller, need more space
123
- return contentType === 'vendor' ? 'min-h-[400px] md:min-h-[900px]' : 'min-h-[300px] md:min-h-[800px]';
123
+ return contentType === 'vendor'
124
+ ? 'min-h-[400px] content-md:min-h-[900px]'
125
+ : 'min-h-[300px] content-md:min-h-[800px]';
124
126
  };
125
127
 
126
128
  return {
@@ -292,9 +292,9 @@ function DocViewerContent({
292
292
  )}
293
293
 
294
294
  {!error && (
295
- <div className="flex flex-1 flex-col items-start gap-6 lg:flex-row lg:gap-10">
296
- <div className="w-full lg:w-[320px] lg:shrink-0">
297
- <div className="lg:sticky lg:top-20">
295
+ <div className="flex flex-1 flex-col items-start gap-6 content-lg:flex-row content-lg:gap-10">
296
+ <div className="w-full content-lg:w-[320px] content-lg:shrink-0">
297
+ <div className="content-lg:sticky content-lg:top-20">
298
298
  {isLoadingStructure ? (
299
299
  <CategorySidebarSkeleton />
300
300
  ) : (
@@ -312,7 +312,7 @@ function DocViewerContent({
312
312
  </PersistentMobileDropdown>
313
313
 
314
314
  <PersistentSidebar isLoading={false}>
315
- <div className="hidden lg:block">
315
+ <div className="hidden content-lg:block">
316
316
  <div className="space-y-4">
317
317
  <h3 className="font-semibold text-ods-text-secondary text-h5">{sidebarLabel}</h3>
318
318
  <MultiLevelNavigation
@@ -343,7 +343,7 @@ function DocViewerContent({
343
343
  // shouldn't be on file pages" bug.
344
344
  isMarkdownContent &&
345
345
  ((showStickyNav && stickyNavSections.length > 0) || isLoadingContent || isLoadingStructure)
346
- ? 'lg:grid-cols-[1fr_280px]'
346
+ ? 'content-lg:grid-cols-[1fr_280px]'
347
347
  : ''
348
348
  } gap-8`}
349
349
  >
@@ -366,7 +366,7 @@ function DocViewerContent({
366
366
  </div>
367
367
 
368
368
  {isMarkdownContent && (isLoadingContent || isLoadingStructure) && (
369
- <div className="hidden lg:block">
369
+ <div className="hidden content-lg:block">
370
370
  <div className="sticky top-24">
371
371
  <div className="mb-5 h-[14px] w-28 animate-pulse rounded bg-ods-border" />
372
372
  <div className="space-y-0">
@@ -386,7 +386,7 @@ function DocViewerContent({
386
386
  )}
387
387
 
388
388
  {showStickyNav && content && stickyNavSections.length > 0 && !isLoadingContent && (
389
- <div className="hidden lg:block">
389
+ <div className="hidden content-lg:block">
390
390
  <div className="sticky top-24">
391
391
  <h3 className="mb-4 font-semibold text-ods-text-secondary text-h5">ON THIS PAGE</h3>
392
392
  <StickySectionNav
@@ -107,18 +107,21 @@ export function EmbedSkeleton({ documentType }: EmbedSkeletonProps = {}) {
107
107
  return (
108
108
  <div className="space-y-4">
109
109
  {/* Header — matches the actual viewer's
110
- * `flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`
110
+ * `flex flex-col gap-3 content-sm:flex-row content-sm:items-center content-sm:justify-between`
111
111
  * (mobile-stacked, desktop-row). */}
112
- <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
112
+ <div className="flex flex-col gap-3 content-sm:flex-row content-sm:items-center content-sm:justify-between">
113
113
  {/* Left: icon + title */}
114
114
  <div className="flex min-w-0 flex-1 items-center gap-2">
115
115
  <div className="h-5 w-5 shrink-0 animate-pulse rounded bg-ods-border" />
116
116
  <div className="h-6 w-2/3 animate-pulse rounded bg-ods-border" />
117
117
  </div>
118
118
  {/* Right: 1 or 2 buttons. Mobile = full-width; desktop = auto. */}
119
- <div className="flex w-full items-center gap-2 sm:w-auto">
119
+ <div className="flex w-full items-center gap-2 content-sm:w-auto">
120
120
  {Array.from({ length: buttonCount }).map((_, i) => (
121
- <div key={i} className="h-10 w-full flex-1 animate-pulse rounded bg-ods-border sm:w-32 sm:flex-initial" />
121
+ <div
122
+ key={i}
123
+ className="h-10 w-full flex-1 animate-pulse rounded bg-ods-border content-sm:w-32 content-sm:flex-initial"
124
+ />
122
125
  ))}
123
126
  </div>
124
127
  </div>
@@ -246,7 +246,7 @@ export const SkeletonPresets = {
246
246
  * Vendor grid skeleton (specific to the app)
247
247
  */
248
248
  VendorGrid: ({ items = 6 }: { items?: number }) => (
249
- <div className="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
249
+ <div className="grid grid-cols-1 gap-6 content-md:grid-cols-2 content-lg:grid-cols-3">
250
250
  {Array.from({ length: items }, (_, index) => (
251
251
  <div key={index} className="space-y-3 rounded-lg border border-ods-border bg-ods-card p-4">
252
252
  <div className="flex items-center gap-3">
@@ -79,7 +79,7 @@ export function ClaudeEmbed({ url, kind = 'artifact', title, height, loading = '
79
79
  openInNewTab
80
80
  leftIcon={<ClaudeIcon className="h-4 w-4" />}
81
81
  rightIcon={<ExternalLink className="h-4 w-4" />}
82
- className="w-full sm:w-auto"
82
+ className="w-full content-sm:w-auto"
83
83
  >
84
84
  Open in Claude
85
85
  </Button>
@@ -121,7 +121,7 @@ export function EmbedViewerFrame({
121
121
  isFullscreen && 'overflow-auto bg-ods-bg p-[var(--spacing-system-mf)]',
122
122
  )}
123
123
  >
124
- <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
124
+ <div className="flex flex-col gap-3 content-sm:flex-row content-sm:items-center content-sm:justify-between">
125
125
  <div className="flex min-w-0 items-center gap-2">
126
126
  {icon}
127
127
  {titleVariant === 'h3' ? (
@@ -133,12 +133,12 @@ export function EmbedViewerFrame({
133
133
  {/* Same responsive action-row idiom as the PDF viewer's button pair
134
134
  and every viewer's own action: full-width stacked on mobile,
135
135
  inline row from `sm:` up, SAME Button idiom (outline /
136
- small-legacy / w-4 icon / w-full sm:w-auto). Without the
136
+ small-legacy / w-4 icon / w-full content-sm:w-auto). Without the
137
137
  fullscreen toggle, `actions` renders EXACTLY as before — the
138
138
  wrapper exists only when the toggle joins it, so pre-existing
139
139
  viewers (figma/pdf/sheets) are byte-identical. */}
140
140
  {fullscreenControl && src ? (
141
- <div className="flex flex-col gap-[var(--spacing-system-xsf)] sm:flex-row sm:items-center">
141
+ <div className="flex flex-col gap-[var(--spacing-system-xsf)] content-sm:flex-row content-sm:items-center">
142
142
  {actions}
143
143
  <Button
144
144
  variant="outline"
@@ -146,7 +146,7 @@ export function EmbedViewerFrame({
146
146
  onClick={toggleFullscreen}
147
147
  aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}
148
148
  leftIcon={isFullscreen ? <Minimize2 className="h-4 w-4" /> : <Maximize2 className="h-4 w-4" />}
149
- className="w-full sm:w-auto"
149
+ className="w-full content-sm:w-auto"
150
150
  >
151
151
  {isFullscreen ? 'Exit fullscreen' : 'Fullscreen'}
152
152
  </Button>
@@ -105,7 +105,7 @@ export function FigmaEmbed({ url, title, height, loading = 'lazy' }: FigmaEmbedP
105
105
  title={heading}
106
106
  titleVariant="h6"
107
107
  actions={
108
- <div className="flex flex-col gap-2 sm:flex-row sm:items-center">
108
+ <div className="flex flex-col gap-2 content-sm:flex-row content-sm:items-center">
109
109
  {isSlides && embedSrc && <SlidesViewToggle view={view} onChange={setView} />}
110
110
  {originalUrl && (
111
111
  <Button
@@ -115,7 +115,7 @@ export function FigmaEmbed({ url, title, height, loading = 'lazy' }: FigmaEmbedP
115
115
  openInNewTab
116
116
  leftIcon={<FigmaIcon className="h-4 w-4" />}
117
117
  rightIcon={<ExternalLink className="h-4 w-4" />}
118
- className="w-full sm:w-auto"
118
+ className="w-full content-sm:w-auto"
119
119
  >
120
120
  Open in Figma
121
121
  </Button>
@@ -38,7 +38,7 @@ export function GoogleSheetsViewer({ externalUrl, fileName, height }: GoogleShee
38
38
  openInNewTab
39
39
  leftIcon={<GoogleSheetsIcon className="h-4 w-4" />}
40
40
  rightIcon={<ExternalLink className="h-4 w-4" />}
41
- className="w-full sm:w-auto"
41
+ className="w-full content-sm:w-auto"
42
42
  >
43
43
  Open in Google Sheets
44
44
  </Button>
@@ -31,7 +31,7 @@ export function PdfViewer({ src, fileName, onPreview, onDownload, height }: PdfV
31
31
  icon={<AdobePdfIcon className="h-5 w-5 shrink-0" />}
32
32
  title={displayName}
33
33
  actions={
34
- <div className="flex w-full items-center gap-2 sm:w-auto">
34
+ <div className="flex w-full items-center gap-2 content-sm:w-auto">
35
35
  <Button
36
36
  variant="outline"
37
37
  size="small-legacy"
@@ -39,7 +39,7 @@ export function PdfViewer({ src, fileName, onPreview, onDownload, height }: PdfV
39
39
  openInNewTab={!onPreview}
40
40
  onClick={onPreview}
41
41
  leftIcon={<Eye className="h-4 w-4" />}
42
- className="flex-1 sm:flex-initial"
42
+ className="flex-1 content-sm:flex-initial"
43
43
  >
44
44
  Preview
45
45
  </Button>
@@ -50,7 +50,7 @@ export function PdfViewer({ src, fileName, onPreview, onDownload, height }: PdfV
50
50
  openInNewTab={!onDownload}
51
51
  onClick={onDownload}
52
52
  leftIcon={<Download className="h-4 w-4" />}
53
- className="flex-1 sm:flex-initial"
53
+ className="flex-1 content-sm:flex-initial"
54
54
  >
55
55
  Download
56
56
  </Button>
@@ -164,21 +164,21 @@ export function EmptyState({
164
164
  const ctaButtonVariant = ctaVariant === 'primary' ? 'accent' : 'outline';
165
165
 
166
166
  return (
167
- <div className="flex flex-col items-center justify-center px-6 py-6 text-center md:py-16">
167
+ <div className="flex flex-col items-center justify-center px-6 py-6 text-center content-md:py-16">
168
168
  {/* Icon */}
169
- <div className="mb-3 flex items-center justify-center md:mb-6">
170
- <div className="rounded-full border border-ods-border bg-ods-card p-3 md:p-6">
171
- <div className="flex h-8 w-8 items-center justify-center text-ods-text-secondary md:h-16 md:w-16">
169
+ <div className="mb-3 flex items-center justify-center content-md:mb-6">
170
+ <div className="rounded-full border border-ods-border bg-ods-card p-3 content-md:p-6">
171
+ <div className="flex h-8 w-8 items-center justify-center text-ods-text-secondary content-md:h-16 content-md:w-16">
172
172
  {defaultContent.icon}
173
173
  </div>
174
174
  </div>
175
175
  </div>
176
176
 
177
177
  {/* Title */}
178
- <h2 className="mb-2 text-ods-text-primary text-h3 md:mb-3">{displayTitle}</h2>
178
+ <h2 className="mb-2 text-ods-text-primary text-h3 content-md:mb-3">{displayTitle}</h2>
179
179
 
180
180
  {/* Description */}
181
- <p className="mb-4 max-w-md text-ods-text-secondary text-h6 md:mb-8">{displayDescription}</p>
181
+ <p className="mb-4 max-w-md text-ods-text-secondary text-h6 content-md:mb-8">{displayDescription}</p>
182
182
 
183
183
  {/* Link CTA (ctaHref) — SSR-safe, no path sniffing */}
184
184
  {showCTA && ctaHref && (
@@ -315,10 +315,10 @@ function GroupedFaqList({
315
315
  function FaqSkeleton() {
316
316
  return (
317
317
  <div className="animate-pulse space-y-8">
318
- <div className="h-12 w-2/3 rounded bg-ods-border md:h-14" />
318
+ <div className="h-12 w-2/3 rounded bg-ods-border content-md:h-14" />
319
319
  <div className="w-full divide-y divide-ods-border overflow-hidden rounded-md border border-ods-border bg-transparent">
320
320
  {Array.from({ length: 8 }).map((_, idx) => (
321
- <div key={idx} className="flex items-center justify-between gap-6 px-6 py-4 md:gap-10">
321
+ <div key={idx} className="flex items-center justify-between gap-6 px-6 py-4 content-md:gap-10">
322
322
  <div className="h-6 w-5/6 rounded bg-ods-border" />
323
323
  <div className="size-6 rounded bg-ods-border" />
324
324
  </div>
@@ -56,7 +56,7 @@ export function FaqAccordion({ items, defaultOpenIds = [] }: FaqAccordionProps)
56
56
  }
57
57
  }}
58
58
  aria-expanded={isOpen}
59
- className="flex w-full cursor-pointer items-center gap-6 px-6 py-4 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ods-focus md:gap-10"
59
+ className="flex w-full cursor-pointer items-center gap-6 px-6 py-4 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ods-focus content-md:gap-10"
60
60
  >
61
61
  <h3 className="min-w-0 flex-1 break-words">{item.question}</h3>
62
62
  <Chevron02DownIcon
@@ -29,7 +29,7 @@ export function BoardColumnHeader({
29
29
  const useStatusVariant = resolveTicketStatus(tagStatus) !== null;
30
30
  // The dense header size on every input mode — the mobile mock keeps the
31
31
  // lane's info/collapse buttons small, same as desktop.
32
- const actionClass = 'h-8 w-8 p-0 md:h-8 md:w-8';
32
+ const actionClass = 'h-8 w-8 p-0 content-md:h-8 content-md:w-8';
33
33
 
34
34
  if (collapsed) {
35
35
  return (
@@ -164,7 +164,7 @@ export function CommandBox({
164
164
  commandText
165
165
  )}
166
166
  {(primaryAction || secondaryAction) && (
167
- <div className="mt-4 flex flex-col gap-3 md:flex-row md:justify-end">
167
+ <div className="mt-4 flex flex-col gap-3 content-md:flex-row content-md:justify-end">
168
168
  {secondaryAction && (
169
169
  <Button
170
170
  variant={secondaryAction.variant || 'outline'}
@@ -172,7 +172,7 @@ export function CommandBox({
172
172
  onClick={secondaryAction.onClick}
173
173
  disabled={secondaryAction.disabled}
174
174
  loading={secondaryAction.loading}
175
- className="w-full md:w-auto"
175
+ className="w-full content-md:w-auto"
176
176
  >
177
177
  {secondaryAction.label}
178
178
  </Button>
@@ -184,7 +184,7 @@ export function CommandBox({
184
184
  onClick={primaryAction.onClick}
185
185
  disabled={primaryAction.disabled}
186
186
  loading={primaryAction.loading}
187
- className="w-full md:w-auto"
187
+ className="w-full content-md:w-auto"
188
188
  >
189
189
  {primaryAction.label}
190
190
  </Button>
@@ -143,13 +143,13 @@ export function EntityVideoSection({
143
143
  <TabsList className="inline-flex h-auto justify-start gap-0 rounded-none bg-transparent p-0">
144
144
  <TabsTrigger
145
145
  value="full-video"
146
- className="rounded-none border-b-2 border-transparent px-4 py-3 text-ods-text-secondary data-[state=active]:border-ods-accent data-[state=active]:bg-transparent data-[state=active]:text-ods-text-primary data-[state=active]:shadow-none md:px-6"
146
+ className="rounded-none border-b-2 border-transparent px-4 py-3 text-ods-text-secondary data-[state=active]:border-ods-accent data-[state=active]:bg-transparent data-[state=active]:text-ods-text-primary data-[state=active]:shadow-none content-md:px-6"
147
147
  >
148
148
  Full Video
149
149
  </TabsTrigger>
150
150
  <TabsTrigger
151
151
  value="highlights"
152
- className="rounded-none border-b-2 border-transparent px-4 py-3 text-ods-text-secondary data-[state=active]:border-ods-accent data-[state=active]:bg-transparent data-[state=active]:text-ods-text-primary data-[state=active]:shadow-none md:px-6"
152
+ className="rounded-none border-b-2 border-transparent px-4 py-3 text-ods-text-secondary data-[state=active]:border-ods-accent data-[state=active]:bg-transparent data-[state=active]:text-ods-text-primary data-[state=active]:shadow-none content-md:px-6"
153
153
  >
154
154
  Highlights
155
155
  </TabsTrigger>
@@ -370,7 +370,10 @@ function UnifiedUI({ state, handlers, config, iframeRef }: UnifiedUIProps) {
370
370
 
371
371
  return (
372
372
  <div
373
- className={cn(config.hideControls ? '' : 'grid grid-cols-1 gap-10 lg:grid-cols-[296px_1fr]', config.className)}
373
+ className={cn(
374
+ config.hideControls ? '' : 'grid grid-cols-1 gap-10 content-lg:grid-cols-[296px_1fr]',
375
+ config.className,
376
+ )}
374
377
  >
375
378
  {/* Section Controls */}
376
379
  {showSectionSelector && !config.hideControls && (
@@ -328,7 +328,9 @@ export function MediaGalleryManager({
328
328
  <h3 className="text-ods-text-primary text-h3">Media Gallery ({media.length})</h3>
329
329
  <p className="text-ods-text-secondary text-h6">Drag to reorder</p>
330
330
  </div>
331
- <div className={cn('grid grid-cols-1 gap-4 md:grid-cols-2', columns === 3 && 'lg:grid-cols-3')}>
331
+ <div
332
+ className={cn('grid grid-cols-1 gap-4 content-md:grid-cols-2', columns === 3 && 'content-lg:grid-cols-3')}
333
+ >
332
334
  {media.map((item, index) => (
333
335
  <Card
334
336
  key={item.id ?? `${item.media_url}-${index}`}
@@ -127,7 +127,7 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
127
127
  if (layout === 'grid') {
128
128
  return (
129
129
  <div ref={componentRef} className={`relative flex h-full w-full items-center ${className}`}>
130
- <div className="grid w-full grid-cols-1 gap-4 md:grid-cols-3">
130
+ <div className="grid w-full grid-cols-1 gap-4 content-md:grid-cols-3">
131
131
  {/* Image #1 - Left */}
132
132
  {leftImage && (
133
133
  <motion.div
@@ -206,7 +206,10 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
206
206
  <div className="absolute inset-x-0 top-32 h-80">
207
207
  {/* Left half: Image overlaps to the left */}
208
208
  {leftImage && (
209
- <motion.div className="absolute left-20 z-10 h-full w-full lg:w-1/2" style={{ x: x, y: y, rotate: rotate }}>
209
+ <motion.div
210
+ className="absolute left-20 z-10 h-full w-full content-lg:w-1/2"
211
+ style={{ x: x, y: y, rotate: rotate }}
212
+ >
210
213
  <Image
211
214
  src={leftImage.src}
212
215
  alt={leftImage.alt}
@@ -221,7 +224,7 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
221
224
  {/* Right half: Image overlaps to the right */}
222
225
  {centerImage && (
223
226
  <motion.div
224
- className="absolute right-20 top-20 z-20 h-full w-full lg:w-1/2"
227
+ className="absolute right-20 top-20 z-20 h-full w-full content-lg:w-1/2"
225
228
  style={{ x: x, y: y, rotate: rotate }}
226
229
  >
227
230
  <Image
@@ -245,7 +248,7 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
245
248
  {/* Image #3 - Behind all - z-index 1 */}
246
249
  {rightImage && (
247
250
  <motion.div
248
- className="absolute right-[5%] top-[5%] z-[1] h-[60%] w-[80%] lg:right-[-15%] lg:top-[-10%] lg:h-[85%] lg:w-[120%]"
251
+ className="absolute right-[5%] top-[5%] z-[1] h-[60%] w-[80%] content-lg:right-[-15%] content-lg:top-[-10%] content-lg:h-[85%] content-lg:w-[120%]"
249
252
  style={{
250
253
  x: x,
251
254
  y: y,
@@ -265,7 +268,7 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
265
268
  {/* Image #2 - Middle layer - z-index 2 */}
266
269
  {centerImage && (
267
270
  <motion.div
268
- className="absolute bottom-[10%] right-[0%] z-[2] h-[55%] w-[75%] lg:bottom-[-15%] lg:right-[-20%] lg:h-[80%] lg:w-[100%]"
271
+ className="absolute bottom-[10%] right-[0%] z-[2] h-[55%] w-[75%] content-lg:bottom-[-15%] content-lg:right-[-20%] content-lg:h-[80%] content-lg:w-[100%]"
269
272
  style={{
270
273
  x: x,
271
274
  y: y,
@@ -285,7 +288,7 @@ export const ParallaxImageShowcase: React.FC<ParallaxImageShowcaseProps> = ({
285
288
  {/* Image #1 - On top - z-index 3 */}
286
289
  {leftImage && (
287
290
  <motion.div
288
- className="absolute left-[-5%] top-[10%] z-[3] h-[65%] w-[85%] lg:left-[-25%] lg:top-[0%] lg:h-[90%] lg:w-[110%]"
291
+ className="absolute left-[-5%] top-[10%] z-[3] h-[65%] w-[85%] content-lg:left-[-25%] content-lg:top-[0%] content-lg:h-[90%] content-lg:w-[110%]"
289
292
  style={{
290
293
  x: x,
291
294
  y: y,
@@ -80,7 +80,7 @@ const PolicyRow: FC<{
80
80
  };
81
81
 
82
82
  return (
83
- <div className="flex items-start gap-[var(--spacing-system-m)] border-b border-ods-border bg-ods-bg px-[var(--spacing-system-m)] py-[var(--spacing-system-sf)] last:border-b-0 md:items-center">
83
+ <div className="flex items-start gap-[var(--spacing-system-m)] border-b border-ods-border bg-ods-bg px-[var(--spacing-system-m)] py-[var(--spacing-system-sf)] last:border-b-0 content-md:items-center">
84
84
  {/* Tool Icon */}
85
85
  <div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-ods-border bg-ods-bg">
86
86
  <ToolIcon toolType={policy.toolName} size={16} />
@@ -93,7 +93,7 @@ const PolicyRow: FC<{
93
93
  </p>
94
94
  <p className="break-all text-ods-text-secondary text-h6">{policy.commandPattern}</p>
95
95
  {editMode ? (
96
- <div className="mt-[var(--spacing-system-xsf)] md:hidden">
96
+ <div className="mt-[var(--spacing-system-xsf)] content-md:hidden">
97
97
  <ApprovalLevelDropdown
98
98
  value={policy.approvalLevel}
99
99
  onChange={handleChange}
@@ -102,12 +102,14 @@ const PolicyRow: FC<{
102
102
  />
103
103
  </div>
104
104
  ) : policy.approvalLevel ? (
105
- <span className="text-ods-text-primary text-h4 md:hidden">{getApprovalLevelLabel(policy.approvalLevel)}</span>
105
+ <span className="text-ods-text-primary text-h4 content-md:hidden">
106
+ {getApprovalLevelLabel(policy.approvalLevel)}
107
+ </span>
106
108
  ) : null}
107
109
  </div>
108
110
 
109
111
  {/* Approval Level column (desktop only) */}
110
- <div className="hidden shrink-0 md:block">
112
+ <div className="hidden shrink-0 content-md:block">
111
113
  {editMode ? (
112
114
  <ApprovalLevelDropdown
113
115
  value={policy.approvalLevel}
@@ -159,7 +161,7 @@ const CategorySection: FC<{
159
161
  </p>
160
162
  <p className="text-ods-text-secondary text-h6">{category.policies.length} Configurations</p>
161
163
  {editMode && (
162
- <div className="mt-[var(--spacing-system-xsf)] md:hidden" onClick={e => e.stopPropagation()}>
164
+ <div className="mt-[var(--spacing-system-xsf)] content-md:hidden" onClick={e => e.stopPropagation()}>
163
165
  <ApprovalLevelDropdown
164
166
  value={bulkLevel}
165
167
  onChange={handleBulkChange}
@@ -173,7 +175,7 @@ const CategorySection: FC<{
173
175
 
174
176
  {/* Global Permission column (desktop only) */}
175
177
  {editMode ? (
176
- <div className="hidden shrink-0 md:block" onClick={e => e.stopPropagation()}>
178
+ <div className="hidden shrink-0 content-md:block" onClick={e => e.stopPropagation()}>
177
179
  <ApprovalLevelDropdown
178
180
  value={bulkLevel}
179
181
  onChange={handleBulkChange}
@@ -185,7 +187,7 @@ const CategorySection: FC<{
185
187
  ) : (
186
188
  <div
187
189
  className={cn(
188
- 'hidden shrink-0 px-[var(--spacing-system-sf)] py-[var(--spacing-system-xsf)] md:block',
190
+ 'hidden shrink-0 px-[var(--spacing-system-sf)] py-[var(--spacing-system-xsf)] content-md:block',
189
191
  CATEGORY_LEVEL_WIDTH,
190
192
  )}
191
193
  />
@@ -75,7 +75,7 @@ export function ProviderButton({ provider, onClick, disabled = false, loading =
75
75
  variant="outline"
76
76
  size="default"
77
77
  leftIcon={isLoading ? null : <IconComponent className="h-5 w-5" />}
78
- className={`h-[56px] w-full !font-bold !text-h6 hover:bg-ods-bg-hover md:!w-full ${isLoading ? 'cursor-wait' : 'cursor-pointer'} `}
78
+ className={`h-[56px] w-full !font-bold !text-h6 hover:bg-ods-bg-hover content-md:!w-full ${isLoading ? 'cursor-wait' : 'cursor-pointer'} `}
79
79
  aria-label={config.displayName}
80
80
  >
81
81
  {isLoading ? 'Signing in...' : config.displayName}
@@ -102,7 +102,7 @@ const SectionButton: React.FC<{
102
102
  isActive && activeButtonClassName,
103
103
  layout === 'vertical'
104
104
  ? // Strip below lg: a compact, non-shrinking tab. Side list from lg: the full card.
105
- '!h-auto !min-h-12 shrink-0 !px-[var(--spacing-system-mf)] !py-[var(--spacing-system-sf)] lg:!min-h-[var(--section-min-height)] lg:shrink lg:!py-[var(--spacing-system-mf)]'
105
+ '!h-auto !min-h-12 shrink-0 !px-[var(--spacing-system-mf)] !py-[var(--spacing-system-sf)] content-lg:!min-h-[var(--section-min-height)] content-lg:shrink content-lg:!py-[var(--spacing-system-mf)]'
106
106
  : '!h-auto !min-h-[76px] !whitespace-normal !text-left',
107
107
  )}
108
108
  style={{
@@ -125,7 +125,12 @@ const SectionButton: React.FC<{
125
125
  {section.number && <span className={cn(numberClasses, 'shrink-0 text-h3')}>{section.number}</span>}
126
126
  <div className="min-w-0 flex-1 text-left">
127
127
  <div className="flex flex-wrap items-center gap-2">
128
- <p className={cn(titleClasses, 'whitespace-nowrap text-h4 lg:whitespace-normal lg:break-words')}>
128
+ <p
129
+ className={cn(
130
+ titleClasses,
131
+ 'whitespace-nowrap text-h4 content-lg:whitespace-normal content-lg:break-words',
132
+ )}
133
+ >
129
134
  {section.title}
130
135
  </p>
131
136
  {section.badge && (
@@ -137,7 +142,7 @@ const SectionButton: React.FC<{
137
142
  )}
138
143
  </div>
139
144
  {section.description && showDescription && (
140
- <p className={cn(subtitleClasses, 'mt-1 hidden whitespace-normal break-words text-h6 lg:block')}>
145
+ <p className={cn(subtitleClasses, 'mt-1 hidden whitespace-normal break-words text-h6 content-lg:block')}>
141
146
  {section.description}
142
147
  </p>
143
148
  )}
@@ -189,8 +194,8 @@ export const SectionSelector: React.FC<SectionSelectorProps> = ({
189
194
  }) => {
190
195
  const containerClasses = cn(
191
196
  layout === 'wrap'
192
- ? 'flex flex-wrap gap-2 md:gap-4 lg:gap-6'
193
- : 'flex flex-row gap-[var(--spacing-system-xsf)] overflow-x-auto [scrollbar-width:none] lg:flex-col lg:overflow-visible [&::-webkit-scrollbar]:hidden',
197
+ ? 'flex flex-wrap gap-2 content-md:gap-4 content-lg:gap-6'
198
+ : 'flex flex-row gap-[var(--spacing-system-xsf)] overflow-x-auto [scrollbar-width:none] content-lg:flex-col content-lg:overflow-visible [&::-webkit-scrollbar]:hidden',
194
199
  className,
195
200
  );
196
201
 
@@ -242,7 +247,7 @@ export const SectionSelector: React.FC<SectionSelectorProps> = ({
242
247
  case 'full':
243
248
  return 'w-full';
244
249
  case 'responsive':
245
- return 'w-full md:w-[calc(50%-8px)] lg:w-auto';
250
+ return 'w-full content-md:w-[calc(50%-8px)] content-lg:w-auto';
246
251
  default:
247
252
  return '';
248
253
  }
@@ -47,7 +47,7 @@ export const SelectButton = React.forwardRef<HTMLButtonElement, SelectButtonProp
47
47
  disabled={disabled}
48
48
  onClick={onClick}
49
49
  className={cn(
50
- 'group flex h-11 items-center gap-1 rounded-[6px] border px-3 py-3 transition-colors duration-200 md:h-16 md:gap-2 md:px-4',
50
+ 'group flex h-11 items-center gap-1 rounded-[6px] border px-3 py-3 transition-colors duration-200 content-md:h-16 content-md:gap-2 content-md:px-4',
51
51
  'w-full text-left font-body',
52
52
  'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-focus',
53
53
  'disabled:pointer-events-none disabled:opacity-50',
@@ -63,7 +63,7 @@ export const SelectButton = React.forwardRef<HTMLButtonElement, SelectButtonProp
63
63
  {icon && (
64
64
  <span
65
65
  className={cn(
66
- 'flex size-4 shrink-0 items-center justify-center md:size-6',
66
+ 'flex size-4 shrink-0 items-center justify-center content-md:size-6',
67
67
  selected ? 'text-ods-accent' : 'text-ods-text-secondary',
68
68
  )}
69
69
  >
@@ -91,7 +91,7 @@ export const SelectButton = React.forwardRef<HTMLButtonElement, SelectButtonProp
91
91
  {description && (
92
92
  <span
93
93
  className={cn(
94
- 'hidden truncate text-h6 md:flex',
94
+ 'hidden truncate text-h6 content-md:flex',
95
95
  selected ? 'text-ods-accent' : 'text-ods-text-secondary',
96
96
  )}
97
97
  title={description}
@@ -103,7 +103,7 @@ export const SelectButton = React.forwardRef<HTMLButtonElement, SelectButtonProp
103
103
 
104
104
  {tag && <Tag variant={tagVariant} className="shrink-0" label={tag} />}
105
105
 
106
- {selected && <CheckCircleIcon className="size-4 shrink-0 text-ods-accent md:size-6" />}
106
+ {selected && <CheckCircleIcon className="size-4 shrink-0 text-ods-accent content-md:size-6" />}
107
107
  </button>
108
108
  );
109
109
  },
@@ -121,7 +121,7 @@ export function SEOEditorPreview({
121
121
  both columns share one label-row geometry; badges + the char counter
122
122
  ride the label row (labelExtras / labelEnd) instead of adding stray
123
123
  rows that misalign siblings. */}
124
- <div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
124
+ <div className="grid grid-cols-1 gap-4 content-lg:grid-cols-2">
125
125
  <div className="space-y-2">
126
126
  <Field
127
127
  label="SEO Title"
@@ -195,7 +195,7 @@ export function SEOEditorPreview({
195
195
  </div>
196
196
 
197
197
  {/* SEO Description & OG Image - Same Row */}
198
- <div className="grid grid-cols-1 gap-4 lg:grid-cols-2">
198
+ <div className="grid grid-cols-1 gap-4 content-lg:grid-cols-2">
199
199
  <div className="space-y-2">
200
200
  <Field
201
201
  label="SEO Description"
@@ -42,9 +42,9 @@ const TAB_TRIGGER_CLASS =
42
42
 
43
43
  /** Grid class for each aspect ratio (admin editors — narrower columns). */
44
44
  export const RATIO_GRID_CLASS: Record<RatioCategory, string> = {
45
- portrait: 'grid grid-cols-2 md:grid-cols-3 gap-4',
46
- square: 'grid grid-cols-2 md:grid-cols-3 gap-4',
47
- landscape: 'grid grid-cols-1 md:grid-cols-2 gap-4',
45
+ portrait: 'grid grid-cols-2 content-md:grid-cols-3 gap-4',
46
+ square: 'grid grid-cols-2 content-md:grid-cols-3 gap-4',
47
+ landscape: 'grid grid-cols-1 content-md:grid-cols-2 gap-4',
48
48
  };
49
49
 
50
50
  /** CSS `aspect-ratio` value per category — sizing for strip cards + placeholders. */
@@ -305,7 +305,7 @@ export function WaitlistForm({
305
305
  disabled={isSubmitting}
306
306
  leftIcon={<OpenFrameLogo />}
307
307
  onClick={handleSubmit}
308
- className="w-full md:w-auto"
308
+ className="w-full content-md:w-auto"
309
309
  >
310
310
  {isSuccess ? successLabel : submitLabel}
311
311
  </Button>
@@ -277,7 +277,7 @@ export function TrustCenterPage({
277
277
  })}
278
278
  </div>
279
279
 
280
- <aside className="hidden lg:block" aria-label="Trust center sections">
280
+ <aside className="hidden content-lg:block" aria-label="Trust center sections">
281
281
  <div className="sticky" style={{ top: STICKY_HEADER_OFFSET_PX }}>
282
282
  <StickySectionNav
283
283
  sections={sections.map(section => ({ id: section.id, label: section.label }))}