2424 </button >
2525 </div >
2626
27- <div class =" result" v-if =" currentNumber !== null" >
28- <div class =" number" >{{ currentNumber }}</div >
27+ <div class =" result" v-if =" displayNumber !== null" >
28+ <div class =" number" >{{ displayNumber }}</div >
2929 </div >
3030
3131 <div class =" history-section" v-if =" drawnNumbers.length > 0" >
4141 </div >
4242 <div class =" history" >
4343 <div
44- v-for =" (num, index) in drawnNumbers"
45- :key =" num "
44+ v-for =" item in drawnNumbers"
45+ :key =" item.id "
4646 class =" history-number"
47- :class =" { 'new-number': index === drawnNumbers.length - 1 }"
47+ :class =" { 'new-number': item.id === drawnNumbers[drawnNumbers .length - 1].id }"
4848 :style =" {
49- '--gradient-opacity': 1 - (drawnNumbers.length - 1 - index ) / drawnNumbers.length,
50- '--gradient-delay': `${index * 0.1}s`
49+ '--gradient-opacity': 1 - (drawnNumbers.length - 1 - drawnNumbers.indexOf(item) ) / drawnNumbers.length,
50+ '--gradient-delay': `${drawnNumbers.indexOf(item) * 0.1}s`
5151 }"
5252 >
53- {{ num }}
53+ {{ item.number }}
5454 </div >
5555 </div >
5656 </div >
5959 <h3 >Tips</h3 >
6060 <ul class =" tips-list" >
6161 <li >Set your maximum number (1-100) to define the range</li >
62- <li >Click "Draw" to randomly select a number</li >
63- <li >Each number can only be drawn once</li >
64- <li >Use "Clear History" to start fresh</li >
65- <li >Numbers are drawn without replacement</li >
62+ <li >Click <span class =" button-text draw" >Draw</span > to randomly select a number</li >
63+ <li >Numbers can be drawn multiple times</li >
64+ <li >Use <span class =" button-text clear" >Clear History</span > to start fresh</li >
65+ <li >Each draw is completely random and independent</li >
66+ <li >History shows the last 10 drawn numbers</li >
6667 </ul >
6768 </div >
6869 </main >
@@ -77,53 +78,49 @@ export default {
7778 setup () {
7879 const maxNumber = ref (10 )
7980 const currentNumber = ref (null )
81+ const displayNumber = ref (null )
8082 const drawnNumbers = ref ([])
8183 const isDrawing = ref (false )
82- const availableNumbers = ref ([])
8384 const isValid = ref (true )
85+ let historyId = 0
8486
8587 const validateInput = () => {
8688 if (maxNumber .value < 1 ) maxNumber .value = 1
8789 if (maxNumber .value > 100 ) maxNumber .value = 100
8890 isValid .value = true
8991 }
9092
91- const resetAvailableNumbers = () => {
92- availableNumbers .value = Array .from (
93- { length: maxNumber .value },
94- (_ , i ) => i + 1
95- )
96- }
97-
9893 const clearHistory = () => {
9994 drawnNumbers .value = []
100- resetAvailableNumbers ()
10195 currentNumber .value = null
96+ displayNumber .value = null
97+ historyId = 0
10298 }
10399
104100 const drawLot = () => {
105- if (isDrawing .value || availableNumbers . value . length === 0 ) return
101+ if (isDrawing .value ) return
106102
107103 isDrawing .value = true
108104 let startTime = null
109- const duration = 2000 // 2 seconds
105+ const duration = 1000 // 1 second
110106
111107 const animate = (timestamp ) => {
112108 if (! startTime) startTime = timestamp
113109 const progress = timestamp - startTime
114110
115111 if (progress < duration) {
116- const randomIndex = Math . floor ( Math . random () * availableNumbers . value . length )
117- currentNumber .value = availableNumbers . value [randomIndex]
112+ // During animation, show random numbers from the same range
113+ displayNumber .value = Math . floor ( Math . random () * maxNumber . value ) + 1
118114 requestAnimationFrame (animate)
119115 } else {
120- const randomIndex = Math .floor (Math .random () * availableNumbers .value .length )
121- currentNumber .value = availableNumbers .value [randomIndex]
122- drawnNumbers .value .push (currentNumber .value )
116+ // At the end of animation, generate the actual random number
117+ const finalNumber = Math .floor (Math .random () * maxNumber .value ) + 1
118+ currentNumber .value = finalNumber
119+ displayNumber .value = finalNumber
120+ drawnNumbers .value .push ({ id: historyId++ , number: finalNumber })
123121 if (drawnNumbers .value .length > 10 ) {
124122 drawnNumbers .value .shift ()
125123 }
126- availableNumbers .value .splice (randomIndex, 1 )
127124 isDrawing .value = false
128125 }
129126 }
@@ -132,16 +129,17 @@ export default {
132129 }
133130
134131 onMounted (() => {
135- resetAvailableNumbers ()
132+ validateInput ()
136133 })
137134
138135 watch (maxNumber, () => {
139- resetAvailableNumbers ()
136+ validateInput ()
140137 })
141138
142139 return {
143140 maxNumber,
144141 currentNumber,
142+ displayNumber,
145143 drawnNumbers,
146144 isDrawing,
147145 drawLot,
@@ -231,18 +229,21 @@ header {
231229 border : none ;
232230 border-radius : 6px ;
233231 font-size : 1.1rem ;
234- font-weight : bold ;
232+ font-weight : 600 ;
235233 cursor : pointer ;
236- transition : transform 0.2s ease , background-color 0.2s ease ;
234+ transition : all 0.3s ease ;
235+ box-shadow : 0 2px 4px rgba (0 , 0 , 0 , 0.1 );
237236
238237 & :hover:not (:disabled ) {
239238 transform : translateY (-2px );
240239 background-color : darken (#4a90e2 , 10% );
240+ box-shadow : 0 4px 6px rgba (0 , 0 , 0 , 0.2 );
241241 }
242242
243243 & :disabled {
244244 background-color : #ccc ;
245245 cursor : not-allowed ;
246+ opacity : 0.7 ;
246247 }
247248}
248249
@@ -390,17 +391,38 @@ header {
390391 font-weight : 600 ;
391392 transition : all 0.3s ease ;
392393 box-shadow : 0 2px 4px rgba (0 , 0 , 0 , 0.1 );
394+
395+ & :hover:not (:disabled ) {
396+ transform : translateY (-2px );
397+ background : #c0392b ;
398+ box-shadow : 0 4px 6px rgba (0 , 0 , 0 , 0.2 );
399+ }
400+
401+ & :disabled {
402+ background : #ccc ;
403+ cursor : not-allowed ;
404+ opacity : 0.7 ;
405+ }
393406}
394407
395- .clear-button :hover:not (:disabled ) {
396- background : #c0392b ;
397- transform : translateY (-2px );
398- box-shadow : 0 4px 6px rgba (0 , 0 , 0 , 0.2 );
399- }
400-
401- .clear-button :disabled {
402- background : #ccc ;
403- cursor : not-allowed ;
404- opacity : 0.7 ;
408+ .button-text {
409+ display : inline-block ;
410+ padding : 0.2rem 0.5rem ;
411+ border-radius : 4px ;
412+ font-weight : 600 ;
413+ font-size : 0.9em ;
414+ margin : 0 0.2rem ;
415+
416+ & .draw {
417+ background-color : var (--primary-color );
418+ color : white ;
419+ box-shadow : 0 2px 4px rgba (0 , 0 , 0 , 0.1 );
420+ }
421+
422+ & .clear {
423+ background-color : #e74c3c ;
424+ color : white ;
425+ box-shadow : 0 2px 4px rgba (0 , 0 , 0 , 0.1 );
426+ }
405427}
406428 </style >
0 commit comments