diff --git a/app/app.vue b/app/app.vue index 90fb505..8ce3252 100644 --- a/app/app.vue +++ b/app/app.vue @@ -7,7 +7,9 @@ const isLoginPage = computed(() => route.path === '/login');
- +
+ +
diff --git a/app/assets/css/main.css b/app/assets/css/main.css index c88d492..38fc4bd 100644 --- a/app/assets/css/main.css +++ b/app/assets/css/main.css @@ -49,24 +49,69 @@ body { font-family: 'Manrope', 'Segoe UI', sans-serif; @apply text-base-content; background: - radial-gradient(circle at 8% 10%, color-mix(in oklab, var(--color-primary) 20%, transparent), transparent 35%), - radial-gradient(circle at 92% 0%, color-mix(in oklab, var(--color-secondary) 14%, transparent), transparent 28%), - linear-gradient(160deg, var(--color-base-100) 0%, var(--color-base-200) 56%, var(--color-base-100) 100%); + linear-gradient( + 135deg, + color-mix(in oklab, var(--color-primary) 14%, #f5fcf8) 0%, + color-mix(in oklab, #f7fff9 84%, white) 28%, + color-mix(in oklab, var(--color-success) 16%, #f2fbf6) 52%, + color-mix(in oklab, #f4fff8 82%, white) 76%, + color-mix(in oklab, var(--color-accent) 8%, #f7fff8) 100% + ); + background-size: 220% 220%; + animation: fregat-aurora 22s ease-in-out infinite; color: var(--color-base-content); + overflow-x: hidden; } .lk-shell { @apply min-h-screen; + position: relative; + isolation: isolate; +} + +.lk-shell::before, +.lk-shell::after { + content: ''; + position: fixed; + inset: -30%; + pointer-events: none; + z-index: -1; + filter: blur(52px); +} + +.lk-shell::before { + background: + radial-gradient(circle at 18% 22%, rgba(132, 227, 174, 0.34) 0%, rgba(132, 227, 174, 0) 40%), + radial-gradient(circle at 78% 16%, rgba(186, 248, 214, 0.26) 0%, rgba(186, 248, 214, 0) 45%); + animation: fregat-float-a 18s ease-in-out infinite alternate; +} + +.lk-shell::after { + background: + radial-gradient(circle at 85% 82%, rgba(95, 194, 140, 0.2) 0%, rgba(95, 194, 140, 0) 42%), + radial-gradient(circle at 30% 78%, rgba(200, 255, 228, 0.24) 0%, rgba(200, 255, 228, 0) 40%); + animation: fregat-float-b 24s ease-in-out infinite alternate; +} + +.lk-content-canvas { + border: 1px solid rgba(255, 255, 255, 0.52); + border-radius: 2rem; + background: + linear-gradient(160deg, rgba(255, 255, 255, 0.56), rgba(255, 255, 255, 0.36)); + box-shadow: + 0 22px 60px rgba(16, 73, 44, 0.16), + inset 0 1px 0 rgba(255, 255, 255, 0.72); + -webkit-backdrop-filter: blur(16px) saturate(170%); + backdrop-filter: blur(16px) saturate(170%); + padding: clamp(1rem, 1.2vw, 1.5rem); } .surface-card { - border: 1px solid color-mix(in oklab, var(--color-base-content) 10%, var(--color-base-100)); - background: linear-gradient( - 160deg, - color-mix(in oklab, var(--color-base-100) 90%, white), - color-mix(in oklab, var(--color-base-200) 86%, white) - ); - box-shadow: 0 20px 48px color-mix(in oklab, var(--color-primary) 14%, transparent); + border: 1px solid color-mix(in oklab, var(--color-base-content) 12%, white); + background: rgba(255, 255, 255, 0.95); + box-shadow: + 0 16px 36px rgba(24, 66, 44, 0.1), + 0 1px 0 rgba(255, 255, 255, 0.62) inset; } .fregat-header-glass { @@ -76,12 +121,12 @@ body { .fregat-header-backdrop { position: absolute; inset: 0; - height: 300%; + height: 350%; background: rgba(255, 255, 255, 0.06); -webkit-backdrop-filter: blur(16px) saturate(180%); backdrop-filter: blur(16px) saturate(180%); - -webkit-mask-image: linear-gradient(to bottom, black 0%, black 22%, rgba(0, 0, 0, 0.35) 46%, rgba(0, 0, 0, 0.1) 70%, transparent 100%); - mask-image: linear-gradient(to bottom, black 0%, black 22%, rgba(0, 0, 0, 0.35) 46%, rgba(0, 0, 0, 0.1) 70%, transparent 100%); + -webkit-mask-image: linear-gradient(to bottom, black 0%, black 20%, rgba(0, 0, 0, 0.4) 40%, rgba(0, 0, 0, 0.1) 65%, transparent 100%); + mask-image: linear-gradient(to bottom, black 0%, black 20%, rgba(0, 0, 0, 0.4) 40%, rgba(0, 0, 0, 0.1) 65%, transparent 100%); pointer-events: none; z-index: 0; } @@ -100,13 +145,13 @@ body { .fregat-pill-glass { position: relative; isolation: isolate; - background: rgba(255, 255, 255, 0.16); - border: 1px solid rgba(255, 255, 255, 0.22); + background: rgba(255, 255, 255, 0.12); + border: 1px solid rgba(255, 255, 255, 0.16); -webkit-backdrop-filter: blur(20px) saturate(180%); backdrop-filter: blur(20px) saturate(180%); box-shadow: - 0 8px 32px rgba(31, 38, 135, 0.16), - inset 0 4px 20px rgba(255, 255, 255, 0.2); + 0 8px 32px rgba(31, 38, 135, 0.2), + inset 0 4px 20px rgba(255, 255, 255, 0.3); } .fregat-pill-glass::after { @@ -119,8 +164,8 @@ body { box-shadow: inset -10px -8px 0 -11px rgba(255, 255, 255, 1), inset 0 -9px 0 -8px rgba(255, 255, 255, 1); - opacity: 0.35; - filter: blur(1px) brightness(112%); + opacity: 0.45; + filter: blur(1px) brightness(115%); pointer-events: none; } @@ -129,7 +174,6 @@ body { z-index: 1; } -.fregat-pill-left, .fregat-pill-right { flex: 0 0 auto; } @@ -138,6 +182,10 @@ body { min-width: 0; } +.fregat-pill-brand { + flex: 0 0 auto; +} + .lk-nav-link { @apply inline-flex items-center gap-2 rounded-full px-4 py-2 text-sm font-semibold transition-all duration-200; color: color-mix(in oklab, var(--color-base-content) 78%, transparent); @@ -161,7 +209,6 @@ body { } .fregat-pill-brand, - .fregat-pill-left, .fregat-pill-center, .fregat-pill-right { position: absolute; @@ -172,14 +219,10 @@ body { left: 0; } - .fregat-pill-left { - left: 7.25rem; - } - .fregat-pill-center { left: 50%; width: max-content; - max-width: min(58vw, 900px); + max-width: min(54vw, 900px); transform: translateX(-50%); } @@ -188,10 +231,37 @@ body { } } +@media (max-width: 1023px) { + .fregat-pill-brand { + padding-inline: 0.75rem; + } + + .lk-nav-link { + padding-inline: 0.7rem; + padding-block: 0.5rem; + } +} + .product-card-anim { animation: product-card-in 0.55s ease-out both; } +@keyframes fregat-aurora { + 0% { background-position: 0% 30%; } + 50% { background-position: 100% 70%; } + 100% { background-position: 0% 30%; } +} + +@keyframes fregat-float-a { + from { transform: translate3d(-1.5%, -1%, 0) scale(1); } + to { transform: translate3d(2.5%, 1.8%, 0) scale(1.05); } +} + +@keyframes fregat-float-b { + from { transform: translate3d(2%, 2%, 0) scale(1.02); } + to { transform: translate3d(-2%, -1%, 0) scale(1.06); } +} + @keyframes product-card-in { from { opacity: 0; diff --git a/app/components/ui/AppHeader.vue b/app/components/ui/AppHeader.vue index 96e1297..2a607be 100644 --- a/app/components/ui/AppHeader.vue +++ b/app/components/ui/AppHeader.vue @@ -8,10 +8,6 @@ type NavItem = { const route = useRoute(); const { totalItems } = useClientCart(); -const leftCapsule: NavItem[] = [ - { to: '/profile', label: 'Профиль', icon: 'user' }, -]; - const centerCapsule: NavItem[] = [ { to: '/products', label: 'Каталог', icon: 'grid' }, { to: '/orders', label: 'Мои заказы', icon: 'stack' }, @@ -19,6 +15,7 @@ const centerCapsule: NavItem[] = [ const rightCapsule: NavItem[] = [ { to: '/cart', label: 'Корзина', icon: 'cart' }, + { to: '/profile', label: 'Профиль', icon: 'user' }, ]; function isActive(path: string) { @@ -37,25 +34,12 @@ function isActive(path: string) {
-
- - - - - {{ item.label }} - -
-
- + - {{ item.label }} + + + + {{ totalItems }}