2026-10-06 16:28:05 +03:30
|
|
|
<script setup lang="ts">
|
2026-10-21 20:31:05 +03:30
|
|
|
import DynamicIcon from "~/components/ui/DynamicIcon.vue";
|
|
|
|
|
import Lines from "~/components/ui/Lines.vue";
|
2026-10-06 16:28:05 +03:30
|
|
|
import Reveal from "~/components/ui/Reveal.vue";
|
|
|
|
|
import SectionHead from "~/components/ui/SectionHead.vue";
|
|
|
|
|
|
2026-10-21 20:31:05 +03:30
|
|
|
const about = computed(() => useSiteStore().sections.about);
|
2026-10-06 16:28:05 +03:30
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<template>
|
|
|
|
|
<section
|
|
|
|
|
id="about"
|
|
|
|
|
aria-labelledby="about-title"
|
|
|
|
|
class="relative overflow-hidden border-t border-line py-24 md:py-32"
|
|
|
|
|
>
|
|
|
|
|
<div class="absolute inset-0 bg-grid-fine opacity-50" />
|
|
|
|
|
|
2026-10-07 00:45:51 +03:30
|
|
|
<div class="relative mx-auto max-w-[1480px] px-5 md:px-8">
|
2026-10-06 16:28:05 +03:30
|
|
|
<div class="grid items-center gap-14 lg:grid-cols-2">
|
|
|
|
|
<!-- ---- image ---- -->
|
|
|
|
|
<Reveal class="relative order-2 lg:order-1" :delay="0.1">
|
|
|
|
|
<div class="relative overflow-hidden rounded-2xl border border-line">
|
|
|
|
|
<img
|
2026-10-21 20:31:05 +03:30
|
|
|
:src="about.image.url"
|
|
|
|
|
:alt="about.image.alt"
|
2026-10-06 16:28:05 +03:30
|
|
|
width="800"
|
|
|
|
|
height="600"
|
|
|
|
|
loading="lazy"
|
|
|
|
|
decoding="async"
|
|
|
|
|
class="aspect-[4/3] w-full object-cover"
|
|
|
|
|
/>
|
|
|
|
|
<div class="absolute inset-0 bg-gradient-to-t from-bg/80 via-transparent to-transparent" />
|
|
|
|
|
<div
|
|
|
|
|
class="absolute bottom-5 start-5 flex items-center gap-4 rounded-xl border border-line bg-bg/80 px-5 py-4 backdrop-blur-md"
|
|
|
|
|
>
|
2026-10-21 20:31:05 +03:30
|
|
|
<span class="font-mono text-3xl font-bold text-accent">{{ about.badge.value }}</span>
|
2026-10-06 16:28:05 +03:30
|
|
|
<span class="text-xs leading-5 text-muted">
|
2026-10-21 20:31:05 +03:30
|
|
|
<Lines :text="about.badge.label" />
|
2026-10-06 16:28:05 +03:30
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="hazard absolute -top-3 -end-3 h-6 w-28 rounded-full opacity-90" />
|
|
|
|
|
</Reveal>
|
|
|
|
|
|
|
|
|
|
<!-- ---- text ---- -->
|
|
|
|
|
<div class="order-1 lg:order-2">
|
2026-10-21 20:31:05 +03:30
|
|
|
<SectionHead heading-id="about-title" v-bind="about.head" />
|
2026-10-06 16:28:05 +03:30
|
|
|
<Reveal :delay="0.2">
|
|
|
|
|
<p class="mt-6 leading-9 text-muted">
|
2026-10-21 20:31:05 +03:30
|
|
|
{{ about.body }}
|
2026-10-06 16:28:05 +03:30
|
|
|
</p>
|
|
|
|
|
</Reveal>
|
|
|
|
|
|
|
|
|
|
<div class="mt-10 space-y-1">
|
2026-10-21 20:31:05 +03:30
|
|
|
<Reveal v-for="(t, i) in about.timeline" :key="t.year" :delay="0.25 + i * 0.07">
|
2026-10-06 16:28:05 +03:30
|
|
|
<div
|
|
|
|
|
class="group border-s-2 border-accent/30 ps-6 transition-colors duration-300 hover:border-accent"
|
|
|
|
|
>
|
|
|
|
|
<span class="font-mono text-sm font-bold text-accent">{{ t.year }}</span>
|
|
|
|
|
<p class="mt-1 pb-5 text-sm leading-7 text-ink/75">{{ t.text }}</p>
|
|
|
|
|
</div>
|
|
|
|
|
</Reveal>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<Reveal :delay="0.5">
|
|
|
|
|
<div class="mt-4 flex flex-wrap gap-3">
|
|
|
|
|
<span
|
2026-10-21 20:31:05 +03:30
|
|
|
v-for="f in about.features"
|
2026-10-06 16:28:05 +03:30
|
|
|
:key="f.label"
|
|
|
|
|
class="inline-flex items-center gap-2 rounded-full border border-line bg-panel/60 px-4 py-2 text-xs text-ink/80 transition-colors hover:border-accent/50 hover:text-ink"
|
|
|
|
|
>
|
2026-10-21 20:31:05 +03:30
|
|
|
<DynamicIcon :name="f.icon" class="size-4 text-accent" />
|
2026-10-06 16:28:05 +03:30
|
|
|
{{ f.label }}
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</Reveal>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
</template>
|