diff --git a/app/globals.css b/app/globals.css
index 9cb0ba6..4a60b39 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -252,6 +252,10 @@ big {
@apply font-roboto text-[60px] leading-[70px] -tracking-[1%];
}
+.numeric-display-1 {
+ @apply text-[80px] leading-[88px] -tracking-[1%] text-center font-normal font-roboto;
+}
+
.wheel-circle {
background: url('/wheel-circle.svg');
background-position: center;
diff --git a/components/lottery/RollingCounter/RollingCounter.tsx b/components/lottery/RollingCounter/RollingCounter.tsx
new file mode 100644
index 0000000..79b5e24
--- /dev/null
+++ b/components/lottery/RollingCounter/RollingCounter.tsx
@@ -0,0 +1,70 @@
+'use client';
+import { motion } from 'framer-motion';
+import { useEffect, useState } from 'react';
+
+interface RollingCounterProps {
+ numberString: string; // A 10-character string, e.g., "05-12-34-56-78"
+}
+
+const RollingCounter: React.FC
= ({ numberString }) => {
+ const [rollingValues, setRollingValues] = useState([]);
+ const [isStopped, setIsStopped] = useState([]); // Track stopped numbers
+
+ useEffect(() => {
+ // Parse input string into an array of numbers, removing hyphens
+ const targetNumbers = numberString
+ .replace(/-/g, '')
+ .split('')
+ .map((char) => parseInt(char, 10));
+ setRollingValues(targetNumbers);
+ setIsStopped(new Array(targetNumbers.length).fill(false));
+ }, [numberString]);
+
+ const getNumbers = () => Array.from({ length: 10 }, (_, i) => i);
+
+ return (
+
+ {rollingValues.map((targetValue, index) => (
+
+ {/* Container to display numbers */}
+
+
{
+ // Mark this number as stopped
+ setIsStopped((prev) => {
+ const newStatus = [...prev];
+ newStatus[index] = true;
+ return newStatus;
+ });
+ }}
+ className="absolute top-1/2 -translate-y-1/2 flex flex-col -mt-[52px]">
+ {getNumbers().map((num) => (
+
+ {num}
+
+ ))}
+
+
+ {/* Add a hyphen every two digits */}
+ {(index + 1) % 2 === 0 && index !== rollingValues.length - 1 && (
+
+ )}
+
+ ))}
+
+ );
+};
+
+export default RollingCounter;