@kortix/ui 0.14.8 → 0.14.9
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 +63 -3
- package/dist/_vendor/shared/app-config.d.ts +175 -0
- package/dist/_vendor/shared/channel-message.d.ts +34 -5
- package/dist/_vendor/shared/index.d.ts +1 -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 +11 -5
- 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 +51 -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 +16 -25
- 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 +5 -0
- package/dist/customize/sections/view/channels-view.d.ts +5 -1
- package/dist/customize/sections/view/channels-view.js +61 -75
- package/dist/customize/sections/view/gateway/gateway-overview.js +10 -2
- package/dist/customize/settings/tabs/experimental-tab.js +35 -16
- package/dist/customize/shared/catalog/catalog-empty-state.d.ts +1 -12
- package/dist/customize/shared/catalog/catalog-empty-state.js +3 -3
- 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 +46 -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 +873 -85
- package/dist/i18n/en.js +888 -100
- 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/auth/auth-card-shell.js +3 -3
- package/dist/internal/components/agent-mark.js +5 -2
- package/dist/internal/connector-logo/connector-logo-source.d.ts +63 -0
- package/dist/internal/connector-logo/connector-logo-source.js +48 -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/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/injected-scripts.d.ts +7 -0
- package/dist/internal/lib/browser-noise/rules/injected-scripts.js +15 -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 +9 -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/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 +6 -2
- 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/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-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 +5 -1
- package/dist/session/participants/session-participants.js +9 -2
- package/dist/session/prompts/approval-request.d.ts +5 -0
- package/dist/session/prompts/approval-request.js +7 -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 +3 -1
- package/dist/session/thread/session-thread.js +9 -2
- 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 +240 -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 +7 -1
- package/dist/session/turn/user-message.js +21 -7
- 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/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-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 +9 -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 +27 -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 +28 -4
- 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
|
@@ -18,9 +18,10 @@ import { useTranslations } from '../../../i18n/index.js';
|
|
|
18
18
|
*/
|
|
19
19
|
import { UnifiedMarkdown } from '../../../markdown/index.js';
|
|
20
20
|
import { Button } from '../../../primitives/button.js';
|
|
21
|
+
import { ButtonGroup } from '../../../primitives/button-group.js';
|
|
21
22
|
import { InfoBanner } from '../../../primitives/info-banner.js';
|
|
22
23
|
import Loading from '../../../primitives/loading.js';
|
|
23
|
-
import { Modal, ModalContent, ModalHeader, ModalTitle } from '../../../primitives/modal.js';
|
|
24
|
+
import { Modal, ModalClose, ModalContent, ModalHeader, ModalTitle } from '../../../primitives/modal.js';
|
|
24
25
|
import { Skeleton } from '../../../primitives/skeleton.js';
|
|
25
26
|
import { errorToast, successToast } from '../../../primitives/toast.js';
|
|
26
27
|
import { ChangeList, ChangeSummary, DiffLayoutToggle, ExpandAllButton, diffViewportClass, entryFromCommitFile, fileCount, proposedChangeTimeline, splitUnifiedPatch, useChangeExpansion, } from '../../../changes/index.js';
|
|
@@ -28,10 +29,12 @@ import { EmptyState } from '../../../primitives/empty-state.js';
|
|
|
28
29
|
import { manifestFilename, useProjectManifestVersion, } from '../../../internal/lib/manifest-version.js';
|
|
29
30
|
import { useProjectCans } from '../../../internal/lib/use-project-can.js';
|
|
30
31
|
import { REVIEW_CONTROL_ACTIONS, changeRequestControlsFrom } from '@kortix/sdk';
|
|
31
|
-
import { ArrowCounterClockwiseIcon, CheckIcon, FileDashedIcon, SparkleIcon, WarningIcon, } from '@phosphor-icons/react';
|
|
32
|
+
import { ArrowCounterClockwiseIcon, CheckIcon, FileDashedIcon, SparkleIcon, WarningIcon, XIcon, } from '@phosphor-icons/react';
|
|
32
33
|
import { formatDistanceToNowStrict } from 'date-fns';
|
|
33
34
|
import { useMemo, useState } from 'react';
|
|
34
35
|
import { useProjectContext } from '../context.js';
|
|
36
|
+
import { uiRoutes } from '../../../lib/routes.js';
|
|
37
|
+
import { useUiRouter } from '../../../providers/ui-provider.js';
|
|
35
38
|
import { ChangeRequestStatusBadge } from './change-request-status-badge.js';
|
|
36
39
|
import { useChangeRequestRecovery } from '../hooks/use-change-request-recovery.js';
|
|
37
40
|
import { useChangeRequest, useChangeRequestDiff, useChangeRequestMergePreview, useCloseChangeRequest, useMergeChangeRequest, useReopenChangeRequest, } from '../hooks/use-change-requests.js';
|
|
@@ -44,6 +47,7 @@ export const diffRendererViewportClass = diffViewportClass;
|
|
|
44
47
|
const relative = (iso) => formatDistanceToNowStrict(new Date(iso), { addSuffix: true });
|
|
45
48
|
export function ChangeRequestDetailDialog({ crId, onClose, onOpenChangeRequest }) {
|
|
46
49
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
50
|
+
const router = useUiRouter();
|
|
47
51
|
const open = crId !== null;
|
|
48
52
|
const detailQuery = useChangeRequest(crId);
|
|
49
53
|
const diffQuery = useChangeRequestDiff(crId);
|
|
@@ -125,6 +129,7 @@ export function ChangeRequestDetailDialog({ crId, onClose, onOpenChangeRequest }
|
|
|
125
129
|
number: cr.number,
|
|
126
130
|
title: cr.title,
|
|
127
131
|
headRef: cr.head_ref,
|
|
132
|
+
originSessionId: cr.origin_session_id,
|
|
128
133
|
baseRef: cr.base_ref,
|
|
129
134
|
}, recoveryBlocker, onClose);
|
|
130
135
|
};
|
|
@@ -147,7 +152,12 @@ export function ChangeRequestDetailDialog({ crId, onClose, onOpenChangeRequest }
|
|
|
147
152
|
const blocked = recoveryBlocker !== null;
|
|
148
153
|
// An open change offers Dismiss and the apply; a closed one offers Reopen.
|
|
149
154
|
const hasDecision = cr?.status === 'open' ? controls.canClose || controls.canMerge : controls.canClose;
|
|
150
|
-
return (_jsx(Modal, { open: open, onOpenChange: (v) => !v && onClose(), children: _jsxs(ModalContent, { className: "flex h-[94dvh] max-h-[94dvh] min-h-0 w-full flex-col gap-0 space-y-0 overflow-hidden p-0 lg:h-[90vh] lg:max-h-[90vh] lg:min-h-[90vh] lg:max-w-5xl",
|
|
155
|
+
return (_jsx(Modal, { open: open, onOpenChange: (v) => !v && onClose(), children: _jsxs(ModalContent, { className: "flex h-[94dvh] max-h-[94dvh] min-h-0 w-full flex-col gap-0 space-y-0 overflow-hidden p-0 lg:h-[90vh] lg:max-h-[90vh] lg:min-h-[90vh] lg:max-w-5xl", showCloseButton: false,
|
|
156
|
+
// The session that proposed this change is where its reasoning lives.
|
|
157
|
+
closeButtonChildren: _jsxs(ButtonGroup, { children: [cr?.origin_session_id && projectId ? (_jsx(Button, { variant: "secondary", size: "sm", onClick: () => {
|
|
158
|
+
router.push(uiRoutes().session(projectId, cr.origin_session_id));
|
|
159
|
+
onClose();
|
|
160
|
+
}, children: tI18nComplete.raw('textb205bb47f81a') })) : null, _jsx(ModalClose, { asChild: true, children: _jsx(Button, { variant: "secondary", size: "icon-base", "aria-label": tI18nComplete.raw('text7d9eb7acb13e'), children: _jsx(XIcon, { className: "size-4" }) }) })] }), children: [_jsx(ModalHeader, { className: "flex shrink-0 flex-col space-y-0 border-b px-5 py-4 pr-48", children: !cr ? (_jsxs("div", { className: "space-y-2", children: [_jsx(ModalTitle, { className: "sr-only", children: tI18nComplete.raw('text28b00af7cb71') }), _jsx(Skeleton, { className: "h-5 w-2/3" }), _jsx(Skeleton, { className: "h-3 w-1/3" })] })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex min-w-0 items-start gap-2.5", children: [_jsx(ModalTitle, { className: "text-foreground min-w-0 flex-1 text-base leading-snug font-medium text-balance", children: cr.title || tI18nComplete.raw('text63cb7c2ea609') }), _jsx(ChangeRequestStatusBadge, { cr: cr, onOpenChangeRequest: onOpenChangeRequest })] }), _jsxs("p", { className: "text-muted-foreground mt-1 flex min-w-0 flex-wrap items-center gap-x-1.5 text-xs", children: [_jsxs("span", { className: "tabular-nums", children: ["#", cr.number] }), _jsx("span", { className: "text-muted-foreground", "aria-hidden": true, children: tI18nComplete.raw('text3b9453dad42b') }), _jsx("span", { children: proposedChangeTimeline(cr, relative, tI18nComplete) }), cr.base_ref !== defaultBranch && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground", "aria-hidden": true, children: tI18nComplete.raw('text3b9453dad42b') }), _jsxs("span", { className: "truncate", children: [tI18nComplete.raw('text6b847a0ed0b2'), " ", cr.base_ref] })] }))] })] })) }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto overscroll-contain", children: _jsxs("div", { className: "space-y-4 px-5 py-4", children: [manifestIssues !== null && (_jsx(InfoBanner, { tone: "destructive", icon: WarningIcon, title: tI18nComplete('text8e5d6f03865c', { value0: manifestFile }), children: manifestIssues.length > 0 ? (_jsx("ul", { className: "mt-1 space-y-1", children: dedupeIssues(manifestIssues).map(({ key, issue }) => (_jsxs("li", { children: [_jsx("code", { className: "text-foreground font-mono text-xs break-all", children: issue.path }), ' ', issue.message, issue.line
|
|
151
161
|
? tI18nComplete('texta6b97728ff89', { value0: issue.line })
|
|
152
162
|
: ''] }, key))) })) : (_jsx("span", { children: tI18nComplete.raw('textcc85fb556a48') })) })), manifestIssues === null && conflictPaths !== null && conflictPaths.length > 0 && (_jsx(InfoBanner, { tone: "warning", icon: WarningIcon, title: tI18nComplete('text57bbed2817ff', {
|
|
153
163
|
value0: fileCount(conflictPaths.length),
|
|
@@ -10,7 +10,7 @@ import { errorToast, successToast } from '../../../primitives/toast.js';
|
|
|
10
10
|
import { DRAG_MIME } from '../../tree/components/file-tree-item.js';
|
|
11
11
|
import { useFilesStore, useFilesStoreApi } from '../../../internal/stores/files-store.js';
|
|
12
12
|
import { EmptyState } from '../../../primitives/empty-state.js';
|
|
13
|
-
import {
|
|
13
|
+
import { EmptyArt } from '../../../primitives/empty-art.js';
|
|
14
14
|
import { ErrorState } from '../../../primitives/error-state.js';
|
|
15
15
|
import { isSandboxNotReadyError } from '@kortix/sdk';
|
|
16
16
|
import { ClipboardIcon as Clipboard, FolderPlusIcon as FolderPlus, ClipboardTextIcon, MoonIcon, XIcon, UploadSimpleIcon, UploadIcon as Upload, ArrowsLeftRightIcon, CheckSquareIcon, TrashIcon, } from '@phosphor-icons/react';
|
|
@@ -25,7 +25,7 @@ import { DriveCreateDialog, } from './drive-create-dialog.js';
|
|
|
25
25
|
import { DriveGridView } from './drive-grid-view.js';
|
|
26
26
|
import { DriveListView } from './drive-list-view.js';
|
|
27
27
|
import { useDriveUploads } from '../store/upload-store.js';
|
|
28
|
-
import {
|
|
28
|
+
import { DriveActionRow, DriveNewMenu, DriveNewMenuItems, DrivePathBar, DriveViewMenu, } from './drive-toolbar.js';
|
|
29
29
|
import { createSelectionStore, DRIVE_ITEM_ATTR, DriveSelectionContext, } from './drive-selection.js';
|
|
30
30
|
import { DriveSelectionBar } from './drive-selection-bar.js';
|
|
31
31
|
import { DriveRenameContext, DriveRenameDialog } from './drive-rename-dialog.js';
|
|
@@ -987,18 +987,18 @@ export function DriveExplorer({ embedded = false, shareContext, leading, trailin
|
|
|
987
987
|
elevatedDirs.length === 0 &&
|
|
988
988
|
dirs.length === 0 &&
|
|
989
989
|
fileItems.length === 0;
|
|
990
|
-
return (_jsx(DriveSelectionContext.Provider, { value: selectionValue, children: _jsx(DriveRenameContext.Provider, { value: canWrite ? requestRename : null, children: _jsxs("div", { className: "bg-background relative flex h-full flex-col", onDragEnter: handlePageDragEnter, onDragLeave: handlePageDragLeave, onDragOver: handlePageDragOver, onDrop: handlePageDrop, children: [
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
990
|
+
return (_jsx(DriveSelectionContext.Provider, { value: selectionValue, children: _jsx(DriveRenameContext.Provider, { value: canWrite ? requestRename : null, children: _jsxs("div", { className: "bg-background relative flex h-full flex-col", onDragEnter: handlePageDragEnter, onDragLeave: handlePageDragLeave, onDragOver: handlePageDragOver, onDrop: handlePageDrop, children: [_jsx(DriveActionRow, { leading: leading, actions: (() => {
|
|
991
|
+
const newMenu = (_jsx(DriveNewMenu, { compact: embedded, onUpload: canWrite && filesAllowedHere ? handleUpload : undefined, onUploadFolder: canWrite ? handlePickFolder : undefined, onNewFile: canWrite && filesAllowedHere && capabilities.newFile !== false ? () => setCreateKind('file') : undefined, onNewFolder: canWrite ? () => setCreateKind('folder') : undefined }));
|
|
992
|
+
const viewMenu = (_jsx(DriveViewMenu, { variant: "secondary", showSearch: capabilities.search, showHiddenToggle: capabilities.hiddenToggle, onRefresh: () => refetchFiles(), isRefreshing: isFetching, onDownloadDir: () => {
|
|
993
|
+
const dirName = isRootPath
|
|
994
|
+
? 'workspace'
|
|
995
|
+
: currentPath.split('/').filter(Boolean).pop() || 'directory';
|
|
996
|
+
const dirPath = isRootPath ? '/workspace' : currentPath;
|
|
997
|
+
downloadDir(dirPath, dirName);
|
|
998
|
+
}, isDownloading: isDirDownloading(isRootPath ? '/workspace' : currentPath), sortDisabled: partial }));
|
|
999
|
+
// One secondary group whether or not the host adds actions.
|
|
1000
|
+
return (_jsxs(_Fragment, { children: [newMenu, viewMenu, trailing] }));
|
|
1001
|
+
})() }), _jsx(DrivePathBar, { as: "row", rootLabel: rootLabel, rootIcon: rootIcon, base: pathBase }), capabilities.search && isSearchOpen && _jsx(FileSearch, {}), _jsx("input", { type: "file", ref: fileInputRef, className: "hidden", onChange: handleFileInputChange, multiple: true }), _jsx("input", { type: "file", ref: folderPickerRef, className: "hidden", multiple: true, webkitdirectory: '', onChange: (e) => {
|
|
1002
1002
|
const picked = e.target.files;
|
|
1003
1003
|
if (picked?.length)
|
|
1004
1004
|
void handleUploadFolder(picked);
|
|
@@ -1011,7 +1011,7 @@ export function DriveExplorer({ embedded = false, shareContext, leading, trailin
|
|
|
1011
1011
|
!isLoading &&
|
|
1012
1012
|
(sandboxWaking ? (_jsxs("div", { className: "flex flex-col items-center justify-center gap-3 py-16 text-center", children: [_jsx(Loading, { className: "text-muted-foreground size-4" }), _jsx("p", { className: "text-muted-foreground text-sm font-medium", children: tHardcodedUi.raw('i18nComplete.text5e3de76869f3') }), _jsx("p", { className: "text-muted-foreground max-w-xs text-xs", children: tHardcodedUi.raw('i18nComplete.textc1b1dc22e207') })] })) : (_jsx(ErrorState, { title: tHardcodedUi.raw('featuresProjectFilesComponentsFileExplorerPage.line658JsxTextFailedToLoadFiles'), description: error instanceof Error
|
|
1013
1013
|
? error.message
|
|
1014
|
-
: tHardcodedUi.raw('i18nComplete.text27c2ccd962c2'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => refetchFiles(), children: tHardcodedUi.raw('i18nComplete.text942087cc2d41') }) }))), isEmpty && parked && (_jsx(EmptyState, { icon: MoonIcon, title: tHardcodedUi.raw('i18nComplete.text3915f5ca49b3') })), isEmpty && !parked && (_jsx(EmptyState, { className: "min-h-full", media: _jsx(
|
|
1014
|
+
: tHardcodedUi.raw('i18nComplete.text27c2ccd962c2'), action: _jsx(Button, { variant: "outline", size: "sm", onClick: () => refetchFiles(), children: tHardcodedUi.raw('i18nComplete.text942087cc2d41') }) }))), isEmpty && parked && (_jsx(EmptyState, { icon: MoonIcon, title: tHardcodedUi.raw('i18nComplete.text3915f5ca49b3') })), isEmpty && !parked && (_jsx(EmptyState, { className: "min-h-full", media: _jsx(EmptyArt, {}), title: tHardcodedUi.raw('featuresProjectFilesComponentsDriveListView.line396JsxTextThisFolderIsEmpty'), description: canWrite
|
|
1015
1015
|
? tHardcodedUi.raw('i18nComplete.text9720774edbde')
|
|
1016
1016
|
: tHardcodedUi.raw('featuresProjectFilesComponentsDriveListView.line398JsxTextNoFilesOrSubfoldersAtThisPathIn'),
|
|
1017
1017
|
// An empty folder with no way to add a file is the worst case of
|
|
@@ -21,6 +21,15 @@ import { type ComponentType, type ReactNode } from 'react';
|
|
|
21
21
|
* every other project surface.
|
|
22
22
|
*/
|
|
23
23
|
export declare const DRIVE_ACTION_ROW_CLASS = "border-border/60 flex h-11 shrink-0 items-center gap-1 border-b px-4";
|
|
24
|
+
/**
|
|
25
|
+
* The action row itself: the host's `leading` chrome, then the actions as one
|
|
26
|
+
* secondary button group at the trailing edge. The live explorer and the
|
|
27
|
+
* session panel's booting Files card both draw it, so the two cannot drift.
|
|
28
|
+
*/
|
|
29
|
+
export declare function DriveActionRow({ leading, actions }: {
|
|
30
|
+
leading?: ReactNode;
|
|
31
|
+
actions?: ReactNode;
|
|
32
|
+
}): import("react").JSX.Element;
|
|
24
33
|
interface DrivePathBarProps {
|
|
25
34
|
/**
|
|
26
35
|
* Word for the root crumb. The standalone page passes its own page title
|
|
@@ -75,6 +84,8 @@ export interface DriveViewMenuProps {
|
|
|
75
84
|
sortDisabled?: boolean;
|
|
76
85
|
/** `secondary` when the trigger sits in a button group with New. */
|
|
77
86
|
variant?: 'ghost' | 'secondary';
|
|
87
|
+
/** Show the trigger, inert (a session explorer whose computer is booting). */
|
|
88
|
+
disabled?: boolean;
|
|
78
89
|
}
|
|
79
90
|
/**
|
|
80
91
|
* Every rare Drive control behind one `⋯`: view mode, sort, dotfiles, search,
|
|
@@ -82,7 +93,7 @@ export interface DriveViewMenuProps {
|
|
|
82
93
|
* they were most of the crowding on both surfaces, and none of them is reached
|
|
83
94
|
* more than once a session.
|
|
84
95
|
*/
|
|
85
|
-
export declare function DriveViewMenu({ onDownloadDir, onRefresh, isRefreshing, isDownloading, showSearch, showHiddenToggle, sortDisabled, variant, }: DriveViewMenuProps): import("react").JSX.Element;
|
|
96
|
+
export declare function DriveViewMenu({ onDownloadDir, onRefresh, isRefreshing, isDownloading, showSearch, showHiddenToggle, sortDisabled, variant, disabled, }: DriveViewMenuProps): import("react").JSX.Element;
|
|
86
97
|
interface DriveNewMenuProps {
|
|
87
98
|
/**
|
|
88
99
|
* Write affordances. Each renders only when passed; read-only sources
|
|
@@ -97,6 +108,9 @@ interface DriveNewMenuProps {
|
|
|
97
108
|
onNewFolder?: () => void;
|
|
98
109
|
/** Drop the label and render a `+` square. For narrow panels. */
|
|
99
110
|
compact?: boolean;
|
|
111
|
+
/** Show the trigger, inert, with no write handler yet (a session explorer
|
|
112
|
+
* whose computer is booting). */
|
|
113
|
+
disabled?: boolean;
|
|
100
114
|
}
|
|
101
115
|
/** The "New" menu renders when the explorer supplied any write handler. */
|
|
102
116
|
export declare function hasWriteActions(props: Pick<DriveNewMenuProps, 'onUpload' | 'onNewFile' | 'onNewFolder'>): boolean;
|
|
@@ -117,5 +131,5 @@ export declare function DriveNewMenuItems({ Item, Separator: MenuSeparator, onUp
|
|
|
117
131
|
onNewFile?: () => void;
|
|
118
132
|
onNewFolder?: () => void;
|
|
119
133
|
}): import("react").JSX.Element;
|
|
120
|
-
export declare function DriveNewMenu({ onUpload, onUploadFolder, onNewFile, onNewFolder, compact, }: DriveNewMenuProps): import("react").JSX.Element | null;
|
|
134
|
+
export declare function DriveNewMenu({ onUpload, onUploadFolder, onNewFile, onNewFolder, compact, disabled, }: DriveNewMenuProps): import("react").JSX.Element | null;
|
|
121
135
|
export {};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { Button } from '../../../primitives/button.js';
|
|
4
|
+
import { ButtonGroup } from '../../../primitives/button-group.js';
|
|
4
5
|
import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from '../../../primitives/dropdown-menu.js';
|
|
5
6
|
import { FadedScrollArea } from '../../../primitives/faded-scroll-area.js';
|
|
6
7
|
import Hint from '../../../primitives/hint.js';
|
|
@@ -33,6 +34,14 @@ import { Download } from '../../../internal/icons/download.js';
|
|
|
33
34
|
* every other project surface.
|
|
34
35
|
*/
|
|
35
36
|
export const DRIVE_ACTION_ROW_CLASS = 'border-border/60 flex h-11 shrink-0 items-center gap-1 border-b px-4';
|
|
37
|
+
/**
|
|
38
|
+
* The action row itself: the host's `leading` chrome, then the actions as one
|
|
39
|
+
* secondary button group at the trailing edge. The live explorer and the
|
|
40
|
+
* session panel's booting Files card both draw it, so the two cannot drift.
|
|
41
|
+
*/
|
|
42
|
+
export function DriveActionRow({ leading, actions }) {
|
|
43
|
+
return (_jsxs("div", { className: DRIVE_ACTION_ROW_CLASS, children: [leading, actions ? _jsx(ButtonGroup, { className: "ml-auto shrink-0", children: actions }) : null] }));
|
|
44
|
+
}
|
|
36
45
|
/**
|
|
37
46
|
* Breadcrumbs for the current directory, and nothing else.
|
|
38
47
|
*
|
|
@@ -144,7 +153,7 @@ const SORT_LABEL = {
|
|
|
144
153
|
* they were most of the crowding on both surfaces, and none of them is reached
|
|
145
154
|
* more than once a session.
|
|
146
155
|
*/
|
|
147
|
-
export function DriveViewMenu({ onDownloadDir, onRefresh, isRefreshing, isDownloading, showSearch = false, showHiddenToggle = false, sortDisabled = false, variant = 'ghost', }) {
|
|
156
|
+
export function DriveViewMenu({ onDownloadDir, onRefresh, isRefreshing, isDownloading, showSearch = false, showHiddenToggle = false, sortDisabled = false, variant = 'ghost', disabled, }) {
|
|
148
157
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
149
158
|
const viewMode = useFilesStore((s) => s.viewMode);
|
|
150
159
|
const setViewMode = useFilesStore((s) => s.setViewMode);
|
|
@@ -155,7 +164,7 @@ export function DriveViewMenu({ onDownloadDir, onRefresh, isRefreshing, isDownlo
|
|
|
155
164
|
const showHidden = useFilesStore((s) => s.showHidden);
|
|
156
165
|
const toggleHidden = useFilesStore((s) => s.toggleHidden);
|
|
157
166
|
const toggleSearch = useFilesStore((s) => s.toggleSearch);
|
|
158
|
-
return (_jsxs(DropdownMenu, { children: [_jsx(Hint, { label: tI18nComplete.raw('text1d55ff7c387c'), side: "bottom", children: _jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: variant,
|
|
167
|
+
return (_jsxs(DropdownMenu, { children: [_jsx(Hint, { label: tI18nComplete.raw('text1d55ff7c387c'), side: "bottom", children: _jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: _jsx(Button, { variant: variant,
|
|
159
168
|
// In the button group it matches New and Share: 32px, not 28px.
|
|
160
169
|
size: variant === 'secondary' ? 'icon-base' : 'icon-sm', "aria-label": tI18nComplete.raw('text1d55ff7c387c'), className: cn('active:scale-[0.96]', variant === 'ghost' && 'text-muted-foreground hover:text-foreground'), children: _jsx(DotsThree, { weight: "bold", className: "size-4" }) }) }) }), _jsxs(DropdownMenuContent, { align: "end", className: "w-56", children: [_jsxs(DropdownMenuSub, { children: [_jsxs(DropdownMenuSubTrigger, { children: [_jsx("span", { className: "min-w-0 flex-1", children: tI18nComplete.raw('textdcc839a4015c') }), _jsx("span", { className: "text-muted-foreground", children: VIEW_LABEL[viewMode] })] }), _jsx(DropdownMenuSubContent, { className: "w-40", children: _jsxs(DropdownMenuRadioGroup, { value: viewMode, onValueChange: (v) => setViewMode(v), children: [_jsxs(DropdownMenuRadioItem, { value: "list", children: [_jsx(ListSolid, {}), tI18nComplete.raw('text6f202f54a7b2')] }), _jsxs(DropdownMenuRadioItem, { value: "grid", children: [_jsx(LayoutGrid, {}), tI18nComplete.raw('text0d7d12ac624c')] })] }) })] }), _jsxs(DropdownMenuSub, { children: [_jsxs(DropdownMenuSubTrigger, { disabled: sortDisabled, children: [_jsx("span", { className: "min-w-0 flex-1", children: tI18nComplete.raw('textc9129025bd3f') }), _jsx("span", { className: "text-muted-foreground", children: SORT_LABEL[sortBy] })] }), _jsxs(DropdownMenuSubContent, { className: "w-44", children: [_jsxs(DropdownMenuRadioGroup, { value: sortBy, onValueChange: (v) => setSortBy(v), children: [_jsx(DropdownMenuRadioItem, { value: "name", children: tI18nComplete.raw('textdcd1d5223f73') }), _jsx(DropdownMenuRadioItem, { value: "type", children: tI18nComplete.raw('textbaaddf70fb5d') })] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuRadioGroup, { value: sortOrder, onValueChange: (v) => setSortOrder(v), children: [_jsx(DropdownMenuRadioItem, { value: "asc", children: tI18nComplete.raw('text77184595bde3') }), _jsx(DropdownMenuRadioItem, { value: "desc", children: tI18nComplete.raw('text79479a6c76d8') })] })] })] }), _jsx(DropdownMenuSeparator, {}), showHiddenToggle && (
|
|
161
170
|
// `reverse` puts the check on the RIGHT edge, where the radio rows
|
|
@@ -177,9 +186,9 @@ export function DriveNewMenuItems({ Item, Separator: MenuSeparator, onUpload, on
|
|
|
177
186
|
const tDrives = useTranslations('drives');
|
|
178
187
|
return (_jsxs(_Fragment, { children: [onUpload ? (_jsxs(Item, { onClick: onUpload, children: [_jsx(UploadSimpleIcon, { className: "size-3.5 shrink-0" }), tI18nComplete.raw('text4118deee6e13')] })) : null, onUploadFolder ? (_jsxs(Item, { onClick: onUploadFolder, children: [_jsx(FolderOpenIcon, { className: "size-3.5 shrink-0" }), tDrives('uploadFolder')] })) : null, (onUpload || onUploadFolder) && (onNewFile || onNewFolder) ? _jsx(MenuSeparator, {}) : null, onNewFile ? (_jsxs(Item, { onClick: onNewFile, children: [_jsx(FilePlusIcon, { className: "size-3.5 shrink-0" }), tI18nComplete.raw('text44dedd0f97fe')] })) : null, onNewFolder ? (_jsxs(Item, { onClick: onNewFolder, children: [_jsx(FolderPlusIcon, { className: "size-3.5 shrink-0" }), tI18nComplete.raw('textcf28f49ec597')] })) : null] }));
|
|
179
188
|
}
|
|
180
|
-
export function DriveNewMenu({ onUpload, onUploadFolder, onNewFile, onNewFolder, compact, }) {
|
|
189
|
+
export function DriveNewMenu({ onUpload, onUploadFolder, onNewFile, onNewFolder, compact, disabled, }) {
|
|
181
190
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
182
|
-
if (!hasWriteActions({ onUpload, onNewFile, onNewFolder }))
|
|
191
|
+
if (!disabled && !hasWriteActions({ onUpload, onNewFile, onNewFolder }))
|
|
183
192
|
return null;
|
|
184
|
-
return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: compact ? (_jsx(Button, { variant: "secondary", size: "icon-base", "aria-label": tI18nComplete.raw('text18fdd549b2ed'), className: "active:scale-[0.96]", children: _jsx(PlusIcon, { className: "size-4" }) })) : (_jsxs(Button, { variant: "secondary", size: "sm", className: "gap-1.5 active:scale-[0.96]", children: [_jsx(PlusIcon, { className: "size-3.5 shrink-0" }), tI18nComplete.raw('text18fdd549b2ed')] })) }), _jsx(DropdownMenuContent, { align: "end", className: "w-48", children: _jsx(DriveNewMenuItems, { Item: DropdownMenuItem, Separator: DropdownMenuSeparator, onUpload: onUpload, onUploadFolder: onUploadFolder, onNewFile: onNewFile, onNewFolder: onNewFolder }) })] }));
|
|
193
|
+
return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: compact ? (_jsx(Button, { variant: "secondary", size: "icon-base", "aria-label": tI18nComplete.raw('text18fdd549b2ed'), className: "active:scale-[0.96]", children: _jsx(PlusIcon, { className: "size-4" }) })) : (_jsxs(Button, { variant: "secondary", size: "sm", className: "gap-1.5 active:scale-[0.96]", children: [_jsx(PlusIcon, { className: "size-3.5 shrink-0" }), tI18nComplete.raw('text18fdd549b2ed')] })) }), _jsx(DropdownMenuContent, { align: "end", className: "w-48", children: _jsx(DriveNewMenuItems, { Item: DropdownMenuItem, Separator: DropdownMenuSeparator, onUpload: onUpload, onUploadFolder: onUploadFolder, onNewFile: onNewFile, onNewFolder: onNewFolder }) })] }));
|
|
185
194
|
}
|
|
@@ -2,14 +2,12 @@
|
|
|
2
2
|
import { uiRoutes } from '../../../lib/routes.js';
|
|
3
3
|
import { errorToast } from '../../../primitives/toast.js';
|
|
4
4
|
import { useProjectContext } from '../context.js';
|
|
5
|
-
import {
|
|
5
|
+
import { recoverChangeRequest } from '@kortix/sdk';
|
|
6
6
|
import { prefetchSessionStart, qk } from '@kortix/sdk/react';
|
|
7
7
|
import { useQueryClient } from '@tanstack/react-query';
|
|
8
8
|
import { useTranslations } from '../../../i18n/index.js';
|
|
9
9
|
import { useUiRouter } from '../../../providers/ui-provider.js';
|
|
10
10
|
import { useCallback, useState } from 'react';
|
|
11
|
-
import { buildChangeRequestRecoveryPrompt, recoverySessionName, } from '../change-request-recovery.js';
|
|
12
|
-
import { randomUUID } from '../../../internal/lib/utils/random-uuid.js';
|
|
13
11
|
export function useChangeRequestRecovery() {
|
|
14
12
|
const tI18nComplete = useTranslations('hardcodedUi.i18nComplete');
|
|
15
13
|
const projectId = useProjectContext()?.projectId ?? '';
|
|
@@ -20,23 +18,9 @@ export function useChangeRequestRecovery() {
|
|
|
20
18
|
if (!projectId || startingCrId)
|
|
21
19
|
return;
|
|
22
20
|
setStartingCrId(target.crId);
|
|
23
|
-
const sessionId = randomUUID();
|
|
24
|
-
const href = uiRoutes().session(projectId, sessionId);
|
|
25
|
-
markSessionFresh(sessionId);
|
|
26
|
-
router.prefetch(href);
|
|
27
21
|
try {
|
|
28
|
-
await
|
|
29
|
-
|
|
30
|
-
initial_prompt: buildChangeRequestRecoveryPrompt(target, blocker),
|
|
31
|
-
base_ref: target.headRef,
|
|
32
|
-
name: recoverySessionName(target, blocker),
|
|
33
|
-
metadata: {
|
|
34
|
-
kind: 'change-request-recovery',
|
|
35
|
-
change_request_id: target.crId,
|
|
36
|
-
change_request_number: target.number,
|
|
37
|
-
blocker: blocker.kind,
|
|
38
|
-
},
|
|
39
|
-
});
|
|
22
|
+
const sessionId = await recoverChangeRequest(projectId, target, blocker);
|
|
23
|
+
const href = uiRoutes().session(projectId, sessionId);
|
|
40
24
|
prefetchSessionStart(queryClient, projectId, sessionId);
|
|
41
25
|
queryClient.invalidateQueries({ queryKey: qk.project.sessionsScope(projectId) });
|
|
42
26
|
onNavigate?.();
|
|
@@ -98,6 +98,7 @@ export declare function useChangeRequestPages(status?: ChangeRequestStatus | 'al
|
|
|
98
98
|
*/
|
|
99
99
|
export declare function useSessionChangeRequests(sessionId: string | undefined, options?: {
|
|
100
100
|
refetchInterval?: number;
|
|
101
|
+
enabled?: boolean;
|
|
101
102
|
}): import("@tanstack/react-query").UseQueryResult<{
|
|
102
103
|
change_requests: ChangeRequest[];
|
|
103
104
|
}, Error>;
|
|
@@ -149,8 +149,17 @@ export function useSessionChangeRequests(sessionId, options) {
|
|
|
149
149
|
const projectId = ctx?.projectId ?? '';
|
|
150
150
|
return useQuery({
|
|
151
151
|
queryKey: changeRequestKeys.sessionList(projectId, sessionId ?? ''),
|
|
152
|
-
queryFn: () =>
|
|
153
|
-
|
|
152
|
+
queryFn: async () => {
|
|
153
|
+
const change_requests = [];
|
|
154
|
+
let cursor;
|
|
155
|
+
do {
|
|
156
|
+
const page = await fetchChangeRequests(projectId, 'all', { originSessionId: sessionId, cursor });
|
|
157
|
+
change_requests.push(...page.change_requests);
|
|
158
|
+
cursor = page.next_cursor ?? undefined;
|
|
159
|
+
} while (cursor);
|
|
160
|
+
return { change_requests };
|
|
161
|
+
},
|
|
162
|
+
enabled: Boolean(projectId) && Boolean(sessionId) && options?.enabled !== false,
|
|
154
163
|
staleTime: 5_000,
|
|
155
164
|
refetchInterval: options?.refetchInterval,
|
|
156
165
|
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface ImageFrameProps {
|
|
3
|
+
/** CSS `aspect-ratio` before the image loads (`"3 / 2"`); the image's natural size replaces it on load. */
|
|
4
|
+
aspectRatio: string;
|
|
5
|
+
src: string | null;
|
|
6
|
+
alt: string;
|
|
7
|
+
/** The image does not exist yet, or its bytes are on the way. */
|
|
8
|
+
pending: boolean;
|
|
9
|
+
/** Centered over the frame: the busy line, or a note. */
|
|
10
|
+
label?: ReactNode;
|
|
11
|
+
/** Makes the image a button (open it in the file viewer). */
|
|
12
|
+
onOpen?: () => void;
|
|
13
|
+
className?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Fill the parent's box (a tile of a layout) and crop the image to it
|
|
16
|
+
* (`object-cover`), in place of holding `aspectRatio` and fitting the image.
|
|
17
|
+
*/
|
|
18
|
+
fill?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* The tallest the frame may be (`'60vh'`): it narrows to keep its ratio,
|
|
21
|
+
* so it never crops more and never letterboxes. Unset: the full width.
|
|
22
|
+
*/
|
|
23
|
+
maxHeight?: string;
|
|
24
|
+
/** The image button's accessible name; `alt` when unset. */
|
|
25
|
+
openLabel?: string;
|
|
26
|
+
/** The image's natural ratio when another surface already measured it (`"<w> / <h>"`), so a remount starts at it. */
|
|
27
|
+
naturalRatio?: string | null;
|
|
28
|
+
/** Reports the image's natural size once it decoded. */
|
|
29
|
+
onNaturalSize?: (width: number, height: number) => void;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The box an image takes before, while and after it exists: a flat `bg-muted`
|
|
33
|
+
* surface that holds the requested aspect ratio before any pixel arrives, so
|
|
34
|
+
* the layout does not jump when the image lands, then fades the image in.
|
|
35
|
+
* The frame itself never moves: the busy signal is the label (one waiting
|
|
36
|
+
* channel, kortix-brand `layout.md` States).
|
|
37
|
+
*/
|
|
38
|
+
export declare function ImageFrame({ aspectRatio, src, alt, pending, label, onOpen, className, fill, maxHeight, openLabel, naturalRatio, onNaturalSize, }: ImageFrameProps): import("react").JSX.Element;
|
|
39
|
+
/**
|
|
40
|
+
* An image whose file could not be read: "Image unavailable" and Try again,
|
|
41
|
+
* centered in the frame. Never the read's own error text (R38): that is
|
|
42
|
+
* internal (a status line, a path, a stack), not something a reader can act on.
|
|
43
|
+
*/
|
|
44
|
+
export declare function ImageUnavailable({ onRetry }: {
|
|
45
|
+
onRetry: () => void;
|
|
46
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useTranslations } from '../../i18n/index.js';
|
|
4
|
+
import { Button } from '../../primitives/button.js';
|
|
5
|
+
import { cn } from '../../lib/utils.js';
|
|
6
|
+
import { useEffect, useRef, useState } from 'react';
|
|
7
|
+
/** `'3 / 2'` → `1.5`; anything unreadable → `1`. */
|
|
8
|
+
function ratioValue(ratio) {
|
|
9
|
+
const [w, h] = ratio.split('/').map((part) => Number(part.trim()));
|
|
10
|
+
return w && h ? w / h : 1;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The box an image takes before, while and after it exists: a flat `bg-muted`
|
|
14
|
+
* surface that holds the requested aspect ratio before any pixel arrives, so
|
|
15
|
+
* the layout does not jump when the image lands, then fades the image in.
|
|
16
|
+
* The frame itself never moves: the busy signal is the label (one waiting
|
|
17
|
+
* channel, kortix-brand `layout.md` States).
|
|
18
|
+
*/
|
|
19
|
+
export function ImageFrame({ aspectRatio, src, alt, pending, label, onOpen, className, fill = false, maxHeight, openLabel, naturalRatio = null, onNaturalSize, }) {
|
|
20
|
+
const img = useRef(null);
|
|
21
|
+
const [loaded, setLoaded] = useState(false);
|
|
22
|
+
const [natural, setNatural] = useState(naturalRatio);
|
|
23
|
+
// A new source starts hidden at the requested ratio again; a cached one may
|
|
24
|
+
// be complete before React sees `load`.
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const el = img.current;
|
|
27
|
+
const complete = !!el?.complete && el.naturalWidth > 0;
|
|
28
|
+
setLoaded(complete);
|
|
29
|
+
setNatural(complete && el ? `${el.naturalWidth} / ${el.naturalHeight}` : naturalRatio);
|
|
30
|
+
// The ratio is the cached one until this source decodes; a new source is measured on load.
|
|
31
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
32
|
+
}, [src]);
|
|
33
|
+
const onLoad = () => {
|
|
34
|
+
const el = img.current;
|
|
35
|
+
if (el?.naturalWidth && el.naturalHeight) {
|
|
36
|
+
setNatural(`${el.naturalWidth} / ${el.naturalHeight}`);
|
|
37
|
+
onNaturalSize?.(el.naturalWidth, el.naturalHeight);
|
|
38
|
+
}
|
|
39
|
+
setLoaded(true);
|
|
40
|
+
};
|
|
41
|
+
const image = src ? (
|
|
42
|
+
// eslint-disable-next-line @next/next/no-img-element -- a blob: URL of a sandbox file; the Next loader cannot fetch it
|
|
43
|
+
_jsx("img", { ref: img, src: src, alt: alt, onLoad: onLoad, className: cn('size-full transition-[opacity,filter] duration-moderate ease-out motion-reduce:blur-none', fill ? 'object-cover' : 'object-contain', loaded ? 'opacity-100 blur-none' : 'opacity-0 blur-xs') })) : null;
|
|
44
|
+
return (_jsxs("div", { "aria-busy": pending, className: cn('bg-muted relative w-full overflow-hidden rounded-md', fill && 'h-full', className), style: fill
|
|
45
|
+
? undefined
|
|
46
|
+
: {
|
|
47
|
+
aspectRatio: natural ?? aspectRatio,
|
|
48
|
+
...(maxHeight && { width: `min(100%, calc(${maxHeight} * ${ratioValue(natural ?? aspectRatio)}))` }),
|
|
49
|
+
}, children: [image && onOpen ? (_jsx("button", { type: "button", onClick: onOpen, "aria-label": openLabel ?? alt, className: "focus-visible:ring-kortix-base block size-full cursor-zoom-in rounded-md focus-visible:ring-2 focus-visible:outline-none focus-visible:ring-inset", children: image })) : (image), label ? (_jsx("div", { className: "absolute inset-0 flex items-center justify-center p-4 text-center", children: label })) : null] }));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* An image whose file could not be read: "Image unavailable" and Try again,
|
|
53
|
+
* centered in the frame. Never the read's own error text (R38): that is
|
|
54
|
+
* internal (a status line, a path, a stack), not something a reader can act on.
|
|
55
|
+
*/
|
|
56
|
+
export function ImageUnavailable({ onRetry }) {
|
|
57
|
+
const t = useTranslations('imageGen');
|
|
58
|
+
return (_jsxs("span", { className: "text-muted-foreground flex flex-col items-center gap-2 text-xs", children: [t('unavailable'), _jsx(Button, { type: "button", variant: "secondary", size: "sm", className: "active:scale-[0.96]", onClick: onRetry, children: t('tryAgain') })] }));
|
|
59
|
+
}
|
|
@@ -24,6 +24,16 @@ interface ImageRendererProps {
|
|
|
24
24
|
/** Add the backdrop swatches to the shelf (see `ImageBackdrop`). Off by
|
|
25
25
|
* default — an opaque JPEG has exactly one meaningful background. */
|
|
26
26
|
backdrop?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* The image's details toggle (ⓘ), last on the shelf: shown only when the
|
|
29
|
+
* host has details for this image (a generated image's prompt and model).
|
|
30
|
+
* It is a `DisclosureTrigger`: the host renders this renderer inside the
|
|
31
|
+
* `Disclosure` whose content holds the details.
|
|
32
|
+
*/
|
|
33
|
+
info?: {
|
|
34
|
+
pressed: boolean;
|
|
35
|
+
label: string;
|
|
36
|
+
};
|
|
27
37
|
}
|
|
28
|
-
export declare function ImageRenderer({ url, className, fileName, controls, backdrop: showBackdrop, }: ImageRendererProps): React.JSX.Element;
|
|
38
|
+
export declare function ImageRenderer({ url, className, fileName, controls, backdrop: showBackdrop, info, }: ImageRendererProps): React.JSX.Element;
|
|
29
39
|
export {};
|
|
@@ -6,10 +6,20 @@ import { Button } from '../../primitives/button.js';
|
|
|
6
6
|
import { ButtonGroup, ButtonGroupSeparator } from '../../primitives/button-group.js';
|
|
7
7
|
import Hint from '../../primitives/hint.js';
|
|
8
8
|
import Loading from '../../primitives/loading.js';
|
|
9
|
+
import { IconInfo } from '../../primitives/kortix-icons.js';
|
|
10
|
+
import { DisclosureTrigger } from '../../primitives/disclosure.js';
|
|
9
11
|
import { usePreviewFit } from '../viewer/preview-fit.js';
|
|
10
12
|
import { cn } from '../../lib/utils.js';
|
|
11
13
|
import { ImageBrokenIcon as ImageOff, ArrowClockwiseIcon as RotateCw, MagnifyingGlassPlusIcon as ZoomIn, MagnifyingGlassMinusIcon as ZoomOut, } from '@phosphor-icons/react';
|
|
12
14
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
15
|
+
/**
|
|
16
|
+
* The details toggle: a `DisclosureTrigger` (toggle, Enter/Space,
|
|
17
|
+
* `aria-expanded`) around the shelf's button. Props and ref pass through, so
|
|
18
|
+
* the tooltip trigger around it still works.
|
|
19
|
+
*/
|
|
20
|
+
function InfoTrigger({ pressed, label, ...props }) {
|
|
21
|
+
return (_jsx(DisclosureTrigger, { children: _jsx(Button, { ...props, variant: "secondary", size: "icon-base", "aria-label": label, "aria-pressed": pressed, "data-image-info": "", children: _jsx(IconInfo, { className: "size-4", weight: pressed ? 'fill' : 'regular' }) }) }));
|
|
22
|
+
}
|
|
13
23
|
const MAX_RETRIES = 3;
|
|
14
24
|
const RETRY_DELAYS = [500, 1500, 3000]; // ms — escalating backoff
|
|
15
25
|
const MIN_ZOOM = 0.25;
|
|
@@ -43,7 +53,7 @@ const BACKDROPS = [
|
|
|
43
53
|
{ value: 'white', label: 'White' },
|
|
44
54
|
{ value: 'black', label: 'Black' },
|
|
45
55
|
];
|
|
46
|
-
export function ImageRenderer({ url, className, fileName, controls = 'hover', backdrop: showBackdrop = false, }) {
|
|
56
|
+
export function ImageRenderer({ url, className, fileName, controls = 'hover', backdrop: showBackdrop = false, info, }) {
|
|
47
57
|
const tHardcodedUi = useTranslations('hardcodedUi');
|
|
48
58
|
const backdrops = useLocalizedUiCatalog(BACKDROPS);
|
|
49
59
|
// `null` outside a <PreviewFitProvider> (Advanced-mode viewer, /projects
|
|
@@ -230,8 +240,8 @@ export function ImageRenderer({ url, className, fileName, controls = 'hover', ba
|
|
|
230
240
|
: [
|
|
231
241
|
'top-1 opacity-0 transition-opacity duration-200 ease-out',
|
|
232
242
|
'group-hover:opacity-100 focus-within:opacity-100',
|
|
233
|
-
showInfo && 'opacity-100',
|
|
234
|
-
]), children: _jsxs(ButtonGroup, { children: [_jsx(Hint, { label: zoomOutLabel, side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon-base", onClick: handleZoomOut, disabled: zoom <= MIN_ZOOM, "aria-label": zoomOutLabel, children: _jsx(ZoomOut, { className: "size-4" }) }) }), _jsx(Hint, { label: tHardcodedUi.raw('i18nComplete.textce89ae822e8b'), side: "bottom", children: _jsxs(Button, { variant: "secondary", size: "sm", className: "min-w-14 tabular-nums", onClick: handleResetZoom, "aria-label": tHardcodedUi.raw('i18nComplete.textce89ae822e8b'), children: [Math.round(zoom * 100), "%"] }) }), _jsx(Hint, { label: zoomInLabel, side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon-base", onClick: handleZoomIn, disabled: zoom >= MAX_ZOOM, "aria-label": zoomInLabel, children: _jsx(ZoomIn, { className: "size-4" }) }) }), _jsx(Hint, { label: tHardcodedUi.raw('i18nComplete.textc3613b1704f5'), side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon-base", onClick: handleRotate, "aria-label": tHardcodedUi.raw('i18nComplete.text9dc6b57eecba'), children: _jsx(RotateCw, { className: "size-4" }) }) }), showBackdrop && (_jsxs(_Fragment, { children: [_jsx(ButtonGroupSeparator, {}), backdrops.map(({ value, label }) => (_jsx(Hint, { label: `${label} background`, side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon-base", onClick: () => setBackdrop(value), "aria-label": `${label} background`, "aria-pressed": backdrop === value, children: _jsx("span", { className: cn(
|
|
243
|
+
(showInfo || info?.pressed) && 'opacity-100',
|
|
244
|
+
]), children: _jsxs(ButtonGroup, { children: [_jsx(Hint, { label: zoomOutLabel, side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon-base", onClick: handleZoomOut, disabled: zoom <= MIN_ZOOM, "aria-label": zoomOutLabel, children: _jsx(ZoomOut, { className: "size-4" }) }) }), _jsx(Hint, { label: tHardcodedUi.raw('i18nComplete.textce89ae822e8b'), side: "bottom", children: _jsxs(Button, { variant: "secondary", size: "sm", className: "min-w-14 tabular-nums", onClick: handleResetZoom, "aria-label": tHardcodedUi.raw('i18nComplete.textce89ae822e8b'), children: [Math.round(zoom * 100), "%"] }) }), _jsx(Hint, { label: zoomInLabel, side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon-base", onClick: handleZoomIn, disabled: zoom >= MAX_ZOOM, "aria-label": zoomInLabel, children: _jsx(ZoomIn, { className: "size-4" }) }) }), _jsx(Hint, { label: tHardcodedUi.raw('i18nComplete.textc3613b1704f5'), side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon-base", onClick: handleRotate, "aria-label": tHardcodedUi.raw('i18nComplete.text9dc6b57eecba'), children: _jsx(RotateCw, { className: "size-4" }) }) }), info ? (_jsx(Hint, { label: info.label, side: "bottom", children: _jsx(InfoTrigger, { pressed: info.pressed, label: info.label }) })) : null, showBackdrop && (_jsxs(_Fragment, { children: [_jsx(ButtonGroupSeparator, {}), backdrops.map(({ value, label }) => (_jsx(Hint, { label: `${label} background`, side: "bottom", children: _jsx(Button, { variant: "secondary", size: "icon-base", onClick: () => setBackdrop(value), "aria-label": `${label} background`, "aria-pressed": backdrop === value, children: _jsx("span", { className: cn(
|
|
235
245
|
// A hairline on every swatch, not just the white one:
|
|
236
246
|
// without it the white chip vanishes on a light
|
|
237
247
|
// toolbar and the black one on a dark toolbar.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { useSelectionCapability } from '@embedpdf/plugin-selection/react';
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { errorToast } from '../../../primitives/toast.js';
|
|
4
|
+
import { useTranslations } from '../../../i18n/index.js';
|
|
5
|
+
import { copyToClipboard } from '../../../internal/lib/utils/clipboard.js';
|
|
6
|
+
/** The upstream React utility leaves denied clipboard writes unhandled. */
|
|
7
|
+
export function PdfClipboard() {
|
|
8
|
+
const { provides: selection } = useSelectionCapability();
|
|
9
|
+
const t = useTranslations('commandPalette');
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (!selection)
|
|
12
|
+
return;
|
|
13
|
+
return selection.onCopyToClipboard(({ text }) => {
|
|
14
|
+
void copyToClipboard(text).then((copied) => {
|
|
15
|
+
if (!copied)
|
|
16
|
+
errorToast(t('copyFailed'));
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}, [selection, t]);
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
@@ -9,7 +9,8 @@ import { RenderLayer, RenderPluginPackage } from '@embedpdf/plugin-render/react'
|
|
|
9
9
|
import { Rotate, RotatePluginPackage } from '@embedpdf/plugin-rotate/react';
|
|
10
10
|
import { ScrollPluginPackage, ScrollStrategy, useScroll, useScrollPlugin, } from '@embedpdf/plugin-scroll/react';
|
|
11
11
|
import { SearchLayer, SearchPluginPackage, useSearch } from '@embedpdf/plugin-search/react';
|
|
12
|
-
import {
|
|
12
|
+
import { SelectionPluginPackage } from '@embedpdf/plugin-selection';
|
|
13
|
+
import { useSelectionCapability, useSelectionPlugin, } from '@embedpdf/plugin-selection/react';
|
|
13
14
|
import { ThumbImg, ThumbnailPluginPackage, useThumbnailCapability, useThumbnailPlugin, } from '@embedpdf/plugin-thumbnail/react';
|
|
14
15
|
import { TilingLayer, TilingPluginPackage } from '@embedpdf/plugin-tiling/react';
|
|
15
16
|
import { useIsViewportGated, useViewportCapability, useViewportElement, useViewportRef, ViewportElementContext, ViewportPluginPackage, } from '@embedpdf/plugin-viewport/react';
|
|
@@ -36,6 +37,7 @@ import { cn } from '../../../lib/utils.js';
|
|
|
36
37
|
import { downloadBlob } from '../../../internal/lib/utils/download.js';
|
|
37
38
|
import { loadSharedPdfEngine } from './pdf-engine-loader.js';
|
|
38
39
|
import { SidebarGlyph as PanelLeft } from '../../../icons/sidebar-toggle.js';
|
|
40
|
+
import { PdfClipboard } from './pdf-clipboard.js';
|
|
39
41
|
const DEFAULT_ZOOM = 1;
|
|
40
42
|
const ZOOM_OPTIONS = [0.1, 0.25, 0.5, 0.75, 1, 1.25, 1.5, 2];
|
|
41
43
|
const PAGE_GAP = 24;
|
|
@@ -1218,7 +1220,7 @@ function PDFViewerInner({ viewerRef, pdfFile, documentId, document: pdfDocument,
|
|
|
1218
1220
|
}, children: _jsx(CircleMinus, { className: "size-4" }) }) }), _jsxs(Select, { value: String(currentZoomLevel), onValueChange: (value) => zoom?.requestZoom(Number(value)), disabled: controlsDisabled, modal: false, children: [_jsx(SelectTrigger, { size: "sm", className: "w-[84px] min-w-[84px] tabular-nums", children: _jsxs(SelectValue, { placeholder: tI18nComplete.raw('text509c517ede79'), children: [Math.round(currentZoomLevel * 100), "%"] }) }), _jsx(SelectContent, { alignItemWithTrigger: false, children: ZOOM_OPTIONS.map((option) => (_jsxs(SelectItem, { value: String(option), children: [Math.round(option * 100), "%"] }, option))) })] }), _jsx(ToolbarTooltip, { label: tI18nComplete.raw('text0e47f09a748f'), children: _jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", className: "transition-transform active:scale-[0.96]", "aria-label": tI18nComplete.raw('text0e47f09a748f'), disabled: controlsDisabled || currentZoomLevel >= ZOOM_OPTIONS[ZOOM_OPTIONS.length - 1], onClick: () => {
|
|
1219
1221
|
const nextZoom = ZOOM_OPTIONS.find((option) => option > currentZoomLevel);
|
|
1220
1222
|
zoom?.requestZoom(nextZoom ?? ZOOM_OPTIONS[ZOOM_OPTIONS.length - 1]);
|
|
1221
|
-
}, children: _jsx(CirclePlus, { className: "size-4" }) }) })] }), _jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), _jsx(PDFViewerSearchControl, { documentId: documentId, controlsDisabled: controlsDisabled, initialSearch: findText }, documentId), toolbarActions ? (_jsxs(_Fragment, { children: [_jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), toolbarActions] })) : null, showDownload || showUpload ? (_jsxs(_Fragment, { children: [_jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), _jsx(PDFViewerFileActionsMenu, { onUploadFile: handleUpload, showUpload: showUpload }), showDownload ? (_jsx(ViewerDownloadButton, { disabled: controlsDisabled, pending: isPreparingDownload, onDownload: () => void handleDownload() })) : null] })) : null] }) })] })) : null, _jsxs("div", { ref: viewerShellRef, className: "bg-muted/30 relative flex min-h-0 flex-1 overflow-hidden", children: [isLoading ? (_jsx(PDFViewerLoadingSkeleton, { sidebarInline: sidebarInline, sidebarOpen: sidebarOpen })) : null, _jsxs("div", { className: "flex h-full max-h-full min-h-0 w-full flex-1 overflow-hidden", children: [_jsx(DocumentViewerThumbnailSidebar, { closedInlineClassName: THUMBNAIL_SIDEBAR_CLOSED_CLASS, inline: sidebarInline, open: thumbnailSidebarVisible, widthClassName: THUMBNAIL_SIDEBAR_WIDTH_CLASS, children: thumbnailSidebarVisible ? (_jsx(PDFViewerThumbnails, { basePageRotations: basePageRotations, documentId: documentId, activePage: activePage, pageCount: numPages, pageRotationDeltas: pageRotationDeltas, pdfDocument: pdfDocument, selectedPageIndexes: selectedPageIndexes, onSelectPage: selectThumbnailPage })) : null }), _jsxs(PDFViewerScrollAreaViewport, { documentId: documentId, className: "relative h-full max-h-full min-h-0 min-w-0 flex-1", children: [_jsx(PDFViewerViewportBridge, { viewportElementRef: viewportElementRef }), _jsx(PDFViewerSelectionCopyShortcut, { documentId: documentId }), _jsx(PDFViewerSelectionReleaseGuard, { documentId: documentId }), _jsx(GlobalPointerProvider, { documentId: documentId, children: _jsx(PDFViewerScroller, { basePageRotations: basePageRotations, documentId: documentId, pageRotationDeltas: pageRotationDeltas, renderPage: renderPage }) }), _jsx(
|
|
1223
|
+
}, children: _jsx(CirclePlus, { className: "size-4" }) }) })] }), _jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), _jsx(PDFViewerSearchControl, { documentId: documentId, controlsDisabled: controlsDisabled, initialSearch: findText }, documentId), toolbarActions ? (_jsxs(_Fragment, { children: [_jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), toolbarActions] })) : null, showDownload || showUpload ? (_jsxs(_Fragment, { children: [_jsx(Separator, { orientation: "vertical", className: "mx-1 h-4 self-center" }), _jsx(PDFViewerFileActionsMenu, { onUploadFile: handleUpload, showUpload: showUpload }), showDownload ? (_jsx(ViewerDownloadButton, { disabled: controlsDisabled, pending: isPreparingDownload, onDownload: () => void handleDownload() })) : null] })) : null] }) })] })) : null, _jsxs("div", { ref: viewerShellRef, className: "bg-muted/30 relative flex min-h-0 flex-1 overflow-hidden", children: [isLoading ? (_jsx(PDFViewerLoadingSkeleton, { sidebarInline: sidebarInline, sidebarOpen: sidebarOpen })) : null, _jsxs("div", { className: "flex h-full max-h-full min-h-0 w-full flex-1 overflow-hidden", children: [_jsx(DocumentViewerThumbnailSidebar, { closedInlineClassName: THUMBNAIL_SIDEBAR_CLOSED_CLASS, inline: sidebarInline, open: thumbnailSidebarVisible, widthClassName: THUMBNAIL_SIDEBAR_WIDTH_CLASS, children: thumbnailSidebarVisible ? (_jsx(PDFViewerThumbnails, { basePageRotations: basePageRotations, documentId: documentId, activePage: activePage, pageCount: numPages, pageRotationDeltas: pageRotationDeltas, pdfDocument: pdfDocument, selectedPageIndexes: selectedPageIndexes, onSelectPage: selectThumbnailPage })) : null }), _jsxs(PDFViewerScrollAreaViewport, { documentId: documentId, className: "relative h-full max-h-full min-h-0 min-w-0 flex-1", children: [_jsx(PDFViewerViewportBridge, { viewportElementRef: viewportElementRef }), _jsx(PDFViewerSelectionCopyShortcut, { documentId: documentId }), _jsx(PDFViewerSelectionReleaseGuard, { documentId: documentId }), _jsx(GlobalPointerProvider, { documentId: documentId, children: _jsx(PDFViewerScroller, { basePageRotations: basePageRotations, documentId: documentId, pageRotationDeltas: pageRotationDeltas, renderPage: renderPage }) }), _jsx(PdfClipboard, {})] })] })] })] }));
|
|
1222
1224
|
}
|
|
1223
1225
|
function PDFViewerDocumentLoader({ pdfFile, onDocumentLoadSuccess, ...innerProps }) {
|
|
1224
1226
|
const { provides: documentManager } = useDocumentManagerCapability();
|
|
@@ -44,6 +44,12 @@ export interface ShowContentProps {
|
|
|
44
44
|
* blob would run agent-authored script inside the app.
|
|
45
45
|
*/
|
|
46
46
|
attachment?: string;
|
|
47
|
+
/**
|
|
48
|
+
* The sha256 of the file's bytes, from the `show` output (R38): an image
|
|
49
|
+
* already loaded under another path (the generated original of a Drive
|
|
50
|
+
* copy) draws at once from the shared image store.
|
|
51
|
+
*/
|
|
52
|
+
sha256?: string;
|
|
47
53
|
/** Optional: render a proxied localhost iframe. Caller provides this component. */
|
|
48
54
|
LocalhostPreview?: React.ComponentType<{
|
|
49
55
|
url: string;
|
|
@@ -74,7 +80,7 @@ export interface ShowContentProps {
|
|
|
74
80
|
*/
|
|
75
81
|
toolbarActions?: React.ReactNode;
|
|
76
82
|
}
|
|
77
|
-
export declare function ShowContentRenderer({ type, title, description, path, url, content, language, aspectRatio, attachment, LocalhostPreview, fill, onStatusChange, toolbarActions, }: ShowContentProps): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | React.JSX.Element | null | undefined;
|
|
83
|
+
export declare function ShowContentRenderer({ type, title, description, path, url, content, language, aspectRatio, attachment, sha256, LocalhostPreview, fill, onStatusChange, toolbarActions, }: ShowContentProps): string | number | bigint | boolean | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | React.JSX.Element | null | undefined;
|
|
78
84
|
export interface ShowCarouselItem {
|
|
79
85
|
type: string;
|
|
80
86
|
title?: string;
|
|
@@ -86,6 +92,8 @@ export interface ShowCarouselItem {
|
|
|
86
92
|
aspect_ratio?: string;
|
|
87
93
|
/** Stored copy of `path` from saved history — see `ShowContentProps.attachment`. */
|
|
88
94
|
attachment?: string;
|
|
95
|
+
/** The bytes' sha256 from the `show` output — see `ShowContentProps.sha256`. */
|
|
96
|
+
sha256?: string;
|
|
89
97
|
/** `pending`: a grouped `show` call whose payload has not arrived yet. The
|
|
90
98
|
* slot holds its place so the card does not jump when it lands. */
|
|
91
99
|
status?: 'pending' | 'ready' | 'error';
|