Adjust glass styles and theme

This commit is contained in:
Ruslan Bakiev
2026-02-14 16:29:28 +07:00
parent 9bf3b87f36
commit a3c040c0c7
4 changed files with 115 additions and 65 deletions

View File

@@ -1,8 +1,10 @@
<template>
<div data-theme="acid" class="min-h-screen bg-mesh text-base-content">
<div data-theme="winter" class="min-h-screen text-base-content">
<NuxtRouteAnnouncer />
<canvas id="canvas-basic" class="gradient-canvas" aria-hidden="true"></canvas>
<div class="relative z-10">
<aside
class="glass-card fixed left-4 top-4 z-20 flex h-[calc(100vh-2rem)] w-[360px] flex-col rounded-3xl p-5"
class="glass-panel fixed left-4 top-4 z-20 flex h-[calc(100vh-2rem)] w-[360px] flex-col rounded-3xl p-5"
>
<div class="card glass-pane mb-3 rounded-2xl">
<div class="card-body py-4">
@@ -66,7 +68,7 @@
<main
class="min-h-screen w-full px-4 py-6 md:px-8 lg:pl-[400px]"
>
<section class="glass-card flex min-h-[calc(100vh-3rem)] flex-col gap-6 rounded-3xl p-6">
<section class="glass-panel flex min-h-[calc(100vh-3rem)] flex-col gap-6 rounded-3xl p-6">
<div class="flex flex-wrap items-center justify-between gap-4">
<div>
<h1 class="section-title">{{ steps[currentStep].title }}</h1>
@@ -86,8 +88,8 @@
</button>
</div>
</div>
<div v-if="currentStep === 0" class="grid gap-4 lg:grid-cols-[3fr_1fr]">
<div class="space-y-6 text-[18px] leading-relaxed text-slate-900">
<div v-if="currentStep === 0" class="grid gap-4 grid-cols-[minmax(0,2.6fr)_minmax(0,1fr)]">
<div class="min-w-0 space-y-6 text-[18px] leading-relaxed text-slate-900">
<input class="input input-bordered input-lg w-full text-base text-slate-900" value="Head of Growth" />
<div>
<p class="text-lg font-semibold text-slate-900">Общее описание</p>
@@ -163,7 +165,7 @@
</div>
</div>
<div class="space-y-4">
<div class="min-w-0 space-y-4 max-w-[360px]">
<div class="glass-card relative cursor-pointer rounded-2xl p-5">
<button class="btn btn-ghost btn-circle btn-sm absolute right-4 top-4"></button>
<div class="voice-wave">
@@ -178,7 +180,7 @@
<span class="voice-bar"></span>
<span class="voice-bar"></span>
</div>
<p class="mt-4 text-sm text-slate-300">
<p class="mt-4 text-sm text-slate-900">
Пройдите голосовое интервью мы заполним всё за вас.
</p>
</div>
@@ -341,8 +343,13 @@
<div class="flex items-center justify-between gap-4">
<div class="flex items-center gap-3">
<div class="avatar">
<div class="w-10 rounded-full bg-slate-800">
<span class="flex h-full items-center justify-center text-xs">ИС</span>
<div class="w-10 rounded-full">
<img
alt="Ирина"
src="https://i.pravatar.cc/120?img=5"
class="h-full w-full rounded-full object-cover"
loading="lazy"
/>
</div>
</div>
<div>
@@ -351,15 +358,15 @@
</div>
</div>
<div class="mt-3 flex flex-wrap items-center gap-3">
<label class="flex items-center gap-2 text-xs text-slate-300">
<label class="flex items-center gap-2 text-xs text-slate-900">
<input type="radio" name="meet-1" class="radio radio-sm" />
Сегодня 16:00
</label>
<label class="flex items-center gap-2 text-xs text-slate-300">
<label class="flex items-center gap-2 text-xs text-slate-900">
<input type="radio" name="meet-1" class="radio radio-sm" />
Завтра 11:30
</label>
<label class="flex items-center gap-2 text-xs text-slate-300">
<label class="flex items-center gap-2 text-xs text-slate-900">
<input type="radio" name="meet-1" class="radio radio-sm" />
Ср 15:00
</label>
@@ -369,8 +376,13 @@
<div class="flex items-center justify-between gap-4">
<div class="flex items-center gap-3">
<div class="avatar">
<div class="w-10 rounded-full bg-slate-800">
<span class="flex h-full items-center justify-center text-xs">КД</span>
<div class="w-10 rounded-full">
<img
alt="Кира"
src="https://i.pravatar.cc/120?img=47"
class="h-full w-full rounded-full object-cover"
loading="lazy"
/>
</div>
</div>
<div>
@@ -379,15 +391,15 @@
</div>
</div>
<div class="mt-3 flex flex-wrap items-center gap-3">
<label class="flex items-center gap-2 text-xs text-slate-300">
<label class="flex items-center gap-2 text-xs text-slate-900">
<input type="radio" name="meet-2" class="radio radio-sm" />
Сегодня 18:00
</label>
<label class="flex items-center gap-2 text-xs text-slate-300">
<label class="flex items-center gap-2 text-xs text-slate-900">
<input type="radio" name="meet-2" class="radio radio-sm" />
Чт 12:00
</label>
<label class="flex items-center gap-2 text-xs text-slate-300">
<label class="flex items-center gap-2 text-xs text-slate-900">
<input type="radio" name="meet-2" class="radio radio-sm" />
Пт 10:30
</label>
@@ -397,8 +409,13 @@
<div class="flex items-center justify-between gap-4">
<div class="flex items-center gap-3">
<div class="avatar">
<div class="w-10 rounded-full bg-slate-800">
<span class="flex h-full items-center justify-center text-xs">АМ</span>
<div class="w-10 rounded-full">
<img
alt="Алексей"
src="https://i.pravatar.cc/120?img=51"
class="h-full w-full rounded-full object-cover"
loading="lazy"
/>
</div>
</div>
<div>
@@ -407,15 +424,15 @@
</div>
</div>
<div class="mt-3 flex flex-wrap items-center gap-3">
<label class="flex items-center gap-2 text-xs text-slate-300">
<label class="flex items-center gap-2 text-xs text-slate-900">
<input type="radio" name="meet-3" class="radio radio-sm" />
Ср 14:30
</label>
<label class="flex items-center gap-2 text-xs text-slate-300">
<label class="flex items-center gap-2 text-xs text-slate-900">
<input type="radio" name="meet-3" class="radio radio-sm" />
Чт 16:00
</label>
<label class="flex items-center gap-2 text-xs text-slate-300">
<label class="flex items-center gap-2 text-xs text-slate-900">
<input type="radio" name="meet-3" class="radio radio-sm" />
Пт 09:30
</label>
@@ -434,10 +451,12 @@
</section>
</main>
</div>
</div>
</template>
<script setup lang="ts">
import { computed, onBeforeUnmount, onMounted, nextTick, ref, watch } from 'vue'
import Granim from 'granim'
const steps = [
{
@@ -635,6 +654,7 @@ const candidateCharts = new Map<number, any>()
let vacancyChart: any = null
let teamChart: any = null
let echarts: any = null
let granimInstance: any = null
const setCandidateChartRef = (id: number) => (el: HTMLDivElement | null) => {
if (el) {
@@ -743,6 +763,20 @@ const handleResize = () => {
onMounted(async () => {
syncStepFromRoute()
granimInstance = new Granim({
element: '#canvas-basic',
direction: 'radial',
isPausedWhenNotInView: true,
states: {
'default-state': {
gradients: [
['#ff9966', '#ff5e62'],
['#00F260', '#0575E6'],
['#e1eec3', '#f05053']
]
}
}
})
await ensureEcharts()
renderVacancyChart()
renderTeamChart()
@@ -786,6 +820,7 @@ onBeforeUnmount(() => {
teamChart?.dispose()
candidateCharts.forEach((chart) => chart.dispose())
candidateCharts.clear()
if (granimInstance?.pause) granimInstance.pause()
})
const chatByStep = [

View File

@@ -1,37 +1,37 @@
@import "tailwindcss";
@plugin "daisyui";
@plugin "daisyui/theme" {
name: "acid";
name: "winter";
default: true;
prefersdark: false;
color-scheme: "light";
--color-base-100: oklch(98% 0 0);
--color-base-200: oklch(95% 0 0);
--color-base-300: oklch(91% 0 0);
--color-base-content: oklch(0% 0 0);
--color-primary: oklch(71.9% 0.357 330.759);
--color-primary-content: oklch(14.38% 0.071 330.759);
--color-secondary: oklch(73.37% 0.224 48.25);
--color-secondary-content: oklch(14.674% 0.044 48.25);
--color-accent: oklch(92.78% 0.264 122.962);
--color-accent-content: oklch(18.556% 0.052 122.962);
--color-neutral: oklch(21.31% 0.128 278.68);
--color-neutral-content: oklch(84.262% 0.025 278.68);
--color-info: oklch(60.72% 0.227 252.05);
--color-info-content: oklch(12.144% 0.045 252.05);
--color-success: oklch(85.72% 0.266 158.53);
--color-success-content: oklch(17.144% 0.053 158.53);
--color-warning: oklch(91.01% 0.212 100.5);
--color-warning-content: oklch(18.202% 0.042 100.5);
--color-error: oklch(64.84% 0.293 29.349);
--color-error-content: oklch(12.968% 0.058 29.349);
--color-base-100: oklch(100% 0 0);
--color-base-200: oklch(97.466% 0.011 259.822);
--color-base-300: oklch(93.268% 0.016 262.751);
--color-base-content: oklch(41.886% 0.053 255.824);
--color-primary: oklch(56.86% 0.255 257.57);
--color-primary-content: oklch(91.372% 0.051 257.57);
--color-secondary: oklch(42.551% 0.161 282.339);
--color-secondary-content: oklch(88.51% 0.032 282.339);
--color-accent: oklch(59.939% 0.191 335.171);
--color-accent-content: oklch(11.988% 0.038 335.171);
--color-neutral: oklch(19.616% 0.063 257.651);
--color-neutral-content: oklch(83.923% 0.012 257.651);
--color-info: oklch(88.127% 0.085 214.515);
--color-info-content: oklch(17.625% 0.017 214.515);
--color-success: oklch(80.494% 0.077 197.823);
--color-success-content: oklch(16.098% 0.015 197.823);
--color-warning: oklch(89.172% 0.045 71.47);
--color-warning-content: oklch(17.834% 0.009 71.47);
--color-error: oklch(73.092% 0.11 20.076);
--color-error-content: oklch(14.618% 0.022 20.076);
--radius-selector: 2rem;
--radius-field: 2rem;
--radius-box: 2rem;
--size-selector: 0.3125rem;
--size-field: 0.3125rem;
--border: 0.5px;
--depth: 1;
--depth: 0;
--noise: 0;
}
@@ -43,25 +43,28 @@ body,
body {
font-family: "IBM Plex Sans", sans-serif;
background: #f9f6ef;
background: #f7f3ea;
}
.glass-panel {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.3);
backdrop-filter: blur(5px);
-webkit-backdrop-filter: blur(5px);
}
.glass-card {
background: rgba(255, 255, 255, 0.55);
border: 1px solid rgba(255, 255, 255, 0.8);
box-shadow:
0 24px 40px rgba(27, 32, 58, 0.12),
inset 0 1px 0 rgba(255, 255, 255, 0.75);
backdrop-filter: blur(24px) saturate(140%);
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.3);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
.glass-pane {
background: rgba(255, 255, 255, 0.42);
border: 1px solid rgba(255, 255, 255, 0.7);
box-shadow:
0 16px 28px rgba(27, 32, 58, 0.08),
inset 0 1px 0 rgba(255, 255, 255, 0.6);
backdrop-filter: blur(16px) saturate(130%);
background: rgba(255, 255, 255, 0.3);
border: 1px solid rgba(255, 255, 255, 0.25);
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
}
.section-title {
@@ -112,12 +115,6 @@ body {
50% { transform: scaleY(1.2); opacity: 1; }
}
.bg-mesh {
background-image:
radial-gradient(1200px 600px at 10% -10%, rgba(67, 56, 118, 0.2), transparent 60%),
radial-gradient(900px 500px at 90% 10%, rgba(230, 184, 92, 0.18), transparent 60%),
linear-gradient(180deg, #f9f6ef 0%, #f2efe7 55%, #ebe8df 100%);
}
.reorder-move {
transition: transform 0.6s cubic-bezier(0.22, 0.61, 0.36, 1);
@@ -138,3 +135,13 @@ body {
opacity: 0;
transform: translateY(-10px) scale(0.98);
}
.gradient-canvas {
position: fixed;
inset: 0;
width: 100%;
height: 100%;
z-index: 0;
pointer-events: none;
filter: saturate(1.1);
}

7
package-lock.json generated
View File

@@ -9,6 +9,7 @@
"dependencies": {
"@formkit/auto-animate": "^0.9.0",
"echarts": "^6.0.0",
"granim": "^2.0.0",
"nuxt": "^4.3.1",
"vue": "^3.5.28",
"vue-router": "^4.6.4"
@@ -6081,6 +6082,12 @@
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"license": "ISC"
},
"node_modules/granim": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/granim/-/granim-2.0.0.tgz",
"integrity": "sha512-aqa79K49ndjoUBtpYzlO8sKcuVQED+5axvX0SveqTLDR+Fa2G42AGntuQ36ysCFOWGVkWCLfHowFwk+D/9rGDg==",
"license": "MIT"
},
"node_modules/gzip-size": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz",

View File

@@ -12,6 +12,7 @@
"dependencies": {
"@formkit/auto-animate": "^0.9.0",
"echarts": "^6.0.0",
"granim": "^2.0.0",
"nuxt": "^4.3.1",
"vue": "^3.5.28",
"vue-router": "^4.6.4"