@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,145 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCycleIndex } from './chunk-6RWCZUAD.js';
|
|
3
|
+
import { cn } from './chunk-GZNLQE3I.js';
|
|
4
|
+
import { CheckCircle2, XCircle } from 'lucide-react';
|
|
5
|
+
import { LazyMotion, domAnimation, m } from 'motion/react';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var VASPS = [
|
|
9
|
+
{
|
|
10
|
+
name: "Aqua Exchange",
|
|
11
|
+
jurisdiction: "Singapore",
|
|
12
|
+
flag: "\u{1F1F8}\u{1F1EC}",
|
|
13
|
+
registered: true,
|
|
14
|
+
regulator: "MAS",
|
|
15
|
+
protocols: ["TRP", "TRISA"],
|
|
16
|
+
riskLevel: "Low",
|
|
17
|
+
lastVerified: "2 hours ago"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "Atlas Digital",
|
|
21
|
+
jurisdiction: "United Kingdom",
|
|
22
|
+
flag: "\u{1F1EC}\u{1F1E7}",
|
|
23
|
+
registered: true,
|
|
24
|
+
regulator: "FCA",
|
|
25
|
+
protocols: ["OpenVASP", "TRP"],
|
|
26
|
+
riskLevel: "Low",
|
|
27
|
+
lastVerified: "4 hours ago"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "Nova Crypto",
|
|
31
|
+
jurisdiction: "UAE",
|
|
32
|
+
flag: "\u{1F1E6}\u{1F1EA}",
|
|
33
|
+
registered: true,
|
|
34
|
+
regulator: "VARA",
|
|
35
|
+
protocols: ["Sygna"],
|
|
36
|
+
riskLevel: "Medium",
|
|
37
|
+
lastVerified: "1 day ago"
|
|
38
|
+
}
|
|
39
|
+
];
|
|
40
|
+
var riskColour = {
|
|
41
|
+
Low: "bg-emerald-50 text-emerald-700",
|
|
42
|
+
Medium: "bg-amber-50 text-amber-700",
|
|
43
|
+
High: "bg-red-50 text-red-700"
|
|
44
|
+
};
|
|
45
|
+
function AnimationVaspIdentification({ className }) {
|
|
46
|
+
const [containerRef, index] = useCycleIndex(VASPS.length, 3800);
|
|
47
|
+
const v = VASPS[index];
|
|
48
|
+
return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("flex flex-col p-5", className), children: [
|
|
49
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
50
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
51
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-[15px] text-foreground", children: "Counterparty VASP" }),
|
|
52
|
+
/* @__PURE__ */ jsx("p", { className: "text-[12px] text-gray-400", children: "Identity verification" })
|
|
53
|
+
] }),
|
|
54
|
+
/* @__PURE__ */ jsxs(
|
|
55
|
+
m.span,
|
|
56
|
+
{
|
|
57
|
+
initial: { opacity: 0, scale: 0.9 },
|
|
58
|
+
animate: { opacity: 1, scale: 1 },
|
|
59
|
+
className: cn(
|
|
60
|
+
"rounded-full px-2.5 py-1 font-semibold text-[11px]",
|
|
61
|
+
riskColour[v.riskLevel]
|
|
62
|
+
),
|
|
63
|
+
children: [
|
|
64
|
+
v.riskLevel,
|
|
65
|
+
" risk"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
index
|
|
69
|
+
)
|
|
70
|
+
] }),
|
|
71
|
+
/* @__PURE__ */ jsxs(
|
|
72
|
+
m.div,
|
|
73
|
+
{
|
|
74
|
+
initial: { opacity: 0, y: 6 },
|
|
75
|
+
animate: { opacity: 1, y: 0 },
|
|
76
|
+
transition: { duration: 0.3 },
|
|
77
|
+
className: "mt-4 rounded-lg border border-gray-100 bg-gray-50",
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 border-gray-100 border-b px-4 py-3", children: [
|
|
80
|
+
/* @__PURE__ */ jsx("div", { className: "flex size-9 items-center justify-center rounded-lg bg-white text-lg shadow-sm", children: v.flag }),
|
|
81
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
82
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-[13px] text-gray-900", children: v.name }),
|
|
83
|
+
/* @__PURE__ */ jsxs("p", { className: "text-[11px] text-gray-500", children: [
|
|
84
|
+
v.jurisdiction,
|
|
85
|
+
" ",
|
|
86
|
+
"\u2022",
|
|
87
|
+
" ",
|
|
88
|
+
v.regulator
|
|
89
|
+
] })
|
|
90
|
+
] })
|
|
91
|
+
] }),
|
|
92
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-2 p-3", children: [
|
|
93
|
+
{ label: "Registered", ok: v.registered },
|
|
94
|
+
{ label: "Identity verified", ok: true },
|
|
95
|
+
{ label: "Sanctions clear", ok: true },
|
|
96
|
+
{ label: "Travel Rule ready", ok: v.protocols.length > 0 }
|
|
97
|
+
].map((check, i) => /* @__PURE__ */ jsxs(
|
|
98
|
+
m.div,
|
|
99
|
+
{
|
|
100
|
+
initial: { opacity: 0, y: 4 },
|
|
101
|
+
animate: { opacity: 1, y: 0 },
|
|
102
|
+
transition: { delay: 0.1 + i * 0.08 },
|
|
103
|
+
className: "flex items-center gap-1.5 rounded-md bg-white px-2.5 py-1.5",
|
|
104
|
+
children: [
|
|
105
|
+
check.ok ? /* @__PURE__ */ jsx(CheckCircle2, { className: "size-3 text-emerald-500" }) : /* @__PURE__ */ jsx(XCircle, { className: "size-3 text-red-500" }),
|
|
106
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-[10px] text-gray-600", children: check.label })
|
|
107
|
+
]
|
|
108
|
+
},
|
|
109
|
+
check.label
|
|
110
|
+
)) })
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
`vasp-${index}`
|
|
114
|
+
),
|
|
115
|
+
/* @__PURE__ */ jsxs(
|
|
116
|
+
m.div,
|
|
117
|
+
{
|
|
118
|
+
initial: { opacity: 0 },
|
|
119
|
+
animate: { opacity: 1 },
|
|
120
|
+
transition: { delay: 0.3 },
|
|
121
|
+
className: "mt-3 flex items-center gap-2",
|
|
122
|
+
children: [
|
|
123
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-[10px] text-gray-400", children: "Protocols:" }),
|
|
124
|
+
v.protocols.map((p) => /* @__PURE__ */ jsx(
|
|
125
|
+
"span",
|
|
126
|
+
{
|
|
127
|
+
className: "rounded-full border border-gray-200 bg-white px-2.5 py-0.5 font-semibold text-[10px] text-gray-600",
|
|
128
|
+
children: p
|
|
129
|
+
},
|
|
130
|
+
p
|
|
131
|
+
)),
|
|
132
|
+
/* @__PURE__ */ jsxs("span", { className: "ml-auto text-[10px] text-gray-400", children: [
|
|
133
|
+
"Verified ",
|
|
134
|
+
v.lastVerified
|
|
135
|
+
] })
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
`proto-${index}`
|
|
139
|
+
)
|
|
140
|
+
] }) });
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export { AnimationVaspIdentification };
|
|
144
|
+
//# sourceMappingURL=chunk-EFLWU2JP.js.map
|
|
145
|
+
//# sourceMappingURL=chunk-EFLWU2JP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/animations/animation-vasp-identification.tsx"],"names":[],"mappings":"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","file":"chunk-EFLWU2JP.js","sourcesContent":["\"use client\"\n\nimport { CheckCircle2, XCircle } 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 Vasp = {\n name: string\n jurisdiction: string\n flag: string\n registered: boolean\n regulator: string\n protocols: string[]\n riskLevel: \"Low\" | \"Medium\" | \"High\"\n lastVerified: string\n}\n\nconst VASPS: Vasp[] = [\n {\n name: \"Aqua Exchange\",\n jurisdiction: \"Singapore\",\n flag: \"\\u{1F1F8}\\u{1F1EC}\",\n registered: true,\n regulator: \"MAS\",\n protocols: [\"TRP\", \"TRISA\"],\n riskLevel: \"Low\",\n lastVerified: \"2 hours ago\",\n },\n {\n name: \"Atlas Digital\",\n jurisdiction: \"United Kingdom\",\n flag: \"\\u{1F1EC}\\u{1F1E7}\",\n registered: true,\n regulator: \"FCA\",\n protocols: [\"OpenVASP\", \"TRP\"],\n riskLevel: \"Low\",\n lastVerified: \"4 hours ago\",\n },\n {\n name: \"Nova Crypto\",\n jurisdiction: \"UAE\",\n flag: \"\\u{1F1E6}\\u{1F1EA}\",\n registered: true,\n regulator: \"VARA\",\n protocols: [\"Sygna\"],\n riskLevel: \"Medium\",\n lastVerified: \"1 day ago\",\n },\n]\n\nconst riskColour: Record<string, string> = {\n Low: \"bg-emerald-50 text-emerald-700\",\n Medium: \"bg-amber-50 text-amber-700\",\n High: \"bg-red-50 text-red-700\",\n}\n\nexport default function AnimationVaspIdentification({ className }: { className?: string }) {\n const [containerRef, index] = useCycleIndex(VASPS.length, 3800)\n\n const v = VASPS[index]\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\">Counterparty VASP</p>\n <p className=\"text-[12px] text-gray-400\">Identity verification</p>\n </div>\n <m.span\n key={index}\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n className={cn(\n \"rounded-full px-2.5 py-1 font-semibold text-[11px]\",\n riskColour[v.riskLevel],\n )}\n >\n {v.riskLevel} risk\n </m.span>\n </div>\n\n {/* VASP card */}\n <m.div\n key={`vasp-${index}`}\n initial={{ opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.3 }}\n className=\"mt-4 rounded-lg border border-gray-100 bg-gray-50\"\n >\n {/* Name & jurisdiction */}\n <div className=\"flex items-center gap-3 border-gray-100 border-b px-4 py-3\">\n <div className=\"flex size-9 items-center justify-center rounded-lg bg-white text-lg shadow-sm\">\n {v.flag}\n </div>\n <div>\n <p className=\"font-semibold text-[13px] text-gray-900\">{v.name}</p>\n <p className=\"text-[11px] text-gray-500\">\n {v.jurisdiction} {\"\\u2022\"} {v.regulator}\n </p>\n </div>\n </div>\n\n {/* Verification checks */}\n <div className=\"grid grid-cols-2 gap-2 p-3\">\n {[\n { label: \"Registered\", ok: v.registered },\n { label: \"Identity verified\", ok: true },\n { label: \"Sanctions clear\", ok: true },\n { label: \"Travel Rule ready\", ok: v.protocols.length > 0 },\n ].map((check, i) => (\n <m.div\n key={check.label}\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ delay: 0.1 + i * 0.08 }}\n className=\"flex items-center gap-1.5 rounded-md bg-white px-2.5 py-1.5\"\n >\n {check.ok ? (\n <CheckCircle2 className=\"size-3 text-emerald-500\" />\n ) : (\n <XCircle className=\"size-3 text-red-500\" />\n )}\n <span className=\"font-medium text-[10px] text-gray-600\">{check.label}</span>\n </m.div>\n ))}\n </div>\n </m.div>\n\n {/* Protocols */}\n <m.div\n key={`proto-${index}`}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ delay: 0.3 }}\n className=\"mt-3 flex items-center gap-2\"\n >\n <span className=\"font-medium text-[10px] text-gray-400\">Protocols:</span>\n {v.protocols.map((p) => (\n <span\n key={p}\n className=\"rounded-full border border-gray-200 bg-white px-2.5 py-0.5 font-semibold text-[10px] text-gray-600\"\n >\n {p}\n </span>\n ))}\n <span className=\"ml-auto text-[10px] text-gray-400\">Verified {v.lastVerified}</span>\n </m.div>\n </div>\n </LazyMotion>\n )\n}\n"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
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 AnimationSlackNotification({ className }) {
|
|
8
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col bg-white p-4", className), children: [
|
|
9
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-gray-100 border-b pb-2.5", children: [
|
|
10
|
+
/* @__PURE__ */ jsx("span", { className: "font-bold text-[13px] text-gray-900", children: "# compliance-alerts" }),
|
|
11
|
+
/* @__PURE__ */ jsx("span", { className: "rounded bg-red-100 px-1.5 py-0.5 font-bold text-[9px] text-red-600", children: "3 new" })
|
|
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: "mt-3 flex gap-2.5",
|
|
20
|
+
children: [
|
|
21
|
+
/* @__PURE__ */ jsx("div", { className: "flex size-8 shrink-0 items-center justify-center rounded-md bg-gray-900", children: /* @__PURE__ */ jsx("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", children: /* @__PURE__ */ jsx("path", { d: "M7 1L12 4V10L7 13L2 10V4L7 1Z", stroke: "#00D4FF", strokeWidth: "1.2" }) }) }),
|
|
22
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
23
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-2", children: [
|
|
24
|
+
/* @__PURE__ */ jsx("span", { className: "font-bold text-[13px] text-gray-900", children: "Cogentic" }),
|
|
25
|
+
/* @__PURE__ */ jsx("span", { className: "text-[10px] text-gray-400", children: "APP 10:42 AM" })
|
|
26
|
+
] }),
|
|
27
|
+
/* @__PURE__ */ jsxs(
|
|
28
|
+
motion.div,
|
|
29
|
+
{
|
|
30
|
+
initial: { opacity: 0, x: -8 },
|
|
31
|
+
animate: { opacity: 1, x: 0 },
|
|
32
|
+
transition: { duration: 0.4, ease: EASE_OUT, delay: 0.6 },
|
|
33
|
+
className: "mt-1.5 rounded-md border-red-400 border-l-[3px] bg-gray-50 px-3 py-2.5",
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-[12px] text-gray-900", children: "Transfer flagged \u2014 manual review required" }),
|
|
36
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-1.5 flex flex-wrap gap-x-4 gap-y-1", children: [
|
|
37
|
+
/* @__PURE__ */ jsxs("span", { className: "text-[11px] text-gray-500", children: [
|
|
38
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-gray-700", children: "TXN-0847" }),
|
|
39
|
+
" \xB7 AU \u2192 SG"
|
|
40
|
+
] }),
|
|
41
|
+
/* @__PURE__ */ jsxs("span", { className: "text-[11px] text-gray-500", children: [
|
|
42
|
+
"Risk: ",
|
|
43
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold text-red-500", children: "High (72)" })
|
|
44
|
+
] })
|
|
45
|
+
] }),
|
|
46
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1.5 text-[11px] text-gray-500 leading-relaxed", children: "PEP screening match detected. Beneficiary threshold exceeded for SG corridor." })
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
/* @__PURE__ */ jsx(
|
|
51
|
+
motion.div,
|
|
52
|
+
{
|
|
53
|
+
initial: { opacity: 0 },
|
|
54
|
+
animate: { opacity: 1 },
|
|
55
|
+
transition: { duration: 0.3, delay: 0.9 },
|
|
56
|
+
className: "mt-2 flex gap-1.5",
|
|
57
|
+
children: ["Review", "Approve", "Escalate"].map((label) => /* @__PURE__ */ jsx(
|
|
58
|
+
"span",
|
|
59
|
+
{
|
|
60
|
+
className: "rounded border border-gray-200 bg-white px-2.5 py-1 font-medium text-[11px] text-gray-700",
|
|
61
|
+
children: label
|
|
62
|
+
},
|
|
63
|
+
label
|
|
64
|
+
))
|
|
65
|
+
}
|
|
66
|
+
),
|
|
67
|
+
/* @__PURE__ */ jsxs(
|
|
68
|
+
motion.div,
|
|
69
|
+
{
|
|
70
|
+
initial: { opacity: 0, y: 6 },
|
|
71
|
+
animate: { opacity: 1, y: 0 },
|
|
72
|
+
transition: { duration: 0.4, ease: EASE_OUT, delay: 1.3 },
|
|
73
|
+
className: "mt-3 flex items-start gap-2 border-gray-100 border-t pt-2.5",
|
|
74
|
+
children: [
|
|
75
|
+
/* @__PURE__ */ jsx("div", { className: "flex size-5 shrink-0 items-center justify-center rounded-full bg-emerald-100 font-bold text-[9px] text-emerald-700", children: "JC" }),
|
|
76
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
77
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold text-[11px] text-gray-900", children: "J. Chen" }),
|
|
78
|
+
/* @__PURE__ */ jsx("span", { className: "ml-1.5 text-[10px] text-gray-400", children: "10:44 AM" }),
|
|
79
|
+
/* @__PURE__ */ jsx("p", { className: "mt-0.5 text-[11px] text-gray-600", children: "Reviewed. PEP match is a false positive \u2014 approved." })
|
|
80
|
+
] })
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
] })
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
] });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export { AnimationSlackNotification };
|
|
92
|
+
//# sourceMappingURL=chunk-F7REPQOA.js.map
|
|
93
|
+
//# sourceMappingURL=chunk-F7REPQOA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/animations/animation-slack-notification.tsx"],"names":[],"mappings":"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","file":"chunk-F7REPQOA.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 AnimationSlackNotification({ className }: { className?: string }) {\n return (\n <div className={cn(\"flex flex-col bg-white p-4\", className)}>\n {/* Channel header */}\n <div className=\"flex items-center gap-2 border-gray-100 border-b pb-2.5\">\n <span className=\"font-bold text-[13px] text-gray-900\"># compliance-alerts</span>\n <span className=\"rounded bg-red-100 px-1.5 py-0.5 font-bold text-[9px] text-red-600\">\n 3 new\n </span>\n </div>\n\n {/* Bot 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=\"mt-3 flex gap-2.5\"\n >\n {/* Bot avatar */}\n <div className=\"flex size-8 shrink-0 items-center justify-center rounded-md bg-gray-900\">\n <svg width=\"14\" height=\"14\" 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\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"font-bold text-[13px] text-gray-900\">Cogentic</span>\n <span className=\"text-[10px] text-gray-400\">APP 10:42 AM</span>\n </div>\n\n {/* Attachment card */}\n <motion.div\n initial={{ opacity: 0, x: -8 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ duration: 0.4, ease: EASE_OUT, delay: 0.6 }}\n className=\"mt-1.5 rounded-md border-red-400 border-l-[3px] bg-gray-50 px-3 py-2.5\"\n >\n <p className=\"font-semibold text-[12px] text-gray-900\">\n Transfer flagged — manual review required\n </p>\n <div className=\"mt-1.5 flex flex-wrap gap-x-4 gap-y-1\">\n <span className=\"text-[11px] text-gray-500\">\n <span className=\"font-medium text-gray-700\">TXN-0847</span> · AU → SG\n </span>\n <span className=\"text-[11px] text-gray-500\">\n Risk: <span className=\"font-semibold text-red-500\">High (72)</span>\n </span>\n </div>\n <p className=\"mt-1.5 text-[11px] text-gray-500 leading-relaxed\">\n PEP screening match detected. Beneficiary threshold exceeded for SG corridor.\n </p>\n </motion.div>\n\n {/* Action buttons */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.3, delay: 0.9 }}\n className=\"mt-2 flex gap-1.5\"\n >\n {[\"Review\", \"Approve\", \"Escalate\"].map((label) => (\n <span\n key={label}\n className=\"rounded border border-gray-200 bg-white px-2.5 py-1 font-medium text-[11px] text-gray-700\"\n >\n {label}\n </span>\n ))}\n </motion.div>\n\n {/* Thread reply */}\n <motion.div\n initial={{ opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, ease: EASE_OUT, delay: 1.3 }}\n className=\"mt-3 flex items-start gap-2 border-gray-100 border-t pt-2.5\"\n >\n <div className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-emerald-100 font-bold text-[9px] text-emerald-700\">\n JC\n </div>\n <div>\n <span className=\"font-semibold text-[11px] text-gray-900\">J. Chen</span>\n <span className=\"ml-1.5 text-[10px] text-gray-400\">10:44 AM</span>\n <p className=\"mt-0.5 text-[11px] text-gray-600\">\n Reviewed. PEP match is a false positive — approved.\n </p>\n </div>\n </motion.div>\n </div>\n </motion.div>\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { EASE_OUT } from './chunk-TAPJEVUA.js';
|
|
3
|
+
import { useCycleIndex } from './chunk-6RWCZUAD.js';
|
|
4
|
+
import { __spreadValues, cn } from './chunk-GZNLQE3I.js';
|
|
5
|
+
import { Activity, ShieldCheck, AlertTriangle } from 'lucide-react';
|
|
6
|
+
import { LazyMotion, domAnimation, m } from 'motion/react';
|
|
7
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
var SCENARIOS = [
|
|
10
|
+
{
|
|
11
|
+
transfers: { value: "1,247", change: "12.3%", up: true },
|
|
12
|
+
compliant: { value: "1,238", change: "14.1%", up: true },
|
|
13
|
+
flagged: { value: "9", change: "8.2%", up: false },
|
|
14
|
+
bars: [30, 55, 70, 100, 45, 25, 60],
|
|
15
|
+
activeBar: 3
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
transfers: { value: "892", change: "6.7%", up: true },
|
|
19
|
+
compliant: { value: "874", change: "5.2%", up: true },
|
|
20
|
+
flagged: { value: "18", change: "22.4%", up: true },
|
|
21
|
+
bars: [45, 35, 60, 50, 80, 100, 40],
|
|
22
|
+
activeBar: 5
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
transfers: { value: "2,103", change: "18.9%", up: true },
|
|
26
|
+
compliant: { value: "2,091", change: "19.3%", up: true },
|
|
27
|
+
flagged: { value: "12", change: "4.1%", up: false },
|
|
28
|
+
bars: [60, 75, 50, 85, 65, 90, 100],
|
|
29
|
+
activeBar: 6
|
|
30
|
+
}
|
|
31
|
+
];
|
|
32
|
+
var DAYS = ["MO", "TU", "WE", "TH", "FR", "SA", "SU"];
|
|
33
|
+
var CYCLE_MS = 4e3;
|
|
34
|
+
function AnimatedValue({ value }) {
|
|
35
|
+
return /* @__PURE__ */ jsx(
|
|
36
|
+
m.span,
|
|
37
|
+
{
|
|
38
|
+
initial: { opacity: 0, y: 6 },
|
|
39
|
+
animate: { opacity: 1, y: 0 },
|
|
40
|
+
transition: { duration: 0.35, ease: EASE_OUT },
|
|
41
|
+
children: value
|
|
42
|
+
},
|
|
43
|
+
value
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
function AnimationRealtimeUpdates({ className }) {
|
|
47
|
+
const [containerRef, index] = useCycleIndex(SCENARIOS.length, CYCLE_MS);
|
|
48
|
+
const scenario = SCENARIOS[index];
|
|
49
|
+
const metrics = [
|
|
50
|
+
__spreadValues({
|
|
51
|
+
icon: Activity,
|
|
52
|
+
label: "Transfers screened",
|
|
53
|
+
sub: "All protocols"
|
|
54
|
+
}, scenario.transfers),
|
|
55
|
+
__spreadValues({
|
|
56
|
+
icon: ShieldCheck,
|
|
57
|
+
label: "Compliant",
|
|
58
|
+
sub: "Auto-approved"
|
|
59
|
+
}, scenario.compliant),
|
|
60
|
+
__spreadValues({
|
|
61
|
+
icon: AlertTriangle,
|
|
62
|
+
label: "Flagged",
|
|
63
|
+
sub: "Manual review"
|
|
64
|
+
}, scenario.flagged)
|
|
65
|
+
];
|
|
66
|
+
return /* @__PURE__ */ jsx(LazyMotion, { features: domAnimation, children: /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("flex flex-col p-5", className), children: [
|
|
67
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between", children: [
|
|
68
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
69
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold text-[15px] text-foreground", children: "Compliance Overview" }),
|
|
70
|
+
/* @__PURE__ */ jsx("p", { className: "text-[12px] text-gray-400", children: "Weekly screening summary" })
|
|
71
|
+
] }),
|
|
72
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-0.5", children: [
|
|
73
|
+
/* @__PURE__ */ jsx("span", { className: "size-1 rounded-full bg-gray-300" }),
|
|
74
|
+
/* @__PURE__ */ jsx("span", { className: "size-1 rounded-full bg-gray-300" }),
|
|
75
|
+
/* @__PURE__ */ jsx("span", { className: "size-1 rounded-full bg-gray-300" })
|
|
76
|
+
] })
|
|
77
|
+
] }),
|
|
78
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4 flex flex-col gap-3", children: metrics.map((metric) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
79
|
+
/* @__PURE__ */ jsx("div", { className: "flex size-9 items-center justify-center rounded-lg bg-gray-100", children: /* @__PURE__ */ jsx(metric.icon, { className: "size-4 text-foreground", strokeWidth: 1.5 }) }),
|
|
80
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1", children: [
|
|
81
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium text-[13px] text-foreground", children: metric.label }),
|
|
82
|
+
/* @__PURE__ */ jsx("p", { className: "text-[10px] text-gray-400", children: metric.sub })
|
|
83
|
+
] }),
|
|
84
|
+
/* @__PURE__ */ jsx("div", { className: "text-right", children: /* @__PURE__ */ jsx("p", { className: "font-mono font-semibold text-[14px] text-foreground", children: /* @__PURE__ */ jsx(AnimatedValue, { value: metric.value }) }) }),
|
|
85
|
+
/* @__PURE__ */ jsxs(
|
|
86
|
+
"div",
|
|
87
|
+
{
|
|
88
|
+
className: cn(
|
|
89
|
+
"flex items-center gap-0.5 font-medium text-[11px]",
|
|
90
|
+
metric.up ? "text-foreground" : "text-emerald-600"
|
|
91
|
+
),
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ jsx(
|
|
94
|
+
"svg",
|
|
95
|
+
{
|
|
96
|
+
width: "10",
|
|
97
|
+
height: "10",
|
|
98
|
+
viewBox: "0 0 10 10",
|
|
99
|
+
className: cn(!metric.up && "rotate-180"),
|
|
100
|
+
children: /* @__PURE__ */ jsx("path", { d: "M5 2L8.5 7H1.5L5 2Z", fill: "currentColor" })
|
|
101
|
+
}
|
|
102
|
+
),
|
|
103
|
+
/* @__PURE__ */ jsx(AnimatedValue, { value: metric.change })
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
)
|
|
107
|
+
] }, metric.label)) }),
|
|
108
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4 flex flex-1 items-end gap-2", children: scenario.bars.map((height, i) => /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col items-center gap-1.5", children: [
|
|
109
|
+
/* @__PURE__ */ jsx("div", { className: "relative w-full", style: { height: 80 }, children: /* @__PURE__ */ jsx(
|
|
110
|
+
m.div,
|
|
111
|
+
{
|
|
112
|
+
className: cn(
|
|
113
|
+
"absolute inset-x-0 bottom-0 rounded-t-md",
|
|
114
|
+
i === scenario.activeBar ? "bg-tagline" : "bg-foreground"
|
|
115
|
+
),
|
|
116
|
+
style: { transformOrigin: "bottom", height: "100%" },
|
|
117
|
+
initial: { scaleY: 0 },
|
|
118
|
+
animate: { scaleY: height / 100 },
|
|
119
|
+
transition: {
|
|
120
|
+
duration: 0.6,
|
|
121
|
+
delay: i * 0.05,
|
|
122
|
+
ease: EASE_OUT
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
`${index}-${i}`
|
|
126
|
+
) }),
|
|
127
|
+
/* @__PURE__ */ jsx(
|
|
128
|
+
"span",
|
|
129
|
+
{
|
|
130
|
+
className: cn(
|
|
131
|
+
"font-medium text-[10px]",
|
|
132
|
+
i === scenario.activeBar ? "text-gray-900" : "text-gray-400"
|
|
133
|
+
),
|
|
134
|
+
children: DAYS[i]
|
|
135
|
+
}
|
|
136
|
+
)
|
|
137
|
+
] }, i)) })
|
|
138
|
+
] }) });
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export { AnimationRealtimeUpdates };
|
|
142
|
+
//# sourceMappingURL=chunk-FKPK3CB7.js.map
|
|
143
|
+
//# sourceMappingURL=chunk-FKPK3CB7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/animations/animation-realtime-updates.tsx"],"names":[],"mappings":"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","file":"chunk-FKPK3CB7.js","sourcesContent":["\"use client\"\n\nimport { Activity, AlertTriangle, ShieldCheck } from \"lucide-react\"\nimport { domAnimation, LazyMotion, m } from \"motion/react\"\n\nimport { useCycleIndex } from \"../hooks/use-cycle-index\"\n\nimport { EASE_OUT } from \"../lib/animation\"\nimport { cn } from \"../lib/utils\"\n\ntype Scenario = {\n transfers: { value: string; change: string; up: boolean }\n compliant: { value: string; change: string; up: boolean }\n flagged: { value: string; change: string; up: boolean }\n bars: number[]\n activeBar: number\n}\n\nconst SCENARIOS: Scenario[] = [\n {\n transfers: { value: \"1,247\", change: \"12.3%\", up: true },\n compliant: { value: \"1,238\", change: \"14.1%\", up: true },\n flagged: { value: \"9\", change: \"8.2%\", up: false },\n bars: [30, 55, 70, 100, 45, 25, 60],\n activeBar: 3,\n },\n {\n transfers: { value: \"892\", change: \"6.7%\", up: true },\n compliant: { value: \"874\", change: \"5.2%\", up: true },\n flagged: { value: \"18\", change: \"22.4%\", up: true },\n bars: [45, 35, 60, 50, 80, 100, 40],\n activeBar: 5,\n },\n {\n transfers: { value: \"2,103\", change: \"18.9%\", up: true },\n compliant: { value: \"2,091\", change: \"19.3%\", up: true },\n flagged: { value: \"12\", change: \"4.1%\", up: false },\n bars: [60, 75, 50, 85, 65, 90, 100],\n activeBar: 6,\n },\n]\n\nconst DAYS = [\"MO\", \"TU\", \"WE\", \"TH\", \"FR\", \"SA\", \"SU\"]\n\nconst CYCLE_MS = 4000\n\nfunction AnimatedValue({ value }: { value: string }) {\n return (\n <m.span\n key={value}\n initial={{ opacity: 0, y: 6 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.35, ease: EASE_OUT }}\n >\n {value}\n </m.span>\n )\n}\n\nexport default function AnimationRealtimeUpdates({ className }: { className?: string }) {\n const [containerRef, index] = useCycleIndex(SCENARIOS.length, CYCLE_MS)\n const scenario = SCENARIOS[index]\n\n const metrics = [\n {\n icon: Activity,\n label: \"Transfers screened\",\n sub: \"All protocols\",\n ...scenario.transfers,\n },\n {\n icon: ShieldCheck,\n label: \"Compliant\",\n sub: \"Auto-approved\",\n ...scenario.compliant,\n },\n {\n icon: AlertTriangle,\n label: \"Flagged\",\n sub: \"Manual review\",\n ...scenario.flagged,\n },\n ]\n\n return (\n <LazyMotion features={domAnimation}>\n <div ref={containerRef} className={cn(\"flex flex-col p-5\", className)}>\n {/* Dashboard header */}\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"font-semibold text-[15px] text-foreground\">Compliance Overview</p>\n <p className=\"text-[12px] text-gray-400\">Weekly screening summary</p>\n </div>\n <div className=\"flex gap-0.5\">\n <span className=\"size-1 rounded-full bg-gray-300\" />\n <span className=\"size-1 rounded-full bg-gray-300\" />\n <span className=\"size-1 rounded-full bg-gray-300\" />\n </div>\n </div>\n\n {/* Metric rows */}\n <div className=\"mt-4 flex flex-col gap-3\">\n {metrics.map((metric) => (\n <div key={metric.label} className=\"flex items-center gap-3\">\n <div className=\"flex size-9 items-center justify-center rounded-lg bg-gray-100\">\n <metric.icon className=\"size-4 text-foreground\" strokeWidth={1.5} />\n </div>\n <div className=\"flex-1\">\n <p className=\"font-medium text-[13px] text-foreground\">{metric.label}</p>\n <p className=\"text-[10px] text-gray-400\">{metric.sub}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-mono font-semibold text-[14px] text-foreground\">\n <AnimatedValue value={metric.value} />\n </p>\n </div>\n <div\n className={cn(\n \"flex items-center gap-0.5 font-medium text-[11px]\",\n metric.up ? \"text-foreground\" : \"text-emerald-600\",\n )}\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n className={cn(!metric.up && \"rotate-180\")}\n >\n <path d=\"M5 2L8.5 7H1.5L5 2Z\" fill=\"currentColor\" />\n </svg>\n <AnimatedValue value={metric.change} />\n </div>\n </div>\n ))}\n </div>\n\n {/* Bar chart */}\n <div className=\"mt-4 flex flex-1 items-end gap-2\">\n {scenario.bars.map((height, i) => (\n <div key={i} className=\"flex flex-1 flex-col items-center gap-1.5\">\n <div className=\"relative w-full\" style={{ height: 80 }}>\n <m.div\n className={cn(\n \"absolute inset-x-0 bottom-0 rounded-t-md\",\n i === scenario.activeBar ? \"bg-tagline\" : \"bg-foreground\",\n )}\n style={{ transformOrigin: \"bottom\", height: \"100%\" }}\n initial={{ scaleY: 0 }}\n animate={{ scaleY: height / 100 }}\n transition={{\n duration: 0.6,\n delay: i * 0.05,\n ease: EASE_OUT,\n }}\n key={`${index}-${i}`}\n />\n </div>\n <span\n className={cn(\n \"font-medium text-[10px]\",\n i === scenario.activeBar ? \"text-gray-900\" : \"text-gray-400\",\n )}\n >\n {DAYS[i]}\n </span>\n </div>\n ))}\n </div>\n </div>\n </LazyMotion>\n )\n}\n"]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { twMerge } from 'tailwind-merge';
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __defProps = Object.defineProperties;
|
|
7
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
8
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
9
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
11
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
12
|
+
var __spreadValues = (a, b) => {
|
|
13
|
+
for (var prop in b || (b = {}))
|
|
14
|
+
if (__hasOwnProp.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
if (__getOwnPropSymbols)
|
|
17
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
18
|
+
if (__propIsEnum.call(b, prop))
|
|
19
|
+
__defNormalProp(a, prop, b[prop]);
|
|
20
|
+
}
|
|
21
|
+
return a;
|
|
22
|
+
};
|
|
23
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
24
|
+
var __objRest = (source, exclude) => {
|
|
25
|
+
var target = {};
|
|
26
|
+
for (var prop in source)
|
|
27
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
28
|
+
target[prop] = source[prop];
|
|
29
|
+
if (source != null && __getOwnPropSymbols)
|
|
30
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
31
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
32
|
+
target[prop] = source[prop];
|
|
33
|
+
}
|
|
34
|
+
return target;
|
|
35
|
+
};
|
|
36
|
+
function cn(...inputs) {
|
|
37
|
+
return twMerge(clsx(inputs));
|
|
38
|
+
}
|
|
39
|
+
function timeAgo(date) {
|
|
40
|
+
const now = /* @__PURE__ */ new Date();
|
|
41
|
+
const then = new Date(date);
|
|
42
|
+
const diffMs = now.getTime() - then.getTime();
|
|
43
|
+
const diffMins = Math.floor(diffMs / 6e4);
|
|
44
|
+
if (diffMins < 60) return `${diffMins}m ago`;
|
|
45
|
+
const diffHrs = Math.floor(diffMins / 60);
|
|
46
|
+
if (diffHrs < 24) return `${diffHrs}h ago`;
|
|
47
|
+
const diffDays = Math.floor(diffHrs / 24);
|
|
48
|
+
if (diffDays < 30) return `${diffDays}d ago`;
|
|
49
|
+
const diffMonths = Math.floor(diffDays / 30);
|
|
50
|
+
return `${diffMonths}mo ago`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { __objRest, __spreadProps, __spreadValues, cn, timeAgo };
|
|
54
|
+
//# sourceMappingURL=chunk-GZNLQE3I.js.map
|
|
55
|
+
//# sourceMappingURL=chunk-GZNLQE3I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;AAEO,SAAS,QAAQ,IAAA,EAAsB;AAC5C,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAI,CAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAK,OAAA,EAAQ;AAC5C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,GAAK,CAAA;AAC1C,EAAA,IAAI,QAAA,GAAW,EAAA,EAAI,OAAO,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAA;AACrC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,EAAE,CAAA;AACxC,EAAA,IAAI,OAAA,GAAU,EAAA,EAAI,OAAO,CAAA,EAAG,OAAO,CAAA,KAAA,CAAA;AACnC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACxC,EAAA,IAAI,QAAA,GAAW,EAAA,EAAI,OAAO,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAA;AACrC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,EAAE,CAAA;AAC3C,EAAA,OAAO,GAAG,UAAU,CAAA,MAAA,CAAA;AACtB","file":"chunk-GZNLQE3I.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function timeAgo(date: string): string {\n const now = new Date()\n const then = new Date(date)\n const diffMs = now.getTime() - then.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n if (diffMins < 60) return `${diffMins}m ago`\n const diffHrs = Math.floor(diffMins / 60)\n if (diffHrs < 24) return `${diffHrs}h ago`\n const diffDays = Math.floor(diffHrs / 24)\n if (diffDays < 30) return `${diffDays}d ago`\n const diffMonths = Math.floor(diffDays / 30)\n return `${diffMonths}mo ago`\n}\n"]}
|