@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
@@ -2,8 +2,10 @@
2
2
 
3
3
  import type React from 'react';
4
4
  import { useEffect, useState, useCallback, useRef } from 'react';
5
+ import Link from '../../embed-shims/next-link';
5
6
  import { cn } from '../../utils';
6
7
  import { scrollElementIntoView } from '../../utils/scroll-into-view';
8
+ import { ScrollShadow } from '../ui/scroll-fade';
7
9
 
8
10
  export interface StickyNavSection {
9
11
  id: string;
@@ -17,6 +19,85 @@ interface StickySectionNavProps {
17
19
  className?: string;
18
20
  ribbonPosition?: 'left' | 'right';
19
21
  ribbonColor?: string;
22
+ /**
23
+ * `vertical` (default): the table of contents beside a document.
24
+ * `horizontal`: a bar across the page (stick it under the header with
25
+ * `className`): `brand` at the start, the sections as a pill row that scrolls
26
+ * sideways when it does not fit, `action` at the end.
27
+ */
28
+ orientation?: 'vertical' | 'horizontal';
29
+ /** Horizontal only: what the bar belongs to (a product mark and name). Hidden on a narrow area. */
30
+ brand?: React.ReactNode;
31
+ /** Horizontal only: one link or button at the end of the bar. Hidden on a narrow area. */
32
+ action?: React.ReactNode;
33
+ /** Names the navigation for assistive tech. */
34
+ label?: string;
35
+ }
36
+
37
+ function HorizontalSectionNav({
38
+ sections,
39
+ activeSection,
40
+ onSectionClick,
41
+ className,
42
+ brand,
43
+ action,
44
+ label,
45
+ }: Omit<StickySectionNavProps, 'ribbonPosition' | 'ribbonColor' | 'orientation'>) {
46
+ const navRef = useRef<HTMLElement>(null);
47
+ // Keep the pill of the section being read in view when the row scrolls. The
48
+ // row is the pill's parent: the lib's `ScrollShadow` owns the scrolling element.
49
+ useEffect(() => {
50
+ const pill = navRef.current?.querySelector<HTMLElement>(`[data-section="${CSS.escape(activeSection)}"]`);
51
+ const row = pill?.parentElement;
52
+ if (!row || !pill) return;
53
+ const left = pill.offsetLeft - row.offsetLeft;
54
+ if (left < row.scrollLeft || left + pill.offsetWidth > row.scrollLeft + row.clientWidth) {
55
+ row.scrollTo({ left: Math.max(0, left - 12), behavior: 'smooth' });
56
+ }
57
+ }, [activeSection]);
58
+
59
+ return (
60
+ <nav ref={navRef} aria-label={label} className={cn('flex h-14 items-stretch gap-6 bg-ods-bg', className)}>
61
+ {brand && (
62
+ <div className="hidden shrink-0 items-center gap-2.5 border-r border-ods-border pr-6 text-ods-text-primary text-h4 content-lg:flex">
63
+ {brand}
64
+ </div>
65
+ )}
66
+ {/* The scrolling row and its edge fades are the lib's one pattern (`ScrollShadow`), not a second one. */}
67
+ <ScrollShadow
68
+ axis="horizontal"
69
+ className="min-w-0 flex-1"
70
+ scrollClassName="flex h-full items-center gap-1 [scrollbar-width:none] content-lg:items-stretch"
71
+ >
72
+ {sections.map(section => {
73
+ const active = activeSection === section.id;
74
+ return (
75
+ <Link
76
+ key={section.id}
77
+ href={`#${section.id}`}
78
+ data-section={section.id}
79
+ aria-current={active ? 'location' : undefined}
80
+ onClick={event => {
81
+ event.preventDefault();
82
+ onSectionClick(section.id);
83
+ }}
84
+ className={cn(
85
+ // A pill on a narrow area; from the content `lg` step a tab the height of the bar.
86
+ 'flex shrink-0 items-center whitespace-nowrap rounded-full border px-3 py-1.5 transition-colors text-h6 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ods-accent',
87
+ 'content-lg:rounded-none content-lg:border-x-0 content-lg:border-b-2 content-lg:border-t-0 content-lg:py-0',
88
+ active
89
+ ? 'border-ods-border bg-ods-card text-ods-text-primary content-lg:border-ods-accent content-lg:bg-transparent content-lg:bg-gradient-to-b content-lg:from-transparent content-lg:to-ods-accent/10'
90
+ : 'border-transparent text-ods-text-secondary hover:text-ods-text-primary content-lg:hover:bg-ods-bg-hover',
91
+ )}
92
+ >
93
+ {section.label}
94
+ </Link>
95
+ );
96
+ })}
97
+ </ScrollShadow>
98
+ {action && <div className="hidden shrink-0 items-center content-lg:flex">{action}</div>}
99
+ </nav>
100
+ );
20
101
  }
21
102
 
22
103
  /**
@@ -30,11 +111,28 @@ export function StickySectionNav({
30
111
  className,
31
112
  ribbonPosition = 'left',
32
113
  ribbonColor = 'var(--color-accent-primary)',
114
+ orientation = 'vertical',
115
+ brand,
116
+ action,
117
+ label,
33
118
  }: StickySectionNavProps) {
119
+ if (orientation === 'horizontal') {
120
+ return (
121
+ <HorizontalSectionNav
122
+ sections={sections}
123
+ activeSection={activeSection}
124
+ onSectionClick={onSectionClick}
125
+ className={className}
126
+ brand={brand}
127
+ action={action}
128
+ label={label}
129
+ />
130
+ );
131
+ }
34
132
  const navHeight = sections.length * 40; // 40px per item (h-10)
35
133
 
36
134
  return (
37
- <nav className={cn('relative bg-ods-bg', className)}>
135
+ <nav aria-label={label} className={cn('relative bg-ods-bg', className)}>
38
136
  {/* Background gray vertical line for all nav items */}
39
137
  <div
40
138
  className="absolute bg-ods-border"
@@ -0,0 +1,78 @@
1
+ 'use client';
2
+
3
+ import { createContext, type ReactNode, useContext, useMemo } from 'react';
4
+ import { DEMO_ORGANIZATIONS, DEMO_PEOPLE, type DemoOrganizationKey, type DemoPersonKey } from './fixtures/shared';
5
+
6
+ /**
7
+ * What a host adds to the product screens' cast. The people and customers of
8
+ * the stories are the library's; their PICTURES are the host's, because the
9
+ * library holds no storage address:
10
+ * - `people`: a portrait by persona slug (`tech`, `leo`, `alex-reed`, ...);
11
+ * - `organizations`: a logo by customer key (`acme`, `northbridge`,
12
+ * `harbor`).
13
+ * Anything left out falls back to initials, the way the product draws a
14
+ * person or a customer that has no picture.
15
+ */
16
+ export interface ProductDemoCast {
17
+ people?: Readonly<Record<string, { avatarUrl?: string | null } | undefined>>;
18
+ organizations?: Readonly<Record<string, { logoUrl?: string | null } | undefined>>;
19
+ }
20
+
21
+ export type DemoPersonRole = (typeof DEMO_PEOPLE)[DemoPersonKey]['role'];
22
+
23
+ export interface DemoPerson {
24
+ id: string;
25
+ slug: string;
26
+ name: string;
27
+ initials: string;
28
+ /** A technician works in the product; an end user is the customer's employee. */
29
+ role: DemoPersonRole;
30
+ /** The host's portrait; absent: the product draws its initials. */
31
+ avatarUrl?: string;
32
+ }
33
+
34
+ export interface DemoOrganization {
35
+ id: string;
36
+ name: string;
37
+ initials: string;
38
+ domain: string;
39
+ /** The host's logo; absent: the product draws the customer's initials. */
40
+ logoUrl?: string;
41
+ }
42
+
43
+ /** The cast a fixture is built from: every person and customer, with their pictures resolved. */
44
+ export interface DemoCast {
45
+ person: (key: DemoPersonKey) => DemoPerson;
46
+ organization: (key: DemoOrganizationKey) => DemoOrganization;
47
+ }
48
+
49
+ /** The cast with the host's pictures applied; no argument: initials everywhere. */
50
+ export function resolveProductDemoCast(cast?: ProductDemoCast | null): DemoCast {
51
+ return {
52
+ person: key => {
53
+ const person = DEMO_PEOPLE[key];
54
+ return { ...person, avatarUrl: cast?.people?.[person.slug]?.avatarUrl ?? undefined };
55
+ },
56
+ organization: key => ({
57
+ ...DEMO_ORGANIZATIONS[key],
58
+ logoUrl: cast?.organizations?.[key]?.logoUrl ?? undefined,
59
+ }),
60
+ };
61
+ }
62
+
63
+ const ProductDemoCastContext = createContext<ProductDemoCast | null>(null);
64
+
65
+ /**
66
+ * Gives every product screen under it the host's pictures of the cast. Mount
67
+ * it once around the screens of a page (an explorer, a hero window); a screen
68
+ * outside it still renders, with initials.
69
+ */
70
+ export function ProductDemoCastProvider({ cast, children }: { cast: ProductDemoCast | null; children: ReactNode }) {
71
+ return <ProductDemoCastContext.Provider value={cast}>{children}</ProductDemoCastContext.Provider>;
72
+ }
73
+
74
+ /** The resolved cast for a screen's fixture; stable while the host's cast is. */
75
+ export function useProductDemoCast(): DemoCast {
76
+ const cast = useContext(ProductDemoCastContext);
77
+ return useMemo(() => resolveProductDemoCast(cast), [cast]);
78
+ }
@@ -0,0 +1,63 @@
1
+ import type { TenantRow } from '../../features/cloud-tenants';
2
+ import type { DemoCast, DemoOrganization } from '../cast';
3
+ import { DEMO_NOW, demoMinutesAgo } from './shared';
4
+
5
+ function tenant(
6
+ organization: DemoOrganization,
7
+ provider: TenantRow['provider'],
8
+ rest: Pick<TenantRow, 'accessState' | 'userCount' | 'lastReadAt'>,
9
+ ): TenantRow {
10
+ return {
11
+ id: `tenant-${organization.id}-${provider}`,
12
+ name: organization.name,
13
+ provider,
14
+ domain: organization.domain,
15
+ customer: { name: organization.name, imageUrl: organization.logoUrl },
16
+ ...rest,
17
+ };
18
+ }
19
+
20
+ export interface CloudTenantsFixture {
21
+ rows: TenantRow[];
22
+ /** The clock "Last read" is relative to. */
23
+ now: Date;
24
+ }
25
+
26
+ /** The three customers' directories, a Microsoft 365 and a Google Workspace tenant each: all connected with write access but one that lost its connection. */
27
+ export function buildCloudTenantsFixture(cast: DemoCast): CloudTenantsFixture {
28
+ return {
29
+ rows: [
30
+ tenant(cast.organization('acme'), 'MICROSOFT_365', {
31
+ accessState: 'WRITE_ENABLED',
32
+ userCount: 212,
33
+ lastReadAt: demoMinutesAgo(9),
34
+ }),
35
+ tenant(cast.organization('northbridge'), 'GOOGLE_WORKSPACE', {
36
+ accessState: 'WRITE_ENABLED',
37
+ userCount: 48,
38
+ lastReadAt: demoMinutesAgo(15),
39
+ }),
40
+ tenant(cast.organization('harbor'), 'GOOGLE_WORKSPACE', {
41
+ accessState: 'DISCONNECTED',
42
+ userCount: 31,
43
+ lastReadAt: demoMinutesAgo(26 * 60),
44
+ }),
45
+ tenant(cast.organization('northbridge'), 'MICROSOFT_365', {
46
+ accessState: 'WRITE_ENABLED',
47
+ userCount: 52,
48
+ lastReadAt: demoMinutesAgo(21),
49
+ }),
50
+ tenant(cast.organization('acme'), 'GOOGLE_WORKSPACE', {
51
+ accessState: 'WRITE_ENABLED',
52
+ userCount: 18,
53
+ lastReadAt: demoMinutesAgo(34),
54
+ }),
55
+ tenant(cast.organization('harbor'), 'MICROSOFT_365', {
56
+ accessState: 'WRITE_ENABLED',
57
+ userCount: 29,
58
+ lastReadAt: demoMinutesAgo(47),
59
+ }),
60
+ ],
61
+ now: new Date(DEMO_NOW),
62
+ };
63
+ }
@@ -0,0 +1,87 @@
1
+ import type { DeviceFilters, DeviceRow } from '../../features/devices';
2
+ import type { DemoCast } from '../cast';
3
+ import { DEMO_DEVICES, demoMinutesAgo } from './shared';
4
+
5
+ type DemoDevice = (typeof DEMO_DEVICES)[keyof typeof DEMO_DEVICES];
6
+
7
+ function device(
8
+ cast: DemoCast,
9
+ demo: DemoDevice,
10
+ type: 'laptop' | 'desktop' | 'server',
11
+ status: 'ONLINE' | 'OFFLINE',
12
+ lastSeenMinutesAgo: number,
13
+ ): DeviceRow {
14
+ const organization = cast.organization(demo.organization);
15
+ return {
16
+ id: demo.id,
17
+ machineId: demo.id,
18
+ hostname: demo.hostname,
19
+ nickname: undefined,
20
+ status,
21
+ type,
22
+ osType: demo.os,
23
+ last_seen: demoMinutesAgo(lastSeenMinutesAgo),
24
+ organizationId: organization.id,
25
+ organization: organization.name,
26
+ organizationImageUrl: organization.logoUrl,
27
+ };
28
+ }
29
+
30
+ /** Rows counted by one of their fields: the facets a server would send for exactly these rows. */
31
+ function countBy(
32
+ devices: DeviceRow[],
33
+ pick: (row: DeviceRow) => string | undefined,
34
+ ): { value: string; count: number }[] {
35
+ const counts = new Map<string, number>();
36
+ for (const row of devices) {
37
+ const value = pick(row);
38
+ if (value) counts.set(value, (counts.get(value) ?? 0) + 1);
39
+ }
40
+ return Array.from(counts, ([value, count]) => ({ value, count }));
41
+ }
42
+
43
+ export interface DevicesFixture {
44
+ devices: DeviceRow[];
45
+ deviceFilters: DeviceFilters;
46
+ totalCount: number;
47
+ }
48
+
49
+ /** The fleet of the three demo customers on an ordinary morning: a mix of states, one desktop offline since last night. */
50
+ export function buildDevicesFixture(cast: DemoCast): DevicesFixture {
51
+ const devices: DeviceRow[] = [
52
+ device(cast, DEMO_DEVICES.frontDesk, 'laptop', 'ONLINE', 2),
53
+ device(cast, DEMO_DEVICES.reception, 'desktop', 'OFFLINE', 190),
54
+ device(cast, DEMO_DEVICES.mayaAir, 'laptop', 'ONLINE', 1),
55
+ device(cast, DEMO_DEVICES.buildServer, 'server', 'ONLINE', 1),
56
+ device(cast, DEMO_DEVICES.leoThinkPad, 'laptop', 'OFFLINE', 64),
57
+ device(cast, DEMO_DEVICES.samT14, 'laptop', 'ONLINE', 3),
58
+ device(cast, DEMO_DEVICES.jenSurface, 'laptop', 'ONLINE', 6),
59
+ device(cast, DEMO_DEVICES.priyaXps, 'laptop', 'ONLINE', 2),
60
+ ];
61
+ const deviceFilters: DeviceFilters = {
62
+ statuses: countBy(devices, row => row.status),
63
+ deviceTypes: countBy(devices, row => row.type),
64
+ osTypes: countBy(devices, row => row.osType),
65
+ organizationIds: countBy(devices, row => row.organizationId).map(entry => ({
66
+ ...entry,
67
+ label: devices.find(row => row.organizationId === entry.value)?.organization ?? entry.value,
68
+ })),
69
+ tagKeys: [],
70
+ filteredCount: devices.length,
71
+ };
72
+ return { devices, deviceFilters, totalCount: devices.length };
73
+ }
74
+
75
+ /** What the Devices page shows for a search: the query in the field and the rows that answer it. */
76
+ export const DEVICES_SEARCH_QUERY = 'Windows';
77
+
78
+ /** The fleet narrowed to its Windows devices, the way the list answers that search. */
79
+ export function buildWindowsDevicesFixture(cast: DemoCast): DevicesFixture {
80
+ const fleet = buildDevicesFixture(cast);
81
+ const devices = fleet.devices.filter(row => row.osType === 'WINDOWS');
82
+ return {
83
+ devices,
84
+ deviceFilters: { ...fleet.deviceFilters, filteredCount: devices.length },
85
+ totalCount: devices.length,
86
+ };
87
+ }
@@ -0,0 +1,48 @@
1
+ import type { KnowledgeBaseArticleViewProps } from '../../features/knowledge-base';
2
+ import type { DemoCast } from '../cast';
3
+ import { DEMO_DEVICES } from './shared';
4
+
5
+ export interface KnowledgeFixture {
6
+ article: Pick<KnowledgeBaseArticleViewProps, 'title' | 'tags' | 'author' | 'updatedLabel' | 'status'>;
7
+ /** The article's body, in the markdown the product stores. */
8
+ content: string;
9
+ }
10
+
11
+ /**
12
+ * One article of a client's knowledge base, open: the runbook a technician (or
13
+ * the assistant) follows to set up a new hire's laptop. It names the client,
14
+ * its author and the steps, so the page says what the knowledge base is for.
15
+ */
16
+ export function buildKnowledgeFixture(cast: DemoCast): KnowledgeFixture {
17
+ const client = cast.organization('acme');
18
+ const author = cast.person('dana');
19
+ return {
20
+ article: {
21
+ title: `New laptop runbook: ${client.name}`,
22
+ tags: [
23
+ { id: 'kb-tag-client', label: client.name },
24
+ { id: 'kb-tag-onboarding', label: 'onboarding' },
25
+ { id: 'kb-tag-runbook', label: 'runbook' },
26
+ ],
27
+ author: { name: author.name, imageUrl: author.avatarUrl },
28
+ updatedLabel: '10/06/2026',
29
+ status: 'PUBLISHED',
30
+ },
31
+ content: [
32
+ `How ${client.name} sets up a laptop for a new hire. Every step can be run by a technician or asked of the assistant.`,
33
+ '',
34
+ '## Before the first day',
35
+ '',
36
+ '1. **Enroll the laptop.** Sign in with the enrollment account. It appears in Devices within a minute.',
37
+ '2. **Turn on disk encryption.** The "Disk encryption" policy does it. Check that the recovery key is saved.',
38
+ '3. **Install the standard apps.** Chrome, Slack, Microsoft 365 and the VPN client from the software catalog.',
39
+ `4. **Create the accounts.** Mailbox, groups and MFA in the ${client.name} Microsoft 365 tenant.`,
40
+ '',
41
+ '## On the first day',
42
+ '',
43
+ `1. **Join the office Wi-Fi.** Staff network only. The guest network is for visitors.`,
44
+ `2. **Add the printers.** Front desk and second floor, the same drivers as ${DEMO_DEVICES.reception.hostname}.`,
45
+ '3. **Hand over.** Sign in together once and close the onboarding ticket.',
46
+ ].join('\n'),
47
+ };
48
+ }
@@ -0,0 +1,103 @@
1
+ import { logSeverityVariant, type LogDrawerProps, type LogsTableViewProps, type UiLogEntry } from '../../features/logs';
2
+ import type { DeviceCardProps } from '../../ui/device-card';
3
+ import { DEMO_DEVICES, DEMO_ORGANIZATIONS, DEMO_PEOPLE, demoMinutesAgo } from './shared';
4
+
5
+ const DAY = new Intl.DateTimeFormat('en-US', { dateStyle: 'short', timeZone: 'UTC' });
6
+ const TIME = new Intl.DateTimeFormat('en-US', { timeStyle: 'short', timeZone: 'UTC' });
7
+
8
+ /** The table's own date and time rendering, pinned to one locale and zone so it never drifts. */
9
+ function displayTime(iso: string): string {
10
+ const date = new Date(iso);
11
+ return `${DAY.format(date)} ${TIME.format(date)}`;
12
+ }
13
+
14
+ function entry(
15
+ logId: string,
16
+ minutesAgo: number,
17
+ severity: 'INFO' | 'WARNING' | 'ERROR',
18
+ toolType: string,
19
+ device: UiLogEntry['device'],
20
+ summary: string,
21
+ ): UiLogEntry {
22
+ return {
23
+ id: logId,
24
+ logId,
25
+ timestamp: displayTime(demoMinutesAgo(minutesAgo)),
26
+ status: { label: severity, variant: logSeverityVariant(severity) },
27
+ source: { name: toolType, toolType },
28
+ device,
29
+ description: { title: summary },
30
+ };
31
+ }
32
+
33
+ const sam = { name: DEMO_DEVICES.samT14.hostname, organization: DEMO_ORGANIZATIONS.northbridge.name };
34
+ /** A system event has no device: the API sends the literal the table maps to "System". */
35
+ const system = (organization: string) => ({ name: 'null', organization });
36
+
37
+ /** What the Logs page is searched for in the picture: the rows below are what answers it. */
38
+ export const LOGS_FIXTURE_SEARCH = 'sign-in';
39
+
40
+ const device = (key: keyof typeof DEMO_DEVICES) => ({
41
+ name: DEMO_DEVICES[key].hostname,
42
+ organization: DEMO_ORGANIZATIONS[DEMO_DEVICES[key].organization].name,
43
+ });
44
+
45
+ /** A day of sign-ins across the three customers: one worth a look, a burst of failures, the rest routine. */
46
+ export const LOGS_FIXTURE_ENTRIES: UiLogEntry[] = [
47
+ entry('evt-8f3a61c2', 52, 'ERROR', 'FLEET_MDM', sam, 'Sign-in from new country'),
48
+ entry(
49
+ 'evt-8f3a5d07',
50
+ 96,
51
+ 'WARNING',
52
+ 'OPENFRAME_RMM',
53
+ system(DEMO_ORGANIZATIONS.northbridge.name),
54
+ '27 failed sign-ins for one account in 10 minutes',
55
+ ),
56
+ entry('evt-8f3a4b90', 171, 'INFO', 'FLEET_MDM', device('mayaAir'), 'Sign-in from a new device, approved with MFA'),
57
+ entry(
58
+ 'evt-8f3a3e15',
59
+ 233,
60
+ 'INFO',
61
+ 'OPENFRAME_RMM',
62
+ system(DEMO_ORGANIZATIONS.acme.name),
63
+ 'Sign-in blocked: the source address is on the block list',
64
+ ),
65
+ entry('evt-8f3a2c44', 318, 'INFO', 'FLEET_MDM', device('frontDesk'), 'Sign-in after a password reset'),
66
+ entry('evt-8f3a1a02', 402, 'INFO', 'MESHCENTRAL', device('buildServer'), 'Technician sign-in to a remote session'),
67
+ entry('evt-8f3a0b7e', 487, 'INFO', 'FLEET_MDM', device('leoThinkPad'), 'Sign-in from the office network'),
68
+ entry('evt-8f39f951', 561, 'INFO', 'FLEET_MDM', device('reception'), 'Sign-in from the office network'),
69
+ ];
70
+
71
+ /** The filters the column headers offer. */
72
+ export const LOGS_FIXTURE_FACETS: NonNullable<LogsTableViewProps['facets']> = {
73
+ severities: ['ERROR', 'WARNING', 'INFO'],
74
+ toolTypes: ['FLEET_MDM', 'OPENFRAME_RMM', 'MESHCENTRAL'],
75
+ organizations: Object.values(DEMO_ORGANIZATIONS).map(organization => ({
76
+ id: organization.id,
77
+ label: organization.name,
78
+ value: organization.id,
79
+ })),
80
+ };
81
+
82
+ /** The entry open in the Log Details drawer. */
83
+ export const LOGS_FIXTURE_SELECTED: UiLogEntry = LOGS_FIXTURE_ENTRIES[0];
84
+
85
+ /** The drawer's text for the selected entry, as the product prints a log: what happened and to whom (its id, source and device are the fields under it). */
86
+ export const LOGS_FIXTURE_SELECTED_DETAILS: Extract<LogDrawerProps['description'], string> = [
87
+ 'Event Type: sign-in',
88
+ 'Message: Sign-in from new country',
89
+ `Details: ${DEMO_PEOPLE.sam.name} signed in on ${DEMO_DEVICES.samT14.hostname} from a country not seen for this account before.`,
90
+ ].join('\n');
91
+
92
+ /** The device card pinned under the selected entry. */
93
+ export const LOGS_FIXTURE_DEVICE: Pick<DeviceCardProps, 'device' | 'statusTag'> = {
94
+ device: {
95
+ id: DEMO_DEVICES.samT14.id,
96
+ machineId: DEMO_DEVICES.samT14.id,
97
+ name: DEMO_DEVICES.samT14.hostname,
98
+ organization: DEMO_ORGANIZATIONS.northbridge.name,
99
+ lastSeen: demoMinutesAgo(3),
100
+ operatingSystem: 'windows',
101
+ },
102
+ statusTag: { label: 'ONLINE', variant: 'success' },
103
+ };
@@ -0,0 +1,77 @@
1
+ import {
2
+ computePolicySummary,
3
+ getPolicyTableStatus,
4
+ type PolicyHostCounts,
5
+ type PolicySummaryStats,
6
+ type PolicyTableRow,
7
+ } from '../../features/policies';
8
+ import { DEMO_NOW, demoMinutesAgo } from './shared';
9
+
10
+ const noop = () => {};
11
+
12
+ /** The fleet the policies run on: every device of the demo's largest customer. */
13
+ const FLEET_SIZE = 213;
14
+ const FLEET_HOSTS: readonly unknown[] = Array.from({ length: FLEET_SIZE });
15
+
16
+ interface DemoPolicy extends PolicyHostCounts {
17
+ id: string;
18
+ name: string;
19
+ description: string;
20
+ critical: boolean;
21
+ }
22
+
23
+ function policy(id: string, name: string, description: string, critical: boolean, failing: number): DemoPolicy {
24
+ return {
25
+ id,
26
+ name,
27
+ description,
28
+ critical,
29
+ passing_host_count: FLEET_SIZE - failing,
30
+ failing_host_count: failing,
31
+ host_count_updated_at: demoMinutesAgo(12),
32
+ hosts_include_any: FLEET_HOSTS,
33
+ };
34
+ }
35
+
36
+ /** Seven laptops have fallen out of disk encryption; the other policies pass everywhere. */
37
+ const POLICIES: DemoPolicy[] = [
38
+ policy(
39
+ 'policy-disk-encryption',
40
+ 'Disk encryption',
41
+ 'BitLocker on Windows and FileVault on macOS are turned on.',
42
+ true,
43
+ 7,
44
+ ),
45
+ policy('policy-firewall', 'Firewall on', 'The system firewall is enabled on every device.', true, 0),
46
+ policy('policy-screen-lock', 'Screen lock', 'The screen locks after five minutes without use.', false, 0),
47
+ policy('policy-local-admins', 'No local admins', 'No everyday account is a local administrator.', false, 0),
48
+ ];
49
+
50
+ export interface PoliciesFixture {
51
+ summary: PolicySummaryStats;
52
+ rows: PolicyTableRow[];
53
+ /** The clock the "Updated" card is relative to. */
54
+ now: Date;
55
+ }
56
+
57
+ /**
58
+ * The product's fleet-wide policies page. The summary and every status cell
59
+ * are computed from the host counts by the product's own functions.
60
+ */
61
+ export const POLICIES_FIXTURE: PoliciesFixture = {
62
+ summary: computePolicySummary(POLICIES),
63
+ rows: POLICIES.map(item => ({
64
+ id: item.id,
65
+ name: item.name,
66
+ description: item.description,
67
+ critical: item.critical,
68
+ severityLabel: item.critical ? 'Critical' : 'Low',
69
+ status: getPolicyTableStatus(item),
70
+ actions: [
71
+ { label: 'Policy Details', onClick: noop },
72
+ { label: 'Delete Policy', onClick: noop },
73
+ ],
74
+ href: '#',
75
+ })),
76
+ now: new Date(DEMO_NOW),
77
+ };
@@ -0,0 +1,65 @@
1
+ import type {
2
+ RemoteDesktopChatPanelProps,
3
+ RemoteDesktopViewProps,
4
+ RemoteSessionChatMessage,
5
+ } from '../../features/remote-session';
6
+ import type { DemoCast } from '../cast';
7
+ import { DEMO_DEVICES, demoMinutesAgo } from './shared';
8
+
9
+ const device = DEMO_DEVICES.frontDesk;
10
+
11
+ function message(
12
+ id: string,
13
+ minutesAgo: number,
14
+ rest: Omit<RemoteSessionChatMessage, 'id' | 'at'>,
15
+ ): RemoteSessionChatMessage {
16
+ return { id, at: new Date(demoMinutesAgo(minutesAgo)), ...rest };
17
+ }
18
+
19
+ export interface RemoteSessionFixture {
20
+ view: Pick<
21
+ RemoteDesktopViewProps,
22
+ 'deviceName' | 'organizationName' | 'currentDisplayLabel' | 'displayMenuGroups' | 'actionsMenuGroups'
23
+ >;
24
+ chat: Pick<RemoteDesktopChatPanelProps, 'messages' | 'technician'>;
25
+ /** What the remote desktop itself shows. */
26
+ desktop: { printer: string; clock: string; date: string };
27
+ }
28
+
29
+ /**
30
+ * A connected session on the front desk laptop: the end user reports the
31
+ * printer in the session chat, the technician restarts the spooler on the
32
+ * remote desktop and says so. The technician's rows carry their portrait; the
33
+ * end user's are a plain name, the way the product shows the other side.
34
+ */
35
+ export function buildRemoteSessionFixture(cast: DemoCast): RemoteSessionFixture {
36
+ const technician = cast.person('dana');
37
+ const endUser = cast.person('leo');
38
+ return {
39
+ view: {
40
+ deviceName: device.hostname,
41
+ organizationName: cast.organization(device.organization).name,
42
+ currentDisplayLabel: 'Display 1',
43
+ displayMenuGroups: [],
44
+ actionsMenuGroups: [],
45
+ },
46
+ chat: {
47
+ technician: { name: technician.name, avatarUrl: technician.avatarUrl },
48
+ messages: [
49
+ message('rs-1', 6, { author: 'user', name: endUser.name, text: 'The front desk printer says offline again.' }),
50
+ message('rs-2', 5, {
51
+ author: 'technician',
52
+ name: technician.name,
53
+ text: 'On it. I am on your screen now, keep working.',
54
+ }),
55
+ message('rs-3', 2, {
56
+ author: 'technician',
57
+ name: technician.name,
58
+ text: 'Print spooler restarted and a test page went through. Try it now.',
59
+ }),
60
+ message('rs-4', 1, { author: 'user', name: endUser.name, text: 'Printing. Thank you!' }),
61
+ ],
62
+ },
63
+ desktop: { printer: 'Front Desk LaserJet', clock: '10:04 AM', date: '10/6/2026' },
64
+ };
65
+ }