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

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 (528) 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-VWFZRMQR.js → chunk-3BB3IEJI.js} +13 -7
  6. package/dist/chunk-3K5ZLZE7.js +292 -0
  7. package/dist/chunk-3LU4UFPS.cjs +14 -0
  8. package/dist/{chunk-G47AP6LX.cjs → chunk-3QGUDPIH.cjs} +35 -33
  9. package/dist/{chunk-3UNL26CD.cjs → chunk-3RKBJT6K.cjs} +8 -6
  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-VMMHJFHG.js → chunk-6F4QOCGB.js} +10 -8
  14. package/dist/{chunk-Q6B35Y7O.js → chunk-6MNAIQNR.js} +22 -113
  15. package/dist/{chunk-KUC673HM.js → chunk-6T3BTD6Q.js} +204 -982
  16. package/dist/{chunk-F57ECE2I.js → chunk-6YPTUHM7.js} +4 -4
  17. package/dist/chunk-AAYNCJMW.cjs +48 -0
  18. package/dist/{chunk-FXJ3WWUB.js → chunk-ADBE7QF3.js} +5 -252
  19. package/dist/chunk-AECTRMGQ.cjs +334 -0
  20. package/dist/chunk-AGVXKD4K.js +334 -0
  21. package/dist/chunk-AL2GUHAJ.cjs +18 -0
  22. package/dist/{chunk-WMX26HB5.js → chunk-APJZBDQN.js} +12 -12
  23. package/dist/chunk-AUMKE74M.cjs +16 -0
  24. package/dist/chunk-B4NCVYEQ.cjs +292 -0
  25. package/dist/{chunk-WJUIXU6Y.js → chunk-CGHOH3GN.js} +28 -22
  26. package/dist/chunk-CMGFZHCN.js +233 -0
  27. package/dist/chunk-CMZ3QTFQ.js +1207 -0
  28. package/dist/chunk-CPA2CKRZ.cjs +125 -0
  29. package/dist/chunk-CYUUHFXL.js +41 -0
  30. package/dist/chunk-DC4RTYWK.cjs +1122 -0
  31. package/dist/{chunk-NF7GNGYG.js → chunk-DDWFCWOE.js} +5 -7
  32. package/dist/{chunk-QA6TROME.cjs → chunk-EOKSKJSS.cjs} +25 -83
  33. package/dist/{chunk-6NTPY5QA.cjs → chunk-ETYLOZOB.cjs} +978 -2413
  34. package/dist/{chunk-6AMIRXKM.cjs → chunk-F2EACDOR.cjs} +93 -87
  35. package/dist/chunk-F5BPGWGT.cjs +931 -0
  36. package/dist/chunk-FFT56TYB.cjs +401 -0
  37. package/dist/chunk-FYEJTF5Y.js +125 -0
  38. package/dist/chunk-G3GRYDMS.js +16 -0
  39. package/dist/chunk-G6OHIX5C.cjs +100 -0
  40. package/dist/{chunk-UDFRUKLC.cjs → chunk-GEDY7HQI.cjs} +2 -2
  41. package/dist/chunk-GQ7JJUIT.cjs +1207 -0
  42. package/dist/chunk-H3PKYE4N.js +18 -0
  43. package/dist/{chunk-EQWD4IJE.js → chunk-H4J72PRA.js} +74 -46
  44. package/dist/{chunk-AGDVEUVL.js → chunk-H5R7U2D2.js} +206 -5
  45. package/dist/{chunk-7AM6C6XH.cjs → chunk-HETQETPV.cjs} +9641 -9678
  46. package/dist/{chunk-Y2GSOUCS.cjs → chunk-HWVUR735.cjs} +2 -2
  47. package/dist/chunk-II4QMH26.cjs +35 -0
  48. package/dist/{chunk-XWEBHS7O.cjs → chunk-IJKMILMG.cjs} +82 -54
  49. package/dist/chunk-ILNN6QRW.js +1612 -0
  50. package/dist/{chunk-6GLQLTJI.js → chunk-IU4IO3CG.js} +35 -27
  51. package/dist/chunk-IYVFSLWJ.js +931 -0
  52. package/dist/{chunk-EX6GGCAC.cjs → chunk-J7YIQJPS.cjs} +15 -15
  53. package/dist/chunk-JHQ334WS.js +655 -0
  54. package/dist/{chunk-WCVZCGK5.cjs → chunk-JO5TLJPM.cjs} +129 -907
  55. package/dist/{chunk-PRX7HVLE.cjs → chunk-JVCAK4W3.cjs} +210 -9
  56. package/dist/chunk-KBJJQFYU.js +1122 -0
  57. package/dist/chunk-KEKCQENI.js +48 -0
  58. package/dist/{chunk-P6G3JZNC.cjs → chunk-KGAFUXGZ.cjs} +57 -148
  59. package/dist/chunk-KHXZFLIN.cjs +41 -0
  60. package/dist/{chunk-C4HRRB3V.cjs → chunk-KMB7JHGG.cjs} +23 -17
  61. package/dist/{chunk-K4PTDK34.js → chunk-KPUHSVJU.js} +322 -428
  62. package/dist/chunk-KT3U3ZRP.cjs +1137 -0
  63. package/dist/chunk-L2VUINHN.js +35 -0
  64. package/dist/{chunk-PLYEKV3N.cjs → chunk-MA4Q5RBP.cjs} +6 -6
  65. package/dist/chunk-NPAQSMRY.js +2087 -0
  66. package/dist/{chunk-IFWLJ66M.js → chunk-NQWJAOHO.js} +6 -4
  67. package/dist/{chunk-FYOKS5RI.cjs → chunk-OQKRXLTZ.cjs} +4719 -6351
  68. package/dist/chunk-P3JMAMHP.js +401 -0
  69. package/dist/{chunk-62KNLDXK.js → chunk-P6QCJXLD.js} +3 -3
  70. package/dist/chunk-PPXR22YC.cjs +2087 -0
  71. package/dist/chunk-PSVSEN4J.cjs +655 -0
  72. package/dist/{chunk-CDM7OSFB.cjs → chunk-QQQ46DFT.cjs} +125 -117
  73. package/dist/{chunk-FEMAJES4.cjs → chunk-QU4AHNRL.cjs} +41 -39
  74. package/dist/{chunk-2JTGK64G.js → chunk-RBVUIOIM.js} +12 -10
  75. package/dist/{chunk-SMAAV3HL.js → chunk-ROBQ5TR7.js} +10541 -10578
  76. package/dist/{chunk-TKZXHVBG.js → chunk-RRYNHAEL.js} +5 -5
  77. package/dist/{chunk-5HB7FLCV.js → chunk-STPC2AQU.js} +8338 -9970
  78. package/dist/{chunk-6K7QZDA6.cjs → chunk-TC4W7QDC.cjs} +8 -8
  79. package/dist/{chunk-FI6GMDO7.js → chunk-TTVOLEUS.js} +3605 -5040
  80. package/dist/{chunk-LM7TXMLU.cjs → chunk-ULWVKHSI.cjs} +8 -255
  81. package/dist/chunk-WANCBTUE.js +71 -0
  82. package/dist/{chunk-BIZNSF3U.cjs → chunk-WBNAEYTQ.cjs} +2 -51
  83. package/dist/chunk-WFPCCBOM.cjs +71 -0
  84. package/dist/chunk-WI6FHKD7.js +158 -0
  85. package/dist/chunk-WMNCVLES.js +100 -0
  86. package/dist/{chunk-UT4YHQZW.js → chunk-WSDT7LYL.js} +0 -49
  87. package/dist/chunk-WVOTC7HW.cjs +136 -0
  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-K6Y5NX6L.cjs → chunk-YIUSW4DB.cjs} +114 -220
  92. package/dist/{chunk-YD4LJZV4.cjs → chunk-ZX7SCPLO.cjs} +6 -8
  93. package/dist/cloud-tenants-HRJYNUJM.cjs +117 -0
  94. package/dist/cloud-tenants-SM7WLEGG.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/approval-level.d.ts +49 -0
  120. package/dist/components/features/approval-level.d.ts.map +1 -0
  121. package/dist/components/features/array-entry-manager.d.ts +5 -1
  122. package/dist/components/features/array-entry-manager.d.ts.map +1 -1
  123. package/dist/components/features/board/board.d.ts +2 -0
  124. package/dist/components/features/board/board.d.ts.map +1 -1
  125. package/dist/components/features/board/ticket-card.d.ts.map +1 -1
  126. package/dist/components/features/board/touch-board.d.ts +1 -1
  127. package/dist/components/features/board/touch-board.d.ts.map +1 -1
  128. package/dist/components/features/board/types.d.ts +3 -0
  129. package/dist/components/features/board/types.d.ts.map +1 -1
  130. package/dist/components/features/board/use-board-collapse.d.ts +6 -1
  131. package/dist/components/features/board/use-board-collapse.d.ts.map +1 -1
  132. package/dist/components/features/capability-explorer.d.ts +94 -0
  133. package/dist/components/features/capability-explorer.d.ts.map +1 -0
  134. package/dist/components/features/cloud-tenants/index.d.ts +14 -0
  135. package/dist/components/features/cloud-tenants/index.d.ts.map +1 -0
  136. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts +9 -0
  137. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts.map +1 -0
  138. package/dist/components/features/cloud-tenants/tenant-cell.d.ts +8 -0
  139. package/dist/components/features/cloud-tenants/tenant-cell.d.ts.map +1 -0
  140. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts +9 -0
  141. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts.map +1 -0
  142. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts +42 -0
  143. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts.map +1 -0
  144. package/dist/components/features/cloud-tenants/tenant-row.d.ts +22 -0
  145. package/dist/components/features/cloud-tenants/tenant-row.d.ts.map +1 -0
  146. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts +42 -0
  147. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts.map +1 -0
  148. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts +26 -0
  149. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts.map +1 -0
  150. package/dist/components/features/devices/device-last-online.d.ts +3 -0
  151. package/dist/components/features/devices/device-last-online.d.ts.map +1 -0
  152. package/dist/components/features/devices/device-name.d.ts +42 -0
  153. package/dist/components/features/devices/device-name.d.ts.map +1 -0
  154. package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts +26 -0
  155. package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts.map +1 -0
  156. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts +25 -0
  157. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts.map +1 -0
  158. package/dist/components/features/devices/device-selector/device-selector.d.ts +38 -0
  159. package/dist/components/features/devices/device-selector/device-selector.d.ts.map +1 -0
  160. package/dist/components/features/devices/device-selector/device-selector.types.d.ts +133 -0
  161. package/dist/components/features/devices/device-selector/device-selector.types.d.ts.map +1 -0
  162. package/dist/components/features/devices/device-selector/narrowing.d.ts +13 -0
  163. package/dist/components/features/devices/device-selector/narrowing.d.ts.map +1 -0
  164. package/dist/components/features/devices/device-selector/use-device-selector.d.ts +17 -0
  165. package/dist/components/features/devices/device-selector/use-device-selector.d.ts.map +1 -0
  166. package/dist/components/features/devices/device-status.d.ts +23 -0
  167. package/dist/components/features/devices/device-status.d.ts.map +1 -0
  168. package/dist/components/features/devices/device-statuses.d.ts +40 -0
  169. package/dist/components/features/devices/device-statuses.d.ts.map +1 -0
  170. package/dist/components/features/devices/device-tags-filter-button.d.ts +22 -0
  171. package/dist/components/features/devices/device-tags-filter-button.d.ts.map +1 -0
  172. package/dist/components/features/devices/device-type-icon.d.ts +11 -0
  173. package/dist/components/features/devices/device-type-icon.d.ts.map +1 -0
  174. package/dist/components/features/devices/device-type-tile.d.ts +9 -0
  175. package/dist/components/features/devices/device-type-tile.d.ts.map +1 -0
  176. package/dist/components/features/devices/devices-filter-toolbar.d.ts +46 -0
  177. package/dist/components/features/devices/devices-filter-toolbar.d.ts.map +1 -0
  178. package/dist/components/features/devices/devices-grid-filters.d.ts +25 -0
  179. package/dist/components/features/devices/devices-grid-filters.d.ts.map +1 -0
  180. package/dist/components/features/devices/devices-grid.d.ts +12 -0
  181. package/dist/components/features/devices/devices-grid.d.ts.map +1 -0
  182. package/dist/components/features/devices/devices-list.d.ts +131 -0
  183. package/dist/components/features/devices/devices-list.d.ts.map +1 -0
  184. package/dist/components/features/devices/devices-panel-header.d.ts +46 -0
  185. package/dist/components/features/devices/devices-panel-header.d.ts.map +1 -0
  186. package/dist/components/features/devices/devices-panel-view.d.ts +79 -0
  187. package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -0
  188. package/dist/components/features/devices/devices-table-columns.d.ts +76 -0
  189. package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -0
  190. package/dist/components/features/devices/devices-view-config.d.ts +25 -0
  191. package/dist/components/features/devices/devices-view-config.d.ts.map +1 -0
  192. package/dist/components/features/devices/index.d.ts +24 -0
  193. package/dist/components/features/devices/index.d.ts.map +1 -0
  194. package/dist/components/features/devices/types.d.ts +68 -0
  195. package/dist/components/features/devices/types.d.ts.map +1 -0
  196. package/dist/components/features/devices/use-tag-filter-modal.d.ts +50 -0
  197. package/dist/components/features/devices/use-tag-filter-modal.d.ts.map +1 -0
  198. package/dist/components/features/index.cjs +235 -12
  199. package/dist/components/features/index.d.ts +8 -0
  200. package/dist/components/features/index.d.ts.map +1 -1
  201. package/dist/components/features/index.js +274 -51
  202. package/dist/components/features/knowledge-base/index.d.ts +7 -0
  203. package/dist/components/features/knowledge-base/index.d.ts.map +1 -0
  204. package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts +44 -0
  205. package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts.map +1 -0
  206. package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts +13 -0
  207. package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts.map +1 -0
  208. package/dist/components/features/knowledge-base/knowledge-base-status.d.ts +8 -0
  209. package/dist/components/features/knowledge-base/knowledge-base-status.d.ts.map +1 -0
  210. package/dist/components/features/knowledge-base/knowledge-base-table.d.ts +52 -0
  211. package/dist/components/features/knowledge-base/knowledge-base-table.d.ts.map +1 -0
  212. package/dist/components/features/logs/index.d.ts +12 -0
  213. package/dist/components/features/logs/index.d.ts.map +1 -0
  214. package/dist/components/features/logs/log-drawer.d.ts +29 -0
  215. package/dist/components/features/logs/log-drawer.d.ts.map +1 -0
  216. package/dist/components/features/logs/log-source-labels.d.ts +11 -0
  217. package/dist/components/features/logs/log-source-labels.d.ts.map +1 -0
  218. package/dist/components/features/logs/logs-page-view.d.ts +32 -0
  219. package/dist/components/features/logs/logs-page-view.d.ts.map +1 -0
  220. package/dist/components/features/logs/logs-table-columns.d.ts +15 -0
  221. package/dist/components/features/logs/logs-table-columns.d.ts.map +1 -0
  222. package/dist/components/features/logs/logs-table-view.d.ts +64 -0
  223. package/dist/components/features/logs/logs-table-view.d.ts.map +1 -0
  224. package/dist/components/features/logs/types.d.ts +52 -0
  225. package/dist/components/features/logs/types.d.ts.map +1 -0
  226. package/dist/components/features/policies/compute-policy-summary.d.ts +37 -0
  227. package/dist/components/features/policies/compute-policy-summary.d.ts.map +1 -0
  228. package/dist/components/features/policies/index.d.ts +8 -0
  229. package/dist/components/features/policies/index.d.ts.map +1 -0
  230. package/dist/components/features/policies/policies-table.d.ts +34 -0
  231. package/dist/components/features/policies/policies-table.d.ts.map +1 -0
  232. package/dist/components/features/policies/policy-summary-cards.d.ts +17 -0
  233. package/dist/components/features/policies/policy-summary-cards.d.ts.map +1 -0
  234. package/dist/components/features/policies/policy-table-row.d.ts +37 -0
  235. package/dist/components/features/policies/policy-table-row.d.ts.map +1 -0
  236. package/dist/components/features/policy-configuration-panel.d.ts.map +1 -1
  237. package/dist/components/features/remote-session/index.d.ts +8 -0
  238. package/dist/components/features/remote-session/index.d.ts.map +1 -1
  239. package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts +21 -0
  240. package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts.map +1 -0
  241. package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts +31 -0
  242. package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts.map +1 -0
  243. package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts +21 -0
  244. package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts.map +1 -0
  245. package/dist/components/features/remote-session/remote-desktop-view.d.ts +50 -0
  246. package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -0
  247. package/dist/components/features/software/index.d.ts +8 -0
  248. package/dist/components/features/software/index.d.ts.map +1 -0
  249. package/dist/components/features/software/package-managers.d.ts +30 -0
  250. package/dist/components/features/software/package-managers.d.ts.map +1 -0
  251. package/dist/components/features/software/package-search-field-placeholder.d.ts +7 -0
  252. package/dist/components/features/software/package-search-field-placeholder.d.ts.map +1 -0
  253. package/dist/components/features/software/schedule-fields.d.ts +34 -0
  254. package/dist/components/features/software/schedule-fields.d.ts.map +1 -0
  255. package/dist/components/features/software/software-action-copy.d.ts +25 -0
  256. package/dist/components/features/software/software-action-copy.d.ts.map +1 -0
  257. package/dist/components/features/software/software-action-form.d.ts +71 -0
  258. package/dist/components/features/software/software-action-form.d.ts.map +1 -0
  259. package/dist/components/features/software/software-row-fields.d.ts +23 -0
  260. package/dist/components/features/software/software-row-fields.d.ts.map +1 -0
  261. package/dist/components/features/software/software-row.d.ts +18 -0
  262. package/dist/components/features/software/software-row.d.ts.map +1 -0
  263. package/dist/components/features/sortable-list/index.d.ts +1 -0
  264. package/dist/components/features/sortable-list/index.d.ts.map +1 -1
  265. package/dist/components/features/sortable-list/sortable-drag-handle.d.ts +21 -0
  266. package/dist/components/features/sortable-list/sortable-drag-handle.d.ts.map +1 -0
  267. package/dist/components/help-center-pages/index.cjs +133 -114
  268. package/dist/components/help-center-pages/index.js +58 -39
  269. package/dist/components/index.cjs +328 -82
  270. package/dist/components/index.js +459 -213
  271. package/dist/components/layout/page-heading.d.ts +12 -3
  272. package/dist/components/layout/page-heading.d.ts.map +1 -1
  273. package/dist/components/meeting-scheduler/index.cjs +120 -98
  274. package/dist/components/meeting-scheduler/index.js +50 -28
  275. package/dist/components/navigation/index.cjs +36 -17
  276. package/dist/components/navigation/index.d.ts +3 -0
  277. package/dist/components/navigation/index.d.ts.map +1 -1
  278. package/dist/components/navigation/index.js +36 -17
  279. package/dist/components/navigation/mingo-ai-button.d.ts +23 -10
  280. package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
  281. package/dist/components/navigation/sticky-section-nav.d.ts +14 -1
  282. package/dist/components/navigation/sticky-section-nav.d.ts.map +1 -1
  283. package/dist/components/onboarding-guides/index.cjs +32 -16
  284. package/dist/components/onboarding-guides/index.js +31 -15
  285. package/dist/components/product-demo/cast.d.ts +58 -0
  286. package/dist/components/product-demo/cast.d.ts.map +1 -0
  287. package/dist/components/product-demo/fixtures/cloud-tenants.d.ts +10 -0
  288. package/dist/components/product-demo/fixtures/cloud-tenants.d.ts.map +1 -0
  289. package/dist/components/product-demo/fixtures/devices.d.ts +14 -0
  290. package/dist/components/product-demo/fixtures/devices.d.ts.map +1 -0
  291. package/dist/components/product-demo/fixtures/knowledge.d.ts +14 -0
  292. package/dist/components/product-demo/fixtures/knowledge.d.ts.map +1 -0
  293. package/dist/components/product-demo/fixtures/logs.d.ts +15 -0
  294. package/dist/components/product-demo/fixtures/logs.d.ts.map +1 -0
  295. package/dist/components/product-demo/fixtures/policies.d.ts +13 -0
  296. package/dist/components/product-demo/fixtures/policies.d.ts.map +1 -0
  297. package/dist/components/product-demo/fixtures/remote-session.d.ts +20 -0
  298. package/dist/components/product-demo/fixtures/remote-session.d.ts.map +1 -0
  299. package/dist/components/product-demo/fixtures/shared.d.ts +156 -0
  300. package/dist/components/product-demo/fixtures/shared.d.ts.map +1 -0
  301. package/dist/components/product-demo/fixtures/software-update.d.ts +19 -0
  302. package/dist/components/product-demo/fixtures/software-update.d.ts.map +1 -0
  303. package/dist/components/product-demo/fixtures/tickets-board.d.ts +8 -0
  304. package/dist/components/product-demo/fixtures/tickets-board.d.ts.map +1 -0
  305. package/dist/components/product-demo/index.cjs +112 -0
  306. package/dist/components/product-demo/index.d.ts +6 -0
  307. package/dist/components/product-demo/index.d.ts.map +1 -0
  308. package/dist/components/product-demo/index.js +112 -0
  309. package/dist/components/product-demo/product-screen.d.ts +22 -0
  310. package/dist/components/product-demo/product-screen.d.ts.map +1 -0
  311. package/dist/components/product-demo/registry.d.ts +13 -0
  312. package/dist/components/product-demo/registry.d.ts.map +1 -0
  313. package/dist/components/product-demo/screen-keys.cjs +25 -0
  314. package/dist/components/product-demo/screen-keys.d.ts +27 -0
  315. package/dist/components/product-demo/screen-keys.d.ts.map +1 -0
  316. package/dist/components/product-demo/screen-keys.js +20 -0
  317. package/dist/components/product-demo/screens/cloud-tenants.d.ts +8 -0
  318. package/dist/components/product-demo/screens/cloud-tenants.d.ts.map +1 -0
  319. package/dist/components/product-demo/screens/devices.d.ts +10 -0
  320. package/dist/components/product-demo/screens/devices.d.ts.map +1 -0
  321. package/dist/components/product-demo/screens/knowledge.d.ts +9 -0
  322. package/dist/components/product-demo/screens/knowledge.d.ts.map +1 -0
  323. package/dist/components/product-demo/screens/logs.d.ts +4 -0
  324. package/dist/components/product-demo/screens/logs.d.ts.map +1 -0
  325. package/dist/components/product-demo/screens/policies.d.ts +8 -0
  326. package/dist/components/product-demo/screens/policies.d.ts.map +1 -0
  327. package/dist/components/product-demo/screens/remote-desktop-picture.d.ts +11 -0
  328. package/dist/components/product-demo/screens/remote-desktop-picture.d.ts.map +1 -0
  329. package/dist/components/product-demo/screens/remote-session.d.ts +8 -0
  330. package/dist/components/product-demo/screens/remote-session.d.ts.map +1 -0
  331. package/dist/components/product-demo/screens/software-update.d.ts +12 -0
  332. package/dist/components/product-demo/screens/software-update.d.ts.map +1 -0
  333. package/dist/components/product-demo/screens/tickets-board.d.ts +4 -0
  334. package/dist/components/product-demo/screens/tickets-board.d.ts.map +1 -0
  335. package/dist/components/product-demo/types.d.ts +9 -0
  336. package/dist/components/product-demo/types.d.ts.map +1 -0
  337. package/dist/components/related-content/index.cjs +14 -8
  338. package/dist/components/related-content/index.js +13 -7
  339. package/dist/components/tickets/index.cjs +36 -20
  340. package/dist/components/tickets/index.js +35 -19
  341. package/dist/components/ui/file-manager/index.cjs +38 -34
  342. package/dist/components/ui/file-manager/index.js +8 -4
  343. package/dist/components/ui/index.cjs +57 -17
  344. package/dist/components/ui/index.d.ts +1 -0
  345. package/dist/components/ui/index.d.ts.map +1 -1
  346. package/dist/components/ui/index.js +141 -101
  347. package/dist/components/ui/product-screen-frame.d.ts +45 -0
  348. package/dist/components/ui/product-screen-frame.d.ts.map +1 -0
  349. package/dist/components/ui/radio-group.d.ts +5 -0
  350. package/dist/components/ui/radio-group.d.ts.map +1 -1
  351. package/dist/components/ui/snap-carousel.d.ts +11 -1
  352. package/dist/components/ui/snap-carousel.d.ts.map +1 -1
  353. package/dist/components/ui/tag.d.ts +1 -1
  354. package/dist/components/ui/tag.d.ts.map +1 -1
  355. package/dist/devices-6XKQTQM5.cjs +81 -0
  356. package/dist/devices-LXSFGGEZ.js +81 -0
  357. package/dist/hooks/index.cjs +17 -8
  358. package/dist/hooks/index.js +32 -23
  359. package/dist/hooks/ui/index.d.ts +1 -0
  360. package/dist/hooks/ui/index.d.ts.map +1 -1
  361. package/dist/hooks/ui/use-header-height.d.ts +12 -0
  362. package/dist/hooks/ui/use-header-height.d.ts.map +1 -1
  363. package/dist/hooks/ui/use-sticky-toolbar.d.ts +29 -0
  364. package/dist/hooks/ui/use-sticky-toolbar.d.ts.map +1 -0
  365. package/dist/hooks/use-location-hash.d.ts +2 -2
  366. package/dist/hooks/use-location-hash.d.ts.map +1 -1
  367. package/dist/hooks/use-scroll-to-hash.d.ts +7 -0
  368. package/dist/hooks/use-scroll-to-hash.d.ts.map +1 -1
  369. package/dist/index.cjs +284 -25
  370. package/dist/index.js +737 -478
  371. package/dist/knowledge-7PDZLXPO.cjs +108 -0
  372. package/dist/knowledge-Q4SPFOTN.js +108 -0
  373. package/dist/logs-SZ4VB4FE.js +216 -0
  374. package/dist/logs-TO3NELGJ.cjs +216 -0
  375. package/dist/policies-533GQVFM.cjs +121 -0
  376. package/dist/policies-LB7VW2UB.js +121 -0
  377. package/dist/remote-session-GSGZOFDX.js +196 -0
  378. package/dist/remote-session-R6VAFESR.cjs +196 -0
  379. package/dist/software-update-DT2XSG7M.cjs +179 -0
  380. package/dist/software-update-ENZNVGKP.js +179 -0
  381. package/dist/tickets-board-BHLPAVNJ.cjs +137 -0
  382. package/dist/tickets-board-PYDNELSK.js +137 -0
  383. package/dist/types/case-study.d.ts +15 -1
  384. package/dist/types/case-study.d.ts.map +1 -1
  385. package/dist/utils/date-utils.d.ts +5 -0
  386. package/dist/utils/date-utils.d.ts.map +1 -1
  387. package/dist/utils/index.cjs +45 -2
  388. package/dist/utils/index.d.ts +2 -1
  389. package/dist/utils/index.d.ts.map +1 -1
  390. package/dist/utils/index.js +41 -3
  391. package/dist/utils/open-in-new-tab.d.ts +7 -0
  392. package/dist/utils/open-in-new-tab.d.ts.map +1 -0
  393. package/dist/utils/same-page-hash-nav.d.ts +31 -0
  394. package/dist/utils/same-page-hash-nav.d.ts.map +1 -1
  395. package/dist/utils/scroll-into-view.d.ts +14 -1
  396. package/dist/utils/scroll-into-view.d.ts.map +1 -1
  397. package/package.json +13 -1
  398. package/src/components/chat/ask-prompts.tsx +226 -0
  399. package/src/components/chat/embeddable-chat.tsx +36 -2
  400. package/src/components/chat/entity-cards/case-study-card.tsx +122 -46
  401. package/src/components/chat/index.ts +1 -0
  402. package/src/components/chat/quick-action-chip.tsx +33 -9
  403. package/src/components/docs/use-scroll-spy.ts +93 -18
  404. package/src/components/faq/faq-section.tsx +82 -43
  405. package/src/components/features/approval-level.tsx +149 -0
  406. package/src/components/features/array-entry-manager.tsx +10 -1
  407. package/src/components/features/board/board.tsx +4 -1
  408. package/src/components/features/board/ticket-card.tsx +11 -1
  409. package/src/components/features/board/touch-board.tsx +2 -1
  410. package/src/components/features/board/types.ts +3 -0
  411. package/src/components/features/board/use-board-collapse.ts +7 -2
  412. package/src/components/features/capability-explorer.tsx +412 -0
  413. package/src/components/features/cloud-tenants/index.ts +28 -0
  414. package/src/components/features/cloud-tenants/tenant-access-cell.tsx +24 -0
  415. package/src/components/features/cloud-tenants/tenant-cell.tsx +26 -0
  416. package/src/components/features/cloud-tenants/tenant-customer-cell.tsx +27 -0
  417. package/src/components/features/cloud-tenants/tenant-presentation.ts +111 -0
  418. package/src/components/features/cloud-tenants/tenant-row.ts +21 -0
  419. package/src/components/features/cloud-tenants/tenants-table-columns.ts +30 -0
  420. package/src/components/features/cloud-tenants/tenants-table-view.tsx +142 -0
  421. package/src/components/features/devices/device-last-online.ts +6 -0
  422. package/src/components/features/devices/device-name.ts +51 -0
  423. package/src/components/features/devices/device-selector/device-selection-mode-radio.tsx +107 -0
  424. package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +32 -0
  425. package/src/components/features/devices/device-selector/device-selector.tsx +799 -0
  426. package/src/components/features/devices/device-selector/device-selector.types.ts +138 -0
  427. package/src/components/features/devices/device-selector/narrowing.ts +33 -0
  428. package/src/components/features/devices/device-selector/use-device-selector.ts +51 -0
  429. package/src/components/features/devices/device-status.ts +102 -0
  430. package/src/components/features/devices/device-statuses.ts +88 -0
  431. package/src/components/features/devices/device-tags-filter-button.tsx +49 -0
  432. package/src/components/features/devices/device-type-icon.tsx +29 -0
  433. package/src/components/features/devices/device-type-tile.tsx +17 -0
  434. package/src/components/features/devices/devices-filter-toolbar.tsx +114 -0
  435. package/src/components/features/devices/devices-grid-filters.tsx +99 -0
  436. package/src/components/features/devices/devices-grid.tsx +86 -0
  437. package/src/components/features/devices/devices-list.tsx +357 -0
  438. package/src/components/features/devices/devices-panel-header.tsx +97 -0
  439. package/src/components/features/devices/devices-panel-view.tsx +261 -0
  440. package/src/components/features/devices/devices-table-columns.tsx +356 -0
  441. package/src/components/features/devices/devices-view-config.tsx +38 -0
  442. package/src/components/features/devices/index.ts +89 -0
  443. package/src/components/features/devices/types.ts +74 -0
  444. package/src/components/features/devices/use-tag-filter-modal.ts +109 -0
  445. package/src/components/features/index.ts +10 -0
  446. package/src/components/features/knowledge-base/index.ts +19 -0
  447. package/src/components/features/knowledge-base/knowledge-base-article-view.tsx +134 -0
  448. package/src/components/features/knowledge-base/knowledge-base-item-icon.ts +14 -0
  449. package/src/components/features/knowledge-base/knowledge-base-status.ts +12 -0
  450. package/src/components/features/knowledge-base/knowledge-base-table.tsx +180 -0
  451. package/src/components/features/logs/index.ts +20 -0
  452. package/src/components/features/logs/log-drawer.tsx +138 -0
  453. package/src/components/features/logs/log-source-labels.ts +25 -0
  454. package/src/components/features/logs/logs-page-view.tsx +100 -0
  455. package/src/components/features/logs/logs-table-columns.ts +16 -0
  456. package/src/components/features/logs/logs-table-view.tsx +509 -0
  457. package/src/components/features/logs/types.ts +71 -0
  458. package/src/components/features/policies/compute-policy-summary.ts +115 -0
  459. package/src/components/features/policies/index.ts +14 -0
  460. package/src/components/features/policies/policies-table.tsx +235 -0
  461. package/src/components/features/policies/policy-summary-cards.tsx +69 -0
  462. package/src/components/features/policies/policy-table-row.ts +37 -0
  463. package/src/components/features/policy-configuration-panel.tsx +3 -12
  464. package/src/components/features/remote-session/index.ts +8 -0
  465. package/src/components/features/remote-session/remote-desktop-chat-message-row.tsx +56 -0
  466. package/src/components/features/remote-session/remote-desktop-chat-panel.tsx +102 -0
  467. package/src/components/features/remote-session/remote-desktop-fullscreen-toolbar.tsx +119 -0
  468. package/src/components/features/remote-session/remote-desktop-view.tsx +209 -0
  469. package/src/components/features/software/index.ts +39 -0
  470. package/src/components/features/software/package-managers.ts +54 -0
  471. package/src/components/features/software/package-search-field-placeholder.tsx +23 -0
  472. package/src/components/features/software/schedule-fields.tsx +105 -0
  473. package/src/components/features/software/software-action-copy.ts +70 -0
  474. package/src/components/features/software/software-action-form.tsx +199 -0
  475. package/src/components/features/software/software-row-fields.tsx +105 -0
  476. package/src/components/features/software/software-row.ts +22 -0
  477. package/src/components/features/sortable-list/index.ts +1 -0
  478. package/src/components/features/sortable-list/sortable-drag-handle.tsx +41 -0
  479. package/src/components/layout/page-heading.tsx +23 -6
  480. package/src/components/navigation/index.ts +5 -0
  481. package/src/components/navigation/mingo-ai-button.tsx +37 -13
  482. package/src/components/navigation/sticky-section-nav.tsx +99 -1
  483. package/src/components/product-demo/cast.tsx +78 -0
  484. package/src/components/product-demo/fixtures/cloud-tenants.ts +63 -0
  485. package/src/components/product-demo/fixtures/devices.ts +87 -0
  486. package/src/components/product-demo/fixtures/knowledge.ts +48 -0
  487. package/src/components/product-demo/fixtures/logs.ts +103 -0
  488. package/src/components/product-demo/fixtures/policies.ts +77 -0
  489. package/src/components/product-demo/fixtures/remote-session.ts +65 -0
  490. package/src/components/product-demo/fixtures/shared.ts +53 -0
  491. package/src/components/product-demo/fixtures/software-update.ts +63 -0
  492. package/src/components/product-demo/fixtures/tickets-board.ts +100 -0
  493. package/src/components/product-demo/index.ts +7 -0
  494. package/src/components/product-demo/product-screen.tsx +94 -0
  495. package/src/components/product-demo/registry.ts +20 -0
  496. package/src/components/product-demo/screen-keys.ts +31 -0
  497. package/src/components/product-demo/screens/cloud-tenants.tsx +23 -0
  498. package/src/components/product-demo/screens/devices.tsx +41 -0
  499. package/src/components/product-demo/screens/knowledge.tsx +27 -0
  500. package/src/components/product-demo/screens/logs.tsx +113 -0
  501. package/src/components/product-demo/screens/policies.tsx +29 -0
  502. package/src/components/product-demo/screens/remote-desktop-picture.tsx +118 -0
  503. package/src/components/product-demo/screens/remote-session.tsx +46 -0
  504. package/src/components/product-demo/screens/software-update.tsx +97 -0
  505. package/src/components/product-demo/screens/tickets-board.tsx +28 -0
  506. package/src/components/product-demo/types.ts +10 -0
  507. package/src/components/ui/index.ts +1 -0
  508. package/src/components/ui/product-screen-frame.tsx +136 -0
  509. package/src/components/ui/radio-group.tsx +16 -4
  510. package/src/components/ui/snap-carousel.tsx +26 -1
  511. package/src/components/ui/tag.tsx +5 -0
  512. package/src/hooks/ui/index.ts +1 -0
  513. package/src/hooks/ui/use-header-height.ts +51 -2
  514. package/src/hooks/ui/use-sticky-toolbar.ts +60 -0
  515. package/src/hooks/use-location-hash.ts +9 -5
  516. package/src/hooks/use-scroll-to-hash.ts +9 -1
  517. package/src/types/case-study.ts +21 -1
  518. package/src/utils/date-utils.ts +8 -1
  519. package/src/utils/index.ts +5 -0
  520. package/src/utils/open-in-new-tab.ts +12 -0
  521. package/src/utils/same-page-hash-nav.ts +57 -0
  522. package/src/utils/scroll-into-view.ts +21 -5
  523. package/dist/chunk-BM5MVGH3.cjs +0 -499
  524. package/dist/chunk-CUME3VTQ.js +0 -144
  525. package/dist/chunk-CZ7Y7UG4.js +0 -732
  526. package/dist/chunk-FLKJYMVB.js +0 -499
  527. package/dist/chunk-OF6GEI5A.cjs +0 -144
  528. package/dist/chunk-UVTD52MD.cjs +0 -732
@@ -0,0 +1,14 @@
1
+ 'use client';
2
+
3
+ export { PoliciesTable } from './policies-table';
4
+ export type { PoliciesTableProps } from './policies-table';
5
+ export { PolicySummaryCards } from './policy-summary-cards';
6
+ export type { PolicySummaryCardsProps } from './policy-summary-cards';
7
+ export {
8
+ computePolicySummary,
9
+ getPolicyStatus,
10
+ getPolicyTableStatus,
11
+ POLICY_STATUS_CONFIG,
12
+ } from './compute-policy-summary';
13
+ export type { PolicyHostCounts, PolicyStatus, PolicySummaryStats } from './compute-policy-summary';
14
+ export type { PolicyStatusVariant, PolicyTableAction, PolicyTableRow, PolicyTableStatus } from './policy-table-row';
@@ -0,0 +1,235 @@
1
+ 'use client';
2
+
3
+ import { type ReactNode, useCallback, useMemo, useState } from 'react';
4
+ import { openInNewTab } from '../../../utils/open-in-new-tab';
5
+ import { ArrowRightUpIcon } from '../../icons-v2-generated/arrows/arrow-right-up-icon';
6
+ import { Button } from '../../ui/button';
7
+ import { type ColumnDef, DataTable, type Row, type SortingState, useDataTable } from '../../ui/data-table';
8
+ import { MoreActionsMenu } from '../../ui/more-actions-menu';
9
+ import type { NoDataProps } from '../../ui/no-data';
10
+ import { Tag } from '../../ui/tag';
11
+ import { TruncateText } from '../../ui/truncate-text';
12
+ import { OSTypeBadgeGroup } from '../os-type-badge-group';
13
+ import type { PolicyTableRow } from './policy-table-row';
14
+
15
+ /**
16
+ * Click handler that opens `href` in a new tab. The row is itself a link and
17
+ * an `<a>` cannot be nested in an `<a>`, so the button opens it by script.
18
+ */
19
+ const EMPTY_COLUMN_FILTERS: never[] = [];
20
+
21
+ // An empty platform list means the policy applies to every OS, so we render the
22
+ // full set of OS icons rather than a plain-text "All" label.
23
+ const ALL_PLATFORMS = ['windows', 'darwin', 'linux'];
24
+
25
+ const NOTE_TONE_CLASS = {
26
+ error: 'text-ods-error',
27
+ warning: 'text-ods-warning',
28
+ } as const;
29
+
30
+ export interface PoliciesTableProps {
31
+ rows: PolicyTableRow[];
32
+ isLoading?: boolean;
33
+ /** Show the OS Platform column (fleet-wide monitoring view). */
34
+ showPlatform?: boolean;
35
+ /** Enable client-side sorting on Severity & Status, with header sort controls. */
36
+ sortable?: boolean;
37
+ emptyMessage?: string;
38
+ /** Rich empty state (icon + title + description), overrides `emptyMessage`. */
39
+ emptyState?: NoDataProps;
40
+ /** Make each row a link to its `href`. */
41
+ rowAsLink?: boolean;
42
+ stickyHeader?: boolean;
43
+ stickyHeaderOffset?: string;
44
+ /** Rendered at the right edge of the header (e.g. a row count). */
45
+ rightSlot?: ReactNode;
46
+ skeletonRows?: number;
47
+ /** Infinite "load more" footer. */
48
+ hasMore?: boolean;
49
+ onLoadMore?: () => void;
50
+ /** The next page is being fetched: the footer shows it and asks for nothing more meanwhile. Default false (a host that pages rows it already holds). */
51
+ isLoadingMore?: boolean;
52
+ }
53
+
54
+ /**
55
+ * Shared policies table. Renders a normalized `PolicyTableRow[]` with a
56
+ * consistent column set (Policy name+description, Severity, optional Platform,
57
+ * Status, optional row actions, open-in-new-tab). Used by both the fleet-wide
58
+ * monitoring page and the per-device Policies tab.
59
+ */
60
+ export function PoliciesTable({
61
+ rows,
62
+ isLoading = false,
63
+ showPlatform = false,
64
+ sortable = false,
65
+ emptyMessage,
66
+ emptyState,
67
+ rowAsLink = false,
68
+ stickyHeader = false,
69
+ stickyHeaderOffset,
70
+ rightSlot,
71
+ skeletonRows = 10,
72
+ hasMore = false,
73
+ onLoadMore,
74
+ isLoadingMore = false,
75
+ }: PoliciesTableProps) {
76
+ const [sorting, setSorting] = useState<SortingState>([]);
77
+
78
+ // Reserve the actions column while loading so the column count stays stable across
79
+ // skeleton, loading and loaded (otherwise it appears once rows arrive and shifts every
80
+ // column, the "jitter"). Loaded rows in every caller carry actions.
81
+ const hasActions = useMemo(() => isLoading || rows.some(r => r.actions && r.actions.length > 0), [isLoading, rows]);
82
+
83
+ const columns = useMemo<ColumnDef<PolicyTableRow>[]>(() => {
84
+ const cols: ColumnDef<PolicyTableRow>[] = [
85
+ {
86
+ accessorKey: 'name',
87
+ header: 'Name',
88
+ cell: ({ row }: { row: Row<PolicyTableRow> }) => (
89
+ <div className="flex min-h-[60px] min-w-0 flex-col justify-center gap-1 py-2">
90
+ <TruncateText>{row.original.name}</TruncateText>
91
+ {row.original.description && (
92
+ <TruncateText variant="h6" tone="secondary">
93
+ {row.original.description}
94
+ </TruncateText>
95
+ )}
96
+ </div>
97
+ ),
98
+ meta: { width: 'flex-1 min-w-0' },
99
+ },
100
+ {
101
+ id: 'severity',
102
+ accessorFn: (row: PolicyTableRow) => (row.critical ? 1 : 0),
103
+ header: 'SEVERITY',
104
+ cell: ({ row }: { row: Row<PolicyTableRow> }) => (
105
+ <span className="text-ods-text-primary text-h6">{row.original.severityLabel}</span>
106
+ ),
107
+ enableSorting: sortable,
108
+ meta: { width: 'w-[100px]', sortable, hideAt: 'md' },
109
+ },
110
+ ];
111
+
112
+ if (showPlatform) {
113
+ cols.push({
114
+ id: 'platform',
115
+ header: 'PLATFORM',
116
+ cell: ({ row }: { row: Row<PolicyTableRow> }) => {
117
+ const platforms = row.original.platforms ?? [];
118
+ const osTypes = platforms.length > 0 ? platforms : ALL_PLATFORMS;
119
+ return <OSTypeBadgeGroup osTypes={osTypes} iconSize="w-6 h-6" />;
120
+ },
121
+ meta: { width: 'w-[140px]', hideAt: 'lg' },
122
+ });
123
+ }
124
+
125
+ cols.push({
126
+ id: 'status',
127
+ accessorFn: (row: PolicyTableRow) => row.status.label,
128
+ header: 'STATUS',
129
+ cell: ({ row }: { row: Row<PolicyTableRow> }) => {
130
+ const { status } = row.original;
131
+ return (
132
+ <div className="flex flex-col items-start gap-1">
133
+ <Tag className="self-start" label={status.label} variant={status.variant} />
134
+ {status.note && <span className={`text-h6 ${NOTE_TONE_CLASS[status.note.tone]}`}>{status.note.text}</span>}
135
+ </div>
136
+ );
137
+ },
138
+ enableSorting: sortable,
139
+ meta: { width: 'w-[140px]', sortable, hideAt: 'md' },
140
+ });
141
+
142
+ if (hasActions) {
143
+ cols.push({
144
+ id: 'actions',
145
+ header: '',
146
+ cell: ({ row }: { row: Row<PolicyTableRow> }) =>
147
+ row.original.actions && row.original.actions.length > 0 ? (
148
+ <div data-no-row-click className="pointer-events-auto flex items-center justify-end gap-2">
149
+ <MoreActionsMenu items={row.original.actions} />
150
+ </div>
151
+ ) : null,
152
+ enableSorting: false,
153
+ meta: { width: 'w-12 content-md:w-auto content-md:min-w-[100px] shrink-0 flex-none', align: 'right' },
154
+ });
155
+ }
156
+
157
+ cols.push({
158
+ id: 'open',
159
+ header: '',
160
+ cell: ({ row }: { row: Row<PolicyTableRow> }) =>
161
+ row.original.href ? (
162
+ <div data-no-row-click className="pointer-events-auto flex items-center justify-end">
163
+ <Button
164
+ onClick={openInNewTab(row.original.href)}
165
+ variant="outline"
166
+ size="icon"
167
+ leftIcon={<ArrowRightUpIcon className="h-5 w-5" />}
168
+ aria-label={`Open ${row.original.name}`}
169
+ className="bg-ods-card"
170
+ />
171
+ </div>
172
+ ) : null,
173
+ enableSorting: false,
174
+ meta: { width: 'w-12 shrink-0 flex-none', hideAt: 'md', align: 'right' },
175
+ });
176
+
177
+ return cols;
178
+ }, [showPlatform, sortable, hasActions]);
179
+
180
+ const table = useDataTable<PolicyTableRow>({
181
+ data: rows,
182
+ columns,
183
+ getRowId: (row: PolicyTableRow) => row.id,
184
+ clientSideSorting: sortable,
185
+ enableSorting: sortable,
186
+ state: { sorting, columnFilters: EMPTY_COLUMN_FILTERS },
187
+ onSortingChange: setSorting,
188
+ });
189
+
190
+ const sortState = sortable && sorting[0] ? { id: sorting[0].id, desc: sorting[0].desc } : null;
191
+ const handleSortChange = useCallback((columnId: string) => {
192
+ setSorting(prev => {
193
+ const current = prev[0];
194
+ if (!current || current.id !== columnId) return [{ id: columnId, desc: false }];
195
+ if (!current.desc) return [{ id: columnId, desc: true }];
196
+ return [];
197
+ });
198
+ }, []);
199
+
200
+ const rowHref = useCallback((row: PolicyTableRow) => (rowAsLink ? row.href : undefined), [rowAsLink]);
201
+
202
+ // Hide the column header on the empty state: only show it while loading (skeleton rows)
203
+ // or when there are real rows.
204
+ const showHeader = isLoading || rows.length > 0;
205
+
206
+ return (
207
+ <DataTable table={table}>
208
+ {showHeader && (
209
+ <DataTable.Header
210
+ stickyHeader={stickyHeader}
211
+ stickyHeaderOffset={stickyHeaderOffset}
212
+ rightSlot={rightSlot}
213
+ sort={sortState}
214
+ onSortChange={sortable ? handleSortChange : undefined}
215
+ />
216
+ )}
217
+ <DataTable.Body
218
+ loading={isLoading}
219
+ skeletonRows={skeletonRows}
220
+ emptyMessage={emptyMessage}
221
+ emptyState={emptyState}
222
+ rowClassName="mb-1"
223
+ rowHref={rowHref}
224
+ />
225
+ {hasMore && onLoadMore && (
226
+ <DataTable.InfiniteFooter
227
+ hasNextPage
228
+ isFetchingNextPage={isLoadingMore}
229
+ onLoadMore={onLoadMore}
230
+ skeletonRows={2}
231
+ />
232
+ )}
233
+ </DataTable>
234
+ );
235
+ }
@@ -0,0 +1,69 @@
1
+ 'use client';
2
+
3
+ import { formatRelativeTimeFrom } from '../../../utils/date-utils';
4
+ import { DashboardInfoCard } from '../../ui/dashboard-info-card';
5
+ import { Skeleton } from '../../ui/skeleton';
6
+ import type { PolicySummaryStats } from './compute-policy-summary';
7
+
8
+ /** What a card shows when there is no value to show. */
9
+ const EMPTY_VALUE = '—';
10
+
11
+ const CARD_SKELETON_KEYS = ['total', 'compliance', 'failed', 'updated'] as const;
12
+
13
+ export interface PolicySummaryCardsProps {
14
+ summary: PolicySummaryStats;
15
+ isLoading?: boolean;
16
+ /**
17
+ * Whether the summary describes loaded data. It decides the VALUES, never
18
+ * whether the cards render: without data every card shows the empty mark,
19
+ * because "Total Policies 0 / Failed 0" is an all-clear a failed load has
20
+ * not earned.
21
+ */
22
+ hasData?: boolean;
23
+ /** The clock "Updated" is relative to. Default: the moment of the render. */
24
+ now?: Date;
25
+ }
26
+
27
+ /** The four counters above the fleet-wide policies table. */
28
+ export function PolicySummaryCards({ summary, isLoading = false, hasData = true, now }: PolicySummaryCardsProps) {
29
+ return (
30
+ <div className="grid grid-cols-1 gap-4 content-md:grid-cols-2 content-lg:grid-cols-4">
31
+ {isLoading ? (
32
+ // `h-16 content-md:h-[104px]` is `DashboardInfoCard`'s own height, so the
33
+ // grid does not jump when the real cards replace the placeholders.
34
+ CARD_SKELETON_KEYS.map(key => <Skeleton key={key} className="h-16 w-full content-md:h-[104px]" />)
35
+ ) : (
36
+ <>
37
+ <DashboardInfoCard title="Total Policies" value={hasData ? summary.totalPolicies : EMPTY_VALUE} />
38
+ <DashboardInfoCard
39
+ title="Compliance Rate"
40
+ value={
41
+ hasData
42
+ ? `${summary.compliantPolicies}/${summary.compliantPolicies + summary.failingPolicies}`
43
+ : EMPTY_VALUE
44
+ }
45
+ percentage={hasData ? summary.compliantPoliciesPercentage : undefined}
46
+ showProgress={hasData}
47
+ />
48
+ <DashboardInfoCard
49
+ title="Failed Policies"
50
+ value={hasData ? summary.failingPolicies : EMPTY_VALUE}
51
+ percentage={hasData ? summary.failingPoliciesPercentage : undefined}
52
+ showProgress={hasData}
53
+ progressVariant="error"
54
+ />
55
+ <DashboardInfoCard
56
+ title="Updated"
57
+ value={
58
+ hasData && summary.lastUpdatedAt
59
+ ? formatRelativeTimeFrom(summary.lastUpdatedAt, now ?? new Date())
60
+ : EMPTY_VALUE
61
+ }
62
+ valueClassName="!text-h3"
63
+ tooltip="Policy compliance stats are updated hourly. View a policy's devices for real-time status."
64
+ />
65
+ </>
66
+ )}
67
+ </div>
68
+ );
69
+ }
@@ -0,0 +1,37 @@
1
+ import type { ComponentProps } from 'react';
2
+ import type { MoreActionsMenu } from '../../ui/more-actions-menu';
3
+
4
+ /** A single ellipsis-menu action, as accepted by the core `MoreActionsMenu`. */
5
+ export type PolicyTableAction = ComponentProps<typeof MoreActionsMenu>['items'][number];
6
+
7
+ export type PolicyStatusVariant = 'success' | 'error' | 'warning' | 'critical' | 'grey';
8
+
9
+ export interface PolicyTableStatus {
10
+ label: string;
11
+ variant: PolicyStatusVariant;
12
+ /** Optional secondary line under the status tag (e.g. "3 devices"). */
13
+ note?: { text: string; tone: 'error' | 'warning' };
14
+ }
15
+
16
+ /**
17
+ * Normalized row consumed by the shared `PoliciesTable`. Each caller maps its
18
+ * own policy model (fleet-wide policy, per-device Fleet host policy, ...) into
19
+ * this view-model so the table/columns live in a single place.
20
+ */
21
+ export interface PolicyTableRow {
22
+ /** Stable row id. */
23
+ id: string;
24
+ name: string;
25
+ description?: string;
26
+ /** Critical severity: drives sorting and the default severity label. */
27
+ critical: boolean;
28
+ /** Display text for the SEVERITY column ("Critical" / "Low" / "Non-critical"). */
29
+ severityLabel: string;
30
+ status: PolicyTableStatus;
31
+ /** OS platforms, only rendered when the table shows the Platform column. */
32
+ platforms?: string[];
33
+ /** Optional ellipsis-menu actions for the row. */
34
+ actions?: PolicyTableAction[];
35
+ /** Target for the open-in-new-tab button and (optionally) the row link. */
36
+ href?: string;
37
+ }
@@ -14,23 +14,14 @@ import { useCollapsible } from '../chat/hooks/use-collapsible';
14
14
  import { ToolIcon } from '../tool-icon';
15
15
  import { Button } from '../ui/button';
16
16
  import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '../ui/dropdown-menu';
17
+ import { APPROVAL_LEVEL_META, APPROVAL_LEVELS } from './approval-level';
17
18
 
18
- const approvalLevelLabels: Record<ApprovalLevel, string> = {
19
- ALLOW: 'Allow',
20
- ASK_USER: 'Ask User',
21
- ASK_TECHNICIAN: 'Ask Technician',
22
- DENY: 'Restrict',
23
- };
24
-
25
- const approvalLevelOptions = (Object.keys(approvalLevelLabels) as ApprovalLevel[]).map(value => ({
26
- value,
27
- label: approvalLevelLabels[value],
28
- }));
19
+ const approvalLevelOptions = APPROVAL_LEVELS.map(value => ({ value, label: APPROVAL_LEVEL_META[value].label }));
29
20
 
30
21
  const POLICY_LEVEL_WIDTH = 'w-[180px]';
31
22
  const CATEGORY_LEVEL_WIDTH = 'w-[256px]';
32
23
 
33
- const getApprovalLevelLabel = (level: ApprovalLevel): string => approvalLevelLabels[level] ?? level;
24
+ const getApprovalLevelLabel = (level: ApprovalLevel): string => APPROVAL_LEVEL_META[level]?.label ?? level;
34
25
 
35
26
  const ApprovalLevelDropdown: FC<{
36
27
  value: ApprovalLevel | undefined;
@@ -13,6 +13,14 @@ export type {
13
13
  } from './remote-session-block';
14
14
  export { RemoteSessionChatPanel } from './remote-session-chat-panel';
15
15
  export type { RemoteSessionChatPanelProps } from './remote-session-chat-panel';
16
+ export { RemoteDesktopChatMessageRow } from './remote-desktop-chat-message-row';
17
+ export type { RemoteDesktopChatMessageRowProps } from './remote-desktop-chat-message-row';
18
+ export { REMOTE_DESKTOP_CHAT_END_USER_NAME, RemoteDesktopChatPanel } from './remote-desktop-chat-panel';
19
+ export type { RemoteDesktopChatPanelProps, RemoteDesktopChatTechnician } from './remote-desktop-chat-panel';
20
+ export { RemoteDesktopFullscreenToolbar } from './remote-desktop-fullscreen-toolbar';
21
+ export type { RemoteDesktopFullscreenToolbarProps } from './remote-desktop-fullscreen-toolbar';
22
+ export { RemoteDesktopView, RemoteDesktopViewSkeleton } from './remote-desktop-view';
23
+ export type { RemoteDesktopViewProps } from './remote-desktop-view';
16
24
  export { RemoteSessionDialog } from './remote-session-dialog';
17
25
  export type { RemoteSessionDialogProps } from './remote-session-dialog';
18
26
  export { RemoteSessionBorder, RemoteSessionPill } from './remote-session-overlay';
@@ -0,0 +1,56 @@
1
+ 'use client';
2
+
3
+ import { cn } from '../../../utils/cn';
4
+ import { formatTime } from '../../../utils/format-date';
5
+ import { SquareAvatar } from '../../ui/square-avatar';
6
+
7
+ export interface RemoteDesktopChatMessageRowProps {
8
+ authorName: string;
9
+ /** The technician's rows carry the avatar and the accent-colored name. */
10
+ isTechnician: boolean;
11
+ avatarUrl?: string;
12
+ /** When the message was sent: an ISO timestamp or a `Date`. */
13
+ sentAt: string | Date;
14
+ body: string;
15
+ }
16
+
17
+ /**
18
+ * One session-chat message on the technician's side, shared by the recording
19
+ * transcript and the live panel: the technician's rows carry a 24px avatar and
20
+ * an accent-colored name, the end user's rows a plain grey name; the timestamp
21
+ * sits right-aligned on the name row and the message body follows below.
22
+ *
23
+ * Names are Azeret Mono 18/24 medium in the mockup - a combination the ODS
24
+ * composite utilities don't carry (`text-h5` is the 14px uppercase caption),
25
+ * so the heading family is applied over `text-h4` via the ODS font variable.
26
+ */
27
+ export function RemoteDesktopChatMessageRow({
28
+ authorName,
29
+ isTechnician,
30
+ avatarUrl,
31
+ sentAt,
32
+ body,
33
+ }: RemoteDesktopChatMessageRowProps) {
34
+ return (
35
+ <div className="grid grid-cols-1 gap-[var(--spacing-system-xxs)]">
36
+ <div className="flex items-center gap-[var(--spacing-system-xxs)]">
37
+ {isTechnician && (
38
+ <SquareAvatar variant="round" sizePx={24} src={avatarUrl} alt={authorName} className="shrink-0" />
39
+ )}
40
+ <span
41
+ className={cn(
42
+ 'min-w-0 flex-1 truncate text-h4 [font-family:var(--font-family-heading)]',
43
+ isTechnician ? 'text-ods-accent' : 'text-ods-text-secondary',
44
+ )}
45
+ >
46
+ {authorName}
47
+ </span>
48
+ {/* The time is in the viewer's zone, which a server render cannot know. */}
49
+ <span suppressHydrationWarning className="shrink-0 text-ods-text-secondary text-h6">
50
+ {formatTime(sentAt)}
51
+ </span>
52
+ </div>
53
+ <p className="whitespace-pre-wrap text-ods-text-primary text-h4">{body}</p>
54
+ </div>
55
+ );
56
+ }
@@ -0,0 +1,102 @@
1
+ 'use client';
2
+
3
+ import { useEffect, useRef } from 'react';
4
+ import { cn } from '../../../utils/cn';
5
+ import { ChatInput } from '../../chat/chat-input';
6
+ import { RemoteDesktopChatMessageRow } from './remote-desktop-chat-message-row';
7
+ import type { RemoteSessionChatMessage } from './types';
8
+
9
+ /** Who is typing on the technician's side of the chat: shown on the technician's rows. */
10
+ export interface RemoteDesktopChatTechnician {
11
+ name: string;
12
+ avatarUrl?: string;
13
+ }
14
+
15
+ /** The end user has no profile on the wire: their rows read "User" unless a row names them. */
16
+ export const REMOTE_DESKTOP_CHAT_END_USER_NAME = 'User';
17
+
18
+ export interface RemoteDesktopChatPanelProps {
19
+ messages: RemoteSessionChatMessage[];
20
+ /** The dialog's history is still on its way; the empty state must not claim there is nothing. */
21
+ loading?: boolean;
22
+ technician: RemoteDesktopChatTechnician;
23
+ sending: boolean;
24
+ /** Resolves `false` to keep the draft in the input (nothing was sent). */
25
+ onSend: (body: string) => Promise<boolean>;
26
+ /**
27
+ * `side` - the right-hand column next to the screen;
28
+ * `overlay` - floating over the stream in fullscreen, positioned against
29
+ * the fullscreen screen container.
30
+ */
31
+ variant: 'side' | 'overlay';
32
+ }
33
+
34
+ /**
35
+ * The technician's chat with the end user during a remote session: the message
36
+ * stream bottom-aligned above the composer. The end user's side is
37
+ * `RemoteSessionChatPanel` in the session block; the "joined the chat" notice
38
+ * is that side's indication only and is not shown here.
39
+ */
40
+ export function RemoteDesktopChatPanel({
41
+ messages,
42
+ loading,
43
+ technician,
44
+ sending,
45
+ onSend,
46
+ variant,
47
+ }: RemoteDesktopChatPanelProps) {
48
+ const scrollRef = useRef<HTMLDivElement>(null);
49
+ // System notices (the "joined the chat" line) are the end user's indication only.
50
+ const rows = messages.filter(message => message.author !== 'system');
51
+
52
+ // Keep the newest message in view as the stream grows.
53
+ useEffect(() => {
54
+ const el = scrollRef.current;
55
+ if (el) el.scrollTop = el.scrollHeight;
56
+ }, [rows.length]);
57
+
58
+ return (
59
+ <aside
60
+ aria-label="Session chat"
61
+ className={cn(
62
+ 'flex flex-col gap-[var(--spacing-system-mf)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-mf)]',
63
+ variant === 'side'
64
+ ? 'h-full w-[400px] flex-shrink-0'
65
+ : 'absolute bottom-[var(--spacing-system-mf)] right-[var(--spacing-system-mf)] top-[calc(var(--spacing-system-xlf)+var(--spacing-system-mf))] z-10 w-[360px] shadow-lg',
66
+ )}
67
+ >
68
+ <div ref={scrollRef} className="min-h-0 flex-1 overflow-y-auto">
69
+ <div className="flex min-h-full flex-col justify-end gap-[var(--spacing-system-xsf)]">
70
+ {rows.length === 0 ? (
71
+ <p className="text-center text-ods-text-muted text-h6">
72
+ {loading ? 'Loading the chat...' : 'No messages yet - say hello to the user.'}
73
+ </p>
74
+ ) : (
75
+ rows.map(message => (
76
+ <RemoteDesktopChatMessageRow
77
+ key={message.id}
78
+ authorName={
79
+ message.name ||
80
+ (message.author === 'technician' ? technician.name : REMOTE_DESKTOP_CHAT_END_USER_NAME)
81
+ }
82
+ isTechnician={message.author === 'technician'}
83
+ avatarUrl={message.author === 'technician' ? technician.avatarUrl : undefined}
84
+ sentAt={message.at}
85
+ body={message.text}
86
+ />
87
+ ))
88
+ )}
89
+ </div>
90
+ </div>
91
+
92
+ <ChatInput
93
+ placeholder="Enter your Message..."
94
+ onSend={onSend}
95
+ sending={sending}
96
+ showSendButton
97
+ fullWidth
98
+ maxRows={4}
99
+ />
100
+ </aside>
101
+ );
102
+ }
@@ -0,0 +1,119 @@
1
+ 'use client';
2
+
3
+ import {
4
+ ChatOffIcon,
5
+ ChatTextIcon,
6
+ Chevron02DownIcon,
7
+ Collapse02Icon,
8
+ Ellipsis01Icon,
9
+ MonitorIcon,
10
+ Settings01Icon,
11
+ } from '../../icons-v2-generated';
12
+ import { OpenFrameLogo } from '../../icons/openframe-logo';
13
+ import { ActionsMenuDropdown, type ActionsMenuGroup } from '../../ui/actions-menu';
14
+ import { Button } from '../../ui/button/button';
15
+
16
+ export interface RemoteDesktopFullscreenToolbarProps {
17
+ deviceName: string;
18
+ displayMenuGroups: ActionsMenuGroup[];
19
+ currentDisplayLabel: string;
20
+ actionsMenuGroups: ActionsMenuGroup[];
21
+ onOpenSettings: () => void;
22
+ onExitFullscreen: () => void;
23
+ /** Session chat toggle - omitted when the session has no chat. */
24
+ chatOpen?: boolean;
25
+ onToggleChat?: () => void;
26
+ }
27
+
28
+ /**
29
+ * Compact overlay chrome for the fullscreen remote-desktop mode (Figma 1-70992):
30
+ * a floating semi-transparent bar at top-center (device name, display switcher,
31
+ * actions / exit-fullscreen / settings) plus a dimmed OpenFrame logo in the
32
+ * top-left corner of the stream. Rendered inside the fullscreen container,
33
+ * absolutely positioned over the screen.
34
+ */
35
+ export function RemoteDesktopFullscreenToolbar({
36
+ deviceName,
37
+ displayMenuGroups,
38
+ currentDisplayLabel,
39
+ actionsMenuGroups,
40
+ onOpenSettings,
41
+ onExitFullscreen,
42
+ chatOpen = false,
43
+ onToggleChat,
44
+ }: RemoteDesktopFullscreenToolbarProps) {
45
+ return (
46
+ <>
47
+ <OpenFrameLogo className="absolute left-[var(--spacing-system-mf)] top-[var(--spacing-system-mf)] z-10 h-6 w-6 opacity-50" />
48
+ <div
49
+ className={
50
+ 'absolute left-1/2 top-0 z-10 w-[calc(100%-7rem)] -translate-x-1/2 ' +
51
+ 'flex items-center gap-[var(--spacing-system-xs)] ' +
52
+ 'rounded-b-[6px] border-x border-b border-ods-border bg-ods-overlay ' +
53
+ 'py-[var(--spacing-system-xsf)] pl-[var(--spacing-system-mf)] pr-[var(--spacing-system-xsf)]'
54
+ }
55
+ >
56
+ <div className="flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xsf)]">
57
+ <span className="truncate text-ods-text-primary text-h6">{deviceName}</span>
58
+ {displayMenuGroups.length > 0 && (
59
+ <ActionsMenuDropdown
60
+ groups={displayMenuGroups}
61
+ customTrigger={
62
+ <button
63
+ type="button"
64
+ aria-label="Switch display"
65
+ className={
66
+ 'flex h-8 flex-shrink-0 items-center gap-[var(--spacing-system-xs)] rounded-[6px] ' +
67
+ 'border border-ods-border bg-ods-card p-[var(--spacing-system-xsf)] ' +
68
+ 'text-ods-text-primary hover:border-ods-border-hover'
69
+ }
70
+ >
71
+ <MonitorIcon className="h-4 w-4" />
72
+ <span className="whitespace-nowrap text-h5">{currentDisplayLabel}</span>
73
+ <Chevron02DownIcon className="h-4 w-4" />
74
+ </button>
75
+ }
76
+ />
77
+ )}
78
+ </div>
79
+ <div className="flex flex-shrink-0 items-center gap-[var(--spacing-system-xs)]">
80
+ {onToggleChat && (
81
+ <Button
82
+ variant="outline"
83
+ size="small"
84
+ onClick={onToggleChat}
85
+ leftIcon={chatOpen ? <ChatOffIcon className="h-4 w-4" /> : <ChatTextIcon className="h-4 w-4" />}
86
+ >
87
+ <span className="text-h5">{chatOpen ? 'Close Chat' : 'Open Chat'}</span>
88
+ </Button>
89
+ )}
90
+ <ActionsMenuDropdown
91
+ groups={actionsMenuGroups}
92
+ customTrigger={
93
+ <Button
94
+ variant="outline"
95
+ size="icon-sm"
96
+ aria-label="Actions"
97
+ leftIcon={<Ellipsis01Icon className="h-4 w-4" />}
98
+ />
99
+ }
100
+ />
101
+ <Button
102
+ variant="outline"
103
+ size="icon-sm"
104
+ aria-label="Exit fullscreen"
105
+ onClick={onExitFullscreen}
106
+ leftIcon={<Collapse02Icon className="h-4 w-4" />}
107
+ />
108
+ <Button
109
+ variant="outline"
110
+ size="icon-sm"
111
+ aria-label="Settings"
112
+ onClick={onOpenSettings}
113
+ leftIcon={<Settings01Icon className="h-4 w-4" />}
114
+ />
115
+ </div>
116
+ </div>
117
+ </>
118
+ );
119
+ }