@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
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  SoftwareInfo,
10
10
  SoftwareSourceBadge,
11
11
  ToolBadge
12
- } from "./chunk-G55W76S6.js";
12
+ } from "./chunk-POZ7F77D.js";
13
13
  import {
14
14
  AppHeader,
15
15
  AppLayout,
@@ -29,14 +29,14 @@ import {
29
29
  SlidingSidebar,
30
30
  TicketAlertsButton,
31
31
  TopNavigation
32
- } from "./chunk-PJP5SMOU.js";
32
+ } from "./chunk-PPEZGUL7.js";
33
33
  import {
34
34
  MobileNavigationDropdown,
35
35
  MultiLevelNavigation,
36
36
  StickySectionNav,
37
37
  useSectionNavigation
38
- } from "./chunk-2NE3DNXY.js";
39
- import "./chunk-GZYLZ4MB.js";
38
+ } from "./chunk-IKCQK67U.js";
39
+ import "./chunk-4S7TJYRQ.js";
40
40
  import {
41
41
  AIEnrichButton,
42
42
  AIEnrichSection,
@@ -665,7 +665,7 @@ import {
665
665
  withFirstTouchAttribution,
666
666
  withWalkthroughOpenParam,
667
667
  writeDismissCookie
668
- } from "./chunk-ENGBNKUJ.js";
668
+ } from "./chunk-5EFZO5EB.js";
669
669
  import "./chunk-LQYXMEYF.js";
670
670
  import "./chunk-4JPLYOS6.js";
671
671
  import {
@@ -783,7 +783,7 @@ import {
783
783
  validateSchema,
784
784
  validateVariables,
785
785
  variablesToUrlParams
786
- } from "./chunk-KJ5LWATV.js";
786
+ } from "./chunk-MKXO4Q5P.js";
787
787
  import "./chunk-HFL2F4RM.js";
788
788
  import {
789
789
  CONTENT_REF_GROUPS,
@@ -791,7 +791,7 @@ import {
791
791
  getContentRefLabel,
792
792
  getContentRefLabelOrTitleCase,
793
793
  orderContentRefTypes
794
- } from "./chunk-HUMWQMCU.js";
794
+ } from "./chunk-UT4YHQZW.js";
795
795
  import {
796
796
  PAGE_PARAM_LIMITS,
797
797
  clampPageToTotal,
@@ -805,7 +805,7 @@ import {
805
805
  serializeSchemaParams,
806
806
  shouldIncludeInUrl,
807
807
  withQuery
808
- } from "./chunk-Q76ZTHNV.js";
808
+ } from "./chunk-MP2C3LJ4.js";
809
809
  import {
810
810
  Checkbox
811
811
  } from "./chunk-PLWMIU72.js";
@@ -936,6 +936,7 @@ import {
936
936
  MAX_PENDING_RETAIN_KEYS,
937
937
  MESSAGE_ROLE,
938
938
  MESSAGE_TYPE,
939
+ MINGO_V2_RAIL_WIDTH,
939
940
  MUX_IMAGE_ORIGIN,
940
941
  MUX_STREAM_ORIGIN,
941
942
  MarkdownEngine,
@@ -944,8 +945,11 @@ import {
944
945
  MemoizedChatMessageEnhanced,
945
946
  MermaidDiagram,
946
947
  MessageSegmentAccumulator,
948
+ MingoArchiveList,
949
+ MingoChatHeader,
947
950
  MingoChatHistory,
948
951
  MingoChatHistorySkeleton,
952
+ MingoChatRail,
949
953
  MingoHistoryRail,
950
954
  MingoOnboardingCard,
951
955
  MingoOnboardingCardSkeleton,
@@ -1200,7 +1204,7 @@ import {
1200
1204
  useVideoOriginPreconnect,
1201
1205
  useVideoWarmup,
1202
1206
  usesCanonicalStatusStyle
1203
- } from "./chunk-QGTDWFT6.js";
1207
+ } from "./chunk-IZHZMBIX.js";
1204
1208
  import {
1205
1209
  HEADING_EMOJI_RE,
1206
1210
  HUB_HEADER_OFFSET_PX,
@@ -1210,7 +1214,6 @@ import {
1210
1214
  STICKY_HEADER_OFFSET_PX,
1211
1215
  ToolIcon,
1212
1216
  ToolTypeValues,
1213
- breakpoints,
1214
1217
  clamp,
1215
1218
  createFenceTracker,
1216
1219
  createHeadingIdDeduper,
@@ -1237,17 +1240,13 @@ import {
1237
1240
  useDebounce,
1238
1241
  useHeaderHeight,
1239
1242
  useInView,
1240
- useLgUp,
1241
1243
  useMarqueeEngine,
1242
- useMdUp,
1243
- useMediaQuery,
1244
1244
  useNearViewport,
1245
1245
  usePrefersReducedMotion,
1246
1246
  usePrefersReducedMotionState,
1247
1247
  useResetOnPageHidden,
1248
- useSmUp,
1249
1248
  useSuppressCloneFocus
1250
- } from "./chunk-64O4L7WN.js";
1249
+ } from "./chunk-PDWVPI3S.js";
1251
1250
  import "./chunk-GY4IZG22.js";
1252
1251
  import {
1253
1252
  AboutIcon,
@@ -1614,20 +1613,25 @@ import {
1614
1613
  urlPathLooksLikeSvg,
1615
1614
  useCoverImageFallback,
1616
1615
  webinarTiming
1617
- } from "./chunk-6YCXA7CN.js";
1616
+ } from "./chunk-CH5232HV.js";
1618
1617
  import "./chunk-FBZMAPWO.js";
1619
1618
  import {
1619
+ CONTENT_BREAKPOINTS,
1620
+ ContentAreaWidthContext,
1620
1621
  EMBED_PROXY_OPTIONAL_HEADERS,
1621
1622
  ODS_STEM_CLASSES,
1622
1623
  ODS_STEM_TOKENS,
1623
1624
  PLATFORM_BRAND,
1624
1625
  PLATFORM_SURFACE,
1625
1626
  PLATFORM_THEME,
1627
+ ViewportBreakpoints,
1626
1628
  applyProxyAuth,
1629
+ breakpoints,
1627
1630
  buildOgPlaceholderUrl,
1628
1631
  clearAuthedAssetCache,
1629
1632
  clearAuthedImageCache,
1630
1633
  clearEmbedProxyAuth,
1634
+ contentBreakpointFor,
1631
1635
  embedAuthedFetch,
1632
1636
  getDefaultColorForPlatform,
1633
1637
  getDefaultIconForPlatform,
@@ -1659,11 +1663,18 @@ import {
1659
1663
  setEmbedProxyAuth,
1660
1664
  useAuthedAssetSrc,
1661
1665
  useAuthedImageSrc,
1666
+ useContentBreakpoint,
1667
+ useContentLgUp,
1668
+ useContentMdUp,
1662
1669
  useImageEdgeColor,
1663
1670
  useIsTruncated,
1664
1671
  useIsomorphicLayoutEffect,
1665
- useOgPlaceholderUrl
1666
- } from "./chunk-2T6QWNXU.js";
1672
+ useLgUp,
1673
+ useMdUp,
1674
+ useMediaQuery,
1675
+ useOgPlaceholderUrl,
1676
+ useSmUp
1677
+ } from "./chunk-NDESEPW5.js";
1667
1678
  import {
1668
1679
  FigmaIcon,
1669
1680
  ImageIcon,
@@ -1704,7 +1715,7 @@ import {
1704
1715
  SkeletonList,
1705
1716
  SkeletonNavigation,
1706
1717
  SkeletonText
1707
- } from "./chunk-5V6O73EH.js";
1718
+ } from "./chunk-FLKJYMVB.js";
1708
1719
  import "./chunk-INS7KZJB.js";
1709
1720
  import {
1710
1721
  Button,
@@ -2046,6 +2057,7 @@ export {
2046
2057
  COMPACT_CARD_TITLE_ROW,
2047
2058
  COMPLIANCE_STANDARDS,
2048
2059
  CONNECTION_STATUS,
2060
+ CONTENT_BREAKPOINTS,
2049
2061
  CONTENT_CARD_FRAME_CLASS,
2050
2062
  CONTENT_CARD_SKELETON_FRAME_CLASS,
2051
2063
  CONTENT_REF_GROUPS,
@@ -2139,6 +2151,7 @@ export {
2139
2151
  ComplianceBadge,
2140
2152
  ComplianceLogo,
2141
2153
  ConfidenceBadge,
2154
+ ContentAreaWidthContext,
2142
2155
  ContentCardFrame,
2143
2156
  ContentLoader,
2144
2157
  ContentPageContainer,
@@ -2433,6 +2446,7 @@ export {
2433
2446
  MESSAGE_ROLE,
2434
2447
  MESSAGE_TYPE,
2435
2448
  MINGO_APPROVAL_REQUEST_TYPE,
2449
+ MINGO_V2_RAIL_WIDTH,
2436
2450
  MOBILE_NAV_PANEL_ID,
2437
2451
  MUX_IMAGE_ORIGIN,
2438
2452
  MUX_STREAM_ORIGIN,
@@ -2469,8 +2483,11 @@ export {
2469
2483
  MiamiCyberGangLogoFaceOnly,
2470
2484
  MicrosoftIcon,
2471
2485
  MingoAiButton,
2486
+ MingoArchiveList,
2487
+ MingoChatHeader,
2472
2488
  MingoChatHistory,
2473
2489
  MingoChatHistorySkeleton,
2490
+ MingoChatRail,
2474
2491
  MingoHistoryRail,
2475
2492
  MingoIcon,
2476
2493
  MingoOnboardingCard,
@@ -2922,6 +2939,7 @@ export {
2922
2939
  VideoSourceSelector,
2923
2940
  VideoUnmuteGlyph,
2924
2941
  ViewToggle,
2942
+ ViewportBreakpoints,
2925
2943
  VolumeOffFilledIcon,
2926
2944
  WALKTHROUGH_OPEN_QUERY_PARAM,
2927
2945
  WALKTHROUGH_VIDEO_DISMISS_KEY,
@@ -3005,6 +3023,7 @@ export {
3005
3023
  configureAuthenticatedImage,
3006
3024
  configureBatchImageFetch,
3007
3025
  consumeAccessCode,
3026
+ contentBreakpointFor,
3008
3027
  copyrightLine,
3009
3028
  createChatConversationsApi,
3010
3029
  createChatDialogStore,
@@ -3481,6 +3500,9 @@ export {
3481
3500
  useCollapsible,
3482
3501
  useConfirm,
3483
3502
  useContactSubmission,
3503
+ useContentBreakpoint,
3504
+ useContentLgUp,
3505
+ useContentMdUp,
3484
3506
  useCopyToClipboard,
3485
3507
  useCoverImageFallback,
3486
3508
  useCursorPaginationState,
@@ -0,0 +1,30 @@
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 declare const LAYOUT_STEPS: {
9
+ readonly sm: {
10
+ readonly viewport: 640;
11
+ readonly content: 640;
12
+ };
13
+ readonly md: {
14
+ readonly viewport: 800;
15
+ readonly content: 720;
16
+ };
17
+ readonly lg: {
18
+ readonly viewport: 1280;
19
+ readonly content: 1024;
20
+ };
21
+ readonly xl: {
22
+ readonly viewport: 1440;
23
+ readonly content: 1216;
24
+ };
25
+ readonly '2xl': {
26
+ readonly viewport: 1536;
27
+ readonly content: 1312;
28
+ };
29
+ };
30
+ //# sourceMappingURL=layout-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-steps.d.ts","sourceRoot":"","sources":["../../src/styles/layout-steps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;CAMf,CAAC"}
@@ -101,6 +101,17 @@ var require_plugin = __commonJS({
101
101
 
102
102
  // tailwind.config.ts
103
103
  var import_plugin = __toESM(require_plugin());
104
+
105
+ // src/styles/layout-steps.ts
106
+ var LAYOUT_STEPS = {
107
+ sm: { viewport: 640, content: 640 },
108
+ md: { viewport: 800, content: 720 },
109
+ lg: { viewport: 1280, content: 1024 },
110
+ xl: { viewport: 1440, content: 1216 },
111
+ "2xl": { viewport: 1536, content: 1312 }
112
+ };
113
+
114
+ // tailwind.config.ts
104
115
  var odsTypographyPlugin = (0, import_plugin.default)(({ addUtilities }) => {
105
116
  addUtilities({
106
117
  ".text-h1": {
@@ -175,6 +186,25 @@ var odsTypographyPlugin = (0, import_plugin.default)(({ addUtilities }) => {
175
186
  }
176
187
  });
177
188
  });
189
+ var CONTENT_STEPS = Object.entries(LAYOUT_STEPS).map(([name, step]) => ({ name, ...step }));
190
+ var odsContentAreaPlugin = (0, import_plugin.default)(({ addVariant }) => {
191
+ const viewportLayer = ".ods-viewport-layer, .ods-viewport-layer *";
192
+ const byContent = `&:where(:not(${viewportLayer}))`;
193
+ const byViewport = `&:where(:not(.ods-content-area *), ${viewportLayer})`;
194
+ for (const { name, content, viewport } of CONTENT_STEPS) {
195
+ if (name !== "md" && name !== "lg") continue;
196
+ addVariant(`content-max-${name}`, [
197
+ `@container ods-content not (min-width: ${content}px) { ${byContent} }`,
198
+ `@media not all and (min-width: ${viewport}px) { ${byViewport} }`
199
+ ]);
200
+ }
201
+ for (const { name, content, viewport } of CONTENT_STEPS) {
202
+ addVariant(`content-${name}`, [
203
+ `@container ods-content (min-width: ${content}px) { ${byContent} }`,
204
+ `@media (min-width: ${viewport}px) { ${byViewport} }`
205
+ ]);
206
+ }
207
+ });
178
208
  var withAlphaValue = (color) => `color-mix(in srgb, ${color} calc(<alpha-value> * 100%), transparent)`;
179
209
  var withAlphaSupport = (tree) => Object.fromEntries(
180
210
  Object.entries(tree).map(([key, value]) => [
@@ -190,7 +220,9 @@ var config = {
190
220
  "md:hidden",
191
221
  "lg:hidden",
192
222
  "md:flex",
193
- "lg:flex"
223
+ "lg:flex",
224
+ // ...and their content-area forms (DataTable `hideAt`)
225
+ ...["md", "lg", "xl", "2xl"].flatMap((step) => [`content-${step}:hidden`, `content-${step}:flex`])
194
226
  ],
195
227
  theme: {
196
228
  container: {
@@ -380,15 +412,8 @@ var config = {
380
412
  current: "var(--ods-current)"
381
413
  })
382
414
  },
383
- // Custom breakpoints (aligned with ODS responsive tokens from Figma)
384
- screens: {
385
- md: "800px",
386
- // Tablet: 50rem
387
- lg: "1280px",
388
- // Desktop: 80rem
389
- xl: "1440px"
390
- // Large desktop: 90rem
391
- },
415
+ // Aligned with the ODS responsive tokens from Figma: md tablet, lg desktop.
416
+ screens: Object.fromEntries(CONTENT_STEPS.map(({ name, viewport }) => [name, `${viewport}px`])),
392
417
  borderRadius: {
393
418
  lg: "var(--radius)",
394
419
  // 8px
@@ -503,7 +528,7 @@ var config = {
503
528
  }
504
529
  }
505
530
  },
506
- plugins: [tailwindcssAnimate__default.default, odsTypographyPlugin, containerQueries__default.default]
531
+ plugins: [tailwindcssAnimate__default.default, odsTypographyPlugin, odsContentAreaPlugin, containerQueries__default.default]
507
532
  };
508
533
  var tailwind_config_default = config;
509
534
 
@@ -94,6 +94,17 @@ var require_plugin = __commonJS({
94
94
 
95
95
  // tailwind.config.ts
96
96
  var import_plugin = __toESM(require_plugin());
97
+
98
+ // src/styles/layout-steps.ts
99
+ var LAYOUT_STEPS = {
100
+ sm: { viewport: 640, content: 640 },
101
+ md: { viewport: 800, content: 720 },
102
+ lg: { viewport: 1280, content: 1024 },
103
+ xl: { viewport: 1440, content: 1216 },
104
+ "2xl": { viewport: 1536, content: 1312 }
105
+ };
106
+
107
+ // tailwind.config.ts
97
108
  var odsTypographyPlugin = (0, import_plugin.default)(({ addUtilities }) => {
98
109
  addUtilities({
99
110
  ".text-h1": {
@@ -168,6 +179,25 @@ var odsTypographyPlugin = (0, import_plugin.default)(({ addUtilities }) => {
168
179
  }
169
180
  });
170
181
  });
182
+ var CONTENT_STEPS = Object.entries(LAYOUT_STEPS).map(([name, step]) => ({ name, ...step }));
183
+ var odsContentAreaPlugin = (0, import_plugin.default)(({ addVariant }) => {
184
+ const viewportLayer = ".ods-viewport-layer, .ods-viewport-layer *";
185
+ const byContent = `&:where(:not(${viewportLayer}))`;
186
+ const byViewport = `&:where(:not(.ods-content-area *), ${viewportLayer})`;
187
+ for (const { name, content, viewport } of CONTENT_STEPS) {
188
+ if (name !== "md" && name !== "lg") continue;
189
+ addVariant(`content-max-${name}`, [
190
+ `@container ods-content not (min-width: ${content}px) { ${byContent} }`,
191
+ `@media not all and (min-width: ${viewport}px) { ${byViewport} }`
192
+ ]);
193
+ }
194
+ for (const { name, content, viewport } of CONTENT_STEPS) {
195
+ addVariant(`content-${name}`, [
196
+ `@container ods-content (min-width: ${content}px) { ${byContent} }`,
197
+ `@media (min-width: ${viewport}px) { ${byViewport} }`
198
+ ]);
199
+ }
200
+ });
171
201
  var withAlphaValue = (color) => `color-mix(in srgb, ${color} calc(<alpha-value> * 100%), transparent)`;
172
202
  var withAlphaSupport = (tree) => Object.fromEntries(
173
203
  Object.entries(tree).map(([key, value]) => [
@@ -183,7 +213,9 @@ var config = {
183
213
  "md:hidden",
184
214
  "lg:hidden",
185
215
  "md:flex",
186
- "lg:flex"
216
+ "lg:flex",
217
+ // ...and their content-area forms (DataTable `hideAt`)
218
+ ...["md", "lg", "xl", "2xl"].flatMap((step) => [`content-${step}:hidden`, `content-${step}:flex`])
187
219
  ],
188
220
  theme: {
189
221
  container: {
@@ -373,15 +405,8 @@ var config = {
373
405
  current: "var(--ods-current)"
374
406
  })
375
407
  },
376
- // Custom breakpoints (aligned with ODS responsive tokens from Figma)
377
- screens: {
378
- md: "800px",
379
- // Tablet: 50rem
380
- lg: "1280px",
381
- // Desktop: 80rem
382
- xl: "1440px"
383
- // Large desktop: 90rem
384
- },
408
+ // Aligned with the ODS responsive tokens from Figma: md tablet, lg desktop.
409
+ screens: Object.fromEntries(CONTENT_STEPS.map(({ name, viewport }) => [name, `${viewport}px`])),
385
410
  borderRadius: {
386
411
  lg: "var(--radius)",
387
412
  // 8px
@@ -496,7 +521,7 @@ var config = {
496
521
  }
497
522
  }
498
523
  },
499
- plugins: [tailwindcssAnimate, odsTypographyPlugin, containerQueries]
524
+ plugins: [tailwindcssAnimate, odsTypographyPlugin, odsContentAreaPlugin, containerQueries]
500
525
  };
501
526
  var tailwind_config_default = config;
502
527
 
@@ -84,6 +84,15 @@ applied to tests or stories.
84
84
  hook that is not a zustand subscription (a context getter, say) is a false positive: carry it in
85
85
  a named `files:` block.
86
86
 
87
+ ## Layout variant rule
88
+
89
+ `base` carries `flamingo/no-mixed-layout-variants` from `./layout-variants.js`: one class string may
90
+ not hold both a viewport breakpoint (`md:`) and a content-area one (`content-md:`). Tailwind emits
91
+ every `content-*` rule before the viewport ones, so where the two set the same property the viewport
92
+ class wins at any content width, and nothing says so. A class that stacks them
93
+ (`md:content-max-md:`) is the deliberate form and is allowed. The rule reads one string at a time:
94
+ classes split across `cn()` arguments are not compared.
95
+
87
96
  ## Why not ESLint 10
88
97
 
89
98
  ESLint 10 is out, and `eslint@9` is marked deprecated on npm. It still does not work here:
@@ -6,8 +6,15 @@ import globals from 'globals';
6
6
  import tseslint from 'typescript-eslint';
7
7
 
8
8
  import { ignores } from './ignores.js';
9
+ import { layoutVariantsPlugin } from './layout-variants.js';
9
10
  import { webviewPerformancePlugin } from './webview-performance.js';
10
11
 
12
+ /** The rules this config ships itself, under one `flamingo/` namespace. */
13
+ const flamingoPlugin = {
14
+ meta: { name: 'flamingo' },
15
+ rules: { ...webviewPerformancePlugin.rules, ...layoutVariantsPlugin.rules },
16
+ };
17
+
11
18
  /**
12
19
  * Promote every `warn` in a third-party config to `error`.
13
20
  *
@@ -299,13 +306,22 @@ export const base = [
299
306
  name: 'flamingo/base/webview-performance',
300
307
  files: ['**/*.{js,mjs,jsx,ts,mts,tsx}'],
301
308
  ignores: ['**/*.{test,spec}.{js,mjs,jsx,ts,mts,tsx}', '**/__tests__/**', '**/*.stories.{js,jsx,ts,tsx,mdx}'],
302
- plugins: { flamingo: webviewPerformancePlugin },
309
+ plugins: { flamingo: flamingoPlugin },
303
310
  rules: {
304
311
  'flamingo/no-inline-style-element': 'error',
305
312
  'flamingo/no-whole-store-subscription': 'error',
306
313
  },
307
314
  },
308
315
 
316
+ // `md:` and `content-md:` in one class string — see ./layout-variants.js.
317
+ {
318
+ name: 'flamingo/base/layout-variants',
319
+ files: ['**/*.{js,mjs,jsx,ts,mts,tsx}'],
320
+ ignores: ['**/*.{test,spec}.{js,mjs,jsx,ts,mts,tsx}', '**/__tests__/**'],
321
+ plugins: { flamingo: flamingoPlugin },
322
+ rules: { 'flamingo/no-mixed-layout-variants': 'error' },
323
+ },
324
+
309
325
  // Type declaration files describe other people's shapes; most of the base
310
326
  // rules are noise there.
311
327
  {
@@ -0,0 +1,57 @@
1
+ /**
2
+ * An element lays out by the window (`md:`) or by the content area
3
+ * (`content-md:`), never both. See "Content area breakpoints" in
4
+ * src/ODS_TOKEN_RULES.md.
5
+ */
6
+
7
+ const VIEWPORT = /^(?:max-)?(?:sm|md|lg|xl|2xl)$/;
8
+ const CONTENT = /^content-(?:max-)?(?:sm|md|lg|xl|2xl)$/;
9
+
10
+ /** The first class of each kind in a class string. A class that stacks the two
11
+ * (`md:content-max-md:flex`) is the deliberate form and counts as neither. */
12
+ function layoutVariantsIn(classes) {
13
+ const found = {};
14
+ for (const token of classes.split(/\s+/)) {
15
+ const variants = token.split(':').slice(0, -1);
16
+ const viewport = variants.some(variant => VIEWPORT.test(variant));
17
+ const content = variants.some(variant => CONTENT.test(variant));
18
+ if (viewport === content) continue;
19
+ found[viewport ? 'viewport' : 'content'] ??= token;
20
+ }
21
+ return found;
22
+ }
23
+
24
+ /** @type {import('eslint').Rule.RuleModule} */
25
+ const noMixedLayoutVariants = {
26
+ meta: {
27
+ type: 'problem',
28
+ docs: { description: 'Disallow viewport and content-area breakpoints in one class string' },
29
+ schema: [],
30
+ messages: {
31
+ mixed:
32
+ '`{{viewport}}` follows the window and `{{content}}` the content area. Tailwind emits every `content-*` ' +
33
+ 'rule before the viewport ones, so where they set the same property the viewport class wins at any ' +
34
+ 'content width. Use one of the two on an element; chrome that needs both stacks them in one class ' +
35
+ '(`md:content-max-md:`).',
36
+ },
37
+ },
38
+ create(context) {
39
+ const check = (node, classes) => {
40
+ const { viewport, content } = layoutVariantsIn(classes);
41
+ if (viewport && content) context.report({ node, messageId: 'mixed', data: { viewport, content } });
42
+ };
43
+ return {
44
+ Literal(node) {
45
+ if (typeof node.value === 'string') check(node, node.value);
46
+ },
47
+ TemplateElement(node) {
48
+ check(node, node.value.cooked ?? node.value.raw);
49
+ },
50
+ };
51
+ },
52
+ };
53
+
54
+ export const layoutVariantsPlugin = {
55
+ meta: { name: 'flamingo-layout-variants' },
56
+ rules: { 'no-mixed-layout-variants': noMixedLayoutVariants },
57
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.703",
3
+ "version": "0.0.704-snapshot.20261006133653",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -355,6 +355,7 @@
355
355
  "yalc:push": "yalc push ${YALC_STORE_FOLDER:+--store-folder \"$YALC_STORE_FOLDER\"}",
356
356
  "yalc:publish": "yalc publish ${YALC_STORE_FOLDER:+--store-folder \"$YALC_STORE_FOLDER\"}",
357
357
  "generate:icons": "node scripts/generate-icons.mjs",
358
+ "generate:content-area": "vitest run src/__tests__/content-area-variants.test.ts -u",
358
359
  "format": "prettier --check .",
359
360
  "storybook": "storybook dev -p 6006",
360
361
  "build-storybook": "storybook build",
@@ -503,6 +504,7 @@
503
504
  "next": "^16.1.3",
504
505
  "nodemon": "^3.1.11",
505
506
  "pkg-pr-new": "0.0.88",
507
+ "postcss": "^8.5.15",
506
508
  "prettier": "^3.9.6",
507
509
  "react": "^19.2.3",
508
510
  "react-dom": "^19.2.3",
@@ -109,6 +109,46 @@ for it on badges and chips instead of a raw `text-[10px]`; anything a user reads
109
109
  `text-h5`/`text-h6` or larger. Stamps are fixed on purpose — growing them on desktop is what
110
110
  balloons a badge out of the row it sits in.
111
111
 
112
+ ## Content area breakpoints
113
+
114
+ The tokens and `md:` / `lg:` above follow the **viewport**. When `AppLayout` has a `sidePanel` (the
115
+ docked Mingo chat), the panel narrows the content without the viewport changing, so the content lays
116
+ out by **its own width** instead. `<main>` becomes an `.ods-content-area` container, and:
117
+
118
+ | Content width | Layout | Tokens (`text-h*`, `--spacing-system-*`) |
119
+ |---------------|--------|-------------------------------------------|
120
+ | < 720px | mobile | mobile values |
121
+ | 720-1023px | tablet (`content-md:`) | the viewport's (desktop sizes on a desktop) |
122
+ | ≥ 1024px | desktop (`content-lg:`) | the viewport's |
123
+
124
+ - **Tokens need nothing.** `ods-content-area-tokens.css` (generated from the responsive tokens)
125
+ re-declares the mobile values on the content scope while it is narrower than 720px; every
126
+ `text-h*` and spacing var below it follows.
127
+ - **The steps are written once**, in `styles/layout-steps.ts`: the Tailwind screens, the
128
+ `content-*` variants and the JS hooks all read them from there.
129
+ - **Layout switches in page content use `content-md:` / `content-lg:`**, not `md:` / `lg:` — e.g.
130
+ `grid-cols-2 content-lg:grid-cols-4`. Outside a content area (apps without a side panel, overlays
131
+ portalled to `<body>`) they fall back to the viewport `md` / `lg` steps, so a shared component can
132
+ switch to them without changing anywhere else it renders.
133
+ - **Keep `md:` / `lg:` for chrome and overlays** that follow the window: header, navigation,
134
+ modals, dropdowns, toasts. Never mix `md:` and `content-md:` on one element: lint rejects the two
135
+ in one class string (`flamingo/no-mixed-layout-variants`).
136
+ - **Window chrome that renders inside the content area** (not portalled to `<body>`: `ModalV2`,
137
+ `Modal`, `SlidingSidebar`) carries `ods-viewport-layer`, which restates the viewport's tokens on its
138
+ subtree; otherwise a modal opened from a narrow content area inherits the area's mobile fonts.
139
+ `content-*` classes under the layer follow the window as well. The JS hooks need their own reset,
140
+ because React context crosses a portal: `ModalV2`, `Modal`, `Dialog`, `Sheet` and `Drawer` wrap
141
+ their content in `<ViewportBreakpoints>`.
142
+ - **Chrome inside the content area that ALSO depends on the window** stacks the two:
143
+ `md:content-max-md:` is "narrow content in a wide window" and never matches outside a content
144
+ area. `PageActions` `primary-buttons` uses it: the bottom bar spans the window (`md:hidden`),
145
+ so a docked panel narrowing the content compacts the actions into the title row instead.
146
+ - **JS layout decisions** use `useContentBreakpoint()` / `useContentMdUp()` / `useContentLgUp()`
147
+ from `hooks` instead of `useMdUp()` / `useLgUp()` — the same steps, the same viewport fallback.
148
+ - **Things that measure the window** (`vw`, `w-screen`, `fixed left-0 right-0`, a `resize` listener
149
+ on `window`) do not see the panel. Measure the element (`ResizeObserver`) or the container
150
+ (`cqw`) instead.
151
+
112
152
  ## General
113
153
 
114
154
  - Convert hardcoded values to ODS tokens even when copying patterns from existing code.
@@ -25,14 +25,14 @@ interface ChatArchivePageBaseProps {
25
25
  onLoadMore?: () => void;
26
26
  }
27
27
 
28
- /** Standalone (default): renders its own back/close header, so BOTH handlers
29
- * are required. */
28
+ /** Standalone (default): renders its own back/close header. `onBack` is
29
+ * required; without `onClose` the close button is left out. */
30
30
  export interface ChatArchivePageStandaloneProps extends ChatArchivePageBaseProps {
31
31
  embedded?: false;
32
32
  /** Back chevron — returns to the previous (list) view. */
33
33
  onBack: () => void;
34
34
  /** Close the whole chat panel. */
35
- onClose: () => void;
35
+ onClose?: () => void;
36
36
  }
37
37
 
38
38
  /** Embedded (wide split layout): the archive lives in the left rail and the
@@ -69,7 +69,7 @@ export function ChatArchivePage(props: ChatArchivePageProps) {
69
69
  {/* Mobile (<md): the shared mobile header — back to the list + a ⋯ menu
70
70
  (Close only here, since the archive list has no per-chat actions).
71
71
  `!props.embedded` narrows the union so `onBack` / `onClose` are the
72
- required standalone handlers (no no-op fallbacks). */}
72
+ standalone handlers (no no-op fallbacks). */}
73
73
  {!props.embedded && (
74
74
  <ChatPanelHeaderMobile
75
75
  className="flex md:hidden"
@@ -93,9 +93,11 @@ export function ChatArchivePage(props: ChatArchivePageProps) {
93
93
  <span className="truncate text-ods-text-primary text-h3">Chat Archive</span>
94
94
  </div>
95
95
 
96
- <ChatHeaderIconButton onClick={props.onClose} aria-label="Close">
97
- <XmarkIcon size={24} />
98
- </ChatHeaderIconButton>
96
+ {props.onClose && (
97
+ <ChatHeaderIconButton onClick={props.onClose} aria-label="Close">
98
+ <XmarkIcon size={24} />
99
+ </ChatHeaderIconButton>
100
+ )}
99
101
  </div>
100
102
  )}
101
103
  <div className="flex min-h-0 flex-1 flex-col p-[var(--spacing-system-m)]">
@@ -631,9 +631,12 @@ const ChatInput = forwardRef<ChatInputRef, ChatInputProps>((allProps, ref) => {
631
631
  <div className="relative min-w-0 flex-1">
632
632
  {/* No chip-line override on the placeholder: it only renders while
633
633
  the draft is EMPTY, so the editor is always on its plain line
634
- box here. */}
634
+ box here. `data-editor-ghost` (here and on the preview) pins
635
+ both overlays to 16px on phones alongside `data-editor` — the
636
+ iOS focus-zoom rule in app-globals.css. */}
635
637
  {isEmpty && !showPreview && (
636
638
  <span
639
+ data-editor-ghost
637
640
  className={cn(
638
641
  // One line, clipped with an ellipsis (Figma 954:28455): the
639
642
  // disabled copy is a sentence, and the panel's narrowest
@@ -659,6 +662,7 @@ const ChatInput = forwardRef<ChatInputRef, ChatInputProps>((allProps, ref) => {
659
662
  editor. */}
660
663
  {showPreview && (
661
664
  <p
665
+ data-editor-ghost
662
666
  className={cn(
663
667
  'pointer-events-none absolute inset-x-0 top-0 m-0 select-none truncate text-ods-text-secondary text-h4',
664
668
  hasChips && '!leading-9',