@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,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  useOptionalTicketLive
4
- } from "./chunk-GZYLZ4MB.js";
4
+ } from "./chunk-4S7TJYRQ.js";
5
5
  import {
6
6
  AppLayoutDrawerContainerContext,
7
7
  AppLayoutDrawerCoordinationContext,
@@ -13,20 +13,18 @@ import {
13
13
  UnreadDot,
14
14
  buildTicketOpenHref,
15
15
  useOptionalNotifications
16
- } from "./chunk-ENGBNKUJ.js";
16
+ } from "./chunk-5EFZO5EB.js";
17
17
  import {
18
18
  useFocusTrap,
19
19
  useLocalStorage
20
- } from "./chunk-KJ5LWATV.js";
20
+ } from "./chunk-MKXO4Q5P.js";
21
21
  import {
22
22
  OVERLAY_BACKDROP_CLASS,
23
23
  useIsHydrated
24
- } from "./chunk-QGTDWFT6.js";
24
+ } from "./chunk-IZHZMBIX.js";
25
25
  import {
26
- useHeaderHeight,
27
- useLgUp,
28
- useMdUp
29
- } from "./chunk-64O4L7WN.js";
26
+ useHeaderHeight
27
+ } from "./chunk-PDWVPI3S.js";
30
28
  import {
31
29
  LogOutIcon,
32
30
  MingoIcon,
@@ -47,10 +45,15 @@ import {
47
45
  import {
48
46
  SquareAvatar,
49
47
  Tag
50
- } from "./chunk-6YCXA7CN.js";
48
+ } from "./chunk-CH5232HV.js";
51
49
  import {
52
- useIsomorphicLayoutEffect
53
- } from "./chunk-2T6QWNXU.js";
50
+ ContentAreaWidthContext,
51
+ breakpoints,
52
+ useIsomorphicLayoutEffect,
53
+ useLgUp,
54
+ useMdUp,
55
+ useMediaQuery
56
+ } from "./chunk-NDESEPW5.js";
54
57
  import {
55
58
  OpenFrameLogo
56
59
  } from "./chunk-O43V3EOS.js";
@@ -59,7 +62,7 @@ import {
59
62
  DropdownMenuContent,
60
63
  DropdownMenuItem,
61
64
  DropdownMenuTrigger
62
- } from "./chunk-5V6O73EH.js";
65
+ } from "./chunk-FLKJYMVB.js";
63
66
  import {
64
67
  SearchIcon
65
68
  } from "./chunk-INS7KZJB.js";
@@ -851,7 +854,8 @@ function SlidingSidebar({ config }) {
851
854
  role: config.isOpen ? "dialog" : void 0,
852
855
  "aria-label": config.isOpen ? "Navigation sidebar" : void 0,
853
856
  className: cn(
854
- "fixed bottom-0 top-0 z-[46] flex w-72 flex-col border-ods-border bg-ods-card shadow-xl",
857
+ // Window chrome: the window's tokens even when opened from a narrow content area.
858
+ "ods-viewport-layer fixed bottom-0 top-0 z-[46] flex w-72 flex-col border-ods-border bg-ods-card shadow-xl",
855
859
  config.position === "right" ? "right-0 border-l" : "left-0 border-r",
856
860
  config.className
857
861
  ),
@@ -1056,7 +1060,7 @@ var SIDEBAR_GEOMETRY_CLASSES = [
1056
1060
  ].join(" ");
1057
1061
  var SIDEBAR_TABLET_WIDTH = { rail: "md:w-14", overlay: "md:w-56" };
1058
1062
  var isModifiedClick = (event) => !!event && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0);
1059
- function NavigationSidebar({ config, disabled = false }) {
1063
+ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1060
1064
  const isMdUp = useMdUp() ?? false;
1061
1065
  const isLgUp = useLgUp() ?? false;
1062
1066
  const isTablet = isMdUp && !isLgUp;
@@ -1152,13 +1156,23 @@ function NavigationSidebar({ config, disabled = false }) {
1152
1156
  "fixed inset-0 z-[40] bg-ods-overlay",
1153
1157
  "hidden md:block lg:hidden",
1154
1158
  "transition-opacity duration-300",
1155
- isOverlayOpen ? "opacity-100" : "pointer-events-none opacity-0"
1159
+ isOverlayOpen && !pushOnTablet ? "opacity-100" : "pointer-events-none opacity-0"
1156
1160
  ),
1157
1161
  onClick: closeOverlay,
1158
1162
  "aria-hidden": "true"
1159
1163
  }
1160
1164
  ),
1161
- /* @__PURE__ */ jsx13("div", { className: "hidden h-full w-14 flex-shrink-0 md:block lg:hidden", "aria-hidden": "true" }),
1165
+ /* @__PURE__ */ jsx13(
1166
+ "div",
1167
+ {
1168
+ className: cn(
1169
+ "hidden h-full flex-shrink-0 md:block lg:hidden",
1170
+ isOverlayOpen && pushOnTablet ? "w-56" : "w-14",
1171
+ transitionsEnabled && "transition-[width] duration-300"
1172
+ ),
1173
+ "aria-hidden": "true"
1174
+ }
1175
+ ),
1162
1176
  /* @__PURE__ */ jsxs11(
1163
1177
  "aside",
1164
1178
  {
@@ -1282,12 +1296,19 @@ function HeaderGlobalSearch({
1282
1296
 
1283
1297
  // src/components/navigation/header-mingo-button.tsx
1284
1298
  import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1285
- function HeaderMingoButton({ isActive = false, iconOnly = false, className, ...props }) {
1299
+ function HeaderMingoButton({
1300
+ isActive = false,
1301
+ iconOnly = false,
1302
+ closeWhenActive = false,
1303
+ className,
1304
+ ...props
1305
+ }) {
1306
+ const showClose = isActive && (iconOnly || closeWhenActive);
1286
1307
  return /* @__PURE__ */ jsxs13(
1287
1308
  "button",
1288
1309
  {
1289
1310
  type: "button",
1290
- "aria-label": iconOnly && isActive ? "Close Mingo AI" : "Mingo AI",
1311
+ "aria-label": showClose ? "Close Mingo AI" : "Mingo AI",
1291
1312
  "aria-pressed": isActive,
1292
1313
  className: cn(
1293
1314
  "flex h-full shrink-0 items-center gap-2 px-4",
@@ -1305,7 +1326,7 @@ function HeaderMingoButton({ isActive = false, iconOnly = false, className, ...p
1305
1326
  ),
1306
1327
  ...props,
1307
1328
  children: [
1308
- iconOnly && isActive ? (
1329
+ showClose ? (
1309
1330
  // Mobile, drawer open: the icon-only button doubles as the close
1310
1331
  // affordance, so swap the Mingo logo for an X. Match the other header
1311
1332
  // icons (e.g. notifications): secondary color, w-4 h-4 → md:w-6 h-6.
@@ -1390,6 +1411,7 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1390
1411
  showMingoAI = false,
1391
1412
  onMingoAI,
1392
1413
  isMingoAIActive = false,
1414
+ mingoAICloseWhenActive = false,
1393
1415
  showUser,
1394
1416
  userName,
1395
1417
  userEmail,
@@ -1573,6 +1595,7 @@ var AppHeader = React3.memo(function AppHeaderImpl({
1573
1595
  {
1574
1596
  onClick: onMingoAI,
1575
1597
  isActive: isMingoAIActive,
1598
+ closeWhenActive: mingoAICloseWhenActive,
1576
1599
  iconOnly: !isMdUp,
1577
1600
  disabled: disabled || !onMingoAI,
1578
1601
  className: cn(cellDivider, dimmedClass)
@@ -1647,12 +1670,375 @@ function AppHeaderSkeleton({
1647
1670
  }
1648
1671
 
1649
1672
  // src/components/navigation/app-layout.tsx
1650
- import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo2, useRef as useRef5, useState as useState4 } from "react";
1673
+ import { useCallback as useCallback3, useEffect as useEffect4, useMemo as useMemo2, useRef as useRef6, useState as useState5 } from "react";
1674
+
1675
+ // src/components/navigation/app-layout-side-panel.tsx
1676
+ import {
1677
+ useEffect as useEffect3,
1678
+ useId,
1679
+ useRef as useRef4,
1680
+ useState as useState4,
1681
+ useSyncExternalStore
1682
+ } from "react";
1683
+ import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
1684
+ var SIDE_PANEL_INSET = 16;
1685
+ var MOBILE_QUERY = `not all and ${breakpoints.md}`;
1686
+ var REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)";
1687
+ var MORPH_MS = 300;
1688
+ var STORAGE_EVENT = "of:side-panel-size";
1689
+ function resolveSidePanelLayout({
1690
+ rowWidth,
1691
+ isMobile,
1692
+ isOpen,
1693
+ size,
1694
+ minWidth,
1695
+ minContentWidth
1696
+ }) {
1697
+ const measured = rowWidth > 0;
1698
+ const room = rowWidth - minContentWidth - SIDE_PANEL_INSET;
1699
+ const canDock = !isMobile && (!measured || room >= minWidth);
1700
+ const maxDockedWidth = measured ? Math.max(minWidth, room) : Number.POSITIVE_INFINITY;
1701
+ let mode;
1702
+ if (isMobile) mode = isOpen ? "overlay" : "hidden";
1703
+ else if (!canDock) mode = isOpen ? "full" : "hidden";
1704
+ else mode = size.expanded ? "full" : "docked";
1705
+ const dockedWidth = Math.min(Math.max(size.width, minWidth), maxDockedWidth);
1706
+ let width;
1707
+ if (mode === "docked") width = dockedWidth;
1708
+ else if (mode === "overlay") width = rowWidth;
1709
+ else width = Math.max(0, rowWidth - 2 * SIDE_PANEL_INSET);
1710
+ return { mode, width, canDock, maxDockedWidth, dockedWidth };
1711
+ }
1712
+ function parseSize(raw) {
1713
+ if (!raw) return null;
1714
+ try {
1715
+ const parsed = JSON.parse(raw);
1716
+ if (!parsed || typeof parsed.width !== "number" || !Number.isFinite(parsed.width)) return null;
1717
+ return { width: parsed.width, expanded: parsed.expanded === true };
1718
+ } catch {
1719
+ return null;
1720
+ }
1721
+ }
1722
+ function subscribeToStoredSize(onChange) {
1723
+ window.addEventListener("storage", onChange);
1724
+ window.addEventListener(STORAGE_EVENT, onChange);
1725
+ return () => {
1726
+ window.removeEventListener("storage", onChange);
1727
+ window.removeEventListener(STORAGE_EVENT, onChange);
1728
+ };
1729
+ }
1730
+ function useStoredSize(storageKey, fallback) {
1731
+ const raw = useSyncExternalStore(
1732
+ subscribeToStoredSize,
1733
+ () => {
1734
+ if (!storageKey) return null;
1735
+ try {
1736
+ return window.localStorage.getItem(storageKey);
1737
+ } catch {
1738
+ return null;
1739
+ }
1740
+ },
1741
+ () => null
1742
+ );
1743
+ const [sessionSize, setSessionSize] = useState4(null);
1744
+ const size = (storageKey ? parseSize(raw) : sessionSize) ?? fallback;
1745
+ const setSize = (next) => {
1746
+ if (!storageKey) {
1747
+ setSessionSize(next);
1748
+ return;
1749
+ }
1750
+ try {
1751
+ window.localStorage.setItem(storageKey, JSON.stringify(next));
1752
+ } catch {
1753
+ setSessionSize(next);
1754
+ }
1755
+ window.dispatchEvent(new Event(STORAGE_EVENT));
1756
+ };
1757
+ return [size, setSize];
1758
+ }
1759
+ function useAppLayoutSidePanel(config, row) {
1760
+ const enabled = config !== void 0;
1761
+ const minWidth = config?.minWidth ?? 0;
1762
+ const minContentWidth = config?.minContentWidth ?? 400;
1763
+ const collapsed = config?.collapsed ?? false;
1764
+ const minimum = { width: minWidth, expanded: false };
1765
+ const [rowWidth, setRowWidth] = useState4(0);
1766
+ useIsomorphicLayoutEffect(() => {
1767
+ if (!enabled || !row) return void 0;
1768
+ const update = () => setRowWidth(row.clientWidth);
1769
+ update();
1770
+ const observer = new ResizeObserver(update);
1771
+ observer.observe(row);
1772
+ return () => observer.disconnect();
1773
+ }, [enabled, row]);
1774
+ const isMobile = useMediaQuery(MOBILE_QUERY) === true;
1775
+ const reduceMotion = useMediaQuery(REDUCED_MOTION_QUERY) === true;
1776
+ const [morph, setMorph] = useState4(null);
1777
+ const [liveWidth, setLiveWidth] = useState4(null);
1778
+ const [storedSize, setStoredSize] = useStoredSize(config?.storageKey, minimum);
1779
+ const [ownIsOpen, setOwnIsOpen] = useState4(false);
1780
+ const isOpen = config?.open ?? ownIsOpen;
1781
+ const onOpenChange = config?.onOpenChange;
1782
+ const setIsOpen = (next) => {
1783
+ if (config?.open === void 0) setOwnIsOpen(next);
1784
+ onOpenChange?.(next);
1785
+ };
1786
+ const [collapsedSize, setCollapsedSize] = useState4(null);
1787
+ const [prevCollapsed, setPrevCollapsed] = useState4(collapsed);
1788
+ if (collapsed !== prevCollapsed) {
1789
+ setPrevCollapsed(collapsed);
1790
+ setCollapsedSize(null);
1791
+ }
1792
+ const size = collapsed ? collapsedSize ?? minimum : storedSize;
1793
+ const setSize = collapsed ? setCollapsedSize : setStoredSize;
1794
+ const layout = resolveSidePanelLayout({ rowWidth, isMobile, isOpen, size, minWidth, minContentWidth });
1795
+ const [prevCanDock, setPrevCanDock] = useState4(layout.canDock);
1796
+ if (layout.canDock !== prevCanDock) {
1797
+ setPrevCanDock(layout.canDock);
1798
+ setOwnIsOpen(false);
1799
+ }
1800
+ const prevCanDockRef = useRef4(layout.canDock);
1801
+ useEffect3(() => {
1802
+ const couldDock = prevCanDockRef.current;
1803
+ prevCanDockRef.current = layout.canDock;
1804
+ if (!couldDock && layout.canDock && config?.open) onOpenChange?.(false);
1805
+ }, [layout.canDock, config?.open, onOpenChange]);
1806
+ if (!enabled) return null;
1807
+ const animate = (next) => {
1808
+ if (!reduceMotion) setMorph(next);
1809
+ };
1810
+ const fullWidth = Math.max(0, rowWidth - 2 * SIDE_PANEL_INSET);
1811
+ const peekWidth = layout.canDock ? liveWidth : null;
1812
+ const dock = (next) => setSize({ width: Math.max(minWidth, Math.round(next)), expanded: false });
1813
+ const resize = (next) => {
1814
+ const expand = next > layout.maxDockedWidth;
1815
+ if (layout.canDock) {
1816
+ if (expand && layout.mode === "docked") animate("expand");
1817
+ else if (!expand && layout.mode === "full") animate("collapse");
1818
+ }
1819
+ if (expand) setSize({ width: size.width, expanded: true });
1820
+ else dock(next);
1821
+ };
1822
+ let collapsesTo = null;
1823
+ if (layout.mode === "full" && layout.canDock) collapsesTo = layout.dockedWidth > minWidth ? "column" : "minimum";
1824
+ else if (layout.mode === "docked" && layout.width > minWidth) collapsesTo = "minimum";
1825
+ return {
1826
+ ...layout,
1827
+ minWidth,
1828
+ isOpen,
1829
+ morph,
1830
+ peekWidth,
1831
+ coversContent: layout.mode === "full" && morph !== "expand" && peekWidth === null,
1832
+ overlapsContent: morph !== null || peekWidth !== null,
1833
+ endMorph: () => setMorph(null),
1834
+ collapsesTo,
1835
+ collapse: () => {
1836
+ if (collapsesTo === null) return;
1837
+ if (layout.mode === "full") {
1838
+ animate("collapse");
1839
+ setSize({ width: size.width, expanded: false });
1840
+ } else {
1841
+ animate("narrow");
1842
+ setSize({ width: minWidth, expanded: false });
1843
+ }
1844
+ },
1845
+ toggle: () => setIsOpen(!isOpen),
1846
+ close: () => setIsOpen(false),
1847
+ resize,
1848
+ drag: (next) => {
1849
+ if (next > layout.maxDockedWidth) {
1850
+ if (size.expanded || size.width !== layout.maxDockedWidth) dock(layout.maxDockedWidth);
1851
+ setLiveWidth(Math.min(Math.round(next), fullWidth));
1852
+ return;
1853
+ }
1854
+ setLiveWidth(null);
1855
+ dock(next);
1856
+ },
1857
+ release: (next) => {
1858
+ setLiveWidth(null);
1859
+ if (next <= layout.maxDockedWidth) return;
1860
+ if (next > (layout.maxDockedWidth + fullWidth) / 2) {
1861
+ if (next < fullWidth) animate("expand");
1862
+ setSize({ width: layout.maxDockedWidth, expanded: true });
1863
+ } else {
1864
+ animate("narrow");
1865
+ dock(layout.maxDockedWidth);
1866
+ }
1867
+ }
1868
+ };
1869
+ }
1870
+ function SidePanelResizeHandle({ state, label, controls }) {
1871
+ const { width, minWidth, maxDockedWidth, mode, peekWidth, resize, drag, release } = state;
1872
+ const startRef = useRef4(null);
1873
+ const frameRef = useRef4(null);
1874
+ const pendingRef = useRef4(null);
1875
+ const measured = Number.isFinite(maxDockedWidth);
1876
+ const current = peekWidth ?? (mode === "full" && measured ? maxDockedWidth + 1 : width);
1877
+ useEffect3(
1878
+ () => () => {
1879
+ if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);
1880
+ },
1881
+ []
1882
+ );
1883
+ const scheduleDrag = (next) => {
1884
+ pendingRef.current = next;
1885
+ if (frameRef.current !== null) return;
1886
+ frameRef.current = requestAnimationFrame(() => {
1887
+ frameRef.current = null;
1888
+ if (pendingRef.current !== null) drag(pendingRef.current);
1889
+ });
1890
+ };
1891
+ const handlePointerDown = (event) => {
1892
+ if (event.button !== 0 && event.pointerType === "mouse") return;
1893
+ event.preventDefault();
1894
+ startRef.current = { x: event.clientX, width: mode === "full" && measured ? width : current };
1895
+ pendingRef.current = null;
1896
+ event.currentTarget.setPointerCapture(event.pointerId);
1897
+ document.body.style.cursor = "col-resize";
1898
+ document.body.style.userSelect = "none";
1899
+ };
1900
+ const handlePointerMove = (event) => {
1901
+ const start = startRef.current;
1902
+ if (!start) return;
1903
+ scheduleDrag(start.width - (event.clientX - start.x));
1904
+ };
1905
+ const endDrag = (event) => {
1906
+ const start = startRef.current;
1907
+ if (!start) return;
1908
+ startRef.current = null;
1909
+ if (frameRef.current !== null) {
1910
+ cancelAnimationFrame(frameRef.current);
1911
+ frameRef.current = null;
1912
+ if (pendingRef.current !== null) drag(pendingRef.current);
1913
+ }
1914
+ if (pendingRef.current !== null) release(pendingRef.current);
1915
+ pendingRef.current = null;
1916
+ try {
1917
+ event.currentTarget.releasePointerCapture(event.pointerId);
1918
+ } catch {
1919
+ }
1920
+ document.body.style.cursor = "";
1921
+ document.body.style.userSelect = "";
1922
+ };
1923
+ const handleKeyDown = (event) => {
1924
+ const step = event.shiftKey ? 40 : 16;
1925
+ let next = null;
1926
+ if (event.key === "ArrowLeft") next = current + step;
1927
+ else if (event.key === "ArrowRight") next = Math.min(current, maxDockedWidth) - step;
1928
+ else if (event.key === "Home") next = minWidth;
1929
+ else if (event.key === "End" && measured) next = maxDockedWidth + 1;
1930
+ if (next === null) return;
1931
+ event.preventDefault();
1932
+ resize(next);
1933
+ };
1934
+ return /* @__PURE__ */ jsx18(
1935
+ "div",
1936
+ {
1937
+ role: "separator",
1938
+ tabIndex: 0,
1939
+ "aria-controls": controls,
1940
+ "aria-orientation": "vertical",
1941
+ "aria-label": label,
1942
+ "aria-valuenow": Math.round(current),
1943
+ "aria-valuemin": minWidth,
1944
+ "aria-valuemax": measured ? Math.round(maxDockedWidth + 1) : void 0,
1945
+ "aria-valuetext": mode === "full" ? "Full width" : `${Math.round(width)} pixels`,
1946
+ onPointerDown: handlePointerDown,
1947
+ onPointerMove: handlePointerMove,
1948
+ onPointerUp: endDrag,
1949
+ onPointerCancel: endDrag,
1950
+ onKeyDown: handleKeyDown,
1951
+ className: "group absolute inset-y-0 left-0 z-10 flex w-4 -translate-x-1/2 cursor-col-resize touch-none select-none items-center justify-center outline-none",
1952
+ children: /* @__PURE__ */ jsx18(
1953
+ "span",
1954
+ {
1955
+ "aria-hidden": true,
1956
+ className: "flex h-8 w-4 items-center justify-center rounded-sm border border-ods-border bg-ods-card text-ods-text-secondary transition-colors group-hover:border-ods-border-hover group-focus-visible:border-ods-accent group-focus-visible:text-ods-accent",
1957
+ children: /* @__PURE__ */ jsx18(Menu01Icon, { size: 12 })
1958
+ }
1959
+ )
1960
+ }
1961
+ );
1962
+ }
1963
+ function AppLayoutSidePanel({ config, state }) {
1964
+ const panelId = useId();
1965
+ const { mode, width, dockedWidth, canDock, isOpen, close, morph, endMorph, peekWidth } = state;
1966
+ useEffect3(() => {
1967
+ if (!morph) return void 0;
1968
+ const timer = window.setTimeout(endMorph, MORPH_MS * 3);
1969
+ return () => window.clearTimeout(timer);
1970
+ }, [morph, endMorph]);
1971
+ if (mode === "hidden") return null;
1972
+ const label = config.label ?? "Side panel";
1973
+ const inColumn = mode === "docked" || morph === "expand" || peekWidth !== null;
1974
+ const handleKeyDown = (event) => {
1975
+ if (event.key !== "Escape" || !isOpen || event.defaultPrevented) return;
1976
+ event.preventDefault();
1977
+ close();
1978
+ };
1979
+ return /* @__PURE__ */ jsx18(
1980
+ "aside",
1981
+ {
1982
+ id: panelId,
1983
+ "aria-label": label,
1984
+ onKeyDown: handleKeyDown,
1985
+ className: cn(
1986
+ "relative min-w-0",
1987
+ // Docked is decided before the viewport is known (server render, first
1988
+ // paint): keep it off phones until JS says otherwise.
1989
+ mode !== "overlay" && inColumn && "hidden shrink-0 md:block",
1990
+ mode !== "overlay" && !inColumn && "flex-1",
1991
+ // z-[99]: above the page's own layers (sticky headers, the z-50 bottom
1992
+ // action bar), BELOW the mobile burger menu (backdrop z-[100], panel
1993
+ // z-[101]), so the menu opens over a panel covering the content.
1994
+ mode === "overlay" && "absolute inset-0 z-[99] bg-ods-bg"
1995
+ ),
1996
+ style: mode !== "overlay" && inColumn ? { width: dockedWidth + SIDE_PANEL_INSET } : void 0,
1997
+ children: /* @__PURE__ */ jsxs16(
1998
+ "div",
1999
+ {
2000
+ onTransitionEnd: (event) => {
2001
+ if (event.target === event.currentTarget) endMorph();
2002
+ },
2003
+ onTransitionCancel: (event) => {
2004
+ if (event.target === event.currentTarget) endMorph();
2005
+ },
2006
+ className: cn(
2007
+ "absolute flex",
2008
+ mode === "overlay" ? "inset-0" : "inset-y-[var(--spacing-system-mf)] right-[var(--spacing-system-mf)] z-[1]",
2009
+ morph && "transition-[width] duration-300 ease-in-out motion-reduce:transition-none"
2010
+ ),
2011
+ style: mode === "overlay" ? void 0 : { width: peekWidth ?? width },
2012
+ children: [
2013
+ canDock && /* @__PURE__ */ jsx18(SidePanelResizeHandle, { state, label: `Resize ${label}`, controls: panelId }),
2014
+ /* @__PURE__ */ jsx18(
2015
+ "div",
2016
+ {
2017
+ className: cn(
2018
+ "flex min-h-0 min-w-0 flex-1 overflow-hidden bg-ods-bg",
2019
+ mode !== "overlay" && "rounded-md border border-ods-border"
2020
+ ),
2021
+ children: config.children({
2022
+ width: peekWidth ?? width,
2023
+ mode,
2024
+ canClose: mode === "overlay" || mode === "full" && !canDock,
2025
+ close,
2026
+ collapsesTo: state.collapsesTo,
2027
+ collapse: state.collapse
2028
+ })
2029
+ }
2030
+ )
2031
+ ]
2032
+ }
2033
+ )
2034
+ }
2035
+ );
2036
+ }
1651
2037
 
1652
2038
  // src/components/navigation/mobile-burger-menu.tsx
1653
2039
  import { usePreventScroll as usePreventScroll3 } from "@react-aria/overlays";
1654
- import React4, { useCallback as useCallback2, useRef as useRef4 } from "react";
1655
- import { Fragment as Fragment8, jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
2040
+ import React4, { useCallback as useCallback2, useRef as useRef5 } from "react";
2041
+ import { Fragment as Fragment8, jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
1656
2042
  var HEADER_HEIGHT = 56;
1657
2043
  var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1658
2044
  isOpen,
@@ -1664,7 +2050,7 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1664
2050
  onLogout,
1665
2051
  disabled = false
1666
2052
  }) {
1667
- const panelRef = useRef4(null);
2053
+ const panelRef = useRef5(null);
1668
2054
  usePreventScroll3({ isDisabled: !isOpen });
1669
2055
  useFocusTrap(panelRef, isOpen, { onEscape: onClose });
1670
2056
  const handleItemClick = useCallback2(
@@ -1682,7 +2068,7 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1682
2068
  const secondaryItems = config.items.filter((item) => item.section === "secondary");
1683
2069
  const renderNavigationItem = (item, isGridItem = false) => {
1684
2070
  const isActive = item.isActive ?? false;
1685
- return /* @__PURE__ */ jsxs16(
2071
+ return /* @__PURE__ */ jsxs17(
1686
2072
  "button",
1687
2073
  {
1688
2074
  onClick: () => handleItemClick(item),
@@ -1702,12 +2088,12 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1702
2088
  "aria-current": isActive ? "page" : void 0,
1703
2089
  "aria-label": item.badge ? `${item.label} (${item.badge})` : void 0,
1704
2090
  children: [
1705
- item.icon && /* @__PURE__ */ jsx18("div", { className: "flex size-4 flex-shrink-0 items-center justify-center", children: React4.cloneElement(item.icon, {
2091
+ item.icon && /* @__PURE__ */ jsx19("div", { className: "flex size-4 flex-shrink-0 items-center justify-center", children: React4.cloneElement(item.icon, {
1706
2092
  size: 16,
1707
2093
  color: isActive && !disabled ? "var(--color-accent-primary)" : "var(--color-text-secondary)"
1708
2094
  }) }),
1709
- /* @__PURE__ */ jsxs16("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xxs)]", children: [
1710
- /* @__PURE__ */ jsx18(
2095
+ /* @__PURE__ */ jsxs17("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xxs)]", children: [
2096
+ /* @__PURE__ */ jsx19(
1711
2097
  "span",
1712
2098
  {
1713
2099
  className: cn(
@@ -1717,16 +2103,16 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1717
2103
  children: item.label
1718
2104
  }
1719
2105
  ),
1720
- item.badge && /* @__PURE__ */ jsx18(NavigationItemBadge, { compact: true, label: item.badge })
2106
+ item.badge && /* @__PURE__ */ jsx19(NavigationItemBadge, { compact: true, label: item.badge })
1721
2107
  ] })
1722
2108
  ]
1723
2109
  },
1724
2110
  item.id
1725
2111
  );
1726
2112
  };
1727
- const renderNavigationGrid = (items) => /* @__PURE__ */ jsx18("div", { className: "grid grid-cols-2 gap-3", children: items.map((item) => /* @__PURE__ */ jsx18(React4.Fragment, { children: renderNavigationItem(item, true) }, item.id)) });
1728
- return /* @__PURE__ */ jsxs16(Fragment8, { children: [
1729
- /* @__PURE__ */ jsx18(
2113
+ const renderNavigationGrid = (items) => /* @__PURE__ */ jsx19("div", { className: "grid grid-cols-2 gap-3", children: items.map((item) => /* @__PURE__ */ jsx19(React4.Fragment, { children: renderNavigationItem(item, true) }, item.id)) });
2114
+ return /* @__PURE__ */ jsxs17(Fragment8, { children: [
2115
+ /* @__PURE__ */ jsx19(
1730
2116
  "div",
1731
2117
  {
1732
2118
  className: cn(
@@ -1740,7 +2126,7 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1740
2126
  "aria-hidden": "true"
1741
2127
  }
1742
2128
  ),
1743
- /* @__PURE__ */ jsx18(
2129
+ /* @__PURE__ */ jsx19(
1744
2130
  "div",
1745
2131
  {
1746
2132
  ref: panelRef,
@@ -1761,8 +2147,8 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1761
2147
  "aria-label": "Mobile navigation menu",
1762
2148
  tabIndex: -1,
1763
2149
  inert: !isOpen || void 0,
1764
- children: /* @__PURE__ */ jsxs16("div", { className: "flex flex-1 flex-col gap-4 overflow-y-auto overflow-x-hidden overscroll-contain p-4", children: [
1765
- user && /* @__PURE__ */ jsxs16(
2150
+ children: /* @__PURE__ */ jsxs17("div", { className: "flex flex-1 flex-col gap-4 overflow-y-auto overflow-x-hidden overscroll-contain p-4", children: [
2151
+ user && /* @__PURE__ */ jsxs17(
1766
2152
  "div",
1767
2153
  {
1768
2154
  className: cn(
@@ -1771,7 +2157,7 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1771
2157
  ),
1772
2158
  "aria-disabled": disabled || void 0,
1773
2159
  children: [
1774
- /* @__PURE__ */ jsx18(
2160
+ /* @__PURE__ */ jsx19(
1775
2161
  SquareAvatar,
1776
2162
  {
1777
2163
  src: user.userAvatarUrl || void 0,
@@ -1782,24 +2168,24 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1782
2168
  className: "h-14 w-14 shrink-0"
1783
2169
  }
1784
2170
  ),
1785
- /* @__PURE__ */ jsxs16("div", { className: "flex min-w-0 flex-1 flex-col", children: [
1786
- /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2", children: [
1787
- /* @__PURE__ */ jsx18("span", { className: "truncate text-ods-text-primary text-h6", children: user.userName || "User" }),
1788
- user.userRole && /* @__PURE__ */ jsx18("span", { className: "shrink-0 rounded-md border border-ods-border bg-ods-card px-2 py-0.5 uppercase text-ods-text-primary text-h6", children: user.userRole })
2171
+ /* @__PURE__ */ jsxs17("div", { className: "flex min-w-0 flex-1 flex-col", children: [
2172
+ /* @__PURE__ */ jsxs17("div", { className: "flex items-center gap-2", children: [
2173
+ /* @__PURE__ */ jsx19("span", { className: "truncate text-ods-text-primary text-h6", children: user.userName || "User" }),
2174
+ user.userRole && /* @__PURE__ */ jsx19("span", { className: "shrink-0 rounded-md border border-ods-border bg-ods-card px-2 py-0.5 uppercase text-ods-text-primary text-h6", children: user.userRole })
1789
2175
  ] }),
1790
- user.userEmail && /* @__PURE__ */ jsx18("span", { className: "truncate text-ods-text-secondary text-h6", children: user.userEmail })
2176
+ user.userEmail && /* @__PURE__ */ jsx19("span", { className: "truncate text-ods-text-secondary text-h6", children: user.userEmail })
1791
2177
  ] }),
1792
- /* @__PURE__ */ jsxs16("div", { className: "flex shrink-0 items-center gap-2", children: [
1793
- onSearchUser && /* @__PURE__ */ jsx18(Button, { size: "icon", onClick: onSearchUser, variant: "outline", "aria-label": "Search users", children: /* @__PURE__ */ jsx18(UserSearchIcon, { className: "size-4 text-ods-text-primary" }) }),
1794
- onEditProfile && /* @__PURE__ */ jsx18(Button, { size: "icon", onClick: onEditProfile, variant: "outline", "aria-label": "Edit profile", children: /* @__PURE__ */ jsx18(PenEditIcon, { className: "size-4 text-ods-text-primary" }) })
2178
+ /* @__PURE__ */ jsxs17("div", { className: "flex shrink-0 items-center gap-2", children: [
2179
+ onSearchUser && /* @__PURE__ */ jsx19(Button, { size: "icon", onClick: onSearchUser, variant: "outline", "aria-label": "Search users", children: /* @__PURE__ */ jsx19(UserSearchIcon, { className: "size-4 text-ods-text-primary" }) }),
2180
+ onEditProfile && /* @__PURE__ */ jsx19(Button, { size: "icon", onClick: onEditProfile, variant: "outline", "aria-label": "Edit profile", children: /* @__PURE__ */ jsx19(PenEditIcon, { className: "size-4 text-ods-text-primary" }) })
1795
2181
  ] })
1796
2182
  ]
1797
2183
  }
1798
2184
  ),
1799
2185
  config.topSlot?.({ minimized: false }),
1800
- /* @__PURE__ */ jsx18("nav", { "aria-label": "Primary navigation", children: renderNavigationGrid(primaryItems) }),
1801
- secondaryItems.length > 0 && /* @__PURE__ */ jsx18("nav", { "aria-label": "Secondary navigation", className: "flex flex-col gap-3", children: secondaryItems.map((item) => /* @__PURE__ */ jsx18(React4.Fragment, { children: renderNavigationItem(item, false) }, item.id)) }),
1802
- onLogout && /* @__PURE__ */ jsxs16(
2186
+ /* @__PURE__ */ jsx19("nav", { "aria-label": "Primary navigation", children: renderNavigationGrid(primaryItems) }),
2187
+ secondaryItems.length > 0 && /* @__PURE__ */ jsx19("nav", { "aria-label": "Secondary navigation", className: "flex flex-col gap-3", children: secondaryItems.map((item) => /* @__PURE__ */ jsx19(React4.Fragment, { children: renderNavigationItem(item, false) }, item.id)) }),
2188
+ onLogout && /* @__PURE__ */ jsxs17(
1803
2189
  "button",
1804
2190
  {
1805
2191
  onClick: onLogout,
@@ -1810,8 +2196,8 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1810
2196
  disabled && "cursor-not-allowed opacity-50"
1811
2197
  ),
1812
2198
  children: [
1813
- /* @__PURE__ */ jsx18(Logout02Icon, { className: "size-4 text-ods-error" }),
1814
- /* @__PURE__ */ jsx18("span", { className: "flex-1 text-left text-ods-text-primary text-h6", children: "Log Out" })
2199
+ /* @__PURE__ */ jsx19(Logout02Icon, { className: "size-4 text-ods-error" }),
2200
+ /* @__PURE__ */ jsx19("span", { className: "flex-1 text-left text-ods-text-primary text-h6", children: "Log Out" })
1815
2201
  ]
1816
2202
  }
1817
2203
  )
@@ -1822,7 +2208,7 @@ var MobileBurgerMenu = React4.memo(function MobileBurgerMenuImpl({
1822
2208
  });
1823
2209
 
1824
2210
  // src/components/navigation/app-layout.tsx
1825
- import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
2211
+ import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
1826
2212
  function AppLayout({
1827
2213
  children,
1828
2214
  sidebarConfig,
@@ -1832,15 +2218,36 @@ function AppLayout({
1832
2218
  mobileBurgerMenuProps,
1833
2219
  disabled = false,
1834
2220
  drawer,
1835
- topBar
2221
+ topBar,
2222
+ sidePanel
1836
2223
  }) {
1837
- const [mobileMenuOpen, setMobileMenuOpen] = useState4(false);
1838
- const [drawerContainer, setDrawerContainer] = useState4(null);
1839
- const mobileMenuOpenRef = useRef5(mobileMenuOpen);
1840
- useEffect3(() => {
2224
+ const [mobileMenuOpen, setMobileMenuOpen] = useState5(false);
2225
+ const [drawerContainer, setDrawerContainer] = useState5(null);
2226
+ const [mainElement, setMainElement] = useState5(null);
2227
+ const [contentWidth, setContentWidth] = useState5(null);
2228
+ const hasSidePanel = sidePanel !== void 0;
2229
+ const sidePanelState = useAppLayoutSidePanel(sidePanel, drawerContainer);
2230
+ useIsomorphicLayoutEffect(() => {
2231
+ if (!hasSidePanel || !mainElement) return void 0;
2232
+ const update = () => setContentWidth(mainElement.clientWidth);
2233
+ update();
2234
+ const observer = new ResizeObserver(update);
2235
+ observer.observe(mainElement);
2236
+ return () => observer.disconnect();
2237
+ }, [hasSidePanel, mainElement]);
2238
+ const resolvedHeaderProps = sidePanelState === null ? headerProps : {
2239
+ ...headerProps,
2240
+ showMingoAI: !sidePanelState.canDock,
2241
+ onMingoAI: sidePanelState.toggle,
2242
+ isMingoAIActive: sidePanelState.isOpen,
2243
+ mingoAICloseWhenActive: true
2244
+ };
2245
+ const contentCovered = sidePanelState?.coversContent === true;
2246
+ const mobileMenuOpenRef = useRef6(mobileMenuOpen);
2247
+ useEffect4(() => {
1841
2248
  mobileMenuOpenRef.current = mobileMenuOpen;
1842
2249
  });
1843
- const drawerHandlesRef = useRef5(/* @__PURE__ */ new Set());
2250
+ const drawerHandlesRef = useRef6(/* @__PURE__ */ new Set());
1844
2251
  const handleToggleMobileMenu = useCallback3(() => {
1845
2252
  const opening = !mobileMenuOpenRef.current;
1846
2253
  if (opening) {
@@ -1866,11 +2273,11 @@ function AppLayout({
1866
2273
  }),
1867
2274
  []
1868
2275
  );
1869
- return /* @__PURE__ */ jsx19(AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ jsx19(AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ jsxs17("div", { className: cn("flex h-screen flex-col bg-ods-bg", className), children: [
2276
+ return /* @__PURE__ */ jsx20(AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ jsx20(AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ jsxs18("div", { className: cn("flex h-screen flex-col bg-ods-bg", className), children: [
1870
2277
  topBar,
1871
- /* @__PURE__ */ jsxs17("div", { className: "relative flex min-h-0 flex-1", children: [
1872
- /* @__PURE__ */ jsx19(NavigationSidebar, { config: sidebarConfig, disabled }),
1873
- /* @__PURE__ */ jsx19(
2278
+ /* @__PURE__ */ jsxs18("div", { className: "relative flex min-h-0 flex-1", children: [
2279
+ /* @__PURE__ */ jsx20(NavigationSidebar, { config: sidebarConfig, disabled, pushOnTablet: hasSidePanel }),
2280
+ /* @__PURE__ */ jsx20(
1874
2281
  MobileBurgerMenu,
1875
2282
  {
1876
2283
  ...mobileBurgerMenuProps,
@@ -1880,21 +2287,47 @@ function AppLayout({
1880
2287
  disabled
1881
2288
  }
1882
2289
  ),
1883
- /* @__PURE__ */ jsxs17("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
1884
- /* @__PURE__ */ jsx19(
2290
+ /* @__PURE__ */ jsxs18("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
2291
+ /* @__PURE__ */ jsx20(
1885
2292
  AppHeader,
1886
2293
  {
1887
- ...headerProps,
2294
+ ...resolvedHeaderProps,
1888
2295
  isMobileMenuOpen: mobileMenuOpen,
1889
2296
  onToggleMobileMenu: handleToggleMobileMenu,
1890
2297
  disabled
1891
2298
  }
1892
2299
  ),
1893
- /* @__PURE__ */ jsx19(NotificationDrawer, {}),
1894
- /* @__PURE__ */ jsxs17("div", { ref: setDrawerContainer, className: "relative flex flex-1 flex-col overflow-hidden", children: [
1895
- /* @__PURE__ */ jsx19("main", { className: cn("flex-1 overflow-y-auto", mainClassName), children }),
1896
- drawer
1897
- ] })
2300
+ /* @__PURE__ */ jsx20(NotificationDrawer, {}),
2301
+ /* @__PURE__ */ jsxs18(
2302
+ "div",
2303
+ {
2304
+ ref: setDrawerContainer,
2305
+ className: cn("relative flex flex-1 overflow-hidden", sidePanel ? "flex-row" : "flex-col"),
2306
+ children: [
2307
+ sidePanel ? (
2308
+ // `hidden` while the panel covers the area: the page stays
2309
+ // mounted, it just takes no room.
2310
+ /* @__PURE__ */ jsx20(
2311
+ "main",
2312
+ {
2313
+ ref: setMainElement,
2314
+ className: cn(
2315
+ "ods-content-area min-w-0 flex-1 overflow-y-auto",
2316
+ contentCovered && "hidden",
2317
+ // While the panel is drawn over the page, keep the page's own
2318
+ // z-indexed layers (sticky headers, fixed bars) under it.
2319
+ sidePanelState?.overlapsContent && "isolate",
2320
+ mainClassName
2321
+ ),
2322
+ children: /* @__PURE__ */ jsx20(ContentAreaWidthContext.Provider, { value: contentWidth, children: /* @__PURE__ */ jsx20("div", { className: "ods-content-scope", children }) })
2323
+ }
2324
+ )
2325
+ ) : /* @__PURE__ */ jsx20("main", { className: cn("flex-1 overflow-y-auto", mainClassName), children }),
2326
+ sidePanel && sidePanelState && /* @__PURE__ */ jsx20(AppLayoutSidePanel, { config: sidePanel, state: sidePanelState }),
2327
+ drawer
2328
+ ]
2329
+ }
2330
+ )
1898
2331
  ] })
1899
2332
  ] })
1900
2333
  ] }) }) });