@wix/astro 0.2.13 → 0.2.15

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.
Files changed (80) hide show
  1. package/dist/components/TailwindEditor/EditorPanel.d.ts +11 -0
  2. package/dist/components/TailwindEditor/EditorPanel.js +86 -0
  3. package/dist/components/TailwindEditor/dev-toolbar-app.d.ts +14 -0
  4. package/dist/components/TailwindEditor/dev-toolbar-app.js +39 -0
  5. package/dist/components/TailwindEditor/dev-toolbar.d.ts +13 -0
  6. package/dist/components/TailwindEditor/dev-toolbar.js +547 -0
  7. package/dist/components/TailwindEditor/index.d.ts +5 -0
  8. package/dist/components/TailwindEditor/index.js +155 -0
  9. package/dist/components/TailwindEditor/integration.d.ts +3 -0
  10. package/dist/components/TailwindEditor/integration.js +18 -0
  11. package/dist/components/TailwindEditor/types.d.ts +35 -0
  12. package/dist/components/TailwindEditor/types.js +2 -0
  13. package/dist/components/TailwindEditor/utils.d.ts +22 -0
  14. package/dist/components/TailwindEditor/utils.js +234 -0
  15. package/dist/components/login-helpers/bi-header-generator.d.ts +11 -0
  16. package/dist/components/login-helpers/bi-header-generator.js +18 -0
  17. package/dist/components/login-helpers/iframeUtils.d.ts +4 -0
  18. package/dist/components/login-helpers/iframeUtils.js +44 -0
  19. package/dist/components/login-helpers/login-helpers.d.ts +39 -0
  20. package/dist/components/login-helpers/login-helpers.js +117 -0
  21. package/dist/dev-toolbar/Editor/EditorPanel.d.ts +14 -0
  22. package/dist/dev-toolbar/Editor/EditorPanel.js +1273 -0
  23. package/dist/dev-toolbar/Editor/classes.d.ts +12 -0
  24. package/dist/dev-toolbar/Editor/classes.js +271 -0
  25. package/dist/dev-toolbar/Editor/dnd.d.ts +34 -0
  26. package/dist/dev-toolbar/Editor/dnd.js +1161 -0
  27. package/dist/dev-toolbar/Editor/index.d.ts +5 -0
  28. package/dist/dev-toolbar/Editor/index.js +136 -0
  29. package/dist/dev-toolbar/Editor/types.d.ts +42 -0
  30. package/dist/dev-toolbar/Editor/types.js +2 -0
  31. package/dist/dev-toolbar/agent-chat.d.ts +14 -0
  32. package/dist/dev-toolbar/agent-chat.js +362 -0
  33. package/dist/dev-toolbar/ai-agent-server.d.ts +1 -0
  34. package/dist/dev-toolbar/ai-agent-server.js +174 -0
  35. package/dist/dev-toolbar/ai-agent.d.ts +2 -0
  36. package/dist/dev-toolbar/ai-agent.js +171 -0
  37. package/dist/dev-toolbar/api-key-form.d.ts +7 -0
  38. package/dist/dev-toolbar/api-key-form.js +138 -0
  39. package/dist/dev-toolbar/astro-toolbar.d.ts +1156 -0
  40. package/dist/dev-toolbar/astro-toolbar.js +29 -0
  41. package/dist/dev-toolbar/editor.d.ts +2 -0
  42. package/dist/dev-toolbar/editor.js +19 -0
  43. package/dist/integration.d.ts +3 -1
  44. package/dist/integration.js +41 -10
  45. package/dist/routes/auth/callback.js +1 -1
  46. package/dist/src/auth-context.d.ts +5 -0
  47. package/dist/src/auth-context.js +3 -0
  48. package/dist/src/client.d.ts +15 -0
  49. package/dist/src/client.js +17 -0
  50. package/dist/src/entrypoints/server.d.ts +13 -0
  51. package/dist/src/entrypoints/server.js +37 -0
  52. package/dist/src/index.d.ts +5 -0
  53. package/dist/src/index.js +5 -0
  54. package/dist/src/integration.d.ts +8 -0
  55. package/dist/src/integration.js +229 -0
  56. package/dist/src/loaders/blog.d.ts +2 -0
  57. package/dist/src/loaders/blog.js +49 -0
  58. package/dist/src/loaders/index.d.ts +2 -0
  59. package/dist/src/loaders/index.js +3 -0
  60. package/dist/src/middleware.d.ts +2 -0
  61. package/dist/src/middleware.js +90 -0
  62. package/dist/src/routes/auth/callback.d.ts +3 -0
  63. package/dist/src/routes/auth/callback.js +53 -0
  64. package/dist/src/routes/auth/constants.d.ts +5 -0
  65. package/dist/src/routes/auth/constants.js +6 -0
  66. package/dist/src/routes/auth/login.d.ts +3 -0
  67. package/dist/src/routes/auth/login.js +27 -0
  68. package/dist/src/routes/auth/logout-callback.d.ts +3 -0
  69. package/dist/src/routes/auth/logout-callback.js +10 -0
  70. package/dist/src/routes/auth/logout.d.ts +3 -0
  71. package/dist/src/routes/auth/logout.js +11 -0
  72. package/dist/src/routes/auth/runtime.d.ts +5 -0
  73. package/dist/src/routes/auth/runtime.js +8 -0
  74. package/dist/src/runtime.d.ts +2 -0
  75. package/dist/src/runtime.js +9 -0
  76. package/dist/src/vite-plugins/sdk-context.d.ts +4 -0
  77. package/dist/src/vite-plugins/sdk-context.js +68 -0
  78. package/dist/vite-plugins/sdk-context.d.ts +3 -1
  79. package/dist/vite-plugins/sdk-context.js +51 -70
  80. package/package.json +6 -3
@@ -0,0 +1,174 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { loadEnv } from 'vite';
4
+ import { Anthropic } from '@anthropic-ai/sdk';
5
+ // Check if Anthropic API key exists in environment variables
6
+ function checkAnthropicApiKey() {
7
+ const env = loadEnv(process.env["NODE_ENV"] ?? "development", process.cwd(), "");
8
+ return env["ANTHROPIC_API_KEY"] || null;
9
+ }
10
+ // Save API key to .env.local file
11
+ async function saveApiKey(apiKey) {
12
+ try {
13
+ const envFilePath = path.join(process.cwd(), '.env.local');
14
+ // Check if file exists and read its contents
15
+ let contents = '';
16
+ try {
17
+ contents = await fs.promises.readFile(envFilePath, 'utf-8');
18
+ }
19
+ catch (error) {
20
+ // File doesn't exist, create a new one
21
+ contents = '';
22
+ }
23
+ // Check if ANTHROPIC_API_KEY already exists in the file
24
+ const keyRegex = /^ANTHROPIC_API_KEY=.*/m;
25
+ if (keyRegex.test(contents)) {
26
+ // Replace existing key
27
+ contents = contents.replace(keyRegex, `ANTHROPIC_API_KEY=${apiKey}`);
28
+ }
29
+ else {
30
+ // Add new key
31
+ contents += `\nANTHROPIC_API_KEY=${apiKey}\n`;
32
+ }
33
+ // Write to file
34
+ await fs.promises.writeFile(envFilePath, contents);
35
+ return true;
36
+ }
37
+ catch (error) {
38
+ console.error('Error saving API key:', error);
39
+ return false;
40
+ }
41
+ }
42
+ // Send message to Anthropic using the SDK
43
+ async function sendMessageToAnthropic(apiKey, messages, maxTokens = 1024) {
44
+ try {
45
+ // Initialize the Anthropic client with the API key
46
+ const anthropic = new Anthropic({
47
+ apiKey: apiKey,
48
+ });
49
+ // Convert our messages to Anthropic's format properly typed for the SDK
50
+ const anthropicMessages = messages
51
+ .filter(msg => msg.role === 'user' || msg.role === 'assistant')
52
+ .map(msg => ({
53
+ role: msg.role === 'user' ? 'user' : 'assistant',
54
+ content: msg.content
55
+ }));
56
+ // Send the message to Anthropic API using the SDK
57
+ const message = await anthropic.messages.create({
58
+ model: 'claude-3-7-sonnet-latest',
59
+ messages: anthropicMessages,
60
+ max_tokens: maxTokens,
61
+ });
62
+ // Extract the text content from the response
63
+ let responseText = 'I received your message but can only respond with text at the moment.';
64
+ // Safely access content if it exists
65
+ if (message.content && message.content.length > 0) {
66
+ const firstContent = message.content[0];
67
+ if (firstContent && firstContent.type === 'text' && 'text' in firstContent) {
68
+ responseText = firstContent.text;
69
+ }
70
+ }
71
+ // Return in our Message format
72
+ return {
73
+ role: 'assistant',
74
+ content: responseText
75
+ };
76
+ }
77
+ catch (error) {
78
+ console.error('Error communicating with Anthropic API:', error);
79
+ return null;
80
+ }
81
+ }
82
+ // Function to setup server-side handlers for the AI agent
83
+ export function setupAIAgentServer(toolbar) {
84
+ console.log('Setting up AI Agent server');
85
+ // Store conversation history
86
+ const conversationHistory = [];
87
+ // Listen for the client initialization request and check API key
88
+ toolbar.on('wix-ai-agent:initialized', () => {
89
+ console.log('Checking for Anthropic API key...');
90
+ const apiKey = checkAnthropicApiKey();
91
+ if (apiKey) {
92
+ console.log('API key found, sending initial messages');
93
+ toolbar.send('wix-ai-agent:api-key-status', { exists: true });
94
+ // Add welcome message to history
95
+ const welcomeMessage = {
96
+ role: 'assistant',
97
+ content: 'Hello! I am the Wix AI Assistant. How can I help you with your Astro site today?'
98
+ };
99
+ conversationHistory.push(welcomeMessage);
100
+ // Send the welcome message to the client
101
+ toolbar.send('wix-ai-agent:response', { message: welcomeMessage });
102
+ }
103
+ else {
104
+ console.log('API key not found, requesting from user');
105
+ toolbar.send('wix-ai-agent:api-key-status', { exists: false });
106
+ }
107
+ });
108
+ // Handle API key submission
109
+ toolbar.on('wix-ai-agent:save-api-key', async (data) => {
110
+ console.log('Received API key from user');
111
+ const success = await saveApiKey(data.apiKey);
112
+ if (success) {
113
+ console.log('API key saved successfully');
114
+ toolbar.send('wix-ai-agent:api-key-saved', { success: true });
115
+ // Add welcome message to history
116
+ const welcomeMessage = {
117
+ role: 'assistant',
118
+ content: 'Thank you! Your API key has been saved. How can I help you with your Astro site today?'
119
+ };
120
+ conversationHistory.push(welcomeMessage);
121
+ // Send the welcome message to the client
122
+ toolbar.send('wix-ai-agent:response', { message: welcomeMessage });
123
+ }
124
+ else {
125
+ console.log('Failed to save API key');
126
+ toolbar.send('wix-ai-agent:api-key-saved', { success: false, error: 'Failed to save API key' });
127
+ }
128
+ });
129
+ // Handle user messages
130
+ toolbar.on('wix-ai-agent:user-message', async (data) => {
131
+ console.log('Received message from user:', data.message);
132
+ // Add user message to conversation history
133
+ const userMessage = {
134
+ role: 'user',
135
+ content: data.message
136
+ };
137
+ conversationHistory.push(userMessage);
138
+ // Send a "thinking" status to the client
139
+ toolbar.send('wix-ai-agent:thinking', { isThinking: true });
140
+ try {
141
+ // Get API key
142
+ const apiKey = checkAnthropicApiKey();
143
+ if (!apiKey) {
144
+ throw new Error('API key not found');
145
+ }
146
+ // Send message to Anthropic API
147
+ const aiResponse = await sendMessageToAnthropic(apiKey, conversationHistory);
148
+ if (aiResponse) {
149
+ // Add AI response to conversation history
150
+ conversationHistory.push(aiResponse);
151
+ // Send response back to client
152
+ toolbar.send('wix-ai-agent:response', { message: aiResponse });
153
+ }
154
+ else {
155
+ throw new Error('Failed to get response from Anthropic API');
156
+ }
157
+ }
158
+ catch (error) {
159
+ console.error('Error processing message:', error);
160
+ // Send error message to client
161
+ const errorMessage = {
162
+ role: 'assistant',
163
+ content: `Sorry, I encountered an error: ${error instanceof Error ? error.message : 'Unknown error'}`
164
+ };
165
+ conversationHistory.push(errorMessage);
166
+ toolbar.send('wix-ai-agent:response', { message: errorMessage });
167
+ }
168
+ finally {
169
+ // End thinking status
170
+ toolbar.send('wix-ai-agent:thinking', { isThinking: false });
171
+ }
172
+ });
173
+ }
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYWdlbnQtc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Rldi10b29sYmFyL2FpLWFnZW50LXNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTlDLDZEQUE2RDtBQUM3RCxTQUFTLG9CQUFvQjtJQUMzQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksYUFBYSxFQUN4QyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQ2IsRUFBRSxDQUNILENBQUM7SUFFRixPQUFPLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUMxQyxDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLEtBQUssVUFBVSxVQUFVLENBQUMsTUFBYztJQUN0QyxJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUUzRCw2Q0FBNkM7UUFDN0MsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQztZQUNILFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLHVDQUF1QztZQUN2QyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsTUFBTSxRQUFRLEdBQUcsd0JBQXdCLENBQUM7UUFDMUMsSUFB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
@@ -0,0 +1,2 @@
1
+ declare const _default: import("astro").DevToolbarApp;
2
+ export default _default;
@@ -0,0 +1,171 @@
1
+ import { defineToolbarApp } from "astro/toolbar";
2
+ import React, { useState, useEffect } from "react";
3
+ import { createRoot } from "react-dom/client";
4
+ import { AgentChat } from "./agent-chat.js";
5
+ import { AstroIcon } from "./astro-toolbar.js";
6
+ import { ApiKeyForm } from "./api-key-form.js";
7
+ // Agent component that manages the state and UI
8
+ function Agent({ server }) {
9
+ const [messages, setMessages] = useState([]);
10
+ const [isSavingApiKey, setIsSavingApiKey] = useState(false);
11
+ const [apiKey, setApiKey] = useState(null);
12
+ const [error, setError] = useState('');
13
+ const [isLoading, setIsLoading] = useState(true);
14
+ const [isTyping, setIsTyping] = useState(false);
15
+ const [isInitialized, setIsInitialized] = useState(false);
16
+ useEffect(() => {
17
+ if (!isInitialized) {
18
+ // Tell the server the AI agent has been initialized
19
+ server.send('wix-ai-agent:initialized', {});
20
+ // Listen for API key status
21
+ const handleApiKeyStatus = (data) => {
22
+ if (data.exists) {
23
+ setApiKey(data.apiKey || 'placeholder-for-ui');
24
+ }
25
+ setIsLoading(false);
26
+ setIsInitialized(true);
27
+ };
28
+ // Listen for API key save response
29
+ const handleApiKeySaved = (data) => {
30
+ setIsSavingApiKey(false);
31
+ if (data.success) {
32
+ setApiKey('placeholder-for-ui');
33
+ }
34
+ else {
35
+ console.error('Failed to save API key:', data.error);
36
+ setError(data.error || 'Failed to save API key');
37
+ }
38
+ };
39
+ // Listen for responses to messages
40
+ const handleResponse = (data) => {
41
+ setIsTyping(false);
42
+ setMessages(prevMessages => [...prevMessages, data.message]);
43
+ };
44
+ // Listen for thinking status
45
+ const handleThinking = (data) => {
46
+ setIsTyping(data.isThinking);
47
+ };
48
+ server.on('wix-ai-agent:api-key-status', handleApiKeyStatus);
49
+ server.on('wix-ai-agent:api-key-saved', handleApiKeySaved);
50
+ server.on('wix-ai-agent:response', handleResponse);
51
+ server.on('wix-ai-agent:thinking', handleThinking);
52
+ }
53
+ }, []);
54
+ const handleApiKeySubmit = (newApiKey) => {
55
+ setIsSavingApiKey(true);
56
+ setError('');
57
+ // Send API key to server
58
+ server.send('wix-ai-agent:save-api-key', { apiKey: newApiKey });
59
+ };
60
+ const handleSendMessage = (userMessage) => {
61
+ // Add user message to the chat
62
+ const updatedMessages = [...messages, { role: "user", content: userMessage }];
63
+ setMessages(updatedMessages);
64
+ // Show typing indicator
65
+ setIsTyping(true);
66
+ // Send message to server
67
+ server.send('wix-ai-agent:user-message', { message: userMessage });
68
+ };
69
+ console.log('isLoading', isLoading);
70
+ if (isLoading) {
71
+ return (React.createElement("div", { style: { padding: '24px', textAlign: 'center' } },
72
+ React.createElement("div", { style: { marginBottom: '16px' } },
73
+ React.createElement(AstroIcon, { icon: "astro:logo" })),
74
+ React.createElement("p", null, "Loading...")));
75
+ }
76
+ if (!apiKey) {
77
+ return (React.createElement(ApiKeyForm, { onSubmit: handleApiKeySubmit, isSaving: isSavingApiKey, error: error, setError: setError }));
78
+ }
79
+ return (React.createElement(AgentChat, { messages: messages, isTyping: isTyping, onSendMessage: handleSendMessage }));
80
+ }
81
+ export default defineToolbarApp({
82
+ init(canvas, _app, server) {
83
+ // Add keyframes for animations and global styles
84
+ const styleEl = document.createElement('style');
85
+ styleEl.textContent = `
86
+ @keyframes pulseDot {
87
+ 0%, 100% { opacity: 0.4; transform: scale(0.8); }
88
+ 50% { opacity: 1; transform: scale(1); }
89
+ }
90
+
91
+ /* Define font smoothing for better rendering */
92
+ * {
93
+ -webkit-font-smoothing: antialiased;
94
+ -moz-osx-font-smoothing: grayscale;
95
+ }
96
+
97
+ /* Markdown styles */
98
+ .markdown-content {
99
+ line-height: 1.5;
100
+ }
101
+ .markdown-content p {
102
+ margin: 0 0 8px 0;
103
+ }
104
+ .markdown-content p:last-child {
105
+ margin-bottom: 0;
106
+ }
107
+ .markdown-content h1, .markdown-content h2, .markdown-content h3,
108
+ .markdown-content h4, .markdown-content h5, .markdown-content h6 {
109
+ margin-top: 12px;
110
+ margin-bottom: 8px;
111
+ font-weight: 600;
112
+ }
113
+ .markdown-content h1 { font-size: 1.5em; }
114
+ .markdown-content h2 { font-size: 1.3em; }
115
+ .markdown-content h3 { font-size: 1.1em; }
116
+ .markdown-content pre {
117
+ background-color: #f3f4f6;
118
+ padding: 8px;
119
+ border-radius: 4px;
120
+ overflow-x: auto;
121
+ margin: 8px 0;
122
+ }
123
+ .markdown-content code {
124
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
125
+ font-size: 0.9em;
126
+ background-color: #f3f4f6;
127
+ padding: 2px 4px;
128
+ border-radius: 3px;
129
+ }
130
+ .markdown-content pre code {
131
+ background-color: transparent;
132
+ padding: 0;
133
+ }
134
+ .markdown-content ul, .markdown-content ol {
135
+ margin: 8px 0;
136
+ padding-left: 20px;
137
+ }
138
+ .markdown-content blockquote {
139
+ margin: 8px 0;
140
+ padding-left: 12px;
141
+ border-left: 3px solid #d1d5db;
142
+ color: #4b5563;
143
+ }
144
+ .markdown-content a {
145
+ color: #2563eb;
146
+ text-decoration: none;
147
+ }
148
+ .markdown-content a:hover {
149
+ text-decoration: underline;
150
+ }
151
+ .markdown-content table {
152
+ border-collapse: collapse;
153
+ margin: 8px 0;
154
+ overflow-x: auto;
155
+ display: block;
156
+ }
157
+ .markdown-content th, .markdown-content td {
158
+ border: 1px solid #d1d5db;
159
+ padding: 6px 10px;
160
+ }
161
+ .markdown-content th {
162
+ background-color: #f9fafb;
163
+ }
164
+ `;
165
+ canvas.appendChild(styleEl);
166
+ // Initialize React root for rendering
167
+ const root = createRoot(canvas);
168
+ root.render(React.createElement(Agent, { server: server }));
169
+ },
170
+ });
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGV2LXRvb2xiYXIvYWktYWdlbnQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQXdCLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUvQyxnREFBZ0Q7QUFDaEQsU0FBUyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQW1CO0lBQ3hDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQzFELE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELE1BQU0sQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFMUQsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixvREFBb0Q7WUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUU1Qyw0QkFBNEI7WUFDNUIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLElBQTBDLEVBQUUsRUFBRTtnQkFDeEUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLG9CQUFvQixDQUFDLENBQUM7Z0JBQ2pELENBQUM7Z0JBQ0QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQUM7WUFFRixtQ0FBbUM7WUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQTBDLEVBQUUsRUFBRTtnQkFDdkUsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXpCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNqQixTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDbEMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyRCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSx3QkFBd0IsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsbUNBQW1DO1lBQ25DLE1BQU0sY0FBYyxHQUFHLENBQUMsSUFBMEIsRUFBRSxFQUFFO2dCQUNwRCxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25CLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDL0QsQ0FBQyxDQUFDO1lBRUYsNkJBQTZCO1lBQzdCLE1BQU0sY0FBYyxHQUFHLENBQUMsSUFBNkIsRUFBRSxFQUFFO2dCQUN2RCxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9CLENBQUMsQ0FBQztZQUVGLE1BQU0sQ0FBQyxFQUFFLENBQUMsNkJBQTZCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUM3RCxNQUFNLENBQUMsRUFBRSxDQUFDLDRCQUE0QixFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDM0QsTUFBTSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsRUFBRSxDQUFDLHVCQUF1QixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxNQUFNLGtCQUFrQixHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFO1FBQy9DLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUViLHlCQUF5QjtRQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDO0lBRUYsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRTtRQUNoRCwrQkFBK0I7UUFDL0IsTUFBTSxlQUFlLEdBQUcsQ0FBQyxHQUFHLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFxQixFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU3Qix3QkFBd0I7UUFDeEIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxCLHlCQUF5QjtRQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQyxDQUFDO0lBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFcEMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FDTCw2QkFBSyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUU7WUFDbEQsNkJBQUssS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRTtnQkFDbEMsb0JBQUMsU0FBUyxJQUFDLElBQUksRUFBQyxZQUFZLEdBQWEsQ0FDckM7WUFDTiw0Q0FBaUIsQ0FDYixDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxDQUNMLG9CQUFDLFVBQVUsSUFDVCxRQUFRLEVBQUUsa0JBQWtCLEVBQzVCLFFBQVEsRUFBRSxjQUFjLEVBQ3hCLEtBQUssRUFBRSxLQUFLLEVBQ1osUUFBUSxFQUFFLFFBQVEsR0FDbEIsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sQ0FDTCxvQkFBQyxTQUFTLElBQ1IsUUFBUSxFQUFFLFFBQVEsRUFDbEIsUUFBUSxFQUFFLFFBQVEsRUFDbEIsYUFBYSxFQUFFLGlCQUFpQixHQUNoQyxDQUNILENBQUM7QUFDSixDQUFDO0FBRUQsZUFBZSxnQkFBZ0IsQ0FBQztJQUM5QixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNO1FBQ3ZCLGlEQUFpRDtRQUNqRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxXQUFXLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0ErRXJCLENBQUM7UUFDRixNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVCLHNDQUFzQztRQUN0QyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBQyxLQUFLLElBQUMsTUFBTSxFQUFFLE1BQU0sR0FBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNGLENBQUMsQ0FBQyJ9
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ export declare function ApiKeyForm({ onSubmit, isSaving, error, setError }: {
3
+ onSubmit: (apiKey: string) => void;
4
+ isSaving: boolean;
5
+ error: string;
6
+ setError: (error: string) => void;
7
+ }): React.DOMElement<React.DOMAttributes<Element>, Element>;
@@ -0,0 +1,138 @@
1
+ import React, { useState } from "react";
2
+ import { AstroButton, AstroCard, AstroIcon } from "./astro-toolbar.js";
3
+ // API Key Form component using Astro toolbar custom elements with React 19
4
+ export function ApiKeyForm({ onSubmit, isSaving, error, setError }) {
5
+ const [apiKey, setApiKey] = useState('');
6
+ const handleSubmit = (e) => {
7
+ e.preventDefault();
8
+ if (!apiKey.trim()) {
9
+ setError('API key is required');
10
+ return;
11
+ }
12
+ // Basic format validation for Anthropic API keys
13
+ if (!apiKey.trim().startsWith('sk-ant-')) {
14
+ setError('Invalid API key format. Anthropic API keys should start with "sk-ant-"');
15
+ return;
16
+ }
17
+ onSubmit(apiKey);
18
+ };
19
+ return (React.createElement('astro-dev-toolbar-window', null, React.createElement("div", { className: "api-key-container" },
20
+ React.createElement("div", { className: "header" },
21
+ React.createElement(AstroIcon, { icon: "gear", style: { width: '16px', height: '16px' } }),
22
+ React.createElement("h2", null, "Anthropic API Key Required")),
23
+ React.createElement("p", { className: "description" },
24
+ "To use the AI Assistant, you need to provide your Anthropic API key. This key will be saved in your project's ",
25
+ React.createElement("code", null, ".env.local"),
26
+ " file."),
27
+ React.createElement("div", { className: "note-container" },
28
+ React.createElement(AstroCard, { cardStyle: "purple", icon: "info" }, "Note: Your API key is stored locally and is only used to communicate with Anthropic's API.")),
29
+ error && (React.createElement("div", { className: "error-message" },
30
+ React.createElement("span", { role: "img", "aria-label": "Warning" }, "\u26A0\uFE0F"),
31
+ error)),
32
+ React.createElement("form", { onSubmit: handleSubmit },
33
+ React.createElement("div", { className: "form-group" },
34
+ React.createElement("label", { htmlFor: "api-key-input" }, "Anthropic API Key"),
35
+ React.createElement("input", { id: "api-key-input", type: "text", value: apiKey, onChange: (e) => {
36
+ setApiKey(e.target.value);
37
+ if (error)
38
+ setError('');
39
+ }, placeholder: "sk-ant-..." }),
40
+ React.createElement("div", { className: "input-help" },
41
+ React.createElement("span", null,
42
+ "Format: ",
43
+ React.createElement("code", null, "sk-ant-...")),
44
+ React.createElement("a", { href: "https://console.anthropic.com/", target: "_blank", rel: "noopener noreferrer" }, "Get an API key"))),
45
+ React.createElement("div", { className: "button-container" },
46
+ React.createElement(AstroButton, { buttonStyle: "purple", disabled: isSaving, onClick: handleSubmit }, isSaving ? 'Saving...' : 'Save API Key'))),
47
+ React.createElement("style", null, `
48
+ .api-key-container {
49
+ padding: 20px;
50
+ max-width: 100%;
51
+ box-sizing: border-box;
52
+ }
53
+
54
+ .header {
55
+ display: flex;
56
+ align-items: center;
57
+ gap: 8px;
58
+ margin-bottom: 16px;
59
+ }
60
+
61
+ .header h2 {
62
+ font-size: 16px;
63
+ font-weight: 600;
64
+ margin: 0;
65
+ }
66
+
67
+ .description {
68
+ font-size: 14px;
69
+ margin-bottom: 16px;
70
+ line-height: 1.5;
71
+ }
72
+
73
+ .note-container {
74
+ margin-bottom: 20px;
75
+ }
76
+
77
+ .error-message {
78
+ background-color: rgba(220, 38, 38, 0.2);
79
+ padding: 10px;
80
+ border-radius: 4px;
81
+ margin-bottom: 16px;
82
+ font-size: 14px;
83
+ color: #f87171;
84
+ display: flex;
85
+ align-items: center;
86
+ gap: 8px;
87
+ }
88
+
89
+ .form-group {
90
+ margin-bottom: 16px;
91
+ }
92
+
93
+ .form-group label {
94
+ display: block;
95
+ font-size: 14px;
96
+ font-weight: 500;
97
+ margin-bottom: 6px;
98
+ }
99
+
100
+ .form-group input {
101
+ width: 100%;
102
+ padding: 8px 10px;
103
+ font-size: 14px;
104
+ border-radius: 4px;
105
+ border: 1px solid var(--astro-toolbar-color-gray-6, #4b5563);
106
+ background-color: var(--astro-toolbar-color-gray-8, #1e1e1e);
107
+ color: var(--astro-toolbar-color-gray-1, #ffffff);
108
+ box-sizing: border-box;
109
+ }
110
+
111
+ .input-help {
112
+ display: flex;
113
+ justify-content: space-between;
114
+ margin-top: 6px;
115
+ font-size: 12px;
116
+ }
117
+
118
+ .input-help a {
119
+ color: var(--astro-toolbar-accent-color, #818cf8);
120
+ text-decoration: none;
121
+ }
122
+
123
+ .input-help a:hover {
124
+ text-decoration: underline;
125
+ }
126
+
127
+ .button-container {
128
+ display: flex;
129
+ justify-content: flex-end;
130
+ margin-bottom: 16px;
131
+ }
132
+
133
+ .card-container {
134
+ margin-top: 16px;
135
+ }
136
+ `))));
137
+ }
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWtleS1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Rldi10b29sYmFyL2FwaS1rZXktZm9ybS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkUsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBSy9EO0lBQ0MsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFekMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFrQixFQUFFLEVBQUU7UUFDMUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRW5CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNuQixRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pDLFFBQVEsQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO1lBQ25GLE9BQU87UUFDVCxDQUFDO1FBRUQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGLE9BQU8sQ0FDTCxLQUFLLENBQUMsYUFBYSxDQUFDLDBCQUEwQixFQUFFLElBQUksRUFDbEQsNkJBQUssU0FBUyxFQUFDLG1CQUFtQjtRQUNoQyw2QkFBSyxTQUFTLEVBQUMsUUFBUTtZQUNyQixvQkFBQyxTQUFTLElBQUMsSUFBSSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBSTtZQUNuRSw2REFBbUMsQ0FDL0I7UUFFTiwyQkFBRyxTQUFTLEVBQUMsYUFBYTs7WUFFaUIsK0NBQXVCO3FCQUM5RDtRQUVKLDZCQUFLLFNBQVMsRUFBQyxnQkFBZ0I7WUFDN0Isb0JBQUMsU0FBUyxJQUFDLFNBQVMsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLE1BQU0saUdBRTdCLENBQ1I7UUFFTCxLQUFLLElBQUksQ0FDUiw2QkFBSyxTQUFTLEVBQUMsZUFBZTtZQUM1Qiw4QkFBTSxJQUFJLEVBQUMsS0FBSyxnQkFBWSxTQUFTLG1CQUFVO1lBQzlDLEtBQUssQ0FDRixDQUNQO1FBRUQsOEJBQU0sUUFBUSxFQUFFLFlBQVk7WUFDMUIsNkJBQUssU0FBUyxFQUFDLFlBQVk7Z0JBQ3pCLCtCQUFPLE9BQU8sRUFBQyxlQUFlLHdCQUV0QjtnQkFDUiwrQkFDRSxFQUFFLEVBQUMsZUFBZSxFQUNsQixJQUFJLEVBQUMsTUFBTSxFQUNYLEtBQUssRUFBRSxNQUFNLEVBQ2IsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ2QsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzFCLElBQUksS0FBSzs0QkFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzFCLENBQUMsRUFDRCxXQUFXLEVBQUMsWUFBWSxHQUN4QjtnQkFDRiw2QkFBSyxTQUFTLEVBQUMsWUFBWTtvQkFDekI7O3dCQUFjLCtDQUF1QixDQUFPO29CQUM1QywyQkFDRSxJQUFJLEVBQUMsZ0NBQWdDLEVBQ3JDLE1BQU0sRUFBQyxRQUFRLEVBQ2YsR0FBRyxFQUFDLHFCQUFxQixxQkFHdkIsQ0FDQSxDQUNGO1lBRU4sNkJBQUssU0FBUyxFQUFDLGtCQUFrQjtnQkFDL0Isb0JBQUMsV0FBVyxJQUNWLFdBQVcsRUFBQyxRQUFRLEVBQ3BCLFFBQVEsRUFBRSxRQUFRLEVBQ2xCLE9BQU8sRUFBRSxZQUFZLElBRXBCLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQzVCLENBQ1YsQ0FDRDtRQUVQLG1DQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQXlGUCxDQUFTLENBQ04sQ0FDUCxDQUNGLENBQUM7QUFDSixDQUFDIn0=