@tpitre/story-ui 2.2.0 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.sample +82 -11
- package/README.md +89 -0
- package/dist/cli/deploy.d.ts +17 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +696 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +26 -2
- package/dist/cli/setup.d.ts +11 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +437 -110
- package/dist/mcp-server/index.d.ts +2 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +120 -2
- package/dist/mcp-server/mcp-stdio-server.d.ts +3 -0
- package/dist/mcp-server/mcp-stdio-server.d.ts.map +1 -0
- package/dist/mcp-server/mcp-stdio-server.js +8 -1
- package/dist/mcp-server/routes/claude.d.ts +3 -0
- package/dist/mcp-server/routes/claude.d.ts.map +1 -0
- package/dist/mcp-server/routes/claude.js +60 -23
- package/dist/mcp-server/routes/components.d.ts +4 -0
- package/dist/mcp-server/routes/components.d.ts.map +1 -0
- package/dist/mcp-server/routes/frameworks.d.ts +38 -0
- package/dist/mcp-server/routes/frameworks.d.ts.map +1 -0
- package/dist/mcp-server/routes/frameworks.js +183 -0
- package/dist/mcp-server/routes/generateStory.d.ts +3 -0
- package/dist/mcp-server/routes/generateStory.d.ts.map +1 -0
- package/dist/mcp-server/routes/generateStory.js +160 -76
- package/dist/mcp-server/routes/generateStoryStream.d.ts +12 -0
- package/dist/mcp-server/routes/generateStoryStream.d.ts.map +1 -0
- package/dist/mcp-server/routes/generateStoryStream.js +947 -0
- package/dist/mcp-server/routes/hybridStories.d.ts +18 -0
- package/dist/mcp-server/routes/hybridStories.d.ts.map +1 -0
- package/dist/mcp-server/routes/mcpRemote.d.ts +14 -0
- package/dist/mcp-server/routes/mcpRemote.d.ts.map +1 -0
- package/dist/mcp-server/routes/mcpRemote.js +489 -0
- package/dist/mcp-server/routes/memoryStories.d.ts +26 -0
- package/dist/mcp-server/routes/memoryStories.d.ts.map +1 -0
- package/dist/mcp-server/routes/providers.d.ts +89 -0
- package/dist/mcp-server/routes/providers.d.ts.map +1 -0
- package/dist/mcp-server/routes/providers.js +369 -0
- package/dist/mcp-server/routes/storySync.d.ts +26 -0
- package/dist/mcp-server/routes/storySync.d.ts.map +1 -0
- package/dist/mcp-server/routes/streamTypes.d.ts +110 -0
- package/dist/mcp-server/routes/streamTypes.d.ts.map +1 -0
- package/dist/mcp-server/routes/streamTypes.js +18 -0
- package/dist/mcp-server/sessionManager.d.ts +50 -0
- package/dist/mcp-server/sessionManager.d.ts.map +1 -0
- package/dist/story-generator/componentBlacklist.d.ts +21 -0
- package/dist/story-generator/componentBlacklist.d.ts.map +1 -0
- package/dist/story-generator/componentDiscovery.d.ts +28 -0
- package/dist/story-generator/componentDiscovery.d.ts.map +1 -0
- package/dist/story-generator/componentRegistryGenerator.d.ts +49 -0
- package/dist/story-generator/componentRegistryGenerator.d.ts.map +1 -0
- package/dist/story-generator/componentRegistryGenerator.js +205 -0
- package/dist/story-generator/configLoader.d.ts +33 -0
- package/dist/story-generator/configLoader.d.ts.map +1 -0
- package/dist/story-generator/considerationsLoader.d.ts +32 -0
- package/dist/story-generator/considerationsLoader.d.ts.map +1 -0
- package/dist/story-generator/documentation-sources.d.ts +28 -0
- package/dist/story-generator/documentation-sources.d.ts.map +1 -0
- package/dist/story-generator/documentationLoader.d.ts +64 -0
- package/dist/story-generator/documentationLoader.d.ts.map +1 -0
- package/dist/story-generator/dynamicPackageDiscovery.d.ts +97 -0
- package/dist/story-generator/dynamicPackageDiscovery.d.ts.map +1 -0
- package/dist/story-generator/enhancedComponentDiscovery.d.ts +125 -0
- package/dist/story-generator/enhancedComponentDiscovery.d.ts.map +1 -0
- package/dist/story-generator/enhancedComponentDiscovery.js +111 -11
- package/dist/story-generator/framework-adapters/angular-adapter.d.ts +40 -0
- package/dist/story-generator/framework-adapters/angular-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/angular-adapter.js +427 -0
- package/dist/story-generator/framework-adapters/base-adapter.d.ts +75 -0
- package/dist/story-generator/framework-adapters/base-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/base-adapter.js +147 -0
- package/dist/story-generator/framework-adapters/framework-detector.d.ts +55 -0
- package/dist/story-generator/framework-adapters/framework-detector.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/framework-detector.js +323 -0
- package/dist/story-generator/framework-adapters/index.d.ts +97 -0
- package/dist/story-generator/framework-adapters/index.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/index.js +198 -0
- package/dist/story-generator/framework-adapters/react-adapter.d.ts +40 -0
- package/dist/story-generator/framework-adapters/react-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/react-adapter.js +316 -0
- package/dist/story-generator/framework-adapters/svelte-adapter.d.ts +40 -0
- package/dist/story-generator/framework-adapters/svelte-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/svelte-adapter.js +372 -0
- package/dist/story-generator/framework-adapters/types.d.ts +182 -0
- package/dist/story-generator/framework-adapters/types.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/types.js +8 -0
- package/dist/story-generator/framework-adapters/vue-adapter.d.ts +36 -0
- package/dist/story-generator/framework-adapters/vue-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/vue-adapter.js +336 -0
- package/dist/story-generator/framework-adapters/web-components-adapter.d.ts +54 -0
- package/dist/story-generator/framework-adapters/web-components-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/web-components-adapter.js +387 -0
- package/dist/story-generator/generateStory.d.ts +7 -0
- package/dist/story-generator/generateStory.d.ts.map +1 -0
- package/dist/story-generator/gitignoreManager.d.ts +50 -0
- package/dist/story-generator/gitignoreManager.d.ts.map +1 -0
- package/dist/story-generator/imageProcessor.d.ts +80 -0
- package/dist/story-generator/imageProcessor.d.ts.map +1 -0
- package/dist/story-generator/imageProcessor.js +391 -0
- package/dist/story-generator/inMemoryStoryService.d.ts +89 -0
- package/dist/story-generator/inMemoryStoryService.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/base-provider.d.ts +36 -0
- package/dist/story-generator/llm-providers/base-provider.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/base-provider.js +135 -0
- package/dist/story-generator/llm-providers/claude-provider.d.ts +23 -0
- package/dist/story-generator/llm-providers/claude-provider.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/claude-provider.js +414 -0
- package/dist/story-generator/llm-providers/gemini-provider.d.ts +24 -0
- package/dist/story-generator/llm-providers/gemini-provider.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/gemini-provider.js +406 -0
- package/dist/story-generator/llm-providers/index.d.ts +63 -0
- package/dist/story-generator/llm-providers/index.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/index.js +169 -0
- package/dist/story-generator/llm-providers/openai-provider.d.ts +24 -0
- package/dist/story-generator/llm-providers/openai-provider.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/openai-provider.js +458 -0
- package/dist/story-generator/llm-providers/settings-manager.d.ts +75 -0
- package/dist/story-generator/llm-providers/settings-manager.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/settings-manager.js +173 -0
- package/dist/story-generator/llm-providers/story-llm-service.d.ts +79 -0
- package/dist/story-generator/llm-providers/story-llm-service.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/story-llm-service.js +240 -0
- package/dist/story-generator/llm-providers/types.d.ts +153 -0
- package/dist/story-generator/llm-providers/types.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/types.js +8 -0
- package/dist/story-generator/logger.d.ts +14 -0
- package/dist/story-generator/logger.d.ts.map +1 -0
- package/dist/story-generator/logger.js +96 -29
- package/dist/story-generator/postProcessStory.d.ts +6 -0
- package/dist/story-generator/postProcessStory.d.ts.map +1 -0
- package/dist/story-generator/productionGitignoreManager.d.ts +91 -0
- package/dist/story-generator/productionGitignoreManager.d.ts.map +1 -0
- package/dist/story-generator/promptGenerator.d.ts +48 -0
- package/dist/story-generator/promptGenerator.d.ts.map +1 -0
- package/dist/story-generator/promptGenerator.js +186 -1
- package/dist/story-generator/storyHistory.d.ts +44 -0
- package/dist/story-generator/storyHistory.d.ts.map +1 -0
- package/dist/story-generator/storySync.d.ts +68 -0
- package/dist/story-generator/storySync.d.ts.map +1 -0
- package/dist/story-generator/storyTracker.d.ts +48 -0
- package/dist/story-generator/storyTracker.d.ts.map +1 -0
- package/dist/story-generator/storyValidator.d.ts +6 -0
- package/dist/story-generator/storyValidator.d.ts.map +1 -0
- package/dist/story-generator/universalDesignSystemAdapter.d.ts +68 -0
- package/dist/story-generator/universalDesignSystemAdapter.d.ts.map +1 -0
- package/dist/story-generator/universalDesignSystemAdapter.js +138 -1
- package/dist/story-generator/urlRedirectService.d.ts +21 -0
- package/dist/story-generator/urlRedirectService.d.ts.map +1 -0
- package/dist/story-generator/validateStory.d.ts +19 -0
- package/dist/story-generator/validateStory.d.ts.map +1 -0
- package/dist/story-generator/validateStory.js +6 -2
- package/dist/story-generator/visionPrompts.d.ts +88 -0
- package/dist/story-generator/visionPrompts.d.ts.map +1 -0
- package/dist/story-generator/visionPrompts.js +462 -0
- package/dist/story-ui.config.d.ts +78 -0
- package/dist/story-ui.config.d.ts.map +1 -0
- package/dist/templates/StoryUI/StoryUIPanel.d.ts +4 -0
- package/dist/templates/StoryUI/StoryUIPanel.d.ts.map +1 -0
- package/dist/templates/StoryUI/StoryUIPanel.js +1874 -0
- package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts +18 -0
- package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts.map +1 -0
- package/dist/templates/StoryUI/StoryUIPanel.stories.js +37 -0
- package/dist/templates/StoryUI/index.d.ts +3 -0
- package/dist/templates/StoryUI/index.d.ts.map +1 -0
- package/dist/templates/StoryUI/index.js +2 -0
- package/package.json +17 -3
- package/templates/StoryUI/StoryUIPanel.tsx +1960 -384
- package/templates/StoryUI/index.tsx +1 -1
- package/templates/StoryUI/manager.tsx +264 -0
- package/templates/production-app/.env.example +11 -0
- package/templates/production-app/index.html +66 -0
- package/templates/production-app/package.json +30 -0
- package/templates/production-app/public/favicon.svg +5 -0
- package/templates/production-app/src/App.tsx +1560 -0
- package/templates/production-app/src/LivePreviewRenderer.tsx +420 -0
- package/templates/production-app/src/componentRegistry.ts +315 -0
- package/templates/production-app/src/considerations.ts +16 -0
- package/templates/production-app/src/index.css +284 -0
- package/templates/production-app/src/main.tsx +25 -0
- package/templates/production-app/tsconfig.json +32 -0
- package/templates/production-app/tsconfig.node.json +11 -0
- package/templates/production-app/vite.config.ts +83 -0
- package/templates/react-import-rule.json +2 -2
- package/dist/index.js +0 -12
- package/dist/story-ui.config.loader.js +0 -205
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story UI Storybook Manager Addon
|
|
3
|
+
*
|
|
4
|
+
* This addon integrates with Storybook's sidebar to show generated stories.
|
|
5
|
+
* In Edge mode, it fetches stories from the Edge Worker and adds them to the sidebar.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import React, { useEffect, useState, useCallback } from 'react';
|
|
9
|
+
import { addons, types } from '@storybook/manager-api';
|
|
10
|
+
import { useStorybookApi, useChannel } from '@storybook/manager-api';
|
|
11
|
+
import { IconButton } from '@storybook/components';
|
|
12
|
+
import { styled } from '@storybook/theming';
|
|
13
|
+
|
|
14
|
+
// Addon identifier
|
|
15
|
+
const ADDON_ID = 'story-ui';
|
|
16
|
+
const PANEL_ID = `${ADDON_ID}/generated-stories`;
|
|
17
|
+
const TOOL_ID = `${ADDON_ID}/tool`;
|
|
18
|
+
|
|
19
|
+
// Event channels for communication between panel and manager
|
|
20
|
+
export const EVENTS = {
|
|
21
|
+
STORY_GENERATED: `${ADDON_ID}/story-generated`,
|
|
22
|
+
REFRESH_STORIES: `${ADDON_ID}/refresh-stories`,
|
|
23
|
+
SELECT_GENERATED_STORY: `${ADDON_ID}/select-generated-story`,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// Types
|
|
27
|
+
interface GeneratedStory {
|
|
28
|
+
id: string;
|
|
29
|
+
title: string;
|
|
30
|
+
createdAt: number;
|
|
31
|
+
framework?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Styled components
|
|
35
|
+
const SidebarContainer = styled.div`
|
|
36
|
+
padding: 10px;
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
const SectionTitle = styled.div`
|
|
40
|
+
font-size: 11px;
|
|
41
|
+
font-weight: 700;
|
|
42
|
+
color: ${({ theme }) => theme.color.mediumdark};
|
|
43
|
+
text-transform: uppercase;
|
|
44
|
+
letter-spacing: 0.35em;
|
|
45
|
+
padding: 10px 0;
|
|
46
|
+
border-bottom: 1px solid ${({ theme }) => theme.appBorderColor};
|
|
47
|
+
margin-bottom: 8px;
|
|
48
|
+
display: flex;
|
|
49
|
+
justify-content: space-between;
|
|
50
|
+
align-items: center;
|
|
51
|
+
`;
|
|
52
|
+
|
|
53
|
+
const StoryList = styled.ul`
|
|
54
|
+
list-style: none;
|
|
55
|
+
padding: 0;
|
|
56
|
+
margin: 0;
|
|
57
|
+
`;
|
|
58
|
+
|
|
59
|
+
const StoryItem = styled.li<{ isActive?: boolean }>`
|
|
60
|
+
padding: 8px 12px;
|
|
61
|
+
cursor: pointer;
|
|
62
|
+
border-radius: 4px;
|
|
63
|
+
font-size: 13px;
|
|
64
|
+
color: ${({ theme, isActive }) => isActive ? theme.color.secondary : theme.color.defaultText};
|
|
65
|
+
background: ${({ theme, isActive }) => isActive ? theme.background.hoverable : 'transparent'};
|
|
66
|
+
|
|
67
|
+
&:hover {
|
|
68
|
+
background: ${({ theme }) => theme.background.hoverable};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
display: flex;
|
|
72
|
+
align-items: center;
|
|
73
|
+
gap: 8px;
|
|
74
|
+
`;
|
|
75
|
+
|
|
76
|
+
const StoryIcon = styled.span`
|
|
77
|
+
font-size: 14px;
|
|
78
|
+
`;
|
|
79
|
+
|
|
80
|
+
const EmptyState = styled.div`
|
|
81
|
+
padding: 20px;
|
|
82
|
+
text-align: center;
|
|
83
|
+
color: ${({ theme }) => theme.color.mediumdark};
|
|
84
|
+
font-size: 12px;
|
|
85
|
+
`;
|
|
86
|
+
|
|
87
|
+
const RefreshButton = styled.button`
|
|
88
|
+
background: none;
|
|
89
|
+
border: none;
|
|
90
|
+
cursor: pointer;
|
|
91
|
+
padding: 4px;
|
|
92
|
+
color: ${({ theme }) => theme.color.mediumdark};
|
|
93
|
+
font-size: 14px;
|
|
94
|
+
|
|
95
|
+
&:hover {
|
|
96
|
+
color: ${({ theme }) => theme.color.secondary};
|
|
97
|
+
}
|
|
98
|
+
`;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Get the Edge URL from environment variable.
|
|
102
|
+
* This must be configured via VITE_STORY_UI_EDGE_URL environment variable.
|
|
103
|
+
* No hardcoded URLs - each deployment must configure their own backend.
|
|
104
|
+
*/
|
|
105
|
+
function getEdgeUrl(): string {
|
|
106
|
+
// Check for Vite env variable - this is the ONLY source for the Edge URL
|
|
107
|
+
if (typeof import.meta !== 'undefined' && import.meta.env?.VITE_STORY_UI_EDGE_URL) {
|
|
108
|
+
return import.meta.env.VITE_STORY_UI_EDGE_URL;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// No fallback - environment variable must be configured
|
|
112
|
+
return '';
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Check if we're in Edge mode
|
|
117
|
+
*/
|
|
118
|
+
function isEdgeMode(): boolean {
|
|
119
|
+
const edgeUrl = getEdgeUrl();
|
|
120
|
+
if (edgeUrl) return true;
|
|
121
|
+
|
|
122
|
+
// Check if we're on a production domain
|
|
123
|
+
if (typeof window !== 'undefined') {
|
|
124
|
+
const hostname = window.location.hostname;
|
|
125
|
+
return hostname !== 'localhost' && hostname !== '127.0.0.1';
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Generated Stories Sidebar Component
|
|
133
|
+
*/
|
|
134
|
+
const GeneratedStoriesSidebar: React.FC = () => {
|
|
135
|
+
const [stories, setStories] = useState<GeneratedStory[]>([]);
|
|
136
|
+
const [loading, setLoading] = useState(false);
|
|
137
|
+
const [activeStoryId, setActiveStoryId] = useState<string | null>(null);
|
|
138
|
+
|
|
139
|
+
// Listen for story generation events from the panel
|
|
140
|
+
useChannel({
|
|
141
|
+
[EVENTS.STORY_GENERATED]: (data: GeneratedStory) => {
|
|
142
|
+
setStories(prev => [data, ...prev.filter(s => s.id !== data.id)]);
|
|
143
|
+
},
|
|
144
|
+
[EVENTS.REFRESH_STORIES]: () => {
|
|
145
|
+
fetchStories();
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
const fetchStories = useCallback(async () => {
|
|
150
|
+
if (!isEdgeMode()) return;
|
|
151
|
+
|
|
152
|
+
setLoading(true);
|
|
153
|
+
try {
|
|
154
|
+
const edgeUrl = getEdgeUrl();
|
|
155
|
+
const response = await fetch(`${edgeUrl}/story-ui/stories`);
|
|
156
|
+
if (response.ok) {
|
|
157
|
+
const data = await response.json();
|
|
158
|
+
setStories(Array.isArray(data) ? data : []);
|
|
159
|
+
}
|
|
160
|
+
} catch (error) {
|
|
161
|
+
console.error('Failed to fetch generated stories:', error);
|
|
162
|
+
} finally {
|
|
163
|
+
setLoading(false);
|
|
164
|
+
}
|
|
165
|
+
}, []);
|
|
166
|
+
|
|
167
|
+
useEffect(() => {
|
|
168
|
+
fetchStories();
|
|
169
|
+
}, [fetchStories]);
|
|
170
|
+
|
|
171
|
+
const handleStoryClick = useCallback((story: GeneratedStory) => {
|
|
172
|
+
setActiveStoryId(story.id);
|
|
173
|
+
|
|
174
|
+
// Emit event for the Story UI panel to display the story
|
|
175
|
+
const channel = addons.getChannel();
|
|
176
|
+
channel.emit(EVENTS.SELECT_GENERATED_STORY, story);
|
|
177
|
+
}, []);
|
|
178
|
+
|
|
179
|
+
if (!isEdgeMode()) {
|
|
180
|
+
return (
|
|
181
|
+
<SidebarContainer>
|
|
182
|
+
<EmptyState>
|
|
183
|
+
Generated stories appear here in Edge mode
|
|
184
|
+
</EmptyState>
|
|
185
|
+
</SidebarContainer>
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return (
|
|
190
|
+
<SidebarContainer>
|
|
191
|
+
<SectionTitle>
|
|
192
|
+
Generated Stories
|
|
193
|
+
<RefreshButton onClick={fetchStories} title="Refresh stories">
|
|
194
|
+
{loading ? '...' : '\u21bb'}
|
|
195
|
+
</RefreshButton>
|
|
196
|
+
</SectionTitle>
|
|
197
|
+
|
|
198
|
+
{stories.length === 0 ? (
|
|
199
|
+
<EmptyState>
|
|
200
|
+
{loading ? 'Loading...' : 'No generated stories yet'}
|
|
201
|
+
</EmptyState>
|
|
202
|
+
) : (
|
|
203
|
+
<StoryList>
|
|
204
|
+
{stories.map((story) => (
|
|
205
|
+
<StoryItem
|
|
206
|
+
key={story.id}
|
|
207
|
+
isActive={activeStoryId === story.id}
|
|
208
|
+
onClick={() => handleStoryClick(story)}
|
|
209
|
+
>
|
|
210
|
+
<StoryIcon>📖</StoryIcon>
|
|
211
|
+
{story.title}
|
|
212
|
+
</StoryItem>
|
|
213
|
+
))}
|
|
214
|
+
</StoryList>
|
|
215
|
+
)}
|
|
216
|
+
</SidebarContainer>
|
|
217
|
+
);
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Toolbar button to toggle generated stories panel
|
|
222
|
+
*/
|
|
223
|
+
const GeneratedStoriesToolbar: React.FC = () => {
|
|
224
|
+
const api = useStorybookApi();
|
|
225
|
+
|
|
226
|
+
if (!isEdgeMode()) return null;
|
|
227
|
+
|
|
228
|
+
return (
|
|
229
|
+
<IconButton
|
|
230
|
+
key={TOOL_ID}
|
|
231
|
+
title="Generated Stories"
|
|
232
|
+
onClick={() => {
|
|
233
|
+
api.togglePanel(true);
|
|
234
|
+
api.setSelectedPanel(PANEL_ID);
|
|
235
|
+
}}
|
|
236
|
+
>
|
|
237
|
+
<span style={{ fontSize: '14px' }}>✨</span>
|
|
238
|
+
</IconButton>
|
|
239
|
+
);
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
// Register the addon
|
|
243
|
+
addons.register(ADDON_ID, (api) => {
|
|
244
|
+
// Only register in Edge mode
|
|
245
|
+
if (!isEdgeMode()) return;
|
|
246
|
+
|
|
247
|
+
// Register the toolbar button
|
|
248
|
+
addons.add(TOOL_ID, {
|
|
249
|
+
type: types.TOOL,
|
|
250
|
+
title: 'Generated Stories',
|
|
251
|
+
match: ({ viewMode }) => viewMode === 'story' || viewMode === 'docs',
|
|
252
|
+
render: () => <GeneratedStoriesToolbar />,
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
// Register the sidebar panel
|
|
256
|
+
addons.add(PANEL_ID, {
|
|
257
|
+
type: types.PANEL,
|
|
258
|
+
title: 'Generated',
|
|
259
|
+
match: ({ viewMode }) => viewMode === 'story' || viewMode === 'docs',
|
|
260
|
+
render: ({ active }) => active ? <GeneratedStoriesSidebar /> : null,
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
export default {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Story UI Production App Environment Variables
|
|
2
|
+
|
|
3
|
+
# Backend API URL (required for production)
|
|
4
|
+
# This should point to your Railway-deployed MCP server
|
|
5
|
+
VITE_BACKEND_URL=http://localhost:4001
|
|
6
|
+
|
|
7
|
+
# Optional: Custom app title
|
|
8
|
+
VITE_APP_TITLE=Story UI
|
|
9
|
+
|
|
10
|
+
# Note: When deploying to Cloudflare Pages, set these as environment variables
|
|
11
|
+
# in your Cloudflare dashboard or wrangler.toml
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<meta name="description" content="Story UI - AI-powered component generation using your design system" />
|
|
7
|
+
<meta name="theme-color" content="#0a0a0a" />
|
|
8
|
+
|
|
9
|
+
<title>Story UI</title>
|
|
10
|
+
|
|
11
|
+
<!-- Preload critical fonts -->
|
|
12
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
13
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
14
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Fira+Code:wght@400;500&display=swap" rel="stylesheet" />
|
|
15
|
+
|
|
16
|
+
<!-- Favicon -->
|
|
17
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
18
|
+
|
|
19
|
+
<!-- Prevent flash of unstyled content -->
|
|
20
|
+
<style>
|
|
21
|
+
html {
|
|
22
|
+
background-color: #0a0a0a;
|
|
23
|
+
}
|
|
24
|
+
body {
|
|
25
|
+
margin: 0;
|
|
26
|
+
background-color: #0a0a0a;
|
|
27
|
+
}
|
|
28
|
+
#root {
|
|
29
|
+
min-height: 100vh;
|
|
30
|
+
background-color: #0a0a0a;
|
|
31
|
+
}
|
|
32
|
+
/* Initial loading state */
|
|
33
|
+
.initial-loader {
|
|
34
|
+
display: flex;
|
|
35
|
+
align-items: center;
|
|
36
|
+
justify-content: center;
|
|
37
|
+
height: 100vh;
|
|
38
|
+
color: #a1a1a1;
|
|
39
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
40
|
+
font-size: 14px;
|
|
41
|
+
}
|
|
42
|
+
.initial-loader-spinner {
|
|
43
|
+
width: 24px;
|
|
44
|
+
height: 24px;
|
|
45
|
+
border: 2px solid #27272a;
|
|
46
|
+
border-top-color: #6366f1;
|
|
47
|
+
border-radius: 50%;
|
|
48
|
+
animation: spin 1s linear infinite;
|
|
49
|
+
margin-right: 12px;
|
|
50
|
+
}
|
|
51
|
+
@keyframes spin {
|
|
52
|
+
to { transform: rotate(360deg); }
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
<body>
|
|
57
|
+
<div id="root">
|
|
58
|
+
<!-- Initial loading state (replaced by React) -->
|
|
59
|
+
<div class="initial-loader">
|
|
60
|
+
<div class="initial-loader-spinner"></div>
|
|
61
|
+
<span>Loading Story UI...</span>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
65
|
+
</body>
|
|
66
|
+
</html>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "story-ui-production-app",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Story UI Production App - AI-powered component generation using your design system",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "vite",
|
|
9
|
+
"build": "vite build",
|
|
10
|
+
"preview": "vite preview",
|
|
11
|
+
"type-check": "tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@babel/standalone": "^7.23.0",
|
|
15
|
+
"react": "^18.2.0",
|
|
16
|
+
"react-dom": "^18.2.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/babel__standalone": "^7.1.7",
|
|
20
|
+
"@types/node": "^20.10.0",
|
|
21
|
+
"@types/react": "^18.2.0",
|
|
22
|
+
"@types/react-dom": "^18.2.0",
|
|
23
|
+
"@vitejs/plugin-react": "^4.2.0",
|
|
24
|
+
"typescript": "^5.3.0",
|
|
25
|
+
"vite": "^5.0.0"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=18.0.0"
|
|
29
|
+
}
|
|
30
|
+
}
|