@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.
- package/dist/animations/animation-ai-analysis.js +99 -4
- package/dist/animations/animation-ai-analysis.js.map +1 -1
- package/dist/animations/animation-audit-trail.js +194 -2
- package/dist/animations/animation-audit-trail.js.map +1 -1
- package/dist/animations/animation-compliance-reports.js +108 -3
- package/dist/animations/animation-compliance-reports.js.map +1 -1
- package/dist/animations/animation-custom-rules.js +107 -3
- package/dist/animations/animation-custom-rules.js.map +1 -1
- package/dist/animations/animation-jira-ticket.js +114 -3
- package/dist/animations/animation-jira-ticket.js.map +1 -1
- package/dist/animations/animation-jurisdiction-detection.js +122 -3
- package/dist/animations/animation-jurisdiction-detection.js.map +1 -1
- package/dist/animations/animation-multi-protocol.js +63 -2
- package/dist/animations/animation-multi-protocol.js.map +1 -1
- package/dist/animations/animation-pricing-preview.js +169 -3
- package/dist/animations/animation-pricing-preview.js.map +1 -1
- package/dist/animations/animation-realtime-updates.js +140 -4
- package/dist/animations/animation-realtime-updates.js.map +1 -1
- package/dist/animations/animation-rest-api.js +121 -2
- package/dist/animations/animation-rest-api.js.map +1 -1
- package/dist/animations/animation-risk-scoring.js +158 -4
- package/dist/animations/animation-risk-scoring.js.map +1 -1
- package/dist/animations/animation-sandbox.js +107 -2
- package/dist/animations/animation-sandbox.js.map +1 -1
- package/dist/animations/animation-scheduled-reports.js +107 -3
- package/dist/animations/animation-scheduled-reports.js.map +1 -1
- package/dist/animations/animation-secure-messaging.js +99 -3
- package/dist/animations/animation-secure-messaging.js.map +1 -1
- package/dist/animations/animation-slack-notification.js +90 -3
- package/dist/animations/animation-slack-notification.js.map +1 -1
- package/dist/animations/animation-sop-mapping.js +158 -2
- package/dist/animations/animation-sop-mapping.js.map +1 -1
- package/dist/animations/animation-team-routing.js +118 -4
- package/dist/animations/animation-team-routing.js.map +1 -1
- package/dist/animations/animation-teams-notification.js +89 -3
- package/dist/animations/animation-teams-notification.js.map +1 -1
- package/dist/animations/animation-vasp-identification.js +142 -3
- package/dist/animations/animation-vasp-identification.js.map +1 -1
- package/dist/animations/animation-webhooks.js +105 -3
- package/dist/animations/animation-webhooks.js.map +1 -1
- package/dist/blocks/auth-form.js +0 -1
- package/dist/blocks/feature-section.js +0 -1
- package/dist/blocks/hero-section.js +0 -1
- package/dist/blocks/pricing-table.js +0 -1
- package/dist/blocks/stat-card.js +0 -1
- package/dist/chart-DkwdRX-i.d.ts +50 -0
- package/dist/charts.d.ts +73 -3
- package/dist/charts.js +287 -2
- package/dist/charts.js.map +1 -1
- package/dist/chunk-6RWCZUAD.js +0 -1
- package/dist/chunk-GJAWCIGE.js +237 -0
- package/dist/chunk-GJAWCIGE.js.map +1 -0
- package/dist/chunk-GZNLQE3I.js +0 -1
- package/dist/chunk-TAPJEVUA.js +0 -1
- package/dist/index.d.ts +34 -52
- package/dist/index.js +109 -168
- package/dist/index.js.map +1 -1
- package/package.json +6 -3
- package/dist/chunk-4YD3YS4B.js +0 -110
- package/dist/chunk-4YD3YS4B.js.map +0 -1
- package/dist/chunk-5JLZ42JT.js +0 -125
- package/dist/chunk-5JLZ42JT.js.map +0 -1
- package/dist/chunk-5OOO6TRA.js +0 -111
- package/dist/chunk-5OOO6TRA.js.map +0 -1
- package/dist/chunk-65Z2VEKG.js +0 -161
- package/dist/chunk-65Z2VEKG.js.map +0 -1
- package/dist/chunk-BTFYV3TI.js +0 -102
- package/dist/chunk-BTFYV3TI.js.map +0 -1
- package/dist/chunk-BTZB4JRC.js +0 -117
- package/dist/chunk-BTZB4JRC.js.map +0 -1
- package/dist/chunk-BZSA47MS.js +0 -121
- package/dist/chunk-BZSA47MS.js.map +0 -1
- package/dist/chunk-EFLWU2JP.js +0 -145
- package/dist/chunk-EFLWU2JP.js.map +0 -1
- package/dist/chunk-F7REPQOA.js +0 -93
- package/dist/chunk-F7REPQOA.js.map +0 -1
- package/dist/chunk-FKPK3CB7.js +0 -143
- package/dist/chunk-FKPK3CB7.js.map +0 -1
- package/dist/chunk-H7VUIMEL.js +0 -172
- package/dist/chunk-H7VUIMEL.js.map +0 -1
- package/dist/chunk-HTYR73ON.js +0 -161
- package/dist/chunk-HTYR73ON.js.map +0 -1
- package/dist/chunk-I26ZXVSY.js +0 -124
- package/dist/chunk-I26ZXVSY.js.map +0 -1
- package/dist/chunk-IKATDPHG.js +0 -92
- package/dist/chunk-IKATDPHG.js.map +0 -1
- package/dist/chunk-KUOF3XRZ.js +0 -108
- package/dist/chunk-KUOF3XRZ.js.map +0 -1
- package/dist/chunk-N7PBUY7G.js +0 -110
- package/dist/chunk-N7PBUY7G.js.map +0 -1
- package/dist/chunk-NAPDFVBI.js +0 -102
- package/dist/chunk-NAPDFVBI.js.map +0 -1
- package/dist/chunk-RTK7R4KZ.js +0 -66
- package/dist/chunk-RTK7R4KZ.js.map +0 -1
- package/dist/chunk-RZZTDJHG.js +0 -110
- package/dist/chunk-RZZTDJHG.js.map +0 -1
- package/dist/chunk-SNOJLZP4.js +0 -197
- package/dist/chunk-SNOJLZP4.js.map +0 -1
- package/dist/chunk-U4EPKN7G.js +0 -518
- package/dist/chunk-U4EPKN7G.js.map +0 -1
- package/dist/index-CcPuHWa-.d.ts +0 -118
|
@@ -1,8 +1,144 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
3
|
-
import '../chunk-
|
|
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
|
-
|
|
3
|
-
import '
|
|
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
|
-
|
|
3
|
-
import '../chunk-
|
|
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
|
-
|
|
3
|
-
import '
|
|
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
|