@flamingo-stack/openframe-frontend-core 0.0.748 → 0.0.750
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/build/export-map.json +1 -1
- package/dist/{chunk-7Y3VMMJB.cjs → chunk-2J2OBP4N.cjs} +26 -18
- package/dist/chunk-2YXOD2KL.cjs +137 -0
- package/dist/{chunk-BEC43GHL.cjs → chunk-34TWK3JE.cjs} +3 -3
- package/dist/{chunk-BBM2ICOY.cjs → chunk-3TELPOVH.cjs} +2 -2
- package/dist/{chunk-G2ELX3DG.cjs → chunk-45YRDD7W.cjs} +22 -19
- package/dist/{chunk-4AZHFLOM.cjs → chunk-4O2KYY4K.cjs} +3 -3
- package/dist/{chunk-6XP6RNFD.cjs → chunk-6KEJQR6L.cjs} +1875 -2116
- package/dist/{chunk-JNBOQ7F2.cjs → chunk-7RCTOWBA.cjs} +24 -24
- package/dist/{chunk-U6XWGK53.cjs → chunk-ALPRQ3ZX.cjs} +56 -46
- package/dist/{chunk-TRXCQADV.cjs → chunk-AW6GP3JK.cjs} +103 -98
- package/dist/{chunk-GE4PCDNZ.cjs → chunk-BO6ZOAPB.cjs} +12 -12
- package/dist/{chunk-HNLI4OU5.cjs → chunk-C6LPOYDM.cjs} +24 -24
- package/dist/{chunk-4MGZYY6U.cjs → chunk-CLAJIQ7E.cjs} +26 -18
- package/dist/{chunk-EH3LOWGY.cjs → chunk-CNUZLOVA.cjs} +48 -40
- package/dist/{chunk-QPSQ5WLG.cjs → chunk-DGEB5GUZ.cjs} +2 -2
- package/dist/{chunk-OZUJYBQ2.cjs → chunk-E3KFEOFA.cjs} +9 -6
- package/dist/{chunk-PSSGIZXZ.cjs → chunk-FHT7SMA7.cjs} +49 -46
- package/dist/{chunk-JOPFX3PJ.cjs → chunk-FP6HAJQV.cjs} +137 -122
- package/dist/{chunk-YKJQM2O6.cjs → chunk-GVETSV7H.cjs} +56 -53
- package/dist/{chunk-UNR74CAC.cjs → chunk-HOEVD6EN.cjs} +4 -4
- package/dist/{chunk-H34A2765.cjs → chunk-JPUTILTV.cjs} +104 -118
- package/dist/{chunk-46EIXJFC.cjs → chunk-KVSEWACW.cjs} +44 -27
- package/dist/{chunk-AKTPO2DN.cjs → chunk-L4UI63K6.cjs} +2 -2
- package/dist/{chunk-PSIKUDUV.cjs → chunk-LVO7FALW.cjs} +5 -5
- package/dist/{chunk-L2RMTGOK.cjs → chunk-MGF3FUKD.cjs} +7 -7
- package/dist/{chunk-P7KTAXXE.cjs → chunk-OFO75R2O.cjs} +169 -175
- package/dist/{chunk-B27QEHYR.cjs → chunk-P6F6PHVK.cjs} +9 -9
- package/dist/chunk-RB6BSE3O.cjs +21 -0
- package/dist/chunk-UGCRLRCT.cjs +25 -0
- package/dist/{chunk-BBTSJYTR.cjs → chunk-V3UJ6NDR.cjs} +243 -429
- package/dist/{chunk-ZNUSYMH7.cjs → chunk-WZX26ODJ.cjs} +121 -121
- package/dist/{chunk-YIRX6C7V.cjs → chunk-XJ3J4UIS.cjs} +57 -22
- package/dist/{chunk-D4XZL27V.cjs → chunk-YL62VAHC.cjs} +6 -6
- package/dist/{cloud-tenants-V5727B7F.cjs → cloud-tenants-E4JSG3GH.cjs} +16 -14
- package/dist/components/case-studies/index.cjs +29 -27
- package/dist/components/categories-cart.d.ts.map +1 -1
- package/dist/components/categories-cart.js +2 -7
- package/dist/components/chat/chat-container.js +4 -4
- package/dist/components/chat/chat-context-picker.d.ts.map +1 -1
- package/dist/components/chat/chat-context-picker.js +2 -1
- package/dist/components/chat/chat-message-row.d.ts.map +1 -1
- package/dist/components/chat/chat-message-row.js +6 -5
- package/dist/components/chat/chat-message-skeleton.d.ts +3 -1
- package/dist/components/chat/chat-message-skeleton.d.ts.map +1 -1
- package/dist/components/chat/chat-message-skeleton.js +8 -5
- package/dist/components/chat/chat-sidebar-skeleton.d.ts.map +1 -1
- package/dist/components/chat/chat-sidebar-skeleton.js +4 -3
- package/dist/components/chat/chat-top-navigation.js +4 -4
- package/dist/components/chat/context-items-list.d.ts.map +1 -1
- package/dist/components/chat/context-items-list.js +5 -3
- package/dist/components/chat/entity-cards/admin-content-card-grid.d.ts +24 -1
- package/dist/components/chat/entity-cards/admin-content-card-grid.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/admin-content-card-grid.js +46 -15
- package/dist/components/chat/entity-cards/admin-content-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/admin-content-card.js +2 -1
- package/dist/components/chat/entity-cards/blog-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/blog-card.js +13 -12
- package/dist/components/chat/entity-cards/campaign-card-admin.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/campaign-card-admin.js +5 -4
- package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/case-study-card.js +19 -18
- package/dist/components/chat/entity-cards/chat-ticket-item.js +5 -5
- package/dist/components/chat/entity-cards/customer-interview-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/customer-interview-card.js +15 -14
- package/dist/components/chat/entity-cards/data-room-doc-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/data-room-doc-card.js +7 -6
- package/dist/components/chat/entity-cards/design-doc-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/design-doc-card.js +0 -2
- package/dist/components/chat/entity-cards/generic-entity-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/generic-entity-card.js +8 -7
- package/dist/components/chat/entity-cards/github-activity-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/github-activity-card.js +11 -10
- package/dist/components/chat/entity-cards/hubspot-ticket-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/hubspot-ticket-card.js +16 -15
- package/dist/components/chat/entity-cards/index.d.ts +1 -1
- package/dist/components/chat/entity-cards/index.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/index.js +2 -0
- package/dist/components/chat/entity-cards/investor-update-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/investor-update-card.js +12 -11
- package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/onboarding-guide-card.js +25 -30
- package/dist/components/chat/entity-cards/program-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/program-card.js +29 -28
- package/dist/components/chat/entity-cards/roadmap-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/roadmap-card.js +37 -39
- package/dist/components/chat/entity-cards/slack-message-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/slack-message-card.js +12 -11
- package/dist/components/chat/guide-welcome.js +2 -2
- package/dist/components/chat/index.cjs +13 -9
- package/dist/components/chat/mingo-archive-list.d.ts.map +1 -1
- package/dist/components/chat/mingo-archive-list.js +2 -1
- package/dist/components/chat/mingo-chat-history.d.ts +4 -2
- package/dist/components/chat/mingo-chat-history.d.ts.map +1 -1
- package/dist/components/chat/mingo-chat-history.js +11 -5
- package/dist/components/chat/mingo-chat-rail.d.ts.map +1 -1
- package/dist/components/chat/mingo-chat-rail.js +2 -1
- package/dist/components/chat/mingo-info-card.d.ts.map +1 -1
- package/dist/components/chat/mingo-info-card.js +6 -5
- package/dist/components/chat/mingo-onboarding-card-skeleton.d.ts +3 -1
- package/dist/components/chat/mingo-onboarding-card-skeleton.d.ts.map +1 -1
- package/dist/components/chat/mingo-onboarding-card-skeleton.js +12 -12
- package/dist/components/chat/model-display.js +4 -4
- package/dist/components/chat/msp-organization-card-skeleton.js +5 -5
- package/dist/components/chat/quick-action-chip.d.ts +3 -3
- package/dist/components/chat/quick-action-chip.d.ts.map +1 -1
- package/dist/components/chat/quick-action-chip.js +12 -6
- package/dist/components/chat/utils/compact-card-classes.d.ts +4 -4
- package/dist/components/chat/utils/compact-card-classes.d.ts.map +1 -1
- package/dist/components/chat/utils/compact-card-classes.js +2 -2
- package/dist/components/contact/index.cjs +17 -15
- package/dist/components/content-loading-container.d.ts +1 -1
- package/dist/components/content-loading-container.d.ts.map +1 -1
- package/dist/components/content-loading-container.js +6 -7
- package/dist/components/docs/doc-viewer.d.ts.map +1 -1
- package/dist/components/docs/doc-viewer.js +3 -2
- package/dist/components/docs/index.cjs +20 -18
- package/dist/components/docs/skeletons.d.ts +7 -8
- package/dist/components/docs/skeletons.d.ts.map +1 -1
- package/dist/components/docs/skeletons.js +62 -61
- package/dist/components/embeds/embed-iframe.d.ts +6 -6
- package/dist/components/embeds/embed-iframe.d.ts.map +1 -1
- package/dist/components/embeds/embed-iframe.js +9 -4
- package/dist/components/embeds/index.cjs +19 -15
- package/dist/components/embeds/index.d.ts +2 -2
- package/dist/components/embeds/index.d.ts.map +1 -1
- package/dist/components/embeds/index.js +2 -1
- package/dist/components/embeds/linkedin-embed-client.d.ts.map +1 -1
- package/dist/components/embeds/linkedin-embed-client.js +7 -6
- package/dist/components/embeds/markdown-image.d.ts.map +1 -1
- package/dist/components/embeds/markdown-image.js +5 -3
- package/dist/components/embeds/og-link-preview.d.ts +19 -18
- package/dist/components/embeds/og-link-preview.d.ts.map +1 -1
- package/dist/components/embeds/og-link-preview.js +143 -88
- package/dist/components/embeds/reddit-embed-client.d.ts.map +1 -1
- package/dist/components/embeds/reddit-embed-client.js +10 -9
- package/dist/components/embeds/twitter-embed-client.d.ts.map +1 -1
- package/dist/components/embeds/twitter-embed-client.js +10 -9
- package/dist/components/faq/faq-section.d.ts.map +1 -1
- package/dist/components/faq/faq-section.js +9 -5
- package/dist/components/faq/index.cjs +18 -16
- package/dist/components/features/auth/login-form.d.ts +34 -21
- package/dist/components/features/auth/login-form.d.ts.map +1 -1
- package/dist/components/features/auth/login-form.js +77 -39
- package/dist/components/features/auth/sso-providers.d.ts +7 -1
- package/dist/components/features/auth/sso-providers.d.ts.map +1 -1
- package/dist/components/features/auth/sso-providers.js +22 -4
- package/dist/components/features/board/ticket-card-skeleton.js +8 -8
- package/dist/components/features/capability-explorer.d.ts +3 -1
- package/dist/components/features/capability-explorer.d.ts.map +1 -1
- package/dist/components/features/capability-explorer.js +27 -24
- package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts +5 -2
- package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts.map +1 -1
- package/dist/components/features/devices/device-selector/device-selector-skeleton.js +2 -2
- package/dist/components/features/devices/device-selector/device-selector.d.ts +1 -1
- package/dist/components/features/devices/device-selector/device-selector.d.ts.map +1 -1
- package/dist/components/features/devices/device-selector/device-selector.js +2 -0
- package/dist/components/features/devices/device-selector/device-selector.types.d.ts +2 -0
- package/dist/components/features/devices/device-selector/device-selector.types.d.ts.map +1 -1
- package/dist/components/features/devices/devices-grid.d.ts +3 -1
- package/dist/components/features/devices/devices-grid.d.ts.map +1 -1
- package/dist/components/features/devices/devices-grid.js +3 -2
- package/dist/components/features/devices/devices-panel-view.d.ts +6 -1
- package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -1
- package/dist/components/features/devices/devices-panel-view.js +4 -1
- package/dist/components/features/devices/devices-table-columns.d.ts +3 -1
- package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -1
- package/dist/components/features/devices/devices-table-columns.js +2 -0
- package/dist/components/features/index.cjs +18 -14
- package/dist/components/features/logs/logs-table-view.d.ts +3 -1
- package/dist/components/features/logs/logs-table-view.d.ts.map +1 -1
- package/dist/components/features/logs/logs-table-view.js +2 -2
- package/dist/components/features/model-token-rates.d.ts +4 -1
- package/dist/components/features/model-token-rates.d.ts.map +1 -1
- package/dist/components/features/model-token-rates.js +18 -23
- package/dist/components/features/notifications/index.d.ts +2 -2
- package/dist/components/features/notifications/index.d.ts.map +1 -1
- package/dist/components/features/notifications/index.js +2 -1
- package/dist/components/features/notifications/notification-drawer.d.ts.map +1 -1
- package/dist/components/features/notifications/notification-drawer.js +9 -16
- package/dist/components/features/notifications/notification-tile.d.ts +14 -0
- package/dist/components/features/notifications/notification-tile.d.ts.map +1 -1
- package/dist/components/features/notifications/notification-tile.js +36 -1
- package/dist/components/features/policies/policy-summary-cards.js +2 -2
- package/dist/components/features/push-button-selector.d.ts.map +1 -1
- package/dist/components/features/push-button-selector.js +12 -7
- package/dist/components/features/remote-session/remote-desktop-view.d.ts +4 -1
- package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -1
- package/dist/components/features/remote-session/remote-desktop-view.js +14 -10
- package/dist/components/features/waitlist-form.d.ts.map +1 -1
- package/dist/components/features/waitlist-form.js +6 -5
- package/dist/components/help-center-pages/download-apps-page.d.ts.map +1 -1
- package/dist/components/help-center-pages/download-apps-page.js +2 -1
- package/dist/components/help-center-pages/index.cjs +127 -119
- package/dist/components/help-center-pages/trust-center-page.d.ts +4 -1
- package/dist/components/help-center-pages/trust-center-page.d.ts.map +1 -1
- package/dist/components/help-center-pages/trust-center-page.js +3 -2
- package/dist/components/help-center-pages/trust-center-sections.d.ts +4 -1
- package/dist/components/help-center-pages/trust-center-sections.d.ts.map +1 -1
- package/dist/components/help-center-pages/trust-center-sections.js +5 -2
- package/dist/components/index.cjs +70 -112
- package/dist/components/index.d.ts +0 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +0 -2
- package/dist/components/layout/title-block.d.ts.map +1 -1
- package/dist/components/layout/title-block.js +18 -11
- package/dist/components/loading/card-skeleton.d.ts +6 -3
- package/dist/components/loading/card-skeleton.d.ts.map +1 -1
- package/dist/components/loading/card-skeleton.js +7 -27
- package/dist/components/loading/category-card-skeleton.d.ts.map +1 -1
- package/dist/components/loading/category-card-skeleton.js +2 -4
- package/dist/components/loading/category-vendor-selector-skeleton.d.ts +3 -1
- package/dist/components/loading/category-vendor-selector-skeleton.d.ts.map +1 -1
- package/dist/components/loading/category-vendor-selector-skeleton.js +9 -4
- package/dist/components/loading/device-card-skeleton.d.ts +18 -9
- package/dist/components/loading/device-card-skeleton.d.ts.map +1 -1
- package/dist/components/loading/device-card-skeleton.js +30 -21
- package/dist/components/loading/index.d.ts +3 -4
- package/dist/components/loading/index.d.ts.map +1 -1
- package/dist/components/loading/index.js +6 -29
- package/dist/components/loading/loading-region.d.ts +33 -0
- package/dist/components/loading/loading-region.d.ts.map +1 -0
- package/dist/components/loading/loading-region.js +22 -0
- package/dist/components/loading/margin-report-skeleton.d.ts +3 -1
- package/dist/components/loading/margin-report-skeleton.d.ts.map +1 -1
- package/dist/components/loading/margin-report-skeleton.js +70 -61
- package/dist/components/loading/msp-profile-form-skeleton.d.ts +3 -1
- package/dist/components/loading/msp-profile-form-skeleton.d.ts.map +1 -1
- package/dist/components/loading/msp-profile-form-skeleton.js +6 -5
- package/dist/components/loading/organization-card-skeleton.d.ts +3 -1
- package/dist/components/loading/organization-card-skeleton.d.ts.map +1 -1
- package/dist/components/loading/organization-card-skeleton.js +5 -5
- package/dist/components/loading/organization-icon-skeleton.d.ts.map +1 -1
- package/dist/components/loading/organization-icon-skeleton.js +2 -1
- package/dist/components/loading/page-layout-skeleton.d.ts +21 -6
- package/dist/components/loading/page-layout-skeleton.d.ts.map +1 -1
- package/dist/components/loading/page-layout-skeleton.js +283 -266
- package/dist/components/loading/settings-form-skeleton.d.ts +17 -0
- package/dist/components/loading/settings-form-skeleton.d.ts.map +1 -0
- package/dist/components/loading/settings-form-skeleton.js +42 -0
- package/dist/components/loading/unified-skeleton.d.ts +11 -4
- package/dist/components/loading/unified-skeleton.d.ts.map +1 -1
- package/dist/components/loading/unified-skeleton.js +14 -89
- package/dist/components/loading/wizard-layout-skeleton.d.ts +3 -1
- package/dist/components/loading/wizard-layout-skeleton.d.ts.map +1 -1
- package/dist/components/loading/wizard-layout-skeleton.js +3 -2
- package/dist/components/media-carousel.d.ts.map +1 -1
- package/dist/components/media-carousel.js +2 -1
- package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/booking-form.js +14 -8
- package/dist/components/meeting-scheduler/context-panel.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/context-panel.js +8 -7
- package/dist/components/meeting-scheduler/directory.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/directory.js +10 -9
- package/dist/components/meeting-scheduler/index.cjs +85 -75
- package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/index.js +3 -2
- package/dist/components/meeting-scheduler/modal-header.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/modal-header.js +8 -7
- package/dist/components/meeting-scheduler/slot-picker.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/slot-picker.js +4 -3
- package/dist/components/navigation/app-header.d.ts.map +1 -1
- package/dist/components/navigation/app-header.js +8 -7
- package/dist/components/navigation/index.cjs +19 -17
- package/dist/components/navigation/multi-level-navigation.d.ts.map +1 -1
- package/dist/components/navigation/multi-level-navigation.js +3 -2
- package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
- package/dist/components/navigation/navigation-sidebar-item.js +3 -2
- package/dist/components/onboarding-guides/index.cjs +19 -17
- package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts +4 -1
- package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.d.ts.map +1 -1
- package/dist/components/onboarding-guides/onboarding-guides-catalog-skeleton.js +12 -8
- package/dist/components/product-demo/index.cjs +16 -15
- package/dist/components/product-demo/product-screen.d.ts.map +1 -1
- package/dist/components/product-demo/product-screen.js +4 -4
- package/dist/components/profile/ProfileLoadingSkeleton.d.ts +3 -1
- package/dist/components/profile/ProfileLoadingSkeleton.d.ts.map +1 -1
- package/dist/components/profile/ProfileLoadingSkeleton.js +10 -8
- package/dist/components/related-content/index.cjs +7 -5
- package/dist/components/related-content/related-content-section.d.ts.map +1 -1
- package/dist/components/related-content/related-content-section.js +3 -2
- package/dist/components/shared/delivery/delivery-table.d.ts.map +1 -1
- package/dist/components/shared/delivery/delivery-table.js +8 -7
- package/dist/components/shared/detail-page-skeleton.d.ts +5 -1
- package/dist/components/shared/detail-page-skeleton.d.ts.map +1 -1
- package/dist/components/shared/detail-page-skeleton.js +18 -14
- package/dist/components/shared/dev-section/dev-card-row.d.ts +3 -1
- package/dist/components/shared/dev-section/dev-card-row.d.ts.map +1 -1
- package/dist/components/shared/dev-section/dev-card-row.js +22 -9
- package/dist/components/shared/legal-document/legal-document-page.d.ts.map +1 -1
- package/dist/components/shared/legal-document/legal-document-page.js +8 -7
- package/dist/components/shared/onboarding/onboarding-step-card.d.ts.map +1 -1
- package/dist/components/shared/onboarding/onboarding-step-card.js +3 -2
- package/dist/components/shared/onboarding/onboarding-walkthrough.d.ts.map +1 -1
- package/dist/components/shared/onboarding/onboarding-walkthrough.js +2 -1
- package/dist/components/shared/product-release/index.d.ts +0 -1
- package/dist/components/shared/product-release/index.d.ts.map +1 -1
- package/dist/components/shared/product-release/index.js +1 -3
- package/dist/components/shared/product-release/product-release-card-skeleton.d.ts.map +1 -1
- package/dist/components/shared/product-release/product-release-card-skeleton.js +21 -20
- package/dist/components/shared/product-release/product-releases-view.d.ts.map +1 -1
- package/dist/components/shared/product-release/product-releases-view.js +2 -1
- package/dist/components/shared/roadmap/roadmap-grid-skeleton.d.ts +6 -13
- package/dist/components/shared/roadmap/roadmap-grid-skeleton.d.ts.map +1 -1
- package/dist/components/shared/roadmap/roadmap-grid-skeleton.js +13 -25
- package/dist/components/tickets/help-center-create-form.d.ts +4 -1
- package/dist/components/tickets/help-center-create-form.d.ts.map +1 -1
- package/dist/components/tickets/help-center-create-form.js +38 -26
- package/dist/components/tickets/index.cjs +22 -20
- package/dist/components/tickets/ticket-center.d.ts.map +1 -1
- package/dist/components/tickets/ticket-center.js +13 -10
- package/dist/components/tickets/ticket-detail-drawer.d.ts.map +1 -1
- package/dist/components/tickets/ticket-detail-drawer.js +2 -1
- package/dist/components/ui/admin-form-drawer.d.ts.map +1 -1
- package/dist/components/ui/admin-form-drawer.js +6 -8
- package/dist/components/ui/admin-form-modal.d.ts.map +1 -1
- package/dist/components/ui/admin-form-modal.js +12 -11
- package/dist/components/ui/analyzing-state.d.ts +1 -1
- package/dist/components/ui/analyzing-state.d.ts.map +1 -1
- package/dist/components/ui/analyzing-state.js +4 -10
- package/dist/components/ui/content-loader.d.ts +5 -1
- package/dist/components/ui/content-loader.d.ts.map +1 -1
- package/dist/components/ui/content-loader.js +27 -23
- package/dist/components/ui/dashboard-info-card.d.ts +17 -3
- package/dist/components/ui/dashboard-info-card.d.ts.map +1 -1
- package/dist/components/ui/dashboard-info-card.js +30 -10
- package/dist/components/ui/data-attribution.d.ts +6 -0
- package/dist/components/ui/data-attribution.d.ts.map +1 -1
- package/dist/components/ui/data-attribution.js +12 -1
- package/dist/components/ui/data-table/data-table-body.d.ts +6 -1
- package/dist/components/ui/data-table/data-table-body.d.ts.map +1 -1
- package/dist/components/ui/data-table/data-table-body.js +3 -1
- package/dist/components/ui/data-table/data-table-infinite-footer.d.ts.map +1 -1
- package/dist/components/ui/data-table/data-table-infinite-footer.js +3 -1
- package/dist/components/ui/data-table/data-table-skeleton.d.ts.map +1 -1
- package/dist/components/ui/data-table/data-table-skeleton.js +7 -5
- package/dist/components/ui/feature-card.d.ts.map +1 -1
- package/dist/components/ui/feature-card.js +7 -9
- package/dist/components/ui/file-manager/file-manager-skeleton.d.ts +3 -1
- package/dist/components/ui/file-manager/file-manager-skeleton.d.ts.map +1 -1
- package/dist/components/ui/file-manager/file-manager-skeleton.js +27 -21
- package/dist/components/ui/file-manager/file-manager-table.js +10 -10
- package/dist/components/ui/file-manager/index.cjs +45 -36
- package/dist/components/ui/filter-modal.d.ts.map +1 -1
- package/dist/components/ui/filter-modal.js +5 -5
- package/dist/components/ui/filter-pill-row.d.ts +10 -0
- package/dist/components/ui/filter-pill-row.d.ts.map +1 -1
- package/dist/components/ui/filter-pill-row.js +8 -1
- package/dist/components/ui/index.cjs +19 -28
- package/dist/components/ui/index.d.ts +0 -1
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +0 -1
- package/dist/components/ui/layout-hold.d.ts +5 -4
- package/dist/components/ui/layout-hold.d.ts.map +1 -1
- package/dist/components/ui/layout-hold.js +20 -29
- package/dist/components/ui/markdown/base-components.js +1 -1
- package/dist/components/ui/page-actions.d.ts.map +1 -1
- package/dist/components/ui/page-actions.js +6 -8
- package/dist/components/ui/photo-wall.d.ts.map +1 -1
- package/dist/components/ui/photo-wall.js +11 -18
- package/dist/components/ui/query-report-table/query-report-table-skeleton.d.ts +1 -1
- package/dist/components/ui/query-report-table/query-report-table-skeleton.d.ts.map +1 -1
- package/dist/components/ui/query-report-table/query-report-table-skeleton.js +28 -18
- package/dist/components/ui/query-report-table/query-report-table.d.ts +1 -1
- package/dist/components/ui/query-report-table/query-report-table.d.ts.map +1 -1
- package/dist/components/ui/query-report-table/query-report-table.js +3 -1
- package/dist/components/ui/query-report-table/types.d.ts +4 -0
- package/dist/components/ui/query-report-table/types.d.ts.map +1 -1
- package/dist/components/ui/skeleton-surface.d.ts +7 -0
- package/dist/components/ui/skeleton-surface.d.ts.map +1 -0
- package/dist/components/ui/skeleton-surface.js +5 -0
- package/dist/components/ui/table/table-skeleton.d.ts.map +1 -1
- package/dist/components/ui/table/table-skeleton.js +11 -13
- package/dist/components/ui/test-run.d.ts +6 -4
- package/dist/components/ui/test-run.d.ts.map +1 -1
- package/dist/components/ui/test-run.js +9 -5
- package/dist/{devices-WWMXIIHI.cjs → devices-AVRQGB2N.cjs} +17 -15
- package/dist/{embeddable-chat-IJHCGQ24.cjs → embeddable-chat-SNYQSMS7.cjs} +79 -77
- package/dist/index.cjs +24 -31
- package/dist/{knowledge-JZP4RIXB.cjs → knowledge-S3CNISQH.cjs} +17 -15
- package/dist/{logs-WIRYFNUC.cjs → logs-WDLOKDXT.cjs} +24 -22
- package/dist/{policies-X7OJYA7G.cjs → policies-STML7NEZ.cjs} +20 -18
- package/dist/{remote-session-IYT4LWJC.cjs → remote-session-ZKP2W3IS.cjs} +9 -7
- package/dist/{scripts-GRMT2NGW.cjs → scripts-HO53VYGX.cjs} +23 -21
- package/dist/{software-update-G3QOB7RT.cjs → software-update-4VTK7LWQ.cjs} +20 -18
- package/dist/{tickets-board-4MT6ZB4F.cjs → tickets-board-BNW4AYFL.cjs} +11 -10
- package/package.json +1 -1
- package/src/components/categories-cart.tsx +2 -4
- package/src/components/chat/chat-container.tsx +4 -4
- package/src/components/chat/chat-context-picker.tsx +3 -2
- package/src/components/chat/chat-message-row.tsx +6 -7
- package/src/components/chat/chat-message-skeleton.tsx +11 -6
- package/src/components/chat/chat-sidebar-skeleton.tsx +4 -3
- package/src/components/chat/chat-top-navigation.tsx +4 -4
- package/src/components/chat/context-items-list.tsx +9 -3
- package/src/components/chat/entity-cards/admin-content-card-grid.tsx +65 -18
- package/src/components/chat/entity-cards/admin-content-card.tsx +2 -1
- package/src/components/chat/entity-cards/blog-card.tsx +13 -12
- package/src/components/chat/entity-cards/campaign-card-admin.tsx +5 -4
- package/src/components/chat/entity-cards/case-study-card.tsx +19 -18
- package/src/components/chat/entity-cards/chat-ticket-item.tsx +5 -5
- package/src/components/chat/entity-cards/customer-interview-card.tsx +15 -14
- package/src/components/chat/entity-cards/data-room-doc-card.tsx +7 -6
- package/src/components/chat/entity-cards/design-doc-card.tsx +0 -2
- package/src/components/chat/entity-cards/generic-entity-card.tsx +8 -7
- package/src/components/chat/entity-cards/github-activity-card.tsx +11 -10
- package/src/components/chat/entity-cards/hubspot-ticket-card.tsx +16 -15
- package/src/components/chat/entity-cards/index.ts +2 -0
- package/src/components/chat/entity-cards/investor-update-card.tsx +12 -11
- package/src/components/chat/entity-cards/onboarding-guide-card.tsx +21 -22
- package/src/components/chat/entity-cards/program-card.tsx +29 -28
- package/src/components/chat/entity-cards/roadmap-card.tsx +22 -23
- package/src/components/chat/entity-cards/slack-message-card.tsx +12 -11
- package/src/components/chat/guide-welcome.tsx +2 -2
- package/src/components/chat/mingo-archive-list.tsx +2 -1
- package/src/components/chat/mingo-chat-history.tsx +18 -9
- package/src/components/chat/mingo-chat-rail.tsx +2 -1
- package/src/components/chat/mingo-info-card.tsx +6 -5
- package/src/components/chat/mingo-onboarding-card-skeleton.tsx +15 -13
- package/src/components/chat/model-display.tsx +4 -4
- package/src/components/chat/msp-organization-card-skeleton.tsx +5 -5
- package/src/components/chat/quick-action-chip.tsx +17 -14
- package/src/components/chat/utils/compact-card-classes.ts +4 -5
- package/src/components/content-loading-container.tsx +7 -8
- package/src/components/docs/doc-viewer.tsx +3 -2
- package/src/components/docs/skeletons.tsx +64 -63
- package/src/components/embeds/embed-iframe.tsx +16 -9
- package/src/components/embeds/index.ts +2 -2
- package/src/components/embeds/linkedin-embed-client.tsx +7 -6
- package/src/components/embeds/markdown-image.tsx +5 -3
- package/src/components/embeds/og-link-preview.tsx +162 -79
- package/src/components/embeds/reddit-embed-client.tsx +10 -9
- package/src/components/embeds/twitter-embed-client.tsx +10 -9
- package/src/components/faq/faq-section.tsx +13 -6
- package/src/components/features/auth/login-form.tsx +121 -64
- package/src/components/features/auth/sso-providers.tsx +21 -0
- package/src/components/features/board/ticket-card-skeleton.tsx +8 -8
- package/src/components/features/capability-explorer.tsx +61 -30
- package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +9 -3
- package/src/components/features/devices/device-selector/device-selector.tsx +2 -0
- package/src/components/features/devices/device-selector/device-selector.types.ts +2 -0
- package/src/components/features/devices/devices-grid.tsx +4 -1
- package/src/components/features/devices/devices-panel-view.tsx +9 -1
- package/src/components/features/devices/devices-table-columns.tsx +4 -0
- package/src/components/features/logs/logs-table-view.tsx +4 -2
- package/src/components/features/model-token-rates.tsx +27 -24
- package/src/components/features/notifications/index.ts +2 -2
- package/src/components/features/notifications/notification-drawer.tsx +7 -10
- package/src/components/features/notifications/notification-tile.tsx +57 -0
- package/src/components/features/policies/policy-summary-cards.tsx +2 -2
- package/src/components/features/push-button-selector.tsx +20 -11
- package/src/components/features/remote-session/remote-desktop-view.tsx +26 -16
- package/src/components/features/waitlist-form.tsx +6 -5
- package/src/components/help-center-pages/download-apps-page.tsx +3 -2
- package/src/components/help-center-pages/trust-center-page.tsx +6 -2
- package/src/components/help-center-pages/trust-center-sections.tsx +9 -3
- package/src/components/index.ts +0 -2
- package/src/components/layout/title-block.tsx +17 -15
- package/src/components/loading/card-skeleton.tsx +14 -46
- package/src/components/loading/category-card-skeleton.tsx +2 -4
- package/src/components/loading/category-vendor-selector-skeleton.tsx +12 -5
- package/src/components/loading/device-card-skeleton.tsx +58 -51
- package/src/components/loading/index.ts +5 -19
- package/src/components/loading/loading-region.tsx +60 -0
- package/src/components/loading/margin-report-skeleton.tsx +45 -34
- package/src/components/loading/msp-profile-form-skeleton.tsx +9 -6
- package/src/components/loading/organization-card-skeleton.tsx +8 -6
- package/src/components/loading/organization-icon-skeleton.tsx +3 -2
- package/src/components/loading/page-layout-skeleton.tsx +162 -133
- package/src/components/loading/settings-form-skeleton.tsx +52 -0
- package/src/components/loading/unified-skeleton.tsx +26 -71
- package/src/components/loading/wizard-layout-skeleton.tsx +6 -3
- package/src/components/media-carousel.tsx +2 -1
- package/src/components/meeting-scheduler/booking-form.tsx +10 -7
- package/src/components/meeting-scheduler/context-panel.tsx +8 -7
- package/src/components/meeting-scheduler/directory.tsx +10 -9
- package/src/components/meeting-scheduler/index.tsx +5 -4
- package/src/components/meeting-scheduler/modal-header.tsx +8 -7
- package/src/components/meeting-scheduler/slot-picker.tsx +4 -3
- package/src/components/navigation/app-header.tsx +8 -7
- package/src/components/navigation/multi-level-navigation.tsx +3 -2
- package/src/components/navigation/navigation-sidebar-item.tsx +3 -2
- package/src/components/onboarding-guides/onboarding-guides-catalog-skeleton.tsx +17 -10
- package/src/components/product-demo/product-screen.tsx +4 -4
- package/src/components/profile/ProfileLoadingSkeleton.tsx +13 -9
- package/src/components/related-content/related-content-section.tsx +5 -4
- package/src/components/shared/delivery/delivery-table.tsx +8 -7
- package/src/components/shared/detail-page-skeleton.tsx +22 -14
- package/src/components/shared/dev-section/dev-card-row.tsx +23 -10
- package/src/components/shared/legal-document/legal-document-page.tsx +8 -7
- package/src/components/shared/onboarding/onboarding-step-card.tsx +3 -2
- package/src/components/shared/onboarding/onboarding-walkthrough.tsx +2 -1
- package/src/components/shared/product-release/index.ts +0 -1
- package/src/components/shared/product-release/product-release-card-skeleton.tsx +23 -25
- package/src/components/shared/product-release/product-releases-view.tsx +3 -2
- package/src/components/shared/roadmap/roadmap-grid-skeleton.tsx +14 -56
- package/src/components/tickets/help-center-create-form.tsx +23 -12
- package/src/components/tickets/ticket-center.tsx +17 -11
- package/src/components/tickets/ticket-detail-drawer.tsx +3 -2
- package/src/components/ui/admin-form-drawer.tsx +7 -7
- package/src/components/ui/admin-form-modal.tsx +9 -8
- package/src/components/ui/analyzing-state.tsx +5 -8
- package/src/components/ui/content-loader.tsx +31 -23
- package/src/components/ui/dashboard-info-card.tsx +81 -20
- package/src/components/ui/data-attribution.tsx +18 -0
- package/src/components/ui/data-table/data-table-body.tsx +9 -2
- package/src/components/ui/data-table/data-table-infinite-footer.tsx +4 -2
- package/src/components/ui/data-table/data-table-skeleton.tsx +8 -5
- package/src/components/ui/feature-card.tsx +27 -11
- package/src/components/ui/file-manager/file-manager-skeleton.tsx +30 -22
- package/src/components/ui/file-manager/file-manager-table.tsx +10 -10
- package/src/components/ui/filter-modal.tsx +5 -5
- package/src/components/ui/filter-pill-row.tsx +19 -0
- package/src/components/ui/index.ts +0 -1
- package/src/components/ui/layout-hold.tsx +30 -38
- package/src/components/ui/markdown/base-components.tsx +1 -1
- package/src/components/ui/page-actions.tsx +10 -8
- package/src/components/ui/photo-wall.tsx +4 -7
- package/src/components/ui/query-report-table/query-report-table-skeleton.tsx +13 -7
- package/src/components/ui/query-report-table/query-report-table.tsx +2 -0
- package/src/components/ui/query-report-table/types.ts +4 -0
- package/src/components/ui/skeleton-surface.ts +6 -0
- package/src/components/ui/table/table-skeleton.tsx +11 -13
- package/src/components/ui/test-run.tsx +30 -22
- package/src/styles/ods-colors.css +2 -2
- package/dist/chunk-5M5C6UV4.cjs +0 -125
- package/dist/components/dynamic-skeleton.d.ts +0 -108
- package/dist/components/dynamic-skeleton.d.ts.map +0 -1
- package/dist/components/dynamic-skeleton.js +0 -221
- package/dist/components/loading/content-skeleton.d.ts +0 -73
- package/dist/components/loading/content-skeleton.d.ts.map +0 -1
- package/dist/components/loading/content-skeleton.js +0 -217
- package/dist/components/loading/users-grid-skeleton.d.ts +0 -7
- package/dist/components/loading/users-grid-skeleton.d.ts.map +0 -1
- package/dist/components/loading/users-grid-skeleton.js +0 -13
- package/dist/components/shared/product-release/release-detail-skeleton.d.ts +0 -2
- package/dist/components/shared/product-release/release-detail-skeleton.d.ts.map +0 -1
- package/dist/components/shared/product-release/release-detail-skeleton.js +0 -9
- package/dist/components/skeleton.d.ts +0 -4
- package/dist/components/skeleton.d.ts.map +0 -1
- package/dist/components/skeleton.js +0 -9
- package/dist/components/ui/skeleton.d.ts +0 -44
- package/dist/components/ui/skeleton.d.ts.map +0 -1
- package/dist/components/ui/skeleton.js +0 -103
- package/dist/components/vendor-page-skeleton.d.ts +0 -2
- package/dist/components/vendor-page-skeleton.d.ts.map +0 -1
- package/dist/components/vendor-page-skeleton.js +0 -9
- package/src/components/dynamic-skeleton.tsx +0 -365
- package/src/components/loading/content-skeleton.tsx +0 -374
- package/src/components/loading/users-grid-skeleton.tsx +0 -36
- package/src/components/shared/product-release/release-detail-skeleton.tsx +0 -7
- package/src/components/skeleton.tsx +0 -8
- package/src/components/ui/skeleton.tsx +0 -173
- package/src/components/vendor-page-skeleton.tsx +0 -7
|
@@ -12,6 +12,25 @@ import { LegalLinks } from './legal-links';
|
|
|
12
12
|
import type { AuthSsoProvider } from './sso-providers';
|
|
13
13
|
import { SsoProviderButtons } from './sso-providers';
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* How a block that appears in answer to the email eases in: the prototype's fade from 4px above, short
|
|
17
|
+
* enough to read as the same card changing rather than a new one arriving.
|
|
18
|
+
*/
|
|
19
|
+
const ENTER_ANIMATION = 'animate-in fade-in-0 slide-in-from-top-1 duration-200 ease-out motion-reduce:animate-none';
|
|
20
|
+
|
|
21
|
+
/** The sign-in methods of the organization an email resolved to. */
|
|
22
|
+
export interface LoginFormTenantMethods {
|
|
23
|
+
/** Names the block ("Sign-in methods for <name>") and tags the organization's own providers. */
|
|
24
|
+
name?: string;
|
|
25
|
+
/** Its built-in OpenFrame login, offered first. */
|
|
26
|
+
openframe: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Identity providers it configured with its own credentials, tagged with `name` so they cannot be
|
|
29
|
+
* mistaken for the generic button of the same provider.
|
|
30
|
+
*/
|
|
31
|
+
providers: Exclude<AuthSsoProvider, 'openframe'>[];
|
|
32
|
+
}
|
|
33
|
+
|
|
15
34
|
export interface LoginFormProps {
|
|
16
35
|
/** Controlled email value */
|
|
17
36
|
email: string;
|
|
@@ -24,37 +43,39 @@ export interface LoginFormProps {
|
|
|
24
43
|
};
|
|
25
44
|
/** Informational status under the email field (e.g. live tenant discovery). `errors.email` wins. */
|
|
26
45
|
emailStatus?: { message: string; variant: 'error' | 'warning' | 'success' | 'muted' };
|
|
46
|
+
/** A message too long for the field's one-line status, shown in a notice row under the field. */
|
|
47
|
+
notice?: string;
|
|
27
48
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
49
|
+
* The generic providers, under the email field behind `dividerLabel`. They need nothing typed: the
|
|
50
|
+
* server resolves the organization from the identity the provider asserts. With `tenantMethods`
|
|
51
|
+
* they follow the organization's own methods; pass `[]` to offer only those.
|
|
30
52
|
*/
|
|
31
53
|
ssoProviders: AuthSsoProvider[];
|
|
32
54
|
onSsoClick?: (provider: AuthSsoProvider) => void;
|
|
33
|
-
/** Disables every provider button (e.g.
|
|
55
|
+
/** Disables every provider button (e.g. while the typed email is being looked up). */
|
|
34
56
|
ssoDisabled?: boolean;
|
|
35
|
-
/** When set, only these providers are clickable; the rest stay disabled. */
|
|
57
|
+
/** When set, only these generic providers are clickable; the rest stay disabled. */
|
|
36
58
|
ssoEnabledProviders?: AuthSsoProvider[];
|
|
37
59
|
/** Verb prefix for provider buttons, e.g. "Continue with". */
|
|
38
60
|
ssoActionLabel?: string;
|
|
39
|
-
/** Label on the divider
|
|
61
|
+
/** Label on the divider above the generic providers. */
|
|
40
62
|
dividerLabel?: string;
|
|
41
63
|
/**
|
|
42
|
-
* The
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* Three states, and the empty array is not the same as nothing: `undefined` means discovery has
|
|
47
|
-
* not resolved a tenant yet and the slot stays empty, while `[]` means it resolved and the tenant
|
|
48
|
-
* has none — which is an answer worth showing rather than silence.
|
|
64
|
+
* The organization the typed email resolved to. Its methods render above the generic block, under
|
|
65
|
+
* a heading that names it, so the switch from "any account" to "this organization's sign-in" is
|
|
66
|
+
* visible rather than a silent change of what the same buttons do.
|
|
49
67
|
*/
|
|
50
|
-
|
|
51
|
-
/** Shown in place of the custom SSO buttons when the resolved tenant has none configured. */
|
|
52
|
-
noCustomSsoLabel?: string;
|
|
68
|
+
tenantMethods?: LoginFormTenantMethods;
|
|
53
69
|
/** Primary submit under the email field. Omit the handler to hide the button. */
|
|
54
70
|
onSubmitClick?: () => void;
|
|
55
71
|
submitLabel?: string;
|
|
56
72
|
/** Disables just the primary submit (fields stay editable). */
|
|
57
73
|
submitDisabled?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Enter in the email field when there is no submit button, e.g. to look the address up now
|
|
76
|
+
* instead of after a typing pause. With `onSubmitClick` set, Enter drives that instead.
|
|
77
|
+
*/
|
|
78
|
+
onEmailEnter?: () => void;
|
|
58
79
|
/** Overrides the default heading. */
|
|
59
80
|
title?: string;
|
|
60
81
|
/** Overrides the default sub-heading. */
|
|
@@ -70,11 +91,10 @@ export interface LoginFormProps {
|
|
|
70
91
|
}
|
|
71
92
|
|
|
72
93
|
/**
|
|
73
|
-
* Login form (Login tab). Presentational + controlled — the consumer owns
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* resolves the tenant from the identity the provider asserts.
|
|
94
|
+
* Login form (Login tab). Presentational + controlled — the consumer owns state, validation and
|
|
95
|
+
* discovery. Email first, sign-in methods under it: everything that changes once the email is known
|
|
96
|
+
* sits below the field, and the block changes as a whole. Before that the generic providers are
|
|
97
|
+
* there and need nothing typed; whether they are gated is the consumer's call via `ssoDisabled`.
|
|
78
98
|
*/
|
|
79
99
|
export function LoginForm({
|
|
80
100
|
email,
|
|
@@ -84,17 +104,18 @@ export function LoginForm({
|
|
|
84
104
|
disabled = false,
|
|
85
105
|
errors,
|
|
86
106
|
emailStatus,
|
|
107
|
+
notice,
|
|
87
108
|
ssoProviders,
|
|
88
109
|
onSsoClick,
|
|
89
110
|
ssoDisabled = false,
|
|
90
111
|
ssoEnabledProviders,
|
|
91
112
|
ssoActionLabel = 'Continue with',
|
|
92
|
-
dividerLabel = 'or continue with
|
|
93
|
-
|
|
94
|
-
noCustomSsoLabel = 'No additional SSO configurations for this domain',
|
|
113
|
+
dividerLabel = 'or continue with',
|
|
114
|
+
tenantMethods,
|
|
95
115
|
onSubmitClick,
|
|
96
116
|
submitLabel = 'Continue',
|
|
97
117
|
submitDisabled = false,
|
|
118
|
+
onEmailEnter,
|
|
98
119
|
title = 'Login to OpenFrame',
|
|
99
120
|
subtitle = 'Enter your email to access your organization.',
|
|
100
121
|
termsUrl,
|
|
@@ -102,15 +123,20 @@ export function LoginForm({
|
|
|
102
123
|
className,
|
|
103
124
|
}: LoginFormProps) {
|
|
104
125
|
const fieldDisabled = disabled || loading;
|
|
126
|
+
const providersDisabled = fieldDisabled || ssoDisabled;
|
|
105
127
|
|
|
106
128
|
// Validation messages are deferred while the user is typing (shown on blur or after a pause).
|
|
107
129
|
const emailErr = useDeferredError(errors?.email, email);
|
|
108
130
|
|
|
109
|
-
// Enter drives the same action as the visible button, under the same gate. A
|
|
110
|
-
//
|
|
131
|
+
// Enter drives the same action as the visible button, under the same gate. A held key's repeats
|
|
132
|
+
// are not new presses: each would re-run an action that can fail fast (a lookup while offline).
|
|
111
133
|
const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
|
|
112
|
-
if (event.key !== 'Enter' ||
|
|
113
|
-
onSubmitClick
|
|
134
|
+
if (event.key !== 'Enter' || event.repeat || fieldDisabled) return;
|
|
135
|
+
if (onSubmitClick) {
|
|
136
|
+
if (!submitDisabled) onSubmitClick();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
onEmailEnter?.();
|
|
114
140
|
};
|
|
115
141
|
|
|
116
142
|
return (
|
|
@@ -126,21 +152,6 @@ export function LoginForm({
|
|
|
126
152
|
<p className="text-ods-text-secondary text-h4">{subtitle}</p>
|
|
127
153
|
</div>
|
|
128
154
|
|
|
129
|
-
{/* Providers come FIRST. They need nothing typed, and putting the email above them taught
|
|
130
|
-
people to fill it in before tapping one — the behaviour that made a provider button look
|
|
131
|
-
broken while it waited on a field it never needed. */}
|
|
132
|
-
{ssoProviders.length > 0 && (
|
|
133
|
-
<SsoProviderButtons
|
|
134
|
-
providers={ssoProviders}
|
|
135
|
-
onSsoClick={onSsoClick}
|
|
136
|
-
actionLabel={ssoActionLabel}
|
|
137
|
-
disabled={disabled || loading || ssoDisabled}
|
|
138
|
-
enabledProviders={ssoEnabledProviders}
|
|
139
|
-
/>
|
|
140
|
-
)}
|
|
141
|
-
|
|
142
|
-
{ssoProviders.length > 0 && <LabeledDivider label={dividerLabel} />}
|
|
143
|
-
|
|
144
155
|
{/* Email */}
|
|
145
156
|
<Input
|
|
146
157
|
type="email"
|
|
@@ -155,28 +166,21 @@ export function LoginForm({
|
|
|
155
166
|
onKeyDown={handleKeyDown}
|
|
156
167
|
/>
|
|
157
168
|
|
|
158
|
-
{
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
// at phone width, and a fixed row clipped it.
|
|
174
|
-
className="flex min-h-11 w-full items-center gap-[var(--spacing-system-m)] rounded-md bg-ods-bg-surface px-[var(--spacing-system-s)] py-[var(--spacing-system-s)] text-ods-text-secondary text-h3 md:min-h-12"
|
|
175
|
-
>
|
|
176
|
-
<AlertTriangleIcon className="h-6 w-6 shrink-0" />
|
|
177
|
-
{noCustomSsoLabel}
|
|
178
|
-
</div>
|
|
179
|
-
))}
|
|
169
|
+
{notice && (
|
|
170
|
+
// Tokens are the design's: soft-grey surface, grey text and icon, the bold-body step, a 24px
|
|
171
|
+
// icon, and 12/16 for the inset and the gap.
|
|
172
|
+
<div
|
|
173
|
+
role="status"
|
|
174
|
+
// A minimum, not a fixed height: the notice can run to several lines at phone width.
|
|
175
|
+
className={cn(
|
|
176
|
+
'flex min-h-11 w-full items-center gap-[var(--spacing-system-m)] rounded-md bg-ods-bg-surface px-[var(--spacing-system-s)] py-[var(--spacing-system-s)] text-ods-text-secondary text-h3 md:min-h-12',
|
|
177
|
+
ENTER_ANIMATION,
|
|
178
|
+
)}
|
|
179
|
+
>
|
|
180
|
+
<AlertTriangleIcon className="h-6 w-6 shrink-0" />
|
|
181
|
+
{notice}
|
|
182
|
+
</div>
|
|
183
|
+
)}
|
|
180
184
|
|
|
181
185
|
{onSubmitClick && (
|
|
182
186
|
// Full width on a phone, half the row and right-aligned from `md` up, matching the design.
|
|
@@ -197,6 +201,59 @@ export function LoginForm({
|
|
|
197
201
|
</div>
|
|
198
202
|
)}
|
|
199
203
|
|
|
204
|
+
{(tenantMethods || ssoProviders.length > 0) && (
|
|
205
|
+
// One block, so an organization's methods replace the generic set as a whole: the key mounts
|
|
206
|
+
// it anew when they arrive, and every row of it eases in, not only the rows that are new.
|
|
207
|
+
// Going back to the generic set swaps without a transition, as the prototype does.
|
|
208
|
+
<div
|
|
209
|
+
key={tenantMethods ? `tenant:${tenantMethods.name ?? ''}` : 'generic'}
|
|
210
|
+
role="group"
|
|
211
|
+
aria-label="Sign-in methods"
|
|
212
|
+
className={cn('flex flex-col gap-[var(--spacing-system-l)]', tenantMethods && ENTER_ANIMATION)}
|
|
213
|
+
>
|
|
214
|
+
{tenantMethods && (
|
|
215
|
+
<>
|
|
216
|
+
<LabeledDivider label={`Sign-in methods for ${tenantMethods.name || 'your organization'}`} />
|
|
217
|
+
{tenantMethods.openframe && (
|
|
218
|
+
// Not configured with anyone's credentials, so it carries no tag.
|
|
219
|
+
<SsoProviderButtons
|
|
220
|
+
providers={['openframe']}
|
|
221
|
+
onSsoClick={onSsoClick}
|
|
222
|
+
actionLabel={ssoActionLabel}
|
|
223
|
+
disabled={providersDisabled}
|
|
224
|
+
/>
|
|
225
|
+
)}
|
|
226
|
+
{tenantMethods.providers.length > 0 && (
|
|
227
|
+
<SsoProviderButtons
|
|
228
|
+
providers={tenantMethods.providers}
|
|
229
|
+
onSsoClick={onSsoClick}
|
|
230
|
+
actionLabel={ssoActionLabel}
|
|
231
|
+
disabled={providersDisabled}
|
|
232
|
+
tag={tenantMethods.name}
|
|
233
|
+
/>
|
|
234
|
+
)}
|
|
235
|
+
</>
|
|
236
|
+
)}
|
|
237
|
+
|
|
238
|
+
{ssoProviders.length > 0 && (
|
|
239
|
+
<>
|
|
240
|
+
{/* Under an organization heading with nothing above it, a second divider would only
|
|
241
|
+
separate the heading from its own buttons. */}
|
|
242
|
+
{(!tenantMethods || tenantMethods.openframe || tenantMethods.providers.length > 0) && (
|
|
243
|
+
<LabeledDivider label={dividerLabel} />
|
|
244
|
+
)}
|
|
245
|
+
<SsoProviderButtons
|
|
246
|
+
providers={ssoProviders}
|
|
247
|
+
onSsoClick={onSsoClick}
|
|
248
|
+
actionLabel={ssoActionLabel}
|
|
249
|
+
disabled={providersDisabled}
|
|
250
|
+
enabledProviders={ssoEnabledProviders}
|
|
251
|
+
/>
|
|
252
|
+
</>
|
|
253
|
+
)}
|
|
254
|
+
</div>
|
|
255
|
+
)}
|
|
256
|
+
|
|
200
257
|
{termsUrl && privacyPolicyUrl && <LegalLinks termsUrl={termsUrl} privacyPolicyUrl={privacyPolicyUrl} />}
|
|
201
258
|
</div>
|
|
202
259
|
);
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { requireIcon, type IconComponent } from '../../chat/utils/icon-loading';
|
|
4
4
|
import { Button } from '../../ui/button';
|
|
5
|
+
import { StatusBadge } from '../../ui/status-badge';
|
|
5
6
|
|
|
6
7
|
/** SSO providers offered on the auth forms. */
|
|
7
8
|
export type AuthSsoProvider = 'openframe' | 'google' | 'microsoft' | 'apple';
|
|
@@ -34,6 +35,12 @@ export interface SsoProviderButtonsProps {
|
|
|
34
35
|
* `disabled` still wins over this list.
|
|
35
36
|
*/
|
|
36
37
|
enabledProviders?: AuthSsoProvider[];
|
|
38
|
+
/**
|
|
39
|
+
* A stamp on every button naming who configured these providers — e.g. the organization whose
|
|
40
|
+
* own Google Workspace a "Continue with Google" button signs in through, which is not the same
|
|
41
|
+
* button as the generic one.
|
|
42
|
+
*/
|
|
43
|
+
tag?: string;
|
|
37
44
|
}
|
|
38
45
|
|
|
39
46
|
/** Stacked full-width SSO provider buttons shared by the auth forms. */
|
|
@@ -43,6 +50,7 @@ export function SsoProviderButtons({
|
|
|
43
50
|
actionLabel = 'Continue with',
|
|
44
51
|
disabled = false,
|
|
45
52
|
enabledProviders,
|
|
53
|
+
tag,
|
|
46
54
|
}: SsoProviderButtonsProps) {
|
|
47
55
|
return (
|
|
48
56
|
<div className="flex flex-col gap-[var(--spacing-system-l)]">
|
|
@@ -62,6 +70,19 @@ export function SsoProviderButtons({
|
|
|
62
70
|
onClick={() => onSsoClick?.(provider)}
|
|
63
71
|
>
|
|
64
72
|
{`${actionLabel} ${meta.name}`}
|
|
73
|
+
{tag && (
|
|
74
|
+
// A child, not `rightIcon`: the Button lays its children out through a `contents` span,
|
|
75
|
+
// so the badge is a flex item of the button itself and can give up width (`min-w-0`)
|
|
76
|
+
// where a long organization name would otherwise push the label out of a phone-width
|
|
77
|
+
// button. `block` over its inline-flex, because an ellipsis only renders on a block box.
|
|
78
|
+
<StatusBadge
|
|
79
|
+
text={tag}
|
|
80
|
+
variant="button"
|
|
81
|
+
singleLine
|
|
82
|
+
title={tag}
|
|
83
|
+
className="block min-w-0 max-w-32 truncate"
|
|
84
|
+
/>
|
|
85
|
+
)}
|
|
65
86
|
</Button>
|
|
66
87
|
);
|
|
67
88
|
})}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { type HTMLAttributes, forwardRef } from 'react';
|
|
4
4
|
import { cn } from '../../../utils/cn';
|
|
5
|
-
import {
|
|
5
|
+
import { UnifiedSkeleton } from '../../loading/unified-skeleton';
|
|
6
6
|
|
|
7
7
|
export interface TicketCardSkeletonProps extends HTMLAttributes<HTMLDivElement> {}
|
|
8
8
|
|
|
@@ -19,21 +19,21 @@ export const TicketCardSkeleton = forwardRef<HTMLDivElement, TicketCardSkeletonP
|
|
|
19
19
|
<div className="flex items-start gap-[var(--spacing-system-sf)]">
|
|
20
20
|
<div className="flex min-w-0 flex-1 flex-col gap-[var(--spacing-system-xxs)]">
|
|
21
21
|
<div className="flex items-center text-h3">
|
|
22
|
-
<
|
|
22
|
+
<UnifiedSkeleton className="h-4 w-3/4" />
|
|
23
23
|
</div>
|
|
24
24
|
<div className="flex items-center gap-[var(--spacing-system-xxs)] text-h6">
|
|
25
|
-
<
|
|
26
|
-
<
|
|
25
|
+
<UnifiedSkeleton className="size-4 shrink-0 rounded-sm" />
|
|
26
|
+
<UnifiedSkeleton className="h-3 w-1/2" />
|
|
27
27
|
</div>
|
|
28
28
|
</div>
|
|
29
29
|
<div className="flex shrink-0 items-center gap-[var(--spacing-system-xsf)]">
|
|
30
|
-
<
|
|
31
|
-
<
|
|
30
|
+
<UnifiedSkeleton className="size-4 rounded-sm" />
|
|
31
|
+
<UnifiedSkeleton className="size-8 rounded-full" />
|
|
32
32
|
</div>
|
|
33
33
|
</div>
|
|
34
34
|
<div className="flex h-8 items-center gap-[var(--spacing-system-xxs)]">
|
|
35
|
-
<
|
|
36
|
-
<
|
|
35
|
+
<UnifiedSkeleton className="h-8 w-16 rounded-md" />
|
|
36
|
+
<UnifiedSkeleton className="h-8 w-12 rounded-md" />
|
|
37
37
|
</div>
|
|
38
38
|
</div>
|
|
39
39
|
),
|
|
@@ -6,7 +6,8 @@ import { cn } from '../../utils/cn';
|
|
|
6
6
|
import { EntityIcon } from '../icon-display';
|
|
7
7
|
import { Chevron02RightIcon } from '../icons-v2-generated/arrows/chevron-02-right-icon';
|
|
8
8
|
import { CheckIcon } from '../icons-v2-generated/signs-and-symbols/check-icon';
|
|
9
|
-
import {
|
|
9
|
+
import { LoadingRegion } from '../loading/loading-region';
|
|
10
|
+
import { UnifiedSkeleton } from '../loading/unified-skeleton';
|
|
10
11
|
import { SnapCarousel, SnapCarouselControlsSkeleton } from '../ui/snap-carousel';
|
|
11
12
|
import { TruncateText } from '../ui/truncate-text';
|
|
12
13
|
|
|
@@ -167,25 +168,28 @@ function Example({
|
|
|
167
168
|
);
|
|
168
169
|
}
|
|
169
170
|
|
|
170
|
-
/**
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
</div>
|
|
176
|
-
);
|
|
177
|
-
}
|
|
171
|
+
/**
|
|
172
|
+
* A text placeholder in its line's own box (`text-h…` on the line, the bar inline in it), so a
|
|
173
|
+
* placeholder line is the loaded line's height.
|
|
174
|
+
*/
|
|
175
|
+
const LINE_SKELETON_CLASS = 'inline-block h-[0.7em] rounded align-middle';
|
|
178
176
|
|
|
179
177
|
/** The example's two turns, in the loaded example's own box. */
|
|
180
178
|
function ExampleSkeleton({ className }: { className?: string }) {
|
|
181
179
|
const turn = (first: boolean) => (
|
|
182
180
|
<div className={cn('flex min-w-0 gap-2.5', !first && 'border-t border-ods-border pt-3')}>
|
|
183
|
-
<
|
|
181
|
+
<UnifiedSkeleton className="size-6 shrink-0 rounded-full" />
|
|
184
182
|
<div className="flex min-w-0 flex-1 flex-col gap-1">
|
|
185
|
-
<
|
|
183
|
+
<div className="text-h6">
|
|
184
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-28')} />
|
|
185
|
+
</div>
|
|
186
186
|
<div className="min-h-[2lh] text-h4">
|
|
187
|
-
<
|
|
188
|
-
|
|
187
|
+
<div className="text-h4">
|
|
188
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-full')} />
|
|
189
|
+
</div>
|
|
190
|
+
<div className="text-h4">
|
|
191
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-2/3')} />
|
|
192
|
+
</div>
|
|
189
193
|
</div>
|
|
190
194
|
</div>
|
|
191
195
|
</div>
|
|
@@ -207,11 +211,15 @@ function ExampleSkeleton({ className }: { className?: string }) {
|
|
|
207
211
|
function JobHeadSkeleton() {
|
|
208
212
|
return (
|
|
209
213
|
<>
|
|
210
|
-
<
|
|
214
|
+
<UnifiedSkeleton className="size-9 shrink-0 rounded-lg" />
|
|
211
215
|
<div className="flex min-w-0 flex-1 flex-col">
|
|
212
|
-
<
|
|
216
|
+
<div className="text-h4">
|
|
217
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-32')} />
|
|
218
|
+
</div>
|
|
213
219
|
<div className="mt-0.5">
|
|
214
|
-
<
|
|
220
|
+
<div className="text-h6">
|
|
221
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-40')} />
|
|
222
|
+
</div>
|
|
215
223
|
</div>
|
|
216
224
|
</div>
|
|
217
225
|
</>
|
|
@@ -225,9 +233,18 @@ function JobHeadSkeleton() {
|
|
|
225
233
|
* first card over the carousel's controls. Every box is the loaded one's, so
|
|
226
234
|
* nothing moves when the jobs arrive.
|
|
227
235
|
*/
|
|
228
|
-
export function CapabilityExplorerSkeleton({
|
|
236
|
+
export function CapabilityExplorerSkeleton({
|
|
237
|
+
region = true,
|
|
238
|
+
className,
|
|
239
|
+
count = 8,
|
|
240
|
+
}: {
|
|
241
|
+
/** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
|
|
242
|
+
region?: boolean;
|
|
243
|
+
className?: string;
|
|
244
|
+
count?: number;
|
|
245
|
+
}) {
|
|
229
246
|
return (
|
|
230
|
-
<
|
|
247
|
+
<LoadingRegion label="Loading capabilities" announce={region} className={className}>
|
|
231
248
|
<div className="content-lg:hidden">
|
|
232
249
|
<div className="flex gap-[var(--spacing-system-sf)] overflow-hidden">
|
|
233
250
|
<div
|
|
@@ -240,10 +257,14 @@ export function CapabilityExplorerSkeleton({ className, count = 8 }: { className
|
|
|
240
257
|
<JobHeadSkeleton />
|
|
241
258
|
</div>
|
|
242
259
|
<div className="min-h-[3lh] text-h6">
|
|
243
|
-
<
|
|
244
|
-
|
|
260
|
+
<div className="text-h6">
|
|
261
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-full')} />
|
|
262
|
+
</div>
|
|
263
|
+
<div className="text-h6">
|
|
264
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-5/6')} />
|
|
265
|
+
</div>
|
|
245
266
|
</div>
|
|
246
|
-
<
|
|
267
|
+
<UnifiedSkeleton className="h-[300px] shrink-0 rounded-lg" />
|
|
247
268
|
<ExampleSkeleton className="shrink-0" />
|
|
248
269
|
</div>
|
|
249
270
|
</div>
|
|
@@ -273,36 +294,46 @@ export function CapabilityExplorerSkeleton({ className, count = 8 }: { className
|
|
|
273
294
|
<div className={cn('grid shrink-0 grid-cols-[minmax(0,1fr)_minmax(0,380px)] gap-8', PANEL_TOP_HEIGHT_CLASS)}>
|
|
274
295
|
<div className="flex min-w-0 flex-col overflow-hidden">
|
|
275
296
|
<div className="mb-2">
|
|
276
|
-
<
|
|
297
|
+
<div className="text-h2">
|
|
298
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-64')} />
|
|
299
|
+
</div>
|
|
277
300
|
</div>
|
|
278
301
|
<div className="min-h-[3lh] text-h4">
|
|
279
|
-
<
|
|
280
|
-
|
|
302
|
+
<div className="text-h4">
|
|
303
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-full')} />
|
|
304
|
+
</div>
|
|
305
|
+
<div className="text-h4">
|
|
306
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-4/5')} />
|
|
307
|
+
</div>
|
|
281
308
|
</div>
|
|
282
309
|
<div className="mt-auto grid grid-cols-1 gap-2">
|
|
283
310
|
{[0, 1, 2].map(i => (
|
|
284
311
|
<div key={i} className="flex min-w-0 items-center gap-2.5">
|
|
285
|
-
<
|
|
286
|
-
<
|
|
312
|
+
<UnifiedSkeleton className="size-4 shrink-0 rounded-full" />
|
|
313
|
+
<div className="text-h6">
|
|
314
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, i === 1 ? 'w-56' : 'w-48')} />
|
|
315
|
+
</div>
|
|
287
316
|
</div>
|
|
288
317
|
))}
|
|
289
318
|
</div>
|
|
290
319
|
</div>
|
|
291
320
|
<ExampleSkeleton />
|
|
292
321
|
</div>
|
|
293
|
-
<
|
|
322
|
+
<UnifiedSkeleton className={cn('shrink-0 rounded-xl', PANEL_SCREEN_HEIGHT_CLASS)} />
|
|
294
323
|
<div
|
|
295
324
|
className={cn(
|
|
296
325
|
'flex min-w-0 shrink-0 items-center gap-[var(--spacing-system-sf)]',
|
|
297
326
|
PANEL_FOOTER_HEIGHT_CLASS,
|
|
298
327
|
)}
|
|
299
328
|
>
|
|
300
|
-
<
|
|
301
|
-
|
|
329
|
+
<div className="text-h5">
|
|
330
|
+
<UnifiedSkeleton as="span" className={cn(LINE_SKELETON_CLASS, 'w-16')} />
|
|
331
|
+
</div>
|
|
332
|
+
<UnifiedSkeleton className="h-7 w-36 rounded-md" />
|
|
302
333
|
</div>
|
|
303
334
|
</div>
|
|
304
335
|
</div>
|
|
305
|
-
</
|
|
336
|
+
</LoadingRegion>
|
|
306
337
|
);
|
|
307
338
|
}
|
|
308
339
|
|
|
@@ -10,7 +10,13 @@ const NO_DEVICES: never[] = [];
|
|
|
10
10
|
* whichever the caller hands its real `DeviceSelector` it must hand this one too,
|
|
11
11
|
* or the two disagree on how tall the block is.
|
|
12
12
|
*/
|
|
13
|
-
type DeviceSelectorSkeletonProps = Pick<
|
|
13
|
+
type DeviceSelectorSkeletonProps = Pick<
|
|
14
|
+
DeviceSelectorProps,
|
|
15
|
+
'showSelectionModeRadio' | 'singleSelect' | 'hideColumns'
|
|
16
|
+
> & {
|
|
17
|
+
/** The loading state announces itself (`LoadingRegion`). `false` inside another loading region. Default `true`. */
|
|
18
|
+
region?: boolean;
|
|
19
|
+
};
|
|
14
20
|
|
|
15
21
|
/**
|
|
16
22
|
* Suspense fallback for a `DeviceSelector` whose devices come from a suspending
|
|
@@ -27,6 +33,6 @@ type DeviceSelectorSkeletonProps = Pick<DeviceSelectorProps, 'showSelectionModeR
|
|
|
27
33
|
* stands in for, and everything below it jumped down the moment the devices
|
|
28
34
|
* landed.
|
|
29
35
|
*/
|
|
30
|
-
export function DeviceSelectorSkeleton(props: DeviceSelectorSkeletonProps) {
|
|
31
|
-
return <DeviceSelector {...props} devices={NO_DEVICES} loading disabled />;
|
|
36
|
+
export function DeviceSelectorSkeleton({ region = true, ...props }: DeviceSelectorSkeletonProps) {
|
|
37
|
+
return <DeviceSelector {...props} devices={NO_DEVICES} loading loadingRegion={region} disabled />;
|
|
32
38
|
}
|
|
@@ -94,6 +94,7 @@ function CustomerCell({ device }: { device: DeviceRow }) {
|
|
|
94
94
|
export function DeviceSelector<T extends DeviceRow = DeviceRow>({
|
|
95
95
|
devices,
|
|
96
96
|
loading,
|
|
97
|
+
loadingRegion,
|
|
97
98
|
selectedIds: selectedIdsProp,
|
|
98
99
|
onSelectionChange: onSelectionChangeProp,
|
|
99
100
|
getDeviceKey: getDeviceKeyProp,
|
|
@@ -708,6 +709,7 @@ export function DeviceSelector<T extends DeviceRow = DeviceRow>({
|
|
|
708
709
|
)}
|
|
709
710
|
<DataTable.Body
|
|
710
711
|
loading={loading}
|
|
712
|
+
loadingRegion={loadingRegion}
|
|
711
713
|
skeletonRows={8}
|
|
712
714
|
emptyMessage={
|
|
713
715
|
isCriteria
|
|
@@ -68,6 +68,8 @@ export interface DeviceSelectorProps<T extends DeviceRow = DeviceRow> {
|
|
|
68
68
|
devices: T[];
|
|
69
69
|
/** Whether the device list is loading. */
|
|
70
70
|
loading: boolean;
|
|
71
|
+
/** The loading state announces itself ("Loading results"). `false` inside another loading region. Default `true`. */
|
|
72
|
+
loadingRegion?: boolean;
|
|
71
73
|
/**
|
|
72
74
|
* Currently selected device keys. Optional so a skeleton can render the real
|
|
73
75
|
* picker with nothing selected, the component falls back to an empty set and
|
|
@@ -16,6 +16,8 @@ export interface DevicesGridProps<T extends DeviceRow = DeviceRow> {
|
|
|
16
16
|
isFetchingNextPage?: boolean;
|
|
17
17
|
sentinelRef?: React.RefObject<HTMLDivElement | null>;
|
|
18
18
|
emptyMessage?: string;
|
|
19
|
+
/** The loading state announces itself ("Loading devices"). `false` inside another loading region. Default `true`. */
|
|
20
|
+
loadingRegion?: boolean;
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
export function DevicesGrid<T extends DeviceRow = DeviceRow>({
|
|
@@ -25,6 +27,7 @@ export function DevicesGrid<T extends DeviceRow = DeviceRow>({
|
|
|
25
27
|
isFetchingNextPage,
|
|
26
28
|
sentinelRef,
|
|
27
29
|
emptyMessage = 'No devices found. Try adjusting your search or filters.',
|
|
30
|
+
loadingRegion = true,
|
|
28
31
|
}: DevicesGridProps<T>) {
|
|
29
32
|
const router = useRouter();
|
|
30
33
|
const { getDeviceHref } = useDevicesViewConfig();
|
|
@@ -37,7 +40,7 @@ export function DevicesGrid<T extends DeviceRow = DeviceRow>({
|
|
|
37
40
|
return (
|
|
38
41
|
<div className="space-y-4">
|
|
39
42
|
{isLoading && devices.length === 0 ? (
|
|
40
|
-
<DeviceCardSkeletonGrid count={12} />
|
|
43
|
+
<DeviceCardSkeletonGrid count={12} region={loadingRegion} />
|
|
41
44
|
) : devices.length === 0 ? (
|
|
42
45
|
<div className="flex h-64 items-center justify-center rounded-[6px] border border-ods-border bg-ods-card">
|
|
43
46
|
<p className="text-ods-text-secondary">{emptyMessage}</p>
|
|
@@ -70,6 +70,11 @@ export interface DevicesPanelViewProps<T extends DeviceRow = DeviceRow> {
|
|
|
70
70
|
* are the real ones, locked, and only the rows are skeletons.
|
|
71
71
|
*/
|
|
72
72
|
loading?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* The loading state announces itself, once ("Loading devices…"; the table or grid inside it stays quiet).
|
|
75
|
+
* `false` inside another loading region. Default `true`.
|
|
76
|
+
*/
|
|
77
|
+
loadingRegion?: boolean;
|
|
73
78
|
/** The rows on screen answer the previous narrowing while the next loads: dimmed, not replaced. */
|
|
74
79
|
isNarrowing?: boolean;
|
|
75
80
|
/** Server-side total for the current narrowing. */
|
|
@@ -127,6 +132,7 @@ export function DevicesPanelView<T extends DeviceRow = DeviceRow>({
|
|
|
127
132
|
actions,
|
|
128
133
|
devices,
|
|
129
134
|
loading = false,
|
|
135
|
+
loadingRegion = true,
|
|
130
136
|
isNarrowing = false,
|
|
131
137
|
totalCount,
|
|
132
138
|
deviceFilters = null,
|
|
@@ -157,6 +163,7 @@ export function DevicesPanelView<T extends DeviceRow = DeviceRow>({
|
|
|
157
163
|
<DevicesTableBody
|
|
158
164
|
devices={devices}
|
|
159
165
|
isLoading={loading}
|
|
166
|
+
loadingRegion={false}
|
|
160
167
|
emptyMessage={loading ? '' : emptyMessage}
|
|
161
168
|
skeletonRows={10}
|
|
162
169
|
stickyHeaderOffset="top-[96px]"
|
|
@@ -198,6 +205,7 @@ export function DevicesPanelView<T extends DeviceRow = DeviceRow>({
|
|
|
198
205
|
<DevicesGrid
|
|
199
206
|
devices={devices}
|
|
200
207
|
isLoading={loading}
|
|
208
|
+
loadingRegion={false}
|
|
201
209
|
hasNextPage={hasNextPage}
|
|
202
210
|
isFetchingNextPage={isFetchingNextPage}
|
|
203
211
|
sentinelRef={gridSentinelRef}
|
|
@@ -227,7 +235,7 @@ export function DevicesPanelView<T extends DeviceRow = DeviceRow>({
|
|
|
227
235
|
contentClassName="flex flex-col"
|
|
228
236
|
>
|
|
229
237
|
{headerSlot}
|
|
230
|
-
{loading && (
|
|
238
|
+
{loading && loadingRegion && (
|
|
231
239
|
<span role="status" className="sr-only">
|
|
232
240
|
Loading devices…
|
|
233
241
|
</span>
|