@flamingo-stack/openframe-frontend-core 0.0.711 → 0.0.713
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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-VWFZRMQR.js → chunk-3BB3IEJI.js} +13 -7
- package/dist/chunk-3K5ZLZE7.js +292 -0
- package/dist/chunk-3LU4UFPS.cjs +14 -0
- package/dist/{chunk-G47AP6LX.cjs → chunk-3QGUDPIH.cjs} +35 -33
- package/dist/{chunk-3UNL26CD.cjs → chunk-3RKBJT6K.cjs} +8 -6
- 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-VMMHJFHG.js → chunk-6F4QOCGB.js} +10 -8
- package/dist/{chunk-Q6B35Y7O.js → chunk-6MNAIQNR.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-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-WJUIXU6Y.js → chunk-CGHOH3GN.js} +28 -22
- package/dist/chunk-CMGFZHCN.js +233 -0
- package/dist/chunk-CMZ3QTFQ.js +1207 -0
- package/dist/chunk-CPA2CKRZ.cjs +125 -0
- 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-QA6TROME.cjs → chunk-EOKSKJSS.cjs} +25 -83
- package/dist/{chunk-6NTPY5QA.cjs → chunk-ETYLOZOB.cjs} +978 -2413
- package/dist/{chunk-6AMIRXKM.cjs → chunk-F2EACDOR.cjs} +93 -87
- package/dist/chunk-F5BPGWGT.cjs +931 -0
- package/dist/chunk-FFT56TYB.cjs +401 -0
- package/dist/chunk-FYEJTF5Y.js +125 -0
- package/dist/chunk-G3GRYDMS.js +16 -0
- 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-EQWD4IJE.js → chunk-H4J72PRA.js} +74 -46
- 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-XWEBHS7O.cjs → chunk-IJKMILMG.cjs} +82 -54
- package/dist/chunk-ILNN6QRW.js +1612 -0
- package/dist/{chunk-6GLQLTJI.js → chunk-IU4IO3CG.js} +35 -27
- package/dist/chunk-IYVFSLWJ.js +931 -0
- package/dist/{chunk-EX6GGCAC.cjs → chunk-J7YIQJPS.cjs} +15 -15
- 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-P6G3JZNC.cjs → chunk-KGAFUXGZ.cjs} +57 -148
- package/dist/chunk-KHXZFLIN.cjs +41 -0
- package/dist/{chunk-C4HRRB3V.cjs → chunk-KMB7JHGG.cjs} +23 -17
- package/dist/{chunk-K4PTDK34.js → chunk-KPUHSVJU.js} +322 -428
- package/dist/chunk-KT3U3ZRP.cjs +1137 -0
- package/dist/chunk-L2VUINHN.js +35 -0
- package/dist/{chunk-PLYEKV3N.cjs → chunk-MA4Q5RBP.cjs} +6 -6
- package/dist/chunk-NPAQSMRY.js +2087 -0
- package/dist/{chunk-IFWLJ66M.js → chunk-NQWJAOHO.js} +6 -4
- package/dist/{chunk-FYOKS5RI.cjs → chunk-OQKRXLTZ.cjs} +4719 -6351
- package/dist/chunk-P3JMAMHP.js +401 -0
- package/dist/{chunk-62KNLDXK.js → chunk-P6QCJXLD.js} +3 -3
- package/dist/chunk-PPXR22YC.cjs +2087 -0
- package/dist/chunk-PSVSEN4J.cjs +655 -0
- package/dist/{chunk-CDM7OSFB.cjs → chunk-QQQ46DFT.cjs} +125 -117
- package/dist/{chunk-FEMAJES4.cjs → chunk-QU4AHNRL.cjs} +41 -39
- package/dist/{chunk-2JTGK64G.js → chunk-RBVUIOIM.js} +12 -10
- package/dist/{chunk-SMAAV3HL.js → chunk-ROBQ5TR7.js} +10541 -10578
- package/dist/{chunk-TKZXHVBG.js → chunk-RRYNHAEL.js} +5 -5
- package/dist/{chunk-5HB7FLCV.js → chunk-STPC2AQU.js} +8338 -9970
- package/dist/{chunk-6K7QZDA6.cjs → chunk-TC4W7QDC.cjs} +8 -8
- package/dist/{chunk-FI6GMDO7.js → chunk-TTVOLEUS.js} +3605 -5040
- package/dist/{chunk-LM7TXMLU.cjs → chunk-ULWVKHSI.cjs} +8 -255
- 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-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-K6Y5NX6L.cjs → chunk-YIUSW4DB.cjs} +114 -220
- package/dist/{chunk-YD4LJZV4.cjs → chunk-ZX7SCPLO.cjs} +6 -8
- package/dist/cloud-tenants-HRJYNUJM.cjs +117 -0
- package/dist/cloud-tenants-SM7WLEGG.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/approval-level.d.ts +49 -0
- package/dist/components/features/approval-level.d.ts.map +1 -0
- 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 +235 -12
- package/dist/components/features/index.d.ts +8 -0
- package/dist/components/features/index.d.ts.map +1 -1
- package/dist/components/features/index.js +274 -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/policy-configuration-panel.d.ts.map +1 -1
- 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 +328 -82
- package/dist/components/index.js +459 -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-6XKQTQM5.cjs +81 -0
- package/dist/devices-LXSFGGEZ.js +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 +284 -25
- package/dist/index.js +737 -478
- package/dist/knowledge-7PDZLXPO.cjs +108 -0
- package/dist/knowledge-Q4SPFOTN.js +108 -0
- package/dist/logs-SZ4VB4FE.js +216 -0
- package/dist/logs-TO3NELGJ.cjs +216 -0
- package/dist/policies-533GQVFM.cjs +121 -0
- package/dist/policies-LB7VW2UB.js +121 -0
- package/dist/remote-session-GSGZOFDX.js +196 -0
- package/dist/remote-session-R6VAFESR.cjs +196 -0
- package/dist/software-update-DT2XSG7M.cjs +179 -0
- package/dist/software-update-ENZNVGKP.js +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/approval-level.tsx +149 -0
- 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 +10 -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/policy-configuration-panel.tsx +3 -12
- 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,118 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import type { ReactNode } from 'react';
|
|
4
|
+
import { VolumeUpIcon } from '../../icons-v2-generated/audio-and-visual/volume-up-icon';
|
|
5
|
+
import { ChromeIcon } from '../../icons-v2-generated/brand-logos/chrome-icon';
|
|
6
|
+
import { WindowsIcon } from '../../icons-v2-generated/brand-logos/windows-icon';
|
|
7
|
+
import { PrinterIcon } from '../../icons-v2-generated/devices/printer-icon';
|
|
8
|
+
import { WifiIcon } from '../../icons-v2-generated/devices/wifi-icon';
|
|
9
|
+
import { FolderIcon } from '../../icons-v2-generated/documents/folder-icon';
|
|
10
|
+
import { SearchIcon } from '../../icons-v2-generated/interface/search-icon';
|
|
11
|
+
import { TrashIcon } from '../../icons-v2-generated/interface/trash-icon';
|
|
12
|
+
import { StopIcon } from '../../icons-v2-generated/media-playback/stop-icon';
|
|
13
|
+
import { CheckCircleIcon } from '../../icons-v2-generated/signs-and-symbols/check-circle-icon';
|
|
14
|
+
import { MinusIcon } from '../../icons-v2-generated/signs-and-symbols/minus-icon';
|
|
15
|
+
import { XmarkIcon } from '../../icons-v2-generated/signs-and-symbols/xmark-icon';
|
|
16
|
+
import type { RemoteSessionFixture } from '../fixtures/remote-session';
|
|
17
|
+
|
|
18
|
+
function DesktopShortcut({ icon, label }: { icon: ReactNode; label: string }) {
|
|
19
|
+
return (
|
|
20
|
+
<div className="flex w-20 flex-col items-center gap-[var(--spacing-system-xxs)]">
|
|
21
|
+
<span className="flex size-10 items-center justify-center rounded-md bg-ods-card/70 text-ods-text-primary">
|
|
22
|
+
{icon}
|
|
23
|
+
</span>
|
|
24
|
+
<span className="w-full truncate text-center text-ods-text-primary text-h6">{label}</span>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function ServiceRow({ name, state }: { name: string; state: string }) {
|
|
30
|
+
return (
|
|
31
|
+
<div className="flex items-center gap-[var(--spacing-system-xs)] py-[var(--spacing-system-xs)]">
|
|
32
|
+
<CheckCircleIcon className="h-5 w-5 flex-shrink-0 text-ods-success" />
|
|
33
|
+
<span className="min-w-0 flex-1 truncate text-ods-text-primary text-h4">{name}</span>
|
|
34
|
+
<span className="flex-shrink-0 text-ods-text-secondary text-h6">{state}</span>
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function TaskbarApp({ icon, active = false }: { icon: ReactNode; active?: boolean }) {
|
|
40
|
+
return (
|
|
41
|
+
<span
|
|
42
|
+
className={`flex size-8 items-center justify-center rounded-md text-ods-text-primary ${
|
|
43
|
+
active ? 'border-b-2 border-ods-accent bg-ods-bg-surface' : ''
|
|
44
|
+
}`}
|
|
45
|
+
>
|
|
46
|
+
{icon}
|
|
47
|
+
</span>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* What the stream shows: the device's own desktop, filling the screen box the
|
|
53
|
+
* way a live session does. A wallpaper with its shortcuts, the printer's
|
|
54
|
+
* settings window open after the spooler was restarted, and the task bar. A
|
|
55
|
+
* drawing, standing in for the host's live canvas.
|
|
56
|
+
*/
|
|
57
|
+
export function RemoteDesktopPicture({ desktop }: { desktop: RemoteSessionFixture['desktop'] }) {
|
|
58
|
+
return (
|
|
59
|
+
<div className="absolute inset-0 flex flex-col overflow-hidden bg-gradient-to-br from-ods-flamingo-cyan-secondary via-ods-bg-surface to-ods-flamingo-pink-secondary">
|
|
60
|
+
<div className="relative min-h-0 flex-1">
|
|
61
|
+
{/* A narrow box shows the window alone: the shortcuts would leave it no room. */}
|
|
62
|
+
<div className="absolute left-[var(--spacing-system-sf)] top-[var(--spacing-system-sf)] hidden flex-col gap-[var(--spacing-system-sf)] content-md:flex">
|
|
63
|
+
<DesktopShortcut icon={<TrashIcon className="h-5 w-5" />} label="Recycle Bin" />
|
|
64
|
+
<DesktopShortcut icon={<FolderIcon className="h-5 w-5" />} label="Scans" />
|
|
65
|
+
<DesktopShortcut icon={<ChromeIcon className="h-5 w-5" />} label="Chrome" />
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<div className="absolute bottom-[var(--spacing-system-mf)] left-[var(--spacing-system-mf)] right-[var(--spacing-system-mf)] top-[var(--spacing-system-mf)] flex flex-col overflow-hidden rounded-md border border-ods-border bg-ods-card shadow-lg content-md:left-28">
|
|
69
|
+
<div className="flex flex-shrink-0 items-center gap-[var(--spacing-system-xs)] border-b border-ods-border bg-ods-bg-surface px-[var(--spacing-system-sf)] py-[var(--spacing-system-xs)]">
|
|
70
|
+
<PrinterIcon className="h-4 w-4 flex-shrink-0 text-ods-text-secondary" />
|
|
71
|
+
<span className="min-w-0 flex-1 truncate text-ods-text-primary text-h6">Printers & scanners</span>
|
|
72
|
+
<MinusIcon className="h-4 w-4 flex-shrink-0 text-ods-text-secondary" />
|
|
73
|
+
<StopIcon className="h-3 w-3 flex-shrink-0 text-ods-text-secondary" />
|
|
74
|
+
<XmarkIcon className="h-4 w-4 flex-shrink-0 text-ods-text-secondary" />
|
|
75
|
+
</div>
|
|
76
|
+
<div className="flex min-h-0 flex-1 flex-col gap-[var(--spacing-system-sf)] p-[var(--spacing-system-mf)]">
|
|
77
|
+
<div className="flex items-center gap-[var(--spacing-system-sf)]">
|
|
78
|
+
<span className="flex size-12 flex-shrink-0 items-center justify-center rounded-md border border-ods-border bg-ods-bg text-ods-text-primary">
|
|
79
|
+
<PrinterIcon className="h-6 w-6" />
|
|
80
|
+
</span>
|
|
81
|
+
<div className="flex min-w-0 flex-1 flex-col">
|
|
82
|
+
<span className="truncate text-ods-text-primary text-h3">{desktop.printer}</span>
|
|
83
|
+
<span className="truncate text-ods-text-secondary text-h6">Default printer</span>
|
|
84
|
+
</div>
|
|
85
|
+
<span className="flex-shrink-0 rounded-md bg-ods-success-secondary px-[var(--spacing-system-xs)] py-[var(--spacing-system-xxs)] text-ods-success text-h5">
|
|
86
|
+
Ready
|
|
87
|
+
</span>
|
|
88
|
+
</div>
|
|
89
|
+
<div className="flex flex-col divide-y divide-ods-border border-t border-ods-border">
|
|
90
|
+
<ServiceRow name="Print Spooler" state={`Restarted ${desktop.clock}`} />
|
|
91
|
+
<ServiceRow name="Print queue" state="0 documents waiting" />
|
|
92
|
+
<ServiceRow name="Test page" state="Printed" />
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<div className="flex flex-shrink-0 items-center gap-[var(--spacing-system-xs)] border-t border-ods-border bg-ods-card px-[var(--spacing-system-sf)] py-[var(--spacing-system-xxs)]">
|
|
99
|
+
<TaskbarApp icon={<WindowsIcon className="h-4 w-4" />} />
|
|
100
|
+
<span className="hidden h-8 w-40 items-center gap-[var(--spacing-system-xs)] rounded-md bg-ods-bg-surface px-[var(--spacing-system-xs)] text-ods-text-secondary text-h6 content-md:flex">
|
|
101
|
+
<SearchIcon className="h-4 w-4 flex-shrink-0" />
|
|
102
|
+
Search
|
|
103
|
+
</span>
|
|
104
|
+
<TaskbarApp icon={<FolderIcon className="h-4 w-4" />} />
|
|
105
|
+
<TaskbarApp icon={<ChromeIcon className="h-4 w-4" />} />
|
|
106
|
+
<TaskbarApp icon={<PrinterIcon className="h-4 w-4" />} active />
|
|
107
|
+
<span className="ml-auto flex flex-shrink-0 items-center gap-[var(--spacing-system-xs)] text-ods-text-primary">
|
|
108
|
+
<WifiIcon className="h-4 w-4" />
|
|
109
|
+
<VolumeUpIcon className="h-4 w-4" />
|
|
110
|
+
<span className="flex flex-col items-end leading-tight text-h6">
|
|
111
|
+
<span>{desktop.clock}</span>
|
|
112
|
+
<span className="text-ods-text-secondary">{desktop.date}</span>
|
|
113
|
+
</span>
|
|
114
|
+
</span>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { RemoteDesktopChatPanel, RemoteDesktopView } from '../../features/remote-session';
|
|
5
|
+
import { useProductDemoCast } from '../cast';
|
|
6
|
+
import { buildRemoteSessionFixture } from '../fixtures/remote-session';
|
|
7
|
+
import type { ProductScreenViewProps } from '../types';
|
|
8
|
+
import { RemoteDesktopPicture } from './remote-desktop-picture';
|
|
9
|
+
|
|
10
|
+
const noop = () => {};
|
|
11
|
+
const keepDraft = () => Promise.resolve(false);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The product's remote desktop page mid-session: the device header, the remote
|
|
15
|
+
* desktop filling the screen box, the session chat beside it. No "Back": a
|
|
16
|
+
* picture has nowhere to go back to. The narrow rendering hides the chat.
|
|
17
|
+
*/
|
|
18
|
+
export default function RemoteSessionScreen({ compact = false }: ProductScreenViewProps) {
|
|
19
|
+
const cast = useProductDemoCast();
|
|
20
|
+
const fixture = useMemo(() => buildRemoteSessionFixture(cast), [cast]);
|
|
21
|
+
return (
|
|
22
|
+
<div className="flex h-full flex-col bg-ods-bg">
|
|
23
|
+
{/* The page's header row is gone with "Back": the device bar keeps its distance from the top. */}
|
|
24
|
+
<div className="h-[var(--spacing-system-l)] flex-shrink-0" />
|
|
25
|
+
<div className="min-h-0 flex-1">
|
|
26
|
+
<RemoteDesktopView
|
|
27
|
+
{...fixture.view}
|
|
28
|
+
onEnterFullscreen={noop}
|
|
29
|
+
onExitFullscreen={noop}
|
|
30
|
+
onOpenSettings={noop}
|
|
31
|
+
chatOpen={!compact}
|
|
32
|
+
onToggleChat={noop}
|
|
33
|
+
screen={<RemoteDesktopPicture desktop={fixture.desktop} />}
|
|
34
|
+
chat={
|
|
35
|
+
compact ? null : (
|
|
36
|
+
// The side column needs the room of the wide layout; a narrow frame keeps the screen alone.
|
|
37
|
+
<div className="hidden min-h-0 content-md:flex">
|
|
38
|
+
<RemoteDesktopChatPanel {...fixture.chat} sending={false} onSend={keepDraft} variant="side" />
|
|
39
|
+
</div>
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
/>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { DeviceSelector } from '../../features/devices';
|
|
5
|
+
import {
|
|
6
|
+
PACKAGE_SEARCH_LABEL,
|
|
7
|
+
PACKAGE_SEARCH_PLACEHOLDER,
|
|
8
|
+
type PackageSearchSlotProps,
|
|
9
|
+
SoftwareActionForm,
|
|
10
|
+
} from '../../features/software';
|
|
11
|
+
import { Autocomplete } from '../../ui';
|
|
12
|
+
import { useProductDemoCast } from '../cast';
|
|
13
|
+
import { buildSoftwareUpdateFixture } from '../fixtures/software-update';
|
|
14
|
+
import type { ProductScreenViewProps } from '../types';
|
|
15
|
+
|
|
16
|
+
const noop = () => {};
|
|
17
|
+
|
|
18
|
+
const HIDDEN_WHEN_COMPACT = ['organization'];
|
|
19
|
+
|
|
20
|
+
/** "Software Name" with the fixture's package picked: the product's field, minus its catalog search. */
|
|
21
|
+
function StaticPackageField({ value }: PackageSearchSlotProps) {
|
|
22
|
+
return (
|
|
23
|
+
<Autocomplete
|
|
24
|
+
label={PACKAGE_SEARCH_LABEL}
|
|
25
|
+
labelVariant="large"
|
|
26
|
+
options={value ? [{ value: value.id, label: value.name, description: value.description ?? undefined }] : []}
|
|
27
|
+
value={value?.id ?? null}
|
|
28
|
+
onChange={noop}
|
|
29
|
+
placeholder={PACKAGE_SEARCH_PLACEHOLDER}
|
|
30
|
+
/>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const renderPackageSearch = (field: PackageSearchSlotProps) => <StaticPackageField {...field} />;
|
|
35
|
+
|
|
36
|
+
const NO_NARROWING = { columnFilters: [], tags: [] };
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The product's Update Software page: Chrome through WinGet, scheduled for
|
|
40
|
+
* tonight, with the devices picked for it on the "Selected Devices" tab. The
|
|
41
|
+
* page's title row is left out (the job is named above the picture), so the
|
|
42
|
+
* frame starts at the package. The form is in its densest arrangement (one
|
|
43
|
+
* package, the run choice beside its start, no search row over a fixed list),
|
|
44
|
+
* so the frame reaches the devices: what gets updated is in the picture. The
|
|
45
|
+
* narrow rendering drops the picker's customer column.
|
|
46
|
+
*/
|
|
47
|
+
export default function SoftwareUpdateScreen({ compact = false }: ProductScreenViewProps) {
|
|
48
|
+
const cast = useProductDemoCast();
|
|
49
|
+
const fixture = useMemo(() => buildSoftwareUpdateFixture(cast), [cast]);
|
|
50
|
+
const selected = useMemo(
|
|
51
|
+
() => fixture.devices.filter(device => fixture.selectedIds.has(device.id)),
|
|
52
|
+
[fixture.devices, fixture.selectedIds],
|
|
53
|
+
);
|
|
54
|
+
return (
|
|
55
|
+
<div className="h-full bg-ods-bg pt-[var(--spacing-system-l)]">
|
|
56
|
+
<div className="h-full">
|
|
57
|
+
<SoftwareActionForm
|
|
58
|
+
action={fixture.action}
|
|
59
|
+
showHeader={false}
|
|
60
|
+
// The picture's arrangement: one package, the run choice and its start on one row, the devices right under.
|
|
61
|
+
addRows={false}
|
|
62
|
+
runModeLayout="inline"
|
|
63
|
+
showDeviceHeading={false}
|
|
64
|
+
onSubmit={noop}
|
|
65
|
+
timing={fixture.timing}
|
|
66
|
+
initialValues={fixture.initialValues}
|
|
67
|
+
renderPackageSearch={renderPackageSearch}
|
|
68
|
+
renderDevicePicker={() => (
|
|
69
|
+
<DeviceSelector
|
|
70
|
+
devices={selected}
|
|
71
|
+
loading={false}
|
|
72
|
+
selectedIds={fixture.selectedIds}
|
|
73
|
+
showSelectionModeRadio={false}
|
|
74
|
+
showToolbar={false}
|
|
75
|
+
hideColumns={compact ? HIDDEN_WHEN_COMPACT : undefined}
|
|
76
|
+
// The picker's server mode is how a host says which tab is open: the picture shows what was picked.
|
|
77
|
+
server={{
|
|
78
|
+
activeTab: 'selected',
|
|
79
|
+
onTabChange: noop,
|
|
80
|
+
search: '',
|
|
81
|
+
onSearchChange: noop,
|
|
82
|
+
narrowing: NO_NARROWING,
|
|
83
|
+
onNarrowingChange: noop,
|
|
84
|
+
selectedCount: selected.length,
|
|
85
|
+
totalCount: selected.length,
|
|
86
|
+
onAdd: noop,
|
|
87
|
+
onRemove: noop,
|
|
88
|
+
onAddAll: noop,
|
|
89
|
+
onRemoveAll: noop,
|
|
90
|
+
}}
|
|
91
|
+
/>
|
|
92
|
+
)}
|
|
93
|
+
/>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { Board } from '../../features/board';
|
|
5
|
+
import { useProductDemoCast } from '../cast';
|
|
6
|
+
import { buildTicketsBoardFixture } from '../fixtures/tickets-board';
|
|
7
|
+
import type { ProductScreenViewProps } from '../types';
|
|
8
|
+
|
|
9
|
+
const noop = () => {};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The lanes folded in the wide picture: the two that carry the story (what the
|
|
13
|
+
* agents are on, what waits for a technician) stay open at full width, so no
|
|
14
|
+
* lane is cut by the frame.
|
|
15
|
+
*/
|
|
16
|
+
const FOLDED = { ON_HOLD: true, RESOLVED: true };
|
|
17
|
+
|
|
18
|
+
/** The product's ticket board; the narrow rendering shows the lanes that carry the story. */
|
|
19
|
+
export default function TicketsBoardScreen({ compact = false }: ProductScreenViewProps) {
|
|
20
|
+
const cast = useProductDemoCast();
|
|
21
|
+
const board = useMemo(() => buildTicketsBoardFixture(cast), [cast]);
|
|
22
|
+
const columns = compact ? board.filter(column => column.id !== 'ON_HOLD') : board;
|
|
23
|
+
return (
|
|
24
|
+
<div className="h-full bg-ods-bg p-[var(--spacing-system-m)]">
|
|
25
|
+
<Board columns={columns} onChange={noop} initialCollapsed={compact ? undefined : FOLDED} />
|
|
26
|
+
</div>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ComponentType } from 'react';
|
|
2
|
+
|
|
3
|
+
/** What every product screen of the registry takes. */
|
|
4
|
+
export interface ProductScreenViewProps {
|
|
5
|
+
/** The narrow rendering: fewer columns, secondary panels hidden. */
|
|
6
|
+
compact?: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** A product screen module: the product's own view, fed by its fixture. */
|
|
10
|
+
export type ProductScreenComponent = ComponentType<ProductScreenViewProps>;
|
|
@@ -234,6 +234,7 @@ export { LazyMount, type LazyMountProps } from './lazy-mount';
|
|
|
234
234
|
// Product-demo stage primitives (marketing pages): window + phone chrome, the
|
|
235
235
|
// incident feed, the swipe carousel and the sticky call-to-action bar.
|
|
236
236
|
export * from './app-window-frame';
|
|
237
|
+
export * from './product-screen-frame';
|
|
237
238
|
export * from './phone-frame';
|
|
238
239
|
export * from './incident-feed';
|
|
239
240
|
export * from './status-line';
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { type CSSProperties, type ReactNode, useLayoutEffect, useRef, useState } from 'react';
|
|
4
|
+
import { LAYOUT_STEPS } from '../../styles/layout-steps';
|
|
5
|
+
import { cn } from '../../utils/cn';
|
|
6
|
+
import { CollisionBoundaryContext, PortalContainerContext } from './portal-container';
|
|
7
|
+
|
|
8
|
+
/** The widest content step: a product screen is drawn at this width and scaled to its frame. */
|
|
9
|
+
export const PRODUCT_SCREEN_DESIGN_WIDTH = LAYOUT_STEPS['2xl'].content;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A narrower layout width for a frame that is itself narrow (a hero's window, a
|
|
13
|
+
* tab panel): the product's desktop layout at its smallest, so the scaled text
|
|
14
|
+
* stays readable.
|
|
15
|
+
*/
|
|
16
|
+
export const PRODUCT_SCREEN_READABLE_WIDTH = LAYOUT_STEPS.lg.content;
|
|
17
|
+
|
|
18
|
+
/** Under this frame width the screen is not scaled: it takes the product's own narrow layout. */
|
|
19
|
+
export const PRODUCT_SCREEN_SCALE_FROM = LAYOUT_STEPS.md.content;
|
|
20
|
+
|
|
21
|
+
/** The frame's CSS variable that carries the screen's scale. */
|
|
22
|
+
const SCALE_VAR = '--product-screen-scale';
|
|
23
|
+
|
|
24
|
+
export interface ProductScreenFrameProps {
|
|
25
|
+
/** The product screen: the product's own component with fixture data. */
|
|
26
|
+
children: ReactNode;
|
|
27
|
+
/** What the picture shows, for assistive tech (the content itself is hidden from it). */
|
|
28
|
+
label: string;
|
|
29
|
+
/** Height of the frame; the screen is cropped to it. A number is px. */
|
|
30
|
+
height: number | string;
|
|
31
|
+
/** Whose accent the screen carries. Default `openframe`. */
|
|
32
|
+
appType?: string;
|
|
33
|
+
/** Width the screen is laid out at before scaling. Default the widest content step. */
|
|
34
|
+
designWidth?: number;
|
|
35
|
+
/** The frame width from which the screen is scaled; under it the product's narrow layout renders. Default the content `md` step. */
|
|
36
|
+
scaleFrom?: number;
|
|
37
|
+
/** Fade the cropped bottom edge into the surface behind the frame. Default true. */
|
|
38
|
+
fade?: boolean;
|
|
39
|
+
className?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* A product screen shown as a picture on a marketing page.
|
|
44
|
+
*
|
|
45
|
+
* The child is the real product component. The frame is a content area, so
|
|
46
|
+
* every `content-*` layout switch inside reads the FRAME's width, never the
|
|
47
|
+
* window's. From the content `md` step up the child is laid out at
|
|
48
|
+
* `designWidth` and scaled down to the frame (a transform does not change the
|
|
49
|
+
* width a container query reads, so it keeps its desktop layout); under that
|
|
50
|
+
* step it is not scaled and renders the product's own narrow layout.
|
|
51
|
+
*
|
|
52
|
+
* It is a picture: the content is `inert` and hidden from assistive tech, and
|
|
53
|
+
* the frame is `role="img"` with `label`. Overlays the content opens (a menu a
|
|
54
|
+
* fixture shows open) portal into the frame and collide with its edges, and
|
|
55
|
+
* the frame's `data-app-type` gives them the product's accent too.
|
|
56
|
+
*/
|
|
57
|
+
export function ProductScreenFrame({
|
|
58
|
+
children,
|
|
59
|
+
label,
|
|
60
|
+
height,
|
|
61
|
+
appType = 'openframe',
|
|
62
|
+
designWidth = PRODUCT_SCREEN_DESIGN_WIDTH,
|
|
63
|
+
scaleFrom = PRODUCT_SCREEN_SCALE_FROM,
|
|
64
|
+
fade = true,
|
|
65
|
+
className,
|
|
66
|
+
}: ProductScreenFrameProps) {
|
|
67
|
+
const frameRef = useRef<HTMLDivElement>(null);
|
|
68
|
+
const [frame, setFrame] = useState<HTMLDivElement | null>(null);
|
|
69
|
+
const [portalHost, setPortalHost] = useState<HTMLDivElement | null>(null);
|
|
70
|
+
// Which layout the screen takes. `pending` until measured: the frame keeps its
|
|
71
|
+
// box and shows nothing, so the first paint is never the unscaled screen.
|
|
72
|
+
// React holds only this (it changes at two widths); the scale itself changes
|
|
73
|
+
// with every pixel of a resize, so it is written to a CSS variable on the
|
|
74
|
+
// frame and never re-renders the screen.
|
|
75
|
+
const [mode, setMode] = useState<'pending' | 'scaled' | 'native'>('pending');
|
|
76
|
+
|
|
77
|
+
useLayoutEffect(() => {
|
|
78
|
+
const element = frameRef.current;
|
|
79
|
+
if (!element) return undefined;
|
|
80
|
+
setFrame(element);
|
|
81
|
+
const measure = () => {
|
|
82
|
+
const width = element.clientWidth;
|
|
83
|
+
const scaled = width >= scaleFrom && width < designWidth;
|
|
84
|
+
element.style.setProperty(SCALE_VAR, String(scaled ? width / designWidth : 1));
|
|
85
|
+
setMode(scaled ? 'scaled' : 'native');
|
|
86
|
+
};
|
|
87
|
+
measure();
|
|
88
|
+
const observer = new ResizeObserver(measure);
|
|
89
|
+
observer.observe(element);
|
|
90
|
+
return () => observer.disconnect();
|
|
91
|
+
}, [designWidth, scaleFrom]);
|
|
92
|
+
|
|
93
|
+
const screenStyle: CSSProperties =
|
|
94
|
+
mode === 'scaled'
|
|
95
|
+
? {
|
|
96
|
+
width: designWidth,
|
|
97
|
+
// The crop is in frame pixels, so the unscaled box is taller by the same factor.
|
|
98
|
+
height: `calc(100% / var(${SCALE_VAR}))`,
|
|
99
|
+
transform: `scale(var(${SCALE_VAR}))`,
|
|
100
|
+
transformOrigin: 'top left',
|
|
101
|
+
}
|
|
102
|
+
: // Unscaled, the screen still needs to be the containing block of anything the
|
|
103
|
+
// product pins with `position: fixed` (a form's action bar), or it escapes to the window.
|
|
104
|
+
{ width: '100%', height: '100%', transform: 'translateZ(0)' };
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
<div
|
|
108
|
+
ref={frameRef}
|
|
109
|
+
role="img"
|
|
110
|
+
aria-label={label}
|
|
111
|
+
data-app-type={appType}
|
|
112
|
+
className={cn('relative overflow-hidden', className)}
|
|
113
|
+
style={{ height }}
|
|
114
|
+
>
|
|
115
|
+
<PortalContainerContext.Provider value={portalHost}>
|
|
116
|
+
<CollisionBoundaryContext.Provider value={frame}>
|
|
117
|
+
<div
|
|
118
|
+
inert
|
|
119
|
+
aria-hidden
|
|
120
|
+
className={cn('ods-content-area', mode === 'pending' && 'invisible')}
|
|
121
|
+
style={screenStyle}
|
|
122
|
+
>
|
|
123
|
+
<div className="ods-content-scope">{children}</div>
|
|
124
|
+
<div ref={setPortalHost} style={{ display: 'contents' }} />
|
|
125
|
+
</div>
|
|
126
|
+
</CollisionBoundaryContext.Provider>
|
|
127
|
+
</PortalContainerContext.Provider>
|
|
128
|
+
{fade && (
|
|
129
|
+
<div
|
|
130
|
+
aria-hidden
|
|
131
|
+
className="pointer-events-none absolute inset-x-0 bottom-0 h-16 bg-gradient-to-t from-ods-bg to-transparent"
|
|
132
|
+
/>
|
|
133
|
+
)}
|
|
134
|
+
</div>
|
|
135
|
+
);
|
|
136
|
+
}
|
|
@@ -56,14 +56,23 @@ interface RadioGroupBlockProps extends Omit<ComponentPropsWithoutRef<typeof Radi
|
|
|
56
56
|
* - `grouped`: options share a single outer border with dividers between rows.
|
|
57
57
|
*/
|
|
58
58
|
variant?: 'separated' | 'grouped';
|
|
59
|
+
/**
|
|
60
|
+
* `vertical` (default): one option per row. `horizontal`: the options side
|
|
61
|
+
* by side in equal columns, for a short choice on a wide form.
|
|
62
|
+
*/
|
|
63
|
+
orientation?: 'vertical' | 'horizontal';
|
|
59
64
|
/** Error message displayed below the group (also triggers red borders) */
|
|
60
65
|
error?: string;
|
|
61
66
|
itemClassName?: string;
|
|
62
67
|
}
|
|
63
68
|
|
|
64
69
|
const RadioGroupBlock = forwardRef<ComponentRef<typeof RadioGroupPrimitive.Root>, RadioGroupBlockProps>(
|
|
65
|
-
(
|
|
70
|
+
(
|
|
71
|
+
{ className, options, variant = 'separated', orientation = 'vertical', error, itemClassName, disabled, ...props },
|
|
72
|
+
ref,
|
|
73
|
+
) => {
|
|
66
74
|
const isGrouped = variant === 'grouped';
|
|
75
|
+
const isHorizontal = orientation === 'horizontal';
|
|
67
76
|
return (
|
|
68
77
|
<div className={cn('relative flex w-full flex-col', className)}>
|
|
69
78
|
<RadioGroupPrimitive.Root
|
|
@@ -72,14 +81,16 @@ const RadioGroupBlock = forwardRef<ComponentRef<typeof RadioGroupPrimitive.Root>
|
|
|
72
81
|
// scrolls to) the first control that failed validation. The GROUP is
|
|
73
82
|
// the field here; the individual options are not separately invalid.
|
|
74
83
|
data-invalid={error ? true : undefined}
|
|
84
|
+
orientation={orientation}
|
|
75
85
|
className={cn(
|
|
76
86
|
'w-full',
|
|
77
87
|
isGrouped
|
|
78
88
|
? cn(
|
|
79
|
-
'flex
|
|
89
|
+
'flex overflow-hidden rounded-[6px] border bg-ods-card',
|
|
90
|
+
isHorizontal ? 'flex-row items-stretch' : 'flex-col',
|
|
80
91
|
error ? 'border-ods-error' : 'border-ods-border',
|
|
81
92
|
)
|
|
82
|
-
: 'grid gap-2',
|
|
93
|
+
: cn('grid gap-2', isHorizontal && 'auto-cols-fr grid-flow-col'),
|
|
83
94
|
)}
|
|
84
95
|
disabled={disabled}
|
|
85
96
|
{...props}
|
|
@@ -95,6 +106,7 @@ const RadioGroupBlock = forwardRef<ComponentRef<typeof RadioGroupPrimitive.Root>
|
|
|
95
106
|
aria-disabled={isDisabled || undefined}
|
|
96
107
|
className={cn(
|
|
97
108
|
'flex w-full items-center gap-3',
|
|
109
|
+
isHorizontal && 'min-w-0 flex-1',
|
|
98
110
|
'transition-colors duration-200',
|
|
99
111
|
isDisabled ? 'cursor-not-allowed' : 'cursor-pointer',
|
|
100
112
|
// Hover / active move the BACKGROUND only, like Input and
|
|
@@ -104,7 +116,7 @@ const RadioGroupBlock = forwardRef<ComponentRef<typeof RadioGroupPrimitive.Root>
|
|
|
104
116
|
isGrouped
|
|
105
117
|
? cn(
|
|
106
118
|
'bg-ods-card px-[var(--spacing-system-sf)] py-[var(--spacing-system-xs,8px)]',
|
|
107
|
-
!isLast && 'border-b',
|
|
119
|
+
!isLast && (isHorizontal ? 'border-r' : 'border-b'),
|
|
108
120
|
error ? 'border-ods-error' : 'border-ods-border',
|
|
109
121
|
)
|
|
110
122
|
: cn(
|
|
@@ -8,6 +8,18 @@ import { Chevron02LeftIcon } from '../icons-v2-generated/arrows/chevron-02-left-
|
|
|
8
8
|
import { Chevron02RightIcon } from '../icons-v2-generated/arrows/chevron-02-right-icon';
|
|
9
9
|
import { PlaybackToggle } from './playback-toggle';
|
|
10
10
|
|
|
11
|
+
/** The row under the track: the dots, the counter, the pause and the two arrows (the arrows set its height). */
|
|
12
|
+
const SNAP_CAROUSEL_CONTROLS_CLASS = 'mt-3 flex items-center gap-2';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The carousel's controls row while its slides load: the same box (margin and
|
|
16
|
+
* height), empty. A skeleton of a carousel is its slides' skeleton over this,
|
|
17
|
+
* so the block keeps its height when the slides land.
|
|
18
|
+
*/
|
|
19
|
+
export function SnapCarouselControlsSkeleton({ className }: { className?: string }) {
|
|
20
|
+
return <div aria-hidden className={cn(SNAP_CAROUSEL_CONTROLS_CLASS, 'h-11', className)} />;
|
|
21
|
+
}
|
|
22
|
+
|
|
11
23
|
export interface SnapCarouselProps<T> {
|
|
12
24
|
items: readonly T[];
|
|
13
25
|
renderItem: (item: T, index: number) => ReactNode;
|
|
@@ -23,6 +35,8 @@ export interface SnapCarouselProps<T> {
|
|
|
23
35
|
slideClassName?: string;
|
|
24
36
|
prevLabel?: string;
|
|
25
37
|
nextLabel?: string;
|
|
38
|
+
/** A slide to bring into view whenever this value changes (a link that names it). Only the track moves, never the page. */
|
|
39
|
+
focusIndex?: number;
|
|
26
40
|
className?: string;
|
|
27
41
|
}
|
|
28
42
|
|
|
@@ -69,6 +83,7 @@ export function SnapCarousel<T>({
|
|
|
69
83
|
slideClassName = 'basis-[300px]',
|
|
70
84
|
prevLabel = 'Previous',
|
|
71
85
|
nextLabel = 'Next',
|
|
86
|
+
focusIndex,
|
|
72
87
|
className,
|
|
73
88
|
}: SnapCarouselProps<T>) {
|
|
74
89
|
const trackRef = useRef<HTMLDivElement | null>(null);
|
|
@@ -95,6 +110,16 @@ export function SnapCarousel<T>({
|
|
|
95
110
|
[count, slideStep],
|
|
96
111
|
);
|
|
97
112
|
|
|
113
|
+
// Only a change of `focusIndex` moves the track: `goTo` is read through a ref,
|
|
114
|
+
// so more items arriving never pulls a visitor back to a slide named earlier.
|
|
115
|
+
const goToRef = useRef(goTo);
|
|
116
|
+
useEffect(() => {
|
|
117
|
+
goToRef.current = goTo;
|
|
118
|
+
}, [goTo]);
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
if (focusIndex !== undefined && focusIndex >= 0) goToRef.current(focusIndex);
|
|
121
|
+
}, [focusIndex]);
|
|
122
|
+
|
|
98
123
|
const onScroll = useCallback(() => {
|
|
99
124
|
const track = trackRef.current;
|
|
100
125
|
const step = slideStep();
|
|
@@ -162,7 +187,7 @@ export function SnapCarousel<T>({
|
|
|
162
187
|
</div>
|
|
163
188
|
))}
|
|
164
189
|
</div>
|
|
165
|
-
<div className=
|
|
190
|
+
<div className={SNAP_CAROUSEL_CONTROLS_CLASS}>
|
|
166
191
|
<span className="flex gap-1.5" aria-hidden>
|
|
167
192
|
{items.map((_, dotIndex) => (
|
|
168
193
|
<span
|
|
@@ -15,6 +15,11 @@ const tagVariants = cva(['inline-flex items-center justify-center rounded-md', '
|
|
|
15
15
|
size: {
|
|
16
16
|
default: 'h-8 gap-[var(--spacing-system-xs)] p-[var(--spacing-system-xsf)] text-h5',
|
|
17
17
|
large: 'h-12 gap-[var(--spacing-system-xs)] p-[var(--spacing-system-s)] font-bold text-h3',
|
|
18
|
+
// A sentence, not a label: body type in the case it was written in (a
|
|
19
|
+
// question a visitor can ask), on the same chip surface. One line, always:
|
|
20
|
+
// a longer sentence clips and shows whole in the label's tooltip.
|
|
21
|
+
sentence:
|
|
22
|
+
'h-9 gap-[var(--spacing-system-xs)] px-[var(--spacing-system-sf)] py-[var(--spacing-system-xsf)] text-h6',
|
|
18
23
|
},
|
|
19
24
|
variant: {
|
|
20
25
|
primary: ['bg-ods-accent text-ods-text-on-accent', 'hover:bg-ods-accent-hover active:bg-ods-accent-active'],
|
package/src/hooks/ui/index.ts
CHANGED
|
@@ -6,6 +6,7 @@ export * from './use-deferred-error';
|
|
|
6
6
|
export * from './use-drag-and-drop-enabled';
|
|
7
7
|
export * from './use-focus-trap';
|
|
8
8
|
export * from './use-header-height';
|
|
9
|
+
export * from './use-sticky-toolbar';
|
|
9
10
|
export * from './use-horizontal-scrollbar';
|
|
10
11
|
export * from './use-image-edge-color';
|
|
11
12
|
export * from './use-is-truncated';
|