@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 strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
2
2
 
3
3
 
4
- var _chunkYBGEPKC2cjs = require('./chunk-YBGEPKC2.cjs');
4
+ var _chunkF7Y2ZS5Ucjs = require('./chunk-F7Y2ZS5U.cjs');
5
5
 
6
6
 
7
7
 
@@ -13,20 +13,18 @@ var _chunkYBGEPKC2cjs = require('./chunk-YBGEPKC2.cjs');
13
13
 
14
14
 
15
15
 
16
- var _chunkMXHJROXJcjs = require('./chunk-MXHJROXJ.cjs');
16
+ var _chunkP23CRLU4cjs = require('./chunk-P23CRLU4.cjs');
17
17
 
18
18
 
19
19
 
20
- var _chunk3L7KCOGOcjs = require('./chunk-3L7KCOGO.cjs');
20
+ var _chunk2QEUFXNScjs = require('./chunk-2QEUFXNS.cjs');
21
21
 
22
22
 
23
23
 
24
- var _chunkHY5YL3U5cjs = require('./chunk-HY5YL3U5.cjs');
24
+ var _chunkXBWE423Rcjs = require('./chunk-XBWE423R.cjs');
25
25
 
26
26
 
27
-
28
-
29
- var _chunkIIMICN7Lcjs = require('./chunk-IIMICN7L.cjs');
27
+ var _chunkTYWLNCNHcjs = require('./chunk-TYWLNCNH.cjs');
30
28
 
31
29
 
32
30
 
@@ -47,10 +45,15 @@ var _chunkN3COXDBHcjs = require('./chunk-N3COXDBH.cjs');
47
45
 
48
46
 
49
47
 
50
- var _chunkEMCQGFXDcjs = require('./chunk-EMCQGFXD.cjs');
48
+ var _chunkMMOODW57cjs = require('./chunk-MMOODW57.cjs');
49
+
50
+
51
51
 
52
52
 
53
- var _chunkMDBHZBW7cjs = require('./chunk-MDBHZBW7.cjs');
53
+
54
+
55
+
56
+ var _chunkRKV5B7EUcjs = require('./chunk-RKV5B7EU.cjs');
54
57
 
55
58
 
56
59
  var _chunkQZVSJF2Kcjs = require('./chunk-QZVSJF2K.cjs');
@@ -59,7 +62,7 @@ var _chunkQZVSJF2Kcjs = require('./chunk-QZVSJF2K.cjs');
59
62
 
60
63
 
61
64
 
62
- var _chunk2A4XES7Rcjs = require('./chunk-2A4XES7R.cjs');
65
+ var _chunkBM5MVGH3cjs = require('./chunk-BM5MVGH3.cjs');
63
66
 
64
67
 
65
68
  var _chunk4GFNWALLcjs = require('./chunk-4GFNWALL.cjs');
@@ -135,8 +138,8 @@ var MOBILE_NAV_PANEL_ID = "mobile-nav-panel";
135
138
  function MobileNavPanel({ isOpen, config }) {
136
139
  const panelRef = _react.useRef.call(void 0, null);
137
140
  _overlays.usePreventScroll.call(void 0, { isDisabled: !isOpen });
138
- _chunk3L7KCOGOcjs.useFocusTrap.call(void 0, panelRef, isOpen, { onEscape: config.onClose });
139
- const headerHeight = _chunkIIMICN7Lcjs.useHeaderHeight.call(void 0, 64, { enabled: isOpen });
141
+ _chunk2QEUFXNScjs.useFocusTrap.call(void 0, panelRef, isOpen, { onEscape: config.onClose });
142
+ const headerHeight = _chunkTYWLNCNHcjs.useHeaderHeight.call(void 0, 64, { enabled: isOpen });
140
143
  if (!isOpen) return null;
141
144
  const renderNavigationItem = (item) => {
142
145
  if (item.element) {
@@ -187,7 +190,7 @@ function MobileNavPanel({ isOpen, config }) {
187
190
  );
188
191
  };
189
192
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
190
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "fixed inset-0 z-[9998]", _chunkHY5YL3U5cjs.OVERLAY_BACKDROP_CLASS), onClick: config.onClose }),
193
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "fixed inset-0 z-[9998]", _chunkXBWE423Rcjs.OVERLAY_BACKDROP_CLASS), onClick: config.onClose }),
191
194
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
192
195
  "div",
193
196
  {
@@ -242,16 +245,16 @@ function MobileNavPanel({ isOpen, config }) {
242
245
  // src/components/navigation/ticket-alerts-button.tsx
243
246
 
244
247
  function TicketAlertsButton({ href, onNavigate, disabled, className }) {
245
- const live = _chunkYBGEPKC2cjs.useOptionalTicketLive.call(void 0, );
248
+ const live = _chunkF7Y2ZS5Ucjs.useOptionalTicketLive.call(void 0, );
246
249
  if (!live || !live.authed || live.unreadTotal === 0) return null;
247
250
  const targetId = live.nextUnreadTicketId;
248
- const target = targetId ? _chunkMXHJROXJcjs.buildTicketOpenHref.call(void 0, href, targetId) : href;
251
+ const target = targetId ? _chunkP23CRLU4cjs.buildTicketOpenHref.call(void 0, href, targetId) : href;
249
252
  const handleClick = () => {
250
253
  if (onNavigate) onNavigate(target);
251
254
  else window.location.assign(target);
252
255
  };
253
256
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
254
- _chunkMXHJROXJcjs.HeaderButton,
257
+ _chunkP23CRLU4cjs.HeaderButton,
255
258
  {
256
259
  icon: (
257
260
  // Glyph inherits HeaderButton's standard cell coloring (secondary at
@@ -261,7 +264,7 @@ function TicketAlertsButton({ href, onNavigate, disabled, className }) {
261
264
  // existing while updates are unread — never by tinting the glyph.
262
265
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "relative inline-flex", children: [
263
266
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.LifeBuoyIcon, { className: "h-6 w-6" }),
264
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkMXHJROXJcjs.UnreadCountBadge, { count: live.unreadTotal })
267
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP23CRLU4cjs.UnreadCountBadge, { count: live.unreadTotal })
265
268
  ] })
266
269
  ),
267
270
  "aria-label": `Support tickets \u2014 ${live.unreadTotal} unread ${live.unreadTotal === 1 ? "update" : "updates"}`,
@@ -579,7 +582,7 @@ function Header({ config }) {
579
582
  leading: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
580
583
  !!_optionalChain([config, 'access', _12 => _12.actions, 'optionalAccess', _13 => _13.left, 'optionalAccess', _14 => _14.length]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-full items-center border-r border-ods-border", children: config.actions.left }),
581
584
  _optionalChain([config, 'access', _15 => _15.mobile, 'optionalAccess', _16 => _16.enabled]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
582
- _chunkMXHJROXJcjs.HeaderButton,
585
+ _chunkP23CRLU4cjs.HeaderButton,
583
586
  {
584
587
  className: "border-r border-ods-border lg:hidden",
585
588
  onClick: () => {
@@ -680,7 +683,7 @@ function HeaderSkeleton({ config }) {
680
683
  // src/components/navigation/client-only-header.tsx
681
684
 
682
685
  function ClientOnlyHeader({ config, skeleton }) {
683
- const isClient = _chunkHY5YL3U5cjs.useIsHydrated.call(void 0, );
686
+ const isClient = _chunkXBWE423Rcjs.useIsHydrated.call(void 0, );
684
687
  if (!isClient) {
685
688
  return skeleton || /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HeaderSkeleton, { config });
686
689
  }
@@ -694,12 +697,12 @@ var _framermotion = require('framer-motion');
694
697
 
695
698
  function SlidingSidebar({ config }) {
696
699
  const [expandedItems, setExpandedItems] = _react.useState.call(void 0, /* @__PURE__ */ new Set());
697
- const mounted = _chunkHY5YL3U5cjs.useIsHydrated.call(void 0, );
698
- const headerHeight = _chunkIIMICN7Lcjs.useHeaderHeight.call(void 0, );
700
+ const mounted = _chunkXBWE423Rcjs.useIsHydrated.call(void 0, );
701
+ const headerHeight = _chunkTYWLNCNHcjs.useHeaderHeight.call(void 0, );
699
702
  const asideRef = _react.useRef.call(void 0, null);
700
703
  const prefersReducedMotion = _framermotion.useReducedMotion.call(void 0, );
701
704
  _overlays.usePreventScroll.call(void 0, { isDisabled: !config.isOpen });
702
- _chunk3L7KCOGOcjs.useFocusTrap.call(void 0, asideRef, config.isOpen, { onEscape: config.onClose, contain: false });
705
+ _chunk2QEUFXNScjs.useFocusTrap.call(void 0, asideRef, config.isOpen, { onEscape: config.onClose, contain: false });
703
706
  const toggleExpanded = (itemId) => {
704
707
  const newExpanded = new Set(expandedItems);
705
708
  if (newExpanded.has(itemId)) {
@@ -826,7 +829,7 @@ function SlidingSidebar({ config }) {
826
829
  duration: 0.3,
827
830
  ease: [0.4, 0, 0.2, 1]
828
831
  },
829
- className: _chunk3ATAYP36cjs.cn.call(void 0, "fixed inset-0 z-[45]", _chunkHY5YL3U5cjs.OVERLAY_BACKDROP_CLASS),
832
+ className: _chunk3ATAYP36cjs.cn.call(void 0, "fixed inset-0 z-[45]", _chunkXBWE423Rcjs.OVERLAY_BACKDROP_CLASS),
830
833
  onClick: () => config.onClose()
831
834
  }
832
835
  ) }),
@@ -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: _chunk3ATAYP36cjs.cn.call(void 0,
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
  ),
@@ -901,7 +905,7 @@ function NavigationSidebarHeader({ minimized }) {
901
905
 
902
906
  function NavigationItemBadge({ label, compact = false, className, ...rest }) {
903
907
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
904
- _chunkEMCQGFXDcjs.Tag,
908
+ _chunkMMOODW57cjs.Tag,
905
909
  {
906
910
  as: "span",
907
911
  label,
@@ -966,7 +970,7 @@ var NavigationSidebarItemButton = _react.memo.call(void 0, function NavigationSi
966
970
  _react.cloneElement.call(void 0, item.icon, {
967
971
  color: isActive && !disabled ? "text-ods-accent" : "text-ods-text-secondary"
968
972
  }),
969
- hasUnread && !showLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkMXHJROXJcjs.UnreadDot, { size: "fixed" })
973
+ hasUnread && !showLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP23CRLU4cjs.UnreadDot, { size: "fixed" })
970
974
  ] }),
971
975
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
972
976
  "span",
@@ -1056,18 +1060,18 @@ 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 }) {
1060
- const isMdUp = _nullishCoalesce(_chunkIIMICN7Lcjs.useMdUp.call(void 0, ), () => ( false));
1061
- const isLgUp = _nullishCoalesce(_chunkIIMICN7Lcjs.useLgUp.call(void 0, ), () => ( false));
1063
+ function NavigationSidebar({ config, disabled = false, pushOnTablet = false }) {
1064
+ const isMdUp = _nullishCoalesce(_chunkRKV5B7EUcjs.useMdUp.call(void 0, ), () => ( false));
1065
+ const isLgUp = _nullishCoalesce(_chunkRKV5B7EUcjs.useLgUp.call(void 0, ), () => ( false));
1062
1066
  const isTablet = isMdUp && !isLgUp;
1063
- const [desktopMinimized, setDesktopMinimized] = _chunk3L7KCOGOcjs.useLocalStorage.call(void 0, STORAGE_KEY, _nullishCoalesce(config.minimized, () => ( false)));
1067
+ const [desktopMinimized, setDesktopMinimized] = _chunk2QEUFXNScjs.useLocalStorage.call(void 0, STORAGE_KEY, _nullishCoalesce(config.minimized, () => ( false)));
1064
1068
  const [tabletMinimized, setTabletMinimized] = _react.useState.call(void 0, true);
1065
1069
  const [tabletFor, setTabletFor] = _react.useState.call(void 0, isTablet);
1066
1070
  if (tabletFor !== isTablet) {
1067
1071
  setTabletFor(isTablet);
1068
1072
  if (isTablet) setTabletMinimized(true);
1069
1073
  }
1070
- const hydrated = _chunkHY5YL3U5cjs.useIsHydrated.call(void 0, );
1074
+ const hydrated = _chunkXBWE423Rcjs.useIsHydrated.call(void 0, );
1071
1075
  const minimized = hydrated ? isTablet ? tabletMinimized : desktopMinimized : _nullishCoalesce(config.minimized, () => ( false));
1072
1076
  const [transitionsEnabled, setTransitionsEnabled] = _react.useState.call(void 0, false);
1073
1077
  const isOverlayOpen = isTablet && !minimized;
@@ -1134,10 +1138,10 @@ function NavigationSidebar({ config, disabled = false }) {
1134
1138
  };
1135
1139
  }, [config.loading, _optionalChain([config, 'access', _82 => _82.loadingRows, 'optionalAccess', _83 => _83.primary]), _optionalChain([config, 'access', _84 => _84.loadingRows, 'optionalAccess', _85 => _85.secondary])]);
1136
1140
  const sidebarWidth = _react.useMemo.call(void 0, () => minimized ? `${MINIMIZED_WIDTH}px` : `${EXPANDED_WIDTH}px`, [minimized]);
1137
- _chunkMDBHZBW7cjs.useIsomorphicLayoutEffect.call(void 0, () => {
1141
+ _chunkRKV5B7EUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
1138
1142
  document.documentElement.style.setProperty(NAVIGATION_SIDEBAR_WIDTH_VAR, sidebarWidth);
1139
1143
  }, [sidebarWidth]);
1140
- _chunkMDBHZBW7cjs.useIsomorphicLayoutEffect.call(void 0, () => {
1144
+ _chunkRKV5B7EUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
1141
1145
  if (transitionsEnabled) return void 0;
1142
1146
  const id = requestAnimationFrame(() => {
1143
1147
  setTransitionsEnabled(true);
@@ -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__ */ _jsxruntime.jsx.call(void 0, "div", { className: "hidden h-full w-14 flex-shrink-0 md:block lg:hidden", "aria-hidden": "true" }),
1165
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1166
+ "div",
1167
+ {
1168
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsxs.call(void 0,
1163
1177
  "aside",
1164
1178
  {
@@ -1249,7 +1263,7 @@ function HeaderGlobalSearch({
1249
1263
  "form",
1250
1264
  {
1251
1265
  onSubmit: handleSubmit,
1252
- ..._chunkMXHJROXJcjs.HUBSPOT_DO_NOT_COLLECT_FORM_PROPS,
1266
+ ..._chunkP23CRLU4cjs.HUBSPOT_DO_NOT_COLLECT_FORM_PROPS,
1253
1267
  className: _chunk3ATAYP36cjs.cn.call(void 0,
1254
1268
  "flex h-full flex-1 items-center gap-2 px-3",
1255
1269
  // Transparent so the cell inherits the bar's background
@@ -1282,12 +1296,19 @@ function HeaderGlobalSearch({
1282
1296
 
1283
1297
  // src/components/navigation/header-mingo-button.tsx
1284
1298
 
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__ */ _jsxruntime.jsxs.call(void 0,
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: _chunk3ATAYP36cjs.cn.call(void 0,
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.
@@ -1341,8 +1362,8 @@ function HeaderOrganizationFilter({
1341
1362
  const selectedOrg = organizations.find((o) => o.id === selectedOrgId);
1342
1363
  const displayName = _optionalChain([selectedOrg, 'optionalAccess', _90 => _90.name]) || "All Organizations";
1343
1364
  const deviceCount = _nullishCoalesce(_optionalChain([selectedOrg, 'optionalAccess', _91 => _91.deviceCount]), () => ( totalDeviceCount));
1344
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2A4XES7Rcjs.DropdownMenu, { children: [
1345
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2A4XES7Rcjs.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1365
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkBM5MVGH3cjs.DropdownMenu, { children: [
1366
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1346
1367
  "button",
1347
1368
  {
1348
1369
  className: _chunk3ATAYP36cjs.cn.call(void 0,
@@ -1365,9 +1386,9 @@ function HeaderOrganizationFilter({
1365
1386
  ]
1366
1387
  }
1367
1388
  ) }),
1368
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2A4XES7Rcjs.DropdownMenuContent, { align: "end", className: "min-w-[240px]", children: [
1369
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2A4XES7Rcjs.DropdownMenuItem, { onClick: () => _optionalChain([onOrgChange, 'optionalCall', _92 => _92("")]), children: "All Organizations" }),
1370
- organizations.map((org) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2A4XES7Rcjs.DropdownMenuItem, { onClick: () => _optionalChain([onOrgChange, 'optionalCall', _93 => _93(org.id)]), children: org.name }, org.id))
1389
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuContent, { align: "end", className: "min-w-[240px]", children: [
1390
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuItem, { onClick: () => _optionalChain([onOrgChange, 'optionalCall', _92 => _92("")]), children: "All Organizations" }),
1391
+ organizations.map((org) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuItem, { onClick: () => _optionalChain([onOrgChange, 'optionalCall', _93 => _93(org.id)]), children: org.name }, org.id))
1371
1392
  ] })
1372
1393
  ] });
1373
1394
  }
@@ -1390,6 +1411,7 @@ var AppHeader = _react2.default.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,
@@ -1403,7 +1425,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1403
1425
  loading = false,
1404
1426
  loadingActionCells
1405
1427
  }) {
1406
- const isMdUp = _nullishCoalesce(_chunkIIMICN7Lcjs.useMdUp.call(void 0, ), () => ( false));
1428
+ const isMdUp = _nullishCoalesce(_chunkRKV5B7EUcjs.useMdUp.call(void 0, ), () => ( false));
1407
1429
  if (loading) {
1408
1430
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1409
1431
  AppHeaderSkeleton,
@@ -1436,7 +1458,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1436
1458
  leading: (
1437
1459
  // Mobile: Burger Menu Button
1438
1460
  !isMdUp && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1439
- _chunkMXHJROXJcjs.HeaderButton,
1461
+ _chunkP23CRLU4cjs.HeaderButton,
1440
1462
  {
1441
1463
  onClick: onToggleMobileMenu,
1442
1464
  isActive: isMobileMenuOpen,
@@ -1462,7 +1484,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1462
1484
  center: showSearch ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HeaderGlobalSearch, { onSubmit: onSearch, className: _chunk3ATAYP36cjs.cn.call(void 0, "w-full", dimmedClass) }) : void 0,
1463
1485
  sideActions: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
1464
1486
  showSearch && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1465
- _chunkMXHJROXJcjs.HeaderButton,
1487
+ _chunkP23CRLU4cjs.HeaderButton,
1466
1488
  {
1467
1489
  icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4GFNWALLcjs.SearchIcon, { className: "h-6 w-6" }),
1468
1490
  "aria-label": "Search",
@@ -1479,7 +1501,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1479
1501
  className: _chunk3ATAYP36cjs.cn.call(void 0, "hidden lg:flex", dimmedClass)
1480
1502
  }
1481
1503
  ),
1482
- showTimeTracker && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkMXHJROXJcjs.TimeTrackerHeaderButton, { disabled, className: _chunk3ATAYP36cjs.cn.call(void 0, cellDivider, dimmedClass) }),
1504
+ showTimeTracker && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP23CRLU4cjs.TimeTrackerHeaderButton, { disabled, className: _chunk3ATAYP36cjs.cn.call(void 0, cellDivider, dimmedClass) }),
1483
1505
  showNotifications && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1484
1506
  NotificationsHeaderButton,
1485
1507
  {
@@ -1497,12 +1519,12 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1497
1519
  className: _chunk3ATAYP36cjs.cn.call(void 0, cellDivider, dimmedClass)
1498
1520
  }
1499
1521
  ),
1500
- isMdUp && showUser && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk2A4XES7Rcjs.DropdownMenu, { children: [
1501
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2A4XES7Rcjs.DropdownMenuTrigger, { asChild: true, disabled, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1502
- _chunkMXHJROXJcjs.HeaderButton,
1522
+ isMdUp && showUser && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkBM5MVGH3cjs.DropdownMenu, { children: [
1523
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBM5MVGH3cjs.DropdownMenuTrigger, { asChild: true, disabled, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1524
+ _chunkP23CRLU4cjs.HeaderButton,
1503
1525
  {
1504
1526
  icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1505
- _chunkEMCQGFXDcjs.SquareAvatar,
1527
+ _chunkMMOODW57cjs.SquareAvatar,
1506
1528
  {
1507
1529
  src: userAvatarUrl || void 0,
1508
1530
  alt: userName || "User",
@@ -1521,14 +1543,14 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1521
1543
  }
1522
1544
  ) }),
1523
1545
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
1524
- _chunk2A4XES7Rcjs.DropdownMenuContent,
1546
+ _chunkBM5MVGH3cjs.DropdownMenuContent,
1525
1547
  {
1526
1548
  align: "end",
1527
1549
  className: "z-[104] w-[280px] overflow-hidden rounded-[6px] border-ods-border bg-ods-bg p-0",
1528
1550
  children: [
1529
1551
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2 border-b border-ods-border bg-ods-card p-3", children: [
1530
1552
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1531
- _chunkEMCQGFXDcjs.SquareAvatar,
1553
+ _chunkMMOODW57cjs.SquareAvatar,
1532
1554
  {
1533
1555
  src: userAvatarUrl || void 0,
1534
1556
  alt: userName || "User",
@@ -1543,7 +1565,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1543
1565
  ] })
1544
1566
  ] }),
1545
1567
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1546
- _chunk2A4XES7Rcjs.DropdownMenuItem,
1568
+ _chunkBM5MVGH3cjs.DropdownMenuItem,
1547
1569
  {
1548
1570
  onClick: onProfile,
1549
1571
  className: "cursor-pointer rounded-none border-b border-ods-border bg-ods-card px-3 py-3 hover:bg-ods-card/80 focus:bg-ods-card/80",
@@ -1554,7 +1576,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1554
1576
  }
1555
1577
  ),
1556
1578
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1557
- _chunk2A4XES7Rcjs.DropdownMenuItem,
1579
+ _chunkBM5MVGH3cjs.DropdownMenuItem,
1558
1580
  {
1559
1581
  onClick: onLogout,
1560
1582
  className: "cursor-pointer rounded-none bg-ods-card px-3 py-3 hover:bg-ods-card/80 focus:bg-ods-card/80",
@@ -1573,6 +1595,7 @@ var AppHeader = _react2.default.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: _chunk3ATAYP36cjs.cn.call(void 0, cellDivider, dimmedClass)
@@ -1583,12 +1606,12 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1583
1606
  );
1584
1607
  });
1585
1608
  function NotificationsHeaderButton({ fallbackUnreadCount, disabled, dimmedClass }) {
1586
- const ctx = _chunkMXHJROXJcjs.useOptionalNotifications.call(void 0, );
1609
+ const ctx = _chunkP23CRLU4cjs.useOptionalNotifications.call(void 0, );
1587
1610
  const hasUnread = (_nullishCoalesce(_optionalChain([ctx, 'optionalAccess', _94 => _94.unreadCount]), () => ( fallbackUnreadCount))) > 0;
1588
1611
  const isActive = _nullishCoalesce(_optionalChain([ctx, 'optionalAccess', _95 => _95.isOpen]), () => ( false));
1589
1612
  const onClick = _optionalChain([ctx, 'optionalAccess', _96 => _96.toggle]);
1590
1613
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1591
- _chunkMXHJROXJcjs.HeaderButton,
1614
+ _chunkP23CRLU4cjs.HeaderButton,
1592
1615
  {
1593
1616
  icon: isActive ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.BellIcon, { className: "h-6 w-6" }),
1594
1617
  showUnreadDot: !isActive && hasUnread,
@@ -1649,6 +1672,369 @@ function AppHeaderSkeleton({
1649
1672
  // src/components/navigation/app-layout.tsx
1650
1673
 
1651
1674
 
1675
+ // src/components/navigation/app-layout-side-panel.tsx
1676
+
1677
+
1678
+
1679
+
1680
+
1681
+
1682
+
1683
+
1684
+ var SIDE_PANEL_INSET = 16;
1685
+ var MOBILE_QUERY = `not all and ${_chunkRKV5B7EUcjs.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 (e2) {
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 = _react.useSyncExternalStore.call(void 0,
1732
+ subscribeToStoredSize,
1733
+ () => {
1734
+ if (!storageKey) return null;
1735
+ try {
1736
+ return window.localStorage.getItem(storageKey);
1737
+ } catch (e3) {
1738
+ return null;
1739
+ }
1740
+ },
1741
+ () => null
1742
+ );
1743
+ const [sessionSize, setSessionSize] = _react.useState.call(void 0, null);
1744
+ const size = _nullishCoalesce((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 (e4) {
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 = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _97 => _97.minWidth]), () => ( 0));
1762
+ const minContentWidth = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _98 => _98.minContentWidth]), () => ( 400));
1763
+ const collapsed = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _99 => _99.collapsed]), () => ( false));
1764
+ const minimum = { width: minWidth, expanded: false };
1765
+ const [rowWidth, setRowWidth] = _react.useState.call(void 0, 0);
1766
+ _chunkRKV5B7EUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
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 = _chunkRKV5B7EUcjs.useMediaQuery.call(void 0, MOBILE_QUERY) === true;
1775
+ const reduceMotion = _chunkRKV5B7EUcjs.useMediaQuery.call(void 0, REDUCED_MOTION_QUERY) === true;
1776
+ const [morph, setMorph] = _react.useState.call(void 0, null);
1777
+ const [liveWidth, setLiveWidth] = _react.useState.call(void 0, null);
1778
+ const [storedSize, setStoredSize] = useStoredSize(_optionalChain([config, 'optionalAccess', _100 => _100.storageKey]), minimum);
1779
+ const [ownIsOpen, setOwnIsOpen] = _react.useState.call(void 0, false);
1780
+ const isOpen = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _101 => _101.open]), () => ( ownIsOpen));
1781
+ const onOpenChange = _optionalChain([config, 'optionalAccess', _102 => _102.onOpenChange]);
1782
+ const setIsOpen = (next) => {
1783
+ if (_optionalChain([config, 'optionalAccess', _103 => _103.open]) === void 0) setOwnIsOpen(next);
1784
+ _optionalChain([onOpenChange, 'optionalCall', _104 => _104(next)]);
1785
+ };
1786
+ const [collapsedSize, setCollapsedSize] = _react.useState.call(void 0, null);
1787
+ const [prevCollapsed, setPrevCollapsed] = _react.useState.call(void 0, collapsed);
1788
+ if (collapsed !== prevCollapsed) {
1789
+ setPrevCollapsed(collapsed);
1790
+ setCollapsedSize(null);
1791
+ }
1792
+ const size = collapsed ? _nullishCoalesce(collapsedSize, () => ( minimum)) : storedSize;
1793
+ const setSize = collapsed ? setCollapsedSize : setStoredSize;
1794
+ const layout = resolveSidePanelLayout({ rowWidth, isMobile, isOpen, size, minWidth, minContentWidth });
1795
+ const [prevCanDock, setPrevCanDock] = _react.useState.call(void 0, layout.canDock);
1796
+ if (layout.canDock !== prevCanDock) {
1797
+ setPrevCanDock(layout.canDock);
1798
+ setOwnIsOpen(false);
1799
+ }
1800
+ const prevCanDockRef = _react.useRef.call(void 0, layout.canDock);
1801
+ _react.useEffect.call(void 0, () => {
1802
+ const couldDock = prevCanDockRef.current;
1803
+ prevCanDockRef.current = layout.canDock;
1804
+ if (!couldDock && layout.canDock && _optionalChain([config, 'optionalAccess', _105 => _105.open])) _optionalChain([onOpenChange, 'optionalCall', _106 => _106(false)]);
1805
+ }, [layout.canDock, _optionalChain([config, 'optionalAccess', _107 => _107.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 = _react.useRef.call(void 0, null);
1873
+ const frameRef = _react.useRef.call(void 0, null);
1874
+ const pendingRef = _react.useRef.call(void 0, null);
1875
+ const measured = Number.isFinite(maxDockedWidth);
1876
+ const current = _nullishCoalesce(peekWidth, () => ( (mode === "full" && measured ? maxDockedWidth + 1 : width)));
1877
+ _react.useEffect.call(void 0,
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 (e5) {
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__ */ _jsxruntime.jsx.call(void 0,
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__ */ _jsxruntime.jsx.call(void 0,
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__ */ _jsxruntime.jsx.call(void 0, _chunkN3COXDBHcjs.Menu01Icon, { size: 12 })
1958
+ }
1959
+ )
1960
+ }
1961
+ );
1962
+ }
1963
+ function AppLayoutSidePanel({ config, state }) {
1964
+ const panelId = _react.useId.call(void 0, );
1965
+ const { mode, width, dockedWidth, canDock, isOpen, close, morph, endMorph, peekWidth } = state;
1966
+ _react.useEffect.call(void 0, () => {
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 = _nullishCoalesce(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__ */ _jsxruntime.jsx.call(void 0,
1980
+ "aside",
1981
+ {
1982
+ id: panelId,
1983
+ "aria-label": label,
1984
+ onKeyDown: handleKeyDown,
1985
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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__ */ _jsxruntime.jsxs.call(void 0,
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: _chunk3ATAYP36cjs.cn.call(void 0,
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: _nullishCoalesce(peekWidth, () => ( width)) },
2012
+ children: [
2013
+ canDock && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, SidePanelResizeHandle, { state, label: `Resize ${label}`, controls: panelId }),
2014
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2015
+ "div",
2016
+ {
2017
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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: _nullishCoalesce(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
+ }
2037
+
1652
2038
  // src/components/navigation/mobile-burger-menu.tsx
1653
2039
 
1654
2040
 
@@ -1666,13 +2052,13 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
1666
2052
  }) {
1667
2053
  const panelRef = _react.useRef.call(void 0, null);
1668
2054
  _overlays.usePreventScroll.call(void 0, { isDisabled: !isOpen });
1669
- _chunk3L7KCOGOcjs.useFocusTrap.call(void 0, panelRef, isOpen, { onEscape: onClose });
2055
+ _chunk2QEUFXNScjs.useFocusTrap.call(void 0, panelRef, isOpen, { onEscape: onClose });
1670
2056
  const handleItemClick = _react.useCallback.call(void 0,
1671
2057
  (item) => {
1672
2058
  if (item.onClick) {
1673
2059
  item.onClick();
1674
2060
  } else if (item.path) {
1675
- _optionalChain([config, 'access', _97 => _97.onNavigate, 'optionalCall', _98 => _98(item.path)]);
2061
+ _optionalChain([config, 'access', _108 => _108.onNavigate, 'optionalCall', _109 => _109(item.path)]);
1676
2062
  }
1677
2063
  onClose();
1678
2064
  },
@@ -1731,7 +2117,7 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
1731
2117
  {
1732
2118
  className: _chunk3ATAYP36cjs.cn.call(void 0,
1733
2119
  "absolute inset-0 z-[100] md:hidden",
1734
- _chunkHY5YL3U5cjs.OVERLAY_BACKDROP_CLASS,
2120
+ _chunkXBWE423Rcjs.OVERLAY_BACKDROP_CLASS,
1735
2121
  "transition-all duration-300 motion-reduce:transition-none",
1736
2122
  isOpen ? "opacity-100" : "pointer-events-none opacity-0"
1737
2123
  ),
@@ -1772,7 +2158,7 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
1772
2158
  "aria-disabled": disabled || void 0,
1773
2159
  children: [
1774
2160
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1775
- _chunkEMCQGFXDcjs.SquareAvatar,
2161
+ _chunkMMOODW57cjs.SquareAvatar,
1776
2162
  {
1777
2163
  src: user.userAvatarUrl || void 0,
1778
2164
  alt: user.userName || "User",
@@ -1796,7 +2182,7 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
1796
2182
  ]
1797
2183
  }
1798
2184
  ),
1799
- _optionalChain([config, 'access', _99 => _99.topSlot, 'optionalCall', _100 => _100({ minimized: false })]),
2185
+ _optionalChain([config, 'access', _110 => _110.topSlot, 'optionalCall', _111 => _111({ minimized: false })]),
1800
2186
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "nav", { "aria-label": "Primary navigation", children: renderNavigationGrid(primaryItems) }),
1801
2187
  secondaryItems.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "nav", { "aria-label": "Secondary navigation", className: "flex flex-col gap-3", children: secondaryItems.map((item) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _react2.default.Fragment, { children: renderNavigationItem(item, false) }, item.id)) }),
1802
2188
  onLogout && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
@@ -1832,10 +2218,31 @@ function AppLayout({
1832
2218
  mobileBurgerMenuProps,
1833
2219
  disabled = false,
1834
2220
  drawer,
1835
- topBar
2221
+ topBar,
2222
+ sidePanel
1836
2223
  }) {
1837
2224
  const [mobileMenuOpen, setMobileMenuOpen] = _react.useState.call(void 0, false);
1838
2225
  const [drawerContainer, setDrawerContainer] = _react.useState.call(void 0, null);
2226
+ const [mainElement, setMainElement] = _react.useState.call(void 0, null);
2227
+ const [contentWidth, setContentWidth] = _react.useState.call(void 0, null);
2228
+ const hasSidePanel = sidePanel !== void 0;
2229
+ const sidePanelState = useAppLayoutSidePanel(sidePanel, drawerContainer);
2230
+ _chunkRKV5B7EUcjs.useIsomorphicLayoutEffect.call(void 0, () => {
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 = _optionalChain([sidePanelState, 'optionalAccess', _112 => _112.coversContent]) === true;
1839
2246
  const mobileMenuOpenRef = _react.useRef.call(void 0, mobileMenuOpen);
1840
2247
  _react.useEffect.call(void 0, () => {
1841
2248
  mobileMenuOpenRef.current = mobileMenuOpen;
@@ -1866,10 +2273,10 @@ function AppLayout({
1866
2273
  }),
1867
2274
  []
1868
2275
  );
1869
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkMXHJROXJcjs.AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkMXHJROXJcjs.AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex h-screen flex-col bg-ods-bg", className), children: [
2276
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP23CRLU4cjs.AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP23CRLU4cjs.AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex h-screen flex-col bg-ods-bg", className), children: [
1870
2277
  topBar,
1871
2278
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "relative flex min-h-0 flex-1", children: [
1872
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, NavigationSidebar, { config: sidebarConfig, disabled }),
2279
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, NavigationSidebar, { config: sidebarConfig, disabled, pushOnTablet: hasSidePanel }),
1873
2280
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1874
2281
  MobileBurgerMenu,
1875
2282
  {
@@ -1884,17 +2291,43 @@ function AppLayout({
1884
2291
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
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__ */ _jsxruntime.jsx.call(void 0, _chunkMXHJROXJcjs.NotificationDrawer, {}),
1894
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { ref: setDrawerContainer, className: "relative flex flex-1 flex-col overflow-hidden", children: [
1895
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "main", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex-1 overflow-y-auto", mainClassName), children }),
1896
- drawer
1897
- ] })
2300
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkP23CRLU4cjs.NotificationDrawer, {}),
2301
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
2302
+ "div",
2303
+ {
2304
+ ref: setDrawerContainer,
2305
+ className: _chunk3ATAYP36cjs.cn.call(void 0, "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__ */ _jsxruntime.jsx.call(void 0,
2311
+ "main",
2312
+ {
2313
+ ref: setMainElement,
2314
+ className: _chunk3ATAYP36cjs.cn.call(void 0,
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
+ _optionalChain([sidePanelState, 'optionalAccess', _113 => _113.overlapsContent]) && "isolate",
2320
+ mainClassName
2321
+ ),
2322
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkRKV5B7EUcjs.ContentAreaWidthContext.Provider, { value: contentWidth, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "ods-content-scope", children }) })
2323
+ }
2324
+ )
2325
+ ) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "main", { className: _chunk3ATAYP36cjs.cn.call(void 0, "flex-1 overflow-y-auto", mainClassName), children }),
2326
+ sidePanel && sidePanelState && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AppLayoutSidePanel, { config: sidePanel, state: sidePanelState }),
2327
+ drawer
2328
+ ]
2329
+ }
2330
+ )
1898
2331
  ] })
1899
2332
  ] })
1900
2333
  ] }) }) });