@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.
Files changed (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +139 -0
  3. package/dist/animations/animation-ai-analysis.d.ts +7 -0
  4. package/dist/animations/animation-ai-analysis.js +7 -0
  5. package/dist/animations/animation-ai-analysis.js.map +1 -0
  6. package/dist/animations/animation-audit-trail.d.ts +7 -0
  7. package/dist/animations/animation-audit-trail.js +5 -0
  8. package/dist/animations/animation-audit-trail.js.map +1 -0
  9. package/dist/animations/animation-compliance-reports.d.ts +7 -0
  10. package/dist/animations/animation-compliance-reports.js +7 -0
  11. package/dist/animations/animation-compliance-reports.js.map +1 -0
  12. package/dist/animations/animation-custom-rules.d.ts +7 -0
  13. package/dist/animations/animation-custom-rules.js +7 -0
  14. package/dist/animations/animation-custom-rules.js.map +1 -0
  15. package/dist/animations/animation-jira-ticket.d.ts +7 -0
  16. package/dist/animations/animation-jira-ticket.js +6 -0
  17. package/dist/animations/animation-jira-ticket.js.map +1 -0
  18. package/dist/animations/animation-jurisdiction-detection.d.ts +7 -0
  19. package/dist/animations/animation-jurisdiction-detection.js +7 -0
  20. package/dist/animations/animation-jurisdiction-detection.js.map +1 -0
  21. package/dist/animations/animation-multi-protocol.d.ts +7 -0
  22. package/dist/animations/animation-multi-protocol.js +5 -0
  23. package/dist/animations/animation-multi-protocol.js.map +1 -0
  24. package/dist/animations/animation-pricing-preview.d.ts +16 -0
  25. package/dist/animations/animation-pricing-preview.js +7 -0
  26. package/dist/animations/animation-pricing-preview.js.map +1 -0
  27. package/dist/animations/animation-realtime-updates.d.ts +7 -0
  28. package/dist/animations/animation-realtime-updates.js +8 -0
  29. package/dist/animations/animation-realtime-updates.js.map +1 -0
  30. package/dist/animations/animation-rest-api.d.ts +7 -0
  31. package/dist/animations/animation-rest-api.js +5 -0
  32. package/dist/animations/animation-rest-api.js.map +1 -0
  33. package/dist/animations/animation-risk-scoring.d.ts +7 -0
  34. package/dist/animations/animation-risk-scoring.js +8 -0
  35. package/dist/animations/animation-risk-scoring.js.map +1 -0
  36. package/dist/animations/animation-sandbox.d.ts +7 -0
  37. package/dist/animations/animation-sandbox.js +5 -0
  38. package/dist/animations/animation-sandbox.js.map +1 -0
  39. package/dist/animations/animation-scheduled-reports.d.ts +7 -0
  40. package/dist/animations/animation-scheduled-reports.js +7 -0
  41. package/dist/animations/animation-scheduled-reports.js.map +1 -0
  42. package/dist/animations/animation-secure-messaging.d.ts +7 -0
  43. package/dist/animations/animation-secure-messaging.js +6 -0
  44. package/dist/animations/animation-secure-messaging.js.map +1 -0
  45. package/dist/animations/animation-slack-notification.d.ts +7 -0
  46. package/dist/animations/animation-slack-notification.js +6 -0
  47. package/dist/animations/animation-slack-notification.js.map +1 -0
  48. package/dist/animations/animation-sop-mapping.d.ts +7 -0
  49. package/dist/animations/animation-sop-mapping.js +5 -0
  50. package/dist/animations/animation-sop-mapping.js.map +1 -0
  51. package/dist/animations/animation-team-routing.d.ts +7 -0
  52. package/dist/animations/animation-team-routing.js +7 -0
  53. package/dist/animations/animation-team-routing.js.map +1 -0
  54. package/dist/animations/animation-teams-notification.d.ts +7 -0
  55. package/dist/animations/animation-teams-notification.js +6 -0
  56. package/dist/animations/animation-teams-notification.js.map +1 -0
  57. package/dist/animations/animation-vasp-identification.d.ts +7 -0
  58. package/dist/animations/animation-vasp-identification.js +7 -0
  59. package/dist/animations/animation-vasp-identification.js.map +1 -0
  60. package/dist/animations/animation-webhooks.d.ts +7 -0
  61. package/dist/animations/animation-webhooks.js +6 -0
  62. package/dist/animations/animation-webhooks.js.map +1 -0
  63. package/dist/blocks/auth-form.d.ts +18 -0
  64. package/dist/blocks/auth-form.js +7 -0
  65. package/dist/blocks/auth-form.js.map +1 -0
  66. package/dist/blocks/feature-section.d.ts +17 -0
  67. package/dist/blocks/feature-section.js +5 -0
  68. package/dist/blocks/feature-section.js.map +1 -0
  69. package/dist/blocks/hero-section.d.ts +19 -0
  70. package/dist/blocks/hero-section.js +5 -0
  71. package/dist/blocks/hero-section.js.map +1 -0
  72. package/dist/blocks/pricing-table.d.ts +24 -0
  73. package/dist/blocks/pricing-table.js +6 -0
  74. package/dist/blocks/pricing-table.js.map +1 -0
  75. package/dist/blocks/stat-card.d.ts +15 -0
  76. package/dist/blocks/stat-card.js +6 -0
  77. package/dist/blocks/stat-card.js.map +1 -0
  78. package/dist/card-Cumdyf_G.d.ts +15 -0
  79. package/dist/charts.d.ts +4 -0
  80. package/dist/charts.js +5 -0
  81. package/dist/charts.js.map +1 -0
  82. package/dist/chatbot.d.ts +280 -0
  83. package/dist/chatbot.js +2202 -0
  84. package/dist/chatbot.js.map +1 -0
  85. package/dist/chunk-4NEQV6H2.js +39 -0
  86. package/dist/chunk-4NEQV6H2.js.map +1 -0
  87. package/dist/chunk-4YD3YS4B.js +110 -0
  88. package/dist/chunk-4YD3YS4B.js.map +1 -0
  89. package/dist/chunk-5JLZ42JT.js +125 -0
  90. package/dist/chunk-5JLZ42JT.js.map +1 -0
  91. package/dist/chunk-5OOO6TRA.js +111 -0
  92. package/dist/chunk-5OOO6TRA.js.map +1 -0
  93. package/dist/chunk-65Z2VEKG.js +161 -0
  94. package/dist/chunk-65Z2VEKG.js.map +1 -0
  95. package/dist/chunk-6RWCZUAD.js +12 -0
  96. package/dist/chunk-6RWCZUAD.js.map +1 -0
  97. package/dist/chunk-7HRPF2N2.js +56 -0
  98. package/dist/chunk-7HRPF2N2.js.map +1 -0
  99. package/dist/chunk-BNFSXNP2.js +71 -0
  100. package/dist/chunk-BNFSXNP2.js.map +1 -0
  101. package/dist/chunk-BTFYV3TI.js +102 -0
  102. package/dist/chunk-BTFYV3TI.js.map +1 -0
  103. package/dist/chunk-BTZB4JRC.js +117 -0
  104. package/dist/chunk-BTZB4JRC.js.map +1 -0
  105. package/dist/chunk-BZSA47MS.js +121 -0
  106. package/dist/chunk-BZSA47MS.js.map +1 -0
  107. package/dist/chunk-CG5JA7FM.js +107 -0
  108. package/dist/chunk-CG5JA7FM.js.map +1 -0
  109. package/dist/chunk-EFLWU2JP.js +145 -0
  110. package/dist/chunk-EFLWU2JP.js.map +1 -0
  111. package/dist/chunk-F7REPQOA.js +93 -0
  112. package/dist/chunk-F7REPQOA.js.map +1 -0
  113. package/dist/chunk-FKPK3CB7.js +143 -0
  114. package/dist/chunk-FKPK3CB7.js.map +1 -0
  115. package/dist/chunk-GZNLQE3I.js +55 -0
  116. package/dist/chunk-GZNLQE3I.js.map +1 -0
  117. package/dist/chunk-H7VUIMEL.js +172 -0
  118. package/dist/chunk-H7VUIMEL.js.map +1 -0
  119. package/dist/chunk-HTYR73ON.js +161 -0
  120. package/dist/chunk-HTYR73ON.js.map +1 -0
  121. package/dist/chunk-I26ZXVSY.js +124 -0
  122. package/dist/chunk-I26ZXVSY.js.map +1 -0
  123. package/dist/chunk-IKATDPHG.js +92 -0
  124. package/dist/chunk-IKATDPHG.js.map +1 -0
  125. package/dist/chunk-KUOF3XRZ.js +108 -0
  126. package/dist/chunk-KUOF3XRZ.js.map +1 -0
  127. package/dist/chunk-LW6GAWZM.js +148 -0
  128. package/dist/chunk-LW6GAWZM.js.map +1 -0
  129. package/dist/chunk-N7PBUY7G.js +110 -0
  130. package/dist/chunk-N7PBUY7G.js.map +1 -0
  131. package/dist/chunk-NAPDFVBI.js +102 -0
  132. package/dist/chunk-NAPDFVBI.js.map +1 -0
  133. package/dist/chunk-RTK7R4KZ.js +66 -0
  134. package/dist/chunk-RTK7R4KZ.js.map +1 -0
  135. package/dist/chunk-RXV2XUDZ.js +31 -0
  136. package/dist/chunk-RXV2XUDZ.js.map +1 -0
  137. package/dist/chunk-RZZTDJHG.js +110 -0
  138. package/dist/chunk-RZZTDJHG.js.map +1 -0
  139. package/dist/chunk-SNOJLZP4.js +197 -0
  140. package/dist/chunk-SNOJLZP4.js.map +1 -0
  141. package/dist/chunk-TAPJEVUA.js +24 -0
  142. package/dist/chunk-TAPJEVUA.js.map +1 -0
  143. package/dist/chunk-U4EPKN7G.js +518 -0
  144. package/dist/chunk-U4EPKN7G.js.map +1 -0
  145. package/dist/chunk-VWSX75RB.js +202 -0
  146. package/dist/chunk-VWSX75RB.js.map +1 -0
  147. package/dist/chunk-XFWKI45G.js +800 -0
  148. package/dist/chunk-XFWKI45G.js.map +1 -0
  149. package/dist/chunk-XQYFQ6PU.js +77 -0
  150. package/dist/chunk-XQYFQ6PU.js.map +1 -0
  151. package/dist/index-CcPuHWa-.d.ts +118 -0
  152. package/dist/index.d.ts +1385 -0
  153. package/dist/index.js +8673 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/workflow.d.ts +165 -0
  156. package/dist/workflow.js +5 -0
  157. package/dist/workflow.js.map +1 -0
  158. package/package.json +157 -0
  159. 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> &middot; AU &rarr; 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"]}