@flamingo-stack/openframe-frontend-core 0.0.711 → 0.0.712
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-2NASBO7O.js +1137 -0
- package/dist/{chunk-RQRX4YC3.cjs → chunk-2RKFMUNW.cjs} +46 -46
- package/dist/chunk-2Y7QZAB2.cjs +158 -0
- package/dist/chunk-34I6XI3N.js +136 -0
- package/dist/chunk-3K5ZLZE7.js +292 -0
- package/dist/chunk-3LU4UFPS.cjs +14 -0
- package/dist/{chunk-3UNL26CD.cjs → chunk-3RKBJT6K.cjs} +8 -6
- package/dist/{chunk-6GLQLTJI.js → chunk-3SEEGNRE.js} +35 -27
- package/dist/{chunk-FEMAJES4.cjs → chunk-3UAJLO5U.cjs} +41 -39
- package/dist/chunk-4HJRHEXD.cjs +1612 -0
- package/dist/{chunk-JPG7OHEG.js → chunk-4QFWGLZO.js} +1 -1
- package/dist/chunk-4R2L3DSA.js +14 -0
- package/dist/{chunk-2JTGK64G.js → chunk-4UYKNOZG.js} +12 -10
- package/dist/{chunk-TKZXHVBG.js → chunk-5SDELRH3.js} +5 -5
- package/dist/{chunk-Q6B35Y7O.js → chunk-5Y72YQEK.js} +22 -113
- package/dist/{chunk-KUC673HM.js → chunk-6T3BTD6Q.js} +204 -982
- package/dist/{chunk-F57ECE2I.js → chunk-6YPTUHM7.js} +4 -4
- package/dist/{chunk-WJUIXU6Y.js → chunk-7HNYYNKE.js} +28 -22
- package/dist/{chunk-P6G3JZNC.cjs → chunk-7NSU5EQD.cjs} +57 -148
- package/dist/chunk-AAYNCJMW.cjs +48 -0
- package/dist/{chunk-FXJ3WWUB.js → chunk-ADBE7QF3.js} +5 -252
- package/dist/chunk-AECTRMGQ.cjs +334 -0
- package/dist/chunk-AGVXKD4K.js +334 -0
- package/dist/chunk-AL2GUHAJ.cjs +18 -0
- package/dist/{chunk-WMX26HB5.js → chunk-APJZBDQN.js} +12 -12
- package/dist/chunk-AUMKE74M.cjs +16 -0
- package/dist/chunk-B4NCVYEQ.cjs +292 -0
- package/dist/{chunk-XWEBHS7O.cjs → chunk-BXSRTBLU.cjs} +82 -54
- package/dist/chunk-CMGFZHCN.js +233 -0
- package/dist/chunk-CMZ3QTFQ.js +1207 -0
- package/dist/chunk-CPA2CKRZ.cjs +125 -0
- package/dist/{chunk-G47AP6LX.cjs → chunk-CSCJU6YC.cjs} +35 -33
- package/dist/chunk-CYUUHFXL.js +41 -0
- package/dist/chunk-DC4RTYWK.cjs +1122 -0
- package/dist/{chunk-NF7GNGYG.js → chunk-DDWFCWOE.js} +5 -7
- package/dist/{chunk-K4PTDK34.js → chunk-EFNKS5W4.js} +322 -428
- package/dist/{chunk-QA6TROME.cjs → chunk-EOKSKJSS.cjs} +25 -83
- package/dist/{chunk-6NTPY5QA.cjs → chunk-ETYLOZOB.cjs} +978 -2413
- package/dist/chunk-F5BPGWGT.cjs +931 -0
- package/dist/{chunk-5HB7FLCV.js → chunk-FCAVAEHF.js} +8277 -9990
- package/dist/chunk-FFT56TYB.cjs +401 -0
- package/dist/chunk-FYEJTF5Y.js +125 -0
- package/dist/chunk-G3GRYDMS.js +16 -0
- package/dist/{chunk-VWFZRMQR.js → chunk-G3OMVCID.js} +13 -7
- package/dist/chunk-G6OHIX5C.cjs +100 -0
- package/dist/{chunk-UDFRUKLC.cjs → chunk-GEDY7HQI.cjs} +2 -2
- package/dist/chunk-GQ7JJUIT.cjs +1207 -0
- package/dist/chunk-H3PKYE4N.js +18 -0
- package/dist/{chunk-AGDVEUVL.js → chunk-H5R7U2D2.js} +206 -5
- package/dist/{chunk-7AM6C6XH.cjs → chunk-HETQETPV.cjs} +9641 -9678
- package/dist/{chunk-Y2GSOUCS.cjs → chunk-HWVUR735.cjs} +2 -2
- package/dist/chunk-II4QMH26.cjs +35 -0
- package/dist/chunk-ILNN6QRW.js +1612 -0
- package/dist/chunk-IYVFSLWJ.js +931 -0
- package/dist/{chunk-C4HRRB3V.cjs → chunk-JGCFRTND.cjs} +23 -17
- package/dist/chunk-JHQ334WS.js +655 -0
- package/dist/{chunk-WCVZCGK5.cjs → chunk-JO5TLJPM.cjs} +129 -907
- package/dist/{chunk-PRX7HVLE.cjs → chunk-JVCAK4W3.cjs} +210 -9
- package/dist/chunk-KBJJQFYU.js +1122 -0
- package/dist/chunk-KEKCQENI.js +48 -0
- package/dist/chunk-KHXZFLIN.cjs +41 -0
- package/dist/chunk-KT3U3ZRP.cjs +1137 -0
- package/dist/chunk-L2VUINHN.js +35 -0
- package/dist/{chunk-FYOKS5RI.cjs → chunk-L6ZQGWCX.cjs} +4521 -6234
- package/dist/{chunk-PLYEKV3N.cjs → chunk-MA4Q5RBP.cjs} +6 -6
- package/dist/{chunk-VMMHJFHG.js → chunk-N67XG5GY.js} +10 -8
- package/dist/chunk-NPAQSMRY.js +2087 -0
- package/dist/{chunk-IFWLJ66M.js → chunk-NQWJAOHO.js} +6 -4
- package/dist/{chunk-6K7QZDA6.cjs → chunk-OBZJICEA.cjs} +8 -8
- package/dist/{chunk-62KNLDXK.js → chunk-OPYODNV2.js} +3 -3
- package/dist/chunk-P3JMAMHP.js +401 -0
- package/dist/chunk-PPXR22YC.cjs +2087 -0
- package/dist/chunk-PSVSEN4J.cjs +655 -0
- package/dist/{chunk-EQWD4IJE.js → chunk-RBYVFPER.js} +74 -46
- package/dist/{chunk-SMAAV3HL.js → chunk-ROBQ5TR7.js} +10541 -10578
- package/dist/{chunk-K6Y5NX6L.cjs → chunk-T3CLXR43.cjs} +114 -220
- package/dist/{chunk-FI6GMDO7.js → chunk-TTVOLEUS.js} +3605 -5040
- package/dist/{chunk-LM7TXMLU.cjs → chunk-ULWVKHSI.cjs} +8 -255
- package/dist/{chunk-EX6GGCAC.cjs → chunk-UT3ODMBU.cjs} +15 -15
- package/dist/chunk-WANCBTUE.js +71 -0
- package/dist/{chunk-BIZNSF3U.cjs → chunk-WBNAEYTQ.cjs} +2 -51
- package/dist/chunk-WFPCCBOM.cjs +71 -0
- package/dist/chunk-WI6FHKD7.js +158 -0
- package/dist/chunk-WMNCVLES.js +100 -0
- package/dist/{chunk-UT4YHQZW.js → chunk-WSDT7LYL.js} +0 -49
- package/dist/chunk-WVOTC7HW.cjs +136 -0
- package/dist/{chunk-6AMIRXKM.cjs → chunk-WWJG4GVG.cjs} +93 -87
- package/dist/chunk-XXBLN4BP.cjs +233 -0
- package/dist/{chunk-4IBPRIQH.js → chunk-YBQQNDC7.js} +1 -1
- package/dist/{chunk-QGZPZ3RL.js → chunk-YBS5QGON.js} +70 -128
- package/dist/{chunk-CDM7OSFB.cjs → chunk-Z5SWJW5Q.cjs} +125 -117
- package/dist/{chunk-YD4LJZV4.cjs → chunk-ZX7SCPLO.cjs} +6 -8
- package/dist/cloud-tenants-KZUZGD4A.cjs +117 -0
- package/dist/cloud-tenants-OGLVVQ7X.js +117 -0
- package/dist/components/case-studies/index.cjs +45 -29
- package/dist/components/case-studies/index.js +32 -16
- package/dist/components/chat/ask-prompts.d.ts +64 -0
- package/dist/components/chat/ask-prompts.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/case-study-card.d.ts +6 -3
- package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +27 -8
- package/dist/components/chat/index.d.ts +1 -0
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +57 -38
- package/dist/components/chat/quick-action-chip.d.ts +7 -3
- package/dist/components/chat/quick-action-chip.d.ts.map +1 -1
- package/dist/components/contact/index.cjs +29 -13
- package/dist/components/contact/index.js +28 -12
- package/dist/components/docs/index.cjs +33 -16
- package/dist/components/docs/index.js +33 -16
- package/dist/components/docs/use-scroll-spy.d.ts +23 -1
- package/dist/components/docs/use-scroll-spy.d.ts.map +1 -1
- package/dist/components/embeds/index.cjs +29 -13
- package/dist/components/embeds/index.js +28 -12
- package/dist/components/faq/faq-section.d.ts +8 -1
- package/dist/components/faq/faq-section.d.ts.map +1 -1
- package/dist/components/faq/index.cjs +30 -14
- package/dist/components/faq/index.js +29 -13
- package/dist/components/features/array-entry-manager.d.ts +5 -1
- package/dist/components/features/array-entry-manager.d.ts.map +1 -1
- package/dist/components/features/board/board.d.ts +2 -0
- package/dist/components/features/board/board.d.ts.map +1 -1
- package/dist/components/features/board/ticket-card.d.ts.map +1 -1
- package/dist/components/features/board/touch-board.d.ts +1 -1
- package/dist/components/features/board/touch-board.d.ts.map +1 -1
- package/dist/components/features/board/types.d.ts +3 -0
- package/dist/components/features/board/types.d.ts.map +1 -1
- package/dist/components/features/board/use-board-collapse.d.ts +6 -1
- package/dist/components/features/board/use-board-collapse.d.ts.map +1 -1
- package/dist/components/features/capability-explorer.d.ts +94 -0
- package/dist/components/features/capability-explorer.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/index.d.ts +14 -0
- package/dist/components/features/cloud-tenants/index.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts +9 -0
- package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenant-cell.d.ts +8 -0
- package/dist/components/features/cloud-tenants/tenant-cell.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts +9 -0
- package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenant-presentation.d.ts +42 -0
- package/dist/components/features/cloud-tenants/tenant-presentation.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenant-row.d.ts +22 -0
- package/dist/components/features/cloud-tenants/tenant-row.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts +42 -0
- package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts.map +1 -0
- package/dist/components/features/cloud-tenants/tenants-table-view.d.ts +26 -0
- package/dist/components/features/cloud-tenants/tenants-table-view.d.ts.map +1 -0
- package/dist/components/features/devices/device-last-online.d.ts +3 -0
- package/dist/components/features/devices/device-last-online.d.ts.map +1 -0
- package/dist/components/features/devices/device-name.d.ts +42 -0
- package/dist/components/features/devices/device-name.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts +26 -0
- package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts +25 -0
- package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/device-selector.d.ts +38 -0
- package/dist/components/features/devices/device-selector/device-selector.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/device-selector.types.d.ts +133 -0
- package/dist/components/features/devices/device-selector/device-selector.types.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/narrowing.d.ts +13 -0
- package/dist/components/features/devices/device-selector/narrowing.d.ts.map +1 -0
- package/dist/components/features/devices/device-selector/use-device-selector.d.ts +17 -0
- package/dist/components/features/devices/device-selector/use-device-selector.d.ts.map +1 -0
- package/dist/components/features/devices/device-status.d.ts +23 -0
- package/dist/components/features/devices/device-status.d.ts.map +1 -0
- package/dist/components/features/devices/device-statuses.d.ts +40 -0
- package/dist/components/features/devices/device-statuses.d.ts.map +1 -0
- package/dist/components/features/devices/device-tags-filter-button.d.ts +22 -0
- package/dist/components/features/devices/device-tags-filter-button.d.ts.map +1 -0
- package/dist/components/features/devices/device-type-icon.d.ts +11 -0
- package/dist/components/features/devices/device-type-icon.d.ts.map +1 -0
- package/dist/components/features/devices/device-type-tile.d.ts +9 -0
- package/dist/components/features/devices/device-type-tile.d.ts.map +1 -0
- package/dist/components/features/devices/devices-filter-toolbar.d.ts +46 -0
- package/dist/components/features/devices/devices-filter-toolbar.d.ts.map +1 -0
- package/dist/components/features/devices/devices-grid-filters.d.ts +25 -0
- package/dist/components/features/devices/devices-grid-filters.d.ts.map +1 -0
- package/dist/components/features/devices/devices-grid.d.ts +12 -0
- package/dist/components/features/devices/devices-grid.d.ts.map +1 -0
- package/dist/components/features/devices/devices-list.d.ts +131 -0
- package/dist/components/features/devices/devices-list.d.ts.map +1 -0
- package/dist/components/features/devices/devices-panel-header.d.ts +46 -0
- package/dist/components/features/devices/devices-panel-header.d.ts.map +1 -0
- package/dist/components/features/devices/devices-panel-view.d.ts +79 -0
- package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -0
- package/dist/components/features/devices/devices-table-columns.d.ts +76 -0
- package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -0
- package/dist/components/features/devices/devices-view-config.d.ts +25 -0
- package/dist/components/features/devices/devices-view-config.d.ts.map +1 -0
- package/dist/components/features/devices/index.d.ts +24 -0
- package/dist/components/features/devices/index.d.ts.map +1 -0
- package/dist/components/features/devices/types.d.ts +68 -0
- package/dist/components/features/devices/types.d.ts.map +1 -0
- package/dist/components/features/devices/use-tag-filter-modal.d.ts +50 -0
- package/dist/components/features/devices/use-tag-filter-modal.d.ts.map +1 -0
- package/dist/components/features/index.cjs +227 -12
- package/dist/components/features/index.d.ts +7 -0
- package/dist/components/features/index.d.ts.map +1 -1
- package/dist/components/features/index.js +266 -51
- package/dist/components/features/knowledge-base/index.d.ts +7 -0
- package/dist/components/features/knowledge-base/index.d.ts.map +1 -0
- package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts +44 -0
- package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts.map +1 -0
- package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts +13 -0
- package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts.map +1 -0
- package/dist/components/features/knowledge-base/knowledge-base-status.d.ts +8 -0
- package/dist/components/features/knowledge-base/knowledge-base-status.d.ts.map +1 -0
- package/dist/components/features/knowledge-base/knowledge-base-table.d.ts +52 -0
- package/dist/components/features/knowledge-base/knowledge-base-table.d.ts.map +1 -0
- package/dist/components/features/logs/index.d.ts +12 -0
- package/dist/components/features/logs/index.d.ts.map +1 -0
- package/dist/components/features/logs/log-drawer.d.ts +29 -0
- package/dist/components/features/logs/log-drawer.d.ts.map +1 -0
- package/dist/components/features/logs/log-source-labels.d.ts +11 -0
- package/dist/components/features/logs/log-source-labels.d.ts.map +1 -0
- package/dist/components/features/logs/logs-page-view.d.ts +32 -0
- package/dist/components/features/logs/logs-page-view.d.ts.map +1 -0
- package/dist/components/features/logs/logs-table-columns.d.ts +15 -0
- package/dist/components/features/logs/logs-table-columns.d.ts.map +1 -0
- package/dist/components/features/logs/logs-table-view.d.ts +64 -0
- package/dist/components/features/logs/logs-table-view.d.ts.map +1 -0
- package/dist/components/features/logs/types.d.ts +52 -0
- package/dist/components/features/logs/types.d.ts.map +1 -0
- package/dist/components/features/policies/compute-policy-summary.d.ts +37 -0
- package/dist/components/features/policies/compute-policy-summary.d.ts.map +1 -0
- package/dist/components/features/policies/index.d.ts +8 -0
- package/dist/components/features/policies/index.d.ts.map +1 -0
- package/dist/components/features/policies/policies-table.d.ts +34 -0
- package/dist/components/features/policies/policies-table.d.ts.map +1 -0
- package/dist/components/features/policies/policy-summary-cards.d.ts +17 -0
- package/dist/components/features/policies/policy-summary-cards.d.ts.map +1 -0
- package/dist/components/features/policies/policy-table-row.d.ts +37 -0
- package/dist/components/features/policies/policy-table-row.d.ts.map +1 -0
- package/dist/components/features/remote-session/index.d.ts +8 -0
- package/dist/components/features/remote-session/index.d.ts.map +1 -1
- package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts +21 -0
- package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts.map +1 -0
- package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts +31 -0
- package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts.map +1 -0
- package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts +21 -0
- package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts.map +1 -0
- package/dist/components/features/remote-session/remote-desktop-view.d.ts +50 -0
- package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -0
- package/dist/components/features/software/index.d.ts +8 -0
- package/dist/components/features/software/index.d.ts.map +1 -0
- package/dist/components/features/software/package-managers.d.ts +30 -0
- package/dist/components/features/software/package-managers.d.ts.map +1 -0
- package/dist/components/features/software/package-search-field-placeholder.d.ts +7 -0
- package/dist/components/features/software/package-search-field-placeholder.d.ts.map +1 -0
- package/dist/components/features/software/schedule-fields.d.ts +34 -0
- package/dist/components/features/software/schedule-fields.d.ts.map +1 -0
- package/dist/components/features/software/software-action-copy.d.ts +25 -0
- package/dist/components/features/software/software-action-copy.d.ts.map +1 -0
- package/dist/components/features/software/software-action-form.d.ts +71 -0
- package/dist/components/features/software/software-action-form.d.ts.map +1 -0
- package/dist/components/features/software/software-row-fields.d.ts +23 -0
- package/dist/components/features/software/software-row-fields.d.ts.map +1 -0
- package/dist/components/features/software/software-row.d.ts +18 -0
- package/dist/components/features/software/software-row.d.ts.map +1 -0
- package/dist/components/features/sortable-list/index.d.ts +1 -0
- package/dist/components/features/sortable-list/index.d.ts.map +1 -1
- package/dist/components/features/sortable-list/sortable-drag-handle.d.ts +21 -0
- package/dist/components/features/sortable-list/sortable-drag-handle.d.ts.map +1 -0
- package/dist/components/help-center-pages/index.cjs +133 -114
- package/dist/components/help-center-pages/index.js +58 -39
- package/dist/components/index.cjs +320 -82
- package/dist/components/index.js +451 -213
- package/dist/components/layout/page-heading.d.ts +12 -3
- package/dist/components/layout/page-heading.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/index.cjs +120 -98
- package/dist/components/meeting-scheduler/index.js +50 -28
- package/dist/components/navigation/index.cjs +36 -17
- package/dist/components/navigation/index.d.ts +3 -0
- package/dist/components/navigation/index.d.ts.map +1 -1
- package/dist/components/navigation/index.js +36 -17
- package/dist/components/navigation/mingo-ai-button.d.ts +23 -10
- package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
- package/dist/components/navigation/sticky-section-nav.d.ts +14 -1
- package/dist/components/navigation/sticky-section-nav.d.ts.map +1 -1
- package/dist/components/onboarding-guides/index.cjs +32 -16
- package/dist/components/onboarding-guides/index.js +31 -15
- package/dist/components/product-demo/cast.d.ts +58 -0
- package/dist/components/product-demo/cast.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/cloud-tenants.d.ts +10 -0
- package/dist/components/product-demo/fixtures/cloud-tenants.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/devices.d.ts +14 -0
- package/dist/components/product-demo/fixtures/devices.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/knowledge.d.ts +14 -0
- package/dist/components/product-demo/fixtures/knowledge.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/logs.d.ts +15 -0
- package/dist/components/product-demo/fixtures/logs.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/policies.d.ts +13 -0
- package/dist/components/product-demo/fixtures/policies.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/remote-session.d.ts +20 -0
- package/dist/components/product-demo/fixtures/remote-session.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/shared.d.ts +156 -0
- package/dist/components/product-demo/fixtures/shared.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/software-update.d.ts +19 -0
- package/dist/components/product-demo/fixtures/software-update.d.ts.map +1 -0
- package/dist/components/product-demo/fixtures/tickets-board.d.ts +8 -0
- package/dist/components/product-demo/fixtures/tickets-board.d.ts.map +1 -0
- package/dist/components/product-demo/index.cjs +112 -0
- package/dist/components/product-demo/index.d.ts +6 -0
- package/dist/components/product-demo/index.d.ts.map +1 -0
- package/dist/components/product-demo/index.js +112 -0
- package/dist/components/product-demo/product-screen.d.ts +22 -0
- package/dist/components/product-demo/product-screen.d.ts.map +1 -0
- package/dist/components/product-demo/registry.d.ts +13 -0
- package/dist/components/product-demo/registry.d.ts.map +1 -0
- package/dist/components/product-demo/screen-keys.cjs +25 -0
- package/dist/components/product-demo/screen-keys.d.ts +27 -0
- package/dist/components/product-demo/screen-keys.d.ts.map +1 -0
- package/dist/components/product-demo/screen-keys.js +20 -0
- package/dist/components/product-demo/screens/cloud-tenants.d.ts +8 -0
- package/dist/components/product-demo/screens/cloud-tenants.d.ts.map +1 -0
- package/dist/components/product-demo/screens/devices.d.ts +10 -0
- package/dist/components/product-demo/screens/devices.d.ts.map +1 -0
- package/dist/components/product-demo/screens/knowledge.d.ts +9 -0
- package/dist/components/product-demo/screens/knowledge.d.ts.map +1 -0
- package/dist/components/product-demo/screens/logs.d.ts +4 -0
- package/dist/components/product-demo/screens/logs.d.ts.map +1 -0
- package/dist/components/product-demo/screens/policies.d.ts +8 -0
- package/dist/components/product-demo/screens/policies.d.ts.map +1 -0
- package/dist/components/product-demo/screens/remote-desktop-picture.d.ts +11 -0
- package/dist/components/product-demo/screens/remote-desktop-picture.d.ts.map +1 -0
- package/dist/components/product-demo/screens/remote-session.d.ts +8 -0
- package/dist/components/product-demo/screens/remote-session.d.ts.map +1 -0
- package/dist/components/product-demo/screens/software-update.d.ts +12 -0
- package/dist/components/product-demo/screens/software-update.d.ts.map +1 -0
- package/dist/components/product-demo/screens/tickets-board.d.ts +4 -0
- package/dist/components/product-demo/screens/tickets-board.d.ts.map +1 -0
- package/dist/components/product-demo/types.d.ts +9 -0
- package/dist/components/product-demo/types.d.ts.map +1 -0
- package/dist/components/related-content/index.cjs +14 -8
- package/dist/components/related-content/index.js +13 -7
- package/dist/components/tickets/index.cjs +36 -20
- package/dist/components/tickets/index.js +35 -19
- package/dist/components/ui/file-manager/index.cjs +38 -34
- package/dist/components/ui/file-manager/index.js +8 -4
- package/dist/components/ui/index.cjs +57 -17
- package/dist/components/ui/index.d.ts +1 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +141 -101
- package/dist/components/ui/product-screen-frame.d.ts +45 -0
- package/dist/components/ui/product-screen-frame.d.ts.map +1 -0
- package/dist/components/ui/radio-group.d.ts +5 -0
- package/dist/components/ui/radio-group.d.ts.map +1 -1
- package/dist/components/ui/snap-carousel.d.ts +11 -1
- package/dist/components/ui/snap-carousel.d.ts.map +1 -1
- package/dist/components/ui/tag.d.ts +1 -1
- package/dist/components/ui/tag.d.ts.map +1 -1
- package/dist/devices-LBMG42K6.js +81 -0
- package/dist/devices-YGYJIXQY.cjs +81 -0
- package/dist/hooks/index.cjs +17 -8
- package/dist/hooks/index.js +32 -23
- package/dist/hooks/ui/index.d.ts +1 -0
- package/dist/hooks/ui/index.d.ts.map +1 -1
- package/dist/hooks/ui/use-header-height.d.ts +12 -0
- package/dist/hooks/ui/use-header-height.d.ts.map +1 -1
- package/dist/hooks/ui/use-sticky-toolbar.d.ts +29 -0
- package/dist/hooks/ui/use-sticky-toolbar.d.ts.map +1 -0
- package/dist/hooks/use-location-hash.d.ts +2 -2
- package/dist/hooks/use-location-hash.d.ts.map +1 -1
- package/dist/hooks/use-scroll-to-hash.d.ts +7 -0
- package/dist/hooks/use-scroll-to-hash.d.ts.map +1 -1
- package/dist/index.cjs +276 -25
- package/dist/index.js +729 -478
- package/dist/knowledge-H5BIWJVI.js +108 -0
- package/dist/knowledge-KTCVJIWN.cjs +108 -0
- package/dist/logs-DB5Z7M5Q.js +216 -0
- package/dist/logs-RVCC2UQW.cjs +216 -0
- package/dist/policies-EWUULFBR.js +121 -0
- package/dist/policies-HV4IQCBV.cjs +121 -0
- package/dist/remote-session-GSGZOFDX.js +196 -0
- package/dist/remote-session-R6VAFESR.cjs +196 -0
- package/dist/software-update-6PXKRKBT.js +179 -0
- package/dist/software-update-D4OVSWSG.cjs +179 -0
- package/dist/tickets-board-BHLPAVNJ.cjs +137 -0
- package/dist/tickets-board-PYDNELSK.js +137 -0
- package/dist/types/case-study.d.ts +15 -1
- package/dist/types/case-study.d.ts.map +1 -1
- package/dist/utils/date-utils.d.ts +5 -0
- package/dist/utils/date-utils.d.ts.map +1 -1
- package/dist/utils/index.cjs +45 -2
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +41 -3
- package/dist/utils/open-in-new-tab.d.ts +7 -0
- package/dist/utils/open-in-new-tab.d.ts.map +1 -0
- package/dist/utils/same-page-hash-nav.d.ts +31 -0
- package/dist/utils/same-page-hash-nav.d.ts.map +1 -1
- package/dist/utils/scroll-into-view.d.ts +14 -1
- package/dist/utils/scroll-into-view.d.ts.map +1 -1
- package/package.json +13 -1
- package/src/components/chat/ask-prompts.tsx +226 -0
- package/src/components/chat/embeddable-chat.tsx +36 -2
- package/src/components/chat/entity-cards/case-study-card.tsx +122 -46
- package/src/components/chat/index.ts +1 -0
- package/src/components/chat/quick-action-chip.tsx +33 -9
- package/src/components/docs/use-scroll-spy.ts +93 -18
- package/src/components/faq/faq-section.tsx +82 -43
- package/src/components/features/array-entry-manager.tsx +10 -1
- package/src/components/features/board/board.tsx +4 -1
- package/src/components/features/board/ticket-card.tsx +11 -1
- package/src/components/features/board/touch-board.tsx +2 -1
- package/src/components/features/board/types.ts +3 -0
- package/src/components/features/board/use-board-collapse.ts +7 -2
- package/src/components/features/capability-explorer.tsx +412 -0
- package/src/components/features/cloud-tenants/index.ts +28 -0
- package/src/components/features/cloud-tenants/tenant-access-cell.tsx +24 -0
- package/src/components/features/cloud-tenants/tenant-cell.tsx +26 -0
- package/src/components/features/cloud-tenants/tenant-customer-cell.tsx +27 -0
- package/src/components/features/cloud-tenants/tenant-presentation.ts +111 -0
- package/src/components/features/cloud-tenants/tenant-row.ts +21 -0
- package/src/components/features/cloud-tenants/tenants-table-columns.ts +30 -0
- package/src/components/features/cloud-tenants/tenants-table-view.tsx +142 -0
- package/src/components/features/devices/device-last-online.ts +6 -0
- package/src/components/features/devices/device-name.ts +51 -0
- package/src/components/features/devices/device-selector/device-selection-mode-radio.tsx +107 -0
- package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +32 -0
- package/src/components/features/devices/device-selector/device-selector.tsx +799 -0
- package/src/components/features/devices/device-selector/device-selector.types.ts +138 -0
- package/src/components/features/devices/device-selector/narrowing.ts +33 -0
- package/src/components/features/devices/device-selector/use-device-selector.ts +51 -0
- package/src/components/features/devices/device-status.ts +102 -0
- package/src/components/features/devices/device-statuses.ts +88 -0
- package/src/components/features/devices/device-tags-filter-button.tsx +49 -0
- package/src/components/features/devices/device-type-icon.tsx +29 -0
- package/src/components/features/devices/device-type-tile.tsx +17 -0
- package/src/components/features/devices/devices-filter-toolbar.tsx +114 -0
- package/src/components/features/devices/devices-grid-filters.tsx +99 -0
- package/src/components/features/devices/devices-grid.tsx +86 -0
- package/src/components/features/devices/devices-list.tsx +357 -0
- package/src/components/features/devices/devices-panel-header.tsx +97 -0
- package/src/components/features/devices/devices-panel-view.tsx +261 -0
- package/src/components/features/devices/devices-table-columns.tsx +356 -0
- package/src/components/features/devices/devices-view-config.tsx +38 -0
- package/src/components/features/devices/index.ts +89 -0
- package/src/components/features/devices/types.ts +74 -0
- package/src/components/features/devices/use-tag-filter-modal.ts +109 -0
- package/src/components/features/index.ts +9 -0
- package/src/components/features/knowledge-base/index.ts +19 -0
- package/src/components/features/knowledge-base/knowledge-base-article-view.tsx +134 -0
- package/src/components/features/knowledge-base/knowledge-base-item-icon.ts +14 -0
- package/src/components/features/knowledge-base/knowledge-base-status.ts +12 -0
- package/src/components/features/knowledge-base/knowledge-base-table.tsx +180 -0
- package/src/components/features/logs/index.ts +20 -0
- package/src/components/features/logs/log-drawer.tsx +138 -0
- package/src/components/features/logs/log-source-labels.ts +25 -0
- package/src/components/features/logs/logs-page-view.tsx +100 -0
- package/src/components/features/logs/logs-table-columns.ts +16 -0
- package/src/components/features/logs/logs-table-view.tsx +509 -0
- package/src/components/features/logs/types.ts +71 -0
- package/src/components/features/policies/compute-policy-summary.ts +115 -0
- package/src/components/features/policies/index.ts +14 -0
- package/src/components/features/policies/policies-table.tsx +235 -0
- package/src/components/features/policies/policy-summary-cards.tsx +69 -0
- package/src/components/features/policies/policy-table-row.ts +37 -0
- package/src/components/features/remote-session/index.ts +8 -0
- package/src/components/features/remote-session/remote-desktop-chat-message-row.tsx +56 -0
- package/src/components/features/remote-session/remote-desktop-chat-panel.tsx +102 -0
- package/src/components/features/remote-session/remote-desktop-fullscreen-toolbar.tsx +119 -0
- package/src/components/features/remote-session/remote-desktop-view.tsx +209 -0
- package/src/components/features/software/index.ts +39 -0
- package/src/components/features/software/package-managers.ts +54 -0
- package/src/components/features/software/package-search-field-placeholder.tsx +23 -0
- package/src/components/features/software/schedule-fields.tsx +105 -0
- package/src/components/features/software/software-action-copy.ts +70 -0
- package/src/components/features/software/software-action-form.tsx +199 -0
- package/src/components/features/software/software-row-fields.tsx +105 -0
- package/src/components/features/software/software-row.ts +22 -0
- package/src/components/features/sortable-list/index.ts +1 -0
- package/src/components/features/sortable-list/sortable-drag-handle.tsx +41 -0
- package/src/components/layout/page-heading.tsx +23 -6
- package/src/components/navigation/index.ts +5 -0
- package/src/components/navigation/mingo-ai-button.tsx +37 -13
- package/src/components/navigation/sticky-section-nav.tsx +99 -1
- package/src/components/product-demo/cast.tsx +78 -0
- package/src/components/product-demo/fixtures/cloud-tenants.ts +63 -0
- package/src/components/product-demo/fixtures/devices.ts +87 -0
- package/src/components/product-demo/fixtures/knowledge.ts +48 -0
- package/src/components/product-demo/fixtures/logs.ts +103 -0
- package/src/components/product-demo/fixtures/policies.ts +77 -0
- package/src/components/product-demo/fixtures/remote-session.ts +65 -0
- package/src/components/product-demo/fixtures/shared.ts +53 -0
- package/src/components/product-demo/fixtures/software-update.ts +63 -0
- package/src/components/product-demo/fixtures/tickets-board.ts +100 -0
- package/src/components/product-demo/index.ts +7 -0
- package/src/components/product-demo/product-screen.tsx +94 -0
- package/src/components/product-demo/registry.ts +20 -0
- package/src/components/product-demo/screen-keys.ts +31 -0
- package/src/components/product-demo/screens/cloud-tenants.tsx +23 -0
- package/src/components/product-demo/screens/devices.tsx +41 -0
- package/src/components/product-demo/screens/knowledge.tsx +27 -0
- package/src/components/product-demo/screens/logs.tsx +113 -0
- package/src/components/product-demo/screens/policies.tsx +29 -0
- package/src/components/product-demo/screens/remote-desktop-picture.tsx +118 -0
- package/src/components/product-demo/screens/remote-session.tsx +46 -0
- package/src/components/product-demo/screens/software-update.tsx +97 -0
- package/src/components/product-demo/screens/tickets-board.tsx +28 -0
- package/src/components/product-demo/types.ts +10 -0
- package/src/components/ui/index.ts +1 -0
- package/src/components/ui/product-screen-frame.tsx +136 -0
- package/src/components/ui/radio-group.tsx +16 -4
- package/src/components/ui/snap-carousel.tsx +26 -1
- package/src/components/ui/tag.tsx +5 -0
- package/src/hooks/ui/index.ts +1 -0
- package/src/hooks/ui/use-header-height.ts +51 -2
- package/src/hooks/ui/use-sticky-toolbar.ts +60 -0
- package/src/hooks/use-location-hash.ts +9 -5
- package/src/hooks/use-scroll-to-hash.ts +9 -1
- package/src/types/case-study.ts +21 -1
- package/src/utils/date-utils.ts +8 -1
- package/src/utils/index.ts +5 -0
- package/src/utils/open-in-new-tab.ts +12 -0
- package/src/utils/same-page-hash-nav.ts +57 -0
- package/src/utils/scroll-into-view.ts +21 -5
- package/dist/chunk-BM5MVGH3.cjs +0 -499
- package/dist/chunk-CUME3VTQ.js +0 -144
- package/dist/chunk-CZ7Y7UG4.js +0 -732
- package/dist/chunk-FLKJYMVB.js +0 -499
- package/dist/chunk-OF6GEI5A.cjs +0 -144
- 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
|
+
}
|
|
@@ -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
|
+
}
|