stella-coder 3.9.2 → 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.
- package/.mcp.json +11 -0
- package/.opencode/skills/banner-design/SKILL.md +196 -0
- package/.opencode/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
- package/.opencode/skills/brand/SKILL.md +97 -0
- package/.opencode/skills/brand/references/approval-checklist.md +169 -0
- package/.opencode/skills/brand/references/asset-organization.md +157 -0
- package/.opencode/skills/brand/references/brand-guideline-template.md +140 -0
- package/.opencode/skills/brand/references/color-palette-management.md +186 -0
- package/.opencode/skills/brand/references/consistency-checklist.md +94 -0
- package/.opencode/skills/brand/references/logo-usage-rules.md +185 -0
- package/.opencode/skills/brand/references/messaging-framework.md +85 -0
- package/.opencode/skills/brand/references/typography-specifications.md +214 -0
- package/.opencode/skills/brand/references/update.md +118 -0
- package/.opencode/skills/brand/references/visual-identity.md +96 -0
- package/.opencode/skills/brand/references/voice-framework.md +88 -0
- package/.opencode/skills/brand/scripts/extract-colors.cjs +341 -0
- package/.opencode/skills/brand/scripts/inject-brand-context.cjs +349 -0
- package/.opencode/skills/brand/scripts/sync-brand-to-tokens.cjs +248 -0
- package/.opencode/skills/brand/scripts/tests/test_sync_brand_to_tokens.py +52 -0
- package/.opencode/skills/brand/scripts/validate-asset.cjs +387 -0
- package/.opencode/skills/brand/templates/brand-guidelines-starter.md +275 -0
- package/.opencode/skills/design/SKILL.md +313 -0
- package/.opencode/skills/design/data/cip/deliverables.csv +51 -0
- package/.opencode/skills/design/data/cip/industries.csv +21 -0
- package/.opencode/skills/design/data/cip/mockup-contexts.csv +21 -0
- package/.opencode/skills/design/data/cip/styles.csv +21 -0
- package/.opencode/skills/design/data/icon/styles.csv +16 -0
- package/.opencode/skills/design/data/logo/colors.csv +56 -0
- package/.opencode/skills/design/data/logo/industries.csv +56 -0
- package/.opencode/skills/design/data/logo/styles.csv +56 -0
- package/.opencode/skills/design/references/banner-sizes-and-styles.md +118 -0
- package/.opencode/skills/design/references/cip-deliverable-guide.md +95 -0
- package/.opencode/skills/design/references/cip-design.md +121 -0
- package/.opencode/skills/design/references/cip-prompt-engineering.md +84 -0
- package/.opencode/skills/design/references/cip-style-guide.md +68 -0
- package/.opencode/skills/design/references/design-routing.md +207 -0
- package/.opencode/skills/design/references/icon-design.md +122 -0
- package/.opencode/skills/design/references/logo-color-psychology.md +101 -0
- package/.opencode/skills/design/references/logo-design.md +92 -0
- package/.opencode/skills/design/references/logo-prompt-engineering.md +158 -0
- package/.opencode/skills/design/references/logo-style-guide.md +109 -0
- package/.opencode/skills/design/references/slides-copywriting-formulas.md +84 -0
- package/.opencode/skills/design/references/slides-create.md +4 -0
- package/.opencode/skills/design/references/slides-html-template.md +295 -0
- package/.opencode/skills/design/references/slides-layout-patterns.md +137 -0
- package/.opencode/skills/design/references/slides-strategies.md +94 -0
- package/.opencode/skills/design/references/slides.md +42 -0
- package/.opencode/skills/design/references/social-photos-design.md +329 -0
- package/.opencode/skills/design/scripts/cip/core.py +215 -0
- package/.opencode/skills/design/scripts/cip/generate.py +484 -0
- package/.opencode/skills/design/scripts/cip/render-html.py +424 -0
- package/.opencode/skills/design/scripts/cip/search.py +127 -0
- package/.opencode/skills/design/scripts/icon/generate.py +487 -0
- package/.opencode/skills/design/scripts/logo/core.py +175 -0
- package/.opencode/skills/design/scripts/logo/generate.py +362 -0
- package/.opencode/skills/design/scripts/logo/search.py +114 -0
- package/.opencode/skills/design-system/SKILL.md +244 -0
- package/.opencode/skills/design-system/data/slide-backgrounds.csv +11 -0
- package/.opencode/skills/design-system/data/slide-charts.csv +26 -0
- package/.opencode/skills/design-system/data/slide-color-logic.csv +14 -0
- package/.opencode/skills/design-system/data/slide-copy.csv +26 -0
- package/.opencode/skills/design-system/data/slide-layout-logic.csv +16 -0
- package/.opencode/skills/design-system/data/slide-layouts.csv +26 -0
- package/.opencode/skills/design-system/data/slide-strategies.csv +16 -0
- package/.opencode/skills/design-system/data/slide-typography.csv +15 -0
- package/.opencode/skills/design-system/references/component-specs.md +236 -0
- package/.opencode/skills/design-system/references/component-tokens.md +214 -0
- package/.opencode/skills/design-system/references/primitive-tokens.md +203 -0
- package/.opencode/skills/design-system/references/semantic-tokens.md +215 -0
- package/.opencode/skills/design-system/references/states-and-variants.md +241 -0
- package/.opencode/skills/design-system/references/tailwind-integration.md +251 -0
- package/.opencode/skills/design-system/references/token-architecture.md +224 -0
- package/.opencode/skills/design-system/scripts/embed-tokens.cjs +99 -0
- package/.opencode/skills/design-system/scripts/fetch-background.py +317 -0
- package/.opencode/skills/design-system/scripts/generate-slide.py +770 -0
- package/.opencode/skills/design-system/scripts/generate-tokens.cjs +205 -0
- package/.opencode/skills/design-system/scripts/html-token-validator.py +327 -0
- package/.opencode/skills/design-system/scripts/search-slides.py +218 -0
- package/.opencode/skills/design-system/scripts/slide-token-validator.py +35 -0
- package/.opencode/skills/design-system/scripts/slide_search_core.py +453 -0
- package/.opencode/skills/design-system/scripts/tests/test_validate_tokens.py +48 -0
- package/.opencode/skills/design-system/scripts/validate-tokens.cjs +246 -0
- package/.opencode/skills/design-system/templates/design-tokens-starter.json +143 -0
- package/.opencode/skills/slides/SKILL.md +40 -0
- package/.opencode/skills/slides/references/copywriting-formulas.md +84 -0
- package/.opencode/skills/slides/references/create.md +4 -0
- package/.opencode/skills/slides/references/html-template.md +295 -0
- package/.opencode/skills/slides/references/layout-patterns.md +137 -0
- package/.opencode/skills/slides/references/slide-strategies.md +94 -0
- package/.opencode/skills/ui-styling/LICENSE.txt +202 -0
- package/.opencode/skills/ui-styling/SKILL.md +324 -0
- package/.opencode/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/.opencode/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/.opencode/skills/ui-styling/references/shadcn-components.md +424 -0
- package/.opencode/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/.opencode/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/.opencode/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/.opencode/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/.opencode/skills/ui-styling/scripts/requirements.txt +17 -0
- package/.opencode/skills/ui-styling/scripts/shadcn_add.py +308 -0
- package/.opencode/skills/ui-styling/scripts/tailwind_config_gen.py +473 -0
- package/.opencode/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/.opencode/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/.opencode/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/.opencode/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +394 -0
- package/.opencode/skills/ui-ux-pro-max/SKILL.md +396 -0
- package/.opencode/skills/ui-ux-pro-max/data/_sync_all.py +414 -0
- package/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +31 -0
- package/.opencode/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/.opencode/skills/ui-ux-pro-max/data/colors.csv +193 -0
- package/.opencode/skills/ui-ux-pro-max/data/design.csv +1776 -0
- package/.opencode/skills/ui-ux-pro-max/data/draft.csv +1779 -0
- package/.opencode/skills/ui-ux-pro-max/data/google-fonts.csv +1924 -0
- package/.opencode/skills/ui-ux-pro-max/data/icons.csv +106 -0
- package/.opencode/skills/ui-ux-pro-max/data/landing.csv +35 -0
- package/.opencode/skills/ui-ux-pro-max/data/motion.csv +17 -0
- package/.opencode/skills/ui-ux-pro-max/data/products.csv +193 -0
- package/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/avalonia.csv +57 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/javafx.csv +76 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +71 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/uno.csv +60 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/uwp.csv +56 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/winui.csv +60 -0
- package/.opencode/skills/ui-ux-pro-max/data/stacks/wpf.csv +57 -0
- package/.opencode/skills/ui-ux-pro-max/data/styles.csv +85 -0
- package/.opencode/skills/ui-ux-pro-max/data/typography.csv +75 -0
- package/.opencode/skills/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
- package/.opencode/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/core.py +274 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +1329 -0
- package/.opencode/skills/ui-ux-pro-max/scripts/search.py +127 -0
- package/README.md +25 -30
- package/STELLA.md +1 -1
- package/dist/antimalware/database.mjs +871 -0
- package/dist/antimalware/index.mjs +8 -0
- package/dist/antimalware/scanner.mjs +591 -0
- package/dist/antimalware/ui.mjs +570 -0
- package/dist/banner.mjs +46 -0
- package/dist/index.mjs +3073 -0
- package/dist/markdown.mjs +100 -0
- package/dist/sea-config.json +4 -0
- package/dist/security.mjs +237 -0
- package/dist/theme.mjs +89 -0
- package/dist/tools.mjs +3145 -0
- package/install-stella.bat +44 -0
- package/package.json +5 -4
- package/stella-cli/coding-brain.mjs +753 -0
- package/stella-cli/index.mjs +931 -15
- package/stella-cli/mcp.mjs +296 -0
- package/stella-cli/presentations.mjs +1106 -0
- package/stella-cli/subagents.mjs +142 -0
- package/stella-cli/telegram-bot.mjs +824 -0
- package/stella-cli/tg-bg.bat +13 -0
- package/stella-cli/tg-server.bat +15 -0
- package/stella-cli/tg-server.mjs +116 -0
- package/stella-cli/theme.mjs +6 -4
- package/create_cats_pptx.py +0 -121
- package/hello.py +0 -2
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
title Stella Telegram Bot - Background Service
|
|
3
|
+
echo Starting Stella Telegram Bot in background...
|
|
4
|
+
|
|
5
|
+
cd /d "%~dp0"
|
|
6
|
+
|
|
7
|
+
:: Start as background process
|
|
8
|
+
start /B node tg-server.mjs > nul 2>&1
|
|
9
|
+
|
|
10
|
+
echo Bot started! Check %USERPROFILE%\.stella\tg-bot.log for logs.
|
|
11
|
+
echo.
|
|
12
|
+
echo To stop: tg-server.bat --stop
|
|
13
|
+
echo To check status: tg-server.bat --status
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
title Stella Telegram Bot Server
|
|
3
|
+
echo ============================================
|
|
4
|
+
echo Stella Telegram Bot Server
|
|
5
|
+
echo ============================================
|
|
6
|
+
echo.
|
|
7
|
+
|
|
8
|
+
cd /d "%~dp0"
|
|
9
|
+
|
|
10
|
+
:loop
|
|
11
|
+
echo [%date% %time%] Starting bot...
|
|
12
|
+
node tg-server.mjs
|
|
13
|
+
echo [%date% %time%] Bot stopped, restarting in 5 seconds...
|
|
14
|
+
timeout /t 5 /nobreak >nul
|
|
15
|
+
goto loop
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import fs from "node:fs"
|
|
2
|
+
import path from "node:path"
|
|
3
|
+
import os from "node:os"
|
|
4
|
+
import { execSync, spawn } from "node:child_process"
|
|
5
|
+
import { startBot, stopBot } from "./telegram-bot.mjs"
|
|
6
|
+
|
|
7
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
8
|
+
// STELLA TELEGRAM SERVER — постоянная работа бота
|
|
9
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
10
|
+
|
|
11
|
+
const CONFIG_DIR = path.join(os.homedir(), ".stella")
|
|
12
|
+
const PID_FILE = path.join(CONFIG_DIR, "tg-bot.pid")
|
|
13
|
+
const LOG_FILE = path.join(CONFIG_DIR, "tg-bot.log")
|
|
14
|
+
|
|
15
|
+
function log(msg) {
|
|
16
|
+
const timestamp = new Date().toLocaleString("ru-RU")
|
|
17
|
+
const line = `[${timestamp}] ${msg}`
|
|
18
|
+
console.log(line)
|
|
19
|
+
try {
|
|
20
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true })
|
|
21
|
+
fs.appendFileSync(LOG_FILE, line + "\n")
|
|
22
|
+
} catch {}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function savePID() {
|
|
26
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true })
|
|
27
|
+
fs.writeFileSync(PID_FILE, String(process.pid))
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function removePID() {
|
|
31
|
+
try { fs.unlinkSync(PID_FILE) } catch {}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function isRunning() {
|
|
35
|
+
try {
|
|
36
|
+
if (!fs.existsSync(PID_FILE)) return false
|
|
37
|
+
const pid = parseInt(fs.readFileSync(PID_FILE, "utf8"))
|
|
38
|
+
process.kill(pid, 0)
|
|
39
|
+
return true
|
|
40
|
+
} catch {
|
|
41
|
+
return false
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Handle cleanup
|
|
46
|
+
process.on("SIGINT", () => {
|
|
47
|
+
log("Bot shutting down (SIGINT)")
|
|
48
|
+
removePID()
|
|
49
|
+
process.exit(0)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
process.on("SIGTERM", () => {
|
|
53
|
+
log("Bot shutting down (SIGTERM)")
|
|
54
|
+
removePID()
|
|
55
|
+
process.exit(0)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
process.on("exit", () => {
|
|
59
|
+
removePID()
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
// Main
|
|
63
|
+
async function main() {
|
|
64
|
+
const args = process.argv.slice(2)
|
|
65
|
+
|
|
66
|
+
if (args.includes("--stop")) {
|
|
67
|
+
if (!isRunning()) {
|
|
68
|
+
console.log("Bot is not running")
|
|
69
|
+
return
|
|
70
|
+
}
|
|
71
|
+
const pid = parseInt(fs.readFileSync(PID_FILE, "utf8"))
|
|
72
|
+
try {
|
|
73
|
+
process.kill(pid, "SIGTERM")
|
|
74
|
+
console.log(`Bot stopped (PID: ${pid})`)
|
|
75
|
+
removePID()
|
|
76
|
+
} catch (e) {
|
|
77
|
+
console.log(`Failed to stop: ${e.message}`)
|
|
78
|
+
}
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (args.includes("--status")) {
|
|
83
|
+
if (isRunning()) {
|
|
84
|
+
const pid = fs.readFileSync(PID_FILE, "utf8")
|
|
85
|
+
console.log(`Bot is running (PID: ${pid})`)
|
|
86
|
+
} else {
|
|
87
|
+
console.log("Bot is not running")
|
|
88
|
+
}
|
|
89
|
+
return
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (isRunning()) {
|
|
93
|
+
const pid = fs.readFileSync(PID_FILE, "utf8")
|
|
94
|
+
console.log(`Bot already running (PID: ${pid})`)
|
|
95
|
+
return
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Start bot
|
|
99
|
+
savePID()
|
|
100
|
+
log(`Bot starting (PID: ${process.pid})`)
|
|
101
|
+
log(`Platform: ${os.platform()} ${os.release()}`)
|
|
102
|
+
log(`Node: ${process.version}`)
|
|
103
|
+
|
|
104
|
+
const result = await startBot()
|
|
105
|
+
if (result) {
|
|
106
|
+
log("Bot started successfully")
|
|
107
|
+
console.log("Stella Telegram Bot is running!")
|
|
108
|
+
console.log("Press Ctrl+C to stop")
|
|
109
|
+
} else {
|
|
110
|
+
log("Bot failed to start")
|
|
111
|
+
removePID()
|
|
112
|
+
process.exit(1)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
main()
|
package/stella-cli/theme.mjs
CHANGED
|
@@ -66,11 +66,13 @@ export function box(lines, { color = purple, padding = 1, title = "" } = {}) {
|
|
|
66
66
|
const width = Math.max(...lines.map((l) => strip(l).length), strip(title).length + 2)
|
|
67
67
|
const pad = " ".repeat(padding)
|
|
68
68
|
const inner = width + padding * 2
|
|
69
|
+
// Handle color as array [r,g,b] or function
|
|
70
|
+
const colorFn = Array.isArray(color) ? rgb(color[0], color[1], color[2]) : color
|
|
69
71
|
const top = title
|
|
70
|
-
?
|
|
71
|
-
:
|
|
72
|
-
const body = lines.map((l) =>
|
|
73
|
-
const bottom =
|
|
72
|
+
? colorFn("╭─ ") + bold(violet(title)) + colorFn(" " + "─".repeat(Math.max(inner - strip(title).length - 3, 0)) + "╮")
|
|
73
|
+
: colorFn("╭" + "─".repeat(inner) + "╮")
|
|
74
|
+
const body = lines.map((l) => colorFn("│") + pad + l + " ".repeat(width - strip(l).length) + pad + colorFn("│"))
|
|
75
|
+
const bottom = colorFn("╰" + "─".repeat(inner) + "╯")
|
|
74
76
|
return [top, ...body, bottom].join("\n")
|
|
75
77
|
}
|
|
76
78
|
|
package/create_cats_pptx.py
DELETED
|
@@ -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