@jini-ai/chat 0.1.0
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/LICENSE +201 -0
- package/README.md +109 -0
- package/dist/core/agentic/chat-capabilities.d.ts +19 -0
- package/dist/core/agentic/chat-capabilities.d.ts.map +1 -0
- package/dist/core/agentic/chat-capabilities.js +106 -0
- package/dist/core/agentic/chat-capabilities.js.map +1 -0
- package/dist/core/agentic/index.d.ts +22 -0
- package/dist/core/agentic/index.d.ts.map +1 -0
- package/dist/core/agentic/index.js +21 -0
- package/dist/core/agentic/index.js.map +1 -0
- package/dist/core/events.d.ts +84 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +14 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/index.d.ts +40 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +40 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/messages.d.ts +53 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +16 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/partial-json.d.ts +36 -0
- package/dist/core/partial-json.d.ts.map +1 -0
- package/dist/core/partial-json.js +119 -0
- package/dist/core/partial-json.js.map +1 -0
- package/dist/core/persistence/index.d.ts +11 -0
- package/dist/core/persistence/index.d.ts.map +1 -0
- package/dist/core/persistence/index.js +11 -0
- package/dist/core/persistence/index.js.map +1 -0
- package/dist/core/persistence/ports.d.ts +124 -0
- package/dist/core/persistence/ports.d.ts.map +1 -0
- package/dist/core/persistence/ports.js +2 -0
- package/dist/core/persistence/ports.js.map +1 -0
- package/dist/core/persistence/title.d.ts +35 -0
- package/dist/core/persistence/title.d.ts.map +1 -0
- package/dist/core/persistence/title.js +137 -0
- package/dist/core/persistence/title.js.map +1 -0
- package/dist/core/question-form/format.d.ts +27 -0
- package/dist/core/question-form/format.d.ts.map +1 -0
- package/dist/core/question-form/format.js +45 -0
- package/dist/core/question-form/format.js.map +1 -0
- package/dist/core/question-form/normalize.d.ts +30 -0
- package/dist/core/question-form/normalize.d.ts.map +1 -0
- package/dist/core/question-form/normalize.js +192 -0
- package/dist/core/question-form/normalize.js.map +1 -0
- package/dist/core/question-form/scan.d.ts +50 -0
- package/dist/core/question-form/scan.d.ts.map +1 -0
- package/dist/core/question-form/scan.js +404 -0
- package/dist/core/question-form/scan.js.map +1 -0
- package/dist/core/question-form/types.d.ts +83 -0
- package/dist/core/question-form/types.d.ts.map +1 -0
- package/dist/core/question-form/types.js +11 -0
- package/dist/core/question-form/types.js.map +1 -0
- package/dist/core/question-form.d.ts +39 -0
- package/dist/core/question-form.d.ts.map +1 -0
- package/dist/core/question-form.js +4 -0
- package/dist/core/question-form.js.map +1 -0
- package/dist/core/todos.d.ts +70 -0
- package/dist/core/todos.d.ts.map +1 -0
- package/dist/core/todos.js +175 -0
- package/dist/core/todos.js.map +1 -0
- package/dist/core/tool-events.d.ts +18 -0
- package/dist/core/tool-events.d.ts.map +1 -0
- package/dist/core/tool-events.js +36 -0
- package/dist/core/tool-events.js.map +1 -0
- package/dist/core/tools.d.ts +51 -0
- package/dist/core/tools.d.ts.map +1 -0
- package/dist/core/tools.js +41 -0
- package/dist/core/tools.js.map +1 -0
- package/dist/core/transcript.d.ts +81 -0
- package/dist/core/transcript.d.ts.map +1 -0
- package/dist/core/transcript.js +133 -0
- package/dist/core/transcript.js.map +1 -0
- package/dist/core/transport.d.ts +109 -0
- package/dist/core/transport.d.ts.map +1 -0
- package/dist/core/transport.js +2 -0
- package/dist/core/transport.js.map +1 -0
- package/dist/core/util/index.d.ts +16 -0
- package/dist/core/util/index.d.ts.map +1 -0
- package/dist/core/util/index.js +16 -0
- package/dist/core/util/index.js.map +1 -0
- package/dist/core/util/manifest.d.ts +39 -0
- package/dist/core/util/manifest.d.ts.map +1 -0
- package/dist/core/util/manifest.js +173 -0
- package/dist/core/util/manifest.js.map +1 -0
- package/dist/core/util/markdown-context.d.ts +47 -0
- package/dist/core/util/markdown-context.d.ts.map +1 -0
- package/dist/core/util/markdown-context.js +125 -0
- package/dist/core/util/markdown-context.js.map +1 -0
- package/dist/core/util/markup-attributes.d.ts +20 -0
- package/dist/core/util/markup-attributes.d.ts.map +1 -0
- package/dist/core/util/markup-attributes.js +33 -0
- package/dist/core/util/markup-attributes.js.map +1 -0
- package/dist/core/util/parser.d.ts +42 -0
- package/dist/core/util/parser.d.ts.map +1 -0
- package/dist/core/util/parser.js +238 -0
- package/dist/core/util/parser.js.map +1 -0
- package/dist/core/util/pointer.d.ts +28 -0
- package/dist/core/util/pointer.d.ts.map +1 -0
- package/dist/core/util/pointer.js +75 -0
- package/dist/core/util/pointer.js.map +1 -0
- package/dist/core/util/recover.d.ts +40 -0
- package/dist/core/util/recover.d.ts.map +1 -0
- package/dist/core/util/recover.js +117 -0
- package/dist/core/util/recover.js.map +1 -0
- package/dist/core/util/strip.d.ts +112 -0
- package/dist/core/util/strip.d.ts.map +1 -0
- package/dist/core/util/strip.js +333 -0
- package/dist/core/util/strip.js.map +1 -0
- package/dist/core/util/types.d.ts +31 -0
- package/dist/core/util/types.d.ts.map +1 -0
- package/dist/core/util/types.js +2 -0
- package/dist/core/util/types.js.map +1 -0
- package/dist/core/util/validate.d.ts +50 -0
- package/dist/core/util/validate.d.ts.map +1 -0
- package/dist/core/util/validate.js +202 -0
- package/dist/core/util/validate.js.map +1 -0
- package/dist/react/agent-bridge/frontend-session-bridge.d.ts +45 -0
- package/dist/react/agent-bridge/frontend-session-bridge.d.ts.map +1 -0
- package/dist/react/agent-bridge/frontend-session-bridge.js +214 -0
- package/dist/react/agent-bridge/frontend-session-bridge.js.map +1 -0
- package/dist/react/artifact-types.d.ts +61 -0
- package/dist/react/artifact-types.d.ts.map +1 -0
- package/dist/react/artifact-types.js +33 -0
- package/dist/react/artifact-types.js.map +1 -0
- package/dist/react/chat-pane.d.ts +21 -0
- package/dist/react/chat-pane.d.ts.map +1 -0
- package/dist/react/chat-pane.js +20 -0
- package/dist/react/chat-pane.js.map +1 -0
- package/dist/react/components/A2uiSurfaceCard.d.ts +35 -0
- package/dist/react/components/A2uiSurfaceCard.d.ts.map +1 -0
- package/dist/react/components/A2uiSurfaceCard.js +272 -0
- package/dist/react/components/A2uiSurfaceCard.js.map +1 -0
- package/dist/react/components/AttachmentTray.d.ts +6 -0
- package/dist/react/components/AttachmentTray.d.ts.map +1 -0
- package/dist/react/components/AttachmentTray.js +30 -0
- package/dist/react/components/AttachmentTray.js.map +1 -0
- package/dist/react/components/ChatFab.d.ts +8 -0
- package/dist/react/components/ChatFab.d.ts.map +1 -0
- package/dist/react/components/ChatFab.js +24 -0
- package/dist/react/components/ChatFab.js.map +1 -0
- package/dist/react/components/Composer.d.ts +34 -0
- package/dist/react/components/Composer.d.ts.map +1 -0
- package/dist/react/components/Composer.js +300 -0
- package/dist/react/components/Composer.js.map +1 -0
- package/dist/react/components/ComposerDiscovery.d.ts +46 -0
- package/dist/react/components/ComposerDiscovery.d.ts.map +1 -0
- package/dist/react/components/ComposerDiscovery.js +38 -0
- package/dist/react/components/ComposerDiscovery.js.map +1 -0
- package/dist/react/components/ConversationList.d.ts +31 -0
- package/dist/react/components/ConversationList.d.ts.map +1 -0
- package/dist/react/components/ConversationList.js +221 -0
- package/dist/react/components/ConversationList.js.map +1 -0
- package/dist/react/components/ExtEventErrorBoundary.d.ts +35 -0
- package/dist/react/components/ExtEventErrorBoundary.d.ts.map +1 -0
- package/dist/react/components/ExtEventErrorBoundary.js +38 -0
- package/dist/react/components/ExtEventErrorBoundary.js.map +1 -0
- package/dist/react/components/Icon.d.ts +17 -0
- package/dist/react/components/Icon.d.ts.map +1 -0
- package/dist/react/components/Icon.js +46 -0
- package/dist/react/components/Icon.js.map +1 -0
- package/dist/react/components/JiniChatProvider.d.ts +45 -0
- package/dist/react/components/JiniChatProvider.d.ts.map +1 -0
- package/dist/react/components/JiniChatProvider.js +44 -0
- package/dist/react/components/JiniChatProvider.js.map +1 -0
- package/dist/react/components/Markdown.d.ts +5 -0
- package/dist/react/components/Markdown.d.ts.map +1 -0
- package/dist/react/components/Markdown.js +390 -0
- package/dist/react/components/Markdown.js.map +1 -0
- package/dist/react/components/McpUiSurfaceCard.d.ts +51 -0
- package/dist/react/components/McpUiSurfaceCard.d.ts.map +1 -0
- package/dist/react/components/McpUiSurfaceCard.js +159 -0
- package/dist/react/components/McpUiSurfaceCard.js.map +1 -0
- package/dist/react/components/MessageList.d.ts +15 -0
- package/dist/react/components/MessageList.d.ts.map +1 -0
- package/dist/react/components/MessageList.js +81 -0
- package/dist/react/components/MessageList.js.map +1 -0
- package/dist/react/components/MessageRow.d.ts +60 -0
- package/dist/react/components/MessageRow.d.ts.map +1 -0
- package/dist/react/components/MessageRow.js +156 -0
- package/dist/react/components/MessageRow.js.map +1 -0
- package/dist/react/components/NextStepActions.d.ts +34 -0
- package/dist/react/components/NextStepActions.d.ts.map +1 -0
- package/dist/react/components/NextStepActions.js +9 -0
- package/dist/react/components/NextStepActions.js.map +1 -0
- package/dist/react/components/QuestionForm.d.ts +26 -0
- package/dist/react/components/QuestionForm.d.ts.map +1 -0
- package/dist/react/components/QuestionForm.js +238 -0
- package/dist/react/components/QuestionForm.js.map +1 -0
- package/dist/react/components/QuestionsPanel.d.ts +13 -0
- package/dist/react/components/QuestionsPanel.d.ts.map +1 -0
- package/dist/react/components/QuestionsPanel.js +33 -0
- package/dist/react/components/QuestionsPanel.js.map +1 -0
- package/dist/react/components/TodoCard.d.ts +8 -0
- package/dist/react/components/TodoCard.d.ts.map +1 -0
- package/dist/react/components/TodoCard.js +29 -0
- package/dist/react/components/TodoCard.js.map +1 -0
- package/dist/react/components/ToolCard.d.ts +22 -0
- package/dist/react/components/ToolCard.d.ts.map +1 -0
- package/dist/react/components/ToolCard.js +298 -0
- package/dist/react/components/ToolCard.js.map +1 -0
- package/dist/react/components/composer-discovery.d.ts +107 -0
- package/dist/react/components/composer-discovery.d.ts.map +1 -0
- package/dist/react/components/composer-discovery.js +176 -0
- package/dist/react/components/composer-discovery.js.map +1 -0
- package/dist/react/ext-event-renderer-registry.d.ts +51 -0
- package/dist/react/ext-event-renderer-registry.d.ts.map +1 -0
- package/dist/react/ext-event-renderer-registry.js +20 -0
- package/dist/react/ext-event-renderer-registry.js.map +1 -0
- package/dist/react/features/chat-pane/agent-tools.d.ts +14 -0
- package/dist/react/features/chat-pane/agent-tools.d.ts.map +1 -0
- package/dist/react/features/chat-pane/agent-tools.js +22 -0
- package/dist/react/features/chat-pane/agent-tools.js.map +1 -0
- package/dist/react/features/chat-pane/components/AgentRuntimePicker.d.ts +12 -0
- package/dist/react/features/chat-pane/components/AgentRuntimePicker.d.ts.map +1 -0
- package/dist/react/features/chat-pane/components/AgentRuntimePicker.js +106 -0
- package/dist/react/features/chat-pane/components/AgentRuntimePicker.js.map +1 -0
- package/dist/react/features/chat-pane/components/ChatPane.d.ts +10 -0
- package/dist/react/features/chat-pane/components/ChatPane.d.ts.map +1 -0
- package/dist/react/features/chat-pane/components/ChatPane.js +169 -0
- package/dist/react/features/chat-pane/components/ChatPane.js.map +1 -0
- package/dist/react/features/chat-pane/create-daemon-attachment-uploader.d.ts +21 -0
- package/dist/react/features/chat-pane/create-daemon-attachment-uploader.d.ts.map +1 -0
- package/dist/react/features/chat-pane/create-daemon-attachment-uploader.js +213 -0
- package/dist/react/features/chat-pane/create-daemon-attachment-uploader.js.map +1 -0
- package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.d.ts +70 -0
- package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.d.ts.map +1 -0
- package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.js +76 -0
- package/dist/react/features/chat-pane/create-mcp-ui-tool-caller.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.d.ts +133 -0
- package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.js +258 -0
- package/dist/react/features/chat-pane/hooks/useAgentRuntimePicker.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPane.hooks.d.ts +66 -0
- package/dist/react/features/chat-pane/hooks/useChatPane.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPane.hooks.js +224 -0
- package/dist/react/features/chat-pane/hooks/useChatPane.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.d.ts +38 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.js +252 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneAgentControl.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.d.ts +16 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.js +59 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneControlsHeight.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.d.ts +26 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.js +74 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneFileDrop.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.d.ts +25 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.js +88 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneRuntimeInventory.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.d.ts +38 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.js +184 -0
- package/dist/react/features/chat-pane/hooks/useChatPaneWorkingDirectory.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/index.d.ts +12 -0
- package/dist/react/features/chat-pane/index.d.ts.map +1 -0
- package/dist/react/features/chat-pane/index.js +11 -0
- package/dist/react/features/chat-pane/index.js.map +1 -0
- package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.d.ts +12 -0
- package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.js +102 -0
- package/dist/react/features/chat-pane/react/components/AgentRuntimePicker.js.map +1 -0
- package/dist/react/features/chat-pane/react/components/ChatPane.d.ts +10 -0
- package/dist/react/features/chat-pane/react/components/ChatPane.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/components/ChatPane.js +137 -0
- package/dist/react/features/chat-pane/react/components/ChatPane.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.d.ts +133 -0
- package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.js +258 -0
- package/dist/react/features/chat-pane/react/hooks/useAgentRuntimePicker.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.d.ts +66 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.js +223 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPane.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.d.ts +38 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.js +252 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneAgentControl.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.d.ts +26 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.js +60 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneFileDrop.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.d.ts +25 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.js +83 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneRuntimeInventory.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.d.ts +38 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.js +184 -0
- package/dist/react/features/chat-pane/react/hooks/useChatPaneWorkingDirectory.hooks.js.map +1 -0
- package/dist/react/features/chat-pane/react/styles.d.ts +2 -0
- package/dist/react/features/chat-pane/react/styles.d.ts.map +1 -0
- package/dist/react/features/chat-pane/react/styles.js +863 -0
- package/dist/react/features/chat-pane/react/styles.js.map +1 -0
- package/dist/react/features/chat-pane/rules.d.ts +31 -0
- package/dist/react/features/chat-pane/rules.d.ts.map +1 -0
- package/dist/react/features/chat-pane/rules.js +81 -0
- package/dist/react/features/chat-pane/rules.js.map +1 -0
- package/dist/react/features/chat-pane/styles.d.ts +2 -0
- package/dist/react/features/chat-pane/styles.d.ts.map +1 -0
- package/dist/react/features/chat-pane/styles.js +1327 -0
- package/dist/react/features/chat-pane/styles.js.map +1 -0
- package/dist/react/features/chat-pane/types.d.ts +248 -0
- package/dist/react/features/chat-pane/types.d.ts.map +1 -0
- package/dist/react/features/chat-pane/types.js +2 -0
- package/dist/react/features/chat-pane/types.js.map +1 -0
- package/dist/react/features/model-picker/components/CredentialStatusBadge.d.ts +7 -0
- package/dist/react/features/model-picker/components/CredentialStatusBadge.d.ts.map +1 -0
- package/dist/react/features/model-picker/components/CredentialStatusBadge.js +20 -0
- package/dist/react/features/model-picker/components/CredentialStatusBadge.js.map +1 -0
- package/dist/react/features/model-picker/components/ModelPicker.d.ts +9 -0
- package/dist/react/features/model-picker/components/ModelPicker.d.ts.map +1 -0
- package/dist/react/features/model-picker/components/ModelPicker.js +34 -0
- package/dist/react/features/model-picker/components/ModelPicker.js.map +1 -0
- package/dist/react/features/model-picker/constants.d.ts +6 -0
- package/dist/react/features/model-picker/constants.d.ts.map +1 -0
- package/dist/react/features/model-picker/constants.js +9 -0
- package/dist/react/features/model-picker/constants.js.map +1 -0
- package/dist/react/features/model-picker/dependencies.d.ts +11 -0
- package/dist/react/features/model-picker/dependencies.d.ts.map +1 -0
- package/dist/react/features/model-picker/dependencies.js +10 -0
- package/dist/react/features/model-picker/dependencies.js.map +1 -0
- package/dist/react/features/model-picker/hooks/useModelPicker.hooks.d.ts +27 -0
- package/dist/react/features/model-picker/hooks/useModelPicker.hooks.d.ts.map +1 -0
- package/dist/react/features/model-picker/hooks/useModelPicker.hooks.js +62 -0
- package/dist/react/features/model-picker/hooks/useModelPicker.hooks.js.map +1 -0
- package/dist/react/features/model-picker/index.d.ts +32 -0
- package/dist/react/features/model-picker/index.d.ts.map +1 -0
- package/dist/react/features/model-picker/index.js +29 -0
- package/dist/react/features/model-picker/index.js.map +1 -0
- package/dist/react/features/model-picker/ports.d.ts +11 -0
- package/dist/react/features/model-picker/ports.d.ts.map +1 -0
- package/dist/react/features/model-picker/ports.js +2 -0
- package/dist/react/features/model-picker/ports.js.map +1 -0
- package/dist/react/features/model-picker/react/components/CredentialStatusBadge.d.ts +7 -0
- package/dist/react/features/model-picker/react/components/CredentialStatusBadge.d.ts.map +1 -0
- package/dist/react/features/model-picker/react/components/CredentialStatusBadge.js +20 -0
- package/dist/react/features/model-picker/react/components/CredentialStatusBadge.js.map +1 -0
- package/dist/react/features/model-picker/react/components/ModelPicker.d.ts +9 -0
- package/dist/react/features/model-picker/react/components/ModelPicker.d.ts.map +1 -0
- package/dist/react/features/model-picker/react/components/ModelPicker.js +34 -0
- package/dist/react/features/model-picker/react/components/ModelPicker.js.map +1 -0
- package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.d.ts +27 -0
- package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.d.ts.map +1 -0
- package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.js +62 -0
- package/dist/react/features/model-picker/react/hooks/useModelPicker.hooks.js.map +1 -0
- package/dist/react/features/model-picker/rules.d.ts +26 -0
- package/dist/react/features/model-picker/rules.d.ts.map +1 -0
- package/dist/react/features/model-picker/rules.js +84 -0
- package/dist/react/features/model-picker/rules.js.map +1 -0
- package/dist/react/features/model-picker/types.d.ts +38 -0
- package/dist/react/features/model-picker/types.d.ts.map +1 -0
- package/dist/react/features/model-picker/types.js +2 -0
- package/dist/react/features/model-picker/types.js.map +1 -0
- package/dist/react/hooks/composer-draft-cache.d.ts +65 -0
- package/dist/react/hooks/composer-draft-cache.d.ts.map +1 -0
- package/dist/react/hooks/composer-draft-cache.js +89 -0
- package/dist/react/hooks/composer-draft-cache.js.map +1 -0
- package/dist/react/hooks/context.d.ts +18 -0
- package/dist/react/hooks/context.d.ts.map +1 -0
- package/dist/react/hooks/context.js +60 -0
- package/dist/react/hooks/context.js.map +1 -0
- package/dist/react/hooks/testing/fake-transport.d.ts +34 -0
- package/dist/react/hooks/testing/fake-transport.d.ts.map +1 -0
- package/dist/react/hooks/testing/fake-transport.js +46 -0
- package/dist/react/hooks/testing/fake-transport.js.map +1 -0
- package/dist/react/hooks/useArtifactStream.d.ts +18 -0
- package/dist/react/hooks/useArtifactStream.d.ts.map +1 -0
- package/dist/react/hooks/useArtifactStream.js +55 -0
- package/dist/react/hooks/useArtifactStream.js.map +1 -0
- package/dist/react/hooks/useChatFabDrag.d.ts +25 -0
- package/dist/react/hooks/useChatFabDrag.d.ts.map +1 -0
- package/dist/react/hooks/useChatFabDrag.js +88 -0
- package/dist/react/hooks/useChatFabDrag.js.map +1 -0
- package/dist/react/hooks/useComposer.d.ts +48 -0
- package/dist/react/hooks/useComposer.d.ts.map +1 -0
- package/dist/react/hooks/useComposer.js +121 -0
- package/dist/react/hooks/useComposer.js.map +1 -0
- package/dist/react/hooks/useConversation.d.ts +34 -0
- package/dist/react/hooks/useConversation.d.ts.map +1 -0
- package/dist/react/hooks/useConversation.js +163 -0
- package/dist/react/hooks/useConversation.js.map +1 -0
- package/dist/react/hooks/useCopyToClipboard.d.ts +14 -0
- package/dist/react/hooks/useCopyToClipboard.d.ts.map +1 -0
- package/dist/react/hooks/useCopyToClipboard.js +98 -0
- package/dist/react/hooks/useCopyToClipboard.js.map +1 -0
- package/dist/react/hooks/useExtEventGroups.d.ts +7 -0
- package/dist/react/hooks/useExtEventGroups.d.ts.map +1 -0
- package/dist/react/hooks/useExtEventGroups.js +32 -0
- package/dist/react/hooks/useExtEventGroups.js.map +1 -0
- package/dist/react/hooks/useLatestOperation.d.ts +31 -0
- package/dist/react/hooks/useLatestOperation.d.ts.map +1 -0
- package/dist/react/hooks/useLatestOperation.js +74 -0
- package/dist/react/hooks/useLatestOperation.js.map +1 -0
- package/dist/react/hooks/usePinnedTodos.d.ts +15 -0
- package/dist/react/hooks/usePinnedTodos.d.ts.map +1 -0
- package/dist/react/hooks/usePinnedTodos.js +43 -0
- package/dist/react/hooks/usePinnedTodos.js.map +1 -0
- package/dist/react/hooks/useQuestionForms.d.ts +28 -0
- package/dist/react/hooks/useQuestionForms.d.ts.map +1 -0
- package/dist/react/hooks/useQuestionForms.js +113 -0
- package/dist/react/hooks/useQuestionForms.js.map +1 -0
- package/dist/react/hooks/useRunStream.d.ts +27 -0
- package/dist/react/hooks/useRunStream.d.ts.map +1 -0
- package/dist/react/hooks/useRunStream.js +180 -0
- package/dist/react/hooks/useRunStream.js.map +1 -0
- package/dist/react/hooks/useToolTimeline.d.ts +33 -0
- package/dist/react/hooks/useToolTimeline.d.ts.map +1 -0
- package/dist/react/hooks/useToolTimeline.js +47 -0
- package/dist/react/hooks/useToolTimeline.js.map +1 -0
- package/dist/react/index.d.ts +158 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +118 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/message-blocks.d.ts +86 -0
- package/dist/react/message-blocks.d.ts.map +1 -0
- package/dist/react/message-blocks.js +78 -0
- package/dist/react/message-blocks.js.map +1 -0
- package/dist/react/poc-mcp-ui-official/PocMcpUiCard.d.ts +9 -0
- package/dist/react/poc-mcp-ui-official/PocMcpUiCard.d.ts.map +1 -0
- package/dist/react/poc-mcp-ui-official/PocMcpUiCard.js +29 -0
- package/dist/react/poc-mcp-ui-official/PocMcpUiCard.js.map +1 -0
- package/dist/react/poc-mcp-ui-official/create-poc-resource.d.ts +30 -0
- package/dist/react/poc-mcp-ui-official/create-poc-resource.d.ts.map +1 -0
- package/dist/react/poc-mcp-ui-official/create-poc-resource.js +44 -0
- package/dist/react/poc-mcp-ui-official/create-poc-resource.js.map +1 -0
- package/dist/react/slots.d.ts +215 -0
- package/dist/react/slots.d.ts.map +1 -0
- package/dist/react/slots.js +2 -0
- package/dist/react/slots.js.map +1 -0
- package/dist/react/styles/reference.css +298 -0
- package/dist/react/tool-renderer-registry.d.ts +41 -0
- package/dist/react/tool-renderer-registry.d.ts.map +1 -0
- package/dist/react/tool-renderer-registry.js +22 -0
- package/dist/react/tool-renderer-registry.js.map +1 -0
- package/dist/react/util/defined-props.d.ts +31 -0
- package/dist/react/util/defined-props.d.ts.map +1 -0
- package/dist/react/util/defined-props.js +28 -0
- package/dist/react/util/defined-props.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1,1327 @@
|
|
|
1
|
+
export const CHAT_PANE_STYLES = `
|
|
2
|
+
.jini-chat-pane {
|
|
3
|
+
--jini-chat-bg: #faf9f7;
|
|
4
|
+
--jini-chat-panel: #fdfcfa;
|
|
5
|
+
--jini-chat-text: #1a1916;
|
|
6
|
+
--jini-chat-text-strong: #0d0c0a;
|
|
7
|
+
--jini-chat-muted: #74716b;
|
|
8
|
+
--jini-chat-faint: #b3b0a8;
|
|
9
|
+
--jini-chat-border: #e1e5eb;
|
|
10
|
+
--jini-chat-border-strong: #c9d0da;
|
|
11
|
+
--jini-chat-border-soft: #edf0f4;
|
|
12
|
+
--jini-chat-subtle: #f4f5f7;
|
|
13
|
+
--jini-chat-accent: #c96442;
|
|
14
|
+
--jini-chat-accent-soft: #fbeee5;
|
|
15
|
+
--bg-panel: var(--jini-chat-panel);
|
|
16
|
+
--bg-subtle: var(--jini-chat-subtle);
|
|
17
|
+
--border: var(--jini-chat-border);
|
|
18
|
+
--border-strong: var(--jini-chat-border-strong);
|
|
19
|
+
--text: var(--jini-chat-text);
|
|
20
|
+
--text-strong: var(--jini-chat-text-strong);
|
|
21
|
+
--text-muted: var(--jini-chat-muted);
|
|
22
|
+
--danger: #e5484d;
|
|
23
|
+
--radius: 8px;
|
|
24
|
+
--radius-lg: 12px;
|
|
25
|
+
position: relative;
|
|
26
|
+
display: grid;
|
|
27
|
+
grid-template-rows: auto minmax(0, 1fr) auto;
|
|
28
|
+
min-width: 0;
|
|
29
|
+
min-height: 0;
|
|
30
|
+
height: 100%;
|
|
31
|
+
overflow: hidden;
|
|
32
|
+
color: var(--jini-chat-text);
|
|
33
|
+
background: var(--jini-chat-bg);
|
|
34
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", "Noto Sans", Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
35
|
+
font-size: 13.5px;
|
|
36
|
+
line-height: 1.5;
|
|
37
|
+
-webkit-font-smoothing: antialiased;
|
|
38
|
+
-moz-osx-font-smoothing: grayscale;
|
|
39
|
+
}
|
|
40
|
+
.jini-chat-pane button,
|
|
41
|
+
.jini-runtime-popover button,
|
|
42
|
+
.jini-runtime-popover select {
|
|
43
|
+
font: inherit;
|
|
44
|
+
}
|
|
45
|
+
.jini-chat-pane__header {
|
|
46
|
+
display: flex;
|
|
47
|
+
align-items: center;
|
|
48
|
+
justify-content: space-between;
|
|
49
|
+
min-height: 74px;
|
|
50
|
+
padding: 18px 22px 14px;
|
|
51
|
+
border-bottom: 1px solid var(--jini-chat-border-soft);
|
|
52
|
+
}
|
|
53
|
+
.jini-chat-pane__heading { min-width: 0; }
|
|
54
|
+
.jini-chat-pane__eyebrow {
|
|
55
|
+
display: block;
|
|
56
|
+
margin-bottom: 4px;
|
|
57
|
+
color: var(--jini-chat-muted);
|
|
58
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
59
|
+
font-size: 10px;
|
|
60
|
+
letter-spacing: .1em;
|
|
61
|
+
text-transform: uppercase;
|
|
62
|
+
}
|
|
63
|
+
.jini-chat-pane__title {
|
|
64
|
+
overflow: hidden;
|
|
65
|
+
margin: 0;
|
|
66
|
+
font-size: 21px;
|
|
67
|
+
font-weight: 650;
|
|
68
|
+
letter-spacing: -.025em;
|
|
69
|
+
text-overflow: ellipsis;
|
|
70
|
+
white-space: nowrap;
|
|
71
|
+
}
|
|
72
|
+
.jini-chat-pane__new-thread {
|
|
73
|
+
padding: 8px 12px;
|
|
74
|
+
color: var(--jini-chat-muted);
|
|
75
|
+
background: var(--jini-chat-panel);
|
|
76
|
+
border: 1px solid var(--jini-chat-border);
|
|
77
|
+
border-radius: 8px;
|
|
78
|
+
cursor: pointer;
|
|
79
|
+
}
|
|
80
|
+
.jini-chat-pane__body {
|
|
81
|
+
position: relative;
|
|
82
|
+
min-height: 0;
|
|
83
|
+
overflow: hidden;
|
|
84
|
+
}
|
|
85
|
+
.jini-chat-pane .jini-message-list {
|
|
86
|
+
height: 100%;
|
|
87
|
+
overflow-y: auto;
|
|
88
|
+
/*
|
|
89
|
+
* .jini-chat-pane__controls is an absolutely-positioned overlay (not a flex/grid sibling that
|
|
90
|
+
* pushes this list up), so its real height has to be reserved here instead. This used to be a
|
|
91
|
+
* flat 240px guess -- and had already gone stale once before that: it started at 170px, a live
|
|
92
|
+
* render outgrew it (composer + footer + working-directory row alone measured 179.75px, clipping
|
|
93
|
+
* the last message's tail under the overlay), and 240px was chosen as a margin above THAT
|
|
94
|
+
* measurement, not a value anything keeps in sync. useChatPaneControlsHeight now measures the
|
|
95
|
+
* overlay's real height live via ResizeObserver and publishes it as
|
|
96
|
+
* --jini-chat-controls-height on the pane root, so this reservation tracks the composer's
|
|
97
|
+
* actual content (an attachment tray, a wrapped multi-line draft, a taller runtime-picker
|
|
98
|
+
* popover) instead of a number that is only ever correct until the next thing that grows it.
|
|
99
|
+
* 240px survives as the fallback for the rare environment without ResizeObserver (SSR; a test
|
|
100
|
+
* harness that never polyfills it) -- everywhere else, the calc() wins.
|
|
101
|
+
*/
|
|
102
|
+
padding: 20px 22px calc(var(--jini-chat-controls-height, 240px) + 24px);
|
|
103
|
+
scrollbar-width: thin;
|
|
104
|
+
}
|
|
105
|
+
.jini-chat-pane .jini-message {
|
|
106
|
+
margin-bottom: 20px;
|
|
107
|
+
color: var(--jini-chat-text);
|
|
108
|
+
font-size: 14px;
|
|
109
|
+
line-height: 1.62;
|
|
110
|
+
}
|
|
111
|
+
/*
|
|
112
|
+
* Bubble on the content, not the row: MessageRow.tsx renders attachments as siblings of
|
|
113
|
+
* .jini-message-content inside .jini-message-user, each with their own chip styling -- bubbling
|
|
114
|
+
* the whole row would nest one background box inside another. This replaces a dead rule this file
|
|
115
|
+
* shipped with (.jini-message-row[data-role="user"] / .jini-message-row.user): MessageRow.tsx
|
|
116
|
+
* has never rendered a jini-message-row class or a data-role attribute, and a user message's
|
|
117
|
+
* root class is jini-message-user, not bare "user" -- the selector never matched anything real.
|
|
118
|
+
*/
|
|
119
|
+
.jini-chat-pane .jini-message-user .jini-message-content {
|
|
120
|
+
margin-left: auto;
|
|
121
|
+
padding: 10px 13px;
|
|
122
|
+
width: fit-content;
|
|
123
|
+
max-width: 88%;
|
|
124
|
+
background: var(--jini-chat-subtle);
|
|
125
|
+
border-radius: 12px 12px 3px 12px;
|
|
126
|
+
}
|
|
127
|
+
.jini-chat-pane .jini-message-user .jini-message-attachments {
|
|
128
|
+
display: flex;
|
|
129
|
+
flex-wrap: wrap;
|
|
130
|
+
gap: 6px;
|
|
131
|
+
justify-content: flex-end;
|
|
132
|
+
margin-bottom: 4px;
|
|
133
|
+
}
|
|
134
|
+
.jini-chat-pane .jini-message-user .jini-message-attachment-chip {
|
|
135
|
+
font-size: 11px;
|
|
136
|
+
color: var(--jini-chat-muted);
|
|
137
|
+
background: var(--jini-chat-subtle);
|
|
138
|
+
border: 1px solid var(--jini-chat-border);
|
|
139
|
+
border-radius: 999px;
|
|
140
|
+
padding: 3px 10px;
|
|
141
|
+
}
|
|
142
|
+
.jini-chat-pane .jini-message-agent {
|
|
143
|
+
font-size: 11px;
|
|
144
|
+
font-weight: 700;
|
|
145
|
+
letter-spacing: .02em;
|
|
146
|
+
text-transform: uppercase;
|
|
147
|
+
color: var(--jini-chat-faint);
|
|
148
|
+
margin-bottom: 4px;
|
|
149
|
+
}
|
|
150
|
+
.jini-chat-pane .jini-message-error { color: var(--danger); font-size: 13px; }
|
|
151
|
+
.jini-chat-pane .jini-message-pending { color: var(--jini-chat-muted); font-size: 13px; font-style: italic; }
|
|
152
|
+
/*
|
|
153
|
+
* Per-message action row (MessageRow.tsx's 'CopyMessageButton', Icon.tsx's 'copy' glyph): quiet,
|
|
154
|
+
* icon-only, always present rather than a hover-only reveal, so keyboard and touch users get the
|
|
155
|
+
* same access a mouse hover would give. The assistant variant carries a thin left rail (its own
|
|
156
|
+
* left border) to read as attached to the turn above it without repeating that message's own
|
|
157
|
+
* chrome; the user variant skips the rail and instead mirrors its bubble's own right alignment.
|
|
158
|
+
* Copy is the only live button today — 'jini-message-actions--assistant' is an intentional
|
|
159
|
+
* extension seam, not the finished row; see that row's own call-site comment in MessageRow.tsx.
|
|
160
|
+
*/
|
|
161
|
+
.jini-chat-pane .jini-message-actions {
|
|
162
|
+
display: flex;
|
|
163
|
+
align-items: center;
|
|
164
|
+
gap: 2px;
|
|
165
|
+
margin-top: 6px;
|
|
166
|
+
}
|
|
167
|
+
.jini-chat-pane .jini-message-actions--assistant {
|
|
168
|
+
padding-left: 8px;
|
|
169
|
+
border-left: 2px solid var(--jini-chat-border-soft);
|
|
170
|
+
}
|
|
171
|
+
.jini-chat-pane .jini-message-actions--user { justify-content: flex-end; }
|
|
172
|
+
.jini-chat-pane .jini-message-action-btn {
|
|
173
|
+
display: inline-flex;
|
|
174
|
+
align-items: center;
|
|
175
|
+
justify-content: center;
|
|
176
|
+
width: 24px;
|
|
177
|
+
height: 24px;
|
|
178
|
+
padding: 0;
|
|
179
|
+
color: var(--jini-chat-faint);
|
|
180
|
+
background: none;
|
|
181
|
+
border: 0;
|
|
182
|
+
border-radius: 6px;
|
|
183
|
+
cursor: pointer;
|
|
184
|
+
}
|
|
185
|
+
.jini-chat-pane .jini-message-action-btn:hover { color: var(--jini-chat-muted); background: var(--jini-chat-subtle); }
|
|
186
|
+
.jini-chat-pane .jini-message-action-btn:focus-visible { outline: 2px solid var(--jini-chat-accent); outline-offset: 1px; }
|
|
187
|
+
/* Visually hidden but present in the DOM (never display:none) so the polite live region beside
|
|
188
|
+
each copy button still gets announced — same clip-rect technique this package already uses for
|
|
189
|
+
its other visually-hidden-but-functional controls. */
|
|
190
|
+
.jini-chat-pane .jini-message-copy-status {
|
|
191
|
+
position: absolute;
|
|
192
|
+
width: 1px;
|
|
193
|
+
height: 1px;
|
|
194
|
+
overflow: hidden;
|
|
195
|
+
clip: rect(0, 0, 0, 0);
|
|
196
|
+
white-space: nowrap;
|
|
197
|
+
}
|
|
198
|
+
.jini-chat-pane__controls {
|
|
199
|
+
position: absolute;
|
|
200
|
+
right: 0;
|
|
201
|
+
bottom: 0;
|
|
202
|
+
left: 0;
|
|
203
|
+
z-index: 4;
|
|
204
|
+
padding: 0 16px 14px;
|
|
205
|
+
background: linear-gradient(to bottom, transparent, var(--jini-chat-bg) 22px);
|
|
206
|
+
}
|
|
207
|
+
.jini-chat-pane__suggestions {
|
|
208
|
+
display: flex;
|
|
209
|
+
gap: 8px;
|
|
210
|
+
margin: 0 2px 8px;
|
|
211
|
+
overflow-x: auto;
|
|
212
|
+
}
|
|
213
|
+
.jini-chat-pane__suggestion {
|
|
214
|
+
flex: 0 0 auto;
|
|
215
|
+
max-width: 290px;
|
|
216
|
+
overflow: hidden;
|
|
217
|
+
padding: 7px 11px;
|
|
218
|
+
color: var(--jini-chat-muted);
|
|
219
|
+
background: color-mix(in srgb, var(--jini-chat-panel) 92%, transparent);
|
|
220
|
+
border: 1px solid var(--jini-chat-border);
|
|
221
|
+
border-radius: 999px;
|
|
222
|
+
font-size: 11px;
|
|
223
|
+
text-overflow: ellipsis;
|
|
224
|
+
white-space: nowrap;
|
|
225
|
+
cursor: pointer;
|
|
226
|
+
}
|
|
227
|
+
.jini-chat-pane__error {
|
|
228
|
+
margin: 0 2px 8px;
|
|
229
|
+
padding: 8px 10px;
|
|
230
|
+
color: #8c2f20;
|
|
231
|
+
background: #fff1ed;
|
|
232
|
+
border: 1px solid #f2c8bb;
|
|
233
|
+
border-radius: 8px;
|
|
234
|
+
font-size: 12px;
|
|
235
|
+
}
|
|
236
|
+
.jini-chat-pane__status {
|
|
237
|
+
margin: 0 2px 8px;
|
|
238
|
+
padding: 8px 10px;
|
|
239
|
+
color: var(--jini-chat-muted);
|
|
240
|
+
background: var(--jini-chat-subtle);
|
|
241
|
+
border: 1px solid var(--jini-chat-border);
|
|
242
|
+
border-radius: 8px;
|
|
243
|
+
font-size: 12px;
|
|
244
|
+
}
|
|
245
|
+
.jini-chat-pane__drop-target {
|
|
246
|
+
position: relative;
|
|
247
|
+
margin: -8px -8px -8px;
|
|
248
|
+
padding: 6px;
|
|
249
|
+
border: 2px dashed transparent;
|
|
250
|
+
border-radius: 16px;
|
|
251
|
+
transition:
|
|
252
|
+
background-color .14s ease,
|
|
253
|
+
border-color .14s ease,
|
|
254
|
+
box-shadow .14s ease;
|
|
255
|
+
}
|
|
256
|
+
.jini-chat-pane__drop-target.is-dragging-files {
|
|
257
|
+
background: color-mix(in srgb, var(--jini-chat-accent-soft) 72%, transparent);
|
|
258
|
+
border-color: var(--jini-chat-accent);
|
|
259
|
+
box-shadow: 0 0 0 1px color-mix(in srgb, var(--jini-chat-accent) 15%, transparent);
|
|
260
|
+
}
|
|
261
|
+
.jini-chat-pane__drop-target.is-dragging-files .jini-composer {
|
|
262
|
+
background: color-mix(in srgb, var(--jini-chat-accent-soft) 58%, var(--jini-chat-panel));
|
|
263
|
+
border-color: color-mix(in srgb, var(--jini-chat-accent) 68%, var(--jini-chat-border));
|
|
264
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--jini-chat-accent) 10%, transparent);
|
|
265
|
+
}
|
|
266
|
+
.jini-chat-pane__drop-announcement {
|
|
267
|
+
position: absolute;
|
|
268
|
+
width: 1px;
|
|
269
|
+
height: 1px;
|
|
270
|
+
overflow: hidden;
|
|
271
|
+
clip: rect(0, 0, 0, 0);
|
|
272
|
+
white-space: nowrap;
|
|
273
|
+
clip-path: inset(50%);
|
|
274
|
+
}
|
|
275
|
+
.jini-chat-pane .jini-composer {
|
|
276
|
+
position: relative;
|
|
277
|
+
overflow: visible;
|
|
278
|
+
padding: 0;
|
|
279
|
+
background: var(--jini-chat-subtle);
|
|
280
|
+
border: 1px solid var(--jini-chat-border);
|
|
281
|
+
border-radius: 12px;
|
|
282
|
+
box-shadow: none;
|
|
283
|
+
transition: border-color .16s ease, box-shadow .16s ease;
|
|
284
|
+
}
|
|
285
|
+
.jini-chat-pane .jini-composer:focus-within {
|
|
286
|
+
background: var(--jini-chat-panel);
|
|
287
|
+
border-color: color-mix(in srgb, var(--jini-chat-accent) 22%, var(--jini-chat-border-strong));
|
|
288
|
+
box-shadow: 0 1px 2px rgba(26, 25, 22, .06), 0 0 0 1px rgba(201, 100, 66, .06);
|
|
289
|
+
}
|
|
290
|
+
/*
|
|
291
|
+
* Pinned-context zone: whatever a host pins above the composer input (selected plugins, MCP
|
|
292
|
+
* servers, or anything a future host adds -- see 'leadingAccessories''s own doc in 'slots.ts').
|
|
293
|
+
* 'Composer.tsx' only mounts this element when 'slots.leadingAccessories' is a truthy prop value,
|
|
294
|
+
* but a host that always supplies a TRAY COMPONENT rather than conditionally supplying the prop
|
|
295
|
+
* itself (one that internally renders 'null' when nothing is pinned) still leaves an empty node
|
|
296
|
+
* behind -- ':empty' below is what actually collapses THAT case to zero height and zero seam,
|
|
297
|
+
* mirroring '.jini-attachment-tray:empty' a few rules down, which solves the identical problem for
|
|
298
|
+
* the real file-attachment tray.
|
|
299
|
+
*
|
|
300
|
+
* Collapsed (nothing pinned): zero height, zero padding, invisible (0-width) seam -- no reserved
|
|
301
|
+
* space, matching the owner's "if nil, it doesn't animate" requirement exactly, since there is
|
|
302
|
+
* nothing here to animate.
|
|
303
|
+
*
|
|
304
|
+
* Populated: grows to a single fixed-height row via 'max-height' (not 'height: auto', which can't
|
|
305
|
+
* transition) and gains a hairline seam using the SAME border/token '.jini-composer-footer' below
|
|
306
|
+
* already uses one zone down -- reads as one more zone of the same control, not a new floating
|
|
307
|
+
* box. The transition runs both directions, so removing the last pinned item gets a matching exit,
|
|
308
|
+
* not an instant cut.
|
|
309
|
+
*
|
|
310
|
+
* 'overflow-x: auto' turns this into a single scrollable row instead of the wrap-and-grow a naive
|
|
311
|
+
* flex row would do with six or more items; '> *' keeps any direct host child (a single tray
|
|
312
|
+
* wrapper, a bare row of buttons, anything) from shrinking to fit, so overflow -- not internal
|
|
313
|
+
* wrapping -- is what kicks in once content is wider than the zone.
|
|
314
|
+
*
|
|
315
|
+
* The "more content" cue is a real shadow/vignette, not a plain alpha fade -- an alpha fade toward
|
|
316
|
+
* this zone's own background was tried first and rejected on review: the chip and the zone
|
|
317
|
+
* background are already close in luminance, so fading a chip's OWN pixels toward transparent read
|
|
318
|
+
* as "something is clipped/broken", not "swipe for more", at a glance with no hover. The four-layer
|
|
319
|
+
* 'background' below is the standard scroll-shadow technique instead: a real 'color-mix'-tinted
|
|
320
|
+
* vignette (darkens in a light theme, lightens in a dark one, since it's mixed from the theme's OWN
|
|
321
|
+
* text color rather than a fixed hex) drawn at each edge -- but each 'scroll'-attached shadow layer
|
|
322
|
+
* is covered by a same-edge 'local'-attached solid-to-transparent layer that scrolls WITH the
|
|
323
|
+
* content, so the shadow is only ever visible on the edges that still have more to reveal: at rest
|
|
324
|
+
* (scrolled to the start) the left shadow is hidden and the right one shows; scroll all the way to
|
|
325
|
+
* the true end and the right shadow hides too. Verified live (not just by reading the technique):
|
|
326
|
+
* scrolling this element from 0 to its max scrollLeft measurably fades the right cover's computed
|
|
327
|
+
* background-position across the full track and the shadow disappears exactly at the end.
|
|
328
|
+
*/
|
|
329
|
+
.jini-chat-pane .jini-composer-leading {
|
|
330
|
+
display: flex;
|
|
331
|
+
align-items: center;
|
|
332
|
+
overflow-x: auto;
|
|
333
|
+
overflow-y: hidden;
|
|
334
|
+
max-height: 0;
|
|
335
|
+
padding: 0 12px;
|
|
336
|
+
border-bottom: 0 solid var(--jini-chat-border-soft);
|
|
337
|
+
opacity: 0;
|
|
338
|
+
scrollbar-width: thin;
|
|
339
|
+
transition:
|
|
340
|
+
max-height .22s cubic-bezier(.3, .1, .25, 1),
|
|
341
|
+
padding .22s cubic-bezier(.3, .1, .25, 1),
|
|
342
|
+
border-bottom-width .22s ease,
|
|
343
|
+
opacity .16s ease;
|
|
344
|
+
background-color: var(--jini-chat-subtle);
|
|
345
|
+
background-repeat: no-repeat;
|
|
346
|
+
background-attachment: local, local, scroll, scroll;
|
|
347
|
+
background-position: 0 0, 100% 0, 0 0, 100% 0;
|
|
348
|
+
background-size: 26px 100%, 26px 100%, 20px 100%, 20px 100%;
|
|
349
|
+
background-image:
|
|
350
|
+
linear-gradient(to right, var(--jini-chat-subtle), transparent),
|
|
351
|
+
linear-gradient(to left, var(--jini-chat-subtle), transparent),
|
|
352
|
+
linear-gradient(to right, color-mix(in srgb, var(--jini-chat-text) 30%, transparent), transparent),
|
|
353
|
+
linear-gradient(to left, color-mix(in srgb, var(--jini-chat-text) 30%, transparent), transparent);
|
|
354
|
+
}
|
|
355
|
+
.jini-chat-pane .jini-composer-leading:not(:empty) {
|
|
356
|
+
max-height: 64px;
|
|
357
|
+
padding: 10px 12px;
|
|
358
|
+
border-bottom-width: 1px;
|
|
359
|
+
opacity: 1;
|
|
360
|
+
}
|
|
361
|
+
.jini-chat-pane .jini-composer-leading > * {
|
|
362
|
+
flex: none;
|
|
363
|
+
min-width: max-content;
|
|
364
|
+
}
|
|
365
|
+
@media (prefers-reduced-motion: reduce) {
|
|
366
|
+
.jini-chat-pane .jini-composer-leading { transition: none; }
|
|
367
|
+
}
|
|
368
|
+
.jini-chat-pane .jini-attachment-tray {
|
|
369
|
+
display: flex;
|
|
370
|
+
flex-wrap: wrap;
|
|
371
|
+
gap: 6px;
|
|
372
|
+
max-height: 88px;
|
|
373
|
+
overflow-y: auto;
|
|
374
|
+
padding: 8px 10px 0;
|
|
375
|
+
scrollbar-width: thin;
|
|
376
|
+
}
|
|
377
|
+
.jini-chat-pane .jini-attachment-tray:empty { display: none; }
|
|
378
|
+
/*
|
|
379
|
+
* The sanctioned reuse path (see '.jini-composer-leading''s own doc above and 'AttachmentTray''s
|
|
380
|
+
* module doc): a host nesting Jini's own tray/chip classes inside the pinned-context zone to match
|
|
381
|
+
* the real attachment tray's look. Un-does the wrap-and-grow rule directly above -- meant for that
|
|
382
|
+
* tray's OWN use one zone down, where wrapping onto a second line is fine -- so the OUTER zone's
|
|
383
|
+
* single scroll axis is the one that wins here instead. The real file-attachment tray is
|
|
384
|
+
* unaffected: it always renders as this zone's sibling ('Composer.tsx'), never its descendant.
|
|
385
|
+
*/
|
|
386
|
+
.jini-chat-pane .jini-composer-leading .jini-attachment-tray {
|
|
387
|
+
flex-wrap: nowrap;
|
|
388
|
+
max-height: none;
|
|
389
|
+
overflow: visible;
|
|
390
|
+
padding: 0;
|
|
391
|
+
}
|
|
392
|
+
.jini-chat-pane .jini-attachment-chip {
|
|
393
|
+
display: inline-flex;
|
|
394
|
+
align-items: center;
|
|
395
|
+
box-sizing: border-box;
|
|
396
|
+
min-width: 0;
|
|
397
|
+
max-width: min(100%, 290px);
|
|
398
|
+
height: 36px;
|
|
399
|
+
padding: 3px 4px 3px 5px;
|
|
400
|
+
color: var(--jini-chat-text);
|
|
401
|
+
background: color-mix(in srgb, var(--jini-chat-panel) 88%, var(--jini-chat-subtle));
|
|
402
|
+
border: 1px solid var(--jini-chat-border);
|
|
403
|
+
border-radius: 9px;
|
|
404
|
+
box-shadow: 0 1px 1px rgba(13, 12, 10, .025);
|
|
405
|
+
animation: jini-chat-chip-in .16s ease both;
|
|
406
|
+
}
|
|
407
|
+
@keyframes jini-chat-chip-in {
|
|
408
|
+
from { opacity: 0; transform: translateY(3px) scale(.94); }
|
|
409
|
+
to { opacity: 1; transform: none; }
|
|
410
|
+
}
|
|
411
|
+
@media (prefers-reduced-motion: reduce) {
|
|
412
|
+
.jini-chat-pane .jini-attachment-chip { animation: none; }
|
|
413
|
+
}
|
|
414
|
+
.jini-chat-pane .jini-attachment-chip-body {
|
|
415
|
+
display: flex;
|
|
416
|
+
align-items: center;
|
|
417
|
+
min-width: 0;
|
|
418
|
+
gap: 7px;
|
|
419
|
+
}
|
|
420
|
+
.jini-chat-pane .jini-attachment-chip-icon {
|
|
421
|
+
display: grid;
|
|
422
|
+
flex: 0 0 auto;
|
|
423
|
+
place-items: center;
|
|
424
|
+
width: 26px;
|
|
425
|
+
height: 26px;
|
|
426
|
+
color: var(--jini-chat-muted);
|
|
427
|
+
background: var(--jini-chat-subtle);
|
|
428
|
+
border-radius: 7px;
|
|
429
|
+
}
|
|
430
|
+
.jini-chat-pane .jini-attachment-chip-icon.is-image {
|
|
431
|
+
color: var(--jini-chat-accent);
|
|
432
|
+
background: var(--jini-chat-accent-soft);
|
|
433
|
+
}
|
|
434
|
+
.jini-chat-pane .jini-attachment-chip-copy {
|
|
435
|
+
display: flex;
|
|
436
|
+
min-width: 0;
|
|
437
|
+
flex-direction: column;
|
|
438
|
+
line-height: 1.15;
|
|
439
|
+
}
|
|
440
|
+
.jini-chat-pane .jini-attachment-chip-name {
|
|
441
|
+
overflow: hidden;
|
|
442
|
+
font-size: 11.5px;
|
|
443
|
+
font-weight: 550;
|
|
444
|
+
text-overflow: ellipsis;
|
|
445
|
+
white-space: nowrap;
|
|
446
|
+
}
|
|
447
|
+
.jini-chat-pane .jini-attachment-chip-size {
|
|
448
|
+
color: var(--jini-chat-muted);
|
|
449
|
+
font-size: 9.5px;
|
|
450
|
+
}
|
|
451
|
+
.jini-chat-pane .jini-attachment-remove {
|
|
452
|
+
display: grid;
|
|
453
|
+
flex: 0 0 auto;
|
|
454
|
+
place-items: center;
|
|
455
|
+
width: 25px;
|
|
456
|
+
height: 25px;
|
|
457
|
+
margin-left: 4px;
|
|
458
|
+
padding: 0;
|
|
459
|
+
color: var(--jini-chat-muted);
|
|
460
|
+
background: transparent;
|
|
461
|
+
border: 0;
|
|
462
|
+
border-radius: 7px;
|
|
463
|
+
cursor: pointer;
|
|
464
|
+
}
|
|
465
|
+
.jini-chat-pane .jini-attachment-remove:hover,
|
|
466
|
+
.jini-chat-pane .jini-attachment-remove:focus-visible {
|
|
467
|
+
color: var(--jini-chat-text-strong);
|
|
468
|
+
background: var(--jini-chat-subtle);
|
|
469
|
+
outline: none;
|
|
470
|
+
}
|
|
471
|
+
.jini-chat-pane .jini-composer-input {
|
|
472
|
+
display: block;
|
|
473
|
+
box-sizing: border-box;
|
|
474
|
+
width: 100%;
|
|
475
|
+
min-height: 92px;
|
|
476
|
+
resize: none;
|
|
477
|
+
padding: 12px 14px 8px;
|
|
478
|
+
color: var(--jini-chat-text);
|
|
479
|
+
background: transparent;
|
|
480
|
+
border: 0;
|
|
481
|
+
outline: 0;
|
|
482
|
+
font-size: 13.5px;
|
|
483
|
+
line-height: 1.6;
|
|
484
|
+
}
|
|
485
|
+
.jini-chat-pane .jini-composer-input::placeholder { color: var(--jini-chat-faint); }
|
|
486
|
+
.jini-chat-pane .jini-composer-footer {
|
|
487
|
+
display: flex;
|
|
488
|
+
align-items: center;
|
|
489
|
+
justify-content: space-between;
|
|
490
|
+
min-height: 42px;
|
|
491
|
+
gap: 6px;
|
|
492
|
+
padding: 6px 8px 8px;
|
|
493
|
+
border-top: 1px solid var(--jini-chat-border-soft);
|
|
494
|
+
}
|
|
495
|
+
.jini-chat-pane .jini-composer-attachment-picker { display: inline-flex; }
|
|
496
|
+
/* NOT 'position: relative' — the discovery popover (below) anchors off '.jini-composer' itself
|
|
497
|
+
(the nearest positioned ancestor once this wrapper opts out), not off this small trigger-button
|
|
498
|
+
wrapper. Anchoring to the wrapper put the popover's bottom edge at the wrapper's own top edge —
|
|
499
|
+
inside the footer, just below the textarea — so any popover taller than a couple of rows grew
|
|
500
|
+
upward straight over the textarea and blocked clicks into it (reproduced live: Playwright's own
|
|
501
|
+
click on the textarea failed with "intercepts pointer events" while the popover was open). */
|
|
502
|
+
.jini-chat-pane .jini-composer-discovery { display: inline-flex; }
|
|
503
|
+
.jini-chat-pane .jini-composer-discovery-menu,
|
|
504
|
+
.jini-chat-pane .jini-composer-slash-menu {
|
|
505
|
+
position: absolute;
|
|
506
|
+
z-index: 8;
|
|
507
|
+
display: flex;
|
|
508
|
+
flex-direction: column;
|
|
509
|
+
gap: 4px;
|
|
510
|
+
max-height: 280px;
|
|
511
|
+
overflow-y: auto;
|
|
512
|
+
padding: 8px;
|
|
513
|
+
color: var(--jini-chat-text);
|
|
514
|
+
background: var(--jini-chat-panel);
|
|
515
|
+
border: 1px solid var(--jini-chat-border);
|
|
516
|
+
border-radius: 10px;
|
|
517
|
+
box-shadow: 0 12px 30px rgb(0 0 0 / 14%);
|
|
518
|
+
}
|
|
519
|
+
/* Both anchor off '.jini-composer' ('bottom: calc(100% + 6px)' = fully above the textarea AND the
|
|
520
|
+
footer, not just above the trigger button) so the popover floats as a clean detached card instead
|
|
521
|
+
of overlapping the input it sits next to. */
|
|
522
|
+
.jini-chat-pane .jini-composer-discovery-menu {
|
|
523
|
+
inset-inline-start: 8px;
|
|
524
|
+
bottom: calc(100% + 6px);
|
|
525
|
+
width: min(280px, calc(100vw - 32px));
|
|
526
|
+
}
|
|
527
|
+
.jini-chat-pane .jini-composer-slash-menu {
|
|
528
|
+
inset-inline: 8px;
|
|
529
|
+
bottom: calc(100% + 6px);
|
|
530
|
+
}
|
|
531
|
+
.jini-chat-pane .jini-composer-discovery-group { display: flex; flex-direction: column; gap: 2px; }
|
|
532
|
+
.jini-chat-pane .jini-composer-discovery-group-label {
|
|
533
|
+
padding: 6px 8px 2px;
|
|
534
|
+
color: var(--jini-chat-faint);
|
|
535
|
+
font-size: 10px;
|
|
536
|
+
font-weight: 700;
|
|
537
|
+
letter-spacing: .08em;
|
|
538
|
+
text-transform: uppercase;
|
|
539
|
+
}
|
|
540
|
+
.jini-chat-pane .jini-composer-discovery-item {
|
|
541
|
+
display: flex;
|
|
542
|
+
flex-direction: column;
|
|
543
|
+
align-items: flex-start;
|
|
544
|
+
gap: 2px;
|
|
545
|
+
width: 100%;
|
|
546
|
+
padding: 7px 8px;
|
|
547
|
+
color: inherit;
|
|
548
|
+
text-align: start;
|
|
549
|
+
background: transparent;
|
|
550
|
+
border: 0;
|
|
551
|
+
border-radius: 7px;
|
|
552
|
+
cursor: pointer;
|
|
553
|
+
}
|
|
554
|
+
.jini-chat-pane .jini-composer-discovery-item:hover {
|
|
555
|
+
background: var(--jini-chat-panel);
|
|
556
|
+
}
|
|
557
|
+
.jini-chat-pane .jini-composer-discovery-item.is-active {
|
|
558
|
+
color: var(--jini-chat-text-strong);
|
|
559
|
+
background: var(--jini-chat-accent-soft);
|
|
560
|
+
outline: 1px solid var(--jini-chat-accent);
|
|
561
|
+
outline-offset: -1px;
|
|
562
|
+
box-shadow: inset 3px 0 0 var(--jini-chat-accent);
|
|
563
|
+
}
|
|
564
|
+
.jini-chat-pane .jini-composer-discovery-item small { color: var(--jini-chat-muted); }
|
|
565
|
+
/* The full description used to print under every row unconditionally, which is why the palette
|
|
566
|
+
grew to dozens of multi-line rows on a bare "/" — kept in the accessibility tree at rest (never
|
|
567
|
+
'display: none', which most screen readers drop from that tree) so 'aria-describedby' keeps
|
|
568
|
+
resolving whether or not anything is hovering.
|
|
569
|
+
FIXED (was: opacity-only toggle, THEN an absolutely-positioned overlay) — two owner-reported
|
|
570
|
+
bugs in sequence on the same element:
|
|
571
|
+
1. 'opacity: 0' alone hides a box visually but does not remove it from layout, so an
|
|
572
|
+
absolutely-positioned tooltip sized to its full natural content height (routinely 50-260px
|
|
573
|
+
for a real description) still counted toward its scrolling ancestor's scrollable overflow
|
|
574
|
+
region while invisible ('scrollHeight' measured 501px against a 242px 'clientHeight' for a
|
|
575
|
+
6-row list), leaving a blank scrollable gap after the last real row. Fixed by collapsing the
|
|
576
|
+
box itself at rest ('max-height: 0; overflow: hidden;'), not just hiding it — carried
|
|
577
|
+
forward below.
|
|
578
|
+
2. That fix still left this 'position: absolute; top: 100%' of its own row (formerly anchored
|
|
579
|
+
via 'position: relative' on '.jini-composer-discovery-item' above, now removed — nothing
|
|
580
|
+
anchors off it anymore): 'z-index' only controls paint order, not which box a box is
|
|
581
|
+
confined to, so on hover/focus the expanded tooltip painted directly over whichever row
|
|
582
|
+
happened to sit below it in the SAME scrollable list (owner report: hovering "UI/UX Design
|
|
583
|
+
(Skill)" covered the "/mcp" entry beneath it — not a stacking-order problem, a containment
|
|
584
|
+
one). Fixed by dropping 'position: absolute' entirely: this is now a normal in-flow child of
|
|
585
|
+
the row's own 'flex-direction: column' box, still collapsed to negligible size at rest via
|
|
586
|
+
'max-height: 0; overflow: hidden;', but on hover/focus it grows the ROW's own height instead
|
|
587
|
+
of floating a detached box over the next row — the popover's flex column (and every row
|
|
588
|
+
below) gets pushed down to make room, so it can never occlude a sibling item. This also
|
|
589
|
+
retires the panel-styled "floating card" look (background/border/shadow): an in-flow caption
|
|
590
|
+
reads correctly with the row's own muted small-text convention above, and dropping it removes
|
|
591
|
+
the last reason this needed its own stacking context. 'pointer-events: none' is kept for
|
|
592
|
+
parity even though nothing sits under it to protect anymore. */
|
|
593
|
+
.jini-chat-pane .jini-composer-discovery-description {
|
|
594
|
+
width: 100%;
|
|
595
|
+
max-height: 0;
|
|
596
|
+
padding: 0;
|
|
597
|
+
overflow: hidden;
|
|
598
|
+
color: var(--jini-chat-muted);
|
|
599
|
+
font-size: 12px;
|
|
600
|
+
font-weight: 400;
|
|
601
|
+
line-height: 1.4;
|
|
602
|
+
white-space: normal;
|
|
603
|
+
opacity: 0;
|
|
604
|
+
pointer-events: none;
|
|
605
|
+
transition: opacity .12s ease;
|
|
606
|
+
}
|
|
607
|
+
.jini-chat-pane .jini-composer-discovery-item:hover .jini-composer-discovery-description,
|
|
608
|
+
.jini-chat-pane .jini-composer-discovery-item:focus-visible .jini-composer-discovery-description {
|
|
609
|
+
max-height: none;
|
|
610
|
+
padding-top: 2px;
|
|
611
|
+
overflow: visible;
|
|
612
|
+
opacity: 1;
|
|
613
|
+
}
|
|
614
|
+
/* '<code>'/'<small>' both default to the browser's UA styling (monospace at an unrelated size)
|
|
615
|
+
with nothing here overriding it — computed font-SIZE happened to already match the row label
|
|
616
|
+
(13.5px), so the visible mismatch is font-FAMILY: raw monospace next to the label's sans-serif
|
|
617
|
+
stack reads as a different, larger type scale even at equal size. Inheriting the row's own font
|
|
618
|
+
puts both on one consistent scale. */
|
|
619
|
+
.jini-chat-pane .jini-composer-slash-argument,
|
|
620
|
+
.jini-chat-pane .jini-composer-slash-confirm-badge {
|
|
621
|
+
font-family: inherit;
|
|
622
|
+
font-size: inherit;
|
|
623
|
+
font-weight: 400;
|
|
624
|
+
color: var(--jini-chat-muted);
|
|
625
|
+
}
|
|
626
|
+
.jini-chat-pane .jini-composer-file-input {
|
|
627
|
+
position: absolute;
|
|
628
|
+
width: 1px;
|
|
629
|
+
height: 1px;
|
|
630
|
+
overflow: hidden;
|
|
631
|
+
clip: rect(0, 0, 0, 0);
|
|
632
|
+
white-space: nowrap;
|
|
633
|
+
clip-path: inset(50%);
|
|
634
|
+
}
|
|
635
|
+
.jini-chat-pane .jini-composer-attach {
|
|
636
|
+
display: inline-flex;
|
|
637
|
+
align-items: center;
|
|
638
|
+
justify-content: center;
|
|
639
|
+
width: 32px;
|
|
640
|
+
height: 32px;
|
|
641
|
+
padding: 0;
|
|
642
|
+
color: var(--jini-chat-muted);
|
|
643
|
+
background: transparent;
|
|
644
|
+
border: 1px solid transparent;
|
|
645
|
+
border-radius: 8px;
|
|
646
|
+
cursor: pointer;
|
|
647
|
+
}
|
|
648
|
+
.jini-chat-pane .jini-composer-attach:hover:not(:disabled) {
|
|
649
|
+
color: var(--jini-chat-text);
|
|
650
|
+
background: var(--jini-chat-panel);
|
|
651
|
+
border-color: var(--jini-chat-border);
|
|
652
|
+
}
|
|
653
|
+
.jini-chat-pane .jini-composer-attach:disabled { opacity: .45; cursor: default; }
|
|
654
|
+
.jini-composer-spinner,
|
|
655
|
+
.jini-runtime-spinner { animation: jini-chat-spin .8s linear infinite; }
|
|
656
|
+
@keyframes jini-chat-spin { to { transform: rotate(360deg); } }
|
|
657
|
+
.jini-chat-pane .jini-composer-footer-accessories {
|
|
658
|
+
display: flex;
|
|
659
|
+
margin-left: auto;
|
|
660
|
+
min-width: 0;
|
|
661
|
+
}
|
|
662
|
+
.jini-chat-pane .jini-composer-send {
|
|
663
|
+
display: grid;
|
|
664
|
+
place-items: center;
|
|
665
|
+
width: 32px;
|
|
666
|
+
height: 32px;
|
|
667
|
+
padding: 0;
|
|
668
|
+
color: white;
|
|
669
|
+
background: var(--jini-chat-text-strong);
|
|
670
|
+
border: 0;
|
|
671
|
+
border-radius: 8px;
|
|
672
|
+
cursor: pointer;
|
|
673
|
+
}
|
|
674
|
+
.jini-chat-pane .jini-composer-send:disabled {
|
|
675
|
+
color: #aaa59e;
|
|
676
|
+
background: #ece8e2;
|
|
677
|
+
cursor: default;
|
|
678
|
+
}
|
|
679
|
+
.jini-chat-pane__workdir {
|
|
680
|
+
display: flex;
|
|
681
|
+
align-items: center;
|
|
682
|
+
gap: 7px;
|
|
683
|
+
min-width: 0;
|
|
684
|
+
padding: 5px 4px 0;
|
|
685
|
+
color: var(--jini-chat-muted);
|
|
686
|
+
font-size: 13px;
|
|
687
|
+
}
|
|
688
|
+
.jini-chat-pane__workdir code {
|
|
689
|
+
overflow: hidden;
|
|
690
|
+
text-overflow: ellipsis;
|
|
691
|
+
white-space: nowrap;
|
|
692
|
+
}
|
|
693
|
+
.jini-chat-pane .jini-working-dir-picker {
|
|
694
|
+
position: relative;
|
|
695
|
+
display: inline-flex;
|
|
696
|
+
align-items: flex-start;
|
|
697
|
+
}
|
|
698
|
+
.jini-chat-pane .jini-working-dir-trigger-row {
|
|
699
|
+
display: inline-flex;
|
|
700
|
+
align-items: center;
|
|
701
|
+
gap: 2px;
|
|
702
|
+
}
|
|
703
|
+
.jini-chat-pane .jini-working-dir-trigger {
|
|
704
|
+
appearance: none;
|
|
705
|
+
display: inline-flex;
|
|
706
|
+
align-items: center;
|
|
707
|
+
gap: 6px;
|
|
708
|
+
padding: 4px 6px;
|
|
709
|
+
color: var(--jini-chat-muted);
|
|
710
|
+
background: transparent;
|
|
711
|
+
border: 0;
|
|
712
|
+
border-radius: 8px;
|
|
713
|
+
font: inherit;
|
|
714
|
+
font-size: 13px;
|
|
715
|
+
cursor: pointer;
|
|
716
|
+
}
|
|
717
|
+
.jini-chat-pane .jini-working-dir-trigger:hover,
|
|
718
|
+
.jini-chat-pane .jini-working-dir-trigger:focus-visible {
|
|
719
|
+
color: var(--jini-chat-text-strong);
|
|
720
|
+
background: var(--jini-chat-subtle);
|
|
721
|
+
outline: none;
|
|
722
|
+
}
|
|
723
|
+
.jini-chat-pane .jini-working-dir-trigger.invalid { color: var(--danger); }
|
|
724
|
+
.jini-chat-pane .jini-working-dir-trigger-icon { flex: 0 0 auto; opacity: .75; }
|
|
725
|
+
.jini-chat-pane .jini-working-dir-trigger.invalid .jini-working-dir-trigger-icon {
|
|
726
|
+
color: var(--danger);
|
|
727
|
+
opacity: 1;
|
|
728
|
+
}
|
|
729
|
+
.jini-chat-pane .jini-working-dir-trigger-label {
|
|
730
|
+
max-width: 240px;
|
|
731
|
+
overflow: hidden;
|
|
732
|
+
text-overflow: ellipsis;
|
|
733
|
+
white-space: nowrap;
|
|
734
|
+
}
|
|
735
|
+
.jini-chat-pane .jini-working-dir-trigger-chevron { flex: 0 0 auto; opacity: .55; }
|
|
736
|
+
.jini-chat-pane .jini-working-dir-panel,
|
|
737
|
+
.jini-chat-pane .jini-working-dir-flyout {
|
|
738
|
+
position: absolute;
|
|
739
|
+
z-index: 90;
|
|
740
|
+
display: flex;
|
|
741
|
+
flex-direction: column;
|
|
742
|
+
min-width: 210px;
|
|
743
|
+
padding: 5px;
|
|
744
|
+
background: var(--jini-chat-panel);
|
|
745
|
+
border: 1px solid var(--jini-chat-border-strong);
|
|
746
|
+
border-radius: 12px;
|
|
747
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 10px 28px -10px rgba(0, 0, 0, .18);
|
|
748
|
+
}
|
|
749
|
+
.jini-chat-pane .jini-working-dir-panel {
|
|
750
|
+
top: calc(100% + 6px);
|
|
751
|
+
left: 0;
|
|
752
|
+
}
|
|
753
|
+
.jini-chat-pane .jini-working-dir-panel.up {
|
|
754
|
+
top: auto;
|
|
755
|
+
bottom: calc(100% + 6px);
|
|
756
|
+
}
|
|
757
|
+
.jini-chat-pane .jini-working-dir-item {
|
|
758
|
+
appearance: none;
|
|
759
|
+
display: flex;
|
|
760
|
+
align-items: center;
|
|
761
|
+
gap: 9px;
|
|
762
|
+
width: 100%;
|
|
763
|
+
min-height: 32px;
|
|
764
|
+
padding: 0 9px;
|
|
765
|
+
color: var(--jini-chat-text-strong);
|
|
766
|
+
background: transparent;
|
|
767
|
+
border: 0;
|
|
768
|
+
border-radius: 8px;
|
|
769
|
+
font: inherit;
|
|
770
|
+
font-size: 13px;
|
|
771
|
+
text-align: left;
|
|
772
|
+
cursor: pointer;
|
|
773
|
+
}
|
|
774
|
+
.jini-chat-pane .jini-working-dir-item:hover,
|
|
775
|
+
.jini-chat-pane .jini-working-dir-item:focus-visible,
|
|
776
|
+
.jini-chat-pane .jini-working-dir-recent-item:hover,
|
|
777
|
+
.jini-chat-pane .jini-working-dir-recent-item:focus-visible {
|
|
778
|
+
background: var(--jini-chat-subtle);
|
|
779
|
+
outline: none;
|
|
780
|
+
}
|
|
781
|
+
.jini-chat-pane .jini-working-dir-item-icon { flex: 0 0 auto; opacity: .8; }
|
|
782
|
+
.jini-chat-pane .jini-working-dir-item > span {
|
|
783
|
+
flex: 1 1 auto;
|
|
784
|
+
min-width: 0;
|
|
785
|
+
overflow: hidden;
|
|
786
|
+
text-overflow: ellipsis;
|
|
787
|
+
white-space: nowrap;
|
|
788
|
+
}
|
|
789
|
+
.jini-chat-pane .jini-working-dir-item-chevron { margin-left: auto; opacity: .55; }
|
|
790
|
+
.jini-chat-pane .jini-working-dir-submenu-row { position: relative; }
|
|
791
|
+
.jini-chat-pane .jini-working-dir-flyout {
|
|
792
|
+
top: -5px;
|
|
793
|
+
left: 100%;
|
|
794
|
+
z-index: 91;
|
|
795
|
+
min-width: 220px;
|
|
796
|
+
max-width: 320px;
|
|
797
|
+
margin-left: 4px;
|
|
798
|
+
}
|
|
799
|
+
.jini-chat-pane .jini-working-dir-flyout.up { top: auto; bottom: -5px; }
|
|
800
|
+
.jini-chat-pane .jini-working-dir-flyout::before {
|
|
801
|
+
position: absolute;
|
|
802
|
+
top: 0;
|
|
803
|
+
left: -8px;
|
|
804
|
+
width: 8px;
|
|
805
|
+
height: 100%;
|
|
806
|
+
content: "";
|
|
807
|
+
}
|
|
808
|
+
.jini-chat-pane .jini-working-dir-recent-item {
|
|
809
|
+
appearance: none;
|
|
810
|
+
display: grid;
|
|
811
|
+
grid-template-rows: auto auto;
|
|
812
|
+
grid-template-columns: auto 1fr;
|
|
813
|
+
align-items: center;
|
|
814
|
+
width: 100%;
|
|
815
|
+
min-height: 36px;
|
|
816
|
+
padding: 4px 9px;
|
|
817
|
+
color: var(--jini-chat-text-strong);
|
|
818
|
+
background: transparent;
|
|
819
|
+
border: 0;
|
|
820
|
+
border-radius: 8px;
|
|
821
|
+
font: inherit;
|
|
822
|
+
text-align: left;
|
|
823
|
+
cursor: pointer;
|
|
824
|
+
column-gap: 9px;
|
|
825
|
+
}
|
|
826
|
+
.jini-chat-pane .jini-working-dir-recent-item .jini-working-dir-item-icon {
|
|
827
|
+
grid-row: 1 / span 2;
|
|
828
|
+
}
|
|
829
|
+
.jini-chat-pane .jini-working-dir-recent-name,
|
|
830
|
+
.jini-chat-pane .jini-working-dir-recent-path {
|
|
831
|
+
grid-column: 2;
|
|
832
|
+
overflow: hidden;
|
|
833
|
+
text-overflow: ellipsis;
|
|
834
|
+
white-space: nowrap;
|
|
835
|
+
}
|
|
836
|
+
.jini-chat-pane .jini-working-dir-recent-name { font-size: 13px; }
|
|
837
|
+
.jini-chat-pane .jini-working-dir-recent-path {
|
|
838
|
+
color: var(--jini-chat-muted);
|
|
839
|
+
font-size: 11px;
|
|
840
|
+
opacity: .7;
|
|
841
|
+
}
|
|
842
|
+
.jini-chat-pane .jini-working-dir-empty {
|
|
843
|
+
padding: 8px 10px;
|
|
844
|
+
color: var(--jini-chat-muted);
|
|
845
|
+
font-size: 12px;
|
|
846
|
+
white-space: nowrap;
|
|
847
|
+
opacity: .7;
|
|
848
|
+
}
|
|
849
|
+
.jini-runtime-picker { position: relative; }
|
|
850
|
+
.jini-runtime-trigger {
|
|
851
|
+
display: inline-grid;
|
|
852
|
+
grid-template-columns: 24px 14px;
|
|
853
|
+
align-items: center;
|
|
854
|
+
gap: 7px;
|
|
855
|
+
height: 32px;
|
|
856
|
+
min-width: 0;
|
|
857
|
+
padding: 3px 7px 3px 5px;
|
|
858
|
+
color: var(--jini-chat-text);
|
|
859
|
+
background: transparent;
|
|
860
|
+
border: 0;
|
|
861
|
+
border-radius: 8px;
|
|
862
|
+
cursor: pointer;
|
|
863
|
+
}
|
|
864
|
+
.jini-runtime-trigger:hover { background: var(--jini-chat-subtle); }
|
|
865
|
+
.jini-runtime-trigger__copy { display: none; }
|
|
866
|
+
.jini-runtime-trigger__copy strong {
|
|
867
|
+
overflow: hidden;
|
|
868
|
+
max-width: 122px;
|
|
869
|
+
font-size: 11px;
|
|
870
|
+
font-weight: 650;
|
|
871
|
+
text-overflow: ellipsis;
|
|
872
|
+
white-space: nowrap;
|
|
873
|
+
}
|
|
874
|
+
.jini-runtime-trigger__copy small {
|
|
875
|
+
overflow: hidden;
|
|
876
|
+
max-width: 122px;
|
|
877
|
+
color: var(--jini-chat-muted);
|
|
878
|
+
font-size: 9px;
|
|
879
|
+
text-overflow: ellipsis;
|
|
880
|
+
white-space: nowrap;
|
|
881
|
+
}
|
|
882
|
+
.jini-runtime-trigger__chevron { color: var(--jini-chat-muted); font-size: 12px; }
|
|
883
|
+
.jini-runtime-agent-icon.agent-icon { flex: 0 0 auto; object-fit: contain; }
|
|
884
|
+
.jini-runtime-agent-icon.agent-icon-mono {
|
|
885
|
+
display: inline-block;
|
|
886
|
+
background-color: currentColor;
|
|
887
|
+
-webkit-mask-repeat: no-repeat;
|
|
888
|
+
mask-repeat: no-repeat;
|
|
889
|
+
-webkit-mask-position: center;
|
|
890
|
+
mask-position: center;
|
|
891
|
+
-webkit-mask-size: contain;
|
|
892
|
+
mask-size: contain;
|
|
893
|
+
}
|
|
894
|
+
.jini-runtime-agent-icon.agent-icon-fallback {
|
|
895
|
+
display: inline-flex;
|
|
896
|
+
align-items: center;
|
|
897
|
+
justify-content: center;
|
|
898
|
+
color: #74716b;
|
|
899
|
+
background: #f4f5f7;
|
|
900
|
+
border: 1px solid #e1e5eb;
|
|
901
|
+
border-radius: 6px;
|
|
902
|
+
font-weight: 700;
|
|
903
|
+
}
|
|
904
|
+
.jini-runtime-popover {
|
|
905
|
+
--jini-chat-panel: #fdfcfa;
|
|
906
|
+
--jini-chat-text: #1a1916;
|
|
907
|
+
--jini-chat-text-strong: #0d0c0a;
|
|
908
|
+
--jini-chat-muted: #74716b;
|
|
909
|
+
--jini-chat-faint: #b3b0a8;
|
|
910
|
+
--jini-chat-border: #e1e5eb;
|
|
911
|
+
--jini-chat-border-soft: #edf0f4;
|
|
912
|
+
--jini-chat-subtle: #f4f5f7;
|
|
913
|
+
box-sizing: border-box;
|
|
914
|
+
padding: 8px;
|
|
915
|
+
color: var(--jini-chat-text);
|
|
916
|
+
background: var(--jini-chat-panel);
|
|
917
|
+
border: 1px solid var(--jini-chat-border);
|
|
918
|
+
border-radius: 12px;
|
|
919
|
+
box-shadow: 0 18px 46px rgba(13, 12, 10, .15), 0 2px 8px rgba(13, 12, 10, .06);
|
|
920
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei UI", "Noto Sans", Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
921
|
+
font-size: 13.5px;
|
|
922
|
+
line-height: 1.5;
|
|
923
|
+
-webkit-font-smoothing: antialiased;
|
|
924
|
+
}
|
|
925
|
+
.jini-runtime-popover__head {
|
|
926
|
+
display: flex;
|
|
927
|
+
flex-direction: column;
|
|
928
|
+
gap: 3px;
|
|
929
|
+
padding: 10px 12px 12px;
|
|
930
|
+
border-bottom: 1px solid var(--jini-chat-border-soft);
|
|
931
|
+
}
|
|
932
|
+
.jini-runtime-popover__head strong { color: var(--jini-chat-text-strong); font-size: 14px; font-weight: 650; }
|
|
933
|
+
.jini-runtime-popover__head span { color: var(--jini-chat-muted); font-size: 12px; }
|
|
934
|
+
.jini-runtime-mode,
|
|
935
|
+
.jini-runtime-agent,
|
|
936
|
+
.jini-runtime-rescan {
|
|
937
|
+
display: flex;
|
|
938
|
+
align-items: center;
|
|
939
|
+
gap: 11px;
|
|
940
|
+
box-sizing: border-box;
|
|
941
|
+
width: 100%;
|
|
942
|
+
min-height: 40px;
|
|
943
|
+
padding: 8px 11px;
|
|
944
|
+
color: var(--jini-chat-text);
|
|
945
|
+
background: transparent;
|
|
946
|
+
border: 0;
|
|
947
|
+
border-radius: 8px;
|
|
948
|
+
text-align: left;
|
|
949
|
+
cursor: pointer;
|
|
950
|
+
}
|
|
951
|
+
.jini-runtime-mode:hover,
|
|
952
|
+
.jini-runtime-agent:hover:not(:disabled),
|
|
953
|
+
.jini-runtime-rescan:hover:not(:disabled) { background: var(--jini-chat-subtle); }
|
|
954
|
+
.jini-runtime-mode.is-active { font-weight: 650; }
|
|
955
|
+
.jini-runtime-mode:disabled,
|
|
956
|
+
.jini-runtime-agent:disabled,
|
|
957
|
+
.jini-runtime-rescan:disabled { color: var(--jini-chat-faint); cursor: default; }
|
|
958
|
+
.jini-runtime-mode__meta,
|
|
959
|
+
.jini-runtime-agent__status {
|
|
960
|
+
margin-left: auto;
|
|
961
|
+
color: var(--jini-chat-muted);
|
|
962
|
+
font-size: 12px;
|
|
963
|
+
white-space: nowrap;
|
|
964
|
+
}
|
|
965
|
+
.jini-runtime-check { flex: 0 0 auto; color: var(--jini-chat-text); }
|
|
966
|
+
.jini-runtime-section-label {
|
|
967
|
+
padding: 12px 11px 5px;
|
|
968
|
+
color: var(--jini-chat-faint);
|
|
969
|
+
font-size: 11px;
|
|
970
|
+
font-weight: 650;
|
|
971
|
+
letter-spacing: .08em;
|
|
972
|
+
text-transform: uppercase;
|
|
973
|
+
}
|
|
974
|
+
.jini-runtime-agent.is-active { background: transparent; }
|
|
975
|
+
.jini-runtime-agent__copy {
|
|
976
|
+
display: flex;
|
|
977
|
+
flex: 1;
|
|
978
|
+
flex-direction: column;
|
|
979
|
+
min-width: 0;
|
|
980
|
+
}
|
|
981
|
+
.jini-runtime-agent__copy strong { font-size: 13.5px; font-weight: 500; }
|
|
982
|
+
.jini-runtime-agent__copy small {
|
|
983
|
+
overflow: hidden;
|
|
984
|
+
color: #8b857e;
|
|
985
|
+
font-size: 10px;
|
|
986
|
+
text-overflow: ellipsis;
|
|
987
|
+
white-space: nowrap;
|
|
988
|
+
}
|
|
989
|
+
.jini-runtime-empty { padding: 10px 11px; color: var(--jini-chat-muted); font-size: 12px; }
|
|
990
|
+
.jini-runtime-models {
|
|
991
|
+
display: flex;
|
|
992
|
+
flex-direction: column;
|
|
993
|
+
gap: 9px;
|
|
994
|
+
margin-top: 5px;
|
|
995
|
+
padding: 10px 11px 8px;
|
|
996
|
+
border-top: 1px dashed var(--jini-chat-border);
|
|
997
|
+
}
|
|
998
|
+
.jini-runtime-select {
|
|
999
|
+
display: flex;
|
|
1000
|
+
flex-direction: column;
|
|
1001
|
+
gap: 5px;
|
|
1002
|
+
color: var(--jini-chat-muted);
|
|
1003
|
+
font-size: 13px;
|
|
1004
|
+
}
|
|
1005
|
+
.jini-runtime-select select {
|
|
1006
|
+
box-sizing: border-box;
|
|
1007
|
+
width: 100%;
|
|
1008
|
+
min-height: 40px;
|
|
1009
|
+
padding: 7px 10px;
|
|
1010
|
+
color: var(--jini-chat-text);
|
|
1011
|
+
background: var(--jini-chat-panel);
|
|
1012
|
+
border: 1px solid var(--jini-chat-border);
|
|
1013
|
+
border-radius: 8px;
|
|
1014
|
+
}
|
|
1015
|
+
/*
|
|
1016
|
+
* The BYOK model, rendered as a value rather than a control — see RuntimeByokDetails for why it
|
|
1017
|
+
* is not a disabled select. It occupies the same box the sibling selects do so the row still
|
|
1018
|
+
* reads as part of the same list, but carries no border: a bordered box with no affordance is
|
|
1019
|
+
* exactly the "looks editable, isn't" shape the plain text exists to avoid.
|
|
1020
|
+
*/
|
|
1021
|
+
/*
|
|
1022
|
+
* The BYOK model list, which CustomSelect portals to document.body. runtimePopoverPosition puts
|
|
1023
|
+
* the runtime popover at z-index 1000; the shared .jini-select-menu default is 60, which is right
|
|
1024
|
+
* everywhere else and puts this menu behind the very popover that opened it. One above the
|
|
1025
|
+
* popover, not far above: it must clear its own surface and nothing else.
|
|
1026
|
+
*/
|
|
1027
|
+
.jini-select-menu.jini-runtime-model-menu {
|
|
1028
|
+
z-index: 1001;
|
|
1029
|
+
}
|
|
1030
|
+
.jini-runtime-byok-model strong {
|
|
1031
|
+
box-sizing: border-box;
|
|
1032
|
+
display: flex;
|
|
1033
|
+
align-items: center;
|
|
1034
|
+
min-height: 40px;
|
|
1035
|
+
padding: 7px 10px;
|
|
1036
|
+
color: var(--jini-chat-text);
|
|
1037
|
+
font-weight: 600;
|
|
1038
|
+
word-break: break-all;
|
|
1039
|
+
}
|
|
1040
|
+
/*
|
|
1041
|
+
* Tool-call cards (ToolCard.tsx) and the per-turn usage summary (MessageRow.tsx) ship no CSS of
|
|
1042
|
+
* their own — see this file's own header note on why the package supplies a default theme at all.
|
|
1043
|
+
* Collapsed by default (.op-card-head is the only always-visible part), so a run with a dozen tool
|
|
1044
|
+
* calls reads as a dozen one-line rows, not a page of raw JSON.
|
|
1045
|
+
*/
|
|
1046
|
+
.jini-chat-pane .jini-message-tools {
|
|
1047
|
+
display: flex;
|
|
1048
|
+
flex-direction: column;
|
|
1049
|
+
gap: 6px;
|
|
1050
|
+
width: 100%;
|
|
1051
|
+
}
|
|
1052
|
+
.jini-chat-pane .op-card {
|
|
1053
|
+
border: 1px solid var(--jini-chat-border);
|
|
1054
|
+
border-radius: var(--radius);
|
|
1055
|
+
background: var(--jini-chat-subtle);
|
|
1056
|
+
overflow: hidden;
|
|
1057
|
+
font-size: 13px;
|
|
1058
|
+
}
|
|
1059
|
+
.jini-chat-pane .op-card-head {
|
|
1060
|
+
display: flex;
|
|
1061
|
+
align-items: center;
|
|
1062
|
+
gap: 8px;
|
|
1063
|
+
width: 100%;
|
|
1064
|
+
padding: 7px 10px;
|
|
1065
|
+
background: none;
|
|
1066
|
+
border: 0;
|
|
1067
|
+
font: inherit;
|
|
1068
|
+
text-align: left;
|
|
1069
|
+
cursor: pointer;
|
|
1070
|
+
color: inherit;
|
|
1071
|
+
}
|
|
1072
|
+
.jini-chat-pane .op-status { display: inline-flex; flex-shrink: 0; }
|
|
1073
|
+
.jini-chat-pane .op-status-ok { color: #4e875f; }
|
|
1074
|
+
.jini-chat-pane .op-status-error { color: var(--danger); }
|
|
1075
|
+
.jini-chat-pane .op-status-running { color: var(--jini-chat-accent); }
|
|
1076
|
+
.jini-chat-pane .op-title { font-weight: 600; flex-shrink: 0; }
|
|
1077
|
+
.jini-chat-pane .shimmer-text { opacity: .6; }
|
|
1078
|
+
.jini-chat-pane .op-meta {
|
|
1079
|
+
color: var(--jini-chat-muted);
|
|
1080
|
+
overflow: hidden;
|
|
1081
|
+
text-overflow: ellipsis;
|
|
1082
|
+
white-space: nowrap;
|
|
1083
|
+
flex: 1;
|
|
1084
|
+
min-width: 0;
|
|
1085
|
+
}
|
|
1086
|
+
.jini-chat-pane .op-expand-chev { flex-shrink: 0; color: var(--jini-chat-faint); }
|
|
1087
|
+
/* Collapsed by default: 0 max-height clips the inner content, no display:none — keeps the height
|
|
1088
|
+
transition instead of an instant jump cut. */
|
|
1089
|
+
.jini-chat-pane .accordion-collapsible { max-height: 0; overflow: hidden; transition: max-height .15s ease; }
|
|
1090
|
+
.jini-chat-pane .accordion-collapsible.open { max-height: 480px; overflow-y: auto; }
|
|
1091
|
+
.jini-chat-pane .accordion-collapsible-inner { padding: 0 10px 10px; }
|
|
1092
|
+
.jini-chat-pane .op-card-detail { display: flex; flex-direction: column; gap: 6px; }
|
|
1093
|
+
.jini-chat-pane .op-path,
|
|
1094
|
+
.jini-chat-pane .op-command,
|
|
1095
|
+
.jini-chat-pane .op-output {
|
|
1096
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
1097
|
+
font-size: 12px;
|
|
1098
|
+
background: var(--jini-chat-panel);
|
|
1099
|
+
border: 1px solid var(--jini-chat-border);
|
|
1100
|
+
border-radius: 6px;
|
|
1101
|
+
padding: 6px 8px;
|
|
1102
|
+
margin: 0;
|
|
1103
|
+
white-space: pre-wrap;
|
|
1104
|
+
word-break: break-word;
|
|
1105
|
+
}
|
|
1106
|
+
.jini-chat-pane .op-open {
|
|
1107
|
+
border: 1px solid var(--jini-chat-border-strong);
|
|
1108
|
+
border-radius: 6px;
|
|
1109
|
+
background: var(--jini-chat-panel);
|
|
1110
|
+
padding: 2px 8px;
|
|
1111
|
+
font-size: 11px;
|
|
1112
|
+
cursor: pointer;
|
|
1113
|
+
}
|
|
1114
|
+
/* The "Done · 6m 29s · 2612 out · $0.4028" line — real numbers from the run's own kind:'usage' event. */
|
|
1115
|
+
.jini-chat-pane .jini-message-usage {
|
|
1116
|
+
display: flex;
|
|
1117
|
+
align-items: center;
|
|
1118
|
+
gap: 6px;
|
|
1119
|
+
font-size: 11px;
|
|
1120
|
+
color: var(--jini-chat-muted);
|
|
1121
|
+
margin-top: 2px;
|
|
1122
|
+
}
|
|
1123
|
+
.jini-chat-pane .jini-message-usage-dot { font-size: 8px; color: #4e875f; }
|
|
1124
|
+
/*
|
|
1125
|
+
* Fenced code block ('Markdown.tsx''s 'renderBlock' case 'code') and inline 'code' span visual
|
|
1126
|
+
* treatment — previously entirely unstyled (bare UA-default '<pre><code>', no background, border,
|
|
1127
|
+
* or padding; a downstream admin host's own stylesheet already flagged this gap in a note next to
|
|
1128
|
+
* its unrelated horizontal-scroll fix for the same element). Lives HERE, in the package's own
|
|
1129
|
+
* injected default theme, rather than in a host's stylesheet: a host CAN already remap the exact
|
|
1130
|
+
* '--jini-chat-*' custom properties this rule reads (one such host's '.admin-chat-dock .jini-chat-
|
|
1131
|
+
* pane' block already does, for every other rule in this file), so putting the fix here makes every
|
|
1132
|
+
* Jini host look correct by default AND lets a host match its own palette for free, with no new
|
|
1133
|
+
* host-side override rule needed at all — the reverse (host-only CSS) would leave every other
|
|
1134
|
+
* embedder of '@jini-ai/chat' with the same unstyled '<pre>' this fix exists to correct.
|
|
1135
|
+
* 'max-width'/'overflow-x' here duplicate (harmlessly) a narrower fix that same host's own
|
|
1136
|
+
* '.jini-message-content pre' rule already carries for its own fixed-width dock specifically — this
|
|
1137
|
+
* package cannot assume every host has that rule, so a real host-agnostic default belongs here too.
|
|
1138
|
+
* NOTE: this comment avoids backtick quoting on purpose — this whole stylesheet lives inside a JS
|
|
1139
|
+
* template literal, so a literal backtick here would terminate the string, not just this comment.
|
|
1140
|
+
*/
|
|
1141
|
+
.jini-chat-pane .jini-message-content pre {
|
|
1142
|
+
margin: 6px 0;
|
|
1143
|
+
max-width: 100%;
|
|
1144
|
+
overflow-x: auto;
|
|
1145
|
+
padding: 10px 12px;
|
|
1146
|
+
background: var(--jini-chat-subtle);
|
|
1147
|
+
border: 1px solid var(--jini-chat-border);
|
|
1148
|
+
border-radius: 8px;
|
|
1149
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
1150
|
+
font-size: 12.5px;
|
|
1151
|
+
line-height: 1.5;
|
|
1152
|
+
}
|
|
1153
|
+
.jini-chat-pane .jini-message-content pre code {
|
|
1154
|
+
padding: 0;
|
|
1155
|
+
background: none;
|
|
1156
|
+
border: 0;
|
|
1157
|
+
color: inherit;
|
|
1158
|
+
font: inherit;
|
|
1159
|
+
}
|
|
1160
|
+
.jini-chat-pane .jini-message-content :not(pre) > code {
|
|
1161
|
+
padding: .15em .4em;
|
|
1162
|
+
background: var(--jini-chat-subtle);
|
|
1163
|
+
border: 1px solid var(--jini-chat-border);
|
|
1164
|
+
border-radius: 4px;
|
|
1165
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
1166
|
+
font-size: .9em;
|
|
1167
|
+
}
|
|
1168
|
+
/*
|
|
1169
|
+
* Copy affordance for a fenced code block ('Markdown.tsx''s 'CodeBlock'/'CopyCodeButton'). The
|
|
1170
|
+
* button lives in its own toolbar row fused to the TOP of the '<pre>' below, not overlaid on top
|
|
1171
|
+
* of the code itself — an overlay would sit over whatever text happens to render at that corner,
|
|
1172
|
+
* and '<pre>' already carries its own horizontal scrollbar along its own bottom edge, so a row
|
|
1173
|
+
* above it can never collide with that scrollbar either. '.jini-md-code-block' takes over the
|
|
1174
|
+
* '<pre>' rule's own top/bottom margin above so the two don't stack, and the toolbar/pre pair
|
|
1175
|
+
* share one rounded box (toolbar keeps the top corners, '<pre>' below loses them) instead of two
|
|
1176
|
+
* separately-bordered boxes stacked on each other.
|
|
1177
|
+
*/
|
|
1178
|
+
.jini-chat-pane .jini-message-content .jini-md-code-block {
|
|
1179
|
+
margin: 6px 0;
|
|
1180
|
+
}
|
|
1181
|
+
.jini-chat-pane .jini-message-content .jini-md-code-block pre {
|
|
1182
|
+
margin: 0;
|
|
1183
|
+
border-top: 0;
|
|
1184
|
+
border-top-left-radius: 0;
|
|
1185
|
+
border-top-right-radius: 0;
|
|
1186
|
+
}
|
|
1187
|
+
.jini-chat-pane .jini-md-code-toolbar {
|
|
1188
|
+
display: flex;
|
|
1189
|
+
justify-content: flex-end;
|
|
1190
|
+
padding: 3px;
|
|
1191
|
+
background: var(--jini-chat-subtle);
|
|
1192
|
+
border: 1px solid var(--jini-chat-border);
|
|
1193
|
+
border-bottom: 0;
|
|
1194
|
+
border-radius: 8px 8px 0 0;
|
|
1195
|
+
}
|
|
1196
|
+
.jini-chat-pane .jini-md-code-copy {
|
|
1197
|
+
display: inline-flex;
|
|
1198
|
+
align-items: center;
|
|
1199
|
+
justify-content: center;
|
|
1200
|
+
width: 22px;
|
|
1201
|
+
height: 22px;
|
|
1202
|
+
padding: 0;
|
|
1203
|
+
color: var(--jini-chat-faint);
|
|
1204
|
+
background: none;
|
|
1205
|
+
border: 0;
|
|
1206
|
+
border-radius: 6px;
|
|
1207
|
+
cursor: pointer;
|
|
1208
|
+
}
|
|
1209
|
+
.jini-chat-pane .jini-md-code-copy:hover { color: var(--jini-chat-muted); background: var(--jini-chat-border); }
|
|
1210
|
+
.jini-chat-pane .jini-md-code-copy:focus-visible { outline: 2px solid var(--jini-chat-accent); outline-offset: 1px; }
|
|
1211
|
+
/* Visually hidden but present in the DOM (never display:none) so this polite live region still
|
|
1212
|
+
gets announced — same clip-rect technique 'jini-message-copy-status' above already uses. */
|
|
1213
|
+
.jini-chat-pane .jini-md-code-copy-status {
|
|
1214
|
+
position: absolute;
|
|
1215
|
+
width: 1px;
|
|
1216
|
+
height: 1px;
|
|
1217
|
+
overflow: hidden;
|
|
1218
|
+
clip: rect(0, 0, 0, 0);
|
|
1219
|
+
white-space: nowrap;
|
|
1220
|
+
}
|
|
1221
|
+
/*
|
|
1222
|
+
* GFM pipe tables ('Markdown.tsx''s 'TableBlock') — same reasoning as the code-block rules directly
|
|
1223
|
+
* above for living in the package's own default theme rather than a host stylesheet. '.jini-md-
|
|
1224
|
+
* table-wrap' gets its own horizontal scrollbar so a wide table scrolls internally instead of
|
|
1225
|
+
* dragging '.jini-message-list' sideways with it (the exact failure mode that same downstream host's
|
|
1226
|
+
* stylesheet documents for the code-block case — the same fix shape applies here). The "Expand
|
|
1227
|
+
* table" button only renders ('TableBlock''s own logic) once the table has genuinely overflowed
|
|
1228
|
+
* that wrap.
|
|
1229
|
+
*/
|
|
1230
|
+
.jini-md-table-wrap {
|
|
1231
|
+
max-width: 100%;
|
|
1232
|
+
overflow-x: auto;
|
|
1233
|
+
}
|
|
1234
|
+
.jini-md-table {
|
|
1235
|
+
border-collapse: collapse;
|
|
1236
|
+
font-size: 12.5px;
|
|
1237
|
+
}
|
|
1238
|
+
/*
|
|
1239
|
+
* 'min-width' here, not on '.jini-md-table' itself, and picked per column rather than as one flat
|
|
1240
|
+
* table-wide number -- a flat table minimum sized for a typical 2-column table would leave a
|
|
1241
|
+
* 5-column table crushed just as badly as before (same failure this comment's neighbor above
|
|
1242
|
+
* describes), while one sized for 5 columns would force pointless overflow on a simple 2-column
|
|
1243
|
+
* table. Per-cell 'min-width' scales the effective table floor with the real column count instead.
|
|
1244
|
+
* 130px was picked empirically, not guessed: measured (real Chromium, not jsdom -- 'scrollWidth'/
|
|
1245
|
+
* 'clientWidth' are unimplemented there) against this package's narrowest known real host, an
|
|
1246
|
+
* admin chat dock fixed at 380px wide ('admin-chat-dock' in that host's own stylesheet), which
|
|
1247
|
+
* nets out to roughly 238px of usable width once that dock's own message-list padding, the 80%
|
|
1248
|
+
* message-bubble cap, and this content's own padding are all applied. Below 120px per column the
|
|
1249
|
+
* table still fits inside those 238px and never overflows -- the exact bug this fix exists to
|
|
1250
|
+
* correct. 130px was chosen just above that measured 120px crossover (a small margin so it clears
|
|
1251
|
+
* reliably rather than sitting exactly on the boundary) and reads as a genuinely defensible per-
|
|
1252
|
+
* column floor on its own terms too: with this rule's own 6px/10px cell padding subtracted, it
|
|
1253
|
+
* leaves about 110px of text room, roughly 14-16 characters per wrapped line at this rule's 12.5px
|
|
1254
|
+
* font -- enough that a table cell wraps in short phrases instead of one word per line, which is
|
|
1255
|
+
* the readability floor this fix is actually chasing. One real consequence, verified rather than
|
|
1256
|
+
* hand-waved: at this width, ANY 2-column table in that narrow dock now overflows and gets the
|
|
1257
|
+
* "Expand table" affordance, including ones with short cell content -- there is no per-cell
|
|
1258
|
+
* min-width value that can overflow a long-prose 2-column table without also overflowing a short
|
|
1259
|
+
* one at the same column count, because the browser's own auto-layout table-width algorithm sizes
|
|
1260
|
+
* the table to the greater of its container's width and the sum of each column's own minimum --
|
|
1261
|
+
* content length past that minimum only changes how much a column wraps internally, never whether
|
|
1262
|
+
* the table exceeds its wrap. Accepted here: in a surface already this narrow, showing "Expand
|
|
1263
|
+
* table" a little more eagerly is the better failure mode than silently crushing a table's own
|
|
1264
|
+
* content illegibly, which is the state this whole rule exists to fix.
|
|
1265
|
+
*/
|
|
1266
|
+
.jini-md-table th,
|
|
1267
|
+
.jini-md-table td {
|
|
1268
|
+
padding: 6px 10px;
|
|
1269
|
+
min-width: 130px;
|
|
1270
|
+
border: 1px solid var(--jini-chat-border);
|
|
1271
|
+
text-align: left;
|
|
1272
|
+
}
|
|
1273
|
+
.jini-md-table th {
|
|
1274
|
+
background: var(--jini-chat-subtle);
|
|
1275
|
+
color: var(--jini-chat-text-strong);
|
|
1276
|
+
font-weight: 650;
|
|
1277
|
+
}
|
|
1278
|
+
.jini-md-table-expand {
|
|
1279
|
+
margin-top: 4px;
|
|
1280
|
+
padding: 4px 10px;
|
|
1281
|
+
color: var(--jini-chat-muted);
|
|
1282
|
+
background: var(--jini-chat-panel);
|
|
1283
|
+
border: 1px solid var(--jini-chat-border);
|
|
1284
|
+
border-radius: 999px;
|
|
1285
|
+
font-size: 11px;
|
|
1286
|
+
cursor: pointer;
|
|
1287
|
+
}
|
|
1288
|
+
.jini-md-table-expand:hover { color: var(--jini-chat-text-strong); }
|
|
1289
|
+
.jini-md-table-modal {
|
|
1290
|
+
max-width: min(90vw, 900px);
|
|
1291
|
+
max-height: 80vh;
|
|
1292
|
+
overflow: auto;
|
|
1293
|
+
padding: 20px;
|
|
1294
|
+
color: var(--jini-chat-text);
|
|
1295
|
+
background: var(--jini-chat-panel);
|
|
1296
|
+
border: 1px solid var(--jini-chat-border);
|
|
1297
|
+
border-radius: 12px;
|
|
1298
|
+
box-shadow: 0 18px 46px rgba(13, 12, 10, .15), 0 2px 8px rgba(13, 12, 10, .06);
|
|
1299
|
+
}
|
|
1300
|
+
.jini-md-table-modal::backdrop {
|
|
1301
|
+
background: rgba(0, 0, 0, .4);
|
|
1302
|
+
}
|
|
1303
|
+
.jini-md-table-modal-close {
|
|
1304
|
+
position: absolute;
|
|
1305
|
+
top: 10px;
|
|
1306
|
+
right: 10px;
|
|
1307
|
+
width: 28px;
|
|
1308
|
+
height: 28px;
|
|
1309
|
+
color: var(--jini-chat-muted);
|
|
1310
|
+
background: transparent;
|
|
1311
|
+
border: 0;
|
|
1312
|
+
border-radius: 6px;
|
|
1313
|
+
font-size: 16px;
|
|
1314
|
+
line-height: 1;
|
|
1315
|
+
cursor: pointer;
|
|
1316
|
+
}
|
|
1317
|
+
.jini-md-table-modal-close:hover {
|
|
1318
|
+
color: var(--jini-chat-text-strong);
|
|
1319
|
+
background: var(--jini-chat-subtle);
|
|
1320
|
+
}
|
|
1321
|
+
@media (max-width: 560px) {
|
|
1322
|
+
.jini-chat-pane__header { padding-inline: 16px; }
|
|
1323
|
+
.jini-chat-pane .jini-message-list { padding-inline: 16px; }
|
|
1324
|
+
.jini-chat-pane__controls { padding-inline: 10px; }
|
|
1325
|
+
}
|
|
1326
|
+
`;
|
|
1327
|
+
//# sourceMappingURL=styles.js.map
|