@cogentic-co/ds 0.4.1
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/LICENSE +21 -0
- package/README.md +139 -0
- package/dist/animations/animation-ai-analysis.d.ts +7 -0
- package/dist/animations/animation-ai-analysis.js +7 -0
- package/dist/animations/animation-ai-analysis.js.map +1 -0
- package/dist/animations/animation-audit-trail.d.ts +7 -0
- package/dist/animations/animation-audit-trail.js +5 -0
- package/dist/animations/animation-audit-trail.js.map +1 -0
- package/dist/animations/animation-compliance-reports.d.ts +7 -0
- package/dist/animations/animation-compliance-reports.js +7 -0
- package/dist/animations/animation-compliance-reports.js.map +1 -0
- package/dist/animations/animation-custom-rules.d.ts +7 -0
- package/dist/animations/animation-custom-rules.js +7 -0
- package/dist/animations/animation-custom-rules.js.map +1 -0
- package/dist/animations/animation-jira-ticket.d.ts +7 -0
- package/dist/animations/animation-jira-ticket.js +6 -0
- package/dist/animations/animation-jira-ticket.js.map +1 -0
- package/dist/animations/animation-jurisdiction-detection.d.ts +7 -0
- package/dist/animations/animation-jurisdiction-detection.js +7 -0
- package/dist/animations/animation-jurisdiction-detection.js.map +1 -0
- package/dist/animations/animation-multi-protocol.d.ts +7 -0
- package/dist/animations/animation-multi-protocol.js +5 -0
- package/dist/animations/animation-multi-protocol.js.map +1 -0
- package/dist/animations/animation-pricing-preview.d.ts +16 -0
- package/dist/animations/animation-pricing-preview.js +7 -0
- package/dist/animations/animation-pricing-preview.js.map +1 -0
- package/dist/animations/animation-realtime-updates.d.ts +7 -0
- package/dist/animations/animation-realtime-updates.js +8 -0
- package/dist/animations/animation-realtime-updates.js.map +1 -0
- package/dist/animations/animation-rest-api.d.ts +7 -0
- package/dist/animations/animation-rest-api.js +5 -0
- package/dist/animations/animation-rest-api.js.map +1 -0
- package/dist/animations/animation-risk-scoring.d.ts +7 -0
- package/dist/animations/animation-risk-scoring.js +8 -0
- package/dist/animations/animation-risk-scoring.js.map +1 -0
- package/dist/animations/animation-sandbox.d.ts +7 -0
- package/dist/animations/animation-sandbox.js +5 -0
- package/dist/animations/animation-sandbox.js.map +1 -0
- package/dist/animations/animation-scheduled-reports.d.ts +7 -0
- package/dist/animations/animation-scheduled-reports.js +7 -0
- package/dist/animations/animation-scheduled-reports.js.map +1 -0
- package/dist/animations/animation-secure-messaging.d.ts +7 -0
- package/dist/animations/animation-secure-messaging.js +6 -0
- package/dist/animations/animation-secure-messaging.js.map +1 -0
- package/dist/animations/animation-slack-notification.d.ts +7 -0
- package/dist/animations/animation-slack-notification.js +6 -0
- package/dist/animations/animation-slack-notification.js.map +1 -0
- package/dist/animations/animation-sop-mapping.d.ts +7 -0
- package/dist/animations/animation-sop-mapping.js +5 -0
- package/dist/animations/animation-sop-mapping.js.map +1 -0
- package/dist/animations/animation-team-routing.d.ts +7 -0
- package/dist/animations/animation-team-routing.js +7 -0
- package/dist/animations/animation-team-routing.js.map +1 -0
- package/dist/animations/animation-teams-notification.d.ts +7 -0
- package/dist/animations/animation-teams-notification.js +6 -0
- package/dist/animations/animation-teams-notification.js.map +1 -0
- package/dist/animations/animation-vasp-identification.d.ts +7 -0
- package/dist/animations/animation-vasp-identification.js +7 -0
- package/dist/animations/animation-vasp-identification.js.map +1 -0
- package/dist/animations/animation-webhooks.d.ts +7 -0
- package/dist/animations/animation-webhooks.js +6 -0
- package/dist/animations/animation-webhooks.js.map +1 -0
- package/dist/blocks/auth-form.d.ts +18 -0
- package/dist/blocks/auth-form.js +7 -0
- package/dist/blocks/auth-form.js.map +1 -0
- package/dist/blocks/feature-section.d.ts +17 -0
- package/dist/blocks/feature-section.js +5 -0
- package/dist/blocks/feature-section.js.map +1 -0
- package/dist/blocks/hero-section.d.ts +19 -0
- package/dist/blocks/hero-section.js +5 -0
- package/dist/blocks/hero-section.js.map +1 -0
- package/dist/blocks/pricing-table.d.ts +24 -0
- package/dist/blocks/pricing-table.js +6 -0
- package/dist/blocks/pricing-table.js.map +1 -0
- package/dist/blocks/stat-card.d.ts +15 -0
- package/dist/blocks/stat-card.js +6 -0
- package/dist/blocks/stat-card.js.map +1 -0
- package/dist/card-Cumdyf_G.d.ts +15 -0
- package/dist/charts.d.ts +4 -0
- package/dist/charts.js +5 -0
- package/dist/charts.js.map +1 -0
- package/dist/chatbot.d.ts +280 -0
- package/dist/chatbot.js +2202 -0
- package/dist/chatbot.js.map +1 -0
- package/dist/chunk-4NEQV6H2.js +39 -0
- package/dist/chunk-4NEQV6H2.js.map +1 -0
- package/dist/chunk-4YD3YS4B.js +110 -0
- package/dist/chunk-4YD3YS4B.js.map +1 -0
- package/dist/chunk-5JLZ42JT.js +125 -0
- package/dist/chunk-5JLZ42JT.js.map +1 -0
- package/dist/chunk-5OOO6TRA.js +111 -0
- package/dist/chunk-5OOO6TRA.js.map +1 -0
- package/dist/chunk-65Z2VEKG.js +161 -0
- package/dist/chunk-65Z2VEKG.js.map +1 -0
- package/dist/chunk-6RWCZUAD.js +12 -0
- package/dist/chunk-6RWCZUAD.js.map +1 -0
- package/dist/chunk-7HRPF2N2.js +56 -0
- package/dist/chunk-7HRPF2N2.js.map +1 -0
- package/dist/chunk-BNFSXNP2.js +71 -0
- package/dist/chunk-BNFSXNP2.js.map +1 -0
- package/dist/chunk-BTFYV3TI.js +102 -0
- package/dist/chunk-BTFYV3TI.js.map +1 -0
- package/dist/chunk-BTZB4JRC.js +117 -0
- package/dist/chunk-BTZB4JRC.js.map +1 -0
- package/dist/chunk-BZSA47MS.js +121 -0
- package/dist/chunk-BZSA47MS.js.map +1 -0
- package/dist/chunk-CG5JA7FM.js +107 -0
- package/dist/chunk-CG5JA7FM.js.map +1 -0
- package/dist/chunk-EFLWU2JP.js +145 -0
- package/dist/chunk-EFLWU2JP.js.map +1 -0
- package/dist/chunk-F7REPQOA.js +93 -0
- package/dist/chunk-F7REPQOA.js.map +1 -0
- package/dist/chunk-FKPK3CB7.js +143 -0
- package/dist/chunk-FKPK3CB7.js.map +1 -0
- package/dist/chunk-GZNLQE3I.js +55 -0
- package/dist/chunk-GZNLQE3I.js.map +1 -0
- package/dist/chunk-H7VUIMEL.js +172 -0
- package/dist/chunk-H7VUIMEL.js.map +1 -0
- package/dist/chunk-HTYR73ON.js +161 -0
- package/dist/chunk-HTYR73ON.js.map +1 -0
- package/dist/chunk-I26ZXVSY.js +124 -0
- package/dist/chunk-I26ZXVSY.js.map +1 -0
- package/dist/chunk-IKATDPHG.js +92 -0
- package/dist/chunk-IKATDPHG.js.map +1 -0
- package/dist/chunk-KUOF3XRZ.js +108 -0
- package/dist/chunk-KUOF3XRZ.js.map +1 -0
- package/dist/chunk-LW6GAWZM.js +148 -0
- package/dist/chunk-LW6GAWZM.js.map +1 -0
- package/dist/chunk-N7PBUY7G.js +110 -0
- package/dist/chunk-N7PBUY7G.js.map +1 -0
- package/dist/chunk-NAPDFVBI.js +102 -0
- package/dist/chunk-NAPDFVBI.js.map +1 -0
- package/dist/chunk-RTK7R4KZ.js +66 -0
- package/dist/chunk-RTK7R4KZ.js.map +1 -0
- package/dist/chunk-RXV2XUDZ.js +31 -0
- package/dist/chunk-RXV2XUDZ.js.map +1 -0
- package/dist/chunk-RZZTDJHG.js +110 -0
- package/dist/chunk-RZZTDJHG.js.map +1 -0
- package/dist/chunk-SNOJLZP4.js +197 -0
- package/dist/chunk-SNOJLZP4.js.map +1 -0
- package/dist/chunk-TAPJEVUA.js +24 -0
- package/dist/chunk-TAPJEVUA.js.map +1 -0
- package/dist/chunk-U4EPKN7G.js +518 -0
- package/dist/chunk-U4EPKN7G.js.map +1 -0
- package/dist/chunk-VWSX75RB.js +202 -0
- package/dist/chunk-VWSX75RB.js.map +1 -0
- package/dist/chunk-XFWKI45G.js +800 -0
- package/dist/chunk-XFWKI45G.js.map +1 -0
- package/dist/chunk-XQYFQ6PU.js +77 -0
- package/dist/chunk-XQYFQ6PU.js.map +1 -0
- package/dist/index-CcPuHWa-.d.ts +118 -0
- package/dist/index.d.ts +1385 -0
- package/dist/index.js +8673 -0
- package/dist/index.js.map +1 -0
- package/dist/workflow.d.ts +165 -0
- package/dist/workflow.js +5 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +157 -0
- package/src/styles/globals.css +211 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from './chunk-GZNLQE3I.js';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var ROW_1 = [
|
|
6
|
+
{ name: "TRP", icon: "T" },
|
|
7
|
+
{ name: "TRISA", icon: "R" },
|
|
8
|
+
{ name: "OpenVASP", icon: "O" },
|
|
9
|
+
{ name: "Sygna", icon: "S" },
|
|
10
|
+
{ name: "Notabene", icon: "N" },
|
|
11
|
+
{ name: "Sumsub", icon: "Su" },
|
|
12
|
+
{ name: "Chainalysis", icon: "C" },
|
|
13
|
+
{ name: "Elliptic", icon: "E" }
|
|
14
|
+
];
|
|
15
|
+
var ROW_2 = [
|
|
16
|
+
{ name: "Shyft", icon: "Sh" },
|
|
17
|
+
{ name: "Coinfirm", icon: "Co" },
|
|
18
|
+
{ name: "CipherTrace", icon: "Ci" },
|
|
19
|
+
{ name: "VerifyVASP", icon: "V" },
|
|
20
|
+
{ name: "Crystal", icon: "Cr" },
|
|
21
|
+
{ name: "TRM Labs", icon: "TL" },
|
|
22
|
+
{ name: "Merkle", icon: "M" },
|
|
23
|
+
{ name: "Scorechain", icon: "Sc" }
|
|
24
|
+
];
|
|
25
|
+
function MarqueeRow({
|
|
26
|
+
items,
|
|
27
|
+
direction = "left",
|
|
28
|
+
duration = 25
|
|
29
|
+
}) {
|
|
30
|
+
const doubled = [...items, ...items];
|
|
31
|
+
return /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden", children: [
|
|
32
|
+
/* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-y-0 left-0 z-10 w-10 bg-gradient-to-r from-card/40 to-transparent" }),
|
|
33
|
+
/* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-y-0 right-0 z-10 w-10 bg-gradient-to-l from-card/40 to-transparent" }),
|
|
34
|
+
/* @__PURE__ */ jsx(
|
|
35
|
+
"div",
|
|
36
|
+
{
|
|
37
|
+
className: cn(
|
|
38
|
+
"flex w-max gap-3",
|
|
39
|
+
direction === "left" ? "animate-marquee-left" : "animate-marquee-right"
|
|
40
|
+
),
|
|
41
|
+
style: { animationDuration: `${duration}s` },
|
|
42
|
+
children: doubled.map((item, i) => /* @__PURE__ */ jsxs(
|
|
43
|
+
"div",
|
|
44
|
+
{
|
|
45
|
+
className: "flex shrink-0 items-center gap-2 rounded-full border border-gray-200 bg-white px-3.5 py-2 shadow-sm",
|
|
46
|
+
children: [
|
|
47
|
+
/* @__PURE__ */ jsx("div", { className: "flex size-6 items-center justify-center rounded-full bg-gray-100 font-bold text-[10px] text-gray-500", children: item.icon }),
|
|
48
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-[12px] text-gray-700", children: item.name })
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
`${item.name}-${i}`
|
|
52
|
+
))
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
] });
|
|
56
|
+
}
|
|
57
|
+
function AnimationMultiProtocol({ className }) {
|
|
58
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col justify-center gap-3", className), children: [
|
|
59
|
+
/* @__PURE__ */ jsx(MarqueeRow, { items: ROW_1, direction: "left", duration: 30 }),
|
|
60
|
+
/* @__PURE__ */ jsx(MarqueeRow, { items: ROW_2, direction: "right", duration: 28 })
|
|
61
|
+
] });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { AnimationMultiProtocol };
|
|
65
|
+
//# sourceMappingURL=chunk-RTK7R4KZ.js.map
|
|
66
|
+
//# sourceMappingURL=chunk-RTK7R4KZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/animations/animation-multi-protocol.tsx"],"names":[],"mappings":"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","file":"chunk-RTK7R4KZ.js","sourcesContent":["\"use client\"\n\nimport { cn } from \"../lib/utils\"\n\ntype ProtocolItem = {\n name: string\n icon: string\n}\n\nconst ROW_1: ProtocolItem[] = [\n { name: \"TRP\", icon: \"T\" },\n { name: \"TRISA\", icon: \"R\" },\n { name: \"OpenVASP\", icon: \"O\" },\n { name: \"Sygna\", icon: \"S\" },\n { name: \"Notabene\", icon: \"N\" },\n { name: \"Sumsub\", icon: \"Su\" },\n { name: \"Chainalysis\", icon: \"C\" },\n { name: \"Elliptic\", icon: \"E\" },\n]\n\nconst ROW_2: ProtocolItem[] = [\n { name: \"Shyft\", icon: \"Sh\" },\n { name: \"Coinfirm\", icon: \"Co\" },\n { name: \"CipherTrace\", icon: \"Ci\" },\n { name: \"VerifyVASP\", icon: \"V\" },\n { name: \"Crystal\", icon: \"Cr\" },\n { name: \"TRM Labs\", icon: \"TL\" },\n { name: \"Merkle\", icon: \"M\" },\n { name: \"Scorechain\", icon: \"Sc\" },\n]\n\nfunction MarqueeRow({\n items,\n direction = \"left\",\n duration = 25,\n}: {\n items: ProtocolItem[]\n direction?: \"left\" | \"right\"\n duration?: number\n}) {\n const doubled = [...items, ...items]\n\n return (\n <div className=\"relative overflow-hidden\">\n <div className=\"pointer-events-none absolute inset-y-0 left-0 z-10 w-10 bg-gradient-to-r from-card/40 to-transparent\" />\n <div className=\"pointer-events-none absolute inset-y-0 right-0 z-10 w-10 bg-gradient-to-l from-card/40 to-transparent\" />\n\n <div\n className={cn(\n \"flex w-max gap-3\",\n direction === \"left\" ? \"animate-marquee-left\" : \"animate-marquee-right\",\n )}\n style={{ animationDuration: `${duration}s` }}\n >\n {doubled.map((item, i) => (\n <div\n key={`${item.name}-${i}`}\n className=\"flex shrink-0 items-center gap-2 rounded-full border border-gray-200 bg-white px-3.5 py-2 shadow-sm\"\n >\n <div className=\"flex size-6 items-center justify-center rounded-full bg-gray-100 font-bold text-[10px] text-gray-500\">\n {item.icon}\n </div>\n <span className=\"font-medium text-[12px] text-gray-700\">{item.name}</span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport default function AnimationMultiProtocol({ className }: { className?: string }) {\n return (\n <div className={cn(\"flex flex-col justify-center gap-3\", className)}>\n <MarqueeRow items={ROW_1} direction=\"left\" duration={30} />\n <MarqueeRow items={ROW_2} direction=\"right\" duration={28} />\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useRef, useState, useEffect, useCallback } from 'react';
|
|
3
|
+
|
|
4
|
+
// src/hooks/use-animation-timer.ts
|
|
5
|
+
function useAnimationTimer(intervalMs) {
|
|
6
|
+
const ref = useRef(null);
|
|
7
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
8
|
+
const [tick, setTick] = useState(0);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const el = ref.current;
|
|
11
|
+
if (!el) return;
|
|
12
|
+
const observer = new IntersectionObserver(([entry]) => setIsVisible(entry.isIntersecting), {
|
|
13
|
+
threshold: 0.1
|
|
14
|
+
});
|
|
15
|
+
observer.observe(el);
|
|
16
|
+
return () => observer.disconnect();
|
|
17
|
+
}, []);
|
|
18
|
+
const advance = useCallback(() => {
|
|
19
|
+
setTick((t) => t + 1);
|
|
20
|
+
}, []);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (!isVisible) return;
|
|
23
|
+
const id = setInterval(advance, intervalMs);
|
|
24
|
+
return () => clearInterval(id);
|
|
25
|
+
}, [isVisible, intervalMs, advance]);
|
|
26
|
+
return [ref, tick];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { useAnimationTimer };
|
|
30
|
+
//# sourceMappingURL=chunk-RXV2XUDZ.js.map
|
|
31
|
+
//# sourceMappingURL=chunk-RXV2XUDZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-animation-timer.ts"],"names":[],"mappings":";;;AAUO,SAAS,kBAAkB,UAAA,EAAoB;AACpD,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,CAAC,CAAA;AAElC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,MAAM,QAAA,GAAW,IAAI,oBAAA,CAAqB,CAAC,CAAC,KAAK,CAAA,KAAM,YAAA,CAAa,KAAA,CAAM,cAAc,CAAA,EAAG;AAAA,MACzF,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,OAAA,EAAS,UAAU,CAAA;AAC1C,IAAA,OAAO,MAAM,cAAc,EAAE,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,SAAA,EAAW,UAAA,EAAY,OAAO,CAAC,CAAA;AAEnC,EAAA,OAAO,CAAC,KAAK,IAAI,CAAA;AACnB","file":"chunk-RXV2XUDZ.js","sourcesContent":["\"use client\"\n\nimport { useCallback, useEffect, useRef, useState } from \"react\"\n\n/**\n * Combines an interval timer with IntersectionObserver visibility detection.\n * The timer only runs when the component is visible in the viewport.\n * Returns [ref, tick] where ref should be attached to the container element,\n * and tick is a counter that increments on each interval.\n */\nexport function useAnimationTimer(intervalMs: number) {\n const ref = useRef<HTMLDivElement>(null)\n const [isVisible, setIsVisible] = useState(false)\n const [tick, setTick] = useState(0)\n\n useEffect(() => {\n const el = ref.current\n if (!el) return\n\n const observer = new IntersectionObserver(([entry]) => setIsVisible(entry.isIntersecting), {\n threshold: 0.1,\n })\n observer.observe(el)\n return () => observer.disconnect()\n }, [])\n\n const advance = useCallback(() => {\n setTick((t) => t + 1)\n }, [])\n\n useEffect(() => {\n if (!isVisible) return\n const id = setInterval(advance, intervalMs)\n return () => clearInterval(id)\n }, [isVisible, intervalMs, advance])\n\n return [ref, tick] as const\n}\n"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCycleIndex } from './chunk-6RWCZUAD.js';
|
|
3
|
+
import { cn } from './chunk-GZNLQE3I.js';
|
|
4
|
+
import { ShieldCheck, AlertTriangle } from 'lucide-react';
|
|
5
|
+
import { LazyMotion, domAnimation, m } from 'motion/react';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var RULES = [
|
|
9
|
+
{
|
|
10
|
+
id: "CR-001",
|
|
11
|
+
name: "High-value transfer flag",
|
|
12
|
+
condition: "IF amount > USD 50,000",
|
|
13
|
+
action: "THEN escalate to senior analyst",
|
|
14
|
+
status: "active",
|
|
15
|
+
triggers: "142 this month"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: "CR-007",
|
|
19
|
+
name: "Grey-list jurisdiction",
|
|
20
|
+
condition: "IF jurisdiction IN fatf_grey_list",
|
|
21
|
+
action: "THEN apply enhanced due diligence",
|
|
22
|
+
status: "triggered",
|
|
23
|
+
triggers: "28 this month"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: "CR-012",
|
|
27
|
+
name: "Repeat counterparty check",
|
|
28
|
+
condition: "IF counterparty_txns > 5 in 24h",
|
|
29
|
+
action: "THEN flag for velocity review",
|
|
30
|
+
status: "active",
|
|
31
|
+
triggers: "9 this month"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: "CR-019",
|
|
35
|
+
name: "New VASP verification",
|
|
36
|
+
condition: "IF counterparty.first_seen < 30d",
|
|
37
|
+
action: "THEN require manual VASP check",
|
|
38
|
+
status: "active",
|
|
39
|
+
triggers: "67 this month"
|
|
40
|
+
}
|
|
41
|
+
];
|
|
42
|
+
var statusStyle = {
|
|
43
|
+
active: { bg: "bg-emerald-50 text-emerald-700", label: "Active" },
|
|
44
|
+
triggered: { bg: "bg-amber-50 text-amber-700", label: "Triggered" },
|
|
45
|
+
paused: { bg: "bg-gray-100 text-gray-500", label: "Paused" }
|
|
46
|
+
};
|
|
47
|
+
function AnimationCustomRules({ className }) {
|
|
48
|
+
const [containerRef, activeIdx] = useCycleIndex(RULES.length, 3200);
|
|
49
|
+
return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("flex flex-col p-5", className), children: [
|
|
50
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
51
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
52
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-[15px] text-foreground", children: "Custom Rules" }),
|
|
53
|
+
/* @__PURE__ */ jsxs("p", { className: "text-[12px] text-gray-400", children: [
|
|
54
|
+
RULES.length,
|
|
55
|
+
" rules configured"
|
|
56
|
+
] })
|
|
57
|
+
] }),
|
|
58
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 rounded-full bg-emerald-50 px-2.5 py-1", children: [
|
|
59
|
+
/* @__PURE__ */ jsx(ShieldCheck, { className: "size-3 text-emerald-600" }),
|
|
60
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold text-[11px] text-emerald-700", children: "All active" })
|
|
61
|
+
] })
|
|
62
|
+
] }),
|
|
63
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4 space-y-2", children: RULES.map((rule, i) => {
|
|
64
|
+
const st = statusStyle[rule.status];
|
|
65
|
+
const isActive = i === activeIdx;
|
|
66
|
+
return /* @__PURE__ */ jsxs(
|
|
67
|
+
m.div,
|
|
68
|
+
{
|
|
69
|
+
animate: {
|
|
70
|
+
borderColor: isActive ? "#00D4FF" : "#f3f4f6",
|
|
71
|
+
boxShadow: isActive ? "0 0 0 1px rgba(0,212,255,0.15)" : "none"
|
|
72
|
+
},
|
|
73
|
+
transition: { duration: 0.3 },
|
|
74
|
+
className: "rounded-lg border bg-white px-3 py-2.5",
|
|
75
|
+
children: [
|
|
76
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
77
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
78
|
+
/* @__PURE__ */ jsx("span", { className: "font-bold font-mono text-[10px] text-gray-400", children: rule.id }),
|
|
79
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold text-[12px] text-gray-800", children: rule.name })
|
|
80
|
+
] }),
|
|
81
|
+
/* @__PURE__ */ jsx("span", { className: cn("rounded-full px-2 py-0.5 font-semibold text-[10px]", st.bg), children: st.label })
|
|
82
|
+
] }),
|
|
83
|
+
isActive && /* @__PURE__ */ jsxs(
|
|
84
|
+
m.div,
|
|
85
|
+
{
|
|
86
|
+
initial: { opacity: 0, height: 0 },
|
|
87
|
+
animate: { opacity: 1, height: "auto" },
|
|
88
|
+
transition: { duration: 0.25 },
|
|
89
|
+
className: "mt-2 space-y-1 border-gray-100 border-t pt-2",
|
|
90
|
+
children: [
|
|
91
|
+
/* @__PURE__ */ jsx("p", { className: "font-mono text-[#0099BB] text-[10px]", children: rule.condition }),
|
|
92
|
+
/* @__PURE__ */ jsx("p", { className: "font-mono text-[10px] text-gray-600", children: rule.action }),
|
|
93
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 pt-1", children: [
|
|
94
|
+
/* @__PURE__ */ jsx(AlertTriangle, { className: "size-2.5 text-gray-400" }),
|
|
95
|
+
/* @__PURE__ */ jsx("span", { className: "text-[10px] text-gray-400", children: rule.triggers })
|
|
96
|
+
] })
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
rule.id
|
|
103
|
+
);
|
|
104
|
+
}) })
|
|
105
|
+
] }) });
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export { AnimationCustomRules };
|
|
109
|
+
//# sourceMappingURL=chunk-RZZTDJHG.js.map
|
|
110
|
+
//# sourceMappingURL=chunk-RZZTDJHG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/animations/animation-custom-rules.tsx"],"names":[],"mappings":"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","file":"chunk-RZZTDJHG.js","sourcesContent":["\"use client\"\n\nimport { AlertTriangle, ShieldCheck } from \"lucide-react\"\nimport { domAnimation, LazyMotion, m } from \"motion/react\"\n\nimport { useCycleIndex } from \"../hooks/use-cycle-index\"\n\nimport { cn } from \"../lib/utils\"\n\ntype Rule = {\n id: string\n name: string\n condition: string\n action: string\n status: \"active\" | \"triggered\" | \"paused\"\n triggers: string\n}\n\nconst RULES: Rule[] = [\n {\n id: \"CR-001\",\n name: \"High-value transfer flag\",\n condition: \"IF amount > USD 50,000\",\n action: \"THEN escalate to senior analyst\",\n status: \"active\",\n triggers: \"142 this month\",\n },\n {\n id: \"CR-007\",\n name: \"Grey-list jurisdiction\",\n condition: \"IF jurisdiction IN fatf_grey_list\",\n action: \"THEN apply enhanced due diligence\",\n status: \"triggered\",\n triggers: \"28 this month\",\n },\n {\n id: \"CR-012\",\n name: \"Repeat counterparty check\",\n condition: \"IF counterparty_txns > 5 in 24h\",\n action: \"THEN flag for velocity review\",\n status: \"active\",\n triggers: \"9 this month\",\n },\n {\n id: \"CR-019\",\n name: \"New VASP verification\",\n condition: \"IF counterparty.first_seen < 30d\",\n action: \"THEN require manual VASP check\",\n status: \"active\",\n triggers: \"67 this month\",\n },\n]\n\nconst statusStyle: Record<Rule[\"status\"], { bg: string; label: string }> = {\n active: { bg: \"bg-emerald-50 text-emerald-700\", label: \"Active\" },\n triggered: { bg: \"bg-amber-50 text-amber-700\", label: \"Triggered\" },\n paused: { bg: \"bg-gray-100 text-gray-500\", label: \"Paused\" },\n}\n\nexport default function AnimationCustomRules({ className }: { className?: string }) {\n const [containerRef, activeIdx] = useCycleIndex(RULES.length, 3200)\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-foreground\">Custom Rules</p>\n <p className=\"text-[12px] text-gray-400\">{RULES.length} rules configured</p>\n </div>\n <div className=\"flex items-center gap-1.5 rounded-full bg-emerald-50 px-2.5 py-1\">\n <ShieldCheck className=\"size-3 text-emerald-600\" />\n <span className=\"font-semibold text-[11px] text-emerald-700\">All active</span>\n </div>\n </div>\n\n {/* Rule list */}\n <div className=\"mt-4 space-y-2\">\n {RULES.map((rule, i) => {\n const st = statusStyle[rule.status]\n const isActive = i === activeIdx\n return (\n <m.div\n key={rule.id}\n animate={{\n borderColor: isActive ? \"#00D4FF\" : \"#f3f4f6\",\n boxShadow: isActive ? \"0 0 0 1px rgba(0,212,255,0.15)\" : \"none\",\n }}\n transition={{ duration: 0.3 }}\n className=\"rounded-lg border bg-white px-3 py-2.5\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-bold font-mono text-[10px] text-gray-400\">{rule.id}</span>\n <span className=\"font-semibold text-[12px] text-gray-800\">{rule.name}</span>\n </div>\n <span className={cn(\"rounded-full px-2 py-0.5 font-semibold text-[10px]\", st.bg)}>\n {st.label}\n </span>\n </div>\n\n {isActive && (\n <m.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n transition={{ duration: 0.25 }}\n className=\"mt-2 space-y-1 border-gray-100 border-t pt-2\"\n >\n <p className=\"font-mono text-[#0099BB] text-[10px]\">{rule.condition}</p>\n <p className=\"font-mono text-[10px] text-gray-600\">{rule.action}</p>\n <div className=\"flex items-center gap-1 pt-1\">\n <AlertTriangle className=\"size-2.5 text-gray-400\" />\n <span className=\"text-[10px] text-gray-400\">{rule.triggers}</span>\n </div>\n </m.div>\n )}\n </m.div>\n )\n })}\n </div>\n </div>\n </LazyMotion>\n )\n}\n"]}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from './chunk-GZNLQE3I.js';
|
|
3
|
+
import { FileText, AlertTriangle, CheckCircle2, ChevronRight } from 'lucide-react';
|
|
4
|
+
import { LazyMotion, domAnimation, m } from 'motion/react';
|
|
5
|
+
import { memo, useRef, useEffect, useState } from 'react';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var AUDIT_SEQUENCES = [
|
|
9
|
+
[
|
|
10
|
+
{
|
|
11
|
+
timestamp: "14:32:01",
|
|
12
|
+
text: "Transfer TXN-0847 received \u2014 compliance check initiated",
|
|
13
|
+
type: "log"
|
|
14
|
+
},
|
|
15
|
+
{ timestamp: "14:32:02", text: "SOP AML/CFT Policy v3.2 applied", type: "log" },
|
|
16
|
+
{
|
|
17
|
+
timestamp: "14:32:03",
|
|
18
|
+
text: "Travel Rule verification \u2014 VASP identity confirmed",
|
|
19
|
+
type: "success"
|
|
20
|
+
},
|
|
21
|
+
{ timestamp: "14:32:04", text: "Sanctions screening \u2014 12,847 entries checked", type: "log" },
|
|
22
|
+
{
|
|
23
|
+
timestamp: "14:32:05",
|
|
24
|
+
text: "No sanctions matches found \u2014 OFAC, EU, UN clear",
|
|
25
|
+
type: "success"
|
|
26
|
+
},
|
|
27
|
+
{ timestamp: "14:32:06", text: "PEP screening \u2014 2 beneficial owners cleared", type: "success" },
|
|
28
|
+
{ timestamp: "14:32:07", text: "Risk score calculated: 18/100 \u2014 Low", type: "success" },
|
|
29
|
+
{ timestamp: "14:32:08", text: "Decision: APPROVED \u2014 all checks passed", type: "success" },
|
|
30
|
+
{
|
|
31
|
+
timestamp: "14:32:08",
|
|
32
|
+
text: "Compliance report generated \u2014 ref CR-2024-0847",
|
|
33
|
+
type: "report"
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
[
|
|
37
|
+
{
|
|
38
|
+
timestamp: "14:33:12",
|
|
39
|
+
text: "Transfer TXN-0846 received \u2014 compliance check initiated",
|
|
40
|
+
type: "log"
|
|
41
|
+
},
|
|
42
|
+
{ timestamp: "14:33:13", text: "SOP Enhanced Due Diligence v2.1 applied", type: "log" },
|
|
43
|
+
{
|
|
44
|
+
timestamp: "14:33:14",
|
|
45
|
+
text: "Travel Rule verification \u2014 counterparty VASP verified",
|
|
46
|
+
type: "success"
|
|
47
|
+
},
|
|
48
|
+
{ timestamp: "14:33:15", text: "High-risk corridor detected (HK \u2192 GB)", type: "warning" },
|
|
49
|
+
{
|
|
50
|
+
timestamp: "14:33:16",
|
|
51
|
+
text: "Enhanced due diligence triggered \u2014 FATF grey list",
|
|
52
|
+
type: "warning"
|
|
53
|
+
},
|
|
54
|
+
{ timestamp: "14:33:17", text: "Amount exceeds USD 100K threshold", type: "warning" },
|
|
55
|
+
{ timestamp: "14:33:18", text: "Risk score calculated: 72/100 \u2014 High", type: "warning" },
|
|
56
|
+
{ timestamp: "14:33:19", text: "Decision: FLAGGED \u2014 manual review required", type: "warning" },
|
|
57
|
+
{
|
|
58
|
+
timestamp: "14:33:19",
|
|
59
|
+
text: "Escalation report generated \u2014 ref ESC-2024-0846",
|
|
60
|
+
type: "report"
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
[
|
|
64
|
+
{
|
|
65
|
+
timestamp: "14:34:05",
|
|
66
|
+
text: "Transfer TXN-0845 received \u2014 compliance check initiated",
|
|
67
|
+
type: "log"
|
|
68
|
+
},
|
|
69
|
+
{ timestamp: "14:34:06", text: "SOP MiCA Compliance v1.4 applied", type: "log" },
|
|
70
|
+
{
|
|
71
|
+
timestamp: "14:34:07",
|
|
72
|
+
text: "Travel Rule verification \u2014 both VASPs registered",
|
|
73
|
+
type: "success"
|
|
74
|
+
},
|
|
75
|
+
{ timestamp: "14:34:08", text: "AE\u2192NL corridor approved \u2014 MiCA compliant", type: "success" },
|
|
76
|
+
{ timestamp: "14:34:09", text: "Sanctions screening \u2014 9,234 entries checked", type: "log" },
|
|
77
|
+
{ timestamp: "14:34:10", text: "All sanctions lists clear", type: "success" },
|
|
78
|
+
{ timestamp: "14:34:11", text: "Below EUR 10K threshold \u2014 no STR required", type: "success" },
|
|
79
|
+
{ timestamp: "14:34:12", text: "Risk score calculated: 12/100 \u2014 Low", type: "success" },
|
|
80
|
+
{
|
|
81
|
+
timestamp: "14:34:12",
|
|
82
|
+
text: "Compliance report generated \u2014 ref CR-2024-0845",
|
|
83
|
+
type: "report"
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
];
|
|
87
|
+
var ENTRY_DELAY = 450;
|
|
88
|
+
var iconMap = {
|
|
89
|
+
log: ChevronRight,
|
|
90
|
+
success: CheckCircle2,
|
|
91
|
+
warning: AlertTriangle,
|
|
92
|
+
report: FileText
|
|
93
|
+
};
|
|
94
|
+
var colorMap = {
|
|
95
|
+
log: "text-foreground/80",
|
|
96
|
+
success: "text-emerald-600",
|
|
97
|
+
warning: "text-amber-600",
|
|
98
|
+
report: "text-violet-600"
|
|
99
|
+
};
|
|
100
|
+
var TypeWriter = memo(function TypeWriter2({ text }) {
|
|
101
|
+
const spanRef = useRef(null);
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
const el = spanRef.current;
|
|
104
|
+
if (!el) return;
|
|
105
|
+
let count = 0;
|
|
106
|
+
let raf;
|
|
107
|
+
function tick() {
|
|
108
|
+
count = Math.min(count + 3, text.length);
|
|
109
|
+
el.textContent = count < text.length ? `${text.slice(0, count)}\u258C` : text;
|
|
110
|
+
if (count < text.length) raf = requestAnimationFrame(tick);
|
|
111
|
+
}
|
|
112
|
+
raf = requestAnimationFrame(tick);
|
|
113
|
+
return () => cancelAnimationFrame(raf);
|
|
114
|
+
}, [text]);
|
|
115
|
+
return /* @__PURE__ */ jsx("span", { ref: spanRef });
|
|
116
|
+
});
|
|
117
|
+
function AnimationAuditTrail({ className }) {
|
|
118
|
+
const [seqIndex, setSeqIndex] = useState(0);
|
|
119
|
+
const [visibleEntries, setVisibleEntries] = useState([]);
|
|
120
|
+
const [entryCount, setEntryCount] = useState(0);
|
|
121
|
+
const scrollRef = useRef(null);
|
|
122
|
+
const timeoutRef = useRef(null);
|
|
123
|
+
const sequence = AUDIT_SEQUENCES[seqIndex];
|
|
124
|
+
useEffect(() => {
|
|
125
|
+
const el = scrollRef.current;
|
|
126
|
+
if (!el) return;
|
|
127
|
+
requestAnimationFrame(() => {
|
|
128
|
+
el.scrollTop = el.scrollHeight;
|
|
129
|
+
});
|
|
130
|
+
}, []);
|
|
131
|
+
useEffect(() => {
|
|
132
|
+
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
|
133
|
+
setVisibleEntries([]);
|
|
134
|
+
setEntryCount(0);
|
|
135
|
+
const seq = AUDIT_SEQUENCES[seqIndex];
|
|
136
|
+
function streamEntry(idx) {
|
|
137
|
+
if (idx >= seq.length) {
|
|
138
|
+
timeoutRef.current = setTimeout(() => {
|
|
139
|
+
setSeqIndex((prev) => (prev + 1) % AUDIT_SEQUENCES.length);
|
|
140
|
+
}, 2e3);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
timeoutRef.current = setTimeout(() => {
|
|
144
|
+
setVisibleEntries((prev) => [...prev, seq[idx]]);
|
|
145
|
+
setEntryCount((c) => c + 1);
|
|
146
|
+
streamEntry(idx + 1);
|
|
147
|
+
}, ENTRY_DELAY);
|
|
148
|
+
}
|
|
149
|
+
const start = setTimeout(() => streamEntry(0), 300);
|
|
150
|
+
return () => {
|
|
151
|
+
clearTimeout(start);
|
|
152
|
+
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
|
153
|
+
};
|
|
154
|
+
}, [seqIndex]);
|
|
155
|
+
return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col", className), children: [
|
|
156
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-gray-100 border-b bg-gray-50/80 px-3 py-1.5", children: [
|
|
157
|
+
/* @__PURE__ */ jsxs("span", { className: "relative flex size-1.5", children: [
|
|
158
|
+
/* @__PURE__ */ jsx("span", { className: "absolute inline-flex size-full animate-ping rounded-full bg-emerald-400 opacity-75" }),
|
|
159
|
+
/* @__PURE__ */ jsx("span", { className: "relative inline-flex size-1.5 rounded-full bg-emerald-500" })
|
|
160
|
+
] }),
|
|
161
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold text-[10px] text-gray-700", children: "Audit Log" }),
|
|
162
|
+
/* @__PURE__ */ jsxs("span", { className: "ml-auto font-mono text-[10px] text-gray-400", children: [
|
|
163
|
+
entryCount,
|
|
164
|
+
" entries"
|
|
165
|
+
] })
|
|
166
|
+
] }),
|
|
167
|
+
/* @__PURE__ */ jsx("div", { ref: scrollRef, className: "scrollbar-none flex-1 overflow-y-auto px-3 py-2", children: /* @__PURE__ */ jsxs("div", { className: "space-y-0.5", children: [
|
|
168
|
+
visibleEntries.map((entry, i) => {
|
|
169
|
+
const Icon = iconMap[entry.type];
|
|
170
|
+
return /* @__PURE__ */ jsxs(
|
|
171
|
+
m.div,
|
|
172
|
+
{
|
|
173
|
+
initial: { opacity: 0, y: 4 },
|
|
174
|
+
animate: { opacity: 1, y: 0 },
|
|
175
|
+
transition: { duration: 0.25, ease: "easeOut" },
|
|
176
|
+
className: "flex items-start gap-1.5 font-mono text-[10px] leading-relaxed",
|
|
177
|
+
children: [
|
|
178
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 text-foreground", children: entry.timestamp }),
|
|
179
|
+
/* @__PURE__ */ jsx(Icon, { className: cn("mt-0.5 size-2.5 shrink-0", colorMap[entry.type]) }),
|
|
180
|
+
/* @__PURE__ */ jsx("span", { className: cn(colorMap[entry.type]), children: /* @__PURE__ */ jsx(TypeWriter, { text: entry.text }) })
|
|
181
|
+
]
|
|
182
|
+
},
|
|
183
|
+
`${seqIndex}-${i}`
|
|
184
|
+
);
|
|
185
|
+
}),
|
|
186
|
+
visibleEntries.length < sequence.length && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 font-mono text-[10px] text-gray-300", children: [
|
|
187
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 text-transparent", children: "00:00:00" }),
|
|
188
|
+
/* @__PURE__ */ jsx(ChevronRight, { className: "size-2.5 shrink-0" }),
|
|
189
|
+
/* @__PURE__ */ jsx("span", { className: "animate-pulse", children: "\u258C" })
|
|
190
|
+
] })
|
|
191
|
+
] }) })
|
|
192
|
+
] }) });
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export { AnimationAuditTrail };
|
|
196
|
+
//# sourceMappingURL=chunk-SNOJLZP4.js.map
|
|
197
|
+
//# sourceMappingURL=chunk-SNOJLZP4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/animations/animation-audit-trail.tsx"],"names":["TypeWriter"],"mappings":"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","file":"chunk-SNOJLZP4.js","sourcesContent":["\"use client\"\n\nimport { AlertTriangle, CheckCircle2, ChevronRight, FileText } from \"lucide-react\"\nimport { domAnimation, LazyMotion, m } from \"motion/react\"\nimport { memo, useEffect, useRef, useState } from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\ntype EntryType = \"log\" | \"success\" | \"warning\" | \"report\"\n\ninterface AuditEntry {\n timestamp: string\n text: string\n type: EntryType\n}\n\nconst AUDIT_SEQUENCES: AuditEntry[][] = [\n [\n {\n timestamp: \"14:32:01\",\n text: \"Transfer TXN-0847 received — compliance check initiated\",\n type: \"log\",\n },\n { timestamp: \"14:32:02\", text: \"SOP AML/CFT Policy v3.2 applied\", type: \"log\" },\n {\n timestamp: \"14:32:03\",\n text: \"Travel Rule verification — VASP identity confirmed\",\n type: \"success\",\n },\n { timestamp: \"14:32:04\", text: \"Sanctions screening — 12,847 entries checked\", type: \"log\" },\n {\n timestamp: \"14:32:05\",\n text: \"No sanctions matches found — OFAC, EU, UN clear\",\n type: \"success\",\n },\n { timestamp: \"14:32:06\", text: \"PEP screening — 2 beneficial owners cleared\", type: \"success\" },\n { timestamp: \"14:32:07\", text: \"Risk score calculated: 18/100 — Low\", type: \"success\" },\n { timestamp: \"14:32:08\", text: \"Decision: APPROVED — all checks passed\", type: \"success\" },\n {\n timestamp: \"14:32:08\",\n text: \"Compliance report generated — ref CR-2024-0847\",\n type: \"report\",\n },\n ],\n [\n {\n timestamp: \"14:33:12\",\n text: \"Transfer TXN-0846 received — compliance check initiated\",\n type: \"log\",\n },\n { timestamp: \"14:33:13\", text: \"SOP Enhanced Due Diligence v2.1 applied\", type: \"log\" },\n {\n timestamp: \"14:33:14\",\n text: \"Travel Rule verification — counterparty VASP verified\",\n type: \"success\",\n },\n { timestamp: \"14:33:15\", text: \"High-risk corridor detected (HK → GB)\", type: \"warning\" },\n {\n timestamp: \"14:33:16\",\n text: \"Enhanced due diligence triggered — FATF grey list\",\n type: \"warning\",\n },\n { timestamp: \"14:33:17\", text: \"Amount exceeds USD 100K threshold\", type: \"warning\" },\n { timestamp: \"14:33:18\", text: \"Risk score calculated: 72/100 — High\", type: \"warning\" },\n { timestamp: \"14:33:19\", text: \"Decision: FLAGGED — manual review required\", type: \"warning\" },\n {\n timestamp: \"14:33:19\",\n text: \"Escalation report generated — ref ESC-2024-0846\",\n type: \"report\",\n },\n ],\n [\n {\n timestamp: \"14:34:05\",\n text: \"Transfer TXN-0845 received — compliance check initiated\",\n type: \"log\",\n },\n { timestamp: \"14:34:06\", text: \"SOP MiCA Compliance v1.4 applied\", type: \"log\" },\n {\n timestamp: \"14:34:07\",\n text: \"Travel Rule verification — both VASPs registered\",\n type: \"success\",\n },\n { timestamp: \"14:34:08\", text: \"AE→NL corridor approved — MiCA compliant\", type: \"success\" },\n { timestamp: \"14:34:09\", text: \"Sanctions screening — 9,234 entries checked\", type: \"log\" },\n { timestamp: \"14:34:10\", text: \"All sanctions lists clear\", type: \"success\" },\n { timestamp: \"14:34:11\", text: \"Below EUR 10K threshold — no STR required\", type: \"success\" },\n { timestamp: \"14:34:12\", text: \"Risk score calculated: 12/100 — Low\", type: \"success\" },\n {\n timestamp: \"14:34:12\",\n text: \"Compliance report generated — ref CR-2024-0845\",\n type: \"report\",\n },\n ],\n]\n\nconst ENTRY_DELAY = 450\n\nconst iconMap: Record<EntryType, typeof CheckCircle2> = {\n log: ChevronRight,\n success: CheckCircle2,\n warning: AlertTriangle,\n report: FileText,\n}\n\nconst colorMap: Record<EntryType, string> = {\n log: \"text-foreground/80\",\n success: \"text-emerald-600\",\n warning: \"text-amber-600\",\n report: \"text-violet-600\",\n}\n\nconst TypeWriter = memo(function TypeWriter({ text }: { text: string }) {\n const spanRef = useRef<HTMLSpanElement>(null)\n\n useEffect(() => {\n const el = spanRef.current\n if (!el) return\n let count = 0\n let raf: number\n\n function tick() {\n count = Math.min(count + 3, text.length)\n el!.textContent = count < text.length ? `${text.slice(0, count)}▌` : text\n if (count < text.length) raf = requestAnimationFrame(tick)\n }\n\n raf = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(raf)\n }, [text])\n\n return <span ref={spanRef} />\n})\n\nexport default function AnimationAuditTrail({ className }: { className?: string }) {\n const [seqIndex, setSeqIndex] = useState(0)\n const [visibleEntries, setVisibleEntries] = useState<AuditEntry[]>([])\n const [entryCount, setEntryCount] = useState(0)\n const scrollRef = useRef<HTMLDivElement>(null)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const sequence = AUDIT_SEQUENCES[seqIndex]\n\n // Auto-scroll (deferred to avoid layout thrashing)\n useEffect(() => {\n const el = scrollRef.current\n if (!el) return\n requestAnimationFrame(() => {\n el.scrollTop = el.scrollHeight\n })\n }, [])\n\n useEffect(() => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n\n // Clear immediately so stale entries don't flash with new keys\n setVisibleEntries([])\n setEntryCount(0)\n\n const seq = AUDIT_SEQUENCES[seqIndex]\n\n function streamEntry(idx: number) {\n if (idx >= seq.length) {\n timeoutRef.current = setTimeout(() => {\n setSeqIndex((prev) => (prev + 1) % AUDIT_SEQUENCES.length)\n }, 2000)\n return\n }\n\n timeoutRef.current = setTimeout(() => {\n setVisibleEntries((prev) => [...prev, seq[idx]])\n setEntryCount((c) => c + 1)\n streamEntry(idx + 1)\n }, ENTRY_DELAY)\n }\n\n const start = setTimeout(() => streamEntry(0), 300)\n return () => {\n clearTimeout(start)\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n }\n }, [seqIndex])\n\n return (\n <LazyMotion features={domAnimation}>\n <div className={cn(\"flex flex-col\", className)}>\n {/* Mini header */}\n <div className=\"flex items-center gap-2 border-gray-100 border-b bg-gray-50/80 px-3 py-1.5\">\n <span className=\"relative flex size-1.5\">\n <span className=\"absolute inline-flex size-full animate-ping rounded-full bg-emerald-400 opacity-75\" />\n <span className=\"relative inline-flex size-1.5 rounded-full bg-emerald-500\" />\n </span>\n <span className=\"font-semibold text-[10px] text-gray-700\">Audit Log</span>\n <span className=\"ml-auto font-mono text-[10px] text-gray-400\">{entryCount} entries</span>\n </div>\n\n {/* Log entries */}\n <div ref={scrollRef} className=\"scrollbar-none flex-1 overflow-y-auto px-3 py-2\">\n <div className=\"space-y-0.5\">\n {visibleEntries.map((entry, i) => {\n const Icon = iconMap[entry.type]\n return (\n <m.div\n key={`${seqIndex}-${i}`}\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.25, ease: \"easeOut\" }}\n className=\"flex items-start gap-1.5 font-mono text-[10px] leading-relaxed\"\n >\n <span className=\"shrink-0 text-foreground\">{entry.timestamp}</span>\n <Icon className={cn(\"mt-0.5 size-2.5 shrink-0\", colorMap[entry.type])} />\n <span className={cn(colorMap[entry.type])}>\n <TypeWriter text={entry.text} />\n </span>\n </m.div>\n )\n })}\n {visibleEntries.length < sequence.length && (\n <div className=\"flex items-center gap-1.5 font-mono text-[10px] text-gray-300\">\n <span className=\"shrink-0 text-transparent\">00:00:00</span>\n <ChevronRight className=\"size-2.5 shrink-0\" />\n <span className=\"animate-pulse\">▌</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </LazyMotion>\n )\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
// src/lib/animation.ts
|
|
3
|
+
var EASE_OUT = [0.22, 0.61, 0.36, 1];
|
|
4
|
+
var VIEWPORT_ONCE = { once: true, margin: "-80px" };
|
|
5
|
+
var FADE_UP = {
|
|
6
|
+
initial: { opacity: 0, y: 24 },
|
|
7
|
+
whileInView: { opacity: 1, y: 0 },
|
|
8
|
+
viewport: VIEWPORT_ONCE,
|
|
9
|
+
transition: { duration: 0.5, ease: EASE_OUT }
|
|
10
|
+
};
|
|
11
|
+
var TRANSITION_DEFAULT = { duration: 0.5, ease: EASE_OUT };
|
|
12
|
+
var TRANSITION_FAST = { duration: 0.35, ease: EASE_OUT };
|
|
13
|
+
var STAGGER_CHILDREN = {
|
|
14
|
+
hidden: {},
|
|
15
|
+
visible: { transition: { staggerChildren: 0.1 } }
|
|
16
|
+
};
|
|
17
|
+
var SLIDE_UP_VARIANT = {
|
|
18
|
+
hidden: { opacity: 0, y: 24 },
|
|
19
|
+
visible: { opacity: 1, y: 0, transition: { duration: 0.5, ease: EASE_OUT } }
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { EASE_OUT, FADE_UP, SLIDE_UP_VARIANT, STAGGER_CHILDREN, TRANSITION_DEFAULT, TRANSITION_FAST, VIEWPORT_ONCE };
|
|
23
|
+
//# sourceMappingURL=chunk-TAPJEVUA.js.map
|
|
24
|
+
//# sourceMappingURL=chunk-TAPJEVUA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/animation.ts"],"names":[],"mappings":";AAGO,IAAM,QAAA,GAA6C,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,CAAC;AAGvE,IAAM,aAAA,GAAgB,EAAE,IAAA,EAAM,IAAA,EAAM,QAAQ,OAAA;AAG5C,IAAM,OAAA,GAAU;AAAA,EACrB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,EAC7B,WAAA,EAAa,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EAChC,QAAA,EAAU,aAAA;AAAA,EACV,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,MAAM,QAAA;AACrC;AAGO,IAAM,kBAAA,GAAqB,EAAE,QAAA,EAAU,GAAA,EAAK,MAAM,QAAA;AAGlD,IAAM,eAAA,GAAkB,EAAE,QAAA,EAAU,IAAA,EAAM,MAAM,QAAA;AAGhD,IAAM,gBAAA,GAAmB;AAAA,EAC9B,QAAQ,EAAC;AAAA,EACT,SAAS,EAAE,UAAA,EAAY,EAAE,eAAA,EAAiB,KAAI;AAChD;AAGO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,MAAA,EAAQ,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,EAC5B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAM,QAAA,EAAS;AAC3E","file":"chunk-TAPJEVUA.js","sourcesContent":["/** Shared animation constants — keeps motion usage consistent across projects. */\n\n/** Standard ease curve used for all fade/slide transitions. */\nexport const EASE_OUT: [number, number, number, number] = [0.22, 0.61, 0.36, 1]\n\n/** Default whileInView viewport config. */\nexport const VIEWPORT_ONCE = { once: true, margin: \"-80px\" } as const\n\n/** Standard fade-up transition (matches CSS @keyframes fade-up). */\nexport const FADE_UP = {\n initial: { opacity: 0, y: 24 },\n whileInView: { opacity: 1, y: 0 },\n viewport: VIEWPORT_ONCE,\n transition: { duration: 0.5, ease: EASE_OUT },\n} as const\n\n/** Default transition timing. */\nexport const TRANSITION_DEFAULT = { duration: 0.5, ease: EASE_OUT } as const\n\n/** Faster transition for micro-interactions. */\nexport const TRANSITION_FAST = { duration: 0.35, ease: EASE_OUT } as const\n\n/** Stagger children container variant (use with motion variants API). */\nexport const STAGGER_CHILDREN = {\n hidden: {},\n visible: { transition: { staggerChildren: 0.1 } },\n} as const\n\n/** Individual item variant for use inside stagger containers. */\nexport const SLIDE_UP_VARIANT = {\n hidden: { opacity: 0, y: 24 },\n visible: { opacity: 1, y: 0, transition: { duration: 0.5, ease: EASE_OUT } },\n} as const\n"]}
|