@agentiffai/design 1.5.3 → 1.5.5

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