@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.
- 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-YBUT4AMG.cjs → chunk-3RKBJT6K.cjs} +8 -6
- package/dist/{chunk-LNW45N2C.js → chunk-3SEEGNRE.js} +35 -27
- package/dist/{chunk-L6Y6OOKG.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-36BCTE7D.js → chunk-4UYKNOZG.js} +12 -10
- package/dist/{chunk-DA5UDTLG.js → chunk-5SDELRH3.js} +5 -5
- package/dist/{chunk-CZSZSDD4.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-TDYIREDJ.js → chunk-7HNYYNKE.js} +28 -22
- package/dist/{chunk-2G7UYK35.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-2RNB5DTN.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-B73373AG.cjs → chunk-CSCJU6YC.cjs} +35 -33
- package/dist/chunk-CYUUHFXL.js +41 -0
- package/dist/chunk-DC4RTYWK.cjs +1122 -0
- package/dist/{chunk-6YKAT7NV.js → chunk-DDWFCWOE.js} +5 -7
- package/dist/{chunk-F5FF4DME.js → chunk-EFNKS5W4.js} +322 -428
- package/dist/{chunk-2KXTOP6G.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-4L6XCMOU.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-MR3A4MZV.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-CNWOMQQJ.js → chunk-H5R7U2D2.js} +206 -5
- package/dist/{chunk-SEXWHIMS.cjs → chunk-HETQETPV.cjs} +9648 -9680
- 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-3AHTOSXJ.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-JRU2CXLB.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-P42V6N34.cjs → chunk-L6ZQGWCX.cjs} +4521 -6234
- package/dist/{chunk-PLYEKV3N.cjs → chunk-MA4Q5RBP.cjs} +6 -6
- package/dist/{chunk-SS5MBHDP.js → chunk-N67XG5GY.js} +10 -8
- package/dist/chunk-NPAQSMRY.js +2087 -0
- package/dist/{chunk-I3ST4PLM.js → chunk-NQWJAOHO.js} +6 -4
- package/dist/{chunk-QAOFMK2A.cjs → chunk-OBZJICEA.cjs} +8 -8
- package/dist/{chunk-6IW7TWPV.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-4UM2ETLM.js → chunk-RBYVFPER.js} +74 -46
- package/dist/{chunk-PO33GZVY.js → chunk-ROBQ5TR7.js} +10549 -10581
- package/dist/{chunk-ZCLBYT2V.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-6I4ZAFO2.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-AOWDNSTM.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-LFFB6EMB.js → chunk-YBS5QGON.js} +70 -128
- package/dist/{chunk-NSGXARGJ.cjs → chunk-Z5SWJW5Q.cjs} +125 -117
- package/dist/{chunk-OJLR5MEO.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/hooks/use-chat-dialog-manager.d.ts +4 -1
- package/dist/components/chat/hooks/use-chat-dialog-manager.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-unified-chat.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/chat/types/component.types.d.ts +4 -0
- package/dist/components/chat/types/component.types.d.ts.map +1 -1
- package/dist/components/chat/types/unified-chat-state.types.d.ts +12 -0
- package/dist/components/chat/types/unified-chat-state.types.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 +38 -2
- package/src/components/chat/entity-cards/case-study-card.tsx +122 -46
- package/src/components/chat/hooks/use-chat-dialog-manager.ts +22 -4
- package/src/components/chat/hooks/use-unified-chat.ts +1 -0
- package/src/components/chat/index.ts +1 -0
- package/src/components/chat/quick-action-chip.tsx +33 -9
- package/src/components/chat/types/component.types.ts +4 -0
- package/src/components/chat/types/unified-chat-state.types.ts +13 -0
- 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,931 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
next_image_default
|
|
4
|
+
} from "./chunk-FBZMAPWO.js";
|
|
5
|
+
import {
|
|
6
|
+
useAuthedImageSrc,
|
|
7
|
+
useIsTruncated
|
|
8
|
+
} from "./chunk-ADBE7QF3.js";
|
|
9
|
+
import {
|
|
10
|
+
XmarkCircleIcon
|
|
11
|
+
} from "./chunk-NCPTID44.js";
|
|
12
|
+
import {
|
|
13
|
+
cn
|
|
14
|
+
} from "./chunk-7RXWKTAP.js";
|
|
15
|
+
|
|
16
|
+
// src/components/ui/floating-tooltip.tsx
|
|
17
|
+
import {
|
|
18
|
+
useFloating,
|
|
19
|
+
autoUpdate,
|
|
20
|
+
offset,
|
|
21
|
+
flip,
|
|
22
|
+
shift,
|
|
23
|
+
size,
|
|
24
|
+
useDismiss,
|
|
25
|
+
useRole,
|
|
26
|
+
useInteractions,
|
|
27
|
+
FloatingPortal,
|
|
28
|
+
useHover,
|
|
29
|
+
safePolygon,
|
|
30
|
+
arrow
|
|
31
|
+
} from "@floating-ui/react";
|
|
32
|
+
import { useMemo, useState } from "react";
|
|
33
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
34
|
+
function parseColoredText(text) {
|
|
35
|
+
if (typeof text !== "string") return text;
|
|
36
|
+
const parts = [];
|
|
37
|
+
let lastIndex = 0;
|
|
38
|
+
const colorRegex = /\[([A-Z]+)\](.*?)\[\/\1\]/g;
|
|
39
|
+
let match;
|
|
40
|
+
let keyIndex = 0;
|
|
41
|
+
while ((match = colorRegex.exec(text)) !== null) {
|
|
42
|
+
if (match.index > lastIndex) {
|
|
43
|
+
const beforeText = text.slice(lastIndex, match.index);
|
|
44
|
+
parts.push(/* @__PURE__ */ jsx("span", { children: beforeText }, `text-${keyIndex++}`));
|
|
45
|
+
}
|
|
46
|
+
const color = match[1].toLowerCase();
|
|
47
|
+
const coloredText = match[2];
|
|
48
|
+
const colorClass = color === "yellow" ? "text-ods-accent" : color === "green" ? "text-ods-success" : color === "red" ? "text-ods-error" : color === "blue" ? "text-ods-info" : color === "pink" ? "text-ods-accent" : color === "cyan" ? "text-ods-info" : "text-ods-accent";
|
|
49
|
+
parts.push(
|
|
50
|
+
/* @__PURE__ */ jsx("span", { className: cn("font-semibold", colorClass), children: coloredText }, `color-${keyIndex++}`)
|
|
51
|
+
);
|
|
52
|
+
lastIndex = match.index + match[0].length;
|
|
53
|
+
}
|
|
54
|
+
if (lastIndex < text.length) {
|
|
55
|
+
const remainingText = text.slice(lastIndex);
|
|
56
|
+
parts.push(/* @__PURE__ */ jsx("span", { children: remainingText }, `text-${keyIndex++}`));
|
|
57
|
+
}
|
|
58
|
+
return parts.length > 0 ? /* @__PURE__ */ jsx(Fragment, { children: parts }) : text;
|
|
59
|
+
}
|
|
60
|
+
function FloatingTooltip({
|
|
61
|
+
content,
|
|
62
|
+
children,
|
|
63
|
+
side = "right",
|
|
64
|
+
className,
|
|
65
|
+
delayDuration = 0,
|
|
66
|
+
disabled = false,
|
|
67
|
+
triggerClassName,
|
|
68
|
+
as: TriggerTag = "div"
|
|
69
|
+
}) {
|
|
70
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
71
|
+
const [arrowEl, setArrowEl] = useState(null);
|
|
72
|
+
const { refs, floatingStyles, context, placement, middlewareData } = useFloating({
|
|
73
|
+
open: isOpen,
|
|
74
|
+
onOpenChange: setIsOpen,
|
|
75
|
+
placement: side,
|
|
76
|
+
middleware: [
|
|
77
|
+
offset(12),
|
|
78
|
+
flip({
|
|
79
|
+
fallbackAxisSideDirection: "start",
|
|
80
|
+
crossAxis: false,
|
|
81
|
+
padding: 8
|
|
82
|
+
}),
|
|
83
|
+
shift({ padding: 8 }),
|
|
84
|
+
// Cap the tooltip to the space left in the viewport so tall content
|
|
85
|
+
// scrolls inside it instead of overflowing off-screen. Applied straight to
|
|
86
|
+
// the floating node's style (no React state → no autoUpdate re-render loop);
|
|
87
|
+
// the inner scroll wrapper below turns the cap into an actual scroll area.
|
|
88
|
+
size({
|
|
89
|
+
padding: 8,
|
|
90
|
+
apply({ availableHeight, elements }) {
|
|
91
|
+
const floatingEl = elements.floating;
|
|
92
|
+
floatingEl.style.maxHeight = `${Math.max(64, availableHeight)}px`;
|
|
93
|
+
}
|
|
94
|
+
}),
|
|
95
|
+
arrow({ element: arrowEl })
|
|
96
|
+
],
|
|
97
|
+
whileElementsMounted: autoUpdate
|
|
98
|
+
});
|
|
99
|
+
const hover = useHover(context, {
|
|
100
|
+
move: false,
|
|
101
|
+
enabled: !disabled,
|
|
102
|
+
delay: { open: delayDuration, close: 0 },
|
|
103
|
+
handleClose: safePolygon()
|
|
104
|
+
});
|
|
105
|
+
const dismiss = useDismiss(context);
|
|
106
|
+
const role = useRole(context, { role: "tooltip" });
|
|
107
|
+
const { getReferenceProps, getFloatingProps } = useInteractions([hover, dismiss, role]);
|
|
108
|
+
const { setReference, setFloating } = refs;
|
|
109
|
+
const parsedContent = useMemo(() => {
|
|
110
|
+
if (typeof content === "string") {
|
|
111
|
+
return parseColoredText(content);
|
|
112
|
+
}
|
|
113
|
+
return content;
|
|
114
|
+
}, [content]);
|
|
115
|
+
const { x: arrowX, y: arrowY } = middlewareData.arrow ?? {};
|
|
116
|
+
const staticSide = {
|
|
117
|
+
top: "bottom",
|
|
118
|
+
right: "left",
|
|
119
|
+
bottom: "top",
|
|
120
|
+
left: "right"
|
|
121
|
+
}[placement.split("-")[0]];
|
|
122
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
123
|
+
/* @__PURE__ */ jsx(TriggerTag, { ref: setReference, className: triggerClassName, ...getReferenceProps(), children }),
|
|
124
|
+
/* @__PURE__ */ jsx(FloatingPortal, { children: isOpen && /* @__PURE__ */ jsxs(
|
|
125
|
+
"div",
|
|
126
|
+
{
|
|
127
|
+
ref: setFloating,
|
|
128
|
+
style: {
|
|
129
|
+
...floatingStyles,
|
|
130
|
+
zIndex: 2147483647
|
|
131
|
+
},
|
|
132
|
+
...getFloatingProps(),
|
|
133
|
+
className: cn(
|
|
134
|
+
// ODS Design System tooltip styling. `flex flex-col` + `overflow-hidden`
|
|
135
|
+
// let the inner wrapper own the scroll while the rounded corners clip it.
|
|
136
|
+
"flex max-w-xs flex-col overflow-hidden rounded-md",
|
|
137
|
+
"border border-ods-border bg-ods-card",
|
|
138
|
+
// ODS shadows for proper elevation
|
|
139
|
+
"shadow-[var(--shadow-md)]",
|
|
140
|
+
className
|
|
141
|
+
),
|
|
142
|
+
children: [
|
|
143
|
+
/* @__PURE__ */ jsx("div", { className: "min-h-0 overflow-y-auto whitespace-pre-line px-3 py-2.5 text-ods-text-primary text-h6", children: parsedContent }),
|
|
144
|
+
/* @__PURE__ */ jsx(
|
|
145
|
+
"div",
|
|
146
|
+
{
|
|
147
|
+
ref: setArrowEl,
|
|
148
|
+
style: {
|
|
149
|
+
left: arrowX != null ? `${arrowX}px` : "",
|
|
150
|
+
top: arrowY != null ? `${arrowY}px` : "",
|
|
151
|
+
...staticSide && { [staticSide]: "-4px" }
|
|
152
|
+
},
|
|
153
|
+
className: cn("absolute h-2 w-2 rotate-45", "border-ods-border bg-ods-card", {
|
|
154
|
+
"border-b border-r": staticSide === "left",
|
|
155
|
+
"border-r border-t": staticSide === "bottom",
|
|
156
|
+
// `right` and `top` were separate keys spelling the same two
|
|
157
|
+
// classes in different order ('border-l border-b' vs
|
|
158
|
+
// 'border-b border-l'); sorting collapsed them into a duplicate
|
|
159
|
+
// key, which would have dropped the `right` branch entirely.
|
|
160
|
+
// Merged to keep the emitted CSS identical to before.
|
|
161
|
+
// NOTE: that both sides ever wanted the same border pair looks
|
|
162
|
+
// like a latent bug — worth a designer's eye. (2026-08-24)
|
|
163
|
+
"border-b border-l": staticSide === "right" || staticSide === "top"
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
)
|
|
167
|
+
]
|
|
168
|
+
}
|
|
169
|
+
) })
|
|
170
|
+
] });
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// src/components/ui/tag.tsx
|
|
174
|
+
import { cva } from "class-variance-authority";
|
|
175
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
176
|
+
var tagVariants = cva(["inline-flex items-center justify-center rounded-md", "transition-colors duration-150"], {
|
|
177
|
+
variants: {
|
|
178
|
+
// Chip scale. `default` is the classic 32px mono-uppercase tag; `large`
|
|
179
|
+
// is the Figma "Feature Item" chip (48px, h3 bold body label) used by
|
|
180
|
+
// chip groups acting as tabs (OpenFrame categories).
|
|
181
|
+
size: {
|
|
182
|
+
default: "h-8 gap-[var(--spacing-system-xs)] p-[var(--spacing-system-xsf)] text-h5",
|
|
183
|
+
large: "h-12 gap-[var(--spacing-system-xs)] p-[var(--spacing-system-s)] font-bold text-h3",
|
|
184
|
+
// A sentence, not a label: body type in the case it was written in (a
|
|
185
|
+
// question a visitor can ask), on the same chip surface. One line, always:
|
|
186
|
+
// a longer sentence clips and shows whole in the label's tooltip.
|
|
187
|
+
sentence: "h-9 gap-[var(--spacing-system-xs)] px-[var(--spacing-system-sf)] py-[var(--spacing-system-xsf)] text-h6"
|
|
188
|
+
},
|
|
189
|
+
variant: {
|
|
190
|
+
primary: ["bg-ods-accent text-ods-text-on-accent", "hover:bg-ods-accent-hover active:bg-ods-accent-active"],
|
|
191
|
+
outline: [
|
|
192
|
+
"border border-ods-border bg-ods-card text-ods-text-primary",
|
|
193
|
+
"hover:border-ods-border-hover hover:bg-ods-bg-hover",
|
|
194
|
+
"active:border-ods-border-active active:bg-ods-bg-active"
|
|
195
|
+
],
|
|
196
|
+
success: [
|
|
197
|
+
"bg-ods-success-secondary text-ods-success",
|
|
198
|
+
"hover:bg-ods-success-secondary-hover active:bg-ods-success-secondary-active"
|
|
199
|
+
],
|
|
200
|
+
warning: [
|
|
201
|
+
"bg-ods-warning-secondary text-ods-warning",
|
|
202
|
+
"hover:bg-ods-warning-secondary-hover active:bg-ods-warning-secondary-active"
|
|
203
|
+
],
|
|
204
|
+
error: [
|
|
205
|
+
"bg-ods-error-secondary text-ods-error",
|
|
206
|
+
"hover:bg-ods-error-secondary-hover active:bg-ods-error-secondary-active"
|
|
207
|
+
],
|
|
208
|
+
critical: ["bg-ods-error text-ods-error-secondary", "hover:bg-ods-error-hover active:bg-ods-error-active"],
|
|
209
|
+
grey: [
|
|
210
|
+
"bg-ods-bg-surface text-ods-text-secondary",
|
|
211
|
+
"hover:bg-ods-bg-surface-hover active:bg-ods-bg-surface-active"
|
|
212
|
+
],
|
|
213
|
+
// Active/selected chip state (Figma "Feature Item" active): pink
|
|
214
|
+
// border + pink-secondary fill. A dedicated variant (not appended
|
|
215
|
+
// utilities) so its own hover rules win — the outline variant's
|
|
216
|
+
// hover:bg/hover:border would otherwise repaint an active chip grey.
|
|
217
|
+
selected: [
|
|
218
|
+
"border border-ods-flamingo-pink bg-ods-flamingo-pink-secondary text-ods-text-primary",
|
|
219
|
+
"hover:border-ods-flamingo-pink hover:bg-ods-flamingo-pink-secondary-hover",
|
|
220
|
+
"active:bg-ods-flamingo-pink-secondary-active"
|
|
221
|
+
],
|
|
222
|
+
// Cyan twin of `selected` (Mingo's accent) — same active-chip skin in the
|
|
223
|
+
// cyan theme so agent chip groups can match their own accent.
|
|
224
|
+
selectedCyan: [
|
|
225
|
+
"border border-ods-flamingo-cyan bg-ods-flamingo-cyan-secondary text-ods-text-primary",
|
|
226
|
+
"hover:border-ods-flamingo-cyan hover:bg-ods-flamingo-cyan-secondary-hover",
|
|
227
|
+
"active:bg-ods-flamingo-cyan-secondary-active"
|
|
228
|
+
],
|
|
229
|
+
// Matches the EntityTagBadges / StatusBadge tag skin (ods-card + ods-border,
|
|
230
|
+
// mono uppercase) so the tag-editor chips render identically to the public
|
|
231
|
+
// tag badges. Used for FilterChipData variant 'tag' (see search-input).
|
|
232
|
+
badge: [
|
|
233
|
+
"border border-ods-border bg-ods-card font-mono uppercase tracking-wide text-ods-text-primary",
|
|
234
|
+
"transition-colors hover:border-ods-accent"
|
|
235
|
+
]
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
defaultVariants: {
|
|
239
|
+
variant: "primary",
|
|
240
|
+
size: "default"
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
var disabledTagClasses = [
|
|
244
|
+
"bg-ods-bg-surface text-ods-text-secondary",
|
|
245
|
+
"border-transparent",
|
|
246
|
+
"cursor-not-allowed",
|
|
247
|
+
"pointer-events-none"
|
|
248
|
+
];
|
|
249
|
+
function TagLabel({ label, labelClassName }) {
|
|
250
|
+
const isString = typeof label === "string";
|
|
251
|
+
const { ref, isTruncated } = useIsTruncated(isString ? label : null);
|
|
252
|
+
if (!isString) {
|
|
253
|
+
return /* @__PURE__ */ jsx2("span", { className: cn("truncate", labelClassName), children: label });
|
|
254
|
+
}
|
|
255
|
+
return /* @__PURE__ */ jsx2(
|
|
256
|
+
FloatingTooltip,
|
|
257
|
+
{
|
|
258
|
+
content: label,
|
|
259
|
+
side: "top",
|
|
260
|
+
disabled: !isTruncated,
|
|
261
|
+
as: "span",
|
|
262
|
+
triggerClassName: "min-w-0 max-w-full",
|
|
263
|
+
className: "max-w-xs whitespace-pre-line [overflow-wrap:anywhere]",
|
|
264
|
+
children: /* @__PURE__ */ jsx2("span", { ref, className: cn("block truncate", labelClassName), children: label })
|
|
265
|
+
}
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
function Tag({
|
|
269
|
+
label,
|
|
270
|
+
variant,
|
|
271
|
+
size: size2,
|
|
272
|
+
icon,
|
|
273
|
+
onClose,
|
|
274
|
+
className,
|
|
275
|
+
labelClassName,
|
|
276
|
+
disabled,
|
|
277
|
+
as: Comp = "div",
|
|
278
|
+
...props
|
|
279
|
+
}) {
|
|
280
|
+
return /* @__PURE__ */ jsxs2(
|
|
281
|
+
Comp,
|
|
282
|
+
{
|
|
283
|
+
className: cn(tagVariants({ variant, size: size2 }), disabled && disabledTagClasses, className),
|
|
284
|
+
"aria-disabled": disabled || void 0,
|
|
285
|
+
...props,
|
|
286
|
+
children: [
|
|
287
|
+
icon && /* @__PURE__ */ jsx2("span", { className: cn("flex shrink-0 items-center justify-center", size2 === "large" ? "size-6" : "size-5"), children: icon }),
|
|
288
|
+
/* @__PURE__ */ jsx2(TagLabel, { label, labelClassName }),
|
|
289
|
+
onClose && /* @__PURE__ */ jsx2(
|
|
290
|
+
"button",
|
|
291
|
+
{
|
|
292
|
+
type: "button",
|
|
293
|
+
disabled,
|
|
294
|
+
onClick: (e) => {
|
|
295
|
+
e.stopPropagation();
|
|
296
|
+
onClose();
|
|
297
|
+
},
|
|
298
|
+
className: cn(
|
|
299
|
+
"flex size-5 shrink-0 items-center justify-center rounded-full opacity-70 transition-opacity",
|
|
300
|
+
disabled ? "cursor-not-allowed" : "hover:opacity-100"
|
|
301
|
+
),
|
|
302
|
+
"aria-label": "Remove",
|
|
303
|
+
children: /* @__PURE__ */ jsx2(XmarkCircleIcon, { className: "size-4" })
|
|
304
|
+
}
|
|
305
|
+
)
|
|
306
|
+
]
|
|
307
|
+
}
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// src/utils/vendor-classification.ts
|
|
312
|
+
var VENDOR_CLASSIFICATIONS = [
|
|
313
|
+
"open_source",
|
|
314
|
+
"commercial",
|
|
315
|
+
"openframe_selected",
|
|
316
|
+
"openframe_shipped",
|
|
317
|
+
"openframe_connect"
|
|
318
|
+
];
|
|
319
|
+
var OPENFRAME_CLASSIFICATIONS = {
|
|
320
|
+
openframe_selected: {
|
|
321
|
+
word: "Selected",
|
|
322
|
+
label: "OpenFrame Selected",
|
|
323
|
+
description: "OpenFrame is a unified platform that integrates multiple open-source IT and security tools into a single dashboard for MSPs. This filter shows vendors selected by our team for their excellence, community support, and MSP-specific value."
|
|
324
|
+
},
|
|
325
|
+
openframe_shipped: {
|
|
326
|
+
word: "Shipped",
|
|
327
|
+
label: "OpenFrame Shipped",
|
|
328
|
+
description: "Tools and OpenFrame products that are in the released OpenFrame product today, not on the roadmap."
|
|
329
|
+
},
|
|
330
|
+
openframe_connect: {
|
|
331
|
+
word: "Connect",
|
|
332
|
+
label: "OpenFrame Connect",
|
|
333
|
+
description: "Services OpenFrame connects to and manages for every client, such as Microsoft 365 and Google Workspace, beside devices and tickets."
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
function isVendorClassification(value) {
|
|
337
|
+
return VENDOR_CLASSIFICATIONS.includes(value);
|
|
338
|
+
}
|
|
339
|
+
function isOpenFrameClassification(value) {
|
|
340
|
+
return !!value && Object.prototype.hasOwnProperty.call(OPENFRAME_CLASSIFICATIONS, value);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// src/utils/format.ts
|
|
344
|
+
function formatDate(date, options = {
|
|
345
|
+
year: "numeric",
|
|
346
|
+
month: "long",
|
|
347
|
+
day: "numeric"
|
|
348
|
+
}) {
|
|
349
|
+
const dateObj = typeof date === "string" ? new Date(date) : date;
|
|
350
|
+
if (isNaN(dateObj.getTime())) {
|
|
351
|
+
console.warn("Invalid date provided to formatDate:", date);
|
|
352
|
+
return "Invalid Date";
|
|
353
|
+
}
|
|
354
|
+
return formatDateWithTimezone(dateObj, options.timeZone ?? null, options);
|
|
355
|
+
}
|
|
356
|
+
function formatNumber(num) {
|
|
357
|
+
return num.toLocaleString();
|
|
358
|
+
}
|
|
359
|
+
function formatPrice(price, currency = "USD") {
|
|
360
|
+
return new Intl.NumberFormat("en-US", {
|
|
361
|
+
style: "currency",
|
|
362
|
+
currency
|
|
363
|
+
}).format(price);
|
|
364
|
+
}
|
|
365
|
+
function formatBytes(bytes, decimals = 2) {
|
|
366
|
+
if (bytes === 0) return "0 Bytes";
|
|
367
|
+
const k = 1024;
|
|
368
|
+
const dm = decimals < 0 ? 0 : decimals;
|
|
369
|
+
const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
|
370
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
371
|
+
return Number.parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
|
|
372
|
+
}
|
|
373
|
+
function formatBytesShort(bytes) {
|
|
374
|
+
if (bytes === 0) return "0 B";
|
|
375
|
+
const k = 1024;
|
|
376
|
+
const sizes = ["B", "KB", "MB", "GB", "TB"];
|
|
377
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
378
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
|
|
379
|
+
}
|
|
380
|
+
function formatFileSize(bytes) {
|
|
381
|
+
if (bytes === 0) return "0 B";
|
|
382
|
+
const k = 1024;
|
|
383
|
+
const sizes = ["B", "KB", "MB", "GB"];
|
|
384
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
385
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
|
|
386
|
+
}
|
|
387
|
+
function formatLargeNumber(num) {
|
|
388
|
+
if (num === 0) return "0";
|
|
389
|
+
const isNegative = num < 0;
|
|
390
|
+
const absNum = Math.abs(num);
|
|
391
|
+
let result;
|
|
392
|
+
if (absNum >= 1e9) {
|
|
393
|
+
result = `${Math.floor(absNum / 1e9)}B`;
|
|
394
|
+
} else if (absNum >= 1e6) {
|
|
395
|
+
result = `${Math.floor(absNum / 1e6)}M`;
|
|
396
|
+
} else if (absNum >= 1e3) {
|
|
397
|
+
result = `${Math.floor(absNum / 1e3)}K`;
|
|
398
|
+
} else {
|
|
399
|
+
result = Math.floor(absNum).toString();
|
|
400
|
+
}
|
|
401
|
+
return isNegative ? `-${result}` : result;
|
|
402
|
+
}
|
|
403
|
+
function formatAbbreviatedNumber(n) {
|
|
404
|
+
if (n >= 1e9) {
|
|
405
|
+
const value = n / 1e9;
|
|
406
|
+
return `${Number.isInteger(value) ? value.toFixed(0) : value.toFixed(1)}B`;
|
|
407
|
+
}
|
|
408
|
+
if (n >= 1e6) {
|
|
409
|
+
const value = n / 1e6;
|
|
410
|
+
return `${Number.isInteger(value) ? value.toFixed(0) : value.toFixed(1)}M`;
|
|
411
|
+
}
|
|
412
|
+
if (n >= 1e3) {
|
|
413
|
+
const value = n / 1e3;
|
|
414
|
+
return `${Number.isInteger(value) ? value.toFixed(0) : value.toFixed(1)}K`;
|
|
415
|
+
}
|
|
416
|
+
return n.toLocaleString();
|
|
417
|
+
}
|
|
418
|
+
function nameInitials(name, fallback = "E", options = {}) {
|
|
419
|
+
const { maxLetters = 2, pick: mode = "all" } = options;
|
|
420
|
+
const source = typeof name === "string" ? name.trim() : "";
|
|
421
|
+
const words = source.length > 0 ? source.split(/\s+/).filter(Boolean) : [];
|
|
422
|
+
const chosen = mode === "first-last" && words.length > 1 ? [words[0], words[words.length - 1]] : words.slice(0, maxLetters);
|
|
423
|
+
const letters = chosen.map((w) => w[0]).filter(Boolean).slice(0, maxLetters).join("");
|
|
424
|
+
return (letters || fallback).toUpperCase();
|
|
425
|
+
}
|
|
426
|
+
function personInitials(name) {
|
|
427
|
+
return nameInitials(name, "", { pick: "first-last" });
|
|
428
|
+
}
|
|
429
|
+
function personFirstName(name, fallback = null) {
|
|
430
|
+
const first = (typeof name === "string" ? name.trim() : "").split(/\s+/)[0];
|
|
431
|
+
return first || fallback;
|
|
432
|
+
}
|
|
433
|
+
function singleInitial(name) {
|
|
434
|
+
return nameInitials(name, "?", { maxLetters: 1 });
|
|
435
|
+
}
|
|
436
|
+
function formatDurationMMSS(seconds) {
|
|
437
|
+
if (!seconds) return "";
|
|
438
|
+
const hours = Math.floor(seconds / 3600);
|
|
439
|
+
const minutes = Math.floor(seconds % 3600 / 60);
|
|
440
|
+
const secs = Math.floor(seconds % 60);
|
|
441
|
+
if (hours > 0) {
|
|
442
|
+
return `${hours}:${minutes.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}`;
|
|
443
|
+
}
|
|
444
|
+
return `${minutes}:${secs.toString().padStart(2, "0")}`;
|
|
445
|
+
}
|
|
446
|
+
function formatDurationCompact(seconds) {
|
|
447
|
+
if (!seconds) return "";
|
|
448
|
+
const hours = Math.floor(seconds / 3600);
|
|
449
|
+
const minutes = Math.floor(seconds % 3600 / 60);
|
|
450
|
+
if (hours > 0) {
|
|
451
|
+
return minutes === 0 ? `${hours}h` : `${hours}h ${minutes}m`;
|
|
452
|
+
}
|
|
453
|
+
return `${minutes} min`;
|
|
454
|
+
}
|
|
455
|
+
var VIEWER_TIMEZONE = "viewer";
|
|
456
|
+
var ZONED_DATE_STYLES = {
|
|
457
|
+
/** Mar 19, 2026 */
|
|
458
|
+
medium: { year: "numeric", month: "short", day: "numeric" },
|
|
459
|
+
/** Thursday, March 19 */
|
|
460
|
+
weekday: { weekday: "long", day: "numeric", month: "long" },
|
|
461
|
+
/** March 19, 2026 */
|
|
462
|
+
long: { year: "numeric", month: "long", day: "numeric" },
|
|
463
|
+
/** 03/19/2026 */
|
|
464
|
+
numeric: { year: "numeric", month: "2-digit", day: "2-digit" },
|
|
465
|
+
/** March 2026 */
|
|
466
|
+
monthYear: { year: "numeric", month: "long" },
|
|
467
|
+
/** Mar 2026 */
|
|
468
|
+
monthYearShort: { year: "numeric", month: "short" },
|
|
469
|
+
/** 03/19/2026, 9:18 PM */
|
|
470
|
+
numericDateTime: {
|
|
471
|
+
year: "numeric",
|
|
472
|
+
month: "2-digit",
|
|
473
|
+
day: "2-digit",
|
|
474
|
+
hour: "numeric",
|
|
475
|
+
minute: "2-digit",
|
|
476
|
+
hour12: true
|
|
477
|
+
},
|
|
478
|
+
/** Mar 19, 2026, 9:18 PM */
|
|
479
|
+
mediumDateTime: { year: "numeric", month: "short", day: "numeric", hour: "numeric", minute: "2-digit" },
|
|
480
|
+
/** Thursday, March 19 at 9:18 PM EDT */
|
|
481
|
+
weekdayDateTimeZoned: {
|
|
482
|
+
weekday: "long",
|
|
483
|
+
month: "long",
|
|
484
|
+
day: "numeric",
|
|
485
|
+
hour: "numeric",
|
|
486
|
+
minute: "2-digit",
|
|
487
|
+
timeZoneName: "short"
|
|
488
|
+
},
|
|
489
|
+
/** Thu, Mar 19, 9:18 PM */
|
|
490
|
+
shortWeekdayDateTime: { weekday: "short", month: "short", day: "numeric", hour: "numeric", minute: "2-digit" },
|
|
491
|
+
/** 03/19/2026, 21:18 */
|
|
492
|
+
numericDateTime24h: {
|
|
493
|
+
year: "numeric",
|
|
494
|
+
month: "2-digit",
|
|
495
|
+
day: "2-digit",
|
|
496
|
+
hour: "2-digit",
|
|
497
|
+
minute: "2-digit",
|
|
498
|
+
hour12: false
|
|
499
|
+
},
|
|
500
|
+
/** 3/19/2026, 9:18:00 PM — the runtime's own default date-time shape */
|
|
501
|
+
localeDateTime: {
|
|
502
|
+
year: "numeric",
|
|
503
|
+
month: "numeric",
|
|
504
|
+
day: "numeric",
|
|
505
|
+
hour: "numeric",
|
|
506
|
+
minute: "2-digit",
|
|
507
|
+
second: "2-digit"
|
|
508
|
+
}
|
|
509
|
+
};
|
|
510
|
+
var FORMATTERS = /* @__PURE__ */ new Map();
|
|
511
|
+
function zonedFormatter(locale, fields, timeZone) {
|
|
512
|
+
const key = JSON.stringify([locale ?? null, timeZone ?? null, fields]);
|
|
513
|
+
let fmt = FORMATTERS.get(key);
|
|
514
|
+
if (!fmt) {
|
|
515
|
+
fmt = new Intl.DateTimeFormat(locale, { ...fields, timeZone });
|
|
516
|
+
FORMATTERS.set(key, fmt);
|
|
517
|
+
}
|
|
518
|
+
return fmt;
|
|
519
|
+
}
|
|
520
|
+
function formatterFor(timezone, fields, locale) {
|
|
521
|
+
const zone = timezone === VIEWER_TIMEZONE ? void 0 : timezone || "UTC";
|
|
522
|
+
try {
|
|
523
|
+
return zonedFormatter(locale, fields, zone);
|
|
524
|
+
} catch {
|
|
525
|
+
return zonedFormatter(locale, fields, "UTC");
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
function toValidDate(date) {
|
|
529
|
+
if (date === null || date === void 0 || date === "") return null;
|
|
530
|
+
const d = date instanceof Date ? date : new Date(date);
|
|
531
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
532
|
+
}
|
|
533
|
+
function formatDateWithTimezone(date, timezone, style = "medium", options) {
|
|
534
|
+
const dateObj = toValidDate(date);
|
|
535
|
+
if (!dateObj) return "";
|
|
536
|
+
const { timeZone: _ignored, ...fields } = typeof style === "string" ? ZONED_DATE_STYLES[style] : style;
|
|
537
|
+
return formatterFor(timezone, fields, options?.viewerLocale ? void 0 : "en-US").format(dateObj);
|
|
538
|
+
}
|
|
539
|
+
function formatDateTimeYmd(date, timezone, options) {
|
|
540
|
+
const dateObj = toValidDate(date);
|
|
541
|
+
if (!dateObj) return "";
|
|
542
|
+
const parts = formatterFor(
|
|
543
|
+
timezone,
|
|
544
|
+
{ year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", hourCycle: "h23" },
|
|
545
|
+
"en-US"
|
|
546
|
+
).formatToParts(dateObj);
|
|
547
|
+
const part = (type) => parts.find((p) => p.type === type)?.value ?? "";
|
|
548
|
+
return `${part("year")}/${part("month")}/${part("day")}${options?.separator ?? ", "}${part("hour")}:${part("minute")}`;
|
|
549
|
+
}
|
|
550
|
+
function formatTimeWithTimezone(date, timezone, options) {
|
|
551
|
+
return formatDateWithTimezone(
|
|
552
|
+
date,
|
|
553
|
+
timezone,
|
|
554
|
+
{
|
|
555
|
+
hour: "numeric",
|
|
556
|
+
minute: "2-digit",
|
|
557
|
+
// A viewer-locale clock uses the locale's own 12/24h convention.
|
|
558
|
+
...options?.viewerLocale ? {} : { hour12: true },
|
|
559
|
+
...options?.withZoneLabel ? { timeZoneName: "short" } : {}
|
|
560
|
+
},
|
|
561
|
+
{ viewerLocale: options?.viewerLocale }
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
function formatProgramDate(at, style = "medium") {
|
|
565
|
+
return formatDateWithTimezone(at.instant ?? at.utcDate, at.timezone, style);
|
|
566
|
+
}
|
|
567
|
+
function formatProgramDateRange(at, end) {
|
|
568
|
+
const start = toValidDate(at.instant ?? at.utcDate);
|
|
569
|
+
const ends = end ? toValidDate(end) : null;
|
|
570
|
+
if (!start || !ends || ends.getTime() <= start.getTime()) return null;
|
|
571
|
+
const finish = new Date(ends.getTime() - 1);
|
|
572
|
+
const formatter = formatterFor(at.timezone, { year: "numeric", month: "short", day: "numeric" }, "en-US");
|
|
573
|
+
const partsOf = (date) => {
|
|
574
|
+
const parts = formatter.formatToParts(date);
|
|
575
|
+
const part = (type) => parts.find((p) => p.type === type)?.value ?? "";
|
|
576
|
+
return { month: part("month"), day: part("day"), year: part("year") };
|
|
577
|
+
};
|
|
578
|
+
const from = partsOf(start);
|
|
579
|
+
const to = partsOf(finish);
|
|
580
|
+
if (from.year !== to.year) return `${from.month} ${from.day}, ${from.year} \u2013 ${to.month} ${to.day}, ${to.year}`;
|
|
581
|
+
if (from.month !== to.month) return `${from.month} ${from.day} \u2013 ${to.month} ${to.day}, ${to.year}`;
|
|
582
|
+
if (from.day === to.day) return null;
|
|
583
|
+
return `${from.month} ${from.day} \u2013 ${to.day}, ${to.year}`;
|
|
584
|
+
}
|
|
585
|
+
function isOrderedRange(from, to) {
|
|
586
|
+
if (!from || !to) return false;
|
|
587
|
+
const a = (typeof from === "string" ? new Date(from) : from).getTime();
|
|
588
|
+
const b = (typeof to === "string" ? new Date(to) : to).getTime();
|
|
589
|
+
return Number.isFinite(a) && Number.isFinite(b) && b > a;
|
|
590
|
+
}
|
|
591
|
+
function formatDurationFromRange(startAt, endAt) {
|
|
592
|
+
if (!isOrderedRange(startAt, endAt)) return "";
|
|
593
|
+
const start = typeof startAt === "string" ? new Date(startAt) : startAt;
|
|
594
|
+
const end = typeof endAt === "string" ? new Date(endAt) : endAt;
|
|
595
|
+
const minutes = Math.round((end.getTime() - start.getTime()) / 6e4);
|
|
596
|
+
if (minutes <= 0) return "";
|
|
597
|
+
if (minutes >= 60) {
|
|
598
|
+
const hours = Math.floor(minutes / 60);
|
|
599
|
+
const mins = minutes % 60;
|
|
600
|
+
return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;
|
|
601
|
+
}
|
|
602
|
+
return `${minutes}m`;
|
|
603
|
+
}
|
|
604
|
+
function formatDateUTC(value, options = {}) {
|
|
605
|
+
const { fallback = "N/A", timezone = "UTC" } = options;
|
|
606
|
+
if (value === null || value === void 0 || value === "") return fallback;
|
|
607
|
+
let ms;
|
|
608
|
+
if (typeof value === "number") {
|
|
609
|
+
ms = value;
|
|
610
|
+
} else {
|
|
611
|
+
const n = Number(value);
|
|
612
|
+
if (Number.isFinite(n) && n > 0 && /^-?\d+(\.\d+)?$/.test(value.trim())) {
|
|
613
|
+
ms = n;
|
|
614
|
+
} else {
|
|
615
|
+
ms = Date.parse(value.includes("T") ? value : value + "T00:00:00Z");
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
if (!Number.isFinite(ms)) return fallback;
|
|
619
|
+
return formatDateWithTimezone(ms, timezone === "local" ? VIEWER_TIMEZONE : null, "medium");
|
|
620
|
+
}
|
|
621
|
+
function formatEntryMonthUTC(entryMonth, style = "short") {
|
|
622
|
+
if (!entryMonth) return null;
|
|
623
|
+
return formatDateWithTimezone(entryMonth, null, style === "long" ? "monthYear" : "monthYearShort");
|
|
624
|
+
}
|
|
625
|
+
function formatLegalDate(dateInput) {
|
|
626
|
+
return formatDateWithTimezone(dateInput, null, "numeric");
|
|
627
|
+
}
|
|
628
|
+
function formatCurrency(value) {
|
|
629
|
+
if (value == null) return "N/A";
|
|
630
|
+
return new Intl.NumberFormat("en-US", {
|
|
631
|
+
style: "currency",
|
|
632
|
+
currency: "USD",
|
|
633
|
+
maximumFractionDigits: 0
|
|
634
|
+
}).format(value);
|
|
635
|
+
}
|
|
636
|
+
function formatPercent(value) {
|
|
637
|
+
if (value == null) return "N/A";
|
|
638
|
+
return `${value.toFixed(2)}%`;
|
|
639
|
+
}
|
|
640
|
+
function formatWholeDollars(price, currency = "USD") {
|
|
641
|
+
return new Intl.NumberFormat("en-US", {
|
|
642
|
+
style: "currency",
|
|
643
|
+
currency,
|
|
644
|
+
maximumFractionDigits: 0
|
|
645
|
+
}).format(price);
|
|
646
|
+
}
|
|
647
|
+
function formatCompactMetric(value, format = "number", options) {
|
|
648
|
+
if (value === 0 || value === null || value === void 0) {
|
|
649
|
+
if (format === "currency") return `${options?.prefix || "$"}0`;
|
|
650
|
+
if (format === "percentage") return "0%";
|
|
651
|
+
if (format === "months") return `0 ${options?.suffix || "months"}`;
|
|
652
|
+
return "0";
|
|
653
|
+
}
|
|
654
|
+
const absValue = Math.abs(value);
|
|
655
|
+
const sign = value < 0 ? "-" : "";
|
|
656
|
+
if (format === "currency") {
|
|
657
|
+
const prefix = options?.prefix || "$";
|
|
658
|
+
const compact = (val, divisor, suffix) => {
|
|
659
|
+
const divided = val / divisor;
|
|
660
|
+
const formatted = divided % 1 === 0 ? divided.toFixed(0) : divided.toFixed(1);
|
|
661
|
+
return `${sign}${prefix}${formatted}${suffix}`;
|
|
662
|
+
};
|
|
663
|
+
if (absValue >= 1e9) return compact(absValue, 1e9, "B");
|
|
664
|
+
if (absValue >= 1e6) return compact(absValue, 1e6, "M");
|
|
665
|
+
if (absValue >= 1e3) return `${sign}${prefix}${(absValue / 1e3).toFixed(0)}K`;
|
|
666
|
+
return `${sign}${prefix}${absValue.toLocaleString()}`;
|
|
667
|
+
}
|
|
668
|
+
if (format === "percentage") {
|
|
669
|
+
return `${sign}${absValue}%`;
|
|
670
|
+
}
|
|
671
|
+
if (format === "months") {
|
|
672
|
+
const rounded = Math.round(value * 10) / 10;
|
|
673
|
+
return `${rounded} ${options?.suffix || "months"}`;
|
|
674
|
+
}
|
|
675
|
+
if (absValue >= 1e6) return `${sign}${(absValue / 1e6).toFixed(1)}M`;
|
|
676
|
+
if (absValue >= 1e3) return `${sign}${(absValue / 1e3).toFixed(1)}K`;
|
|
677
|
+
return value.toLocaleString();
|
|
678
|
+
}
|
|
679
|
+
function getTrendColors(direction, polarity = "positive") {
|
|
680
|
+
if (direction === "neutral" || polarity === "neutral") {
|
|
681
|
+
return {
|
|
682
|
+
textClass: "text-ods-text-secondary",
|
|
683
|
+
badgeClass: "bg-ods-border text-ods-text-secondary"
|
|
684
|
+
};
|
|
685
|
+
}
|
|
686
|
+
const isPositiveOutcome = direction === "up" && polarity === "positive" || direction === "down" && polarity === "negative";
|
|
687
|
+
if (isPositiveOutcome) {
|
|
688
|
+
return {
|
|
689
|
+
textClass: "text-ods-success",
|
|
690
|
+
badgeClass: "bg-ods-success-secondary text-ods-success"
|
|
691
|
+
};
|
|
692
|
+
}
|
|
693
|
+
return {
|
|
694
|
+
textClass: "text-ods-error",
|
|
695
|
+
badgeClass: "bg-ods-error-secondary text-ods-error"
|
|
696
|
+
};
|
|
697
|
+
}
|
|
698
|
+
function formatDateRange(start, end) {
|
|
699
|
+
if (!start || !end) return "";
|
|
700
|
+
const fmt = (s) => formatDateWithTimezone(s, /^\d{4}-\d{2}-\d{2}$/.test(s) ? null : VIEWER_TIMEZONE, "medium") || s;
|
|
701
|
+
return `${fmt(start)} \u2014 ${fmt(end)}`;
|
|
702
|
+
}
|
|
703
|
+
function formatDateTimeAt(dateString) {
|
|
704
|
+
const dateStr = formatDateWithTimezone(dateString, VIEWER_TIMEZONE, "medium");
|
|
705
|
+
const timeStr = formatTimeWithTimezone(dateString, VIEWER_TIMEZONE);
|
|
706
|
+
return dateStr && timeStr ? `${dateStr} at ${timeStr}` : "";
|
|
707
|
+
}
|
|
708
|
+
function formatDurationFromMs(ms) {
|
|
709
|
+
if (!ms || isNaN(ms) || ms < 0) return "0ms";
|
|
710
|
+
if (ms < 1e3) return `${ms}ms`;
|
|
711
|
+
if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
|
|
712
|
+
return `${(ms / 6e4).toFixed(1)}m`;
|
|
713
|
+
}
|
|
714
|
+
function formatDuration(seconds) {
|
|
715
|
+
if (seconds < 60) return `${seconds} seconds`;
|
|
716
|
+
if (seconds < 3600) return `${Math.floor(seconds / 60)} minutes`;
|
|
717
|
+
const hours = Math.floor(seconds / 3600);
|
|
718
|
+
const minutes = Math.floor(seconds % 3600 / 60);
|
|
719
|
+
if (minutes === 0) return `${hours} hour${hours > 1 ? "s" : ""}`;
|
|
720
|
+
return `${hours} hour${hours > 1 ? "s" : ""} ${minutes} minute${minutes > 1 ? "s" : ""}`;
|
|
721
|
+
}
|
|
722
|
+
function titleCaseFromSlug(text, separator = "-") {
|
|
723
|
+
return text.split(separator).map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ");
|
|
724
|
+
}
|
|
725
|
+
function formatUnderscoreText(text) {
|
|
726
|
+
return titleCaseFromSlug(text, "_");
|
|
727
|
+
}
|
|
728
|
+
function stripHtml(html) {
|
|
729
|
+
let noTags = html;
|
|
730
|
+
let prev;
|
|
731
|
+
do {
|
|
732
|
+
prev = noTags;
|
|
733
|
+
noTags = noTags.replace(/<[^<>]*>/g, "");
|
|
734
|
+
} while (noTags !== prev);
|
|
735
|
+
return noTags.replace(/ /g, " ").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/'/g, "'").replace(/'/g, "'").replace(/'/g, "'").replace(/&/g, "&").replace(/\s+/g, " ").trim();
|
|
736
|
+
}
|
|
737
|
+
function formatClassification(classification) {
|
|
738
|
+
if (isOpenFrameClassification(classification)) return OPENFRAME_CLASSIFICATIONS[classification].label;
|
|
739
|
+
return formatUnderscoreText(classification);
|
|
740
|
+
}
|
|
741
|
+
function formatPricingModel(pricingModel) {
|
|
742
|
+
const customMappings = {
|
|
743
|
+
one_time: "One-time Purchase",
|
|
744
|
+
self_hosted: "Self-hosted"
|
|
745
|
+
};
|
|
746
|
+
return customMappings[pricingModel] || formatUnderscoreText(pricingModel);
|
|
747
|
+
}
|
|
748
|
+
function formatBioText(aboutHtml, fallback = "") {
|
|
749
|
+
if (!aboutHtml || !aboutHtml.trim()) return fallback;
|
|
750
|
+
if (aboutHtml.includes("<p")) {
|
|
751
|
+
const paragraphs = aboutHtml.split(/<p[^<>]*>/).slice(1).map((part) => part.split("</p>")[0]).map((text) => stripHtml(text).trim()).filter((text) => text.length > 0);
|
|
752
|
+
if (paragraphs.length > 0) return paragraphs.join(" ");
|
|
753
|
+
}
|
|
754
|
+
return stripHtml(aboutHtml).trim() || fallback;
|
|
755
|
+
}
|
|
756
|
+
function formatProgramTimeRange(at, opts = {}) {
|
|
757
|
+
const source = at.instant ?? at.utcDate ?? opts.startAt;
|
|
758
|
+
const label = opts.withZoneLabel === true;
|
|
759
|
+
const bare = formatTimeWithTimezone(source, at.timezone);
|
|
760
|
+
const labelled = label ? formatTimeWithTimezone(source, at.timezone, { withZoneLabel: true }) : bare;
|
|
761
|
+
const ordered = isOrderedRange(source, opts.endAt);
|
|
762
|
+
const end = ordered && opts.endAt ? formatTimeWithTimezone(opts.endAt, at.timezone, { withZoneLabel: label }) : "";
|
|
763
|
+
if (!bare) return "";
|
|
764
|
+
return end ? `${bare} - ${end}` : labelled;
|
|
765
|
+
}
|
|
766
|
+
function formatWebinarTimeMeta(at, opts) {
|
|
767
|
+
const duration = formatDurationFromRange(opts.startAt, opts.endAt);
|
|
768
|
+
const time = formatProgramTimeRange(at, { startAt: opts.startAt, withZoneLabel: opts.withZoneLabel });
|
|
769
|
+
return [time, duration].filter(Boolean).join(" \xB7 ");
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
// src/components/ui/square-avatar.tsx
|
|
773
|
+
import { memo, forwardRef } from "react";
|
|
774
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
775
|
+
var SquareAvatar = memo(
|
|
776
|
+
forwardRef(
|
|
777
|
+
({
|
|
778
|
+
className,
|
|
779
|
+
src,
|
|
780
|
+
alt,
|
|
781
|
+
size: size2 = "md",
|
|
782
|
+
sizePx,
|
|
783
|
+
fit = "cover",
|
|
784
|
+
fallback,
|
|
785
|
+
variant = "square",
|
|
786
|
+
initialsClassName,
|
|
787
|
+
style,
|
|
788
|
+
...props
|
|
789
|
+
}, ref) => {
|
|
790
|
+
const resolvedSrc = useAuthedImageSrc(src);
|
|
791
|
+
const sizeClasses = {
|
|
792
|
+
// xs (24px): dense card meta rows — avatar stacks on delivery/
|
|
793
|
+
// roadmap cards. Part of the shared scale so no caller ever
|
|
794
|
+
// bypasses the buckets with raw sizePx for a standard size.
|
|
795
|
+
xs: "h-6 w-6",
|
|
796
|
+
sm: "h-8 w-8",
|
|
797
|
+
md: "h-10 w-10",
|
|
798
|
+
lg: "h-12 w-12",
|
|
799
|
+
xl: "h-16 w-16"
|
|
800
|
+
};
|
|
801
|
+
const sizePxBySize = {
|
|
802
|
+
xs: 24,
|
|
803
|
+
sm: 32,
|
|
804
|
+
md: 40,
|
|
805
|
+
lg: 48,
|
|
806
|
+
xl: 64
|
|
807
|
+
};
|
|
808
|
+
const variantClasses = {
|
|
809
|
+
square: "rounded-md",
|
|
810
|
+
round: "rounded-full"
|
|
811
|
+
};
|
|
812
|
+
return /* @__PURE__ */ jsxs3(
|
|
813
|
+
"div",
|
|
814
|
+
{
|
|
815
|
+
className: cn(
|
|
816
|
+
"relative flex shrink-0 items-center justify-center overflow-hidden border border-ods-border bg-ods-bg",
|
|
817
|
+
sizePx === void 0 && sizeClasses[size2],
|
|
818
|
+
variantClasses[variant],
|
|
819
|
+
className
|
|
820
|
+
),
|
|
821
|
+
style: sizePx === void 0 ? style : { width: sizePx, height: sizePx, ...style },
|
|
822
|
+
ref,
|
|
823
|
+
...props,
|
|
824
|
+
children: [
|
|
825
|
+
/* @__PURE__ */ jsx3(
|
|
826
|
+
"div",
|
|
827
|
+
{
|
|
828
|
+
className: cn(
|
|
829
|
+
// Initials default to `--color-text-primary` (the old
|
|
830
|
+
// `text-ods-text-primary` value) so they stay readable on the default
|
|
831
|
+
// `bg-ods-bg` AND on the brand accent fills (`bg-ods-flamingo-pink`
|
|
832
|
+
// for the current user, `bg-ods-flamingo-cyan` for Mingo). The color
|
|
833
|
+
// resolves through `--ods-avatar-initials` with that fallback, so a
|
|
834
|
+
// host themed with a custom avatar fill can override the var with a
|
|
835
|
+
// contrast-correct value (e.g. `getReadableTextColor(accent)`) WITHOUT
|
|
836
|
+
// regressing any avatar that leaves the var unset. A caller passing
|
|
837
|
+
// its own `initialsClassName` text color still wins (tailwind-merge
|
|
838
|
+
// keeps the later class).
|
|
839
|
+
"flex items-center justify-center text-xs font-medium text-[color:var(--ods-avatar-initials,var(--color-text-primary))]",
|
|
840
|
+
initialsClassName,
|
|
841
|
+
resolvedSrc && "hidden"
|
|
842
|
+
),
|
|
843
|
+
children: personInitials(fallback || alt) || "?"
|
|
844
|
+
}
|
|
845
|
+
),
|
|
846
|
+
resolvedSrc && /* @__PURE__ */ jsx3(
|
|
847
|
+
next_image_default,
|
|
848
|
+
{
|
|
849
|
+
className: cn(
|
|
850
|
+
"absolute max-w-none",
|
|
851
|
+
fit === "contain" ? (
|
|
852
|
+
// A LOGO or crest must fit whole; cover would slice its edges.
|
|
853
|
+
"inset-0 h-full w-full object-contain"
|
|
854
|
+
) : (
|
|
855
|
+
// A portrait fills the frame; the 1px overscan hides edge seams.
|
|
856
|
+
"-inset-px h-[calc(100%+2px)] w-[calc(100%+2px)] object-cover"
|
|
857
|
+
)
|
|
858
|
+
),
|
|
859
|
+
draggable: false,
|
|
860
|
+
src: resolvedSrc,
|
|
861
|
+
alt: alt || "",
|
|
862
|
+
width: sizePx ?? sizePxBySize[size2],
|
|
863
|
+
height: sizePx ?? sizePxBySize[size2],
|
|
864
|
+
onError: (e) => {
|
|
865
|
+
const img = e.currentTarget;
|
|
866
|
+
img.style.display = "none";
|
|
867
|
+
const el = img.previousElementSibling;
|
|
868
|
+
if (el) el.classList.remove("hidden");
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
)
|
|
872
|
+
]
|
|
873
|
+
}
|
|
874
|
+
);
|
|
875
|
+
}
|
|
876
|
+
)
|
|
877
|
+
);
|
|
878
|
+
SquareAvatar.displayName = "SquareAvatar";
|
|
879
|
+
|
|
880
|
+
export {
|
|
881
|
+
FloatingTooltip,
|
|
882
|
+
tagVariants,
|
|
883
|
+
Tag,
|
|
884
|
+
VENDOR_CLASSIFICATIONS,
|
|
885
|
+
OPENFRAME_CLASSIFICATIONS,
|
|
886
|
+
isVendorClassification,
|
|
887
|
+
isOpenFrameClassification,
|
|
888
|
+
formatDate,
|
|
889
|
+
formatNumber,
|
|
890
|
+
formatPrice,
|
|
891
|
+
formatBytes,
|
|
892
|
+
formatBytesShort,
|
|
893
|
+
formatFileSize,
|
|
894
|
+
formatLargeNumber,
|
|
895
|
+
formatAbbreviatedNumber,
|
|
896
|
+
nameInitials,
|
|
897
|
+
personInitials,
|
|
898
|
+
personFirstName,
|
|
899
|
+
singleInitial,
|
|
900
|
+
formatDurationMMSS,
|
|
901
|
+
formatDurationCompact,
|
|
902
|
+
VIEWER_TIMEZONE,
|
|
903
|
+
formatDateWithTimezone,
|
|
904
|
+
formatDateTimeYmd,
|
|
905
|
+
formatTimeWithTimezone,
|
|
906
|
+
formatProgramDate,
|
|
907
|
+
formatProgramDateRange,
|
|
908
|
+
isOrderedRange,
|
|
909
|
+
formatDurationFromRange,
|
|
910
|
+
formatDateUTC,
|
|
911
|
+
formatEntryMonthUTC,
|
|
912
|
+
formatLegalDate,
|
|
913
|
+
formatCurrency,
|
|
914
|
+
formatPercent,
|
|
915
|
+
formatWholeDollars,
|
|
916
|
+
formatCompactMetric,
|
|
917
|
+
getTrendColors,
|
|
918
|
+
formatDateRange,
|
|
919
|
+
formatDateTimeAt,
|
|
920
|
+
formatDurationFromMs,
|
|
921
|
+
formatDuration,
|
|
922
|
+
titleCaseFromSlug,
|
|
923
|
+
formatUnderscoreText,
|
|
924
|
+
stripHtml,
|
|
925
|
+
formatClassification,
|
|
926
|
+
formatPricingModel,
|
|
927
|
+
formatBioText,
|
|
928
|
+
formatProgramTimeRange,
|
|
929
|
+
formatWebinarTimeMeta,
|
|
930
|
+
SquareAvatar
|
|
931
|
+
};
|