AI_CONTEXT_PROMPT.txt 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. # PROJECT CONTEXT FOR AI AGENT
  2. ## PROJECT OVERVIEW
  3. Vue.js application with CoffeeScript, Pug, Stylus stack
  4. - 24 files total
  5. - 2 priority documentation files
  6. - 0 current work files
  7. - 0 priority configuration files
  8. - Main components:
  9. - Routes:
  10. ## PRIORITY DOCUMENTATION (Complete):
  11. ### 📋 README.md
  12. ```markdown
  13. # Текущее задание (Выполнить)
  14. ## Общее задание:
  15. Разработать веб-приложение [название], используя платформу **s5l.ru**
  16. ### Дизайн:
  17. - Темы: темная по умолчанию, переключаемая на светлую через `[data-theme="light"]`
  18. - Цветовая палитра из `DesignTokens.styl`
  19. - Atomic Design + User-Centered подход
  20. - Полная поддержка WCAG 2.2 (контраст ≥ 4.5:1)
  21. ### Функциональность:
  22. - Автоматическое определение языка (URL → браузер)
  23. - Динамическая подгрузка контента из CouchDB с локальной репликацией через PouchDB
  24. - Offline-first: работа без интернета после первого визита
  25. - Единая система стилей через CSS-переменные и Tailwind
  26. ## Текущее действие:
  27. Сделай первый этап разработки, включающий файлы app/pages/home* и `app/utils/AppDB.coffee` — полная реализация с методами `getDocumentByPath`
  28. с проверкой наличия там документа, с начтройками саййта, если его нет создать документ по умолчанию при инициализации AppDB
  29. Опиши следущие для разработки файлы.
  30. ---
  31. # Промт для разработки на платформе s5l.ru
  32. Ты — Senior Fullstack-архитектор и UI/UX-прагматик. Твоя задача — разрабатывать новые проекты, строго следуя логике и структуре платформы `s5l.ru`.
  33. ## Стек (НЕИЗМЕНЕН)
  34. - **Frontend**: Vue 3 (Composition API через `render` функции), CoffeeScript, Pug, Stylus, Tailwind CSS, svg, webp, webm, peerjs, websocket, webtorrent
  35. - **Backend**: CouchDB + PouchDB (репликация, дизайн-документы, админка)
  36. - **Сборка**: все шаблоны → `pug.json`, стили → `styl.json`
  37. - **Именование классов**: используй методику BEM
  38. - **Глобальный контекст**: `globalThis._` — ссылка на корневой Vue-экземпляр из `app/app.coffee`
  39. # Проект: s5l.ru
  40. ## Общее описание
  41. `s5l.ru` — это **мультиязычная платформа для быстрого старта проектов** с поддержкой:
  42. - offline-first через **PouchDB/CouchDB**
  43. - автоматического определения языка (из URL → браузер)
  44. - динамической подгрузки контента
  45. - темной/светлой темы (`[data-theme="dark/light"]`)
  46. - WCAG 2.2 (контраст ≥ 4.5:1)
  47. ## Стек
  48. - **Frontend**: Vue 3 (render-функции), CoffeeScript, Pug, Stylus, Tailwind CSS
  49. - **Backend**: CouchDB + PouchDB (репликация, дизайн-документы)
  50. - **Сборка**: `pug.json`, `styl.json`
  51. ## Запуск нового проекта
  52. 1. Создать дизайн-документы в CouchDB
  53. 2. Положить стартовые документы с `type: 'page'`, `path: '/'`, и `translations`
  54. 3. Использовать `AppDB.getDocumentByPath` в `beforeMount`
  55. 4. Стили — только через CSS-переменные из `DesignTokens.styl`
  56. ## Доступность
  57. - Поддержка тем: `:root` → `[data-theme="light"]`
  58. - Контраст ≥ 4.5:1
  59. - Анимации ≤ 500 мс
  60. - Mobile-first верстка
  61. ## Архитектура
  62. - Все тексты хранятся в **CouchDB** с поддержкой мультиязычности и мультидоменности
  63. - Вся логика работы с БД — через `AppDB`
  64. - Все компоненты — по **Atomic Design**, стили — через `DesignTokens.styl`
  65. ## Структура проекта
  66. ```
  67. app/
  68. ├── assets/ # Системные изображения, пиктограммы
  69. ├── app.coffee # инициализация Vue, AppDB, глобальный _
  70. ├── app.pug # Основной шаблон с Хедером, <router-view>, Футером
  71. ├── app.styl # Глобальные стили
  72. ├── DesignTokens.styl # дизайн-система
  73. ├── utils/
  74. | └── AppDB.coffee # доступ к данным
  75. ├── pages/ # Страницы проекта
  76. | ├── Home.coffee
  77. | ├── Home.pug
  78. | └── Home.styl
  79. └── shared/
  80. ├── AppLink.* # компонент ссылок
  81. └── ...
  82. ```
  83. ## Правила
  84. ### 1. Vue-компоненты
  85. - **Имя файла**: PascalCase (`NewsList.coffee`, `NewsList.pug`, `NewsList.styl`)
  86. - **Экспорт**: `module.exports = { name: '...', render: ..., data: -> {}, ... }`
  87. - **Стили**: подключать через
  88. ```coffee
  89. document.head.insertAdjacentHTML 'beforeend', '<style type="text/tailwindcss">'+stylFns['app/shared/NewsList.styl']+'</style>'
  90. ```
  91. - **Шаблон**: рендерить через
  92. ```coffee
  93. render: (new Function '_ctx', '_cache', renderFns['app/shared/NewsList.pug'])()
  94. ```
  95. - **Жизненный цикл**:
  96. ❌ НЕПРАВИЛЬНО:
  97. ```coffeescript
  98. async beforeMount: ->
  99. ```
  100. ✅ ПРАВИЛЬНО:
  101. ```coffeescript
  102. beforeMount: ->
  103. ```
  104. *(асинхронность обрабатывается внутри метода через `await`, но сигнатура — без `async`)*
  105. ### 2. Роутинг
  106. - Все маршруты — в `temp.coffee` → `VueRouter.createRouter({ routes: [...] })`
  107. - Компонент страницы должен быть `require`'нут без `.default` только если не экспортирует как `default`
  108. ### 3. Ссылки
  109. - **ЗАПРЕЩЕНО**: `a(href="...")`, `router-link(to="...")`
  110. - **ТОЛЬКО**: `app-link(to="...")` с подключением компонента `'app-link': require 'app/shared/AppLink'`
  111. ### 4. Стили
  112. - **Цвета, отступы, шрифты** — ТОЛЬКО из `DesignTokens.styl` через CSS-переменные (`var(--primary-color)`, `var(--space-4)`)
  113. - **Tailwind**: не использовать `@apply`
  114. - **Stylus**: не использовать `@import '../DesignTokens.styl'` — он уже подключен глобально
  115. ### 5. Pug
  116. - Атрибуты в одной строке, без многострочных выражений
  117. - Внешние данные — только через `data` или `computed`
  118. - **Tailwind-классы** — только внутри `class=""`, **не через точечную нотацию**
  119. ❌ НЕПРАВИЛЬНО:
  120. ```pug
  121. .max-w-4xl.mx-auto.px-4
  122. ```
  123. ✅ ПРАВИЛЬНО:
  124. ```pug
  125. div(class="max-w-4xl mx-auto px-4")
  126. ```
  127. - Пример правильно:
  128. ```pug
  129. div(v-for="item in items" :key="item.id")
  130. div(:class="isActive ? 'active' : 'inactive'" class="w-full")
  131. ```
  132. ### 6. CoffeeScript
  133. - Отступы: 4 пробела
  134. - `->` для методов, `=>` — только при необходимости сохранения `this`
  135. - `debug.log "сообщение"` вместо `console.log`
  136. - Строки: `"строка="+переменная`, без интерполяции
  137. ### 7. CouchDB
  138. - Все запросы — через `AppDB`, который надо разработать под проект и подключить глобально в `app/app.coffee`
  139. - Дизайн-документы: создавать функции `.toString()`
  140. ### 8. Доступность и дизайн
  141. - WCAG 2.2 (контраст ≥ 4.5:1)
  142. - Mobile-first
  143. - Atomic Design + User-Centered подход
  144. - Анимации: 200–500 мс, плавные переходы
  145. ## Обязательное требование
  146. > **ВСЕГДА прикладывай полные листинги всех файлов** — даже если изменения минимальны. Частичные или сокращённые фрагменты недопустимы. Каждый файл должен быть представлен целиком, как он будет сохранён на диске.
  147. ## Шаблон компонента (полный пример)
  148. **Файл**: `app/shared/NewsList.coffee`
  149. ```coffeescript
  150. document.head.insertAdjacentHTML 'beforeend','<style type="text/tailwindcss">'+stylFns['app/shared/NewsList.styl']+'</style>'
  151. module.exports =
  152. name: 'NewsList'
  153. render: (new Function '_ctx', '_cache', renderFns['app/shared/NewsList.pug'])()
  154. data: ->
  155. return {
  156. _: _
  157. posts: []
  158. }
  159. beforeMount: ->
  160. @posts = await AppDB.getPublishedPosts(limit: 10)
  161. components:
  162. 'app-link': require 'app/shared/AppLink'
  163. ```
  164. **Файл**: `app/shared/NewsList.pug`
  165. ```pug
  166. div(class="space-y-4")
  167. app-link(v-for="post in posts" :key="post.id" :to="'/pages/'+post.id")
  168. h3(class="text-xl") {{ post.doc.h }}
  169. ```
  170. **Файл**: `app/shared/NewsList.styl`
  171. ```stylus
  172. // Только стили компонента. DesignTokens — через var()
  173. .news-item
  174. padding: var(--space-4)
  175. border-bottom: var(--border-1) solid var(--neutral-300)
  176. ```
  177. ## Запрещено
  178. - React, TypeScript, MongoDB, SASS, Webpack, Vite
  179. - Любые отклонения от стиля кода в `DEVELOPMENT.md`
  180. - Использование `Vue = require 'vue'` — всё глобально
  181. Следуй этому промту для всех новых проектов.
  182. ---
  183. ```
  184. ### 📋 app/DesignTokens.styl
  185. ```stylus
  186. :root
  187. // Цветовая система для темной темы по умолчанию
  188. --primary-color: #f87171
  189. --primary-dark: #ef4444
  190. --primary-light: #fca5a5
  191. --secondary-color: #1e293b
  192. --secondary-dark: #0f172a
  193. --secondary-light: #334155
  194. --accent-color: #22d3ee
  195. --accent-dark: #06b6d4
  196. --accent-light: #67e8f9
  197. // Нейтральные цвета для темной темы
  198. --neutral-50: #0f172a
  199. --neutral-100: #1e293b
  200. --neutral-200: #334155
  201. --neutral-300: #475569
  202. --neutral-400: #64748b
  203. --neutral-500: #94a3b8
  204. --neutral-600: #cbd5e1
  205. --neutral-700: #e2e8f0
  206. --neutral-800: #f1f5f9
  207. --neutral-900: #f8fafc
  208. // Цвета текста для темной темы
  209. --text-primary: #f8fafc
  210. --text-secondary: #e2e8f0
  211. --text-muted: #94a3b8
  212. // Цвета фона для темной темы
  213. --bg-primary: #0f172a
  214. --bg-secondary: #1e293b
  215. --bg-card: #1e293b
  216. --bg-overlay: rgba(15, 23, 42, 0.8)
  217. // Градиенты для темной темы
  218. --gradient-primary: linear-gradient(135deg, var(--primary-dark) 0%, var(--primary-color) 50%, var(--accent-color) 100%)
  219. --gradient-dark: linear-gradient(135deg, var(--secondary-dark) 0%, var(--secondary-color) 100%)
  220. // Типографическая система
  221. --font-family-sans: 'Inter', 'Segoe UI', system-ui, sans-serif
  222. --font-family-serif: 'Georgia', 'Times New Roman', serif
  223. --text-xs: 0.75rem
  224. --text-sm: 0.875rem
  225. --text-base: 1rem
  226. --text-lg: 1.125rem
  227. --text-xl: 1.25rem
  228. --text-2xl: 1.5rem
  229. --text-3xl: 1.875rem
  230. --text-4xl: 2.25rem
  231. --text-5xl: 3rem
  232. --font-light: 300
  233. --font-normal: 400
  234. --font-medium: 500
  235. --font-semibold: 600
  236. --font-bold: 700
  237. // Spacing system
  238. --space-1: 0.25rem
  239. --space-2: 0.5rem
  240. --space-3: 0.75rem
  241. --space-4: 1rem
  242. --space-5: 1.25rem
  243. --space-6: 1.5rem
  244. --space-8: 2rem
  245. --space-10: 2.5rem
  246. --space-12: 3rem
  247. --space-16: 4rem
  248. --space-20: 5rem
  249. // Тени и эффекты для темной темы
  250. --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.5)
  251. --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.6), 0 2px 4px -1px rgba(0, 0, 0, 0.4)
  252. --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.7), 0 4px 6px -2px rgba(0, 0, 0, 0.5)
  253. --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.8), 0 10px 10px -5px rgba(0, 0, 0, 0.6)
  254. // Анимации
  255. --transition-fast: 0.15s ease-in-out
  256. --transition-normal: 0.3s ease-in-out
  257. --transition-slow: 0.5s ease-in-out
  258. // Breakpoints
  259. --breakpoint-sm: 640px
  260. --breakpoint-md: 768px
  261. --breakpoint-lg: 1024px
  262. --breakpoint-xl: 1280px
  263. --breakpoint-2xl: 1536px
  264. // Светлая тема
  265. [data-theme="light"]
  266. --primary-color: #e11d48
  267. --primary-dark: #be123c
  268. --primary-light: #fb7185
  269. --secondary-color: #f8fafc
  270. --secondary-dark: #f1f5f9
  271. --secondary-light: #ffffff
  272. --accent-color: #06b6d4
  273. --accent-dark: #0891b2
  274. --accent-light: #22d3ee
  275. --neutral-50: #f8fafc
  276. --neutral-100: #f1f5f9
  277. --neutral-200: #e2e8f0
  278. --neutral-300: #cbd5e1
  279. --neutral-400: #94a3b8
  280. --neutral-500: #64748b
  281. --neutral-600: #475569
  282. --neutral-700: #334155
  283. --neutral-800: #1e293b
  284. --neutral-900: #0f172a
  285. --text-primary: #0f172a
  286. --text-secondary: #334155
  287. --text-muted: #64748b
  288. --bg-primary: #ffffff
  289. --bg-secondary: #f8fafc
  290. --bg-card: #ffffff
  291. --bg-overlay: rgba(255, 255, 255, 0.8)
  292. --gradient-primary: linear-gradient(135deg, var(--primary-dark) 0%, var(--primary-color) 50%, var(--accent-color) 100%)
  293. --gradient-dark: linear-gradient(135deg, var(--neutral-100) 0%, var(--neutral-50) 100%)
  294. --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05)
  295. --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)
  296. --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)
  297. --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)
  298. // Утилитарные классы для кастомных свойств
  299. .bg-primary
  300. background-color: var(--primary-color)
  301. .text-primary
  302. color: var(--primary-color)
  303. .border-primary
  304. border-color: var(--primary-color)
  305. .bg-accent
  306. background-color: var(--accent-color)
  307. .text-accent
  308. color: var(--accent-color)
  309. .bg-neutral
  310. background-color: var(--neutral-500)
  311. .text-neutral
  312. color: var(--neutral-500)
  313. .bg-dark
  314. background-color: var(--bg-primary)
  315. .text-dark
  316. color: var(--text-primary)
  317. .bg-card
  318. background-color: var(--bg-card)
  319. .text-card
  320. color: var(--text-primary)
  321. // Анимации
  322. .transition-fast
  323. transition: var(--transition-fast)
  324. .transition-normal
  325. transition: var(--transition-normal)
  326. .transition-slow
  327. transition: var(--transition-slow)
  328. // Тени
  329. .shadow-custom-sm
  330. box-shadow: var(--shadow-sm)
  331. .shadow-custom-md
  332. box-shadow: var(--shadow-md)
  333. .shadow-custom-lg
  334. box-shadow: var(--shadow-lg)
  335. .shadow-custom-xl
  336. box-shadow: var(--shadow-xl)
  337. // Добавляем дополнительные утилитарные классы для лучшей поддержки компонентов
  338. .card-primary
  339. background-color: var(--bg-card)
  340. border: 1px solid var(--neutral-300)
  341. border-radius: 8px
  342. box-shadow: var(--shadow-sm)
  343. transition: all var(--transition-normal)
  344. .card-primary:hover
  345. border-color: var(--primary-color)
  346. box-shadow: var(--shadow-md)
  347. .text-icon
  348. filter: brightness(0) invert(0)
  349. transition: filter var(--transition-fast)
  350. [data-theme="dark"] .text-icon
  351. filter: brightness(0) invert(1)
  352. .icon-primary
  353. filter: brightness(0) invert(0)
  354. transition: filter var(--transition-fast)
  355. [data-theme="dark"] .icon-primary
  356. filter: brightness(0) invert(1)
  357. // Утилиты для контрастного текста
  358. .text-contrast-high
  359. color: var(--text-primary)
  360. .text-contrast-medium
  361. color: var(--text-secondary)
  362. .text-contrast-low
  363. color: var(--text-muted)
  364. // Утилиты для фонов
  365. .bg-surface
  366. background-color: var(--bg-card)
  367. .bg-surface-alt
  368. background-color: var(--bg-secondary)
  369. ```
  370. ## CURRENT WORK FILES
  371. No current work files specified in WORKFILES
  372. ## OTHER FILES (brief overview):
  373. // .gitignore (Unknown) - 29 chars
  374. // app/app.coffee (CoffeeScript) - 3584 chars
  375. // app/app.pug (Pug Template) - 699 chars
  376. // app/app.styl (Stylus) - 1013 chars
  377. // app/layout.pug (Pug Template) - 324 chars
  378. // app/pages/Home.coffee (CoffeeScript) - 697 chars
  379. // app/pages/Home.pug (Pug Template) - 845 chars
  380. // app/pages/Home.styl (Stylus) - 281 chars
  381. // app/shared/AppLink.coffee (CoffeeScript) - 633 chars
  382. // app/shared/AppLink.pug (Pug Template) - 214 chars
  383. // app/shared/AppLink.styl (Stylus) - 1264 chars
  384. // app/shared/HeroSection.coffee (CoffeeScript) - 311 chars
  385. // app/shared/HeroSection.pug (Pug Template) - 574 chars
  386. // app/shared/HeroSection.styl (Stylus) - 125 chars
  387. // app/shared/ImageGallery.coffee (CoffeeScript) - 367 chars
  388. // app/shared/ImageGallery.pug (Pug Template) - 414 chars
  389. // app/shared/ImageGallery.styl (Stylus) - 324 chars
  390. // app/utils/AppDB.coffee (CoffeeScript) - 4684 chars
  391. // doc.coffee (CoffeeScript) - 1285 chars
  392. // lzma.coffee (CoffeeScript) - 1010 chars
  393. // pug/base.pug (Pug Template) - 504 chars
  394. // pug/bem.pug (Pug Template) - 1035 chars