@stigmer/react 0.4.8 → 0.5.1
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/action-menu/ActionMenu.d.ts +64 -0
- package/action-menu/ActionMenu.d.ts.map +1 -0
- package/action-menu/ActionMenu.js +78 -0
- package/action-menu/ActionMenu.js.map +1 -0
- package/action-menu/index.d.ts +3 -0
- package/action-menu/index.d.ts.map +1 -0
- package/action-menu/index.js +2 -0
- package/action-menu/index.js.map +1 -0
- package/action-menu/types.d.ts +65 -0
- package/action-menu/types.d.ts.map +1 -0
- package/action-menu/types.js +2 -0
- package/action-menu/types.js.map +1 -0
- package/agent/AgentCreationWizard.d.ts +55 -0
- package/agent/AgentCreationWizard.d.ts.map +1 -0
- package/agent/AgentCreationWizard.js +115 -0
- package/agent/AgentCreationWizard.js.map +1 -0
- package/agent/AgentDetailView.d.ts +77 -9
- package/agent/AgentDetailView.d.ts.map +1 -1
- package/agent/AgentDetailView.js +265 -87
- package/agent/AgentDetailView.js.map +1 -1
- package/agent/index.d.ts +8 -0
- package/agent/index.d.ts.map +1 -1
- package/agent/index.js +4 -0
- package/agent/index.js.map +1 -1
- package/agent/internal/agentToInput.d.ts +12 -0
- package/agent/internal/agentToInput.d.ts.map +1 -0
- package/agent/internal/agentToInput.js +72 -0
- package/agent/internal/agentToInput.js.map +1 -0
- package/agent/steps/CapabilitiesStep.d.ts +16 -0
- package/agent/steps/CapabilitiesStep.d.ts.map +1 -0
- package/agent/steps/CapabilitiesStep.js +80 -0
- package/agent/steps/CapabilitiesStep.js.map +1 -0
- package/agent/steps/IdentityStep.d.ts +18 -0
- package/agent/steps/IdentityStep.d.ts.map +1 -0
- package/agent/steps/IdentityStep.js +43 -0
- package/agent/steps/IdentityStep.js.map +1 -0
- package/agent/steps/ReviewStep.d.ts +23 -0
- package/agent/steps/ReviewStep.d.ts.map +1 -0
- package/agent/steps/ReviewStep.js +73 -0
- package/agent/steps/ReviewStep.js.map +1 -0
- package/agent/steps/types.d.ts +35 -0
- package/agent/steps/types.d.ts.map +1 -0
- package/agent/steps/types.js +16 -0
- package/agent/steps/types.js.map +1 -0
- package/agent/useCreateAgent.d.ts +45 -0
- package/agent/useCreateAgent.d.ts.map +1 -0
- package/agent/useCreateAgent.js +50 -0
- package/agent/useCreateAgent.js.map +1 -0
- package/agent/useUpdateAgent.d.ts +24 -0
- package/agent/useUpdateAgent.d.ts.map +1 -0
- package/agent/useUpdateAgent.js +35 -0
- package/agent/useUpdateAgent.js.map +1 -0
- package/composer/ContextChip.d.ts +7 -2
- package/composer/ContextChip.d.ts.map +1 -1
- package/composer/ContextChip.js +2 -1
- package/composer/ContextChip.js.map +1 -1
- package/composer/SessionComposer.d.ts +11 -0
- package/composer/SessionComposer.d.ts.map +1 -1
- package/composer/SessionComposer.js +33 -4
- package/composer/SessionComposer.js.map +1 -1
- package/dependency-graph/DependencyGraph.d.ts +37 -0
- package/dependency-graph/DependencyGraph.d.ts.map +1 -0
- package/dependency-graph/DependencyGraph.js +88 -0
- package/dependency-graph/DependencyGraph.js.map +1 -0
- package/dependency-graph/DependencyTreeNode.d.ts +23 -0
- package/dependency-graph/DependencyTreeNode.d.ts.map +1 -0
- package/dependency-graph/DependencyTreeNode.js +99 -0
- package/dependency-graph/DependencyTreeNode.js.map +1 -0
- package/dependency-graph/index.d.ts +4 -0
- package/dependency-graph/index.d.ts.map +1 -0
- package/dependency-graph/index.js +5 -0
- package/dependency-graph/index.js.map +1 -0
- package/dependency-graph/types.d.ts +130 -0
- package/dependency-graph/types.d.ts.map +1 -0
- package/dependency-graph/types.js +2 -0
- package/dependency-graph/types.js.map +1 -0
- package/dependency-graph/useDependencyGraph.d.ts +27 -0
- package/dependency-graph/useDependencyGraph.d.ts.map +1 -0
- package/dependency-graph/useDependencyGraph.js +129 -0
- package/dependency-graph/useDependencyGraph.js.map +1 -0
- package/empty-state/EmptyState.d.ts +29 -0
- package/empty-state/EmptyState.d.ts.map +1 -0
- package/empty-state/EmptyState.js +45 -0
- package/empty-state/EmptyState.js.map +1 -0
- package/empty-state/index.d.ts +4 -0
- package/empty-state/index.d.ts.map +1 -0
- package/empty-state/index.js +3 -0
- package/empty-state/index.js.map +1 -0
- package/empty-state/types.d.ts +73 -0
- package/empty-state/types.d.ts.map +1 -0
- package/empty-state/types.js +2 -0
- package/empty-state/types.js.map +1 -0
- package/empty-state/useEmptyState.d.ts +18 -0
- package/empty-state/useEmptyState.d.ts.map +1 -0
- package/empty-state/useEmptyState.js +72 -0
- package/empty-state/useEmptyState.js.map +1 -0
- package/environment/usePersonalEnvironment.d.ts.map +1 -1
- package/environment/usePersonalEnvironment.js +1 -0
- package/environment/usePersonalEnvironment.js.map +1 -1
- package/feedback/StigmerToaster.d.ts +18 -0
- package/feedback/StigmerToaster.d.ts.map +1 -0
- package/feedback/StigmerToaster.js +31 -0
- package/feedback/StigmerToaster.js.map +1 -0
- package/feedback/index.d.ts +4 -0
- package/feedback/index.d.ts.map +1 -0
- package/feedback/index.js +3 -0
- package/feedback/index.js.map +1 -0
- package/feedback/toast.d.ts +14 -0
- package/feedback/toast.d.ts.map +1 -0
- package/feedback/toast.js +14 -0
- package/feedback/toast.js.map +1 -0
- package/feedback/types.d.ts +4 -0
- package/feedback/types.d.ts.map +1 -0
- package/feedback/types.js +2 -0
- package/feedback/types.js.map +1 -0
- package/index.d.ts +32 -12
- package/index.d.ts.map +1 -1
- package/index.js +30 -10
- package/index.js.map +1 -1
- package/inline-edit/InlineEditImage.d.ts +20 -0
- package/inline-edit/InlineEditImage.d.ts.map +1 -0
- package/inline-edit/InlineEditImage.js +85 -0
- package/inline-edit/InlineEditImage.js.map +1 -0
- package/inline-edit/InlineEditKeyValue.d.ts +33 -0
- package/inline-edit/InlineEditKeyValue.d.ts.map +1 -0
- package/inline-edit/InlineEditKeyValue.js +67 -0
- package/inline-edit/InlineEditKeyValue.js.map +1 -0
- package/inline-edit/InlineEditResourceList.d.ts +34 -0
- package/inline-edit/InlineEditResourceList.d.ts.map +1 -0
- package/inline-edit/InlineEditResourceList.js +99 -0
- package/inline-edit/InlineEditResourceList.js.map +1 -0
- package/inline-edit/InlineEditSelect.d.ts +18 -0
- package/inline-edit/InlineEditSelect.d.ts.map +1 -0
- package/inline-edit/InlineEditSelect.js +54 -0
- package/inline-edit/InlineEditSelect.js.map +1 -0
- package/inline-edit/InlineEditText.d.ts +23 -0
- package/inline-edit/InlineEditText.d.ts.map +1 -0
- package/inline-edit/InlineEditText.js +79 -0
- package/inline-edit/InlineEditText.js.map +1 -0
- package/inline-edit/InlineEditTextarea.d.ts +22 -0
- package/inline-edit/InlineEditTextarea.d.ts.map +1 -0
- package/inline-edit/InlineEditTextarea.js +83 -0
- package/inline-edit/InlineEditTextarea.js.map +1 -0
- package/inline-edit/index.d.ts +16 -0
- package/inline-edit/index.d.ts.map +1 -0
- package/inline-edit/index.js +8 -0
- package/inline-edit/index.js.map +1 -0
- package/inline-edit/types.d.ts +42 -0
- package/inline-edit/types.d.ts.map +1 -0
- package/inline-edit/types.js +2 -0
- package/inline-edit/types.js.map +1 -0
- package/inline-edit/useInlineFieldSave.d.ts +23 -0
- package/inline-edit/useInlineFieldSave.d.ts.map +1 -0
- package/inline-edit/useInlineFieldSave.js +44 -0
- package/inline-edit/useInlineFieldSave.js.map +1 -0
- package/internal/Tabs.d.ts +4 -38
- package/internal/Tabs.d.ts.map +1 -1
- package/internal/Tabs.js +3 -62
- package/internal/Tabs.js.map +1 -1
- package/internal/useFetch.js +2 -2
- package/internal/useFetch.js.map +1 -1
- package/library/ImportResourceDialog.d.ts +43 -0
- package/library/ImportResourceDialog.d.ts.map +1 -0
- package/library/ImportResourceDialog.js +90 -0
- package/library/ImportResourceDialog.js.map +1 -0
- package/library/index.d.ts +7 -4
- package/library/index.d.ts.map +1 -1
- package/library/index.js +4 -2
- package/library/index.js.map +1 -1
- package/library/serialize-resource-yaml.d.ts +53 -0
- package/library/serialize-resource-yaml.d.ts.map +1 -1
- package/library/serialize-resource-yaml.js +275 -0
- package/library/serialize-resource-yaml.js.map +1 -1
- package/library/useExportResource.d.ts +56 -0
- package/library/useExportResource.d.ts.map +1 -0
- package/library/useExportResource.js +137 -0
- package/library/useExportResource.js.map +1 -0
- package/library/useImportResource.d.ts +84 -0
- package/library/useImportResource.d.ts.map +1 -0
- package/library/useImportResource.js +188 -0
- package/library/useImportResource.js.map +1 -0
- package/mcp-server/McpServerCreationWizard.d.ts +55 -0
- package/mcp-server/McpServerCreationWizard.d.ts.map +1 -0
- package/mcp-server/McpServerCreationWizard.js +121 -0
- package/mcp-server/McpServerCreationWizard.js.map +1 -0
- package/mcp-server/McpServerDetailView.d.ts +21 -1
- package/mcp-server/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +235 -43
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/index.d.ts +8 -0
- package/mcp-server/index.d.ts.map +1 -1
- package/mcp-server/index.js +4 -0
- package/mcp-server/index.js.map +1 -1
- package/mcp-server/internal/mcpServerToInput.d.ts +12 -0
- package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -0
- package/mcp-server/internal/mcpServerToInput.js +81 -0
- package/mcp-server/internal/mcpServerToInput.js.map +1 -0
- package/mcp-server/steps/EnvironmentAuthStep.d.ts +15 -0
- package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -0
- package/mcp-server/steps/EnvironmentAuthStep.js +55 -0
- package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -0
- package/mcp-server/steps/IdentityTransportStep.d.ts +19 -0
- package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -0
- package/mcp-server/steps/IdentityTransportStep.js +73 -0
- package/mcp-server/steps/IdentityTransportStep.js.map +1 -0
- package/mcp-server/steps/ReviewStep.d.ts +23 -0
- package/mcp-server/steps/ReviewStep.d.ts.map +1 -0
- package/mcp-server/steps/ReviewStep.js +137 -0
- package/mcp-server/steps/ReviewStep.js.map +1 -0
- package/mcp-server/steps/types.d.ts +56 -0
- package/mcp-server/steps/types.d.ts.map +1 -0
- package/mcp-server/steps/types.js +27 -0
- package/mcp-server/steps/types.js.map +1 -0
- package/mcp-server/useCreateMcpServer.d.ts +45 -0
- package/mcp-server/useCreateMcpServer.d.ts.map +1 -0
- package/mcp-server/useCreateMcpServer.js +50 -0
- package/mcp-server/useCreateMcpServer.js.map +1 -0
- package/mcp-server/useUpdateMcpServer.d.ts +24 -0
- package/mcp-server/useUpdateMcpServer.d.ts.map +1 -0
- package/mcp-server/useUpdateMcpServer.js +35 -0
- package/mcp-server/useUpdateMcpServer.js.map +1 -0
- package/models/ModelRegistryContext.d.ts +2 -0
- package/models/ModelRegistryContext.d.ts.map +1 -1
- package/models/ModelRegistryContext.js +1 -0
- package/models/ModelRegistryContext.js.map +1 -1
- package/models/ModelSelector.d.ts.map +1 -1
- package/models/ModelSelector.js +2 -2
- package/models/ModelSelector.js.map +1 -1
- package/models/__tests__/useModelRegistry.test.js +4 -3
- package/models/__tests__/useModelRegistry.test.js.map +1 -1
- package/models/useModelRegistry.d.ts +2 -0
- package/models/useModelRegistry.d.ts.map +1 -1
- package/models/useModelRegistry.js +3 -2
- package/models/useModelRegistry.js.map +1 -1
- package/package.json +8 -4
- package/provider.d.ts.map +1 -1
- package/provider.js +69 -22
- package/provider.js.map +1 -1
- package/resource-creation/CreationPicker.d.ts +60 -0
- package/resource-creation/CreationPicker.d.ts.map +1 -0
- package/resource-creation/CreationPicker.js +74 -0
- package/resource-creation/CreationPicker.js.map +1 -0
- package/resource-creation/StepIndicator.d.ts +28 -0
- package/resource-creation/StepIndicator.d.ts.map +1 -0
- package/resource-creation/StepIndicator.js +40 -0
- package/resource-creation/StepIndicator.js.map +1 -0
- package/resource-creation/TemplateCard.d.ts +24 -0
- package/resource-creation/TemplateCard.d.ts.map +1 -0
- package/resource-creation/TemplateCard.js +68 -0
- package/resource-creation/TemplateCard.js.map +1 -0
- package/resource-creation/TemplateGallery.d.ts +43 -0
- package/resource-creation/TemplateGallery.d.ts.map +1 -0
- package/resource-creation/TemplateGallery.js +78 -0
- package/resource-creation/TemplateGallery.js.map +1 -0
- package/resource-creation/WizardNav.d.ts +31 -0
- package/resource-creation/WizardNav.d.ts.map +1 -0
- package/resource-creation/WizardNav.js +29 -0
- package/resource-creation/WizardNav.js.map +1 -0
- package/resource-creation/WizardShell.d.ts +41 -0
- package/resource-creation/WizardShell.d.ts.map +1 -0
- package/resource-creation/WizardShell.js +55 -0
- package/resource-creation/WizardShell.js.map +1 -0
- package/resource-creation/index.d.ts +21 -0
- package/resource-creation/index.d.ts.map +1 -0
- package/resource-creation/index.js +14 -0
- package/resource-creation/index.js.map +1 -0
- package/resource-creation/templates/agent-templates.d.ts +15 -0
- package/resource-creation/templates/agent-templates.d.ts.map +1 -0
- package/resource-creation/templates/agent-templates.js +148 -0
- package/resource-creation/templates/agent-templates.js.map +1 -0
- package/resource-creation/templates/index.d.ts +5 -0
- package/resource-creation/templates/index.d.ts.map +1 -0
- package/resource-creation/templates/index.js +5 -0
- package/resource-creation/templates/index.js.map +1 -0
- package/resource-creation/templates/mcp-server-templates.d.ts +15 -0
- package/resource-creation/templates/mcp-server-templates.d.ts.map +1 -0
- package/resource-creation/templates/mcp-server-templates.js +92 -0
- package/resource-creation/templates/mcp-server-templates.js.map +1 -0
- package/resource-creation/templates/types.d.ts +48 -0
- package/resource-creation/templates/types.d.ts.map +1 -0
- package/resource-creation/templates/types.js +16 -0
- package/resource-creation/templates/types.js.map +1 -0
- package/resource-creation/types.d.ts +88 -0
- package/resource-creation/types.d.ts.map +1 -0
- package/resource-creation/types.js +2 -0
- package/resource-creation/types.js.map +1 -0
- package/resource-creation/useTemplateFilter.d.ts +43 -0
- package/resource-creation/useTemplateFilter.d.ts.map +1 -0
- package/resource-creation/useTemplateFilter.js +73 -0
- package/resource-creation/useTemplateFilter.js.map +1 -0
- package/resource-creation/useWizardState.d.ts +67 -0
- package/resource-creation/useWizardState.d.ts.map +1 -0
- package/resource-creation/useWizardState.js +143 -0
- package/resource-creation/useWizardState.js.map +1 -0
- package/resource-detail/ConfirmDialog.d.ts +44 -0
- package/resource-detail/ConfirmDialog.d.ts.map +1 -0
- package/resource-detail/ConfirmDialog.js +62 -0
- package/resource-detail/ConfirmDialog.js.map +1 -0
- package/resource-detail/ResourceActionBar.d.ts +42 -0
- package/resource-detail/ResourceActionBar.d.ts.map +1 -0
- package/resource-detail/ResourceActionBar.js +64 -0
- package/resource-detail/ResourceActionBar.js.map +1 -0
- package/resource-detail/ResourceDetailShell.d.ts +36 -0
- package/resource-detail/ResourceDetailShell.d.ts.map +1 -0
- package/resource-detail/ResourceDetailShell.js +65 -0
- package/resource-detail/ResourceDetailShell.js.map +1 -0
- package/resource-detail/Section.d.ts +18 -0
- package/resource-detail/Section.d.ts.map +1 -0
- package/resource-detail/Section.js +18 -0
- package/resource-detail/Section.js.map +1 -0
- package/resource-detail/index.d.ts +15 -0
- package/resource-detail/index.d.ts.map +1 -0
- package/resource-detail/index.js +10 -0
- package/resource-detail/index.js.map +1 -0
- package/resource-detail/types.d.ts +146 -0
- package/resource-detail/types.d.ts.map +1 -0
- package/resource-detail/types.js +2 -0
- package/resource-detail/types.js.map +1 -0
- package/resource-detail/useConfirmAction.d.ts +41 -0
- package/resource-detail/useConfirmAction.d.ts.map +1 -0
- package/resource-detail/useConfirmAction.js +30 -0
- package/resource-detail/useConfirmAction.js.map +1 -0
- package/resource-detail/useCopyResource.d.ts +28 -0
- package/resource-detail/useCopyResource.d.ts.map +1 -0
- package/resource-detail/useCopyResource.js +46 -0
- package/resource-detail/useCopyResource.js.map +1 -0
- package/resource-detail/useDeleteResource.d.ts +40 -0
- package/resource-detail/useDeleteResource.d.ts.map +1 -0
- package/resource-detail/useDeleteResource.js +83 -0
- package/resource-detail/useDeleteResource.js.map +1 -0
- package/resource-detail/useDetailTabs.d.ts +46 -0
- package/resource-detail/useDetailTabs.d.ts.map +1 -0
- package/resource-detail/useDetailTabs.js +47 -0
- package/resource-detail/useDetailTabs.js.map +1 -0
- package/resource-workbench/components/BulkActionBar.d.ts +36 -0
- package/resource-workbench/components/BulkActionBar.d.ts.map +1 -0
- package/resource-workbench/components/BulkActionBar.js +35 -0
- package/resource-workbench/components/BulkActionBar.js.map +1 -0
- package/resource-workbench/components/ColumnHeader.d.ts +23 -0
- package/resource-workbench/components/ColumnHeader.d.ts.map +1 -0
- package/resource-workbench/components/ColumnHeader.js +25 -0
- package/resource-workbench/components/ColumnHeader.js.map +1 -0
- package/resource-workbench/components/FilterBar.d.ts +33 -0
- package/resource-workbench/components/FilterBar.d.ts.map +1 -0
- package/resource-workbench/components/FilterBar.js +72 -0
- package/resource-workbench/components/FilterBar.js.map +1 -0
- package/resource-workbench/components/ResourceAvatar.d.ts +29 -0
- package/resource-workbench/components/ResourceAvatar.d.ts.map +1 -0
- package/resource-workbench/components/ResourceAvatar.js +51 -0
- package/resource-workbench/components/ResourceAvatar.js.map +1 -0
- package/resource-workbench/components/ResourceCards.d.ts +39 -0
- package/resource-workbench/components/ResourceCards.d.ts.map +1 -0
- package/resource-workbench/components/ResourceCards.js +41 -0
- package/resource-workbench/components/ResourceCards.js.map +1 -0
- package/resource-workbench/components/ResourceInspector.d.ts +26 -0
- package/resource-workbench/components/ResourceInspector.d.ts.map +1 -0
- package/resource-workbench/components/ResourceInspector.js +22 -0
- package/resource-workbench/components/ResourceInspector.js.map +1 -0
- package/resource-workbench/components/ResourceList.d.ts +39 -0
- package/resource-workbench/components/ResourceList.d.ts.map +1 -0
- package/resource-workbench/components/ResourceList.js +41 -0
- package/resource-workbench/components/ResourceList.js.map +1 -0
- package/resource-workbench/components/ResourceTable.d.ts +47 -0
- package/resource-workbench/components/ResourceTable.d.ts.map +1 -0
- package/resource-workbench/components/ResourceTable.js +78 -0
- package/resource-workbench/components/ResourceTable.js.map +1 -0
- package/resource-workbench/components/ResourceWorkbench.d.ts +131 -0
- package/resource-workbench/components/ResourceWorkbench.d.ts.map +1 -0
- package/resource-workbench/components/ResourceWorkbench.js +170 -0
- package/resource-workbench/components/ResourceWorkbench.js.map +1 -0
- package/resource-workbench/components/SelectionCheckbox.d.ts +24 -0
- package/resource-workbench/components/SelectionCheckbox.d.ts.map +1 -0
- package/resource-workbench/components/SelectionCheckbox.js +16 -0
- package/resource-workbench/components/SelectionCheckbox.js.map +1 -0
- package/resource-workbench/components/StatusBadge.d.ts +31 -0
- package/resource-workbench/components/StatusBadge.d.ts.map +1 -0
- package/resource-workbench/components/StatusBadge.js +75 -0
- package/resource-workbench/components/StatusBadge.js.map +1 -0
- package/resource-workbench/components/ViewSwitcher.d.ts +21 -0
- package/resource-workbench/components/ViewSwitcher.d.ts.map +1 -0
- package/resource-workbench/components/ViewSwitcher.js +37 -0
- package/resource-workbench/components/ViewSwitcher.js.map +1 -0
- package/resource-workbench/hooks/useResourceCollection.d.ts +93 -0
- package/resource-workbench/hooks/useResourceCollection.d.ts.map +1 -0
- package/resource-workbench/hooks/useResourceCollection.js +133 -0
- package/resource-workbench/hooks/useResourceCollection.js.map +1 -0
- package/resource-workbench/hooks/useResourceFilters.d.ts +73 -0
- package/resource-workbench/hooks/useResourceFilters.d.ts.map +1 -0
- package/resource-workbench/hooks/useResourceFilters.js +105 -0
- package/resource-workbench/hooks/useResourceFilters.js.map +1 -0
- package/resource-workbench/hooks/useResourceSelection.d.ts +44 -0
- package/resource-workbench/hooks/useResourceSelection.d.ts.map +1 -0
- package/resource-workbench/hooks/useResourceSelection.js +123 -0
- package/resource-workbench/hooks/useResourceSelection.js.map +1 -0
- package/resource-workbench/hooks/useViewPreference.d.ts +32 -0
- package/resource-workbench/hooks/useViewPreference.d.ts.map +1 -0
- package/resource-workbench/hooks/useViewPreference.js +60 -0
- package/resource-workbench/hooks/useViewPreference.js.map +1 -0
- package/resource-workbench/index.d.ts +34 -0
- package/resource-workbench/index.d.ts.map +1 -0
- package/resource-workbench/index.js +19 -0
- package/resource-workbench/index.js.map +1 -0
- package/resource-workbench/types.d.ts +165 -0
- package/resource-workbench/types.d.ts.map +1 -0
- package/resource-workbench/types.js +2 -0
- package/resource-workbench/types.js.map +1 -0
- package/runner/RunnerDetailView.d.ts +44 -0
- package/runner/RunnerDetailView.d.ts.map +1 -0
- package/runner/RunnerDetailView.js +154 -0
- package/runner/RunnerDetailView.js.map +1 -0
- package/runner/RunnerListPanel.d.ts +26 -1
- package/runner/RunnerListPanel.d.ts.map +1 -1
- package/runner/RunnerListPanel.js +68 -46
- package/runner/RunnerListPanel.js.map +1 -1
- package/runner/index.d.ts +7 -1
- package/runner/index.d.ts.map +1 -1
- package/runner/index.js +3 -0
- package/runner/index.js.map +1 -1
- package/runner/shared.d.ts +31 -0
- package/runner/shared.d.ts.map +1 -0
- package/runner/shared.js +55 -0
- package/runner/shared.js.map +1 -0
- package/runner/useRunner.d.ts +37 -0
- package/runner/useRunner.d.ts.map +1 -0
- package/runner/useRunner.js +24 -0
- package/runner/useRunner.js.map +1 -0
- package/session/__tests__/group-sessions.test.js +3 -3
- package/session/__tests__/group-sessions.test.js.map +1 -1
- package/session/__tests__/session-spec-converters.test.d.ts +2 -0
- package/session/__tests__/session-spec-converters.test.d.ts.map +1 -0
- package/session/__tests__/session-spec-converters.test.js +162 -0
- package/session/__tests__/session-spec-converters.test.js.map +1 -0
- package/session/__tests__/useNewSessionFlow.test.js +2 -2
- package/session/__tests__/useNewSessionFlow.test.js.map +1 -1
- package/session/__tests__/usePersistedModel.test.js +1 -1
- package/session/__tests__/usePersistedModel.test.js.map +1 -1
- package/session/group-sessions.d.ts +17 -0
- package/session/group-sessions.d.ts.map +1 -1
- package/session/group-sessions.js +46 -0
- package/session/group-sessions.js.map +1 -1
- package/session/index.d.ts +4 -2
- package/session/index.d.ts.map +1 -1
- package/session/index.js +2 -1
- package/session/index.js.map +1 -1
- package/session/session-spec-converters.d.ts +24 -0
- package/session/session-spec-converters.d.ts.map +1 -0
- package/session/session-spec-converters.js +72 -0
- package/session/session-spec-converters.js.map +1 -0
- package/session/useSessionConversation.d.ts.map +1 -1
- package/session/useSessionConversation.js +1 -56
- package/session/useSessionConversation.js.map +1 -1
- package/session/useSessionPageFlow.d.ts +5 -0
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +20 -6
- package/session/useSessionPageFlow.js.map +1 -1
- package/session/useSessionSearch.d.ts +57 -0
- package/session/useSessionSearch.d.ts.map +1 -0
- package/session/useSessionSearch.js +94 -0
- package/session/useSessionSearch.js.map +1 -0
- package/skill/SkillDetailView.d.ts +70 -7
- package/skill/SkillDetailView.d.ts.map +1 -1
- package/skill/SkillDetailView.js +107 -39
- package/skill/SkillDetailView.js.map +1 -1
- package/skill/SkillDiffDialog.d.ts +42 -0
- package/skill/SkillDiffDialog.d.ts.map +1 -0
- package/skill/SkillDiffDialog.js +72 -0
- package/skill/SkillDiffDialog.js.map +1 -0
- package/skill/SkillFileBrowser.d.ts +31 -0
- package/skill/SkillFileBrowser.d.ts.map +1 -0
- package/skill/SkillFileBrowser.js +105 -0
- package/skill/SkillFileBrowser.js.map +1 -0
- package/skill/SkillUploader.d.ts +39 -0
- package/skill/SkillUploader.d.ts.map +1 -0
- package/skill/SkillUploader.js +141 -0
- package/skill/SkillUploader.js.map +1 -0
- package/skill/index.d.ts +18 -0
- package/skill/index.d.ts.map +1 -1
- package/skill/index.js +9 -0
- package/skill/index.js.map +1 -1
- package/skill/internal/computeArtifactHash.d.ts +9 -0
- package/skill/internal/computeArtifactHash.d.ts.map +1 -0
- package/skill/internal/computeArtifactHash.js +14 -0
- package/skill/internal/computeArtifactHash.js.map +1 -0
- package/skill/internal/fetchAndUnpackArtifact.d.ts +16 -0
- package/skill/internal/fetchAndUnpackArtifact.d.ts.map +1 -0
- package/skill/internal/fetchAndUnpackArtifact.js +34 -0
- package/skill/internal/fetchAndUnpackArtifact.js.map +1 -0
- package/skill/usePushSkill.d.ts +53 -0
- package/skill/usePushSkill.d.ts.map +1 -0
- package/skill/usePushSkill.js +57 -0
- package/skill/usePushSkill.js.map +1 -0
- package/skill/useSkillArtifact.d.ts +37 -0
- package/skill/useSkillArtifact.d.ts.map +1 -0
- package/skill/useSkillArtifact.js +76 -0
- package/skill/useSkillArtifact.js.map +1 -0
- package/skill/useSkillDiff.d.ts +31 -0
- package/skill/useSkillDiff.d.ts.map +1 -0
- package/skill/useSkillDiff.js +97 -0
- package/skill/useSkillDiff.js.map +1 -0
- package/skill/useSkillDuplicateCheck.d.ts +34 -0
- package/skill/useSkillDuplicateCheck.d.ts.map +1 -0
- package/skill/useSkillDuplicateCheck.js +58 -0
- package/skill/useSkillDuplicateCheck.js.map +1 -0
- package/skill/useSkillUpload.d.ts +69 -0
- package/skill/useSkillUpload.d.ts.map +1 -0
- package/skill/useSkillUpload.js +157 -0
- package/skill/useSkillUpload.js.map +1 -0
- package/skill/useSkillVersions.d.ts +46 -0
- package/skill/useSkillVersions.d.ts.map +1 -0
- package/skill/useSkillVersions.js +104 -0
- package/skill/useSkillVersions.js.map +1 -0
- package/src/action-menu/ActionMenu.tsx +151 -0
- package/src/action-menu/index.ts +9 -0
- package/src/action-menu/types.ts +70 -0
- package/src/agent/AgentCreationWizard.tsx +201 -0
- package/src/agent/AgentDetailView.tsx +817 -321
- package/src/agent/index.ts +16 -0
- package/src/agent/internal/agentToInput.ts +95 -0
- package/src/agent/steps/CapabilitiesStep.tsx +363 -0
- package/src/agent/steps/IdentityStep.tsx +259 -0
- package/src/agent/steps/ReviewStep.tsx +211 -0
- package/src/agent/steps/types.ts +53 -0
- package/src/agent/useCreateAgent.ts +76 -0
- package/src/agent/useUpdateAgent.ts +55 -0
- package/src/composer/ContextChip.tsx +20 -11
- package/src/composer/SessionComposer.tsx +52 -3
- package/src/dependency-graph/DependencyGraph.tsx +153 -0
- package/src/dependency-graph/DependencyTreeNode.tsx +282 -0
- package/src/dependency-graph/index.ts +15 -0
- package/src/dependency-graph/types.ts +131 -0
- package/src/dependency-graph/useDependencyGraph.ts +158 -0
- package/src/empty-state/EmptyState.tsx +90 -0
- package/src/empty-state/index.ts +9 -0
- package/src/empty-state/types.ts +81 -0
- package/src/empty-state/useEmptyState.ts +85 -0
- package/src/environment/usePersonalEnvironment.ts +1 -0
- package/src/feedback/StigmerToaster.tsx +45 -0
- package/src/feedback/index.ts +3 -0
- package/src/feedback/toast.ts +13 -0
- package/src/feedback/types.ts +7 -0
- package/src/index.ts +275 -8
- package/src/inline-edit/InlineEditImage.tsx +208 -0
- package/src/inline-edit/InlineEditKeyValue.tsx +301 -0
- package/src/inline-edit/InlineEditResourceList.tsx +325 -0
- package/src/inline-edit/InlineEditSelect.tsx +150 -0
- package/src/inline-edit/InlineEditText.tsx +211 -0
- package/src/inline-edit/InlineEditTextarea.tsx +209 -0
- package/src/inline-edit/index.ts +28 -0
- package/src/inline-edit/types.ts +47 -0
- package/src/inline-edit/useInlineFieldSave.ts +62 -0
- package/src/internal/Tabs.tsx +4 -164
- package/src/internal/useFetch.ts +2 -2
- package/src/library/ImportResourceDialog.tsx +227 -0
- package/src/library/index.ts +18 -8
- package/src/library/serialize-resource-yaml.ts +356 -0
- package/src/library/useExportResource.ts +183 -0
- package/src/library/useImportResource.ts +253 -0
- package/src/mcp-server/McpServerCreationWizard.tsx +206 -0
- package/src/mcp-server/McpServerDetailView.tsx +816 -155
- package/src/mcp-server/index.ts +16 -0
- package/src/mcp-server/internal/mcpServerToInput.ts +95 -0
- package/src/mcp-server/steps/EnvironmentAuthStep.tsx +462 -0
- package/src/mcp-server/steps/IdentityTransportStep.tsx +531 -0
- package/src/mcp-server/steps/ReviewStep.tsx +297 -0
- package/src/mcp-server/steps/types.ts +85 -0
- package/src/mcp-server/useCreateMcpServer.ts +76 -0
- package/src/mcp-server/useUpdateMcpServer.ts +55 -0
- package/src/models/ModelRegistryContext.ts +3 -0
- package/src/models/ModelSelector.tsx +25 -2
- package/src/models/__tests__/useModelRegistry.test.tsx +5 -3
- package/src/models/useModelRegistry.ts +5 -2
- package/src/provider.tsx +69 -18
- package/src/resource-creation/CreationPicker.tsx +292 -0
- package/src/resource-creation/StepIndicator.tsx +156 -0
- package/src/resource-creation/TemplateCard.tsx +143 -0
- package/src/resource-creation/TemplateGallery.tsx +222 -0
- package/src/resource-creation/WizardNav.tsx +163 -0
- package/src/resource-creation/WizardShell.tsx +124 -0
- package/src/resource-creation/index.ts +45 -0
- package/src/resource-creation/templates/agent-templates.ts +160 -0
- package/src/resource-creation/templates/index.ts +7 -0
- package/src/resource-creation/templates/mcp-server-templates.ts +106 -0
- package/src/resource-creation/templates/types.ts +64 -0
- package/src/resource-creation/types.ts +105 -0
- package/src/resource-creation/useTemplateFilter.ts +117 -0
- package/src/resource-creation/useWizardState.ts +223 -0
- package/src/resource-detail/ConfirmDialog.tsx +127 -0
- package/src/resource-detail/ResourceActionBar.tsx +157 -0
- package/src/resource-detail/ResourceDetailShell.tsx +184 -0
- package/src/resource-detail/Section.tsx +78 -0
- package/src/resource-detail/index.ts +34 -0
- package/src/resource-detail/types.ts +177 -0
- package/src/resource-detail/useConfirmAction.ts +70 -0
- package/src/resource-detail/useCopyResource.ts +74 -0
- package/src/resource-detail/useDeleteResource.ts +110 -0
- package/src/resource-detail/useDetailTabs.ts +93 -0
- package/src/resource-workbench/components/BulkActionBar.tsx +122 -0
- package/src/resource-workbench/components/ColumnHeader.tsx +105 -0
- package/src/resource-workbench/components/FilterBar.tsx +173 -0
- package/src/resource-workbench/components/ResourceAvatar.tsx +109 -0
- package/src/resource-workbench/components/ResourceCards.tsx +126 -0
- package/src/resource-workbench/components/ResourceInspector.tsx +88 -0
- package/src/resource-workbench/components/ResourceList.tsx +121 -0
- package/src/resource-workbench/components/ResourceTable.tsx +222 -0
- package/src/resource-workbench/components/ResourceWorkbench.tsx +695 -0
- package/src/resource-workbench/components/SelectionCheckbox.tsx +52 -0
- package/src/resource-workbench/components/StatusBadge.tsx +119 -0
- package/src/resource-workbench/components/ViewSwitcher.tsx +135 -0
- package/src/resource-workbench/hooks/useResourceCollection.ts +261 -0
- package/src/resource-workbench/hooks/useResourceFilters.ts +216 -0
- package/src/resource-workbench/hooks/useResourceSelection.ts +178 -0
- package/src/resource-workbench/hooks/useViewPreference.ts +75 -0
- package/src/resource-workbench/index.ts +73 -0
- package/src/resource-workbench/types.ts +220 -0
- package/src/runner/RunnerDetailView.tsx +410 -0
- package/src/runner/RunnerListPanel.tsx +126 -111
- package/src/runner/index.ts +13 -1
- package/src/runner/shared.tsx +124 -0
- package/src/runner/useRunner.ts +59 -0
- package/src/session/__tests__/group-sessions.test.ts +5 -3
- package/src/session/__tests__/session-spec-converters.test.ts +185 -0
- package/src/session/__tests__/useNewSessionFlow.test.tsx +2 -2
- package/src/session/__tests__/usePersistedModel.test.tsx +1 -1
- package/src/session/group-sessions.ts +65 -0
- package/src/session/index.ts +8 -2
- package/src/session/session-spec-converters.ts +86 -0
- package/src/session/useSessionConversation.ts +5 -64
- package/src/session/useSessionPageFlow.ts +28 -7
- package/src/session/useSessionSearch.ts +149 -0
- package/src/skill/SkillDetailView.tsx +371 -165
- package/src/skill/SkillDiffDialog.tsx +213 -0
- package/src/skill/SkillFileBrowser.tsx +289 -0
- package/src/skill/SkillUploader.tsx +481 -0
- package/src/skill/index.ts +34 -0
- package/src/skill/internal/computeArtifactHash.ts +13 -0
- package/src/skill/internal/fetchAndUnpackArtifact.ts +48 -0
- package/src/skill/usePushSkill.ts +101 -0
- package/src/skill/useSkillArtifact.ts +107 -0
- package/src/skill/useSkillDiff.ts +128 -0
- package/src/skill/useSkillDuplicateCheck.ts +92 -0
- package/src/skill/useSkillUpload.ts +231 -0
- package/src/skill/useSkillVersions.ts +165 -0
- package/src/styles.css +28 -0
- package/src/tabs/Tabs.tsx +184 -0
- package/src/tabs/index.ts +2 -0
- package/src/version-history/DiffFileList.tsx +111 -0
- package/src/version-history/DiffSummary.tsx +61 -0
- package/src/version-history/DiffViewer.tsx +163 -0
- package/src/version-history/MultiFileDiffView.tsx +114 -0
- package/src/version-history/VersionTimeline.tsx +232 -0
- package/src/version-history/VersionTimelineEntry.tsx +254 -0
- package/src/version-history/computeDiff.ts +61 -0
- package/src/version-history/computeMultiFileDiff.ts +97 -0
- package/src/version-history/index.ts +22 -0
- package/src/version-history/types.ts +129 -0
- package/styles.css +1 -1
- package/tabs/Tabs.d.ts +58 -0
- package/tabs/Tabs.d.ts.map +1 -0
- package/tabs/Tabs.js +80 -0
- package/tabs/Tabs.js.map +1 -0
- package/tabs/index.d.ts +3 -0
- package/tabs/index.d.ts.map +1 -0
- package/tabs/index.js +2 -0
- package/tabs/index.js.map +1 -0
- package/version-history/DiffFileList.d.ts +22 -0
- package/version-history/DiffFileList.d.ts.map +1 -0
- package/version-history/DiffFileList.js +37 -0
- package/version-history/DiffFileList.js.map +1 -0
- package/version-history/DiffSummary.d.ts +21 -0
- package/version-history/DiffSummary.d.ts.map +1 -0
- package/version-history/DiffSummary.js +16 -0
- package/version-history/DiffSummary.js.map +1 -0
- package/version-history/DiffViewer.d.ts +31 -0
- package/version-history/DiffViewer.d.ts.map +1 -0
- package/version-history/DiffViewer.js +60 -0
- package/version-history/DiffViewer.js.map +1 -0
- package/version-history/MultiFileDiffView.d.ts +30 -0
- package/version-history/MultiFileDiffView.d.ts.map +1 -0
- package/version-history/MultiFileDiffView.js +40 -0
- package/version-history/MultiFileDiffView.js.map +1 -0
- package/version-history/VersionTimeline.d.ts +29 -0
- package/version-history/VersionTimeline.d.ts.map +1 -0
- package/version-history/VersionTimeline.js +87 -0
- package/version-history/VersionTimeline.js.map +1 -0
- package/version-history/VersionTimelineEntry.d.ts +22 -0
- package/version-history/VersionTimelineEntry.d.ts.map +1 -0
- package/version-history/VersionTimelineEntry.js +98 -0
- package/version-history/VersionTimelineEntry.js.map +1 -0
- package/version-history/computeDiff.d.ts +16 -0
- package/version-history/computeDiff.d.ts.map +1 -0
- package/version-history/computeDiff.js +54 -0
- package/version-history/computeDiff.js.map +1 -0
- package/version-history/computeMultiFileDiff.d.ts +15 -0
- package/version-history/computeMultiFileDiff.d.ts.map +1 -0
- package/version-history/computeMultiFileDiff.js +83 -0
- package/version-history/computeMultiFileDiff.js.map +1 -0
- package/version-history/index.d.ts +14 -0
- package/version-history/index.d.ts.map +1 -0
- package/version-history/index.js +9 -0
- package/version-history/index.js.map +1 -0
- package/version-history/types.d.ts +106 -0
- package/version-history/types.d.ts.map +1 -0
- package/version-history/types.js +2 -0
- package/version-history/types.js.map +1 -0
- package/library/ResourceListView.d.ts +0 -174
- package/library/ResourceListView.d.ts.map +0 -1
- package/library/ResourceListView.js +0 -318
- package/library/ResourceListView.js.map +0 -1
- package/src/library/ResourceListView.tsx +0 -956
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
/**
|
|
6
|
+
* Click-to-edit image URL field, displayed as an avatar.
|
|
7
|
+
*
|
|
8
|
+
* Shows the current image (or fallback icon). On click, reveals
|
|
9
|
+
* an input for entering a new image URL with confirm/cancel.
|
|
10
|
+
*/
|
|
11
|
+
export function InlineEditImage({ value, onSave, fallback, size = "md", disabled, isSaving, error, className, }) {
|
|
12
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
13
|
+
const [draft, setDraft] = useState(value);
|
|
14
|
+
const [localError, setLocalError] = useState(null);
|
|
15
|
+
const inputRef = useRef(null);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (isEditing) {
|
|
18
|
+
setDraft(value);
|
|
19
|
+
setLocalError(null);
|
|
20
|
+
requestAnimationFrame(() => inputRef.current?.focus());
|
|
21
|
+
}
|
|
22
|
+
}, [isEditing, value]);
|
|
23
|
+
const handleConfirm = useCallback(async () => {
|
|
24
|
+
const trimmed = draft.trim();
|
|
25
|
+
if (trimmed === value) {
|
|
26
|
+
setIsEditing(false);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (trimmed && !isValidUrl(trimmed)) {
|
|
30
|
+
setLocalError("Enter a valid URL");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const ok = await onSave(trimmed);
|
|
34
|
+
if (ok)
|
|
35
|
+
setIsEditing(false);
|
|
36
|
+
}, [draft, value, onSave]);
|
|
37
|
+
const handleCancel = useCallback(() => {
|
|
38
|
+
setIsEditing(false);
|
|
39
|
+
setDraft(value);
|
|
40
|
+
setLocalError(null);
|
|
41
|
+
}, [value]);
|
|
42
|
+
const handleKeyDown = useCallback((e) => {
|
|
43
|
+
if (e.key === "Enter") {
|
|
44
|
+
e.preventDefault();
|
|
45
|
+
handleConfirm();
|
|
46
|
+
}
|
|
47
|
+
else if (e.key === "Escape")
|
|
48
|
+
handleCancel();
|
|
49
|
+
}, [handleConfirm, handleCancel]);
|
|
50
|
+
const sizeClasses = size === "sm" ? "size-6" : "size-8";
|
|
51
|
+
const displayError = localError || error;
|
|
52
|
+
if (disabled || !isEditing) {
|
|
53
|
+
return (_jsx("div", { className: cn("group/inline-edit inline-flex", className), children: _jsxs("button", { type: "button", onClick: () => { if (!disabled)
|
|
54
|
+
setIsEditing(true); }, disabled: disabled, className: cn("relative rounded-md p-0.5 transition-colors", !disabled && "hover:bg-accent-hover cursor-pointer", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), "aria-label": "Change icon", children: [value ? (_jsx("img", { src: value, alt: "", className: cn(sizeClasses, "shrink-0 rounded object-cover") })) : (fallback ?? _jsx(ImagePlaceholder, { className: cn(sizeClasses, "text-muted-foreground") })), !disabled && (_jsx("span", { className: "absolute -bottom-0.5 -right-0.5 flex size-4 items-center justify-center rounded-full bg-muted text-muted-foreground opacity-0 transition-opacity group-hover/inline-edit:opacity-100", children: _jsx(PencilIcon, { className: "size-2.5" }) }))] }) }));
|
|
55
|
+
}
|
|
56
|
+
return (_jsxs("div", { className: cn("flex flex-col gap-1", className), children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("input", { ref: inputRef, type: "url", value: draft, onChange: (e) => { setDraft(e.target.value); setLocalError(null); }, onKeyDown: handleKeyDown, disabled: isSaving, placeholder: "https://example.com/icon.png", className: cn("flex-1 rounded-md border border-border bg-input-bg px-2 py-1 text-sm text-foreground", "focus:outline-none focus:ring-2 focus:ring-ring", "disabled:opacity-50", displayError && "border-destructive") }), _jsx("button", { type: "button", onClick: handleConfirm, disabled: isSaving, "aria-label": "Save", className: cn("inline-flex size-7 items-center justify-center rounded-md", "bg-primary text-primary-foreground hover:bg-primary-hover disabled:opacity-50", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: isSaving ? _jsx(Spinner, {}) : _jsx(CheckIcon, { className: "size-3.5" }) }), _jsx("button", { type: "button", onClick: handleCancel, disabled: isSaving, "aria-label": "Cancel", className: cn("inline-flex size-7 items-center justify-center rounded-md", "border border-border bg-background text-foreground hover:bg-accent disabled:opacity-50", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: _jsx(XIcon, { className: "size-3.5" }) }), draft && (_jsx("button", { type: "button", onClick: () => setDraft(""), disabled: isSaving, "aria-label": "Clear", className: "text-xs text-muted-foreground underline decoration-muted-foreground/40 underline-offset-2 hover:text-foreground", children: "Clear" }))] }), displayError && (_jsx("p", { className: "px-1 text-xs text-destructive", role: "alert", children: displayError }))] }));
|
|
57
|
+
}
|
|
58
|
+
function isValidUrl(s) {
|
|
59
|
+
try {
|
|
60
|
+
new URL(s);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Icons
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
function PencilIcon({ className }) {
|
|
71
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M11.5 1.5a2.121 2.121 0 0 1 3 3L5 14l-4 1 1-4Z" }) }));
|
|
72
|
+
}
|
|
73
|
+
function CheckIcon({ className }) {
|
|
74
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "m3 8.5 3.5 3.5 6.5-8" }) }));
|
|
75
|
+
}
|
|
76
|
+
function XIcon({ className }) {
|
|
77
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "m4 4 8 8M12 4l-8 8" }) }));
|
|
78
|
+
}
|
|
79
|
+
function ImagePlaceholder({ className }) {
|
|
80
|
+
return (_jsxs("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("rect", { x: "2", y: "2", width: "12", height: "12", rx: "1.5" }), _jsx("circle", { cx: "5.5", cy: "5.5", r: "1" }), _jsx("path", { d: "m14 10.5-3-3L4 14" })] }));
|
|
81
|
+
}
|
|
82
|
+
function Spinner() {
|
|
83
|
+
return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=InlineEditImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineEditImage.js","sourceRoot":"","sources":["../../src/inline-edit/InlineEditImage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { InlineEditBaseProps, KeyValueRow } from "./types";
|
|
2
|
+
/** Props for {@link InlineEditKeyValue}. */
|
|
3
|
+
export interface InlineEditKeyValueProps extends InlineEditBaseProps {
|
|
4
|
+
/** Current key-value entries. */
|
|
5
|
+
readonly value: readonly KeyValueRow[];
|
|
6
|
+
/** Called with the updated rows when a change is confirmed. */
|
|
7
|
+
readonly onSave: (rows: KeyValueRow[]) => Promise<boolean>;
|
|
8
|
+
/** Label for the "key" column. @default "Key" */
|
|
9
|
+
readonly keyLabel?: string;
|
|
10
|
+
/** Show the value alongside the key in read mode and provide a value input in edit mode. @default false */
|
|
11
|
+
readonly showValue?: boolean;
|
|
12
|
+
/** Label for the "value" column (only relevant when showValue is true). @default "Value" */
|
|
13
|
+
readonly valueLabel?: string;
|
|
14
|
+
/** Show the "secret" toggle per row. @default false */
|
|
15
|
+
readonly showSecretToggle?: boolean;
|
|
16
|
+
/** Show the "optional" toggle per row. @default false */
|
|
17
|
+
readonly showOptionalToggle?: boolean;
|
|
18
|
+
/** Show the description field per row. @default false */
|
|
19
|
+
readonly showDescription?: boolean;
|
|
20
|
+
/** Controlled editing state. */
|
|
21
|
+
readonly editing?: boolean;
|
|
22
|
+
/** Called when editing state changes (controlled mode). */
|
|
23
|
+
readonly onEditingChange?: (editing: boolean) => void;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Inline editor for key-value pair lists (env vars, tags, etc.).
|
|
27
|
+
*
|
|
28
|
+
* Read mode shows a compact table. Edit mode adds/removes/edits
|
|
29
|
+
* rows with per-row confirmation. The full updated list is saved
|
|
30
|
+
* when the user clicks "Save changes".
|
|
31
|
+
*/
|
|
32
|
+
export declare function InlineEditKeyValue({ value, onSave, keyLabel, showValue, valueLabel, showSecretToggle, showOptionalToggle, showDescription, editing: controlledEditing, onEditingChange, disabled, isSaving, error, className, }: InlineEditKeyValueProps): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=InlineEditKeyValue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineEditKeyValue.d.ts","sourceRoot":"","sources":["../../src/inline-edit/InlineEditKeyValue.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhE,4CAA4C;AAC5C,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,2GAA2G;IAC3G,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,4FAA4F;IAC5F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,uDAAuD;IACvD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,yDAAyD;IACzD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,yDAAyD;IACzD,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,gCAAgC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACvD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,MAAM,EACN,QAAgB,EAChB,SAAiB,EACjB,UAAoB,EACpB,gBAAwB,EACxB,kBAA0B,EAC1B,eAAuB,EACvB,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,GACV,EAAE,uBAAuB,2CAoNzB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
/**
|
|
6
|
+
* Inline editor for key-value pair lists (env vars, tags, etc.).
|
|
7
|
+
*
|
|
8
|
+
* Read mode shows a compact table. Edit mode adds/removes/edits
|
|
9
|
+
* rows with per-row confirmation. The full updated list is saved
|
|
10
|
+
* when the user clicks "Save changes".
|
|
11
|
+
*/
|
|
12
|
+
export function InlineEditKeyValue({ value, onSave, keyLabel = "Key", showValue = false, valueLabel = "Value", showSecretToggle = false, showOptionalToggle = false, showDescription = false, editing: controlledEditing, onEditingChange, disabled, isSaving, error, className, }) {
|
|
13
|
+
const [internalEditing, setInternalEditing] = useState(false);
|
|
14
|
+
const isEditing = controlledEditing ?? internalEditing;
|
|
15
|
+
const setIsEditing = useCallback((v) => {
|
|
16
|
+
setInternalEditing(v);
|
|
17
|
+
onEditingChange?.(v);
|
|
18
|
+
}, [onEditingChange]);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (controlledEditing !== undefined)
|
|
21
|
+
setInternalEditing(controlledEditing);
|
|
22
|
+
}, [controlledEditing]);
|
|
23
|
+
const [draft, setDraft] = useState([...value]);
|
|
24
|
+
const handleEdit = useCallback(() => {
|
|
25
|
+
setDraft([...value]);
|
|
26
|
+
setIsEditing(true);
|
|
27
|
+
}, [value, setIsEditing]);
|
|
28
|
+
const handleCancel = useCallback(() => {
|
|
29
|
+
setIsEditing(false);
|
|
30
|
+
setDraft([...value]);
|
|
31
|
+
}, [value, setIsEditing]);
|
|
32
|
+
const handleSave = useCallback(async () => {
|
|
33
|
+
const filtered = draft.filter((r) => r.key.trim());
|
|
34
|
+
const ok = await onSave(filtered);
|
|
35
|
+
if (ok)
|
|
36
|
+
setIsEditing(false);
|
|
37
|
+
}, [draft, onSave, setIsEditing]);
|
|
38
|
+
const updateRow = useCallback((index, patch) => {
|
|
39
|
+
setDraft((prev) => prev.map((r, i) => (i === index ? { ...r, ...patch } : r)));
|
|
40
|
+
}, []);
|
|
41
|
+
const removeRow = useCallback((index) => {
|
|
42
|
+
setDraft((prev) => prev.filter((_, i) => i !== index));
|
|
43
|
+
}, []);
|
|
44
|
+
const addRow = useCallback(() => {
|
|
45
|
+
setDraft((prev) => [...prev, { key: "", value: "", isSecret: false, description: "" }]);
|
|
46
|
+
}, []);
|
|
47
|
+
if (disabled || !isEditing) {
|
|
48
|
+
return (_jsx("div", { className: cn("flex flex-col", className), children: value.length > 0 ? (_jsx("div", { className: "flex flex-col divide-y divide-border", children: value.map((row) => (_jsxs("div", { className: "flex items-start gap-3 px-3 py-2.5", children: [_jsx("code", { className: "shrink-0 font-mono text-sm font-medium text-foreground", children: row.key }), showValue && (_jsx("span", { className: "min-w-0 break-all font-mono text-xs text-muted-foreground", children: row.value })), showSecretToggle && (_jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground", children: row.isSecret ? "secret" : "config" })), showOptionalToggle && row.optional && (_jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground-subtle", children: "optional" })), row.description && (_jsx("span", { className: "text-xs text-muted-foreground", children: row.description }))] }, row.key))) })) : (_jsx("p", { className: "px-3 py-3 text-xs text-muted-foreground italic", children: "No entries" })) }));
|
|
49
|
+
}
|
|
50
|
+
return (_jsxs("div", { className: cn("flex flex-col gap-3", className), children: [draft.map((row, i) => (_jsxs("div", { className: "flex items-start gap-2 rounded-md border border-border bg-muted-faint p-2.5", children: [_jsxs("div", { className: "flex flex-1 flex-col gap-1.5", children: [_jsx("input", { type: "text", value: row.key, onChange: (e) => updateRow(i, { key: e.target.value }), placeholder: keyLabel, className: cn("rounded-md border border-border bg-input-bg px-2 py-1 font-mono text-sm text-foreground", "focus:outline-none focus:ring-2 focus:ring-ring") }), showValue && (_jsx("input", { type: "text", value: row.value, onChange: (e) => updateRow(i, { value: e.target.value }), placeholder: valueLabel, className: cn("rounded-md border border-border bg-input-bg px-2 py-1 font-mono text-sm text-foreground", "focus:outline-none focus:ring-2 focus:ring-ring") })), showDescription && (_jsx("input", { type: "text", value: row.description ?? "", onChange: (e) => updateRow(i, { description: e.target.value }), placeholder: "Description", className: cn("rounded-md border border-border bg-input-bg px-2 py-1 text-xs text-foreground", "focus:outline-none focus:ring-2 focus:ring-ring") })), _jsxs("div", { className: "flex items-center gap-3", children: [showSecretToggle && (_jsxs("label", { className: "inline-flex items-center gap-1.5 text-xs text-muted-foreground cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: row.isSecret ?? false, onChange: (e) => updateRow(i, { isSecret: e.target.checked }), className: "size-3.5 rounded border-border" }), "Secret"] })), showOptionalToggle && (_jsxs("label", { className: "inline-flex items-center gap-1.5 text-xs text-muted-foreground cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: row.optional ?? false, onChange: (e) => updateRow(i, { optional: e.target.checked }), className: "size-3.5 rounded border-border" }), "Optional"] }))] })] }), _jsx("button", { type: "button", onClick: () => removeRow(i), "aria-label": `Remove ${row.key || "entry"}`, className: cn("mt-1 inline-flex size-6 items-center justify-center rounded-md text-muted-foreground", "hover:bg-destructive-subtle hover:text-destructive", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: _jsx(TrashIcon, { className: "size-3.5" }) })] }, i))), _jsxs("button", { type: "button", onClick: addRow, className: cn("inline-flex items-center gap-1 rounded-md px-2.5 py-1.5 text-xs font-medium", "border border-dashed border-border text-muted-foreground", "hover:border-muted-foreground hover:text-foreground hover:bg-muted-subtle", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "transition-colors"), children: [_jsx(PlusIcon, { className: "size-3" }), "Add entry"] }), _jsxs("div", { className: "flex items-center justify-end gap-1.5", children: [_jsx("button", { type: "button", onClick: handleCancel, disabled: isSaving, className: cn("rounded-md px-2.5 py-1 text-xs font-medium", "border border-border bg-background text-foreground hover:bg-accent", "disabled:opacity-50", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: "Cancel" }), _jsxs("button", { type: "button", onClick: handleSave, disabled: isSaving, className: cn("inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium", "bg-primary text-primary-foreground hover:bg-primary-hover", "disabled:opacity-50", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: [isSaving && _jsx(Spinner, {}), "Save changes"] })] }), error && (_jsx("p", { className: "px-1 text-xs text-destructive", role: "alert", children: error }))] }));
|
|
51
|
+
}
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Icons
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
function PencilIcon({ className }) {
|
|
56
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M11.5 1.5a2.121 2.121 0 0 1 3 3L5 14l-4 1 1-4Z" }) }));
|
|
57
|
+
}
|
|
58
|
+
function PlusIcon({ className }) {
|
|
59
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", "aria-hidden": "true", children: _jsx("path", { d: "M8 3v10M3 8h10" }) }));
|
|
60
|
+
}
|
|
61
|
+
function TrashIcon({ className }) {
|
|
62
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M2 4h12M5.333 4V2.667a1.333 1.333 0 0 1 1.334-1.334h2.666a1.333 1.333 0 0 1 1.334 1.334V4M12.667 4v9.333a1.333 1.333 0 0 1-1.334 1.334H4.667a1.333 1.333 0 0 1-1.334-1.334V4" }) }));
|
|
63
|
+
}
|
|
64
|
+
function Spinner() {
|
|
65
|
+
return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=InlineEditKeyValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineEditKeyValue.js","sourceRoot":"","sources":["../../src/inline-edit/InlineEditKeyValue.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { InlineEditBaseProps, ResourceRefRow } from "./types";
|
|
2
|
+
/** Props for {@link InlineEditResourceList}. */
|
|
3
|
+
export interface InlineEditResourceListProps extends InlineEditBaseProps {
|
|
4
|
+
/** Current resource references. */
|
|
5
|
+
readonly value: readonly ResourceRefRow[];
|
|
6
|
+
/** Called with the updated list when a change is confirmed. */
|
|
7
|
+
readonly onSave: (refs: ResourceRefRow[]) => Promise<boolean>;
|
|
8
|
+
/**
|
|
9
|
+
* Inline picker rendered when the user clicks "Add".
|
|
10
|
+
* Receives `onSelect` to call when a resource is chosen.
|
|
11
|
+
* The consumer provides the appropriate domain-specific picker.
|
|
12
|
+
*/
|
|
13
|
+
readonly renderPicker?: (onSelect: (ref: ResourceRefRow) => void) => React.ReactNode;
|
|
14
|
+
/** Click handler for navigating to a referenced resource. */
|
|
15
|
+
readonly onItemClick?: (ref: ResourceRefRow) => void;
|
|
16
|
+
/** Icon rendered next to each item. */
|
|
17
|
+
readonly itemIcon?: React.ReactNode;
|
|
18
|
+
/** Label for the resource type (e.g. "MCP Server", "Skill"). */
|
|
19
|
+
readonly resourceLabel?: string;
|
|
20
|
+
/** Controlled editing state. When provided, component is in controlled mode. */
|
|
21
|
+
readonly editing?: boolean;
|
|
22
|
+
/** Called when editing state changes (controlled mode). */
|
|
23
|
+
readonly onEditingChange?: (editing: boolean) => void;
|
|
24
|
+
/** Default org to pre-fill in the generic add form. */
|
|
25
|
+
readonly defaultOrg?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Inline editor for a list of resource references.
|
|
29
|
+
*
|
|
30
|
+
* Read mode shows clickable reference items. Edit mode adds a remove
|
|
31
|
+
* button per item and an "Add" button that reveals the domain picker.
|
|
32
|
+
*/
|
|
33
|
+
export declare function InlineEditResourceList({ value, onSave, renderPicker, onItemClick, itemIcon, resourceLabel, editing: controlledEditing, onEditingChange, defaultOrg, disabled, isSaving, error, className, }: InlineEditResourceListProps): import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
//# sourceMappingURL=InlineEditResourceList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineEditResourceList.d.ts","sourceRoot":"","sources":["../../src/inline-edit/InlineEditResourceList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEnE,gDAAgD;AAChD,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACtE,mCAAmC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC;IACrF,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;IACrD,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACpC,gEAAgE;IAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,gFAAgF;IAChF,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtD,uDAAuD;IACvD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,MAAM,EACN,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAA0B,EAC1B,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EACf,UAAe,EACf,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,GACV,EAAE,2BAA2B,2CA4O7B"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
/**
|
|
6
|
+
* Inline editor for a list of resource references.
|
|
7
|
+
*
|
|
8
|
+
* Read mode shows clickable reference items. Edit mode adds a remove
|
|
9
|
+
* button per item and an "Add" button that reveals the domain picker.
|
|
10
|
+
*/
|
|
11
|
+
export function InlineEditResourceList({ value, onSave, renderPicker, onItemClick, itemIcon, resourceLabel = "resource", editing: controlledEditing, onEditingChange, defaultOrg = "", disabled, isSaving, error, className, }) {
|
|
12
|
+
const [internalEditing, setInternalEditing] = useState(false);
|
|
13
|
+
const isEditing = controlledEditing ?? internalEditing;
|
|
14
|
+
const setIsEditing = useCallback((v) => {
|
|
15
|
+
setInternalEditing(v);
|
|
16
|
+
onEditingChange?.(v);
|
|
17
|
+
}, [onEditingChange]);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (controlledEditing !== undefined)
|
|
20
|
+
setInternalEditing(controlledEditing);
|
|
21
|
+
}, [controlledEditing]);
|
|
22
|
+
const [draft, setDraft] = useState([...value]);
|
|
23
|
+
const [showPicker, setShowPicker] = useState(false);
|
|
24
|
+
const [showGenericAdd, setShowGenericAdd] = useState(false);
|
|
25
|
+
const [addSlug, setAddSlug] = useState("");
|
|
26
|
+
const [addOrg, setAddOrg] = useState(defaultOrg);
|
|
27
|
+
const handleEdit = useCallback(() => {
|
|
28
|
+
setDraft([...value]);
|
|
29
|
+
setIsEditing(true);
|
|
30
|
+
setShowPicker(false);
|
|
31
|
+
setShowGenericAdd(false);
|
|
32
|
+
}, [value, setIsEditing]);
|
|
33
|
+
const handleCancel = useCallback(() => {
|
|
34
|
+
setIsEditing(false);
|
|
35
|
+
setDraft([...value]);
|
|
36
|
+
setShowPicker(false);
|
|
37
|
+
setShowGenericAdd(false);
|
|
38
|
+
}, [value, setIsEditing]);
|
|
39
|
+
const handleSave = useCallback(async () => {
|
|
40
|
+
const ok = await onSave(draft);
|
|
41
|
+
if (ok) {
|
|
42
|
+
setIsEditing(false);
|
|
43
|
+
setShowPicker(false);
|
|
44
|
+
setShowGenericAdd(false);
|
|
45
|
+
}
|
|
46
|
+
}, [draft, onSave, setIsEditing]);
|
|
47
|
+
const removeItem = useCallback((index) => {
|
|
48
|
+
setDraft((prev) => prev.filter((_, i) => i !== index));
|
|
49
|
+
}, []);
|
|
50
|
+
const addItem = useCallback((ref) => {
|
|
51
|
+
setDraft((prev) => {
|
|
52
|
+
const exists = prev.some((r) => r.org === ref.org && r.slug === ref.slug);
|
|
53
|
+
if (exists)
|
|
54
|
+
return prev;
|
|
55
|
+
return [...prev, ref];
|
|
56
|
+
});
|
|
57
|
+
setShowPicker(false);
|
|
58
|
+
}, []);
|
|
59
|
+
if (disabled || !isEditing) {
|
|
60
|
+
return (_jsx("div", { className: cn("flex flex-col", className), children: value.length > 0 ? (_jsx("div", { className: "flex flex-col divide-y divide-border", children: value.map((ref, index) => {
|
|
61
|
+
const label = ref.label ?? ref.slug;
|
|
62
|
+
const row = (_jsxs("div", { className: "flex items-center gap-3", children: [itemIcon && _jsx("span", { className: "size-4 shrink-0 text-muted-foreground", children: itemIcon }), _jsx("span", { className: "text-sm font-medium text-foreground", children: label })] }));
|
|
63
|
+
return onItemClick ? (_jsx("button", { type: "button", onClick: () => onItemClick(ref), className: cn("w-full px-3 py-2.5 text-left transition-colors", "hover:bg-accent-hover", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring"), children: row }, `${ref.org}/${ref.slug}` || index)) : (_jsx("div", { className: "px-3 py-2.5", children: row }, `${ref.org}/${ref.slug}` || index));
|
|
64
|
+
}) })) : (_jsxs("p", { className: "px-3 py-3 text-xs text-muted-foreground italic", children: ["No ", resourceLabel, "s configured"] })) }));
|
|
65
|
+
}
|
|
66
|
+
return (_jsxs("div", { className: cn("flex flex-col gap-2", className), children: [draft.length > 0 && (_jsx("div", { className: "flex flex-col divide-y divide-border rounded-md border border-border", children: draft.map((ref, i) => (_jsxs("div", { className: "flex items-center gap-2 px-3 py-1.5", children: [itemIcon && _jsx("span", { className: "size-4 shrink-0 text-muted-foreground", children: itemIcon }), _jsx("span", { className: "flex-1 text-sm font-medium text-foreground", children: ref.label ?? ref.slug }), _jsx("button", { type: "button", onClick: () => removeItem(i), "aria-label": `Remove ${ref.label ?? ref.slug}`, className: cn("inline-flex size-6 items-center justify-center rounded-md text-muted-foreground", "hover:bg-destructive-subtle hover:text-destructive", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: _jsx(XIcon, { className: "size-3.5" }) })] }, `${ref.org}/${ref.slug}`))) })), showPicker && renderPicker ? (_jsx("div", { className: "rounded-md border border-border bg-muted-faint p-2", children: renderPicker(addItem) })) : showGenericAdd ? (_jsxs("div", { className: "flex items-center gap-2 rounded-md border border-border bg-muted-faint p-2", children: [_jsx("input", { type: "text", value: addOrg, onChange: (e) => setAddOrg(e.target.value), placeholder: "org", className: cn("w-24 rounded-md border border-border bg-input-bg px-2 py-1 text-xs text-foreground", "focus:outline-none focus:ring-2 focus:ring-ring") }), _jsx("span", { className: "text-xs text-muted-foreground", children: "/" }), _jsx("input", { type: "text", value: addSlug, onChange: (e) => setAddSlug(e.target.value), placeholder: "slug", onKeyDown: (e) => {
|
|
67
|
+
if (e.key === "Enter" && addSlug.trim()) {
|
|
68
|
+
addItem({ org: addOrg.trim() || defaultOrg, slug: addSlug.trim(), label: addSlug.trim() });
|
|
69
|
+
setAddSlug("");
|
|
70
|
+
setShowGenericAdd(false);
|
|
71
|
+
}
|
|
72
|
+
else if (e.key === "Escape") {
|
|
73
|
+
setShowGenericAdd(false);
|
|
74
|
+
setAddSlug("");
|
|
75
|
+
}
|
|
76
|
+
}, className: cn("flex-1 rounded-md border border-border bg-input-bg px-2 py-1 text-xs text-foreground", "focus:outline-none focus:ring-2 focus:ring-ring") }), _jsx("button", { type: "button", onClick: () => {
|
|
77
|
+
if (addSlug.trim()) {
|
|
78
|
+
addItem({ org: addOrg.trim() || defaultOrg, slug: addSlug.trim(), label: addSlug.trim() });
|
|
79
|
+
setAddSlug("");
|
|
80
|
+
setShowGenericAdd(false);
|
|
81
|
+
}
|
|
82
|
+
}, disabled: !addSlug.trim(), className: cn("inline-flex size-6 items-center justify-center rounded-md", "bg-primary text-primary-foreground hover:bg-primary-hover", "disabled:opacity-50", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: _jsx(PlusIcon, { className: "size-3" }) })] })) : (_jsxs("button", { type: "button", onClick: () => renderPicker ? setShowPicker(true) : setShowGenericAdd(true), className: cn("inline-flex items-center gap-1 rounded-md px-2.5 py-1.5 text-xs font-medium", "border border-dashed border-border text-muted-foreground", "hover:border-muted-foreground hover:text-foreground hover:bg-muted-subtle", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "transition-colors"), children: [_jsx(PlusIcon, { className: "size-3" }), "Add ", resourceLabel] })), _jsxs("div", { className: "flex items-center justify-end gap-1.5", children: [_jsx("button", { type: "button", onClick: handleCancel, disabled: isSaving, className: cn("rounded-md px-2.5 py-1 text-xs font-medium", "border border-border bg-background text-foreground hover:bg-accent", "disabled:opacity-50", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: "Cancel" }), _jsxs("button", { type: "button", onClick: handleSave, disabled: isSaving, className: cn("inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium", "bg-primary text-primary-foreground hover:bg-primary-hover", "disabled:opacity-50", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: [isSaving && _jsx(Spinner, {}), "Save changes"] })] }), error && (_jsx("p", { className: "px-1 text-xs text-destructive", role: "alert", children: error }))] }));
|
|
83
|
+
}
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Icons
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
function PencilIcon({ className }) {
|
|
88
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M11.5 1.5a2.121 2.121 0 0 1 3 3L5 14l-4 1 1-4Z" }) }));
|
|
89
|
+
}
|
|
90
|
+
function PlusIcon({ className }) {
|
|
91
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", "aria-hidden": "true", children: _jsx("path", { d: "M8 3v10M3 8h10" }) }));
|
|
92
|
+
}
|
|
93
|
+
function XIcon({ className }) {
|
|
94
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "m4 4 8 8M12 4l-8 8" }) }));
|
|
95
|
+
}
|
|
96
|
+
function Spinner() {
|
|
97
|
+
return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=InlineEditResourceList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineEditResourceList.js","sourceRoot":"","sources":["../../src/inline-edit/InlineEditResourceList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { InlineEditBaseProps, SelectOption } from "./types";
|
|
2
|
+
/** Props for {@link InlineEditSelect}. */
|
|
3
|
+
export interface InlineEditSelectProps extends InlineEditBaseProps {
|
|
4
|
+
/** Current selected value. */
|
|
5
|
+
readonly value: string;
|
|
6
|
+
/** Available options. */
|
|
7
|
+
readonly options: readonly SelectOption[];
|
|
8
|
+
/** Called when the user selects a new option. */
|
|
9
|
+
readonly onSave: (newValue: string) => Promise<boolean>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Click-to-edit single-choice selector.
|
|
13
|
+
*
|
|
14
|
+
* In read mode, shows the current option label. On click, opens a radio
|
|
15
|
+
* group with all options. Selection triggers immediate save.
|
|
16
|
+
*/
|
|
17
|
+
export declare function InlineEditSelect({ value, options, onSave, disabled, isSaving, error, className, }: InlineEditSelectProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=InlineEditSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineEditSelect.d.ts","sourceRoot":"","sources":["../../src/inline-edit/InlineEditSelect.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEjE,0CAA0C;AAC1C,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;IAChE,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,iDAAiD;IACjD,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACzD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,OAAO,EACP,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,GACV,EAAE,qBAAqB,2CAmGvB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
/**
|
|
6
|
+
* Click-to-edit single-choice selector.
|
|
7
|
+
*
|
|
8
|
+
* In read mode, shows the current option label. On click, opens a radio
|
|
9
|
+
* group with all options. Selection triggers immediate save.
|
|
10
|
+
*/
|
|
11
|
+
export function InlineEditSelect({ value, options, onSave, disabled, isSaving, error, className, }) {
|
|
12
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
13
|
+
const containerRef = useRef(null);
|
|
14
|
+
const currentLabel = options.find((o) => o.value === value)?.label ?? value;
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (!isEditing)
|
|
17
|
+
return;
|
|
18
|
+
const handleClickOutside = (e) => {
|
|
19
|
+
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
20
|
+
setIsEditing(false);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
24
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
25
|
+
}, [isEditing]);
|
|
26
|
+
const handleSelect = useCallback(async (newValue) => {
|
|
27
|
+
if (newValue === value) {
|
|
28
|
+
setIsEditing(false);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const ok = await onSave(newValue);
|
|
32
|
+
if (ok)
|
|
33
|
+
setIsEditing(false);
|
|
34
|
+
}, [value, onSave]);
|
|
35
|
+
if (disabled || !isEditing) {
|
|
36
|
+
return (_jsx("div", { className: cn("group/inline-edit", className), children: _jsxs("button", { type: "button", onClick: () => { if (!disabled)
|
|
37
|
+
setIsEditing(true); }, disabled: disabled, className: cn("inline-flex items-center gap-1.5 rounded-md px-1.5 py-0.5 text-left transition-colors", !disabled && "hover:bg-accent-hover cursor-pointer", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring"), children: [_jsx("span", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-xs font-medium text-foreground", children: currentLabel }), !disabled && (_jsx(ChevronDownIcon, { className: "size-3 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover/inline-edit:opacity-100" }))] }) }));
|
|
38
|
+
}
|
|
39
|
+
return (_jsxs("div", { ref: containerRef, className: cn("flex flex-col gap-1", className), children: [_jsx("div", { className: "rounded-lg border border-border bg-background p-1", role: "radiogroup", children: options.map((option) => (_jsxs("button", { type: "button", role: "radio", "aria-checked": option.value === value, disabled: isSaving, onClick: () => handleSelect(option.value), className: cn("flex w-full items-start gap-2 rounded-md px-2.5 py-1.5 text-left transition-colors", option.value === value
|
|
40
|
+
? "bg-muted-subtle text-foreground"
|
|
41
|
+
: "hover:bg-accent-hover text-foreground", "disabled:opacity-50", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring"), children: [_jsx("div", { className: cn("mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full border", option.value === value
|
|
42
|
+
? "border-primary bg-primary"
|
|
43
|
+
: "border-muted-foreground"), children: option.value === value && (_jsx("div", { className: "size-1.5 rounded-full bg-primary-foreground" })) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "text-sm font-medium", children: option.label }), option.description && (_jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: option.description }))] }), isSaving && option.value !== value && (_jsx(Spinner, {}))] }, option.value))) }), error && (_jsx("p", { className: "px-1 text-xs text-destructive", role: "alert", children: error }))] }));
|
|
44
|
+
}
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Icons
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
function ChevronDownIcon({ className }) {
|
|
49
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "m4 6 4 4 4-4" }) }));
|
|
50
|
+
}
|
|
51
|
+
function Spinner() {
|
|
52
|
+
return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=InlineEditSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineEditSelect.js","sourceRoot":"","sources":["../../src/inline-edit/InlineEditSelect.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { InlineEditBaseProps } from "./types";
|
|
2
|
+
/** Props for {@link InlineEditText}. */
|
|
3
|
+
export interface InlineEditTextProps extends InlineEditBaseProps {
|
|
4
|
+
/** Current field value. */
|
|
5
|
+
readonly value: string;
|
|
6
|
+
/** Called with the new value when the user confirms the edit. */
|
|
7
|
+
readonly onSave: (newValue: string) => Promise<boolean>;
|
|
8
|
+
/** Placeholder shown when value is empty (in both read and edit mode). */
|
|
9
|
+
readonly placeholder?: string;
|
|
10
|
+
/** Optional client-side validation. Return an error string to block save. */
|
|
11
|
+
readonly validate?: (value: string) => string | null;
|
|
12
|
+
/** Render as heading text (larger, bolder). */
|
|
13
|
+
readonly variant?: "default" | "heading";
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Click-to-edit single-line text field.
|
|
17
|
+
*
|
|
18
|
+
* Displays the value as styled text. On click, transitions to an input
|
|
19
|
+
* with inline confirm/cancel controls. Confirm triggers `onSave`;
|
|
20
|
+
* cancel reverts. Escape key also cancels.
|
|
21
|
+
*/
|
|
22
|
+
export declare function InlineEditText({ value, onSave, placeholder, validate, variant, disabled, isSaving, error, className, }: InlineEditTextProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=InlineEditText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineEditText.d.ts","sourceRoot":"","sources":["../../src/inline-edit/InlineEditText.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,wCAAwC;AACxC,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC9D,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,0EAA0E;IAC1E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrD,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAC1C;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,MAAM,EACN,WAA6B,EAC7B,QAAQ,EACR,OAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,GACV,EAAE,mBAAmB,2CAyIrB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
/**
|
|
6
|
+
* Click-to-edit single-line text field.
|
|
7
|
+
*
|
|
8
|
+
* Displays the value as styled text. On click, transitions to an input
|
|
9
|
+
* with inline confirm/cancel controls. Confirm triggers `onSave`;
|
|
10
|
+
* cancel reverts. Escape key also cancels.
|
|
11
|
+
*/
|
|
12
|
+
export function InlineEditText({ value, onSave, placeholder = "Click to edit", validate, variant = "default", disabled, isSaving, error, className, }) {
|
|
13
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
14
|
+
const [draft, setDraft] = useState(value);
|
|
15
|
+
const [localError, setLocalError] = useState(null);
|
|
16
|
+
const inputRef = useRef(null);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (isEditing) {
|
|
19
|
+
setDraft(value);
|
|
20
|
+
setLocalError(null);
|
|
21
|
+
requestAnimationFrame(() => inputRef.current?.focus());
|
|
22
|
+
}
|
|
23
|
+
}, [isEditing, value]);
|
|
24
|
+
const handleConfirm = useCallback(async () => {
|
|
25
|
+
const trimmed = draft.trim();
|
|
26
|
+
if (trimmed === value) {
|
|
27
|
+
setIsEditing(false);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (validate) {
|
|
31
|
+
const err = validate(trimmed);
|
|
32
|
+
if (err) {
|
|
33
|
+
setLocalError(err);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const ok = await onSave(trimmed);
|
|
38
|
+
if (ok)
|
|
39
|
+
setIsEditing(false);
|
|
40
|
+
}, [draft, value, validate, onSave]);
|
|
41
|
+
const handleCancel = useCallback(() => {
|
|
42
|
+
setIsEditing(false);
|
|
43
|
+
setDraft(value);
|
|
44
|
+
setLocalError(null);
|
|
45
|
+
}, [value]);
|
|
46
|
+
const handleKeyDown = useCallback((e) => {
|
|
47
|
+
if (e.key === "Enter") {
|
|
48
|
+
e.preventDefault();
|
|
49
|
+
handleConfirm();
|
|
50
|
+
}
|
|
51
|
+
else if (e.key === "Escape") {
|
|
52
|
+
handleCancel();
|
|
53
|
+
}
|
|
54
|
+
}, [handleConfirm, handleCancel]);
|
|
55
|
+
const displayError = localError || error;
|
|
56
|
+
if (disabled || !isEditing) {
|
|
57
|
+
return (_jsx("div", { className: cn("group/inline-edit", className), children: _jsxs("button", { type: "button", onClick: () => { if (!disabled)
|
|
58
|
+
setIsEditing(true); }, disabled: disabled, className: cn("inline-flex w-full items-center gap-1.5 rounded-md px-1.5 py-0.5 text-left transition-colors", !disabled && "hover:bg-accent-hover cursor-pointer", disabled && "cursor-default", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring"), children: [_jsx("span", { className: cn("min-w-0 truncate", variant === "heading"
|
|
59
|
+
? "text-lg font-semibold text-foreground"
|
|
60
|
+
: "text-sm text-foreground", !value && "text-muted-foreground italic"), children: value || placeholder }), !disabled && (_jsx(PencilIcon, { className: "size-3 shrink-0 text-muted-foreground opacity-0 transition-opacity group-hover/inline-edit:opacity-100" }))] }) }));
|
|
61
|
+
}
|
|
62
|
+
return (_jsxs("div", { className: cn("flex flex-col gap-1", className), children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("input", { ref: inputRef, type: "text", value: draft, onChange: (e) => { setDraft(e.target.value); setLocalError(null); }, onKeyDown: handleKeyDown, disabled: isSaving, placeholder: placeholder, className: cn("flex-1 rounded-md border border-border bg-input-bg px-2 py-1 text-sm text-foreground", "focus:outline-none focus:ring-2 focus:ring-ring", "disabled:opacity-50", variant === "heading" && "text-lg font-semibold", displayError && "border-destructive") }), _jsx("button", { type: "button", onClick: handleConfirm, disabled: isSaving, "aria-label": "Save", className: cn("inline-flex size-7 items-center justify-center rounded-md", "bg-primary text-primary-foreground hover:bg-primary-hover", "disabled:opacity-50", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: isSaving ? _jsx(Spinner, {}) : _jsx(CheckIcon, { className: "size-3.5" }) }), _jsx("button", { type: "button", onClick: handleCancel, disabled: isSaving, "aria-label": "Cancel", className: cn("inline-flex size-7 items-center justify-center rounded-md", "border border-border bg-background text-foreground hover:bg-accent hover:text-accent-foreground", "disabled:opacity-50", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: _jsx(XIcon, { className: "size-3.5" }) })] }), displayError && (_jsx("p", { className: "px-1 text-xs text-destructive", role: "alert", children: displayError }))] }));
|
|
63
|
+
}
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
// Icons
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
function PencilIcon({ className }) {
|
|
68
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M11.5 1.5a2.121 2.121 0 0 1 3 3L5 14l-4 1 1-4Z" }) }));
|
|
69
|
+
}
|
|
70
|
+
function CheckIcon({ className }) {
|
|
71
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "m3 8.5 3.5 3.5 6.5-8" }) }));
|
|
72
|
+
}
|
|
73
|
+
function XIcon({ className }) {
|
|
74
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "m4 4 8 8M12 4l-8 8" }) }));
|
|
75
|
+
}
|
|
76
|
+
function Spinner() {
|
|
77
|
+
return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=InlineEditText.js.map
|