@eventcatalog/core 5.0.0-beta.4 → 5.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics/analytics.cjs +1 -1
- package/dist/analytics/analytics.js +2 -2
- package/dist/analytics/log-build.cjs +2 -2
- package/dist/analytics/log-build.js +4 -4
- package/dist/{chunk-TOMV5YJH.js → chunk-56CD2NH6.js} +1 -1
- package/dist/{chunk-M7OVJHPV.js → chunk-DE3QHVJP.js} +1 -1
- package/dist/{chunk-Q7FBYUCZ.js → chunk-L2IRFOE7.js} +1 -1
- package/dist/{chunk-TQLRG35T.js → chunk-PIYJM642.js} +1 -1
- package/dist/{chunk-VA77ENFQ.js → chunk-QBP3BBSV.js} +1 -1
- package/dist/{chunk-PL3T5TWF.js → chunk-XMPFHLK4.js} +2 -2
- package/dist/constants.cjs +1 -1
- package/dist/constants.js +1 -1
- package/dist/eventcatalog.cjs +2 -2
- package/dist/eventcatalog.js +6 -6
- package/dist/generate.cjs +1 -1
- package/dist/generate.js +3 -3
- package/dist/runtime-dependencies/@hocuspocus__provider.mjs +3 -0
- package/dist/runtime-dependencies/@hocuspocus__server.mjs +3 -0
- package/dist/runtime-dependencies/@mcp-b__webmcp-local-relay.mjs +3 -0
- package/dist/runtime-dependencies/@mcp-b__webmcp-polyfill.mjs +3 -0
- package/dist/runtime-dependencies/manifest.json +8 -0
- package/dist/runtime-dependencies/react-hotkeys-hook.mjs +3 -0
- package/dist/runtime-dependencies/y-protocols.mjs +3 -0
- package/dist/runtime-dependencies/y-protocols__awareness.mjs +3 -0
- package/dist/runtime-dependencies/yjs.mjs +3 -0
- package/dist/utils/cli-logger.cjs +1 -1
- package/dist/utils/cli-logger.js +2 -2
- package/dist/utils/license-status.cjs +1 -1
- package/dist/utils/license-status.js +1 -1
- package/eventcatalog/astro.config.mjs +2 -0
- package/eventcatalog/integrations/studio-server.mjs +17 -0
- package/eventcatalog/src/features/integrations/eventcatalog-features.ts +20 -1
- package/eventcatalog/src/features/mcp/apps/canvas/shared.ts +39 -0
- package/eventcatalog/src/features/mcp/apps/canvas/styles.css +22 -0
- package/eventcatalog/src/features/mcp/apps/canvas/view.tsx +269 -0
- package/eventcatalog/src/features/mcp/apps/generated/canvas.html +209 -0
- package/eventcatalog/src/features/mcp/apps/generated/viewer.html +2 -2
- package/eventcatalog/src/features/mcp/apps/shared/app-view.tsx +2 -1
- package/eventcatalog/src/features/mcp/mcp-apps.ts +6 -3
- package/eventcatalog/src/features/mcp/mcp-server.ts +17 -4
- package/eventcatalog/src/features/studio/agent-choreography.ts +378 -0
- package/eventcatalog/src/features/studio/canvas-actions.ts +287 -0
- package/eventcatalog/src/features/studio/canvas-doc.ts +280 -0
- package/eventcatalog/src/features/studio/catalog-resources.ts +152 -0
- package/eventcatalog/src/features/studio/catalog.ts +171 -0
- package/eventcatalog/src/features/studio/components/CanvasControls.tsx +153 -0
- package/eventcatalog/src/features/studio/components/CanvasHeader.tsx +332 -0
- package/eventcatalog/src/features/studio/components/Comments.tsx +455 -0
- package/eventcatalog/src/features/studio/components/ConnectAgentDialog.tsx +217 -0
- package/eventcatalog/src/features/studio/components/ContainerChooser.tsx +145 -0
- package/eventcatalog/src/features/studio/components/JoinForm.tsx +58 -0
- package/eventcatalog/src/features/studio/components/LeftPanel.tsx +218 -0
- package/eventcatalog/src/features/studio/components/Presence.tsx +284 -0
- package/eventcatalog/src/features/studio/components/PropertiesPanel.tsx +75 -0
- package/eventcatalog/src/features/studio/components/StudioDesigner.tsx +760 -0
- package/eventcatalog/src/features/studio/components/canvas-nodes.tsx +79 -0
- package/eventcatalog/src/features/studio/components/icons.ts +48 -0
- package/eventcatalog/src/features/studio/components/status.ts +22 -0
- package/eventcatalog/src/features/studio/edges.ts +54 -0
- package/eventcatalog/src/features/studio/flow-state.ts +92 -0
- package/eventcatalog/src/features/studio/grouping.ts +133 -0
- package/eventcatalog/src/features/studio/hooks/presence-sender.ts +46 -0
- package/eventcatalog/src/features/studio/hooks/presence-store.ts +115 -0
- package/eventcatalog/src/features/studio/hooks/use-canvas-webmcp.ts +337 -0
- package/eventcatalog/src/features/studio/hooks/use-comments.ts +47 -0
- package/eventcatalog/src/features/studio/hooks/use-follow-camera.ts +99 -0
- package/eventcatalog/src/features/studio/hooks/use-studio-flow.ts +423 -0
- package/eventcatalog/src/features/studio/layout.ts +39 -0
- package/eventcatalog/src/features/studio/levels.ts +216 -0
- package/eventcatalog/src/features/studio/node-types.ts +173 -0
- package/eventcatalog/src/features/studio/pages/[id].astro +38 -0
- package/eventcatalog/src/features/studio/pages/index.astro +8 -0
- package/eventcatalog/src/features/studio/pages/webmcp-relay.ts +27 -0
- package/eventcatalog/src/features/studio/placement.ts +197 -0
- package/eventcatalog/src/features/studio/server/canvas-mcp.ts +475 -0
- package/eventcatalog/src/features/studio/server/runtime.ts +215 -0
- package/eventcatalog/src/features/studio/server/tool-icons.ts +30 -0
- package/eventcatalog/src/features/studio/studio.css +89 -0
- package/eventcatalog/src/features/studio/tool-sync.ts +75 -0
- package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +9 -2
- package/eventcatalog/src/utils/feature.ts +4 -0
- package/eventcatalog/src/utils/trial.ts +1 -1
- package/package.json +9 -2
- package/eventcatalog/public/studio-bg.png +0 -0
- package/eventcatalog/src/components/Studio/StudioPageModal.tsx +0 -150
- package/eventcatalog/src/pages/studio.astro +0 -316
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import VerticalSideBarLayout from '@layouts/VerticalSideBarLayout.astro';
|
|
3
|
-
import { getEvents } from '@utils/collections/events';
|
|
4
|
-
import { getCommands } from '@utils/collections/commands';
|
|
5
|
-
import { getServices } from '@utils/collections/services';
|
|
6
|
-
import { BoltIcon, ServerIcon } from '@heroicons/react/24/outline';
|
|
7
|
-
import { SquareDashedMousePointerIcon, ArrowLeftRightIcon, ExternalLink } from 'lucide-react';
|
|
8
|
-
import StudioPageModal from '@components/Studio/StudioPageModal';
|
|
9
|
-
import { getChannels } from '@utils/collections/channels';
|
|
10
|
-
|
|
11
|
-
const [events, commands, services, channels] = await Promise.all([
|
|
12
|
-
getEvents().catch(() => []),
|
|
13
|
-
getCommands().catch(() => []),
|
|
14
|
-
getServices().catch(() => []),
|
|
15
|
-
getChannels().catch(() => []),
|
|
16
|
-
]);
|
|
17
|
-
|
|
18
|
-
// Get counts
|
|
19
|
-
const eventCount = events.length;
|
|
20
|
-
const serviceCount = services.length;
|
|
21
|
-
const commandCount = commands.length;
|
|
22
|
-
const channelCount = channels.length;
|
|
23
|
-
const totalResources = eventCount + serviceCount + channelCount + commandCount;
|
|
24
|
-
|
|
25
|
-
// Get a few sample resources to display
|
|
26
|
-
const sampleEvents = events.slice(0, 2);
|
|
27
|
-
const sampleServices = services.slice(0, 2);
|
|
28
|
-
const sampleChannels = channels.slice(0, 1);
|
|
29
|
-
|
|
30
|
-
// Determine which resources to show (fallback if some are missing)
|
|
31
|
-
const resourcesToShow = [
|
|
32
|
-
...sampleEvents.map((event, index) => ({ type: 'event', data: event, index })),
|
|
33
|
-
...sampleServices.map((service, index) => ({ type: 'service', data: service, index: index + 2 })),
|
|
34
|
-
...sampleChannels.map((channel, index) => ({ type: 'channel', data: channel, index: index + 4 })),
|
|
35
|
-
].slice(0, 5); // Max 5 resources
|
|
36
|
-
|
|
37
|
-
const hasResources = resourcesToShow.length > 0;
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
<!doctype html>
|
|
41
|
-
<html lang="en">
|
|
42
|
-
<head>
|
|
43
|
-
<meta charset="UTF-8" />
|
|
44
|
-
<meta name="viewport" content="width=device-width" />
|
|
45
|
-
<link rel="icon" href="/favicon.ico" sizes="any" />
|
|
46
|
-
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
47
|
-
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
48
|
-
<meta name="generator" content={Astro.generator} />
|
|
49
|
-
<title>EventCatalog Studio</title>
|
|
50
|
-
</head>
|
|
51
|
-
<body>
|
|
52
|
-
<VerticalSideBarLayout title="EventCatalog Studio" showNestedSideBar={false}>
|
|
53
|
-
<div class="min-h-[calc(100vh-60px)] bg-[rgb(var(--ec-page-bg))]">
|
|
54
|
-
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16">
|
|
55
|
-
{/* Hero Section */}
|
|
56
|
-
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center mb-16">
|
|
57
|
-
<div>
|
|
58
|
-
<div
|
|
59
|
-
class="inline-flex items-center px-3 py-1.5 rounded-full bg-[rgb(var(--ec-content-hover))] text-[rgb(var(--ec-page-text))] font-medium text-xs mb-6"
|
|
60
|
-
>
|
|
61
|
-
Visual Design Tool
|
|
62
|
-
</div>
|
|
63
|
-
<h1 class="text-4xl font-bold text-[rgb(var(--ec-page-text))] tracking-tight mb-4">
|
|
64
|
-
Turn your resources into designs
|
|
65
|
-
</h1>
|
|
66
|
-
<p class="text-lg text-[rgb(var(--ec-page-text-muted))] mb-8">
|
|
67
|
-
Transform your documented messages, services, and domains into architecture diagrams. Drag, drop, and design with
|
|
68
|
-
what you already have.
|
|
69
|
-
</p>
|
|
70
|
-
<div class="flex flex-col sm:flex-row gap-3 mb-4">
|
|
71
|
-
<button
|
|
72
|
-
id="design-button"
|
|
73
|
-
class="inline-flex items-center justify-center px-6 py-3 border border-transparent text-base font-medium rounded-lg text-[rgb(var(--ec-button-text))] bg-[rgb(var(--ec-button-bg))] hover:bg-[rgb(var(--ec-button-bg-hover))] transition-colors duration-150"
|
|
74
|
-
>
|
|
75
|
-
<SquareDashedMousePointerIcon className="w-4 h-4 mr-2" />
|
|
76
|
-
Open Studio
|
|
77
|
-
</button>
|
|
78
|
-
<a
|
|
79
|
-
href="https://www.eventcatalog.dev/docs/development/components/designs"
|
|
80
|
-
target="_blank"
|
|
81
|
-
rel="noopener noreferrer"
|
|
82
|
-
class="inline-flex items-center justify-center px-6 py-3 border border-[rgb(var(--ec-page-border))] text-base font-medium rounded-lg text-[rgb(var(--ec-page-text))] bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] hover:bg-[rgb(var(--ec-content-hover))] transition-colors duration-150"
|
|
83
|
-
>
|
|
84
|
-
Learn more
|
|
85
|
-
<ExternalLink className="w-4 h-4 ml-2" />
|
|
86
|
-
</a>
|
|
87
|
-
</div>
|
|
88
|
-
|
|
89
|
-
{
|
|
90
|
-
totalResources > 0 && (
|
|
91
|
-
<p class="text-sm text-[rgb(var(--ec-page-text-muted))]">
|
|
92
|
-
<span class="font-medium text-[rgb(var(--ec-page-text))]">{totalResources}</span> resources available to
|
|
93
|
-
design with
|
|
94
|
-
</p>
|
|
95
|
-
)
|
|
96
|
-
}
|
|
97
|
-
</div>
|
|
98
|
-
|
|
99
|
-
<div class="relative hidden lg:block">
|
|
100
|
-
{/* Animation container */}
|
|
101
|
-
<div class="relative h-[350px] flex items-center justify-center">
|
|
102
|
-
{/* Resource cards that animate in */}
|
|
103
|
-
{
|
|
104
|
-
hasResources ? (
|
|
105
|
-
<div class="absolute left-0 top-1/2 -translate-y-1/2 space-y-2.5">
|
|
106
|
-
{resourcesToShow.map((resource) => {
|
|
107
|
-
if (resource.type === 'event') {
|
|
108
|
-
return (
|
|
109
|
-
<div
|
|
110
|
-
class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-page-text))] px-4 py-2.5 bg-orange-50 dark:bg-orange-500/10 rounded-lg border border-orange-200 dark:border-orange-500/30 shadow-xs"
|
|
111
|
-
style={`animation-delay: ${resource.index * 0.3}s;`}
|
|
112
|
-
>
|
|
113
|
-
<BoltIcon className="w-4 h-4 text-orange-500" />
|
|
114
|
-
<span class="truncate max-w-[140px]">{resource.data.data.name}</span>
|
|
115
|
-
</div>
|
|
116
|
-
);
|
|
117
|
-
} else if (resource.type === 'service') {
|
|
118
|
-
return (
|
|
119
|
-
<div
|
|
120
|
-
class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-page-text))] px-4 py-2.5 bg-pink-50 dark:bg-pink-500/10 rounded-lg border border-pink-200 dark:border-pink-500/30 shadow-xs"
|
|
121
|
-
style={`animation-delay: ${resource.index * 0.3}s;`}
|
|
122
|
-
>
|
|
123
|
-
<ServerIcon className="w-4 h-4 text-pink-500" />
|
|
124
|
-
<span class="truncate max-w-[140px]">{resource.data.data.name}</span>
|
|
125
|
-
</div>
|
|
126
|
-
);
|
|
127
|
-
} else if (resource.type === 'channel') {
|
|
128
|
-
return (
|
|
129
|
-
<div
|
|
130
|
-
class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-page-text))] px-4 py-2.5 bg-indigo-50 dark:bg-indigo-500/10 rounded-lg border border-indigo-200 dark:border-indigo-500/30 shadow-xs"
|
|
131
|
-
style={`animation-delay: ${resource.index * 0.3}s;`}
|
|
132
|
-
>
|
|
133
|
-
<ArrowLeftRightIcon className="w-4 h-4 text-indigo-500" />
|
|
134
|
-
<span class="truncate max-w-[140px]">{resource.data.data.name}</span>
|
|
135
|
-
</div>
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
})}
|
|
139
|
-
</div>
|
|
140
|
-
) : (
|
|
141
|
-
<div class="absolute left-0 top-1/2 -translate-y-1/2 space-y-2.5">
|
|
142
|
-
<div
|
|
143
|
-
class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-icon-color))] px-4 py-2.5 bg-[rgb(var(--ec-content-hover))] rounded-lg border border-[rgb(var(--ec-page-border))] border-dashed"
|
|
144
|
-
style="animation-delay: 0s;"
|
|
145
|
-
>
|
|
146
|
-
<BoltIcon className="w-4 h-4" />
|
|
147
|
-
<span>Your events</span>
|
|
148
|
-
</div>
|
|
149
|
-
<div
|
|
150
|
-
class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-icon-color))] px-4 py-2.5 bg-[rgb(var(--ec-content-hover))] rounded-lg border border-[rgb(var(--ec-page-border))] border-dashed"
|
|
151
|
-
style="animation-delay: 0.3s;"
|
|
152
|
-
>
|
|
153
|
-
<ServerIcon className="w-4 h-4" />
|
|
154
|
-
<span>Your services</span>
|
|
155
|
-
</div>
|
|
156
|
-
<div
|
|
157
|
-
class="animate-float-in flex items-center gap-2 text-sm text-[rgb(var(--ec-icon-color))] px-4 py-2.5 bg-[rgb(var(--ec-content-hover))] rounded-lg border border-[rgb(var(--ec-page-border))] border-dashed"
|
|
158
|
-
style="animation-delay: 0.6s;"
|
|
159
|
-
>
|
|
160
|
-
<ArrowLeftRightIcon className="w-4 h-4" />
|
|
161
|
-
<span>Your channels</span>
|
|
162
|
-
</div>
|
|
163
|
-
</div>
|
|
164
|
-
)
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
{/* Arrow indicator */}
|
|
168
|
-
<div class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2">
|
|
169
|
-
<svg
|
|
170
|
-
class="w-10 h-10 text-[rgb(var(--ec-icon-color))] animate-pulse"
|
|
171
|
-
viewBox="0 0 24 24"
|
|
172
|
-
fill="none"
|
|
173
|
-
stroke="currentColor"
|
|
174
|
-
>
|
|
175
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"></path>
|
|
176
|
-
</svg>
|
|
177
|
-
</div>
|
|
178
|
-
|
|
179
|
-
{/* Design preview */}
|
|
180
|
-
<div class="absolute right-0 top-1/2 -translate-y-1/2 animate-fade-in-scale" style="animation-delay: 1.5s;">
|
|
181
|
-
<img
|
|
182
|
-
src="/studio-bg.png"
|
|
183
|
-
alt="Studio Design Preview"
|
|
184
|
-
class="rounded-xl shadow-lg border border-[rgb(var(--ec-page-border))] w-56 h-auto"
|
|
185
|
-
/>
|
|
186
|
-
</div>
|
|
187
|
-
</div>
|
|
188
|
-
</div>
|
|
189
|
-
</div>
|
|
190
|
-
|
|
191
|
-
{/* Features Section */}
|
|
192
|
-
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
|
193
|
-
<div
|
|
194
|
-
class="group bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] rounded-xl p-6 border border-[rgb(var(--ec-page-border))] hover:border-[rgb(var(--ec-accent))] hover:shadow-md transition-all duration-200"
|
|
195
|
-
>
|
|
196
|
-
<div
|
|
197
|
-
class="w-10 h-10 bg-[rgb(var(--ec-content-hover))] rounded-lg flex items-center justify-center mb-4 group-hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors"
|
|
198
|
-
>
|
|
199
|
-
<svg
|
|
200
|
-
class="w-5 h-5 text-[rgb(var(--ec-page-text))]"
|
|
201
|
-
viewBox="0 0 24 24"
|
|
202
|
-
fill="none"
|
|
203
|
-
stroke="currentColor"
|
|
204
|
-
stroke-width="2"
|
|
205
|
-
>
|
|
206
|
-
<rect width="8" height="8" x="3" y="3" rx="2"></rect>
|
|
207
|
-
<path d="M7 11v4a2 2 0 0 0 2 2h4"></path>
|
|
208
|
-
<rect width="8" height="8" x="13" y="13" rx="2"></rect>
|
|
209
|
-
</svg>
|
|
210
|
-
</div>
|
|
211
|
-
<h3 class="text-base font-semibold text-[rgb(var(--ec-page-text))] mb-2">Real Resources</h3>
|
|
212
|
-
<p class="text-sm text-[rgb(var(--ec-page-text-muted))] leading-relaxed">
|
|
213
|
-
Drag and drop messages, services, and domains from your catalog. No more copying names or keeping things in sync.
|
|
214
|
-
</p>
|
|
215
|
-
</div>
|
|
216
|
-
|
|
217
|
-
<div
|
|
218
|
-
class="group bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] rounded-xl p-6 border border-[rgb(var(--ec-page-border))] hover:border-[rgb(var(--ec-accent))] hover:shadow-md transition-all duration-200"
|
|
219
|
-
>
|
|
220
|
-
<div
|
|
221
|
-
class="w-10 h-10 bg-[rgb(var(--ec-content-hover))] rounded-lg flex items-center justify-center mb-4 group-hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors"
|
|
222
|
-
>
|
|
223
|
-
<svg
|
|
224
|
-
class="w-5 h-5 text-[rgb(var(--ec-page-text))]"
|
|
225
|
-
viewBox="0 0 24 24"
|
|
226
|
-
fill="none"
|
|
227
|
-
stroke="currentColor"
|
|
228
|
-
stroke-width="2"
|
|
229
|
-
>
|
|
230
|
-
<path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path>
|
|
231
|
-
<polyline points="17 21 17 13 7 13 7 21"></polyline>
|
|
232
|
-
<polyline points="7 3 7 8 15 8"></polyline>
|
|
233
|
-
</svg>
|
|
234
|
-
</div>
|
|
235
|
-
<h3 class="text-base font-semibold text-[rgb(var(--ec-page-text))] mb-2">Save & Version</h3>
|
|
236
|
-
<p class="text-sm text-[rgb(var(--ec-page-text-muted))] leading-relaxed">
|
|
237
|
-
Save designs locally and store in Git. All designs and data is owned by you.
|
|
238
|
-
</p>
|
|
239
|
-
</div>
|
|
240
|
-
|
|
241
|
-
<div
|
|
242
|
-
class="group bg-[rgb(var(--ec-card-bg,var(--ec-page-bg)))] rounded-xl p-6 border border-[rgb(var(--ec-page-border))] hover:border-[rgb(var(--ec-accent))] hover:shadow-md transition-all duration-200"
|
|
243
|
-
>
|
|
244
|
-
<div
|
|
245
|
-
class="w-10 h-10 bg-[rgb(var(--ec-content-hover))] rounded-lg flex items-center justify-center mb-4 group-hover:bg-[rgb(var(--ec-accent-subtle))] transition-colors"
|
|
246
|
-
>
|
|
247
|
-
<svg
|
|
248
|
-
class="w-5 h-5 text-[rgb(var(--ec-page-text))]"
|
|
249
|
-
viewBox="0 0 24 24"
|
|
250
|
-
fill="none"
|
|
251
|
-
stroke="currentColor"
|
|
252
|
-
stroke-width="2"
|
|
253
|
-
>
|
|
254
|
-
<polyline points="16 18 22 12 16 6"></polyline>
|
|
255
|
-
<polyline points="8 6 2 12 8 18"></polyline>
|
|
256
|
-
</svg>
|
|
257
|
-
</div>
|
|
258
|
-
<h3 class="text-base font-semibold text-[rgb(var(--ec-page-text))] mb-2">Embed Anywhere</h3>
|
|
259
|
-
<p class="text-sm text-[rgb(var(--ec-page-text-muted))] leading-relaxed">
|
|
260
|
-
Drop diagrams directly into documentation pages. One source of truth for your architecture.
|
|
261
|
-
</p>
|
|
262
|
-
</div>
|
|
263
|
-
</div>
|
|
264
|
-
</div>
|
|
265
|
-
</div>
|
|
266
|
-
|
|
267
|
-
{/* Studio Modal */}
|
|
268
|
-
<StudioPageModal client:only="react" />
|
|
269
|
-
</VerticalSideBarLayout>
|
|
270
|
-
|
|
271
|
-
<script>
|
|
272
|
-
// Handle opening the studio modal
|
|
273
|
-
const button = document.getElementById('design-button');
|
|
274
|
-
if (button) {
|
|
275
|
-
button.addEventListener('click', () => {
|
|
276
|
-
// Trigger the modal to open
|
|
277
|
-
window.dispatchEvent(new CustomEvent('openStudioModal'));
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
</script>
|
|
281
|
-
|
|
282
|
-
<style>
|
|
283
|
-
@keyframes float-in {
|
|
284
|
-
0% {
|
|
285
|
-
opacity: 0;
|
|
286
|
-
transform: translateX(-20px);
|
|
287
|
-
}
|
|
288
|
-
100% {
|
|
289
|
-
opacity: 1;
|
|
290
|
-
transform: translateX(0);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
@keyframes fade-in-scale {
|
|
295
|
-
0% {
|
|
296
|
-
opacity: 0;
|
|
297
|
-
transform: translateY(-50%) scale(0.95);
|
|
298
|
-
}
|
|
299
|
-
100% {
|
|
300
|
-
opacity: 1;
|
|
301
|
-
transform: translateY(-50%) scale(1);
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
.animate-float-in {
|
|
306
|
-
animation: float-in 0.5s ease-out forwards;
|
|
307
|
-
opacity: 0;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
.animate-fade-in-scale {
|
|
311
|
-
animation: fade-in-scale 0.6s ease-out forwards;
|
|
312
|
-
opacity: 0;
|
|
313
|
-
}
|
|
314
|
-
</style>
|
|
315
|
-
</body>
|
|
316
|
-
</html>
|