Initial commit with Dockerfile
This commit is contained in:
23
.dockerignore
Normal file
23
.dockerignore
Normal file
@@ -0,0 +1,23 @@
|
||||
node_modules
|
||||
.nuxt
|
||||
.output
|
||||
.nitro
|
||||
.cache
|
||||
dist
|
||||
|
||||
.git
|
||||
.gitignore
|
||||
|
||||
Dockerfile
|
||||
Dockerfile.*
|
||||
docker-compose*.yml
|
||||
|
||||
logs
|
||||
*.log
|
||||
|
||||
.env
|
||||
.env.*
|
||||
|
||||
.DS_Store
|
||||
.idea
|
||||
.fleet
|
||||
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
# Nuxt dev/build outputs
|
||||
.output
|
||||
.data
|
||||
.nuxt
|
||||
.nitro
|
||||
.cache
|
||||
dist
|
||||
|
||||
# Node dependencies
|
||||
node_modules
|
||||
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
|
||||
# Misc
|
||||
.DS_Store
|
||||
.fleet
|
||||
.idea
|
||||
|
||||
# Local env files
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
22
Dockerfile
Normal file
22
Dockerfile
Normal file
@@ -0,0 +1,22 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
FROM node:20-alpine AS builder
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json package-lock.json ./
|
||||
RUN npm ci
|
||||
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
FROM node:20-alpine AS runner
|
||||
WORKDIR /app
|
||||
|
||||
ENV NODE_ENV=production
|
||||
ENV HOST=0.0.0.0
|
||||
ENV PORT=3000
|
||||
|
||||
COPY --from=builder /app/.output ./.output
|
||||
COPY --from=builder /app/package.json ./package.json
|
||||
|
||||
EXPOSE 3000
|
||||
CMD ["node", ".output/server/index.mjs"]
|
||||
75
README.md
Normal file
75
README.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# Nuxt Minimal Starter
|
||||
|
||||
Look at the [Nuxt documentation](https://nuxt.com/docs/getting-started/introduction) to learn more.
|
||||
|
||||
## Setup
|
||||
|
||||
Make sure to install dependencies:
|
||||
|
||||
```bash
|
||||
# npm
|
||||
npm install
|
||||
|
||||
# pnpm
|
||||
pnpm install
|
||||
|
||||
# yarn
|
||||
yarn install
|
||||
|
||||
# bun
|
||||
bun install
|
||||
```
|
||||
|
||||
## Development Server
|
||||
|
||||
Start the development server on `http://localhost:3000`:
|
||||
|
||||
```bash
|
||||
# npm
|
||||
npm run dev
|
||||
|
||||
# pnpm
|
||||
pnpm dev
|
||||
|
||||
# yarn
|
||||
yarn dev
|
||||
|
||||
# bun
|
||||
bun run dev
|
||||
```
|
||||
|
||||
## Production
|
||||
|
||||
Build the application for production:
|
||||
|
||||
```bash
|
||||
# npm
|
||||
npm run build
|
||||
|
||||
# pnpm
|
||||
pnpm build
|
||||
|
||||
# yarn
|
||||
yarn build
|
||||
|
||||
# bun
|
||||
bun run build
|
||||
```
|
||||
|
||||
Locally preview production build:
|
||||
|
||||
```bash
|
||||
# npm
|
||||
npm run preview
|
||||
|
||||
# pnpm
|
||||
pnpm preview
|
||||
|
||||
# yarn
|
||||
yarn preview
|
||||
|
||||
# bun
|
||||
bun run preview
|
||||
```
|
||||
|
||||
Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information.
|
||||
460
app/app.vue
Normal file
460
app/app.vue
Normal file
@@ -0,0 +1,460 @@
|
||||
<template>
|
||||
<div data-theme="silk" class="min-h-screen bg-mesh text-neutral">
|
||||
<div class="relative">
|
||||
<div
|
||||
class="pointer-events-none absolute -top-24 left-1/2 h-72 w-[1100px] -translate-x-1/2 rounded-full bg-[radial-gradient(circle_at_center,rgba(67,56,118,0.25),transparent_70%)] blur-3xl"
|
||||
></div>
|
||||
|
||||
<main class="relative px-6 pb-16 pt-10 md:px-12 lg:px-20">
|
||||
<div class="grid gap-8 lg:grid-cols-[220px_1fr]">
|
||||
<aside class="hidden lg:block">
|
||||
<div class="sticky top-10 rounded-3xl border border-base-300 bg-base-100/90 p-5 shadow-soft">
|
||||
<div class="text-xs uppercase tracking-[0.2em] text-neutral/50">Навигация</div>
|
||||
<nav class="mt-4 space-y-2 text-sm">
|
||||
<a class="block rounded-2xl px-3 py-2 text-neutral/70 hover:bg-base-200" href="#context">Контекст</a>
|
||||
<a class="block rounded-2xl px-3 py-2 text-neutral/70 hover:bg-base-200" href="#problem">Проблемы</a>
|
||||
<a class="block rounded-2xl px-3 py-2 text-neutral/70 hover:bg-base-200" href="#core">Core-фича</a>
|
||||
<a class="block rounded-2xl px-3 py-2 text-neutral/70 hover:bg-base-200" href="#flow">Как работает</a>
|
||||
<a class="block rounded-2xl px-3 py-2 text-neutral/70 hover:bg-base-200" href="#value">Value Proposition</a>
|
||||
<a class="block rounded-2xl px-3 py-2 text-neutral/70 hover:bg-base-200" href="#prototype">Прототип</a>
|
||||
<a class="block rounded-2xl px-3 py-2 text-neutral/70 hover:bg-base-200" href="#monetization">Монетизация</a>
|
||||
<a class="block rounded-2xl px-3 py-2 text-neutral/70 hover:bg-base-200" href="#metrics">Метрики</a>
|
||||
<a class="block rounded-2xl px-3 py-2 text-neutral/70 hover:bg-base-200" href="#roadmap">Roadmap</a>
|
||||
<a class="block rounded-2xl px-3 py-2 text-neutral/70 hover:bg-base-200" href="#final">Итог</a>
|
||||
</nav>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
<div class="space-y-10">
|
||||
<section id="context" class="slide">
|
||||
<div class="slide-top">Контекст</div>
|
||||
<div class="slide-head">
|
||||
<h2 class="slide-title">Ремонт — редкий и дорогой опыт</h2>
|
||||
<p class="slide-preamble">
|
||||
Большинство людей проходят ремонт 1–2 раза в жизни. Это эмоционально тяжелый процесс с
|
||||
высокими ставками, где нет навыка управления и нет стандарта качества. Поэтому каждый
|
||||
проект начинается заново: ожидания не совпадают, правила не зафиксированы, а неопределенность
|
||||
быстро превращается в конфликт. Заказчик хочет контроля и понятных правил, исполнитель — ясных
|
||||
критериев и гарантии оплаты.
|
||||
</p>
|
||||
</div>
|
||||
<div class="slide-main"></div>
|
||||
</section>
|
||||
|
||||
<section id="problem" class="slide">
|
||||
<div class="slide-top">Проблемы</div>
|
||||
<div class="slide-head">
|
||||
<h2 class="slide-title">Ключевые проблемы</h2>
|
||||
<p class="slide-preamble">
|
||||
Мы провели интервью с заказчиками и мастерами и увидели, что проблемы повторяются из проекта
|
||||
в проект. На практике это всегда упирается в несколько узлов, которые ломают доверие и сроки.
|
||||
Ниже — три ключевых вывода.
|
||||
</p>
|
||||
</div>
|
||||
<div class="slide-main">
|
||||
<div class="grid gap-6 md:grid-cols-3 md:items-end">
|
||||
<div class="rounded-3xl bg-base-100/90 p-6 shadow-soft md:translate-y-8">
|
||||
<h3 class="font-display text-2xl">Ожидания и реальность расходятся</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">
|
||||
Нет общего понимания результата: стороны по-разному трактуют «готово» и «качественно».
|
||||
</p>
|
||||
<p class="mt-3 text-xs text-neutral/60">Заказчик: не уверен, что «сделано правильно». Исполнитель: не понимает, как это доказать.</p>
|
||||
</div>
|
||||
<div class="rounded-3xl bg-base-100/90 p-6 shadow-soft md:translate-y-14">
|
||||
<h3 class="font-display text-2xl">Критерии не зафиксированы</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">
|
||||
Нет списка требований, допусков и контрольных точек — спор легко уходит в эмоции.
|
||||
</p>
|
||||
<p class="mt-3 text-xs text-neutral/60">Заказчик: нет прозрачной проверки. Исполнитель: нет единого регламента.</p>
|
||||
</div>
|
||||
<div class="rounded-3xl bg-base-100/90 p-6 shadow-soft md:translate-y-4">
|
||||
<h3 class="font-display text-2xl">Финансовый риск у обеих сторон</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">
|
||||
Платежи завязаны на доверии, а не на факте качества — обе стороны боятся потерь.
|
||||
</p>
|
||||
<p class="mt-3 text-xs text-neutral/60">Заказчик: боится переплатить. Исполнитель: боится не получить деньги.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="core" class="slide">
|
||||
<div class="slide-top">Core-фича</div>
|
||||
<div class="slide-head">
|
||||
<h2 class="slide-title">Ноу-хау: приемка как сервис</h2>
|
||||
<p class="slide-preamble">
|
||||
Проанализировав проблемы, мы видим ключевую боль именно в приемке. Когда заранее понятно,
|
||||
что такое хорошо и что делать дальше в каждом исходе, исчезает источник конфликта. Это и есть
|
||||
наша killer-feature: критерии фиксируются до старта, а оценка становится независимой.
|
||||
</p>
|
||||
</div>
|
||||
<div class="slide-main">
|
||||
<div class="rounded-3xl border border-base-300 bg-base-100/90 p-6">
|
||||
<div class="text-xs font-semibold text-neutral/60">Пример регламентной приемки</div>
|
||||
<div class="mt-4 grid grid-cols-[1.1fr_1.3fr_0.9fr_1fr] gap-3 text-sm">
|
||||
<div class="rounded-2xl bg-base-200 px-4 py-3 font-semibold text-neutral/70">Работа</div>
|
||||
<div class="rounded-2xl bg-base-200 px-4 py-3 font-semibold text-neutral/70">Измерено</div>
|
||||
<div class="rounded-2xl bg-base-200 px-4 py-3 font-semibold text-neutral/70 text-center">Оценка</div>
|
||||
<div class="rounded-2xl bg-base-200 px-4 py-3 font-semibold text-neutral/70">Решение</div>
|
||||
|
||||
<div class="rounded-2xl bg-white px-4 py-3">Укладка плитки</div>
|
||||
<div class="rounded-2xl bg-white px-4 py-3">Отклонение 1 мм при норме ≤ 2 мм</div>
|
||||
<div class="rounded-2xl bg-success/15 px-4 py-3 text-center text-success">Ок</div>
|
||||
<div class="rounded-2xl bg-white px-4 py-3">Оплата 100%</div>
|
||||
|
||||
<div class="rounded-2xl bg-white px-4 py-3">Электронный уровень</div>
|
||||
<div class="rounded-2xl bg-white px-4 py-3">Отклонение 2° при норме ≤ 1°</div>
|
||||
<div class="rounded-2xl bg-warning/15 px-4 py-3 text-center text-warning">На грани</div>
|
||||
<div class="rounded-2xl bg-white px-4 py-3">Удержать 5%</div>
|
||||
|
||||
<div class="rounded-2xl bg-white px-4 py-3">Швы</div>
|
||||
<div class="rounded-2xl bg-white px-4 py-3">Разбег 2 мм при норме ≤ 1 мм</div>
|
||||
<div class="rounded-2xl bg-error/15 px-4 py-3 text-center text-error">Не ок</div>
|
||||
<div class="rounded-2xl bg-white px-4 py-3">Переделка участка</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="flow" class="slide">
|
||||
<div class="slide-top">Как работает</div>
|
||||
<div class="slide-head">
|
||||
<h2 class="slide-title">Простой сценарий в три шага</h2>
|
||||
<p class="slide-preamble">
|
||||
Мы переводим идею в простой процесс: три шага, которые последовательно ведут клиента от
|
||||
неопределенности к прозрачной приемке и защищенной оплате для обеих сторон.
|
||||
</p>
|
||||
</div>
|
||||
<div class="slide-main">
|
||||
<div class="grid gap-6 md:grid-cols-3">
|
||||
<div class="rounded-3xl bg-base-100/90 p-6 shadow-soft">
|
||||
<div class="text-xs font-semibold text-neutral/60">Шаг 1</div>
|
||||
<h3 class="mt-2 font-display text-2xl">Вход и расчет</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">
|
||||
Заказчик загружает объект, система сразу считает смету и формирует план.
|
||||
</p>
|
||||
</div>
|
||||
<div class="rounded-3xl bg-base-100/90 p-6 shadow-soft">
|
||||
<div class="text-xs font-semibold text-neutral/60">Шаг 2</div>
|
||||
<h3 class="mt-2 font-display text-2xl">Регламент и работа</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">
|
||||
Этапы и критерии фиксируются, исполнитель ведет работы по чек-листам.
|
||||
</p>
|
||||
</div>
|
||||
<div class="rounded-3xl bg-base-100/90 p-6 shadow-soft">
|
||||
<div class="text-xs font-semibold text-neutral/60">Шаг 3</div>
|
||||
<h3 class="mt-2 font-display text-2xl">Независимая проверка</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">
|
||||
Инспектор подтверждает качество, сервис переводит эскроу исполнителю по результату.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="value" class="slide">
|
||||
<div class="slide-top">Value Proposition</div>
|
||||
<div class="slide-head">
|
||||
<h2 class="slide-title">Что получает каждая сторона</h2>
|
||||
<p class="slide-preamble">
|
||||
Итог сценария должен быть очевиден для обеих ролей. Мы фиксируем ценность отдельно для
|
||||
заказчика и для исполнителя, чтобы не было перекоса и спора за «справедливость».
|
||||
</p>
|
||||
</div>
|
||||
<div class="slide-main">
|
||||
<div class="grid gap-6 md:grid-cols-2">
|
||||
<div class="rounded-3xl bg-base-100/90 p-6 shadow-soft">
|
||||
<h3 class="font-display text-2xl">Заказчик</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">
|
||||
Прозрачная смета, понятные критерии качества и независимая приемка. Деньги защищены
|
||||
эскроу, а результат подтвержден экспертом.
|
||||
</p>
|
||||
</div>
|
||||
<div class="rounded-3xl bg-base-100/90 p-6 shadow-soft">
|
||||
<h3 class="font-display text-2xl">Исполнитель</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">
|
||||
Четкий регламент работ, меньше спорных ситуаций и гарантированная оплата после проверки.
|
||||
Проще сдавать этапы и выстраивать доверие.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="prototype" class="slide">
|
||||
<div class="slide-top">Прототип</div>
|
||||
<div class="slide-head">
|
||||
<h2 class="slide-title">Один экран — один смысл</h2>
|
||||
<p class="slide-preamble">
|
||||
Посмотрите прототип: мы подготовили сценарий, который показывает, как пользователь проходит
|
||||
путь от объекта до понятной сметы, этапов и уведомлений. Окунитесь в то, как это может выглядеть.
|
||||
</p>
|
||||
</div>
|
||||
<div class="slide-main">
|
||||
<div class="relative flex justify-center">
|
||||
<div class="mockup-phone border-primary/40 shadow-glow">
|
||||
<div class="camera"></div>
|
||||
<div class="display">
|
||||
<div class="artboard artboard-demo phone-1 bg-base-100 p-4">
|
||||
<div class="space-y-4">
|
||||
<div class="rounded-2xl bg-base-200 p-3">
|
||||
<div class="text-xs font-semibold text-neutral/60">Старт проекта</div>
|
||||
<div class="mt-2 flex items-center justify-between">
|
||||
<div class="font-display">Добавить объект</div>
|
||||
<button class="btn btn-xs btn-primary">Добавить</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rounded-2xl bg-white p-3 shadow-soft">
|
||||
<div class="text-xs font-semibold text-neutral/60">Шаг 1</div>
|
||||
<div class="mt-1 font-display">Фото и видео объекта</div>
|
||||
<div class="mt-2 flex gap-2">
|
||||
<button class="btn btn-xs btn-outline">Добавить фото</button>
|
||||
<button class="btn btn-xs btn-outline">Добавить видео</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rounded-2xl bg-white p-3 shadow-soft">
|
||||
<div class="text-xs font-semibold text-neutral/60">Шаг 2</div>
|
||||
<div class="mt-1 font-display">Смета и этапы</div>
|
||||
<div class="mt-2 text-xs text-neutral/60">Выберите дату старта проекта</div>
|
||||
<div class="mt-2 flex items-center justify-between rounded-xl bg-base-200 px-3 py-2 text-xs">
|
||||
<span>Старт: 15 апреля</span>
|
||||
<span>6 этапов</span>
|
||||
</div>
|
||||
<div class="mt-2 text-xs text-neutral/60">Спецификация: материалы + объемы</div>
|
||||
</div>
|
||||
|
||||
<div class="rounded-2xl bg-base-200 p-3">
|
||||
<div class="text-xs font-semibold text-neutral/60">Шаг 3</div>
|
||||
<div class="mt-1 font-display">Уведомление о приемке</div>
|
||||
<div class="mt-2 text-xs text-neutral/60">Этап “Черновые работы” завершен. Проверьте и подтвердите.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="monetization" class="slide">
|
||||
<div class="slide-top">Монетизация</div>
|
||||
<div class="slide-head">
|
||||
<h2 class="slide-title">Прозрачные источники выручки</h2>
|
||||
<p class="slide-preamble">
|
||||
Мы фиксируем этапы, сроки и материалы — значит, точно знаем, где создается ценность. Это
|
||||
делает монетизацию понятной для обеих сторон и логично вытекающей из процесса.
|
||||
</p>
|
||||
</div>
|
||||
<div class="slide-main">
|
||||
<div class="relative overflow-hidden rounded-3xl border border-base-300 bg-base-100/90 p-8">
|
||||
<div class="pointer-events-none absolute -left-16 top-10 h-36 w-36 rounded-full bg-primary/15 blur-3xl"></div>
|
||||
<div class="pointer-events-none absolute -right-10 bottom-0 h-40 w-40 rounded-full bg-secondary/20 blur-3xl"></div>
|
||||
<div class="relative grid gap-6 md:grid-cols-3">
|
||||
<div class="rounded-3xl bg-white/90 p-6 shadow-soft">
|
||||
<div class="mb-4 inline-flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/15 text-primary">
|
||||
<svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="1.6">
|
||||
<path d="M12 3v18M7 7h5a3 3 0 1 1 0 6H9a3 3 0 1 0 0 6h5" />
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="font-display text-2xl">Комиссия эскроу</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">Процент от подтвержденного этапа, удерживается сервисом.</p>
|
||||
</div>
|
||||
<div class="rounded-3xl bg-white/90 p-6 shadow-soft">
|
||||
<div class="mb-4 inline-flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/15 text-primary">
|
||||
<svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="1.6">
|
||||
<path d="M4 20h16M6 20l2-10h8l2 10M9 10V6a3 3 0 0 1 6 0v4" />
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="font-display text-2xl">Инспекция</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">Плата за выезд и экспертизу, инициирует заказчик.</p>
|
||||
</div>
|
||||
<div class="rounded-3xl bg-white/90 p-6 shadow-soft">
|
||||
<div class="mb-4 inline-flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/15 text-primary">
|
||||
<svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="1.6">
|
||||
<path d="M4 7h16l-2 10H6L4 7z" />
|
||||
<path d="M8 7V5a4 4 0 0 1 8 0v2" />
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="font-display text-2xl">Материалы</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">За материалы платит заказчик, сервис получает маржу.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="metrics" class="slide">
|
||||
<div class="slide-top">Метрики</div>
|
||||
<div class="slide-head">
|
||||
<h2 class="slide-title">Проверяем, что продукт работает</h2>
|
||||
<p class="slide-preamble">
|
||||
Метрики должны показать, что сервис снижает конфликт и ускоряет приемку. Мы отслеживаем
|
||||
ключевые сигналы качества, скорости и точности.
|
||||
</p>
|
||||
</div>
|
||||
<div class="slide-main">
|
||||
<div class="grid gap-6 md:grid-cols-[1fr_1fr]">
|
||||
<div>
|
||||
<h3 class="font-display text-2xl">North Star Metric</h3>
|
||||
<p class="mt-3 text-sm text-neutral/70">Доля этапов, принятых с первого раза.</p>
|
||||
<p class="mt-3 text-sm text-neutral/70">
|
||||
Влияют: точность автосметы, скорость приемки, доля зеленых оценок.
|
||||
</p>
|
||||
</div>
|
||||
<div class="grid gap-4">
|
||||
<div class="rounded-3xl border border-base-300 bg-base-100/90 p-6">
|
||||
<div class="text-xs font-semibold text-neutral/60">Качество</div>
|
||||
<div class="mt-2 font-display text-xl">Доля зеленых приемок</div>
|
||||
</div>
|
||||
<div class="rounded-3xl border border-base-300 bg-base-100/90 p-6">
|
||||
<div class="text-xs font-semibold text-neutral/60">Скорость</div>
|
||||
<div class="mt-2 font-display text-xl">Среднее время приемки этапа</div>
|
||||
</div>
|
||||
<div class="rounded-3xl border border-base-300 bg-base-100/90 p-6">
|
||||
<div class="text-xs font-semibold text-neutral/60">Точность</div>
|
||||
<div class="mt-2 font-display text-xl">Отклонение сметы от факта</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="roadmap" class="slide">
|
||||
<div class="slide-top">Roadmap</div>
|
||||
<div class="slide-head">
|
||||
<h2 class="slide-title">Валидация и масштабирование</h2>
|
||||
<p class="slide-preamble">
|
||||
В фокусе не разработка, а проверка гипотез и запуск в реальных процессах. Сначала — пилот
|
||||
и валидируемые результаты, затем — подключение партнеров и масштабирование.
|
||||
</p>
|
||||
</div>
|
||||
<div class="slide-main">
|
||||
<div class="rounded-3xl border border-base-300 bg-base-100/90 p-6">
|
||||
<div class="grid gap-4 text-sm">
|
||||
<div class="grid grid-cols-6 gap-2 text-xs text-neutral/50">
|
||||
<div>М1</div>
|
||||
<div>М2</div>
|
||||
<div>М3</div>
|
||||
<div>М4</div>
|
||||
<div>М5</div>
|
||||
<div>М6</div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-[160px_1fr] items-center gap-4">
|
||||
<div class="text-neutral/70">Пилот и гипотезы</div>
|
||||
<div class="grid grid-cols-6 gap-2">
|
||||
<div class="col-span-2 rounded-full bg-primary/80 py-2 text-center text-xs text-primary-content">М1–М2</div>
|
||||
<div class="col-span-4 rounded-full bg-base-200 py-2"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-[160px_1fr] items-center gap-4">
|
||||
<div class="text-neutral/70">Встраивание в процессы</div>
|
||||
<div class="grid grid-cols-6 gap-2">
|
||||
<div class="col-span-2 rounded-full bg-base-200 py-2"></div>
|
||||
<div class="col-span-2 rounded-full bg-primary/80 py-2 text-center text-xs text-primary-content">М3–М4</div>
|
||||
<div class="col-span-2 rounded-full bg-base-200 py-2"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-[160px_1fr] items-center gap-4">
|
||||
<div class="text-neutral/70">Масштабирование</div>
|
||||
<div class="grid grid-cols-6 gap-2">
|
||||
<div class="col-span-4 rounded-full bg-base-200 py-2"></div>
|
||||
<div class="col-span-2 rounded-full bg-primary/80 py-2 text-center text-xs text-primary-content">М5–М6</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section id="final" class="slide">
|
||||
<div class="slide-top">Итог</div>
|
||||
<div class="slide-head">
|
||||
<h2 class="slide-title">Ремонт становится управляемым процессом</h2>
|
||||
<p class="slide-preamble">
|
||||
Методология, приемка и деньги — внутри сервиса. Пользователи получают спокойствие, а бизнес —
|
||||
масштабируемую модель с экспертизой и прозрачной экономикой.
|
||||
</p>
|
||||
</div>
|
||||
<div class="slide-main"></div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
useHead({
|
||||
title: 'Контроль ремонта — презентация',
|
||||
meta: [
|
||||
{ name: 'description', content: 'Презентация продукта: смета, приемка, эскроу и методология ремонта.' }
|
||||
]
|
||||
})
|
||||
</script>
|
||||
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@300;400;600;700&family=Space+Grotesk:wght@400;600;700&display=swap');
|
||||
|
||||
:root {
|
||||
color-scheme: light;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Manrope', system-ui, sans-serif;
|
||||
}
|
||||
|
||||
.font-display {
|
||||
font-family: 'Space Grotesk', system-ui, sans-serif;
|
||||
}
|
||||
|
||||
.slide {
|
||||
border-radius: 2rem;
|
||||
background: color-mix(in oklab, white 80%, transparent);
|
||||
border: 1px solid rgba(20, 20, 20, 0.08);
|
||||
padding: 2.5rem;
|
||||
box-shadow: 0 18px 50px rgba(20, 20, 20, 0.08);
|
||||
min-height: 70vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.slide-top {
|
||||
font-size: 0.75rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.2em;
|
||||
color: rgba(20, 20, 20, 0.45);
|
||||
margin-bottom: 1.25rem;
|
||||
}
|
||||
|
||||
.slide-title {
|
||||
font-family: 'Space Grotesk', system-ui, sans-serif;
|
||||
font-size: clamp(2rem, 3vw, 2.75rem);
|
||||
line-height: 1.1;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.slide-preamble {
|
||||
margin-top: 0.75rem;
|
||||
color: rgba(20, 20, 20, 0.7);
|
||||
font-size: 1rem;
|
||||
max-width: 52rem;
|
||||
}
|
||||
|
||||
.slide-head {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.slide-main {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
gap: 1.5rem;
|
||||
}
|
||||
</style>
|
||||
6
nuxt.config.ts
Normal file
6
nuxt.config.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
// https://nuxt.com/docs/api/configuration/nuxt-config
|
||||
export default defineNuxtConfig({
|
||||
compatibilityDate: '2025-07-15',
|
||||
devtools: { enabled: true },
|
||||
modules: ['@nuxtjs/tailwindcss']
|
||||
})
|
||||
11427
package-lock.json
generated
Normal file
11427
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
21
package.json
Normal file
21
package.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "landing",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "nuxt build",
|
||||
"dev": "nuxt dev",
|
||||
"generate": "nuxt generate",
|
||||
"preview": "nuxt preview",
|
||||
"postinstall": "nuxt prepare"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nuxtjs/tailwindcss": "^6.14.0",
|
||||
"nuxt": "^4.3.1",
|
||||
"vue": "^3.5.28",
|
||||
"vue-router": "^4.6.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"daisyui": "^5.5.18"
|
||||
}
|
||||
}
|
||||
BIN
public/favicon.ico
Normal file
BIN
public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
2
public/robots.txt
Normal file
2
public/robots.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
User-Agent: *
|
||||
Disallow:
|
||||
63
tailwind.config.js
Normal file
63
tailwind.config.js
Normal file
@@ -0,0 +1,63 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: [
|
||||
"./components/**/*.{vue,js,ts}",
|
||||
"./layouts/**/*.vue",
|
||||
"./pages/**/*.vue",
|
||||
"./app.vue",
|
||||
"./app/app.vue",
|
||||
"./plugins/**/*.{js,ts}"
|
||||
],
|
||||
theme: {
|
||||
extend: {
|
||||
fontFamily: {
|
||||
display: ["'Space Grotesk'", "ui-sans-serif", "system-ui", "sans-serif"],
|
||||
body: ["'Manrope'", "ui-sans-serif", "system-ui", "sans-serif"]
|
||||
},
|
||||
boxShadow: {
|
||||
"glow": "0 0 40px rgba(45, 200, 140, 0.35)",
|
||||
"soft": "0 10px 30px rgba(18, 24, 40, 0.12)"
|
||||
},
|
||||
backgroundImage: {
|
||||
"mesh": "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%)"
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: [require("daisyui")],
|
||||
daisyui: {
|
||||
themes: [
|
||||
{
|
||||
silk: {
|
||||
"base-100": "oklch(97% 0.0035 67.78)",
|
||||
"base-200": "oklch(95% 0.0081 61.42)",
|
||||
"base-300": "oklch(90% 0.0081 61.42)",
|
||||
"base-content": "oklch(40% 0.0081 61.42)",
|
||||
"primary": "oklch(23.27% 0.0249 284.3)",
|
||||
"primary-content": "oklch(94.22% 0.2505 117.44)",
|
||||
"secondary": "oklch(23.27% 0.0249 284.3)",
|
||||
"secondary-content": "oklch(73.92% 0.2135 50.94)",
|
||||
"accent": "oklch(23.27% 0.0249 284.3)",
|
||||
"accent-content": "oklch(88.92% 0.2061 189.9)",
|
||||
"neutral": "oklch(20% 0 0)",
|
||||
"neutral-content": "oklch(80% 0.0081 61.42)",
|
||||
"info": "oklch(80.39% 0.1148 241.68)",
|
||||
"info-content": "oklch(30.39% 0.1148 241.68)",
|
||||
"success": "oklch(83.92% 0.0901 136.87)",
|
||||
"success-content": "oklch(23.92% 0.0901 136.87)",
|
||||
"warning": "oklch(83.92% 0.1085 80)",
|
||||
"warning-content": "oklch(43.92% 0.1085 80)",
|
||||
"error": "oklch(75.1% 0.1814 22.37)",
|
||||
"error-content": "oklch(35.1% 0.1814 22.37)",
|
||||
"--radius-selector": "2rem",
|
||||
"--radius-field": "2rem",
|
||||
"--radius-box": "2rem",
|
||||
"--size-selector": "0.3125rem",
|
||||
"--size-field": "0.3125rem",
|
||||
"--border": "0.5px",
|
||||
"--depth": "0",
|
||||
"--noise": "0"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
};
|
||||
18
tsconfig.json
Normal file
18
tsconfig.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
// https://nuxt.com/docs/guide/concepts/typescript
|
||||
"files": [],
|
||||
"references": [
|
||||
{
|
||||
"path": "./.nuxt/tsconfig.app.json"
|
||||
},
|
||||
{
|
||||
"path": "./.nuxt/tsconfig.server.json"
|
||||
},
|
||||
{
|
||||
"path": "./.nuxt/tsconfig.shared.json"
|
||||
},
|
||||
{
|
||||
"path": "./.nuxt/tsconfig.node.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user