# PROJECT CONTEXT FOR AI AGENT ## PROJECT OVERVIEW Vue.js application with CoffeeScript, Pug, Stylus stack - 24 files total - 2 priority documentation files - 0 current work files - 0 priority configuration files - Main components: - Routes: ## PRIORITY DOCUMENTATION (Complete): ### 📋 README.md ```markdown # Текущее задание (Выполнить) ## Общее задание: Разработать веб-приложение [название], используя платформу **s5l.ru** ### Дизайн: - Темы: темная по умолчанию, переключаемая на светлую через `[data-theme="light"]` - Цветовая палитра из `DesignTokens.styl` - Atomic Design + User-Centered подход - Полная поддержка WCAG 2.2 (контраст ≥ 4.5:1) ### Функциональность: - Автоматическое определение языка (URL → браузер) - Динамическая подгрузка контента из CouchDB с локальной репликацией через PouchDB - Offline-first: работа без интернета после первого визита - Единая система стилей через CSS-переменные и Tailwind ## Текущее действие: Сделай первый этап разработки, включающий файлы app/pages/home* и `app/utils/AppDB.coffee` — полная реализация с методами `getDocumentByPath` с проверкой наличия там документа, с начтройками саййта, если его нет создать документ по умолчанию при инициализации AppDB Опиши следущие для разработки файлы. --- # Промт для разработки на платформе s5l.ru Ты — Senior Fullstack-архитектор и UI/UX-прагматик. Твоя задача — разрабатывать новые проекты, строго следуя логике и структуре платформы `s5l.ru`. ## Стек (НЕИЗМЕНЕН) - **Frontend**: Vue 3 (Composition API через `render` функции), CoffeeScript, Pug, Stylus, Tailwind CSS, svg, webp, webm, peerjs, websocket, webtorrent - **Backend**: CouchDB + PouchDB (репликация, дизайн-документы, админка) - **Сборка**: все шаблоны → `pug.json`, стили → `styl.json` - **Именование классов**: используй методику BEM - **Глобальный контекст**: `globalThis._` — ссылка на корневой Vue-экземпляр из `app/app.coffee` # Проект: s5l.ru ## Общее описание `s5l.ru` — это **мультиязычная платформа для быстрого старта проектов** с поддержкой: - offline-first через **PouchDB/CouchDB** - автоматического определения языка (из URL → браузер) - динамической подгрузки контента - темной/светлой темы (`[data-theme="dark/light"]`) - WCAG 2.2 (контраст ≥ 4.5:1) ## Стек - **Frontend**: Vue 3 (render-функции), CoffeeScript, Pug, Stylus, Tailwind CSS - **Backend**: CouchDB + PouchDB (репликация, дизайн-документы) - **Сборка**: `pug.json`, `styl.json` ## Запуск нового проекта 1. Создать дизайн-документы в CouchDB 2. Положить стартовые документы с `type: 'page'`, `path: '/'`, и `translations` 3. Использовать `AppDB.getDocumentByPath` в `beforeMount` 4. Стили — только через CSS-переменные из `DesignTokens.styl` ## Доступность - Поддержка тем: `:root` → `[data-theme="light"]` - Контраст ≥ 4.5:1 - Анимации ≤ 500 мс - Mobile-first верстка ## Архитектура - Все тексты хранятся в **CouchDB** с поддержкой мультиязычности и мультидоменности - Вся логика работы с БД — через `AppDB` - Все компоненты — по **Atomic Design**, стили — через `DesignTokens.styl` ## Структура проекта ``` app/ ├── assets/ # Системные изображения, пиктограммы ├── app.coffee # инициализация Vue, AppDB, глобальный _ ├── app.pug # Основной шаблон с Хедером, , Футером ├── app.styl # Глобальные стили ├── DesignTokens.styl # дизайн-система ├── utils/ | └── AppDB.coffee # доступ к данным ├── pages/ # Страницы проекта | ├── Home.coffee | ├── Home.pug | └── Home.styl └── shared/ ├── AppLink.* # компонент ссылок └── ... ``` ## Правила ### 1. Vue-компоненты - **Имя файла**: PascalCase (`NewsList.coffee`, `NewsList.pug`, `NewsList.styl`) - **Экспорт**: `module.exports = { name: '...', render: ..., data: -> {}, ... }` - **Стили**: подключать через ```coffee document.head.insertAdjacentHTML 'beforeend', '' ``` - **Шаблон**: рендерить через ```coffee render: (new Function '_ctx', '_cache', renderFns['app/shared/NewsList.pug'])() ``` - **Жизненный цикл**: ❌ НЕПРАВИЛЬНО: ```coffeescript async beforeMount: -> ``` ✅ ПРАВИЛЬНО: ```coffeescript beforeMount: -> ``` *(асинхронность обрабатывается внутри метода через `await`, но сигнатура — без `async`)* ### 2. Роутинг - Все маршруты — в `temp.coffee` → `VueRouter.createRouter({ routes: [...] })` - Компонент страницы должен быть `require`'нут без `.default` только если не экспортирует как `default` ### 3. Ссылки - **ЗАПРЕЩЕНО**: `a(href="...")`, `router-link(to="...")` - **ТОЛЬКО**: `app-link(to="...")` с подключением компонента `'app-link': require 'app/shared/AppLink'` ### 4. Стили - **Цвета, отступы, шрифты** — ТОЛЬКО из `DesignTokens.styl` через CSS-переменные (`var(--primary-color)`, `var(--space-4)`) - **Tailwind**: не использовать `@apply` - **Stylus**: не использовать `@import '../DesignTokens.styl'` — он уже подключен глобально ### 5. Pug - Атрибуты в одной строке, без многострочных выражений - Внешние данные — только через `data` или `computed` - **Tailwind-классы** — только внутри `class=""`, **не через точечную нотацию** ❌ НЕПРАВИЛЬНО: ```pug .max-w-4xl.mx-auto.px-4 ``` ✅ ПРАВИЛЬНО: ```pug div(class="max-w-4xl mx-auto px-4") ``` - Пример правильно: ```pug div(v-for="item in items" :key="item.id") div(:class="isActive ? 'active' : 'inactive'" class="w-full") ``` ### 6. CoffeeScript - Отступы: 4 пробела - `->` для методов, `=>` — только при необходимости сохранения `this` - `debug.log "сообщение"` вместо `console.log` - Строки: `"строка="+переменная`, без интерполяции ### 7. CouchDB - Все запросы — через `AppDB`, который надо разработать под проект и подключить глобально в `app/app.coffee` - Дизайн-документы: создавать функции `.toString()` ### 8. Доступность и дизайн - WCAG 2.2 (контраст ≥ 4.5:1) - Mobile-first - Atomic Design + User-Centered подход - Анимации: 200–500 мс, плавные переходы ## Обязательное требование > **ВСЕГДА прикладывай полные листинги всех файлов** — даже если изменения минимальны. Частичные или сокращённые фрагменты недопустимы. Каждый файл должен быть представлен целиком, как он будет сохранён на диске. ## Шаблон компонента (полный пример) **Файл**: `app/shared/NewsList.coffee` ```coffeescript document.head.insertAdjacentHTML 'beforeend','' module.exports = name: 'NewsList' render: (new Function '_ctx', '_cache', renderFns['app/shared/NewsList.pug'])() data: -> return { _: _ posts: [] } beforeMount: -> @posts = await AppDB.getPublishedPosts(limit: 10) components: 'app-link': require 'app/shared/AppLink' ``` **Файл**: `app/shared/NewsList.pug` ```pug div(class="space-y-4") app-link(v-for="post in posts" :key="post.id" :to="'/pages/'+post.id") h3(class="text-xl") {{ post.doc.h }} ``` **Файл**: `app/shared/NewsList.styl` ```stylus // Только стили компонента. DesignTokens — через var() .news-item padding: var(--space-4) border-bottom: var(--border-1) solid var(--neutral-300) ``` ## Запрещено - React, TypeScript, MongoDB, SASS, Webpack, Vite - Любые отклонения от стиля кода в `DEVELOPMENT.md` - Использование `Vue = require 'vue'` — всё глобально Следуй этому промту для всех новых проектов. --- ``` ### 📋 app/DesignTokens.styl ```stylus :root // Цветовая система для темной темы по умолчанию --primary-color: #f87171 --primary-dark: #ef4444 --primary-light: #fca5a5 --secondary-color: #1e293b --secondary-dark: #0f172a --secondary-light: #334155 --accent-color: #22d3ee --accent-dark: #06b6d4 --accent-light: #67e8f9 // Нейтральные цвета для темной темы --neutral-50: #0f172a --neutral-100: #1e293b --neutral-200: #334155 --neutral-300: #475569 --neutral-400: #64748b --neutral-500: #94a3b8 --neutral-600: #cbd5e1 --neutral-700: #e2e8f0 --neutral-800: #f1f5f9 --neutral-900: #f8fafc // Цвета текста для темной темы --text-primary: #f8fafc --text-secondary: #e2e8f0 --text-muted: #94a3b8 // Цвета фона для темной темы --bg-primary: #0f172a --bg-secondary: #1e293b --bg-card: #1e293b --bg-overlay: rgba(15, 23, 42, 0.8) // Градиенты для темной темы --gradient-primary: linear-gradient(135deg, var(--primary-dark) 0%, var(--primary-color) 50%, var(--accent-color) 100%) --gradient-dark: linear-gradient(135deg, var(--secondary-dark) 0%, var(--secondary-color) 100%) // Типографическая система --font-family-sans: 'Inter', 'Segoe UI', system-ui, sans-serif --font-family-serif: 'Georgia', 'Times New Roman', serif --text-xs: 0.75rem --text-sm: 0.875rem --text-base: 1rem --text-lg: 1.125rem --text-xl: 1.25rem --text-2xl: 1.5rem --text-3xl: 1.875rem --text-4xl: 2.25rem --text-5xl: 3rem --font-light: 300 --font-normal: 400 --font-medium: 500 --font-semibold: 600 --font-bold: 700 // Spacing system --space-1: 0.25rem --space-2: 0.5rem --space-3: 0.75rem --space-4: 1rem --space-5: 1.25rem --space-6: 1.5rem --space-8: 2rem --space-10: 2.5rem --space-12: 3rem --space-16: 4rem --space-20: 5rem // Тени и эффекты для темной темы --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.5) --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -1px rgba(0, 0, 0, 0.4) --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.7), 0 4px 6px -2px rgba(0, 0, 0, 0.5) --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.8), 0 10px 10px -5px rgba(0, 0, 0, 0.6) // Анимации --transition-fast: 0.15s ease-in-out --transition-normal: 0.3s ease-in-out --transition-slow: 0.5s ease-in-out // Breakpoints --breakpoint-sm: 640px --breakpoint-md: 768px --breakpoint-lg: 1024px --breakpoint-xl: 1280px --breakpoint-2xl: 1536px // Светлая тема [data-theme="light"] --primary-color: #e11d48 --primary-dark: #be123c --primary-light: #fb7185 --secondary-color: #f8fafc --secondary-dark: #f1f5f9 --secondary-light: #ffffff --accent-color: #06b6d4 --accent-dark: #0891b2 --accent-light: #22d3ee --neutral-50: #f8fafc --neutral-100: #f1f5f9 --neutral-200: #e2e8f0 --neutral-300: #cbd5e1 --neutral-400: #94a3b8 --neutral-500: #64748b --neutral-600: #475569 --neutral-700: #334155 --neutral-800: #1e293b --neutral-900: #0f172a --text-primary: #0f172a --text-secondary: #334155 --text-muted: #64748b --bg-primary: #ffffff --bg-secondary: #f8fafc --bg-card: #ffffff --bg-overlay: rgba(255, 255, 255, 0.8) --gradient-primary: linear-gradient(135deg, var(--primary-dark) 0%, var(--primary-color) 50%, var(--accent-color) 100%) --gradient-dark: linear-gradient(135deg, var(--neutral-100) 0%, var(--neutral-50) 100%) --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05) --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) // Утилитарные классы для кастомных свойств .bg-primary background-color: var(--primary-color) .text-primary color: var(--primary-color) .border-primary border-color: var(--primary-color) .bg-accent background-color: var(--accent-color) .text-accent color: var(--accent-color) .bg-neutral background-color: var(--neutral-500) .text-neutral color: var(--neutral-500) .bg-dark background-color: var(--bg-primary) .text-dark color: var(--text-primary) .bg-card background-color: var(--bg-card) .text-card color: var(--text-primary) // Анимации .transition-fast transition: var(--transition-fast) .transition-normal transition: var(--transition-normal) .transition-slow transition: var(--transition-slow) // Тени .shadow-custom-sm box-shadow: var(--shadow-sm) .shadow-custom-md box-shadow: var(--shadow-md) .shadow-custom-lg box-shadow: var(--shadow-lg) .shadow-custom-xl box-shadow: var(--shadow-xl) // Добавляем дополнительные утилитарные классы для лучшей поддержки компонентов .card-primary background-color: var(--bg-card) border: 1px solid var(--neutral-300) border-radius: 8px box-shadow: var(--shadow-sm) transition: all var(--transition-normal) .card-primary:hover border-color: var(--primary-color) box-shadow: var(--shadow-md) .text-icon filter: brightness(0) invert(0) transition: filter var(--transition-fast) [data-theme="dark"] .text-icon filter: brightness(0) invert(1) .icon-primary filter: brightness(0) invert(0) transition: filter var(--transition-fast) [data-theme="dark"] .icon-primary filter: brightness(0) invert(1) // Утилиты для контрастного текста .text-contrast-high color: var(--text-primary) .text-contrast-medium color: var(--text-secondary) .text-contrast-low color: var(--text-muted) // Утилиты для фонов .bg-surface background-color: var(--bg-card) .bg-surface-alt background-color: var(--bg-secondary) ``` ## CURRENT WORK FILES No current work files specified in WORKFILES ## OTHER FILES (brief overview): // .gitignore (Unknown) - 29 chars // app/app.coffee (CoffeeScript) - 3584 chars // app/app.pug (Pug Template) - 699 chars // app/app.styl (Stylus) - 1013 chars // app/layout.pug (Pug Template) - 324 chars // app/pages/Home.coffee (CoffeeScript) - 697 chars // app/pages/Home.pug (Pug Template) - 845 chars // app/pages/Home.styl (Stylus) - 281 chars // app/shared/AppLink.coffee (CoffeeScript) - 633 chars // app/shared/AppLink.pug (Pug Template) - 214 chars // app/shared/AppLink.styl (Stylus) - 1264 chars // app/shared/HeroSection.coffee (CoffeeScript) - 311 chars // app/shared/HeroSection.pug (Pug Template) - 574 chars // app/shared/HeroSection.styl (Stylus) - 125 chars // app/shared/ImageGallery.coffee (CoffeeScript) - 367 chars // app/shared/ImageGallery.pug (Pug Template) - 414 chars // app/shared/ImageGallery.styl (Stylus) - 324 chars // app/utils/AppDB.coffee (CoffeeScript) - 4684 chars // doc.coffee (CoffeeScript) - 1285 chars // lzma.coffee (CoffeeScript) - 1010 chars // pug/base.pug (Pug Template) - 504 chars // pug/bem.pug (Pug Template) - 1035 chars