@flamingo-stack/openframe-frontend-core 0.0.711 → 0.0.712

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 (523) hide show
  1. package/dist/chunk-2NASBO7O.js +1137 -0
  2. package/dist/{chunk-RQRX4YC3.cjs → chunk-2RKFMUNW.cjs} +46 -46
  3. package/dist/chunk-2Y7QZAB2.cjs +158 -0
  4. package/dist/chunk-34I6XI3N.js +136 -0
  5. package/dist/chunk-3K5ZLZE7.js +292 -0
  6. package/dist/chunk-3LU4UFPS.cjs +14 -0
  7. package/dist/{chunk-3UNL26CD.cjs → chunk-3RKBJT6K.cjs} +8 -6
  8. package/dist/{chunk-6GLQLTJI.js → chunk-3SEEGNRE.js} +35 -27
  9. package/dist/{chunk-FEMAJES4.cjs → chunk-3UAJLO5U.cjs} +41 -39
  10. package/dist/chunk-4HJRHEXD.cjs +1612 -0
  11. package/dist/{chunk-JPG7OHEG.js → chunk-4QFWGLZO.js} +1 -1
  12. package/dist/chunk-4R2L3DSA.js +14 -0
  13. package/dist/{chunk-2JTGK64G.js → chunk-4UYKNOZG.js} +12 -10
  14. package/dist/{chunk-TKZXHVBG.js → chunk-5SDELRH3.js} +5 -5
  15. package/dist/{chunk-Q6B35Y7O.js → chunk-5Y72YQEK.js} +22 -113
  16. package/dist/{chunk-KUC673HM.js → chunk-6T3BTD6Q.js} +204 -982
  17. package/dist/{chunk-F57ECE2I.js → chunk-6YPTUHM7.js} +4 -4
  18. package/dist/{chunk-WJUIXU6Y.js → chunk-7HNYYNKE.js} +28 -22
  19. package/dist/{chunk-P6G3JZNC.cjs → chunk-7NSU5EQD.cjs} +57 -148
  20. package/dist/chunk-AAYNCJMW.cjs +48 -0
  21. package/dist/{chunk-FXJ3WWUB.js → chunk-ADBE7QF3.js} +5 -252
  22. package/dist/chunk-AECTRMGQ.cjs +334 -0
  23. package/dist/chunk-AGVXKD4K.js +334 -0
  24. package/dist/chunk-AL2GUHAJ.cjs +18 -0
  25. package/dist/{chunk-WMX26HB5.js → chunk-APJZBDQN.js} +12 -12
  26. package/dist/chunk-AUMKE74M.cjs +16 -0
  27. package/dist/chunk-B4NCVYEQ.cjs +292 -0
  28. package/dist/{chunk-XWEBHS7O.cjs → chunk-BXSRTBLU.cjs} +82 -54
  29. package/dist/chunk-CMGFZHCN.js +233 -0
  30. package/dist/chunk-CMZ3QTFQ.js +1207 -0
  31. package/dist/chunk-CPA2CKRZ.cjs +125 -0
  32. package/dist/{chunk-G47AP6LX.cjs → chunk-CSCJU6YC.cjs} +35 -33
  33. package/dist/chunk-CYUUHFXL.js +41 -0
  34. package/dist/chunk-DC4RTYWK.cjs +1122 -0
  35. package/dist/{chunk-NF7GNGYG.js → chunk-DDWFCWOE.js} +5 -7
  36. package/dist/{chunk-K4PTDK34.js → chunk-EFNKS5W4.js} +322 -428
  37. package/dist/{chunk-QA6TROME.cjs → chunk-EOKSKJSS.cjs} +25 -83
  38. package/dist/{chunk-6NTPY5QA.cjs → chunk-ETYLOZOB.cjs} +978 -2413
  39. package/dist/chunk-F5BPGWGT.cjs +931 -0
  40. package/dist/{chunk-5HB7FLCV.js → chunk-FCAVAEHF.js} +8277 -9990
  41. package/dist/chunk-FFT56TYB.cjs +401 -0
  42. package/dist/chunk-FYEJTF5Y.js +125 -0
  43. package/dist/chunk-G3GRYDMS.js +16 -0
  44. package/dist/{chunk-VWFZRMQR.js → chunk-G3OMVCID.js} +13 -7
  45. package/dist/chunk-G6OHIX5C.cjs +100 -0
  46. package/dist/{chunk-UDFRUKLC.cjs → chunk-GEDY7HQI.cjs} +2 -2
  47. package/dist/chunk-GQ7JJUIT.cjs +1207 -0
  48. package/dist/chunk-H3PKYE4N.js +18 -0
  49. package/dist/{chunk-AGDVEUVL.js → chunk-H5R7U2D2.js} +206 -5
  50. package/dist/{chunk-7AM6C6XH.cjs → chunk-HETQETPV.cjs} +9641 -9678
  51. package/dist/{chunk-Y2GSOUCS.cjs → chunk-HWVUR735.cjs} +2 -2
  52. package/dist/chunk-II4QMH26.cjs +35 -0
  53. package/dist/chunk-ILNN6QRW.js +1612 -0
  54. package/dist/chunk-IYVFSLWJ.js +931 -0
  55. package/dist/{chunk-C4HRRB3V.cjs → chunk-JGCFRTND.cjs} +23 -17
  56. package/dist/chunk-JHQ334WS.js +655 -0
  57. package/dist/{chunk-WCVZCGK5.cjs → chunk-JO5TLJPM.cjs} +129 -907
  58. package/dist/{chunk-PRX7HVLE.cjs → chunk-JVCAK4W3.cjs} +210 -9
  59. package/dist/chunk-KBJJQFYU.js +1122 -0
  60. package/dist/chunk-KEKCQENI.js +48 -0
  61. package/dist/chunk-KHXZFLIN.cjs +41 -0
  62. package/dist/chunk-KT3U3ZRP.cjs +1137 -0
  63. package/dist/chunk-L2VUINHN.js +35 -0
  64. package/dist/{chunk-FYOKS5RI.cjs → chunk-L6ZQGWCX.cjs} +4521 -6234
  65. package/dist/{chunk-PLYEKV3N.cjs → chunk-MA4Q5RBP.cjs} +6 -6
  66. package/dist/{chunk-VMMHJFHG.js → chunk-N67XG5GY.js} +10 -8
  67. package/dist/chunk-NPAQSMRY.js +2087 -0
  68. package/dist/{chunk-IFWLJ66M.js → chunk-NQWJAOHO.js} +6 -4
  69. package/dist/{chunk-6K7QZDA6.cjs → chunk-OBZJICEA.cjs} +8 -8
  70. package/dist/{chunk-62KNLDXK.js → chunk-OPYODNV2.js} +3 -3
  71. package/dist/chunk-P3JMAMHP.js +401 -0
  72. package/dist/chunk-PPXR22YC.cjs +2087 -0
  73. package/dist/chunk-PSVSEN4J.cjs +655 -0
  74. package/dist/{chunk-EQWD4IJE.js → chunk-RBYVFPER.js} +74 -46
  75. package/dist/{chunk-SMAAV3HL.js → chunk-ROBQ5TR7.js} +10541 -10578
  76. package/dist/{chunk-K6Y5NX6L.cjs → chunk-T3CLXR43.cjs} +114 -220
  77. package/dist/{chunk-FI6GMDO7.js → chunk-TTVOLEUS.js} +3605 -5040
  78. package/dist/{chunk-LM7TXMLU.cjs → chunk-ULWVKHSI.cjs} +8 -255
  79. package/dist/{chunk-EX6GGCAC.cjs → chunk-UT3ODMBU.cjs} +15 -15
  80. package/dist/chunk-WANCBTUE.js +71 -0
  81. package/dist/{chunk-BIZNSF3U.cjs → chunk-WBNAEYTQ.cjs} +2 -51
  82. package/dist/chunk-WFPCCBOM.cjs +71 -0
  83. package/dist/chunk-WI6FHKD7.js +158 -0
  84. package/dist/chunk-WMNCVLES.js +100 -0
  85. package/dist/{chunk-UT4YHQZW.js → chunk-WSDT7LYL.js} +0 -49
  86. package/dist/chunk-WVOTC7HW.cjs +136 -0
  87. package/dist/{chunk-6AMIRXKM.cjs → chunk-WWJG4GVG.cjs} +93 -87
  88. package/dist/chunk-XXBLN4BP.cjs +233 -0
  89. package/dist/{chunk-4IBPRIQH.js → chunk-YBQQNDC7.js} +1 -1
  90. package/dist/{chunk-QGZPZ3RL.js → chunk-YBS5QGON.js} +70 -128
  91. package/dist/{chunk-CDM7OSFB.cjs → chunk-Z5SWJW5Q.cjs} +125 -117
  92. package/dist/{chunk-YD4LJZV4.cjs → chunk-ZX7SCPLO.cjs} +6 -8
  93. package/dist/cloud-tenants-KZUZGD4A.cjs +117 -0
  94. package/dist/cloud-tenants-OGLVVQ7X.js +117 -0
  95. package/dist/components/case-studies/index.cjs +45 -29
  96. package/dist/components/case-studies/index.js +32 -16
  97. package/dist/components/chat/ask-prompts.d.ts +64 -0
  98. package/dist/components/chat/ask-prompts.d.ts.map +1 -0
  99. package/dist/components/chat/entity-cards/case-study-card.d.ts +6 -3
  100. package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -1
  101. package/dist/components/chat/index.cjs +27 -8
  102. package/dist/components/chat/index.d.ts +1 -0
  103. package/dist/components/chat/index.d.ts.map +1 -1
  104. package/dist/components/chat/index.js +57 -38
  105. package/dist/components/chat/quick-action-chip.d.ts +7 -3
  106. package/dist/components/chat/quick-action-chip.d.ts.map +1 -1
  107. package/dist/components/contact/index.cjs +29 -13
  108. package/dist/components/contact/index.js +28 -12
  109. package/dist/components/docs/index.cjs +33 -16
  110. package/dist/components/docs/index.js +33 -16
  111. package/dist/components/docs/use-scroll-spy.d.ts +23 -1
  112. package/dist/components/docs/use-scroll-spy.d.ts.map +1 -1
  113. package/dist/components/embeds/index.cjs +29 -13
  114. package/dist/components/embeds/index.js +28 -12
  115. package/dist/components/faq/faq-section.d.ts +8 -1
  116. package/dist/components/faq/faq-section.d.ts.map +1 -1
  117. package/dist/components/faq/index.cjs +30 -14
  118. package/dist/components/faq/index.js +29 -13
  119. package/dist/components/features/array-entry-manager.d.ts +5 -1
  120. package/dist/components/features/array-entry-manager.d.ts.map +1 -1
  121. package/dist/components/features/board/board.d.ts +2 -0
  122. package/dist/components/features/board/board.d.ts.map +1 -1
  123. package/dist/components/features/board/ticket-card.d.ts.map +1 -1
  124. package/dist/components/features/board/touch-board.d.ts +1 -1
  125. package/dist/components/features/board/touch-board.d.ts.map +1 -1
  126. package/dist/components/features/board/types.d.ts +3 -0
  127. package/dist/components/features/board/types.d.ts.map +1 -1
  128. package/dist/components/features/board/use-board-collapse.d.ts +6 -1
  129. package/dist/components/features/board/use-board-collapse.d.ts.map +1 -1
  130. package/dist/components/features/capability-explorer.d.ts +94 -0
  131. package/dist/components/features/capability-explorer.d.ts.map +1 -0
  132. package/dist/components/features/cloud-tenants/index.d.ts +14 -0
  133. package/dist/components/features/cloud-tenants/index.d.ts.map +1 -0
  134. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts +9 -0
  135. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts.map +1 -0
  136. package/dist/components/features/cloud-tenants/tenant-cell.d.ts +8 -0
  137. package/dist/components/features/cloud-tenants/tenant-cell.d.ts.map +1 -0
  138. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts +9 -0
  139. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts.map +1 -0
  140. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts +42 -0
  141. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts.map +1 -0
  142. package/dist/components/features/cloud-tenants/tenant-row.d.ts +22 -0
  143. package/dist/components/features/cloud-tenants/tenant-row.d.ts.map +1 -0
  144. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts +42 -0
  145. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts.map +1 -0
  146. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts +26 -0
  147. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts.map +1 -0
  148. package/dist/components/features/devices/device-last-online.d.ts +3 -0
  149. package/dist/components/features/devices/device-last-online.d.ts.map +1 -0
  150. package/dist/components/features/devices/device-name.d.ts +42 -0
  151. package/dist/components/features/devices/device-name.d.ts.map +1 -0
  152. package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts +26 -0
  153. package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts.map +1 -0
  154. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts +25 -0
  155. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts.map +1 -0
  156. package/dist/components/features/devices/device-selector/device-selector.d.ts +38 -0
  157. package/dist/components/features/devices/device-selector/device-selector.d.ts.map +1 -0
  158. package/dist/components/features/devices/device-selector/device-selector.types.d.ts +133 -0
  159. package/dist/components/features/devices/device-selector/device-selector.types.d.ts.map +1 -0
  160. package/dist/components/features/devices/device-selector/narrowing.d.ts +13 -0
  161. package/dist/components/features/devices/device-selector/narrowing.d.ts.map +1 -0
  162. package/dist/components/features/devices/device-selector/use-device-selector.d.ts +17 -0
  163. package/dist/components/features/devices/device-selector/use-device-selector.d.ts.map +1 -0
  164. package/dist/components/features/devices/device-status.d.ts +23 -0
  165. package/dist/components/features/devices/device-status.d.ts.map +1 -0
  166. package/dist/components/features/devices/device-statuses.d.ts +40 -0
  167. package/dist/components/features/devices/device-statuses.d.ts.map +1 -0
  168. package/dist/components/features/devices/device-tags-filter-button.d.ts +22 -0
  169. package/dist/components/features/devices/device-tags-filter-button.d.ts.map +1 -0
  170. package/dist/components/features/devices/device-type-icon.d.ts +11 -0
  171. package/dist/components/features/devices/device-type-icon.d.ts.map +1 -0
  172. package/dist/components/features/devices/device-type-tile.d.ts +9 -0
  173. package/dist/components/features/devices/device-type-tile.d.ts.map +1 -0
  174. package/dist/components/features/devices/devices-filter-toolbar.d.ts +46 -0
  175. package/dist/components/features/devices/devices-filter-toolbar.d.ts.map +1 -0
  176. package/dist/components/features/devices/devices-grid-filters.d.ts +25 -0
  177. package/dist/components/features/devices/devices-grid-filters.d.ts.map +1 -0
  178. package/dist/components/features/devices/devices-grid.d.ts +12 -0
  179. package/dist/components/features/devices/devices-grid.d.ts.map +1 -0
  180. package/dist/components/features/devices/devices-list.d.ts +131 -0
  181. package/dist/components/features/devices/devices-list.d.ts.map +1 -0
  182. package/dist/components/features/devices/devices-panel-header.d.ts +46 -0
  183. package/dist/components/features/devices/devices-panel-header.d.ts.map +1 -0
  184. package/dist/components/features/devices/devices-panel-view.d.ts +79 -0
  185. package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -0
  186. package/dist/components/features/devices/devices-table-columns.d.ts +76 -0
  187. package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -0
  188. package/dist/components/features/devices/devices-view-config.d.ts +25 -0
  189. package/dist/components/features/devices/devices-view-config.d.ts.map +1 -0
  190. package/dist/components/features/devices/index.d.ts +24 -0
  191. package/dist/components/features/devices/index.d.ts.map +1 -0
  192. package/dist/components/features/devices/types.d.ts +68 -0
  193. package/dist/components/features/devices/types.d.ts.map +1 -0
  194. package/dist/components/features/devices/use-tag-filter-modal.d.ts +50 -0
  195. package/dist/components/features/devices/use-tag-filter-modal.d.ts.map +1 -0
  196. package/dist/components/features/index.cjs +227 -12
  197. package/dist/components/features/index.d.ts +7 -0
  198. package/dist/components/features/index.d.ts.map +1 -1
  199. package/dist/components/features/index.js +266 -51
  200. package/dist/components/features/knowledge-base/index.d.ts +7 -0
  201. package/dist/components/features/knowledge-base/index.d.ts.map +1 -0
  202. package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts +44 -0
  203. package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts.map +1 -0
  204. package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts +13 -0
  205. package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts.map +1 -0
  206. package/dist/components/features/knowledge-base/knowledge-base-status.d.ts +8 -0
  207. package/dist/components/features/knowledge-base/knowledge-base-status.d.ts.map +1 -0
  208. package/dist/components/features/knowledge-base/knowledge-base-table.d.ts +52 -0
  209. package/dist/components/features/knowledge-base/knowledge-base-table.d.ts.map +1 -0
  210. package/dist/components/features/logs/index.d.ts +12 -0
  211. package/dist/components/features/logs/index.d.ts.map +1 -0
  212. package/dist/components/features/logs/log-drawer.d.ts +29 -0
  213. package/dist/components/features/logs/log-drawer.d.ts.map +1 -0
  214. package/dist/components/features/logs/log-source-labels.d.ts +11 -0
  215. package/dist/components/features/logs/log-source-labels.d.ts.map +1 -0
  216. package/dist/components/features/logs/logs-page-view.d.ts +32 -0
  217. package/dist/components/features/logs/logs-page-view.d.ts.map +1 -0
  218. package/dist/components/features/logs/logs-table-columns.d.ts +15 -0
  219. package/dist/components/features/logs/logs-table-columns.d.ts.map +1 -0
  220. package/dist/components/features/logs/logs-table-view.d.ts +64 -0
  221. package/dist/components/features/logs/logs-table-view.d.ts.map +1 -0
  222. package/dist/components/features/logs/types.d.ts +52 -0
  223. package/dist/components/features/logs/types.d.ts.map +1 -0
  224. package/dist/components/features/policies/compute-policy-summary.d.ts +37 -0
  225. package/dist/components/features/policies/compute-policy-summary.d.ts.map +1 -0
  226. package/dist/components/features/policies/index.d.ts +8 -0
  227. package/dist/components/features/policies/index.d.ts.map +1 -0
  228. package/dist/components/features/policies/policies-table.d.ts +34 -0
  229. package/dist/components/features/policies/policies-table.d.ts.map +1 -0
  230. package/dist/components/features/policies/policy-summary-cards.d.ts +17 -0
  231. package/dist/components/features/policies/policy-summary-cards.d.ts.map +1 -0
  232. package/dist/components/features/policies/policy-table-row.d.ts +37 -0
  233. package/dist/components/features/policies/policy-table-row.d.ts.map +1 -0
  234. package/dist/components/features/remote-session/index.d.ts +8 -0
  235. package/dist/components/features/remote-session/index.d.ts.map +1 -1
  236. package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts +21 -0
  237. package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts.map +1 -0
  238. package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts +31 -0
  239. package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts.map +1 -0
  240. package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts +21 -0
  241. package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts.map +1 -0
  242. package/dist/components/features/remote-session/remote-desktop-view.d.ts +50 -0
  243. package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -0
  244. package/dist/components/features/software/index.d.ts +8 -0
  245. package/dist/components/features/software/index.d.ts.map +1 -0
  246. package/dist/components/features/software/package-managers.d.ts +30 -0
  247. package/dist/components/features/software/package-managers.d.ts.map +1 -0
  248. package/dist/components/features/software/package-search-field-placeholder.d.ts +7 -0
  249. package/dist/components/features/software/package-search-field-placeholder.d.ts.map +1 -0
  250. package/dist/components/features/software/schedule-fields.d.ts +34 -0
  251. package/dist/components/features/software/schedule-fields.d.ts.map +1 -0
  252. package/dist/components/features/software/software-action-copy.d.ts +25 -0
  253. package/dist/components/features/software/software-action-copy.d.ts.map +1 -0
  254. package/dist/components/features/software/software-action-form.d.ts +71 -0
  255. package/dist/components/features/software/software-action-form.d.ts.map +1 -0
  256. package/dist/components/features/software/software-row-fields.d.ts +23 -0
  257. package/dist/components/features/software/software-row-fields.d.ts.map +1 -0
  258. package/dist/components/features/software/software-row.d.ts +18 -0
  259. package/dist/components/features/software/software-row.d.ts.map +1 -0
  260. package/dist/components/features/sortable-list/index.d.ts +1 -0
  261. package/dist/components/features/sortable-list/index.d.ts.map +1 -1
  262. package/dist/components/features/sortable-list/sortable-drag-handle.d.ts +21 -0
  263. package/dist/components/features/sortable-list/sortable-drag-handle.d.ts.map +1 -0
  264. package/dist/components/help-center-pages/index.cjs +133 -114
  265. package/dist/components/help-center-pages/index.js +58 -39
  266. package/dist/components/index.cjs +320 -82
  267. package/dist/components/index.js +451 -213
  268. package/dist/components/layout/page-heading.d.ts +12 -3
  269. package/dist/components/layout/page-heading.d.ts.map +1 -1
  270. package/dist/components/meeting-scheduler/index.cjs +120 -98
  271. package/dist/components/meeting-scheduler/index.js +50 -28
  272. package/dist/components/navigation/index.cjs +36 -17
  273. package/dist/components/navigation/index.d.ts +3 -0
  274. package/dist/components/navigation/index.d.ts.map +1 -1
  275. package/dist/components/navigation/index.js +36 -17
  276. package/dist/components/navigation/mingo-ai-button.d.ts +23 -10
  277. package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
  278. package/dist/components/navigation/sticky-section-nav.d.ts +14 -1
  279. package/dist/components/navigation/sticky-section-nav.d.ts.map +1 -1
  280. package/dist/components/onboarding-guides/index.cjs +32 -16
  281. package/dist/components/onboarding-guides/index.js +31 -15
  282. package/dist/components/product-demo/cast.d.ts +58 -0
  283. package/dist/components/product-demo/cast.d.ts.map +1 -0
  284. package/dist/components/product-demo/fixtures/cloud-tenants.d.ts +10 -0
  285. package/dist/components/product-demo/fixtures/cloud-tenants.d.ts.map +1 -0
  286. package/dist/components/product-demo/fixtures/devices.d.ts +14 -0
  287. package/dist/components/product-demo/fixtures/devices.d.ts.map +1 -0
  288. package/dist/components/product-demo/fixtures/knowledge.d.ts +14 -0
  289. package/dist/components/product-demo/fixtures/knowledge.d.ts.map +1 -0
  290. package/dist/components/product-demo/fixtures/logs.d.ts +15 -0
  291. package/dist/components/product-demo/fixtures/logs.d.ts.map +1 -0
  292. package/dist/components/product-demo/fixtures/policies.d.ts +13 -0
  293. package/dist/components/product-demo/fixtures/policies.d.ts.map +1 -0
  294. package/dist/components/product-demo/fixtures/remote-session.d.ts +20 -0
  295. package/dist/components/product-demo/fixtures/remote-session.d.ts.map +1 -0
  296. package/dist/components/product-demo/fixtures/shared.d.ts +156 -0
  297. package/dist/components/product-demo/fixtures/shared.d.ts.map +1 -0
  298. package/dist/components/product-demo/fixtures/software-update.d.ts +19 -0
  299. package/dist/components/product-demo/fixtures/software-update.d.ts.map +1 -0
  300. package/dist/components/product-demo/fixtures/tickets-board.d.ts +8 -0
  301. package/dist/components/product-demo/fixtures/tickets-board.d.ts.map +1 -0
  302. package/dist/components/product-demo/index.cjs +112 -0
  303. package/dist/components/product-demo/index.d.ts +6 -0
  304. package/dist/components/product-demo/index.d.ts.map +1 -0
  305. package/dist/components/product-demo/index.js +112 -0
  306. package/dist/components/product-demo/product-screen.d.ts +22 -0
  307. package/dist/components/product-demo/product-screen.d.ts.map +1 -0
  308. package/dist/components/product-demo/registry.d.ts +13 -0
  309. package/dist/components/product-demo/registry.d.ts.map +1 -0
  310. package/dist/components/product-demo/screen-keys.cjs +25 -0
  311. package/dist/components/product-demo/screen-keys.d.ts +27 -0
  312. package/dist/components/product-demo/screen-keys.d.ts.map +1 -0
  313. package/dist/components/product-demo/screen-keys.js +20 -0
  314. package/dist/components/product-demo/screens/cloud-tenants.d.ts +8 -0
  315. package/dist/components/product-demo/screens/cloud-tenants.d.ts.map +1 -0
  316. package/dist/components/product-demo/screens/devices.d.ts +10 -0
  317. package/dist/components/product-demo/screens/devices.d.ts.map +1 -0
  318. package/dist/components/product-demo/screens/knowledge.d.ts +9 -0
  319. package/dist/components/product-demo/screens/knowledge.d.ts.map +1 -0
  320. package/dist/components/product-demo/screens/logs.d.ts +4 -0
  321. package/dist/components/product-demo/screens/logs.d.ts.map +1 -0
  322. package/dist/components/product-demo/screens/policies.d.ts +8 -0
  323. package/dist/components/product-demo/screens/policies.d.ts.map +1 -0
  324. package/dist/components/product-demo/screens/remote-desktop-picture.d.ts +11 -0
  325. package/dist/components/product-demo/screens/remote-desktop-picture.d.ts.map +1 -0
  326. package/dist/components/product-demo/screens/remote-session.d.ts +8 -0
  327. package/dist/components/product-demo/screens/remote-session.d.ts.map +1 -0
  328. package/dist/components/product-demo/screens/software-update.d.ts +12 -0
  329. package/dist/components/product-demo/screens/software-update.d.ts.map +1 -0
  330. package/dist/components/product-demo/screens/tickets-board.d.ts +4 -0
  331. package/dist/components/product-demo/screens/tickets-board.d.ts.map +1 -0
  332. package/dist/components/product-demo/types.d.ts +9 -0
  333. package/dist/components/product-demo/types.d.ts.map +1 -0
  334. package/dist/components/related-content/index.cjs +14 -8
  335. package/dist/components/related-content/index.js +13 -7
  336. package/dist/components/tickets/index.cjs +36 -20
  337. package/dist/components/tickets/index.js +35 -19
  338. package/dist/components/ui/file-manager/index.cjs +38 -34
  339. package/dist/components/ui/file-manager/index.js +8 -4
  340. package/dist/components/ui/index.cjs +57 -17
  341. package/dist/components/ui/index.d.ts +1 -0
  342. package/dist/components/ui/index.d.ts.map +1 -1
  343. package/dist/components/ui/index.js +141 -101
  344. package/dist/components/ui/product-screen-frame.d.ts +45 -0
  345. package/dist/components/ui/product-screen-frame.d.ts.map +1 -0
  346. package/dist/components/ui/radio-group.d.ts +5 -0
  347. package/dist/components/ui/radio-group.d.ts.map +1 -1
  348. package/dist/components/ui/snap-carousel.d.ts +11 -1
  349. package/dist/components/ui/snap-carousel.d.ts.map +1 -1
  350. package/dist/components/ui/tag.d.ts +1 -1
  351. package/dist/components/ui/tag.d.ts.map +1 -1
  352. package/dist/devices-LBMG42K6.js +81 -0
  353. package/dist/devices-YGYJIXQY.cjs +81 -0
  354. package/dist/hooks/index.cjs +17 -8
  355. package/dist/hooks/index.js +32 -23
  356. package/dist/hooks/ui/index.d.ts +1 -0
  357. package/dist/hooks/ui/index.d.ts.map +1 -1
  358. package/dist/hooks/ui/use-header-height.d.ts +12 -0
  359. package/dist/hooks/ui/use-header-height.d.ts.map +1 -1
  360. package/dist/hooks/ui/use-sticky-toolbar.d.ts +29 -0
  361. package/dist/hooks/ui/use-sticky-toolbar.d.ts.map +1 -0
  362. package/dist/hooks/use-location-hash.d.ts +2 -2
  363. package/dist/hooks/use-location-hash.d.ts.map +1 -1
  364. package/dist/hooks/use-scroll-to-hash.d.ts +7 -0
  365. package/dist/hooks/use-scroll-to-hash.d.ts.map +1 -1
  366. package/dist/index.cjs +276 -25
  367. package/dist/index.js +729 -478
  368. package/dist/knowledge-H5BIWJVI.js +108 -0
  369. package/dist/knowledge-KTCVJIWN.cjs +108 -0
  370. package/dist/logs-DB5Z7M5Q.js +216 -0
  371. package/dist/logs-RVCC2UQW.cjs +216 -0
  372. package/dist/policies-EWUULFBR.js +121 -0
  373. package/dist/policies-HV4IQCBV.cjs +121 -0
  374. package/dist/remote-session-GSGZOFDX.js +196 -0
  375. package/dist/remote-session-R6VAFESR.cjs +196 -0
  376. package/dist/software-update-6PXKRKBT.js +179 -0
  377. package/dist/software-update-D4OVSWSG.cjs +179 -0
  378. package/dist/tickets-board-BHLPAVNJ.cjs +137 -0
  379. package/dist/tickets-board-PYDNELSK.js +137 -0
  380. package/dist/types/case-study.d.ts +15 -1
  381. package/dist/types/case-study.d.ts.map +1 -1
  382. package/dist/utils/date-utils.d.ts +5 -0
  383. package/dist/utils/date-utils.d.ts.map +1 -1
  384. package/dist/utils/index.cjs +45 -2
  385. package/dist/utils/index.d.ts +2 -1
  386. package/dist/utils/index.d.ts.map +1 -1
  387. package/dist/utils/index.js +41 -3
  388. package/dist/utils/open-in-new-tab.d.ts +7 -0
  389. package/dist/utils/open-in-new-tab.d.ts.map +1 -0
  390. package/dist/utils/same-page-hash-nav.d.ts +31 -0
  391. package/dist/utils/same-page-hash-nav.d.ts.map +1 -1
  392. package/dist/utils/scroll-into-view.d.ts +14 -1
  393. package/dist/utils/scroll-into-view.d.ts.map +1 -1
  394. package/package.json +13 -1
  395. package/src/components/chat/ask-prompts.tsx +226 -0
  396. package/src/components/chat/embeddable-chat.tsx +36 -2
  397. package/src/components/chat/entity-cards/case-study-card.tsx +122 -46
  398. package/src/components/chat/index.ts +1 -0
  399. package/src/components/chat/quick-action-chip.tsx +33 -9
  400. package/src/components/docs/use-scroll-spy.ts +93 -18
  401. package/src/components/faq/faq-section.tsx +82 -43
  402. package/src/components/features/array-entry-manager.tsx +10 -1
  403. package/src/components/features/board/board.tsx +4 -1
  404. package/src/components/features/board/ticket-card.tsx +11 -1
  405. package/src/components/features/board/touch-board.tsx +2 -1
  406. package/src/components/features/board/types.ts +3 -0
  407. package/src/components/features/board/use-board-collapse.ts +7 -2
  408. package/src/components/features/capability-explorer.tsx +412 -0
  409. package/src/components/features/cloud-tenants/index.ts +28 -0
  410. package/src/components/features/cloud-tenants/tenant-access-cell.tsx +24 -0
  411. package/src/components/features/cloud-tenants/tenant-cell.tsx +26 -0
  412. package/src/components/features/cloud-tenants/tenant-customer-cell.tsx +27 -0
  413. package/src/components/features/cloud-tenants/tenant-presentation.ts +111 -0
  414. package/src/components/features/cloud-tenants/tenant-row.ts +21 -0
  415. package/src/components/features/cloud-tenants/tenants-table-columns.ts +30 -0
  416. package/src/components/features/cloud-tenants/tenants-table-view.tsx +142 -0
  417. package/src/components/features/devices/device-last-online.ts +6 -0
  418. package/src/components/features/devices/device-name.ts +51 -0
  419. package/src/components/features/devices/device-selector/device-selection-mode-radio.tsx +107 -0
  420. package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +32 -0
  421. package/src/components/features/devices/device-selector/device-selector.tsx +799 -0
  422. package/src/components/features/devices/device-selector/device-selector.types.ts +138 -0
  423. package/src/components/features/devices/device-selector/narrowing.ts +33 -0
  424. package/src/components/features/devices/device-selector/use-device-selector.ts +51 -0
  425. package/src/components/features/devices/device-status.ts +102 -0
  426. package/src/components/features/devices/device-statuses.ts +88 -0
  427. package/src/components/features/devices/device-tags-filter-button.tsx +49 -0
  428. package/src/components/features/devices/device-type-icon.tsx +29 -0
  429. package/src/components/features/devices/device-type-tile.tsx +17 -0
  430. package/src/components/features/devices/devices-filter-toolbar.tsx +114 -0
  431. package/src/components/features/devices/devices-grid-filters.tsx +99 -0
  432. package/src/components/features/devices/devices-grid.tsx +86 -0
  433. package/src/components/features/devices/devices-list.tsx +357 -0
  434. package/src/components/features/devices/devices-panel-header.tsx +97 -0
  435. package/src/components/features/devices/devices-panel-view.tsx +261 -0
  436. package/src/components/features/devices/devices-table-columns.tsx +356 -0
  437. package/src/components/features/devices/devices-view-config.tsx +38 -0
  438. package/src/components/features/devices/index.ts +89 -0
  439. package/src/components/features/devices/types.ts +74 -0
  440. package/src/components/features/devices/use-tag-filter-modal.ts +109 -0
  441. package/src/components/features/index.ts +9 -0
  442. package/src/components/features/knowledge-base/index.ts +19 -0
  443. package/src/components/features/knowledge-base/knowledge-base-article-view.tsx +134 -0
  444. package/src/components/features/knowledge-base/knowledge-base-item-icon.ts +14 -0
  445. package/src/components/features/knowledge-base/knowledge-base-status.ts +12 -0
  446. package/src/components/features/knowledge-base/knowledge-base-table.tsx +180 -0
  447. package/src/components/features/logs/index.ts +20 -0
  448. package/src/components/features/logs/log-drawer.tsx +138 -0
  449. package/src/components/features/logs/log-source-labels.ts +25 -0
  450. package/src/components/features/logs/logs-page-view.tsx +100 -0
  451. package/src/components/features/logs/logs-table-columns.ts +16 -0
  452. package/src/components/features/logs/logs-table-view.tsx +509 -0
  453. package/src/components/features/logs/types.ts +71 -0
  454. package/src/components/features/policies/compute-policy-summary.ts +115 -0
  455. package/src/components/features/policies/index.ts +14 -0
  456. package/src/components/features/policies/policies-table.tsx +235 -0
  457. package/src/components/features/policies/policy-summary-cards.tsx +69 -0
  458. package/src/components/features/policies/policy-table-row.ts +37 -0
  459. package/src/components/features/remote-session/index.ts +8 -0
  460. package/src/components/features/remote-session/remote-desktop-chat-message-row.tsx +56 -0
  461. package/src/components/features/remote-session/remote-desktop-chat-panel.tsx +102 -0
  462. package/src/components/features/remote-session/remote-desktop-fullscreen-toolbar.tsx +119 -0
  463. package/src/components/features/remote-session/remote-desktop-view.tsx +209 -0
  464. package/src/components/features/software/index.ts +39 -0
  465. package/src/components/features/software/package-managers.ts +54 -0
  466. package/src/components/features/software/package-search-field-placeholder.tsx +23 -0
  467. package/src/components/features/software/schedule-fields.tsx +105 -0
  468. package/src/components/features/software/software-action-copy.ts +70 -0
  469. package/src/components/features/software/software-action-form.tsx +199 -0
  470. package/src/components/features/software/software-row-fields.tsx +105 -0
  471. package/src/components/features/software/software-row.ts +22 -0
  472. package/src/components/features/sortable-list/index.ts +1 -0
  473. package/src/components/features/sortable-list/sortable-drag-handle.tsx +41 -0
  474. package/src/components/layout/page-heading.tsx +23 -6
  475. package/src/components/navigation/index.ts +5 -0
  476. package/src/components/navigation/mingo-ai-button.tsx +37 -13
  477. package/src/components/navigation/sticky-section-nav.tsx +99 -1
  478. package/src/components/product-demo/cast.tsx +78 -0
  479. package/src/components/product-demo/fixtures/cloud-tenants.ts +63 -0
  480. package/src/components/product-demo/fixtures/devices.ts +87 -0
  481. package/src/components/product-demo/fixtures/knowledge.ts +48 -0
  482. package/src/components/product-demo/fixtures/logs.ts +103 -0
  483. package/src/components/product-demo/fixtures/policies.ts +77 -0
  484. package/src/components/product-demo/fixtures/remote-session.ts +65 -0
  485. package/src/components/product-demo/fixtures/shared.ts +53 -0
  486. package/src/components/product-demo/fixtures/software-update.ts +63 -0
  487. package/src/components/product-demo/fixtures/tickets-board.ts +100 -0
  488. package/src/components/product-demo/index.ts +7 -0
  489. package/src/components/product-demo/product-screen.tsx +94 -0
  490. package/src/components/product-demo/registry.ts +20 -0
  491. package/src/components/product-demo/screen-keys.ts +31 -0
  492. package/src/components/product-demo/screens/cloud-tenants.tsx +23 -0
  493. package/src/components/product-demo/screens/devices.tsx +41 -0
  494. package/src/components/product-demo/screens/knowledge.tsx +27 -0
  495. package/src/components/product-demo/screens/logs.tsx +113 -0
  496. package/src/components/product-demo/screens/policies.tsx +29 -0
  497. package/src/components/product-demo/screens/remote-desktop-picture.tsx +118 -0
  498. package/src/components/product-demo/screens/remote-session.tsx +46 -0
  499. package/src/components/product-demo/screens/software-update.tsx +97 -0
  500. package/src/components/product-demo/screens/tickets-board.tsx +28 -0
  501. package/src/components/product-demo/types.ts +10 -0
  502. package/src/components/ui/index.ts +1 -0
  503. package/src/components/ui/product-screen-frame.tsx +136 -0
  504. package/src/components/ui/radio-group.tsx +16 -4
  505. package/src/components/ui/snap-carousel.tsx +26 -1
  506. package/src/components/ui/tag.tsx +5 -0
  507. package/src/hooks/ui/index.ts +1 -0
  508. package/src/hooks/ui/use-header-height.ts +51 -2
  509. package/src/hooks/ui/use-sticky-toolbar.ts +60 -0
  510. package/src/hooks/use-location-hash.ts +9 -5
  511. package/src/hooks/use-scroll-to-hash.ts +9 -1
  512. package/src/types/case-study.ts +21 -1
  513. package/src/utils/date-utils.ts +8 -1
  514. package/src/utils/index.ts +5 -0
  515. package/src/utils/open-in-new-tab.ts +12 -0
  516. package/src/utils/same-page-hash-nav.ts +57 -0
  517. package/src/utils/scroll-into-view.ts +21 -5
  518. package/dist/chunk-BM5MVGH3.cjs +0 -499
  519. package/dist/chunk-CUME3VTQ.js +0 -144
  520. package/dist/chunk-CZ7Y7UG4.js +0 -732
  521. package/dist/chunk-FLKJYMVB.js +0 -499
  522. package/dist/chunk-OF6GEI5A.cjs +0 -144
  523. package/dist/chunk-UVTD52MD.cjs +0 -732
@@ -1,7 +1,14 @@
1
1
  'use client';
2
2
 
3
3
  import { useState, useRef, useCallback, useEffect, useMemo } from 'react';
4
- import { getScrollableAncestor, scrollElementIntoView } from '../../utils/scroll-into-view';
4
+ import {
5
+ ACTIVE_ANCHOR_ATTRIBUTE,
6
+ getHashTargetElement,
7
+ isScrollSyncedHash,
8
+ normalizeHashFragment,
9
+ replaceLocationHash,
10
+ } from '../../utils/same-page-hash-nav';
11
+ import { declaredScrollMarginTop, getScrollableAncestor, scrollElementIntoView } from '../../utils/scroll-into-view';
5
12
 
6
13
  // Default sticky-chrome height. Used for BOTH the scroll target offset (where a
7
14
  // clicked section lands) AND the active-section detection threshold (where the
@@ -15,6 +22,11 @@ const SCROLL_OFFSET = 100;
15
22
  // so the join is unambiguous and the key can be split back apart.
16
23
  const ID_SEPARATOR = '\n';
17
24
 
25
+ // A section that a link just landed on sits ON the line, give or take a
26
+ // sub-pixel of layout rounding: without this it reads as "not reached yet" and
27
+ // the section above stays active (and, with `syncHash`, takes the URL back).
28
+ const LINE_TOLERANCE_PX = 1;
29
+
18
30
  interface ScrollSpySection {
19
31
  id: string;
20
32
  title?: string;
@@ -23,13 +35,35 @@ interface ScrollSpySection {
23
35
 
24
36
  export interface UseScrollSpyOptions {
25
37
  /**
26
- * Keep the URL's `#hash` on the section being read (`replaceState`: no
38
+ * Keep the URL's `#hash` on where the reader IS (`replaceLocationHash`: no
27
39
  * history entry, and no `hashchange`, so `useScrollToHash` never re-scrolls
28
40
  * to it) — as the user SCROLLS, and when a rail click scrolls for them.
29
41
  * Above the first section the hash is cleared. Only a scroll or a click
30
42
  * writes it — mounting a page never adds a hash.
43
+ *
44
+ * TWO LEVELS. The hash names the section being read, or an anchor INSIDE it:
45
+ * - a section that marks one of its descendants with
46
+ * `ACTIVE_ANCHOR_ATTRIBUTE` (and an `id`) is named by that child: a tab
47
+ * group whose open tab has its own anchor. The section remembers its
48
+ * child while the reader is elsewhere, so coming back restores it;
49
+ * - otherwise a hash that already names something inside the section (a
50
+ * card, a question a link landed on) is finer than the section's own and
51
+ * is kept until the reader leaves the section.
52
+ *
53
+ * RELOAD. The browser restores the exact scroll position and the hash only
54
+ * mirrors it, so nothing scrolls (`useScrollToHash` stands down for a synced
55
+ * hash). When the two disagree (the position was not restored: a scroll
56
+ * container, a layout that changed), the hash wins and the spy scrolls to
57
+ * it, once, without a tween.
31
58
  */
32
59
  syncHash?: boolean;
60
+ /**
61
+ * What is active above the first section. `'first'` (default): the first
62
+ * section, a table of contents that always has a current entry. `'none'`:
63
+ * nothing (`activeSection` is `''`), for a page with a hero above its
64
+ * sections, so the nav and the URL (no hash there) say the same thing.
65
+ */
66
+ aboveFirst?: 'first' | 'none';
33
67
  /**
34
68
  * Sticky-chrome height in px: where a clicked section lands AND the line a
35
69
  * section's top must pass to become the active one. One number for both, so
@@ -38,12 +72,29 @@ export interface UseScrollSpyOptions {
38
72
  headerOffset?: number;
39
73
  }
40
74
 
41
- /** Point the URL's hash at `sectionId` (or clear it) without a history entry or a `hashchange`. */
42
- function replaceHash(sectionId: string | null): void {
43
- const { pathname, search, hash } = window.location;
44
- const next = sectionId ? `#${sectionId}` : '';
45
- if (hash === next) return;
46
- window.history.replaceState(window.history.state, '', `${pathname}${search}${next}`);
75
+ /** The id the URL's hash names, or `''`. */
76
+ function currentHashId(): string {
77
+ return normalizeHashFragment(window.location.hash).slice(1);
78
+ }
79
+
80
+ /** The child anchor a section declares as its active one, if any (`ACTIVE_ANCHOR_ATTRIBUTE`). */
81
+ function activeChildAnchor(section: HTMLElement): string | null {
82
+ return section.querySelector<HTMLElement>(`[${ACTIVE_ANCHOR_ATTRIBUTE}][id]`)?.id ?? null;
83
+ }
84
+
85
+ /** Whether the URL's hash names `section` or something inside it. */
86
+ function hashIsWithin(section: HTMLElement): boolean {
87
+ return section.contains(getHashTargetElement(currentHashId()));
88
+ }
89
+
90
+ /**
91
+ * The hash for a section being READ: its active child, else the hash already
92
+ * in the URL when it names something inside the section, else the section.
93
+ */
94
+ function hashForSection(sectionId: string): string {
95
+ const section = document.getElementById(sectionId);
96
+ if (!section) return sectionId;
97
+ return activeChildAnchor(section) ?? (hashIsWithin(section) ? currentHashId() : sectionId);
47
98
  }
48
99
 
49
100
  /**
@@ -108,9 +159,11 @@ export function useScrollSpy(
108
159
  sections: ScrollSpySection[] | undefined,
109
160
  options: UseScrollSpyOptions = {},
110
161
  ): UseScrollSpyReturn {
111
- const { syncHash = false, headerOffset = SCROLL_OFFSET } = options;
162
+ const { syncHash = false, headerOffset = SCROLL_OFFSET, aboveFirst = 'first' } = options;
112
163
  const [activeSection, setActiveSection] = useState('');
113
164
  const isScrollingFromClick = useRef(false);
165
+ // The restored-position check (see `syncHash`) runs once per page, not on every re-subscription.
166
+ const restoredChecked = useRef(false);
114
167
 
115
168
  // The scroll listener only ever needs the section IDS, and callers rebuild
116
169
  // the `sections` array on every render — so the value-stable joined key IS
@@ -128,7 +181,9 @@ export function useScrollSpy(
128
181
  setActiveSection(sectionId);
129
182
  // The click IS the reader's position now: say so in the URL right away
130
183
  // rather than waiting for a scroll event the click guard below swallows.
131
- if (syncHash) replaceHash(sectionId);
184
+ // A click on a section's own entry goes to its head: its active child
185
+ // still names it, a finer hash from an earlier link does not.
186
+ if (syncHash) replaceLocationHash(activeChildAnchor(targetElement) ?? sectionId);
132
187
 
133
188
  scrollElementIntoView(targetElement, { headerOffset });
134
189
 
@@ -154,12 +209,17 @@ export function useScrollSpy(
154
209
 
155
210
  const scrollTop = scroller.scrollTop();
156
211
  const viewportTop = scroller.viewportTop();
157
- const scrollPosition = scrollTop + headerOffset;
158
212
  // A section's top in the scroller's coordinates. `offsetTop` is relative
159
213
  // to the nearest POSITIONED ancestor, which is neither the document nor
160
214
  // the scroll container inside most layouts — measure from the viewport
161
215
  // and translate.
162
216
  const sectionTop = (element: HTMLElement) => element.getBoundingClientRect().top - viewportTop + scrollTop;
217
+ // The line a section's top must reach is where a link LANDS it: the
218
+ // offset, or the section's own larger `scroll-margin-top` (the rule
219
+ // `scrollElementIntoView` lands by). One number for both, per section.
220
+ const reached = (element: HTMLElement) =>
221
+ scrollTop + Math.max(headerOffset, declaredScrollMarginTop(element)) + LINE_TOLERANCE_PX >= sectionTop(element);
222
+ const first = document.getElementById(sectionIds[0] ?? '');
163
223
  let currentSection = sectionIds[0] ?? '';
164
224
 
165
225
  // At the bottom of the page the last sections can never reach the offset
@@ -175,20 +235,35 @@ export function useScrollSpy(
175
235
  } else {
176
236
  for (let i = sectionIds.length - 1; i >= 0; i--) {
177
237
  const element = document.getElementById(sectionIds[i]);
178
- if (element && scrollPosition >= sectionTop(element)) {
238
+ if (element && reached(element)) {
179
239
  currentSection = sectionIds[i];
180
240
  break;
181
241
  }
182
242
  }
183
243
  }
184
244
 
185
- setActiveSection(prev => (prev !== currentSection ? currentSection : prev));
245
+ const isAboveFirst = !atBottom && first !== null && !reached(first);
246
+ const active = isAboveFirst && aboveFirst === 'none' ? '' : currentSection;
247
+ setActiveSection(prev => (prev !== active ? active : prev));
186
248
 
187
- if (syncHash && fromScroll) {
188
- const first = document.getElementById(sectionIds[0] ?? '');
189
- const aboveFirst = !atBottom && first !== null && scrollPosition < sectionTop(first);
190
- replaceHash(aboveFirst ? null : currentSection);
249
+ if (!syncHash) return;
250
+ if (fromScroll) {
251
+ replaceLocationHash(isAboveFirst ? null : hashForSection(currentSection));
252
+ return;
191
253
  }
254
+ // First pass with the sections on the page: a hash the reader's scrolling
255
+ // left behind (a reload) must agree with where the browser restored the
256
+ // page. It agrees when it names the section at the line or something
257
+ // inside it; otherwise the hash wins, in one instant write. A hash that
258
+ // names nothing in the sections known so far waits for the next set (a
259
+ // section that joins the nav after hydration).
260
+ if (restoredChecked.current || !isScrollSyncedHash()) return;
261
+ const target = getHashTargetElement(currentHashId());
262
+ const tracked = sectionIds.some(id => document.getElementById(id)?.contains(target) ?? false);
263
+ if (!target || !tracked) return;
264
+ restoredChecked.current = true;
265
+ const section = isAboveFirst ? null : document.getElementById(currentSection);
266
+ if (!section?.contains(target)) scrollElementIntoView(target, { headerOffset, behavior: 'instant' });
192
267
  };
193
268
 
194
269
  let scrollTimer: ReturnType<typeof setTimeout>;
@@ -204,7 +279,7 @@ export function useScrollSpy(
204
279
  scroller.target.removeEventListener('scroll', throttledScroll);
205
280
  clearTimeout(scrollTimer);
206
281
  };
207
- }, [sectionIdsKey, syncHash, headerOffset]);
282
+ }, [sectionIdsKey, syncHash, headerOffset, aboveFirst]);
208
283
 
209
284
  return { activeSection, handleSectionClick };
210
285
  }
@@ -2,6 +2,7 @@
2
2
 
3
3
  import type React from 'react';
4
4
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
5
+ import Link from '../../embed-shims/next-link';
5
6
  import { useScrollToHash } from '../../hooks/use-scroll-to-hash';
6
7
  import { useSelfFetch } from '../../hooks/use-self-fetch';
7
8
  import type { Faq } from '../../types/faq';
@@ -46,6 +47,13 @@ export interface FaqSectionProps {
46
47
  /** Fetch-URL prefix for third-party embeds / reverse proxies
47
48
  * ('' = same-origin relative). */
48
49
  apiBaseUrl?: string;
50
+ /**
51
+ * A block beside the questions (an "ask the assistant" card). From the
52
+ * content `lg` step the heading, the category nav and this block form a left
53
+ * column and the questions the right one; below it the block follows the
54
+ * questions. Absent: the single-column layout, unchanged.
55
+ */
56
+ aside?: React.ReactNode;
49
57
  }
50
58
 
51
59
  const DEFAULT_HEADING_TEXT = 'Frequently Asked Questions';
@@ -114,7 +122,12 @@ const groupKey = (g: FaqGroup): string => g.slug ?? UNCATEGORIZED_KEY;
114
122
  function GroupedFaqList({
115
123
  groups,
116
124
  categoryHeadingAs,
125
+ heading,
126
+ aside,
117
127
  }: {
128
+ /** With `aside`, the section heading: it sits in the left column above the category nav. */
129
+ heading?: React.ReactNode;
130
+ aside?: React.ReactNode;
118
131
  groups: FaqGroup[];
119
132
  /** Heading tag for each category, so the document outline nests correctly
120
133
  * under whatever owns the heading above this block: `h2` on the standalone
@@ -265,49 +278,69 @@ function GroupedFaqList({
265
278
  });
266
279
  }, []);
267
280
 
281
+ const categoryNav = navGroups.length > 1 && (
282
+ <nav aria-label="FAQ categories" className="flex flex-wrap gap-2">
283
+ {navGroups.map(group => {
284
+ const isActive = group.slug === activeSlug;
285
+ return (
286
+ <Link
287
+ key={group.slug}
288
+ href={`#${group.slug}`}
289
+ aria-current={isActive ? 'true' : undefined}
290
+ onClick={e => handleJump(e, group.slug as string)}
291
+ className={cn(
292
+ 'rounded-full border px-4 py-2 transition-colors text-h6',
293
+ isActive
294
+ ? 'border-ods-text-primary bg-ods-card text-ods-text-primary'
295
+ : 'border-ods-border bg-ods-card text-ods-text-secondary hover:border-ods-text-secondary hover:text-ods-text-primary',
296
+ )}
297
+ >
298
+ {group.section}
299
+ </Link>
300
+ );
301
+ })}
302
+ </nav>
303
+ );
304
+ const questions = (
305
+ <div className="space-y-10">
306
+ {groups.map(group => {
307
+ const key = groupKey(group);
308
+ return (
309
+ <section key={key} id={group.slug ?? undefined} className="scroll-mt-24 space-y-4">
310
+ {group.section && <CategoryHeading className={SECTION_HEADING_CLASS}>{group.section}</CategoryHeading>}
311
+ <FaqAccordion
312
+ // Re-key on item-hash changes so the remount picks up the new
313
+ // `defaultOpenIds` (the accordion is uncontrolled). Stable for
314
+ // section hashes — category navigation doesn't disturb state.
315
+ key={`${key}:${accordionKeySuffix}`}
316
+ items={group.items}
317
+ defaultOpenIds={defaultOpenByGroupKey?.get(key)}
318
+ />
319
+ </section>
320
+ );
321
+ })}
322
+ </div>
323
+ );
324
+
325
+ if (!aside) {
326
+ return (
327
+ <div className="space-y-8">
328
+ {categoryNav}
329
+ {questions}
330
+ </div>
331
+ );
332
+ }
333
+
334
+ // One instance of each block, placed by the grid: questions second in the
335
+ // document (and on a narrow area), in the right column from `lg`.
268
336
  return (
269
- <div className="space-y-8">
270
- {navGroups.length > 1 && (
271
- <nav aria-label="FAQ categories" className="flex flex-wrap gap-2">
272
- {navGroups.map(group => {
273
- const isActive = group.slug === activeSlug;
274
- return (
275
- <a
276
- key={group.slug}
277
- href={`#${group.slug}`}
278
- aria-current={isActive ? 'true' : undefined}
279
- onClick={e => handleJump(e, group.slug as string)}
280
- className={cn(
281
- 'rounded-full border px-4 py-2 transition-colors text-h6',
282
- isActive
283
- ? 'border-ods-text-primary bg-ods-card text-ods-text-primary'
284
- : 'border-ods-border bg-ods-card text-ods-text-secondary hover:border-ods-text-secondary hover:text-ods-text-primary',
285
- )}
286
- >
287
- {group.section}
288
- </a>
289
- );
290
- })}
291
- </nav>
292
- )}
293
- <div className="space-y-10">
294
- {groups.map(group => {
295
- const key = groupKey(group);
296
- return (
297
- <section key={key} id={group.slug ?? undefined} className="scroll-mt-24 space-y-4">
298
- {group.section && <CategoryHeading className={SECTION_HEADING_CLASS}>{group.section}</CategoryHeading>}
299
- <FaqAccordion
300
- // Re-key on item-hash changes so the remount picks up the new
301
- // `defaultOpenIds` (the accordion is uncontrolled). Stable for
302
- // section hashes — category navigation doesn't disturb state.
303
- key={`${key}:${accordionKeySuffix}`}
304
- items={group.items}
305
- defaultOpenIds={defaultOpenByGroupKey?.get(key)}
306
- />
307
- </section>
308
- );
309
- })}
337
+ <div className="grid gap-10 content-lg:grid-cols-[minmax(0,1fr)_minmax(0,2fr)] content-lg:grid-rows-[auto_1fr] content-lg:gap-x-16">
338
+ <div className="space-y-8">
339
+ {heading}
340
+ {categoryNav}
310
341
  </div>
342
+ <div className="content-lg:col-start-2 content-lg:row-span-2 content-lg:row-start-1">{questions}</div>
343
+ <div className="content-lg:col-start-1 content-lg:row-start-2">{aside}</div>
311
344
  </div>
312
345
  );
313
346
  }
@@ -359,6 +392,7 @@ export function FaqSection({
359
392
  className,
360
393
  minResults,
361
394
  apiBaseUrl = '',
395
+ aside,
362
396
  }: FaqSectionProps) {
363
397
  const url = buildFaqsUrl(entityType, entityId, minResults, apiBaseUrl);
364
398
  // Memoized — useSelfFetch re-syncs on [initialData]; a fresh per-render
@@ -398,8 +432,13 @@ export function FaqSection({
398
432
  return (
399
433
  <>
400
434
  <section className={className ?? 'space-y-10'}>
401
- {headingNode}
402
- <GroupedFaqList groups={groups} categoryHeadingAs={heading === null ? 'h2' : 'h3'} />
435
+ {!aside && headingNode}
436
+ <GroupedFaqList
437
+ groups={groups}
438
+ categoryHeadingAs={heading === null ? 'h2' : 'h3'}
439
+ heading={aside ? headingNode : undefined}
440
+ aside={aside}
441
+ />
403
442
  </section>
404
443
  {schema && (
405
444
  <script
@@ -38,6 +38,10 @@ interface ArrayEntryManagerProps<T extends object> {
38
38
  titleFieldKey?: keyof T;
39
39
  titlePlaceholder?: string;
40
40
  isSaving?: boolean; // Loading state for save button
41
+ /** The most entries the list holds; at the cap the add button is disabled. Omitted: no cap. */
42
+ maxItems?: number;
43
+ /** Where a new entry lands. Default `start` (the newest on top); `end` for a list whose ORDER is its meaning. */
44
+ addPosition?: 'start' | 'end';
41
45
  }
42
46
 
43
47
  export function ArrayEntryManager<T extends object>({
@@ -57,6 +61,8 @@ export function ArrayEntryManager<T extends object>({
57
61
  titleFieldKey,
58
62
  titlePlaceholder,
59
63
  isSaving = false,
64
+ maxItems,
65
+ addPosition = 'start',
60
66
  }: ArrayEntryManagerProps<T>) {
61
67
  // Local state for draft changes (when requireSave=true)
62
68
  const [draftItems, setDraftItems] = useState<T[]>(items);
@@ -100,7 +106,9 @@ export function ArrayEntryManager<T extends object>({
100
106
 
101
107
  const addItem = () => {
102
108
  const newItem = { [fieldKey]: '' } as T;
103
- setWorkingItems([newItem, ...workingItems]); // Add at top for better UX
109
+ if (maxItems !== undefined && workingItems.length >= maxItems) return;
110
+ // On top by default (the newest is what is being typed); at the end for an ordered list.
111
+ setWorkingItems(addPosition === 'end' ? [...workingItems, newItem] : [newItem, ...workingItems]);
104
112
  };
105
113
 
106
114
  const removeItem = (index: number) => {
@@ -180,6 +188,7 @@ export function ArrayEntryManager<T extends object>({
180
188
  variant="outline"
181
189
  size="small-legacy"
182
190
  onClick={addItem}
191
+ disabled={maxItems !== undefined && workingItems.length >= maxItems}
183
192
  leftIcon={<Plus className="h-4 w-4" />}
184
193
  className="text-h6"
185
194
  >
@@ -83,6 +83,8 @@ export interface BoardProps {
83
83
  onApprove?: (ticketId: string, requestId?: string) => void | Promise<void>;
84
84
  onReject?: (ticketId: string, requestId?: string) => void | Promise<void>;
85
85
  collapseStorageKey?: string;
86
+ /** The lanes folded when the board mounts, by column id. Read only without `collapseStorageKey`. */
87
+ initialCollapsed?: Record<string, boolean>;
86
88
  loadMoreRootMargin?: string;
87
89
  className?: string;
88
90
  }
@@ -138,10 +140,11 @@ function DragBoard({
138
140
  onApprove,
139
141
  onReject,
140
142
  collapseStorageKey,
143
+ initialCollapsed,
141
144
  loadMoreRootMargin,
142
145
  className,
143
146
  }: BoardProps) {
144
- const { collapsed, toggle } = useBoardCollapse(collapseStorageKey);
147
+ const { collapsed, toggle } = useBoardCollapse(collapseStorageKey, initialCollapsed);
145
148
 
146
149
  const {
147
150
  scrollRef,
@@ -22,6 +22,7 @@ import { cn } from '../../../utils/cn';
22
22
  import { formatTicketRelativeTime, formatTicketFullTimestamp } from '../../../utils/date-utils';
23
23
  import { holdMoveDragEffect } from '../../../utils/drag-effect';
24
24
  import { getReadableTextColor } from '../../../utils/ods-color-utils';
25
+ import { AgentMark } from '../../agent-mark';
25
26
  import {
26
27
  ClockIcon,
27
28
  DotsLoaderIcon,
@@ -110,7 +111,7 @@ export function TicketCardBody({
110
111
  const showDeviceRow = !!(ticket.deviceHostnames?.length || ticket.organizationName);
111
112
  const deviceText = [ticket.deviceHostnames?.join(', '), ticket.organizationName].filter(Boolean).join(', ');
112
113
 
113
- const hasRightSection = !!(ticket.priority || ticket.assignees?.length || renderAssignSlot);
114
+ const hasRightSection = !!(ticket.priority || ticket.agent || ticket.assignees?.length || renderAssignSlot);
114
115
  const rightSection = hasRightSection ? (
115
116
  <div className="pointer-events-auto flex shrink-0 items-center gap-[var(--spacing-system-xsf)]">
116
117
  {ticket.priority && (
@@ -119,6 +120,15 @@ export function TicketCardBody({
119
120
  aria-label={`Priority: ${ticket.priority}`}
120
121
  />
121
122
  )}
123
+ {ticket.agent && (
124
+ <span
125
+ role="img"
126
+ aria-label={`Owned by ${ticket.agent === 'fae' ? 'Fae' : 'Mingo'}`}
127
+ className="flex size-8 shrink-0 items-center justify-center overflow-hidden rounded-full border border-ods-border bg-ods-bg"
128
+ >
129
+ <AgentMark agent={ticket.agent} className={ticket.agent === 'fae' ? 'size-full' : 'size-5'} />
130
+ </span>
131
+ )}
122
132
  {renderAssignSlot ? (
123
133
  renderAssignSlot(ticket)
124
134
  ) : ticket.assignees?.length ? (
@@ -33,10 +33,11 @@ export function TouchBoard({
33
33
  onApprove,
34
34
  onReject,
35
35
  collapseStorageKey,
36
+ initialCollapsed,
36
37
  loadMoreRootMargin,
37
38
  className,
38
39
  }: BoardProps) {
39
- const { collapsed, toggle } = useBoardCollapse(collapseStorageKey);
40
+ const { collapsed, toggle } = useBoardCollapse(collapseStorageKey, initialCollapsed);
40
41
 
41
42
  return (
42
43
  <div className={cn('flex h-full min-h-0 flex-col', className)}>
@@ -1,3 +1,4 @@
1
+ import type { AgentName } from '../../agent-mark';
1
2
  import type { PendingToolCallData } from '../../chat/types';
2
3
  import type { TicketStatus } from '../../ui/ticket-status-tag';
3
4
 
@@ -68,6 +69,8 @@ export interface BoardTicket {
68
69
  escalatedByUser?: boolean;
69
70
  /** Single live-activity indicator rendered as the card's footer row. */
70
71
  activity?: BoardTicketActivity;
72
+ /** The AI agent that owns the ticket: its mark is shown with the assignees. */
73
+ agent?: AgentName;
71
74
  }
72
75
 
73
76
  export interface BoardColumnDef {
@@ -11,9 +11,14 @@ export interface UseBoardCollapseReturn {
11
11
  setCollapsed: (columnId: string, value: boolean) => void;
12
12
  }
13
13
 
14
- export function useBoardCollapse(storageKey?: string): UseBoardCollapseReturn {
14
+ /**
15
+ * Which lanes are collapsed. With a `storageKey` the map is the user's, kept in
16
+ * local storage; without one it lives in memory and starts from `initial` (a
17
+ * host that shows a board with some lanes already folded).
18
+ */
19
+ export function useBoardCollapse(storageKey?: string, initial?: BoardCollapseMap): UseBoardCollapseReturn {
15
20
  const [persisted, setPersisted] = useLocalStorage<BoardCollapseMap>(storageKey ?? '__board_collapse_unused__', {});
16
- const [memory, setMemory] = useState<BoardCollapseMap>({});
21
+ const [memory, setMemory] = useState<BoardCollapseMap>(initial ?? {});
17
22
 
18
23
  const collapsed = storageKey ? persisted : memory;
19
24
  const setMap = storageKey ? setPersisted : setMemory;