feat: spin the wheel, objednavani scrape menu, historie cen
CI / Generate TypeScript types (push) Successful in 11s
CI / Server unit tests (push) Successful in 25s
CI / Build server (push) Successful in 29s
CI / Build client (push) Successful in 39s
CI / Playwright E2E tests (push) Successful in 1m52s
CI / Build and push Docker image (push) Successful in 51s
CI / Notify (push) Successful in 2s
CI / Generate TypeScript types (push) Successful in 11s
CI / Server unit tests (push) Successful in 25s
CI / Build server (push) Successful in 29s
CI / Build client (push) Successful in 39s
CI / Playwright E2E tests (push) Successful in 1m52s
CI / Build and push Docker image (push) Successful in 51s
CI / Notify (push) Successful in 2s
This commit is contained in:
35 files changed
+3979
-15
No files matched your search
@@ -0,0 +1,163 @@
|
||||
.wheel-confetti {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: 2000; // nad modalem (bootstrap 1055)
|
||||
pointer-events: none;
|
||||
overflow: hidden;
|
||||
|
||||
> span {
|
||||
position: absolute;
|
||||
will-change: transform, opacity;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
}
|
||||
|
||||
// Vrh: rychle vzhůru do vrcholu (zpomalení), pak volný pád (zrychlení)
|
||||
@keyframes confetti-throw {
|
||||
0% { transform: translate3d(0, 0, 0) rotate(0deg) scale(0.4); opacity: 0; animation-timing-function: cubic-bezier(0.2, 0.7, 0.4, 1); }
|
||||
6% { opacity: 1; }
|
||||
38% { transform: translate3d(var(--x1), var(--y1), 0) rotate(var(--r1)) scale(1); animation-timing-function: cubic-bezier(0.5, 0, 0.9, 0.6); }
|
||||
88% { opacity: 1; }
|
||||
100% { transform: translate3d(var(--x2), var(--y2), 0) rotate(var(--r2)) scale(1); opacity: 0; }
|
||||
}
|
||||
|
||||
// Déšť: plynulý pád shora s mírným houpáním
|
||||
@keyframes confetti-rain {
|
||||
0% { transform: translate3d(0, 0, 0) rotate(0deg); opacity: 0; animation-timing-function: ease-in-out; }
|
||||
8% { opacity: 1; }
|
||||
40% { transform: translate3d(var(--x1), var(--y1), 0) rotate(var(--r1)); animation-timing-function: ease-in; }
|
||||
88% { opacity: 1; }
|
||||
100% { transform: translate3d(var(--x2), var(--y2), 0) rotate(var(--r2)); opacity: 0; }
|
||||
}
|
||||
|
||||
// Samolepky Umamusume — stín pro čitelnost na libovolném pozadí
|
||||
.confetti-uma {
|
||||
filter: drop-shadow(0 3px 3px rgb(0 0 0 / 0.2));
|
||||
}
|
||||
|
||||
.confetti-uma-emoji {
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.confetti-uma-badge {
|
||||
padding: 4px 14px;
|
||||
border-radius: 999px;
|
||||
border: 3px solid #fff;
|
||||
color: #fff;
|
||||
font-family: 'M PLUS Rounded 1c', 'Nunito', sans-serif;
|
||||
font-weight: 900;
|
||||
font-size: 1.15rem;
|
||||
white-space: nowrap;
|
||||
text-shadow: 0 2px 0 rgb(0 0 0 / 0.2);
|
||||
box-shadow: 0 4px 0 rgb(0 0 0 / 0.15);
|
||||
}
|
||||
|
||||
.confetti-uma-img img {
|
||||
width: 92px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
// Portréty (bez průhlednosti) jako kulaté samolepky s barevným lemem
|
||||
.confetti-uma-img.round img,
|
||||
.confetti-uma-voice img.round {
|
||||
width: 84px;
|
||||
height: 84px;
|
||||
object-fit: cover;
|
||||
border-radius: 50%;
|
||||
border: 4px solid #fff;
|
||||
box-shadow: 0 0 0 3px #ff6fa3, 0 4px 8px rgb(0 0 0 / 0.3);
|
||||
}
|
||||
|
||||
.confetti-uma-voice img.round {
|
||||
width: 96px;
|
||||
height: 96px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.confetti-uma-banner {
|
||||
position: absolute;
|
||||
top: 38%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
padding: 12px 48px;
|
||||
font-family: 'M PLUS Rounded 1c', 'Nunito', sans-serif;
|
||||
font-weight: 900;
|
||||
font-size: clamp(2rem, 7vw, 4rem);
|
||||
color: #fff;
|
||||
background: linear-gradient(90deg, #e84d86, #ff6fa3);
|
||||
clip-path: polygon(24px 0, 100% 0, calc(100% - 24px) 100%, 0 100%);
|
||||
text-shadow: 0 3px 0 rgb(0 0 0 / 0.2);
|
||||
border-top: 5px solid #ffc531;
|
||||
border-bottom: 5px solid #ffc531;
|
||||
animation: uma-banner 1.8s cubic-bezier(0.2, 1.4, 0.4, 1) both;
|
||||
}
|
||||
|
||||
@keyframes uma-banner {
|
||||
0% { transform: translate(-150%, -50%) skewX(-12deg); opacity: 0; }
|
||||
25% { transform: translate(-50%, -50%) skewX(-12deg); opacity: 1; }
|
||||
75% { transform: translate(-50%, -50%) skewX(-12deg) scale(1.04); opacity: 1; }
|
||||
100% { transform: translate(60%, -50%) skewX(-12deg); opacity: 0; }
|
||||
}
|
||||
|
||||
// „Hláška" postavy při finálním výsledku
|
||||
.confetti-uma-voice {
|
||||
position: absolute;
|
||||
left: 16px;
|
||||
bottom: 16px;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
gap: 8px;
|
||||
max-width: min(460px, calc(100vw - 32px));
|
||||
animation: uma-voice 4.6s ease both;
|
||||
|
||||
img {
|
||||
flex: none;
|
||||
width: 110px;
|
||||
height: auto;
|
||||
filter: drop-shadow(0 4px 6px rgb(0 0 0 / 0.3));
|
||||
}
|
||||
}
|
||||
|
||||
.confetti-uma-bubble {
|
||||
position: relative;
|
||||
margin-bottom: 40px;
|
||||
padding: 12px 16px;
|
||||
background: #fff;
|
||||
color: #1d3322;
|
||||
border: 3px solid #ff6fa3;
|
||||
border-radius: 18px;
|
||||
box-shadow: 0 4px 0 #e84d86;
|
||||
font-family: 'M PLUS Rounded 1c', 'Nunito', sans-serif;
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
font-weight: 800;
|
||||
font-size: 0.95rem;
|
||||
line-height: 1.35;
|
||||
}
|
||||
|
||||
small {
|
||||
display: block;
|
||||
margin-top: 4px;
|
||||
color: #e84d86;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
// ocásek bubliny směrem k postavě
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: -14px;
|
||||
bottom: 14px;
|
||||
border: 8px solid transparent;
|
||||
border-right: 10px solid #ff6fa3;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes uma-voice {
|
||||
0% { opacity: 0; transform: translateY(40px) scale(0.8); }
|
||||
10% { opacity: 1; transform: translateY(0) scale(1.03); }
|
||||
15% { transform: translateY(0) scale(1); }
|
||||
85% { opacity: 1; transform: translateY(0); }
|
||||
100% { opacity: 0; transform: translateY(20px); }
|
||||
}
|
||||
Reference in new issue
Block a user