@stigmer/react 3.12.1 → 3.12.2
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/access/ManageAccessDialog.d.ts.map +1 -1
- package/access/ManageAccessDialog.js +7 -2
- package/access/ManageAccessDialog.js.map +1 -1
- package/activity/format-relative-time.d.ts +11 -9
- package/activity/format-relative-time.d.ts.map +1 -1
- package/activity/format-relative-time.js +11 -9
- package/activity/format-relative-time.js.map +1 -1
- package/agent/steps/CapabilitiesStep.js +5 -2
- package/agent/steps/CapabilitiesStep.js.map +1 -1
- package/agent/steps/IdentityStep.d.ts.map +1 -1
- package/agent/steps/IdentityStep.js +6 -5
- package/agent/steps/IdentityStep.js.map +1 -1
- package/agent-instance/CreateAgentInstanceDialog.d.ts.map +1 -1
- package/agent-instance/CreateAgentInstanceDialog.js +10 -2
- package/agent-instance/CreateAgentInstanceDialog.js.map +1 -1
- package/api-key/ApiKeyCreatedAlert.d.ts.map +1 -1
- package/api-key/ApiKeyCreatedAlert.js +12 -20
- package/api-key/ApiKeyCreatedAlert.js.map +1 -1
- package/api-key/ApiKeyListPanel.d.ts.map +1 -1
- package/api-key/ApiKeyListPanel.js +3 -23
- package/api-key/ApiKeyListPanel.js.map +1 -1
- package/api-key/CreateApiKeyForm.d.ts.map +1 -1
- package/api-key/CreateApiKeyForm.js +6 -10
- package/api-key/CreateApiKeyForm.js.map +1 -1
- package/approval-defaults-context.d.ts +47 -0
- package/approval-defaults-context.d.ts.map +1 -0
- package/approval-defaults-context.js +27 -0
- package/approval-defaults-context.js.map +1 -0
- package/attachment/index.d.ts +2 -0
- package/attachment/index.d.ts.map +1 -1
- package/attachment/index.js +1 -0
- package/attachment/index.js.map +1 -1
- package/attachment/vision-preflight.d.ts +113 -0
- package/attachment/vision-preflight.d.ts.map +1 -0
- package/attachment/vision-preflight.js +143 -0
- package/attachment/vision-preflight.js.map +1 -0
- package/billing/AutoRechargeCard.d.ts.map +1 -1
- package/billing/AutoRechargeCard.js +3 -2
- package/billing/AutoRechargeCard.js.map +1 -1
- package/billing/BillingSection.d.ts.map +1 -1
- package/billing/BillingSection.js +3 -2
- package/billing/BillingSection.js.map +1 -1
- package/channel/ChannelConversationsDialog.d.ts.map +1 -1
- package/channel/ChannelConversationsDialog.js +5 -4
- package/channel/ChannelConversationsDialog.js.map +1 -1
- package/channel/ChannelCredentialsDialog.d.ts.map +1 -1
- package/channel/ChannelCredentialsDialog.js +9 -4
- package/channel/ChannelCredentialsDialog.js.map +1 -1
- package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
- package/channel/ChannelTemplatesDialog.js +5 -4
- package/channel/ChannelTemplatesDialog.js.map +1 -1
- package/channel/ConnectSlackDialog.d.ts.map +1 -1
- package/channel/ConnectSlackDialog.js +9 -4
- package/channel/ConnectSlackDialog.js.map +1 -1
- package/channel/ConnectWhatsAppDialog.d.ts.map +1 -1
- package/channel/ConnectWhatsAppDialog.js +9 -4
- package/channel/ConnectWhatsAppDialog.js.map +1 -1
- package/channel/useChannelSessions.d.ts.map +1 -1
- package/channel/useChannelSessions.js.map +1 -1
- package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -1
- package/channel-app/ChannelAppDetailPanel.js +8 -5
- package/channel-app/ChannelAppDetailPanel.js.map +1 -1
- package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
- package/channel-app/CreateChannelAppForm.js +12 -7
- package/channel-app/CreateChannelAppForm.js.map +1 -1
- package/channel-app/internal.d.ts +0 -1
- package/channel-app/internal.d.ts.map +1 -1
- package/channel-app/internal.js +5 -10
- package/channel-app/internal.js.map +1 -1
- package/composer/ComposerToolbar.js +2 -1
- package/composer/ComposerToolbar.js.map +1 -1
- package/composer/SessionComposer.d.ts +1 -1
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +120 -13
- package/composer/SessionComposer.js.map +1 -1
- package/composer/icons.d.ts +0 -1
- package/composer/icons.d.ts.map +1 -1
- package/composer/icons.js +0 -3
- package/composer/icons.js.map +1 -1
- package/conversation/ConversationComposer.js +1 -1
- package/conversation/ConversationComposer.js.map +1 -1
- package/conversation/ConversationListPane.d.ts.map +1 -1
- package/conversation/ConversationListPane.js +3 -2
- package/conversation/ConversationListPane.js.map +1 -1
- package/cursor-accounts/MemberCoverageTable.js +3 -14
- package/cursor-accounts/MemberCoverageTable.js.map +1 -1
- package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
- package/dashboard/DashboardFailedRuns.js +2 -14
- package/dashboard/DashboardFailedRuns.js.map +1 -1
- package/environment/CreateEnvironmentForm.d.ts.map +1 -1
- package/environment/CreateEnvironmentForm.js +4 -8
- package/environment/CreateEnvironmentForm.js.map +1 -1
- package/environment/EnvVarForm.d.ts.map +1 -1
- package/environment/EnvVarForm.js +2 -4
- package/environment/EnvVarForm.js.map +1 -1
- package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
- package/environment/EnvironmentVariableEditor.js +5 -7
- package/environment/EnvironmentVariableEditor.js.map +1 -1
- package/execution/ArtifactApplyButton.d.ts.map +1 -1
- package/execution/ArtifactApplyButton.js +2 -4
- package/execution/ArtifactApplyButton.js.map +1 -1
- package/execution/ExecutionErrorNotice.d.ts +36 -0
- package/execution/ExecutionErrorNotice.d.ts.map +1 -0
- package/execution/ExecutionErrorNotice.js +39 -0
- package/execution/ExecutionErrorNotice.js.map +1 -0
- package/execution/FilePathLink.d.ts.map +1 -1
- package/execution/FilePathLink.js +5 -8
- package/execution/FilePathLink.js.map +1 -1
- package/execution/FileReviewCard.d.ts.map +1 -1
- package/execution/FileReviewCard.js +1 -6
- package/execution/FileReviewCard.js.map +1 -1
- package/execution/FollowUpInput.d.ts.map +1 -1
- package/execution/FollowUpInput.js +1 -3
- package/execution/FollowUpInput.js.map +1 -1
- package/execution/LivenessStatusLine.d.ts +40 -0
- package/execution/LivenessStatusLine.d.ts.map +1 -0
- package/execution/LivenessStatusLine.js +34 -0
- package/execution/LivenessStatusLine.js.map +1 -0
- package/execution/MessageEntry.d.ts.map +1 -1
- package/execution/MessageEntry.js +31 -3
- package/execution/MessageEntry.js.map +1 -1
- package/execution/MessageThread.d.ts +25 -0
- package/execution/MessageThread.d.ts.map +1 -1
- package/execution/MessageThread.js +51 -36
- package/execution/MessageThread.js.map +1 -1
- package/execution/SetupProgress.d.ts.map +1 -1
- package/execution/SetupProgress.js +1 -1
- package/execution/SetupProgress.js.map +1 -1
- package/execution/SubAgentSection.d.ts.map +1 -1
- package/execution/SubAgentSection.js +9 -7
- package/execution/SubAgentSection.js.map +1 -1
- package/execution/TerminalSession.d.ts +30 -0
- package/execution/TerminalSession.d.ts.map +1 -1
- package/execution/TerminalSession.js +37 -1
- package/execution/TerminalSession.js.map +1 -1
- package/execution/ToolCallDetail.d.ts +9 -0
- package/execution/ToolCallDetail.d.ts.map +1 -1
- package/execution/ToolCallDetail.js +16 -0
- package/execution/ToolCallDetail.js.map +1 -1
- package/execution/ToolCallItem.d.ts +20 -6
- package/execution/ToolCallItem.d.ts.map +1 -1
- package/execution/ToolCallItem.js +102 -29
- package/execution/ToolCallItem.js.map +1 -1
- package/execution/ToolRunGroup.d.ts.map +1 -1
- package/execution/ToolRunGroup.js +11 -11
- package/execution/ToolRunGroup.js.map +1 -1
- package/execution/WriteBackCard.d.ts.map +1 -1
- package/execution/WriteBackCard.js +5 -20
- package/execution/WriteBackCard.js.map +1 -1
- package/execution/index.d.ts +6 -2
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +3 -1
- package/execution/index.js.map +1 -1
- package/execution/tool-categories.d.ts +42 -7
- package/execution/tool-categories.d.ts.map +1 -1
- package/execution/tool-categories.js +38 -4
- package/execution/tool-categories.js.map +1 -1
- package/execution/tool-presenter.d.ts +17 -1
- package/execution/tool-presenter.d.ts.map +1 -1
- package/execution/tool-presenter.js +4 -1
- package/execution/tool-presenter.js.map +1 -1
- package/execution/useArtifactInspection.d.ts.map +1 -1
- package/execution/useArtifactInspection.js +4 -7
- package/execution/useArtifactInspection.js.map +1 -1
- package/iam-policy/GrantAccessForm.d.ts.map +1 -1
- package/iam-policy/GrantAccessForm.js +2 -4
- package/iam-policy/GrantAccessForm.js.map +1 -1
- package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
- package/iam-policy/OrgMembersPanel.js +3 -5
- package/iam-policy/OrgMembersPanel.js.map +1 -1
- package/iam-policy/RoleSelector.d.ts.map +1 -1
- package/iam-policy/RoleSelector.js +7 -1
- package/iam-policy/RoleSelector.js.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
- package/identity-provider/CreateIdentityProviderForm.js +6 -9
- package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderDetailPanel.js +17 -26
- package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
- package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
- package/identity-provider/IdentityProviderListPanel.js +2 -4
- package/identity-provider/IdentityProviderListPanel.js.map +1 -1
- package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
- package/identity-provider/IdentityProviderWizard.js +8 -7
- package/identity-provider/IdentityProviderWizard.js.map +1 -1
- package/identity-provider/SsoLoginPrompt.js +5 -6
- package/identity-provider/SsoLoginPrompt.js.map +1 -1
- package/index.d.ts +9 -8
- package/index.d.ts.map +1 -1
- package/index.js +4 -4
- package/index.js.map +1 -1
- package/internal/DecisionButton.d.ts.map +1 -1
- package/internal/DecisionButton.js +1 -6
- package/internal/DecisionButton.js.map +1 -1
- package/internal/SpinnerIcon.d.ts +22 -0
- package/internal/SpinnerIcon.d.ts.map +1 -0
- package/internal/SpinnerIcon.js +23 -0
- package/internal/SpinnerIcon.js.map +1 -0
- package/internal/select-element-text.d.ts +11 -0
- package/internal/select-element-text.d.ts.map +1 -0
- package/internal/select-element-text.js +19 -0
- package/internal/select-element-text.js.map +1 -0
- package/internal/thread-card/ThreadCardShell.d.ts +27 -10
- package/internal/thread-card/ThreadCardShell.d.ts.map +1 -1
- package/internal/thread-card/ThreadCardShell.js +11 -5
- package/internal/thread-card/ThreadCardShell.js.map +1 -1
- package/internal/thread-card/glyphs.d.ts +11 -2
- package/internal/thread-card/glyphs.d.ts.map +1 -1
- package/internal/thread-card/glyphs.js +9 -3
- package/internal/thread-card/glyphs.js.map +1 -1
- package/internal/thread-card/index.d.ts +1 -1
- package/internal/thread-card/index.d.ts.map +1 -1
- package/internal/thread-card/index.js.map +1 -1
- package/internal/useCopyFeedback.d.ts +28 -0
- package/internal/useCopyFeedback.d.ts.map +1 -0
- package/internal/useCopyFeedback.js +40 -0
- package/internal/useCopyFeedback.js.map +1 -0
- package/invitation/InvitationCreatedAlert.d.ts.map +1 -1
- package/invitation/InvitationCreatedAlert.js +12 -19
- package/invitation/InvitationCreatedAlert.js.map +1 -1
- package/invitation/InvitationManager.d.ts.map +1 -1
- package/invitation/InvitationManager.js +14 -21
- package/invitation/InvitationManager.js.map +1 -1
- package/invitation/InvitationRedemption.d.ts.map +1 -1
- package/invitation/InvitationRedemption.js +2 -4
- package/invitation/InvitationRedemption.js.map +1 -1
- package/library/useExportResource.d.ts.map +1 -1
- package/library/useExportResource.js +16 -27
- package/library/useExportResource.js.map +1 -1
- package/manifest/ApplyManifestDialog.js +1 -1
- package/manifest/EditResourceYamlDialog.js +1 -1
- package/mcp-server/DefinitionDriftNotice.d.ts +42 -0
- package/mcp-server/DefinitionDriftNotice.d.ts.map +1 -0
- package/mcp-server/DefinitionDriftNotice.js +52 -0
- package/mcp-server/DefinitionDriftNotice.js.map +1 -0
- package/mcp-server/McpServerConnectDialog.js +1 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +47 -14
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/OAuthAppForm.d.ts.map +1 -1
- package/mcp-server/OAuthAppForm.js +2 -4
- package/mcp-server/OAuthAppForm.js.map +1 -1
- package/mcp-server/internal/definitionDrift.d.ts +39 -0
- package/mcp-server/internal/definitionDrift.d.ts.map +1 -0
- package/mcp-server/internal/definitionDrift.js +122 -0
- package/mcp-server/internal/definitionDrift.js.map +1 -0
- package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -1
- package/mcp-server/internal/mcpServerToInput.js +3 -0
- package/mcp-server/internal/mcpServerToInput.js.map +1 -1
- package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -1
- package/mcp-server/steps/EnvironmentAuthStep.js +8 -4
- package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
- package/mcp-server/steps/IdentityTransportStep.js +5 -4
- package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
- package/mcp-server/useMcpServerConnect.d.ts +1 -1
- package/mcp-server/useMcpServerDefinitionDrift.d.ts +44 -0
- package/mcp-server/useMcpServerDefinitionDrift.d.ts.map +1 -0
- package/mcp-server/useMcpServerDefinitionDrift.js +61 -0
- package/mcp-server/useMcpServerDefinitionDrift.js.map +1 -0
- package/models/ModelRegistryContext.d.ts +7 -1
- package/models/ModelRegistryContext.d.ts.map +1 -1
- package/models/ModelRegistryContext.js.map +1 -1
- package/models/ModelSelector.js +9 -1
- package/models/ModelSelector.js.map +1 -1
- package/models/index.d.ts +2 -2
- package/models/index.d.ts.map +1 -1
- package/models/index.js +1 -1
- package/models/index.js.map +1 -1
- package/models/registry.d.ts +88 -6
- package/models/registry.d.ts.map +1 -1
- package/models/registry.js +133 -27
- package/models/registry.js.map +1 -1
- package/models/useModelRegistry.d.ts +7 -1
- package/models/useModelRegistry.d.ts.map +1 -1
- package/models/useModelRegistry.js +3 -2
- package/models/useModelRegistry.js.map +1 -1
- package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
- package/oauth-app/CreateOAuthAppForm.js +4 -5
- package/oauth-app/CreateOAuthAppForm.js.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
- package/oauth-app/OAuthAppDetailPanel.js +5 -6
- package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
- package/organization/CreateOrganizationForm.d.ts.map +1 -1
- package/organization/CreateOrganizationForm.js +5 -9
- package/organization/CreateOrganizationForm.js.map +1 -1
- package/organization/OrgProfilePanel.d.ts.map +1 -1
- package/organization/OrgProfilePanel.js +7 -16
- package/organization/OrgProfilePanel.js.map +1 -1
- package/package.json +4 -4
- package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
- package/platform-client/CreatePlatformClientForm.js +5 -6
- package/platform-client/CreatePlatformClientForm.js.map +1 -1
- package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientDetailPanel.js +6 -7
- package/platform-client/PlatformClientDetailPanel.js.map +1 -1
- package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
- package/platform-client/PlatformClientListPanel.js +2 -4
- package/platform-client/PlatformClientListPanel.js.map +1 -1
- package/platform-client/PlatformClientSecretAlert.d.ts.map +1 -1
- package/platform-client/PlatformClientSecretAlert.js +18 -25
- package/platform-client/PlatformClientSecretAlert.js.map +1 -1
- package/provider.d.ts +34 -1
- package/provider.d.ts.map +1 -1
- package/provider.js +14 -7
- package/provider.js.map +1 -1
- package/resource-creation/WizardNav.d.ts.map +1 -1
- package/resource-creation/WizardNav.js +2 -4
- package/resource-creation/WizardNav.js.map +1 -1
- package/resource-detail/ConfirmDialog.js +1 -1
- package/resource-detail/useCopyResource.d.ts +4 -3
- package/resource-detail/useCopyResource.d.ts.map +1 -1
- package/resource-detail/useCopyResource.js +10 -19
- package/resource-detail/useCopyResource.js.map +1 -1
- package/schedule/ScheduleDetailView.d.ts.map +1 -1
- package/schedule/ScheduleDetailView.js +2 -4
- package/schedule/ScheduleDetailView.js.map +1 -1
- package/schedule/ScheduleForm.d.ts.map +1 -1
- package/schedule/ScheduleForm.js +6 -7
- package/schedule/ScheduleForm.js.map +1 -1
- package/session/NewSessionViewer.d.ts +52 -2
- package/session/NewSessionViewer.d.ts.map +1 -1
- package/session/NewSessionViewer.js +21 -6
- package/session/NewSessionViewer.js.map +1 -1
- package/session/SessionViewer.d.ts +63 -2
- package/session/SessionViewer.d.ts.map +1 -1
- package/session/SessionViewer.js +43 -17
- package/session/SessionViewer.js.map +1 -1
- package/session/audience.d.ts +17 -0
- package/session/audience.d.ts.map +1 -1
- package/session/index.d.ts +2 -1
- package/session/index.d.ts.map +1 -1
- package/session/index.js.map +1 -1
- package/session/run-config.d.ts +50 -0
- package/session/run-config.d.ts.map +1 -0
- package/session/run-config.js +15 -0
- package/session/run-config.js.map +1 -0
- package/session/useNewSessionFlow.d.ts +11 -0
- package/session/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +29 -2
- package/session/useNewSessionFlow.js.map +1 -1
- package/session/useSessionConversation.d.ts +7 -7
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +2 -0
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts +18 -4
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +33 -6
- package/session/useSessionPageFlow.js.map +1 -1
- package/session/useSessionPanel.d.ts +37 -2
- package/session/useSessionPanel.d.ts.map +1 -1
- package/session/useSessionPanel.js +44 -10
- package/session/useSessionPanel.js.map +1 -1
- package/settings/ApiKeysSection.d.ts.map +1 -1
- package/settings/ApiKeysSection.js +3 -2
- package/settings/ApiKeysSection.js.map +1 -1
- package/settings/ChannelAppsSection.d.ts.map +1 -1
- package/settings/ChannelAppsSection.js +3 -2
- package/settings/ChannelAppsSection.js.map +1 -1
- package/settings/EnvironmentsSection.js +5 -3
- package/settings/EnvironmentsSection.js.map +1 -1
- package/settings/IdentityProvidersSection.d.ts.map +1 -1
- package/settings/IdentityProvidersSection.js +3 -2
- package/settings/IdentityProvidersSection.js.map +1 -1
- package/settings/InvitationsSection.d.ts.map +1 -1
- package/settings/InvitationsSection.js +3 -1
- package/settings/InvitationsSection.js.map +1 -1
- package/settings/MembersSection.d.ts.map +1 -1
- package/settings/MembersSection.js +3 -1
- package/settings/MembersSection.js.map +1 -1
- package/settings/OAuthAppsSection.d.ts.map +1 -1
- package/settings/OAuthAppsSection.js +3 -2
- package/settings/OAuthAppsSection.js.map +1 -1
- package/settings/OrgProfileSection.d.ts.map +1 -1
- package/settings/OrgProfileSection.js +3 -2
- package/settings/OrgProfileSection.js.map +1 -1
- package/settings/PlatformClientsSection.d.ts.map +1 -1
- package/settings/PlatformClientsSection.js +3 -2
- package/settings/PlatformClientsSection.js.map +1 -1
- package/settings/UsageSection.d.ts.map +1 -1
- package/settings/UsageSection.js +3 -1
- package/settings/UsageSection.js.map +1 -1
- package/sharing/ShareAgentDialog.d.ts.map +1 -1
- package/sharing/ShareAgentDialog.js +18 -7
- package/sharing/ShareAgentDialog.js.map +1 -1
- package/sidebar/chrome.d.ts +3 -4
- package/sidebar/chrome.d.ts.map +1 -1
- package/sidebar/chrome.js +5 -4
- package/sidebar/chrome.js.map +1 -1
- package/skill/SkillDiffDialog.js +1 -1
- package/src/access/ManageAccessDialog.tsx +10 -4
- package/src/activity/format-relative-time.ts +11 -9
- package/src/agent/steps/CapabilitiesStep.tsx +6 -3
- package/src/agent/steps/IdentityStep.tsx +19 -12
- package/src/agent-instance/CreateAgentInstanceDialog.tsx +17 -8
- package/src/api-key/ApiKeyCreatedAlert.tsx +10 -19
- package/src/api-key/ApiKeyListPanel.tsx +3 -39
- package/src/api-key/CreateApiKeyForm.tsx +12 -26
- package/src/approval-defaults-context.ts +56 -0
- package/src/attachment/__tests__/vision-preflight.test.ts +311 -0
- package/src/attachment/index.ts +12 -0
- package/src/attachment/vision-preflight.ts +236 -0
- package/src/billing/AutoRechargeCard.tsx +5 -4
- package/src/billing/BillingSection.tsx +4 -3
- package/src/channel/ChannelConversationsDialog.tsx +8 -4
- package/src/channel/ChannelCredentialsDialog.tsx +14 -4
- package/src/channel/ChannelTemplatesDialog.tsx +8 -4
- package/src/channel/ConnectSlackDialog.tsx +14 -4
- package/src/channel/ConnectWhatsAppDialog.tsx +14 -4
- package/src/channel/useChannelSessions.ts +3 -0
- package/src/channel-app/ChannelAppDetailPanel.tsx +15 -12
- package/src/channel-app/CreateChannelAppForm.tsx +17 -12
- package/src/channel-app/internal.tsx +5 -25
- package/src/composer/ComposerToolbar.tsx +1 -1
- package/src/composer/SessionComposer.tsx +160 -13
- package/src/composer/__tests__/SessionComposer-modelCoherence.test.tsx +220 -0
- package/src/composer/__tests__/SessionComposer-visionPreflight.test.tsx +222 -0
- package/src/composer/icons.tsx +0 -18
- package/src/conversation/ConversationComposer.tsx +1 -1
- package/src/conversation/ConversationListPane.tsx +4 -3
- package/src/cursor-accounts/MemberCoverageTable.tsx +3 -14
- package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +2 -10
- package/src/dashboard/DashboardFailedRuns.tsx +2 -12
- package/src/environment/CreateEnvironmentForm.tsx +8 -27
- package/src/environment/EnvVarForm.tsx +2 -18
- package/src/environment/EnvironmentVariableEditor.tsx +5 -21
- package/src/execution/ArtifactApplyButton.tsx +2 -17
- package/src/execution/ExecutionErrorNotice.tsx +99 -0
- package/src/execution/FilePathLink.tsx +5 -9
- package/src/execution/FileReviewCard.tsx +1 -20
- package/src/execution/FollowUpInput.tsx +1 -16
- package/src/execution/LivenessStatusLine.tsx +59 -0
- package/src/execution/MessageEntry.tsx +136 -25
- package/src/execution/MessageThread.tsx +84 -83
- package/src/execution/SetupProgress.tsx +5 -1
- package/src/execution/SubAgentSection.tsx +9 -20
- package/src/execution/TerminalSession.tsx +97 -10
- package/src/execution/ToolCallDetail.tsx +19 -0
- package/src/execution/ToolCallItem.tsx +157 -37
- package/src/execution/ToolRunGroup.tsx +30 -32
- package/src/execution/WriteBackCard.tsx +5 -24
- package/src/execution/__tests__/MessageEntry-copy.test.tsx +125 -0
- package/src/execution/__tests__/MessageThread.test.tsx +97 -0
- package/src/execution/__tests__/TerminalSession.test.tsx +71 -1
- package/src/execution/__tests__/ToolCallDetail.test.tsx +33 -1
- package/src/execution/__tests__/ToolCallItem.test.tsx +299 -11
- package/src/execution/__tests__/ToolRunGroup.test.tsx +41 -9
- package/src/execution/__tests__/message-thread-slots.test.tsx +92 -0
- package/src/execution/__tests__/tool-presenter.test.tsx +41 -4
- package/src/execution/index.ts +8 -2
- package/src/execution/tool-categories.ts +72 -8
- package/src/execution/tool-presenter.ts +22 -1
- package/src/execution/useArtifactInspection.ts +4 -8
- package/src/iam-policy/GrantAccessForm.tsx +2 -18
- package/src/iam-policy/OrgMembersPanel.tsx +3 -19
- package/src/iam-policy/RoleSelector.tsx +8 -1
- package/src/identity-provider/CreateIdentityProviderForm.tsx +13 -31
- package/src/identity-provider/IdentityProviderDetailPanel.tsx +24 -49
- package/src/identity-provider/IdentityProviderListPanel.tsx +2 -18
- package/src/identity-provider/IdentityProviderWizard.tsx +15 -32
- package/src/identity-provider/SsoLoginPrompt.tsx +6 -21
- package/src/index.ts +23 -1
- package/src/internal/DecisionButton.tsx +1 -20
- package/src/internal/SpinnerIcon.tsx +42 -0
- package/src/internal/__tests__/ThreadCardShell.test.tsx +43 -7
- package/src/internal/__tests__/useCopyFeedback.test.ts +92 -0
- package/src/internal/select-element-text.ts +17 -0
- package/src/internal/thread-card/ThreadCardShell.tsx +53 -21
- package/src/internal/thread-card/glyphs.tsx +24 -3
- package/src/internal/thread-card/index.ts +1 -0
- package/src/internal/useCopyFeedback.ts +61 -0
- package/src/invitation/InvitationCreatedAlert.tsx +10 -18
- package/src/invitation/InvitationManager.tsx +23 -34
- package/src/invitation/InvitationRedemption.tsx +2 -18
- package/src/library/useExportResource.ts +15 -29
- package/src/manifest/ApplyManifestDialog.tsx +1 -1
- package/src/manifest/EditResourceYamlDialog.tsx +1 -1
- package/src/mcp-server/DefinitionDriftNotice.tsx +120 -0
- package/src/mcp-server/McpServerConnectDialog.tsx +1 -1
- package/src/mcp-server/McpServerDetailView.tsx +58 -26
- package/src/mcp-server/OAuthAppForm.tsx +2 -18
- package/src/mcp-server/__tests__/DefinitionDriftNotice.test.tsx +57 -0
- package/src/mcp-server/__tests__/definitionDrift.test.ts +245 -0
- package/src/mcp-server/__tests__/mcpServerToInput.test.ts +201 -0
- package/src/mcp-server/__tests__/useMcpServerDefinitionDrift.test.tsx +173 -0
- package/src/mcp-server/internal/definitionDrift.ts +158 -0
- package/src/mcp-server/internal/mcpServerToInput.ts +3 -0
- package/src/mcp-server/steps/EnvironmentAuthStep.tsx +19 -19
- package/src/mcp-server/steps/IdentityTransportStep.tsx +24 -23
- package/src/mcp-server/useMcpServerConnect.ts +1 -1
- package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
- package/src/models/ModelRegistryContext.ts +7 -1
- package/src/models/ModelSelector.tsx +37 -0
- package/src/models/__tests__/ModelSelector-visionIndicator.test.tsx +129 -0
- package/src/models/__tests__/resolveDefaultModel.test.ts +115 -0
- package/src/models/__tests__/useModelRegistry.test.tsx +99 -4
- package/src/models/index.ts +2 -2
- package/src/models/registry.ts +196 -29
- package/src/models/useModelRegistry.ts +10 -2
- package/src/oauth-app/CreateOAuthAppForm.tsx +16 -31
- package/src/oauth-app/OAuthAppDetailPanel.tsx +16 -31
- package/src/organization/CreateOrganizationForm.tsx +10 -29
- package/src/organization/OrgProfilePanel.tsx +13 -44
- package/src/platform-client/CreatePlatformClientForm.tsx +9 -29
- package/src/platform-client/PlatformClientDetailPanel.tsx +10 -30
- package/src/platform-client/PlatformClientListPanel.tsx +2 -18
- package/src/platform-client/PlatformClientSecretAlert.tsx +26 -55
- package/src/provider.tsx +76 -33
- package/src/resource-creation/WizardNav.tsx +2 -18
- package/src/resource-detail/ConfirmDialog.tsx +1 -1
- package/src/resource-detail/useCopyResource.ts +17 -23
- package/src/schedule/ScheduleDetailView.tsx +2 -18
- package/src/schedule/ScheduleForm.tsx +19 -34
- package/src/session/NewSessionViewer.tsx +85 -7
- package/src/session/SessionViewer.tsx +120 -17
- package/src/session/__tests__/audienceWiring.test.tsx +76 -0
- package/src/session/__tests__/panelNegotiation.test.tsx +302 -0
- package/src/session/__tests__/useNewSessionFlow.test.tsx +134 -5
- package/src/session/__tests__/useSessionPageFlow.autoApprove.test.tsx +74 -0
- package/src/session/__tests__/useSessionPageFlow.runConfig.test.tsx +157 -0
- package/src/session/__tests__/useSessionPanel.test.ts +114 -0
- package/src/session/audience.ts +18 -0
- package/src/session/index.ts +2 -1
- package/src/session/run-config.ts +59 -0
- package/src/session/useNewSessionFlow.ts +39 -2
- package/src/session/useSessionConversation.ts +10 -8
- package/src/session/useSessionPageFlow.ts +51 -10
- package/src/session/useSessionPanel.ts +91 -10
- package/src/settings/ApiKeysSection.tsx +4 -3
- package/src/settings/ChannelAppsSection.tsx +4 -3
- package/src/settings/EnvironmentsSection.tsx +8 -5
- package/src/settings/IdentityProvidersSection.tsx +4 -3
- package/src/settings/InvitationsSection.tsx +4 -2
- package/src/settings/MembersSection.tsx +4 -2
- package/src/settings/OAuthAppsSection.tsx +4 -3
- package/src/settings/OrgProfileSection.tsx +4 -3
- package/src/settings/PlatformClientsSection.tsx +4 -3
- package/src/settings/UsageSection.tsx +4 -2
- package/src/sharing/ShareAgentDialog.tsx +28 -10
- package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -1
- package/src/sidebar/chrome.tsx +6 -6
- package/src/skill/SkillDiffDialog.tsx +1 -1
- package/src/styles.css +43 -0
- package/src/version-history/VersionTimelineEntry.tsx +1 -21
- package/src/workflow/FailedRunsWidget.tsx +2 -9
- package/src/workflow/PendingApprovalsWidget.tsx +2 -9
- package/src/workflow/ViewYamlDialog.tsx +7 -22
- package/src/workflow/WorkflowArchitectDialog.tsx +8 -27
- package/src/workflow/WorkflowArtifactDocument.tsx +5 -9
- package/src/workflow/WorkflowCanvasEditor.tsx +2 -0
- package/src/workflow/WorkflowCanvasInner.tsx +14 -1
- package/src/workflow/WorkflowDiffGraph.tsx +7 -1
- package/src/workflow/WorkflowExecutionViewer.tsx +88 -11
- package/src/workflow/WorkflowExplainDialog.tsx +8 -24
- package/src/workflow/WorkflowOverviewGraph.tsx +9 -1
- package/src/workflow/WorkflowRefinePanel.tsx +2 -18
- package/src/workflow/WorkflowRepairCard.tsx +2 -18
- package/src/workflow/WorkflowRunDialog.tsx +3 -23
- package/src/workflow/WorkflowTaskApprovalSummary.tsx +2 -17
- package/src/workflow/WorkflowVersionBadge.tsx +4 -13
- package/src/workflow/WorkflowVersionTimeline.tsx +1 -25
- package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
- package/src/workflow/__tests__/useWorkflowCanvas.dirty.test.tsx +178 -0
- package/src/workflow/__tests__/useWorkflowCanvas.drag.test.tsx +224 -0
- package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
- package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +7 -11
- package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
- package/src/workflow/index.ts +1 -0
- package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +1 -1
- package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
- package/src/workflow/picker/BranchAddPopover.tsx +4 -3
- package/src/workflow/templates/WorkflowTemplatePreview.tsx +1 -1
- package/src/workflow/useApprovalBoundary.ts +1 -1
- package/src/workflow/useWorkflowCanvas.ts +114 -11
- package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
- package/styles.css +1 -1
- package/version-history/VersionTimelineEntry.d.ts.map +1 -1
- package/version-history/VersionTimelineEntry.js +1 -23
- package/version-history/VersionTimelineEntry.js.map +1 -1
- package/workflow/CanvasTransitionEdge.d.ts +1 -1
- package/workflow/FailedRunsWidget.d.ts.map +1 -1
- package/workflow/FailedRunsWidget.js +2 -11
- package/workflow/FailedRunsWidget.js.map +1 -1
- package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
- package/workflow/PendingApprovalsWidget.js +2 -11
- package/workflow/PendingApprovalsWidget.js.map +1 -1
- package/workflow/ViewYamlDialog.d.ts.map +1 -1
- package/workflow/ViewYamlDialog.js +7 -23
- package/workflow/ViewYamlDialog.js.map +1 -1
- package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
- package/workflow/WorkflowArchitectDialog.js +7 -11
- package/workflow/WorkflowArchitectDialog.js.map +1 -1
- package/workflow/WorkflowArtifactDocument.d.ts.map +1 -1
- package/workflow/WorkflowArtifactDocument.js +5 -8
- package/workflow/WorkflowArtifactDocument.js.map +1 -1
- package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
- package/workflow/WorkflowCanvasEditor.js +1 -1
- package/workflow/WorkflowCanvasEditor.js.map +1 -1
- package/workflow/WorkflowCanvasInner.d.ts +4 -2
- package/workflow/WorkflowCanvasInner.d.ts.map +1 -1
- package/workflow/WorkflowCanvasInner.js +7 -3
- package/workflow/WorkflowCanvasInner.js.map +1 -1
- package/workflow/WorkflowDiffGraph.js +6 -2
- package/workflow/WorkflowDiffGraph.js.map +1 -1
- package/workflow/WorkflowExecutionViewer.d.ts +51 -0
- package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
- package/workflow/WorkflowExecutionViewer.js +23 -6
- package/workflow/WorkflowExecutionViewer.js.map +1 -1
- package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
- package/workflow/WorkflowExplainDialog.js +6 -8
- package/workflow/WorkflowExplainDialog.js.map +1 -1
- package/workflow/WorkflowOverviewGraph.js +8 -2
- package/workflow/WorkflowOverviewGraph.js.map +1 -1
- package/workflow/WorkflowRefinePanel.d.ts.map +1 -1
- package/workflow/WorkflowRefinePanel.js +2 -4
- package/workflow/WorkflowRefinePanel.js.map +1 -1
- package/workflow/WorkflowRepairCard.d.ts.map +1 -1
- package/workflow/WorkflowRepairCard.js +2 -4
- package/workflow/WorkflowRepairCard.js.map +1 -1
- package/workflow/WorkflowRunDialog.d.ts.map +1 -1
- package/workflow/WorkflowRunDialog.js +2 -7
- package/workflow/WorkflowRunDialog.js.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.js +2 -4
- package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
- package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
- package/workflow/WorkflowVersionBadge.js +4 -13
- package/workflow/WorkflowVersionBadge.js.map +1 -1
- package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
- package/workflow/WorkflowVersionTimeline.js +1 -26
- package/workflow/WorkflowVersionTimeline.js.map +1 -1
- package/workflow/execution-comparison/ExecutionComparisonPicker.d.ts.map +1 -1
- package/workflow/execution-comparison/ExecutionComparisonPicker.js +7 -15
- package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
- package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
- package/workflow/execution-history/ExecutionHistoryTable.js +1 -24
- package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
- package/workflow/index.d.ts +1 -1
- package/workflow/index.d.ts.map +1 -1
- package/workflow/index.js.map +1 -1
- package/workflow/instance/CreateWorkflowInstanceDialog.js +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js +1 -1
- package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
- package/workflow/picker/BranchAddPopover.d.ts.map +1 -1
- package/workflow/picker/BranchAddPopover.js +3 -2
- package/workflow/picker/BranchAddPopover.js.map +1 -1
- package/workflow/templates/WorkflowTemplatePreview.js +1 -1
- package/workflow/useApprovalBoundary.d.ts +1 -1
- package/workflow/useApprovalBoundary.js +1 -1
- package/workflow/useWorkflowCanvas.d.ts +5 -1
- package/workflow/useWorkflowCanvas.d.ts.map +1 -1
- package/workflow/useWorkflowCanvas.js +99 -13
- package/workflow/useWorkflowCanvas.js.map +1 -1
- package/workflow/useWorkflowExecutionPanel.d.ts +38 -2
- package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
- package/workflow/useWorkflowExecutionPanel.js +46 -13
- package/workflow/useWorkflowExecutionPanel.js.map +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// Contract tests for the shared thread-card shell (T05/T06): the chrome
|
|
2
|
-
//
|
|
3
|
-
// (`expand` / `none` — `select` died with the Inspect
|
|
4
|
-
// with their ARIA semantics, and the nested-button keydown
|
|
5
|
-
// consuming threads pin their own compositions; this file
|
|
6
|
-
// share.
|
|
2
|
+
// tiers (card / nested divider row / quiet unboxed line, gate accent), the
|
|
3
|
+
// header gestures (`expand` / `none` — `select` died with the Inspect
|
|
4
|
+
// drill-down, T06) with their ARIA semantics, and the nested-button keydown
|
|
5
|
+
// guard. The two consuming threads pin their own compositions; this file
|
|
6
|
+
// pins what they share.
|
|
7
7
|
|
|
8
8
|
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
9
9
|
import { render, screen, fireEvent, cleanup } from "@testing-library/react";
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
afterEach(cleanup);
|
|
17
17
|
|
|
18
18
|
describe("ThreadCardShell chrome", () => {
|
|
19
|
-
it("renders a bordered card by default
|
|
19
|
+
it("renders a bordered card by default, a divider row when nested, and no chrome when quiet", () => {
|
|
20
20
|
const { rerender, container } = render(
|
|
21
21
|
<ThreadCardShell cursorTarget="row">
|
|
22
22
|
<ThreadCardHeader>content</ThreadCardHeader>
|
|
@@ -27,12 +27,22 @@ describe("ThreadCardShell chrome", () => {
|
|
|
27
27
|
expect(root().className).toContain("stg:border-border-prominent");
|
|
28
28
|
|
|
29
29
|
rerender(
|
|
30
|
-
<ThreadCardShell cursorTarget="row"
|
|
30
|
+
<ThreadCardShell cursorTarget="row" variant="row">
|
|
31
31
|
<ThreadCardHeader>content</ThreadCardHeader>
|
|
32
32
|
</ThreadCardShell>,
|
|
33
33
|
);
|
|
34
34
|
expect(root().className).toContain("stg:border-b");
|
|
35
35
|
expect(root().className).not.toContain("stg:border-border-prominent");
|
|
36
|
+
|
|
37
|
+
rerender(
|
|
38
|
+
<ThreadCardShell cursorTarget="row" variant="quiet">
|
|
39
|
+
<ThreadCardHeader>content</ThreadCardHeader>
|
|
40
|
+
</ThreadCardShell>,
|
|
41
|
+
);
|
|
42
|
+
// The quiet tier is an unboxed line: no card border, no divider.
|
|
43
|
+
expect(root().className).not.toContain("stg:border-border-prominent");
|
|
44
|
+
expect(root().className).not.toContain("stg:border-b");
|
|
45
|
+
expect(root().className).not.toContain("stg:rounded-lg");
|
|
36
46
|
});
|
|
37
47
|
|
|
38
48
|
it("carries the gate accent", () => {
|
|
@@ -44,6 +54,19 @@ describe("ThreadCardShell chrome", () => {
|
|
|
44
54
|
const root = container.querySelector('[data-cursor-target="row"]') as HTMLElement;
|
|
45
55
|
expect(root.className).toContain("stg:border-l-warning");
|
|
46
56
|
});
|
|
57
|
+
|
|
58
|
+
it("never draws the gate accent on a quiet shell — escalation is the caller's job", () => {
|
|
59
|
+
// The quiet tier deliberately ignores `accent`: a gated row must be
|
|
60
|
+
// escalated to variant="card" by its component, never rendered as an
|
|
61
|
+
// accented bare line (see ThreadCardVariant).
|
|
62
|
+
const { container } = render(
|
|
63
|
+
<ThreadCardShell cursorTarget="row" variant="quiet" accent="warning">
|
|
64
|
+
<ThreadCardHeader>content</ThreadCardHeader>
|
|
65
|
+
</ThreadCardShell>,
|
|
66
|
+
);
|
|
67
|
+
const root = container.querySelector('[data-cursor-target="row"]') as HTMLElement;
|
|
68
|
+
expect(root.className).not.toContain("stg:border-l-warning");
|
|
69
|
+
});
|
|
47
70
|
});
|
|
48
71
|
|
|
49
72
|
describe("ThreadCardHeader gestures", () => {
|
|
@@ -102,4 +125,17 @@ describe("ThreadCardBody", () => {
|
|
|
102
125
|
render(<ThreadCardBody id="detail-1">body</ThreadCardBody>);
|
|
103
126
|
expect(document.getElementById("detail-1")?.textContent).toBe("body");
|
|
104
127
|
});
|
|
128
|
+
|
|
129
|
+
it("swaps the card padding for a left rail when the body is quiet-contained", () => {
|
|
130
|
+
const { rerender } = render(<ThreadCardBody id="detail-1">body</ThreadCardBody>);
|
|
131
|
+
const el = () => document.getElementById("detail-1")!;
|
|
132
|
+
expect(el().className).not.toContain("stg:border-l-2");
|
|
133
|
+
|
|
134
|
+
rerender(
|
|
135
|
+
<ThreadCardBody id="detail-1" rail>
|
|
136
|
+
body
|
|
137
|
+
</ThreadCardBody>,
|
|
138
|
+
);
|
|
139
|
+
expect(el().className).toContain("stg:border-l-2");
|
|
140
|
+
});
|
|
105
141
|
});
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { act, renderHook } from "@testing-library/react";
|
|
3
|
+
import { useCopyFeedback } from "../useCopyFeedback";
|
|
4
|
+
|
|
5
|
+
describe("useCopyFeedback", () => {
|
|
6
|
+
let writeText: ReturnType<typeof vi.fn>;
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
vi.useFakeTimers();
|
|
10
|
+
writeText = vi.fn().mockResolvedValue(undefined);
|
|
11
|
+
vi.stubGlobal("navigator", { clipboard: { writeText } });
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
vi.unstubAllGlobals();
|
|
16
|
+
vi.useRealTimers();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("resolves true and flashes `copied` for a successful write", async () => {
|
|
20
|
+
const { result } = renderHook(() => useCopyFeedback());
|
|
21
|
+
|
|
22
|
+
let outcome: boolean | undefined;
|
|
23
|
+
await act(async () => {
|
|
24
|
+
outcome = await result.current.copy("hello");
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
expect(outcome).toBe(true);
|
|
28
|
+
expect(writeText).toHaveBeenCalledWith("hello");
|
|
29
|
+
expect(result.current.copied).toBe(true);
|
|
30
|
+
|
|
31
|
+
act(() => {
|
|
32
|
+
vi.advanceTimersByTime(2000);
|
|
33
|
+
});
|
|
34
|
+
expect(result.current.copied).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("resolves false and never claims `copied` for a rejected write", async () => {
|
|
38
|
+
writeText.mockRejectedValue(new Error("denied"));
|
|
39
|
+
const { result } = renderHook(() => useCopyFeedback());
|
|
40
|
+
|
|
41
|
+
let outcome: boolean | undefined;
|
|
42
|
+
await act(async () => {
|
|
43
|
+
outcome = await result.current.copy("secret");
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
expect(outcome).toBe(false);
|
|
47
|
+
expect(result.current.copied).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("restarts the feedback window on a rapid second copy", async () => {
|
|
51
|
+
const { result } = renderHook(() => useCopyFeedback());
|
|
52
|
+
|
|
53
|
+
await act(async () => {
|
|
54
|
+
await result.current.copy("one");
|
|
55
|
+
});
|
|
56
|
+
act(() => {
|
|
57
|
+
vi.advanceTimersByTime(1500);
|
|
58
|
+
});
|
|
59
|
+
await act(async () => {
|
|
60
|
+
await result.current.copy("two");
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// 1.5s into the second window: still showing feedback.
|
|
64
|
+
act(() => {
|
|
65
|
+
vi.advanceTimersByTime(1500);
|
|
66
|
+
});
|
|
67
|
+
expect(result.current.copied).toBe(true);
|
|
68
|
+
|
|
69
|
+
act(() => {
|
|
70
|
+
vi.advanceTimersByTime(500);
|
|
71
|
+
});
|
|
72
|
+
expect(result.current.copied).toBe(false);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("does not set state after unmount when the timer would fire", async () => {
|
|
76
|
+
const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
|
77
|
+
const { result, unmount } = renderHook(() => useCopyFeedback());
|
|
78
|
+
|
|
79
|
+
await act(async () => {
|
|
80
|
+
await result.current.copy("bye");
|
|
81
|
+
});
|
|
82
|
+
unmount();
|
|
83
|
+
act(() => {
|
|
84
|
+
vi.advanceTimersByTime(2000);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// React warns on setState-after-unmount via console.error; silence means
|
|
88
|
+
// the unmount cleanup cleared the pending timer.
|
|
89
|
+
expect(errorSpy).not.toHaveBeenCalled();
|
|
90
|
+
errorSpy.mockRestore();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Select an element's text content, replacing any existing selection.
|
|
3
|
+
*
|
|
4
|
+
* The honest fallback for one-time secret reveals (API keys, invite URLs,
|
|
5
|
+
* client secrets) when the clipboard write is rejected (insecure context,
|
|
6
|
+
* denied permission): instead of claiming "Copied" for a copy that didn't
|
|
7
|
+
* happen, the revealed value is selected so the user can copy it manually.
|
|
8
|
+
* Pair with `useCopyFeedback` — branch on its `copy()` result.
|
|
9
|
+
*/
|
|
10
|
+
export function selectElementText(el: HTMLElement): void {
|
|
11
|
+
const selection = window.getSelection();
|
|
12
|
+
if (!selection) return;
|
|
13
|
+
const range = document.createRange();
|
|
14
|
+
range.selectNodeContents(el);
|
|
15
|
+
selection.removeAllRanges();
|
|
16
|
+
selection.addRange(range);
|
|
17
|
+
}
|
|
@@ -14,7 +14,8 @@ import { ChevronIcon } from "./glyphs.js";
|
|
|
14
14
|
* Three pieces, composed via children (slots-as-children, never a
|
|
15
15
|
* mega-prop card — each thread's composition stays explicit):
|
|
16
16
|
*
|
|
17
|
-
* - {@link ThreadCardShell} — the chrome: bordered card
|
|
17
|
+
* - {@link ThreadCardShell} — the chrome tier: bordered card, nested divider
|
|
18
|
+
* row, or quiet unboxed line ({@link ThreadCardVariant}), plus the
|
|
18
19
|
* pending-gate accent.
|
|
19
20
|
* - {@link ThreadCardHeader} — the one-line header region with a
|
|
20
21
|
* primary gesture: `expand` (summary rows, `aria-expanded`, appends
|
|
@@ -41,15 +42,25 @@ import { ChevronIcon } from "./glyphs.js";
|
|
|
41
42
|
// Shell — the card chrome
|
|
42
43
|
// ---------------------------------------------------------------------------
|
|
43
44
|
|
|
45
|
+
/**
|
|
46
|
+
* The chrome tier of a thread row (the density axis at the shell level):
|
|
47
|
+
*
|
|
48
|
+
* - `"card"` — a self-contained bordered card (the default).
|
|
49
|
+
* - `"row"` — a divider-separated row for rows nested inside a container
|
|
50
|
+
* that already provides the frame (e.g. an expanded `ToolRunGroup` fold),
|
|
51
|
+
* avoiding a card-in-a-card.
|
|
52
|
+
* - `"quiet"` — no chrome at all: an unboxed line for metadata-only rows
|
|
53
|
+
* whose header IS the complete information (reads, listings, thoughts).
|
|
54
|
+
* The gate accent is deliberately not drawn in this tier — a row carrying
|
|
55
|
+
* an accent must be escalated to `"card"` by the caller, never rendered
|
|
56
|
+
* as an accented bare line.
|
|
57
|
+
*/
|
|
58
|
+
export type ThreadCardVariant = "card" | "row" | "quiet";
|
|
59
|
+
|
|
44
60
|
/** Props for {@link ThreadCardShell}. */
|
|
45
61
|
export interface ThreadCardShellProps {
|
|
46
|
-
/**
|
|
47
|
-
|
|
48
|
-
* border). Set to `false` when nested inside a container that already
|
|
49
|
-
* provides the border — e.g. the folded `ToolRunGroup` chip — where the
|
|
50
|
-
* row degrades to a divider-separated row to avoid a card-in-a-card.
|
|
51
|
-
*/
|
|
52
|
-
readonly bordered?: boolean;
|
|
62
|
+
/** The chrome tier — see {@link ThreadCardVariant}. Defaults to `"card"`. */
|
|
63
|
+
readonly variant?: ThreadCardVariant;
|
|
53
64
|
/**
|
|
54
65
|
* A restrained left accent for a row awaiting a human decision —
|
|
55
66
|
* `"warning"` for ordinary gates, `"destructive"` for delete gates.
|
|
@@ -64,25 +75,31 @@ export interface ThreadCardShellProps {
|
|
|
64
75
|
readonly children: ReactNode;
|
|
65
76
|
}
|
|
66
77
|
|
|
78
|
+
const VARIANT_CHROME: Record<Exclude<ThreadCardVariant, "card">, string> = {
|
|
79
|
+
row: "stg:border-b stg:border-border-muted stg:last:border-b-0",
|
|
80
|
+
quiet: "",
|
|
81
|
+
};
|
|
82
|
+
|
|
67
83
|
/** The thread card's outer chrome. See the module doc for the full contract. */
|
|
68
84
|
export function ThreadCardShell({
|
|
69
|
-
|
|
85
|
+
variant = "card",
|
|
70
86
|
accent = null,
|
|
71
87
|
cursorTarget,
|
|
72
88
|
className,
|
|
73
89
|
ref,
|
|
74
90
|
children,
|
|
75
91
|
}: ThreadCardShellProps) {
|
|
76
|
-
const chrome =
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
92
|
+
const chrome =
|
|
93
|
+
variant === "card"
|
|
94
|
+
? cn(
|
|
95
|
+
// border-prominent (not border): a transparent card needs a line the
|
|
96
|
+
// eye actually catches — the default border token is white at 14%
|
|
97
|
+
// opacity, which vanishes on the dark thread surface.
|
|
98
|
+
"stg:rounded-lg stg:border stg:border-border-prominent stg:overflow-hidden",
|
|
99
|
+
accent === "warning" && "stg:border-l-2 stg:border-l-warning",
|
|
100
|
+
accent === "destructive" && "stg:border-l-2 stg:border-l-destructive",
|
|
101
|
+
)
|
|
102
|
+
: VARIANT_CHROME[variant];
|
|
86
103
|
|
|
87
104
|
return (
|
|
88
105
|
<div ref={ref} data-cursor-target={cursorTarget} className={cn(chrome, className)}>
|
|
@@ -176,13 +193,28 @@ export interface ThreadCardBodyProps {
|
|
|
176
193
|
readonly id?: string;
|
|
177
194
|
/** Rendered as `data-cursor-target` for e2e targeting. */
|
|
178
195
|
readonly cursorTarget?: string;
|
|
196
|
+
/**
|
|
197
|
+
* Body containment for a `"quiet"` shell: with no card border around it, a
|
|
198
|
+
* disclosed body needs its own boundary — a light left rail (the
|
|
199
|
+
* `ThinkingMessage` expanded-state precedent) instead of the card's padding
|
|
200
|
+
* box. Ignored for card/row shells, whose frame already bounds the body.
|
|
201
|
+
*/
|
|
202
|
+
readonly rail?: boolean;
|
|
179
203
|
readonly children: ReactNode;
|
|
180
204
|
}
|
|
181
205
|
|
|
182
206
|
/** The thread card's body padding contract. */
|
|
183
|
-
export function ThreadCardBody({ id, cursorTarget, children }: ThreadCardBodyProps) {
|
|
207
|
+
export function ThreadCardBody({ id, cursorTarget, rail = false, children }: ThreadCardBodyProps) {
|
|
184
208
|
return (
|
|
185
|
-
<div
|
|
209
|
+
<div
|
|
210
|
+
id={id}
|
|
211
|
+
data-cursor-target={cursorTarget}
|
|
212
|
+
className={
|
|
213
|
+
rail
|
|
214
|
+
? "stg:ml-1.5 stg:border-l-2 stg:border-border-muted stg:py-1 stg:pl-3 stg:pr-2.5"
|
|
215
|
+
: "stg:px-2.5 stg:pb-2.5 stg:pt-1"
|
|
216
|
+
}
|
|
217
|
+
>
|
|
186
218
|
{children}
|
|
187
219
|
</div>
|
|
188
220
|
);
|
|
@@ -13,10 +13,31 @@ import { cn } from "@stigmer/theme";
|
|
|
13
13
|
* @internal Not part of the public API.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
/**
|
|
17
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Quarter-arc spinner for an in-flight item. Deliberately finer than the
|
|
18
|
+
* SDK-wide `internal/SpinnerIcon` (1.5 stroke on a 12 grid vs 2 on 16) —
|
|
19
|
+
* the micro-row weight this vocabulary is built around. Card-adjacent
|
|
20
|
+
* surfaces that used to carry their own copies (tool-run groups, file
|
|
21
|
+
* review, decision buttons) size it up via `size` instead.
|
|
22
|
+
*/
|
|
23
|
+
export function SpinnerIcon({
|
|
24
|
+
size = 10,
|
|
25
|
+
className,
|
|
26
|
+
}: {
|
|
27
|
+
readonly size?: number;
|
|
28
|
+
readonly className?: string;
|
|
29
|
+
} = {}) {
|
|
18
30
|
return (
|
|
19
|
-
<svg
|
|
31
|
+
<svg
|
|
32
|
+
width={size}
|
|
33
|
+
height={size}
|
|
34
|
+
viewBox="0 0 12 12"
|
|
35
|
+
fill="none"
|
|
36
|
+
stroke="currentColor"
|
|
37
|
+
strokeWidth="1.5"
|
|
38
|
+
className={cn("stg:animate-spin", className)}
|
|
39
|
+
aria-hidden="true"
|
|
40
|
+
>
|
|
20
41
|
<path d="M6 1.5A4.5 4.5 0 1 1 1.5 6" strokeLinecap="round" />
|
|
21
42
|
</svg>
|
|
22
43
|
);
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
4
|
+
|
|
5
|
+
/** How long the transient `copied` flag stays true after a successful copy. */
|
|
6
|
+
const COPIED_FEEDBACK_MS = 2000;
|
|
7
|
+
|
|
8
|
+
/** Return value of {@link useCopyFeedback}. */
|
|
9
|
+
export interface UseCopyFeedbackReturn {
|
|
10
|
+
/**
|
|
11
|
+
* Write `text` to the clipboard. Resolves `true` when the write landed and
|
|
12
|
+
* `false` when it was rejected (insecure context, denied permission); a
|
|
13
|
+
* rejected write leaves `copied` false so the affordance never claims a
|
|
14
|
+
* copy that didn't happen. Callers with a manual fallback (e.g. selecting
|
|
15
|
+
* the on-screen text for a hand copy) branch on the result; plain
|
|
16
|
+
* affordances can ignore it.
|
|
17
|
+
*/
|
|
18
|
+
readonly copy: (text: string) => Promise<boolean>;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* `true` for a brief window after a successful copy (drives "Copied"
|
|
22
|
+
* affordance feedback), then resets automatically.
|
|
23
|
+
*/
|
|
24
|
+
readonly copied: boolean;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Behavior hook for the copy-with-feedback shape: write locally-held text to
|
|
29
|
+
* the clipboard and flash a transient `copied` flag for the affordance swap.
|
|
30
|
+
*
|
|
31
|
+
* This is the fetch-free sibling of `useArtifactCopy` (which resolves remote
|
|
32
|
+
* artifact bytes at click time); use it wherever the text to copy is already
|
|
33
|
+
* in hand — message content, identifiers, code blocks. One implementation
|
|
34
|
+
* keeps the feedback window and the unmount-safety identical across surfaces.
|
|
35
|
+
*/
|
|
36
|
+
export function useCopyFeedback(): UseCopyFeedbackReturn {
|
|
37
|
+
const [copied, setCopied] = useState(false);
|
|
38
|
+
|
|
39
|
+
// Clear the pending "copied" timer on unmount so a resolved copy never sets
|
|
40
|
+
// state on an unmounted component.
|
|
41
|
+
const copiedTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
return () => {
|
|
44
|
+
if (copiedTimer.current !== null) clearTimeout(copiedTimer.current);
|
|
45
|
+
};
|
|
46
|
+
}, []);
|
|
47
|
+
|
|
48
|
+
const copy = useCallback(async (text: string) => {
|
|
49
|
+
try {
|
|
50
|
+
await navigator.clipboard.writeText(text);
|
|
51
|
+
} catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
setCopied(true);
|
|
55
|
+
if (copiedTimer.current !== null) clearTimeout(copiedTimer.current);
|
|
56
|
+
copiedTimer.current = setTimeout(() => setCopied(false), COPIED_FEEDBACK_MS);
|
|
57
|
+
return true;
|
|
58
|
+
}, []);
|
|
59
|
+
|
|
60
|
+
return useMemo(() => ({ copy, copied }), [copy, copied]);
|
|
61
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useCallback,
|
|
3
|
+
import { useCallback, useRef } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { selectElementText } from "../internal/select-element-text.js";
|
|
6
|
+
import { useCopyFeedback } from "../internal/useCopyFeedback.js";
|
|
5
7
|
|
|
6
8
|
// ---------------------------------------------------------------------------
|
|
7
9
|
// Public API
|
|
@@ -47,24 +49,14 @@ export function InvitationCreatedAlert({
|
|
|
47
49
|
onDismiss,
|
|
48
50
|
className,
|
|
49
51
|
}: InvitationCreatedAlertProps) {
|
|
50
|
-
const
|
|
52
|
+
const { copy, copied } = useCopyFeedback();
|
|
53
|
+
const revealRef = useRef<HTMLElement>(null);
|
|
51
54
|
|
|
52
55
|
const handleCopy = useCallback(async () => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
} catch {
|
|
58
|
-
const el = document.getElementById("stgm-invite-url-reveal");
|
|
59
|
-
if (el) {
|
|
60
|
-
const selection = window.getSelection();
|
|
61
|
-
const range = document.createRange();
|
|
62
|
-
range.selectNodeContents(el);
|
|
63
|
-
selection?.removeAllRanges();
|
|
64
|
-
selection?.addRange(range);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}, [inviteUrl]);
|
|
56
|
+
if (await copy(inviteUrl)) return;
|
|
57
|
+
// Rejected write: select the revealed URL so the user can copy manually.
|
|
58
|
+
if (revealRef.current) selectElementText(revealRef.current);
|
|
59
|
+
}, [copy, inviteUrl]);
|
|
68
60
|
|
|
69
61
|
return (
|
|
70
62
|
<div
|
|
@@ -99,7 +91,7 @@ export function InvitationCreatedAlert({
|
|
|
99
91
|
|
|
100
92
|
<div className="stg:flex stg:items-center stg:gap-2">
|
|
101
93
|
<code
|
|
102
|
-
|
|
94
|
+
ref={revealRef}
|
|
103
95
|
className={cn(
|
|
104
96
|
"stg:min-w-0 stg:flex-1 stg:select-all stg:truncate stg:rounded-md",
|
|
105
97
|
"stg:border stg:border-input stg:bg-background stg:px-2.5 stg:py-1.5",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import { useCallback, useState, type FormEvent } from "react";
|
|
3
|
+
import { useCallback, useId, useState, type FormEvent } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
5
|
import {
|
|
6
6
|
getUserMessage,
|
|
@@ -17,6 +17,8 @@ import { useRevokeInvitation } from "./useRevokeInvitation.js";
|
|
|
17
17
|
import { InvitationCreatedAlert } from "./InvitationCreatedAlert.js";
|
|
18
18
|
import { Tooltip, TooltipContent, TooltipTrigger } from "../internal/tooltip.js";
|
|
19
19
|
import { RoleSelector } from "../iam-policy/RoleSelector.js";
|
|
20
|
+
import { SpinnerIcon } from "../internal/SpinnerIcon.js";
|
|
21
|
+
import { useCopyFeedback } from "../internal/useCopyFeedback.js";
|
|
20
22
|
|
|
21
23
|
// ---------------------------------------------------------------------------
|
|
22
24
|
// Public API
|
|
@@ -230,6 +232,7 @@ function CreateInvitationForm({
|
|
|
230
232
|
onCancel: () => void;
|
|
231
233
|
}) {
|
|
232
234
|
const { create, isCreating, error, clearError } = useCreateInvitation();
|
|
235
|
+
const baseId = useId();
|
|
233
236
|
|
|
234
237
|
const [label, setLabel] = useState("");
|
|
235
238
|
const [role, setRole] = useState<IamRole>(IamRole.viewer);
|
|
@@ -266,14 +269,14 @@ function CreateInvitationForm({
|
|
|
266
269
|
{/* Label */}
|
|
267
270
|
<div className="stg:space-y-1">
|
|
268
271
|
<label
|
|
269
|
-
htmlFor=
|
|
272
|
+
htmlFor={`${baseId}-label`}
|
|
270
273
|
className="stg:text-xs stg:font-medium stg:text-foreground"
|
|
271
274
|
>
|
|
272
275
|
Label{" "}
|
|
273
276
|
<span className="stg:font-normal stg:text-muted-foreground">(optional)</span>
|
|
274
277
|
</label>
|
|
275
278
|
<input
|
|
276
|
-
id=
|
|
279
|
+
id={`${baseId}-label`}
|
|
277
280
|
type="text"
|
|
278
281
|
value={label}
|
|
279
282
|
onChange={(e) => setLabel(e.target.value)}
|
|
@@ -304,9 +307,12 @@ function CreateInvitationForm({
|
|
|
304
307
|
Expires in
|
|
305
308
|
</legend>
|
|
306
309
|
<div className="stg:flex stg:flex-wrap stg:gap-2">
|
|
310
|
+
{/* Radio-group names are minted per mount: a hardcoded name would
|
|
311
|
+
merge two mounted forms into one keyboard group. */}
|
|
307
312
|
{EXPIRY_OPTIONS.map(({ value, label: optLabel }) => (
|
|
308
313
|
<ExpiryRadio
|
|
309
314
|
key={value}
|
|
315
|
+
name={`${baseId}-expiry`}
|
|
310
316
|
value={value}
|
|
311
317
|
label={optLabel}
|
|
312
318
|
checked={expiry === value}
|
|
@@ -324,6 +330,7 @@ function CreateInvitationForm({
|
|
|
324
330
|
</legend>
|
|
325
331
|
<div className="stg:flex stg:flex-wrap stg:gap-2">
|
|
326
332
|
<RedemptionRadio
|
|
333
|
+
name={`${baseId}-redemption`}
|
|
327
334
|
value="unlimited"
|
|
328
335
|
label="Unlimited"
|
|
329
336
|
description="Anyone with the link can join"
|
|
@@ -332,6 +339,7 @@ function CreateInvitationForm({
|
|
|
332
339
|
onChange={setRedemptionMode}
|
|
333
340
|
/>
|
|
334
341
|
<RedemptionRadio
|
|
342
|
+
name={`${baseId}-redemption`}
|
|
335
343
|
value="single"
|
|
336
344
|
label="Single use"
|
|
337
345
|
description="One person only"
|
|
@@ -358,7 +366,7 @@ function CreateInvitationForm({
|
|
|
358
366
|
"stg:disabled:pointer-events-none stg:disabled:opacity-40",
|
|
359
367
|
)}
|
|
360
368
|
>
|
|
361
|
-
{isCreating && <SpinnerIcon />}
|
|
369
|
+
{isCreating && <SpinnerIcon size={12} />}
|
|
362
370
|
Create invite link
|
|
363
371
|
</button>
|
|
364
372
|
|
|
@@ -398,7 +406,7 @@ function InvitationRow({
|
|
|
398
406
|
onCancelRevoke: () => void;
|
|
399
407
|
onRevoked: () => void;
|
|
400
408
|
}) {
|
|
401
|
-
const
|
|
409
|
+
const { copy, copied } = useCopyFeedback();
|
|
402
410
|
|
|
403
411
|
const id = invitation.metadata?.id ?? "";
|
|
404
412
|
const label = invitation.spec?.label || invitation.metadata?.name || "Unnamed invite";
|
|
@@ -410,15 +418,9 @@ function InvitationRow({
|
|
|
410
418
|
const expiresAt = invitation.spec?.expiresAt;
|
|
411
419
|
const isActive = state === InvitationState.active;
|
|
412
420
|
|
|
413
|
-
const handleCopy = useCallback(
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
setCopied(true);
|
|
417
|
-
setTimeout(() => setCopied(false), 2000);
|
|
418
|
-
} catch {
|
|
419
|
-
// silently fail — copy is a convenience, not critical
|
|
420
|
-
}
|
|
421
|
-
}, [token, buildInviteUrl]);
|
|
421
|
+
const handleCopy = useCallback(() => {
|
|
422
|
+
void copy(buildInviteUrl(token));
|
|
423
|
+
}, [copy, token, buildInviteUrl]);
|
|
422
424
|
|
|
423
425
|
if (isRevoking) {
|
|
424
426
|
return (
|
|
@@ -572,7 +574,7 @@ function RevokeConfirmation({
|
|
|
572
574
|
"stg:disabled:pointer-events-none stg:disabled:opacity-50",
|
|
573
575
|
)}
|
|
574
576
|
>
|
|
575
|
-
{isRevoking && <SpinnerIcon />}
|
|
577
|
+
{isRevoking && <SpinnerIcon size={12} />}
|
|
576
578
|
Revoke
|
|
577
579
|
</button>
|
|
578
580
|
<button
|
|
@@ -638,12 +640,14 @@ const STATE_BADGE_CONFIG: Record<InvitationState, { label: string; className: st
|
|
|
638
640
|
// ---------------------------------------------------------------------------
|
|
639
641
|
|
|
640
642
|
function ExpiryRadio({
|
|
643
|
+
name,
|
|
641
644
|
value,
|
|
642
645
|
label,
|
|
643
646
|
checked,
|
|
644
647
|
disabled,
|
|
645
648
|
onChange,
|
|
646
649
|
}: {
|
|
650
|
+
name: string;
|
|
647
651
|
value: ExpiryOption;
|
|
648
652
|
label: string;
|
|
649
653
|
checked: boolean;
|
|
@@ -662,7 +666,7 @@ function ExpiryRadio({
|
|
|
662
666
|
>
|
|
663
667
|
<input
|
|
664
668
|
type="radio"
|
|
665
|
-
name=
|
|
669
|
+
name={name}
|
|
666
670
|
value={value}
|
|
667
671
|
checked={checked}
|
|
668
672
|
disabled={disabled}
|
|
@@ -675,6 +679,7 @@ function ExpiryRadio({
|
|
|
675
679
|
}
|
|
676
680
|
|
|
677
681
|
function RedemptionRadio({
|
|
682
|
+
name,
|
|
678
683
|
value,
|
|
679
684
|
label,
|
|
680
685
|
description,
|
|
@@ -682,6 +687,7 @@ function RedemptionRadio({
|
|
|
682
687
|
disabled,
|
|
683
688
|
onChange,
|
|
684
689
|
}: {
|
|
690
|
+
name: string;
|
|
685
691
|
value: RedemptionMode;
|
|
686
692
|
label: string;
|
|
687
693
|
description: string;
|
|
@@ -701,7 +707,7 @@ function RedemptionRadio({
|
|
|
701
707
|
>
|
|
702
708
|
<input
|
|
703
709
|
type="radio"
|
|
704
|
-
name=
|
|
710
|
+
name={name}
|
|
705
711
|
value={value}
|
|
706
712
|
checked={checked}
|
|
707
713
|
disabled={disabled}
|
|
@@ -836,20 +842,3 @@ function RevokeIcon() {
|
|
|
836
842
|
);
|
|
837
843
|
}
|
|
838
844
|
|
|
839
|
-
function SpinnerIcon() {
|
|
840
|
-
return (
|
|
841
|
-
<svg
|
|
842
|
-
width="12"
|
|
843
|
-
height="12"
|
|
844
|
-
viewBox="0 0 16 16"
|
|
845
|
-
fill="none"
|
|
846
|
-
stroke="currentColor"
|
|
847
|
-
strokeWidth="2"
|
|
848
|
-
strokeLinecap="round"
|
|
849
|
-
className="stg:animate-spin"
|
|
850
|
-
aria-hidden="true"
|
|
851
|
-
>
|
|
852
|
-
<path d="M8 2a6 6 0 1 0 6 6" />
|
|
853
|
-
</svg>
|
|
854
|
-
);
|
|
855
|
-
}
|