@agentiffai/design 1.5.2 → 1.5.4

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.
@@ -13,6 +13,8 @@ var styled2__default = /*#__PURE__*/_interopDefault(styled2);
13
13
  // src/theme/tokens.ts
14
14
  var tokens = {
15
15
  colors: {
16
+ primary: "#2CB0AB",
17
+ accent: "#459FB9",
16
18
  background: {
17
19
  dark: "#1b2230",
18
20
  light: "#252d3d"
@@ -21,6 +23,7 @@ var tokens = {
21
23
  primary: "#FFFFFF",
22
24
  secondary: "#B4B8C5",
23
25
  tertiary: "#9CA3AF"},
26
+ success: "#2CB0AB",
24
27
  error: "#EF4444",
25
28
  warning: "#F59E0B",
26
29
  info: "#459FB9",
@@ -29,7 +32,9 @@ var tokens = {
29
32
  running: "#459FB9",
30
33
  completed: "#2CB0AB",
31
34
  failed: "#EF4444",
32
- timeout: "#F59E0B"},
35
+ timeout: "#F59E0B",
36
+ busy: "#459FB9"
37
+ },
33
38
  surface: {
34
39
  overlay: "rgba(255, 255, 255, 0.05)",
35
40
  overlayHover: "rgba(255, 255, 255, 0.1)",
@@ -60,7 +65,9 @@ var tokens = {
60
65
  semibold: 600},
61
66
  lineHeight: {
62
67
  tight: 1.25,
63
- normal: 1.5}
68
+ normal: 1.5,
69
+ relaxed: 1.75
70
+ }
64
71
  },
65
72
  spacing: {
66
73
  xs: "0.25rem",
@@ -80,8 +87,16 @@ var tokens = {
80
87
  transitions: {
81
88
  fast: "150ms ease-in-out",
82
89
  normal: "250ms ease-in-out"},
90
+ animation: {
91
+ pulse: {
92
+ duration: "2000ms"
93
+ }
94
+ },
83
95
  zIndex: {
84
- modal: 1200}};
96
+ modal: 1200},
97
+ breakpoints: {
98
+ tablet: 1024}
99
+ };
85
100
  var WorkflowCard = ({
86
101
  id,
87
102
  name,
@@ -166,23 +181,1420 @@ WorkflowCard.displayName = "WorkflowCard";
166
181
  var Card = styled2__default.default.button`
167
182
  display: grid;
168
183
  gap: ${tokens.spacing.sm};
169
- padding: ${tokens.spacing.md};
170
- background: ${tokens.colors.background.dark};
171
- border-radius: ${tokens.borderRadius.xl};
184
+ padding: ${tokens.spacing.md};
185
+ background: ${tokens.colors.background.dark};
186
+ border-radius: ${tokens.borderRadius.xl};
187
+ border: 1px solid ${tokens.colors.border.default};
188
+ cursor: pointer;
189
+ text-align: left;
190
+ width: 100%;
191
+ font-family: ${tokens.typography.fontFamily.primary};
192
+ transition: border-color ${tokens.transitions.fast}, background-color ${tokens.transitions.fast};
193
+
194
+ &:hover:not(:disabled) {
195
+ border-color: ${tokens.colors.border.hover};
196
+ background: ${tokens.colors.background.light};
197
+ }
198
+
199
+ &:active:not(:disabled) {
200
+ background: ${tokens.colors.surface.overlayActive};
201
+ }
202
+
203
+ &:focus-visible {
204
+ outline: 2px solid ${tokens.colors.border.focus};
205
+ outline-offset: 2px;
206
+ }
207
+
208
+ &:disabled {
209
+ cursor: not-allowed;
210
+ }
211
+ `;
212
+ var WorkflowName = styled2__default.default.h3`
213
+ margin: 0;
214
+ font-size: ${tokens.typography.fontSize.base};
215
+ font-weight: ${tokens.typography.fontWeight.semibold};
216
+ color: ${tokens.colors.text.primary};
217
+ line-height: ${tokens.typography.lineHeight.tight};
218
+ overflow: hidden;
219
+ text-overflow: ellipsis;
220
+ white-space: nowrap;
221
+ min-width: 0;
222
+ `;
223
+ var Description = styled2__default.default.p`
224
+ margin: 0;
225
+ font-size: ${tokens.typography.fontSize.sm};
226
+ color: ${tokens.colors.text.tertiary};
227
+ line-height: ${tokens.typography.lineHeight.normal};
228
+ overflow: hidden;
229
+ display: -webkit-box;
230
+ -webkit-line-clamp: 2;
231
+ -webkit-box-orient: vertical;
232
+ word-break: break-word;
233
+ min-width: 0;
234
+ `;
235
+ var CardFooter = styled2__default.default.div`
236
+ display: flex;
237
+ flex-wrap: wrap;
238
+ align-items: center;
239
+ gap: ${tokens.spacing.sm};
240
+ padding-top: ${tokens.spacing.sm};
241
+ border-top: 1px solid ${tokens.colors.border.subtle};
242
+ width: 100%;
243
+ `;
244
+ var IntegrationList = styled2__default.default.div`
245
+ display: flex;
246
+ align-items: center;
247
+ gap: ${tokens.spacing.xs};
248
+ flex-shrink: 0;
249
+ `;
250
+ var IntegrationIconWrapper = styled2__default.default.span`
251
+ display: flex;
252
+ align-items: center;
253
+ justify-content: center;
254
+ width: 24px;
255
+ height: 24px;
256
+ border-radius: ${tokens.borderRadius.sm};
257
+ background: ${tokens.colors.background.light};
258
+ opacity: ${({ $connected, $optional }) => $connected ? 1 : $optional ? 0.3 : 0.4};
259
+ position: relative;
260
+ flex-shrink: 0;
261
+
262
+ ${({ $connected, $optional }) => !$connected && `
263
+ &::after {
264
+ content: '';
265
+ position: absolute;
266
+ inset: 0;
267
+ border: 1px dashed ${$optional ? tokens.colors.border.default : tokens.colors.warning};
268
+ border-radius: ${tokens.borderRadius.sm};
269
+ }
270
+ `}
271
+ `;
272
+ var IntegrationIcon = styled2__default.default.img`
273
+ width: 16px;
274
+ height: 16px;
275
+ object-fit: contain;
276
+ `;
277
+ var Indicators = styled2__default.default.div`
278
+ display: flex;
279
+ align-items: center;
280
+ flex-wrap: wrap;
281
+ gap: ${tokens.spacing.xs};
282
+ margin-left: auto;
283
+ min-width: 0;
284
+ `;
285
+ var IndicatorPill = styled2__default.default.span`
286
+ display: inline-flex;
287
+ align-items: center;
288
+ gap: ${tokens.spacing.xs};
289
+ padding: ${tokens.spacing.xs} ${tokens.spacing.sm};
290
+ border-radius: ${tokens.borderRadius.full};
291
+ background: ${({ $variant }) => $variant === "warning" ? `${tokens.colors.warning}15` : `${tokens.colors.info}15`};
292
+ border: 1px solid ${({ $variant }) => $variant === "warning" ? `${tokens.colors.warning}30` : `${tokens.colors.info}30`};
293
+ `;
294
+ var IndicatorDot = styled2__default.default.span`
295
+ width: 6px;
296
+ height: 6px;
297
+ border-radius: ${tokens.borderRadius.full};
298
+ background: ${({ $variant }) => $variant === "warning" ? tokens.colors.warning : tokens.colors.info};
299
+ flex-shrink: 0;
300
+ `;
301
+ var IndicatorText = styled2__default.default.span`
302
+ font-size: ${tokens.typography.fontSize.xs};
303
+ font-weight: ${tokens.typography.fontWeight.medium};
304
+ color: ${tokens.colors.text.secondary};
305
+ white-space: nowrap;
306
+ `;
307
+ var readinessVisuals = {
308
+ ready: {
309
+ label: "Ready",
310
+ color: tokens.colors.status.completed,
311
+ bg: `${tokens.colors.status.completed}1A`,
312
+ border: `${tokens.colors.status.completed}4D`
313
+ },
314
+ "setup-required": {
315
+ label: "Setup required",
316
+ color: tokens.colors.warning,
317
+ bg: `${tokens.colors.warning}1A`,
318
+ border: `${tokens.colors.warning}4D`
319
+ },
320
+ "needs-n8n": {
321
+ label: "Needs n8n",
322
+ color: tokens.colors.warning,
323
+ bg: `${tokens.colors.warning}1A`,
324
+ border: `${tokens.colors.warning}4D`
325
+ },
326
+ paid: {
327
+ label: "Paid \xB7 free trial",
328
+ color: tokens.colors.accent,
329
+ bg: `${tokens.colors.accent}1A`,
330
+ border: `${tokens.colors.accent}4D`
331
+ },
332
+ provisioning: {
333
+ label: "Provisioning",
334
+ color: tokens.colors.status.busy,
335
+ bg: `${tokens.colors.status.busy}1A`,
336
+ border: `${tokens.colors.status.busy}4D`,
337
+ animated: true
338
+ },
339
+ failed: {
340
+ label: "Failed",
341
+ color: tokens.colors.error,
342
+ bg: `${tokens.colors.error}1A`,
343
+ border: `${tokens.colors.error}4D`
344
+ },
345
+ unavailable: {
346
+ label: "Unavailable",
347
+ color: tokens.colors.text.tertiary,
348
+ bg: "rgba(255, 255, 255, 0.04)",
349
+ border: "rgba(255, 255, 255, 0.1)"
350
+ }
351
+ };
352
+ var PlayIcon = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", width: "14", height: "14", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 5.14v13.72L19 12 8 5.14z" }) });
353
+ var PlayIconLarge = () => /* @__PURE__ */ jsxRuntime.jsx(
354
+ "svg",
355
+ {
356
+ viewBox: "0 0 24 24",
357
+ width: "18",
358
+ height: "18",
359
+ fill: "currentColor",
360
+ "aria-hidden": "true",
361
+ style: {
362
+ marginLeft: 2
363
+ /* optical centering for triangle */
364
+ },
365
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 5.14v13.72L19 12 8 5.14z" })
366
+ }
367
+ );
368
+ var N8nIcon = () => /* @__PURE__ */ jsxRuntime.jsxs(
369
+ "svg",
370
+ {
371
+ viewBox: "0 0 24 24",
372
+ width: "14",
373
+ height: "14",
374
+ fill: "none",
375
+ stroke: "currentColor",
376
+ strokeWidth: "2",
377
+ strokeLinecap: "round",
378
+ strokeLinejoin: "round",
379
+ "aria-hidden": "true",
380
+ children: [
381
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "6", cy: "12", r: "2.2" }),
382
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "18", cy: "6", r: "2.2" }),
383
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "18", cy: "18", r: "2.2" }),
384
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8.2 12L15.8 6.8" }),
385
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8.2 12L15.8 17.2" })
386
+ ]
387
+ }
388
+ );
389
+ var PaidIcon = () => /* @__PURE__ */ jsxRuntime.jsxs(
390
+ "svg",
391
+ {
392
+ viewBox: "0 0 24 24",
393
+ width: "14",
394
+ height: "14",
395
+ fill: "none",
396
+ stroke: "currentColor",
397
+ strokeWidth: "2",
398
+ strokeLinecap: "round",
399
+ strokeLinejoin: "round",
400
+ "aria-hidden": "true",
401
+ children: [
402
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "12", y1: "3", x2: "12", y2: "21" }),
403
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M17 6H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6" })
404
+ ]
405
+ }
406
+ );
407
+ var LinkIcon = () => /* @__PURE__ */ jsxRuntime.jsxs(
408
+ "svg",
409
+ {
410
+ viewBox: "0 0 24 24",
411
+ width: "14",
412
+ height: "14",
413
+ fill: "none",
414
+ stroke: "currentColor",
415
+ strokeWidth: "2",
416
+ strokeLinecap: "round",
417
+ strokeLinejoin: "round",
418
+ "aria-hidden": "true",
419
+ children: [
420
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.72" }),
421
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" })
422
+ ]
423
+ }
424
+ );
425
+ var TrendingIcon = () => /* @__PURE__ */ jsxRuntime.jsxs(
426
+ "svg",
427
+ {
428
+ viewBox: "0 0 24 24",
429
+ width: "12",
430
+ height: "12",
431
+ fill: "none",
432
+ stroke: "currentColor",
433
+ strokeWidth: "2",
434
+ strokeLinecap: "round",
435
+ strokeLinejoin: "round",
436
+ "aria-hidden": "true",
437
+ children: [
438
+ /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "3 17 9 11 13 15 21 7" }),
439
+ /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "15 7 21 7 21 13" })
440
+ ]
441
+ }
442
+ );
443
+ var ChevronIcon = ({ open }) => /* @__PURE__ */ jsxRuntime.jsx(
444
+ "svg",
445
+ {
446
+ viewBox: "0 0 24 24",
447
+ width: "16",
448
+ height: "16",
449
+ fill: "currentColor",
450
+ "aria-hidden": "true",
451
+ style: {
452
+ transform: open ? "rotate(180deg)" : "rotate(0deg)",
453
+ transition: `transform ${tokens.transitions.fast}`
454
+ },
455
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z" })
456
+ }
457
+ );
458
+ var CheckIcon = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", width: "14", height: "14", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z" }) });
459
+ var ArrowUpIcon = () => /* @__PURE__ */ jsxRuntime.jsxs(
460
+ "svg",
461
+ {
462
+ viewBox: "0 0 24 24",
463
+ width: "14",
464
+ height: "14",
465
+ fill: "none",
466
+ stroke: "currentColor",
467
+ strokeWidth: "2",
468
+ strokeLinecap: "round",
469
+ strokeLinejoin: "round",
470
+ "aria-hidden": "true",
471
+ children: [
472
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 19V5" }),
473
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 12l7-7 7 7" })
474
+ ]
475
+ }
476
+ );
477
+ var ArrowDownIcon = () => /* @__PURE__ */ jsxRuntime.jsxs(
478
+ "svg",
479
+ {
480
+ viewBox: "0 0 24 24",
481
+ width: "14",
482
+ height: "14",
483
+ fill: "none",
484
+ stroke: "currentColor",
485
+ strokeWidth: "2",
486
+ strokeLinecap: "round",
487
+ strokeLinejoin: "round",
488
+ "aria-hidden": "true",
489
+ children: [
490
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 5v14" }),
491
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 12l-7 7-7-7" })
492
+ ]
493
+ }
494
+ );
495
+ var SupportIcon = () => /* @__PURE__ */ jsxRuntime.jsxs(
496
+ "svg",
497
+ {
498
+ viewBox: "0 0 24 24",
499
+ width: "14",
500
+ height: "14",
501
+ fill: "none",
502
+ stroke: "currentColor",
503
+ strokeWidth: "2",
504
+ strokeLinecap: "round",
505
+ strokeLinejoin: "round",
506
+ "aria-hidden": "true",
507
+ children: [
508
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10" }),
509
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "4" }),
510
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "4.93", y1: "4.93", x2: "9.17", y2: "9.17" }),
511
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "14.83", y1: "14.83", x2: "19.07", y2: "19.07" }),
512
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "14.83", y1: "9.17", x2: "19.07", y2: "4.93" }),
513
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "14.83", y1: "9.17", x2: "18.36", y2: "5.64" }),
514
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "4.93", y1: "19.07", x2: "9.17", y2: "14.83" })
515
+ ]
516
+ }
517
+ );
518
+ var DotIcon = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", width: "10", height: "10", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "6" }) });
519
+ var WorkflowDiscoveryCard = ({
520
+ id,
521
+ name,
522
+ summary,
523
+ description,
524
+ category,
525
+ icon,
526
+ readiness,
527
+ statusLabel,
528
+ integrations = [],
529
+ optionalIntegrations = [],
530
+ setupRequirements = [],
531
+ demoVideoUrl,
532
+ paidIntegration,
533
+ usesN8n = false,
534
+ source,
535
+ popularity,
536
+ reservePopularitySpace = true,
537
+ customIndicators = [],
538
+ estimatedCostPerRun,
539
+ defaultExpanded = false,
540
+ isExpanded: controlledExpanded,
541
+ onToggleExpanded,
542
+ onRun,
543
+ onPlayDemo,
544
+ onOpenPaidSheet,
545
+ votes,
546
+ votesPlacement = "expanded-footer",
547
+ onVote,
548
+ onReportIssue,
549
+ supportPlacement = "metadata",
550
+ disabled = false,
551
+ className
552
+ }) => {
553
+ const [internalExpanded, setInternalExpanded] = react.useState(defaultExpanded);
554
+ const expanded = controlledExpanded ?? internalExpanded;
555
+ const visual = readinessVisuals[readiness];
556
+ const displayedStatusLabel = statusLabel ?? visual.label;
557
+ const handleToggleExpanded = react.useCallback(() => {
558
+ const next = !expanded;
559
+ if (controlledExpanded === void 0) {
560
+ setInternalExpanded(next);
561
+ }
562
+ onToggleExpanded?.(id, next);
563
+ }, [expanded, controlledExpanded, onToggleExpanded, id]);
564
+ const handleRun = react.useCallback(
565
+ (e) => {
566
+ e.stopPropagation();
567
+ onRun?.(id);
568
+ },
569
+ [onRun, id]
570
+ );
571
+ const handlePlayDemo = react.useCallback(
572
+ (e) => {
573
+ e.stopPropagation();
574
+ if (demoVideoUrl) onPlayDemo?.(id, demoVideoUrl);
575
+ },
576
+ [onPlayDemo, id, demoVideoUrl]
577
+ );
578
+ const handleOpenPaid = react.useCallback(
579
+ (e) => {
580
+ e.stopPropagation();
581
+ if (paidIntegration) onOpenPaidSheet?.(id, paidIntegration);
582
+ },
583
+ [onOpenPaidSheet, id, paidIntegration]
584
+ );
585
+ const handleVote = react.useCallback(
586
+ (e, direction) => {
587
+ e.stopPropagation();
588
+ onVote?.(id, direction);
589
+ },
590
+ [onVote, id]
591
+ );
592
+ const handleReportIssue = react.useCallback(
593
+ (e) => {
594
+ e.stopPropagation();
595
+ onReportIssue?.(id, name);
596
+ },
597
+ [onReportIssue, id, name]
598
+ );
599
+ const hasDemo = Boolean(demoVideoUrl);
600
+ const hasN8n = usesN8n && readiness !== "needs-n8n";
601
+ const hasPaid = Boolean(paidIntegration) && readiness !== "paid";
602
+ const hasSource = Boolean(source);
603
+ const popularityNode = (() => {
604
+ if (popularity?.trending) {
605
+ return /* @__PURE__ */ jsxRuntime.jsxs(PopularityPill, { title: "Trending", children: [
606
+ /* @__PURE__ */ jsxRuntime.jsx(TrendingIcon, {}),
607
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Trending" })
608
+ ] });
609
+ }
610
+ if (popularity?.rank != null) {
611
+ return /* @__PURE__ */ jsxRuntime.jsx(PopularityPill, { title: `Ranked #${popularity.rank}`, children: /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
612
+ "#",
613
+ popularity.rank
614
+ ] }) });
615
+ }
616
+ if (popularity?.runCount != null) {
617
+ return /* @__PURE__ */ jsxRuntime.jsx(PopularityPill, { title: `${popularity.runCount} runs`, children: /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
618
+ formatRunCount(popularity.runCount),
619
+ " runs"
620
+ ] }) });
621
+ }
622
+ if (reservePopularitySpace) {
623
+ return /* @__PURE__ */ jsxRuntime.jsx(PopularitySlotPlaceholder, { "aria-hidden": "true" });
624
+ }
625
+ return null;
626
+ })();
627
+ const visibleIntegrations = integrations.slice(0, 4);
628
+ const overflowCount = Math.max(0, integrations.length - 4);
629
+ return /* @__PURE__ */ jsxRuntime.jsxs(
630
+ Card2,
631
+ {
632
+ "data-testid": `workflow-discovery-card-${id}`,
633
+ $disabled: disabled,
634
+ $expanded: expanded,
635
+ className,
636
+ "aria-label": `${name} \u2014 ${displayedStatusLabel}`,
637
+ children: [
638
+ /* @__PURE__ */ jsxRuntime.jsxs(
639
+ HeaderButton,
640
+ {
641
+ type: "button",
642
+ onClick: handleToggleExpanded,
643
+ disabled,
644
+ "aria-expanded": expanded,
645
+ "aria-controls": `workflow-discovery-card-${id}-details`,
646
+ children: [
647
+ /* @__PURE__ */ jsxRuntime.jsxs(HeaderTop, { children: [
648
+ icon !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(IconSlot, { "aria-hidden": "true", children: typeof icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(IconImg, { src: icon, alt: "" }) : icon }),
649
+ /* @__PURE__ */ jsxRuntime.jsxs(TitleColumn, { children: [
650
+ /* @__PURE__ */ jsxRuntime.jsxs(NameRow, { children: [
651
+ /* @__PURE__ */ jsxRuntime.jsx(Name, { children: name }),
652
+ /* @__PURE__ */ jsxRuntime.jsxs(HeaderTopRight, { children: [
653
+ category && /* @__PURE__ */ jsxRuntime.jsx(CategoryTag, { children: formatCategoryLabel(category) }),
654
+ /* @__PURE__ */ jsxRuntime.jsxs(MetadataIcons, { children: [
655
+ hasDemo && /* @__PURE__ */ jsxRuntime.jsx(
656
+ MetadataIcon,
657
+ {
658
+ "aria-hidden": "true",
659
+ title: "Demo video available",
660
+ $accent: tokens.colors.primary,
661
+ children: /* @__PURE__ */ jsxRuntime.jsx(PlayIcon, {})
662
+ }
663
+ ),
664
+ hasN8n && /* @__PURE__ */ jsxRuntime.jsx(
665
+ MetadataIcon,
666
+ {
667
+ "aria-hidden": "true",
668
+ title: "Uses n8n",
669
+ $accent: tokens.colors.accent,
670
+ children: /* @__PURE__ */ jsxRuntime.jsx(N8nIcon, {})
671
+ }
672
+ ),
673
+ hasPaid && /* @__PURE__ */ jsxRuntime.jsx(
674
+ MetadataIcon,
675
+ {
676
+ "aria-hidden": "true",
677
+ title: "Paid integration",
678
+ $accent: tokens.colors.accent,
679
+ children: /* @__PURE__ */ jsxRuntime.jsx(PaidIcon, {})
680
+ }
681
+ ),
682
+ hasSource && /* @__PURE__ */ jsxRuntime.jsx(
683
+ MetadataIcon,
684
+ {
685
+ "aria-hidden": "true",
686
+ title: `Based on ${source?.label}`,
687
+ $accent: tokens.colors.text.tertiary,
688
+ children: /* @__PURE__ */ jsxRuntime.jsx(LinkIcon, {})
689
+ }
690
+ ),
691
+ customIndicators.map((ind) => /* @__PURE__ */ jsxRuntime.jsx(
692
+ MetadataIcon,
693
+ {
694
+ "aria-hidden": "true",
695
+ title: ind.tooltip,
696
+ $accent: ind.color ?? tokens.colors.text.secondary,
697
+ children: ind.icon
698
+ },
699
+ ind.id
700
+ )),
701
+ votes && votesPlacement === "metadata" && /* @__PURE__ */ jsxRuntime.jsxs(
702
+ MetadataVoteCompact,
703
+ {
704
+ $userVote: votes.userVote ?? null,
705
+ onClick: (e) => handleVote(e, "up"),
706
+ title: `Upvote (${votes.up})`,
707
+ type: "button",
708
+ "aria-label": `Upvote \u2014 ${votes.up} so far`,
709
+ children: [
710
+ /* @__PURE__ */ jsxRuntime.jsx(ArrowUpIcon, {}),
711
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatVoteCount(votes.up - votes.down) })
712
+ ]
713
+ }
714
+ ),
715
+ onReportIssue && supportPlacement === "metadata" && /* @__PURE__ */ jsxRuntime.jsx(
716
+ MetadataIconButton,
717
+ {
718
+ $accent: tokens.colors.text.tertiary,
719
+ onClick: handleReportIssue,
720
+ title: "Report an issue with this workflow",
721
+ type: "button",
722
+ "aria-label": "Report an issue",
723
+ children: /* @__PURE__ */ jsxRuntime.jsx(SupportIcon, {})
724
+ }
725
+ )
726
+ ] })
727
+ ] })
728
+ ] }),
729
+ /* @__PURE__ */ jsxRuntime.jsx(Summary, { children: summary })
730
+ ] })
731
+ ] }),
732
+ /* @__PURE__ */ jsxRuntime.jsxs(HeaderBottom, { children: [
733
+ /* @__PURE__ */ jsxRuntime.jsxs(HeaderBottomContent, { children: [
734
+ /* @__PURE__ */ jsxRuntime.jsxs(
735
+ StatusPill,
736
+ {
737
+ $bg: visual.bg,
738
+ $border: visual.border,
739
+ $color: visual.color,
740
+ $animated: visual.animated,
741
+ children: [
742
+ /* @__PURE__ */ jsxRuntime.jsx(StatusDot, { $color: visual.color, $animated: visual.animated, children: /* @__PURE__ */ jsxRuntime.jsx(DotIcon, {}) }),
743
+ displayedStatusLabel
744
+ ]
745
+ }
746
+ ),
747
+ visibleIntegrations.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(IntegrationRow, { children: [
748
+ visibleIntegrations.map((it) => /* @__PURE__ */ jsxRuntime.jsx(
749
+ IntegrationIconSlot,
750
+ {
751
+ $connected: it.connected !== false,
752
+ $optional: !!it.optional,
753
+ title: `${it.name}${it.connected === false ? it.optional ? " (optional)" : " (not connected)" : ""}`,
754
+ children: typeof it.icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(IntegrationImg, { src: it.icon, alt: it.name }) : it.icon
755
+ },
756
+ it.name
757
+ )),
758
+ overflowCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(OverflowBadge, { title: `${overflowCount} more`, children: [
759
+ "+",
760
+ overflowCount
761
+ ] })
762
+ ] }),
763
+ popularityNode,
764
+ estimatedCostPerRun && /* @__PURE__ */ jsxRuntime.jsxs(CostPill, { title: `Estimated ${estimatedCostPerRun} per run`, children: [
765
+ estimatedCostPerRun,
766
+ estimatedCostPerRun.includes("/") ? "" : "/run"
767
+ ] }),
768
+ votes && votesPlacement === "bottom-row" && /* @__PURE__ */ jsxRuntime.jsxs(VotePill, { role: "group", "aria-label": "Workflow voting", children: [
769
+ /* @__PURE__ */ jsxRuntime.jsx(
770
+ VoteArrowButton,
771
+ {
772
+ type: "button",
773
+ $active: votes.userVote === "up",
774
+ $direction: "up",
775
+ onClick: (e) => handleVote(e, "up"),
776
+ "aria-label": `Upvote \u2014 ${votes.up} so far`,
777
+ children: /* @__PURE__ */ jsxRuntime.jsx(ArrowUpIcon, {})
778
+ }
779
+ ),
780
+ /* @__PURE__ */ jsxRuntime.jsx(VoteCount, { children: formatVoteCount(votes.up - votes.down) }),
781
+ /* @__PURE__ */ jsxRuntime.jsx(
782
+ VoteArrowButton,
783
+ {
784
+ type: "button",
785
+ $active: votes.userVote === "down",
786
+ $direction: "down",
787
+ onClick: (e) => handleVote(e, "down"),
788
+ "aria-label": `Downvote \u2014 ${votes.down} so far`,
789
+ children: /* @__PURE__ */ jsxRuntime.jsx(ArrowDownIcon, {})
790
+ }
791
+ )
792
+ ] })
793
+ ] }),
794
+ /* @__PURE__ */ jsxRuntime.jsx(ChevronWrapper, { "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon, { open: expanded }) })
795
+ ] })
796
+ ]
797
+ }
798
+ ),
799
+ /* @__PURE__ */ jsxRuntime.jsx(
800
+ DetailsPanel,
801
+ {
802
+ id: `workflow-discovery-card-${id}-details`,
803
+ $expanded: expanded,
804
+ "aria-hidden": !expanded,
805
+ children: /* @__PURE__ */ jsxRuntime.jsxs(DetailsInner, { children: [
806
+ /* @__PURE__ */ jsxRuntime.jsx(DescriptionBlock, { children: description ?? summary }),
807
+ setupRequirements.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(Section, { children: [
808
+ /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { children: "Setup required" }),
809
+ /* @__PURE__ */ jsxRuntime.jsx(SetupList, { children: setupRequirements.map((req) => /* @__PURE__ */ jsxRuntime.jsxs(SetupRow, { $done: !!req.done, children: [
810
+ /* @__PURE__ */ jsxRuntime.jsx(SetupStatus, { $done: !!req.done, "aria-hidden": "true", children: req.done ? /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, {}) : /* @__PURE__ */ jsxRuntime.jsx(DotIcon, {}) }),
811
+ /* @__PURE__ */ jsxRuntime.jsx(SetupLabel, { $done: !!req.done, children: req.label }),
812
+ !req.done && req.actionLabel && /* @__PURE__ */ jsxRuntime.jsx(
813
+ SetupAction,
814
+ {
815
+ type: "button",
816
+ onClick: (e) => {
817
+ e.stopPropagation();
818
+ req.onAction?.();
819
+ },
820
+ children: req.actionLabel
821
+ }
822
+ )
823
+ ] }, req.id)) })
824
+ ] }),
825
+ (integrations.length > 0 || optionalIntegrations.length > 0) && /* @__PURE__ */ jsxRuntime.jsxs(Section, { children: [
826
+ /* @__PURE__ */ jsxRuntime.jsx(SectionTitle, { children: "Integrations" }),
827
+ /* @__PURE__ */ jsxRuntime.jsxs(IntegrationGroupsRow, { children: [
828
+ integrations.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(IntegrationGroup, { children: [
829
+ /* @__PURE__ */ jsxRuntime.jsx(IntegrationGroupLabel, { children: "Required" }),
830
+ /* @__PURE__ */ jsxRuntime.jsx(IntegrationRow, { children: integrations.map((it) => /* @__PURE__ */ jsxRuntime.jsx(
831
+ IntegrationIconSlot,
832
+ {
833
+ $connected: it.connected !== false,
834
+ $optional: false,
835
+ title: `${it.name}${it.connected === false ? " (not connected)" : ""}`,
836
+ children: typeof it.icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(IntegrationImg, { src: it.icon, alt: it.name }) : it.icon
837
+ },
838
+ `req-${it.name}`
839
+ )) })
840
+ ] }),
841
+ optionalIntegrations.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(IntegrationGroup, { children: [
842
+ /* @__PURE__ */ jsxRuntime.jsx(IntegrationGroupLabel, { children: "Optional" }),
843
+ /* @__PURE__ */ jsxRuntime.jsx(IntegrationRow, { children: optionalIntegrations.map((it) => /* @__PURE__ */ jsxRuntime.jsx(
844
+ IntegrationIconSlot,
845
+ {
846
+ $connected: it.connected !== false,
847
+ $optional: true,
848
+ title: `${it.name} (optional)`,
849
+ children: typeof it.icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(IntegrationImg, { src: it.icon, alt: it.name }) : it.icon
850
+ },
851
+ `opt-${it.name}`
852
+ )) })
853
+ ] })
854
+ ] })
855
+ ] }),
856
+ paidIntegration && /* @__PURE__ */ jsxRuntime.jsxs(PaidBanner, { children: [
857
+ /* @__PURE__ */ jsxRuntime.jsxs(PaidBannerHeader, { children: [
858
+ /* @__PURE__ */ jsxRuntime.jsx(PaidIcon, {}),
859
+ /* @__PURE__ */ jsxRuntime.jsxs(PaidBannerTitle, { children: [
860
+ paidIntegration.name,
861
+ " requires a paid subscription",
862
+ paidIntegration.hasFreeTrial ? " \xB7 free trial available" : ""
863
+ ] })
864
+ ] }),
865
+ paidIntegration.pricingNote && /* @__PURE__ */ jsxRuntime.jsx(PaidBannerNote, { children: paidIntegration.pricingNote }),
866
+ /* @__PURE__ */ jsxRuntime.jsxs(PaidBannerActions, { children: [
867
+ /* @__PURE__ */ jsxRuntime.jsx(PrimaryPillButton, { type: "button", onClick: handleOpenPaid, children: paidIntegration.hasFreeTrial ? "Start free trial" : "View pricing" }),
868
+ paidIntegration.setupVideoUrl && /* @__PURE__ */ jsxRuntime.jsxs(SecondaryPillButton, { type: "button", onClick: handleOpenPaid, children: [
869
+ /* @__PURE__ */ jsxRuntime.jsx(PlayIcon, {}),
870
+ " Watch setup"
871
+ ] })
872
+ ] })
873
+ ] }),
874
+ demoVideoUrl && /* @__PURE__ */ jsxRuntime.jsxs(DemoBanner, { type: "button", onClick: handlePlayDemo, "aria-label": "Play demo video", children: [
875
+ /* @__PURE__ */ jsxRuntime.jsx(DemoPlayBubble, { children: /* @__PURE__ */ jsxRuntime.jsx(PlayIconLarge, {}) }),
876
+ /* @__PURE__ */ jsxRuntime.jsxs(DemoText, { children: [
877
+ /* @__PURE__ */ jsxRuntime.jsx(DemoTitle, { children: "Watch the demo" }),
878
+ /* @__PURE__ */ jsxRuntime.jsx(DemoSubtitle, { children: "See this workflow in action before you run it" })
879
+ ] })
880
+ ] }),
881
+ /* @__PURE__ */ jsxRuntime.jsx(Actions, { children: readiness === "unavailable" ? /* @__PURE__ */ jsxRuntime.jsx(UnavailableNote, { children: "This workflow is not available on your plan." }) : readiness === "failed" ? /* @__PURE__ */ jsxRuntime.jsx(UnavailableNote, { children: "Provisioning failed. Retry from settings, or contact support." }) : /* @__PURE__ */ jsxRuntime.jsx(
882
+ PrimaryActionButton,
883
+ {
884
+ type: "button",
885
+ onClick: handleRun,
886
+ disabled: disabled || readiness === "provisioning",
887
+ children: readiness === "ready" ? "Run workflow" : readiness === "provisioning" ? "Provisioning\u2026" : "Set up to run"
888
+ }
889
+ ) }),
890
+ votes && votesPlacement === "expanded-footer" || onReportIssue && supportPlacement === "expanded-footer" ? /* @__PURE__ */ jsxRuntime.jsxs(ExpandedFooterActions, { children: [
891
+ votes && votesPlacement === "expanded-footer" && /* @__PURE__ */ jsxRuntime.jsxs(VoteBlock, { role: "group", "aria-label": "Was this workflow helpful?", children: [
892
+ /* @__PURE__ */ jsxRuntime.jsx(VoteBlockLabel, { children: "Was this helpful?" }),
893
+ /* @__PURE__ */ jsxRuntime.jsxs(VoteBlockButtons, { children: [
894
+ /* @__PURE__ */ jsxRuntime.jsxs(
895
+ VoteBlockButton,
896
+ {
897
+ type: "button",
898
+ $active: votes.userVote === "up",
899
+ $direction: "up",
900
+ onClick: (e) => handleVote(e, "up"),
901
+ "aria-label": `Upvote \u2014 ${votes.up} so far`,
902
+ children: [
903
+ /* @__PURE__ */ jsxRuntime.jsx(ArrowUpIcon, {}),
904
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatVoteCount(votes.up) })
905
+ ]
906
+ }
907
+ ),
908
+ /* @__PURE__ */ jsxRuntime.jsxs(
909
+ VoteBlockButton,
910
+ {
911
+ type: "button",
912
+ $active: votes.userVote === "down",
913
+ $direction: "down",
914
+ onClick: (e) => handleVote(e, "down"),
915
+ "aria-label": `Downvote \u2014 ${votes.down} so far`,
916
+ children: [
917
+ /* @__PURE__ */ jsxRuntime.jsx(ArrowDownIcon, {}),
918
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatVoteCount(votes.down) })
919
+ ]
920
+ }
921
+ )
922
+ ] })
923
+ ] }),
924
+ onReportIssue && supportPlacement === "expanded-footer" && /* @__PURE__ */ jsxRuntime.jsxs(SupportButton, { type: "button", onClick: handleReportIssue, children: [
925
+ /* @__PURE__ */ jsxRuntime.jsx(SupportIcon, {}),
926
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Report an issue" })
927
+ ] })
928
+ ] }) : null,
929
+ source && /* @__PURE__ */ jsxRuntime.jsxs(SourceFooter, { children: [
930
+ "Based on",
931
+ " ",
932
+ /* @__PURE__ */ jsxRuntime.jsx(SourceLink, { href: source.url, target: "_blank", rel: "noopener noreferrer", children: source.label })
933
+ ] })
934
+ ] })
935
+ }
936
+ )
937
+ ]
938
+ }
939
+ );
940
+ };
941
+ WorkflowDiscoveryCard.displayName = "WorkflowDiscoveryCard";
942
+ function formatRunCount(n) {
943
+ if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
944
+ if (n >= 1e3) return `${(n / 1e3).toFixed(1)}K`;
945
+ return String(n);
946
+ }
947
+ function formatCategoryLabel(category) {
948
+ return category.replace(/_/g, " ");
949
+ }
950
+ function formatVoteCount(n) {
951
+ const sign = n < 0 ? "-" : "";
952
+ const abs = Math.abs(n);
953
+ if (abs >= 1e6) return `${sign}${(abs / 1e6).toFixed(1)}M`;
954
+ if (abs >= 1e3) return `${sign}${(abs / 1e3).toFixed(1)}K`;
955
+ return `${sign}${abs}`;
956
+ }
957
+ var pulse = styled2.keyframes`
958
+ 0%, 100% { opacity: 1; }
959
+ 50% { opacity: 0.5; }
960
+ `;
961
+ var expandIn = styled2.keyframes`
962
+ from { opacity: 0; }
963
+ to { opacity: 1; }
964
+ `;
965
+ var Card2 = styled2__default.default.article`
966
+ display: flex;
967
+ flex-direction: column;
968
+ width: 100%;
969
+ background: ${tokens.colors.background.dark};
970
+ border: 1px solid
971
+ ${(p) => p.$expanded ? tokens.colors.border.hover : tokens.colors.border.default};
972
+ border-radius: ${tokens.borderRadius.xl};
973
+ overflow: hidden;
974
+ font-family: ${tokens.typography.fontFamily.primary};
975
+ transition: border-color ${tokens.transitions.fast},
976
+ background-color ${tokens.transitions.fast};
977
+ opacity: ${(p) => p.$disabled ? 0.55 : 1};
978
+
979
+ &:hover {
980
+ border-color: ${(p) => p.$disabled ? tokens.colors.border.default : tokens.colors.border.hover};
981
+ }
982
+
983
+ @media (min-width: ${tokens.breakpoints.tablet}px) {
984
+ /* Slightly more breathing room on larger screens */
985
+ border-radius: ${tokens.borderRadius.xl};
986
+ }
987
+ `;
988
+ var HeaderButton = styled2__default.default.button`
989
+ all: unset;
990
+ display: flex;
991
+ flex-direction: column;
992
+ gap: ${tokens.spacing.sm};
993
+ padding: ${tokens.spacing.md};
994
+ cursor: pointer;
995
+ text-align: left;
996
+ width: 100%;
997
+ box-sizing: border-box;
998
+
999
+ &:focus-visible {
1000
+ outline: 2px solid ${tokens.colors.border.focus};
1001
+ outline-offset: -2px;
1002
+ }
1003
+
1004
+ &:disabled {
1005
+ cursor: not-allowed;
1006
+ }
1007
+
1008
+ @media (min-width: ${tokens.breakpoints.tablet}px) {
1009
+ padding: ${tokens.spacing.md} ${tokens.spacing.lg};
1010
+ }
1011
+ `;
1012
+ var HeaderTop = styled2__default.default.div`
1013
+ display: flex;
1014
+ align-items: flex-start;
1015
+ gap: ${tokens.spacing.sm};
1016
+ width: 100%;
1017
+ `;
1018
+ var IconSlot = styled2__default.default.div`
1019
+ display: flex;
1020
+ align-items: center;
1021
+ justify-content: center;
1022
+ width: 36px;
1023
+ height: 36px;
1024
+ padding: 6px;
1025
+ box-sizing: border-box;
1026
+ flex-shrink: 0;
1027
+ background: ${tokens.colors.background.light};
1028
+ border-radius: ${tokens.borderRadius.md};
1029
+ color: ${tokens.colors.text.secondary};
1030
+ `;
1031
+ var IconImg = styled2__default.default.img`
1032
+ width: 100%;
1033
+ height: 100%;
1034
+ object-fit: contain;
1035
+ `;
1036
+ var TitleColumn = styled2__default.default.div`
1037
+ display: flex;
1038
+ flex-direction: column;
1039
+ gap: 2px;
1040
+ min-width: 0;
1041
+ flex: 1;
1042
+ `;
1043
+ var NameRow = styled2__default.default.div`
1044
+ display: flex;
1045
+ align-items: flex-start;
1046
+ gap: ${tokens.spacing.sm};
1047
+ min-width: 0;
1048
+ `;
1049
+ var Name = styled2__default.default.h3`
1050
+ flex: 1 1 auto;
1051
+ margin: 0;
1052
+ font-size: ${tokens.typography.fontSize.base};
1053
+ font-weight: ${tokens.typography.fontWeight.semibold};
1054
+ color: ${tokens.colors.text.primary};
1055
+ line-height: ${tokens.typography.lineHeight.tight};
1056
+ /* Allow up to 2 lines on narrow screens (e.g. 320px). On wider screens
1057
+ the title will naturally render as 1 line because there's room. We use
1058
+ overflow-wrap (not word-break) so words don't split mid-character —
1059
+ they only break when a single word is too long for one line. */
1060
+ display: -webkit-box;
1061
+ -webkit-line-clamp: 2;
1062
+ -webkit-box-orient: vertical;
1063
+ overflow: hidden;
1064
+ overflow-wrap: break-word;
1065
+ min-width: 0;
1066
+ `;
1067
+ var CategoryTag = styled2__default.default.span`
1068
+ font-size: 10px;
1069
+ font-weight: ${tokens.typography.fontWeight.medium};
1070
+ text-transform: uppercase;
1071
+ letter-spacing: 0.5px;
1072
+ color: ${tokens.colors.text.tertiary};
1073
+ background: ${tokens.colors.surface.overlay};
1074
+ padding: 2px ${tokens.spacing.xs};
1075
+ border-radius: ${tokens.borderRadius.sm};
1076
+ flex-shrink: 0;
1077
+ `;
1078
+ var Summary = styled2__default.default.p`
1079
+ margin: 0;
1080
+ font-size: ${tokens.typography.fontSize.xs};
1081
+ color: ${tokens.colors.text.secondary};
1082
+ line-height: ${tokens.typography.lineHeight.normal};
1083
+ /* Clamp to 2 lines so mobile shows the gist (instead of cutting at ~25 chars
1084
+ with a single-line ellipsis) while wider screens still mostly render as
1085
+ one line because of the available width. overflow-wrap (not word-break)
1086
+ keeps full words intact unless a single word genuinely doesn't fit. */
1087
+ display: -webkit-box;
1088
+ -webkit-line-clamp: 2;
1089
+ -webkit-box-orient: vertical;
1090
+ overflow: hidden;
1091
+ overflow-wrap: break-word;
1092
+ min-width: 0;
1093
+ `;
1094
+ var HeaderTopRight = styled2__default.default.div`
1095
+ display: flex;
1096
+ align-items: center;
1097
+ gap: ${tokens.spacing.xs};
1098
+ flex-shrink: 0;
1099
+ `;
1100
+ var MetadataIcons = styled2__default.default.div`
1101
+ display: flex;
1102
+ align-items: center;
1103
+ gap: ${tokens.spacing.xs};
1104
+ flex-shrink: 0;
1105
+ `;
1106
+ var MetadataIcon = styled2__default.default.span`
1107
+ display: inline-flex;
1108
+ align-items: center;
1109
+ justify-content: center;
1110
+ width: 26px;
1111
+ height: 26px;
1112
+ border-radius: ${tokens.borderRadius.full};
1113
+ background: ${(p) => `${p.$accent}1F`};
1114
+ color: ${(p) => p.$accent};
1115
+ flex-shrink: 0;
1116
+ `;
1117
+ var MetadataIconButton = styled2__default.default.button`
1118
+ all: unset;
1119
+ display: inline-flex;
1120
+ align-items: center;
1121
+ justify-content: center;
1122
+ width: 26px;
1123
+ height: 26px;
1124
+ border-radius: ${tokens.borderRadius.full};
1125
+ background: ${(p) => `${p.$accent}1F`};
1126
+ color: ${(p) => p.$accent};
1127
+ flex-shrink: 0;
1128
+ cursor: pointer;
1129
+ transition: background ${tokens.transitions.fast};
1130
+
1131
+ &:hover {
1132
+ background: ${(p) => `${p.$accent}33`};
1133
+ }
1134
+
1135
+ &:focus-visible {
1136
+ outline: 2px solid ${tokens.colors.border.focus};
1137
+ outline-offset: 2px;
1138
+ }
1139
+ `;
1140
+ var MetadataVoteCompact = styled2__default.default.button`
1141
+ all: unset;
1142
+ display: inline-flex;
1143
+ align-items: center;
1144
+ gap: 4px;
1145
+ height: 26px;
1146
+ padding: 0 ${tokens.spacing.sm};
1147
+ border-radius: ${tokens.borderRadius.full};
1148
+ background: ${(p) => p.$userVote === "up" ? `${tokens.colors.primary}33` : `${tokens.colors.text.tertiary}1F`};
1149
+ color: ${(p) => p.$userVote === "up" ? tokens.colors.primary : tokens.colors.text.secondary};
1150
+ font-size: 11px;
1151
+ font-weight: ${tokens.typography.fontWeight.medium};
1152
+ cursor: pointer;
1153
+ transition: background ${tokens.transitions.fast}, color ${tokens.transitions.fast};
1154
+
1155
+ &:hover {
1156
+ background: ${(p) => p.$userVote === "up" ? `${tokens.colors.primary}40` : `${tokens.colors.text.tertiary}33`};
1157
+ }
1158
+
1159
+ &:focus-visible {
1160
+ outline: 2px solid ${tokens.colors.border.focus};
1161
+ outline-offset: 2px;
1162
+ }
1163
+ `;
1164
+ var HeaderBottom = styled2__default.default.div`
1165
+ display: flex;
1166
+ align-items: center;
1167
+ justify-content: space-between;
1168
+ gap: ${tokens.spacing.sm};
1169
+ width: 100%;
1170
+ `;
1171
+ var HeaderBottomContent = styled2__default.default.div`
1172
+ display: flex;
1173
+ align-items: center;
1174
+ flex-wrap: wrap;
1175
+ gap: ${tokens.spacing.xs};
1176
+ flex: 1 1 auto;
1177
+ min-width: 0;
1178
+ `;
1179
+ var StatusPill = styled2__default.default.span`
1180
+ display: inline-flex;
1181
+ align-items: center;
1182
+ gap: ${tokens.spacing.xs};
1183
+ padding: 4px ${tokens.spacing.sm};
1184
+ border-radius: ${tokens.borderRadius.full};
1185
+ background: ${(p) => p.$bg};
1186
+ border: 1px solid ${(p) => p.$border};
1187
+ color: ${(p) => p.$color};
1188
+ font-size: 11px;
1189
+ font-weight: ${tokens.typography.fontWeight.medium};
1190
+ line-height: 1;
1191
+ `;
1192
+ var StatusDot = styled2__default.default.span`
1193
+ display: inline-flex;
1194
+ width: 8px;
1195
+ height: 8px;
1196
+ color: ${(p) => p.$color};
1197
+ ${(p) => p.$animated && styled2.css`
1198
+ animation: ${pulse} ${tokens.animation.pulse.duration} ease-in-out infinite;
1199
+ `}
1200
+
1201
+ svg {
1202
+ width: 100%;
1203
+ height: 100%;
1204
+ }
1205
+ `;
1206
+ var IntegrationRow = styled2__default.default.div`
1207
+ display: inline-flex;
1208
+ align-items: center;
1209
+ gap: ${tokens.spacing.xs};
1210
+ `;
1211
+ var IntegrationIconSlot = styled2__default.default.span`
1212
+ position: relative;
1213
+ display: inline-flex;
1214
+ align-items: center;
1215
+ justify-content: center;
1216
+ width: 28px;
1217
+ height: 28px;
1218
+ padding: 5px;
1219
+ box-sizing: border-box;
1220
+ background: rgba(255, 255, 255, 0.06);
1221
+ border-radius: ${tokens.borderRadius.md};
1222
+ opacity: ${(p) => p.$connected ? 1 : p.$optional ? 0.45 : 0.55};
1223
+ flex-shrink: 0;
1224
+
1225
+ ${(p) => !p.$connected && styled2.css`
1226
+ &::after {
1227
+ content: '';
1228
+ position: absolute;
1229
+ inset: 0;
1230
+ border-radius: ${tokens.borderRadius.md};
1231
+ border: 1px dashed
1232
+ ${p.$optional ? tokens.colors.border.default : tokens.colors.warning};
1233
+ pointer-events: none;
1234
+ }
1235
+ `}
1236
+ `;
1237
+ var IntegrationImg = styled2__default.default.img`
1238
+ width: 100%;
1239
+ height: 100%;
1240
+ object-fit: contain;
1241
+ `;
1242
+ var OverflowBadge = styled2__default.default.span`
1243
+ display: inline-flex;
1244
+ align-items: center;
1245
+ justify-content: center;
1246
+ min-width: 28px;
1247
+ height: 28px;
1248
+ padding: 0 ${tokens.spacing.xs};
1249
+ background: ${tokens.colors.surface.overlay};
1250
+ border-radius: ${tokens.borderRadius.md};
1251
+ font-size: 11px;
1252
+ font-weight: ${tokens.typography.fontWeight.medium};
1253
+ color: ${tokens.colors.text.tertiary};
1254
+ flex-shrink: 0;
1255
+ `;
1256
+ var PopularityPill = styled2__default.default.span`
1257
+ display: inline-flex;
1258
+ align-items: center;
1259
+ gap: ${tokens.spacing.xs};
1260
+ padding: 3px ${tokens.spacing.sm};
1261
+ border-radius: ${tokens.borderRadius.full};
1262
+ background: ${tokens.colors.surface.overlay};
1263
+ border: 1px solid ${tokens.colors.border.subtle};
1264
+ font-size: 10px;
1265
+ font-weight: ${tokens.typography.fontWeight.medium};
1266
+ color: ${tokens.colors.text.tertiary};
1267
+ `;
1268
+ var PopularitySlotPlaceholder = styled2__default.default.span`
1269
+ display: inline-block;
1270
+ min-width: 48px;
1271
+ height: 1px;
1272
+ `;
1273
+ var CostPill = styled2__default.default.span`
1274
+ display: inline-flex;
1275
+ align-items: center;
1276
+ padding: 3px ${tokens.spacing.sm};
1277
+ border-radius: ${tokens.borderRadius.full};
1278
+ background: ${tokens.colors.surface.overlay};
1279
+ border: 1px solid ${tokens.colors.border.subtle};
1280
+ font-size: 10px;
1281
+ font-weight: ${tokens.typography.fontWeight.medium};
1282
+ color: ${tokens.colors.text.tertiary};
1283
+ `;
1284
+ var VotePill = styled2__default.default.span`
1285
+ display: inline-flex;
1286
+ align-items: center;
1287
+ gap: 4px;
1288
+ padding: 2px ${tokens.spacing.xs};
1289
+ border-radius: ${tokens.borderRadius.full};
1290
+ background: ${tokens.colors.surface.overlay};
1291
+ border: 1px solid ${tokens.colors.border.subtle};
1292
+ `;
1293
+ var VoteArrowButton = styled2__default.default.button`
1294
+ all: unset;
1295
+ display: inline-flex;
1296
+ align-items: center;
1297
+ justify-content: center;
1298
+ width: 20px;
1299
+ height: 20px;
1300
+ border-radius: ${tokens.borderRadius.full};
1301
+ cursor: pointer;
1302
+ color: ${(p) => p.$active ? p.$direction === "up" ? tokens.colors.primary : tokens.colors.error : tokens.colors.text.tertiary};
1303
+ background: ${(p) => p.$active ? p.$direction === "up" ? `${tokens.colors.primary}26` : `${tokens.colors.error}26` : "transparent"};
1304
+ transition: background ${tokens.transitions.fast}, color ${tokens.transitions.fast};
1305
+
1306
+ &:hover {
1307
+ color: ${(p) => p.$direction === "up" ? tokens.colors.primary : tokens.colors.error};
1308
+ background: ${(p) => p.$direction === "up" ? `${tokens.colors.primary}1F` : `${tokens.colors.error}1F`};
1309
+ }
1310
+
1311
+ &:focus-visible {
1312
+ outline: 2px solid ${tokens.colors.border.focus};
1313
+ outline-offset: 2px;
1314
+ }
1315
+ `;
1316
+ var VoteCount = styled2__default.default.span`
1317
+ font-size: 11px;
1318
+ font-weight: ${tokens.typography.fontWeight.semibold};
1319
+ color: ${tokens.colors.text.secondary};
1320
+ min-width: 18px;
1321
+ text-align: center;
1322
+ `;
1323
+ var ChevronWrapper = styled2__default.default.span`
1324
+ display: inline-flex;
1325
+ align-items: center;
1326
+ justify-content: center;
1327
+ color: ${tokens.colors.text.tertiary};
1328
+ `;
1329
+ var DetailsPanel = styled2__default.default.div`
1330
+ overflow: hidden;
1331
+ max-height: ${(p) => p.$expanded ? "2000px" : "0"};
1332
+ opacity: ${(p) => p.$expanded ? 1 : 0};
1333
+ transition: max-height ${tokens.transitions.normal},
1334
+ opacity ${tokens.transitions.fast};
1335
+
1336
+ ${(p) => p.$expanded && styled2.css`
1337
+ animation: ${expandIn} ${tokens.transitions.fast};
1338
+ `}
1339
+ `;
1340
+ var DetailsInner = styled2__default.default.div`
1341
+ display: flex;
1342
+ flex-direction: column;
1343
+ gap: ${tokens.spacing.md};
1344
+ padding: 0 ${tokens.spacing.md} ${tokens.spacing.md};
1345
+ border-top: 1px solid ${tokens.colors.border.subtle};
1346
+ padding-top: ${tokens.spacing.md};
1347
+
1348
+ @media (min-width: ${tokens.breakpoints.tablet}px) {
1349
+ padding: ${tokens.spacing.md} ${tokens.spacing.lg} ${tokens.spacing.lg};
1350
+ padding-top: ${tokens.spacing.md};
1351
+ }
1352
+ `;
1353
+ var DescriptionBlock = styled2__default.default.p`
1354
+ margin: 0;
1355
+ font-size: ${tokens.typography.fontSize.sm};
1356
+ line-height: ${tokens.typography.lineHeight.relaxed};
1357
+ color: ${tokens.colors.text.secondary};
1358
+ `;
1359
+ var Section = styled2__default.default.section`
1360
+ display: flex;
1361
+ flex-direction: column;
1362
+ gap: ${tokens.spacing.sm};
1363
+ `;
1364
+ var SectionTitle = styled2__default.default.h4`
1365
+ margin: 0;
1366
+ font-size: 11px;
1367
+ font-weight: ${tokens.typography.fontWeight.semibold};
1368
+ letter-spacing: 0.5px;
1369
+ text-transform: uppercase;
1370
+ color: ${tokens.colors.text.tertiary};
1371
+ `;
1372
+ var SetupList = styled2__default.default.ul`
1373
+ list-style: none;
1374
+ margin: 0;
1375
+ padding: 0;
1376
+ display: flex;
1377
+ flex-direction: column;
1378
+ gap: ${tokens.spacing.xs};
1379
+ `;
1380
+ var SetupRow = styled2__default.default.li`
1381
+ display: flex;
1382
+ align-items: center;
1383
+ gap: ${tokens.spacing.sm};
1384
+ padding: ${tokens.spacing.xs} ${tokens.spacing.sm};
1385
+ background: ${tokens.colors.surface.subtle};
1386
+ border-radius: ${tokens.borderRadius.md};
1387
+ `;
1388
+ var SetupStatus = styled2__default.default.span`
1389
+ display: inline-flex;
1390
+ align-items: center;
1391
+ justify-content: center;
1392
+ width: 18px;
1393
+ height: 18px;
1394
+ border-radius: ${tokens.borderRadius.full};
1395
+ background: ${(p) => p.$done ? `${tokens.colors.success}1A` : tokens.colors.surface.overlay};
1396
+ color: ${(p) => p.$done ? tokens.colors.success : tokens.colors.text.tertiary};
1397
+ flex-shrink: 0;
1398
+ `;
1399
+ var SetupLabel = styled2__default.default.span`
1400
+ flex: 1;
1401
+ font-size: ${tokens.typography.fontSize.xs};
1402
+ color: ${(p) => p.$done ? tokens.colors.text.tertiary : tokens.colors.text.primary};
1403
+ text-decoration: ${(p) => p.$done ? "line-through" : "none"};
1404
+ `;
1405
+ var SetupAction = styled2__default.default.button`
1406
+ all: unset;
1407
+ font-size: 11px;
1408
+ font-weight: ${tokens.typography.fontWeight.medium};
1409
+ color: ${tokens.colors.primary};
1410
+ padding: ${tokens.spacing.xs} ${tokens.spacing.sm};
1411
+ border-radius: ${tokens.borderRadius.sm};
1412
+ cursor: pointer;
1413
+ transition: background ${tokens.transitions.fast};
1414
+
1415
+ &:hover {
1416
+ background: ${tokens.colors.surface.overlay};
1417
+ }
1418
+
1419
+ &:focus-visible {
1420
+ outline: 2px solid ${tokens.colors.border.focus};
1421
+ outline-offset: 2px;
1422
+ }
1423
+ `;
1424
+ var IntegrationGroupsRow = styled2__default.default.div`
1425
+ display: flex;
1426
+ flex-wrap: wrap;
1427
+ justify-content: space-between;
1428
+ gap: ${tokens.spacing.md} ${tokens.spacing.lg};
1429
+ width: 100%;
1430
+ `;
1431
+ var IntegrationGroup = styled2__default.default.div`
1432
+ display: flex;
1433
+ flex-direction: column;
1434
+ gap: ${tokens.spacing.xs};
1435
+ `;
1436
+ var IntegrationGroupLabel = styled2__default.default.span`
1437
+ font-size: 10px;
1438
+ font-weight: ${tokens.typography.fontWeight.medium};
1439
+ text-transform: uppercase;
1440
+ letter-spacing: 0.5px;
1441
+ color: ${tokens.colors.text.tertiary};
1442
+ `;
1443
+ var PaidBanner = styled2__default.default.div`
1444
+ display: flex;
1445
+ flex-direction: column;
1446
+ gap: ${tokens.spacing.sm};
1447
+ padding: ${tokens.spacing.sm} ${tokens.spacing.md};
1448
+ background: ${tokens.colors.accent}14;
1449
+ border: 1px solid ${tokens.colors.accent}33;
1450
+ border-radius: ${tokens.borderRadius.md};
1451
+ `;
1452
+ var PaidBannerHeader = styled2__default.default.div`
1453
+ display: flex;
1454
+ align-items: center;
1455
+ gap: ${tokens.spacing.sm};
1456
+ color: ${tokens.colors.accent};
1457
+ `;
1458
+ var PaidBannerTitle = styled2__default.default.span`
1459
+ font-size: ${tokens.typography.fontSize.xs};
1460
+ font-weight: ${tokens.typography.fontWeight.medium};
1461
+ color: ${tokens.colors.text.primary};
1462
+ `;
1463
+ var PaidBannerNote = styled2__default.default.p`
1464
+ margin: 0;
1465
+ font-size: 11px;
1466
+ color: ${tokens.colors.text.tertiary};
1467
+ `;
1468
+ var PaidBannerActions = styled2__default.default.div`
1469
+ display: flex;
1470
+ gap: ${tokens.spacing.xs};
1471
+ flex-wrap: wrap;
1472
+ `;
1473
+ var PrimaryPillButton = styled2__default.default.button`
1474
+ all: unset;
1475
+ display: inline-flex;
1476
+ align-items: center;
1477
+ gap: ${tokens.spacing.xs};
1478
+ padding: ${tokens.spacing.xs} ${tokens.spacing.md};
1479
+ background: ${tokens.colors.accent};
1480
+ color: #fff;
1481
+ font-size: ${tokens.typography.fontSize.xs};
1482
+ font-weight: ${tokens.typography.fontWeight.medium};
1483
+ border-radius: ${tokens.borderRadius.full};
1484
+ cursor: pointer;
1485
+ transition: opacity ${tokens.transitions.fast};
1486
+
1487
+ &:hover {
1488
+ opacity: 0.92;
1489
+ }
1490
+
1491
+ &:focus-visible {
1492
+ outline: 2px solid ${tokens.colors.border.focus};
1493
+ outline-offset: 2px;
1494
+ }
1495
+ `;
1496
+ var SecondaryPillButton = styled2__default.default.button`
1497
+ all: unset;
1498
+ display: inline-flex;
1499
+ align-items: center;
1500
+ gap: ${tokens.spacing.xs};
1501
+ padding: ${tokens.spacing.xs} ${tokens.spacing.md};
1502
+ background: transparent;
1503
+ color: ${tokens.colors.text.secondary};
1504
+ font-size: ${tokens.typography.fontSize.xs};
1505
+ font-weight: ${tokens.typography.fontWeight.medium};
172
1506
  border: 1px solid ${tokens.colors.border.default};
1507
+ border-radius: ${tokens.borderRadius.full};
173
1508
  cursor: pointer;
174
- text-align: left;
1509
+ transition: background ${tokens.transitions.fast};
1510
+
1511
+ &:hover {
1512
+ background: ${tokens.colors.surface.overlay};
1513
+ }
1514
+
1515
+ &:focus-visible {
1516
+ outline: 2px solid ${tokens.colors.border.focus};
1517
+ outline-offset: 2px;
1518
+ }
1519
+ `;
1520
+ var DemoBanner = styled2__default.default.button`
1521
+ all: unset;
1522
+ display: flex;
1523
+ align-items: center;
1524
+ gap: ${tokens.spacing.md};
1525
+ padding: ${tokens.spacing.sm} ${tokens.spacing.md};
1526
+ background: ${tokens.colors.primary}14;
1527
+ border: 1px solid ${tokens.colors.primary}33;
1528
+ border-radius: ${tokens.borderRadius.md};
1529
+ cursor: pointer;
1530
+ transition: background ${tokens.transitions.fast};
1531
+
1532
+ &:hover {
1533
+ background: ${tokens.colors.primary}1F;
1534
+ }
1535
+
1536
+ &:focus-visible {
1537
+ outline: 2px solid ${tokens.colors.border.focus};
1538
+ outline-offset: 2px;
1539
+ }
1540
+ `;
1541
+ var DemoPlayBubble = styled2__default.default.span`
1542
+ display: inline-flex;
1543
+ align-items: center;
1544
+ justify-content: center;
1545
+ width: 36px;
1546
+ height: 36px;
1547
+ border-radius: ${tokens.borderRadius.full};
1548
+ background: ${tokens.colors.primary};
1549
+ color: #fff;
1550
+ flex-shrink: 0;
1551
+ `;
1552
+ var DemoText = styled2__default.default.div`
1553
+ display: flex;
1554
+ flex-direction: column;
1555
+ gap: 2px;
1556
+ `;
1557
+ var DemoTitle = styled2__default.default.span`
1558
+ font-size: ${tokens.typography.fontSize.xs};
1559
+ font-weight: ${tokens.typography.fontWeight.semibold};
1560
+ color: ${tokens.colors.text.primary};
1561
+ `;
1562
+ var DemoSubtitle = styled2__default.default.span`
1563
+ font-size: 11px;
1564
+ color: ${tokens.colors.text.tertiary};
1565
+ `;
1566
+ var Actions = styled2__default.default.div`
1567
+ display: flex;
1568
+ justify-content: stretch;
175
1569
  width: 100%;
176
- font-family: ${tokens.typography.fontFamily.primary};
177
- transition: border-color ${tokens.transitions.fast}, background-color ${tokens.transitions.fast};
1570
+
1571
+ @media (min-width: ${tokens.breakpoints.tablet}px) {
1572
+ justify-content: flex-end;
1573
+ }
1574
+ `;
1575
+ var PrimaryActionButton = styled2__default.default.button`
1576
+ all: unset;
1577
+ display: inline-flex;
1578
+ align-items: center;
1579
+ justify-content: center;
1580
+ padding: ${tokens.spacing.sm} ${tokens.spacing.lg};
1581
+ background: ${tokens.colors.primary};
1582
+ color: #fff;
1583
+ font-size: ${tokens.typography.fontSize.xs};
1584
+ font-weight: ${tokens.typography.fontWeight.semibold};
1585
+ border-radius: ${tokens.borderRadius.md};
1586
+ cursor: pointer;
1587
+ width: 100%;
1588
+ text-align: center;
1589
+ transition: opacity ${tokens.transitions.fast},
1590
+ transform ${tokens.transitions.fast};
178
1591
 
179
1592
  &:hover:not(:disabled) {
180
- border-color: ${tokens.colors.border.hover};
181
- background: ${tokens.colors.background.light};
1593
+ opacity: 0.92;
182
1594
  }
183
1595
 
184
1596
  &:active:not(:disabled) {
185
- background: ${tokens.colors.surface.overlayActive};
1597
+ transform: translateY(1px);
186
1598
  }
187
1599
 
188
1600
  &:focus-visible {
@@ -191,103 +1603,109 @@ var Card = styled2__default.default.button`
191
1603
  }
192
1604
 
193
1605
  &:disabled {
1606
+ opacity: 0.55;
194
1607
  cursor: not-allowed;
195
1608
  }
1609
+
1610
+ @media (min-width: ${tokens.breakpoints.tablet}px) {
1611
+ width: auto;
1612
+ min-width: 160px;
1613
+ }
196
1614
  `;
197
- var WorkflowName = styled2__default.default.h3`
198
- margin: 0;
199
- font-size: ${tokens.typography.fontSize.base};
200
- font-weight: ${tokens.typography.fontWeight.semibold};
201
- color: ${tokens.colors.text.primary};
202
- line-height: ${tokens.typography.lineHeight.tight};
203
- overflow: hidden;
204
- text-overflow: ellipsis;
205
- white-space: nowrap;
206
- min-width: 0;
207
- `;
208
- var Description = styled2__default.default.p`
1615
+ var UnavailableNote = styled2__default.default.p`
209
1616
  margin: 0;
210
- font-size: ${tokens.typography.fontSize.sm};
1617
+ font-size: ${tokens.typography.fontSize.xs};
211
1618
  color: ${tokens.colors.text.tertiary};
212
- line-height: ${tokens.typography.lineHeight.normal};
213
- overflow: hidden;
214
- display: -webkit-box;
215
- -webkit-line-clamp: 2;
216
- -webkit-box-orient: vertical;
217
- word-break: break-word;
218
- min-width: 0;
219
1619
  `;
220
- var CardFooter = styled2__default.default.div`
1620
+ var ExpandedFooterActions = styled2__default.default.div`
221
1621
  display: flex;
222
1622
  flex-wrap: wrap;
223
1623
  align-items: center;
1624
+ justify-content: space-between;
224
1625
  gap: ${tokens.spacing.sm};
225
- padding-top: ${tokens.spacing.sm};
1626
+ padding-top: ${tokens.spacing.xs};
226
1627
  border-top: 1px solid ${tokens.colors.border.subtle};
227
- width: 100%;
228
1628
  `;
229
- var IntegrationList = styled2__default.default.div`
230
- display: flex;
1629
+ var VoteBlock = styled2__default.default.div`
1630
+ display: inline-flex;
231
1631
  align-items: center;
232
- gap: ${tokens.spacing.xs};
233
- flex-shrink: 0;
1632
+ gap: ${tokens.spacing.sm};
234
1633
  `;
235
- var IntegrationIconWrapper = styled2__default.default.span`
236
- display: flex;
237
- align-items: center;
238
- justify-content: center;
239
- width: 24px;
240
- height: 24px;
241
- border-radius: ${tokens.borderRadius.sm};
242
- background: ${tokens.colors.background.light};
243
- opacity: ${({ $connected, $optional }) => $connected ? 1 : $optional ? 0.3 : 0.4};
244
- position: relative;
245
- flex-shrink: 0;
246
-
247
- ${({ $connected, $optional }) => !$connected && `
248
- &::after {
249
- content: '';
250
- position: absolute;
251
- inset: 0;
252
- border: 1px dashed ${$optional ? tokens.colors.border.default : tokens.colors.warning};
253
- border-radius: ${tokens.borderRadius.sm};
254
- }
255
- `}
1634
+ var VoteBlockLabel = styled2__default.default.span`
1635
+ font-size: 11px;
1636
+ font-weight: ${tokens.typography.fontWeight.medium};
1637
+ color: ${tokens.colors.text.tertiary};
256
1638
  `;
257
- var IntegrationIcon = styled2__default.default.img`
258
- width: 16px;
259
- height: 16px;
260
- object-fit: contain;
1639
+ var VoteBlockButtons = styled2__default.default.div`
1640
+ display: inline-flex;
1641
+ gap: ${tokens.spacing.xs};
261
1642
  `;
262
- var Indicators = styled2__default.default.div`
263
- display: flex;
1643
+ var VoteBlockButton = styled2__default.default.button`
1644
+ all: unset;
1645
+ display: inline-flex;
264
1646
  align-items: center;
265
- flex-wrap: wrap;
266
1647
  gap: ${tokens.spacing.xs};
267
- margin-left: auto;
268
- min-width: 0;
1648
+ padding: ${tokens.spacing.xs} ${tokens.spacing.sm};
1649
+ border-radius: ${tokens.borderRadius.full};
1650
+ font-size: 11px;
1651
+ font-weight: ${tokens.typography.fontWeight.medium};
1652
+ cursor: pointer;
1653
+ color: ${(p) => p.$active ? p.$direction === "up" ? tokens.colors.primary : tokens.colors.error : tokens.colors.text.secondary};
1654
+ background: ${(p) => p.$active ? p.$direction === "up" ? `${tokens.colors.primary}26` : `${tokens.colors.error}26` : tokens.colors.surface.overlay};
1655
+ border: 1px solid
1656
+ ${(p) => p.$active ? p.$direction === "up" ? `${tokens.colors.primary}66` : `${tokens.colors.error}66` : tokens.colors.border.subtle};
1657
+ transition: background ${tokens.transitions.fast}, color ${tokens.transitions.fast},
1658
+ border-color ${tokens.transitions.fast};
1659
+
1660
+ &:hover {
1661
+ color: ${(p) => p.$direction === "up" ? tokens.colors.primary : tokens.colors.error};
1662
+ background: ${(p) => p.$direction === "up" ? `${tokens.colors.primary}1F` : `${tokens.colors.error}1F`};
1663
+ }
1664
+
1665
+ &:focus-visible {
1666
+ outline: 2px solid ${tokens.colors.border.focus};
1667
+ outline-offset: 2px;
1668
+ }
269
1669
  `;
270
- var IndicatorPill = styled2__default.default.span`
1670
+ var SupportButton = styled2__default.default.button`
1671
+ all: unset;
271
1672
  display: inline-flex;
272
1673
  align-items: center;
273
1674
  gap: ${tokens.spacing.xs};
274
1675
  padding: ${tokens.spacing.xs} ${tokens.spacing.sm};
275
1676
  border-radius: ${tokens.borderRadius.full};
276
- background: ${({ $variant }) => $variant === "warning" ? `${tokens.colors.warning}15` : `${tokens.colors.info}15`};
277
- border: 1px solid ${({ $variant }) => $variant === "warning" ? `${tokens.colors.warning}30` : `${tokens.colors.info}30`};
1677
+ font-size: 11px;
1678
+ font-weight: ${tokens.typography.fontWeight.medium};
1679
+ color: ${tokens.colors.text.secondary};
1680
+ cursor: pointer;
1681
+ transition: color ${tokens.transitions.fast},
1682
+ background ${tokens.transitions.fast};
1683
+
1684
+ &:hover {
1685
+ color: ${tokens.colors.text.primary};
1686
+ background: ${tokens.colors.surface.overlay};
1687
+ }
1688
+
1689
+ &:focus-visible {
1690
+ outline: 2px solid ${tokens.colors.border.focus};
1691
+ outline-offset: 2px;
1692
+ }
278
1693
  `;
279
- var IndicatorDot = styled2__default.default.span`
280
- width: 6px;
281
- height: 6px;
282
- border-radius: ${tokens.borderRadius.full};
283
- background: ${({ $variant }) => $variant === "warning" ? tokens.colors.warning : tokens.colors.info};
284
- flex-shrink: 0;
1694
+ var SourceFooter = styled2__default.default.div`
1695
+ margin-top: ${tokens.spacing.xs};
1696
+ font-size: 11px;
1697
+ color: ${tokens.colors.text.tertiary};
285
1698
  `;
286
- var IndicatorText = styled2__default.default.span`
287
- font-size: ${tokens.typography.fontSize.xs};
288
- font-weight: ${tokens.typography.fontWeight.medium};
1699
+ var SourceLink = styled2__default.default.a`
289
1700
  color: ${tokens.colors.text.secondary};
290
- white-space: nowrap;
1701
+ text-decoration: underline;
1702
+ text-decoration-color: ${tokens.colors.border.default};
1703
+ text-underline-offset: 2px;
1704
+
1705
+ &:hover {
1706
+ color: ${tokens.colors.text.primary};
1707
+ text-decoration-color: ${tokens.colors.border.hover};
1708
+ }
291
1709
  `;
292
1710
  var severityColors = {
293
1711
  error: tokens.colors.error,
@@ -412,7 +1830,7 @@ var StackTrace = styled2__default.default.pre`
412
1830
  word-break: break-word;
413
1831
  overflow-x: auto;
414
1832
  `;
415
- var Actions = styled2__default.default.div`
1833
+ var Actions2 = styled2__default.default.div`
416
1834
  display: flex;
417
1835
  gap: ${tokens.spacing.sm};
418
1836
  margin-top: ${tokens.spacing.md};
@@ -511,7 +1929,7 @@ var InfoIcon = () => /* @__PURE__ */ jsxRuntime.jsx(
511
1929
  }
512
1930
  );
513
1931
  var CloseIcon = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) });
514
- var ChevronIcon = () => /* @__PURE__ */ jsxRuntime.jsx(
1932
+ var ChevronIcon2 = () => /* @__PURE__ */ jsxRuntime.jsx(
515
1933
  "svg",
516
1934
  {
517
1935
  xmlns: "http://www.w3.org/2000/svg",
@@ -582,14 +2000,14 @@ var WorkflowErrorAlert = ({
582
2000
  onToggle: (e) => setDetailsOpen(e.target.open),
583
2001
  children: [
584
2002
  /* @__PURE__ */ jsxRuntime.jsxs("summary", { children: [
585
- /* @__PURE__ */ jsxRuntime.jsx(DetailsIcon, { open: detailsOpen, children: /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon, {}) }),
2003
+ /* @__PURE__ */ jsxRuntime.jsx(DetailsIcon, { open: detailsOpen, children: /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon2, {}) }),
586
2004
  "Show Details"
587
2005
  ] }),
588
2006
  /* @__PURE__ */ jsxRuntime.jsx(StackTrace, { children: stackTrace || (typeof error === "object" ? error.stack : "") })
589
2007
  ]
590
2008
  }
591
2009
  ),
592
- (retryable || onDismiss) && /* @__PURE__ */ jsxRuntime.jsxs(Actions, { children: [
2010
+ (retryable || onDismiss) && /* @__PURE__ */ jsxRuntime.jsxs(Actions2, { children: [
593
2011
  retryable && onRetry && /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "primary", onClick: onRetry, children: "Retry" }),
594
2012
  onDismiss && /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "secondary", onClick: handleDismiss, children: "Dismiss" })
595
2013
  ] })
@@ -898,7 +2316,7 @@ var Title2 = styled2__default.default.div`
898
2316
  align-items: center;
899
2317
  gap: ${tokens.spacing.sm};
900
2318
  `;
901
- var Actions2 = styled2__default.default.div`
2319
+ var Actions3 = styled2__default.default.div`
902
2320
  display: flex;
903
2321
  gap: ${tokens.spacing.sm};
904
2322
  `;
@@ -1018,7 +2436,7 @@ var EmptyState = styled2__default.default.div`
1018
2436
  `;
1019
2437
  var DownloadIcon = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z" }) });
1020
2438
  var CopyIcon = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z" }) });
1021
- var ChevronIcon2 = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z" }) });
2439
+ var ChevronIcon3 = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z" }) });
1022
2440
  var WorkflowResultPanel = ({
1023
2441
  outputData,
1024
2442
  variant = "json",
@@ -1079,9 +2497,9 @@ var WorkflowResultPanel = ({
1079
2497
  /* @__PURE__ */ jsxRuntime.jsxs(Header2, { collapsible, onClick: handleToggle, children: [
1080
2498
  /* @__PURE__ */ jsxRuntime.jsxs(Title2, { children: [
1081
2499
  title,
1082
- collapsible && /* @__PURE__ */ jsxRuntime.jsx(CollapseIcon, { expanded, children: /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon2, {}) })
2500
+ collapsible && /* @__PURE__ */ jsxRuntime.jsx(CollapseIcon, { expanded, children: /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon3, {}) })
1083
2501
  ] }),
1084
- /* @__PURE__ */ jsxRuntime.jsxs(Actions2, { onClick: (e) => e.stopPropagation(), children: [
2502
+ /* @__PURE__ */ jsxRuntime.jsxs(Actions3, { onClick: (e) => e.stopPropagation(), children: [
1085
2503
  onCopy && /* @__PURE__ */ jsxRuntime.jsx(IconButton, { onClick: onCopy, title: "Copy to clipboard", "aria-label": "Copy to clipboard", children: /* @__PURE__ */ jsxRuntime.jsx(CopyIcon, {}) }),
1086
2504
  onDownload && /* @__PURE__ */ jsxRuntime.jsx(IconButton, { onClick: onDownload, title: "Download", "aria-label": "Download results", children: /* @__PURE__ */ jsxRuntime.jsx(DownloadIcon, {}) })
1087
2505
  ] })
@@ -1100,7 +2518,7 @@ var spin = styled2.keyframes`
1100
2518
  transform: rotate(360deg);
1101
2519
  }
1102
2520
  `;
1103
- var pulse = styled2.keyframes`
2521
+ var pulse2 = styled2.keyframes`
1104
2522
  0%, 100% {
1105
2523
  opacity: 1;
1106
2524
  }
@@ -1178,7 +2596,7 @@ var IconContainer2 = styled2__default.default.div`
1178
2596
  animation: ${(props) => {
1179
2597
  if (props.$animated) {
1180
2598
  if (props.$status === "running") return spin;
1181
- if (props.$status === "pending") return pulse;
2599
+ if (props.$status === "pending") return pulse2;
1182
2600
  }
1183
2601
  return "none";
1184
2602
  }}
@@ -1308,6 +2726,7 @@ var WorkflowStatusBadge = ({
1308
2726
  WorkflowStatusBadge.displayName = "WorkflowStatusBadge";
1309
2727
 
1310
2728
  exports.WorkflowCard = WorkflowCard;
2729
+ exports.WorkflowDiscoveryCard = WorkflowDiscoveryCard;
1311
2730
  exports.WorkflowErrorAlert = WorkflowErrorAlert;
1312
2731
  exports.WorkflowProgressBar = WorkflowProgressBar;
1313
2732
  exports.WorkflowResultPanel = WorkflowResultPanel;