π¦ Telegram Bot Builder v1.5.1
ΠΠ°ΡΠ° Π²ΡΠΏΡΡΠΊΠ°: 25 ΡΠ΅Π²ΡΠ°Π»Ρ 2026 Π³.
Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΉ: v1.5.0...v1.5.1
π― ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡβ
β¨ ΠΠ½ΠΎΠΏΠΊΠ° Β«ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡΒ» Π² ΠΏΠ°Π½Π΅Π»ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²β
ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ° ΡΠ²Π½ΠΎΠ³ΠΎ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΏΠ°Π½Π΅Π»ΠΈ ΡΠ²ΠΎΠΉΡΡΠ² ΡΠ·Π»Π°.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ:β
- Π―Π²Π½ΠΎΠ΅ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ β ΠΊΠ½ΠΎΠΏΠΊΠ° Β«ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡΒ» ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ
- Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ β Π²ΡΠΏΠ»ΡΠ²Π°ΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠΈ
- ΠΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π² ΠΈΡΡΠΎΡΠΈΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ
- ΠΠ²ΡΠΎΠ·Π°ΠΊΡΡΡΠΈΠ΅ β ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΈΡΡΠ΅Π·Π°Π΅Ρ ΡΠ΅ΡΠ΅Π· 1 ΡΠ΅ΠΊΡΠ½Π΄Ρ
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ:β
client/components/editor/properties/apply-button.tsxβ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΊΠ½ΠΎΠΏΠΊΠΈclient/components/editor/properties/properties-footer.tsxβ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ½ ΡΡΡΠ΅Ρ ΠΏΠ°Π½Π΅Π»ΠΈclient/pages/editor.tsxβ ΡΡΠ½ΠΊΡΠΈΡhandleSaveProjectΠ΄Π»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ
π¬ Π£Π»ΡΡΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ°ΡΡΡΠ»ΠΎΠΊ (Broadcast)β
ΠΠΎΠ»Π½ΡΠΉ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ ΠΌΠΎΠ΄ΡΠ»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΠ°ΡΡΡΠ»ΠΊΠΈ Π΄Π»Ρ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ.
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:β
- Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΠΈ BotApi ΠΈ Client
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΡΠ΅ΠΉ ΠΊ ΠΌΠ΅Π΄ΠΈΠ°ΡΠ°ΠΉΠ»Π°ΠΌ
- Π£Π»ΡΡΡΠ΅Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠΌΠΈ ΠΈ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΏΡΡΡΠΌΠΈ
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ
get_full_media_pathΠ΄Π»Ρ Telethon
π§ ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· .envβ
ΠΡΠ½Π΅ΡΠ΅Π½Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΡΠ°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΡ.
ΠΠΎΠ²ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅:β
BOT_TOKENβ ΡΠΎΠΊΠ΅Π½ Π±ΠΎΡΠ° Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ .env ΡΠ°ΠΉΠ»Π΅ (Π΄Π»Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π±ΠΎΡΠΎΠ²)ADMIN_IDSβ ΡΠΏΠΈΡΠΎΠΊ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΎΠ² (ΡΠΎΡΠΌΠ°Ρ Π² ΡΡΠΎΠ»Π±ΠΈΠΊ)ENABLE_LOGSβ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡDEBUG_MODEβ ΡΠ΅ΠΆΠΈΠΌ ΠΎΡΠ»Π°Π΄ΠΊΠΈ
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:β
- Π£Π΄Π°Π»Π΅Π½Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ
config.yamlβ Π²ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ΅ΡΠ΅Π· .env - Π€Π°ΠΉΠ»
bot_data.jsonΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ Π²project.json(Π²ΠΊΠ»Π°Π΄ΠΊΠ° Β«ΠΠΎΠ΄Β») - ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ² Π² Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ΅ ΠΊΠΎΠ΄Π°
π¨ Π Π΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ UI ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²β
Π£Π»ΡΡΡΠ΅Π½Π° ΡΡΡΡΠΊΡΡΡΠ° ΠΊΠΎΠ΄Π° Π΄Π»Ρ Π»ΡΡΡΠ΅ΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΡΡΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΠΎΡΠ°ΠΌΠΈ (BotControl):β
- ΠΡΠ΄Π΅Π»Π΅Π½Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π΄Π»Ρ ΠΊΠ°ΡΡΠΎΡΠΊΠΈ Π±ΠΎΡΠ°
- ΠΠΈΠ°Π»ΠΎΠ³ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π±ΠΎΡΠ° ΡΠ°Π·Π±ΠΈΡ Π½Π° ΠΌΠΎΠ΄ΡΠ»ΠΈ
- ΠΠΈΠ°Π»ΠΎΠ³ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅Π½Π° ΡΠ°Π·Π±ΠΈΡ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ
- Π’Π΅ΡΠΌΠΈΠ½Π°Π» ΡΠ°Π·Π±ΠΈΡ Π½Π° 6 Ρ ΡΠΊΠΎΠ² ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ
ΠΠ°Π½Π΅Π»Ρ ΡΠ²ΠΎΠΉΡΡΠ²:β
- Π‘Π΅ΡΠΊΠ° Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π±ΠΎΡΠ° Π²ΡΠ΄Π΅Π»Π΅Π½Π° Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
- ΠΠ½ΠΎΠΏΠΊΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π²ΡΠ½Π΅ΡΠ΅Π½Ρ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ
- Π£Π΄Π°Π»ΡΠ½ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠ΄
π README Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡβ
Π£Π»ΡΡΡΠ΅Π½Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ Π±ΠΎΡΠΎΠ².
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ:β
- ΠΡΠ΅Π²ΡΡ README β ΠΏΡΠ΅Π΄ΠΏΡΠΎΡΠΌΠΎΡΡ Ρ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΡΡ
- Monaco Editor β ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»Π΅Π²Π°, ΠΏΡΠ΅Π²ΡΡ ΡΠΏΡΠ°Π²Π°
- ΠΠΎΠΌΠ°Π½Π΄Ρ BotFather β ΠΊΡΠ°ΡΠΈΠ²ΡΠ΅ Π±Π»ΠΎΠΊΠΈ Ρ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ
- ΠΠ°ΡΡΠΎΡΠΊΠΈ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ β Π²ΡΡΠ°Π²Π»ΡΡΡΡΡ Π² Π½ΡΠΆΠ½ΡΠ΅ ΡΠ΅ΠΊΡΠΈΠΈ
- Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ β ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΠΈ ΠΏΡΠ΅Π²ΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ:β
client/components/editor/code/readme-preview.tsxβ ΠΏΡΠ΅Π²ΡΡ READMEclient/lib/generate/generateReadme.tsβ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
β¨οΈ ΠΠΎΡΡΡΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΡΠΈβ
ΠΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π³ΠΎΡΡΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ Π΄Π»Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ.
ΠΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ:β
- Ctrl+Z β ΠΎΡΠΌΠ΅Π½ΠΈΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ (undo)
- Ctrl+Y / Ctrl+Shift+Z β ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ (redo)
- Ctrl+C β ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΠ·Π΅Π»
- Ctrl+V β Π²ΡΡΠ°Π²ΠΈΡΡ ΡΠ·Π΅Π»
- Ctrl+Shift+C/V β ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅/Π²ΡΡΠ°Π²ΠΊΠ°
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ:β
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΡΡΡΠΊΠΎΠΉ ΠΈ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΉ ΡΠ°ΡΠΊΠ»Π°Π΄ΠΎΠΊ
- ΠΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π² ΠΈΡΡΠΎΡΠΈΡ
- ΠΠΎΡΡΠ΅ΠΊΡΠ½Π°Ρ ΡΠ°Π±ΠΎΡΠ° undo/redo Π΄Π»Ρ Π²ΡΠ΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ
π― ΠΡΡΠ°Π²ΠΊΠ° ΡΠ·Π»ΠΎΠ² Π² ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΊΠ»ΠΈΠΊΠ°β
Π£Π»ΡΡΡΠ΅Π½ΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ ΡΠ·Π»ΠΎΠ².
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:β
- Π’ΠΎΡΠ½Π°Ρ Π²ΡΡΠ°Π²ΠΊΠ° Π² ΡΠΎΡΠΊΡ ΠΊΠ»ΠΈΠΊΠ° ΠΌΡΡΠΈ
- Π£ΡΡΡ ΠΌΠ°ΡΡΡΠ°Π±Π° (zoom) ΠΈ ΠΏΠ°Π½ΠΎΡΠ°ΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ (pan)
- ΠΡΠ°Π²ΠΈΠ»ΡΠ½Π°Ρ ΠΊΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ ΡΠΊΡΠ°Π½Π° Π² ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Ρ ΠΎΠ»ΡΡΠ°
- Π¦Π΅Π½ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ·Π»Π° ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΡΡΡΠΎΡΠ°
π ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊβ
Telegram Client API:β
- ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ
- ΠΡΠΎΠ²Π΅ΡΠΊΠ°
result.clientΠ½Π° undefined - ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
isActive: trueβisActive: 1Π΄Π»Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ - Π£ΠΊΠΎΡΠΎΡΠ΅Π½ΠΈΠ΅ ID ΡΠ·Π»ΠΎΠ² ΠΏΡΠΈ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π»ΠΈΡΡΠΎΠ²
TypeScript:β
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½Ρ ΠΎΡΠΈΠ±ΠΊΠΈ Π²
telegram-client.ts - Π£Π»ΡΡΡΠ΅Π½Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ UI ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²
- Π£Π΄Π°Π»Π΅Π½Ρ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅
Python ΠΊΠΎΠ΄ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ:β
- ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ²
&&βand,||βor - ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
startsWithβstartswith - Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΎΡΡΡΡΠΏΠΎΠ² ΠΏΡΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π°
π Π‘ΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉβ
| ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΡ | Π€Π°ΠΉΠ»ΠΎΠ² | Π‘ΡΡΠΎΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ | Π‘ΡΡΠΎΠΊ ΡΠ΄Π°Π»Π΅Π½ΠΎ |
|---|---|---|---|
| ΠΠ½ΠΎΠΏΠΊΠ° Β«ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡΒ» | 4 | 110 | 25 |
| Π Π΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ Broadcast | 8 | 50 | 30 |
| ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ .env | 6 | 80 | 150 |
| Π Π΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ UI | 25 | 400 | 350 |
| README Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ | 4 | 200 | 50 |
| ΠΠΎΡΡΡΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΡΠΈ | 6 | 150 | 80 |
| ΠΡΡΠ°Π²ΠΊΠ° ΡΠ·Π»ΠΎΠ² | 3 | 100 | 40 |
| ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ | 15 | 200 | 180 |
| ΠΡΠ΅Π³ΠΎ | 71 | 1290+ | 905+ |
π§ Π’Π΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΠΈβ
ΠΠ½ΠΎΠΏΠΊΠ° Β«ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡΒ»β
// client/components/editor/properties/apply-button.tsx
export function ApplyButton({ onNodeUpdate, onSaveProject, onActionLog }) {
const handleApply = () => {
if (onActionLog) onActionLog('apply', 'ΠΡΠΈΠΌΠ΅Π½Π΅Π½Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ');
if (onNodeUpdate) onNodeUpdate();
if (onSaveProject) onSaveProject();
toast({ title: 'ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½Ρ', duration: 1000 });
};
}
ΠΠΎΡΡΡΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΡΠΈβ
// ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Ctrl+Z/Ctrl+Y
document.addEventListener('keydown', (e) => {
if ((e.ctrlKey || e.metaKey) && e.key === 'z') {
handleUndo();
}
if ((e.ctrlKey || e.metaKey) && (e.key === 'y' || e.key === 'z' && e.shiftKey)) {
handleRedo();
}
});
ΠΡΡΠ°Π²ΠΊΠ° ΡΠ·Π»ΠΎΠ²β
// ΠΠΎΠ½Π²Π΅ΡΡΠ°ΡΠΈΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ ΡΠΊΡΠ°Π½Π° Π² ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Ρ
ΠΎΠ»ΡΡΠ°
const screenToCanvas = (screenX: number, screenY: number) => {
const rect = canvasRef.current.getBoundingClientRect();
const x = (screenX - rect.left - pan.x) / zoom;
const y = (screenY - rect.top - pan.y) / zoom;
return { x, y };
};
π Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°β
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Ρ v1.5.0:β
# ΠΠ±Π½ΠΎΠ²ΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ
git pull origin main
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
cd client
npm install
# Π‘ΠΎΠ±Π΅ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ
npm run build
# ΠΠ°ΠΏΡΡΡΠΈΡΠ΅
npm run start
Π§Π΅ΡΠ΅Π· Docker:β
# ΠΠ΅ΡΠ΅ΡΠΎΠ±Π΅ΡΠΈΡΠ΅ ΠΎΠ±ΡΠ°Π·
docker-compose build --no-cache
# ΠΠ°ΠΏΡΡΡΠΈΡΠ΅
docker-compose up -d
β οΈ ΠΠ°ΠΆΠ½ΡΠ΅ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΡβ
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡβ
- ** .env ΡΠ°ΠΉΠ»** β ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ Π½Π°Π»ΠΈΡΠΈΠ΅ Π²ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
- ADMIN_IDS β ΡΠΎΡΠΌΠ°Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΠ½ Π½Π° ΠΏΠΎΡΡΡΠΎΡΠ½ΡΠΉ
- ΠΠΈΠ³ΡΠ°ΡΠΈΠΈ β Π½ΠΎΠ²ΡΠ΅ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΡΡΡΡ
ΠΠΎΡΡΡΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΡΠΈβ
- Π Π°ΡΠΊΠ»Π°Π΄ΠΊΠ° β ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΡΡΡΠΊΠ°Ρ ΠΈ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠ°Ρ
- ΠΠΎΠ½ΡΠ»ΠΈΠΊΡΡ β ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠΌ
README Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡβ
- ΠΡΠ΅Π²ΡΡ β Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«ΠΠΎΠ΄Β»
- Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ β ΠΏΡΠΎΠΊΡΡΡΠΊΠ° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ
π¦ ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈβ
ΠΠΎΠ²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π½Π΅ ΡΡΠ΅Π±ΡΡΡΡΡ.
π Π‘ΡΡΠ»ΠΊΠΈβ
- ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΅Π»ΠΈΠ·Π°
- Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
- ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠ²
π Π§Π΅ΠΊ-Π»ΠΈΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡβ
- ΠΠ½ΠΎΠΏΠΊΠ° Β«ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡΒ» ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π°
- Π Π΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³ Broadcast Π·Π°Π²Π΅ΡΡΡΠ½
- ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· .env ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π°
- UI ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠ΅Π½Ρ
- README Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
- ΠΠΎΡΡΡΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ
- ΠΡΡΠ°Π²ΠΊΠ° ΡΠ·Π»ΠΎΠ² ΡΠ»ΡΡΡΠ΅Π½Π°
- ΠΡΠΈΠ±ΠΊΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½Ρ
ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ: ΠΠΎΠΌΠΌΠΈΡΡ v1.5.0...v1.5.1