stella-coder 4.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +25 -35
  2. package/dist/antimalware/index.mjs +0 -0
  3. package/package.json +3 -4
  4. package/stella-cli/index.mjs +1 -1
  5. package/create_cats_pptx.py +0 -121
  6. package/hello.py +0 -2
  7. package/presentation-advanced-features-demo/README.md +0 -27
  8. package/presentation-advanced-features-demo/index.html +0 -371
  9. package/presentation-advanced-features-demo/print.html +0 -81
  10. package/presentation-advanced-features-demo/slide-01.html +0 -98
  11. package/presentation-advanced-features-demo/slide-02.html +0 -101
  12. package/presentation-advanced-features-demo/slide-03.html +0 -100
  13. package/presentation-advanced-features-demo/slide-04.html +0 -100
  14. package/presentation-advanced-features-demo/slide-05.html +0 -100
  15. package/presentation-advanced-features-demo/slide-06.html +0 -64
  16. package/presentation-advanced-features-demo/slide-07.html +0 -101
  17. package/presentation-advanced-features-demo/slide-08.html +0 -91
  18. package/presentation-stella-coder---ai-coding-agent/README.md +0 -27
  19. package/presentation-stella-coder---ai-coding-agent/index.html +0 -168
  20. package/presentation-stella-coder---ai-coding-agent/slide-01.html +0 -98
  21. package/presentation-stella-coder---ai-coding-agent/slide-02.html +0 -101
  22. package/presentation-stella-coder---ai-coding-agent/slide-03.html +0 -100
  23. package/presentation-stella-coder---ai-coding-agent/slide-04.html +0 -100
  24. package/presentation-stella-coder---ai-coding-agent/slide-05.html +0 -100
  25. package/presentation-stella-coder---ai-coding-agent/slide-06.html +0 -100
  26. package/presentation-stella-coder---ai-coding-agent/slide-07.html +0 -100
  27. package/presentation-stella-coder---ai-coding-agent/slide-08.html +0 -64
  28. package/presentation-stella-coder---ai-coding-agent/slide-09.html +0 -101
  29. package/presentation-stella-coder---ai-coding-agent/slide-10.html +0 -91
  30. package/presentation-stella-coder-demo/README.md +0 -27
  31. package/presentation-stella-coder-demo/index.html +0 -371
  32. package/presentation-stella-coder-demo/slide-01.html +0 -98
  33. package/presentation-stella-coder-demo/slide-02.html +0 -101
  34. package/presentation-stella-coder-demo/slide-03.html +0 -100
  35. package/presentation-stella-coder-demo/slide-04.html +0 -100
  36. package/presentation-stella-coder-demo/slide-05.html +0 -100
  37. package/presentation-stella-coder-demo/slide-06.html +0 -64
  38. package/presentation-stella-coder-demo/slide-07.html +0 -101
  39. package/presentation-stella-coder-demo/slide-08.html +0 -91
  40. package/presentation-stella-coder-features/README.md +0 -27
  41. package/presentation-stella-coder-features/index.html +0 -364
  42. package/presentation-stella-coder-features/print.html +0 -77
  43. package/presentation-stella-coder-features/slide-01.html +0 -98
  44. package/presentation-stella-coder-features/slide-02.html +0 -101
  45. package/presentation-stella-coder-features/slide-03.html +0 -100
  46. package/presentation-stella-coder-features/slide-04.html +0 -100
  47. package/presentation-stella-coder-features/slide-05.html +0 -64
  48. package/presentation-stella-coder-features/slide-06.html +0 -101
  49. package/presentation-stella-coder-features/slide-07.html +0 -91
  50. package/presentation-test-presentation/README.md +0 -27
  51. package/presentation-test-presentation/index.html +0 -350
  52. package/presentation-test-presentation/print.html +0 -69
  53. package/presentation-test-presentation/slide-01.html +0 -98
  54. package/presentation-test-presentation/slide-02.html +0 -101
  55. package/presentation-test-presentation/slide-03.html +0 -64
  56. package/presentation-test-presentation/slide-04.html +0 -101
  57. package/presentation-test-presentation/slide-05.html +0 -91
  58. package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/README.md +0 -27
  59. package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/index.html +0 -159
  60. package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-01.html +0 -98
  61. package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-02.html +0 -101
  62. package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-03.html +0 -100
  63. package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-04.html +0 -100
  64. package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-05.html +0 -64
  65. package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-06.html +0 -101
  66. package/presentation-/321/202/320/265/321/201/321/202/320/276/320/262/320/260/321/217-/320/277/321/200/320/265/320/267/320/265/320/275/321/202/320/260/321/206/320/270/321/217/slide-07.html +0 -91
  67. package/stella-coder-3.9.2.tgz +0 -0
package/README.md CHANGED
@@ -1,66 +1,56 @@
1
- # Stella Coder 3.9
1
+ # Stella Coder 5.0
2
2
 
3
- > AI coding agent with computer control, smart home, Office automation, and antivirus — all in your terminal.
3
+ > AI coding agent with Telegram bot, huge context, TDD, Git ecosystem, and more — all in your terminal.
4
4
 
5
5
  ## Features
6
6
 
7
7
  - **AI Agent** — Read, create, edit files; run shell commands; search code
8
- - **100+ commands** — `/help`, `/model`, `/plan`, `/commit`, `/exec`, `/open`, `/tv`, `/docker`, etc.
8
+ - **100+ commands** — `/help`, `/model`, `/plan`, `/commit`, `/exec`, `/open`, `/tv`, etc.
9
9
  - **20+ AI models** — Free defaults (MiMo, DeepSeek), plus GPT, Claude, Gemini
10
+ - **Telegram Bot** — Control your computer remotely from Telegram
11
+ - **Coding Brain** — Huge context (200K tokens), auto-load SPEC/CLAUDE.md
12
+ - **TDD** — Auto-write tests, run linters, fix code
13
+ - **Git Ecosystem** — Branches, PRs, merge conflicts resolution
14
+ - **Presentations** — Create beautiful HTML presentations
10
15
  - **Computer control** — Screenshot, volume, brightness, WiFi, notifications
11
16
  - **Server management** — SSH, Docker, PM2, ports, firewall
12
17
  - **Smart home** — Sony TV, HDMI-CEC, Yeelight, Chromecast, Wake-on-LAN
13
18
  - **Office automation** — PowerPoint, Word, Excel via COM
14
- - **Application control** — Focus windows, type text, hotkeys, screenshots
15
19
  - **Antivirus** — Built-in scanner with 100+ signatures
16
- - **Presentations** — Create beautiful HTML presentations from any topic
17
20
 
18
21
  ## Quick Install
19
22
 
20
- ### From npm (recommended)
21
-
22
23
  ```bash
23
24
  npm install -g stella-coder
24
25
  stella
25
26
  ```
26
27
 
27
- ### From source
28
-
29
- ```bash
30
- git clone https://github.com/codex-alex/stella-coder.git
31
- cd stella-coder
32
- npm install
33
- npm link
34
- stella
35
- ```
36
-
37
- ### Windows one-click
38
-
39
- Download `install.bat` and run it.
40
-
41
28
  ## Usage
42
29
 
43
30
  ```bash
44
31
  stella # Interactive REPL
45
- stella -p "fix bug in utils.ts" # One-shot command
32
+ stella -p "fix bug" # One-shot command
46
33
  ```
47
34
 
48
- ### Key Commands
35
+ ## Telegram Bot
36
+
37
+ 1. Start bot: `/tg`
38
+ 2. Generate code: `/tg-code`
39
+ 3. Share code with friends
40
+ 4. Friends enter code in @stella_CLI_bot
41
+ 5. They can now control your computer!
42
+
43
+ ## Key Commands
49
44
 
50
45
  | Command | Description |
51
46
  |---------|-------------|
52
47
  | `/help` | Show all commands |
53
- | `/model` | Select AI model |
54
- | `/plan` | Execute multi-step tasks |
55
- | `/exec <cmd>` | Run shell command |
56
- | `/open <app>` | Open application |
57
- | `/tv discover` | Find Sony TV |
58
- | `/docker ps` | List containers |
59
- | `/av` | Launch antivirus |
60
- | `/presentation <topic>` | Create presentation from topic |
61
- | `/presentation-theme` | List available themes |
62
- | `/presentation-custom` | Create custom presentation |
63
- | `/presentation-export <dir>` | Export to print-friendly HTML |
48
+ | `/brain` | Project diagnostics |
49
+ | `/tdd <file>` | Auto-write tests |
50
+ | `/fix-all` | Lint + format + types + tests |
51
+ | `/tg` | Start Telegram bot |
52
+ | `/tg-code` | Generate access code |
53
+ | `/presentation <topic>` | Create presentation |
64
54
 
65
55
  ## Configuration
66
56
 
@@ -74,4 +64,4 @@ MIT
74
64
 
75
65
  ---
76
66
 
77
- **Stella Coder 3.9** · powered by codex alex
67
+ **Stella Coder 5.0** · powered by codex alex
File without changes
package/package.json CHANGED
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "name": "stella-coder",
3
- "version": "4.0.0",
3
+ "version": "5.0.0",
4
4
  "private": false,
5
- "description": "Stella Coder 4.0 — AI coding agent with subagents, MCP, computer control, smart home, Office automation, and antivirus",
5
+ "description": "Stella Coder 5.0 — AI coding agent with Telegram bot, huge context, TDD, Git ecosystem, presentations, computer control, smart home, Office automation, and antivirus",
6
6
  "main": "stella-cli/index.mjs",
7
7
  "bin": {
8
- "stella": "stella-cli/index.mjs",
9
- "stellar-av": "antimalware/index.mjs"
8
+ "stella": "stella-cli/index.mjs"
10
9
  },
11
10
  "scripts": {
12
11
  "stella": "node stella-cli/index.mjs",
@@ -40,7 +40,7 @@ import {
40
40
  generateAdminCode, listAuthorizedUsers,
41
41
  } from "./telegram-bot.mjs"
42
42
 
43
- const VERSION = "4.0.0"
43
+ const VERSION = "5.0.0"
44
44
  const CONFIG_DIR = path.join(os.homedir(), ".stella")
45
45
  const CONFIG_PATH = path.join(CONFIG_DIR, "config.json")
46
46
  const HISTORY_PATH = path.join(CONFIG_DIR, "history.json")
@@ -1,121 +0,0 @@
1
- from pptx import Presentation
2
- from pptx.util import Inches, Pt, Emu
3
- from pptx.dml.color import RGBColor
4
- from pptx.enum.text import PP_ALIGN
5
-
6
- prs = Presentation()
7
- prs.slide_width = Inches(13.333)
8
- prs.slide_height = Inches(7.5)
9
-
10
- # Цвета
11
- ORANGE = RGBColor(0xFF, 0x8C, 0x00)
12
- DARK = RGBColor(0x2D, 0x2D, 0x2D)
13
- WHITE = RGBColor(0xFF, 0xFF, 0xFF)
14
- LIGHT_BG = RGBColor(0xFF, 0xF5, 0xE6)
15
-
16
- def set_slide_bg(slide, r, g, b):
17
- background = slide.background
18
- fill = background.fill
19
- fill.solid()
20
- fill.fore_color.rgb = RGBColor(r, g, b)
21
-
22
- def add_text_box(slide, left, top, width, height, text, font_size=24, bold=False, color=DARK, alignment=PP_ALIGN.LEFT):
23
- txBox = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(width), Inches(height))
24
- tf = txBox.text_frame
25
- tf.word_wrap = True
26
- p = tf.paragraphs[0]
27
- p.text = text
28
- p.font.size = Pt(font_size)
29
- p.font.bold = bold
30
- p.font.color.rgb = color
31
- p.alignment = alignment
32
- return txBox
33
-
34
- def add_bullets(slide, left, top, width, height, items, font_size=20, color=DARK):
35
- txBox = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(width), Inches(height))
36
- tf = txBox.text_frame
37
- tf.word_wrap = True
38
- for i, item in enumerate(items):
39
- if i == 0:
40
- p = tf.paragraphs[0]
41
- else:
42
- p = tf.add_paragraph()
43
- p.text = item
44
- p.font.size = Pt(font_size)
45
- p.font.color.rgb = color
46
- p.space_after = Pt(12)
47
- p.level = 0
48
- return txBox
49
-
50
- # Слайд 1 — Титульный
51
- slide = prs.slides.add_slide(prs.slide_layouts[6]) # Blank
52
- set_slide_bg(slide, 0xFF, 0x8C, 0x00)
53
- add_text_box(slide, 1, 1.5, 11, 2, "🐱 КОТЫ", font_size=72, bold=True, color=WHITE, alignment=PP_ALIGN.CENTER)
54
- add_text_box(slide, 1, 3.5, 11, 1.5, "Лучшие друзья человека", font_size=36, color=WHITE, alignment=PP_ALIGN.CENTER)
55
- add_text_box(slide, 1, 5.5, 11, 1, "🐾 🐾 🐾 🐾 🐾", font_size=36, color=WHITE, alignment=PP_ALIGN.CENTER)
56
-
57
- # Слайд 2 — Интересные факты
58
- slide = prs.slides.add_slide(prs.slide_layouts[6])
59
- set_slide_bg(slide, 0xFF, 0xF5, 0xE6)
60
- add_text_box(slide, 0.5, 0.5, 12, 1.2, "🔍 Интересные факты о котах", font_size=40, bold=True, color=ORANGE, alignment=PP_ALIGN.CENTER)
61
- facts = [
62
- "😴 Коты проводят 70% своей жизни во сне",
63
- "👃 У каждого кота уникальный рисунок носа — как отпечаток пальца",
64
- "🔊 Коты могут издавать более 100 различных звуков",
65
- "🏆 Самый старый кот прожил 38 лет",
66
- "🏃 Коты бегают со скоростью до 48 км/ч",
67
- "❤️ Коты мурлыкают на частоте 25-150 Гц — это помогает заживлению тканей",
68
- ]
69
- add_bullets(slide, 1.5, 2, 10, 5, facts, font_size=24, color=DARK)
70
-
71
- # Слайд 3 — Популярные породы
72
- slide = prs.slides.add_slide(prs.slide_layouts[6])
73
- set_slide_bg(slide, 0xFF, 0xF5, 0xE6)
74
- add_text_box(slide, 0.5, 0.5, 12, 1.2, "🐈 Популярные породы", font_size=40, bold=True, color=ORANGE, alignment=PP_ALIGN.CENTER)
75
- breeds = [
76
- "🦁 Мейн-кун — гигант среди домашних котов (до 12 кг!)",
77
- "👻 Сфинкс — бесшёрстная, но очень ласковая порода",
78
- "🇬🇧 Британская короткошёрстная — классика жанра",
79
- "🦄 Шотландская вислоухая — с милыми загнутыми ушами",
80
- "🇹🇭 Сиамская — умная и голосистая порода",
81
- "👑 Персидская — царственная красота и спокойный характер",
82
- ]
83
- add_bullets(slide, 1.5, 2, 10, 5, breeds, font_size=24, color=DARK)
84
-
85
- # Слайд 4 — Польза для здоровья
86
- slide = prs.slides.add_slide(prs.slide_layouts[6])
87
- set_slide_bg(slide, 0xFF, 0xF5, 0xE6)
88
- add_text_box(slide, 0.5, 0.5, 12, 1.2, "💚 Польза котов для здоровья", font_size=40, bold=True, color=ORANGE, alignment=PP_ALIGN.CENTER)
89
- health = [
90
- "😌 Снижают уровень стресса и тревожности",
91
- "🎵 Мурлыкание помогает заживлять кости и ткани",
92
- "💊 Понижают давление и уровень холестерина",
93
- "🫀 Уменьшают риск инфаркта на 40%",
94
- "🤗 Помогают бороться с одиночеством",
95
- "👶 Дети, растущие с котами, реже болеют аллергией",
96
- ]
97
- add_bullets(slide, 1.5, 2, 10, 5, health, font_size=24, color=DARK)
98
-
99
- # Слайд 5 — Коты в культуре
100
- slide = prs.slides.add_slide(prs.slide_layouts[6])
101
- set_slide_bg(slide, 0xFF, 0xF5, 0xE6)
102
- add_text_box(slide, 0.5, 0.5, 12, 1.2, "🌍 Коты в культуре", font_size=40, bold=True, color=ORANGE, alignment=PP_ALIGN.CENTER)
103
- culture = [
104
- "🏛️ В Древнем Египте котов боготворили и мумифицировали",
105
- "📱 Интернет-мемы сделали котов самыми популярными животными онлайн",
106
- "🎨 Сальвадор Дали был известным любителем котов",
107
- "🇯🇵 В Японии манэки-нэко (кот-привет) приносит удачу",
108
- "🐈 Кот Боб — знаменитый рыжий уличный кот из Лондона",
109
- "📚 Кошка Бегемот из «Мастера и Маргариты» — один из самых известных котов в литературе",
110
- ]
111
- add_bullets(slide, 1.5, 2, 10, 5, culture, font_size=24, color=DARK)
112
-
113
- # Слайд 6 — Заключительный
114
- slide = prs.slides.add_slide(prs.slide_layouts[6])
115
- set_slide_bg(slide, 0xFF, 0x8C, 0x00)
116
- add_text_box(slide, 1, 2, 11, 2, "Спасибо за внимание!", font_size=60, bold=True, color=WHITE, alignment=PP_ALIGN.CENTER)
117
- add_text_box(slide, 1, 4.2, 11, 1.5, "🐾 Возьмите кота — и ваша жизнь станет ярче! 🐾", font_size=28, color=WHITE, alignment=PP_ALIGN.CENTER)
118
-
119
- output = r"C:\Users\user\Desktop\cats.pptx"
120
- prs.save(output)
121
- print(f"Презентация сохранена: {output}")
package/hello.py DELETED
@@ -1,2 +0,0 @@
1
- print("Привет, мир!")
2
- input("Нажмите Enter для закрытия...")
@@ -1,27 +0,0 @@
1
- # Advanced Features Demo
2
-
3
- ## Презентация
4
-
5
- Эта презентация содержит 8 слайдов.
6
-
7
- ### Просмотр
8
-
9
- Откройте `index.html` в браузере для просмотра презентации.
10
-
11
- ### Навигация
12
-
13
- - Используйте клавиши ← → для навигации
14
- - Нажмите F11 для полноэкранного режима
15
-
16
- ### Тема
17
-
18
- Tech Blue
19
-
20
- ### Цвета
21
-
22
- - Primary: #0ea5e9
23
- - Secondary: #06b6d4
24
- - Accent: #0ea5e9
25
-
26
- ---
27
- Создано с помощью Stella Coder
@@ -1,371 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="ru">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Advanced Features Demo</title>
7
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
8
- <style>
9
- * { margin: 0; padding: 0; box-sizing: border-box; }
10
- body {
11
- font-family: 'Inter', sans-serif;
12
- background: #0c1222;
13
- overflow: hidden;
14
- }
15
- .presentation {
16
- width: 100vw;
17
- height: 100vh;
18
- display: flex;
19
- align-items: center;
20
- justify-content: center;
21
- }
22
- .slide-container {
23
- width: 1280px;
24
- height: 720px;
25
- transform-origin: center center;
26
- position: relative;
27
- }
28
- .slide {
29
- position: absolute;
30
- top: 0;
31
- left: 0;
32
- width: 100%;
33
- height: 100%;
34
- opacity: 0;
35
- transform: translateX(100px);
36
- transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
37
- pointer-events: none;
38
- }
39
- .slide.active {
40
- opacity: 1;
41
- transform: translateX(0);
42
- pointer-events: auto;
43
- }
44
- .slide.exit {
45
- opacity: 0;
46
- transform: translateX(-100px);
47
- }
48
- .controls {
49
- position: fixed;
50
- bottom: 30px;
51
- left: 50%;
52
- transform: translateX(-50%);
53
- display: flex;
54
- gap: 12px;
55
- z-index: 1000;
56
- }
57
- .control-btn {
58
- width: 48px;
59
- height: 48px;
60
- border-radius: 12px;
61
- border: 1px solid #64748b30;
62
- background: #131c31;
63
- color: #f1f5f9;
64
- cursor: pointer;
65
- display: flex;
66
- align-items: center;
67
- justify-content: center;
68
- transition: all 0.2s ease;
69
- font-size: 18px;
70
- }
71
- .control-btn:hover {
72
- background: #0ea5e9;
73
- color: #0c1222;
74
- transform: scale(1.1);
75
- }
76
- .control-btn:active {
77
- transform: scale(0.95);
78
- }
79
- .progress {
80
- position: fixed;
81
- bottom: 0;
82
- left: 0;
83
- height: 4px;
84
- background: linear-gradient(90deg, #0ea5e9, #06b6d4);
85
- transition: width 0.3s ease;
86
- }
87
- .slide-counter {
88
- position: fixed;
89
- bottom: 40px;
90
- right: 30px;
91
- font-size: 14px;
92
- color: #64748b;
93
- }
94
- .slide-thumbnails {
95
- position: fixed;
96
- bottom: 100px;
97
- left: 50%;
98
- transform: translateX(-50%);
99
- display: flex;
100
- gap: 8px;
101
- opacity: 0;
102
- transition: opacity 0.3s ease;
103
- }
104
- .slide-thumbnails.visible {
105
- opacity: 1;
106
- }
107
- .thumbnail {
108
- width: 80px;
109
- height: 45px;
110
- border: 2px solid #64748b30;
111
- border-radius: 6px;
112
- cursor: pointer;
113
- transition: all 0.2s ease;
114
- overflow: hidden;
115
- }
116
- .thumbnail:hover {
117
- border-color: #0ea5e9;
118
- transform: scale(1.1);
119
- }
120
- .thumbnail.active {
121
- border-color: #0ea5e9;
122
- box-shadow: 0 0 10px #0ea5e940;
123
- }
124
- .thumbnail iframe {
125
- width: 1280px;
126
- height: 720px;
127
- transform: scale(0.0625);
128
- transform-origin: top left;
129
- pointer-events: none;
130
- }
131
- .slide-number {
132
- position: fixed;
133
- top: 30px;
134
- left: 50%;
135
- transform: translateX(-50%);
136
- font-size: 14px;
137
- color: #64748b;
138
- background: #131c3180;
139
- padding: 8px 16px;
140
- border-radius: 20px;
141
- backdrop-filter: blur(10px);
142
- }
143
- .minimap {
144
- position: fixed;
145
- top: 30px;
146
- right: 30px;
147
- display: flex;
148
- flex-direction: column;
149
- gap: 4px;
150
- }
151
- .minimap-dot {
152
- width: 8px;
153
- height: 8px;
154
- border-radius: 50%;
155
- background: #64748b40;
156
- cursor: pointer;
157
- transition: all 0.2s ease;
158
- }
159
- .minimap-dot:hover {
160
- background: #0ea5e9;
161
- transform: scale(1.5);
162
- }
163
- .minimap-dot.active {
164
- background: #0ea5e9;
165
- }
166
- </style>
167
- </head>
168
- <body>
169
- <div class="presentation">
170
- <div class="slide-container" id="slideContainer">
171
-
172
- <div class="slide active" id="slide1">
173
- <iframe src="slide-01.html" width="1280" height="720" frameborder="0" style="border: none;"></iframe>
174
- </div>
175
- <div class="slide " id="slide2">
176
- <iframe src="slide-02.html" width="1280" height="720" frameborder="0" style="border: none;"></iframe>
177
- </div>
178
- <div class="slide " id="slide3">
179
- <iframe src="slide-03.html" width="1280" height="720" frameborder="0" style="border: none;"></iframe>
180
- </div>
181
- <div class="slide " id="slide4">
182
- <iframe src="slide-04.html" width="1280" height="720" frameborder="0" style="border: none;"></iframe>
183
- </div>
184
- <div class="slide " id="slide5">
185
- <iframe src="slide-05.html" width="1280" height="720" frameborder="0" style="border: none;"></iframe>
186
- </div>
187
- <div class="slide " id="slide6">
188
- <iframe src="slide-06.html" width="1280" height="720" frameborder="0" style="border: none;"></iframe>
189
- </div>
190
- <div class="slide " id="slide7">
191
- <iframe src="slide-07.html" width="1280" height="720" frameborder="0" style="border: none;"></iframe>
192
- </div>
193
- <div class="slide " id="slide8">
194
- <iframe src="slide-08.html" width="1280" height="720" frameborder="0" style="border: none;"></iframe>
195
- </div>
196
- </div>
197
- </div>
198
-
199
- <div class="controls">
200
- <button class="control-btn" onclick="prevSlide()" title="Предыдущий слайд">←</button>
201
- <button class="control-btn" onclick="nextSlide()" title="Следующий слайд">→</button>
202
- <button class="control-btn" onclick="toggleFullscreen()" title="Полноэкранный режим">⛶</button>
203
- <button class="control-btn" onclick="toggleThumbnails()" title="Показать превью">📷</button>
204
- <button class="control-btn" onclick="toggleMinimap()" title="Мини-карта">🗺</button>
205
- </div>
206
-
207
- <div class="progress" id="progress"></div>
208
- <div class="slide-counter" id="slideCounter">1 / 8</div>
209
- <div class="slide-number" id="slideNumber">1</div>
210
-
211
- <div class="slide-thumbnails" id="thumbnails">
212
-
213
- <div class="thumbnail active" onclick="goToSlide(1)">
214
- <iframe src="slide-01.html" width="1280" height="720" frameborder="0"></iframe>
215
- </div>
216
- <div class="thumbnail " onclick="goToSlide(2)">
217
- <iframe src="slide-02.html" width="1280" height="720" frameborder="0"></iframe>
218
- </div>
219
- <div class="thumbnail " onclick="goToSlide(3)">
220
- <iframe src="slide-03.html" width="1280" height="720" frameborder="0"></iframe>
221
- </div>
222
- <div class="thumbnail " onclick="goToSlide(4)">
223
- <iframe src="slide-04.html" width="1280" height="720" frameborder="0"></iframe>
224
- </div>
225
- <div class="thumbnail " onclick="goToSlide(5)">
226
- <iframe src="slide-05.html" width="1280" height="720" frameborder="0"></iframe>
227
- </div>
228
- <div class="thumbnail " onclick="goToSlide(6)">
229
- <iframe src="slide-06.html" width="1280" height="720" frameborder="0"></iframe>
230
- </div>
231
- <div class="thumbnail " onclick="goToSlide(7)">
232
- <iframe src="slide-07.html" width="1280" height="720" frameborder="0"></iframe>
233
- </div>
234
- <div class="thumbnail " onclick="goToSlide(8)">
235
- <iframe src="slide-08.html" width="1280" height="720" frameborder="0"></iframe>
236
- </div>
237
- </div>
238
-
239
- <div class="minimap" id="minimap">
240
-
241
- <div class="minimap-dot active" onclick="goToSlide(1)" title="Слайд 1"></div>
242
- <div class="minimap-dot " onclick="goToSlide(2)" title="Слайд 2"></div>
243
- <div class="minimap-dot " onclick="goToSlide(3)" title="Слайд 3"></div>
244
- <div class="minimap-dot " onclick="goToSlide(4)" title="Слайд 4"></div>
245
- <div class="minimap-dot " onclick="goToSlide(5)" title="Слайд 5"></div>
246
- <div class="minimap-dot " onclick="goToSlide(6)" title="Слайд 6"></div>
247
- <div class="minimap-dot " onclick="goToSlide(7)" title="Слайд 7"></div>
248
- <div class="minimap-dot " onclick="goToSlide(8)" title="Слайд 8"></div>
249
- </div>
250
-
251
- <script>
252
- let currentSlide = 1;
253
- const totalSlides = 8;
254
- let thumbnailsVisible = false;
255
- let minimapVisible = false;
256
-
257
- function showSlide(n, direction = 'next') {
258
- const currentEl = document.getElementById('slide' + currentSlide);
259
- const nextEl = document.getElementById('slide' + n);
260
-
261
- if (currentEl) {
262
- currentEl.classList.remove('active');
263
- currentEl.classList.add('exit');
264
- setTimeout(() => currentEl.classList.remove('exit'), 500);
265
- }
266
-
267
- if (nextEl) {
268
- nextEl.style.transform = direction === 'next' ? 'translateX(100px)' : 'translateX(-100px)';
269
- setTimeout(() => {
270
- nextEl.classList.add('active');
271
- nextEl.style.transform = '';
272
- }, 50);
273
- }
274
-
275
- currentSlide = n;
276
- updateUI();
277
- }
278
-
279
- function updateUI() {
280
- document.getElementById('slideCounter').textContent = currentSlide + ' / ' + totalSlides;
281
- document.getElementById('slideNumber').textContent = currentSlide;
282
- document.getElementById('progress').style.width = ((currentSlide / totalSlides) * 100) + '%';
283
-
284
- // Update thumbnails
285
- document.querySelectorAll('.thumbnail').forEach((t, i) => {
286
- t.classList.toggle('active', i + 1 === currentSlide);
287
- });
288
-
289
- // Update minimap
290
- document.querySelectorAll('.minimap-dot').forEach((d, i) => {
291
- d.classList.toggle('active', i + 1 === currentSlide);
292
- });
293
- }
294
-
295
- function nextSlide() {
296
- if (currentSlide < totalSlides) {
297
- showSlide(currentSlide + 1, 'next');
298
- }
299
- }
300
-
301
- function prevSlide() {
302
- if (currentSlide > 1) {
303
- showSlide(currentSlide - 1, 'prev');
304
- }
305
- }
306
-
307
- function goToSlide(n) {
308
- if (n >= 1 && n <= totalSlides) {
309
- showSlide(n, n > currentSlide ? 'next' : 'prev');
310
- }
311
- }
312
-
313
- function toggleFullscreen() {
314
- if (!document.fullscreenElement) {
315
- document.documentElement.requestFullscreen();
316
- } else {
317
- document.exitFullscreen();
318
- }
319
- }
320
-
321
- function toggleThumbnails() {
322
- thumbnailsVisible = !thumbnailsVisible;
323
- document.getElementById('thumbnails').classList.toggle('visible', thumbnailsVisible);
324
- }
325
-
326
- function toggleMinimap() {
327
- minimapVisible = !minimapVisible;
328
- document.getElementById('minimap').style.display = minimapVisible ? 'flex' : 'none';
329
- }
330
-
331
- // Keyboard navigation
332
- document.addEventListener('keydown', (e) => {
333
- if (e.key === 'ArrowRight' || e.key === ' ') nextSlide();
334
- if (e.key === 'ArrowLeft') prevSlide();
335
- if (e.key === 'f') toggleFullscreen();
336
- if (e.key === 't') toggleThumbnails();
337
- if (e.key === 'm') toggleMinimap();
338
- if (e.key === 'Home') goToSlide(1);
339
- if (e.key === 'End') goToSlide(totalSlides);
340
- });
341
-
342
- // Touch support
343
- let touchStartX = 0;
344
- document.addEventListener('touchstart', (e) => {
345
- touchStartX = e.touches[0].clientX;
346
- });
347
-
348
- document.addEventListener('touchend', (e) => {
349
- const touchEndX = e.changedTouches[0].clientX;
350
- const diff = touchStartX - touchEndX;
351
-
352
- if (Math.abs(diff) > 50) {
353
- if (diff > 0) nextSlide();
354
- else prevSlide();
355
- }
356
- });
357
-
358
- // Scale to fit
359
- function scalePresentation() {
360
- const container = document.getElementById('slideContainer');
361
- const scaleX = window.innerWidth / 1280;
362
- const scaleY = window.innerHeight / 720;
363
- const scale = Math.min(scaleX, scaleY) * 0.9;
364
- container.style.transform = 'scale(' + scale + ')';
365
- }
366
-
367
- window.addEventListener('resize', scalePresentation);
368
- scalePresentation();
369
- </script>
370
- </body>
371
- </html>