| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486 |
- # 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 # Основной шаблон с Хедером, <router-view>, Футером
- ├── 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', '<style type="text/tailwindcss">'+stylFns['app/shared/NewsList.styl']+'</style>'
- ```
- - **Шаблон**: рендерить через
- ```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','<style type="text/tailwindcss">'+stylFns['app/shared/NewsList.styl']+'</style>'
- 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
|