diff --git a/AGE_SYSTEM.md b/AGE_SYSTEM.md deleted file mode 100644 index 84fb726..0000000 --- a/AGE_SYSTEM.md +++ /dev/null @@ -1,292 +0,0 @@ -# πŸŽ‚ БистСма Ρ€Π°Π±ΠΎΡ‚Ρ‹ с возрастом WitLab Funnel - -## ОписаниС - -Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ систСма автоматичСского расчСта возраста ΠΈ опрСдСлСния ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ ΠΈΠ· Π΄Π°Ρ‚Ρ‹ роТдСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ с систСмой вариативности для создания возрастных условий Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ. - -## ВозмоТности - -### 🎯 **АвтоматичСский расчСт ΠΈΠ· Π΄Π°Ρ‚Ρ‹:** -- **Π’ΠΎΡ‡Π½Ρ‹ΠΉ возраст** (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: 25, 30, 45 Π»Π΅Ρ‚) -- **ВозрастныС Π³Ρ€ΡƒΠΏΠΏΡ‹** (18-21, 22-25, 26-30, 31-35, 36-40, 41-45, 46-50, 51-60, 60+) -- **ПоколСния** (Generation Z, Millennials, Generation X, Boomers, Silent Generation) -- **ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ** со Π·Π½Π°ΠΊΠ°ΠΌΠΈ Π·ΠΎΠ΄ΠΈΠ°ΠΊΠ° - -### 🎨 **ΠšΡ€Π°ΡΠΈΠ²Ρ‹ΠΉ UI для Π°Π΄ΠΌΠΈΠ½ΠΊΠΈ:** -- Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€ возрастных Π³Ρ€ΡƒΠΏΠΏ с описаниями -- Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ с ΠΈΠΊΠΎΠ½ΠΊΠ°ΠΌΠΈ -- Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ кастомныС Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ -- Π–ΠΈΠ²ΠΎΠ΅ ΠΏΡ€Π΅Π²ΡŒΡŽ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… условий - -## ВСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ - -### πŸ“Š **ВозрастныС Π³Ρ€ΡƒΠΏΠΏΡ‹:** -```typescript -export const AGE_GROUPS = [ - { id: "18-21", name: "18-21 Π³ΠΎΠ΄", min: 18, max: 21, description: "БтудСнчСский возраст" }, - { id: "22-25", name: "22-25 Π»Π΅Ρ‚", min: 22, max: 25, description: "ΠœΠΎΠ»ΠΎΠ΄Ρ‹Π΅ профСссионалы" }, - { id: "26-30", name: "26-30 Π»Π΅Ρ‚", min: 26, max: 30, description: "ΠšΠ°Ρ€ΡŒΠ΅Ρ€Π½Ρ‹ΠΉ рост" }, - { id: "31-35", name: "31-35 Π»Π΅Ρ‚", min: 31, max: 35, description: "Π‘Ρ‚Π°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ личности" }, - { id: "36-40", name: "36-40 Π»Π΅Ρ‚", min: 36, max: 40, description: "Π—Ρ€Π΅Π»ΠΎΡΡ‚ΡŒ ΠΈ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ" }, - { id: "41-45", name: "41-45 Π»Π΅Ρ‚", min: 41, max: 45, description: "Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ возраст" }, - { id: "46-50", name: "46-50 Π»Π΅Ρ‚", min: 46, max: 50, description: "Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚" }, - { id: "51-60", name: "51-60 Π»Π΅Ρ‚", min: 51, max: 60, description: "Π—Ρ€Π΅Π»Ρ‹Π΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ" }, - { id: "60+", name: "60+ Π»Π΅Ρ‚", min: 60, max: 120, description: "Π—ΠΎΠ»ΠΎΡ‚ΠΎΠΉ возраст" }, -] as const; -``` - -### πŸš€ **ПоколСния:** -```typescript -export const GENERATION_GROUPS = [ - { id: "gen-z", name: "ПоколСниС Z", minYear: 1997, maxYear: 2012, description: "Π¦ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ Π°Π±ΠΎΡ€ΠΈΠ³Π΅Π½Ρ‹" }, - { id: "millennials", name: "ΠœΠΈΠ»Π»Π΅Π½ΠΈΠ°Π»Ρ‹", minYear: 1981, maxYear: 1996, description: "ПоколСниС ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°" }, - { id: "gen-x", name: "ПоколСниС X", minYear: 1965, maxYear: 1980, description: "ПоколСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½" }, - { id: "boomers", name: "Π‘ΡƒΠΌΠ΅Ρ€Ρ‹", minYear: 1946, maxYear: 1964, description: "ПослСвоСнноС ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅" }, - { id: "silent", name: "ΠœΠΎΠ»Ρ‡Π°Π»ΠΈΠ²ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅", minYear: 1928, maxYear: 1945, description: "Π”ΠΎΠ²ΠΎΠ΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅" }, -] as const; -``` - -### ⚑ **ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:** - -#### 1. **РасчСт возраста:** -```typescript -// Из Π΄Π°Ρ‚Ρ‹ роТдСния -calculateAge(new Date(1987, 3, 8)); // β†’ 36 - -// Из массива [month, day, year] -calculateAgeFromArray([4, 8, 1987]); // β†’ 36 -``` - -#### 2. **ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹:** -```typescript -getAgeGroup(25); // β†’ { id: "22-25", name: "22-25 Π»Π΅Ρ‚", ... } -getGeneration(1987); // β†’ { id: "millennials", name: "ΠœΠΈΠ»Π»Π΅Π½ΠΈΠ°Π»Ρ‹", ... } -``` - -#### 3. **Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ:** -```typescript -createAgeValue(25); // β†’ "22-25" -createGenerationValue(1987); // β†’ "millennials" -``` - -## ИспользованиС Π² вариативности - -### πŸ“… **Date экраны автоматичСски:** -Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ Π΄Π°Ρ‚Ρƒ роТдСния Π² date экранС, систСма автоматичСски добавляСт ΠΊ ΠΎΡ‚Π²Π΅Ρ‚Π°ΠΌ: - -**ΠŸΡ€ΠΈΠΌΠ΅Ρ€:** Π”Π°Ρ‚Π° роТдСния 8 апрСля 1987 Π³ΠΎΠ΄Π° `[4, 8, 1987]` - -**АвтоматичСски добавляСтся Π² ΠΎΡ‚Π²Π΅Ρ‚Ρ‹:** -```typescript -[ - "4", "8", "1987", // Π˜ΡΡ…ΠΎΠ΄Π½Π°Ρ Π΄Π°Ρ‚Π° - "36-40", // Возрастная Π³Ρ€ΡƒΠΏΠΏΠ° - "age-36", // Π’ΠΎΡ‡Π½Ρ‹ΠΉ возраст - "millennials", // ПоколСниС - "aries" // Π—Π½Π°ΠΊ Π·ΠΎΠ΄ΠΈΠ°ΠΊΠ° (ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ систСмы) -] -``` - -### 🎯 **Условия Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ:** - -#### **По возрастным Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌ:** -```json -{ - "conditions": [{ - "screenId": "birth-date", - "conditionType": "values", - "operator": "includesAny", - "values": ["22-25", "26-30"] - }] -} -``` - -#### **По поколСниям:** -```json -{ - "conditions": [{ - "screenId": "birth-date", - "conditionType": "values", - "operator": "equals", - "values": ["millennials"] - }] -} -``` - -#### **ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ условия:** -```json -{ - "conditions": [ - { - "screenId": "birth-date", - "conditionType": "values", - "operator": "includesAny", - "values": ["gen-z", "millennials"] - }, - { - "screenId": "birth-date", - "conditionType": "values", - "operator": "includesAny", - "values": ["aries", "leo", "sagittarius"] - } - ] -} -``` - -## UI ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ - -### 🎨 **AgeSelector для Π°Π΄ΠΌΠΈΠ½ΠΊΠΈ:** -```tsx - console.log('Selected:', value)} - onAddCustomValue={(value) => console.log('Added:', value)} -/> -``` - -**ВозмоТности:** -- πŸŽ‚ Π‘Π΅Ρ‚ΠΊΠ° возрастных Π³Ρ€ΡƒΠΏΠΏ с описаниями -- πŸš€ Бписок ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ с ΠΈΠΊΠΎΠ½ΠΊΠ°ΠΌΠΈ -- 🎯 ПолС для кастомных Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² (25-35, 40+) -- πŸ“‹ ΠŸΡ€Π΅Π²ΡŒΡŽ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ - -### πŸ“Š **Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² ScreenVariantsConfig:** -Для date экранов автоматичСски ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ: -1. **AgeSelector** - для возрастных условий -2. **ZodiacSelector** - для Π·Π½Π°ΠΊΠΎΠ² Π·ΠΎΠ΄ΠΈΠ°ΠΊΠ° -3. **Умная Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ** - ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сСлСктор ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свои значСния - -## ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования - -### πŸ’– **РомантичСскиС прСдпочтСния ΠΏΠΎ возрасту:** -```json -{ - "id": "young-romance", - "variants": [{ - "conditions": [{ - "screenId": "birth-date", - "conditionType": "values", - "operator": "includesAny", - "values": ["18-21", "22-25"] - }], - "overrides": { - "title": { "text": "Найти **ΠΌΠΎΠ»ΠΎΠ΄ΡƒΡŽ любовь**!" }, - "description": { "text": "Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для **ΠΌΠΎΠ»ΠΎΠ΄Ρ‹Ρ… сСрдСц** - Π½Π°ΠΉΠ΄Π΅ΠΌ Ρ‚Π²ΠΎΡŽ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ΠΊΡƒ срСди свСрстников!" } - } - }] -} -``` - -### πŸš€ **ΠšΠ°Ρ€ΡŒΠ΅Ρ€Π½Ρ‹Π΅ Π°ΠΌΠ±ΠΈΡ†ΠΈΠΈ ΠΏΠΎ поколСниям:** -```json -{ - "id": "career-focus", - "variants": [{ - "conditions": [{ - "screenId": "birth-date", - "conditionType": "values", - "operator": "equals", - "values": ["millennials"] - }], - "overrides": { - "title": { "text": "ΠšΠ°Ρ€ΡŒΠ΅Ρ€Π° + **ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ**" }, - "description": { "text": "Для **ΠΌΠΈΠ»Π»Π΅Π½ΠΈΠ°Π»ΠΎΠ²** - Π½Π°ΠΉΠ΄Π΅ΠΌ ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΡ‚ Ρ‚Π²ΠΎΠΈ Π°ΠΌΠ±ΠΈΡ†ΠΈΠΈ!" } - } - }] -} -``` - -### 🎯 **Π—Ρ€Π΅Π»Ρ‹Π΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ:** -```json -{ - "id": "mature-love", - "variants": [{ - "conditions": [{ - "screenId": "birth-date", - "conditionType": "values", - "operator": "includesAny", - "values": ["46-50", "51-60", "60+"] - }], - "overrides": { - "title": { "text": "**ЗрСлая любовь**" }, - "description": { "text": "Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π·Π½Π°Π΅Ρ‚ Ρ†Π΅Π½Ρƒ **настоящим чувствам** ΠΈ **ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΌΡƒ ΠΎΠΏΡ‹Ρ‚Ρƒ**" } - } - }] -} -``` - -## АрхитСктура - -### πŸ“ **Ѐайловая структура:** -``` -src/lib/age-utils.ts # ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ возраста -src/components/admin/builder/ - β”œβ”€β”€ AgeSelector.tsx # UI сСлСктор для Π°Π΄ΠΌΠΈΠ½ΠΊΠΈ - β”œβ”€β”€ AgeDemo.tsx # Π”Π΅ΠΌΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ - └── ScreenVariantsConfig.tsx # Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² Π²Π°Ρ€ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ -src/lib/funnel/navigation.ts # Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡŽ -``` - -### πŸ”§ **Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² систСму:** - -#### **1. АвтоматичСский расчСт (navigation.ts):** -```typescript -// ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΈΠ· date экрана автоматичСски добавляСм: -const age = calculateAgeFromArray(dateArray); -const ageGroup = createAgeValue(age); -const generation = createGenerationValue(year); -const zodiac = getZodiacSign(month, day); - -enhancedAnswers.push(ageGroup, `age-${age}`, generation, zodiac); -``` - -#### **2. UI сСлСкция (AgeSelector.tsx):** -```typescript -// ΠšΡ€Π°ΡΠΈΠ²Ρ‹Π΅ ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠΈ для Π²Ρ‹Π±ΠΎΡ€Π° условий -{AGE_GROUPS.map((group) => ( - -))} -``` - -#### **3. Валидация Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ²:** -```typescript -// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° попадания возраста Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ -isAgeInRange(25, "22-25"); // β†’ true -isAgeInRange(30, "18-21"); // β†’ false -``` - -## ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° - -### βœ… **Автоматизация:** -- ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π°Ρ‚Ρƒ роТдСния -- БистСма автоматичСски рассчитываСт всС значСния -- НС Π½ΡƒΠΆΠ½ΠΎ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ возраст ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ - -### βœ… **Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ:** -- ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π»ΡŽΠ±Ρ‹Ρ… возрастных Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² -- ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹Π΅ значСния (25-35, 40+) -- ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ условиями - -### βœ… **UX Π΄Ρ€ΡƒΠΆΠ΅Π»ΡŽΠ±Π½ΠΎΡΡ‚ΡŒ:** -- ΠŸΠΎΠ½ΡΡ‚Π½Ρ‹Π΅ названия Π³Ρ€ΡƒΠΏΠΏ -- Описания для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ -- Иконки для ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ -- ΠŸΡ€Π΅Π²ΡŒΡŽ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… условий - -### βœ… **ΠœΠ°Ρ€ΠΊΠ΅Ρ‚ΠΈΠ½Π³ΠΎΠ²Π°Ρ сСгмСнтация:** -- Π“ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ возрастныС Π³Ρ€ΡƒΠΏΠΏΡ‹ для Ρ‚Π°Ρ€Π³Π΅Ρ‚ΠΈΠ½Π³Π° -- ΠŸΠΎΠΊΠΎΠ»Π΅Π½Ρ‡Π΅ΡΠΊΠ°Ρ сСгмСнтация -- ΠŸΡΠΈΡ…ΠΎΠ»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Ρ€Π΅Ρ‚Ρ‹ ΠΏΠΎ возрасту - -## Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ - -- βœ… **React 18+** -- βœ… **TypeScript 5+** -- βœ… **Next.js 14+** -- βœ… **Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ систСма Π·ΠΎΠ΄ΠΈΠ°ΠΊΠ°** -- βœ… **БистСма вариативности** -- βœ… **ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ** с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π²ΠΎΡ€ΠΎΠ½ΠΊΠ°ΠΌΠΈ - -**πŸ’‘ Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ условия Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ Π½Π° основС возраста ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, автоматичСски рассчитанного ΠΈΠ· Π΄Π°Ρ‚Ρ‹ роТдСния!** diff --git a/FIXES-SUMMARY.md b/FIXES-SUMMARY.md deleted file mode 100644 index f99b7f4..0000000 --- a/FIXES-SUMMARY.md +++ /dev/null @@ -1,101 +0,0 @@ -# πŸ”§ Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π°Π΄ΠΌΠΈΠ½ΠΊΠΈ - -## βœ… Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹: - -### 1. **🌐 Π’ΠΎΡ€ΠΎΠ½ΠΊΠΈ Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π»ΠΈΡΡŒ для прохоТдСния** -**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°:** Π‘Π΅Ρ€Π²Π΅Ρ€ пытался Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ»Ρ‹ JSON, Π½ΠΎ Π½Π΅ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. - -**Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅:** -- ОбновлСн `/src/app/[funnelId]/[screenId]/page.tsx` -- Π”ΠΎΠ±Π°Π²Π»Π΅Π½Π° функция `loadFunnelFromDatabase()` -- Π’Π΅ΠΏΠ΅Ρ€ΡŒ сначала Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈΠ· MongoDB, ΠΏΠΎΡ‚ΠΎΠΌ fallback Π½Π° JSON Ρ„Π°ΠΉΠ»Ρ‹ -- ИзмСнСно `dynamic = "force-dynamic"` для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… - -**Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:** βœ… Π’ΠΎΡ€ΠΎΠ½ΠΊΠΈ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ для прохоТдСния - -### 2. **πŸ“ Π£Π½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ сайдбара ΠΈ прСдпросмотра** -**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°:** Π Π°Π·Π½Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΏΠ°Π½Π΅Π»Π΅ΠΉ создавали Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Π½Π΅ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ. - -**Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΌΠ°ΠΊΠ΅Ρ‚Π΅ Π±ΠΈΠ»Π΄Π΅Ρ€Π° (`/src/app/admin/builder/[id]/page.tsx`):** -- **Π‘Π°ΠΉΠ΄Π±Π°Ρ€:** `w-[360px]` (фиксированный) -- **ΠŸΡ€Π΅Π΄ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€:** `w-[360px]` -- **Оба:** `shrink-0` - Π½Π΅ ΡΠΆΠΈΠΌΠ°ΡŽΡ‚ΡΡ - -**Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:** βœ… ΠžΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π±ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΏΠ°Π½Π΅Π»Π΅ΠΉ β€” 360px - -### 3. **🎯 ΠŸΡ€Π΅Π΄ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ большС Π½Π΅ сТимаСтся** -**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°:** ΠŸΡ€Π΅Π΄ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ ΠΌΠΎΠ³ ΡΠΆΠΈΠΌΠ°Ρ‚ΡŒΡΡ ΠΈ Ρ‚Π΅Ρ€ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΈ. - -**Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅:** -- Π”ΠΎΠ±Π°Π²Π»Π΅Π½ `shrink-0` для прСдпросмотра -- Ѐиксированная ΡˆΠΈΡ€ΠΈΠ½Π° `w-[360px]` -- Canvas остаСтся flex-1 ΠΈ адаптируСтся ΠΊ доступному пространству - -**Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:** βœ… ΠŸΡ€Π΅Π΄ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ сохраняСт Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΊΠ°ΠΊ Π·Π°Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ - -### 4. **βͺ Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° рабочая систСма Undo/Redo** -**ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°:** Π‘Ρ‚Π°Ρ€Ρ‹Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π±Ρ‹Π»ΠΈ Π·Π°Π³Π»ΡƒΡˆΠΊΠ°ΠΌΠΈ ΠΈ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ. - -**Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅:** -- Π”ΠΎΠ±Π°Π²Π»Π΅Π½ `BuilderUndoRedoProvider` Π½Π° Π±Π°Π·Π΅ ΡΠ½Π΅ΠΏΡˆΠΎΡ‚ΠΎΠ² состояния (`/src/lib/admin/builder/useSimpleUndoRedo.ts`) -- ГорячиС клавиши Ctrl/Cmd+Z, Ctrl/Cmd+Shift+Z ΠΈ Ctrl/Cmd+Y -- АвтоматичСскоС сохранСниС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ состояния - -**Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:** πŸ”§ Кнопки ΠΈ горячиС клавиши Undo/Redo Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ историСй ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ - -## πŸš€ Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ статус: - -### βœ… **ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π³ΠΎΡ‚ΠΎΠ²ΠΎ:** -1. **Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…** - всС Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ ΠΈΠ· MongoDB -2. **Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΏΠ°Π½Π΅Π»Π΅ΠΉ** - ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ зафиксированы (360px) -3. **ΠŸΡ€Π΅Π΄ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€** - Π½Π΅ сТимаСтся, сохраняСт ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΈ -4. **Π‘Π±ΠΎΡ€ΠΊΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°** - ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ собираСтся Π±Π΅Π· ошибок -5. **Undo/Redo систСма** - ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с горячими клавишами - -### ✨ **Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ:** -- **Server-side Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°** ΠΈΠ· MongoDB вмСсто HTTP запросов -- **АвтоматичСскоС сохранСниС** истории ΠΏΡ€ΠΈ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Ρ… измСнСниях -- **Keyboard shortcuts** - Ctrl+Z, Ctrl+Y, Ctrl+Shift+Z Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ - -## πŸ“‹ Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Undo/Redo: - -### 1. **ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΊ дСйствиям Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°:** -```typescript -// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° -const undoRedo = useBuilderUndoRedo(); - -const handleUpdateScreen = (screenId: string, property: string, newValue: any) => { - const oldValue = getCurrentValue(screenId, property); - undoRedo.updateScreenProperty(screenId, property, newValue, oldValue); -}; -``` - -### 2. **Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для:** -- ИзмСнСниС тСкста экранов -- Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅/ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π² списках -- ИзмСнСниС Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ экранами -- Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅/ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ экранов -- ИзмСнСниС настроСк Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ - -### 3. **Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…:** -- Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ baseline Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΡ€ΠΈ save/publish -- ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° истории ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π½ΠΎΠ²ΠΎΠΉ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ - -## 🎯 Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ: - -### **Command Pattern over Memento:** -- Granular ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ вмСсто снимков состояния -- ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° side-effects ΠΈ API calls -- Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с collaborative editing - -### **Time-based Linear History:** -- ИзбСганиС "anxiety" ΠΎΡ‚ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π²Π΅Ρ‚ΠΎΠΊ истории -- Intuitive UX Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ счСтчик -- Как Π² Emacs - всС измСнСния ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ - -### **Session-scoped с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ:** -- ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ сСссии рСдактирования -- Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π° user-scope -- Cleanup ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ сСссии - -**АрхитСктура Π³ΠΎΡ‚ΠΎΠ²Π° для production использования! πŸš€** diff --git a/IMPORT-GUIDE.md b/IMPORT-GUIDE.md deleted file mode 100644 index 30b189a..0000000 --- a/IMPORT-GUIDE.md +++ /dev/null @@ -1,201 +0,0 @@ -# πŸ“₯ Π˜ΠΌΠΏΠΎΡ€Ρ‚ Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… - -Π­Ρ‚ΠΎΡ‚ скрипт позволяСт ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ `public/funnels/` Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… MongoDB. - -## πŸš€ Быстрый старт - -```bash -# 1. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ MongoDB Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΈ настроСн .env.local -npm run import:funnels -``` - -## πŸ“‹ ВрСбования - -### 1. MongoDB ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ -Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ Π² `.env.local` ΡƒΠΊΠ°Π·Π°Π½ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ `MONGODB_URI`: - -```bash -# .env.local -MONGODB_URI=mongodb://localhost:27017/witlab-funnel -# ΠΈΠ»ΠΈ для MongoDB Atlas: -# MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/witlab-funnel -``` - -### 2. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Ρ„Π°ΠΉΠ»ΠΎΠ² -Π‘ΠΊΡ€ΠΈΠΏΡ‚ ΠΈΡ‰Π΅Ρ‚ JSON Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΏΠ°ΠΏΠΊΠ΅ `public/funnels/`. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π½ΡƒΡŽ структуру Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ: - -```json -{ - "meta": { - "id": "unique-funnel-id", - "title": "НазваниС Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ", - "description": "ОписаниС Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ", - "firstScreenId": "screen-1" - }, - "screens": [ - { - "id": "screen-1", - "template": "info", - "title": { "text": "Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ" } - } - ] -} -``` - -## πŸ“Š Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ скрипт - -### βœ… ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ ΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ -- ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ MongoDB -- Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ JSON Ρ„Π°ΠΉΠ»ΠΎΠ² -- НаличиС ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ (`meta.id`, `screens`) - -### πŸ“¦ Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ -- Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ записи Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ `funnels` -- Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ (Π½Π°Π·Π²Π°Π½ΠΈΠ΅, описаниС) -- УстанавливаСт статус `published` -- ДобавляСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ - -### πŸ” Π˜Π·Π±Π΅Π³Π°Π΅Ρ‚ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² -- ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚ сущСствованиС Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ ΠΏΠΎ `meta.id` -- ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅Ρ‚ ΡƒΠΆΠ΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ -- ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚ - -## πŸ“ˆ Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ - -ПослС запуска Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅: - -``` -πŸš€ Starting funnel import process... - -βœ… Connected to MongoDB -πŸ“ Found 12 funnel files in public/funnels/ - -πŸ“₯ Starting import of 12 funnels... - -[1/12] Processing funnel-test.json... - βœ… Imported as "Funnel Test" (ID: funnel-test) - -[2/12] Processing ru-career-accelerator.json... - ⏭️ Skipped - already exists (ID: ru-career-accelerator) - -... - -πŸ“Š Import Summary: -================== -βœ… Successfully imported: 10 -⏭️ Already existed: 2 -⚠️ Skipped (invalid): 0 -❌ Errors: 0 -πŸ“ Total processed: 12 - -πŸ“‹ Imported Funnels: - β€’ Funnel Test (funnel-test) - funnel-test.json - β€’ Career Accelerator (ru-career-accelerator) - ru-career-accelerator.json - ... - -πŸŽ‰ Import process completed! -``` - -## 🎯 ГСнСрация ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… - -Π‘ΠΊΡ€ΠΈΠΏΡ‚ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ названия ΠΈ описания: - -### НазваниС Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -1. **Из `meta.title`** (Ссли Π΅ΡΡ‚ΡŒ) -2. **Из `meta.id`** ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ Π²ΠΈΠ΄ - - `funnel-test` β†’ `Funnel Test` - - `ru-career-accelerator` β†’ `Ru Career Accelerator` -3. **По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ**: `Imported Funnel` - -### ОписаниС Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -1. **Из `meta.description`** (Ссли Π΅ΡΡ‚ΡŒ) -2. **АвтогСнСрация** Π½Π° основС: - - ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²Π° экранов: "Π’ΠΎΡ€ΠΎΠ½ΠΊΠ° с 5 экранами" - - Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… шаблонов: "Π’ΠΈΠΏΡ‹: info, form, list" - - Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠ°: "Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΈΠ· JSON Ρ„Π°ΠΉΠ»Π°" - -## πŸ—ƒοΈ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… - -КаТдая импортированная Π²ΠΎΡ€ΠΎΠ½ΠΊΠ° сохраняСтся ΠΊΠ°ΠΊ: - -```json -{ - "_id": "ObjectId", - "funnelData": { /* ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ структура JSON */ }, - "name": "Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅", - "description": "Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ описаниС", - "status": "published", - "version": 1, - "createdBy": "import-script", - "usage": { "totalViews": 0, "totalCompletions": 0 }, - "createdAt": "2025-01-27T02:13:24.000Z", - "updatedAt": "2025-01-27T02:13:24.000Z", - "publishedAt": "2025-01-27T02:13:24.000Z" -} -``` - -## πŸ”§ УстранСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ - -### Ошибка ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ MongoDB -``` -❌ Failed to connect to MongoDB: connect ECONNREFUSED 127.0.0.1:27017 -``` -**РСшСниС**: ЗапуститС MongoDB ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ `MONGODB_URI` - -### Π€Π°ΠΉΠ»Ρ‹ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ -``` -πŸ“­ No funnel files found to import. -``` -**РСшСниС**: Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ JSON Ρ„Π°ΠΉΠ»Ρ‹ находятся Π² `public/funnels/` - -### Π’Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ошибки -``` -⚠️ Validation warnings for example.json: Missing meta.id -``` -**РСшСниС**: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ структуру JSON Ρ„Π°ΠΉΠ»Π° - -### Π”ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹ Π² Π±Π°Π·Π΅ -``` -⏭️ Skipped - already exists (ID: funnel-test) -``` -**Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ**: Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π½Π΅ пСрСзаписываСт ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ - -## πŸ“± ПослС ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° - -### Π“Π΄Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -1. **Админка**: `http://localhost:3000/admin` -2. **ΠŸΡ€ΡΠΌΠΎΠΉ доступ**: `http://localhost:3000/{funnel-id}` -3. **Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅**: `/admin/builder/{database-id}` - -### Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ -- βœ… Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±ΠΈΠ»Π΄Π΅Ρ€Π΅ -- βœ… Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΈ -- βœ… ΠŸΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ статистику -- βœ… Π­ΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² JSON -- βœ… ΠŸΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ/Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ - -### Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ -- βœ… ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ JSON Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ -- βœ… Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ -- βœ… Полная обратная ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ - -## πŸ”„ ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ запуск - -Π‘ΠΊΡ€ΠΈΠΏΡ‚ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ нСсколько Ρ€Π°Π·: -- **БСзопасно**: Π½Π΅ создаСт Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹ -- **Π£ΠΌΠ½ΠΎ**: ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ -- **Быстро**: пропускаСт ΡƒΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ - -## πŸ“ Π›ΠΎΠ³ΠΈ ΠΈ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ - -Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ: -- πŸ“ ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² -- πŸ”„ ΠŸΡ€ΠΎΠ³Ρ€Π΅ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° -- βœ… Π£ΡΠΏΠ΅ΡˆΠ½Ρ‹Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρ‹ с дСталями -- ⚠️ ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΡ ΠΈ пропуски -- ❌ Ошибки с объяснСниями -- πŸ“Š Π˜Ρ‚ΠΎΠ³ΠΎΠ²Π°Ρ сводка - ---- - -**πŸ’‘ Π‘ΠΎΠ²Π΅Ρ‚**: ЗапуститС скрипт послС настройки Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ быстро ΠΌΠΈΠ³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ Π² Π½ΠΎΠ²ΡƒΡŽ Π°Π΄ΠΌΠΈΠ½ΠΊΡƒ! diff --git a/MARKUP.md b/MARKUP.md deleted file mode 100644 index cf01e25..0000000 --- a/MARKUP.md +++ /dev/null @@ -1,180 +0,0 @@ -# 🎨 БистСма Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ тСкста WitLab Funnel - -## ОписаниС - -Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ систСма Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ позволяСт Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ части тСкста **ΠΆΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ** Π² Π»ΡŽΠ±Ρ‹Ρ… тСкстовых полях Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ. БистСма автоматичСски ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΡƒ ΠΈ примСняСт стили. - -## Бинтаксис - -### **Π–ΠΈΡ€Π½Ρ‹ΠΉ тСкст** -``` -**тСкст** - выдСляСт тСкст ΠΆΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ -``` - -### ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования: - -#### πŸ“ **Π’ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ…:** -``` -"Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π² **WitLab**!" -``` -Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: "Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π² **WitLab**!" - -#### πŸ’° **Π’ прСдлоТСниях скидок:** -``` -"**50%** скидка Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСгодня!" -``` -Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: "**50%** скидка Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСгодня!" - -#### πŸ’– **Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… Π°Π½Π°Π»ΠΈΠ·Π°:** -``` -"Π’Π°Ρˆ **ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€** Π½Π°ΠΉΠ΄Π΅Π½ Π½Π° основС Π°Π½Π°Π»ΠΈΠ·Π° Π²Π°ΡˆΠΈΡ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²" -``` -Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: "Π’Π°Ρˆ **ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€** Π½Π°ΠΉΠ΄Π΅Π½ Π½Π° основС Π°Π½Π°Π»ΠΈΠ·Π° Π²Π°ΡˆΠΈΡ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²" - -#### πŸ‘€ **Π‘ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ:** -``` -"ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΠ΅ΠΌ, **Анна**! Π’Π°Ρˆ ΠΏΠΎΡ€Ρ‚Ρ€Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²." -``` -Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: "ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΠ΅ΠΌ, **Анна**! Π’Π°Ρˆ ΠΏΠΎΡ€Ρ‚Ρ€Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²." - -## Π“Π΄Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ - -### βœ… АвтоматичСски поддСрТиваСтся: -- **ВсС тСкстовыС поля** Π² экранах Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ (title, subtitle, description) -- **Info экраны** - описания -- **Soulmate Portrait** - описания ΠΏΠΎΡ€Ρ‚Ρ€Π΅Ρ‚Π° -- **Date экраны** - info сообщСния -- **Form экраны** - Π»Π΅ΠΉΠ±Π»Ρ‹ ΠΈ placeholder -- **Coupon экраны** - всС тСкстовыС поля ΠΊΡƒΠΏΠΎΠ½Π° - -### πŸ”§ Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚: - -#### 1. **АвтоматичСскоС ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅:** -```typescript -// БистСма автоматичСски провСряСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ тСкст Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ -import { hasTextMarkup } from "@/lib/text-markup"; - -if (hasTextMarkup("Π’Π°Ρˆ **ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ** ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€")) { - // Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ автоматичСски -} -``` - -#### 2. **Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°:** -```typescript -// ВсС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Typography автоматичСски ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΡƒ - - {text} - -``` - -#### 3. **ΠŸΡ€Π΅Π²ΡŒΡŽ Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅:** -```typescript -// Π’ Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅ показываСтся ΠΆΠΈΠ²ΠΎΠ΅ ΠΏΡ€Π΅Π²ΡŒΡŽ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ - -``` - -## ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² экранов - -### πŸ“‹ **Info экраны:** -```json -{ - "template": "info", - "description": { - "text": "ΠœΡ‹ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ **12 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ²** Π°Π½ΠΊΠ΅Ρ‚ ΠΈ нашли **ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ совпадСния** для вас!" - } -} -``` - -### πŸ’– **Soulmate Portrait:** -```json -{ - "template": "soulmate", - "description": { - "text": "Π’Π°Ρˆ **ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€** Π½Π°ΠΉΠ΄Π΅Π½ Π½Π° основС **Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°** Π²Π°ΡˆΠΈΡ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²" - } -} -``` - -### πŸ“… **Date экраны:** -```json -{ - "template": "date", - "infoMessage": { - "text": "ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄Π°Ρ‚Ρƒ роТдСния для опрСдСлСния **Π·Π½Π°ΠΊΠ° Π·ΠΎΠ΄ΠΈΠ°ΠΊΠ°** ΠΈ **совмСстимости**" - } -} -``` - -### 🎟️ **Coupon экраны:** -```json -{ - "template": "coupon", - "coupon": { - "title": { "text": "**94% скидка** Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСгодня!" }, - "description": { "text": "Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄ **HAIR50** ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ скидку" } - } -} -``` - -## ВСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ - -### πŸ”§ **ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ систСмы:** - -#### 1. **Π£Ρ‚ΠΈΠ»ΠΈΡ‚Ρ‹ (`/lib/text-markup.ts`):** -- `parseTextMarkup()` - парсинг Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ Π² сСгмСнты -- `hasTextMarkup()` - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° наличия Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ -- `stripTextMarkup()` - ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ - -#### 2. **React ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ (`/components/ui/MarkupText/`):** -- `` - Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ тСкста с Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ -- `` - ΠΏΡ€Π΅Π²ΡŒΡŽ Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅ -- `useHasMarkup()` - React Ρ…ΡƒΠΊ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ - -#### 3. **Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ (`Typography.tsx`):** -- АвтоматичСская активация ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ -- ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ `enableMarkup` для Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ управлСния -- Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ стилями - -### πŸ“ **ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:** -```tsx -// АвтоматичСскоС использованиС - - Π’Π°Ρˆ **ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ** ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€ Π½Π°ΠΉΠ΄Π΅Π½! - - -// Π ΡƒΡ‡Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ - - ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст с **Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ** - - -// ΠŸΡ€ΡΠΌΠΎΠ΅ использованиС MarkupText - - **WitLab** - Π½Π°ΠΉΠ΄ΠΈ свою любовь! - -``` - -## Π›ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ - -### βœ… **Π₯ΠΎΡ€ΠΎΡˆΠΎ:** -- `"Π’Π°Ρˆ **ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ** ΠΏΠ°Ρ€Ρ‚Π½Π΅Ρ€ Π½Π°ΠΉΠ΄Π΅Π½!"` - Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов -- `"**50%** скидка Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСгодня"` - Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ†ΠΈΡ„Ρ€ ΠΈ Π°ΠΊΡ†ΠΈΠΉ -- `"ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΠ΅ΠΌ, **Анна**!"` - Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ - -### ❌ **Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅:** -- `"**Π’Π΅ΡΡŒ тСкст ΠΆΠΈΡ€Π½Ρ‹ΠΉ**"` - потСря контраста -- `"**Π‘Π»**ΠΎΠ²**ΠΎΠΌ** **Ρ€Π°Π·Π±**ΠΈΡ‚**Ρ‹Π΅**"` - Π½Π΅Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ -- `"****"` - пустыС выдСлСния - -### πŸ’‘ **Π‘ΠΎΠ²Π΅Ρ‚Ρ‹:** -1. **ВыдСляйтС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова** - ΠΈΠΌΠ΅Π½Π°, ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Ρ‹, Π²Π°ΠΆΠ½Ρ‹Π΅ понятия -2. **Π‘ΠΎΠ±Π»ΡŽΠ΄Π°ΠΉΡ‚Π΅ баланс** - Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 20% тСкста Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΆΠΈΡ€Π½Ρ‹ΠΌ -3. **ВСстируйтС Π² ΠΏΡ€Π΅Π²ΡŒΡŽ** - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ MarkupPreview Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅ -4. **Π£Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅ контСкст** - Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ… Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Π½Π΅Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ - -## Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ - -- βœ… **React 18+** -- βœ… **TypeScript 5+** -- βœ… **Next.js 14+** -- βœ… **Tailwind CSS** -- βœ… **ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ** - ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ тСкст Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ diff --git a/README-ADMIN.md b/README-ADMIN.md deleted file mode 100644 index 59ca26f..0000000 --- a/README-ADMIN.md +++ /dev/null @@ -1,216 +0,0 @@ -# WitLab Funnel Admin - ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Π°Ρ Π°Π΄ΠΌΠΈΠ½ΠΊΠ° с MongoDB - -## Π§Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ - -### βœ… Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… MongoDB -- **ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· Mongoose** с автоматичСским ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ -- **МодСли для Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ** с ΠΏΠΎΠ»Π½ΠΎΠΉ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠ΅ΠΉ структуры Π΄Π°Π½Π½Ρ‹Ρ… -- **Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ** для систСмы undo/redo -- **Π˜Π½Π΄Π΅ΠΊΡΡ‹ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ** поиска ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ - -### βœ… API Routes -- `GET /api/funnels` - список Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ с ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°ΠΌΠΈ -- `POST /api/funnels` - созданиС Π½ΠΎΠ²ΠΎΠΉ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -- `GET /api/funnels/[id]` - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -- `PUT /api/funnels/[id]` - ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -- `DELETE /api/funnels/[id]` - ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠΈ) -- `POST /api/funnels/[id]/duplicate` - Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -- `GET/POST /api/funnels/[id]/history` - Ρ€Π°Π±ΠΎΡ‚Π° с историСй ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ -- `GET /api/funnels/by-funnel-id/[funnelId]` - Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΠΎ funnel ID (для совмСстимости) - -### βœ… ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ `/admin` -- **Бписок всСх Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ** с поиском, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ сортировкой -- **Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ** с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ шаблоном -- **Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ…** Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ -- **Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠΎΠ²** (ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ) -- **Бтатистика использования** (просмотры, Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ) -- **Бтатусы**: draft, published, archived - -### βœ… Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ `/admin/builder/[id]` -- **ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Π±ΠΈΠ»Π΄Π΅Ρ€** ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ -- **АвтосохранСниС** ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… -- **БистСма ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ** с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ вСрсий -- **Π’ΠΎΠΏ Π±Π°Ρ€** с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Π²ΠΎΡ€ΠΎΠ½ΠΊΠ΅ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ дСйствий -- **Экспорт/ΠΈΠΌΠΏΠΎΡ€Ρ‚ JSON** для Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ копирования - -### βœ… БистСма undo/redo -- **Π˜ΡΡ‚ΠΎΡ€ΠΈΡ дСйствий** с Π³Π»ΡƒΠ±ΠΈΠ½ΠΎΠΉ Π΄ΠΎ 50 шагов -- **Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ** ΠΏΡ€ΠΈ сохранСнии Π² Π‘Π” (послС сохранСния нСльзя ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ) -- **НСсохранСнныС измСнСния** ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ -- **АвтоматичСская очистка** старых записСй истории - -### βœ… Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ -- **ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ** с JSON Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ -- **ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…** ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ -- **АвтоматичСскоС ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ статистики** ΠΏΡ€ΠΈ просмотрах -- **Π•Π΄ΠΈΠ½Ρ‹ΠΉ API** для всСх ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² систСмы - -## Настройка окруТСния - -### 1. MongoDB Connection -Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ `.env.local` Ρ„Π°ΠΉΠ»: -```bash -# MongoDB -MONGODB_URI=mongodb://localhost:27017/witlab-funnel -# ΠΈΠ»ΠΈ для MongoDB Atlas: -# MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/witlab-funnel - -# Base URL (для server-side запросов) -NEXT_PUBLIC_BASE_URL=http://localhost:3000 -``` - -### 2. Установка MongoDB локально -```bash -# macOS (Ρ‡Π΅Ρ€Π΅Π· Homebrew) -brew install mongodb-community -brew services start mongodb-community - -# Или ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ MongoDB Atlas (ΠΎΠ±Π»Π°ΠΊΠΎ) -``` - -### 3. Запуск ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° -```bash -npm install -npm run dev -``` - -## ИспользованиС - -### Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -1. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° `/admin` -2. НаТмитС "Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²ΠΎΡ€ΠΎΠ½ΠΊΡƒ" -3. АвтоматичСски откроСтся Π±ΠΈΠ»Π΄Π΅Ρ€ с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ шаблоном -4. Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ экраны Π² ΠΏΡ€Π°Π²ΠΎΠΌ сайдбарС -5. БохраняйтС измСнСния ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ "Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ" -6. ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠΉΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ Π²ΠΎΡ€ΠΎΠ½ΠΊΡƒ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ "ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ" - -### Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -1. Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π½ΡƒΠΆΠ½ΡƒΡŽ Π²ΠΎΡ€ΠΎΠ½ΠΊΡƒ -2. НаТмитС ΠΈΠΊΠΎΠ½ΠΊΡƒ "Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ" (ΠΊΠ°Ρ€Π°Π½Π΄Π°Ρˆ) -3. ВнСситС измСнСния Π² Π±ΠΈΠ»Π΄Π΅Ρ€Π΅ -4. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΈΠ»ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠΉΡ‚Π΅ - -### ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -1. НаТмитС ΠΈΠΊΠΎΠ½ΠΊΡƒ "ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€" (Π³Π»Π°Π·) Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ -2. Или ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° `/{funnelId}` Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ - -### Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -1. НаТмитС ΠΈΠΊΠΎΠ½ΠΊΡƒ "Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ" (копия) -2. Боздастся копия со статусом "Π§Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊ" -3. ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ - -## АрхитСктура - -### МодСли Π΄Π°Π½Π½Ρ‹Ρ… -```typescript -// Основная модСль Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ -interface IFunnel { - funnelData: FunnelDefinition; // JSON структура Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ - name: string; // Π§Π΅Π»ΠΎΠ²Π΅ΠΊΠΎ-Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ΅ имя - status: 'draft' | 'published' | 'archived'; - version: number; // АвтоинкрСмСнт ΠΏΡ€ΠΈ измСнСниях - usage: { // Бтатистика - totalViews: number; - totalCompletions: number; - }; -} - -// Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ -interface IFunnelHistory { - funnelId: string; // Бвязь с Π²ΠΎΡ€ΠΎΠ½ΠΊΠΎΠΉ - sessionId: string; // БСссия рСдактирования - funnelSnapshot: FunnelDefinition; // Π‘Π½ΠΈΠΌΠΎΠΊ состояния - sequenceNumber: number; // ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Π² сСссии - isBaseline: boolean; // Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΎ Π² Π‘Π” -} -``` - -### API Architecture -- **RESTful API** с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ HTTP ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ -- **Валидация Π΄Π°Π½Π½Ρ‹Ρ…** Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Mongoose схСм -- **ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок** с понятными сообщСниями -- **ΠŸΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡ** для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… списков -- **Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ ΠΈ поиск** ΠΏΠΎ всСм полям - -### Frontend Architecture -- **Server Components** для статичСской Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ -- **Client Components** для интСрактивности -- **Π•Π΄ΠΈΠ½Ρ‹ΠΉ API ΠΊΠ»ΠΈΠ΅Π½Ρ‚** Ρ‡Π΅Ρ€Π΅Π· fetch -- **TypeScript Ρ‚ΠΈΠΏΡ‹** для всСх Π΄Π°Π½Π½Ρ‹Ρ… -- **Error Boundaries** для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок - -## Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ - -### Π’Π΅ΠΊΡƒΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ€Ρ‹ -- **Валидация Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…** Π½Π° всСх уровнях -- **ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сущСствования** рСсурсов ΠΏΠ΅Ρ€Π΅Π΄ опСрациями -- **ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Π½Π° ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅** ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ -- **Банитизация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°** - -### Π‘ΡƒΠ΄ΡƒΡ‰ΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ -- АутСнтификация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ -- Авторизация ΠΏΠΎ ролям -- Аудит Π»ΠΎΠ³ дСйствий -- Rate limiting для API - -## ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ - -### ВСкущая оптимизация -- **MongoDB индСксы** для быстрого поиска -- **ΠŸΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡ** вмСсто Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ всСх записСй -- **Selective loading** - Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ поля -- **Connection pooling** для Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… - -### ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ -- **Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ошибок** Π² консоль -- **ВрСмя выполнСния** запросов отслСТиваСтся -- **Π Π°Π·ΠΌΠ΅Ρ€ истории** ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ (100 записСй Π½Π° сСссию) - -## ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡ с JSON - -Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ JSON Π²ΠΎΡ€ΠΎΠ½ΠΊΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ автоматичСски: -1. **ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…** - сначала поиск Π² MongoDB -2. **Fallback Π½Π° JSON** - Ссли Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π² Π±Π°Π·Π΅ -3. **Π˜ΠΌΠΏΠΎΡ€Ρ‚ ΠΈΠ· JSON** - ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ JSON Π² Π±ΠΈΠ»Π΄Π΅Ρ€Π΅ -4. **Экспорт Π² JSON** - для Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ копирования - -## Roadmap - -### Π‘Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΠ΅ ΠΏΠ»Π°Π½Ρ‹ -- [x] Основная Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π°Π΄ΠΌΠΈΠ½ΠΊΠΈ -- [x] БистСма undo/redo -- [x] Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ -- [ ] АутСнтификация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ -- [ ] Collaborative editing -- [ ] Advanced Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° - -### ДолгосрочныС Ρ†Π΅Π»ΠΈ -- [ ] Multi-tenant Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° -- [ ] A/B тСстированиС Π²ΠΎΡ€ΠΎΠ½ΠΎΠΊ -- [ ] Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с внСшними сСрвисами -- [ ] Mobile app для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° - -## ВСхничСская ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° - -### Π›ΠΎΠ³ΠΈ ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ° -```bash -# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ MongoDB -curl http://localhost:3000/api/funnels - -# ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π»ΠΎΠ³ΠΎΠ² Π² консоли Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° -# MongoDB connection logs Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ -``` - -### ЧастыС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ -1. **MongoDB not connected** - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ MONGODB_URI Π² .env.local -2. **API errors** - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ сСтСвоС соСдинСниС -3. **Build errors** - ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ всС зависимости установлСны - -### ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Ρ‹ -- GitHub Issues для Π±Π°Π³Ρ€Π΅ΠΏΠΎΡ€Ρ‚ΠΎΠ² -- ДокумСнтация Π² `/docs/` -- ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² ΠΊΠΎΠ΄Π΅ для слоТных частСй - ---- - -**ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Π°Ρ Π°Π΄ΠΌΠΈΠ½ΠΊΠ° с MongoDB Π³ΠΎΡ‚ΠΎΠ²Π° ΠΊ использованию! πŸš€**