@cogentic-co/ds 0.5.5 → 0.6.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.
Files changed (101) hide show
  1. package/dist/animations/animation-ai-analysis.js +99 -4
  2. package/dist/animations/animation-ai-analysis.js.map +1 -1
  3. package/dist/animations/animation-audit-trail.js +194 -2
  4. package/dist/animations/animation-audit-trail.js.map +1 -1
  5. package/dist/animations/animation-compliance-reports.js +108 -3
  6. package/dist/animations/animation-compliance-reports.js.map +1 -1
  7. package/dist/animations/animation-custom-rules.js +107 -3
  8. package/dist/animations/animation-custom-rules.js.map +1 -1
  9. package/dist/animations/animation-jira-ticket.js +114 -3
  10. package/dist/animations/animation-jira-ticket.js.map +1 -1
  11. package/dist/animations/animation-jurisdiction-detection.js +122 -3
  12. package/dist/animations/animation-jurisdiction-detection.js.map +1 -1
  13. package/dist/animations/animation-multi-protocol.js +63 -2
  14. package/dist/animations/animation-multi-protocol.js.map +1 -1
  15. package/dist/animations/animation-pricing-preview.js +169 -3
  16. package/dist/animations/animation-pricing-preview.js.map +1 -1
  17. package/dist/animations/animation-realtime-updates.js +140 -4
  18. package/dist/animations/animation-realtime-updates.js.map +1 -1
  19. package/dist/animations/animation-rest-api.js +121 -2
  20. package/dist/animations/animation-rest-api.js.map +1 -1
  21. package/dist/animations/animation-risk-scoring.js +158 -4
  22. package/dist/animations/animation-risk-scoring.js.map +1 -1
  23. package/dist/animations/animation-sandbox.js +107 -2
  24. package/dist/animations/animation-sandbox.js.map +1 -1
  25. package/dist/animations/animation-scheduled-reports.js +107 -3
  26. package/dist/animations/animation-scheduled-reports.js.map +1 -1
  27. package/dist/animations/animation-secure-messaging.js +99 -3
  28. package/dist/animations/animation-secure-messaging.js.map +1 -1
  29. package/dist/animations/animation-slack-notification.js +90 -3
  30. package/dist/animations/animation-slack-notification.js.map +1 -1
  31. package/dist/animations/animation-sop-mapping.js +158 -2
  32. package/dist/animations/animation-sop-mapping.js.map +1 -1
  33. package/dist/animations/animation-team-routing.js +118 -4
  34. package/dist/animations/animation-team-routing.js.map +1 -1
  35. package/dist/animations/animation-teams-notification.js +89 -3
  36. package/dist/animations/animation-teams-notification.js.map +1 -1
  37. package/dist/animations/animation-vasp-identification.js +142 -3
  38. package/dist/animations/animation-vasp-identification.js.map +1 -1
  39. package/dist/animations/animation-webhooks.js +105 -3
  40. package/dist/animations/animation-webhooks.js.map +1 -1
  41. package/dist/blocks/auth-form.js +0 -1
  42. package/dist/blocks/feature-section.js +0 -1
  43. package/dist/blocks/hero-section.js +0 -1
  44. package/dist/blocks/pricing-table.js +0 -1
  45. package/dist/blocks/stat-card.js +0 -1
  46. package/dist/chart-DkwdRX-i.d.ts +50 -0
  47. package/dist/charts.d.ts +73 -3
  48. package/dist/charts.js +287 -2
  49. package/dist/charts.js.map +1 -1
  50. package/dist/chunk-6RWCZUAD.js +0 -1
  51. package/dist/chunk-GJAWCIGE.js +237 -0
  52. package/dist/chunk-GJAWCIGE.js.map +1 -0
  53. package/dist/chunk-GZNLQE3I.js +0 -1
  54. package/dist/chunk-TAPJEVUA.js +0 -1
  55. package/dist/index.d.ts +39 -53
  56. package/dist/index.js +148 -175
  57. package/dist/index.js.map +1 -1
  58. package/package.json +24 -34
  59. package/dist/chunk-4YD3YS4B.js +0 -110
  60. package/dist/chunk-4YD3YS4B.js.map +0 -1
  61. package/dist/chunk-5JLZ42JT.js +0 -125
  62. package/dist/chunk-5JLZ42JT.js.map +0 -1
  63. package/dist/chunk-5OOO6TRA.js +0 -111
  64. package/dist/chunk-5OOO6TRA.js.map +0 -1
  65. package/dist/chunk-65Z2VEKG.js +0 -161
  66. package/dist/chunk-65Z2VEKG.js.map +0 -1
  67. package/dist/chunk-BTFYV3TI.js +0 -102
  68. package/dist/chunk-BTFYV3TI.js.map +0 -1
  69. package/dist/chunk-BTZB4JRC.js +0 -117
  70. package/dist/chunk-BTZB4JRC.js.map +0 -1
  71. package/dist/chunk-BZSA47MS.js +0 -121
  72. package/dist/chunk-BZSA47MS.js.map +0 -1
  73. package/dist/chunk-EFLWU2JP.js +0 -145
  74. package/dist/chunk-EFLWU2JP.js.map +0 -1
  75. package/dist/chunk-F7REPQOA.js +0 -93
  76. package/dist/chunk-F7REPQOA.js.map +0 -1
  77. package/dist/chunk-FKPK3CB7.js +0 -143
  78. package/dist/chunk-FKPK3CB7.js.map +0 -1
  79. package/dist/chunk-H7VUIMEL.js +0 -172
  80. package/dist/chunk-H7VUIMEL.js.map +0 -1
  81. package/dist/chunk-HTYR73ON.js +0 -161
  82. package/dist/chunk-HTYR73ON.js.map +0 -1
  83. package/dist/chunk-I26ZXVSY.js +0 -124
  84. package/dist/chunk-I26ZXVSY.js.map +0 -1
  85. package/dist/chunk-IKATDPHG.js +0 -92
  86. package/dist/chunk-IKATDPHG.js.map +0 -1
  87. package/dist/chunk-KUOF3XRZ.js +0 -108
  88. package/dist/chunk-KUOF3XRZ.js.map +0 -1
  89. package/dist/chunk-N7PBUY7G.js +0 -110
  90. package/dist/chunk-N7PBUY7G.js.map +0 -1
  91. package/dist/chunk-NAPDFVBI.js +0 -102
  92. package/dist/chunk-NAPDFVBI.js.map +0 -1
  93. package/dist/chunk-RTK7R4KZ.js +0 -66
  94. package/dist/chunk-RTK7R4KZ.js.map +0 -1
  95. package/dist/chunk-RZZTDJHG.js +0 -110
  96. package/dist/chunk-RZZTDJHG.js.map +0 -1
  97. package/dist/chunk-SNOJLZP4.js +0 -197
  98. package/dist/chunk-SNOJLZP4.js.map +0 -1
  99. package/dist/chunk-U4EPKN7G.js +0 -518
  100. package/dist/chunk-U4EPKN7G.js.map +0 -1
  101. package/dist/index-CcPuHWa-.d.ts +0 -118
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/animations/animation-pricing-preview.tsx"],"names":[],"mappings":"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","file":"chunk-H7VUIMEL.js","sourcesContent":["\"use client\"\n\nimport { CheckCircle2 } from \"lucide-react\"\nimport { AnimatePresence, domAnimation, LazyMotion, m } from \"motion/react\"\nimport { useMemo } from \"react\"\n\nimport { useCycleIndex } from \"../hooks/use-cycle-index\"\n\nimport { cn } from \"../lib/utils\"\n\ninterface Plan {\n name: string\n features: string[]\n ctaLabel: string\n highlight?: boolean\n monthlyPrice?: string\n annualPrice?: string\n}\n\nconst DEFAULT_PLANS: Plan[] = [\n {\n name: \"Starter\",\n features: [\"50 transfers/mo\", \"5 jurisdictions\", \"Audit trail\"],\n ctaLabel: \"Get started\",\n highlight: false,\n },\n {\n name: \"Growth\",\n monthlyPrice: \"$499\",\n annualPrice: \"$399\",\n features: [\"1,000 transfers/mo\", \"25 jurisdictions\", \"AI investigation\"],\n ctaLabel: \"Start trial\",\n highlight: true,\n },\n {\n name: \"Enterprise\",\n features: [\"Unlimited transfers\", \"45+ jurisdictions\", \"Custom workflows\"],\n ctaLabel: \"Talk to sales\",\n highlight: false,\n },\n]\n\nconst MAX_FEATURES = 3\nconst CYCLE_MS = 4000\n\nexport default function AnimationPricingPreview({\n className,\n plans,\n}: {\n className?: string\n plans?: Plan[]\n}) {\n const [containerRef, cycleIndex] = useCycleIndex(2, CYCLE_MS)\n const yearly = cycleIndex === 0\n\n // Use CMS plans if provided (pick first 3), otherwise defaults\n const items = useMemo(() => {\n if (!plans?.length) return DEFAULT_PLANS\n return plans.slice(0, 3).map((p) => ({\n ...p,\n features: p.features.slice(0, MAX_FEATURES),\n }))\n }, [plans])\n\n return (\n <LazyMotion features={domAnimation}>\n <div\n ref={containerRef}\n className={cn(\"flex flex-col items-center justify-center p-5\", className)}\n >\n {/* Toggle */}\n <div className=\"flex items-center gap-3\">\n <span\n className={cn(\n \"font-semibold text-[11px] transition-colors\",\n !yearly ? \"text-gray-900\" : \"text-gray-400\",\n )}\n >\n Monthly\n </span>\n <span\n className=\"relative h-5 w-9 rounded-full bg-gray-900 transition-colors\"\n aria-label=\"Toggle billing\"\n >\n <m.div\n className=\"absolute top-0.5 size-4 rounded-full bg-white\"\n animate={{ left: yearly ? 18 : 2 }}\n transition={{ type: \"spring\", stiffness: 500, damping: 30 }}\n />\n </span>\n <span\n className={cn(\n \"font-semibold text-[11px] transition-colors\",\n yearly ? \"text-gray-900\" : \"text-gray-400\",\n )}\n >\n Yearly\n </span>\n </div>\n\n {/* Cards */}\n <div className=\"-mx-[70px] mt-4 flex w-[calc(100%+140px)] gap-2.5 sm:mx-0 sm:w-full\">\n {items.map((plan, i) => {\n const rawPrice = yearly ? plan.annualPrice : plan.monthlyPrice\n const price = rawPrice || (i === 0 ? \"Free\" : \"Let\\u2019s talk\")\n const hasPrice = yearly ? !!plan.annualPrice : !!plan.monthlyPrice\n return (\n <m.div\n key={plan.name}\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.1 + i * 0.08 }}\n className={cn(\n \"flex flex-1 flex-col rounded-xl border p-3\",\n plan.highlight\n ? \"border-gray-900 bg-gray-50 shadow-sm\"\n : \"border-gray-200 bg-white\",\n )}\n >\n <div className=\"flex items-center gap-1.5\">\n <span className=\"font-bold text-[11px] text-gray-900\">{plan.name}</span>\n {plan.highlight && (\n <span className=\"rounded bg-gray-900 px-1.5 py-0.5 font-bold text-[8px] text-white\">\n Popular\n </span>\n )}\n </div>\n\n <div className=\"mt-2 flex items-baseline gap-0.5\">\n <AnimatePresence mode=\"wait\">\n <m.span\n key={price}\n initial={{ opacity: 0, y: -6 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 6 }}\n transition={{ duration: 0.2 }}\n className=\"font-bold text-gray-900 text-lg\"\n >\n {price}\n </m.span>\n </AnimatePresence>\n {hasPrice && <span className=\"text-[9px] text-gray-400\">/mo</span>}\n </div>\n\n <div className=\"mt-2.5 flex flex-col gap-1.5\">\n {plan.features.map((f) => (\n <div key={f} className=\"flex items-center gap-1\">\n <CheckCircle2\n className=\"size-3 shrink-0 text-emerald-500\"\n strokeWidth={2.5}\n />\n <span className=\"font-medium text-[9px] text-gray-600 leading-tight\">\n {f}\n </span>\n </div>\n ))}\n </div>\n\n <div\n className={cn(\n \"mt-3 rounded-md py-1.5 text-center font-semibold text-[9px]\",\n plan.highlight\n ? \"bg-gray-900 text-white\"\n : \"border border-gray-200 text-gray-700\",\n )}\n >\n {plan.ctaLabel}\n </div>\n </m.div>\n )\n })}\n </div>\n\n {/* Bottom metric row */}\n <div className=\"mt-3 flex w-full gap-2.5\">\n {[\n { label: \"Avg. savings\", value: \"42%\", sub: \"vs manual compliance\" },\n { label: \"Setup time\", value: \"<1hr\", sub: \"fully operational\" },\n { label: \"Uptime SLA\", value: \"99.9%\", sub: \"guaranteed\" },\n ].map((metric, i) => (\n <m.div\n key={metric.label}\n initial={{ opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3, delay: 0.4 + i * 0.08 }}\n className=\"flex flex-1 flex-col items-center rounded-lg border border-gray-100 bg-white px-2 py-2\"\n >\n <span className=\"font-bold text-gray-900 text-sm\">{metric.value}</span>\n <span className=\"text-[8px] text-gray-400\">{metric.sub}</span>\n </m.div>\n ))}\n </div>\n </div>\n </LazyMotion>\n )\n}\n"]}
@@ -1,161 +0,0 @@
1
- "use client";
2
- import { EASE_OUT } from './chunk-TAPJEVUA.js';
3
- import { useCycleIndex } from './chunk-6RWCZUAD.js';
4
- import { cn } from './chunk-GZNLQE3I.js';
5
- import { ShieldCheck, ShieldAlert, AlertTriangle } from 'lucide-react';
6
- import { LazyMotion, domAnimation, m } from 'motion/react';
7
- import { useState, useEffect } from 'react';
8
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
-
10
- var SCENARIOS = [
11
- {
12
- txn: "TXN-0847",
13
- corridor: "AU \u2192 SG",
14
- score: 18,
15
- level: "Low",
16
- colour: "text-emerald-600",
17
- barColour: "bg-emerald-400",
18
- icon: ShieldCheck,
19
- checks: [
20
- { label: "Sanctions", result: "Clear", ok: true },
21
- { label: "PEP screening", result: "Clear", ok: true },
22
- { label: "Travel Rule", result: "Verified", ok: true },
23
- { label: "Threshold", result: "Below limit", ok: true }
24
- ]
25
- },
26
- {
27
- txn: "TXN-0846",
28
- corridor: "HK \u2192 GB",
29
- score: 72,
30
- level: "High",
31
- colour: "text-red-500",
32
- barColour: "bg-red-400",
33
- icon: ShieldAlert,
34
- checks: [
35
- { label: "Sanctions", result: "Clear", ok: true },
36
- { label: "PEP screening", result: "1 match", ok: false },
37
- { label: "Travel Rule", result: "Verified", ok: true },
38
- { label: "Threshold", result: "Exceeded", ok: false }
39
- ]
40
- },
41
- {
42
- txn: "TXN-0845",
43
- corridor: "AE \u2192 NL",
44
- score: 41,
45
- level: "Medium",
46
- colour: "text-amber-500",
47
- barColour: "bg-amber-400",
48
- icon: AlertTriangle,
49
- checks: [
50
- { label: "Sanctions", result: "Clear", ok: true },
51
- { label: "PEP screening", result: "Clear", ok: true },
52
- { label: "Travel Rule", result: "Pending", ok: false },
53
- { label: "Threshold", result: "Below limit", ok: true }
54
- ]
55
- }
56
- ];
57
- var CYCLE_MS = 3800;
58
- function AnimatedNumber({ value, duration = 1e3 }) {
59
- const [display, setDisplay] = useState(0);
60
- useEffect(() => {
61
- let start = null;
62
- let raf;
63
- function tick(ts) {
64
- if (start === null) start = ts;
65
- const progress = Math.min((ts - start) / duration, 1);
66
- const eased = 1 - (1 - progress) ** 3;
67
- setDisplay(Math.round(value * eased));
68
- if (progress < 1) raf = requestAnimationFrame(tick);
69
- }
70
- raf = requestAnimationFrame(tick);
71
- return () => cancelAnimationFrame(raf);
72
- }, [value, duration]);
73
- return /* @__PURE__ */ jsx(Fragment, { children: display });
74
- }
75
- function AnimationRiskScoring({ className }) {
76
- const [containerRef, index] = useCycleIndex(SCENARIOS.length, CYCLE_MS);
77
- const s = SCENARIOS[index];
78
- const Icon = s.icon;
79
- return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("flex flex-col p-5", className), children: [
80
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
81
- /* @__PURE__ */ jsxs("div", { children: [
82
- /* @__PURE__ */ jsx("p", { className: "font-semibold text-[15px] text-forground", children: "Risk Analysis" }),
83
- /* @__PURE__ */ jsx("p", { className: "text-[12px] text-gray-400", children: "Real-time transfer scoring" })
84
- ] }),
85
- /* @__PURE__ */ jsxs(
86
- m.div,
87
- {
88
- initial: { opacity: 0, scale: 0.9 },
89
- animate: { opacity: 1, scale: 1 },
90
- className: cn(
91
- "flex items-center gap-1.5 rounded-full px-2.5 py-1",
92
- s.level === "Low" ? "bg-emerald-50" : s.level === "Medium" ? "bg-amber-50" : "bg-red-50"
93
- ),
94
- children: [
95
- /* @__PURE__ */ jsx(Icon, { className: cn("size-3.5", s.colour), strokeWidth: 2 }),
96
- /* @__PURE__ */ jsx("span", { className: cn("font-semibold text-[11px]", s.colour), children: s.level })
97
- ]
98
- },
99
- index
100
- )
101
- ] }),
102
- /* @__PURE__ */ jsxs(
103
- m.div,
104
- {
105
- initial: { opacity: 0, y: 6 },
106
- animate: { opacity: 1, y: 0 },
107
- transition: { duration: 0.3 },
108
- className: "mt-4 flex items-center gap-3 rounded-lg border border-gray-100 bg-gray-50 px-3 py-2.5",
109
- children: [
110
- /* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
111
- /* @__PURE__ */ jsx("p", { className: "font-bold font-mono text-[11px] text-gray-400", children: s.txn }),
112
- /* @__PURE__ */ jsx("p", { className: "font-medium text-[12px] text-gray-700", children: s.corridor })
113
- ] }),
114
- /* @__PURE__ */ jsxs("div", { className: "text-right", children: [
115
- /* @__PURE__ */ jsx("p", { className: "font-bold font-mono text-2xl text-gray-900", children: /* @__PURE__ */ jsx(AnimatedNumber, { value: s.score }) }),
116
- /* @__PURE__ */ jsx("p", { className: "text-[10px] text-gray-400", children: "/100" })
117
- ] })
118
- ]
119
- },
120
- `info-${index}`
121
- ),
122
- /* @__PURE__ */ jsx("div", { className: "mt-3 h-2 overflow-hidden rounded-full bg-gray-100", children: /* @__PURE__ */ jsx(
123
- m.div,
124
- {
125
- className: cn("h-full rounded-full", s.barColour),
126
- style: { transformOrigin: "left", width: "100%" },
127
- initial: { scaleX: 0 },
128
- animate: { scaleX: s.score / 100 },
129
- transition: { duration: 1, ease: EASE_OUT }
130
- },
131
- `bar-${index}`
132
- ) }),
133
- /* @__PURE__ */ jsx("div", { className: "mt-4 grid grid-cols-2 gap-2", children: s.checks.map((check, i) => /* @__PURE__ */ jsxs(
134
- m.div,
135
- {
136
- initial: { opacity: 0, y: 4 },
137
- animate: { opacity: 1, y: 0 },
138
- transition: { duration: 0.25, delay: 0.1 + i * 0.08 },
139
- className: "flex items-center justify-between rounded-lg border border-gray-100 bg-white px-3 py-2",
140
- children: [
141
- /* @__PURE__ */ jsx("span", { className: "font-medium text-[11px] text-gray-600", children: check.label }),
142
- /* @__PURE__ */ jsx(
143
- "span",
144
- {
145
- className: cn(
146
- "font-semibold text-[10px]",
147
- check.ok ? "text-emerald-600" : "text-red-500"
148
- ),
149
- children: check.result
150
- }
151
- )
152
- ]
153
- },
154
- `${check.label}-${index}`
155
- )) })
156
- ] }) });
157
- }
158
-
159
- export { AnimationRiskScoring };
160
- //# sourceMappingURL=chunk-HTYR73ON.js.map
161
- //# sourceMappingURL=chunk-HTYR73ON.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/animations/animation-risk-scoring.tsx"],"names":[],"mappings":"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","file":"chunk-HTYR73ON.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,124 +0,0 @@
1
- "use client";
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 };
123
- //# sourceMappingURL=chunk-I26ZXVSY.js.map
124
- //# sourceMappingURL=chunk-I26ZXVSY.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/animations/animation-rest-api.tsx"],"names":[],"mappings":"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","file":"chunk-I26ZXVSY.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,92 +0,0 @@
1
- "use client";
2
- import { EASE_OUT } from './chunk-TAPJEVUA.js';
3
- import { cn } from './chunk-GZNLQE3I.js';
4
- import { motion } from 'motion/react';
5
- import { jsxs, jsx } from 'react/jsx-runtime';
6
-
7
- function AnimationTeamsNotification({ className }) {
8
- return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col bg-[#f5f5f5] p-4", className), children: [
9
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 pb-2.5", children: [
10
- /* @__PURE__ */ jsx("div", { className: "flex size-5 items-center justify-center rounded bg-[#6264A7]", children: /* @__PURE__ */ jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", children: /* @__PURE__ */ jsx("path", { d: "M1 3H9M1 5H6M1 7H7", stroke: "white", strokeWidth: "1", strokeLinecap: "round" }) }) }),
11
- /* @__PURE__ */ jsx("span", { className: "font-semibold text-[13px] text-gray-900", children: "Compliance Reviews" })
12
- ] }),
13
- /* @__PURE__ */ jsxs(
14
- motion.div,
15
- {
16
- initial: { opacity: 0, y: 10 },
17
- animate: { opacity: 1, y: 0 },
18
- transition: { duration: 0.5, ease: EASE_OUT, delay: 0.3 },
19
- className: "rounded-lg bg-white shadow-sm",
20
- children: [
21
- /* @__PURE__ */ jsx("div", { className: "h-1 rounded-t-lg bg-[#6264A7]" }),
22
- /* @__PURE__ */ jsxs("div", { className: "p-3.5", children: [
23
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
24
- /* @__PURE__ */ jsx("div", { className: "flex size-6 items-center justify-center rounded bg-gray-900", children: /* @__PURE__ */ jsx("svg", { width: "10", height: "10", viewBox: "0 0 14 14", fill: "none", children: /* @__PURE__ */ jsx("path", { d: "M7 1L12 4V10L7 13L2 10V4L7 1Z", stroke: "#00D4FF", strokeWidth: "1.2" }) }) }),
25
- /* @__PURE__ */ jsx("span", { className: "font-bold text-[12px] text-gray-900", children: "Cogentic Compliance" }),
26
- /* @__PURE__ */ jsx("span", { className: "text-[10px] text-gray-400", children: "10:42 AM" })
27
- ] }),
28
- /* @__PURE__ */ jsxs(
29
- motion.div,
30
- {
31
- initial: { opacity: 0 },
32
- animate: { opacity: 1 },
33
- transition: { duration: 0.4, delay: 0.6 },
34
- children: [
35
- /* @__PURE__ */ jsx("p", { className: "mt-2.5 font-semibold text-[12px] text-gray-900", children: "Transfer requires review" }),
36
- /* @__PURE__ */ jsx("div", { className: "mt-2 grid grid-cols-2 gap-x-4 gap-y-1.5", children: [
37
- { label: "Transfer", value: "TXN-0847" },
38
- { label: "Corridor", value: "AU \u2192 SG" },
39
- { label: "Risk score", value: "72 / 100", highlight: true },
40
- { label: "Trigger", value: "PEP match" }
41
- ].map((item) => /* @__PURE__ */ jsxs("div", { children: [
42
- /* @__PURE__ */ jsx("span", { className: "font-medium text-[10px] text-gray-400", children: item.label }),
43
- /* @__PURE__ */ jsx(
44
- "p",
45
- {
46
- className: cn(
47
- "font-semibold text-[11px]",
48
- item.highlight ? "text-red-500" : "text-gray-800"
49
- ),
50
- children: item.value
51
- }
52
- )
53
- ] }, item.label)) }),
54
- /* @__PURE__ */ jsxs(
55
- motion.div,
56
- {
57
- initial: { opacity: 0, scale: 0.95 },
58
- animate: { opacity: 1, scale: 1 },
59
- transition: { duration: 0.3, delay: 0.9 },
60
- className: "mt-2.5 flex items-center gap-2 rounded bg-amber-50 px-2.5 py-1.5",
61
- children: [
62
- /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", children: /* @__PURE__ */ jsx("path", { d: "M6 1L11 3.5V8.5L6 11L1 8.5V3.5L6 1Z", stroke: "#D97706", strokeWidth: "1" }) }),
63
- /* @__PURE__ */ jsx("span", { className: "font-medium text-[10px] text-amber-700", children: "SG jurisdiction requires beneficiary verification within 24h" })
64
- ]
65
- }
66
- )
67
- ]
68
- }
69
- ),
70
- /* @__PURE__ */ jsxs(
71
- motion.div,
72
- {
73
- initial: { opacity: 0 },
74
- animate: { opacity: 1 },
75
- transition: { duration: 0.3, delay: 1.1 },
76
- className: "mt-3 flex gap-2",
77
- children: [
78
- /* @__PURE__ */ jsx("span", { className: "rounded bg-[#6264A7] px-3 py-1.5 font-semibold text-[11px] text-white", children: "Review transfer" }),
79
- /* @__PURE__ */ jsx("span", { className: "rounded border border-gray-200 px-3 py-1.5 font-semibold text-[11px] text-gray-600", children: "Assign reviewer" })
80
- ]
81
- }
82
- )
83
- ] })
84
- ]
85
- }
86
- )
87
- ] });
88
- }
89
-
90
- export { AnimationTeamsNotification };
91
- //# sourceMappingURL=chunk-IKATDPHG.js.map
92
- //# sourceMappingURL=chunk-IKATDPHG.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/animations/animation-teams-notification.tsx"],"names":[],"mappings":";;;;;AAOe,SAAR,0BAAA,CAA4C,EAAE,SAAA,EAAU,EAA2B;AACxF,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,gCAAA,EAAkC,SAAS,CAAA,EAE5D,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,QACnD,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oBAAA,EAAqB,MAAA,EAAO,OAAA,EAAQ,aAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,CAAA,EACpF,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA0C,QAAA,EAAA,oBAAA,EAAkB;AAAA,KAAA,EAC9E,CAAA;AAAA,oBAGA,IAAA;AAAA,MAAC,MAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,QAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,QAC5B,YAAY,EAAE,QAAA,EAAU,KAAK,IAAA,EAAM,QAAA,EAAU,OAAO,GAAA,EAAI;AAAA,QACxD,SAAA,EAAU,+BAAA;AAAA,QAGV,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+BAAA,EAAgC,CAAA;AAAA,0BAC/C,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OAAA,EACb,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6DAAA,EACb,QAAA,kBAAA,GAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EACnD,QAAA,kBAAA,GAAA,CAAC,UAAK,CAAA,EAAE,+BAAA,EAAgC,QAAO,SAAA,EAAU,WAAA,EAAY,KAAA,EAAM,CAAA,EAC7E,CAAA,EACF,CAAA;AAAA,8BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,8BACzE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,UAAA,EAAQ;AAAA,aAAA,EACtD,CAAA;AAAA,4BAEA,IAAA;AAAA,cAAC,MAAA,CAAO,GAAA;AAAA,cAAP;AAAA,gBACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,gBACtB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,gBACtB,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,gBAExC,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDAAA,EAAiD,QAAA,EAAA,0BAAA,EAE9D,CAAA;AAAA,kCAGA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA;AAAA,oBACC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,oBACvC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,cAAA,EAAe;AAAA,oBAC3C,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,UAAA,EAAY,WAAW,IAAA,EAAK;AAAA,oBAC1D,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,WAAA;AAAY,mBACzC,CAAE,GAAA,CAAI,CAAC,IAAA,0BACJ,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,oCACpE,GAAA;AAAA,sBAAC,GAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAW,EAAA;AAAA,0BACT,2BAAA;AAAA,0BACA,IAAA,CAAK,YAAY,cAAA,GAAiB;AAAA,yBACpC;AAAA,wBAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA;AACR,mBAAA,EAAA,EATQ,IAAA,CAAK,KAUf,CACD,CAAA,EACH,CAAA;AAAA,kCAGA,IAAA;AAAA,oBAAC,MAAA,CAAO,GAAA;AAAA,oBAAP;AAAA,sBACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,IAAA,EAAK;AAAA,sBACnC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,sBAChC,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,sBACxC,SAAA,EAAU,kEAAA;AAAA,sBAEV,QAAA,EAAA;AAAA,wCAAA,GAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAA,GAAA,CAAC,UAAK,CAAA,EAAE,qCAAA,EAAsC,QAAO,SAAA,EAAU,WAAA,EAAY,KAAI,CAAA,EACjF,CAAA;AAAA,wCACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA,8DAAA,EAEzD;AAAA;AAAA;AAAA;AACF;AAAA;AAAA,aACF;AAAA,4BAGA,IAAA;AAAA,cAAC,MAAA,CAAO,GAAA;AAAA,cAAP;AAAA,gBACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,gBACtB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,gBACtB,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,gBACxC,SAAA,EAAU,iBAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uEAAA,EAAwE,QAAA,EAAA,iBAAA,EAExF,CAAA;AAAA,kCACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oFAAA,EAAqF,QAAA,EAAA,iBAAA,EAErG;AAAA;AAAA;AAAA;AACF,WAAA,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ","file":"chunk-IKATDPHG.js","sourcesContent":["\"use client\"\n\nimport { motion } from \"motion/react\"\n\nimport { EASE_OUT } from \"../lib/animation\"\nimport { cn } from \"../lib/utils\"\n\nexport default function AnimationTeamsNotification({ className }: { className?: string }) {\n return (\n <div className={cn(\"flex flex-col bg-[#f5f5f5] p-4\", className)}>\n {/* Teams channel header */}\n <div className=\"flex items-center gap-2 pb-2.5\">\n <div className=\"flex size-5 items-center justify-center rounded bg-[#6264A7]\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M1 3H9M1 5H6M1 7H7\" stroke=\"white\" strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n </div>\n <span className=\"font-semibold text-[13px] text-gray-900\">Compliance Reviews</span>\n </div>\n\n {/* Adaptive card message */}\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.5, ease: EASE_OUT, delay: 0.3 }}\n className=\"rounded-lg bg-white shadow-sm\"\n >\n {/* Card header with accent */}\n <div className=\"h-1 rounded-t-lg bg-[#6264A7]\" />\n <div className=\"p-3.5\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex size-6 items-center justify-center rounded bg-gray-900\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M7 1L12 4V10L7 13L2 10V4L7 1Z\" stroke=\"#00D4FF\" strokeWidth=\"1.2\" />\n </svg>\n </div>\n <span className=\"font-bold text-[12px] text-gray-900\">Cogentic Compliance</span>\n <span className=\"text-[10px] text-gray-400\">10:42 AM</span>\n </div>\n\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.4, delay: 0.6 }}\n >\n <p className=\"mt-2.5 font-semibold text-[12px] text-gray-900\">\n Transfer requires review\n </p>\n\n {/* Transfer details grid */}\n <div className=\"mt-2 grid grid-cols-2 gap-x-4 gap-y-1.5\">\n {[\n { label: \"Transfer\", value: \"TXN-0847\" },\n { label: \"Corridor\", value: \"AU \\u2192 SG\" },\n { label: \"Risk score\", value: \"72 / 100\", highlight: true },\n { label: \"Trigger\", value: \"PEP match\" },\n ].map((item) => (\n <div key={item.label}>\n <span className=\"font-medium text-[10px] text-gray-400\">{item.label}</span>\n <p\n className={cn(\n \"font-semibold text-[11px]\",\n item.highlight ? \"text-red-500\" : \"text-gray-800\",\n )}\n >\n {item.value}\n </p>\n </div>\n ))}\n </div>\n\n {/* Jurisdiction badge */}\n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.3, delay: 0.9 }}\n className=\"mt-2.5 flex items-center gap-2 rounded bg-amber-50 px-2.5 py-1.5\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M6 1L11 3.5V8.5L6 11L1 8.5V3.5L6 1Z\" stroke=\"#D97706\" strokeWidth=\"1\" />\n </svg>\n <span className=\"font-medium text-[10px] text-amber-700\">\n SG jurisdiction requires beneficiary verification within 24h\n </span>\n </motion.div>\n </motion.div>\n\n {/* Action buttons */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.3, delay: 1.1 }}\n className=\"mt-3 flex gap-2\"\n >\n <span className=\"rounded bg-[#6264A7] px-3 py-1.5 font-semibold text-[11px] text-white\">\n Review transfer\n </span>\n <span className=\"rounded border border-gray-200 px-3 py-1.5 font-semibold text-[11px] text-gray-600\">\n Assign reviewer\n </span>\n </motion.div>\n </div>\n </motion.div>\n </div>\n )\n}\n"]}
@@ -1,108 +0,0 @@
1
- "use client";
2
- import { useAnimationTimer } from './chunk-RXV2XUDZ.js';
3
- import { cn } from './chunk-GZNLQE3I.js';
4
- import { Zap } from 'lucide-react';
5
- import { LazyMotion, domAnimation, AnimatePresence, m } from 'motion/react';
6
- import { useRef, useEffect } from 'react';
7
- import { jsx, jsxs } from 'react/jsx-runtime';
8
-
9
- var EVENTS = [
10
- {
11
- event: "transfer.screened",
12
- status: 200,
13
- latency: "42ms",
14
- payload: '{ "id": "TXN-0847", "result": "compliant" }',
15
- colour: "text-emerald-400"
16
- },
17
- {
18
- event: "transfer.flagged",
19
- status: 200,
20
- latency: "38ms",
21
- payload: '{ "id": "TXN-0846", "risk": "high", "reason": "threshold" }',
22
- colour: "text-amber-400"
23
- },
24
- {
25
- event: "verification.complete",
26
- status: 200,
27
- latency: "51ms",
28
- payload: '{ "transfer": "TXN-0845", "travel_rule": "verified" }',
29
- colour: "text-[#00D4FF]"
30
- },
31
- {
32
- event: "report.generated",
33
- status: 200,
34
- latency: "67ms",
35
- payload: '{ "ref": "CR-2024-Q4", "type": "quarterly" }',
36
- colour: "text-violet-400"
37
- },
38
- {
39
- event: "rule.triggered",
40
- status: 200,
41
- latency: "29ms",
42
- payload: '{ "rule": "CR-007", "transfer": "TXN-0851" }',
43
- colour: "text-red-400"
44
- }
45
- ];
46
- function AnimationWebhooks({ className }) {
47
- const [timerRef, tick] = useAnimationTimer(2200);
48
- const count = Math.min(tick + 1, 6);
49
- const startIdx = Math.max(0, tick + 1 - count);
50
- const visible = Array.from({ length: count }, (_, i) => (startIdx + i) % EVENTS.length);
51
- const scrollRef = useRef(null);
52
- useEffect(() => {
53
- const el = scrollRef.current;
54
- if (!el) return;
55
- requestAnimationFrame(() => {
56
- el.scrollTop = el.scrollHeight;
57
- });
58
- }, []);
59
- return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsxs("div", { ref: timerRef, className: cn("flex flex-col bg-[#1a1a2e]", className), children: [
60
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-white/10 border-b px-4 py-2", children: [
61
- /* @__PURE__ */ jsx(Zap, { className: "size-3 text-amber-400" }),
62
- /* @__PURE__ */ jsx("span", { className: "font-mono text-[11px] text-white/60", children: "Webhook Events" }),
63
- /* @__PURE__ */ jsxs("span", { className: "ml-auto flex items-center gap-1", children: [
64
- /* @__PURE__ */ jsxs("span", { className: "relative flex size-1.5", children: [
65
- /* @__PURE__ */ jsx("span", { className: "absolute inline-flex size-full animate-ping rounded-full bg-emerald-400 opacity-75" }),
66
- /* @__PURE__ */ jsx("span", { className: "relative inline-flex size-1.5 rounded-full bg-emerald-500" })
67
- ] }),
68
- /* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] text-emerald-400", children: "live" })
69
- ] })
70
- ] }),
71
- /* @__PURE__ */ jsx("div", { ref: scrollRef, className: "scrollbar-none flex-1 overflow-y-auto px-3 py-2", children: /* @__PURE__ */ jsx("div", { className: "space-y-1.5", children: /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: visible.map((evIdx, i) => {
72
- const ev = EVENTS[evIdx];
73
- const isLatest = i === visible.length - 1;
74
- return /* @__PURE__ */ jsxs(
75
- m.div,
76
- {
77
- initial: { opacity: 0, x: -8 },
78
- animate: { opacity: isLatest ? 1 : 0.4, x: 0 },
79
- exit: { opacity: 0, x: 8 },
80
- transition: { duration: 0.3 },
81
- className: "rounded-md border border-white/5 bg-white/5 px-3 py-2",
82
- children: [
83
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
84
- /* @__PURE__ */ jsx("span", { className: cn("font-mono font-semibold text-[11px]", ev.colour), children: ev.event }),
85
- /* @__PURE__ */ jsx("span", { className: "ml-auto font-mono text-[10px] text-emerald-400", children: ev.status }),
86
- /* @__PURE__ */ jsx("span", { className: "font-mono text-[10px] text-white/30", children: ev.latency })
87
- ] }),
88
- isLatest && /* @__PURE__ */ jsx(
89
- m.p,
90
- {
91
- initial: { opacity: 0 },
92
- animate: { opacity: 1 },
93
- transition: { delay: 0.15 },
94
- className: "mt-1 truncate font-mono text-[10px] text-white/40",
95
- children: ev.payload
96
- }
97
- )
98
- ]
99
- },
100
- `${i}-${evIdx}`
101
- );
102
- }) }) }) })
103
- ] }) });
104
- }
105
-
106
- export { AnimationWebhooks };
107
- //# sourceMappingURL=chunk-KUOF3XRZ.js.map
108
- //# sourceMappingURL=chunk-KUOF3XRZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/animations/animation-webhooks.tsx"],"names":[],"mappings":";;;;;;;AAkBA,IAAM,MAAA,GAAyB;AAAA,EAC7B;AAAA,IACE,KAAA,EAAO,mBAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,6CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,KAAA,EAAO,kBAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,6DAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,KAAA,EAAO,uBAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,uDAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,KAAA,EAAO,kBAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,8CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,OAAA,EAAS,8CAAA;AAAA,IACT,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAEe,SAAR,iBAAA,CAAmC,EAAE,SAAA,EAAU,EAA2B;AAC/E,EAAA,MAAM,CAAC,QAAA,EAAU,IAAI,CAAA,GAAI,kBAAkB,IAAI,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,GAAG,CAAC,CAAA;AAClC,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,IAAI,KAAK,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,QAAA,GAAW,CAAA,IAAK,OAAO,MAAM,CAAA;AACtF,EAAA,MAAM,SAAA,GAAY,OAAuB,IAAI,CAAA;AAE7C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA;AACrB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,EAAA,CAAG,YAAY,EAAA,CAAG,YAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACE,GAAA,CAAC,UAAA,EAAA,EAAW,QAAA,EAAU,YAAA,EACpB,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,QAAA,EAAU,SAAA,EAAW,EAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA,EAEvE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4DAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,WAAU,uBAAA,EAAwB,CAAA;AAAA,sBACvC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,sBACpE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAA,EACd,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wBAAA,EACd,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oFAAA,EAAqF,CAAA;AAAA,0BACrG,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2DAAA,EAA4D;AAAA,SAAA,EAC9E,CAAA;AAAA,wBACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA,MAAA,EAAI;AAAA,OAAA,EAC/D;AAAA,KAAA,EACF,CAAA;AAAA,wBAGC,KAAA,EAAA,EAAI,GAAA,EAAK,WAAW,SAAA,EAAU,iDAAA,EAC7B,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,kBAAA,GAAA,CAAC,mBAAgB,OAAA,EAAS,KAAA,EACvB,kBAAQ,GAAA,CAAI,CAAC,OAAO,CAAA,KAAM;AACzB,MAAA,MAAM,EAAA,GAAK,OAAO,KAAK,CAAA;AACvB,MAAA,MAAM,QAAA,GAAW,CAAA,KAAM,OAAA,CAAQ,MAAA,GAAS,CAAA;AACxC,MAAA,uBACE,IAAA;AAAA,QAAC,CAAA,CAAE,GAAA;AAAA,QAAF;AAAA,UAEC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,UAC7B,SAAS,EAAE,OAAA,EAAS,WAAW,CAAA,GAAI,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,UAC7C,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,UACzB,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAI;AAAA,UAC5B,SAAA,EAAU,uDAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAW,EAAA,CAAG,qCAAA,EAAuC,GAAG,MAAM,CAAA,EACjE,aAAG,KAAA,EACN,CAAA;AAAA,8BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EACb,aAAG,MAAA,EACN,CAAA;AAAA,8BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAuC,aAAG,OAAA,EAAQ;AAAA,aAAA,EACpE,CAAA;AAAA,YACC,QAAA,oBACC,GAAA;AAAA,cAAC,CAAA,CAAE,CAAA;AAAA,cAAF;AAAA,gBACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,gBACtB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAE;AAAA,gBACtB,UAAA,EAAY,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,gBAC1B,SAAA,EAAU,mDAAA;AAAA,gBAET,QAAA,EAAA,EAAA,CAAG;AAAA;AAAA;AACN;AAAA,SAAA;AAAA,QAxBG,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,OA0BpB;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ","file":"chunk-KUOF3XRZ.js","sourcesContent":["\"use client\"\n\nimport { Zap } from \"lucide-react\"\nimport { AnimatePresence, domAnimation, LazyMotion, m } from \"motion/react\"\nimport { useEffect, useRef } from \"react\"\n\nimport { useAnimationTimer } from \"../hooks/use-animation-timer\"\n\nimport { cn } from \"../lib/utils\"\n\ntype WebhookEvent = {\n event: string\n status: number\n latency: string\n payload: string\n colour: string\n}\n\nconst EVENTS: WebhookEvent[] = [\n {\n event: \"transfer.screened\",\n status: 200,\n latency: \"42ms\",\n payload: '{ \"id\": \"TXN-0847\", \"result\": \"compliant\" }',\n colour: \"text-emerald-400\",\n },\n {\n event: \"transfer.flagged\",\n status: 200,\n latency: \"38ms\",\n payload: '{ \"id\": \"TXN-0846\", \"risk\": \"high\", \"reason\": \"threshold\" }',\n colour: \"text-amber-400\",\n },\n {\n event: \"verification.complete\",\n status: 200,\n latency: \"51ms\",\n payload: '{ \"transfer\": \"TXN-0845\", \"travel_rule\": \"verified\" }',\n colour: \"text-[#00D4FF]\",\n },\n {\n event: \"report.generated\",\n status: 200,\n latency: \"67ms\",\n payload: '{ \"ref\": \"CR-2024-Q4\", \"type\": \"quarterly\" }',\n colour: \"text-violet-400\",\n },\n {\n event: \"rule.triggered\",\n status: 200,\n latency: \"29ms\",\n payload: '{ \"rule\": \"CR-007\", \"transfer\": \"TXN-0851\" }',\n colour: \"text-red-400\",\n },\n]\n\nexport default function AnimationWebhooks({ className }: { className?: string }) {\n const [timerRef, tick] = useAnimationTimer(2200)\n const count = Math.min(tick + 1, 6)\n const startIdx = Math.max(0, tick + 1 - count)\n const visible = Array.from({ length: count }, (_, i) => (startIdx + i) % EVENTS.length)\n const scrollRef = useRef<HTMLDivElement>(null)\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 ref={timerRef} className={cn(\"flex flex-col bg-[#1a1a2e]\", className)}>\n {/* Header */}\n <div className=\"flex items-center gap-2 border-white/10 border-b px-4 py-2\">\n <Zap className=\"size-3 text-amber-400\" />\n <span className=\"font-mono text-[11px] text-white/60\">Webhook Events</span>\n <span className=\"ml-auto flex items-center gap-1\">\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-mono text-[10px] text-emerald-400\">live</span>\n </span>\n </div>\n\n {/* Events */}\n <div ref={scrollRef} className=\"scrollbar-none flex-1 overflow-y-auto px-3 py-2\">\n <div className=\"space-y-1.5\">\n <AnimatePresence initial={false}>\n {visible.map((evIdx, i) => {\n const ev = EVENTS[evIdx]\n const isLatest = i === visible.length - 1\n return (\n <m.div\n key={`${i}-${evIdx}`}\n initial={{ opacity: 0, x: -8 }}\n animate={{ opacity: isLatest ? 1 : 0.4, x: 0 }}\n exit={{ opacity: 0, x: 8 }}\n transition={{ duration: 0.3 }}\n className=\"rounded-md border border-white/5 bg-white/5 px-3 py-2\"\n >\n <div className=\"flex items-center gap-2\">\n <span className={cn(\"font-mono font-semibold text-[11px]\", ev.colour)}>\n {ev.event}\n </span>\n <span className=\"ml-auto font-mono text-[10px] text-emerald-400\">\n {ev.status}\n </span>\n <span className=\"font-mono text-[10px] text-white/30\">{ev.latency}</span>\n </div>\n {isLatest && (\n <m.p\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.15 }}\n className=\"mt-1 truncate font-mono text-[10px] text-white/40\"\n >\n {ev.payload}\n </m.p>\n )}\n </m.div>\n )\n })}\n </AnimatePresence>\n </div>\n </div>\n </div>\n </LazyMotion>\n )\n}\n"]}