feat(ui): animate navigation and operation icons

This commit is contained in:
2026-09-12 21:31:57 +03:00
parent d3ac8c242d
commit 8e58c016d2
8 changed files with 764 additions and 54 deletions
@@ -0,0 +1,365 @@
.icon {
overflow: visible;
& path {
--motion: none;
transform-box: fill-box;
transform-origin: center;
}
}
.deposit path:nth-child(-n + 2) {
transform-box: view-box;
transform-origin: 12px 9px;
--motion: bank-operation-coin-turn 1000ms ease-in-out both;
}
.repayment path:last-child {
--motion: bank-operation-ruble-in 1000ms ease-out both;
}
.topup path:last-child {
--motion: bank-operation-plus-in 900ms ease-out both;
}
.transfer path {
--shift: 3px;
--motion: bank-operation-exchange 700ms ease-in-out both;
&:last-child {
--shift: -3px;
}
}
.growth {
& path:nth-child(2) {
stroke-dasharray: 1;
--motion: bank-operation-draw 450ms ease-out both;
}
& path:last-child {
--motion: bank-operation-arrow-rise 350ms ease-out 400ms both;
}
}
.server {
& path:nth-child(3) {
--motion: bank-operation-blink 500ms ease-in-out both;
}
& path:nth-child(4) {
--motion: bank-operation-blink 500ms ease-in-out 220ms both;
}
}
.basket {
& path:not(:last-child) {
--motion: bank-operation-settle 850ms ease-in-out both;
}
& path:last-child {
opacity: 0;
fill: currentColor;
--motion: bank-operation-grocery-drop 850ms ease-out both;
}
}
.wine {
--motion: bank-operation-cheers 1100ms ease-in-out both;
transform-origin: 12px 21px;
& path:nth-child(2) {
fill: currentColor;
fill-opacity: 0.2;
transform-origin: bottom;
--motion: bank-operation-fill-glass 1100ms ease-out both;
}
}
.coffee {
& path:nth-child(3),
& path:nth-child(4) {
--motion: bank-operation-steam 1000ms ease-out var(--delay, 0ms) both;
}
& path:nth-child(4) {
--delay: 180ms;
}
}
.grid path {
--x: -1.5px;
--y: -1.5px;
--turn: 0deg;
--motion: bank-operation-rearrange 850ms ease-in-out both;
&:nth-child(2) {
--x: 1.5px;
--turn: 90deg;
}
&:nth-child(3) {
--y: 1.5px;
}
&:nth-child(4) {
--x: 1.5px;
--y: 1.5px;
}
}
.wifi path {
--motion: bank-operation-signal 450ms ease-out var(--delay, 0ms) both;
&:nth-child(1) {
--delay: 360ms;
}
&:nth-child(2) {
--delay: 240ms;
}
&:nth-child(3) {
--delay: 120ms;
}
}
.car {
--motion: bank-operation-drive 1100ms ease-in-out both;
& path:nth-child(-n + 3) {
--motion: bank-operation-suspension 275ms ease-in-out 4 both;
}
& path:nth-last-child(-n + 2) {
--motion: bank-operation-wheel-roll 1100ms ease-in-out both;
}
}
@media (prefers-reduced-motion: no-preference) {
.icon[data-icon-animating] {
animation: var(--motion, none);
& path {
animation: var(--motion, none);
}
}
}
@keyframes :global(bank-operation-coin-turn) {
0%,
100% {
transform: scaleX(1);
}
35%,
65% {
transform: scaleX(0.12);
}
50% {
transform: scaleX(-1);
}
}
@keyframes :global(bank-operation-settle) {
0%,
30%,
100% {
transform: translateY(0);
}
45% {
transform: translateY(1.5px);
}
65% {
transform: translateY(-0.5px);
}
}
@keyframes :global(bank-operation-ruble-in) {
0% {
opacity: 0;
transform: translateY(-9px) scale(0.7);
}
25% {
opacity: 1;
}
65% {
transform: translateY(0) scale(1.15);
}
80% {
transform: scale(0.95);
}
100% {
opacity: 1;
transform: scale(1);
}
}
@keyframes :global(bank-operation-plus-in) {
0% {
opacity: 0;
transform: translateY(-5px) scale(0.5);
}
55% {
opacity: 1;
transform: translateY(0) scale(1.3);
}
75% {
transform: scale(0.9);
}
100% {
opacity: 1;
transform: scale(1);
}
}
@keyframes :global(bank-operation-exchange) {
0%,
100% {
transform: translateX(0);
}
45% {
transform: translateX(var(--shift));
}
}
@keyframes :global(bank-operation-draw) {
from {
stroke-dashoffset: 1;
}
to {
stroke-dashoffset: 0;
}
}
@keyframes :global(bank-operation-arrow-rise) {
0%,
100% {
transform: translateY(0);
}
45% {
transform: translateY(-2px);
}
}
@keyframes :global(bank-operation-blink) {
0%,
100% {
stroke-width: 1.6;
}
45% {
stroke: var(--mantine-color-green-6);
stroke-width: 3;
}
}
@keyframes :global(bank-operation-grocery-drop) {
0% {
opacity: 0;
transform: translateY(-5px);
}
20% {
opacity: 1;
}
55% {
opacity: 1;
transform: translateY(7px);
}
80%,
100% {
opacity: 0;
transform: translateY(7px);
}
}
@keyframes :global(bank-operation-fill-glass) {
0% {
transform: scaleY(0.05);
}
45%,
75% {
transform: scaleY(1);
fill-opacity: 0.5;
}
100% {
transform: scaleY(1);
fill-opacity: 0.2;
}
}
@keyframes :global(bank-operation-cheers) {
0%,
40%,
100% {
transform: rotate(0);
}
65% {
transform: rotate(8deg);
}
}
@keyframes :global(bank-operation-steam) {
0% {
opacity: 0;
transform: translateY(2px);
}
25% {
opacity: 1;
}
70% {
opacity: 0;
transform: translateY(-3px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
@keyframes :global(bank-operation-rearrange) {
0%,
100% {
transform: translate(0, 0) rotate(0);
}
50% {
transform: translate(var(--x), var(--y)) rotate(var(--turn));
}
}
@keyframes :global(bank-operation-signal) {
0% {
opacity: 0.1;
}
100% {
opacity: 1;
}
}
@keyframes :global(bank-operation-drive) {
0% {
opacity: 0;
transform: translateX(-4px);
}
20% {
opacity: 1;
}
80% {
opacity: 1;
transform: translateX(3px);
}
90% {
opacity: 0;
transform: translateX(4px);
}
91% {
opacity: 0;
transform: translateX(0);
}
100% {
opacity: 1;
transform: translateX(0);
}
}
@keyframes :global(bank-operation-suspension) {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-0.5px);
}
}
@keyframes :global(bank-operation-wheel-roll) {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}