@kortix/ui 0.14.8 → 0.14.10
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/README.md +2 -2
- package/dist/_vendor/kortix-shared.js +116 -3
- package/dist/_vendor/shared/app-config.d.ts +175 -0
- package/dist/_vendor/shared/artifact-comments.d.ts +235 -0
- package/dist/_vendor/shared/channel-descriptors.d.ts +96 -0
- package/dist/_vendor/shared/channel-message.d.ts +45 -5
- package/dist/_vendor/shared/index.d.ts +2 -0
- package/dist/_vendor/shared/space-slug.d.ts +37 -0
- package/dist/access/access/access-detail-shell.js +1 -1
- package/dist/access/access/principal-picker.d.ts +11 -0
- package/dist/access/access/principal-picker.js +3 -2
- package/dist/apps/app-preview-pool.d.ts +7 -2
- package/dist/apps/app-preview-pool.js +30 -7
- package/dist/apps/app-shared.d.ts +22 -15
- package/dist/apps/app-shared.js +37 -19
- package/dist/apps/index.d.ts +2 -2
- package/dist/apps/index.js +2 -2
- package/dist/artifacts/artifact-frame.d.ts +16 -0
- package/dist/artifacts/artifact-frame.js +55 -0
- package/dist/artifacts/artifact-session.d.ts +18 -0
- package/dist/artifacts/artifact-session.js +101 -0
- package/dist/artifacts/frame-policy.d.ts +30 -0
- package/dist/artifacts/frame-policy.js +61 -0
- package/dist/artifacts/index.d.ts +3 -0
- package/dist/artifacts/index.js +5 -0
- package/dist/browser/sandbox-browser-chrome.d.ts +4 -1
- package/dist/browser/sandbox-browser-chrome.js +2 -2
- package/dist/customize/agents/agent-grant-pages.d.ts +5 -1
- package/dist/customize/agents/agent-grant-pages.js +30 -4
- package/dist/customize/agents/agent-page.js +3 -1
- package/dist/customize/agents/agent-policy-sets.d.ts +43 -0
- package/dist/customize/agents/agent-policy-sets.js +72 -0
- package/dist/customize/agents/agent-triggers-section.js +2 -1
- package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.d.ts +6 -1
- package/dist/customize/connectors/add-mcp/add-mcp-server-dialog.js +10 -4
- package/dist/customize/connectors/agent-access.d.ts +35 -0
- package/dist/customize/connectors/agent-access.js +77 -0
- package/dist/customize/connectors/catalog/browse-sections.d.ts +2 -29
- package/dist/customize/connectors/catalog/browse-sections.js +7 -74
- package/dist/customize/connectors/catalog/catalog-entry.d.ts +18 -37
- package/dist/customize/connectors/catalog/catalog-entry.js +28 -40
- package/dist/customize/connectors/catalog/connector-browse.d.ts +3 -32
- package/dist/customize/connectors/catalog/connector-browse.js +19 -50
- package/dist/customize/connectors/catalog/use-catalog.d.ts +20 -59
- package/dist/customize/connectors/catalog/use-catalog.js +48 -175
- package/dist/customize/connectors/connector-identity.d.ts +9 -11
- package/dist/customize/connectors/connector-identity.js +13 -42
- package/dist/customize/connectors/connector-moves-banner.d.ts +2 -1
- package/dist/customize/connectors/connector-moves-banner.js +4 -6
- package/dist/customize/connectors/connector-routes.d.ts +21 -9
- package/dist/customize/connectors/connector-routes.js +29 -20
- package/dist/customize/connectors/connectors-page.js +53 -82
- package/dist/customize/connectors/detail/app-page.js +226 -98
- package/dist/customize/connectors/detail/computer-app-page.d.ts +16 -0
- package/dist/customize/connectors/detail/computer-app-page.js +39 -0
- package/dist/customize/connectors/detail/connector-accounts.js +3 -1
- package/dist/customize/connectors/detail/connector-advanced-tools.d.ts +4 -1
- package/dist/customize/connectors/detail/connector-advanced-tools.js +2 -2
- package/dist/customize/connectors/detail/connector-agents.d.ts +14 -0
- package/dist/customize/connectors/detail/connector-agents.js +69 -0
- package/dist/customize/connectors/detail/connector-detail-tabs.js +2 -1
- package/dist/customize/connectors/detail/connector-move-row.d.ts +8 -5
- package/dist/customize/connectors/detail/connector-move-row.js +23 -14
- package/dist/customize/connectors/detail/connector-page.d.ts +4 -1
- package/dist/customize/connectors/detail/connector-page.js +14 -10
- package/dist/customize/connectors/detail/connector-policy-sets.d.ts +28 -0
- package/dist/customize/connectors/detail/connector-policy-sets.js +203 -0
- package/dist/customize/connectors/detail/connector-settings.d.ts +4 -1
- package/dist/customize/connectors/detail/connector-settings.js +7 -3
- package/dist/customize/connectors/detail/connector-status.d.ts +19 -6
- package/dist/customize/connectors/detail/connector-status.js +34 -10
- package/dist/customize/connectors/detail/connector-tabs.d.ts +4 -1
- package/dist/customize/connectors/detail/connector-tabs.js +8 -2
- package/dist/customize/connectors/detail/connector-tools.d.ts +3 -3
- package/dist/customize/connectors/detail/connector-tools.js +105 -48
- package/dist/customize/connectors/detail/email-inboxes.d.ts +43 -0
- package/dist/customize/connectors/detail/email-inboxes.js +184 -0
- package/dist/customize/connectors/detail/provider-info.d.ts +1 -1
- package/dist/customize/connectors/detail/provider-info.js +2 -2
- package/dist/customize/connectors/detail/status-badge.d.ts +1 -1
- package/dist/customize/connectors/detail/status-badge.js +4 -5
- package/dist/customize/connectors/detail/use-connector-detail.d.ts +6 -0
- package/dist/customize/connectors/detail/use-connector-detail.js +14 -4
- package/dist/customize/connectors/install/install-dialog.d.ts +23 -0
- package/dist/customize/connectors/install/install-dialog.js +40 -0
- package/dist/customize/connectors/install/install.d.ts +13 -2
- package/dist/customize/connectors/install/install.js +9 -4
- package/dist/customize/connectors/install/use-install.d.ts +19 -2
- package/dist/customize/connectors/install/use-install.js +65 -37
- package/dist/customize/connectors/install/way-kind.d.ts +5 -0
- package/dist/customize/connectors/install/way-kind.js +16 -0
- package/dist/customize/connectors/provider-label.d.ts +2 -1
- package/dist/customize/connectors/provider-label.js +13 -3
- package/dist/customize/connectors/tools/pattern-rule-draft.d.ts +4 -0
- package/dist/customize/connectors/tools/pattern-rule-draft.js +12 -3
- package/dist/customize/connectors/tools/policy-sets.d.ts +27 -0
- package/dist/customize/connectors/tools/policy-sets.js +41 -0
- package/dist/customize/connectors/tools/tool-groups.d.ts +32 -9
- package/dist/customize/connectors/tools/tool-groups.js +78 -16
- package/dist/customize/connectors/tools/tool-policy-control.d.ts +11 -10
- package/dist/customize/connectors/tools/tool-policy-control.js +15 -16
- package/dist/customize/connectors/tools/tool-policy-labels.d.ts +6 -5
- package/dist/customize/connectors/tools/tool-policy-labels.js +17 -16
- package/dist/customize/connectors/tools/tool-policy.d.ts +50 -4
- package/dist/customize/connectors/tools/tool-policy.js +74 -8
- package/dist/customize/connectors/use-agent-access.d.ts +85 -0
- package/dist/customize/connectors/use-agent-access.js +72 -0
- package/dist/customize/migrate-to-v2/index.d.ts +1 -2
- package/dist/customize/migrate-to-v2/index.js +1 -2
- package/dist/customize/migrate-to-v2/migration-prompt.d.ts +12 -25
- package/dist/customize/migrate-to-v2/migration-prompt.js +34 -236
- package/dist/customize/migrate-to-v2/upgrade-defs.d.ts +1 -1
- package/dist/customize/migrate-to-v2/upgrade-defs.js +7 -6
- package/dist/customize/migrate-to-v2/upgrade-view.js +7 -7
- package/dist/customize/migrate-to-v2/use-run-upgrade.d.ts +3 -3
- package/dist/customize/providers/provider-accordion.js +17 -2
- package/dist/customize/sections/component/channel-access-panel.d.ts +16 -0
- package/dist/customize/sections/component/channel-access-panel.js +146 -0
- package/dist/customize/sections/component/channel-connect-hero.d.ts +3 -2
- package/dist/customize/sections/component/channel-connect-hero.js +3 -2
- package/dist/customize/sections/component/channel-hero-frame.d.ts +31 -0
- package/dist/customize/sections/component/channel-hero-frame.js +40 -0
- package/dist/customize/sections/component/channel-mocks.d.ts +6 -0
- package/dist/customize/sections/component/channel-mocks.js +46 -0
- package/dist/customize/sections/component/channel-row.d.ts +13 -3
- package/dist/customize/sections/component/channel-row.js +10 -4
- package/dist/customize/sections/component/email-connect-form.d.ts +27 -0
- package/dist/customize/sections/component/email-connect-form.js +183 -0
- package/dist/customize/sections/component/slack-connect-card.d.ts +7 -0
- package/dist/customize/sections/component/slack-connect-card.js +2 -3
- package/dist/customize/sections/component/teams-connect-card.d.ts +7 -0
- package/dist/customize/sections/component/teams-connect-card.js +2 -3
- package/dist/customize/sections/component/telegram-channel-row.js +21 -28
- package/dist/customize/sections/connectors-view.d.ts +1 -15
- package/dist/customize/sections/connectors-view.js +81 -314
- package/dist/customize/sections/view/agent-editor-catalog.js +10 -0
- package/dist/customize/sections/view/channels-view.d.ts +6 -1
- package/dist/customize/sections/view/channels-view.js +72 -81
- package/dist/customize/sections/view/gateway/gateway-overview.js +10 -2
- package/dist/customize/settings/rail.js +9 -0
- package/dist/customize/settings/settings-tabs.d.ts +1 -1
- package/dist/customize/settings/settings-tabs.js +1 -0
- package/dist/customize/settings/tabs/chrome-connections-tab.d.ts +6 -0
- package/dist/customize/settings/tabs/chrome-connections-tab.js +99 -0
- package/dist/customize/settings/tabs/experimental-tab.js +35 -16
- package/dist/customize/shared/catalog/catalog-empty-state.d.ts +4 -15
- package/dist/customize/shared/catalog/catalog-empty-state.js +9 -7
- package/dist/customize/shared/channels-switch-dialog.d.ts +18 -0
- package/dist/customize/shared/channels-switch-dialog.js +30 -0
- package/dist/customize/shared/feature-gate-screen.js +27 -9
- package/dist/customize/shared/use-customize-prefetch.d.ts +2 -3
- package/dist/customize/shared/use-customize-prefetch.js +9 -27
- package/dist/customize/triggers/schedule/post-to-field.d.ts +18 -0
- package/dist/customize/triggers/schedule/post-to-field.js +49 -0
- package/dist/customize/triggers/schedule/schedule-copy.d.ts +10 -6
- package/dist/customize/triggers/schedule/schedule-copy.js +42 -11
- package/dist/customize/triggers/schedule/schedule-detail-sheet.js +2 -1
- package/dist/customize/triggers/schedule/trigger-composer-logic.d.ts +22 -0
- package/dist/customize/triggers/schedule/trigger-composer-logic.js +25 -0
- package/dist/customize/triggers/schedule/trigger-composer.d.ts +5 -0
- package/dist/customize/triggers/schedule/trigger-composer.js +23 -14
- package/dist/customize/triggers/schedule/trigger-edit-logic.js +3 -0
- package/dist/customize/triggers/schedule/trigger-filter.js +1 -1
- package/dist/customize/triggers/schedule/trigger-runs-logic.d.ts +2 -2
- package/dist/customize/triggers/schedule/trigger-runs-panel.js +1 -0
- package/dist/customize/triggers/schedule/trigger-toast.js +2 -1
- package/dist/customize/triggers/schedule-view.js +5 -2
- package/dist/files/index.d.ts +1 -0
- package/dist/files/index.js +1 -0
- package/dist/files/project/change-request-recovery.d.ts +1 -26
- package/dist/files/project/change-request-recovery.js +1 -59
- package/dist/files/project/components/change-request-detail-dialog.js +13 -3
- package/dist/files/project/components/drive-explorer.js +15 -15
- package/dist/files/project/components/drive-toolbar.d.ts +16 -2
- package/dist/files/project/components/drive-toolbar.js +14 -5
- package/dist/files/project/hooks/use-change-request-recovery.js +3 -19
- package/dist/files/project/hooks/use-change-requests.d.ts +1 -0
- package/dist/files/project/hooks/use-change-requests.js +11 -2
- package/dist/files/renderers/image-frame.d.ts +48 -0
- package/dist/files/renderers/image-frame.js +59 -0
- package/dist/files/renderers/image-renderer.d.ts +11 -1
- package/dist/files/renderers/image-renderer.js +13 -3
- package/dist/files/renderers/pdf/pdf-clipboard.d.ts +2 -0
- package/dist/files/renderers/pdf/pdf-clipboard.js +21 -0
- package/dist/files/renderers/pdf/pdf-viewer.js +4 -2
- package/dist/files/renderers/show-content-renderer.d.ts +9 -1
- package/dist/files/renderers/show-content-renderer.js +56 -14
- package/dist/files/runtime/file-source.js +2 -0
- package/dist/files/runtime/hooks/use-binary-blob.d.ts +10 -1
- package/dist/files/runtime/hooks/use-binary-blob.js +10 -4
- package/dist/files/runtime/hooks/use-shared-image.d.ts +41 -0
- package/dist/files/runtime/hooks/use-shared-image.js +177 -0
- package/dist/files/viewer/file-content-renderer.d.ts +22 -1
- package/dist/files/viewer/file-content-renderer.js +50 -7
- package/dist/files/viewer/file-header.d.ts +7 -3
- package/dist/files/viewer/file-header.js +20 -11
- package/dist/files/viewer/file-preview-modal.d.ts +1 -1
- package/dist/files/viewer/file-preview-modal.js +10 -22
- package/dist/files/viewer/file-source.d.ts +13 -0
- package/dist/files/viewer/use-file-content-state.d.ts +2 -0
- package/dist/files/viewer/use-file-content-state.js +28 -10
- package/dist/files/viewer/viewer-actions.d.ts +3 -1
- package/dist/files/viewer/viewer-actions.js +2 -2
- package/dist/hooks/use-media-query.d.ts +1 -0
- package/dist/hooks/use-mobile.d.ts +5 -0
- package/dist/hooks/use-mobile.js +8 -0
- package/dist/i18n/en.d.ts +1062 -85
- package/dist/i18n/en.js +1078 -101
- package/dist/i18n/ui-catalog/localize-ui-catalog.js +4 -0
- package/dist/i18n/ui-catalog/remaining-ui-translation-keys.generated.js +15 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/internal/account-hub/account-settings-sidebar.js +1 -1
- package/dist/internal/account-hub/hub-sheet.d.ts +9 -1
- package/dist/internal/account-hub/hub-sheet.js +21 -5
- package/dist/internal/account-hub/sections.d.ts +1 -1
- package/dist/internal/account-hub/sections.js +2 -1
- package/dist/internal/apps-and-extensions/apps-modal.d.ts +9 -0
- package/dist/internal/apps-and-extensions/apps-modal.js +107 -0
- package/dist/internal/auth/auth-card-shell.js +3 -3
- package/dist/internal/chrome/browser-icon.d.ts +24 -0
- package/dist/internal/chrome/browser-icon.js +58 -0
- package/dist/internal/chrome/chrome-card-state.d.ts +16 -0
- package/dist/internal/chrome/chrome-card-state.js +9 -0
- package/dist/internal/chrome/chrome-connect.d.ts +69 -0
- package/dist/internal/chrome/chrome-connect.js +178 -0
- package/dist/internal/chrome/chrome-mock.d.ts +4 -0
- package/dist/internal/chrome/chrome-mock.js +15 -0
- package/dist/internal/chrome/chrome-names.d.ts +15 -0
- package/dist/internal/chrome/chrome-names.js +35 -0
- package/dist/internal/chrome/extension.d.ts +47 -0
- package/dist/internal/chrome/extension.js +91 -0
- package/dist/internal/chrome/use-chrome-offered.d.ts +11 -0
- package/dist/internal/chrome/use-chrome-offered.js +22 -0
- package/dist/internal/components/agent-mark.js +5 -2
- package/dist/internal/connector-logo/connector-logo-source.d.ts +64 -0
- package/dist/internal/connector-logo/connector-logo-source.js +49 -0
- package/dist/internal/connector-logo/connector-logo.d.ts +39 -0
- package/dist/internal/connector-logo/connector-logo.js +56 -0
- package/dist/internal/connector-logo/connector-mark-files.d.ts +11 -0
- package/dist/internal/connector-logo/connector-mark-files.js +35 -0
- package/dist/internal/files/file-read-retry.d.ts +13 -0
- package/dist/internal/files/file-read-retry.js +23 -3
- package/dist/internal/files/session-drive-files.d.ts +5 -1
- package/dist/internal/files/session-drive-files.js +7 -2
- package/dist/internal/hooks/channels/use-channels-installations.d.ts +32 -5
- package/dist/internal/hooks/channels/use-channels-installations.js +55 -7
- package/dist/internal/hooks/channels/use-email-inboxes.d.ts +19 -0
- package/dist/internal/hooks/channels/use-email-inboxes.js +48 -0
- package/dist/internal/hooks/connectors/use-add-account.js +1 -1
- package/dist/internal/hooks/index.d.ts +1 -1
- package/dist/internal/hooks/index.js +1 -1
- package/dist/internal/hooks/projects/use-new-project-session.d.ts +9 -0
- package/dist/internal/hooks/projects/use-new-project-session.js +28 -12
- package/dist/internal/hooks/use-auto-scroll.d.ts +8 -1
- package/dist/internal/hooks/use-auto-scroll.js +4 -4
- package/dist/internal/icons/edge.d.ts +5 -0
- package/dist/internal/icons/edge.js +10 -0
- package/dist/internal/icons/telegram.d.ts +5 -0
- package/dist/internal/icons/telegram.js +6 -1
- package/dist/internal/layout/nav-hover-card.d.ts +35 -0
- package/dist/internal/layout/nav-hover-card.js +84 -0
- package/dist/internal/layout/project-nav-row.d.ts +3 -1
- package/dist/internal/layout/project-nav-row.js +3 -2
- package/dist/internal/layout/project-page-header.d.ts +4 -2
- package/dist/internal/layout/project-page-header.js +4 -3
- package/dist/internal/layout/project-settings-nav.js +59 -2
- package/dist/internal/lib/browser-error-noise.d.ts +1 -1
- package/dist/internal/lib/browser-error-noise.js +1 -1
- package/dist/internal/lib/browser-noise/rules/extensions.js +17 -3
- package/dist/internal/lib/browser-noise/rules/injected-scripts.d.ts +7 -0
- package/dist/internal/lib/browser-noise/rules/injected-scripts.js +15 -0
- package/dist/internal/lib/detect-os.d.ts +43 -0
- package/dist/internal/lib/detect-os.js +70 -0
- package/dist/internal/lib/manifest-version.d.ts +1 -1
- package/dist/internal/lib/manifest-version.js +2 -2
- package/dist/internal/lib/memory-href.d.ts +16 -0
- package/dist/internal/lib/memory-href.js +46 -0
- package/dist/internal/lib/use-project-feature-flags.js +13 -9
- package/dist/internal/lib/utils/heic-convert.d.ts +1 -1
- package/dist/internal/lib/utils/heic-convert.js +3 -4
- package/dist/internal/lib/web-notifications.d.ts +20 -0
- package/dist/internal/lib/web-notifications.js +48 -4
- package/dist/internal/notifications/notification-bell.d.ts +4 -1
- package/dist/internal/notifications/notification-bell.js +2 -2
- package/dist/internal/selection/selection-bar.d.ts +2 -1
- package/dist/internal/selection/selection-bar.js +1 -1
- package/dist/internal/stores/apps-modal-store.d.ts +8 -0
- package/dist/internal/stores/apps-modal-store.js +6 -0
- package/dist/internal/stores/composer-prefill-store.d.ts +12 -5
- package/dist/internal/stores/file-preview-store.d.ts +29 -2
- package/dist/internal/stores/file-preview-store.js +19 -1
- package/dist/internal/stores/kortix-computer-store.js +3 -0
- package/dist/internal/stores/sidebar-nav-store.d.ts +1 -1
- package/dist/internal/stores/sidebar-nav-store.js +3 -1
- package/dist/lib/routes.d.ts +13 -1
- package/dist/lib/routes.js +13 -0
- package/dist/markdown/index.d.ts +2 -1
- package/dist/markdown/index.js +2 -1
- package/dist/markdown/setup-links/approval-decision.d.ts +1 -0
- package/dist/markdown/setup-links/approval-decision.js +9 -3
- package/dist/markdown/setup-links/connector-handshake.d.ts +3 -1
- package/dist/markdown/setup-links/connector-handshake.js +12 -10
- package/dist/markdown/setup-links/secret-intake-form.d.ts +0 -10
- package/dist/markdown/setup-links/secret-intake-form.js +1 -1
- package/dist/markdown/setup-links/show-connect-hero.d.ts +28 -0
- package/dist/markdown/setup-links/show-connect-hero.js +91 -0
- package/dist/markdown/unified-markdown.js +5 -5
- package/dist/primitives/badge.d.ts +1 -1
- package/dist/primitives/badge.js +2 -0
- package/dist/primitives/disclosure.js +14 -2
- package/dist/primitives/empty-art.d.ts +12 -0
- package/dist/primitives/empty-art.js +11 -0
- package/dist/primitives/empty-state.d.ts +2 -2
- package/dist/primitives/empty-state.js +6 -5
- package/dist/primitives/mermaid-renderer.d.ts +2 -0
- package/dist/primitives/mermaid-renderer.js +21 -15
- package/dist/primitives/resizable.js +6 -1
- package/dist/primitives/resize-seam.d.ts +11 -0
- package/dist/primitives/resize-seam.js +12 -0
- package/dist/primitives/sidebar-panel.js +4 -7
- package/dist/primitives/tabs.d.ts +14 -1
- package/dist/primitives/tabs.js +1 -1
- package/dist/providers/ui-provider.d.ts +9 -0
- package/dist/session/composer/ComposerAboveCard.d.ts +1 -1
- package/dist/session/composer/ComposerAboveCard.js +2 -2
- package/dist/session/composer/ComposerCard.d.ts +1 -1
- package/dist/session/composer/ComposerCard.js +3 -3
- package/dist/session/composer/agent-selector.d.ts +13 -1
- package/dist/session/composer/agent-selector.js +25 -5
- package/dist/session/composer/composer-agent-access.d.ts +15 -0
- package/dist/session/composer/composer-agent-access.js +27 -0
- package/dist/session/composer/composer-chat-input.d.ts +8 -2
- package/dist/session/composer/composer-chat-input.js +8 -6
- package/dist/session/composer/composer-logic.d.ts +16 -0
- package/dist/session/composer/composer-logic.js +12 -0
- package/dist/session/composer/composer-underbar.d.ts +3 -1
- package/dist/session/composer/composer-underbar.js +4 -3
- package/dist/session/composer/composer.d.ts +15 -1
- package/dist/session/composer/composer.js +19 -1
- package/dist/session/composer/draft/composer-draft.d.ts +6 -2
- package/dist/session/composer/draft/composer-draft.js +5 -1
- package/dist/session/composer/reasoning-effort-selector.js +1 -1
- package/dist/session/models/chatgpt-connection-button.d.ts +11 -0
- package/dist/session/models/chatgpt-connection-button.js +54 -0
- package/dist/session/models/model-selector.js +5 -2
- package/dist/session/models/use-model-connection-gate.d.ts +5 -5
- package/dist/session/models/use-model-connection-gate.js +5 -5
- package/dist/session/outcomes/jump-to-outcome.d.ts +10 -0
- package/dist/session/outcomes/jump-to-outcome.js +11 -0
- package/dist/session/outcomes/session-outcomes-bridge.d.ts +14 -0
- package/dist/session/outcomes/session-outcomes-bridge.js +12 -0
- package/dist/session/outcomes/session-outcomes-provider.d.ts +3 -1
- package/dist/session/outcomes/session-outcomes-provider.js +33 -3
- package/dist/session/panel/easy/app-preview.d.ts +10 -0
- package/dist/session/panel/easy/app-preview.js +31 -12
- package/dist/session/panel/easy/change-requests-card.d.ts +7 -0
- package/dist/session/panel/easy/change-requests-card.js +17 -0
- package/dist/session/panel/easy/easy-panel-logic.js +7 -1
- package/dist/session/panel/easy/easy-panel.js +5 -2
- package/dist/session/panel/easy/file-preview.js +1 -1
- package/dist/session/panel/easy/outputs-card.d.ts +2 -1
- package/dist/session/panel/easy/outputs-card.js +3 -2
- package/dist/session/panel/mobile-tool-drawer.js +7 -1
- package/dist/session/panel/session-audit-panel.js +9 -2
- package/dist/session/panel/session-audit-shared.js +3 -1
- package/dist/session/panel/session-detail-panel.js +9 -3
- package/dist/session/panel/session-files-explorer.d.ts +9 -0
- package/dist/session/panel/session-files-explorer.js +12 -3
- package/dist/session/panel/session-panel-provider.d.ts +15 -1
- package/dist/session/panel/session-panel-provider.js +32 -7
- package/dist/session/panel/shared/derive-panels.d.ts +8 -1
- package/dist/session/panel/shared/derive-panels.js +12 -2
- package/dist/session/panel/shared/output-priority.js +2 -0
- package/dist/session/participants/session-participants.d.ts +8 -2
- package/dist/session/participants/session-participants.js +11 -4
- package/dist/session/prompts/approval-request.d.ts +5 -0
- package/dist/session/prompts/approval-request.js +9 -1
- package/dist/session/prompts/session-approval-review.d.ts +9 -0
- package/dist/session/prompts/session-approval-review.js +18 -0
- package/dist/session/status/session-error-banner.js +2 -49
- package/dist/session/status/session-starting-loader.d.ts +14 -2
- package/dist/session/status/session-starting-loader.js +16 -4
- package/dist/session/thread/after-first-prompt.d.ts +7 -0
- package/dist/session/thread/after-first-prompt.js +8 -0
- package/dist/session/thread/detect-command.d.ts +12 -0
- package/dist/session/thread/detect-command.js +20 -0
- package/dist/session/thread/session-chat.d.ts +3 -1
- package/dist/session/thread/session-chat.js +377 -252
- package/dist/session/thread/session-thread.d.ts +15 -1
- package/dist/session/thread/session-thread.js +20 -3
- package/dist/session/thread/session-transcript-class.d.ts +5 -1
- package/dist/session/thread/session-transcript-class.js +5 -1
- package/dist/session/thread/thread-boot-rows.d.ts +36 -0
- package/dist/session/thread/thread-boot-rows.js +89 -0
- package/dist/session/thread/transcript-rows.d.ts +31 -0
- package/dist/session/thread/transcript-rows.js +3 -0
- package/dist/session/thread/transcript.d.ts +0 -9
- package/dist/session/thread/transcript.js +104 -19
- package/dist/session/tool/shared/infrastructure-contexts.d.ts +28 -0
- package/dist/session/tool/shared/infrastructure-contexts.js +31 -3
- package/dist/session/tool/tool-part-renderer.d.ts +5 -4
- package/dist/session/tool/tool-part-renderer.js +8 -3
- package/dist/session/tool/tools/bash-tool.js +7 -6
- package/dist/session/tool/tools/channel-send-card.d.ts +1 -2
- package/dist/session/tool/tools/channel-send.d.ts +2 -1
- package/dist/session/tool/tools/codemode-tool.js +1 -1
- package/dist/session/tool/tools/connector-tools.js +1 -1
- package/dist/session/tool/tools/image-gen-tool.d.ts +1 -1
- package/dist/session/tool/tools/image-gen-tool.js +241 -53
- package/dist/session/tool/tools/show-tool.js +19 -8
- package/dist/session/turn/channel-brand.d.ts +8 -3
- package/dist/session/turn/channel-brand.js +20 -4
- package/dist/session/turn/message-author.d.ts +8 -0
- package/dist/session/turn/message-author.js +24 -0
- package/dist/session/turn/message-row.d.ts +52 -0
- package/dist/session/turn/message-row.js +44 -0
- package/dist/session/turn/plan-anchor.d.ts +1 -1
- package/dist/session/turn/plan-anchor.js +1 -1
- package/dist/session/turn/user-message.d.ts +14 -6
- package/dist/session/turn/user-message.js +35 -15
- package/dist/styles.css +1 -1
- package/dist/workspace/home/access-requests-bell.d.ts +9 -2
- package/dist/workspace/home/access-requests-bell.js +20 -6
- package/dist/workspace/home/first-chat.d.ts +8 -21
- package/dist/workspace/home/first-chat.js +22 -72
- package/dist/workspace/index.d.ts +6 -0
- package/dist/workspace/index.js +6 -0
- package/dist/workspace/layout/project-home.d.ts +14 -2
- package/dist/workspace/layout/project-home.js +60 -21
- package/dist/workspace/layout/use-project-home-send.d.ts +9 -1
- package/dist/workspace/layout/use-project-home-send.js +82 -3
- package/dist/workspace/memory/body-doc.d.ts +17 -0
- package/dist/workspace/memory/body-doc.js +208 -0
- package/dist/workspace/memory/body-extensions.d.ts +38 -0
- package/dist/workspace/memory/body-extensions.js +103 -0
- package/dist/workspace/memory/company-memory-page.d.ts +8 -0
- package/dist/workspace/memory/company-memory-page.js +16 -0
- package/dist/workspace/memory/memory-all.d.ts +20 -0
- package/dist/workspace/memory/memory-all.js +27 -0
- package/dist/workspace/memory/memory-body.d.ts +19 -0
- package/dist/workspace/memory/memory-body.js +139 -0
- package/dist/workspace/memory/memory-empty.d.ts +13 -0
- package/dist/workspace/memory/memory-empty.js +28 -0
- package/dist/workspace/memory/memory-history.d.ts +27 -0
- package/dist/workspace/memory/memory-history.js +108 -0
- package/dist/workspace/memory/memory-labels.d.ts +16 -0
- package/dist/workspace/memory/memory-labels.js +47 -0
- package/dist/workspace/memory/memory-page-list.d.ts +34 -0
- package/dist/workspace/memory/memory-page-list.js +156 -0
- package/dist/workspace/memory/memory-reader.d.ts +58 -0
- package/dist/workspace/memory/memory-reader.js +123 -0
- package/dist/workspace/memory/memory-view.d.ts +21 -0
- package/dist/workspace/memory/memory-view.js +124 -0
- package/dist/workspace/memory/remember-popover.d.ts +19 -0
- package/dist/workspace/memory/remember-popover.js +61 -0
- package/dist/workspace/memory/remember-this.d.ts +12 -0
- package/dist/workspace/memory/remember-this.js +89 -0
- package/dist/workspace/memory/source-mark.d.ts +18 -0
- package/dist/workspace/memory/source-mark.js +79 -0
- package/dist/workspace/memory/used-memory-chip.d.ts +14 -0
- package/dist/workspace/memory/used-memory-chip.js +61 -0
- package/dist/workspace/new/advanced-fields.d.ts +2 -1
- package/dist/workspace/new/advanced-fields.js +2 -2
- package/dist/workspace/new/source-param.d.ts +1 -1
- package/dist/workspace/new/source-param.js +3 -1
- package/dist/workspace/new/use-create-workspace.d.ts +8 -10
- package/dist/workspace/new/use-create-workspace.js +3 -3
- package/dist/workspace/projects/onboarding/app-logo.d.ts +7 -2
- package/dist/workspace/projects/onboarding/app-logo.js +6 -13
- package/dist/workspace/projects/policies-panel.js +5 -3
- package/dist/workspace/review/review-actions.d.ts +4 -2
- package/dist/workspace/review/review-actions.js +8 -2
- package/dist/workspace/review/review-center.js +11 -7
- package/dist/workspace/review/review-detail.d.ts +10 -0
- package/dist/workspace/review/review-detail.js +101 -13
- package/dist/workspace/saved-session-skeleton.d.ts +2 -2
- package/dist/workspace/saved-session-skeleton.js +3 -3
- package/dist/workspace/session-workspace.js +15 -13
- package/dist/workspace/sessions/project-sessions-view.js +3 -2
- package/dist/workspace/sessions/session-label-badges.js +2 -1
- package/dist/workspace/sessions/sessions-toolbar.d.ts +3 -1
- package/dist/workspace/sessions/sessions-toolbar.js +2 -2
- package/dist/workspace/sidebar/footer/project-apps-nav.d.ts +5 -0
- package/dist/workspace/sidebar/footer/project-apps-nav.js +41 -2
- package/dist/workspace/sidebar/footer/project-artifacts-nav.d.ts +6 -0
- package/dist/workspace/sidebar/footer/project-artifacts-nav.js +22 -0
- package/dist/workspace/sidebar/footer/project-chrome-nav.d.ts +10 -0
- package/dist/workspace/sidebar/footer/project-chrome-nav.js +56 -0
- package/dist/workspace/sidebar/footer/project-manifest-upgrade-alert.js +13 -13
- package/dist/workspace/sidebar/footer/project-memory-nav.d.ts +7 -0
- package/dist/workspace/sidebar/footer/project-memory-nav.js +19 -0
- package/dist/workspace/sidebar/nav-row-meta.js +14 -2
- package/dist/workspace/sidebar/project-nav-items.js +3 -0
- package/dist/workspace/sidebar/project-session-list.js +68 -56
- package/dist/workspace/sidebar/project-sidebar.js +13 -2
- package/dist/workspace/sidebar/project-spaces-nav.d.ts +8 -0
- package/dist/workspace/sidebar/project-spaces-nav.js +69 -0
- package/dist/workspace/sidebar/session-group-order.d.ts +9 -0
- package/dist/workspace/sidebar/session-group-order.js +25 -0
- package/dist/workspace/sidebar/session-group-sections.d.ts +62 -0
- package/dist/workspace/sidebar/session-group-sections.js +267 -0
- package/dist/workspace/sidebar/session-list-chrome.d.ts +28 -0
- package/dist/workspace/sidebar/session-list-chrome.js +50 -0
- package/dist/workspace/spaces/channel-glyph.d.ts +5 -0
- package/dist/workspace/spaces/channel-glyph.js +6 -0
- package/dist/workspace/spaces/channel-setup.d.ts +16 -0
- package/dist/workspace/spaces/channel-setup.js +105 -0
- package/dist/workspace/spaces/channels-onboarding.d.ts +13 -0
- package/dist/workspace/spaces/channels-onboarding.js +37 -0
- package/dist/workspace/spaces/create-channel-dialog.d.ts +16 -0
- package/dist/workspace/spaces/create-channel-dialog.js +158 -0
- package/dist/workspace/spaces/private-channels-not-in.d.ts +9 -0
- package/dist/workspace/spaces/private-channels-not-in.js +69 -0
- package/dist/workspace/spaces/space-agents.d.ts +10 -0
- package/dist/workspace/spaces/space-agents.js +10 -0
- package/dist/workspace/spaces/space-details-dialog.d.ts +20 -0
- package/dist/workspace/spaces/space-details-dialog.js +176 -0
- package/dist/workspace/spaces/space-link-label.d.ts +49 -0
- package/dist/workspace/spaces/space-link-label.js +73 -0
- package/dist/workspace/spaces/space-links.d.ts +19 -0
- package/dist/workspace/spaces/space-links.js +230 -0
- package/dist/workspace/spaces/space-members.d.ts +46 -0
- package/dist/workspace/spaces/space-members.js +182 -0
- package/dist/workspace/spaces/space-roster.d.ts +15 -0
- package/dist/workspace/spaces/space-roster.js +44 -0
- package/dist/workspace/spaces/space-threads-tab.d.ts +56 -0
- package/dist/workspace/spaces/space-threads-tab.js +156 -0
- package/dist/workspace/spaces/space-timeline-view.d.ts +254 -0
- package/dist/workspace/spaces/space-timeline-view.js +235 -0
- package/dist/workspace/spaces/space-timeline.d.ts +106 -0
- package/dist/workspace/spaces/space-timeline.js +183 -0
- package/dist/workspace/spaces/space-triggers.d.ts +13 -0
- package/dist/workspace/spaces/space-triggers.js +78 -0
- package/dist/workspace/spaces/space-view.d.ts +37 -0
- package/dist/workspace/spaces/space-view.js +436 -0
- package/package.json +67 -36
- package/skills/kortix-ui/SKILL.md +3 -3
- package/skills/kortix-ui/references/custom-dashboard.md +3 -3
- package/skills/kortix-ui/references/modules.md +29 -5
- package/skills/kortix-ui/references/theming.md +1 -1
- package/dist/customize/connectors/catalog/merge-search.d.ts +0 -10
- package/dist/customize/connectors/catalog/merge-search.js +0 -26
- package/dist/customize/connectors/detail/find-easy-connect-app.d.ts +0 -29
- package/dist/customize/connectors/detail/find-easy-connect-app.js +0 -22
- package/dist/customize/migrate-to-v2/use-migrate-to-v2.d.ts +0 -9
- package/dist/customize/migrate-to-v2/use-migrate-to-v2.js +0 -24
- package/dist/customize/sections/connector-connection-header.d.ts +0 -36
- package/dist/customize/sections/connector-connection-header.js +0 -33
- package/dist/customize/sections/connector-connection-modal.d.ts +0 -34
- package/dist/customize/sections/connector-connection-modal.js +0 -72
- package/dist/customize/sections/discover-catalogue-card.d.ts +0 -19
- package/dist/customize/sections/discover-catalogue-card.js +0 -26
- package/dist/customize/sections/discover-catalogue-detail.d.ts +0 -15
- package/dist/customize/sections/discover-catalogue-detail.js +0 -24
- package/dist/customize/sections/discover-catalogue.d.ts +0 -17
- package/dist/customize/sections/discover-catalogue.js +0 -132
- package/dist/customize/sections/llm-provider/provider-access-menu.d.ts +0 -10
- package/dist/customize/sections/llm-provider/provider-access-menu.js +0 -23
- package/dist/files/project/components/drive-empty-art.d.ts +0 -2
- package/dist/files/project/components/drive-empty-art.js +0 -5
- package/dist/internal/hooks/use-media-query.d.ts +0 -2
- package/dist/internal/share/public-share-link-button.d.ts +0 -14
- package/dist/internal/share/public-share-link-button.js +0 -17
- package/dist/markdown/setup-links/app-credentials-form.d.ts +0 -12
- package/dist/markdown/setup-links/app-credentials-form.js +0 -115
- /package/dist/{internal/hooks → hooks}/use-media-query.js +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
|
+
import type { NativeConnectorApp } from '../../../internal/connector-logo/connector-logo-source.js';
|
|
2
3
|
/**
|
|
3
4
|
* The connect hero both chat platforms share (`slack-connect-card.tsx`,
|
|
4
5
|
* `teams-connect-card.tsx`): the logo tile, title, lede and actions on the
|
|
@@ -11,8 +12,8 @@ import type { ReactNode } from 'react';
|
|
|
11
12
|
* link under it. Without it, the wizard is the primary button, so the
|
|
12
13
|
* self-hosted route reads as a deliberate choice, not a missing feature.
|
|
13
14
|
*/
|
|
14
|
-
export declare function ChannelConnectHero({
|
|
15
|
-
|
|
15
|
+
export declare function ChannelConnectHero({ app, title, lede, preview, canWrite, oneClickUrl, oneClickLabel, ownAppLabel, setupLabel, readOnlyNote, onOwnApp, }: {
|
|
16
|
+
app: NativeConnectorApp;
|
|
16
17
|
title: string;
|
|
17
18
|
lede: string;
|
|
18
19
|
preview: ReactNode;
|
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import { Button } from '../../../primitives/button.js';
|
|
3
3
|
import { CaretRightIcon } from '@phosphor-icons/react';
|
|
4
4
|
import { UiLink as Link } from '../../../providers/ui-provider.js';
|
|
5
|
+
import { ChannelHeroFrame } from './channel-hero-frame.js';
|
|
5
6
|
/**
|
|
6
7
|
* The connect hero both chat platforms share (`slack-connect-card.tsx`,
|
|
7
8
|
* `teams-connect-card.tsx`): the logo tile, title, lede and actions on the
|
|
@@ -14,6 +15,6 @@ import { UiLink as Link } from '../../../providers/ui-provider.js';
|
|
|
14
15
|
* link under it. Without it, the wizard is the primary button, so the
|
|
15
16
|
* self-hosted route reads as a deliberate choice, not a missing feature.
|
|
16
17
|
*/
|
|
17
|
-
export function ChannelConnectHero({
|
|
18
|
-
return (
|
|
18
|
+
export function ChannelConnectHero({ app, title, lede, preview, canWrite, oneClickUrl, oneClickLabel, ownAppLabel, setupLabel, readOnlyNote, onOwnApp, }) {
|
|
19
|
+
return (_jsx(ChannelHeroFrame, { app: app, title: title, lede: lede, preview: preview, actions: canWrite ? (_jsx("div", { className: "flex flex-col items-start gap-3", children: oneClickUrl ? (_jsxs(_Fragment, { children: [_jsx(Button, { className: "transition-transform active:scale-96", asChild: true, children: _jsx(Link, { href: oneClickUrl, target: "_blank", rel: "noopener noreferrer", children: oneClickLabel }) }), _jsxs("button", { type: "button", onClick: onOwnApp, className: "text-muted-foreground hover:text-foreground flex items-center gap-1 text-sm transition-colors", children: [ownAppLabel, _jsx(CaretRightIcon, { className: "size-3 shrink-0" })] })] })) : (_jsx(Button, { className: "transition-transform active:scale-96", onClick: onOwnApp, children: setupLabel })) })) : (_jsx("p", { className: "text-muted-foreground text-xs", children: readOnlyNote })) }));
|
|
19
20
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { NativeConnectorApp } from '../../../internal/connector-logo/connector-logo-source.js';
|
|
3
|
+
/**
|
|
4
|
+
* The one hero every Kortix-native connection page draws: Slack, Teams,
|
|
5
|
+
* Email, Telegram and Computer. The logo tile, title, lede, a status line when
|
|
6
|
+
* connected and the actions on the left; on the right a mock of the place the
|
|
7
|
+
* agent shows up (a Slack channel, an inbox, a terminal). The mock is the
|
|
8
|
+
* pitch, so the copy column stays short. Below `md` the mock hides.
|
|
9
|
+
*/
|
|
10
|
+
export declare function ChannelHeroFrame({ app, title, lede, status, actions, preview, }: {
|
|
11
|
+
/** Which Kortix connector this is: its logo is the one every surface shows. */
|
|
12
|
+
app: NativeConnectorApp;
|
|
13
|
+
title: string;
|
|
14
|
+
lede: string;
|
|
15
|
+
/** The connected line: a green dot and what it is connected to. */
|
|
16
|
+
status?: ReactNode;
|
|
17
|
+
actions?: ReactNode;
|
|
18
|
+
preview: ReactNode;
|
|
19
|
+
}): import("react").JSX.Element;
|
|
20
|
+
/** The connected line inside a hero: a green dot, "Connected", what to. */
|
|
21
|
+
export declare function ChannelHeroStatus({ label, detail }: {
|
|
22
|
+
label: string;
|
|
23
|
+
detail?: string | null;
|
|
24
|
+
}): import("react").JSX.Element;
|
|
25
|
+
export declare function ChannelHeroLayoutProvider({ children }: {
|
|
26
|
+
children: ReactNode;
|
|
27
|
+
}): import("react").JSX.Element;
|
|
28
|
+
export declare function ChannelHeroLogoInHeader({ children }: {
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
}): import("react").JSX.Element;
|
|
31
|
+
export declare function useChannelHeroLayout(): boolean;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext } from 'react';
|
|
4
|
+
import { ConnectorLogo } from '../../../internal/connector-logo/connector-logo.js';
|
|
5
|
+
/**
|
|
6
|
+
* The one hero every Kortix-native connection page draws: Slack, Teams,
|
|
7
|
+
* Email, Telegram and Computer. The logo tile, title, lede, a status line when
|
|
8
|
+
* connected and the actions on the left; on the right a mock of the place the
|
|
9
|
+
* agent shows up (a Slack channel, an inbox, a terminal). The mock is the
|
|
10
|
+
* pitch, so the copy column stays short. Below `md` the mock hides.
|
|
11
|
+
*/
|
|
12
|
+
export function ChannelHeroFrame({ app, title, lede, status, actions, preview, }) {
|
|
13
|
+
const showLogo = useContext(ChannelHeroLogoShown);
|
|
14
|
+
return (_jsxs("div", { className: "bg-popover flex overflow-hidden rounded-lg border", children: [_jsxs("div", { className: "flex w-full shrink-0 flex-col justify-center gap-5 px-7 py-8 md:w-80", children: [showLogo ? _jsx(ConnectorLogo, { source: { nativeApp: app }, size: "lg" }) : null, _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("h3", { className: "text-foreground text-xl font-medium tracking-tight text-balance", children: title }), _jsx("p", { className: "text-muted-foreground text-sm leading-relaxed text-pretty", children: lede })] }), status ? _jsx("div", { className: "text-foreground flex min-w-0 items-center gap-2 text-sm", children: status }) : null, actions ? _jsx("div", { className: "flex flex-wrap items-center gap-2", children: actions }) : null] }), _jsx("div", { "aria-hidden": true, className: "bg-muted/50 hidden min-w-0 flex-1 border-s py-7 ps-7 select-none md:flex", children: _jsx("div", { className: "bg-background flex min-h-72 min-w-0 flex-1 overflow-hidden rounded-l-lg border-y border-s shadow-xs", children: preview }) })] }));
|
|
15
|
+
}
|
|
16
|
+
/** The connected line inside a hero: a green dot, "Connected", what to. */
|
|
17
|
+
export function ChannelHeroStatus({ label, detail }) {
|
|
18
|
+
return (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": true, className: "bg-kortix-green size-2 shrink-0 rounded-full" }), _jsxs("span", { className: "min-w-0 truncate", children: [_jsx("span", { className: "font-medium", children: label }), detail ? _jsxs("span", { className: "text-muted-foreground", children: [" \u00B7 ", detail] }) : null] })] }));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* On a single channel's page every channel draws as a hero, not a list row:
|
|
22
|
+
* `ChannelRow` reads this and, when the row carries `hero` copy, renders the
|
|
23
|
+
* frame with the row's own actions.
|
|
24
|
+
*/
|
|
25
|
+
const ChannelHeroLayout = createContext(false);
|
|
26
|
+
export function ChannelHeroLayoutProvider({ children }) {
|
|
27
|
+
return _jsx(ChannelHeroLayout.Provider, { value: true, children: children });
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A page whose header already shows the app's logo beside its title (the app
|
|
31
|
+
* page) wraps its hero in this, so the logo is never drawn twice on one page.
|
|
32
|
+
* The Channels tab has no per-app header, so its heroes keep theirs.
|
|
33
|
+
*/
|
|
34
|
+
const ChannelHeroLogoShown = createContext(true);
|
|
35
|
+
export function ChannelHeroLogoInHeader({ children }) {
|
|
36
|
+
return _jsx(ChannelHeroLogoShown.Provider, { value: false, children: children });
|
|
37
|
+
}
|
|
38
|
+
export function useChannelHeroLayout() {
|
|
39
|
+
return useContext(ChannelHeroLayout);
|
|
40
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** An inbox thread: Maya writes to the project's address and the agent replies in the thread. */
|
|
2
|
+
export declare function EmailThreadMock(): import("react").JSX.Element;
|
|
3
|
+
/** A Telegram chat with the project's bot. */
|
|
4
|
+
export declare function TelegramChatMock(): import("react").JSX.Element;
|
|
5
|
+
/** A terminal on the person's own machine: the agent reads files, runs a command and uses an app. */
|
|
6
|
+
export declare function ComputerTerminalMock(): import("react").JSX.Element;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* The previews beside the Email, Telegram and Computer heroes
|
|
5
|
+
* (`channel-hero-frame.tsx`), drawn like the Slack and Teams ones: a glimpse
|
|
6
|
+
* of the place the agent shows up, with one person asking and the agent
|
|
7
|
+
* answering. Decorative: the hero's heading and lede say it in words.
|
|
8
|
+
*/
|
|
9
|
+
import { EnvelopeSimpleIcon, PaperPlaneTiltIcon, TerminalWindowIcon } from '@phosphor-icons/react';
|
|
10
|
+
import { useTranslations } from '../../../i18n/index.js';
|
|
11
|
+
import { Kortix } from '../../../internal/icons/kortix.js';
|
|
12
|
+
/** Telegram's own colours, so the mock reads as Telegram at a glance: its
|
|
13
|
+
* blue, the outgoing bubble (light and dark), and white on the blue. */
|
|
14
|
+
const TELEGRAM_ACCENT = '#229ed9';
|
|
15
|
+
const TELEGRAM_BUBBLE = 'light-dark(#effdde, #2b5278)';
|
|
16
|
+
const TELEGRAM_ON_ACCENT = '#ffffff';
|
|
17
|
+
const TELEGRAM_UI = {
|
|
18
|
+
'--telegram-accent': TELEGRAM_ACCENT,
|
|
19
|
+
'--telegram-bubble': TELEGRAM_BUBBLE,
|
|
20
|
+
'--telegram-on-accent': TELEGRAM_ON_ACCENT,
|
|
21
|
+
};
|
|
22
|
+
/** An inbox thread: Maya writes to the project's address and the agent replies in the thread. */
|
|
23
|
+
export function EmailThreadMock() {
|
|
24
|
+
const t = useTranslations('connectorPages');
|
|
25
|
+
return (_jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex items-center gap-2 border-b px-5 py-3", children: [_jsx(EnvelopeSimpleIcon, { className: "text-muted-foreground size-4 shrink-0" }), _jsx("p", { className: "text-foreground truncate text-sm font-semibold", children: t('mockEmailSubject') })] }), _jsxs("div", { className: "flex flex-1 flex-col gap-4 px-5 py-4 text-sm", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("p", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-foreground font-semibold", children: "Maya" }), _jsx("span", { className: "text-muted-foreground truncate text-xs", children: t('mockEmailTo') })] }), _jsx("p", { className: "text-foreground text-pretty", children: t('mockEmailAsk') })] }), _jsxs("div", { className: "bg-muted/40 space-y-1 rounded-md border px-3 py-2.5", children: [_jsxs("p", { className: "flex items-center gap-2", children: [_jsx("span", { className: "bg-background flex size-5 items-center justify-center rounded-sm border", children: _jsx(Kortix, { className: "size-3" }) }), _jsx("span", { className: "text-foreground font-semibold", children: "Kortix" }), _jsx("span", { className: "text-muted-foreground text-xs", children: t('mockEmailReplied') })] }), _jsx("p", { className: "text-foreground text-pretty", children: t('mockEmailReply') })] })] })] }));
|
|
26
|
+
}
|
|
27
|
+
/** A Telegram chat with the project's bot. */
|
|
28
|
+
export function TelegramChatMock() {
|
|
29
|
+
const t = useTranslations('connectorPages');
|
|
30
|
+
return (_jsxs("div", { className: "flex min-w-0 flex-1 flex-col", style: TELEGRAM_UI, children: [_jsxs("div", { className: "flex items-center gap-2.5 border-b px-5 py-3", children: [_jsx("span", { className: "flex size-7 items-center justify-center rounded-full bg-(--telegram-accent)", children: _jsx(Kortix, { className: "size-3.5 text-(--telegram-on-accent)" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "text-foreground text-sm font-semibold", children: "Kortix" }), _jsx("p", { className: "text-muted-foreground text-xs", children: t('mockTelegramBot') })] })] }), _jsxs("div", { className: "flex flex-1 flex-col justify-end gap-2.5 px-5 py-4 text-sm", children: [_jsx("p", { className: "text-foreground ms-auto max-w-[80%] rounded-lg rounded-br-xs bg-(--telegram-bubble) px-3 py-2 text-pretty", children: t('mockTelegramAsk') }), _jsx("p", { className: "text-foreground bg-muted max-w-[80%] rounded-lg rounded-bl-xs px-3 py-2 text-pretty", children: t('mockTelegramReply') })] }), _jsxs("div", { className: "mx-5 mb-4 flex h-9 items-center justify-between rounded-full border px-3", children: [_jsx("span", { className: "bg-muted h-2 w-28 rounded-full" }), _jsx(PaperPlaneTiltIcon, { className: "size-4 shrink-0 text-(--telegram-accent)" })] })] }));
|
|
31
|
+
}
|
|
32
|
+
/** A terminal on the person's own machine: the agent reads files, runs a command and uses an app. */
|
|
33
|
+
export function ComputerTerminalMock() {
|
|
34
|
+
const t = useTranslations('connectorPages');
|
|
35
|
+
const lines = [
|
|
36
|
+
{ prompt: true, text: t('mockComputerFiles') },
|
|
37
|
+
{ text: t('mockComputerFilesResult'), muted: true },
|
|
38
|
+
{ prompt: true, text: 'npm test' },
|
|
39
|
+
{ text: t('mockComputerTestsResult'), muted: true },
|
|
40
|
+
{ prompt: true, text: t('mockComputerScreen') },
|
|
41
|
+
{ text: t('mockComputerScreenResult'), muted: true },
|
|
42
|
+
];
|
|
43
|
+
return (
|
|
44
|
+
// A terminal is dark in both themes, so its tokens resolve under `dark`.
|
|
45
|
+
_jsxs("div", { className: "dark bg-background text-foreground flex min-w-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex items-center gap-2 border-b px-4 py-2.5", children: [_jsx(TerminalWindowIcon, { className: "text-muted-foreground size-4 shrink-0" }), _jsx("p", { className: "text-muted-foreground truncate font-mono text-xs", children: t('mockComputerTitle') })] }), _jsx("div", { className: "flex flex-1 flex-col gap-1.5 px-4 py-4 font-mono text-xs", children: lines.map((line, index) => (_jsxs("p", { className: line.muted ? 'text-muted-foreground' : 'text-foreground', children: [line.prompt ? _jsx("span", { className: "text-kortix-green", children: "\u25CF " }) : _jsx("span", { children: ' ' }), line.text] }, index))) })] }));
|
|
46
|
+
}
|
|
@@ -1,15 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
import type { NativeConnectorApp } from '../../../internal/connector-logo/connector-logo-source.js';
|
|
2
|
+
export declare function ChannelRow({ app, name, connected,
|
|
2
3
|
/** Shown when connected — the workspace, tenant, or address we're bound to. */
|
|
3
4
|
detail,
|
|
4
5
|
/** Shown when NOT connected — what this channel gets you, in one line. */
|
|
5
|
-
pitch, badge, actions, }: {
|
|
6
|
-
|
|
6
|
+
pitch, badge, actions, hero, }: {
|
|
7
|
+
/** Which Kortix channel: its logo is the one every surface shows. */
|
|
8
|
+
app: NativeConnectorApp;
|
|
7
9
|
name: string;
|
|
8
10
|
connected: boolean;
|
|
9
11
|
detail?: string | null;
|
|
10
12
|
pitch: string;
|
|
11
13
|
badge?: React.ReactNode;
|
|
12
14
|
actions?: React.ReactNode;
|
|
15
|
+
/** The channel's own page draws it as a hero (`ChannelHeroLayoutProvider`):
|
|
16
|
+
* its pitch when not connected, a connected line when it is. */
|
|
17
|
+
hero?: {
|
|
18
|
+
title: string;
|
|
19
|
+
connectedTitle: string;
|
|
20
|
+
lede?: string;
|
|
21
|
+
preview: React.ReactNode;
|
|
22
|
+
};
|
|
13
23
|
}): import("react").JSX.Element;
|
|
14
24
|
/**
|
|
15
25
|
* Disconnect as a two-step inline swap (Disconnect → Cancel | Disconnect).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx,
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useTranslations } from '../../../i18n/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* One channel as an entity row — the shape that replaced the four-column
|
|
@@ -27,18 +27,24 @@ import { Button } from '../../../primitives/button.js';
|
|
|
27
27
|
import Loading from '../../../primitives/loading.js';
|
|
28
28
|
import { cn } from '../../../internal/lib/utils.js';
|
|
29
29
|
import { XIcon } from '@phosphor-icons/react';
|
|
30
|
+
import { ConnectorLogo } from '../../../internal/connector-logo/connector-logo.js';
|
|
30
31
|
import { useState } from 'react';
|
|
32
|
+
import { ChannelHeroFrame, ChannelHeroStatus, useChannelHeroLayout } from './channel-hero-frame.js';
|
|
31
33
|
/** Local, not exported — `ChannelRow` is the only sanctioned way to draw it. */
|
|
32
34
|
function ChannelStatusDot({ connected }) {
|
|
33
35
|
return (_jsx("span", { "aria-hidden": true, className: cn('size-1.5 shrink-0 rounded-full', connected ? 'bg-kortix-green' : 'bg-muted-foreground/40') }));
|
|
34
36
|
}
|
|
35
|
-
export function ChannelRow({
|
|
37
|
+
export function ChannelRow({ app, name, connected,
|
|
36
38
|
/** Shown when connected — the workspace, tenant, or address we're bound to. */
|
|
37
39
|
detail,
|
|
38
40
|
/** Shown when NOT connected — what this channel gets you, in one line. */
|
|
39
|
-
pitch, badge, actions, }) {
|
|
41
|
+
pitch, badge, actions, hero, }) {
|
|
40
42
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
41
|
-
|
|
43
|
+
const heroLayout = useChannelHeroLayout();
|
|
44
|
+
if (heroLayout && hero) {
|
|
45
|
+
return (_jsx(ChannelHeroFrame, { app: app, title: connected ? hero.connectedTitle : hero.title, lede: hero.lede ?? pitch, status: connected ? _jsx(ChannelHeroStatus, { label: tI18nComplete.raw('text22965568d22a'), detail: detail }) : undefined, actions: badge || actions ? (_jsxs(_Fragment, { children: [badge, actions] })) : undefined, preview: hero.preview }));
|
|
46
|
+
}
|
|
47
|
+
return (_jsxs("li", { className: "bg-popover flex items-center gap-3 rounded-md border px-4 py-2.5", children: [_jsx(ConnectorLogo, { source: { nativeApp: app }, size: "lg" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("p", { className: "text-foreground text-sm font-medium", children: name }), badge] }), _jsxs("div", { className: "text-muted-foreground flex min-w-0 items-center gap-1.5 text-xs", children: [_jsx(ChannelStatusDot, { connected: connected }), connected ? (_jsxs("span", { className: "max-w-[240px] truncate", title: detail ?? undefined, children: [tI18nComplete.raw('text22965568d22a'), detail ? ` · ${detail}` : ''] })) : (_jsx("span", { className: "truncate", children: pitch }))] })] }), actions ? _jsx("div", { className: "flex shrink-0 items-center gap-1", children: actions }) : null] }));
|
|
42
48
|
}
|
|
43
49
|
/**
|
|
44
50
|
* Disconnect as a two-step inline swap (Disconnect → Cancel | Disconnect).
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type EmailSenderPolicy } from '../../../internal/hooks/channels/use-channels-installations.js';
|
|
2
|
+
import { type EmailInbox } from '../../../internal/hooks/channels/use-email-inboxes.js';
|
|
3
|
+
export type Senders = 'me' | 'team' | 'anyone' | 'custom';
|
|
4
|
+
/** The viewer's work domain, or null for a public mail provider or no email. */
|
|
5
|
+
export declare function teamDomainOf(email: string | null | undefined): string | null;
|
|
6
|
+
/** The choice preselected for a new inbox: the narrowest one that still names a real sender. */
|
|
7
|
+
export declare function defaultSenders(email: string | null | undefined): Senders;
|
|
8
|
+
/** The wire policy for a choice. `custom` routes each entry by shape: with a local part an email, else a domain. */
|
|
9
|
+
export declare function senderPolicyFor(choice: Senders, input: {
|
|
10
|
+
email: string | null;
|
|
11
|
+
customList: string;
|
|
12
|
+
}): EmailSenderPolicy;
|
|
13
|
+
/**
|
|
14
|
+
* The email half of "Add inbox": where the inbox lives, its address and who may
|
|
15
|
+
* email it. The account half (its name, who can use it) is `AddAccountFields`
|
|
16
|
+
* above it in the same dialog, passed in as `account`. Each inbox is one
|
|
17
|
+
* account on the `kortix_email` connector profile.
|
|
18
|
+
*/
|
|
19
|
+
export declare function EmailConnectForm({ projectId, account, onConnected, }: {
|
|
20
|
+
projectId: string;
|
|
21
|
+
/** The new account's name and owner: you only, or the project (shared). */
|
|
22
|
+
account: {
|
|
23
|
+
label?: string;
|
|
24
|
+
share: 'me' | 'project';
|
|
25
|
+
};
|
|
26
|
+
onConnected: (inbox: EmailInbox) => void;
|
|
27
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Connect Email: give the agent a Resend inbox. Two homes for it:
|
|
5
|
+
* - Your Resend account (first, and the default): your API key, on any
|
|
6
|
+
* domain you verified there with receiving on. A new domain is added here
|
|
7
|
+
* and shows the DNS records to set, with "Check again" until Resend
|
|
8
|
+
* verifies it.
|
|
9
|
+
* - Kortix managed: the deployment's Resend team on its managed domain
|
|
10
|
+
* (`mode.managed_domain`). Offered only where the operator turned it on
|
|
11
|
+
* (`mode.managed_available`).
|
|
12
|
+
* Then who may email the agent: a new inbox starts sessions on this
|
|
13
|
+
* project's credits, so the preselected choice is the viewer alone, or their
|
|
14
|
+
* work domain. "Anyone" stays one click away.
|
|
15
|
+
*/
|
|
16
|
+
import { CheckIcon, CopyIcon, EnvelopeSimpleIcon } from '@phosphor-icons/react';
|
|
17
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
18
|
+
import { useTranslations } from '../../../i18n/index.js';
|
|
19
|
+
import { useAddEmailDomain, useEmailMode, useListEmailDomains, useVerifyEmailDomain, } from '../../../internal/hooks/channels/use-channels-installations.js';
|
|
20
|
+
import { useAddEmailInbox } from '../../../internal/hooks/channels/use-email-inboxes.js';
|
|
21
|
+
import { useCopy } from '../../../internal/hooks/use-copy.js';
|
|
22
|
+
import { Badge } from '../../../primitives/badge.js';
|
|
23
|
+
import { Button } from '../../../primitives/button.js';
|
|
24
|
+
import { Field, FieldDescription, FieldLabel } from '../../../primitives/field.js';
|
|
25
|
+
import { InfoBanner } from '../../../primitives/info-banner.js';
|
|
26
|
+
import { Input } from '../../../primitives/input.js';
|
|
27
|
+
import Loading from '../../../primitives/loading.js';
|
|
28
|
+
import { RadioGroup, RadioGroupItem } from '../../../primitives/radio-group.js';
|
|
29
|
+
import { Select, SelectContent, SelectItem, SelectSeparator, SelectTrigger, SelectValue } from '../../../primitives/select.js';
|
|
30
|
+
import { Textarea } from '../../../primitives/textarea.js';
|
|
31
|
+
import { UiLink as Link, useUiViewer } from '../../../providers/ui-provider.js';
|
|
32
|
+
const ADD_DOMAIN = '__add__';
|
|
33
|
+
/** What an own-key inbox needs, at Resend. */
|
|
34
|
+
const RESEND_LINKS = {
|
|
35
|
+
apiKeys: 'https://resend.com/api-keys',
|
|
36
|
+
inboxes: 'https://resend.com/docs/dashboard/inboxes/introduction',
|
|
37
|
+
receiving: 'https://resend.com/docs/dashboard/receiving/custom-domains',
|
|
38
|
+
};
|
|
39
|
+
// ponytail: a short list of public mail providers, so "people at gmail.com" is
|
|
40
|
+
// never offered as a team. A provider not listed only changes the preselection.
|
|
41
|
+
const PUBLIC_MAIL_DOMAINS = new Set([
|
|
42
|
+
'gmail.com', 'googlemail.com', 'outlook.com', 'hotmail.com', 'live.com', 'yahoo.com', 'icloud.com',
|
|
43
|
+
'me.com', 'proton.me', 'protonmail.com', 'aol.com', 'gmx.de', 'gmx.net', 'web.de',
|
|
44
|
+
]);
|
|
45
|
+
function splitList(value) {
|
|
46
|
+
return Array.from(new Set(value.split(/[\n,]+/).map((v) => v.trim().toLowerCase()).filter(Boolean)));
|
|
47
|
+
}
|
|
48
|
+
/** The viewer's work domain, or null for a public mail provider or no email. */
|
|
49
|
+
export function teamDomainOf(email) {
|
|
50
|
+
const domain = email?.trim().toLowerCase().split('@')[1] || null;
|
|
51
|
+
return domain && !PUBLIC_MAIL_DOMAINS.has(domain) ? domain : null;
|
|
52
|
+
}
|
|
53
|
+
/** The choice preselected for a new inbox: the narrowest one that still names a real sender. */
|
|
54
|
+
export function defaultSenders(email) {
|
|
55
|
+
return teamDomainOf(email) ? 'team' : email ? 'me' : 'anyone';
|
|
56
|
+
}
|
|
57
|
+
/** The wire policy for a choice. `custom` routes each entry by shape: with a local part an email, else a domain. */
|
|
58
|
+
export function senderPolicyFor(choice, input) {
|
|
59
|
+
const none = { allowedEmails: [], allowedDomains: [], allowedRegex: null };
|
|
60
|
+
const team = teamDomainOf(input.email);
|
|
61
|
+
if (choice === 'anyone')
|
|
62
|
+
return { mode: 'allow_all', ...none };
|
|
63
|
+
if (choice === 'team' && team)
|
|
64
|
+
return { mode: 'restricted', ...none, allowedDomains: [team] };
|
|
65
|
+
// `me`, or a `team` choice with no work domain: never wider than the viewer.
|
|
66
|
+
if (choice !== 'custom') {
|
|
67
|
+
return { mode: 'restricted', ...none, allowedEmails: input.email ? [input.email.toLowerCase()] : [] };
|
|
68
|
+
}
|
|
69
|
+
const items = splitList(input.customList);
|
|
70
|
+
return {
|
|
71
|
+
mode: 'restricted',
|
|
72
|
+
allowedRegex: null,
|
|
73
|
+
allowedEmails: items.filter((v) => v.includes('@') && !v.startsWith('@')),
|
|
74
|
+
allowedDomains: items.filter((v) => !v.includes('@') || v.startsWith('@')).map((v) => v.replace(/^@+/, '')),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The email half of "Add inbox": where the inbox lives, its address and who may
|
|
79
|
+
* email it. The account half (its name, who can use it) is `AddAccountFields`
|
|
80
|
+
* above it in the same dialog, passed in as `account`. Each inbox is one
|
|
81
|
+
* account on the `kortix_email` connector profile.
|
|
82
|
+
*/
|
|
83
|
+
export function EmailConnectForm({ projectId, account, onConnected, }) {
|
|
84
|
+
const t = useTranslations('emailConnect');
|
|
85
|
+
const mode = useEmailMode(projectId);
|
|
86
|
+
const connect = useAddEmailInbox();
|
|
87
|
+
const listDomains = useListEmailDomains();
|
|
88
|
+
const viewerEmail = useUiViewer()?.email?.trim().toLowerCase() || null;
|
|
89
|
+
const teamDomain = teamDomainOf(viewerEmail);
|
|
90
|
+
// Kortix managed is a second, optional home: the operator turns it on for
|
|
91
|
+
// the whole deployment (RESEND_MANAGED_EMAIL_ENABLED), never a project.
|
|
92
|
+
const managedAvailable = mode.data?.managed_available === true;
|
|
93
|
+
// An older server omits it; the address preview then shows "…".
|
|
94
|
+
const managedDomain = mode.data?.managed_domain || '…';
|
|
95
|
+
const [homeChoice, setHome] = useState(null);
|
|
96
|
+
// Until the user picks, the home follows what the deployment offers.
|
|
97
|
+
const home = managedAvailable ? (homeChoice ?? 'own') : 'own';
|
|
98
|
+
const [apiKey, setApiKey] = useState('');
|
|
99
|
+
// '' until the user picks: then the first verified domain of the key's account.
|
|
100
|
+
const [domainChoice, setDomain] = useState('');
|
|
101
|
+
const [added, setAdded] = useState([]);
|
|
102
|
+
const [username, setUsername] = useState('agent');
|
|
103
|
+
const [displayName, setDisplayName] = useState('Kortix Agent');
|
|
104
|
+
const [senders, setSenders] = useState(() => defaultSenders(viewerEmail));
|
|
105
|
+
const [customList, setCustomList] = useState('');
|
|
106
|
+
const [attachOpen, setAttachOpen] = useState(false);
|
|
107
|
+
const [inboxId, setInboxId] = useState('');
|
|
108
|
+
const [inboxEmail, setInboxEmail] = useState('');
|
|
109
|
+
const [error, setError] = useState(null);
|
|
110
|
+
// A pasted key loads that account's domains, half a second after typing stops.
|
|
111
|
+
const key = apiKey.trim();
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
if (home !== 'own' || key.length < 8)
|
|
114
|
+
return;
|
|
115
|
+
const timer = setTimeout(() => listDomains.mutate({ projectId, apiKey: key }), 500);
|
|
116
|
+
return () => clearTimeout(timer);
|
|
117
|
+
// `listDomains.mutate` is stable; re-running on it would refetch on every render.
|
|
118
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
119
|
+
}, [home, key, projectId]);
|
|
120
|
+
const ownDomains = useMemo(() => {
|
|
121
|
+
const listed = home === 'own' && key ? (listDomains.data?.domains ?? []) : [];
|
|
122
|
+
const byName = new Map();
|
|
123
|
+
for (const d of [...listed, ...added])
|
|
124
|
+
byName.set(d.domain, d);
|
|
125
|
+
return [...byName.values()];
|
|
126
|
+
}, [added, home, key, listDomains.data]);
|
|
127
|
+
// A Resend account has no shared domain: an inbox lives on one of its own.
|
|
128
|
+
const domain = domainChoice || ownDomains.find((d) => d.verified)?.domain || ownDomains[0]?.domain || (key ? ADD_DOMAIN : '');
|
|
129
|
+
const selected = home === 'own' ? ownDomains.find((d) => d.domain === domain) : undefined;
|
|
130
|
+
const addressDomain = home === 'managed' ? managedDomain : !domain || domain === ADD_DOMAIN ? '…' : domain;
|
|
131
|
+
const address = `${username || 'agent'}@${addressDomain}`;
|
|
132
|
+
const domainReady = home === 'managed' || (Boolean(domain) && domain !== ADD_DOMAIN && selected?.verified !== false);
|
|
133
|
+
const submit = () => {
|
|
134
|
+
setError(null);
|
|
135
|
+
if (home === 'own' && !key)
|
|
136
|
+
return setError(t('errorKeyRequired'));
|
|
137
|
+
if (attachOpen && !inboxId.trim())
|
|
138
|
+
return setError(t('errorAttachBoth'));
|
|
139
|
+
const policy = senderPolicyFor(senders, { email: viewerEmail, customList });
|
|
140
|
+
if (senders === 'custom' && policy.allowedEmails.length + policy.allowedDomains.length === 0) {
|
|
141
|
+
return setError(t('errorCustomEmpty'));
|
|
142
|
+
}
|
|
143
|
+
connect.mutate({
|
|
144
|
+
projectId,
|
|
145
|
+
share: account.share,
|
|
146
|
+
...(account.label?.trim() ? { label: account.label.trim() } : {}),
|
|
147
|
+
...(home === 'own' ? { api_key: key } : {}),
|
|
148
|
+
display_name: displayName.trim() || undefined,
|
|
149
|
+
...(attachOpen
|
|
150
|
+
? { inbox_id: inboxId.trim(), ...(inboxEmail.trim() ? { email: inboxEmail.trim() } : {}) }
|
|
151
|
+
: {
|
|
152
|
+
username: username.trim() || undefined,
|
|
153
|
+
...(home === 'own' ? { domain } : {}),
|
|
154
|
+
}),
|
|
155
|
+
sender_policy: policy,
|
|
156
|
+
}, { onSuccess: onConnected, onError: (e) => setError(e.message) });
|
|
157
|
+
};
|
|
158
|
+
return (_jsxs("div", { className: "space-y-6", children: [_jsxs("section", { className: "space-y-3", children: [_jsx("h3", { className: "text-foreground text-sm font-medium", children: managedAvailable ? t('homeTitle') : t('homeOwn') }), managedAvailable ? (_jsxs(RadioGroup, { value: home, onValueChange: (v) => setHome(v), className: "grid gap-2 sm:grid-cols-2", children: [_jsx(RadioGroupItem, { value: "own", variant: "outline", label: t('homeOwn'), description: t('homeOwnHint') }), _jsx(RadioGroupItem, { value: "managed", variant: "outline", label: t('homeManaged'), description: t('homeManagedHint', { domain: managedDomain }) })] })) : null, home === 'own' ? (_jsxs("p", { className: "text-muted-foreground text-sm text-pretty", children: [t('ownNeeds'), ' ', _jsx(Link, { href: RESEND_LINKS.apiKeys, target: "_blank", rel: "noopener noreferrer", className: "text-foreground underline underline-offset-2", children: t('linkApiKeys') }), ' · ', _jsx(Link, { href: RESEND_LINKS.receiving, target: "_blank", rel: "noopener noreferrer", className: "text-foreground underline underline-offset-2", children: t('linkReceiving') }), ' · ', _jsx(Link, { href: RESEND_LINKS.inboxes, target: "_blank", rel: "noopener noreferrer", className: "text-foreground underline underline-offset-2", children: t('linkInboxes') })] })) : null, home === 'own' ? (_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "email-connect-key", children: t('keyLabel') }), _jsx(Input, { id: "email-connect-key", type: "password", value: apiKey, onChange: (e) => setApiKey(e.target.value), placeholder: "re_\u2026", autoComplete: "off", spellCheck: false }), _jsx(FieldDescription, { children: listDomains.isPending ? t('keyChecking') : listDomains.isError ? (_jsx("span", { className: "text-destructive", children: listDomains.error.message })) : listDomains.data && key ? (t('keyOk', { count: listDomains.data.domains.length })) : (t('keyHint')) })] })) : null] }), !attachOpen ? (_jsxs("section", { className: "space-y-3", children: [_jsx("h3", { className: "text-foreground text-sm font-medium", children: t('addressTitle') }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { "aria-label": t('usernameLabel'), value: username, onChange: (e) => setUsername(e.target.value.toLowerCase().replace(/[^a-z0-9._-]/g, '')), placeholder: "support", autoComplete: "off", spellCheck: false, className: "min-w-0 flex-1" }), _jsx("span", { className: "text-muted-foreground text-sm", children: "@" }), home === 'managed' ? (_jsx("span", { className: "bg-muted text-foreground flex h-9 min-w-0 flex-1 items-center rounded-md px-3 text-sm", children: _jsx("span", { className: "truncate", children: managedDomain }) })) : (_jsxs(Select, { value: domain, onValueChange: setDomain, children: [_jsx(SelectTrigger, { "aria-label": t('domainLabel'), className: "min-w-0 flex-1", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [ownDomains.map((d) => (_jsx(SelectItem, { value: d.domain, children: _jsxs("span", { className: "flex items-center gap-2", children: [d.domain, d.verified ? null : _jsx(Badge, { variant: "secondary", children: t('domainPending') })] }) }, d.domain))), _jsx(SelectSeparator, {}), _jsx(SelectItem, { value: ADD_DOMAIN, disabled: !key, children: t('domainAdd') })] })] }))] }), _jsxs("p", { className: "text-muted-foreground flex items-center gap-1.5 text-xs", children: [_jsx(EnvelopeSimpleIcon, { className: "size-3.5 shrink-0" }), _jsxs("span", { className: "truncate", children: [displayName.trim() || 'Kortix Agent', " <", address, ">"] })] }), home === 'own' && domain === ADD_DOMAIN ? (_jsx(AddDomain, { projectId: projectId, apiKey: key, onAdded: (result) => {
|
|
159
|
+
setAdded((list) => [...list.filter((d) => d.domain !== result.domain.domain), result.domain]);
|
|
160
|
+
setDomain(result.domain.domain);
|
|
161
|
+
} })) : null, home === 'own' && selected && !selected.verified ? (_jsx(DomainRecords, { projectId: projectId, apiKey: key, domain: selected, onChecked: (result) => setAdded((list) => [...list.filter((d) => d.domain !== result.domain.domain), result.domain]) })) : null, _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "email-connect-name", children: t('displayNameLabel') }), _jsx(Input, { id: "email-connect-name", value: displayName, onChange: (e) => setDisplayName(e.target.value), placeholder: "Kortix Agent" })] })] })) : null, _jsxs("section", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-foreground text-sm font-medium", children: t('sendersTitle') }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: t('sendersHint') })] }), _jsxs(RadioGroup, { value: senders, onValueChange: (v) => setSenders(v), children: [viewerEmail ? _jsx(RadioGroupItem, { value: "me", label: t('sendersMe', { email: viewerEmail }) }) : null, teamDomain ? _jsx(RadioGroupItem, { value: "team", label: t('sendersTeam', { domain: teamDomain }) }) : null, _jsx(RadioGroupItem, { value: "custom", label: t('sendersCustom') }), _jsx(RadioGroupItem, { value: "anyone", label: t('sendersAnyone'), description: t('sendersAnyoneHint') })] }), senders === 'custom' ? (_jsx(Textarea, { "aria-label": t('sendersCustom'), value: customList, onChange: (e) => setCustomList(e.target.value), placeholder: t('sendersCustomPlaceholder'), rows: 3, spellCheck: false })) : null] }), _jsxs("section", { className: "space-y-3", children: [_jsx(Button, { type: "button", variant: "text", size: "sm", className: "px-0", onClick: () => setAttachOpen((open) => !open), children: attachOpen ? t('attachClose') : t('attachOpen') }), attachOpen ? (_jsxs("div", { className: "grid gap-3 sm:grid-cols-2", children: [_jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "email-connect-inbox-email", children: t('attachEmail') }), _jsx(Input, { id: "email-connect-inbox-email", value: inboxEmail, onChange: (e) => setInboxEmail(e.target.value.trim().toLowerCase()), placeholder: "support@example.com", autoComplete: "off", spellCheck: false })] }), _jsxs(Field, { children: [_jsx(FieldLabel, { htmlFor: "email-connect-inbox-id", children: t('attachId') }), _jsx(Input, { id: "email-connect-inbox-id", value: inboxId, onChange: (e) => setInboxId(e.target.value.trim()), autoComplete: "off", spellCheck: false })] }), _jsx("p", { className: "text-muted-foreground text-xs sm:col-span-2", children: t('attachHint') })] })) : null] }), error ? _jsx(InfoBanner, { tone: "destructive", children: error }) : null, _jsx("div", { className: "flex justify-end", children: _jsxs(Button, { onClick: submit, disabled: connect.isPending || mode.isLoading || (!attachOpen && !domainReady), children: [connect.isPending ? _jsx(Loading, { className: "size-3.5 shrink-0" }) : null, attachOpen ? t('submitAttach') : t('submitCreate', { address })] }) })] }));
|
|
162
|
+
}
|
|
163
|
+
/** Add a custom domain to the account of `apiKey`. */
|
|
164
|
+
function AddDomain({ projectId, apiKey, onAdded, }) {
|
|
165
|
+
const t = useTranslations('emailConnect');
|
|
166
|
+
const add = useAddEmailDomain();
|
|
167
|
+
const [value, setValue] = useState('');
|
|
168
|
+
return (_jsxs("div", { className: "bg-muted/40 space-y-2 rounded-md border p-3", children: [_jsxs("div", { className: "flex gap-2", children: [_jsx(Input, { "aria-label": t('domainAddLabel'), value: value, onChange: (e) => setValue(e.target.value.trim().toLowerCase()), placeholder: "mail.example.com", autoComplete: "off", spellCheck: false, className: "min-w-0 flex-1" }), _jsxs(Button, { variant: "secondary", disabled: !value || add.isPending, onClick: () => add.mutate({ projectId, apiKey, domain: value }, { onSuccess: onAdded }), children: [add.isPending ? _jsx(Loading, { className: "size-3.5 shrink-0" }) : null, t('domainAddSubmit')] })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: add.isError ? _jsx("span", { className: "text-destructive", children: add.error.message }) : t('domainAddHint') })] }));
|
|
169
|
+
}
|
|
170
|
+
/** The DNS records an unverified domain still needs, with one-click setup and "Check again". */
|
|
171
|
+
function DomainRecords({ projectId, apiKey, domain, onChecked, }) {
|
|
172
|
+
const t = useTranslations('emailConnect');
|
|
173
|
+
const verify = useVerifyEmailDomain();
|
|
174
|
+
const setup = verify.data?.domain.domain === domain.domain ? verify.data.setup : null;
|
|
175
|
+
return (_jsxs("div", { className: "space-y-3 rounded-md border p-3", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "text-foreground text-sm font-medium", children: t('recordsTitle', { domain: domain.domain }) }), _jsx("p", { className: "text-muted-foreground mt-0.5 text-xs", children: domain.reason || t('recordsHint') })] }), _jsxs(Button, { size: "sm", variant: "secondary", disabled: !domain.domain_id || verify.isPending, onClick: () => domain.domain_id &&
|
|
176
|
+
verify.mutate({ projectId, apiKey, domainId: domain.domain_id }, { onSuccess: onChecked }), children: [verify.isPending ? _jsx(Loading, { className: "size-3.5 shrink-0" }) : null, t('recordsCheck')] })] }), setup ? (_jsx(Button, { size: "sm", asChild: true, children: _jsx(Link, { href: setup.url, target: "_blank", rel: "noopener noreferrer", children: setup.provider_name ? t('recordsOneClickAt', { provider: setup.provider_name }) : t('recordsOneClick') }) })) : null, _jsx("ul", { className: "divide-y rounded-md border", children: domain.records.map((record) => (_jsx(RecordRow, { record: record }, `${record.type}:${record.name}:${record.value}`))) }), verify.isError ? _jsx("p", { className: "text-destructive text-xs", children: verify.error.message }) : null] }));
|
|
177
|
+
}
|
|
178
|
+
function RecordRow({ record }) {
|
|
179
|
+
const t = useTranslations('emailConnect');
|
|
180
|
+
const { copied, copy } = useCopy({ toast: false });
|
|
181
|
+
const valid = record.status === 'VALID';
|
|
182
|
+
return (_jsxs("li", { className: "grid grid-cols-[3.5rem_minmax(0,1fr)_auto] items-start gap-2 px-3 py-2 text-xs", children: [_jsx("span", { className: "text-muted-foreground font-mono", children: record.type }), _jsxs("div", { className: "min-w-0 space-y-0.5", children: [_jsx("p", { className: "text-foreground truncate font-mono", children: record.name }), _jsxs("p", { className: "text-muted-foreground font-mono break-all", children: [record.priority !== undefined ? `${record.priority} ` : '', record.value] }), record.reason ? _jsx("p", { className: "text-destructive", children: record.reason }) : null] }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs", children: [valid ? _jsx(CheckIcon, { "aria-hidden": true, className: "text-kortix-green size-3.5" }) : null, valid ? t('recordValid') : t('recordMissing')] }), _jsx(Button, { size: "icon-sm", variant: "ghost", "aria-label": t('recordCopy'), onClick: () => void copy(record.value), children: copied ? _jsx(CheckIcon, { className: "size-3.5" }) : _jsx(CopyIcon, { className: "size-3.5" }) })] })] }));
|
|
183
|
+
}
|
|
@@ -3,3 +3,10 @@ export declare function SlackConnectCard({ projectId, oauthInstallUrl, canWrite,
|
|
|
3
3
|
oauthInstallUrl: string | null;
|
|
4
4
|
canWrite: boolean;
|
|
5
5
|
}): import("react").JSX.Element;
|
|
6
|
+
/**
|
|
7
|
+
* A Slack channel at a glance: the aubergine sidebar as a skeleton, then
|
|
8
|
+
* `#launch` with Slack's message anatomy — a rounded-square avatar, a bold
|
|
9
|
+
* name, a small timestamp, the blue mention pill, and the `APP` tag on the
|
|
10
|
+
* agent's reply. The composer at the bottom is a skeleton too.
|
|
11
|
+
*/
|
|
12
|
+
export declare function SlackChannelMock(): import("react").JSX.Element;
|
|
@@ -11,7 +11,6 @@ import { useTranslations } from '../../../i18n/index.js';
|
|
|
11
11
|
* teammate @mentions the agent and it answers.
|
|
12
12
|
*/
|
|
13
13
|
import { Kortix } from '../../../internal/icons/kortix.js';
|
|
14
|
-
import { Slack } from '../../../internal/icons/slack.js';
|
|
15
14
|
import { ChannelConnectHero } from './channel-connect-hero.js';
|
|
16
15
|
import { SlackByoWizard } from './slack-byo-wizard.js';
|
|
17
16
|
import { useState } from 'react';
|
|
@@ -38,7 +37,7 @@ const SLACK_UI = {
|
|
|
38
37
|
export function SlackConnectCard({ projectId, oauthInstallUrl, canWrite, }) {
|
|
39
38
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
40
39
|
const [wizardOpen, setWizardOpen] = useState(false);
|
|
41
|
-
return (_jsxs(_Fragment, { children: [_jsx(ChannelConnectHero, {
|
|
40
|
+
return (_jsxs(_Fragment, { children: [_jsx(ChannelConnectHero, { app: "slack", title: tI18nComplete.raw('text89e9e20668f3'), lede: oauthInstallUrl
|
|
42
41
|
? tI18nComplete.raw('textadb4acada861')
|
|
43
42
|
: tI18nComplete.raw('text4a79cdb7ab5e'), preview: _jsx(SlackChannelMock, {}), canWrite: canWrite, oneClickUrl: oauthInstallUrl, oneClickLabel: tI18nComplete.raw('text3357cd3d0cee'), ownAppLabel: tI18nComplete.raw('text260f0001800b'), setupLabel: tI18nComplete.raw('text68382ef84e6c'), readOnlyNote: tI18nComplete.raw('text581144514350'), onOwnApp: () => setWizardOpen(true) }), _jsx(SlackByoWizard, { projectId: projectId, open: wizardOpen, onOpenChange: setWizardOpen })] }));
|
|
44
43
|
}
|
|
@@ -48,7 +47,7 @@ export function SlackConnectCard({ projectId, oauthInstallUrl, canWrite, }) {
|
|
|
48
47
|
* name, a small timestamp, the blue mention pill, and the `APP` tag on the
|
|
49
48
|
* agent's reply. The composer at the bottom is a skeleton too.
|
|
50
49
|
*/
|
|
51
|
-
function SlackChannelMock() {
|
|
50
|
+
export function SlackChannelMock() {
|
|
52
51
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
53
52
|
return (_jsxs("div", { className: "flex flex-1", style: SLACK_UI, children: [_jsxs("div", { className: "flex w-28 shrink-0 flex-col gap-2.5 bg-(--slack-sidebar) px-3 py-4", children: [_jsx("span", { className: "mb-1.5 h-2.5 w-16 rounded-full bg-(--slack-on-sidebar)/50" }), _jsx("span", { className: "h-2 w-14 rounded-full bg-(--slack-on-sidebar)/20" }), _jsx("span", { className: "h-2 w-18 rounded-full bg-(--slack-on-sidebar)/20" }), _jsx("span", { className: "-mx-1.5 flex h-6 items-center rounded-md bg-(--slack-active) px-1.5", children: _jsx("span", { className: "h-2 w-12 rounded-full bg-(--slack-on-sidebar)/80" }) }), _jsx("span", { className: "h-2 w-16 rounded-full bg-(--slack-on-sidebar)/20" }), _jsx("span", { className: "h-2 w-10 rounded-full bg-(--slack-on-sidebar)/20" })] }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [_jsx("p", { className: "text-foreground border-b px-5 py-3 text-sm font-semibold", children: tI18nComplete.raw('textd3d6fcf27034') }), _jsxs("div", { className: "flex flex-1 flex-col gap-4 px-5 py-4", children: [_jsxs("div", { className: "flex gap-2.5", children: [_jsx("span", { className: "flex size-9 shrink-0 items-center justify-center rounded-lg bg-(--slack-avatar) text-sm font-semibold text-(--slack-on-sidebar)", children: "M" }), _jsxs("div", { className: "min-w-0 text-sm", children: [_jsxs("p", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-foreground font-semibold", children: tI18nComplete.raw('textc6c8dad55129') }), _jsx("span", { className: "text-muted-foreground text-xs tabular-nums", children: tI18nComplete.raw('text9a059d44c8e5') })] }), _jsxs("p", { className: "text-foreground", children: [_jsx("span", { className: "rounded-xs bg-(--slack-mention-fill) px-0.5 text-(--slack-mention)", children: tI18nComplete.raw('text9bfa706b0569') }), ' ', tI18nComplete.raw('text675d4a4174ba')] })] })] }), _jsxs("div", { className: "flex gap-2.5", children: [_jsx("span", { className: "bg-background flex size-9 shrink-0 items-center justify-center rounded-lg border", children: _jsx(Kortix, { className: "size-4" }) }), _jsxs("div", { className: "min-w-0 text-sm", children: [_jsxs("p", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-foreground font-semibold", children: "Kortix" }), _jsx("span", { className: "bg-muted text-muted-foreground rounded-xs px-1 text-xs font-semibold", children: "APP" }), _jsx("span", { className: "text-muted-foreground text-xs tabular-nums", children: tI18nComplete.raw('text9a059d44c8e5') })] }), _jsx("p", { className: "text-foreground text-pretty", children: tI18nComplete.raw('textbd52d3eb5ed1') })] })] })] }), _jsx("div", { className: "mx-5 mb-4 flex h-9 items-center rounded-lg border px-3", children: _jsx("span", { className: "bg-muted h-2 w-28 rounded-full" }) })] })] }));
|
|
54
53
|
}
|
|
@@ -4,3 +4,10 @@ export declare function TeamsConnectCard({ projectId, mode, canWrite, }: {
|
|
|
4
4
|
mode: TeamsMode;
|
|
5
5
|
canWrite: boolean;
|
|
6
6
|
}): import("react").JSX.Element;
|
|
7
|
+
/**
|
|
8
|
+
* A Teams channel at a glance: the app rail and the channel list as
|
|
9
|
+
* skeletons, then Launch's Posts tab with Teams' post anatomy — a card with a
|
|
10
|
+
* round initials avatar, a bold name and timestamp, the purple mention, and
|
|
11
|
+
* the agent's answer in the card's reply section. The composer is a skeleton.
|
|
12
|
+
*/
|
|
13
|
+
export declare function TeamsChannelMock(): import("react").JSX.Element;
|
|
@@ -11,7 +11,6 @@ import { useTranslations } from '../../../i18n/index.js';
|
|
|
11
11
|
* the one-click org-consent URL; the bring-your-own path is `TeamsByoWizard`.
|
|
12
12
|
*/
|
|
13
13
|
import { Kortix } from '../../../internal/icons/kortix.js';
|
|
14
|
-
import { MicrosoftTeams } from '../../../internal/icons/microsoft-teams.js';
|
|
15
14
|
import { ChannelConnectHero } from './channel-connect-hero.js';
|
|
16
15
|
import { TeamsByoWizard } from './teams-byo-wizard.js';
|
|
17
16
|
import { useState } from 'react';
|
|
@@ -33,7 +32,7 @@ export function TeamsConnectCard({ projectId, mode, canWrite, }) {
|
|
|
33
32
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
34
33
|
const [wizardOpen, setWizardOpen] = useState(false);
|
|
35
34
|
const oneClickUrl = mode.available && !mode.byo ? mode.orgConsentUrl : null;
|
|
36
|
-
return (_jsxs(_Fragment, { children: [_jsx(ChannelConnectHero, {
|
|
35
|
+
return (_jsxs(_Fragment, { children: [_jsx(ChannelConnectHero, { app: "teams", title: tI18nComplete.raw('textc1bd5ca19f5f'), lede: oneClickUrl
|
|
37
36
|
? tI18nComplete.raw('texta15b754f2e91')
|
|
38
37
|
: tI18nComplete.raw('text7fd0fd8f2405'), preview: _jsx(TeamsChannelMock, {}), canWrite: canWrite, oneClickUrl: oneClickUrl, oneClickLabel: tI18nComplete.raw('text1fece1858ee9'), ownAppLabel: tI18nComplete.raw('texte2065cb79c86'), setupLabel: tI18nComplete.raw('texte2065cb79c86'), readOnlyNote: tI18nComplete.raw('text776fd1de4147'), onOwnApp: () => setWizardOpen(true) }), _jsx(TeamsByoWizard, { projectId: projectId, mode: mode, open: wizardOpen, onOpenChange: setWizardOpen })] }));
|
|
39
38
|
}
|
|
@@ -43,7 +42,7 @@ export function TeamsConnectCard({ projectId, mode, canWrite, }) {
|
|
|
43
42
|
* round initials avatar, a bold name and timestamp, the purple mention, and
|
|
44
43
|
* the agent's answer in the card's reply section. The composer is a skeleton.
|
|
45
44
|
*/
|
|
46
|
-
function TeamsChannelMock() {
|
|
45
|
+
export function TeamsChannelMock() {
|
|
47
46
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
48
47
|
return (_jsxs("div", { className: "flex flex-1", style: TEAMS_UI, children: [_jsxs("div", { className: "bg-muted/60 flex w-12 shrink-0 flex-col items-center gap-3 py-4", children: [_jsx("span", { className: "size-5 rounded-md bg-(--teams-brand)" }), _jsx("span", { className: "bg-muted-foreground/25 size-5 rounded-md" }), _jsx("span", { className: "bg-muted-foreground/25 size-5 rounded-md" }), _jsx("span", { className: "bg-muted-foreground/25 size-5 rounded-md" })] }), _jsxs("div", { className: "bg-muted/30 flex w-28 shrink-0 flex-col gap-3 border-e px-3 py-4", children: [_jsx("span", { className: "bg-muted-foreground/40 mb-1 h-2.5 w-14 rounded-full" }), _jsx("span", { className: "bg-muted-foreground/20 h-2 w-16 rounded-full" }), _jsx("span", { className: "bg-background -mx-1.5 flex h-6 items-center rounded-md border px-1.5", children: _jsx("span", { className: "bg-muted-foreground/50 h-2 w-12 rounded-full" }) }), _jsx("span", { className: "bg-muted-foreground/20 h-2 w-14 rounded-full" })] }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex items-end gap-4 border-b px-4 pt-3", children: [_jsx("p", { className: "text-foreground pb-2.5 text-sm font-semibold", children: tI18nComplete.raw('texta4b2d28ad49b') }), _jsx("p", { className: "text-foreground border-b-2 border-(--teams-brand) pb-2 text-xs font-semibold", children: tI18nComplete.raw('text2c2e44899866') })] }), _jsxs("div", { className: "bg-muted/30 flex flex-1 flex-col justify-between gap-4 p-4", children: [_jsxs("div", { className: "bg-background overflow-hidden rounded-md border shadow-xs", children: [_jsxs("div", { className: "flex gap-2.5 p-3", children: [_jsx("span", { className: "flex size-8 shrink-0 items-center justify-center rounded-full bg-(--teams-avatar) text-xs font-semibold text-(--teams-avatar-text)", children: "M" }), _jsxs("div", { className: "min-w-0 text-sm", children: [_jsxs("p", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-foreground font-semibold", children: tI18nComplete.raw('textc6c8dad55129') }), _jsx("span", { className: "text-muted-foreground text-xs tabular-nums", children: tI18nComplete.raw('text9a059d44c8e5') })] }), _jsxs("p", { className: "text-foreground", children: [_jsx("span", { className: "font-semibold text-(--teams-brand)", children: "Kortix" }), ' ', tI18nComplete.raw('text5df6373cf99f')] })] })] }), _jsxs("div", { className: "bg-muted/30 flex gap-2.5 border-t py-2.5 ps-6 pe-3", children: [_jsx("span", { className: "bg-background flex size-6 shrink-0 items-center justify-center rounded-full border", children: _jsx(Kortix, { className: "size-3" }) }), _jsxs("div", { className: "min-w-0 text-sm", children: [_jsxs("p", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-foreground font-semibold", children: "Kortix" }), _jsx("span", { className: "text-muted-foreground text-xs tabular-nums", children: tI18nComplete.raw('text92dca4f34a6f') })] }), _jsx("p", { className: "text-foreground text-pretty", children: tI18nComplete.raw('textf4d1a9671f2f') })] })] })] }), _jsx("div", { className: "bg-background flex h-9 items-center rounded-md border px-3", children: _jsx("span", { className: "bg-muted h-2 w-24 rounded-full" }) })] })] })] }));
|
|
49
48
|
}
|