@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
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { useLgUp } from '../../../hooks/ui/use-media-query';
3
+ import { useContentLgUp } from '../../../hooks/ui/use-content-breakpoint';
4
4
  import { cn } from '../../../utils/cn';
5
5
  import { Arrow01DownIcon } from '../../icons-v2-generated/arrows/arrow-01-down-icon';
6
6
  import { Arrow01UpIcon } from '../../icons-v2-generated/arrows/arrow-01-up-icon';
@@ -72,12 +72,12 @@ export function TableHeader<T = TableRowData>({
72
72
  );
73
73
  };
74
74
 
75
- const isLgUp = useLgUp() ?? false;
75
+ const isLgUp = useContentLgUp() ?? false;
76
76
 
77
77
  return (
78
78
  <div
79
79
  className={cn(
80
- 'relative hidden h-11 items-center gap-4 px-4 py-3 md:flex',
80
+ 'relative hidden h-11 items-center gap-4 px-4 py-3 content-md:flex',
81
81
  stickyHeader && `sticky z-10 bg-ods-bg ${stickyHeaderOffset || 'top-0'}`,
82
82
  className,
83
83
  )}
@@ -5,7 +5,7 @@ import type { TableCardSkeletonProps } from './types';
5
5
 
6
6
  // INNER row heights: the bordered row card adds 1px top + bottom, so the
7
7
  // outer block totals the designed 68px / 80px.
8
- const ROW_HEIGHT_DESKTOP = 'h-[66px] md:h-[78px]';
8
+ const ROW_HEIGHT_DESKTOP = 'h-[66px] content-md:h-[78px]';
9
9
  /**
10
10
  * A `compact` row's floor. Compact rows are content-sized (`py-2`), but every
11
11
  * row in one table renders the same cell shapes, so pinning a minimum makes the
@@ -47,7 +47,7 @@ export function TableCardSkeleton({
47
47
  the two here made every compact table jump on its first paint. */}
48
48
  <div
49
49
  className={cn(
50
- 'hidden items-center gap-4 px-4 md:flex',
50
+ 'hidden items-center gap-4 px-4 content-md:flex',
51
51
  compact ? cn('py-2', COMPACT_ROW_MIN_HEIGHT) : cn('py-0', ROW_HEIGHT_DESKTOP),
52
52
  rowClassName,
53
53
  )}
@@ -81,7 +81,7 @@ export function TableCardSkeleton({
81
81
  {/* Mobile Skeleton */}
82
82
  <div
83
83
  className={cn(
84
- 'flex items-center justify-start gap-3 px-3 md:hidden',
84
+ 'flex items-center justify-start gap-3 px-3 content-md:hidden',
85
85
  // Mirror the real row on mobile too: a compact row is
86
86
  // content-sized with a floor, a normal row a fixed height.
87
87
  // Hard-wiring ROW_HEIGHT_MOBILE made every COMPACT table jump
@@ -16,21 +16,21 @@ export function getHideClasses(hideAt?: TailwindBreakpoint | TailwindBreakpoint[
16
16
  const maxBreakpointIndex = Math.max(...breakpoints.map(bp => breakpointOrder.indexOf(bp)));
17
17
 
18
18
  // For single breakpoint: hide below, show at and above
19
- // e.g., hideAt: 'md' -> 'hidden md:flex'
19
+ // e.g., hideAt: 'md' -> 'hidden content-md:flex'
20
20
  if (breakpoints.length === 1) {
21
- return `hidden ${breakpoints[0]}:flex`;
21
+ return `hidden content-${breakpoints[0]}:flex`;
22
22
  }
23
23
 
24
24
  // For multiple breakpoints: hide at specified breakpoints, show after the largest one
25
- // e.g., hideAt: ['md', 'lg'] -> 'md:hidden lg:hidden xl:flex'
26
- const hideClasses = breakpoints.map(bp => `${bp}:hidden`).join(' ');
25
+ // e.g., hideAt: ['md', 'lg'] -> 'content-md:hidden content-lg:hidden content-xl:flex'
26
+ const hideClasses = breakpoints.map(bp => `content-${bp}:hidden`).join(' ');
27
27
 
28
28
  // Find next breakpoint after the max to show the column
29
29
  const nextBreakpointIndex = maxBreakpointIndex + 1;
30
30
  const showBreakpoint = breakpointOrder[nextBreakpointIndex];
31
31
 
32
32
  if (showBreakpoint) {
33
- return `${hideClasses} ${showBreakpoint}:flex`;
33
+ return `${hideClasses} content-${showBreakpoint}:flex`;
34
34
  }
35
35
 
36
36
  // If no next breakpoint (e.g., hideAt: '2xl'), just hide
@@ -149,7 +149,7 @@ export function TagSearchInput<T = string>({
149
149
  {/* ---- Visible container ---- */}
150
150
  <div
151
151
  className={cn(
152
- 'flex h-11 cursor-text items-center rounded-[6px] border md:h-12',
152
+ 'flex h-11 cursor-text items-center rounded-[6px] border content-md:h-12',
153
153
  'transition-colors duration-200',
154
154
  'border-ods-border bg-ods-card',
155
155
  'has-[:focus]:border-ods-accent',
@@ -170,7 +170,7 @@ export function TagSearchInput<T = string>({
170
170
  >
171
171
  {/* Search icon — pinned left, responsive size */}
172
172
  <div className="flex shrink-0 items-center pl-3">
173
- <SearchIcon className="size-4 text-ods-text-secondary md:size-6" />
173
+ <SearchIcon className="size-4 text-ods-text-secondary content-md:size-6" />
174
174
  </div>
175
175
 
176
176
  {/* Middle zone: tags + input — overflow hidden so tags never push clear btn */}
@@ -234,7 +234,7 @@ export function TagSearchInput<T = string>({
234
234
  className="flex shrink-0 cursor-pointer items-center justify-center pr-3 transition-opacity hover:opacity-70"
235
235
  aria-label="Clear all"
236
236
  >
237
- <XmarkCircleIcon className="size-4 text-ods-text-secondary md:size-6" />
237
+ <XmarkCircleIcon className="size-4 text-ods-text-secondary content-md:size-6" />
238
238
  </button>
239
239
  )}
240
240
  </div>
@@ -169,7 +169,7 @@ export function TagsManager({
169
169
  <PopoverPrimitive.Anchor asChild>
170
170
  <label
171
171
  className={cn(
172
- 'flex min-h-11 w-full cursor-text flex-wrap items-center gap-2 rounded-[6px] border px-3 py-1 md:min-h-12',
172
+ 'flex min-h-11 w-full cursor-text flex-wrap items-center gap-2 rounded-[6px] border px-3 py-1 content-md:min-h-12',
173
173
  'transition-colors duration-200',
174
174
  'border-ods-border bg-ods-card',
175
175
  'group',
@@ -185,7 +185,7 @@ export function TagsManager({
185
185
  {/* Search adornment */}
186
186
  <span
187
187
  className={cn(
188
- 'flex-shrink-0 text-ods-text-secondary transition-colors duration-200 [&_svg]:size-4 md:[&_svg]:size-6',
188
+ 'flex-shrink-0 text-ods-text-secondary transition-colors duration-200 [&_svg]:size-4 content-md:[&_svg]:size-6',
189
189
  open && 'text-ods-accent',
190
190
  )}
191
191
  >
@@ -237,7 +237,7 @@ export function TagsManager({
237
237
  <button
238
238
  type="button"
239
239
  onClick={handleClearAll}
240
- className="flex flex-shrink-0 items-center justify-center transition-opacity hover:opacity-70 [&_svg]:size-4 md:[&_svg]:size-6"
240
+ className="flex flex-shrink-0 items-center justify-center transition-opacity hover:opacity-70 [&_svg]:size-4 content-md:[&_svg]:size-6"
241
241
  aria-label="Clear all tags"
242
242
  >
243
243
  <XmarkCircleIcon className="text-ods-text-secondary" />
@@ -319,7 +319,7 @@ export function TagsManager({
319
319
  aria-selected={isSelected}
320
320
  tabIndex={0}
321
321
  className={cn(
322
- 'flex h-11 cursor-pointer items-center border-b border-ods-border px-4 transition-colors last:border-b-0 md:h-12',
322
+ 'flex h-11 cursor-pointer items-center border-b border-ods-border px-4 transition-colors last:border-b-0 content-md:h-12',
323
323
  'text-h4',
324
324
  isSelected ? 'text-ods-accent' : 'text-ods-text-primary',
325
325
  'group/item hover:bg-ods-bg-hover',
@@ -383,7 +383,7 @@ export function TagsManager({
383
383
  aria-selected={false}
384
384
  tabIndex={0}
385
385
  className={cn(
386
- 'flex h-11 cursor-pointer items-center gap-2 px-4 transition-colors text-h4 md:h-12',
386
+ 'flex h-11 cursor-pointer items-center gap-2 px-4 transition-colors text-h4 content-md:h-12',
387
387
  'hover:bg-ods-bg-hover',
388
388
  isCreating && 'pointer-events-none opacity-50',
389
389
  )}
@@ -53,7 +53,7 @@ export function TestResultsSkeleton() {
53
53
  <div className="animate-pulse overflow-hidden rounded-[6px] border border-ods-border bg-ods-card">
54
54
  {/* Same INNER row heights as the DataTable (66/78px + the 1px card
55
55
  border on each side = 68/80px total, per design). */}
56
- <div className="flex h-[66px] items-center gap-[var(--spacing-system-mf)] px-[var(--spacing-system-mf)] md:h-[78px]">
56
+ <div className="flex h-[66px] items-center gap-[var(--spacing-system-mf)] px-[var(--spacing-system-mf)] content-md:h-[78px]">
57
57
  {Array.from({ length: SKELETON_COLUMNS }).map((_, i) => (
58
58
  <div key={`skeleton-cell-${i}`} className="w-[160px] shrink-0">
59
59
  <div className="h-5 w-3/4 rounded-sm bg-ods-bg-surface" />
@@ -114,7 +114,7 @@ export function TestResultsTable({ rows, loading }: { rows: QueryResultRow[]; lo
114
114
  <ScrollShadow axis="horizontal">
115
115
  <div style={{ minWidth: Math.max(1, columnKeys.length) * RESULT_COLUMN_MIN_WIDTH }}>
116
116
  <DataTable table={table}>
117
- {/* "flex" overrides the header's default "hidden md:flex" so the
117
+ {/* "flex" overrides the header's default "hidden content-md:flex" so the
118
118
  headers render on mobile too. */}
119
119
  <DataTable.Header className="flex flex-col" />
120
120
  <DataTable.Body loading={false} />
@@ -153,7 +153,7 @@ export function TicketInfoSection({
153
153
  return (
154
154
  <div className={cn('overflow-hidden rounded-[6px] border border-ods-border', className)}>
155
155
  {/* Header row */}
156
- <div className="grid grid-cols-2 items-center gap-4 border-b border-ods-border bg-ods-card px-4 py-3 lg:grid-cols-[1fr_1fr_1fr_auto]">
156
+ <div className="grid grid-cols-2 items-center gap-4 border-b border-ods-border bg-ods-card px-4 py-3 content-lg:grid-cols-[1fr_1fr_1fr_auto]">
157
157
  {/* Organization with image */}
158
158
  <div className="flex min-w-0 items-center gap-2">
159
159
  <SquareAvatar
@@ -62,7 +62,7 @@ export function TicketNotesSection({
62
62
  onClick={handleSend}
63
63
  disabled={!noteText.trim() || isAddingNote}
64
64
  className={cn(
65
- 'flex h-11 w-11 shrink-0 items-center justify-center rounded-[6px] md:h-12 md:w-12',
65
+ 'flex h-11 w-11 shrink-0 items-center justify-center rounded-[6px] content-md:h-12 content-md:w-12',
66
66
  'border border-ods-border bg-ods-card',
67
67
  'transition-colors hover:bg-ods-bg-hover',
68
68
  'disabled:cursor-not-allowed disabled:opacity-50',
@@ -93,7 +93,7 @@ export function TicketStatusConfigRow({
93
93
  <div
94
94
  className={cn(
95
95
  // Transparent background — only the border outlines the row.
96
- 'flex w-full items-start gap-3 rounded-md border border-ods-border md:gap-[var(--spacing-system-m)]',
96
+ 'flex w-full items-start gap-3 rounded-md border border-ods-border content-md:gap-[var(--spacing-system-m)]',
97
97
  'p-[var(--spacing-system-m)]',
98
98
  // The dragged row travels over its siblings, so it needs an opaque back.
99
99
  isDragging && 'bg-ods-bg opacity-70 shadow-lg',
@@ -102,7 +102,7 @@ export function TicketStatusConfigRow({
102
102
  {dragAndDropEnabled && (
103
103
  <div
104
104
  className={cn(
105
- 'flex h-11 w-8 shrink-0 items-center justify-center text-ods-text-secondary md:h-12',
105
+ 'flex h-11 w-8 shrink-0 items-center justify-center text-ods-text-secondary content-md:h-12',
106
106
  fieldRowOffset,
107
107
  )}
108
108
  >
@@ -131,14 +131,14 @@ export function TicketStatusConfigRow({
131
131
  and the chip pins to the card's right edge on tablet/mobile. */}
132
132
  <div
133
133
  className={cn(
134
- 'min-w-0 flex-1 items-start gap-x-3 gap-y-[var(--spacing-system-m)] md:gap-x-[var(--spacing-system-m)]',
134
+ 'min-w-0 flex-1 items-start gap-x-3 gap-y-[var(--spacing-system-m)] content-md:gap-x-[var(--spacing-system-m)]',
135
135
  isSystem
136
136
  ? 'flex flex-wrap'
137
137
  : // Mobile custom rows are a strict two-column grid, per the mock:
138
138
  // fields (name / color / hex, all one width) on the left, the
139
139
  // controls and the chip stacked in the right column. From md up
140
140
  // the same children flow as a wrapping flex row.
141
- 'grid grid-cols-[minmax(0,1fr)_auto] md:flex md:flex-wrap',
141
+ 'grid grid-cols-[minmax(0,1fr)_auto] content-md:flex content-md:flex-wrap',
142
142
  )}
143
143
  >
144
144
  {/* System rows keep the chip beside the name on every width, so the name
@@ -158,7 +158,7 @@ export function TicketStatusConfigRow({
158
158
  </div>
159
159
 
160
160
  {showColorPicker ? (
161
- <div className="order-3 flex min-w-0 grow basis-full flex-col gap-[var(--spacing-system-xxs)] md:order-2 md:basis-0">
161
+ <div className="order-3 flex min-w-0 grow basis-full flex-col gap-[var(--spacing-system-xxs)] content-md:order-2 content-md:basis-0">
162
162
  <Label variant="large">Color</Label>
163
163
  <ColorPresetSelect value={color} presetKey={presetKey} onChange={onColorChange} />
164
164
  {/* Custom hex: a second field row inside the Color column, directly
@@ -170,16 +170,16 @@ export function TicketStatusConfigRow({
170
170
  )}
171
171
  </div>
172
172
  ) : (
173
- <div aria-hidden className="hidden min-w-0 grow basis-0 lg:order-2 lg:block" />
173
+ <div aria-hidden className="hidden min-w-0 grow basis-0 content-lg:order-2 content-lg:block" />
174
174
  )}
175
175
 
176
176
  {/* Reserved desktop column slot (the mock's "No activity Indicator" zone). */}
177
- <div aria-hidden className="hidden min-w-0 grow basis-0 lg:order-3 lg:block" />
177
+ <div aria-hidden className="hidden min-w-0 grow basis-0 content-lg:order-3 content-lg:block" />
178
178
 
179
179
  {isSystem ? (
180
180
  <div
181
181
  className={cn(
182
- 'order-2 flex h-11 min-w-0 grow basis-0 items-center justify-end md:h-12 lg:order-4',
182
+ 'order-2 flex h-11 min-w-0 grow basis-0 items-center justify-end content-md:h-12 content-lg:order-4',
183
183
  fieldRowOffset,
184
184
  )}
185
185
  >
@@ -191,7 +191,7 @@ export function TicketStatusConfigRow({
191
191
  before the controls. */}
192
192
  <div
193
193
  className={cn(
194
- 'hidden h-12 min-w-0 grow basis-0 items-center justify-end lg:order-4 lg:flex',
194
+ 'hidden h-12 min-w-0 grow basis-0 items-center justify-end content-lg:order-4 content-lg:flex',
195
195
  fieldRowOffset,
196
196
  )}
197
197
  >
@@ -199,25 +199,25 @@ export function TicketStatusConfigRow({
199
199
  </div>
200
200
  {/* Tablet: the chip takes a full row of its own, pinned to the
201
201
  card's right edge (the controls above no longer narrow it). */}
202
- <div className="hidden min-w-0 basis-full items-center justify-end md:order-4 md:flex lg:hidden">
202
+ <div className="hidden min-w-0 basis-full items-center justify-end content-md:order-4 content-md:flex content-lg:hidden">
203
203
  {chip}
204
204
  </div>
205
205
  {/* Mobile: the chip fills the second grid column beside the color
206
206
  field, left-aligned with the controls above it. */}
207
- <div className={cn('order-4 flex h-11 min-w-0 items-center md:hidden', fieldRowOffset)}>{chip}</div>
207
+ <div className={cn('order-4 flex h-11 min-w-0 items-center content-md:hidden', fieldRowOffset)}>{chip}</div>
208
208
  </>
209
209
  )}
210
210
 
211
211
  <div
212
212
  className={cn(
213
- 'flex h-11 shrink-0 items-center justify-end gap-[var(--spacing-system-s)] md:h-12 lg:order-5',
214
- isSystem ? 'order-3' : 'order-2 md:order-3',
213
+ 'flex h-11 shrink-0 items-center justify-end gap-[var(--spacing-system-s)] content-md:h-12 content-lg:order-5',
214
+ isSystem ? 'order-3' : 'order-2 content-md:order-3',
215
215
  fieldRowOffset,
216
216
  )}
217
217
  >
218
218
  {!isSystem && moveButtons}
219
219
  {isSystem ? (
220
- <div className="flex w-11 justify-center md:w-12">
220
+ <div className="flex w-11 justify-center content-md:w-12">
221
221
  <TouchFriendlyTooltip content={systemTooltip}>
222
222
  <button
223
223
  type="button"
@@ -238,7 +238,7 @@ export function TicketStatusConfigRow({
238
238
  aria-label="Delete status"
239
239
  disabled={deleteDisabled}
240
240
  onClick={deleteDisabled ? undefined : onDelete}
241
- className={cn('size-11 md:size-12', deleteDisabled && 'pointer-events-none')}
241
+ className={cn('size-11 content-md:size-12', deleteDisabled && 'pointer-events-none')}
242
242
  >
243
243
  <TrashIcon className="text-ods-error" />
244
244
  </Button>
@@ -1,5 +1,6 @@
1
1
  // UI Hooks exports
2
2
  export * from './use-auto-limit-tags';
3
+ export * from './use-content-breakpoint';
3
4
  export * from './use-debounce';
4
5
  export * from './use-deferred-error';
5
6
  export * from './use-drag-and-drop-enabled';
@@ -0,0 +1,58 @@
1
+ 'use client';
2
+
3
+ import { createContext, createElement, type ReactNode, useContext } from 'react';
4
+ import { LAYOUT_STEPS } from '../../styles/layout-steps';
5
+ import { useLgUp, useMdUp } from './use-media-query';
6
+
7
+ export type ContentBreakpoint = 'mobile' | 'tablet' | 'desktop';
8
+
9
+ /** Content-area steps, in px of the area's own width. */
10
+ export const CONTENT_BREAKPOINTS = { md: LAYOUT_STEPS.md.content, lg: LAYOUT_STEPS.lg.content } as const;
11
+
12
+ /**
13
+ * Width of the enclosing content area (`AppLayout` with a side panel provides
14
+ * it), or `null` outside one.
15
+ */
16
+ export const ContentAreaWidthContext = createContext<number | null>(null);
17
+
18
+ /**
19
+ * For window chrome opened from a content area (a modal, a drawer): its subtree
20
+ * is back on the viewport's steps. Context crosses a portal, so without this
21
+ * the hooks below would still answer with the content area's width.
22
+ */
23
+ export function ViewportBreakpoints({ children }: { children: ReactNode }) {
24
+ return createElement(ContentAreaWidthContext.Provider, { value: null }, children);
25
+ }
26
+
27
+ export function contentBreakpointFor(width: number): ContentBreakpoint {
28
+ if (width >= CONTENT_BREAKPOINTS.lg) return 'desktop';
29
+ if (width >= CONTENT_BREAKPOINTS.md) return 'tablet';
30
+ return 'mobile';
31
+ }
32
+
33
+ /**
34
+ * The breakpoint a component should lay out for: the content area's when it
35
+ * renders inside one, the viewport's otherwise. `undefined` until the viewport
36
+ * is known (first client render), like `useMdUp`.
37
+ */
38
+ export function useContentBreakpoint(): ContentBreakpoint | undefined {
39
+ const width = useContext(ContentAreaWidthContext);
40
+ const mdUp = useMdUp();
41
+ const lgUp = useLgUp();
42
+ if (width !== null) return contentBreakpointFor(width);
43
+ if (mdUp === undefined) return undefined;
44
+ if (lgUp) return 'desktop';
45
+ return mdUp ? 'tablet' : 'mobile';
46
+ }
47
+
48
+ /** Content-area counterpart of `useMdUp`. */
49
+ export function useContentMdUp(): boolean | undefined {
50
+ const breakpoint = useContentBreakpoint();
51
+ return breakpoint === undefined ? undefined : breakpoint !== 'mobile';
52
+ }
53
+
54
+ /** Content-area counterpart of `useLgUp`. */
55
+ export function useContentLgUp(): boolean | undefined {
56
+ const breakpoint = useContentBreakpoint();
57
+ return breakpoint === undefined ? undefined : breakpoint === 'desktop';
58
+ }
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { useState } from 'react';
4
+ import { LAYOUT_STEPS } from '../../styles/layout-steps';
4
5
  import { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect';
5
6
 
6
7
  /**
@@ -35,8 +36,8 @@ export function useMediaQuery(query: string): boolean | undefined {
35
36
  * Predefined breakpoints for common screen sizes
36
37
  */
37
38
  export const breakpoints = {
38
- md: '(min-width: 800px)', // Tablet: 50rem
39
- lg: '(min-width: 1280px)', // Desktop: 80rem
39
+ md: `(min-width: ${LAYOUT_STEPS.md.viewport}px)`, // Tablet
40
+ lg: `(min-width: ${LAYOUT_STEPS.lg.viewport}px)`, // Desktop
40
41
  };
41
42
 
42
43
  /** @deprecated Use useMdUp instead */
@@ -154,6 +154,19 @@ body[data-scroll-locked][data-scroll-locked] {
154
154
  transform-origin: left top;
155
155
  transform: scale(1);
156
156
  }
157
+
158
+ /* The chat composer (chat-input.tsx) is a contenteditable div, not a
159
+ textarea, and WebKit's focus auto-zoom keys off its font size the same
160
+ way. Keyed on its own data-editor rather than [contenteditable]: a global
161
+ match would also resize consumers' editors (CodeMirror's .cm-content) and
162
+ drop the composer back to 14px while disabled. Its placeholder and hover
163
+ preview overlay it as siblings, so they are pinned with it or the text
164
+ would change size on the first keystroke. Mention chips stay small only
165
+ because Tag sets its own text-h5. */
166
+ [data-editor],
167
+ [data-editor-ghost] {
168
+ font-size: 16px !important;
169
+ }
157
170
  }
158
171
 
159
172
  /* Shadcn/ui HSL CSS variables for Tailwind compatibility */
@@ -5,6 +5,8 @@
5
5
  @import './ods-interaction-states.css';
6
6
  @import './ods-effects.css';
7
7
  @import './ods-responsive-tokens.css';
8
+ @import './ods-content-area.css';
9
+ @import './ods-content-area-tokens.css';
8
10
  @import './app-globals.css';
9
11
  @import './chat-animations.css';
10
12
  @import './ods-page-shell.css';
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Layout steps in px, the one place they are written. `viewport` is the window
3
+ * step (`md:`, `useMdUp`), `content` its content-area counterpart
4
+ * (`content-md:`, `useContentMdUp`): the viewport step less the navigation.
5
+ *
6
+ * Imported by tailwind.config.ts, so it must stay free of imports and aliases.
7
+ */
8
+ export const LAYOUT_STEPS = {
9
+ sm: { viewport: 640, content: 640 },
10
+ md: { viewport: 800, content: 720 },
11
+ lg: { viewport: 1280, content: 1024 },
12
+ xl: { viewport: 1440, content: 1216 },
13
+ '2xl': { viewport: 1536, content: 1312 },
14
+ } as const;
@@ -417,6 +417,21 @@
417
417
  --color-bg: color-mix(in srgb, var(--color-accent-primary) 2%, var(--ods-system-greys-background));
418
418
  }
419
419
 
420
+ /* Mingo's own surface (Figma backgrounds/mingo-background): 2% of its cyan
421
+ * over the page background, whatever the tenant accent. */
422
+ [data-surface='mingo'] {
423
+ --color-bg: color-mix(in srgb, var(--ods-flamingo-cyan-base) 2%, var(--ods-system-greys-background));
424
+ --glow-color: var(--ods-flamingo-cyan-base);
425
+ }
426
+
427
+ /* Mingo-branded controls (its chat list): the cyan as the accent, and the
428
+ * selection fill (Figma flamingo-colors/cyan-sec) as its secondary. Scoped to
429
+ * those controls, not the whole panel: an approval's Approve stays yellow. */
430
+ [data-accent='mingo'] {
431
+ --color-accent-primary: var(--ods-flamingo-cyan-base);
432
+ --color-accent-secondary: color-mix(in srgb, var(--ods-flamingo-cyan-base) 31%, var(--color-bg));
433
+ }
434
+
420
435
  /* ===================================================================== */
421
436
  /* PLATFORM OVERRIDES — brand/accent ONLY. */
422
437
  /* Reference `--ods-*` so they follow the active theme; never touch */
@@ -0,0 +1,27 @@
1
+ /* GENERATED from ods-responsive-tokens.css. Do not edit: `npm run generate:content-area`. */
2
+
3
+ @container ods-content not (min-width: 720px) {
4
+ .ods-content-scope {
5
+ --device-type: mobile;
6
+ --device-screen-width: 26.875rem;
7
+ --spacing-system-xs: 0.25rem;
8
+ --spacing-system-s: 0.5rem;
9
+ --spacing-system-m: 0.75rem;
10
+ --spacing-system-l: 1rem;
11
+ --spacing-system-xl: 1.5rem;
12
+ --spacing-system-xxl: 2.5rem;
13
+ --font-size-h1-title: 2.5rem;
14
+ --font-size-h2-sub-title: 1.5rem;
15
+ --font-size-h3-body: 0.875rem;
16
+ --font-size-h4-body: 0.875rem;
17
+ --font-size-h5-caption: 0.75rem;
18
+ --font-size-h6-caption: 0.75rem;
19
+ --font-line-space-h1-main-title: 2.5rem;
20
+ --font-line-space-h2-sub-title: 2rem;
21
+ --font-line-space-h3-body: 1.25rem;
22
+ --font-line-space-h4-body: 1.25rem;
23
+ --font-line-space-h5-caption: 1rem;
24
+ --font-line-space-h6-caption: 1rem;
25
+ --icon-size-icon-size: 1rem;
26
+ }
27
+ }
@@ -0,0 +1,31 @@
1
+ /* Open Design System – Content Area Tokens */
2
+ /*
3
+ * The responsive tokens in ods-responsive-tokens.css follow the VIEWPORT. A
4
+ * layout with a docked side panel narrows the content area without the
5
+ * viewport changing, so content inside `.ods-content-area` follows its OWN
6
+ * width instead:
7
+ *
8
+ * - `.ods-content-area` is a named inline-size container (`ods-content`).
9
+ * - `.ods-content-scope` sits inside it and re-declares the mobile tokens
10
+ * while the area is narrower than the content `md` step
11
+ * (ods-content-area-tokens.css, generated). The variables cascade, so
12
+ * every `text-h*` and `var(--spacing-system-*)` below the scope picks
13
+ * them up with no change to the components.
14
+ * - From that step up the scope declares nothing and inherits the viewport
15
+ * tokens from :root, so a wide content area renders exactly as before.
16
+ *
17
+ * A container query cannot style the container itself, hence two elements.
18
+ * The scope is `display: contents`: it carries the variables without adding a
19
+ * box, so pages keep `<main>` as their layout parent.
20
+ *
21
+ * Layout switches inside the area use the `content-md:` / `content-lg:`
22
+ * Tailwind variants. The steps themselves live in layout-steps.ts.
23
+ */
24
+
25
+ .ods-content-area {
26
+ container: ods-content / inline-size;
27
+ }
28
+
29
+ .ods-content-scope {
30
+ display: contents;
31
+ }
@@ -57,10 +57,12 @@
57
57
  the corner, radii 100% × 103% as in the design). Written
58
58
  on the class, not as a :root variable, so the accent resolves on the element
59
59
  and follows a platform or runtime (tenant) accent set below the root. */
60
+ /* The color is `--glow-color` when a surface sets one (Mingo's cyan), the
61
+ accent otherwise. */
60
62
  .ods-glow-accent-corner {
61
63
  background-image: radial-gradient(
62
64
  100% 103% at 100% 100%,
63
- color-mix(in srgb, var(--color-accent-primary) 4%, transparent) 0%,
64
- color-mix(in srgb, var(--color-accent-primary) 0%, transparent) 100%
65
+ color-mix(in srgb, var(--glow-color, var(--color-accent-primary)) 4%, transparent) 0%,
66
+ color-mix(in srgb, var(--glow-color, var(--color-accent-primary)) 0%, transparent) 100%
65
67
  );
66
68
  }
@@ -1,7 +1,15 @@
1
1
  /* Open Design System – Responsive Design Tokens */
2
2
  /* Mobile-first approach: base = mobile, then scale up with min-width */
3
-
4
- :root {
3
+ /*
4
+ * `.ods-viewport-layer` restates the same values on an element: chrome that
5
+ * follows the WINDOW (a modal, a drawer) but renders inside a narrow content
6
+ * area, whose scope re-declares the mobile values
7
+ * (ods-content-area-tokens.css), gets the viewport's tokens back for its own
8
+ * subtree.
9
+ */
10
+
11
+ :root,
12
+ .ods-viewport-layer {
5
13
  /* =================================================== */
6
14
  /* DEVICE CONTEXT */
7
15
  /* =================================================== */
@@ -77,7 +85,8 @@
77
85
  /* =================================================== */
78
86
 
79
87
  @media (min-width: 800px) {
80
- :root {
88
+ :root,
89
+ .ods-viewport-layer {
81
90
  /* Device Context */
82
91
  --device-type: tablet;
83
92
  --device-screen-width: 50rem;
@@ -122,7 +131,8 @@
122
131
  /* =================================================== */
123
132
 
124
133
  @media (min-width: 1280px) {
125
- :root {
134
+ :root,
135
+ .ods-viewport-layer {
126
136
  /* Device Context */
127
137
  --device-type: desktop;
128
138
  --device-screen-width: 80rem;