@burdenoff/microfe-botmanor 2026.1108.1 → 2026.1109.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/dist/botlit/BotlitRoutes.d.ts +2 -0
- package/dist/botlit/BotlitRoutes.js +24 -25
- package/dist/botlit/BotlitRoutes.js.map +1 -1
- package/dist/botlit/BotmanorRoot.d.ts +3 -0
- package/dist/botlit/BotmanorRoot.js +1 -2
- package/dist/botlit/BotmanorRoot.js.map +1 -1
- package/dist/botlit/BotmanorRootInner.d.ts +3 -0
- package/dist/botlit/BotmanorRootInner.js +9 -10
- package/dist/botlit/BotmanorRootInner.js.map +1 -1
- package/dist/botlit/components/AgentApprovalPanel.d.ts +20 -0
- package/dist/botlit/components/AgentApprovalPanel.js +49 -50
- package/dist/botlit/components/AgentApprovalPanel.js.map +1 -1
- package/dist/botlit/components/AiOperationsPanel.d.ts +14 -0
- package/dist/botlit/components/AiOperationsPanel.js +54 -55
- package/dist/botlit/components/AiOperationsPanel.js.map +1 -1
- package/dist/botlit/components/AssistantChannelPanel.d.ts +3 -0
- package/dist/botlit/components/AssistantChannelPanel.js +12 -13
- package/dist/botlit/components/AssistantChannelPanel.js.map +1 -1
- package/dist/botlit/components/AssistantRuntimeSetupPanel.d.ts +4 -0
- package/dist/botlit/components/AssistantRuntimeSetupPanel.js +14 -14
- package/dist/botlit/components/AssistantRuntimeSetupPanel.js.map +1 -1
- package/dist/botlit/components/AssistantWebsitePanel.d.ts +5 -0
- package/dist/botlit/components/AssistantWebsitePanel.js +15 -16
- package/dist/botlit/components/AssistantWebsitePanel.js.map +1 -1
- package/dist/botlit/components/Badge.d.ts +9 -0
- package/dist/botlit/components/Badge.js +1 -2
- package/dist/botlit/components/Badge.js.map +1 -1
- package/dist/botlit/components/Button.d.ts +10 -0
- package/dist/botlit/components/Button.js +1 -2
- package/dist/botlit/components/Button.js.map +1 -1
- package/dist/botlit/components/Card.d.ts +16 -0
- package/dist/botlit/components/Card.js +1 -2
- package/dist/botlit/components/Card.js.map +1 -1
- package/dist/botlit/components/ChannelSelectorSheet.d.ts +23 -0
- package/dist/botlit/components/ChannelSelectorSheet.js +1 -2
- package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
- package/dist/botlit/components/EmptyState.d.ts +12 -0
- package/dist/botlit/components/EmptyState.js +1 -2
- package/dist/botlit/components/EmptyState.js.map +1 -1
- package/dist/botlit/components/ErrorState.d.ts +10 -0
- package/dist/botlit/components/ErrorState.js +5 -6
- package/dist/botlit/components/ErrorState.js.map +1 -1
- package/dist/botlit/components/Input.d.ts +27 -0
- package/dist/botlit/components/Input.js +1 -2
- package/dist/botlit/components/Input.js.map +1 -1
- package/dist/botlit/components/KnowledgeSourceImportPanel.d.ts +3 -0
- package/dist/botlit/components/KnowledgeSourceImportPanel.js +12 -13
- package/dist/botlit/components/KnowledgeSourceImportPanel.js.map +1 -1
- package/dist/botlit/components/ModelRegistrationPanel.d.ts +5 -0
- package/dist/botlit/components/ModelRegistrationPanel.js +1 -2
- package/dist/botlit/components/ModelRegistrationPanel.js.map +1 -1
- package/dist/botlit/components/PageLayout.d.ts +12 -0
- package/dist/botlit/components/PageLayout.js +1 -2
- package/dist/botlit/components/PageLayout.js.map +1 -1
- package/dist/botlit/components/QuotaExhaustedDialog.d.ts +9 -0
- package/dist/botlit/components/QuotaExhaustedDialog.js +1 -2
- package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -1
- package/dist/botlit/components/RetentionStatusPanel.d.ts +2 -0
- package/dist/botlit/components/RetentionStatusPanel.js +18 -19
- package/dist/botlit/components/RetentionStatusPanel.js.map +1 -1
- package/dist/botlit/components/RouteLoader.d.ts +23 -0
- package/dist/botlit/components/RouteLoader.js +1 -2
- package/dist/botlit/components/RouteLoader.js.map +1 -1
- package/dist/botlit/components/VersionHistoryPanel.d.ts +12 -0
- package/dist/botlit/components/VersionHistoryPanel.js +23 -24
- package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
- package/dist/botlit/components/WorkspaceRequired.d.ts +18 -0
- package/dist/botlit/components/WorkspaceRequired.js +1 -2
- package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
- package/dist/botlit/components/index.d.ts +14 -0
- package/dist/botlit/hooks/index.d.ts +36 -0
- package/dist/botlit/hooks/index.js +15 -14
- package/dist/botlit/hooks/internal/mutationInput.d.ts +56 -0
- package/dist/botlit/hooks/internal/mutationInput.js +1 -2
- package/dist/botlit/hooks/internal/mutationInput.js.map +1 -1
- package/dist/botlit/hooks/internal/workspaceGateway.d.ts +54 -0
- package/dist/botlit/hooks/internal/workspaceGateway.js +17 -19
- package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
- package/dist/botlit/hooks/useA2A.d.ts +104 -0
- package/dist/botlit/hooks/useA2A.js +45 -45
- package/dist/botlit/hooks/useA2A.js.map +1 -1
- package/dist/botlit/hooks/useAgentApprovals.d.ts +62 -0
- package/dist/botlit/hooks/useAgentApprovals.js +38 -39
- package/dist/botlit/hooks/useAgentApprovals.js.map +1 -1
- package/dist/botlit/hooks/useAgents.d.ts +105 -0
- package/dist/botlit/hooks/useAgents.js +53 -54
- package/dist/botlit/hooks/useAgents.js.map +1 -1
- package/dist/botlit/hooks/useAiOperations.d.ts +95 -0
- package/dist/botlit/hooks/useAiOperations.js +20 -19
- package/dist/botlit/hooks/useAiOperations.js.map +1 -1
- package/dist/botlit/hooks/useAssistantChannels.d.ts +16 -0
- package/dist/botlit/hooks/useAssistantChannels.js +1 -2
- package/dist/botlit/hooks/useAssistantChannels.js.map +1 -1
- package/dist/botlit/hooks/useAssistantRuntimeSetup.d.ts +17 -0
- package/dist/botlit/hooks/useAssistantRuntimeSetup.js +1 -2
- package/dist/botlit/hooks/useAssistantRuntimeSetup.js.map +1 -1
- package/dist/botlit/hooks/useAssistantWebsites.d.ts +18 -0
- package/dist/botlit/hooks/useAssistantWebsites.js +1 -2
- package/dist/botlit/hooks/useAssistantWebsites.js.map +1 -1
- package/dist/botlit/hooks/useBotWorkflow.d.ts +22 -0
- package/dist/botlit/hooks/useBotWorkflow.js +1 -2
- package/dist/botlit/hooks/useBotWorkflow.js.map +1 -1
- package/dist/botlit/hooks/useBots.d.ts +68 -0
- package/dist/botlit/hooks/useBots.js +32 -33
- package/dist/botlit/hooks/useBots.js.map +1 -1
- package/dist/botlit/hooks/useBuckets.d.ts +57 -0
- package/dist/botlit/hooks/useBuckets.js +38 -39
- package/dist/botlit/hooks/useBuckets.js.map +1 -1
- package/dist/botlit/hooks/useChannels.d.ts +87 -0
- package/dist/botlit/hooks/useChannels.js +73 -73
- package/dist/botlit/hooks/useChannels.js.map +1 -1
- package/dist/botlit/hooks/useConversations.d.ts +42 -0
- package/dist/botlit/hooks/useConversations.js +1 -2
- package/dist/botlit/hooks/useConversations.js.map +1 -1
- package/dist/botlit/hooks/useExecutions.d.ts +87 -0
- package/dist/botlit/hooks/useExecutions.js +37 -37
- package/dist/botlit/hooks/useExecutions.js.map +1 -1
- package/dist/botlit/hooks/useKnowledgeBases.d.ts +79 -0
- package/dist/botlit/hooks/useKnowledgeBases.js +40 -39
- package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -1
- package/dist/botlit/hooks/useKnowledgeSourceImports.d.ts +21 -0
- package/dist/botlit/hooks/useKnowledgeSourceImports.js +1 -2
- package/dist/botlit/hooks/useKnowledgeSourceImports.js.map +1 -1
- package/dist/botlit/hooks/useLLMProviders.d.ts +66 -0
- package/dist/botlit/hooks/useLLMProviders.js +25 -26
- package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
- package/dist/botlit/hooks/useMCPServers.d.ts +71 -0
- package/dist/botlit/hooks/useMCPServers.js +40 -38
- package/dist/botlit/hooks/useMCPServers.js.map +1 -1
- package/dist/botlit/hooks/usePolicies.d.ts +60 -0
- package/dist/botlit/hooks/usePolicies.js +49 -49
- package/dist/botlit/hooks/usePolicies.js.map +1 -1
- package/dist/botlit/hooks/usePromptTemplates.d.ts +88 -0
- package/dist/botlit/hooks/usePromptTemplates.js +57 -57
- package/dist/botlit/hooks/usePromptTemplates.js.map +1 -1
- package/dist/botlit/hooks/useRetention.d.ts +26 -0
- package/dist/botlit/hooks/useRetention.js +3 -3
- package/dist/botlit/hooks/useRetention.js.map +1 -1
- package/dist/botlit/hooks/useRetrievalProfiles.d.ts +75 -0
- package/dist/botlit/hooks/useRetrievalProfiles.js +47 -47
- package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -1
- package/dist/botlit/hooks/useSkills.d.ts +64 -0
- package/dist/botlit/hooks/useSkills.js +53 -53
- package/dist/botlit/hooks/useSkills.js.map +1 -1
- package/dist/botlit/hooks/useStore.d.ts +112 -0
- package/dist/botlit/hooks/useStore.js +55 -55
- package/dist/botlit/hooks/useStore.js.map +1 -1
- package/dist/botlit/hooks/useUserPlatformConnection.d.ts +80 -0
- package/dist/botlit/hooks/useUserPlatformConnection.js +19 -19
- package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -1
- package/dist/botlit/index.d.ts +16 -0
- package/dist/botlit/index.js +12 -11
- package/dist/botlit/pages/A2AAgentDetailPage.d.ts +6 -0
- package/dist/botlit/pages/A2AAgentDetailPage.js +171 -178
- package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/A2ARegistryPage.d.ts +2 -0
- package/dist/botlit/pages/A2ARegistryPage.js +25 -26
- package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
- package/dist/botlit/pages/AgentApprovalsPage.d.ts +2 -0
- package/dist/botlit/pages/AgentApprovalsPage.js +32 -33
- package/dist/botlit/pages/AgentApprovalsPage.js.map +1 -1
- package/dist/botlit/pages/AgentBuilderPage.d.ts +2 -0
- package/dist/botlit/pages/AgentBuilderPage.js +59 -60
- package/dist/botlit/pages/AgentBuilderPage.js.map +1 -1
- package/dist/botlit/pages/AgentDetailPage.d.ts +2 -0
- package/dist/botlit/pages/AgentDetailPage.js +83 -84
- package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
- package/dist/botlit/pages/AgentsListPage.d.ts +2 -0
- package/dist/botlit/pages/AgentsListPage.js +71 -72
- package/dist/botlit/pages/AgentsListPage.js.map +1 -1
- package/dist/botlit/pages/AiOperationsPage.d.ts +2 -0
- package/dist/botlit/pages/AiOperationsPage.js +52 -53
- package/dist/botlit/pages/AiOperationsPage.js.map +1 -1
- package/dist/botlit/pages/BotChannelsTab.d.ts +7 -0
- package/dist/botlit/pages/BotChannelsTab.js +120 -122
- package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
- package/dist/botlit/pages/BotDetailPage.d.ts +7 -0
- package/dist/botlit/pages/BotDetailPage.js +353 -358
- package/dist/botlit/pages/BotDetailPage.js.map +1 -1
- package/dist/botlit/pages/BotWorkflowTab.d.ts +11 -0
- package/dist/botlit/pages/BotWorkflowTab.js +20 -21
- package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
- package/dist/botlit/pages/BotsListPage.d.ts +2 -0
- package/dist/botlit/pages/BotsListPage.js +52 -53
- package/dist/botlit/pages/BotsListPage.js.map +1 -1
- package/dist/botlit/pages/BucketsPage.d.ts +2 -0
- package/dist/botlit/pages/BucketsPage.js +260 -261
- package/dist/botlit/pages/BucketsPage.js.map +1 -1
- package/dist/botlit/pages/ChannelDetailPage.d.ts +6 -0
- package/dist/botlit/pages/ChannelDetailPage.js +97 -96
- package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
- package/dist/botlit/pages/ChannelRoutesPage.d.ts +2 -0
- package/dist/botlit/pages/ChannelRoutesPage.js +23 -24
- package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -1
- package/dist/botlit/pages/ChannelsPage.d.ts +2 -0
- package/dist/botlit/pages/ChannelsPage.js +44 -45
- package/dist/botlit/pages/ChannelsPage.js.map +1 -1
- package/dist/botlit/pages/ChatPage.d.ts +1 -0
- package/dist/botlit/pages/ChatPage.js +10 -11
- package/dist/botlit/pages/ChatPage.js.map +1 -1
- package/dist/botlit/pages/ConversationDetailPage.d.ts +2 -0
- package/dist/botlit/pages/ConversationsPage.d.ts +2 -0
- package/dist/botlit/pages/DashboardPage.d.ts +2 -0
- package/dist/botlit/pages/DashboardPage.js +37 -38
- package/dist/botlit/pages/DashboardPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionDetailPage.d.ts +2 -0
- package/dist/botlit/pages/ExecutionDetailPage.js +47 -48
- package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -1
- package/dist/botlit/pages/ExecutionsPage.d.ts +2 -0
- package/dist/botlit/pages/ExecutionsPage.js +72 -70
- package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
- package/dist/botlit/pages/InstalledPackagesPage.d.ts +2 -0
- package/dist/botlit/pages/InstalledPackagesPage.js +77 -78
- package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBaseDetailPage.d.ts +6 -0
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js +171 -181
- package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -1
- package/dist/botlit/pages/KnowledgeBasesPage.d.ts +2 -0
- package/dist/botlit/pages/KnowledgeBasesPage.js +30 -31
- package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
- package/dist/botlit/pages/MCPServerDetailPage.d.ts +6 -0
- package/dist/botlit/pages/MCPServerDetailPage.js +82 -83
- package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
- package/dist/botlit/pages/MCPServersPage.d.ts +2 -0
- package/dist/botlit/pages/MCPServersPage.js +54 -55
- package/dist/botlit/pages/MCPServersPage.js.map +1 -1
- package/dist/botlit/pages/PoliciesPage.d.ts +2 -0
- package/dist/botlit/pages/PoliciesPage.js +25 -26
- package/dist/botlit/pages/PoliciesPage.js.map +1 -1
- package/dist/botlit/pages/PolicyDetailPage.d.ts +6 -0
- package/dist/botlit/pages/PolicyDetailPage.js +257 -259
- package/dist/botlit/pages/PolicyDetailPage.js.map +1 -1
- package/dist/botlit/pages/PromptStudioPage.d.ts +2 -0
- package/dist/botlit/pages/PromptStudioPage.js +35 -35
- package/dist/botlit/pages/PromptStudioPage.js.map +1 -1
- package/dist/botlit/pages/PromptTemplateDetailPage.d.ts +6 -0
- package/dist/botlit/pages/PromptTemplateDetailPage.js +363 -362
- package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -1
- package/dist/botlit/pages/PromptTemplatesPage.d.ts +2 -0
- package/dist/botlit/pages/PromptTemplatesPage.js +26 -27
- package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfileDetailPage.d.ts +6 -0
- package/dist/botlit/pages/RetrievalProfileDetailPage.js +150 -158
- package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -1
- package/dist/botlit/pages/RetrievalProfilesPage.d.ts +2 -0
- package/dist/botlit/pages/RetrievalProfilesPage.js +24 -25
- package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
- package/dist/botlit/pages/SettingsPage.d.ts +2 -0
- package/dist/botlit/pages/SettingsPage.js +124 -125
- package/dist/botlit/pages/SettingsPage.js.map +1 -1
- package/dist/botlit/pages/SkillDetailPage.d.ts +6 -0
- package/dist/botlit/pages/SkillDetailPage.js +216 -217
- package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
- package/dist/botlit/pages/SkillsPage.d.ts +2 -0
- package/dist/botlit/pages/SkillsPage.js +24 -25
- package/dist/botlit/pages/SkillsPage.js.map +1 -1
- package/dist/botlit/pages/StorePackageDetailPage.d.ts +2 -0
- package/dist/botlit/pages/StorePackageDetailPage.js +38 -39
- package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
- package/dist/botlit/pages/StorePage.d.ts +2 -0
- package/dist/botlit/pages/StorePage.js +135 -136
- package/dist/botlit/pages/StorePage.js.map +1 -1
- package/dist/botlit/pages/index.d.ts +39 -0
- package/dist/botlit/permissions/PermissionRequired.d.ts +20 -0
- package/dist/botlit/permissions/PermissionRequired.js +10 -11
- package/dist/botlit/permissions/PermissionRequired.js.map +1 -1
- package/dist/botlit/permissions/botmanorPermissions.d.ts +82 -0
- package/dist/botlit/permissions/botmanorPermissions.js +1 -2
- package/dist/botlit/permissions/botmanorPermissions.js.map +1 -1
- package/dist/botlit/permissions/index.d.ts +7 -0
- package/dist/botlit/permissions/index.js +4 -3
- package/dist/botlit/permissions/useBotmanorPermissions.d.ts +41 -0
- package/dist/botlit/permissions/useBotmanorPermissions.js +1 -2
- package/dist/botlit/permissions/useBotmanorPermissions.js.map +1 -1
- package/dist/botlit/providers/BotlitProvider.d.ts +14 -0
- package/dist/botlit/providers/BotlitProvider.js +3 -3
- package/dist/botlit/providers/BotlitProvider.js.map +1 -1
- package/dist/botlit/store/botlitStore.d.ts +85 -0
- package/dist/botlit/store/botlitStore.js +1 -2
- package/dist/botlit/store/botlitStore.js.map +1 -1
- package/dist/botlit/store/renamedKeyStorage.d.ts +13 -0
- package/dist/botlit/store/renamedKeyStorage.js +1 -2
- package/dist/botlit/store/renamedKeyStorage.js.map +1 -1
- package/dist/botlit/types/index.d.ts +1008 -0
- package/dist/botlit/utils/cn.d.ts +2 -0
- package/dist/botlit/utils/cn.js +1 -2
- package/dist/botlit/utils/cn.js.map +1 -1
- package/dist/botlit/utils/embedding-models.d.ts +9 -0
- package/dist/botlit/utils/embedding-models.js +1 -2
- package/dist/botlit/utils/embedding-models.js.map +1 -1
- package/dist/botlit/utils/errors.d.ts +19 -0
- package/dist/botlit/utils/errors.js +1 -2
- package/dist/botlit/utils/errors.js.map +1 -1
- package/dist/botlit/utils/formatters.d.ts +38 -0
- package/dist/botlit/utils/formatters.js +0 -1
- package/dist/botlit/utils/formatters.js.map +1 -1
- package/dist/botlit/utils/navigation.d.ts +19 -0
- package/dist/botlit/utils/navigation.js +1 -2
- package/dist/botlit/utils/navigation.js.map +1 -1
- package/dist/botlit/utils/policyConfig.d.ts +68 -0
- package/dist/botlit/utils/policyConfig.js +2 -3
- package/dist/botlit/utils/policyConfig.js.map +1 -1
- package/dist/botlit/utils/unions.d.ts +25 -0
- package/dist/botlit/utils/unions.js +1 -2
- package/dist/botlit/utils/unions.js.map +1 -1
- package/dist/dev/App.d.ts +2 -0
- package/dist/dev/main.d.ts +0 -0
- package/dist/generated/global-operations.d.ts +197 -0
- package/dist/generated/global-operations.js +1 -2
- package/dist/generated/global-operations.js.map +1 -1
- package/dist/generated/global-types.d.ts +27678 -0
- package/dist/generated/global-types.js +1 -2
- package/dist/generated/global-types.js.map +1 -1
- package/dist/generated/wspace-operations.d.ts +5489 -0
- package/dist/generated/wspace-operations.js +64 -60
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.d.ts +152017 -0
- package/dist/generated/wspace-types.js +1 -2
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/shared/hooks/useTr.d.ts +16 -0
- package/dist/shared/hooks/useTr.js +1 -2
- package/dist/shared/hooks/useTr.js.map +1 -1
- package/dist/stories/Badge.stories.d.ts +11 -0
- package/dist/stories/Button.stories.d.ts +13 -0
- package/dist/stories/EmptyState.stories.d.ts +8 -0
- package/dist/stories/StatusBadge.stories.d.ts +9 -0
- package/dist/test/fixtures.d.ts +39 -0
- package/dist/test/happydom.d.ts +1 -0
- package/dist/test/renderPage.d.ts +18 -0
- package/dist/test/setup.d.ts +9 -0
- package/dist/utils/nativeBridge.d.ts +2 -0
- package/dist/utils/nativeBridge.js +1 -2
- package/package.json +87 -60
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cn as e } from "../utils/cn.js";
|
|
2
2
|
import { GlassCard as t } from "@burdenoff/fe-libs/ui";
|
|
3
3
|
import { jsx as n } from "react/jsx-runtime";
|
|
4
|
-
|
|
4
|
+
// src/botlit/components/Card.tsx
|
|
5
5
|
var r = ({ className: r, children: i, treatment: a = "plain", glow: o = !1, ...s }) => /* @__PURE__ */ n(t, {
|
|
6
6
|
treatment: a,
|
|
7
7
|
glow: o,
|
|
@@ -25,7 +25,6 @@ var r = ({ className: r, children: i, treatment: a = "plain", glow: o = !1, ...s
|
|
|
25
25
|
...i,
|
|
26
26
|
children: r
|
|
27
27
|
});
|
|
28
|
-
//#endregion
|
|
29
28
|
export { r as Card, s as CardContent, o as CardDescription, i as CardHeader, a as CardTitle };
|
|
30
29
|
|
|
31
30
|
//# sourceMappingURL=Card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card.js","names":[],"sources":["../../../src/botlit/components/Card.tsx"],"sourcesContent":["/**\n * Card Components\n * @module botlit/components\n *\n * Boff UI 2.0: the base Card now renders on the fe-libs `GlassCard` glass\n * language (seam border + soft pop shadow + no-movement hover). The original\n * API (className passthrough, sub-parts) is preserved 1:1; a new optional\n * `treatment`/`glow` prop opts a surface into the richer glass/metric/insight\n * treatments. Hover NEVER translates or scales — it only intensifies the\n * shadow/border per the no-movement policy.\n */\n\nimport type { FC, ReactNode, HTMLAttributes } from 'react';\nimport { GlassCard, type GlassCardProps } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface CardProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /** Boff UI 2.0 glass treatment. Defaults to `plain`. */\n treatment?: GlassCardProps['treatment'];\n /** Featured/active accent glow (no movement). */\n glow?: boolean;\n}\n\nexport const Card: FC<CardProps> = ({\n className,\n children,\n treatment = 'plain',\n glow = false,\n ...props\n}) => {\n return (\n <GlassCard\n treatment={treatment}\n glow={glow}\n className={cn('rounded-card', className)}\n {...props}\n >\n {children}\n </GlassCard>\n );\n};\n\nexport const CardHeader: FC<HTMLAttributes<HTMLDivElement>> = ({\n className,\n children,\n ...props\n}) => {\n return (\n <div className={cn('flex flex-col space-y-1.5 p-6', className)} {...props}>\n {children}\n </div>\n );\n};\n\nexport const CardTitle: FC<HTMLAttributes<HTMLHeadingElement>> = ({\n className,\n children,\n ...props\n}) => {\n return (\n <h3 className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props}>\n {children}\n </h3>\n );\n};\n\nexport const CardDescription: FC<HTMLAttributes<HTMLParagraphElement>> = ({\n className,\n children,\n ...props\n}) => {\n return (\n <p className={cn('text-sm text-text-secondary', className)} {...props}>\n {children}\n </p>\n );\n};\n\nexport const CardContent: FC<HTMLAttributes<HTMLDivElement>> = ({\n className,\n children,\n ...props\n}) => {\n return (\n <div className={cn('p-6 pt-0', className)} {...props}>\n {children}\n </div>\n );\n};\n\nexport const CardFooter: FC<HTMLAttributes<HTMLDivElement>> = ({\n className,\n children,\n ...props\n}) => {\n return (\n <div className={cn('flex items-center p-6 pt-0', className)} {...props}>\n {children}\n </div>\n );\n};\n"],"mappings":";;;;AAwBA,
|
|
1
|
+
{"version":3,"file":"Card.js","names":["Card","props","GlassCard","cn","className","CardHeader","CardTitle","CardDescription","CardContent"],"sources":["../../../src/botlit/components/Card.tsx"],"sourcesContent":["/**\n * Card Components\n * @module botlit/components\n *\n * Boff UI 2.0: the base Card now renders on the fe-libs `GlassCard` glass\n * language (seam border + soft pop shadow + no-movement hover). The original\n * API (className passthrough, sub-parts) is preserved 1:1; a new optional\n * `treatment`/`glow` prop opts a surface into the richer glass/metric/insight\n * treatments. Hover NEVER translates or scales — it only intensifies the\n * shadow/border per the no-movement policy.\n */\n\nimport type { FC, ReactNode, HTMLAttributes } from 'react';\nimport { GlassCard, type GlassCardProps } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface CardProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /** Boff UI 2.0 glass treatment. Defaults to `plain`. */\n treatment?: GlassCardProps['treatment'];\n /** Featured/active accent glow (no movement). */\n glow?: boolean;\n}\n\nexport const Card: FC<CardProps> = ({\n className,\n children,\n treatment = 'plain',\n glow = false,\n ...props\n}) => {\n return (\n <GlassCard\n treatment={treatment}\n glow={glow}\n className={cn('rounded-card', className)}\n {...props}\n >\n {children}\n </GlassCard>\n );\n};\n\nexport const CardHeader: FC<HTMLAttributes<HTMLDivElement>> = ({\n className,\n children,\n ...props\n}) => {\n return (\n <div className={cn('flex flex-col space-y-1.5 p-6', className)} {...props}>\n {children}\n </div>\n );\n};\n\nexport const CardTitle: FC<HTMLAttributes<HTMLHeadingElement>> = ({\n className,\n children,\n ...props\n}) => {\n return (\n <h3 className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props}>\n {children}\n </h3>\n );\n};\n\nexport const CardDescription: FC<HTMLAttributes<HTMLParagraphElement>> = ({\n className,\n children,\n ...props\n}) => {\n return (\n <p className={cn('text-sm text-text-secondary', className)} {...props}>\n {children}\n </p>\n );\n};\n\nexport const CardContent: FC<HTMLAttributes<HTMLDivElement>> = ({\n className,\n children,\n ...props\n}) => {\n return (\n <div className={cn('p-6 pt-0', className)} {...props}>\n {children}\n </div>\n );\n};\n\nexport const CardFooter: FC<HTMLAttributes<HTMLDivElement>> = ({\n className,\n children,\n ...props\n}) => {\n return (\n <div className={cn('flex items-center p-6 pt-0', className)} {...props}>\n {children}\n </div>\n );\n};\n"],"mappings":";;;;AAwBA,IAAaA,KAAuB,EAClC,cACA,aACA,eAAY,SACZ,UAAO,IACP,GAAGC,QAGD,kBAACC,GAAD;CACa;CACL;CACN,WAAWC,EAAG,gBAAgBC,CAAS;CACvC,GAAIH;CAEH;AACQ,CAAA,GAIFI,KAAkD,EAC7D,cACA,aACA,GAAGJ,QAGD,kBAAC,OAAD;CAAK,WAAWE,EAAG,iCAAiCC,CAAS;CAAG,GAAIH;CACjE;AACE,CAAA,GAIIK,KAAqD,EAChE,cACA,aACA,GAAGL,QAGD,kBAAC,MAAD;CAAI,WAAWE,EAAG,qDAAqDC,CAAS;CAAG,GAAIH;CACpF;AACC,CAAA,GAIKM,KAA6D,EACxE,cACA,aACA,GAAGN,QAGD,kBAAC,KAAD;CAAG,WAAWE,EAAG,+BAA+BC,CAAS;CAAG,GAAIH;CAC7D;AACA,CAAA,GAIMO,KAAmD,EAC9D,cACA,aACA,GAAGP,QAGD,kBAAC,OAAD;CAAK,WAAWE,EAAG,YAAYC,CAAS;CAAG,GAAIH;CAC5C;AACE,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { FC, ReactNode } from 'react';
|
|
2
|
+
import { GlobalChannelData } from '../hooks/useUserPlatformConnection';
|
|
3
|
+
interface ChannelSelectorSheetProps {
|
|
4
|
+
/** Controls visibility of the sheet */
|
|
5
|
+
open: boolean;
|
|
6
|
+
/** Callback when sheet is closed */
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
/** Callback when a channel is selected */
|
|
9
|
+
onSelectChannel: (channelId: string, platform: string) => void;
|
|
10
|
+
/** Available channels to display (already filtered by backend) */
|
|
11
|
+
availableChannels: GlobalChannelData[];
|
|
12
|
+
/** Platform icons mapping */
|
|
13
|
+
platformIcons: Record<string, ReactNode>;
|
|
14
|
+
/** Platform metadata mapping */
|
|
15
|
+
platformMeta: Record<string, {
|
|
16
|
+
label: string;
|
|
17
|
+
badgeClass: string;
|
|
18
|
+
accentBg: string;
|
|
19
|
+
accentText: string;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
export declare const ChannelSelectorSheet: FC<ChannelSelectorSheetProps>;
|
|
23
|
+
export {};
|
|
@@ -3,7 +3,7 @@ import { Badge as t } from "./Badge.js";
|
|
|
3
3
|
import { useEffect as n } from "react";
|
|
4
4
|
import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
5
|
import { X as o } from "lucide-react";
|
|
6
|
-
|
|
6
|
+
// src/botlit/components/ChannelSelectorSheet.tsx
|
|
7
7
|
var s = ({ open: s, onClose: c, onSelectChannel: l, availableChannels: u, platformIcons: d, platformMeta: f }) => (n(() => (s ? document.body.style.overflow = "hidden" : document.body.style.overflow = "", () => {
|
|
8
8
|
document.body.style.overflow = "";
|
|
9
9
|
}), [s]), n(() => {
|
|
@@ -124,7 +124,6 @@ var s = ({ open: s, onClose: c, onSelectChannel: l, availableChannels: u, platfo
|
|
|
124
124
|
})
|
|
125
125
|
]
|
|
126
126
|
})] }) : null);
|
|
127
|
-
//#endregion
|
|
128
127
|
export { s as ChannelSelectorSheet };
|
|
129
128
|
|
|
130
129
|
//# sourceMappingURL=ChannelSelectorSheet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelSelectorSheet.js","names":[],"sources":["../../../src/botlit/components/ChannelSelectorSheet.tsx"],"sourcesContent":["/**\n * ChannelSelectorSheet\n * @module botlit/components\n *\n * A slide-in sheet component that displays available communication channels\n * for selection when setting up bot integrations.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { Button } from './Button';\nimport { Badge } from './Badge';\nimport type { GlobalChannelData } from '../hooks/useUserPlatformConnection';\n\ninterface ChannelSelectorSheetProps {\n /** Controls visibility of the sheet */\n open: boolean;\n /** Callback when sheet is closed */\n onClose: () => void;\n /** Callback when a channel is selected */\n onSelectChannel: (channelId: string, platform: string) => void;\n /** Available channels to display (already filtered by backend) */\n availableChannels: GlobalChannelData[];\n /** Platform icons mapping */\n platformIcons: Record<string, ReactNode>;\n /** Platform metadata mapping */\n platformMeta: Record<\n string,\n { label: string; badgeClass: string; accentBg: string; accentText: string }\n >;\n}\n\nexport const ChannelSelectorSheet: FC<ChannelSelectorSheetProps> = ({\n open,\n onClose,\n onSelectChannel,\n availableChannels,\n platformIcons,\n platformMeta,\n}) => {\n // Lock body scroll when sheet is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [open]);\n\n // Close on Escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && open) {\n onClose();\n }\n };\n window.addEventListener('keydown', handleEscape);\n return () => window.removeEventListener('keydown', handleEscape);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-black/50 z-40 transition-opacity duration-300\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Sheet */}\n <div\n className=\"fixed inset-y-0 right-0 z-50 w-full sm:max-w-md bg-bg-surface shadow-xl transform transition-transform duration-300 ease-out flex flex-col\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"channel-selector-title\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-border-subtle shrink-0\">\n <div>\n <h2 id=\"channel-selector-title\" className=\"text-lg font-semibold\">\n Select a Channel\n </h2>\n <p className=\"text-sm text-text-secondary mt-0.5\">\n Choose a platform to connect to your bot\n </p>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClose}\n className=\"shrink-0\"\n aria-label=\"Close\"\n >\n <X size={18} />\n </Button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n {availableChannels.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <p className=\"text-sm text-text-secondary\">No channels available to configure.</p>\n <p className=\"text-xs text-text-secondary mt-2\">\n All available channels have already been connected to this bot.\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {availableChannels.map((channel) => {\n const platform = channel.platform as string;\n const meta = platformMeta[platform] || {\n label: platform,\n badgeClass: 'bg-gray-100 text-gray-700',\n accentBg: 'bg-gray-500/10',\n accentText: 'text-gray-600',\n };\n const icon = platformIcons[platform];\n\n return (\n <button\n key={channel.id}\n onClick={() => {\n onSelectChannel(channel.id, platform);\n onClose();\n }}\n className=\"w-full text-left p-4 rounded-lg border border-border-subtle bg-bg-surface hover:bg-bg-sunken/50 transition-colors focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] focus:ring-offset-2\"\n >\n <div className=\"flex items-start gap-3\">\n {/* Icon */}\n <div className={`p-2 rounded-md ${meta.accentBg} shrink-0`}>\n <span className={meta.accentText}>{icon}</span>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <h3 className=\"font-medium text-sm\">{channel.name}</h3>\n <Badge className={`text-xs ${meta.badgeClass}`}>{meta.label}</Badge>\n </div>\n {channel.description && (\n <p className=\"text-xs text-text-secondary line-clamp-2\">\n {channel.description}\n </p>\n )}\n </div>\n\n {/* Arrow indicator */}\n <div className=\"shrink-0 self-center text-text-secondary\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 12L10 8L6 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-4 border-t border-border-subtle shrink-0\">\n <Button variant=\"outline\" onClick={onClose} className=\"w-full\">\n Cancel\n </Button>\n </div>\n </div>\n </>\n );\n};\n"],"mappings":";;;;;;AAiCA,
|
|
1
|
+
{"version":3,"file":"ChannelSelectorSheet.js","names":["_Fragment","ChannelSelectorSheet","useEffect","open","handleEscape","onClose","Fragment","Button","X","availableChannels","platform","channel","meta","platformMeta","icon","platformIcons","onSelectChannel","Badge"],"sources":["../../../src/botlit/components/ChannelSelectorSheet.tsx"],"sourcesContent":["/**\n * ChannelSelectorSheet\n * @module botlit/components\n *\n * A slide-in sheet component that displays available communication channels\n * for selection when setting up bot integrations.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { Button } from './Button';\nimport { Badge } from './Badge';\nimport type { GlobalChannelData } from '../hooks/useUserPlatformConnection';\n\ninterface ChannelSelectorSheetProps {\n /** Controls visibility of the sheet */\n open: boolean;\n /** Callback when sheet is closed */\n onClose: () => void;\n /** Callback when a channel is selected */\n onSelectChannel: (channelId: string, platform: string) => void;\n /** Available channels to display (already filtered by backend) */\n availableChannels: GlobalChannelData[];\n /** Platform icons mapping */\n platformIcons: Record<string, ReactNode>;\n /** Platform metadata mapping */\n platformMeta: Record<\n string,\n { label: string; badgeClass: string; accentBg: string; accentText: string }\n >;\n}\n\nexport const ChannelSelectorSheet: FC<ChannelSelectorSheetProps> = ({\n open,\n onClose,\n onSelectChannel,\n availableChannels,\n platformIcons,\n platformMeta,\n}) => {\n // Lock body scroll when sheet is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [open]);\n\n // Close on Escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && open) {\n onClose();\n }\n };\n window.addEventListener('keydown', handleEscape);\n return () => window.removeEventListener('keydown', handleEscape);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-black/50 z-40 transition-opacity duration-300\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Sheet */}\n <div\n className=\"fixed inset-y-0 right-0 z-50 w-full sm:max-w-md bg-bg-surface shadow-xl transform transition-transform duration-300 ease-out flex flex-col\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"channel-selector-title\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-border-subtle shrink-0\">\n <div>\n <h2 id=\"channel-selector-title\" className=\"text-lg font-semibold\">\n Select a Channel\n </h2>\n <p className=\"text-sm text-text-secondary mt-0.5\">\n Choose a platform to connect to your bot\n </p>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClose}\n className=\"shrink-0\"\n aria-label=\"Close\"\n >\n <X size={18} />\n </Button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n {availableChannels.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <p className=\"text-sm text-text-secondary\">No channels available to configure.</p>\n <p className=\"text-xs text-text-secondary mt-2\">\n All available channels have already been connected to this bot.\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {availableChannels.map((channel) => {\n const platform = channel.platform as string;\n const meta = platformMeta[platform] || {\n label: platform,\n badgeClass: 'bg-gray-100 text-gray-700',\n accentBg: 'bg-gray-500/10',\n accentText: 'text-gray-600',\n };\n const icon = platformIcons[platform];\n\n return (\n <button\n key={channel.id}\n onClick={() => {\n onSelectChannel(channel.id, platform);\n onClose();\n }}\n className=\"w-full text-left p-4 rounded-lg border border-border-subtle bg-bg-surface hover:bg-bg-sunken/50 transition-colors focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] focus:ring-offset-2\"\n >\n <div className=\"flex items-start gap-3\">\n {/* Icon */}\n <div className={`p-2 rounded-md ${meta.accentBg} shrink-0`}>\n <span className={meta.accentText}>{icon}</span>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <h3 className=\"font-medium text-sm\">{channel.name}</h3>\n <Badge className={`text-xs ${meta.badgeClass}`}>{meta.label}</Badge>\n </div>\n {channel.description && (\n <p className=\"text-xs text-text-secondary line-clamp-2\">\n {channel.description}\n </p>\n )}\n </div>\n\n {/* Arrow indicator */}\n <div className=\"shrink-0 self-center text-text-secondary\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 12L10 8L6 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-4 border-t border-border-subtle shrink-0\">\n <Button variant=\"outline\" onClick={onClose} className=\"w-full\">\n Cancel\n </Button>\n </div>\n </div>\n </>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FC, ReactNode } from 'react';
|
|
2
|
+
interface EmptyStateProps {
|
|
3
|
+
icon?: ReactNode;
|
|
4
|
+
/** Boff UI 2.0 illustration name → /illustrations/<name>.webp */
|
|
5
|
+
illustration?: string;
|
|
6
|
+
title: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
action?: ReactNode;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const EmptyState: FC<EmptyStateProps>;
|
|
12
|
+
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cn as e } from "../utils/cn.js";
|
|
2
2
|
import { IllustratedEmptyState as t } from "@burdenoff/fe-libs/ui";
|
|
3
3
|
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
-
|
|
4
|
+
// src/botlit/components/EmptyState.tsx
|
|
5
5
|
var i = ({ icon: i, illustration: a, title: o, description: s, action: c, className: l }) => a ? /* @__PURE__ */ n(t, {
|
|
6
6
|
illustration: a,
|
|
7
7
|
title: o,
|
|
@@ -29,7 +29,6 @@ var i = ({ icon: i, illustration: a, title: o, description: s, action: c, classN
|
|
|
29
29
|
})
|
|
30
30
|
]
|
|
31
31
|
});
|
|
32
|
-
//#endregion
|
|
33
32
|
export { i as EmptyState };
|
|
34
33
|
|
|
35
34
|
//# sourceMappingURL=EmptyState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/botlit/components/EmptyState.tsx"],"sourcesContent":["/**\n * Empty State Component\n * @module botlit/components\n *\n * Boff UI 2.0: when an `illustration` name is supplied, this renders the\n * on-brand fe-libs `IllustratedEmptyState` (host serves /illustrations/<name>.webp).\n * The legacy `icon`-based layout is preserved as a graceful fallback so existing\n * call sites keep working unchanged.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface EmptyStateProps {\n icon?: ReactNode;\n /** Boff UI 2.0 illustration name → /illustrations/<name>.webp */\n illustration?: string;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}\n\nexport const EmptyState: FC<EmptyStateProps> = ({\n icon,\n illustration,\n title,\n description,\n action,\n className,\n}) => {\n if (illustration) {\n return (\n <IllustratedEmptyState\n illustration={illustration}\n title={title}\n description={description}\n action={action}\n className={className}\n />\n );\n }\n\n return (\n <div\n className={cn('flex flex-col items-center justify-center py-12 px-4 text-center', className)}\n >\n {icon && <div className=\"mb-4 text-text-secondary opacity-50\">{icon}</div>}\n <h3 className=\"text-lg font-medium text-text-primary\">{title}</h3>\n {description && <p className=\"mt-2 text-sm text-text-secondary max-w-sm\">{description}</p>}\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n};\n"],"mappings":";;;;AAwBA,
|
|
1
|
+
{"version":3,"file":"EmptyState.js","names":["EmptyState","illustration","IllustratedEmptyState","cn","className","icon","title","description","action"],"sources":["../../../src/botlit/components/EmptyState.tsx"],"sourcesContent":["/**\n * Empty State Component\n * @module botlit/components\n *\n * Boff UI 2.0: when an `illustration` name is supplied, this renders the\n * on-brand fe-libs `IllustratedEmptyState` (host serves /illustrations/<name>.webp).\n * The legacy `icon`-based layout is preserved as a graceful fallback so existing\n * call sites keep working unchanged.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface EmptyStateProps {\n icon?: ReactNode;\n /** Boff UI 2.0 illustration name → /illustrations/<name>.webp */\n illustration?: string;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}\n\nexport const EmptyState: FC<EmptyStateProps> = ({\n icon,\n illustration,\n title,\n description,\n action,\n className,\n}) => {\n if (illustration) {\n return (\n <IllustratedEmptyState\n illustration={illustration}\n title={title}\n description={description}\n action={action}\n className={className}\n />\n );\n }\n\n return (\n <div\n className={cn('flex flex-col items-center justify-center py-12 px-4 text-center', className)}\n >\n {icon && <div className=\"mb-4 text-text-secondary opacity-50\">{icon}</div>}\n <h3 className=\"text-lg font-medium text-text-primary\">{title}</h3>\n {description && <p className=\"mt-2 text-sm text-text-secondary max-w-sm\">{description}</p>}\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n};\n"],"mappings":";;;;AAwBA,IAAaA,KAAmC,EAC9C,SACA,iBACA,UACA,gBACA,WACA,mBAEIC,IAEA,kBAACC,GAAD;CACgB;CACP;CACM;CACL;CACG;AACZ,CAAA,IAKH,kBAAC,OAAD;CACE,WAAWC,EAAG,oEAAoEC,CAAS;CAD7F,UAAA;EAGGC,KAAQ,kBAAC,OAAD;GAAK,WAAU;GAAuC,UAAAA;EAAU,CAAA;EACzE,kBAAC,MAAD;GAAI,WAAU;GAAyC,UAAAC;EAAU,CAAA;EAChEC,KAAe,kBAAC,KAAD;GAAG,WAAU;GAA6C,UAAAA;EAAe,CAAA;EACxFC,KAAU,kBAAC,OAAD;GAAK,WAAU;GAAQ,UAAAA;EAAY,CAAA;CAC3C"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
interface ErrorStateProps {
|
|
3
|
+
/** What failed to load, e.g. "agents". Used to build the default title. */
|
|
4
|
+
resource: string;
|
|
5
|
+
error?: Error;
|
|
6
|
+
onRetry?: () => void;
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const ErrorState: FC<ErrorStateProps>;
|
|
10
|
+
export {};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { useTr as e } from "../../shared/hooks/useTr.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { Button as t } from "./Button.js";
|
|
3
|
+
import { cn as n } from "../utils/cn.js";
|
|
4
4
|
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
5
|
import { AlertTriangle as a, RefreshCw as o } from "lucide-react";
|
|
6
|
-
|
|
6
|
+
// src/botlit/components/ErrorState.tsx
|
|
7
7
|
var s = ({ resource: s, error: c, onRetry: l, className: u }) => {
|
|
8
8
|
let d = e();
|
|
9
9
|
return /* @__PURE__ */ i("div", {
|
|
10
10
|
role: "alert",
|
|
11
|
-
className:
|
|
11
|
+
className: n("flex flex-col items-center justify-center gap-3 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-12 text-center", u),
|
|
12
12
|
children: [
|
|
13
13
|
/* @__PURE__ */ r(a, {
|
|
14
14
|
size: 28,
|
|
@@ -21,7 +21,7 @@ var s = ({ resource: s, error: c, onRetry: l, className: u }) => {
|
|
|
21
21
|
className: "mt-2 max-w-md text-sm text-text-secondary",
|
|
22
22
|
children: c?.message ?? d("error.loadDescription", "The request to the workspace gateway failed.")
|
|
23
23
|
})] }),
|
|
24
|
-
l && /* @__PURE__ */ r(
|
|
24
|
+
l && /* @__PURE__ */ r(t, {
|
|
25
25
|
variant: "outline",
|
|
26
26
|
size: "sm",
|
|
27
27
|
leftIcon: /* @__PURE__ */ r(o, { size: 14 }),
|
|
@@ -31,7 +31,6 @@ var s = ({ resource: s, error: c, onRetry: l, className: u }) => {
|
|
|
31
31
|
]
|
|
32
32
|
});
|
|
33
33
|
};
|
|
34
|
-
//#endregion
|
|
35
34
|
export { s as ErrorState };
|
|
36
35
|
|
|
37
36
|
//# sourceMappingURL=ErrorState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorState.js","names":[],"sources":["../../../src/botlit/components/ErrorState.tsx"],"sourcesContent":["/**\n * Error State Component\n * @module botlit/components\n *\n * Rendered when a gateway request FAILED. This is deliberately distinct from\n * `EmptyState` — \"we asked and there is nothing yet\" and \"we could not ask\"\n * are different situations and must not look the same to the user.\n */\n\nimport type { FC } from 'react';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { Button } from './Button';\nimport { cn } from '../utils/cn';\n\ninterface ErrorStateProps {\n /** What failed to load, e.g. \"agents\". Used to build the default title. */\n resource: string;\n error?: Error;\n onRetry?: () => void;\n className?: string;\n}\n\nexport const ErrorState: FC<ErrorStateProps> = ({ resource, error, onRetry, className }) => {\n const t = useTr();\n return (\n <div\n role=\"alert\"\n className={cn(\n 'flex flex-col items-center justify-center gap-3 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-12 text-center',\n className\n )}\n >\n <AlertTriangle size={28} className=\"text-status-error-text\" />\n <div>\n <h3 className=\"text-lg font-medium text-text-primary\">\n {t('error.loadTitle', \"Couldn't load {{resource}}\", { resource })}\n </h3>\n <p className=\"mt-2 max-w-md text-sm text-text-secondary\">\n {error?.message ??\n t('error.loadDescription', 'The request to the workspace gateway failed.')}\n </p>\n </div>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" leftIcon={<RefreshCw size={14} />} onClick={onRetry}>\n {t('common.tryAgain', 'Try again')}\n </Button>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;AAuBA,
|
|
1
|
+
{"version":3,"file":"ErrorState.js","names":["ErrorState","t","useTr","cn","className","AlertTriangle","error","onRetry","Button","RefreshCw"],"sources":["../../../src/botlit/components/ErrorState.tsx"],"sourcesContent":["/**\n * Error State Component\n * @module botlit/components\n *\n * Rendered when a gateway request FAILED. This is deliberately distinct from\n * `EmptyState` — \"we asked and there is nothing yet\" and \"we could not ask\"\n * are different situations and must not look the same to the user.\n */\n\nimport type { FC } from 'react';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { Button } from './Button';\nimport { cn } from '../utils/cn';\n\ninterface ErrorStateProps {\n /** What failed to load, e.g. \"agents\". Used to build the default title. */\n resource: string;\n error?: Error;\n onRetry?: () => void;\n className?: string;\n}\n\nexport const ErrorState: FC<ErrorStateProps> = ({ resource, error, onRetry, className }) => {\n const t = useTr();\n return (\n <div\n role=\"alert\"\n className={cn(\n 'flex flex-col items-center justify-center gap-3 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-12 text-center',\n className\n )}\n >\n <AlertTriangle size={28} className=\"text-status-error-text\" />\n <div>\n <h3 className=\"text-lg font-medium text-text-primary\">\n {t('error.loadTitle', \"Couldn't load {{resource}}\", { resource })}\n </h3>\n <p className=\"mt-2 max-w-md text-sm text-text-secondary\">\n {error?.message ??\n t('error.loadDescription', 'The request to the workspace gateway failed.')}\n </p>\n </div>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" leftIcon={<RefreshCw size={14} />} onClick={onRetry}>\n {t('common.tryAgain', 'Try again')}\n </Button>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;AAuBA,IAAaA,KAAmC,EAAE,aAAU,UAAO,YAAS,mBAAgB;CAC1F,IAAMC,IAAIC,EAAM;CAChB,OACE,kBAAC,OAAD;EACE,MAAK;EACL,WAAWC,EACT,iJACAC,CACF;EALF,UAAA;GAOE,kBAACC,GAAD;IAAe,MAAM;IAAI,WAAU;GAA0B,CAAA;GAC7D,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;IACX,UAAAJ,EAAE,mBAAmB,8BAA8B,EAAE,YAAS,CAAC;GAC9D,CAAA,GACJ,kBAAC,KAAD;IAAG,WAAU;IACV,UAAAK,GAAO,WACNL,EAAE,yBAAyB,8CAA8C;GAC1E,CAAA,CACA,EAAA,CAAA;GACJM,KACC,kBAACC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,UAAU,kBAACC,GAAD,EAAW,MAAM,GAAK,CAAA;IAAG,SAASF;IAC7E,UAAAN,EAAE,mBAAmB,WAAW;GAC3B,CAAA;EAEP;;AAET"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { FC, InputHTMLAttributes, TextareaHTMLAttributes } from 'react';
|
|
2
|
+
interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
|
|
3
|
+
error?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const Input: import('react').ForwardRefExoticComponent<InputProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
6
|
+
interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
|
|
7
|
+
error?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const Textarea: import('react').ForwardRefExoticComponent<TextareaProps & import('react').RefAttributes<HTMLTextAreaElement>>;
|
|
10
|
+
interface LabelProps {
|
|
11
|
+
children: React.ReactNode;
|
|
12
|
+
htmlFor?: string;
|
|
13
|
+
required?: boolean;
|
|
14
|
+
className?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const Label: FC<LabelProps>;
|
|
17
|
+
interface FormFieldProps {
|
|
18
|
+
label: string;
|
|
19
|
+
htmlFor?: string;
|
|
20
|
+
required?: boolean;
|
|
21
|
+
error?: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
children: React.ReactNode;
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare const FormField: FC<FormFieldProps>;
|
|
27
|
+
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cn as e } from "../utils/cn.js";
|
|
2
2
|
import { forwardRef as t } from "react";
|
|
3
3
|
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
-
|
|
4
|
+
// src/botlit/components/Input.tsx
|
|
5
5
|
var i = t(({ className: t, type: i = "text", error: a, ...o }, s) => /* @__PURE__ */ r("div", {
|
|
6
6
|
className: "w-full",
|
|
7
7
|
children: [/* @__PURE__ */ n("input", {
|
|
@@ -53,7 +53,6 @@ var o = ({ children: t, htmlFor: i, required: a, className: o }) => /* @__PURE__
|
|
|
53
53
|
})
|
|
54
54
|
]
|
|
55
55
|
});
|
|
56
|
-
//#endregion
|
|
57
56
|
export { s as FormField, i as Input, o as Label, a as Textarea };
|
|
58
57
|
|
|
59
58
|
//# sourceMappingURL=Input.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.js","names":[],"sources":["../../../src/botlit/components/Input.tsx"],"sourcesContent":["/**\n * Input Components\n * @module botlit/components\n */\n\nimport type { FC, InputHTMLAttributes, TextareaHTMLAttributes } from 'react';\nimport { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n error?: string;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = 'text', error, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm',\n 'ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium',\n 'placeholder:text-text-secondary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-status-error-border focus-visible:ring-destructive',\n className\n )}\n ref={ref}\n {...props}\n />\n {error && <p className=\"mt-1 text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n\ninterface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: string;\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, error, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n <textarea\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm',\n 'ring-offset-background placeholder:text-text-secondary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-status-error-border focus-visible:ring-destructive',\n className\n )}\n ref={ref}\n {...props}\n />\n {error && <p className=\"mt-1 text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\ninterface LabelProps {\n children: React.ReactNode;\n htmlFor?: string;\n required?: boolean;\n className?: string;\n}\n\nexport const Label: FC<LabelProps> = ({ children, htmlFor, required, className }) => {\n return (\n <label\n htmlFor={htmlFor}\n className={cn(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n >\n {children}\n {required && <span className=\"text-status-error-text ml-1\">*</span>}\n </label>\n );\n};\n\ninterface FormFieldProps {\n label: string;\n htmlFor?: string;\n required?: boolean;\n error?: string;\n description?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const FormField: FC<FormFieldProps> = ({\n label,\n htmlFor,\n required,\n error,\n description,\n children,\n className,\n}) => {\n return (\n <div className={cn('space-y-2', className)}>\n <Label htmlFor={htmlFor} required={required}>\n {label}\n </Label>\n {children}\n {description && !error && <p className=\"text-xs text-text-secondary\">{description}</p>}\n {error && <p className=\"text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n};\n"],"mappings":";;;;AAaA,
|
|
1
|
+
{"version":3,"file":"Input.js","names":["Input","forwardRef","props","cn","error","className","Textarea","Label","children","required","FormField","label","description"],"sources":["../../../src/botlit/components/Input.tsx"],"sourcesContent":["/**\n * Input Components\n * @module botlit/components\n */\n\nimport type { FC, InputHTMLAttributes, TextareaHTMLAttributes } from 'react';\nimport { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n error?: string;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = 'text', error, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm',\n 'ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium',\n 'placeholder:text-text-secondary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-status-error-border focus-visible:ring-destructive',\n className\n )}\n ref={ref}\n {...props}\n />\n {error && <p className=\"mt-1 text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n\ninterface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: string;\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, error, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n <textarea\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm',\n 'ring-offset-background placeholder:text-text-secondary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-status-error-border focus-visible:ring-destructive',\n className\n )}\n ref={ref}\n {...props}\n />\n {error && <p className=\"mt-1 text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\ninterface LabelProps {\n children: React.ReactNode;\n htmlFor?: string;\n required?: boolean;\n className?: string;\n}\n\nexport const Label: FC<LabelProps> = ({ children, htmlFor, required, className }) => {\n return (\n <label\n htmlFor={htmlFor}\n className={cn(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n >\n {children}\n {required && <span className=\"text-status-error-text ml-1\">*</span>}\n </label>\n );\n};\n\ninterface FormFieldProps {\n label: string;\n htmlFor?: string;\n required?: boolean;\n error?: string;\n description?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const FormField: FC<FormFieldProps> = ({\n label,\n htmlFor,\n required,\n error,\n description,\n children,\n className,\n}) => {\n return (\n <div className={cn('space-y-2', className)}>\n <Label htmlFor={htmlFor} required={required}>\n {label}\n </Label>\n {children}\n {description && !error && <p className=\"text-xs text-text-secondary\">{description}</p>}\n {error && <p className=\"text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n};\n"],"mappings":";;;;AAaA,IAAaA,IAAQC,GAClB,EAAE,cAAW,UAAO,QAAQ,UAAO,GAAGC,KAAS,MAE5C,kBAAC,OAAD;CAAK,WAAU;CAAf,UAAA,CACE,kBAAC,SAAD;EACQ;EACN,WAAWC,EACT,4FACA,0FACA,mCACA,4HACA,mDACAC,KAAS,6DACTC,CACF;EACK;EACL,GAAIH;CACL,CAAA,GACAE,KAAS,kBAAC,KAAD;EAAG,WAAU;EAAuC,UAAAA;CAAS,CAAA,CACpE;A,EAGX;AAEA,EAAM,cAAc;AAMpB,IAAaE,IAAWL,GACrB,EAAE,cAAW,UAAO,GAAGC,KAAS,MAE7B,kBAAC,OAAD;CAAK,WAAU;CAAf,UAAA,CACE,kBAAC,YAAD;EACE,WAAWC,EACT,oGACA,0DACA,4HACA,mDACAC,KAAS,6DACTC,CACF;EACK;EACL,GAAIH;CACL,CAAA,GACAE,KAAS,kBAAC,KAAD;EAAG,WAAU;EAAuC,UAAAA;CAAS,CAAA,CACpE;A,EAGX;AAEA,EAAS,cAAc;AASvB,IAAaG,KAAyB,EAAE,aAAU,YAAS,aAAU,mBAEjE,kBAAC,SAAD;CACW;CACT,WAAWJ,EACT,8FACAE,CACF;CALF,UAAA,CAOGG,GACAC,KAAY,kBAAC,QAAD;EAAM,WAAU;EAA8B,UAAA;CAAO,CAAA,CAC7D;A,IAcEC,KAAiC,EAC5C,UACA,YACA,aACA,UACA,gBACA,aACA,mBAGE,kBAAC,OAAD;CAAK,WAAWP,EAAG,aAAaE,CAAS;CAAzC,UAAA;EACE,kBAACE,GAAD;GAAgB;GAAmB;GAChC,UAAAI;EACI,CAAA;EACNH;EACAI,KAAe,CAACR,KAAS,kBAAC,KAAD;GAAG,WAAU;GAA+B,UAAAQ;EAAe,CAAA;EACpFR,KAAS,kBAAC,KAAD;GAAG,WAAU;GAAkC,UAAAA;EAAS,CAAA;CAC/D"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { useKnowledgeSourceImports as e } from "../hooks/useKnowledgeSourceImports.js";
|
|
2
|
+
import { useBotlit as t } from "../providers/BotlitProvider.js";
|
|
3
|
+
import { Button as n } from "./Button.js";
|
|
4
4
|
import { useRef as r, useState as i } from "react";
|
|
5
5
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
-
|
|
7
|
-
function s({ knowledgeBaseId:
|
|
8
|
-
let { workspaceId: n, currentUser: r } =
|
|
9
|
-
return /* @__PURE__ */ a(c, { knowledgeBaseId:
|
|
6
|
+
// src/botlit/components/KnowledgeSourceImportPanel.tsx
|
|
7
|
+
function s({ knowledgeBaseId: e }) {
|
|
8
|
+
let { workspaceId: n, currentUser: r } = t();
|
|
9
|
+
return /* @__PURE__ */ a(c, { knowledgeBaseId: e }, `${n}:${r?.id}:${e}`);
|
|
10
10
|
}
|
|
11
|
-
function c({ knowledgeBaseId:
|
|
12
|
-
let s =
|
|
11
|
+
function c({ knowledgeBaseId: t }) {
|
|
12
|
+
let s = e(t), [c, l] = i("website"), [u, d] = i(""), [f, p] = i(""), [m, h] = i(""), g = r(null);
|
|
13
13
|
return /* @__PURE__ */ o("section", {
|
|
14
14
|
className: "space-y-4 rounded-lg border border-border-default p-5",
|
|
15
15
|
children: [
|
|
@@ -63,7 +63,7 @@ function c({ knowledgeBaseId: e }) {
|
|
|
63
63
|
className: "text-sm text-text-secondary",
|
|
64
64
|
children: "Website imports capture one static page without signing in. Cross-origin redirects and embedded documents are rejected. Text sources must fit within 240 KiB; split larger sources."
|
|
65
65
|
}),
|
|
66
|
-
/* @__PURE__ */ a(
|
|
66
|
+
/* @__PURE__ */ a(n, {
|
|
67
67
|
disabled: !u.trim() || !f.trim(),
|
|
68
68
|
isLoading: s.queue.isPending,
|
|
69
69
|
onClick: async () => {
|
|
@@ -108,7 +108,7 @@ function c({ knowledgeBaseId: e }) {
|
|
|
108
108
|
e.title,
|
|
109
109
|
" · ",
|
|
110
110
|
e.status.toLowerCase()
|
|
111
|
-
] }), e.status === "BLOCKED" && /* @__PURE__ */ a(
|
|
111
|
+
] }), e.status === "BLOCKED" && /* @__PURE__ */ a(n, {
|
|
112
112
|
variant: "outline",
|
|
113
113
|
isLoading: s.retry.isPending,
|
|
114
114
|
onClick: async () => {
|
|
@@ -121,7 +121,7 @@ function c({ knowledgeBaseId: e }) {
|
|
|
121
121
|
children: "Retry import"
|
|
122
122
|
})]
|
|
123
123
|
}, e.id)),
|
|
124
|
-
/* @__PURE__ */ a(
|
|
124
|
+
/* @__PURE__ */ a(n, {
|
|
125
125
|
variant: "outline",
|
|
126
126
|
onClick: () => void s.imports.refetch(),
|
|
127
127
|
children: "Refresh imports"
|
|
@@ -129,7 +129,6 @@ function c({ knowledgeBaseId: e }) {
|
|
|
129
129
|
]
|
|
130
130
|
});
|
|
131
131
|
}
|
|
132
|
-
//#endregion
|
|
133
132
|
export { s as KnowledgeSourceImportPanel };
|
|
134
133
|
|
|
135
134
|
//# sourceMappingURL=KnowledgeSourceImportPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KnowledgeSourceImportPanel.js","names":[],"sources":["../../../src/botlit/components/KnowledgeSourceImportPanel.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport { useKnowledgeSourceImports } from '../hooks/useKnowledgeSourceImports';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { Button } from './Button';\n\nexport function KnowledgeSourceImportPanel({ knowledgeBaseId }: { knowledgeBaseId: string }) {\n const { workspaceId, currentUser } = useBotlit();\n return (\n <ScopedImportPanel\n key={`${workspaceId}:${currentUser?.id}:${knowledgeBaseId}`}\n knowledgeBaseId={knowledgeBaseId}\n />\n );\n}\nfunction ScopedImportPanel({ knowledgeBaseId }: { knowledgeBaseId: string }) {\n const sources = useKnowledgeSourceImports(knowledgeBaseId);\n const [kind, setKind] = useState('website'),\n [title, setTitle] = useState(''),\n [value, setValue] = useState(''),\n [message, setMessage] = useState('');\n const pending = useRef<{ id: string; fingerprint: string } | null>(null);\n return (\n <section className=\"space-y-4 rounded-lg border border-border-default p-5\">\n <h2 className=\"text-lg font-semibold\">Import website or text knowledge</h2>\n <p className=\"text-sm text-text-secondary\">\n Fluidgrids captures each source and checkpoints embedding batches. Course content uses the\n BuildMyIQ course import. Use a new knowledge base for the first managed import.\n </p>\n <label className=\"grid gap-2 text-sm\">\n Source type\n <select\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={kind}\n disabled={sources.queue.isPending}\n onChange={(event) => {\n setKind(event.target.value);\n setValue('');\n }}\n >\n <option value=\"website\">Public website page</option>\n <option value=\"text\">Text or Markdown</option>\n </select>\n </label>\n <label className=\"grid gap-2 text-sm\">\n Title\n <input\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={title}\n maxLength={255}\n disabled={sources.queue.isPending}\n onChange={(event) => setTitle(event.target.value)}\n />\n </label>\n <label className=\"grid gap-2 text-sm\">\n {kind === 'website' ? 'Exact public HTTPS page' : 'Source text'}\n <textarea\n className=\"rounded-md border border-border-default bg-bg-surface p-3\"\n rows={kind === 'website' ? 2 : 6}\n value={value}\n disabled={sources.queue.isPending}\n onChange={(event) => setValue(event.target.value)}\n />\n </label>\n <p className=\"text-sm text-text-secondary\">\n Website imports capture one static page without signing in. Cross-origin redirects and\n embedded documents are rejected. Text sources must fit within 240 KiB; split larger sources.\n </p>\n <Button\n disabled={!title.trim() || !value.trim()}\n isLoading={sources.queue.isPending}\n onClick={async () => {\n if (\n (kind === 'text' && new TextEncoder().encode(value).length > 245760) ||\n (kind === 'website' && value.length > 2048)\n ) {\n setMessage('The source is too large. Split it into smaller sources.');\n return;\n }\n const fingerprint = JSON.stringify([kind, title, value]);\n if (pending.current?.fingerprint !== fingerprint)\n pending.current = { id: crypto.randomUUID(), fingerprint };\n try {\n await sources.queue.mutateAsync({\n clientRequestId: pending.current.id,\n title,\n ...(kind === 'website' ? { sourceUrl: value.trim() } : { content: value }),\n });\n pending.current = null;\n setValue('');\n setMessage('Source queued. Its progress will appear below.');\n } catch {\n setMessage(\n 'Admission could not be confirmed. Retry the same source to reuse its request ID. Check the source, embedding configuration and management permission.'\n );\n }\n }}\n >\n Queue import\n </Button>\n {message && <p role=\"status\">{message}</p>}\n {sources.imports.isError ? (\n <p role=\"alert\">\n Imports could not be loaded. Knowledge management permission is required.\n </p>\n ) : sources.imports.isPending ? (\n <p role=\"status\">Loading imports…</p>\n ) : (\n sources.imports.data?.map((row) => (\n <div key={row.id} className=\"flex items-center justify-between gap-3 text-sm\">\n <span>\n {row.title} · {row.status.toLowerCase()}\n </span>\n {row.status === 'BLOCKED' && (\n <Button\n variant=\"outline\"\n isLoading={sources.retry.isPending}\n onClick={async () => {\n try {\n await sources.retry.mutateAsync(row.id);\n setMessage('Import recovery queued.');\n } catch {\n setMessage(\n 'Recovery failed. The embedding profile must still match the original import.'\n );\n }\n }}\n >\n Retry import\n </Button>\n )}\n </div>\n ))\n )}\n <Button variant=\"outline\" onClick={() => void sources.imports.refetch()}>\n Refresh imports\n </Button>\n </section>\n );\n}\n"],"mappings":";;;;;;AAKA,
|
|
1
|
+
{"version":3,"file":"KnowledgeSourceImportPanel.js","names":["KnowledgeSourceImportPanel","useBotlit","ScopedImportPanel","workspaceId","currentUser","knowledgeBaseId","sources","useKnowledgeSourceImports","kind","setKind","useState","title","setTitle","value","setValue","message","setMessage","pending","useRef","event","Button","fingerprint","row"],"sources":["../../../src/botlit/components/KnowledgeSourceImportPanel.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport { useKnowledgeSourceImports } from '../hooks/useKnowledgeSourceImports';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { Button } from './Button';\n\nexport function KnowledgeSourceImportPanel({ knowledgeBaseId }: { knowledgeBaseId: string }) {\n const { workspaceId, currentUser } = useBotlit();\n return (\n <ScopedImportPanel\n key={`${workspaceId}:${currentUser?.id}:${knowledgeBaseId}`}\n knowledgeBaseId={knowledgeBaseId}\n />\n );\n}\nfunction ScopedImportPanel({ knowledgeBaseId }: { knowledgeBaseId: string }) {\n const sources = useKnowledgeSourceImports(knowledgeBaseId);\n const [kind, setKind] = useState('website'),\n [title, setTitle] = useState(''),\n [value, setValue] = useState(''),\n [message, setMessage] = useState('');\n const pending = useRef<{ id: string; fingerprint: string } | null>(null);\n return (\n <section className=\"space-y-4 rounded-lg border border-border-default p-5\">\n <h2 className=\"text-lg font-semibold\">Import website or text knowledge</h2>\n <p className=\"text-sm text-text-secondary\">\n Fluidgrids captures each source and checkpoints embedding batches. Course content uses the\n BuildMyIQ course import. Use a new knowledge base for the first managed import.\n </p>\n <label className=\"grid gap-2 text-sm\">\n Source type\n <select\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={kind}\n disabled={sources.queue.isPending}\n onChange={(event) => {\n setKind(event.target.value);\n setValue('');\n }}\n >\n <option value=\"website\">Public website page</option>\n <option value=\"text\">Text or Markdown</option>\n </select>\n </label>\n <label className=\"grid gap-2 text-sm\">\n Title\n <input\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={title}\n maxLength={255}\n disabled={sources.queue.isPending}\n onChange={(event) => setTitle(event.target.value)}\n />\n </label>\n <label className=\"grid gap-2 text-sm\">\n {kind === 'website' ? 'Exact public HTTPS page' : 'Source text'}\n <textarea\n className=\"rounded-md border border-border-default bg-bg-surface p-3\"\n rows={kind === 'website' ? 2 : 6}\n value={value}\n disabled={sources.queue.isPending}\n onChange={(event) => setValue(event.target.value)}\n />\n </label>\n <p className=\"text-sm text-text-secondary\">\n Website imports capture one static page without signing in. Cross-origin redirects and\n embedded documents are rejected. Text sources must fit within 240 KiB; split larger sources.\n </p>\n <Button\n disabled={!title.trim() || !value.trim()}\n isLoading={sources.queue.isPending}\n onClick={async () => {\n if (\n (kind === 'text' && new TextEncoder().encode(value).length > 245760) ||\n (kind === 'website' && value.length > 2048)\n ) {\n setMessage('The source is too large. Split it into smaller sources.');\n return;\n }\n const fingerprint = JSON.stringify([kind, title, value]);\n if (pending.current?.fingerprint !== fingerprint)\n pending.current = { id: crypto.randomUUID(), fingerprint };\n try {\n await sources.queue.mutateAsync({\n clientRequestId: pending.current.id,\n title,\n ...(kind === 'website' ? { sourceUrl: value.trim() } : { content: value }),\n });\n pending.current = null;\n setValue('');\n setMessage('Source queued. Its progress will appear below.');\n } catch {\n setMessage(\n 'Admission could not be confirmed. Retry the same source to reuse its request ID. Check the source, embedding configuration and management permission.'\n );\n }\n }}\n >\n Queue import\n </Button>\n {message && <p role=\"status\">{message}</p>}\n {sources.imports.isError ? (\n <p role=\"alert\">\n Imports could not be loaded. Knowledge management permission is required.\n </p>\n ) : sources.imports.isPending ? (\n <p role=\"status\">Loading imports…</p>\n ) : (\n sources.imports.data?.map((row) => (\n <div key={row.id} className=\"flex items-center justify-between gap-3 text-sm\">\n <span>\n {row.title} · {row.status.toLowerCase()}\n </span>\n {row.status === 'BLOCKED' && (\n <Button\n variant=\"outline\"\n isLoading={sources.retry.isPending}\n onClick={async () => {\n try {\n await sources.retry.mutateAsync(row.id);\n setMessage('Import recovery queued.');\n } catch {\n setMessage(\n 'Recovery failed. The embedding profile must still match the original import.'\n );\n }\n }}\n >\n Retry import\n </Button>\n )}\n </div>\n ))\n )}\n <Button variant=\"outline\" onClick={() => void sources.imports.refetch()}>\n Refresh imports\n </Button>\n </section>\n );\n}\n"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { FormField as o, Input as s } from "./Input.js";
|
|
|
5
5
|
import { useState as c } from "react";
|
|
6
6
|
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
7
7
|
import { toast as d } from "sonner";
|
|
8
|
-
|
|
8
|
+
// src/botlit/components/ModelRegistrationPanel.tsx
|
|
9
9
|
function f({ providers: f, onCreated: p }) {
|
|
10
10
|
let { createModel: m, isCreating: h } = e(), [g, _] = c(""), [v, y] = c(""), [b, x] = c(""), [S, C] = c("answer"), [w, T] = c(""), [E, D] = c("8192"), [O, k] = c("2048"), [A, j] = c("0"), [M, N] = c("0"), P = f.filter((e) => e.isActive), F = P.find((e) => e.id === g), I = F?.type === "AWS_BEDROCK" ? b.trim() === "amazon.titan-embed-text-v2:0" : [
|
|
11
11
|
"OPENAI",
|
|
@@ -168,7 +168,6 @@ function f({ providers: f, onCreated: p }) {
|
|
|
168
168
|
]
|
|
169
169
|
})] });
|
|
170
170
|
}
|
|
171
|
-
//#endregion
|
|
172
171
|
export { f as ModelRegistrationPanel };
|
|
173
172
|
|
|
174
173
|
//# sourceMappingURL=ModelRegistrationPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelRegistrationPanel.js","names":[],"sources":["../../../src/botlit/components/ModelRegistrationPanel.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useCreateLLMModel, type LLMProviderRecord } from '../hooks/useLLMProviders';\nimport { Button } from './Button';\nimport { Card, CardContent, CardHeader, CardTitle } from './Card';\nimport { FormField, Input } from './Input';\n\nexport function ModelRegistrationPanel({\n providers,\n onCreated,\n}: {\n providers: LLMProviderRecord[];\n onCreated: () => void;\n}) {\n const { createModel, isCreating } = useCreateLLMModel();\n const [providerId, setProviderId] = useState('');\n const [name, setName] = useState('');\n const [modelId, setModelId] = useState('');\n const [purpose, setPurpose] = useState('answer');\n const [embeddingDimensions, setEmbeddingDimensions] = useState('');\n const [contextWindow, setContextWindow] = useState('8192');\n const [maxOutputTokens, setMaxOutputTokens] = useState('2048');\n const [inputPrice, setInputPrice] = useState('0');\n const [outputPrice, setOutputPrice] = useState('0');\n const activeProviders = providers.filter((provider) => provider.isActive);\n const selectedProvider = activeProviders.find((provider) => provider.id === providerId);\n const embeddingSupported =\n selectedProvider?.type === 'AWS_BEDROCK'\n ? modelId.trim() === 'amazon.titan-embed-text-v2:0'\n : ['OPENAI', 'AZURE_OPENAI', 'CUSTOM'].includes(selectedProvider?.type ?? '');\n const valid =\n activeProviders.some((provider) => provider.id === providerId) &&\n Boolean(name.trim() && modelId.trim()) &&\n Number.isSafeInteger(Number(contextWindow)) &&\n Number(contextWindow) > 0 &&\n (purpose !== 'embedding' ||\n (embeddingSupported &&\n Number.isInteger(Number(embeddingDimensions)) &&\n Number(embeddingDimensions) > 0 &&\n Number(embeddingDimensions) <= 16000)) &&\n (purpose === 'embedding' ||\n (Number.isSafeInteger(Number(maxOutputTokens)) && Number(maxOutputTokens) > 0)) &&\n (purpose === 'embedding' ? [inputPrice] : [inputPrice, outputPrice]).every(\n (value) => value.trim() !== '' && Number.isFinite(Number(value)) && Number(value) >= 0\n );\n return (\n <Card>\n <CardHeader>\n <CardTitle>Register model</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Register an answer or embedding model available through your provider. Model access and\n billing limits must already be configured.\n </p>\n <FormField label=\"Model provider\">\n <select\n aria-label=\"Model provider\"\n value={providerId}\n onChange={(event) => {\n setProviderId(event.target.value);\n const provider = activeProviders.find((entry) => entry.id === event.target.value);\n setEmbeddingDimensions(\n provider?.type === 'AWS_BEDROCK'\n ? String(provider.metadata?.embeddingDimensions ?? 1024)\n : ''\n );\n }}\n className=\"h-10 w-full rounded-md border bg-bg-surface px-3\"\n >\n <option value=\"\">Choose an active provider</option>\n {activeProviders.map((provider) => (\n <option key={provider.id} value={provider.id}>\n {provider.name}\n </option>\n ))}\n </select>\n </FormField>\n <FormField label=\"Model name\">\n <Input\n aria-label=\"Model name\"\n value={name}\n maxLength={255}\n onChange={(event) => setName(event.target.value)}\n />\n </FormField>\n <FormField label=\"Provider model ID\">\n <Input\n aria-label=\"Provider model ID\"\n value={modelId}\n maxLength={255}\n onChange={(event) => {\n setModelId(event.target.value);\n const defaultDimensions: Record<string, number> = {\n 'text-embedding-3-small': 1536,\n 'text-embedding-3-large': 3072,\n 'text-embedding-ada-002': 1536,\n };\n const dimensions = defaultDimensions[event.target.value.trim()];\n if (dimensions) setEmbeddingDimensions(String(dimensions));\n }}\n />\n </FormField>\n <FormField label=\"Model purpose\">\n <select\n aria-label=\"Model purpose\"\n value={purpose}\n onChange={(event) => setPurpose(event.target.value)}\n className=\"h-10 w-full rounded-md border bg-bg-surface px-3\"\n >\n <option value=\"answer\">Answer generation</option>\n <option value=\"embedding\">Content embeddings</option>\n </select>\n </FormField>\n {purpose === 'embedding' && (\n <FormField label=\"Embedding dimensions\">\n <Input\n aria-label=\"Embedding dimensions\"\n type=\"number\"\n min={1}\n max={16000}\n disabled={selectedProvider?.type === 'AWS_BEDROCK'}\n value={embeddingDimensions}\n onChange={(event) => setEmbeddingDimensions(event.target.value)}\n />\n <p className=\"text-sm text-text-secondary\">\n Use the vector size returned by this deployment. Supported: Titan Text Embeddings V2\n and OpenAI-compatible embedding endpoints.\n </p>\n </FormField>\n )}\n <FormField label=\"Context window\">\n <Input\n aria-label=\"Context window\"\n type=\"number\"\n min={1}\n value={contextWindow}\n onChange={(event) => setContextWindow(event.target.value)}\n />\n </FormField>\n {purpose === 'answer' && (\n <FormField label=\"Maximum output tokens\">\n <Input\n aria-label=\"Maximum output tokens\"\n type=\"number\"\n min={1}\n value={maxOutputTokens}\n onChange={(event) => setMaxOutputTokens(event.target.value)}\n />\n </FormField>\n )}\n <FormField label=\"Input price per million tokens\">\n <Input\n aria-label=\"Input price per million tokens\"\n type=\"number\"\n min={0}\n step=\"any\"\n value={inputPrice}\n onChange={(event) => setInputPrice(event.target.value)}\n />\n </FormField>\n {purpose === 'answer' && (\n <FormField label=\"Output price per million tokens\">\n <Input\n aria-label=\"Output price per million tokens\"\n type=\"number\"\n min={0}\n step=\"any\"\n value={outputPrice}\n onChange={(event) => setOutputPrice(event.target.value)}\n />\n </FormField>\n )}\n <Button\n disabled={!valid}\n isLoading={isCreating}\n onClick={async () => {\n try {\n await createModel({\n providerId,\n name: name.trim(),\n modelId: modelId.trim(),\n contextWindow: Number(contextWindow),\n maxOutputTokens: purpose === 'embedding' ? 0 : Number(maxOutputTokens),\n inputPricePerMToken: Number(inputPrice),\n outputPricePerMToken: purpose === 'embedding' ? 0 : Number(outputPrice),\n supportsStreaming: purpose === 'answer',\n supportsFunctionCalling: false,\n supportsVision: false,\n metadata: {\n purpose,\n ...(purpose === 'embedding'\n ? { embeddingDimensions: Number(embeddingDimensions) }\n : {}),\n },\n });\n setName('');\n setModelId('');\n onCreated();\n toast.success('Model registered.');\n } catch (error) {\n toast.error(error instanceof Error ? error.message : 'Model registration failed.');\n }\n }}\n >\n Register model\n </Button>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ModelRegistrationPanel.js","names":["ModelRegistrationPanel","useCreateLLMModel","providerId","setProviderId","useState","name","setName","modelId","setModelId","purpose","setPurpose","embeddingDimensions","setEmbeddingDimensions","contextWindow","setContextWindow","maxOutputTokens","setMaxOutputTokens","inputPrice","setInputPrice","outputPrice","setOutputPrice","activeProviders","providers","provider","selectedProvider","embeddingSupported","valid","value","Card","CardHeader","CardTitle","CardContent","FormField","event","entry","Input","dimensions","Button","isCreating","createModel","onCreated","toast","error"],"sources":["../../../src/botlit/components/ModelRegistrationPanel.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useCreateLLMModel, type LLMProviderRecord } from '../hooks/useLLMProviders';\nimport { Button } from './Button';\nimport { Card, CardContent, CardHeader, CardTitle } from './Card';\nimport { FormField, Input } from './Input';\n\nexport function ModelRegistrationPanel({\n providers,\n onCreated,\n}: {\n providers: LLMProviderRecord[];\n onCreated: () => void;\n}) {\n const { createModel, isCreating } = useCreateLLMModel();\n const [providerId, setProviderId] = useState('');\n const [name, setName] = useState('');\n const [modelId, setModelId] = useState('');\n const [purpose, setPurpose] = useState('answer');\n const [embeddingDimensions, setEmbeddingDimensions] = useState('');\n const [contextWindow, setContextWindow] = useState('8192');\n const [maxOutputTokens, setMaxOutputTokens] = useState('2048');\n const [inputPrice, setInputPrice] = useState('0');\n const [outputPrice, setOutputPrice] = useState('0');\n const activeProviders = providers.filter((provider) => provider.isActive);\n const selectedProvider = activeProviders.find((provider) => provider.id === providerId);\n const embeddingSupported =\n selectedProvider?.type === 'AWS_BEDROCK'\n ? modelId.trim() === 'amazon.titan-embed-text-v2:0'\n : ['OPENAI', 'AZURE_OPENAI', 'CUSTOM'].includes(selectedProvider?.type ?? '');\n const valid =\n activeProviders.some((provider) => provider.id === providerId) &&\n Boolean(name.trim() && modelId.trim()) &&\n Number.isSafeInteger(Number(contextWindow)) &&\n Number(contextWindow) > 0 &&\n (purpose !== 'embedding' ||\n (embeddingSupported &&\n Number.isInteger(Number(embeddingDimensions)) &&\n Number(embeddingDimensions) > 0 &&\n Number(embeddingDimensions) <= 16000)) &&\n (purpose === 'embedding' ||\n (Number.isSafeInteger(Number(maxOutputTokens)) && Number(maxOutputTokens) > 0)) &&\n (purpose === 'embedding' ? [inputPrice] : [inputPrice, outputPrice]).every(\n (value) => value.trim() !== '' && Number.isFinite(Number(value)) && Number(value) >= 0\n );\n return (\n <Card>\n <CardHeader>\n <CardTitle>Register model</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Register an answer or embedding model available through your provider. Model access and\n billing limits must already be configured.\n </p>\n <FormField label=\"Model provider\">\n <select\n aria-label=\"Model provider\"\n value={providerId}\n onChange={(event) => {\n setProviderId(event.target.value);\n const provider = activeProviders.find((entry) => entry.id === event.target.value);\n setEmbeddingDimensions(\n provider?.type === 'AWS_BEDROCK'\n ? String(provider.metadata?.embeddingDimensions ?? 1024)\n : ''\n );\n }}\n className=\"h-10 w-full rounded-md border bg-bg-surface px-3\"\n >\n <option value=\"\">Choose an active provider</option>\n {activeProviders.map((provider) => (\n <option key={provider.id} value={provider.id}>\n {provider.name}\n </option>\n ))}\n </select>\n </FormField>\n <FormField label=\"Model name\">\n <Input\n aria-label=\"Model name\"\n value={name}\n maxLength={255}\n onChange={(event) => setName(event.target.value)}\n />\n </FormField>\n <FormField label=\"Provider model ID\">\n <Input\n aria-label=\"Provider model ID\"\n value={modelId}\n maxLength={255}\n onChange={(event) => {\n setModelId(event.target.value);\n const defaultDimensions: Record<string, number> = {\n 'text-embedding-3-small': 1536,\n 'text-embedding-3-large': 3072,\n 'text-embedding-ada-002': 1536,\n };\n const dimensions = defaultDimensions[event.target.value.trim()];\n if (dimensions) setEmbeddingDimensions(String(dimensions));\n }}\n />\n </FormField>\n <FormField label=\"Model purpose\">\n <select\n aria-label=\"Model purpose\"\n value={purpose}\n onChange={(event) => setPurpose(event.target.value)}\n className=\"h-10 w-full rounded-md border bg-bg-surface px-3\"\n >\n <option value=\"answer\">Answer generation</option>\n <option value=\"embedding\">Content embeddings</option>\n </select>\n </FormField>\n {purpose === 'embedding' && (\n <FormField label=\"Embedding dimensions\">\n <Input\n aria-label=\"Embedding dimensions\"\n type=\"number\"\n min={1}\n max={16000}\n disabled={selectedProvider?.type === 'AWS_BEDROCK'}\n value={embeddingDimensions}\n onChange={(event) => setEmbeddingDimensions(event.target.value)}\n />\n <p className=\"text-sm text-text-secondary\">\n Use the vector size returned by this deployment. Supported: Titan Text Embeddings V2\n and OpenAI-compatible embedding endpoints.\n </p>\n </FormField>\n )}\n <FormField label=\"Context window\">\n <Input\n aria-label=\"Context window\"\n type=\"number\"\n min={1}\n value={contextWindow}\n onChange={(event) => setContextWindow(event.target.value)}\n />\n </FormField>\n {purpose === 'answer' && (\n <FormField label=\"Maximum output tokens\">\n <Input\n aria-label=\"Maximum output tokens\"\n type=\"number\"\n min={1}\n value={maxOutputTokens}\n onChange={(event) => setMaxOutputTokens(event.target.value)}\n />\n </FormField>\n )}\n <FormField label=\"Input price per million tokens\">\n <Input\n aria-label=\"Input price per million tokens\"\n type=\"number\"\n min={0}\n step=\"any\"\n value={inputPrice}\n onChange={(event) => setInputPrice(event.target.value)}\n />\n </FormField>\n {purpose === 'answer' && (\n <FormField label=\"Output price per million tokens\">\n <Input\n aria-label=\"Output price per million tokens\"\n type=\"number\"\n min={0}\n step=\"any\"\n value={outputPrice}\n onChange={(event) => setOutputPrice(event.target.value)}\n />\n </FormField>\n )}\n <Button\n disabled={!valid}\n isLoading={isCreating}\n onClick={async () => {\n try {\n await createModel({\n providerId,\n name: name.trim(),\n modelId: modelId.trim(),\n contextWindow: Number(contextWindow),\n maxOutputTokens: purpose === 'embedding' ? 0 : Number(maxOutputTokens),\n inputPricePerMToken: Number(inputPrice),\n outputPricePerMToken: purpose === 'embedding' ? 0 : Number(outputPrice),\n supportsStreaming: purpose === 'answer',\n supportsFunctionCalling: false,\n supportsVision: false,\n metadata: {\n purpose,\n ...(purpose === 'embedding'\n ? { embeddingDimensions: Number(embeddingDimensions) }\n : {}),\n },\n });\n setName('');\n setModelId('');\n onCreated();\n toast.success('Model registered.');\n } catch (error) {\n toast.error(error instanceof Error ? error.message : 'Model registration failed.');\n }\n }}\n >\n Register model\n </Button>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FC, ReactNode } from 'react';
|
|
2
|
+
interface PageLayoutProps {
|
|
3
|
+
title: ReactNode;
|
|
4
|
+
description?: ReactNode;
|
|
5
|
+
actions?: ReactNode;
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
className?: string;
|
|
8
|
+
/** Render the aurora hero backdrop behind the header (one per MFE). */
|
|
9
|
+
hero?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare const PageLayout: FC<PageLayoutProps>;
|
|
12
|
+
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cn as e } from "../utils/cn.js";
|
|
2
2
|
import { AuroraBackground as t } from "@burdenoff/fe-libs/ui";
|
|
3
3
|
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
-
|
|
4
|
+
// src/botlit/components/PageLayout.tsx
|
|
5
5
|
var i = ({ title: i, description: a, actions: o, children: s, className: c, hero: l = !1 }) => /* @__PURE__ */ r("div", {
|
|
6
6
|
className: e("flex flex-col h-full", c),
|
|
7
7
|
children: [/* @__PURE__ */ r("div", {
|
|
@@ -28,7 +28,6 @@ var i = ({ title: i, description: a, actions: o, children: s, className: c, hero
|
|
|
28
28
|
children: s
|
|
29
29
|
})]
|
|
30
30
|
});
|
|
31
|
-
//#endregion
|
|
32
31
|
export { i as PageLayout };
|
|
33
32
|
|
|
34
33
|
//# sourceMappingURL=PageLayout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/botlit/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module botlit/components\n *\n * Boff UI 2.0: the page header uses a seam border and can optionally host the\n * living-glass `AuroraBackground` (the ONE hero backdrop per MFE — opt in via\n * `hero`). The aurora sits behind the header content at -z-10 and never moves\n * page content. Reduced-motion is honoured by the primitive.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { AuroraBackground } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n /** Render the aurora hero backdrop behind the header (one per MFE). */\n hero?: boolean;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n actions,\n children,\n className,\n hero = false,\n}) => {\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Page Header */}\n <div\n className={cn(\n 'relative flex items-center justify-between gap-4 px-6 py-4 border-b border-border-seam',\n hero ? 'overflow-hidden bg-hero-mesh' : 'bg-bg-surface'\n )}\n >\n {hero && <AuroraBackground intensity=\"subtle\" />}\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-text-primary\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {actions && <div className=\"flex flex-shrink-0 items-center gap-3\">{actions}</div>}\n </div>\n\n {/* Page Content */}\n <div className=\"flex-1 overflow-auto p-6\">{children}</div>\n </div>\n );\n};\n"],"mappings":";;;;AAwBA,
|
|
1
|
+
{"version":3,"file":"PageLayout.js","names":["PageLayout","cn","className","hero","AuroraBackground","title","description","actions"],"sources":["../../../src/botlit/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module botlit/components\n *\n * Boff UI 2.0: the page header uses a seam border and can optionally host the\n * living-glass `AuroraBackground` (the ONE hero backdrop per MFE — opt in via\n * `hero`). The aurora sits behind the header content at -z-10 and never moves\n * page content. Reduced-motion is honoured by the primitive.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { AuroraBackground } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n /** Render the aurora hero backdrop behind the header (one per MFE). */\n hero?: boolean;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n actions,\n children,\n className,\n hero = false,\n}) => {\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Page Header */}\n <div\n className={cn(\n 'relative flex items-center justify-between gap-4 px-6 py-4 border-b border-border-seam',\n hero ? 'overflow-hidden bg-hero-mesh' : 'bg-bg-surface'\n )}\n >\n {hero && <AuroraBackground intensity=\"subtle\" />}\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-text-primary\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {actions && <div className=\"flex flex-shrink-0 items-center gap-3\">{actions}</div>}\n </div>\n\n {/* Page Content */}\n <div className=\"flex-1 overflow-auto p-6\">{children}</div>\n </div>\n );\n};\n"],"mappings":";;;;AAwBA,IAAaA,KAAmC,EAC9C,UACA,gBACA,YACA,aACA,cACA,UAAO,SAGL,kBAAC,OAAD;CAAK,WAAWC,EAAG,wBAAwBC,CAAS;CAApD,UAAA,CAEE,kBAAC,OAAD;EACE,WAAWD,EACT,0FACAE,IAAO,iCAAiC,eAC1C;EAJF,UAAA;GAMGA,KAAQ,kBAACC,GAAD,EAAkB,WAAU,SAAU,CAAA;GAC/C,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;KAA2D,UAAAC;IAAU,CAAA,GAClFC,KAAe,kBAAC,KAAD;KAAG,WAAU;KAAoC,UAAAA;IAAe,CAAA,CAC7E;;GACJC,KAAW,kBAAC,OAAD;IAAK,WAAU;IAAyC,UAAAA;GAAa,CAAA;EAC9E;CAGL,CAAA,GAAA,kBAAC,OAAD;EAAK,WAAU;EAA4B;CAAc,CAAA,CACtD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface QuotaExhaustedDialogProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
onViewBilling: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function QuotaExhaustedDialog({ open, title, description, onClose, onViewBilling, }: QuotaExhaustedDialogProps): import('react').JSX.Element;
|
|
9
|
+
export {};
|