@flamingo-stack/openframe-frontend-core 0.0.710 → 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 (534) 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-YBUT4AMG.cjs → chunk-3RKBJT6K.cjs} +8 -6
  8. package/dist/{chunk-LNW45N2C.js → chunk-3SEEGNRE.js} +35 -27
  9. package/dist/{chunk-L6Y6OOKG.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-36BCTE7D.js → chunk-4UYKNOZG.js} +12 -10
  14. package/dist/{chunk-DA5UDTLG.js → chunk-5SDELRH3.js} +5 -5
  15. package/dist/{chunk-CZSZSDD4.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-TDYIREDJ.js → chunk-7HNYYNKE.js} +28 -22
  19. package/dist/{chunk-2G7UYK35.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-2RNB5DTN.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-B73373AG.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-6YKAT7NV.js → chunk-DDWFCWOE.js} +5 -7
  36. package/dist/{chunk-F5FF4DME.js → chunk-EFNKS5W4.js} +322 -428
  37. package/dist/{chunk-2KXTOP6G.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-4L6XCMOU.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-MR3A4MZV.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-CNWOMQQJ.js → chunk-H5R7U2D2.js} +206 -5
  50. package/dist/{chunk-SEXWHIMS.cjs → chunk-HETQETPV.cjs} +9648 -9680
  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-3AHTOSXJ.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-JRU2CXLB.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-P42V6N34.cjs → chunk-L6ZQGWCX.cjs} +4521 -6234
  65. package/dist/{chunk-PLYEKV3N.cjs → chunk-MA4Q5RBP.cjs} +6 -6
  66. package/dist/{chunk-SS5MBHDP.js → chunk-N67XG5GY.js} +10 -8
  67. package/dist/chunk-NPAQSMRY.js +2087 -0
  68. package/dist/{chunk-I3ST4PLM.js → chunk-NQWJAOHO.js} +6 -4
  69. package/dist/{chunk-QAOFMK2A.cjs → chunk-OBZJICEA.cjs} +8 -8
  70. package/dist/{chunk-6IW7TWPV.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-4UM2ETLM.js → chunk-RBYVFPER.js} +74 -46
  75. package/dist/{chunk-PO33GZVY.js → chunk-ROBQ5TR7.js} +10549 -10581
  76. package/dist/{chunk-ZCLBYT2V.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-6I4ZAFO2.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-AOWDNSTM.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-LFFB6EMB.js → chunk-YBS5QGON.js} +70 -128
  91. package/dist/{chunk-NSGXARGJ.cjs → chunk-Z5SWJW5Q.cjs} +125 -117
  92. package/dist/{chunk-OJLR5MEO.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/hooks/use-chat-dialog-manager.d.ts +4 -1
  102. package/dist/components/chat/hooks/use-chat-dialog-manager.d.ts.map +1 -1
  103. package/dist/components/chat/hooks/use-unified-chat.d.ts.map +1 -1
  104. package/dist/components/chat/index.cjs +27 -8
  105. package/dist/components/chat/index.d.ts +1 -0
  106. package/dist/components/chat/index.d.ts.map +1 -1
  107. package/dist/components/chat/index.js +57 -38
  108. package/dist/components/chat/quick-action-chip.d.ts +7 -3
  109. package/dist/components/chat/quick-action-chip.d.ts.map +1 -1
  110. package/dist/components/chat/types/component.types.d.ts +4 -0
  111. package/dist/components/chat/types/component.types.d.ts.map +1 -1
  112. package/dist/components/chat/types/unified-chat-state.types.d.ts +12 -0
  113. package/dist/components/chat/types/unified-chat-state.types.d.ts.map +1 -1
  114. package/dist/components/contact/index.cjs +29 -13
  115. package/dist/components/contact/index.js +28 -12
  116. package/dist/components/docs/index.cjs +33 -16
  117. package/dist/components/docs/index.js +33 -16
  118. package/dist/components/docs/use-scroll-spy.d.ts +23 -1
  119. package/dist/components/docs/use-scroll-spy.d.ts.map +1 -1
  120. package/dist/components/embeds/index.cjs +29 -13
  121. package/dist/components/embeds/index.js +28 -12
  122. package/dist/components/faq/faq-section.d.ts +8 -1
  123. package/dist/components/faq/faq-section.d.ts.map +1 -1
  124. package/dist/components/faq/index.cjs +30 -14
  125. package/dist/components/faq/index.js +29 -13
  126. package/dist/components/features/array-entry-manager.d.ts +5 -1
  127. package/dist/components/features/array-entry-manager.d.ts.map +1 -1
  128. package/dist/components/features/board/board.d.ts +2 -0
  129. package/dist/components/features/board/board.d.ts.map +1 -1
  130. package/dist/components/features/board/ticket-card.d.ts.map +1 -1
  131. package/dist/components/features/board/touch-board.d.ts +1 -1
  132. package/dist/components/features/board/touch-board.d.ts.map +1 -1
  133. package/dist/components/features/board/types.d.ts +3 -0
  134. package/dist/components/features/board/types.d.ts.map +1 -1
  135. package/dist/components/features/board/use-board-collapse.d.ts +6 -1
  136. package/dist/components/features/board/use-board-collapse.d.ts.map +1 -1
  137. package/dist/components/features/capability-explorer.d.ts +94 -0
  138. package/dist/components/features/capability-explorer.d.ts.map +1 -0
  139. package/dist/components/features/cloud-tenants/index.d.ts +14 -0
  140. package/dist/components/features/cloud-tenants/index.d.ts.map +1 -0
  141. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts +9 -0
  142. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts.map +1 -0
  143. package/dist/components/features/cloud-tenants/tenant-cell.d.ts +8 -0
  144. package/dist/components/features/cloud-tenants/tenant-cell.d.ts.map +1 -0
  145. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts +9 -0
  146. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts.map +1 -0
  147. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts +42 -0
  148. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts.map +1 -0
  149. package/dist/components/features/cloud-tenants/tenant-row.d.ts +22 -0
  150. package/dist/components/features/cloud-tenants/tenant-row.d.ts.map +1 -0
  151. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts +42 -0
  152. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts.map +1 -0
  153. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts +26 -0
  154. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts.map +1 -0
  155. package/dist/components/features/devices/device-last-online.d.ts +3 -0
  156. package/dist/components/features/devices/device-last-online.d.ts.map +1 -0
  157. package/dist/components/features/devices/device-name.d.ts +42 -0
  158. package/dist/components/features/devices/device-name.d.ts.map +1 -0
  159. package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts +26 -0
  160. package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts.map +1 -0
  161. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts +25 -0
  162. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts.map +1 -0
  163. package/dist/components/features/devices/device-selector/device-selector.d.ts +38 -0
  164. package/dist/components/features/devices/device-selector/device-selector.d.ts.map +1 -0
  165. package/dist/components/features/devices/device-selector/device-selector.types.d.ts +133 -0
  166. package/dist/components/features/devices/device-selector/device-selector.types.d.ts.map +1 -0
  167. package/dist/components/features/devices/device-selector/narrowing.d.ts +13 -0
  168. package/dist/components/features/devices/device-selector/narrowing.d.ts.map +1 -0
  169. package/dist/components/features/devices/device-selector/use-device-selector.d.ts +17 -0
  170. package/dist/components/features/devices/device-selector/use-device-selector.d.ts.map +1 -0
  171. package/dist/components/features/devices/device-status.d.ts +23 -0
  172. package/dist/components/features/devices/device-status.d.ts.map +1 -0
  173. package/dist/components/features/devices/device-statuses.d.ts +40 -0
  174. package/dist/components/features/devices/device-statuses.d.ts.map +1 -0
  175. package/dist/components/features/devices/device-tags-filter-button.d.ts +22 -0
  176. package/dist/components/features/devices/device-tags-filter-button.d.ts.map +1 -0
  177. package/dist/components/features/devices/device-type-icon.d.ts +11 -0
  178. package/dist/components/features/devices/device-type-icon.d.ts.map +1 -0
  179. package/dist/components/features/devices/device-type-tile.d.ts +9 -0
  180. package/dist/components/features/devices/device-type-tile.d.ts.map +1 -0
  181. package/dist/components/features/devices/devices-filter-toolbar.d.ts +46 -0
  182. package/dist/components/features/devices/devices-filter-toolbar.d.ts.map +1 -0
  183. package/dist/components/features/devices/devices-grid-filters.d.ts +25 -0
  184. package/dist/components/features/devices/devices-grid-filters.d.ts.map +1 -0
  185. package/dist/components/features/devices/devices-grid.d.ts +12 -0
  186. package/dist/components/features/devices/devices-grid.d.ts.map +1 -0
  187. package/dist/components/features/devices/devices-list.d.ts +131 -0
  188. package/dist/components/features/devices/devices-list.d.ts.map +1 -0
  189. package/dist/components/features/devices/devices-panel-header.d.ts +46 -0
  190. package/dist/components/features/devices/devices-panel-header.d.ts.map +1 -0
  191. package/dist/components/features/devices/devices-panel-view.d.ts +79 -0
  192. package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -0
  193. package/dist/components/features/devices/devices-table-columns.d.ts +76 -0
  194. package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -0
  195. package/dist/components/features/devices/devices-view-config.d.ts +25 -0
  196. package/dist/components/features/devices/devices-view-config.d.ts.map +1 -0
  197. package/dist/components/features/devices/index.d.ts +24 -0
  198. package/dist/components/features/devices/index.d.ts.map +1 -0
  199. package/dist/components/features/devices/types.d.ts +68 -0
  200. package/dist/components/features/devices/types.d.ts.map +1 -0
  201. package/dist/components/features/devices/use-tag-filter-modal.d.ts +50 -0
  202. package/dist/components/features/devices/use-tag-filter-modal.d.ts.map +1 -0
  203. package/dist/components/features/index.cjs +227 -12
  204. package/dist/components/features/index.d.ts +7 -0
  205. package/dist/components/features/index.d.ts.map +1 -1
  206. package/dist/components/features/index.js +266 -51
  207. package/dist/components/features/knowledge-base/index.d.ts +7 -0
  208. package/dist/components/features/knowledge-base/index.d.ts.map +1 -0
  209. package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts +44 -0
  210. package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts.map +1 -0
  211. package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts +13 -0
  212. package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts.map +1 -0
  213. package/dist/components/features/knowledge-base/knowledge-base-status.d.ts +8 -0
  214. package/dist/components/features/knowledge-base/knowledge-base-status.d.ts.map +1 -0
  215. package/dist/components/features/knowledge-base/knowledge-base-table.d.ts +52 -0
  216. package/dist/components/features/knowledge-base/knowledge-base-table.d.ts.map +1 -0
  217. package/dist/components/features/logs/index.d.ts +12 -0
  218. package/dist/components/features/logs/index.d.ts.map +1 -0
  219. package/dist/components/features/logs/log-drawer.d.ts +29 -0
  220. package/dist/components/features/logs/log-drawer.d.ts.map +1 -0
  221. package/dist/components/features/logs/log-source-labels.d.ts +11 -0
  222. package/dist/components/features/logs/log-source-labels.d.ts.map +1 -0
  223. package/dist/components/features/logs/logs-page-view.d.ts +32 -0
  224. package/dist/components/features/logs/logs-page-view.d.ts.map +1 -0
  225. package/dist/components/features/logs/logs-table-columns.d.ts +15 -0
  226. package/dist/components/features/logs/logs-table-columns.d.ts.map +1 -0
  227. package/dist/components/features/logs/logs-table-view.d.ts +64 -0
  228. package/dist/components/features/logs/logs-table-view.d.ts.map +1 -0
  229. package/dist/components/features/logs/types.d.ts +52 -0
  230. package/dist/components/features/logs/types.d.ts.map +1 -0
  231. package/dist/components/features/policies/compute-policy-summary.d.ts +37 -0
  232. package/dist/components/features/policies/compute-policy-summary.d.ts.map +1 -0
  233. package/dist/components/features/policies/index.d.ts +8 -0
  234. package/dist/components/features/policies/index.d.ts.map +1 -0
  235. package/dist/components/features/policies/policies-table.d.ts +34 -0
  236. package/dist/components/features/policies/policies-table.d.ts.map +1 -0
  237. package/dist/components/features/policies/policy-summary-cards.d.ts +17 -0
  238. package/dist/components/features/policies/policy-summary-cards.d.ts.map +1 -0
  239. package/dist/components/features/policies/policy-table-row.d.ts +37 -0
  240. package/dist/components/features/policies/policy-table-row.d.ts.map +1 -0
  241. package/dist/components/features/remote-session/index.d.ts +8 -0
  242. package/dist/components/features/remote-session/index.d.ts.map +1 -1
  243. package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts +21 -0
  244. package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts.map +1 -0
  245. package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts +31 -0
  246. package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts.map +1 -0
  247. package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts +21 -0
  248. package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts.map +1 -0
  249. package/dist/components/features/remote-session/remote-desktop-view.d.ts +50 -0
  250. package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -0
  251. package/dist/components/features/software/index.d.ts +8 -0
  252. package/dist/components/features/software/index.d.ts.map +1 -0
  253. package/dist/components/features/software/package-managers.d.ts +30 -0
  254. package/dist/components/features/software/package-managers.d.ts.map +1 -0
  255. package/dist/components/features/software/package-search-field-placeholder.d.ts +7 -0
  256. package/dist/components/features/software/package-search-field-placeholder.d.ts.map +1 -0
  257. package/dist/components/features/software/schedule-fields.d.ts +34 -0
  258. package/dist/components/features/software/schedule-fields.d.ts.map +1 -0
  259. package/dist/components/features/software/software-action-copy.d.ts +25 -0
  260. package/dist/components/features/software/software-action-copy.d.ts.map +1 -0
  261. package/dist/components/features/software/software-action-form.d.ts +71 -0
  262. package/dist/components/features/software/software-action-form.d.ts.map +1 -0
  263. package/dist/components/features/software/software-row-fields.d.ts +23 -0
  264. package/dist/components/features/software/software-row-fields.d.ts.map +1 -0
  265. package/dist/components/features/software/software-row.d.ts +18 -0
  266. package/dist/components/features/software/software-row.d.ts.map +1 -0
  267. package/dist/components/features/sortable-list/index.d.ts +1 -0
  268. package/dist/components/features/sortable-list/index.d.ts.map +1 -1
  269. package/dist/components/features/sortable-list/sortable-drag-handle.d.ts +21 -0
  270. package/dist/components/features/sortable-list/sortable-drag-handle.d.ts.map +1 -0
  271. package/dist/components/help-center-pages/index.cjs +133 -114
  272. package/dist/components/help-center-pages/index.js +58 -39
  273. package/dist/components/index.cjs +320 -82
  274. package/dist/components/index.js +451 -213
  275. package/dist/components/layout/page-heading.d.ts +12 -3
  276. package/dist/components/layout/page-heading.d.ts.map +1 -1
  277. package/dist/components/meeting-scheduler/index.cjs +120 -98
  278. package/dist/components/meeting-scheduler/index.js +50 -28
  279. package/dist/components/navigation/index.cjs +36 -17
  280. package/dist/components/navigation/index.d.ts +3 -0
  281. package/dist/components/navigation/index.d.ts.map +1 -1
  282. package/dist/components/navigation/index.js +36 -17
  283. package/dist/components/navigation/mingo-ai-button.d.ts +23 -10
  284. package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
  285. package/dist/components/navigation/sticky-section-nav.d.ts +14 -1
  286. package/dist/components/navigation/sticky-section-nav.d.ts.map +1 -1
  287. package/dist/components/onboarding-guides/index.cjs +32 -16
  288. package/dist/components/onboarding-guides/index.js +31 -15
  289. package/dist/components/product-demo/cast.d.ts +58 -0
  290. package/dist/components/product-demo/cast.d.ts.map +1 -0
  291. package/dist/components/product-demo/fixtures/cloud-tenants.d.ts +10 -0
  292. package/dist/components/product-demo/fixtures/cloud-tenants.d.ts.map +1 -0
  293. package/dist/components/product-demo/fixtures/devices.d.ts +14 -0
  294. package/dist/components/product-demo/fixtures/devices.d.ts.map +1 -0
  295. package/dist/components/product-demo/fixtures/knowledge.d.ts +14 -0
  296. package/dist/components/product-demo/fixtures/knowledge.d.ts.map +1 -0
  297. package/dist/components/product-demo/fixtures/logs.d.ts +15 -0
  298. package/dist/components/product-demo/fixtures/logs.d.ts.map +1 -0
  299. package/dist/components/product-demo/fixtures/policies.d.ts +13 -0
  300. package/dist/components/product-demo/fixtures/policies.d.ts.map +1 -0
  301. package/dist/components/product-demo/fixtures/remote-session.d.ts +20 -0
  302. package/dist/components/product-demo/fixtures/remote-session.d.ts.map +1 -0
  303. package/dist/components/product-demo/fixtures/shared.d.ts +156 -0
  304. package/dist/components/product-demo/fixtures/shared.d.ts.map +1 -0
  305. package/dist/components/product-demo/fixtures/software-update.d.ts +19 -0
  306. package/dist/components/product-demo/fixtures/software-update.d.ts.map +1 -0
  307. package/dist/components/product-demo/fixtures/tickets-board.d.ts +8 -0
  308. package/dist/components/product-demo/fixtures/tickets-board.d.ts.map +1 -0
  309. package/dist/components/product-demo/index.cjs +112 -0
  310. package/dist/components/product-demo/index.d.ts +6 -0
  311. package/dist/components/product-demo/index.d.ts.map +1 -0
  312. package/dist/components/product-demo/index.js +112 -0
  313. package/dist/components/product-demo/product-screen.d.ts +22 -0
  314. package/dist/components/product-demo/product-screen.d.ts.map +1 -0
  315. package/dist/components/product-demo/registry.d.ts +13 -0
  316. package/dist/components/product-demo/registry.d.ts.map +1 -0
  317. package/dist/components/product-demo/screen-keys.cjs +25 -0
  318. package/dist/components/product-demo/screen-keys.d.ts +27 -0
  319. package/dist/components/product-demo/screen-keys.d.ts.map +1 -0
  320. package/dist/components/product-demo/screen-keys.js +20 -0
  321. package/dist/components/product-demo/screens/cloud-tenants.d.ts +8 -0
  322. package/dist/components/product-demo/screens/cloud-tenants.d.ts.map +1 -0
  323. package/dist/components/product-demo/screens/devices.d.ts +10 -0
  324. package/dist/components/product-demo/screens/devices.d.ts.map +1 -0
  325. package/dist/components/product-demo/screens/knowledge.d.ts +9 -0
  326. package/dist/components/product-demo/screens/knowledge.d.ts.map +1 -0
  327. package/dist/components/product-demo/screens/logs.d.ts +4 -0
  328. package/dist/components/product-demo/screens/logs.d.ts.map +1 -0
  329. package/dist/components/product-demo/screens/policies.d.ts +8 -0
  330. package/dist/components/product-demo/screens/policies.d.ts.map +1 -0
  331. package/dist/components/product-demo/screens/remote-desktop-picture.d.ts +11 -0
  332. package/dist/components/product-demo/screens/remote-desktop-picture.d.ts.map +1 -0
  333. package/dist/components/product-demo/screens/remote-session.d.ts +8 -0
  334. package/dist/components/product-demo/screens/remote-session.d.ts.map +1 -0
  335. package/dist/components/product-demo/screens/software-update.d.ts +12 -0
  336. package/dist/components/product-demo/screens/software-update.d.ts.map +1 -0
  337. package/dist/components/product-demo/screens/tickets-board.d.ts +4 -0
  338. package/dist/components/product-demo/screens/tickets-board.d.ts.map +1 -0
  339. package/dist/components/product-demo/types.d.ts +9 -0
  340. package/dist/components/product-demo/types.d.ts.map +1 -0
  341. package/dist/components/related-content/index.cjs +14 -8
  342. package/dist/components/related-content/index.js +13 -7
  343. package/dist/components/tickets/index.cjs +36 -20
  344. package/dist/components/tickets/index.js +35 -19
  345. package/dist/components/ui/file-manager/index.cjs +38 -34
  346. package/dist/components/ui/file-manager/index.js +8 -4
  347. package/dist/components/ui/index.cjs +57 -17
  348. package/dist/components/ui/index.d.ts +1 -0
  349. package/dist/components/ui/index.d.ts.map +1 -1
  350. package/dist/components/ui/index.js +141 -101
  351. package/dist/components/ui/product-screen-frame.d.ts +45 -0
  352. package/dist/components/ui/product-screen-frame.d.ts.map +1 -0
  353. package/dist/components/ui/radio-group.d.ts +5 -0
  354. package/dist/components/ui/radio-group.d.ts.map +1 -1
  355. package/dist/components/ui/snap-carousel.d.ts +11 -1
  356. package/dist/components/ui/snap-carousel.d.ts.map +1 -1
  357. package/dist/components/ui/tag.d.ts +1 -1
  358. package/dist/components/ui/tag.d.ts.map +1 -1
  359. package/dist/devices-LBMG42K6.js +81 -0
  360. package/dist/devices-YGYJIXQY.cjs +81 -0
  361. package/dist/hooks/index.cjs +17 -8
  362. package/dist/hooks/index.js +32 -23
  363. package/dist/hooks/ui/index.d.ts +1 -0
  364. package/dist/hooks/ui/index.d.ts.map +1 -1
  365. package/dist/hooks/ui/use-header-height.d.ts +12 -0
  366. package/dist/hooks/ui/use-header-height.d.ts.map +1 -1
  367. package/dist/hooks/ui/use-sticky-toolbar.d.ts +29 -0
  368. package/dist/hooks/ui/use-sticky-toolbar.d.ts.map +1 -0
  369. package/dist/hooks/use-location-hash.d.ts +2 -2
  370. package/dist/hooks/use-location-hash.d.ts.map +1 -1
  371. package/dist/hooks/use-scroll-to-hash.d.ts +7 -0
  372. package/dist/hooks/use-scroll-to-hash.d.ts.map +1 -1
  373. package/dist/index.cjs +276 -25
  374. package/dist/index.js +729 -478
  375. package/dist/knowledge-H5BIWJVI.js +108 -0
  376. package/dist/knowledge-KTCVJIWN.cjs +108 -0
  377. package/dist/logs-DB5Z7M5Q.js +216 -0
  378. package/dist/logs-RVCC2UQW.cjs +216 -0
  379. package/dist/policies-EWUULFBR.js +121 -0
  380. package/dist/policies-HV4IQCBV.cjs +121 -0
  381. package/dist/remote-session-GSGZOFDX.js +196 -0
  382. package/dist/remote-session-R6VAFESR.cjs +196 -0
  383. package/dist/software-update-6PXKRKBT.js +179 -0
  384. package/dist/software-update-D4OVSWSG.cjs +179 -0
  385. package/dist/tickets-board-BHLPAVNJ.cjs +137 -0
  386. package/dist/tickets-board-PYDNELSK.js +137 -0
  387. package/dist/types/case-study.d.ts +15 -1
  388. package/dist/types/case-study.d.ts.map +1 -1
  389. package/dist/utils/date-utils.d.ts +5 -0
  390. package/dist/utils/date-utils.d.ts.map +1 -1
  391. package/dist/utils/index.cjs +45 -2
  392. package/dist/utils/index.d.ts +2 -1
  393. package/dist/utils/index.d.ts.map +1 -1
  394. package/dist/utils/index.js +41 -3
  395. package/dist/utils/open-in-new-tab.d.ts +7 -0
  396. package/dist/utils/open-in-new-tab.d.ts.map +1 -0
  397. package/dist/utils/same-page-hash-nav.d.ts +31 -0
  398. package/dist/utils/same-page-hash-nav.d.ts.map +1 -1
  399. package/dist/utils/scroll-into-view.d.ts +14 -1
  400. package/dist/utils/scroll-into-view.d.ts.map +1 -1
  401. package/package.json +13 -1
  402. package/src/components/chat/ask-prompts.tsx +226 -0
  403. package/src/components/chat/embeddable-chat.tsx +38 -2
  404. package/src/components/chat/entity-cards/case-study-card.tsx +122 -46
  405. package/src/components/chat/hooks/use-chat-dialog-manager.ts +22 -4
  406. package/src/components/chat/hooks/use-unified-chat.ts +1 -0
  407. package/src/components/chat/index.ts +1 -0
  408. package/src/components/chat/quick-action-chip.tsx +33 -9
  409. package/src/components/chat/types/component.types.ts +4 -0
  410. package/src/components/chat/types/unified-chat-state.types.ts +13 -0
  411. package/src/components/docs/use-scroll-spy.ts +93 -18
  412. package/src/components/faq/faq-section.tsx +82 -43
  413. package/src/components/features/array-entry-manager.tsx +10 -1
  414. package/src/components/features/board/board.tsx +4 -1
  415. package/src/components/features/board/ticket-card.tsx +11 -1
  416. package/src/components/features/board/touch-board.tsx +2 -1
  417. package/src/components/features/board/types.ts +3 -0
  418. package/src/components/features/board/use-board-collapse.ts +7 -2
  419. package/src/components/features/capability-explorer.tsx +412 -0
  420. package/src/components/features/cloud-tenants/index.ts +28 -0
  421. package/src/components/features/cloud-tenants/tenant-access-cell.tsx +24 -0
  422. package/src/components/features/cloud-tenants/tenant-cell.tsx +26 -0
  423. package/src/components/features/cloud-tenants/tenant-customer-cell.tsx +27 -0
  424. package/src/components/features/cloud-tenants/tenant-presentation.ts +111 -0
  425. package/src/components/features/cloud-tenants/tenant-row.ts +21 -0
  426. package/src/components/features/cloud-tenants/tenants-table-columns.ts +30 -0
  427. package/src/components/features/cloud-tenants/tenants-table-view.tsx +142 -0
  428. package/src/components/features/devices/device-last-online.ts +6 -0
  429. package/src/components/features/devices/device-name.ts +51 -0
  430. package/src/components/features/devices/device-selector/device-selection-mode-radio.tsx +107 -0
  431. package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +32 -0
  432. package/src/components/features/devices/device-selector/device-selector.tsx +799 -0
  433. package/src/components/features/devices/device-selector/device-selector.types.ts +138 -0
  434. package/src/components/features/devices/device-selector/narrowing.ts +33 -0
  435. package/src/components/features/devices/device-selector/use-device-selector.ts +51 -0
  436. package/src/components/features/devices/device-status.ts +102 -0
  437. package/src/components/features/devices/device-statuses.ts +88 -0
  438. package/src/components/features/devices/device-tags-filter-button.tsx +49 -0
  439. package/src/components/features/devices/device-type-icon.tsx +29 -0
  440. package/src/components/features/devices/device-type-tile.tsx +17 -0
  441. package/src/components/features/devices/devices-filter-toolbar.tsx +114 -0
  442. package/src/components/features/devices/devices-grid-filters.tsx +99 -0
  443. package/src/components/features/devices/devices-grid.tsx +86 -0
  444. package/src/components/features/devices/devices-list.tsx +357 -0
  445. package/src/components/features/devices/devices-panel-header.tsx +97 -0
  446. package/src/components/features/devices/devices-panel-view.tsx +261 -0
  447. package/src/components/features/devices/devices-table-columns.tsx +356 -0
  448. package/src/components/features/devices/devices-view-config.tsx +38 -0
  449. package/src/components/features/devices/index.ts +89 -0
  450. package/src/components/features/devices/types.ts +74 -0
  451. package/src/components/features/devices/use-tag-filter-modal.ts +109 -0
  452. package/src/components/features/index.ts +9 -0
  453. package/src/components/features/knowledge-base/index.ts +19 -0
  454. package/src/components/features/knowledge-base/knowledge-base-article-view.tsx +134 -0
  455. package/src/components/features/knowledge-base/knowledge-base-item-icon.ts +14 -0
  456. package/src/components/features/knowledge-base/knowledge-base-status.ts +12 -0
  457. package/src/components/features/knowledge-base/knowledge-base-table.tsx +180 -0
  458. package/src/components/features/logs/index.ts +20 -0
  459. package/src/components/features/logs/log-drawer.tsx +138 -0
  460. package/src/components/features/logs/log-source-labels.ts +25 -0
  461. package/src/components/features/logs/logs-page-view.tsx +100 -0
  462. package/src/components/features/logs/logs-table-columns.ts +16 -0
  463. package/src/components/features/logs/logs-table-view.tsx +509 -0
  464. package/src/components/features/logs/types.ts +71 -0
  465. package/src/components/features/policies/compute-policy-summary.ts +115 -0
  466. package/src/components/features/policies/index.ts +14 -0
  467. package/src/components/features/policies/policies-table.tsx +235 -0
  468. package/src/components/features/policies/policy-summary-cards.tsx +69 -0
  469. package/src/components/features/policies/policy-table-row.ts +37 -0
  470. package/src/components/features/remote-session/index.ts +8 -0
  471. package/src/components/features/remote-session/remote-desktop-chat-message-row.tsx +56 -0
  472. package/src/components/features/remote-session/remote-desktop-chat-panel.tsx +102 -0
  473. package/src/components/features/remote-session/remote-desktop-fullscreen-toolbar.tsx +119 -0
  474. package/src/components/features/remote-session/remote-desktop-view.tsx +209 -0
  475. package/src/components/features/software/index.ts +39 -0
  476. package/src/components/features/software/package-managers.ts +54 -0
  477. package/src/components/features/software/package-search-field-placeholder.tsx +23 -0
  478. package/src/components/features/software/schedule-fields.tsx +105 -0
  479. package/src/components/features/software/software-action-copy.ts +70 -0
  480. package/src/components/features/software/software-action-form.tsx +199 -0
  481. package/src/components/features/software/software-row-fields.tsx +105 -0
  482. package/src/components/features/software/software-row.ts +22 -0
  483. package/src/components/features/sortable-list/index.ts +1 -0
  484. package/src/components/features/sortable-list/sortable-drag-handle.tsx +41 -0
  485. package/src/components/layout/page-heading.tsx +23 -6
  486. package/src/components/navigation/index.ts +5 -0
  487. package/src/components/navigation/mingo-ai-button.tsx +37 -13
  488. package/src/components/navigation/sticky-section-nav.tsx +99 -1
  489. package/src/components/product-demo/cast.tsx +78 -0
  490. package/src/components/product-demo/fixtures/cloud-tenants.ts +63 -0
  491. package/src/components/product-demo/fixtures/devices.ts +87 -0
  492. package/src/components/product-demo/fixtures/knowledge.ts +48 -0
  493. package/src/components/product-demo/fixtures/logs.ts +103 -0
  494. package/src/components/product-demo/fixtures/policies.ts +77 -0
  495. package/src/components/product-demo/fixtures/remote-session.ts +65 -0
  496. package/src/components/product-demo/fixtures/shared.ts +53 -0
  497. package/src/components/product-demo/fixtures/software-update.ts +63 -0
  498. package/src/components/product-demo/fixtures/tickets-board.ts +100 -0
  499. package/src/components/product-demo/index.ts +7 -0
  500. package/src/components/product-demo/product-screen.tsx +94 -0
  501. package/src/components/product-demo/registry.ts +20 -0
  502. package/src/components/product-demo/screen-keys.ts +31 -0
  503. package/src/components/product-demo/screens/cloud-tenants.tsx +23 -0
  504. package/src/components/product-demo/screens/devices.tsx +41 -0
  505. package/src/components/product-demo/screens/knowledge.tsx +27 -0
  506. package/src/components/product-demo/screens/logs.tsx +113 -0
  507. package/src/components/product-demo/screens/policies.tsx +29 -0
  508. package/src/components/product-demo/screens/remote-desktop-picture.tsx +118 -0
  509. package/src/components/product-demo/screens/remote-session.tsx +46 -0
  510. package/src/components/product-demo/screens/software-update.tsx +97 -0
  511. package/src/components/product-demo/screens/tickets-board.tsx +28 -0
  512. package/src/components/product-demo/types.ts +10 -0
  513. package/src/components/ui/index.ts +1 -0
  514. package/src/components/ui/product-screen-frame.tsx +136 -0
  515. package/src/components/ui/radio-group.tsx +16 -4
  516. package/src/components/ui/snap-carousel.tsx +26 -1
  517. package/src/components/ui/tag.tsx +5 -0
  518. package/src/hooks/ui/index.ts +1 -0
  519. package/src/hooks/ui/use-header-height.ts +51 -2
  520. package/src/hooks/ui/use-sticky-toolbar.ts +60 -0
  521. package/src/hooks/use-location-hash.ts +9 -5
  522. package/src/hooks/use-scroll-to-hash.ts +9 -1
  523. package/src/types/case-study.ts +21 -1
  524. package/src/utils/date-utils.ts +8 -1
  525. package/src/utils/index.ts +5 -0
  526. package/src/utils/open-in-new-tab.ts +12 -0
  527. package/src/utils/same-page-hash-nav.ts +57 -0
  528. package/src/utils/scroll-into-view.ts +21 -5
  529. package/dist/chunk-BM5MVGH3.cjs +0 -499
  530. package/dist/chunk-CUME3VTQ.js +0 -144
  531. package/dist/chunk-CZ7Y7UG4.js +0 -732
  532. package/dist/chunk-FLKJYMVB.js +0 -499
  533. package/dist/chunk-OF6GEI5A.cjs +0 -144
  534. package/dist/chunk-UVTD52MD.cjs +0 -732
@@ -0,0 +1,138 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ColumnFiltersState } from '../../../ui';
3
+ import type { DeviceFilters, DeviceRow } from '../types';
4
+
5
+ export type SubTab = 'available' | 'selected';
6
+
7
+ /** The two ways a consumer can target devices, the picker's top-level radio. */
8
+ export type DeviceSelectionMode = 'specific' | 'criteria';
9
+
10
+ /** The narrowing the picker is showing, in the component's own vocabulary. */
11
+ export interface DeviceSelectorNarrowing {
12
+ /** Column funnels (status / customer / os), TanStack-shaped. */
13
+ columnFilters: ColumnFiltersState;
14
+ /** Tag chips in the search bar, `key:value`. */
15
+ tags: string[];
16
+ }
17
+
18
+ /**
19
+ * Hands the picker's state to a parent that answers it from the server.
20
+ *
21
+ * Present ⇒ the component stops deriving anything from the `devices` array:
22
+ * `devices` IS the current tab's page, the Available/Selected split is two
23
+ * server queries rather than one list partitioned by `selectedIds`, and search,
24
+ * filters and the bulk actions are questions for the backend. Absent ⇒ every
25
+ * bit of that stays client-side exactly as before, which is what the other
26
+ * consumers (Run/Test Script, monitoring) rely on.
27
+ *
28
+ * The row action is add-or-remove by tab, not a toggle: with only a page of the
29
+ * assignment in hand, "is this one selected?" is not a question the client can
30
+ * answer. Selected always offers remove; on Available the row flips off
31
+ * `selectedIds`, which the parent fills from the connection's own per-row
32
+ * "already assigned" flag rather than from the page it holds.
33
+ */
34
+ export interface DeviceSelectorServer<T extends DeviceRow = DeviceRow> {
35
+ activeTab: SubTab;
36
+ onTabChange: (tab: SubTab) => void;
37
+ /** Search box value. The parent debounces it into its query. */
38
+ search: string;
39
+ onSearchChange: (value: string) => void;
40
+ narrowing: DeviceSelectorNarrowing;
41
+ onNarrowingChange: (next: DeviceSelectorNarrowing) => void;
42
+ /**
43
+ * Options for the column funnels. Rows are paged, so options derived from
44
+ * them would only ever offer what page one happens to contain.
45
+ */
46
+ filterOptions?: DeviceFilters | null;
47
+ /** Size of the whole assignment, the "Selected Devices (N)" label. */
48
+ selectedCount: number;
49
+ /** Server-side count for the list on screen, for the header's row count. */
50
+ totalCount?: number;
51
+ /** Row actions. Committed immediately; there is no Save to batch them into. */
52
+ onAdd: (device: T) => void;
53
+ onRemove: (device: T) => void;
54
+ /** Header bulk actions, resolved server-side over the current narrowing. */
55
+ onAddAll: () => void;
56
+ onRemoveAll: () => void;
57
+ }
58
+
59
+ export interface DeviceSelectorInfiniteScroll {
60
+ hasNextPage: boolean;
61
+ isFetchingNextPage: boolean;
62
+ onLoadMore: () => void;
63
+ skeletonRows: number;
64
+ }
65
+
66
+ export interface DeviceSelectorProps<T extends DeviceRow = DeviceRow> {
67
+ /** Devices to display. Consumer controls fetching and pre-filtering. */
68
+ devices: T[];
69
+ /** Whether the device list is loading. */
70
+ loading: boolean;
71
+ /**
72
+ * Currently selected device keys. Optional so a skeleton can render the real
73
+ * picker with nothing selected, the component falls back to an empty set and
74
+ * a no-op change handler. Every consumer a user can act on passes both.
75
+ *
76
+ * In `server` mode this is not the picker's own state, the parent fills it
77
+ * with the rows the backend reports as already assigned, so the Available tab
78
+ * pre-checks them instead of offering to add what is already in.
79
+ */
80
+ selectedIds?: Set<string>;
81
+ /** Called when selection changes. Optional for the same reason as `selectedIds`. */
82
+ onSelectionChange?: (ids: Set<string>) => void;
83
+ /** Extract the unique string key for selection from a device. Defaults to `d.machineId ?? d.id`. */
84
+ getDeviceKey?: (device: T) => string | undefined;
85
+ /** Infinite scroll config for the available tab. */
86
+ infiniteScroll?: DeviceSelectorInfiniteScroll;
87
+ /** Disable all interactions (e.g. during save). */
88
+ disabled?: boolean;
89
+ /** Show selection mode radio group. Default: true. */
90
+ showSelectionModeRadio?: boolean;
91
+ /**
92
+ * Controls the selection-mode radio. Passing it is what ENABLES the "by
93
+ * criteria" option, a consumer that leaves it out gets the uncontrolled
94
+ * radio with criteria disabled and tagged "Coming Soon", which is what the
95
+ * monitoring and run-script pages still want.
96
+ */
97
+ selectionMode?: DeviceSelectionMode;
98
+ onSelectionModeChange?: (mode: DeviceSelectionMode) => void;
99
+ /**
100
+ * The rule editor, rendered in place of the whole picker card while
101
+ * `selectionMode` is `'criteria'` (design 460:85294 drops the card frame
102
+ * there, fields and table sit straight on the page).
103
+ *
104
+ * The table below it then shows what the rule currently resolves to: no row
105
+ * actions, no search box, no column funnels, the rule IS the narrowing, and a
106
+ * second one layered on top would make the row count answer a different
107
+ * question than the one the user is editing.
108
+ */
109
+ criteriaContent?: ReactNode;
110
+ /** Extra content rendered above the selection radio / tabs (e.g. ScheduleInfoBar). */
111
+ headerContent?: ReactNode;
112
+ /** Table rowKey. Default: "id". */
113
+ rowKey?: string;
114
+ /** "replace" replaces entire selection on Add All; "merge" adds to existing. Default: "merge". */
115
+ addAllBehavior?: 'replace' | 'merge';
116
+ /** Allow only one device to be selected at a time. Default: false. */
117
+ singleSelect?: boolean;
118
+ /** Return a tooltip string if the device should be disabled, or undefined if enabled. */
119
+ isDeviceDisabled?: (device: T) => string | undefined;
120
+ /**
121
+ * The search and tag filter row over the table. Default true; a host that
122
+ * shows a fixed list (nothing to search) passes false.
123
+ */
124
+ showToolbar?: boolean;
125
+ /** Column ids to drop from the table (e.g. `['organization', 'status']` to leave only device + os). */
126
+ hideColumns?: string[];
127
+ /**
128
+ * Server-side size of the list on screen, for the header's row count. Only
129
+ * needed when the rows are paged but `server` is not in play (the criteria
130
+ * preview); `server.totalCount` covers the server-driven picker.
131
+ */
132
+ totalCount?: number;
133
+ /**
134
+ * Switches the picker to server-driven mode, see {@link DeviceSelectorServer}.
135
+ * Omit for the client-side behaviour every other consumer uses.
136
+ */
137
+ server?: DeviceSelectorServer<T>;
138
+ }
@@ -0,0 +1,33 @@
1
+ import type { DeviceFilterInput } from '../types';
2
+ import type { DeviceSelectorNarrowing } from './device-selector.types';
3
+
4
+ export const EMPTY_NARROWING: DeviceSelectorNarrowing = { columnFilters: [], tags: [] };
5
+
6
+ /**
7
+ * Turns the picker's narrowing vocabulary into the backend's.
8
+ *
9
+ * The component speaks in table column filters and `key:value` chips because
10
+ * that is what its controls produce; the owner's device fields take a
11
+ * `DeviceFilterInput`. A plain-text chip (no colon) stays on screen but carries
12
+ * no filter, same as the devices page.
13
+ */
14
+ export function narrowingToFilter(narrowing: DeviceSelectorNarrowing): DeviceFilterInput {
15
+ const column = (id: string) => narrowing.columnFilters.find(f => f.id === id)?.value as string[] | undefined;
16
+ const tagPairs = narrowing.tags.flatMap(t => {
17
+ const i = t.indexOf(':');
18
+ return i > 0 ? [{ key: t.slice(0, i), value: t.slice(i + 1) }] : [];
19
+ });
20
+
21
+ const filter: DeviceFilterInput = {};
22
+ const statuses = column('status');
23
+ const osTypes = column('os');
24
+ const organizationIds = column('organization');
25
+ if (statuses?.length) filter.statuses = statuses;
26
+ if (osTypes?.length) filter.osTypes = osTypes;
27
+ if (organizationIds?.length) filter.organizationIds = organizationIds;
28
+ if (tagPairs.length) {
29
+ filter.tagKeys = tagPairs.map(t => t.key);
30
+ filter.tagValues = tagPairs.map(t => t.value);
31
+ }
32
+ return filter;
33
+ }
@@ -0,0 +1,51 @@
1
+ import { useCallback, useMemo, useState } from 'react';
2
+ import { matchesDeviceName } from '../device-name';
3
+ import type { DeviceRow } from '../types';
4
+ import type { SubTab } from './device-selector.types';
5
+
6
+ interface UseDeviceSelectorParams<T extends DeviceRow> {
7
+ devices: T[];
8
+ selectedIds: Set<string>;
9
+ getDeviceKey: (device: T) => string | undefined;
10
+ }
11
+
12
+ export function useDeviceSelector<T extends DeviceRow>({
13
+ devices,
14
+ selectedIds,
15
+ getDeviceKey,
16
+ }: UseDeviceSelectorParams<T>) {
17
+ const [searchTerm, setSearchTerm] = useState('');
18
+ const [activeSubTab, setActiveSubTab] = useState<SubTab>('available');
19
+
20
+ const filteredDevices = useMemo(() => {
21
+ const needle = searchTerm.trim().toLowerCase();
22
+ if (!needle) return devices;
23
+ return devices.filter(
24
+ d => matchesDeviceName(d, needle) || (d.osType || d.operating_system || '').toLowerCase().includes(needle),
25
+ );
26
+ }, [devices, searchTerm]);
27
+
28
+ const displayDevices = useMemo(() => {
29
+ if (activeSubTab === 'selected') {
30
+ return filteredDevices.filter(d => {
31
+ const key = getDeviceKey(d);
32
+ return key !== undefined && selectedIds.has(key);
33
+ });
34
+ }
35
+ return filteredDevices;
36
+ }, [filteredDevices, activeSubTab, selectedIds, getDeviceKey]);
37
+
38
+ const handleTabChange = useCallback((tabId: string) => {
39
+ setSearchTerm('');
40
+ setActiveSubTab(tabId as SubTab);
41
+ }, []);
42
+
43
+ return {
44
+ searchTerm,
45
+ setSearchTerm,
46
+ activeSubTab,
47
+ handleTabChange,
48
+ filteredDevices,
49
+ displayDevices,
50
+ };
51
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Device status configuration utilities
3
+ * Provides consistent status mapping across the application
4
+ */
5
+
6
+ import type { OSPlatformId } from '../../../utils/os-platforms';
7
+ import { getOSPlatformId } from '../../../utils/os-utils';
8
+
9
+ export type DeviceStatusVariant = 'success' | 'error' | 'warning' | 'grey' | 'critical';
10
+ export type DeviceCardStatus = 'active' | 'inactive' | 'offline' | 'warning' | 'error';
11
+
12
+ export interface DeviceStatusConfig {
13
+ label: string;
14
+ variant: DeviceStatusVariant;
15
+ cardStatus: DeviceCardStatus;
16
+ }
17
+
18
+ /**
19
+ * Get status configuration for display
20
+ * Used by both table and grid views for consistent status representation
21
+ */
22
+ export function getDeviceStatusConfig(status: string | null | undefined): DeviceStatusConfig {
23
+ // A device may carry no status yet: it reads as the unknown one, never a crash.
24
+ const known = (status ?? '').toUpperCase();
25
+ switch (known) {
26
+ case 'ONLINE':
27
+ return {
28
+ label: 'ONLINE',
29
+ variant: 'success',
30
+ cardStatus: 'active',
31
+ };
32
+ // ACTIVE reads as PENDING because the product app maps it so: this is its
33
+ // mapping, carried into the lib unchanged. What a status reads as is a
34
+ // product decision, not this module's.
35
+ case 'PENDING':
36
+ case 'ACTIVE':
37
+ return {
38
+ label: 'PENDING',
39
+ variant: 'warning',
40
+ cardStatus: 'warning',
41
+ };
42
+ case 'OFFLINE':
43
+ return {
44
+ label: 'OFFLINE',
45
+ variant: 'error',
46
+ cardStatus: 'offline',
47
+ };
48
+ case 'DECOMMISSIONED':
49
+ return {
50
+ label: 'DECOMMISSIONED',
51
+ variant: 'error',
52
+ cardStatus: 'offline',
53
+ };
54
+ case 'IDLE':
55
+ case 'INACTIVE':
56
+ return {
57
+ label: 'INACTIVE',
58
+ variant: 'grey',
59
+ cardStatus: 'inactive',
60
+ };
61
+ case 'MAINTENANCE':
62
+ return {
63
+ label: 'MAINTENANCE',
64
+ variant: 'warning',
65
+ cardStatus: 'warning',
66
+ };
67
+ case 'PENDING_DELETION':
68
+ return {
69
+ label: 'PENDING DELETION',
70
+ variant: 'error',
71
+ cardStatus: 'error',
72
+ };
73
+ case 'ARCHIVED':
74
+ return {
75
+ label: 'ARCHIVED',
76
+ variant: 'grey',
77
+ cardStatus: 'inactive',
78
+ };
79
+ case 'DELETED':
80
+ return {
81
+ label: 'DELETED',
82
+ variant: 'error',
83
+ cardStatus: 'offline',
84
+ };
85
+ default:
86
+ return {
87
+ label: known,
88
+ variant: 'grey',
89
+ cardStatus: 'inactive',
90
+ };
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Get operating system type for DeviceCard component
96
+ * Uses centralized OS type system from ui-kit
97
+ */
98
+ export function getDeviceOperatingSystem(osType?: string): OSPlatformId | undefined {
99
+ // Uses centralized getOSPlatformId from ui-kit
100
+ // Returns: 'darwin' | 'windows' | 'linux' | undefined
101
+ return getOSPlatformId(osType);
102
+ }
@@ -0,0 +1,88 @@
1
+ import type { DeviceFilterInput } from './types';
2
+
3
+ /**
4
+ * Default visible device statuses (excludes ARCHIVED and DELETED).
5
+ * Deleted devices live on the dedicated /devices/archive page as read-only
6
+ * records. Use this constant for all device queries that should show "active"
7
+ * devices only.
8
+ *
9
+ * NOTE: If new statuses are added to the backend, they must be added here
10
+ * to appear in default views.
11
+ */
12
+
13
+ export const DEVICE_STATUS = {
14
+ ONLINE: 'ONLINE',
15
+ OFFLINE: 'OFFLINE',
16
+ ACTIVE: 'ACTIVE',
17
+ INACTIVE: 'INACTIVE',
18
+ MAINTENANCE: 'MAINTENANCE',
19
+ DECOMMISSIONED: 'DECOMMISSIONED',
20
+ PENDING: 'PENDING',
21
+ // Filter values are sanitized against the generated `DeviceStatus` enum
22
+ // (`toRelayDeviceFilter`) before hitting GraphQL, so PENDING_DELETION is
23
+ // silently dropped from queries until the backend adds it to the schema and
24
+ // `schema.graphql` / schema-enums are refreshed. Safe to ship ahead of BE.
25
+ PENDING_DELETION: 'PENDING_DELETION',
26
+ // No archive action exists anymore, ARCHIVED survives only as a legacy
27
+ // status on devices archived before the delete/archive rework.
28
+ ARCHIVED: 'ARCHIVED',
29
+ DELETED: 'DELETED',
30
+ } as const;
31
+
32
+ export type DeviceStatus = (typeof DEVICE_STATUS)[keyof typeof DEVICE_STATUS];
33
+
34
+ export const DEFAULT_VISIBLE_STATUSES = [
35
+ DEVICE_STATUS.ONLINE,
36
+ DEVICE_STATUS.OFFLINE,
37
+ DEVICE_STATUS.PENDING,
38
+ DEVICE_STATUS.PENDING_DELETION,
39
+ ] as const satisfies string[];
40
+
41
+ // DELETED + legacy ARCHIVED both feed the dashboard's "Archived Devices" card,
42
+ // mirroring what the /devices/archive page lists.
43
+ export const DEFAULT_DASHBOARD_STATUSES = [
44
+ DEVICE_STATUS.ONLINE,
45
+ DEVICE_STATUS.OFFLINE,
46
+ DEVICE_STATUS.PENDING,
47
+ DEVICE_STATUS.PENDING_DELETION,
48
+ DEVICE_STATUS.ARCHIVED,
49
+ DEVICE_STATUS.DELETED,
50
+ ] as const satisfies string[];
51
+
52
+ // PENDING is intentionally not part of the default list view, pending
53
+ // (still-enrolling) devices appear only when the user explicitly checks the
54
+ // PENDING status filter. The option itself stays in DEFAULT_VISIBLE_STATUSES.
55
+ // PENDING_DELETION stays in the default view: a device scheduled for uninstall
56
+ // must remain visible until the uninstall actually completes.
57
+ export const DEFAULT_DEVICES_LIST_STATUSES = [
58
+ DEVICE_STATUS.ONLINE,
59
+ DEVICE_STATUS.OFFLINE,
60
+ DEVICE_STATUS.PENDING_DELETION,
61
+ ] as const satisfies string[];
62
+
63
+ // Statuses fetched when the device list is used as an enrichment registry
64
+ // (e.g. monitoring query/policy tables mapping fleet hosts → device metadata).
65
+ // Includes DELETED (and legacy ARCHIVED) so archived-but-monitored hosts keep
66
+ // their org/OS/image instead of degrading to bare host rows.
67
+ export const DEVICE_ENRICHMENT_STATUSES = [
68
+ DEVICE_STATUS.ONLINE,
69
+ DEVICE_STATUS.OFFLINE,
70
+ DEVICE_STATUS.ARCHIVED,
71
+ DEVICE_STATUS.DELETED,
72
+ ] as const satisfies string[];
73
+
74
+ /**
75
+ * The device-registry filter the monitoring tables read: the enrichment statuses
76
+ * as a ready `DeviceFilterInput`. Shared so the policy and query tables ask for
77
+ * the same fleet and therefore share one cached fetch.
78
+ */
79
+ export const DEVICE_ENRICHMENT_FILTER: DeviceFilterInput = { statuses: [...DEVICE_ENRICHMENT_STATUSES] };
80
+
81
+ export type DefaultVisibleStatus = (typeof DEFAULT_VISIBLE_STATUSES)[number];
82
+
83
+ /**
84
+ * Statuses that are hidden by default (for documentation/reference)
85
+ */
86
+ export const HIDDEN_DEVICE_STATUSES = [DEVICE_STATUS.ARCHIVED, DEVICE_STATUS.DELETED] as const;
87
+
88
+ export type HiddenDeviceStatus = (typeof HIDDEN_DEVICE_STATUSES)[number];
@@ -0,0 +1,49 @@
1
+ 'use client';
2
+
3
+ import { Filter02Icon } from '../../icons-v2-generated';
4
+ import { Button } from '../../ui';
5
+
6
+ /**
7
+ * The "Device Tags" filter trigger: labelled from md, icon-only below it.
8
+ *
9
+ * Breakpoint decided in CSS, and that is the point. Both call sites used to branch
10
+ * on a `useMdUp()` value threaded down as a prop, and that hook answers `undefined`
11
+ * until an effect has run, so `isMdUp ? labelled : iconOnly` took the icon-only
12
+ * arm on the FIRST render at every width, server included. On desktop the button
13
+ * appeared as a bare square and grew its label a frame later, which also nudged the
14
+ * search input beside it.
15
+ *
16
+ * Two buttons rather than one with a hidden label: `size="icon"` is not just "no
17
+ * text", it is a square box (`w-11 content-md:w-12`), uniform padding and a smaller glyph
18
+ * below md. Reproducing that on a `size="default"` button would mean four
19
+ * `max-md:` overrides fighting the lib's cva variants; letting each variant render
20
+ * itself and hiding one in CSS keeps both exactly as the design system defines them.
21
+ * Only one is ever visible, and neither is interactive while hidden (`display: none`
22
+ * removes it from the tab order).
23
+ */
24
+ export function DeviceTagsFilterButton({ onClick }: { onClick: () => void }) {
25
+ return (
26
+ <>
27
+ <Button
28
+ variant="outline"
29
+ onClick={onClick}
30
+ leftIcon={<Filter02Icon className="text-ods-text-secondary" />}
31
+ className="hidden shrink-0 content-md:inline-flex"
32
+ >
33
+ Device Tags
34
+ </Button>
35
+ <Button
36
+ variant="outline"
37
+ size="icon"
38
+ aria-label="Device Tags"
39
+ onClick={onClick}
40
+ // Primary, not secondary: below md the funnel IS the button, there is no
41
+ // label beside it to carry the meaning, so it reads as the control itself
42
+ // rather than as decoration next to one. Same as every other mobile filter
43
+ // trigger in the app.
44
+ leftIcon={<Filter02Icon className="text-ods-text-primary" />}
45
+ className="shrink-0 content-md:hidden"
46
+ />
47
+ </>
48
+ );
49
+ }
@@ -0,0 +1,29 @@
1
+ import type React from 'react';
2
+ import { HardDrivesIcon, LaptopIcon, MobilePhoneIcon, MonitorIcon, TabletIcon } from '../../icons-v2-generated';
3
+
4
+ const DEFAULT_CLASS_NAME = 'w-6 h-6 text-ods-text-secondary';
5
+
6
+ /**
7
+ * Returns the icon for a device type (desktop / laptop / server / mobile / tablet),
8
+ * using the current icons-v2 set. Replaces the deprecated `getDeviceTypeIcon` from
9
+ * the core library.
10
+ *
11
+ * Returns `undefined` for unknown / missing types so the caller can skip rendering.
12
+ * A row that names a device draws it through `DeviceTypeTile`.
13
+ */
14
+ export function renderDeviceTypeIcon(type?: string, className: string = DEFAULT_CLASS_NAME): React.ReactNode {
15
+ switch (type?.toLowerCase()) {
16
+ case 'desktop':
17
+ return <MonitorIcon className={className} />;
18
+ case 'laptop':
19
+ return <LaptopIcon className={className} />;
20
+ case 'server':
21
+ return <HardDrivesIcon className={className} />;
22
+ case 'mobile':
23
+ return <MobilePhoneIcon className={className} />;
24
+ case 'tablet':
25
+ return <TabletIcon className={className} />;
26
+ default:
27
+ return undefined;
28
+ }
29
+ }
@@ -0,0 +1,17 @@
1
+ import { MonitorIcon } from '../../icons-v2-generated';
2
+ import { renderDeviceTypeIcon } from './device-type-icon';
3
+
4
+ const ICON_CLASS = 'size-4 text-ods-text-secondary';
5
+
6
+ /**
7
+ * A device's type icon in its 32px tile, the leading mark of every row that
8
+ * names a device. Card-filled, so it keeps its edge on any row ground; an
9
+ * unknown type draws the monitor rather than an empty tile.
10
+ */
11
+ export function DeviceTypeTile({ type }: { type: string | null | undefined }) {
12
+ return (
13
+ <span className="flex size-8 shrink-0 items-center justify-center rounded-[6px] border border-ods-border bg-ods-card">
14
+ {renderDeviceTypeIcon(type ?? undefined, ICON_CLASS) ?? <MonitorIcon className={ICON_CLASS} />}
15
+ </span>
16
+ );
17
+ }
@@ -0,0 +1,114 @@
1
+ 'use client';
2
+
3
+ import type { ComponentProps, Ref } from 'react';
4
+ import { cn } from '../../../utils/cn';
5
+ import { FilterModal, TagSearchInput, type TagSearchOption } from '../../ui';
6
+ import { DeviceTagsFilterButton } from './device-tags-filter-button';
7
+
8
+ type FilterModalProps = ComponentProps<typeof FilterModal>;
9
+
10
+ export interface DevicesFilterToolbarProps {
11
+ /** Search input, current value (debounce/URL sync owned by the parent). */
12
+ searchValue: string;
13
+ onSearchChange: (value: string) => void;
14
+ /** Already-selected tag chips rendered inside the search input. */
15
+ tags: TagSearchOption<string>[];
16
+ onTagRemove: (value: string) => void;
17
+ onClearAll: () => void;
18
+ onSubmit: (value: string) => void;
19
+
20
+ /** Open the Device Tags modal. */
21
+ onOpenFilterModal: () => void;
22
+
23
+ /** FilterModal state, proxied straight through. */
24
+ isFilterModalOpen: boolean;
25
+ onCloseFilterModal: () => void;
26
+ filterGroups: FilterModalProps['filterGroups'];
27
+ onFilterChange: FilterModalProps['onFilterChange'];
28
+ currentFilters?: FilterModalProps['currentFilters'];
29
+ tagFilterKeys: FilterModalProps['tagFilterKeys'];
30
+ selectedTags: FilterModalProps['selectedTags'];
31
+ onTagsChange: FilterModalProps['onTagsChange'];
32
+ isLoading?: boolean;
33
+
34
+ /**
35
+ * When true (default), pins the toolbar at the top with the same negative-margin
36
+ * bleed used by `DevicesPanel` (so the search row's background covers the
37
+ * `PageLayout` padding). Pass `false` when mounting inside a container that
38
+ * shouldn't bleed (e.g. a modal).
39
+ */
40
+ sticky?: boolean;
41
+
42
+ /**
43
+ * Attach to the pinned row so a caller can measure it, its height is what the
44
+ * sticky table header parks below, and it CHANGES as the tag-chip row appears
45
+ * and collapses. See `useStickyToolbar`.
46
+ */
47
+ toolbarRef?: Ref<HTMLDivElement>;
48
+ }
49
+
50
+ /**
51
+ * Search bar + "Device Tags" button + FilterModal. Pure presentation ,
52
+ * all state (search value, modal open/close, filter options) is owned by
53
+ * the parent. Reused by `DevicesPanel` and (eventually) `DeviceSelector`.
54
+ */
55
+ export function DevicesFilterToolbar({
56
+ searchValue,
57
+ onSearchChange,
58
+ tags,
59
+ onTagRemove,
60
+ onClearAll,
61
+ onSubmit,
62
+ onOpenFilterModal,
63
+ isFilterModalOpen,
64
+ onCloseFilterModal,
65
+ filterGroups,
66
+ onFilterChange,
67
+ currentFilters,
68
+ tagFilterKeys,
69
+ selectedTags,
70
+ onTagsChange,
71
+ isLoading,
72
+ sticky = true,
73
+ toolbarRef,
74
+ }: DevicesFilterToolbarProps) {
75
+ return (
76
+ <>
77
+ <div
78
+ ref={toolbarRef}
79
+ className={cn(
80
+ 'flex items-center gap-[var(--spacing-system-m)]',
81
+ sticky &&
82
+ 'sticky top-0 z-20 -mx-[var(--spacing-system-l)] -mt-[var(--spacing-system-l)] bg-ods-bg p-[var(--spacing-system-l)]',
83
+ )}
84
+ >
85
+ <div className="min-w-0 flex-1">
86
+ <TagSearchInput
87
+ tags={tags}
88
+ searchValue={searchValue}
89
+ onSearchChange={onSearchChange}
90
+ onTagRemove={onTagRemove}
91
+ onClearAll={onClearAll}
92
+ onSubmit={onSubmit}
93
+ placeholder="Search for Devices"
94
+ addMorePlaceholder="Add More..."
95
+ />
96
+ </div>
97
+ <DeviceTagsFilterButton onClick={onOpenFilterModal} />
98
+ </div>
99
+
100
+ <FilterModal
101
+ isOpen={isFilterModalOpen}
102
+ onClose={onCloseFilterModal}
103
+ filterGroups={filterGroups}
104
+ onFilterChange={onFilterChange}
105
+ currentFilters={currentFilters}
106
+ tagFilterKeys={tagFilterKeys}
107
+ selectedTags={selectedTags}
108
+ onTagsChange={onTagsChange}
109
+ isLoading={isLoading}
110
+ className="max-w-[600px]"
111
+ />
112
+ </>
113
+ );
114
+ }