@cogentic-co/ds 0.5.3 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/animations/animation-ai-analysis.js +99 -4
  2. package/dist/animations/animation-ai-analysis.js.map +1 -1
  3. package/dist/animations/animation-audit-trail.js +194 -2
  4. package/dist/animations/animation-audit-trail.js.map +1 -1
  5. package/dist/animations/animation-compliance-reports.js +108 -3
  6. package/dist/animations/animation-compliance-reports.js.map +1 -1
  7. package/dist/animations/animation-custom-rules.js +107 -3
  8. package/dist/animations/animation-custom-rules.js.map +1 -1
  9. package/dist/animations/animation-jira-ticket.js +114 -3
  10. package/dist/animations/animation-jira-ticket.js.map +1 -1
  11. package/dist/animations/animation-jurisdiction-detection.js +122 -3
  12. package/dist/animations/animation-jurisdiction-detection.js.map +1 -1
  13. package/dist/animations/animation-multi-protocol.js +63 -2
  14. package/dist/animations/animation-multi-protocol.js.map +1 -1
  15. package/dist/animations/animation-pricing-preview.js +169 -3
  16. package/dist/animations/animation-pricing-preview.js.map +1 -1
  17. package/dist/animations/animation-realtime-updates.js +140 -4
  18. package/dist/animations/animation-realtime-updates.js.map +1 -1
  19. package/dist/animations/animation-rest-api.js +121 -2
  20. package/dist/animations/animation-rest-api.js.map +1 -1
  21. package/dist/animations/animation-risk-scoring.js +158 -4
  22. package/dist/animations/animation-risk-scoring.js.map +1 -1
  23. package/dist/animations/animation-sandbox.js +107 -2
  24. package/dist/animations/animation-sandbox.js.map +1 -1
  25. package/dist/animations/animation-scheduled-reports.js +107 -3
  26. package/dist/animations/animation-scheduled-reports.js.map +1 -1
  27. package/dist/animations/animation-secure-messaging.js +99 -3
  28. package/dist/animations/animation-secure-messaging.js.map +1 -1
  29. package/dist/animations/animation-slack-notification.js +90 -3
  30. package/dist/animations/animation-slack-notification.js.map +1 -1
  31. package/dist/animations/animation-sop-mapping.js +158 -2
  32. package/dist/animations/animation-sop-mapping.js.map +1 -1
  33. package/dist/animations/animation-team-routing.js +118 -4
  34. package/dist/animations/animation-team-routing.js.map +1 -1
  35. package/dist/animations/animation-teams-notification.js +89 -3
  36. package/dist/animations/animation-teams-notification.js.map +1 -1
  37. package/dist/animations/animation-vasp-identification.js +142 -3
  38. package/dist/animations/animation-vasp-identification.js.map +1 -1
  39. package/dist/animations/animation-webhooks.js +105 -3
  40. package/dist/animations/animation-webhooks.js.map +1 -1
  41. package/dist/blocks/auth-form.js +0 -1
  42. package/dist/blocks/feature-section.js +0 -1
  43. package/dist/blocks/hero-section.js +0 -1
  44. package/dist/blocks/pricing-table.js +0 -1
  45. package/dist/blocks/stat-card.js +0 -1
  46. package/dist/chart-DkwdRX-i.d.ts +50 -0
  47. package/dist/charts.d.ts +73 -3
  48. package/dist/charts.js +287 -2
  49. package/dist/charts.js.map +1 -1
  50. package/dist/chunk-6RWCZUAD.js +0 -1
  51. package/dist/chunk-GJAWCIGE.js +237 -0
  52. package/dist/chunk-GJAWCIGE.js.map +1 -0
  53. package/dist/chunk-GZNLQE3I.js +0 -1
  54. package/dist/chunk-TAPJEVUA.js +0 -1
  55. package/dist/index.d.ts +34 -52
  56. package/dist/index.js +109 -168
  57. package/dist/index.js.map +1 -1
  58. package/package.json +6 -3
  59. package/dist/chunk-4YD3YS4B.js +0 -110
  60. package/dist/chunk-4YD3YS4B.js.map +0 -1
  61. package/dist/chunk-5JLZ42JT.js +0 -125
  62. package/dist/chunk-5JLZ42JT.js.map +0 -1
  63. package/dist/chunk-5OOO6TRA.js +0 -111
  64. package/dist/chunk-5OOO6TRA.js.map +0 -1
  65. package/dist/chunk-65Z2VEKG.js +0 -161
  66. package/dist/chunk-65Z2VEKG.js.map +0 -1
  67. package/dist/chunk-BTFYV3TI.js +0 -102
  68. package/dist/chunk-BTFYV3TI.js.map +0 -1
  69. package/dist/chunk-BTZB4JRC.js +0 -117
  70. package/dist/chunk-BTZB4JRC.js.map +0 -1
  71. package/dist/chunk-BZSA47MS.js +0 -121
  72. package/dist/chunk-BZSA47MS.js.map +0 -1
  73. package/dist/chunk-EFLWU2JP.js +0 -145
  74. package/dist/chunk-EFLWU2JP.js.map +0 -1
  75. package/dist/chunk-F7REPQOA.js +0 -93
  76. package/dist/chunk-F7REPQOA.js.map +0 -1
  77. package/dist/chunk-FKPK3CB7.js +0 -143
  78. package/dist/chunk-FKPK3CB7.js.map +0 -1
  79. package/dist/chunk-H7VUIMEL.js +0 -172
  80. package/dist/chunk-H7VUIMEL.js.map +0 -1
  81. package/dist/chunk-HTYR73ON.js +0 -161
  82. package/dist/chunk-HTYR73ON.js.map +0 -1
  83. package/dist/chunk-I26ZXVSY.js +0 -124
  84. package/dist/chunk-I26ZXVSY.js.map +0 -1
  85. package/dist/chunk-IKATDPHG.js +0 -92
  86. package/dist/chunk-IKATDPHG.js.map +0 -1
  87. package/dist/chunk-KUOF3XRZ.js +0 -108
  88. package/dist/chunk-KUOF3XRZ.js.map +0 -1
  89. package/dist/chunk-N7PBUY7G.js +0 -110
  90. package/dist/chunk-N7PBUY7G.js.map +0 -1
  91. package/dist/chunk-NAPDFVBI.js +0 -102
  92. package/dist/chunk-NAPDFVBI.js.map +0 -1
  93. package/dist/chunk-RTK7R4KZ.js +0 -66
  94. package/dist/chunk-RTK7R4KZ.js.map +0 -1
  95. package/dist/chunk-RZZTDJHG.js +0 -110
  96. package/dist/chunk-RZZTDJHG.js.map +0 -1
  97. package/dist/chunk-SNOJLZP4.js +0 -197
  98. package/dist/chunk-SNOJLZP4.js.map +0 -1
  99. package/dist/chunk-U4EPKN7G.js +0 -518
  100. package/dist/chunk-U4EPKN7G.js.map +0 -1
  101. package/dist/index-CcPuHWa-.d.ts +0 -118
@@ -1,8 +1,144 @@
1
1
  "use client";
2
- export { AnimationRealtimeUpdates as default } from '../chunk-FKPK3CB7.js';
3
- import '../chunk-TAPJEVUA.js';
4
- import '../chunk-6RWCZUAD.js';
2
+ import { EASE_OUT } from '../chunk-TAPJEVUA.js';
3
+ import { useCycleIndex } from '../chunk-6RWCZUAD.js';
5
4
  import '../chunk-RXV2XUDZ.js';
6
- import '../chunk-GZNLQE3I.js';
5
+ import { __spreadValues, cn } from '../chunk-GZNLQE3I.js';
6
+ import { Activity, ShieldCheck, AlertTriangle } from 'lucide-react';
7
+ import { LazyMotion, domAnimation, m } from 'motion/react';
8
+ import { jsx, jsxs } from 'react/jsx-runtime';
9
+
10
+ var SCENARIOS = [
11
+ {
12
+ transfers: { value: "1,247", change: "12.3%", up: true },
13
+ compliant: { value: "1,238", change: "14.1%", up: true },
14
+ flagged: { value: "9", change: "8.2%", up: false },
15
+ bars: [30, 55, 70, 100, 45, 25, 60],
16
+ activeBar: 3
17
+ },
18
+ {
19
+ transfers: { value: "892", change: "6.7%", up: true },
20
+ compliant: { value: "874", change: "5.2%", up: true },
21
+ flagged: { value: "18", change: "22.4%", up: true },
22
+ bars: [45, 35, 60, 50, 80, 100, 40],
23
+ activeBar: 5
24
+ },
25
+ {
26
+ transfers: { value: "2,103", change: "18.9%", up: true },
27
+ compliant: { value: "2,091", change: "19.3%", up: true },
28
+ flagged: { value: "12", change: "4.1%", up: false },
29
+ bars: [60, 75, 50, 85, 65, 90, 100],
30
+ activeBar: 6
31
+ }
32
+ ];
33
+ var DAYS = ["MO", "TU", "WE", "TH", "FR", "SA", "SU"];
34
+ var CYCLE_MS = 4e3;
35
+ function AnimatedValue({ value }) {
36
+ return /* @__PURE__ */ jsx(
37
+ m.span,
38
+ {
39
+ initial: { opacity: 0, y: 6 },
40
+ animate: { opacity: 1, y: 0 },
41
+ transition: { duration: 0.35, ease: EASE_OUT },
42
+ children: value
43
+ },
44
+ value
45
+ );
46
+ }
47
+ function AnimationRealtimeUpdates({ className }) {
48
+ const [containerRef, index] = useCycleIndex(SCENARIOS.length, CYCLE_MS);
49
+ const scenario = SCENARIOS[index];
50
+ const metrics = [
51
+ __spreadValues({
52
+ icon: Activity,
53
+ label: "Transfers screened",
54
+ sub: "All protocols"
55
+ }, scenario.transfers),
56
+ __spreadValues({
57
+ icon: ShieldCheck,
58
+ label: "Compliant",
59
+ sub: "Auto-approved"
60
+ }, scenario.compliant),
61
+ __spreadValues({
62
+ icon: AlertTriangle,
63
+ label: "Flagged",
64
+ sub: "Manual review"
65
+ }, scenario.flagged)
66
+ ];
67
+ return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("flex flex-col p-5", className), children: [
68
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between", children: [
69
+ /* @__PURE__ */ jsxs("div", { children: [
70
+ /* @__PURE__ */ jsx("p", { className: "font-semibold text-[15px] text-foreground", children: "Compliance Overview" }),
71
+ /* @__PURE__ */ jsx("p", { className: "text-[12px] text-gray-400", children: "Weekly screening summary" })
72
+ ] }),
73
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-0.5", children: [
74
+ /* @__PURE__ */ jsx("span", { className: "size-1 rounded-full bg-gray-300" }),
75
+ /* @__PURE__ */ jsx("span", { className: "size-1 rounded-full bg-gray-300" }),
76
+ /* @__PURE__ */ jsx("span", { className: "size-1 rounded-full bg-gray-300" })
77
+ ] })
78
+ ] }),
79
+ /* @__PURE__ */ jsx("div", { className: "mt-4 flex flex-col gap-3", children: metrics.map((metric) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
80
+ /* @__PURE__ */ jsx("div", { className: "flex size-9 items-center justify-center rounded-lg bg-gray-100", children: /* @__PURE__ */ jsx(metric.icon, { className: "size-4 text-foreground", strokeWidth: 1.5 }) }),
81
+ /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
82
+ /* @__PURE__ */ jsx("p", { className: "font-medium text-[13px] text-foreground", children: metric.label }),
83
+ /* @__PURE__ */ jsx("p", { className: "text-[10px] text-gray-400", children: metric.sub })
84
+ ] }),
85
+ /* @__PURE__ */ jsx("div", { className: "text-right", children: /* @__PURE__ */ jsx("p", { className: "font-mono font-semibold text-[14px] text-foreground", children: /* @__PURE__ */ jsx(AnimatedValue, { value: metric.value }) }) }),
86
+ /* @__PURE__ */ jsxs(
87
+ "div",
88
+ {
89
+ className: cn(
90
+ "flex items-center gap-0.5 font-medium text-[11px]",
91
+ metric.up ? "text-foreground" : "text-emerald-600"
92
+ ),
93
+ children: [
94
+ /* @__PURE__ */ jsx(
95
+ "svg",
96
+ {
97
+ width: "10",
98
+ height: "10",
99
+ viewBox: "0 0 10 10",
100
+ className: cn(!metric.up && "rotate-180"),
101
+ children: /* @__PURE__ */ jsx("path", { d: "M5 2L8.5 7H1.5L5 2Z", fill: "currentColor" })
102
+ }
103
+ ),
104
+ /* @__PURE__ */ jsx(AnimatedValue, { value: metric.change })
105
+ ]
106
+ }
107
+ )
108
+ ] }, metric.label)) }),
109
+ /* @__PURE__ */ jsx("div", { className: "mt-4 flex flex-1 items-end gap-2", children: scenario.bars.map((height, i) => /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col items-center gap-1.5", children: [
110
+ /* @__PURE__ */ jsx("div", { className: "relative w-full", style: { height: 80 }, children: /* @__PURE__ */ jsx(
111
+ m.div,
112
+ {
113
+ className: cn(
114
+ "absolute inset-x-0 bottom-0 rounded-t-md",
115
+ i === scenario.activeBar ? "bg-tagline" : "bg-foreground"
116
+ ),
117
+ style: { transformOrigin: "bottom", height: "100%" },
118
+ initial: { scaleY: 0 },
119
+ animate: { scaleY: height / 100 },
120
+ transition: {
121
+ duration: 0.6,
122
+ delay: i * 0.05,
123
+ ease: EASE_OUT
124
+ }
125
+ },
126
+ `${index}-${i}`
127
+ ) }),
128
+ /* @__PURE__ */ jsx(
129
+ "span",
130
+ {
131
+ className: cn(
132
+ "font-medium text-[10px]",
133
+ i === scenario.activeBar ? "text-gray-900" : "text-gray-400"
134
+ ),
135
+ children: DAYS[i]
136
+ }
137
+ )
138
+ ] }, i)) })
139
+ ] }) });
140
+ }
141
+
142
+ export { AnimationRealtimeUpdates as default };
7
143
  //# sourceMappingURL=animation-realtime-updates.js.map
8
144
  //# sourceMappingURL=animation-realtime-updates.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"animation-realtime-updates.js"}
1
+ {"version":3,"sources":["../../src/animations/animation-realtime-updates.tsx"],"names":[],"mappings":"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","file":"animation-realtime-updates.js","sourcesContent":["\"use client\"\n\nimport { Activity, AlertTriangle, ShieldCheck } from \"lucide-react\"\nimport { domAnimation, LazyMotion, m } from \"motion/react\"\n\nimport { useCycleIndex } from \"../hooks/use-cycle-index\"\n\nimport { EASE_OUT } from \"../lib/animation\"\nimport { cn } from \"../lib/utils\"\n\ntype Scenario = {\n transfers: { value: string; change: string; up: boolean }\n compliant: { value: string; change: string; up: boolean }\n flagged: { value: string; change: string; up: boolean }\n bars: number[]\n activeBar: number\n}\n\nconst SCENARIOS: Scenario[] = [\n {\n transfers: { value: \"1,247\", change: \"12.3%\", up: true },\n compliant: { value: \"1,238\", change: \"14.1%\", up: true },\n flagged: { value: \"9\", change: \"8.2%\", up: false },\n bars: [30, 55, 70, 100, 45, 25, 60],\n activeBar: 3,\n },\n {\n transfers: { value: \"892\", change: \"6.7%\", up: true },\n compliant: { value: \"874\", change: \"5.2%\", up: true },\n flagged: { value: \"18\", change: \"22.4%\", up: true },\n bars: [45, 35, 60, 50, 80, 100, 40],\n activeBar: 5,\n },\n {\n transfers: { value: \"2,103\", change: \"18.9%\", up: true },\n compliant: { value: \"2,091\", change: \"19.3%\", up: true },\n flagged: { value: \"12\", change: \"4.1%\", up: false },\n bars: [60, 75, 50, 85, 65, 90, 100],\n activeBar: 6,\n },\n]\n\nconst DAYS = [\"MO\", \"TU\", \"WE\", \"TH\", \"FR\", \"SA\", \"SU\"]\n\nconst CYCLE_MS = 4000\n\nfunction AnimatedValue({ value }: { value: string }) {\n return (\n <m.span\n key={value}\n initial={{ opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.35, ease: EASE_OUT }}\n >\n {value}\n </m.span>\n )\n}\n\nexport default function AnimationRealtimeUpdates({ className }: { className?: string }) {\n const [containerRef, index] = useCycleIndex(SCENARIOS.length, CYCLE_MS)\n const scenario = SCENARIOS[index]\n\n const metrics = [\n {\n icon: Activity,\n label: \"Transfers screened\",\n sub: \"All protocols\",\n ...scenario.transfers,\n },\n {\n icon: ShieldCheck,\n label: \"Compliant\",\n sub: \"Auto-approved\",\n ...scenario.compliant,\n },\n {\n icon: AlertTriangle,\n label: \"Flagged\",\n sub: \"Manual review\",\n ...scenario.flagged,\n },\n ]\n\n return (\n <LazyMotion features={domAnimation}>\n <div ref={containerRef} className={cn(\"flex flex-col p-5\", className)}>\n {/* Dashboard header */}\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"font-semibold text-[15px] text-foreground\">Compliance Overview</p>\n <p className=\"text-[12px] text-gray-400\">Weekly screening summary</p>\n </div>\n <div className=\"flex gap-0.5\">\n <span className=\"size-1 rounded-full bg-gray-300\" />\n <span className=\"size-1 rounded-full bg-gray-300\" />\n <span className=\"size-1 rounded-full bg-gray-300\" />\n </div>\n </div>\n\n {/* Metric rows */}\n <div className=\"mt-4 flex flex-col gap-3\">\n {metrics.map((metric) => (\n <div key={metric.label} className=\"flex items-center gap-3\">\n <div className=\"flex size-9 items-center justify-center rounded-lg bg-gray-100\">\n <metric.icon className=\"size-4 text-foreground\" strokeWidth={1.5} />\n </div>\n <div className=\"flex-1\">\n <p className=\"font-medium text-[13px] text-foreground\">{metric.label}</p>\n <p className=\"text-[10px] text-gray-400\">{metric.sub}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-mono font-semibold text-[14px] text-foreground\">\n <AnimatedValue value={metric.value} />\n </p>\n </div>\n <div\n className={cn(\n \"flex items-center gap-0.5 font-medium text-[11px]\",\n metric.up ? \"text-foreground\" : \"text-emerald-600\",\n )}\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n className={cn(!metric.up && \"rotate-180\")}\n >\n <path d=\"M5 2L8.5 7H1.5L5 2Z\" fill=\"currentColor\" />\n </svg>\n <AnimatedValue value={metric.change} />\n </div>\n </div>\n ))}\n </div>\n\n {/* Bar chart */}\n <div className=\"mt-4 flex flex-1 items-end gap-2\">\n {scenario.bars.map((height, i) => (\n <div key={i} className=\"flex flex-1 flex-col items-center gap-1.5\">\n <div className=\"relative w-full\" style={{ height: 80 }}>\n <m.div\n className={cn(\n \"absolute inset-x-0 bottom-0 rounded-t-md\",\n i === scenario.activeBar ? \"bg-tagline\" : \"bg-foreground\",\n )}\n style={{ transformOrigin: \"bottom\", height: \"100%\" }}\n initial={{ scaleY: 0 }}\n animate={{ scaleY: height / 100 }}\n transition={{\n duration: 0.6,\n delay: i * 0.05,\n ease: EASE_OUT,\n }}\n key={`${index}-${i}`}\n />\n </div>\n <span\n className={cn(\n \"font-medium text-[10px]\",\n i === scenario.activeBar ? \"text-gray-900\" : \"text-gray-400\",\n )}\n >\n {DAYS[i]}\n </span>\n </div>\n ))}\n </div>\n </div>\n </LazyMotion>\n )\n}\n"]}
@@ -1,5 +1,124 @@
1
1
  "use client";
2
- export { AnimationRestApi as default } from '../chunk-I26ZXVSY.js';
3
- import '../chunk-GZNLQE3I.js';
2
+ import { cn } from '../chunk-GZNLQE3I.js';
3
+ import { LazyMotion, domAnimation, m } from 'motion/react';
4
+ import { useState, useRef, useCallback, useEffect } from 'react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var REQUEST = [
8
+ { text: "POST /v1/transfers/screen", colour: "text-emerald-400" },
9
+ { text: "Authorization: Bearer sk_live_\u2022\u2022\u2022", colour: "text-gray-500" },
10
+ { text: "Content-Type: application/json", colour: "text-gray-500" },
11
+ { text: "" },
12
+ { text: "{", colour: "text-gray-300" },
13
+ { text: '"transfer_id": "TXN-0847",', colour: "text-[#00D4FF]", indent: 1 },
14
+ { text: '"originator": {', colour: "text-gray-300", indent: 1 },
15
+ { text: '"vasp_id": "vasp_au_001",', colour: "text-amber-400", indent: 2 },
16
+ { text: '"jurisdiction": "AU"', colour: "text-amber-400", indent: 2 },
17
+ { text: "},", colour: "text-gray-300", indent: 1 },
18
+ { text: '"beneficiary": {', colour: "text-gray-300", indent: 1 },
19
+ { text: '"vasp_id": "vasp_sg_042",', colour: "text-amber-400", indent: 2 },
20
+ { text: '"jurisdiction": "SG"', colour: "text-amber-400", indent: 2 },
21
+ { text: "},", colour: "text-gray-300", indent: 1 },
22
+ { text: '"amount": "45000.00",', colour: "text-violet-400", indent: 1 },
23
+ { text: '"currency": "USD"', colour: "text-violet-400", indent: 1 },
24
+ { text: "}", colour: "text-gray-300" }
25
+ ];
26
+ var RESPONSE = [
27
+ { text: "200 OK", colour: "text-emerald-400" },
28
+ { text: "" },
29
+ { text: "{", colour: "text-gray-300" },
30
+ { text: '"status": "compliant",', colour: "text-emerald-400", indent: 1 },
31
+ { text: '"risk_score": 18,', colour: "text-[#00D4FF]", indent: 1 },
32
+ { text: '"travel_rule": "verified",', colour: "text-emerald-400", indent: 1 },
33
+ { text: '"jurisdiction_pair": "AU\u2192SG",', colour: "text-amber-400", indent: 1 },
34
+ { text: '"report_ref": "CR-2024-0847"', colour: "text-violet-400", indent: 1 },
35
+ { text: "}", colour: "text-gray-300" }
36
+ ];
37
+ function AnimationRestApi({ className }) {
38
+ const [phase, setPhase] = useState("request");
39
+ const [visibleLines, setVisibleLines] = useState(0);
40
+ const scrollRef = useRef(null);
41
+ const lines = phase === "request" ? REQUEST : RESPONSE;
42
+ const reset = useCallback(() => {
43
+ setPhase("request");
44
+ setVisibleLines(0);
45
+ }, []);
46
+ useEffect(() => {
47
+ if (visibleLines < lines.length) {
48
+ const id = setTimeout(() => setVisibleLines((v) => v + 1), 80);
49
+ return () => clearTimeout(id);
50
+ } else if (phase === "request") {
51
+ const id = setTimeout(() => {
52
+ setPhase("response");
53
+ setVisibleLines(0);
54
+ }, 1200);
55
+ return () => clearTimeout(id);
56
+ } else {
57
+ const id = setTimeout(reset, 3e3);
58
+ return () => clearTimeout(id);
59
+ }
60
+ }, [visibleLines, lines.length, phase, reset]);
61
+ useEffect(() => {
62
+ const el = scrollRef.current;
63
+ if (!el) return;
64
+ requestAnimationFrame(() => {
65
+ el.scrollTop = el.scrollHeight;
66
+ });
67
+ }, []);
68
+ return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col bg-[#1a1a2e]", className), children: [
69
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-white/10 border-b px-4 py-2", children: [
70
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-1.5", children: [
71
+ /* @__PURE__ */ jsx("span", { className: "size-2.5 rounded-full bg-red-400/80" }),
72
+ /* @__PURE__ */ jsx("span", { className: "size-2.5 rounded-full bg-amber-400/80" }),
73
+ /* @__PURE__ */ jsx("span", { className: "size-2.5 rounded-full bg-emerald-400/80" })
74
+ ] }),
75
+ /* @__PURE__ */ jsx("span", { className: "ml-2 font-mono text-[10px] text-white/40", children: "cogentic-api" }),
76
+ /* @__PURE__ */ jsx(
77
+ m.span,
78
+ {
79
+ initial: { opacity: 0 },
80
+ animate: { opacity: 1 },
81
+ className: cn(
82
+ "ml-auto rounded-full px-2 py-0.5 font-bold text-[9px]",
83
+ phase === "request" ? "bg-amber-500/20 text-amber-300" : "bg-emerald-500/20 text-emerald-300"
84
+ ),
85
+ children: phase === "request" ? "REQUEST" : "RESPONSE"
86
+ },
87
+ phase
88
+ )
89
+ ] }),
90
+ /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "scrollbar-none flex-1 overflow-y-auto px-4 py-3", children: /* @__PURE__ */ jsxs("div", { className: "space-y-0.5", children: [
91
+ lines.slice(0, visibleLines).map((line, i) => {
92
+ var _a, _b;
93
+ return /* @__PURE__ */ jsxs(
94
+ m.div,
95
+ {
96
+ initial: { opacity: 0 },
97
+ animate: { opacity: 1 },
98
+ className: "flex",
99
+ children: [
100
+ /* @__PURE__ */ jsx("span", { className: "w-5 shrink-0 text-right font-mono text-[10px] text-white/20", children: i + 1 }),
101
+ /* @__PURE__ */ jsx(
102
+ "span",
103
+ {
104
+ className: cn("ml-3 font-mono text-[11px]", (_a = line.colour) != null ? _a : "text-white/60"),
105
+ style: { paddingLeft: ((_b = line.indent) != null ? _b : 0) * 16 },
106
+ children: line.text || "\xA0"
107
+ }
108
+ )
109
+ ]
110
+ },
111
+ `${phase}-${i}`
112
+ );
113
+ }),
114
+ visibleLines < lines.length && /* @__PURE__ */ jsxs("div", { className: "flex", children: [
115
+ /* @__PURE__ */ jsx("span", { className: "w-5" }),
116
+ /* @__PURE__ */ jsx("span", { className: "ml-3 animate-pulse font-mono text-[11px] text-white/30", children: "\u2588" })
117
+ ] })
118
+ ] }) })
119
+ ] }) });
120
+ }
121
+
122
+ export { AnimationRestApi as default };
4
123
  //# sourceMappingURL=animation-rest-api.js.map
5
124
  //# sourceMappingURL=animation-rest-api.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"animation-rest-api.js"}
1
+ {"version":3,"sources":["../../src/animations/animation-rest-api.tsx"],"names":[],"mappings":"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","file":"animation-rest-api.js","sourcesContent":["\"use client\"\n\nimport { domAnimation, LazyMotion, m } from \"motion/react\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\ntype CodeLine = {\n text: string\n colour?: string\n indent?: number\n}\n\nconst REQUEST: CodeLine[] = [\n { text: \"POST /v1/transfers/screen\", colour: \"text-emerald-400\" },\n { text: \"Authorization: Bearer sk_live_\\u2022\\u2022\\u2022\", colour: \"text-gray-500\" },\n { text: \"Content-Type: application/json\", colour: \"text-gray-500\" },\n { text: \"\" },\n { text: \"{\", colour: \"text-gray-300\" },\n { text: '\"transfer_id\": \"TXN-0847\",', colour: \"text-[#00D4FF]\", indent: 1 },\n { text: '\"originator\": {', colour: \"text-gray-300\", indent: 1 },\n { text: '\"vasp_id\": \"vasp_au_001\",', colour: \"text-amber-400\", indent: 2 },\n { text: '\"jurisdiction\": \"AU\"', colour: \"text-amber-400\", indent: 2 },\n { text: \"},\", colour: \"text-gray-300\", indent: 1 },\n { text: '\"beneficiary\": {', colour: \"text-gray-300\", indent: 1 },\n { text: '\"vasp_id\": \"vasp_sg_042\",', colour: \"text-amber-400\", indent: 2 },\n { text: '\"jurisdiction\": \"SG\"', colour: \"text-amber-400\", indent: 2 },\n { text: \"},\", colour: \"text-gray-300\", indent: 1 },\n { text: '\"amount\": \"45000.00\",', colour: \"text-violet-400\", indent: 1 },\n { text: '\"currency\": \"USD\"', colour: \"text-violet-400\", indent: 1 },\n { text: \"}\", colour: \"text-gray-300\" },\n]\n\nconst RESPONSE: CodeLine[] = [\n { text: \"200 OK\", colour: \"text-emerald-400\" },\n { text: \"\" },\n { text: \"{\", colour: \"text-gray-300\" },\n { text: '\"status\": \"compliant\",', colour: \"text-emerald-400\", indent: 1 },\n { text: '\"risk_score\": 18,', colour: \"text-[#00D4FF]\", indent: 1 },\n { text: '\"travel_rule\": \"verified\",', colour: \"text-emerald-400\", indent: 1 },\n { text: '\"jurisdiction_pair\": \"AU→SG\",', colour: \"text-amber-400\", indent: 1 },\n { text: '\"report_ref\": \"CR-2024-0847\"', colour: \"text-violet-400\", indent: 1 },\n { text: \"}\", colour: \"text-gray-300\" },\n]\n\nexport default function AnimationRestApi({ className }: { className?: string }) {\n const [phase, setPhase] = useState<\"request\" | \"response\">(\"request\")\n const [visibleLines, setVisibleLines] = useState(0)\n const scrollRef = useRef<HTMLDivElement>(null)\n const lines = phase === \"request\" ? REQUEST : RESPONSE\n\n const reset = useCallback(() => {\n setPhase(\"request\")\n setVisibleLines(0)\n }, [])\n\n useEffect(() => {\n if (visibleLines < lines.length) {\n const id = setTimeout(() => setVisibleLines((v) => v + 1), 80)\n return () => clearTimeout(id)\n } else if (phase === \"request\") {\n const id = setTimeout(() => {\n setPhase(\"response\")\n setVisibleLines(0)\n }, 1200)\n return () => clearTimeout(id)\n } else {\n const id = setTimeout(reset, 3000)\n return () => clearTimeout(id)\n }\n }, [visibleLines, lines.length, phase, reset])\n\n useEffect(() => {\n const el = scrollRef.current\n if (!el) return\n requestAnimationFrame(() => {\n el.scrollTop = el.scrollHeight\n })\n }, [])\n\n return (\n <LazyMotion features={domAnimation}>\n <div className={cn(\"flex flex-col bg-[#1a1a2e]\", className)}>\n {/* Tab bar */}\n <div className=\"flex items-center gap-3 border-white/10 border-b px-4 py-2\">\n <div className=\"flex gap-1.5\">\n <span className=\"size-2.5 rounded-full bg-red-400/80\" />\n <span className=\"size-2.5 rounded-full bg-amber-400/80\" />\n <span className=\"size-2.5 rounded-full bg-emerald-400/80\" />\n </div>\n <span className=\"ml-2 font-mono text-[10px] text-white/40\">cogentic-api</span>\n <m.span\n key={phase}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n className={cn(\n \"ml-auto rounded-full px-2 py-0.5 font-bold text-[9px]\",\n phase === \"request\"\n ? \"bg-amber-500/20 text-amber-300\"\n : \"bg-emerald-500/20 text-emerald-300\",\n )}\n >\n {phase === \"request\" ? \"REQUEST\" : \"RESPONSE\"}\n </m.span>\n </div>\n\n {/* Code */}\n <div ref={scrollRef} className=\"scrollbar-none flex-1 overflow-y-auto px-4 py-3\">\n <div className=\"space-y-0.5\">\n {lines.slice(0, visibleLines).map((line, i) => (\n <m.div\n key={`${phase}-${i}`}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n className=\"flex\"\n >\n <span className=\"w-5 shrink-0 text-right font-mono text-[10px] text-white/20\">\n {i + 1}\n </span>\n <span\n className={cn(\"ml-3 font-mono text-[11px]\", line.colour ?? \"text-white/60\")}\n style={{ paddingLeft: (line.indent ?? 0) * 16 }}\n >\n {line.text || \"\\u00A0\"}\n </span>\n </m.div>\n ))}\n {visibleLines < lines.length && (\n <div className=\"flex\">\n <span className=\"w-5\" />\n <span className=\"ml-3 animate-pulse font-mono text-[11px] text-white/30\">\n {\"\\u2588\"}\n </span>\n </div>\n )}\n </div>\n </div>\n </div>\n </LazyMotion>\n )\n}\n"]}
@@ -1,8 +1,162 @@
1
1
  "use client";
2
- export { AnimationRiskScoring as default } from '../chunk-HTYR73ON.js';
3
- import '../chunk-TAPJEVUA.js';
4
- import '../chunk-6RWCZUAD.js';
2
+ import { EASE_OUT } from '../chunk-TAPJEVUA.js';
3
+ import { useCycleIndex } from '../chunk-6RWCZUAD.js';
5
4
  import '../chunk-RXV2XUDZ.js';
6
- import '../chunk-GZNLQE3I.js';
5
+ import { cn } from '../chunk-GZNLQE3I.js';
6
+ import { ShieldCheck, ShieldAlert, AlertTriangle } from 'lucide-react';
7
+ import { LazyMotion, domAnimation, m } from 'motion/react';
8
+ import { useState, useEffect } from 'react';
9
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
10
+
11
+ var SCENARIOS = [
12
+ {
13
+ txn: "TXN-0847",
14
+ corridor: "AU \u2192 SG",
15
+ score: 18,
16
+ level: "Low",
17
+ colour: "text-emerald-600",
18
+ barColour: "bg-emerald-400",
19
+ icon: ShieldCheck,
20
+ checks: [
21
+ { label: "Sanctions", result: "Clear", ok: true },
22
+ { label: "PEP screening", result: "Clear", ok: true },
23
+ { label: "Travel Rule", result: "Verified", ok: true },
24
+ { label: "Threshold", result: "Below limit", ok: true }
25
+ ]
26
+ },
27
+ {
28
+ txn: "TXN-0846",
29
+ corridor: "HK \u2192 GB",
30
+ score: 72,
31
+ level: "High",
32
+ colour: "text-red-500",
33
+ barColour: "bg-red-400",
34
+ icon: ShieldAlert,
35
+ checks: [
36
+ { label: "Sanctions", result: "Clear", ok: true },
37
+ { label: "PEP screening", result: "1 match", ok: false },
38
+ { label: "Travel Rule", result: "Verified", ok: true },
39
+ { label: "Threshold", result: "Exceeded", ok: false }
40
+ ]
41
+ },
42
+ {
43
+ txn: "TXN-0845",
44
+ corridor: "AE \u2192 NL",
45
+ score: 41,
46
+ level: "Medium",
47
+ colour: "text-amber-500",
48
+ barColour: "bg-amber-400",
49
+ icon: AlertTriangle,
50
+ checks: [
51
+ { label: "Sanctions", result: "Clear", ok: true },
52
+ { label: "PEP screening", result: "Clear", ok: true },
53
+ { label: "Travel Rule", result: "Pending", ok: false },
54
+ { label: "Threshold", result: "Below limit", ok: true }
55
+ ]
56
+ }
57
+ ];
58
+ var CYCLE_MS = 3800;
59
+ function AnimatedNumber({ value, duration = 1e3 }) {
60
+ const [display, setDisplay] = useState(0);
61
+ useEffect(() => {
62
+ let start = null;
63
+ let raf;
64
+ function tick(ts) {
65
+ if (start === null) start = ts;
66
+ const progress = Math.min((ts - start) / duration, 1);
67
+ const eased = 1 - (1 - progress) ** 3;
68
+ setDisplay(Math.round(value * eased));
69
+ if (progress < 1) raf = requestAnimationFrame(tick);
70
+ }
71
+ raf = requestAnimationFrame(tick);
72
+ return () => cancelAnimationFrame(raf);
73
+ }, [value, duration]);
74
+ return /* @__PURE__ */ jsx(Fragment, { children: display });
75
+ }
76
+ function AnimationRiskScoring({ className }) {
77
+ const [containerRef, index] = useCycleIndex(SCENARIOS.length, CYCLE_MS);
78
+ const s = SCENARIOS[index];
79
+ const Icon = s.icon;
80
+ return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("flex flex-col p-5", className), children: [
81
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
82
+ /* @__PURE__ */ jsxs("div", { children: [
83
+ /* @__PURE__ */ jsx("p", { className: "font-semibold text-[15px] text-forground", children: "Risk Analysis" }),
84
+ /* @__PURE__ */ jsx("p", { className: "text-[12px] text-gray-400", children: "Real-time transfer scoring" })
85
+ ] }),
86
+ /* @__PURE__ */ jsxs(
87
+ m.div,
88
+ {
89
+ initial: { opacity: 0, scale: 0.9 },
90
+ animate: { opacity: 1, scale: 1 },
91
+ className: cn(
92
+ "flex items-center gap-1.5 rounded-full px-2.5 py-1",
93
+ s.level === "Low" ? "bg-emerald-50" : s.level === "Medium" ? "bg-amber-50" : "bg-red-50"
94
+ ),
95
+ children: [
96
+ /* @__PURE__ */ jsx(Icon, { className: cn("size-3.5", s.colour), strokeWidth: 2 }),
97
+ /* @__PURE__ */ jsx("span", { className: cn("font-semibold text-[11px]", s.colour), children: s.level })
98
+ ]
99
+ },
100
+ index
101
+ )
102
+ ] }),
103
+ /* @__PURE__ */ jsxs(
104
+ m.div,
105
+ {
106
+ initial: { opacity: 0, y: 6 },
107
+ animate: { opacity: 1, y: 0 },
108
+ transition: { duration: 0.3 },
109
+ className: "mt-4 flex items-center gap-3 rounded-lg border border-gray-100 bg-gray-50 px-3 py-2.5",
110
+ children: [
111
+ /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
112
+ /* @__PURE__ */ jsx("p", { className: "font-bold font-mono text-[11px] text-gray-400", children: s.txn }),
113
+ /* @__PURE__ */ jsx("p", { className: "font-medium text-[12px] text-gray-700", children: s.corridor })
114
+ ] }),
115
+ /* @__PURE__ */ jsxs("div", { className: "text-right", children: [
116
+ /* @__PURE__ */ jsx("p", { className: "font-bold font-mono text-2xl text-gray-900", children: /* @__PURE__ */ jsx(AnimatedNumber, { value: s.score }) }),
117
+ /* @__PURE__ */ jsx("p", { className: "text-[10px] text-gray-400", children: "/100" })
118
+ ] })
119
+ ]
120
+ },
121
+ `info-${index}`
122
+ ),
123
+ /* @__PURE__ */ jsx("div", { className: "mt-3 h-2 overflow-hidden rounded-full bg-gray-100", children: /* @__PURE__ */ jsx(
124
+ m.div,
125
+ {
126
+ className: cn("h-full rounded-full", s.barColour),
127
+ style: { transformOrigin: "left", width: "100%" },
128
+ initial: { scaleX: 0 },
129
+ animate: { scaleX: s.score / 100 },
130
+ transition: { duration: 1, ease: EASE_OUT }
131
+ },
132
+ `bar-${index}`
133
+ ) }),
134
+ /* @__PURE__ */ jsx("div", { className: "mt-4 grid grid-cols-2 gap-2", children: s.checks.map((check, i) => /* @__PURE__ */ jsxs(
135
+ m.div,
136
+ {
137
+ initial: { opacity: 0, y: 4 },
138
+ animate: { opacity: 1, y: 0 },
139
+ transition: { duration: 0.25, delay: 0.1 + i * 0.08 },
140
+ className: "flex items-center justify-between rounded-lg border border-gray-100 bg-white px-3 py-2",
141
+ children: [
142
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-[11px] text-gray-600", children: check.label }),
143
+ /* @__PURE__ */ jsx(
144
+ "span",
145
+ {
146
+ className: cn(
147
+ "font-semibold text-[10px]",
148
+ check.ok ? "text-emerald-600" : "text-red-500"
149
+ ),
150
+ children: check.result
151
+ }
152
+ )
153
+ ]
154
+ },
155
+ `${check.label}-${index}`
156
+ )) })
157
+ ] }) });
158
+ }
159
+
160
+ export { AnimationRiskScoring as default };
7
161
  //# sourceMappingURL=animation-risk-scoring.js.map
8
162
  //# sourceMappingURL=animation-risk-scoring.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"animation-risk-scoring.js"}
1
+ {"version":3,"sources":["../../src/animations/animation-risk-scoring.tsx"],"names":[],"mappings":"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","file":"animation-risk-scoring.js","sourcesContent":["\"use client\"\n\nimport { AlertTriangle, ShieldAlert, ShieldCheck } from \"lucide-react\"\nimport { domAnimation, LazyMotion, m } from \"motion/react\"\nimport { useEffect, useState } from \"react\"\n\nimport { useCycleIndex } from \"../hooks/use-cycle-index\"\n\nimport { EASE_OUT } from \"../lib/animation\"\nimport { cn } from \"../lib/utils\"\n\ntype Scenario = {\n txn: string\n corridor: string\n score: number\n level: \"Low\" | \"Medium\" | \"High\"\n colour: string\n barColour: string\n icon: typeof ShieldCheck\n checks: { label: string; result: string; ok: boolean }[]\n}\n\nconst SCENARIOS: Scenario[] = [\n {\n txn: \"TXN-0847\",\n corridor: \"AU \\u2192 SG\",\n score: 18,\n level: \"Low\",\n colour: \"text-emerald-600\",\n barColour: \"bg-emerald-400\",\n icon: ShieldCheck,\n checks: [\n { label: \"Sanctions\", result: \"Clear\", ok: true },\n { label: \"PEP screening\", result: \"Clear\", ok: true },\n { label: \"Travel Rule\", result: \"Verified\", ok: true },\n { label: \"Threshold\", result: \"Below limit\", ok: true },\n ],\n },\n {\n txn: \"TXN-0846\",\n corridor: \"HK \\u2192 GB\",\n score: 72,\n level: \"High\",\n colour: \"text-red-500\",\n barColour: \"bg-red-400\",\n icon: ShieldAlert,\n checks: [\n { label: \"Sanctions\", result: \"Clear\", ok: true },\n { label: \"PEP screening\", result: \"1 match\", ok: false },\n { label: \"Travel Rule\", result: \"Verified\", ok: true },\n { label: \"Threshold\", result: \"Exceeded\", ok: false },\n ],\n },\n {\n txn: \"TXN-0845\",\n corridor: \"AE \\u2192 NL\",\n score: 41,\n level: \"Medium\",\n colour: \"text-amber-500\",\n barColour: \"bg-amber-400\",\n icon: AlertTriangle,\n checks: [\n { label: \"Sanctions\", result: \"Clear\", ok: true },\n { label: \"PEP screening\", result: \"Clear\", ok: true },\n { label: \"Travel Rule\", result: \"Pending\", ok: false },\n { label: \"Threshold\", result: \"Below limit\", ok: true },\n ],\n },\n]\n\nconst CYCLE_MS = 3800\n\nfunction AnimatedNumber({ value, duration = 1000 }: { value: number; duration?: number }) {\n const [display, setDisplay] = useState(0)\n\n useEffect(() => {\n let start: number | null = null\n let raf: number\n\n function tick(ts: number) {\n if (start === null) start = ts\n const progress = Math.min((ts - start) / duration, 1)\n const eased = 1 - (1 - progress) ** 3\n setDisplay(Math.round(value * eased))\n if (progress < 1) raf = requestAnimationFrame(tick)\n }\n\n raf = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(raf)\n }, [value, duration])\n\n return <>{display}</>\n}\n\nexport default function AnimationRiskScoring({ className }: { className?: string }) {\n const [containerRef, index] = useCycleIndex(SCENARIOS.length, CYCLE_MS)\n const s = SCENARIOS[index]\n const Icon = s.icon\n\n return (\n <LazyMotion features={domAnimation}>\n <div ref={containerRef} className={cn(\"flex flex-col p-5\", className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-semibold text-[15px] text-forground\">Risk Analysis</p>\n <p className=\"text-[12px] text-gray-400\">Real-time transfer scoring</p>\n </div>\n <m.div\n key={index}\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n className={cn(\n \"flex items-center gap-1.5 rounded-full px-2.5 py-1\",\n s.level === \"Low\"\n ? \"bg-emerald-50\"\n : s.level === \"Medium\"\n ? \"bg-amber-50\"\n : \"bg-red-50\",\n )}\n >\n <Icon className={cn(\"size-3.5\", s.colour)} strokeWidth={2} />\n <span className={cn(\"font-semibold text-[11px]\", s.colour)}>{s.level}</span>\n </m.div>\n </div>\n\n {/* Transfer info */}\n <m.div\n key={`info-${index}`}\n initial={{ opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"mt-4 flex items-center gap-3 rounded-lg border border-gray-100 bg-gray-50 px-3 py-2.5\"\n >\n <div className=\"flex-1\">\n <p className=\"font-bold font-mono text-[11px] text-gray-400\">{s.txn}</p>\n <p className=\"font-medium text-[12px] text-gray-700\">{s.corridor}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-bold font-mono text-2xl text-gray-900\">\n <AnimatedNumber value={s.score} />\n </p>\n <p className=\"text-[10px] text-gray-400\">/100</p>\n </div>\n </m.div>\n\n {/* Score bar */}\n <div className=\"mt-3 h-2 overflow-hidden rounded-full bg-gray-100\">\n <m.div\n key={`bar-${index}`}\n className={cn(\"h-full rounded-full\", s.barColour)}\n style={{ transformOrigin: \"left\", width: \"100%\" }}\n initial={{ scaleX: 0 }}\n animate={{ scaleX: s.score / 100 }}\n transition={{ duration: 1, ease: EASE_OUT }}\n />\n </div>\n\n {/* Check results */}\n <div className=\"mt-4 grid grid-cols-2 gap-2\">\n {s.checks.map((check, i) => (\n <m.div\n key={`${check.label}-${index}`}\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.25, delay: 0.1 + i * 0.08 }}\n className=\"flex items-center justify-between rounded-lg border border-gray-100 bg-white px-3 py-2\"\n >\n <span className=\"font-medium text-[11px] text-gray-600\">{check.label}</span>\n <span\n className={cn(\n \"font-semibold text-[10px]\",\n check.ok ? \"text-emerald-600\" : \"text-red-500\",\n )}\n >\n {check.result}\n </span>\n </m.div>\n ))}\n </div>\n </div>\n </LazyMotion>\n )\n}\n"]}
@@ -1,5 +1,110 @@
1
1
  "use client";
2
- export { AnimationSandbox as default } from '../chunk-N7PBUY7G.js';
3
- import '../chunk-GZNLQE3I.js';
2
+ import { cn } from '../chunk-GZNLQE3I.js';
3
+ import { RotateCcw, Play } from 'lucide-react';
4
+ import { LazyMotion, domAnimation, m } from 'motion/react';
5
+ import { useState, useRef, useCallback, useEffect } from 'react';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ var SCRIPT = [
9
+ { type: "command", text: "$ cogentic-cli test transfer --corridor AU:SG --amount 45000" },
10
+ { type: "info", text: "\u2192 Using sandbox environment (test mode)" },
11
+ { type: "output", text: "Creating test transfer TXN-TEST-0001..." },
12
+ { type: "output", text: "Screening against sandbox ruleset..." },
13
+ { type: "output", text: " Jurisdiction: AUSTRAC \u2192 MAS" },
14
+ { type: "output", text: " Threshold check: AUD 10,000 exceeded" },
15
+ { type: "output", text: " Travel Rule: IVMS101 required" },
16
+ { type: "output", text: " Risk score: 18/100 (Low)" },
17
+ { type: "success", text: "\u2713 Transfer screened: COMPLIANT" },
18
+ { type: "info", text: "\u2192 Sandbox report: SR-TEST-0001 generated" },
19
+ { type: "info", text: "\u2192 No production data affected" },
20
+ { type: "command", text: "" },
21
+ { type: "command", text: "$ cogentic-cli test transfer --corridor HK:GB --amount 120000" },
22
+ { type: "info", text: "\u2192 Using sandbox environment (test mode)" },
23
+ { type: "output", text: "Creating test transfer TXN-TEST-0002..." },
24
+ { type: "output", text: "Screening against sandbox ruleset..." },
25
+ { type: "output", text: " Jurisdiction: SFC \u2192 FCA" },
26
+ { type: "output", text: " High-risk corridor detected" },
27
+ { type: "output", text: " Enhanced due diligence triggered" },
28
+ { type: "output", text: " Risk score: 72/100 (High)" },
29
+ { type: "success", text: "\u26A0 Transfer screened: FLAGGED \u2014 manual review required" }
30
+ ];
31
+ var lineColour = {
32
+ command: "text-white/90",
33
+ output: "text-white/50",
34
+ success: "text-emerald-400",
35
+ info: "text-[#00D4FF]/80"
36
+ };
37
+ function AnimationSandbox({ className }) {
38
+ const [visibleLines, setVisibleLines] = useState(0);
39
+ const scrollRef = useRef(null);
40
+ const reset = useCallback(() => {
41
+ setVisibleLines(0);
42
+ }, []);
43
+ useEffect(() => {
44
+ if (visibleLines < SCRIPT.length) {
45
+ const line = SCRIPT[visibleLines];
46
+ const delay = line.type === "command" ? 400 : line.text === "" ? 200 : 120;
47
+ const id = setTimeout(() => setVisibleLines((v) => v + 1), delay);
48
+ return () => clearTimeout(id);
49
+ } else {
50
+ const id = setTimeout(reset, 4e3);
51
+ return () => clearTimeout(id);
52
+ }
53
+ }, [visibleLines, reset]);
54
+ useEffect(() => {
55
+ const el = scrollRef.current;
56
+ if (!el) return;
57
+ requestAnimationFrame(() => {
58
+ el.scrollTop = el.scrollHeight;
59
+ });
60
+ }, []);
61
+ return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col bg-[#1a1a2e]", className), children: [
62
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-white/10 border-b px-4 py-2", children: [
63
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-1.5", children: [
64
+ /* @__PURE__ */ jsx("span", { className: "size-2.5 rounded-full bg-red-400/80" }),
65
+ /* @__PURE__ */ jsx("span", { className: "size-2.5 rounded-full bg-amber-400/80" }),
66
+ /* @__PURE__ */ jsx("span", { className: "size-2.5 rounded-full bg-emerald-400/80" })
67
+ ] }),
68
+ /* @__PURE__ */ jsx("span", { className: "ml-2 font-mono text-[10px] text-white/40", children: "cogentic-sandbox" }),
69
+ /* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
70
+ /* @__PURE__ */ jsx("span", { className: "rounded-full bg-amber-500/20 px-2 py-0.5 font-bold font-mono text-[9px] text-amber-300", children: "SANDBOX" }),
71
+ /* @__PURE__ */ jsx(
72
+ "button",
73
+ {
74
+ onClick: reset,
75
+ className: "text-white/30 transition-colors hover:text-white/60",
76
+ "aria-label": "Restart",
77
+ children: /* @__PURE__ */ jsx(RotateCcw, { className: "size-3" })
78
+ }
79
+ )
80
+ ] })
81
+ ] }),
82
+ /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "scrollbar-none flex-1 overflow-y-auto px-4 py-3", children: /* @__PURE__ */ jsxs("div", { className: "space-y-0.5", children: [
83
+ SCRIPT.slice(0, visibleLines).map((line, i) => /* @__PURE__ */ jsx(
84
+ m.p,
85
+ {
86
+ initial: { opacity: 0 },
87
+ animate: { opacity: 1 },
88
+ className: cn("font-mono text-[11px] leading-relaxed", lineColour[line.type]),
89
+ children: line.text || "\xA0"
90
+ },
91
+ i
92
+ )),
93
+ visibleLines < SCRIPT.length && /* @__PURE__ */ jsx("p", { className: "animate-pulse font-mono text-[11px] text-white/30", children: "\u2588" })
94
+ ] }) }),
95
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-white/10 border-t px-4 py-1.5", children: [
96
+ /* @__PURE__ */ jsx(Play, { className: "size-3 text-emerald-400" }),
97
+ /* @__PURE__ */ jsxs("span", { className: "font-mono text-[9px] text-white/30", children: [
98
+ "Sandbox ",
99
+ "\u2022",
100
+ " No production data ",
101
+ "\u2022",
102
+ " Realistic responses"
103
+ ] })
104
+ ] })
105
+ ] }) });
106
+ }
107
+
108
+ export { AnimationSandbox as default };
4
109
  //# sourceMappingURL=animation-sandbox.js.map
5
110
  //# sourceMappingURL=animation-sandbox.js.map