@yiyi_zhang/reactflow-ui 1.3.0 → 1.3.2

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 (91) hide show
  1. package/README.md +8 -6
  2. package/dist/AiWorkflowIDE.d.ts +23 -3
  3. package/dist/WorkflowIDE.d.ts +14 -1
  4. package/dist/actions/builtin/coerce.d.ts +9 -0
  5. package/dist/actions/types.d.ts +1 -0
  6. package/dist/ai.d.ts +5 -2
  7. package/dist/components/AiNative/AgentTimeline.d.ts +1 -1
  8. package/dist/components/AiNative/ClarificationCard.d.ts +3 -2
  9. package/dist/components/AiNative/InlineCanvasCopilot.d.ts +2 -1
  10. package/dist/components/AiNative/RepairCard.d.ts +3 -2
  11. package/dist/components/AiNative/mermaidParser.d.ts +31 -0
  12. package/dist/components/AiNative/repairActions.d.ts +16 -0
  13. package/dist/components/AiNative/runInputs.d.ts +13 -0
  14. package/dist/components/BrandLogo.d.ts +2 -3
  15. package/dist/components/ConfirmDialog.d.ts +3 -1
  16. package/dist/components/DraftCodeField.d.ts +26 -0
  17. package/dist/components/PromptDialog.d.ts +3 -1
  18. package/dist/components/UnsavedRunNotice.d.ts +16 -0
  19. package/dist/components/business/ActionPickerModal.d.ts +2 -0
  20. package/dist/components/business/BusinessEditorContext.d.ts +38 -0
  21. package/dist/components/business/DataPillInput.d.ts +10 -0
  22. package/dist/components/business/DecisionBranchCard.d.ts +2 -1
  23. package/dist/components/business/ForkJoinCard.d.ts +2 -1
  24. package/dist/components/business/LibraryVersionBadge.d.ts +1 -1
  25. package/dist/components/business/LoopDoWhileCard.d.ts +2 -1
  26. package/dist/components/business/NestedControlStep.d.ts +7 -1
  27. package/dist/components/business/RunStoryTimeline.d.ts +7 -0
  28. package/dist/components/business/StepCardParts.d.ts +73 -0
  29. package/dist/components/business/StepFlowEditor.d.ts +12 -1
  30. package/dist/components/business/StepListEditor.d.ts +6 -2
  31. package/dist/components/business/deleteMessage.d.ts +6 -0
  32. package/dist/components/business/runStatus.d.ts +11 -0
  33. package/dist/components/icons/CmIcon.d.ts +17 -0
  34. package/dist/components/icons/iconRegistry.d.ts +80 -0
  35. package/dist/components/onboarding/OnboardingController.d.ts +7 -0
  36. package/dist/components/onboarding/PromotionPanel.d.ts +9 -1
  37. package/dist/components/template/quickRunNotice.d.ts +13 -0
  38. package/dist/hooks/useConfirm.d.ts +3 -1
  39. package/dist/hooks/useShortcuts.d.ts +1 -1
  40. package/dist/import/common.d.ts +7 -1
  41. package/dist/import/selection.d.ts +17 -0
  42. package/dist/index.d.ts +5 -2
  43. package/dist/library/versionStatus.d.ts +2 -2
  44. package/dist/logo.svg +9 -36
  45. package/dist/onboarding/naming.d.ts +5 -0
  46. package/dist/onboarding/poll.d.ts +6 -3
  47. package/dist/parser/conductorGenerator.d.ts +17 -2
  48. package/dist/product-launch.html +10 -1394
  49. package/dist/providers/types.d.ts +2 -0
  50. package/dist/reactflow-ui-ai.es.js +18497 -14329
  51. package/dist/reactflow-ui.css +1 -1
  52. package/dist/reactflow-ui.es.js +21578 -15400
  53. package/dist/reactflow-ui.umd.js +183 -41
  54. package/dist/sample-workflows/complex-workflow.json +8 -4
  55. package/dist/sample-workflows/decision-workflow.json +1 -0
  56. package/dist/sample-workflows/ecs-lifecycle-automation.json +37 -4
  57. package/dist/services/ai/agentRunner.d.ts +46 -1
  58. package/dist/services/ai/errorMessages.d.ts +9 -1
  59. package/dist/services/ai/protocolAdapter.d.ts +5 -0
  60. package/dist/services/ai/systemPrompt.d.ts +1 -1
  61. package/dist/services/ai/toolExecutor.d.ts +26 -0
  62. package/dist/services/ai/workflowSynthesizer.d.ts +4 -4
  63. package/dist/services/aiService.d.ts +5 -1
  64. package/dist/stepmodel/compile.d.ts +2 -1
  65. package/dist/stepmodel/factory.d.ts +5 -0
  66. package/dist/stepmodel/pills.d.ts +32 -0
  67. package/dist/stepmodel/types.d.ts +10 -0
  68. package/dist/stepmodel/validate.d.ts +20 -0
  69. package/dist/store/aiStore.d.ts +30 -5
  70. package/dist/store/sandboxRunObserver.d.ts +2 -1
  71. package/dist/store/workflowStore.d.ts +8 -9
  72. package/dist/template/templateStore.d.ts +6 -0
  73. package/dist/template/types.d.ts +1 -0
  74. package/dist/types/conductor.d.ts +25 -1
  75. package/dist/types/workflow.d.ts +38 -3
  76. package/dist/types/workflowLibrary.d.ts +5 -5
  77. package/dist/utils/executionAnalyzer.d.ts +5 -0
  78. package/dist/utils/executionImport.d.ts +52 -0
  79. package/dist/utils/executionPoller.d.ts +37 -0
  80. package/dist/utils/hostSave.d.ts +10 -0
  81. package/dist/utils/localSandboxEngine.d.ts +51 -6
  82. package/dist/utils/runStory.d.ts +20 -0
  83. package/dist/utils/sameWorkflow.d.ts +6 -0
  84. package/dist/utils/sandbox/jq.d.ts +13 -0
  85. package/dist/utils/sandbox/scriptRunner.d.ts +38 -0
  86. package/dist/utils/sandbox/switchHints.d.ts +17 -0
  87. package/dist/utils/statusMeta.d.ts +35 -0
  88. package/dist/utils/taskEditing.d.ts +59 -0
  89. package/dist/utils/taskTypeMeta.d.ts +1 -0
  90. package/dist/utils/validationRules.d.ts +29 -4
  91. package/package.json +6 -2
@@ -1,1400 +1,16 @@
1
- <!DOCTYPE html>
1
+ <!doctype html>
2
2
  <html lang="zh-CN">
3
3
  <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>CMASTER v1.0.0 历史宣传页已迁移</title>
7
+ <link rel="canonical" href="./v1-0.html" />
8
+ <meta http-equiv="refresh" content="0; url=./v1-0.html" />
6
9
  <link rel="icon" type="image/svg+xml" href="./logo.svg" />
7
- <title>[Product Launch] Conductor Workflow IDE v1.0 GA · 让工作流编排与联调从 4.5 小时缩短至 12 分钟</title>
8
- <style>
9
- /* ==========================================================================
10
- STYLE: Bento Launchpad (现代暗黑流光发布风 / 开发者产品推广)
11
- SCENARIO: Conductor Workflow IDE (@yiyi_zhang/reactflow-ui) v1.0.0 GA 正式发布页
12
- CORE RULE: 拒绝枯燥功能罗列!首屏直给 Before vs. After 耗时对比、一行命令极速体验、可拖动 ROI 收益计算器
13
- ========================================================================== */
14
- :root {
15
- --bg-dark: #06080F;
16
- --bg-card: #0E1322;
17
- --bg-card-hover: #141C32;
18
- --bg-panel: #090D18;
19
- --bg-glass: rgba(14, 19, 34, 0.82);
20
-
21
- --border-dim: #1E2942;
22
- --border-glow: #6366F1;
23
-
24
- --text-white: #F8FAFC;
25
- --text-body: #94A3B8;
26
- --text-muted: #64748B;
27
-
28
- --brand-primary: #6366F1;
29
- --brand-cyan: #06B6D4;
30
- --brand-emerald: #10B981;
31
- --brand-amber: #F59E0B;
32
- --brand-rose: #F43F5E;
33
-
34
- --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
35
- --font-mono: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
36
-
37
- --radius-md: 12px;
38
- --radius-lg: 18px;
39
- }
40
-
41
- * { box-sizing: border-box; margin: 0; padding: 0; }
42
-
43
- body {
44
- background:
45
- radial-gradient(ellipse 85% 55% at 50% -10%, rgba(99, 102, 241, 0.25), transparent 70%),
46
- radial-gradient(ellipse 50% 40% at 85% 20%, rgba(6, 182, 212, 0.12), transparent 65%),
47
- var(--bg-dark);
48
- color: var(--text-white);
49
- font-family: var(--font-sans);
50
- line-height: 1.6;
51
- -webkit-font-smoothing: antialiased;
52
- }
53
-
54
- /* Sticky Top Nav */
55
- .launch-nav {
56
- position: sticky;
57
- top: 0;
58
- z-index: 100;
59
- background: rgba(6, 8, 15, 0.86);
60
- backdrop-filter: blur(14px);
61
- border-bottom: 1px solid var(--border-dim);
62
- padding: 0.75rem 2rem;
63
- display: flex;
64
- justify-content: space-between;
65
- align-items: center;
66
- gap: 1rem;
67
- flex-wrap: wrap;
68
- }
69
-
70
- .nav-left {
71
- display: flex;
72
- align-items: center;
73
- gap: 0.85rem;
74
- font-size: 0.85rem;
75
- }
76
-
77
- .brand-logo {
78
- display: inline-flex;
79
- align-items: center;
80
- gap: 0.45rem;
81
- font-weight: 800;
82
- color: var(--text-white);
83
- text-decoration: none;
84
- letter-spacing: -0.01em;
85
- }
86
-
87
- .version-pill {
88
- font-family: var(--font-mono);
89
- font-size: 0.74rem;
90
- font-weight: 700;
91
- color: #A5B4FC;
92
- background: rgba(99, 102, 241, 0.16);
93
- border: 1px solid rgba(99, 102, 241, 0.42);
94
- padding: 0.18rem 0.68rem;
95
- border-radius: 999px;
96
- }
97
-
98
- .nav-right {
99
- display: flex;
100
- align-items: center;
101
- gap: 0.75rem;
102
- }
103
-
104
- .ghost-btn {
105
- background: rgba(255, 255, 255, 0.05);
106
- color: var(--text-body);
107
- border: 1px solid var(--border-dim);
108
- padding: 0.44rem 0.9rem;
109
- border-radius: 8px;
110
- font-size: 0.8rem;
111
- font-weight: 600;
112
- cursor: pointer;
113
- text-decoration: none;
114
- transition: all 0.15s;
115
- }
116
-
117
- .ghost-btn:hover {
118
- color: var(--text-white);
119
- border-color: var(--brand-primary);
120
- }
121
-
122
- .cta-btn {
123
- background: linear-gradient(135deg, var(--brand-primary), var(--brand-cyan));
124
- color: #FFF;
125
- border: none;
126
- padding: 0.46rem 1.05rem;
127
- border-radius: 8px;
128
- font-size: 0.82rem;
129
- font-weight: 700;
130
- cursor: pointer;
131
- text-decoration: none;
132
- transition: opacity 0.15s, transform 0.15s;
133
- }
134
-
135
- .cta-btn:hover { opacity: 0.93; transform: translateY(-1px); }
136
-
137
- .container {
138
- max-width: 1280px;
139
- margin: 0 auto;
140
- padding: 2.5rem 2rem 5rem;
141
- }
142
-
143
- /* ==========================================================================
144
- L1 首屏决策层:核心价值主张 + 一行命令极速体验 + 首屏 Before/After + 首屏 ROI 计算器
145
- ========================================================================== */
146
- .hero-section {
147
- text-align: center;
148
- max-width: 920px;
149
- margin: 0 auto 2.2rem;
150
- }
151
-
152
- .hero-eyebrow {
153
- display: inline-flex;
154
- align-items: center;
155
- gap: 0.5rem;
156
- font-family: var(--font-mono);
157
- font-size: 0.78rem;
158
- color: var(--brand-cyan);
159
- background: rgba(6, 182, 212, 0.1);
160
- border: 1px solid rgba(6, 182, 212, 0.32);
161
- padding: 0.3rem 0.95rem;
162
- border-radius: 999px;
163
- margin-bottom: 1rem;
164
- }
165
-
166
- .hero-title {
167
- font-size: 2.85rem;
168
- line-height: 1.15;
169
- font-weight: 800;
170
- letter-spacing: -0.025em;
171
- margin-bottom: 0.95rem;
172
- background: linear-gradient(180deg, #FFFFFF 0%, #A5B4FC 100%);
173
- -webkit-background-clip: text;
174
- -webkit-text-fill-color: transparent;
175
- }
176
-
177
- .hero-subtitle {
178
- font-size: 1.06rem;
179
- color: var(--text-body);
180
- margin-bottom: 1.5rem;
181
- max-width: 780px;
182
- margin-left: auto;
183
- margin-right: auto;
184
- }
185
-
186
- /* Quick Install Command Box with Package Manager Switcher */
187
- .install-wrap {
188
- display: inline-flex;
189
- flex-direction: column;
190
- align-items: center;
191
- gap: 0.5rem;
192
- }
193
-
194
- .pm-tabs {
195
- display: inline-flex;
196
- gap: 0.35rem;
197
- background: rgba(14, 19, 34, 0.9);
198
- padding: 0.22rem;
199
- border-radius: 8px;
200
- border: 1px solid var(--border-dim);
201
- }
202
-
203
- .pm-tab {
204
- background: transparent;
205
- border: none;
206
- color: var(--text-muted);
207
- font-family: var(--font-mono);
208
- font-size: 0.73rem;
209
- font-weight: 600;
210
- padding: 0.22rem 0.65rem;
211
- border-radius: 6px;
212
- cursor: pointer;
213
- }
214
-
215
- .pm-tab.active {
216
- background: rgba(99, 102, 241, 0.22);
217
- color: #C7D2FE;
218
- }
219
-
220
- .install-shell {
221
- display: inline-flex;
222
- align-items: center;
223
- gap: 0.9rem;
224
- background: var(--bg-panel);
225
- border: 1px solid var(--border-glow);
226
- box-shadow: 0 0 32px rgba(99, 102, 241, 0.22);
227
- padding: 0.62rem 0.8rem 0.62rem 1.2rem;
228
- border-radius: 10px;
229
- font-family: var(--font-mono);
230
- font-size: 0.88rem;
231
- color: #E2E8F0;
232
- flex-wrap: wrap;
233
- justify-content: center;
234
- }
235
-
236
- .install-shell .prompt-char { color: var(--brand-cyan); user-select: none; font-weight: 700; }
237
-
238
- .copy-cli-btn {
239
- background: linear-gradient(135deg, rgba(99, 102, 241, 0.28), rgba(6, 182, 212, 0.28));
240
- border: 1px solid rgba(99, 102, 241, 0.5);
241
- color: #FFF;
242
- padding: 0.36rem 0.8rem;
243
- border-radius: 6px;
244
- font-size: 0.76rem;
245
- cursor: pointer;
246
- font-family: var(--font-sans);
247
- font-weight: 700;
248
- transition: all 0.15s;
249
- }
250
-
251
- .copy-cli-btn:hover { background: var(--brand-primary); }
252
-
253
- /* First-Screen Dual Core: Before vs After + Interactive ROI Calculator Side-by-Side */
254
- .first-screen-grid {
255
- display: grid;
256
- grid-template-columns: 1.12fr 0.88fr;
257
- gap: 1.25rem;
258
- margin-bottom: 2rem;
259
- }
260
-
261
- .fs-panel {
262
- background: var(--bg-card);
263
- border: 1px solid var(--border-dim);
264
- border-radius: var(--radius-lg);
265
- padding: 1.4rem 1.5rem;
266
- display: flex;
267
- flex-direction: column;
268
- justify-content: space-between;
269
- }
270
-
271
- .fs-panel.roi-highlight {
272
- border-color: rgba(99, 102, 241, 0.45);
273
- background: linear-gradient(155deg, rgba(99, 102, 241, 0.1) 0%, var(--bg-card) 65%);
274
- }
275
-
276
- .panel-badge-row {
277
- display: flex;
278
- justify-content: space-between;
279
- align-items: center;
280
- margin-bottom: 0.65rem;
281
- }
282
-
283
- .bento-tag {
284
- font-family: var(--font-mono);
285
- font-size: 0.72rem;
286
- text-transform: uppercase;
287
- letter-spacing: 0.06em;
288
- color: var(--brand-cyan);
289
- font-weight: 700;
290
- }
291
-
292
- .speedup-pill {
293
- font-family: var(--font-mono);
294
- font-size: 0.74rem;
295
- font-weight: 800;
296
- color: #34D399;
297
- background: rgba(16, 185, 129, 0.14);
298
- border: 1px solid rgba(16, 185, 129, 0.4);
299
- padding: 0.15rem 0.6rem;
300
- border-radius: 999px;
301
- font-variant-numeric: tabular-nums;
302
- }
303
-
304
- .fs-title {
305
- font-size: 1.18rem;
306
- font-weight: 700;
307
- color: var(--text-white);
308
- margin-bottom: 0.9rem;
309
- }
310
-
311
- /* Before vs After Compact Visual Bars in First Screen */
312
- .ba-columns {
313
- display: grid;
314
- grid-template-columns: 1fr 1fr;
315
- gap: 0.85rem;
316
- }
317
-
318
- .ba-box {
319
- background: var(--bg-panel);
320
- border: 1px solid var(--border-dim);
321
- border-radius: var(--radius-md);
322
- padding: 0.95rem 1rem;
323
- }
324
-
325
- .ba-box.after {
326
- border-color: rgba(16, 185, 129, 0.45);
327
- background: linear-gradient(165deg, rgba(16, 185, 129, 0.09) 0%, var(--bg-panel) 70%);
328
- }
329
-
330
- .ba-head {
331
- display: flex;
332
- justify-content: space-between;
333
- align-items: baseline;
334
- font-size: 0.84rem;
335
- font-weight: 700;
336
- margin-bottom: 0.65rem;
337
- padding-bottom: 0.45rem;
338
- border-bottom: 1px solid rgba(255, 255, 255, 0.07);
339
- }
340
-
341
- .ba-time {
342
- font-family: var(--font-mono);
343
- font-size: 1.05rem;
344
- font-weight: 800;
345
- font-variant-numeric: tabular-nums;
346
- }
347
-
348
- .ba-step {
349
- display: flex;
350
- justify-content: space-between;
351
- align-items: center;
352
- font-size: 0.78rem;
353
- color: var(--text-body);
354
- padding: 0.36rem 0;
355
- border-bottom: 1px dashed rgba(255, 255, 255, 0.05);
356
- font-variant-numeric: tabular-nums;
357
- }
358
-
359
- .ba-step:last-child { border-bottom: none; }
360
-
361
- .ba-step strong {
362
- font-family: var(--font-mono);
363
- font-size: 0.76rem;
364
- }
365
-
366
- /* Interactive ROI Calculator */
367
- .roi-calc-box {
368
- background: var(--bg-panel);
369
- border: 1px solid var(--border-dim);
370
- border-radius: var(--radius-md);
371
- padding: 1rem 1.15rem;
372
- }
373
-
374
- .slider-row {
375
- display: flex;
376
- justify-content: space-between;
377
- align-items: center;
378
- margin-bottom: 0.7rem;
379
- font-size: 0.82rem;
380
- font-variant-numeric: tabular-nums;
381
- }
382
-
383
- input[type="range"] {
384
- width: 52%;
385
- accent-color: var(--brand-primary);
386
- cursor: pointer;
387
- }
388
-
389
- .roi-kpi-grid {
390
- display: grid;
391
- grid-template-columns: repeat(3, 1fr);
392
- gap: 0.65rem;
393
- padding-top: 0.75rem;
394
- border-top: 1px dashed var(--border-dim);
395
- margin-top: 0.3rem;
396
- }
397
-
398
- .roi-kpi-item {
399
- background: rgba(255, 255, 255, 0.02);
400
- border: 1px solid rgba(255, 255, 255, 0.06);
401
- border-radius: 8px;
402
- padding: 0.55rem 0.65rem;
403
- text-align: left;
404
- }
405
-
406
- .roi-kpi-val {
407
- font-family: var(--font-mono);
408
- font-size: 1.12rem;
409
- font-weight: 800;
410
- font-variant-numeric: tabular-nums;
411
- color: var(--brand-emerald);
412
- }
413
-
414
- .roi-kpi-lbl {
415
- font-size: 0.71rem;
416
- color: var(--text-body);
417
- margin-top: 0.1rem;
418
- }
419
-
420
- /* Quantified Impact Strip */
421
- .impact-strip {
422
- display: grid;
423
- grid-template-columns: repeat(4, 1fr);
424
- gap: 1.15rem;
425
- margin-bottom: 3.2rem;
426
- }
427
-
428
- .impact-card {
429
- background: var(--bg-card);
430
- border: 1px solid var(--border-dim);
431
- border-radius: var(--radius-md);
432
- padding: 1.15rem 1.35rem;
433
- text-align: left;
434
- }
435
-
436
- .impact-num {
437
- font-family: var(--font-mono);
438
- font-size: 1.9rem;
439
- font-weight: 800;
440
- color: var(--text-white);
441
- font-variant-numeric: tabular-nums;
442
- line-height: 1.2;
443
- margin-bottom: 0.22rem;
444
- }
445
-
446
- .impact-label {
447
- font-size: 0.84rem;
448
- color: var(--text-body);
449
- font-weight: 600;
450
- }
451
-
452
- .impact-sub {
453
- font-size: 0.74rem;
454
- color: var(--brand-emerald);
455
- margin-top: 0.2rem;
456
- font-family: var(--font-mono);
457
- }
458
-
459
- /* Section Header */
460
- .sec-head {
461
- margin-bottom: 1.35rem;
462
- display: flex;
463
- justify-content: space-between;
464
- align-items: flex-end;
465
- flex-wrap: wrap;
466
- gap: 0.75rem;
467
- }
468
-
469
- .sec-title {
470
- font-size: 1.5rem;
471
- font-weight: 700;
472
- color: var(--text-white);
473
- }
474
-
475
- .sec-sub {
476
- font-size: 0.88rem;
477
- color: var(--text-body);
478
- }
479
-
480
- /* L2: Bento Grid User-Benefit Showcase */
481
- .bento-showcase {
482
- display: grid;
483
- grid-template-columns: repeat(3, 1fr);
484
- grid-auto-rows: minmax(240px, auto);
485
- gap: 1.25rem;
486
- margin-bottom: 3.5rem;
487
- }
488
-
489
- .bento-box {
490
- background: var(--bg-card);
491
- border: 1px solid var(--border-dim);
492
- border-radius: var(--radius-lg);
493
- padding: 1.5rem;
494
- display: flex;
495
- flex-direction: column;
496
- justify-content: space-between;
497
- transition: border-color 0.2s, transform 0.2s;
498
- position: relative;
499
- overflow: hidden;
500
- }
501
-
502
- .bento-box:hover {
503
- border-color: var(--brand-primary);
504
- transform: translateY(-2px);
505
- }
506
-
507
- .bento-span-2 {
508
- grid-column: span 2;
509
- }
510
-
511
- .bento-h3 {
512
- font-size: 1.2rem;
513
- font-weight: 700;
514
- margin: 0.4rem 0 0.45rem;
515
- color: var(--text-white);
516
- }
517
-
518
- .bento-p {
519
- font-size: 0.86rem;
520
- color: var(--text-body);
521
- margin-bottom: 0.95rem;
522
- }
523
-
524
- /* Interactive Mini Sandbox inside Bento 1 */
525
- .mini-sandbox {
526
- background: var(--bg-panel);
527
- border: 1px solid var(--border-dim);
528
- border-radius: var(--radius-md);
529
- padding: 0.9rem 1rem;
530
- }
531
-
532
- .sandbox-preset-bar {
533
- display: flex;
534
- gap: 0.45rem;
535
- flex-wrap: wrap;
536
- margin-bottom: 0.75rem;
537
- }
538
-
539
- .preset-chip {
540
- background: rgba(255, 255, 255, 0.05);
541
- border: 1px solid var(--border-dim);
542
- color: var(--text-body);
543
- padding: 0.3rem 0.7rem;
544
- border-radius: 999px;
545
- font-size: 0.75rem;
546
- font-weight: 600;
547
- cursor: pointer;
548
- transition: all 0.15s;
549
- }
550
-
551
- .preset-chip.active {
552
- background: rgba(99, 102, 241, 0.22);
553
- border-color: var(--brand-primary);
554
- color: #FFF;
555
- }
556
-
557
- .sandbox-console {
558
- display: flex;
559
- justify-content: space-between;
560
- align-items: center;
561
- font-family: var(--font-mono);
562
- font-size: 0.76rem;
563
- padding-top: 0.55rem;
564
- border-top: 1px dashed var(--border-dim);
565
- color: #CBD5E1;
566
- font-variant-numeric: tabular-nums;
567
- }
568
-
569
- /* Mini W-LSP Intellisense Preview inside Bento 2 */
570
- .wlsp-demo-box {
571
- background: var(--bg-panel);
572
- border: 1px solid var(--border-dim);
573
- border-radius: 10px;
574
- padding: 0.75rem;
575
- font-family: var(--font-mono);
576
- font-size: 0.74rem;
577
- }
578
-
579
- .wlsp-input-line {
580
- color: #E2E8F0;
581
- padding-bottom: 0.45rem;
582
- border-bottom: 1px solid var(--border-dim);
583
- margin-bottom: 0.45rem;
584
- }
585
-
586
- .wlsp-pop-item {
587
- display: flex;
588
- justify-content: space-between;
589
- padding: 0.28rem 0.45rem;
590
- border-radius: 5px;
591
- background: rgba(99, 102, 241, 0.16);
592
- color: #C7D2FE;
593
- margin-bottom: 0.22rem;
594
- }
595
-
596
- /* Time-Travel Mini Scrubber inside Bento 4 */
597
- .tt-box {
598
- background: var(--bg-panel);
599
- border: 1px solid var(--border-dim);
600
- border-radius: var(--radius-md);
601
- padding: 0.85rem 1rem;
602
- }
603
-
604
- .gantt-row {
605
- display: grid;
606
- grid-template-columns: 110px 1fr 56px;
607
- align-items: center;
608
- gap: 0.6rem;
609
- font-family: var(--font-mono);
610
- font-size: 0.73rem;
611
- margin-bottom: 0.35rem;
612
- font-variant-numeric: tabular-nums;
613
- }
614
-
615
- .gantt-track {
616
- height: 10px;
617
- background: rgba(255, 255, 255, 0.06);
618
- border-radius: 999px;
619
- position: relative;
620
- overflow: hidden;
621
- }
622
-
623
- .gantt-bar {
624
- position: absolute;
625
- top: 0;
626
- bottom: 0;
627
- border-radius: 999px;
628
- transition: opacity 0.15s;
629
- }
630
-
631
- /* 3-Step Quickstart Tabs */
632
- .quickstart-box {
633
- background: var(--bg-card);
634
- border: 1px solid var(--border-dim);
635
- border-radius: var(--radius-lg);
636
- overflow: hidden;
637
- margin-bottom: 2.5rem;
638
- }
639
-
640
- .qs-tabs {
641
- display: flex;
642
- background: var(--bg-panel);
643
- border-bottom: 1px solid var(--border-dim);
644
- flex-wrap: wrap;
645
- }
646
-
647
- .qs-tab {
648
- padding: 0.85rem 1.35rem;
649
- background: transparent;
650
- border: none;
651
- color: var(--text-body);
652
- font-weight: 600;
653
- font-size: 0.84rem;
654
- cursor: pointer;
655
- border-bottom: 2px solid transparent;
656
- }
657
-
658
- .qs-tab.active {
659
- color: var(--text-white);
660
- border-bottom-color: var(--brand-primary);
661
- background: var(--bg-card);
662
- }
663
-
664
- .qs-content-wrap {
665
- position: relative;
666
- }
667
-
668
- .qs-content {
669
- padding: 1.4rem 1.5rem;
670
- font-family: var(--font-mono);
671
- font-size: 0.82rem;
672
- color: #E2E8F0;
673
- white-space: pre-wrap;
674
- line-height: 1.65;
675
- overflow-x: auto;
676
- }
677
-
678
- /* L3 Evidence Drawer */
679
- details.evidence-drawer {
680
- background: var(--bg-card);
681
- border: 1px solid var(--border-dim);
682
- border-radius: var(--radius-md);
683
- padding: 1rem 1.35rem;
684
- margin-bottom: 1rem;
685
- }
686
-
687
- details.evidence-drawer summary {
688
- cursor: pointer;
689
- font-weight: 700;
690
- font-size: 0.92rem;
691
- color: var(--text-white);
692
- display: flex;
693
- justify-content: space-between;
694
- align-items: center;
695
- list-style: none;
696
- }
697
-
698
- details.evidence-drawer summary::-webkit-details-marker { display: none; }
699
-
700
- .evidence-table {
701
- width: 100%;
702
- border-collapse: collapse;
703
- margin-top: 1rem;
704
- font-size: 0.82rem;
705
- font-variant-numeric: tabular-nums;
706
- }
707
-
708
- .evidence-table th, .evidence-table td {
709
- border-bottom: 1px solid var(--border-dim);
710
- padding: 0.6rem 0.75rem;
711
- text-align: left;
712
- }
713
-
714
- .evidence-table th {
715
- color: var(--text-muted);
716
- font-family: var(--font-mono);
717
- font-size: 0.74rem;
718
- text-transform: uppercase;
719
- }
720
-
721
- @media (max-width: 980px) {
722
- .first-screen-grid, .impact-strip, .bento-showcase, .ba-columns {
723
- grid-template-columns: 1fr;
724
- }
725
- .bento-span-2 { grid-column: span 1; }
726
- .hero-title { font-size: 2.1rem; }
727
- }
728
-
729
- @media print {
730
- body { background: #FFF; color: #000; }
731
- .launch-nav { position: static; background: #FFF; }
732
- .fs-panel, .bento-box, .impact-card, .quickstart-box { border-color: #CBD5E1; background: #FFF; }
733
- }
734
- </style>
735
10
  </head>
736
- <body>
737
-
738
- <!-- Sticky Launch Bar -->
739
- <header class="launch-nav">
740
- <div class="nav-left">
741
- <a href="./" class="brand-logo">
742
- <svg width="26" height="26" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg" style="flex-shrink:0;">
743
- <defs>
744
- <linearGradient id="nav-bg" x1="0" y1="0" x2="32" y2="32" gradientUnits="userSpaceOnUse">
745
- <stop offset="0%" stop-color="#11172B" />
746
- <stop offset="100%" stop-color="#090D18" />
747
- </linearGradient>
748
- <linearGradient id="nav-bd" x1="0" y1="0" x2="32" y2="32" gradientUnits="userSpaceOnUse">
749
- <stop offset="0%" stop-color="#6366F1" stop-opacity="0.8" />
750
- <stop offset="100%" stop-color="#06B6D4" stop-opacity="0.5" />
751
- </linearGradient>
752
- <linearGradient id="nav-top" x1="9" y1="16" x2="23" y2="10" gradientUnits="userSpaceOnUse">
753
- <stop offset="0%" stop-color="#818CF8" />
754
- <stop offset="100%" stop-color="#22D3EE" />
755
- </linearGradient>
756
- <linearGradient id="nav-bot" x1="9" y1="16" x2="23" y2="22" gradientUnits="userSpaceOnUse">
757
- <stop offset="0%" stop-color="#6366F1" />
758
- <stop offset="100%" stop-color="#34D399" />
759
- </linearGradient>
760
- </defs>
761
- <rect x="1.25" y="1.25" width="29.5" height="29.5" rx="8" fill="url(#nav-bg)" stroke="url(#nav-bd)" stroke-width="1.5" />
762
- <path d="M 9.5 16 C 15 16, 15.5 10, 22.5 10" stroke="url(#nav-top)" stroke-width="2.4" stroke-linecap="round" />
763
- <path d="M 9.5 16 C 15 16, 15.5 22, 22.5 22" stroke="url(#nav-bot)" stroke-width="2.4" stroke-linecap="round" />
764
- <circle cx="9.5" cy="16" r="3.4" fill="#6366F1" />
765
- <circle cx="9.5" cy="16" r="1.4" fill="#F8FAFC" />
766
- <circle cx="22.5" cy="10" r="2.7" fill="#22D3EE" />
767
- <circle cx="22.5" cy="22" r="2.7" fill="#34D399" />
768
- </svg>
769
- <span>Conductor Workflow IDE</span>
770
- </a>
771
- <span class="version-pill">RELEASE v1.0.0 GA</span>
772
- <span style="color:var(--text-muted);">@yiyi_zhang/reactflow-ui · 下一代 AI 原生工作流编排与本地确定性沙箱 IDE</span>
773
- </div>
774
- <div class="nav-right">
775
- <a href="./app" class="ghost-btn">🎮 进入在线交互演练场</a>
776
- <button class="cta-btn" onclick="document.getElementById('quickstart').scrollIntoView({behavior:'smooth'})">
777
- 30 秒极速接入 →
778
- </button>
779
- </div>
780
- </header>
781
-
782
- <div class="container">
783
- <!-- ========================================================================
784
- L1 首屏决策层:直击痛点的价值主张 + 一行命令极速体验 + Before/After + ROI 计算器
785
- ======================================================================== -->
786
- <section class="hero-section">
787
- <div class="hero-eyebrow">🚀 Conductor Workflow IDE 1.0 正式发布 · 终结“手搓千行 JSON + 苦等测试环境联调”</div>
788
- <h1 class="hero-title">把 4.5 小时的工作流手写排错与部署联调,压缩成 12 分钟的零延迟闭环</h1>
789
- <p class="hero-subtitle">
790
- 为什么工作流推进慢?因为过去工程师 80% 的时间浪费在<strong>手写 `${taskRef.output}` 拼写排错</strong>与<strong>等待后端预发环境验证分支逻辑</strong>。v1.0 内置 <strong>W-LSP 确定性语言服务</strong>与<strong>浏览器 0ms 确定性沙箱引擎</strong>,在前端即可完成全分支故障注入演练与 AI 协同建模。
791
- </p>
792
-
793
- <!-- 一行命令极速体验入口 -->
794
- <div class="install-wrap">
795
- <div class="pm-tabs">
796
- <button class="pm-tab active" onclick="switchPM('npm', this)">npm 安装集成</button>
797
- <button class="pm-tab" onclick="switchPM('pnpm', this)">pnpm</button>
798
- <button class="pm-tab" onclick="switchPM('ai', this)">AI 双栏工作台入口</button>
799
- <button class="pm-tab" onclick="switchPM('demo', this)">本地一键启动演练场</button>
800
- </div>
801
- <div class="install-shell">
802
- <span class="prompt-char">$</span>
803
- <span id="cli-cmd">npm install @yiyi_zhang/reactflow-ui reactflow react react-dom</span>
804
- <button class="copy-cli-btn" onclick="copyInstall(this)">一键复制命令</button>
805
- </div>
806
- </div>
807
- </section>
808
-
809
- <!-- 首屏核心双栏:左 Before vs. After 耗时对比 | 右 可拖动 ROI 收益计算器 -->
810
- <section class="first-screen-grid">
811
- <!-- 首屏左:Before vs. After 耗时对比 -->
812
- <div class="fs-panel">
813
- <div>
814
- <div class="panel-badge-row">
815
- <span class="bento-tag">Before vs. After · 单条 15 节点工作流交付耗时实测</span>
816
- <span class="speedup-pill">⚡ 提效 95.5% (4.5h → 12min)</span>
817
- </div>
818
- <div class="fs-title">拒绝自嗨式架构空谈:看看工程师每天真实省下的时间</div>
819
- </div>
820
-
821
- <div class="ba-columns">
822
- <!-- Before -->
823
- <div class="ba-box">
824
- <div class="ba-head" style="color:#FB7185;">
825
- <span>❌ 传统手搓 JSON + 预发联调</span>
826
- <span class="ba-time">4.5 小时</span>
827
- </div>
828
- <div class="ba-step">
829
- <span>1. 手写 DSL 拓扑与嵌套 SWITCH/DO_WHILE</span>
830
- <strong style="color:#FB7185;">~75 min</strong>
831
- </div>
832
- <div class="ba-step">
833
- <span>2. 翻找上游文档核对 ${taskRef.output.xxx}</span>
834
- <strong style="color:#FB7185;">~50 min</strong>
835
- </div>
836
- <div class="ba-step">
837
- <span>3. 部署测试环境造数据验证异常/超时分支</span>
838
- <strong style="color:#FB7185;">~110 min</strong>
839
- </div>
840
- <div class="ba-step">
841
- <span>4. 修改节点引用名导致下游断链返工排查</span>
842
- <strong style="color:#FB7185;">~35 min</strong>
843
- </div>
844
- </div>
845
-
846
- <!-- After -->
847
- <div class="ba-box after">
848
- <div class="ba-head" style="color:var(--brand-emerald);">
849
- <span>✅ Workflow IDE v1.0 闭环流</span>
850
- <span class="ba-time">12 分钟</span>
851
- </div>
852
- <div class="ba-step">
853
- <span>1. AI 对话生成骨架 + Cmd+K 原位微调</span>
854
- <strong style="color:var(--brand-emerald);">2 min</strong>
855
- </div>
856
- <div class="ba-step">
857
- <span>2. 键入 ${ 触发 W-LSP 0ms 补全与实时值预览</span>
858
- <strong style="color:var(--brand-emerald);">3 min</strong>
859
- </div>
860
- <div class="ba-step">
861
- <span>3. 浏览器本地沙箱注入 Mock 与故障 0ms 试跑</span>
862
- <strong style="color:var(--brand-emerald);">5 min</strong>
863
- </div>
864
- <div class="ba-step">
865
- <span>4. 引用名变更全图自动重构 + 双向 JSON 同步</span>
866
- <strong style="color:var(--brand-emerald);">2 min</strong>
867
- </div>
868
- </div>
869
- </div>
870
- </div>
871
-
872
- <!-- 首屏右:可拖动的 ROI 收益计算器 -->
873
- <div class="fs-panel roi-highlight">
874
- <div>
875
- <div class="panel-badge-row">
876
- <span class="bento-tag">Interactive ROI Calculator · 团队收益实时测算</span>
877
- <span style="font-family:var(--font-mono); font-size:0.72rem; color:#A5B4FC;">支持双滑块拖动</span>
878
- </div>
879
- <div class="fs-title">拖动滑块,立即测算您的团队接入后每月释放的研发产能</div>
880
- </div>
881
-
882
- <div class="roi-calc-box">
883
- <div class="slider-row">
884
- <span>参与编排/联调人数:<strong id="dev-count-label" style="color:var(--brand-cyan);">20 人</strong></span>
885
- <input id="dev-slider" type="range" min="2" max="150" value="20" oninput="recalcROI()" />
886
- </div>
887
- <div class="slider-row">
888
- <span>人均每月新增/变更流程:<strong id="wf-count-label" style="color:#A5B4FC;">4 条 / 月</strong></span>
889
- <input id="wf-slider" type="range" min="1" max="20" value="4" oninput="recalcROI()" />
890
- </div>
891
-
892
- <div class="roi-kpi-grid">
893
- <div class="roi-kpi-item">
894
- <div id="roi-hours" class="roi-kpi-val">344 h</div>
895
- <div class="roi-kpi-lbl">每月节省联调与排错工时</div>
896
- </div>
897
- <div class="roi-kpi-item">
898
- <div id="roi-money" class="roi-kpi-val" style="color:var(--brand-cyan);">¥17.2 万</div>
899
- <div class="roi-kpi-lbl">折合月度研发产能释放</div>
900
- </div>
901
- <div class="roi-kpi-item">
902
- <div id="roi-bugs" class="roi-kpi-val" style="color:var(--brand-amber);">48 次</div>
903
- <div class="roi-kpi-lbl">每月提前拦截参数断链事故</div>
904
- </div>
905
- </div>
906
- </div>
907
- </div>
908
- </section>
909
-
910
- <!-- 4 大核心量化指标条 -->
911
- <section class="impact-strip">
912
- <div class="impact-card">
913
- <div class="impact-num">0 ms</div>
914
- <div class="impact-label">浏览器本地确定性沙箱试跑</div>
915
- <div class="impact-sub">✓ 无需后端服务即可跑通全分支</div>
916
- </div>
917
- <div class="impact-card">
918
- <div class="impact-num">100%</div>
919
- <div class="impact-label">跨节点参数引用断链自动拦截</div>
920
- <div class="impact-sub">★ W-LSP 拓扑祖先推导 + 自动重命名</div>
921
- </div>
922
- <div class="impact-card">
923
- <div class="impact-num">3 级</div>
924
- <div class="impact-label">角色视图与语义缩放 (LOD)</div>
925
- <div class="impact-sub">📋 业务 / 🔧 标准 / 💻 全开发同图协同</div>
926
- </div>
927
- <div class="impact-card">
928
- <div class="impact-num">-60 MB</div>
929
- <div class="impact-label">移除外部冗余依赖瘦身</div>
930
- <div class="impact-sub">⚡ 原生 Dagre SVG 引擎 + 159 项单测全绿</div>
931
- </div>
932
- </section>
933
-
934
- <!-- ========================================================================
935
- L2 交互分析层:四大痛点终结者 Bento 展台(内嵌可点击沙箱与时间旅行滑块)
936
- ======================================================================== -->
937
- <div class="sec-head">
938
- <div>
939
- <div class="sec-title">四大工程痛点,如何在 v1.0 中被彻底终结?</div>
940
- <div class="sec-sub">拒绝纸上谈兵——直接在下方卡片中点击按钮或拖动时间轴体验</div>
941
- </div>
942
- </div>
943
-
944
- <section class="bento-showcase">
945
- <!-- Bento 1 (Span 2): Interactive Sandbox Fault Injection Simulator -->
946
- <div class="bento-box bento-span-2">
947
- <div>
948
- <div class="bento-tag">Pillar 01 · In-Browser Deterministic Sandbox &amp; Mock Console</div>
949
- <div class="bento-h3">痛点终结:无需部署测试环境,在浏览器里注入 Mock 数据与节点故障一键试跑</div>
950
- <p class="bento-p">
951
- 以前为了验证“支付超时后是否能正确走退款补偿分支”,需要改代码、发预发、造脏数据。现在打开 <strong>🧪 人工模拟数据配置台</strong>,自定义 <code>workflow.input</code>、覆写单节点输出或直接注入 <code>FAILED / TIMED_OUT</code>,0ms 即可在画布上验证整条分支走向:
952
- </p>
953
- </div>
954
-
955
- <div class="mini-sandbox">
956
- <div class="sandbox-preset-bar">
957
- <button class="preset-chip active" onclick="runMiniSandbox('vip', this)">⚡ 场景 A:模拟 VIP 订单正常履约 (amount=1999)</button>
958
- <button class="preset-chip" onclick="runMiniSandbox('fail', this)">💥 场景 B:向支付节点注入 502 TIMED_OUT 故障</button>
959
- <button class="preset-chip" onclick="runMiniSandbox('loop', this)">🔄 场景 C:模拟 DO_WHILE 库存轮询 3 次迭代</button>
960
- </div>
961
-
962
- <!-- Interactive SVG Topology Preview -->
963
- <svg viewBox="0 0 680 86" style="width:100%; height:82px; display:block;">
964
- <!-- Edges -->
965
- <line id="sb-edge-1" x1="135" y1="42" x2="215" y2="42" stroke="#10B981" stroke-width="2.5" />
966
- <line id="sb-edge-2" x1="345" y1="42" x2="425" y2="22" stroke="#10B981" stroke-width="2.5" />
967
- <line id="sb-edge-3" x1="345" y1="42" x2="425" y2="66" stroke="#334155" stroke-width="2" stroke-dasharray="4,4" />
968
- <line id="sb-edge-4" x1="545" y1="22" x2="590" y2="42" stroke="#10B981" stroke-width="2.5" />
969
-
970
- <!-- Node 1: verify_order -->
971
- <rect x="10" y="20" width="125" height="44" rx="8" fill="#0E1726" stroke="#10B981" stroke-width="2" />
972
- <text x="22" y="39" fill="#F8FAFC" font-size="11" font-weight="700">1. verify_order</text>
973
- <text x="22" y="55" fill="#34D399" font-size="10" font-family="monospace">COMPLETED · 45ms</text>
974
-
975
- <!-- Node 2: charge_card -->
976
- <rect id="sb-node-2" x="215" y="20" width="130" height="44" rx="8" fill="#0E1726" stroke="#10B981" stroke-width="2" />
977
- <text x="227" y="39" fill="#F8FAFC" font-size="11" font-weight="700">2. charge_card</text>
978
- <text id="sb-node-2-sub" x="227" y="55" fill="#34D399" font-size="10" font-family="monospace">COMPLETED · 120ms</text>
979
-
980
- <!-- Node 3A: ship_vip -->
981
- <rect id="sb-node-3a" x="425" y="4" width="120" height="36" rx="7" fill="#0E1726" stroke="#10B981" stroke-width="2" />
982
- <text x="435" y="20" fill="#F8FAFC" font-size="10.5" font-weight="700">3a. vip_dispatch</text>
983
- <text id="sb-node-3a-sub" x="435" y="33" fill="#34D399" font-size="9.5" font-family="monospace">COMPLETED · 80ms</text>
984
-
985
- <!-- Node 3B: refund_compensate -->
986
- <rect id="sb-node-3b" x="425" y="48" width="120" height="36" rx="7" fill="#0E1726" stroke="#334155" stroke-width="1.5" />
987
- <text x="435" y="64" fill="#94A3B8" font-size="10.5" font-weight="700">3b. compensate</text>
988
- <text id="sb-node-3b-sub" x="435" y="77" fill="#64748B" font-size="9.5" font-family="monospace">SKIPPED</text>
989
-
990
- <!-- Node 4: notify_user -->
991
- <rect id="sb-node-4" x="590" y="20" width="82" height="44" rx="8" fill="#0E1726" stroke="#10B981" stroke-width="2" />
992
- <text x="600" y="39" fill="#F8FAFC" font-size="11" font-weight="700">4. notify</text>
993
- <text id="sb-node-4-sub" x="600" y="55" fill="#34D399" font-size="9.5" font-family="monospace">DONE · 30ms</text>
994
- </svg>
995
-
996
- <div class="sandbox-console">
997
- <span id="sb-console-msg">✅ 沙箱推演完成:SWITCH 命中 [vip] 分支,全链路 4 节点执行成功</span>
998
- <span id="sb-console-time" style="color:var(--brand-cyan);">总耗时: 275ms</span>
999
- </div>
1000
- </div>
1001
- </div>
1002
-
1003
- <!-- Bento 2: W-LSP & Data Lineage -->
1004
- <div class="bento-box">
1005
- <div>
1006
- <div class="bento-tag">Pillar 02 · W-LSP &amp; Data Lineage</div>
1007
- <div class="bento-h3">痛点终结:告别手敲 JSONPath 与改名断链</div>
1008
- <p class="bento-p">
1009
- 键入 <code>${</code> 即刻计算 DAG 严格上游祖先,融合运行态真实样本与 Schema 弹出 0ms 补全;修改节点引用名时全图下游自动重构。
1010
- </p>
1011
- </div>
1012
- <div class="wlsp-demo-box">
1013
- <div class="wlsp-input-line">url: "https://api.pay/v1/<span style="color:var(--brand-cyan);">${charge_</span>|"</div>
1014
- <div class="wlsp-pop-item">
1015
- <span>charge_card.output.txId</span>
1016
- <span style="color:#34D399;">⚡ "tx_99201"</span>
1017
- </div>
1018
- <div class="wlsp-pop-item" style="background:transparent; color:#94A3B8;">
1019
- <span>workflow.input.orderId</span>
1020
- <span style="color:#A5B4FC;">⚡ "ORD-2026"</span>
1021
- </div>
1022
- </div>
1023
- </div>
1024
-
1025
- <!-- Bento 3: Canvas-Native AI & Shadow Graph Diff -->
1026
- <div class="bento-box">
1027
- <div>
1028
- <div class="bento-tag">Pillar 03 · Cmd+K Copilot &amp; Shadow Diff</div>
1029
- <div class="bento-h3">痛点终结:画布内联 Cmd+K 微调 + 架构级视觉 Diff</div>
1030
- <p class="bento-p">
1031
- 不论在对话栏描述需求,还是选中节点按 <code>Cmd+K</code> 微调,AI 提案都会以 <strong>👻 Shadow Graph</strong> 在画布上高亮 <code>+新增</code> / <code>~修改</code> / <code>-移除</code>,支持逐节点勾选采纳。
1032
- </p>
1033
- </div>
1034
- <div style="display:flex; gap:0.45rem; font-family:var(--font-mono); font-size:0.75rem;">
1035
- <span style="padding:0.22rem 0.55rem; border-radius:6px; background:rgba(16,185,129,0.15); color:#34D399;">+2 新增节点</span>
1036
- <span style="padding:0.22rem 0.55rem; border-radius:6px; background:rgba(245,158,11,0.15); color:#FBBF24;">~1 修改参数</span>
1037
- <span style="padding:0.22rem 0.55rem; border-radius:6px; background:rgba(244,63,94,0.15); color:#FB7185;">✓ 支持部分采纳</span>
1038
- </div>
1039
- </div>
1040
-
1041
- <!-- Bento 4 (Span 2): Interactive Time-Travel Waterfall Scrubber -->
1042
- <div class="bento-box bento-span-2">
1043
- <div>
1044
- <div class="bento-tag">Pillar 04 · Time-Travel Waterfall &amp; Live Split-View Sync</div>
1045
- <div class="bento-h3">痛点终结:拖动毫秒级时间旅行滑块,像看录像一样回放并发分支瓶颈</div>
1046
- <p class="bento-p">
1047
- 面对复杂的 <code>FORK_JOIN</code> 并行分支与 <code>DO_WHILE</code> 多轮循环,底部一键展开<strong>📊 并发甘特瀑布流</strong>。试着拖动下方时间轴滑块,实时观察不同时刻各并行任务的运行状态切换:
1048
- </p>
1049
- </div>
1050
-
1051
- <div class="tt-box">
1052
- <div class="slider-row" style="margin-bottom:0.55rem;">
1053
- <span>🕒 时间旅行回放游标 (<strong id="tt-time-label" style="color:var(--brand-cyan);">T = 280 ms</strong> / 420 ms)</span>
1054
- <input type="range" min="0" max="420" value="280" oninput="scrubTimeTravel(this.value)" />
1055
- </div>
1056
- <div class="gantt-row">
1057
- <span>1. verify_order</span>
1058
- <div class="gantt-track"><div id="gt-1" class="gantt-bar" style="left:0%; width:22%; background:#10B981;"></div></div>
1059
- <span id="gt-st-1" style="color:#34D399;">DONE</span>
1060
- </div>
1061
- <div class="gantt-row">
1062
- <span>2a. fork_risk</span>
1063
- <div class="gantt-track"><div id="gt-2" class="gantt-bar" style="left:22%; width:38%; background:#10B981;"></div></div>
1064
- <span id="gt-st-2" style="color:#34D399;">DONE</span>
1065
- </div>
1066
- <div class="gantt-row">
1067
- <span>2b. fork_quota</span>
1068
- <div class="gantt-track"><div id="gt-3" class="gantt-bar" style="left:22%; width:55%; background:#3B82F6;"></div></div>
1069
- <span id="gt-st-3" style="color:#60A5FA;">RUNNING</span>
1070
- </div>
1071
- <div class="gantt-row" style="margin-bottom:0;">
1072
- <span>3. settle_order</span>
1073
- <div class="gantt-track"><div id="gt-4" class="gantt-bar" style="left:77%; width:23%; background:#475569; opacity:0.35;"></div></div>
1074
- <span id="gt-st-4" style="color:#64748B;">PENDING</span>
1075
- </div>
1076
- </div>
1077
- </div>
1078
- </section>
1079
-
1080
- <!-- ========================================================================
1081
- L2 极速接入指南:3 步完成前端或 CI 集成
1082
- ======================================================================== -->
1083
- <div id="quickstart" class="sec-head">
1084
- <div>
1085
- <div class="sec-title">3 种模式极速接入您的系统 (Quickstart Guide)</div>
1086
- <div class="sec-sub">按需选择专业编排器、AI 原生双栏工作台或无头沙箱/血缘 SDK</div>
1087
- </div>
1088
- <button class="copy-cli-btn" onclick="copyCodeSnippet(this)">复制当前代码片段</button>
1089
- </div>
1090
-
1091
- <section class="quickstart-box">
1092
- <div class="qs-tabs">
1093
- <button class="qs-tab active" onclick="switchQS('pro', this)">模式 1:专业编排工作台 (&lt;WorkflowIDE /&gt;)</button>
1094
- <button class="qs-tab" onclick="switchQS('ai', this)">模式 2:AI 原生双栏工作台 (&lt;AiWorkflowIDE /&gt;)</button>
1095
- <button class="qs-tab" onclick="switchQS('sdk', this)">模式 3:编程式沙箱与血缘校验 SDK (CI / 单测集成)</button>
1096
- </div>
1097
- <div class="qs-content-wrap">
1098
- <div id="qs-body" class="qs-content">import { useRef } from 'react';
1099
- import { WorkflowIDE, WorkflowIDERef } from '@yiyi_zhang/reactflow-ui';
1100
- import '@yiyi_zhang/reactflow-ui/style.css';
1101
-
1102
- export function MyWorkflowStudio() {
1103
- const ideRef = useRef&lt;WorkflowIDERef&gt;(null);
1104
-
1105
- return (
1106
- &lt;div style={{ height: '100vh', width: '100%' }}&gt;
1107
- &lt;WorkflowIDE
1108
- ref={ideRef}
1109
- theme="dark"
1110
- themeColor="blue"
1111
- onSave={(def) =&gt; fetch('/api/workflows', { method: 'POST', body: JSON.stringify(def) })}
1112
- /&gt;
1113
- &lt;/div&gt;
1114
- );
1115
- }</div>
1116
- </div>
1117
- </section>
1118
-
1119
- <!-- ========================================================================
1120
- L3 折叠证据层:v1.0.0 架构与质量门禁基准数据
1121
- ======================================================================== -->
1122
- <details class="evidence-drawer">
1123
- <summary>
1124
- <span>📂 [L3 技术溯源] 查看 v1.0.0 四大核心支柱能力矩阵、包体积基准与全量导出符号表</span>
1125
- <span style="font-family:var(--font-mono); font-size:0.78rem; color:var(--brand-cyan);">点击展开 ▾</span>
1126
- </summary>
1127
- <table class="evidence-table">
1128
- <thead>
1129
- <tr>
1130
- <th>能力维度</th>
1131
- <th>v0.3 ~ v0.4 旧版能力</th>
1132
- <th>v1.0.0 GA 正式版能力</th>
1133
- <th>工程量化收益</th>
1134
- </tr>
1135
- </thead>
1136
- <tbody>
1137
- <tr>
1138
- <td><strong>变量引用与重构</strong></td>
1139
- <td>静态固定模版片段,改名需手动全局查找替换</td>
1140
- <td><strong>W-LSP 语言服务</strong>:DAG 严格祖先推导 + 五源 Schema 推断 + 改名自动重写下游</td>
1141
- <td style="color:var(--brand-emerald);">拼写与断链故障率降至 0%</td>
1142
- </tr>
1143
- <tr>
1144
- <td><strong>流程验证与调试</strong></td>
1145
- <td>必须对接后端 Conductor 实例或仅做简单高亮演示</td>
1146
- <td><strong>0ms 浏览器确定性沙箱</strong> + 🧪 人工模拟数据/故障注入台 + 📊 时间旅行甘特瀑布流</td>
1147
- <td style="color:var(--brand-emerald);">单流程联调耗时从 110min 降至 5min</td>
1148
- </tr>
1149
- <tr>
1150
- <td><strong>AI 协同范式</strong></td>
1151
- <td>仅侧边栏全量替换 JSON,Mermaid 依赖重达 60MB+</td>
1152
- <td><strong>画布内联 Cmd+K 微调</strong> + 👻 Shadow Graph 部分采纳 + 零依赖 Dagre 原生 SVG 渲染</td>
1153
- <td style="color:var(--brand-emerald);">npm 安装体积减少 60MB+,首屏零闪烁</td>
1154
- </tr>
1155
- <tr>
1156
- <td><strong>视图与代码同步</strong></td>
1157
- <td>弹窗式导入导出 JSON,大图缩小时文字重叠</td>
1158
- <td><strong>300ms 防抖双向实时分屏 JSON</strong> + 三级语义缩放 (Semantic LOD) + 统一毛玻璃胶囊栏</td>
1159
- <td style="color:var(--brand-emerald);">百节点大图 60fps 丝滑缩放</td>
1160
- </tr>
1161
- </tbody>
1162
- </table>
1163
- </details>
1164
- </div>
1165
-
1166
- <script>
1167
- const pmCommands = {
1168
- npm: 'npm install @yiyi_zhang/reactflow-ui reactflow react react-dom',
1169
- pnpm: 'pnpm add @yiyi_zhang/reactflow-ui reactflow react react-dom',
1170
- ai: "import { AiWorkflowIDE } from '@yiyi_zhang/reactflow-ui/ai';",
1171
- demo: 'git clone https://github.com/yiyisf/reactflow-ui.git && cd reactflow-ui && npm i && npm run dev'
1172
- };
1173
-
1174
- function switchPM(key, btn) {
1175
- document.querySelectorAll('.pm-tab').forEach(b => b.classList.remove('active'));
1176
- btn.classList.add('active');
1177
- document.getElementById('cli-cmd').textContent = pmCommands[key];
1178
- }
1179
-
1180
- function copyInstall(btn) {
1181
- const cmd = document.getElementById('cli-cmd').textContent;
1182
- navigator.clipboard.writeText(cmd);
1183
- const orig = btn.textContent;
1184
- btn.textContent = "✓ 已复制";
1185
- setTimeout(() => btn.textContent = orig, 1600);
1186
- }
1187
-
1188
- function recalcROI() {
1189
- const devs = parseInt(document.getElementById('dev-slider').value, 10);
1190
- const wfs = parseInt(document.getElementById('wf-slider').value, 10);
1191
- document.getElementById('dev-count-label').textContent = devs + ' 人';
1192
- document.getElementById('wf-count-label').textContent = wfs + ' 条 / 月';
1193
-
1194
- // 每条工作流从 4.5h (270min) 降至 12min,单流程净省 4.3 小时
1195
- const savedHours = Math.round(devs * wfs * 4.3);
1196
- const savedMoney = (savedHours * 0.05).toFixed(1);
1197
- const preventedBugs = Math.round(devs * wfs * 0.6);
1198
-
1199
- document.getElementById('roi-hours').textContent = savedHours + ' h';
1200
- document.getElementById('roi-money').textContent = '¥' + savedMoney + ' 万';
1201
- document.getElementById('roi-bugs').textContent = preventedBugs + ' 次';
1202
- }
1203
-
1204
- function runMiniSandbox(scene, btn) {
1205
- document.querySelectorAll('.preset-chip').forEach(b => b.classList.remove('active'));
1206
- btn.classList.add('active');
1207
-
1208
- const n2 = document.getElementById('sb-node-2');
1209
- const n2Sub = document.getElementById('sb-node-2-sub');
1210
- const n3a = document.getElementById('sb-node-3a');
1211
- const n3aSub = document.getElementById('sb-node-3a-sub');
1212
- const n3b = document.getElementById('sb-node-3b');
1213
- const n3bSub = document.getElementById('sb-node-3b-sub');
1214
- const n4 = document.getElementById('sb-node-4');
1215
- const n4Sub = document.getElementById('sb-node-4-sub');
1216
- const e2 = document.getElementById('sb-edge-2');
1217
- const e3 = document.getElementById('sb-edge-3');
1218
- const e4 = document.getElementById('sb-edge-4');
1219
- const msg = document.getElementById('sb-console-msg');
1220
- const time = document.getElementById('sb-console-time');
1221
-
1222
- if (scene === 'vip') {
1223
- n2.setAttribute('stroke', '#10B981');
1224
- n2Sub.textContent = 'COMPLETED · 120ms';
1225
- n2Sub.setAttribute('fill', '#34D399');
1226
-
1227
- e2.setAttribute('stroke', '#10B981');
1228
- e2.removeAttribute('stroke-dasharray');
1229
- e3.setAttribute('stroke', '#334155');
1230
- e3.setAttribute('stroke-dasharray', '4,4');
1231
-
1232
- n3a.setAttribute('stroke', '#10B981');
1233
- n3aSub.textContent = 'COMPLETED · 80ms';
1234
- n3aSub.setAttribute('fill', '#34D399');
1235
-
1236
- n3b.setAttribute('stroke', '#334155');
1237
- n3bSub.textContent = 'SKIPPED';
1238
- n3bSub.setAttribute('fill', '#64748B');
1239
-
1240
- n4.setAttribute('stroke', '#10B981');
1241
- n4Sub.textContent = 'DONE · 30ms';
1242
- n4Sub.setAttribute('fill', '#34D399');
1243
- e4.setAttribute('stroke', '#10B981');
1244
-
1245
- msg.textContent = '✅ 沙箱推演完成:SWITCH 命中 [vip] 分支,全链路 4 节点执行成功';
1246
- msg.style.color = '#34D399';
1247
- time.textContent = '总耗时: 275ms';
1248
- } else if (scene === 'fail') {
1249
- n2.setAttribute('stroke', '#F43F5E');
1250
- n2Sub.textContent = 'TIMED_OUT · 502ms';
1251
- n2Sub.setAttribute('fill', '#FB7185');
1252
-
1253
- e2.setAttribute('stroke', '#334155');
1254
- e2.setAttribute('stroke-dasharray', '4,4');
1255
- e3.setAttribute('stroke', '#F59E0B');
1256
- e3.removeAttribute('stroke-dasharray');
1257
-
1258
- n3a.setAttribute('stroke', '#334155');
1259
- n3aSub.textContent = 'SKIPPED';
1260
- n3aSub.setAttribute('fill', '#64748B');
1261
-
1262
- n3b.setAttribute('stroke', '#F59E0B');
1263
- n3bSub.textContent = 'COMPENSATED · 95ms';
1264
- n3bSub.setAttribute('fill', '#FBBF24');
1265
-
1266
- n4.setAttribute('stroke', '#F43F5E');
1267
- n4Sub.textContent = 'TERMINATED';
1268
- n4Sub.setAttribute('fill', '#FB7185');
1269
- e4.setAttribute('stroke', '#334155');
1270
-
1271
- msg.textContent = '⚠️ 故障注入生效:charge_card 触发 502 超时,自动路由至 3b. compensate 退款补偿分支';
1272
- msg.style.color = '#FBBF24';
1273
- time.textContent = '总耗时: 642ms';
1274
- } else {
1275
- n2.setAttribute('stroke', '#8B5CF6');
1276
- n2Sub.textContent = 'LOOP [1][2][3] · 210ms';
1277
- n2Sub.setAttribute('fill', '#C4B5FD');
1278
-
1279
- e2.setAttribute('stroke', '#10B981');
1280
- e2.removeAttribute('stroke-dasharray');
1281
- e3.setAttribute('stroke', '#334155');
1282
- e3.setAttribute('stroke-dasharray', '4,4');
1283
-
1284
- n3a.setAttribute('stroke', '#10B981');
1285
- n3aSub.textContent = 'ITER #3 PASS · 65ms';
1286
- n3aSub.setAttribute('fill', '#34D399');
1287
-
1288
- n3b.setAttribute('stroke', '#334155');
1289
- n3bSub.textContent = 'SKIPPED';
1290
- n3bSub.setAttribute('fill', '#64748B');
1291
-
1292
- n4.setAttribute('stroke', '#10B981');
1293
- n4Sub.textContent = 'DONE · 30ms';
1294
- n4Sub.setAttribute('fill', '#34D399');
1295
- e4.setAttribute('stroke', '#10B981');
1296
-
1297
- msg.textContent = '🔄 循环推演完成:生成 __1 / __2 / __3 三轮迭代快照,可在节点胶囊一键切片查看';
1298
- msg.style.color = '#C4B5FD';
1299
- time.textContent = '总耗时: 350ms';
1300
- }
1301
- }
1302
-
1303
- function scrubTimeTravel(val) {
1304
- const t = parseInt(val, 10);
1305
- document.getElementById('tt-time-label').textContent = 'T = ' + t + ' ms';
1306
-
1307
- const setBar = (id, stId, start, end) => {
1308
- const bar = document.getElementById(id);
1309
- const st = document.getElementById(stId);
1310
- if (t < start) {
1311
- bar.style.background = '#475569';
1312
- bar.style.opacity = '0.35';
1313
- st.textContent = 'PENDING';
1314
- st.style.color = '#64748B';
1315
- } else if (t >= start && t < end) {
1316
- bar.style.background = '#3B82F6';
1317
- bar.style.opacity = '1';
1318
- st.textContent = 'RUNNING';
1319
- st.style.color = '#60A5FA';
1320
- } else {
1321
- bar.style.background = '#10B981';
1322
- bar.style.opacity = '1';
1323
- st.textContent = 'DONE';
1324
- st.style.color = '#34D399';
1325
- }
1326
- };
1327
-
1328
- setBar('gt-1', 'gt-st-1', 0, 90);
1329
- setBar('gt-2', 'gt-st-2', 90, 250);
1330
- setBar('gt-3', 'gt-st-3', 90, 320);
1331
- setBar('gt-4', 'gt-st-4', 320, 420);
1332
- }
1333
-
1334
- const qsSnippets = {
1335
- pro: `import { useRef } from 'react';
1336
- import { WorkflowIDE, WorkflowIDERef } from '@yiyi_zhang/reactflow-ui';
1337
- import '@yiyi_zhang/reactflow-ui/style.css';
1338
-
1339
- export function MyWorkflowStudio() {
1340
- const ideRef = useRef<WorkflowIDERef>(null);
1341
-
1342
- return (
1343
- <div style={{ height: '100vh', width: '100%' }}>
1344
- <WorkflowIDE
1345
- ref={ideRef}
1346
- theme="dark"
1347
- themeColor="blue"
1348
- onSave={(def) => fetch('/api/workflows', { method: 'POST', body: JSON.stringify(def) })}
1349
- />
1350
- </div>
1351
- );
1352
- }`,
1353
- ai: `import { AiWorkflowIDE } from '@yiyi_zhang/reactflow-ui/ai';
1354
- import '@yiyi_zhang/reactflow-ui/style.css';
1355
-
1356
- export function MyAiWorkflowStudio() {
1357
- return (
1358
- <div style={{ height: '100vh', width: '100%' }}>
1359
- <AiWorkflowIDE
1360
- aiConfig={{
1361
- // 生产环境推荐通过后端代理转发,避免在前端暴露模型 API Key
1362
- transport: { type: 'endpoint', url: '/api/ai/workflow-agent' },
1363
- }}
1364
- draftPersist={{ key: 'corp-workflow-draft' }}
1365
- onSave={(def) => console.log('保存工作流:', def)}
1366
- />
1367
- </div>
1368
- );
1369
- }`,
1370
- sdk: `import { executeLocalSandboxDryRun, buildDataFlowGraph } from '@yiyi_zhang/reactflow-ui';
1371
-
1372
- // 1. 在 CI 流水线或前端单测中 0ms 演练故障注入与分支覆盖
1373
- const instance = executeLocalSandboxDryRun(workflowDef, {
1374
- workflowInput: { orderId: 'ORD-2026', vipLevel: 3 },
1375
- taskMocks: {
1376
- charge_card: { status: 'TIMED_OUT', reasonForIncompletion: '模拟网关 502 超时' }
1377
- }
1378
- });
1379
-
1380
- // 2. 静态提取全局数据流血缘图谱,拦截非法跨分支引用
1381
- const dfg = buildDataFlowGraph(workflowDef);
1382
- console.assert(dfg.diagnostics.length === 0, '发现非法参数引用:', dfg.diagnostics);`
1383
- };
1384
-
1385
- function switchQS(key, btn) {
1386
- document.querySelectorAll('.qs-tab').forEach(b => b.classList.remove('active'));
1387
- btn.classList.add('active');
1388
- document.getElementById('qs-body').textContent = qsSnippets[key];
1389
- }
1390
-
1391
- function copyCodeSnippet(btn) {
1392
- const code = document.getElementById('qs-body').textContent;
1393
- navigator.clipboard.writeText(code);
1394
- const orig = btn.textContent;
1395
- btn.textContent = "✓ 已复制代码片段";
1396
- setTimeout(() => btn.textContent = orig, 1600);
1397
- }
1398
- </script>
11
+ <body style="font-family: system-ui, sans-serif; padding: 48px 24px;">
12
+ <!-- This copy of the v1.0.0 launch page was retired; the maintained version is v1-0.html. -->
13
+ <p>v1.0.0 历史宣传页已迁移,正在跳转。没有跳转请打开 <a href="./v1-0.html">v1.0.0 历史宣传页</a>。</p>
14
+ <script>location.replace('./v1-0.html');</script>
1399
15
  </body>
1400
16
  </html>