@nguyenphp/antigravity-marketing 1.0.16 → 1.0.19
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/README.md +187 -74
- package/bin/index.js +4 -4
- package/package.json +4 -3
- package/templates/.agent/agents/backend-specialist.md +263 -0
- package/templates/.agent/agents/database-architect.md +226 -0
- package/templates/.agent/agents/debugger.md +225 -0
- package/templates/.agent/agents/devops-engineer.md +242 -0
- package/templates/.agent/agents/documentation-writer.md +104 -0
- package/templates/.agent/agents/explorer-agent.md +73 -0
- package/templates/.agent/agents/frontend-specialist.md +527 -0
- package/templates/.agent/agents/game-developer.md +162 -0
- package/templates/.agent/agents/mobile-developer.md +377 -0
- package/templates/.agent/agents/orchestrator.md +400 -0
- package/templates/.agent/agents/penetration-tester.md +188 -0
- package/templates/.agent/agents/performance-optimizer.md +187 -0
- package/templates/.agent/agents/project-planner.md +403 -0
- package/templates/.agent/agents/security-auditor.md +170 -0
- package/templates/.agent/agents/seo-specialist.md +111 -0
- package/templates/.agent/agents/test-engineer.md +158 -0
- package/templates/.agent/rules/GEMINI.md +248 -0
- package/templates/.agent/skills/analytics-marketing/SKILL.md +172 -324
- package/templates/.agent/skills/api-patterns/SKILL.md +81 -0
- package/templates/.agent/skills/api-patterns/api-style.md +42 -0
- package/templates/.agent/skills/api-patterns/auth.md +24 -0
- package/templates/.agent/skills/api-patterns/documentation.md +26 -0
- package/templates/.agent/skills/api-patterns/graphql.md +41 -0
- package/templates/.agent/skills/api-patterns/rate-limiting.md +31 -0
- package/templates/.agent/skills/api-patterns/response.md +37 -0
- package/templates/.agent/skills/api-patterns/rest.md +40 -0
- package/templates/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
- package/templates/.agent/skills/api-patterns/security-testing.md +122 -0
- package/templates/.agent/skills/api-patterns/trpc.md +41 -0
- package/templates/.agent/skills/api-patterns/versioning.md +22 -0
- package/templates/.agent/skills/app-builder/SKILL.md +75 -0
- package/templates/.agent/skills/app-builder/agent-coordination.md +71 -0
- package/templates/.agent/skills/app-builder/feature-building.md +53 -0
- package/templates/.agent/skills/app-builder/project-detection.md +34 -0
- package/templates/.agent/skills/app-builder/scaffolding.md +118 -0
- package/templates/.agent/skills/app-builder/tech-stack.md +40 -0
- package/templates/.agent/skills/app-builder/templates/SKILL.md +39 -0
- package/templates/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/templates/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/templates/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/templates/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/templates/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/templates/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/templates/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/templates/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
- package/templates/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
- package/templates/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
- package/templates/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
- package/templates/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/templates/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
- package/templates/.agent/skills/architecture/SKILL.md +55 -0
- package/templates/.agent/skills/architecture/context-discovery.md +43 -0
- package/templates/.agent/skills/architecture/examples.md +94 -0
- package/templates/.agent/skills/architecture/pattern-selection.md +68 -0
- package/templates/.agent/skills/architecture/patterns-reference.md +50 -0
- package/templates/.agent/skills/architecture/trade-off-analysis.md +77 -0
- package/templates/.agent/skills/banner-design/SKILL.md +192 -0
- package/templates/.agent/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
- package/templates/.agent/skills/bash-linux/SKILL.md +199 -0
- package/templates/.agent/skills/behavioral-modes/SKILL.md +242 -0
- package/templates/.agent/skills/brainstorming/SKILL.md +163 -0
- package/templates/.agent/skills/brainstorming/dynamic-questioning.md +350 -0
- package/templates/.agent/skills/brand/SKILL.md +97 -0
- package/templates/.agent/skills/brand/references/approval-checklist.md +169 -0
- package/templates/.agent/skills/brand/references/asset-organization.md +157 -0
- package/templates/.agent/skills/brand/references/brand-guideline-template.md +140 -0
- package/templates/.agent/skills/brand/references/color-palette-management.md +186 -0
- package/templates/.agent/skills/brand/references/consistency-checklist.md +94 -0
- package/templates/.agent/skills/brand/references/logo-usage-rules.md +185 -0
- package/templates/.agent/skills/brand/references/messaging-framework.md +85 -0
- package/templates/.agent/skills/brand/references/typography-specifications.md +214 -0
- package/templates/.agent/skills/brand/references/update.md +118 -0
- package/templates/.agent/skills/brand/references/visual-identity.md +96 -0
- package/templates/.agent/skills/brand/references/voice-framework.md +88 -0
- package/templates/.agent/skills/brand/scripts/extract-colors.cjs +341 -0
- package/templates/.agent/skills/brand/scripts/inject-brand-context.cjs +349 -0
- package/templates/.agent/skills/brand/scripts/sync-brand-to-tokens.cjs +266 -0
- package/templates/.agent/skills/brand/scripts/validate-asset.cjs +387 -0
- package/templates/.agent/skills/brand/templates/brand-guidelines-starter.md +275 -0
- package/templates/.agent/skills/clean-code/SKILL.md +201 -0
- package/templates/.agent/skills/code-review-checklist/SKILL.md +109 -0
- package/templates/.agent/skills/copywriting/SKILL.md +250 -0
- package/templates/.agent/skills/database-design/SKILL.md +52 -0
- package/templates/.agent/skills/database-design/database-selection.md +43 -0
- package/templates/.agent/skills/database-design/indexing.md +39 -0
- package/templates/.agent/skills/database-design/migrations.md +48 -0
- package/templates/.agent/skills/database-design/optimization.md +36 -0
- package/templates/.agent/skills/database-design/orm-selection.md +30 -0
- package/templates/.agent/skills/database-design/schema-design.md +56 -0
- package/templates/.agent/skills/database-design/scripts/schema_validator.py +172 -0
- package/templates/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/templates/.agent/skills/docker-expert/SKILL.md +409 -0
- package/templates/.agent/skills/frontend-design/animation-guide.md +331 -0
- package/templates/.agent/skills/frontend-design/color-system.md +311 -0
- package/templates/.agent/skills/frontend-design/decision-trees.md +418 -0
- package/templates/.agent/skills/frontend-design/motion-graphics.md +306 -0
- package/templates/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/templates/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/templates/.agent/skills/frontend-design/typography-system.md +345 -0
- package/templates/.agent/skills/frontend-design/ux-psychology.md +541 -0
- package/templates/.agent/skills/frontend-design/visual-effects.md +383 -0
- package/templates/.agent/skills/frontend-slides/SKILL.md +92 -0
- package/templates/.agent/skills/frontend-slides/STYLE_PRESETS.md +347 -0
- package/templates/.agent/skills/frontend-slides/animation-patterns.md +110 -0
- package/templates/.agent/skills/frontend-slides/examples/n8n-jupviec-automation.html +789 -0
- package/templates/.agent/skills/frontend-slides/examples/n8n-jupviec-automation.pptx +0 -0
- package/templates/.agent/skills/frontend-slides/html-template.md +347 -0
- package/templates/.agent/skills/frontend-slides/scripts/export-pptx.py +58 -0
- package/templates/.agent/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/templates/.agent/skills/frontend-slides/viewport-base.css +153 -0
- package/templates/.agent/skills/game-development/2d-games/SKILL.md +119 -0
- package/templates/.agent/skills/game-development/3d-games/SKILL.md +135 -0
- package/templates/.agent/skills/game-development/SKILL.md +167 -0
- package/templates/.agent/skills/game-development/game-art/SKILL.md +185 -0
- package/templates/.agent/skills/game-development/game-audio/SKILL.md +190 -0
- package/templates/.agent/skills/game-development/game-design/SKILL.md +129 -0
- package/templates/.agent/skills/game-development/mobile-games/SKILL.md +108 -0
- package/templates/.agent/skills/game-development/multiplayer/SKILL.md +132 -0
- package/templates/.agent/skills/game-development/pc-games/SKILL.md +144 -0
- package/templates/.agent/skills/game-development/vr-ar/SKILL.md +123 -0
- package/templates/.agent/skills/game-development/web-games/SKILL.md +150 -0
- package/templates/.agent/skills/geo-fundamentals/SKILL.md +156 -0
- package/templates/.agent/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/templates/.agent/skills/growth-engine/SKILL.md +244 -0
- package/templates/.agent/skills/i18n-localization/SKILL.md +154 -0
- package/templates/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/templates/.agent/skills/lint-and-validate/SKILL.md +45 -0
- package/templates/.agent/skills/lint-and-validate/scripts/lint_runner.py +172 -0
- package/templates/.agent/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/templates/.agent/skills/marketing-report-expert/SKILL.md +70 -0
- package/templates/.agent/skills/mcp-builder/SKILL.md +176 -0
- package/templates/.agent/skills/minimax-docx/LICENSE +21 -0
- package/templates/.agent/skills/minimax-docx/SKILL.md +274 -0
- package/templates/.agent/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
- package/templates/.agent/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
- package/templates/.agent/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
- package/templates/.agent/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
- package/templates/.agent/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
- package/templates/.agent/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
- package/templates/.agent/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
- package/templates/.agent/skills/minimax-docx/references/cjk_typography.md +357 -0
- package/templates/.agent/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
- package/templates/.agent/skills/minimax-docx/references/comments_guide.md +191 -0
- package/templates/.agent/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
- package/templates/.agent/skills/minimax-docx/references/design_principles.md +819 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_element_order.md +308 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_namespaces.md +82 -0
- package/templates/.agent/skills/minimax-docx/references/openxml_units.md +72 -0
- package/templates/.agent/skills/minimax-docx/references/scenario_a_create.md +284 -0
- package/templates/.agent/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
- package/templates/.agent/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
- package/templates/.agent/skills/minimax-docx/references/track_changes_guide.md +200 -0
- package/templates/.agent/skills/minimax-docx/references/troubleshooting.md +506 -0
- package/templates/.agent/skills/minimax-docx/references/typography_guide.md +294 -0
- package/templates/.agent/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
- package/templates/.agent/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
- package/templates/.agent/skills/minimax-docx/scripts/docx_preview.sh +37 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
- package/templates/.agent/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
- package/templates/.agent/skills/minimax-docx/scripts/env_check.sh +196 -0
- package/templates/.agent/skills/minimax-docx/scripts/setup.ps1 +274 -0
- package/templates/.agent/skills/minimax-docx/scripts/setup.sh +504 -0
- package/templates/.agent/skills/minimax-multimodal-toolkit/SKILL.md +359 -0
- package/templates/.agent/skills/minimax-pdf/README.md +222 -0
- package/templates/.agent/skills/minimax-pdf/SKILL.md +201 -0
- package/templates/.agent/skills/minimax-pdf/design/design.md +381 -0
- package/templates/.agent/skills/minimax-pdf/scripts/cover.py +1579 -0
- package/templates/.agent/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
- package/templates/.agent/skills/minimax-pdf/scripts/fill_write.py +242 -0
- package/templates/.agent/skills/minimax-pdf/scripts/make.sh +491 -0
- package/templates/.agent/skills/minimax-pdf/scripts/merge.py +112 -0
- package/templates/.agent/skills/minimax-pdf/scripts/palette.py +559 -0
- package/templates/.agent/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
- package/templates/.agent/skills/minimax-pdf/scripts/render_body.py +1055 -0
- package/templates/.agent/skills/minimax-pdf/scripts/render_cover.cjs +111 -0
- package/templates/.agent/skills/minimax-xlsx/SKILL.md +138 -0
- package/templates/.agent/skills/minimax-xlsx/references/create.md +691 -0
- package/templates/.agent/skills/minimax-xlsx/references/edit.md +684 -0
- package/templates/.agent/skills/minimax-xlsx/references/fix.md +37 -0
- package/templates/.agent/skills/minimax-xlsx/references/format.md +768 -0
- package/templates/.agent/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
- package/templates/.agent/skills/minimax-xlsx/references/read-analyze.md +97 -0
- package/templates/.agent/skills/minimax-xlsx/references/validate.md +772 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/formula_check.py +422 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/style_audit.py +575 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
- package/templates/.agent/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
- package/templates/.agent/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
- package/templates/.agent/skills/mobile-design/SKILL.md +394 -0
- package/templates/.agent/skills/mobile-design/decision-trees.md +516 -0
- package/templates/.agent/skills/mobile-design/mobile-backend.md +491 -0
- package/templates/.agent/skills/mobile-design/mobile-color-system.md +420 -0
- package/templates/.agent/skills/mobile-design/mobile-debugging.md +122 -0
- package/templates/.agent/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/templates/.agent/skills/mobile-design/mobile-navigation.md +458 -0
- package/templates/.agent/skills/mobile-design/mobile-performance.md +767 -0
- package/templates/.agent/skills/mobile-design/mobile-testing.md +356 -0
- package/templates/.agent/skills/mobile-design/mobile-typography.md +433 -0
- package/templates/.agent/skills/mobile-design/platform-android.md +666 -0
- package/templates/.agent/skills/mobile-design/platform-ios.md +561 -0
- package/templates/.agent/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/templates/.agent/skills/mobile-design/touch-psychology.md +537 -0
- package/templates/.agent/skills/nestjs-expert/SKILL.md +552 -0
- package/templates/.agent/skills/nextjs-best-practices/SKILL.md +203 -0
- package/templates/.agent/skills/nodejs-best-practices/SKILL.md +333 -0
- package/templates/.agent/skills/parallel-agents/SKILL.md +175 -0
- package/templates/.agent/skills/performance-profiling/SKILL.md +143 -0
- package/templates/.agent/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/templates/.agent/skills/plan-writing/SKILL.md +152 -0
- package/templates/.agent/skills/powershell-windows/SKILL.md +167 -0
- package/templates/.agent/skills/ppc-advertising/SKILL.md +183 -475
- package/templates/.agent/skills/pptx-generator/SKILL.md +249 -0
- package/templates/.agent/skills/pptx-generator/references/design-system.md +392 -0
- package/templates/.agent/skills/pptx-generator/references/editing.md +162 -0
- package/templates/.agent/skills/pptx-generator/references/pitfalls.md +112 -0
- package/templates/.agent/skills/pptx-generator/references/pptxgenjs.md +420 -0
- package/templates/.agent/skills/pptx-generator/references/slide-types.md +413 -0
- package/templates/.agent/skills/prisma-expert/SKILL.md +355 -0
- package/templates/.agent/skills/python-patterns/SKILL.md +441 -0
- package/templates/.agent/skills/react-patterns/SKILL.md +198 -0
- package/templates/.agent/skills/red-team-tactics/SKILL.md +199 -0
- package/templates/.agent/skills/remotion-best-practices/SKILL.md +45 -111
- package/templates/.agent/skills/remotion-best-practices/rules/3d.md +4 -4
- package/templates/.agent/skills/remotion-best-practices/rules/animations.md +5 -7
- package/templates/.agent/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
- package/templates/.agent/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
- package/templates/.agent/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
- package/templates/.agent/skills/remotion-best-practices/rules/assets.md +78 -0
- package/templates/.agent/skills/remotion-best-practices/rules/audio-visualization.md +198 -0
- package/templates/.agent/skills/remotion-best-practices/rules/audio.md +1 -4
- package/templates/.agent/skills/remotion-best-practices/rules/calculate-metadata.md +47 -17
- package/templates/.agent/skills/remotion-best-practices/rules/can-decode.md +75 -0
- package/templates/.agent/skills/remotion-best-practices/rules/charts.md +80 -48
- package/templates/.agent/skills/remotion-best-practices/rules/compositions.md +22 -14
- package/templates/.agent/skills/remotion-best-practices/rules/display-captions.md +79 -21
- package/templates/.agent/skills/remotion-best-practices/rules/extract-frames.md +229 -0
- package/templates/.agent/skills/remotion-best-practices/rules/ffmpeg.md +38 -0
- package/templates/.agent/skills/remotion-best-practices/rules/fonts.md +96 -54
- package/templates/.agent/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
- package/templates/.agent/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
- package/templates/.agent/skills/remotion-best-practices/rules/get-video-duration.md +60 -0
- package/templates/.agent/skills/remotion-best-practices/rules/gifs.md +21 -18
- package/templates/.agent/skills/remotion-best-practices/rules/images.md +6 -2
- package/templates/.agent/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
- package/templates/.agent/skills/remotion-best-practices/rules/light-leaks.md +73 -0
- package/templates/.agent/skills/remotion-best-practices/rules/lottie.md +10 -7
- package/templates/.agent/skills/remotion-best-practices/rules/maps.md +412 -0
- package/templates/.agent/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
- package/templates/.agent/skills/remotion-best-practices/rules/measuring-text.md +140 -0
- package/templates/.agent/skills/remotion-best-practices/rules/parameters.md +109 -0
- package/templates/.agent/skills/remotion-best-practices/rules/sequencing.md +13 -1
- package/templates/.agent/skills/remotion-best-practices/rules/sfx.md +26 -0
- package/templates/.agent/skills/remotion-best-practices/rules/subtitles.md +36 -0
- package/templates/.agent/skills/remotion-best-practices/rules/tailwind.md +11 -0
- package/templates/.agent/skills/remotion-best-practices/rules/text-animations.md +4 -115
- package/templates/.agent/skills/remotion-best-practices/rules/timing.md +19 -19
- package/templates/.agent/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
- package/templates/.agent/skills/remotion-best-practices/rules/transitions.md +117 -42
- package/templates/.agent/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
- package/templates/.agent/skills/remotion-best-practices/rules/trimming.md +51 -0
- package/templates/.agent/skills/remotion-best-practices/rules/voiceover.md +99 -0
- package/templates/.agent/skills/seo-fundamentals/SKILL.md +83 -441
- package/templates/.agent/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/templates/.agent/skills/server-management/SKILL.md +161 -0
- package/templates/.agent/skills/systematic-debugging/SKILL.md +109 -0
- package/templates/.agent/skills/tdd-workflow/SKILL.md +149 -0
- package/templates/.agent/skills/testing-patterns/SKILL.md +178 -0
- package/templates/.agent/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/templates/.agent/skills/tutorial-video-expert/SKILL.md +88 -0
- package/templates/.agent/skills/typescript-expert/SKILL.md +429 -0
- package/templates/.agent/skills/ui-ux-pro-max/SKILL.md +1 -1
- package/templates/.agent/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/prompts.csv +24 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/styles.csv +59 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/templates/.agent/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/templates/.agent/skills/ui-ux-pro-max/scripts/core.py +257 -0
- package/templates/.agent/skills/ui-ux-pro-max/scripts/design_system.py +487 -0
- package/templates/.agent/skills/ui-ux-pro-max/scripts/search.py +76 -0
- package/templates/.agent/skills/vision-analysis/SKILL.md +174 -0
- package/templates/.agent/skills/vue-expert/SKILL.md +374 -0
- package/templates/.agent/skills/vulnerability-scanner/SKILL.md +276 -0
- package/templates/.agent/skills/vulnerability-scanner/checklists.md +121 -0
- package/templates/.agent/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/templates/.agent/skills/webapp-testing/SKILL.md +187 -0
- package/templates/.agent/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/templates/.agent/workflows/analyze.md +3 -0
- package/templates/.agent/workflows/brainstorm.md +113 -0
- package/templates/.agent/workflows/brand-report.md +44 -0
- package/templates/.agent/workflows/create.md +59 -0
- package/templates/.agent/workflows/debug.md +103 -0
- package/templates/.agent/workflows/deploy.md +176 -0
- package/templates/.agent/workflows/enhance.md +63 -0
- package/templates/.agent/workflows/orchestrate.md +237 -0
- package/templates/.agent/workflows/plan.md +89 -0
- package/templates/.agent/workflows/preview.md +80 -0
- package/templates/.agent/workflows/report.md +49 -0
- package/templates/.agent/workflows/status.md +86 -0
- package/templates/.agent/workflows/test.md +144 -0
- package/templates/.agent/workflows/ui-ux-pro-max.md +231 -0
|
Binary file
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
# HTML Presentation Template
|
|
2
|
+
|
|
3
|
+
Reference architecture for generating slide presentations. Every presentation follows this structure.
|
|
4
|
+
|
|
5
|
+
## Base HTML Structure
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<!DOCTYPE html>
|
|
9
|
+
<html lang="en">
|
|
10
|
+
<head>
|
|
11
|
+
<meta charset="UTF-8">
|
|
12
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
13
|
+
<title>Presentation Title</title>
|
|
14
|
+
|
|
15
|
+
<!-- Fonts: use Fontshare or Google Fonts — never system fonts -->
|
|
16
|
+
<link rel="stylesheet" href="https://api.fontshare.com/v2/css?f[]=...">
|
|
17
|
+
|
|
18
|
+
<style>
|
|
19
|
+
/* ===========================================
|
|
20
|
+
CSS CUSTOM PROPERTIES (THEME)
|
|
21
|
+
Change these to change the whole look
|
|
22
|
+
=========================================== */
|
|
23
|
+
:root {
|
|
24
|
+
/* Colors — from chosen style preset */
|
|
25
|
+
--bg-primary: #0a0f1c;
|
|
26
|
+
--bg-secondary: #111827;
|
|
27
|
+
--text-primary: #ffffff;
|
|
28
|
+
--text-secondary: #9ca3af;
|
|
29
|
+
--accent: #00ffcc;
|
|
30
|
+
--accent-glow: rgba(0, 255, 204, 0.3);
|
|
31
|
+
|
|
32
|
+
/* Typography — MUST use clamp() */
|
|
33
|
+
--font-display: 'Clash Display', sans-serif;
|
|
34
|
+
--font-body: 'Satoshi', sans-serif;
|
|
35
|
+
--title-size: clamp(2rem, 6vw, 5rem);
|
|
36
|
+
--subtitle-size: clamp(0.875rem, 2vw, 1.25rem);
|
|
37
|
+
--body-size: clamp(0.75rem, 1.2vw, 1rem);
|
|
38
|
+
|
|
39
|
+
/* Spacing — MUST use clamp() */
|
|
40
|
+
--slide-padding: clamp(1.5rem, 4vw, 4rem);
|
|
41
|
+
--content-gap: clamp(1rem, 2vw, 2rem);
|
|
42
|
+
|
|
43
|
+
/* Animation */
|
|
44
|
+
--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
|
|
45
|
+
--duration-normal: 0.6s;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* ===========================================
|
|
49
|
+
BASE STYLES
|
|
50
|
+
=========================================== */
|
|
51
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
52
|
+
|
|
53
|
+
/* --- PASTE viewport-base.css CONTENTS HERE --- */
|
|
54
|
+
|
|
55
|
+
/* ===========================================
|
|
56
|
+
ANIMATIONS
|
|
57
|
+
Trigger via .visible class (added by JS on scroll)
|
|
58
|
+
=========================================== */
|
|
59
|
+
.reveal {
|
|
60
|
+
opacity: 0;
|
|
61
|
+
transform: translateY(30px);
|
|
62
|
+
transition: opacity var(--duration-normal) var(--ease-out-expo),
|
|
63
|
+
transform var(--duration-normal) var(--ease-out-expo);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.slide.visible .reveal {
|
|
67
|
+
opacity: 1;
|
|
68
|
+
transform: translateY(0);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* Stagger children for sequential reveal */
|
|
72
|
+
.reveal:nth-child(1) { transition-delay: 0.1s; }
|
|
73
|
+
.reveal:nth-child(2) { transition-delay: 0.2s; }
|
|
74
|
+
.reveal:nth-child(3) { transition-delay: 0.3s; }
|
|
75
|
+
.reveal:nth-child(4) { transition-delay: 0.4s; }
|
|
76
|
+
|
|
77
|
+
/* ... preset-specific styles ... */
|
|
78
|
+
</style>
|
|
79
|
+
</head>
|
|
80
|
+
<body>
|
|
81
|
+
<!-- Optional: Progress bar -->
|
|
82
|
+
<div class="progress-bar"></div>
|
|
83
|
+
|
|
84
|
+
<!-- Optional: Navigation dots -->
|
|
85
|
+
<nav class="nav-dots"><!-- Generated by JS --></nav>
|
|
86
|
+
|
|
87
|
+
<!-- Slides -->
|
|
88
|
+
<section class="slide title-slide">
|
|
89
|
+
<h1 class="reveal">Presentation Title</h1>
|
|
90
|
+
<p class="reveal">Subtitle or author</p>
|
|
91
|
+
</section>
|
|
92
|
+
|
|
93
|
+
<section class="slide">
|
|
94
|
+
<div class="slide-content">
|
|
95
|
+
<h2 class="reveal">Slide Title</h2>
|
|
96
|
+
<p class="reveal">Content...</p>
|
|
97
|
+
</div>
|
|
98
|
+
</section>
|
|
99
|
+
|
|
100
|
+
<!-- More slides... -->
|
|
101
|
+
|
|
102
|
+
<script>
|
|
103
|
+
/* ===========================================
|
|
104
|
+
SLIDE PRESENTATION CONTROLLER
|
|
105
|
+
=========================================== */
|
|
106
|
+
class SlidePresentation {
|
|
107
|
+
constructor() {
|
|
108
|
+
this.slides = document.querySelectorAll('.slide');
|
|
109
|
+
this.currentSlide = 0;
|
|
110
|
+
this.setupIntersectionObserver();
|
|
111
|
+
this.setupKeyboardNav();
|
|
112
|
+
this.setupTouchNav();
|
|
113
|
+
this.setupProgressBar();
|
|
114
|
+
this.setupNavDots();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
setupIntersectionObserver() {
|
|
118
|
+
// Add .visible class when slides enter viewport
|
|
119
|
+
// Triggers CSS animations efficiently
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
setupKeyboardNav() {
|
|
123
|
+
// Arrow keys, Space, Page Up/Down
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
setupTouchNav() {
|
|
127
|
+
// Touch/swipe support for mobile
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
setupProgressBar() {
|
|
131
|
+
// Update progress bar on scroll
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
setupNavDots() {
|
|
135
|
+
// Generate and manage navigation dots
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
new SlidePresentation();
|
|
140
|
+
</script>
|
|
141
|
+
</body>
|
|
142
|
+
</html>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Required JavaScript Features
|
|
146
|
+
|
|
147
|
+
Every presentation must include:
|
|
148
|
+
|
|
149
|
+
1. **SlidePresentation Class** — Main controller with:
|
|
150
|
+
- Keyboard navigation (arrows, space, page up/down)
|
|
151
|
+
- Touch/swipe support
|
|
152
|
+
- Mouse wheel navigation
|
|
153
|
+
- Progress bar updates
|
|
154
|
+
- Navigation dots
|
|
155
|
+
|
|
156
|
+
2. **Intersection Observer** — For scroll-triggered animations:
|
|
157
|
+
- Add `.visible` class when slides enter viewport
|
|
158
|
+
- Trigger CSS transitions efficiently
|
|
159
|
+
|
|
160
|
+
3. **Optional Enhancements** (match to chosen style):
|
|
161
|
+
- Custom cursor with trail
|
|
162
|
+
- Particle system background (canvas)
|
|
163
|
+
- Parallax effects
|
|
164
|
+
- 3D tilt on hover
|
|
165
|
+
- Magnetic buttons
|
|
166
|
+
- Counter animations
|
|
167
|
+
|
|
168
|
+
4. **Inline Editing** (only if user opted in during Phase 1 — skip entirely if they said No):
|
|
169
|
+
- Edit toggle button (hidden by default, revealed via hover hotzone or `E` key)
|
|
170
|
+
- Auto-save to localStorage
|
|
171
|
+
- Export/save file functionality
|
|
172
|
+
- See "Inline Editing Implementation" section below
|
|
173
|
+
|
|
174
|
+
## Inline Editing Implementation (Opt-In Only)
|
|
175
|
+
|
|
176
|
+
**If the user chose "No" for inline editing in Phase 1, do NOT generate any edit-related HTML, CSS, or JS.**
|
|
177
|
+
|
|
178
|
+
**Do NOT use CSS `~` sibling selector for hover-based show/hide.** The CSS-only approach (`edit-hotzone:hover ~ .edit-toggle`) fails because `pointer-events: none` on the toggle button breaks the hover chain: user hovers hotzone -> button becomes visible -> mouse moves toward button -> leaves hotzone -> button disappears before click.
|
|
179
|
+
|
|
180
|
+
**Required approach: JS-based hover with 400ms delay timeout.**
|
|
181
|
+
|
|
182
|
+
HTML:
|
|
183
|
+
```html
|
|
184
|
+
<div class="edit-hotzone"></div>
|
|
185
|
+
<button class="edit-toggle" id="editToggle" title="Edit mode (E)">✏️</button>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
CSS (visibility controlled by JS classes only):
|
|
189
|
+
```css
|
|
190
|
+
/* Do NOT use CSS ~ sibling selector for this!
|
|
191
|
+
pointer-events: none breaks the hover chain.
|
|
192
|
+
Must use JS with delay timeout. */
|
|
193
|
+
.edit-hotzone {
|
|
194
|
+
position: fixed; top: 0; left: 0;
|
|
195
|
+
width: 80px; height: 80px;
|
|
196
|
+
z-index: 10000;
|
|
197
|
+
cursor: pointer;
|
|
198
|
+
}
|
|
199
|
+
.edit-toggle {
|
|
200
|
+
opacity: 0;
|
|
201
|
+
pointer-events: none;
|
|
202
|
+
transition: opacity 0.3s ease;
|
|
203
|
+
z-index: 10001;
|
|
204
|
+
}
|
|
205
|
+
.edit-toggle.show,
|
|
206
|
+
.edit-toggle.active {
|
|
207
|
+
opacity: 1;
|
|
208
|
+
pointer-events: auto;
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
JS (three interaction methods):
|
|
213
|
+
```javascript
|
|
214
|
+
// 1. Click handler on the toggle button
|
|
215
|
+
document.getElementById('editToggle').addEventListener('click', () => {
|
|
216
|
+
editor.toggleEditMode();
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// 2. Hotzone hover with 400ms grace period
|
|
220
|
+
const hotzone = document.querySelector('.edit-hotzone');
|
|
221
|
+
const editToggle = document.getElementById('editToggle');
|
|
222
|
+
let hideTimeout = null;
|
|
223
|
+
|
|
224
|
+
hotzone.addEventListener('mouseenter', () => {
|
|
225
|
+
clearTimeout(hideTimeout);
|
|
226
|
+
editToggle.classList.add('show');
|
|
227
|
+
});
|
|
228
|
+
hotzone.addEventListener('mouseleave', () => {
|
|
229
|
+
hideTimeout = setTimeout(() => {
|
|
230
|
+
if (!editor.isActive) editToggle.classList.remove('show');
|
|
231
|
+
}, 400);
|
|
232
|
+
});
|
|
233
|
+
editToggle.addEventListener('mouseenter', () => {
|
|
234
|
+
clearTimeout(hideTimeout);
|
|
235
|
+
});
|
|
236
|
+
editToggle.addEventListener('mouseleave', () => {
|
|
237
|
+
hideTimeout = setTimeout(() => {
|
|
238
|
+
if (!editor.isActive) editToggle.classList.remove('show');
|
|
239
|
+
}, 400);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
// 3. Hotzone direct click
|
|
243
|
+
hotzone.addEventListener('click', () => {
|
|
244
|
+
editor.toggleEditMode();
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// 4. Keyboard shortcut (E key, skip when editing text)
|
|
248
|
+
document.addEventListener('keydown', (e) => {
|
|
249
|
+
if ((e.key === 'e' || e.key === 'E') && !e.target.getAttribute('contenteditable')) {
|
|
250
|
+
editor.toggleEditMode();
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Image Pipeline (Skip If No Images)
|
|
256
|
+
|
|
257
|
+
If user chose "No images" in Phase 1, skip this entirely. If images were provided, process them before generating HTML.
|
|
258
|
+
|
|
259
|
+
**Dependency:** `pip install Pillow`
|
|
260
|
+
|
|
261
|
+
### Image Processing
|
|
262
|
+
|
|
263
|
+
```python
|
|
264
|
+
from PIL import Image, ImageDraw
|
|
265
|
+
|
|
266
|
+
# Circular crop (for logos on modern/clean styles)
|
|
267
|
+
def crop_circle(input_path, output_path):
|
|
268
|
+
img = Image.open(input_path).convert('RGBA')
|
|
269
|
+
w, h = img.size
|
|
270
|
+
size = min(w, h)
|
|
271
|
+
left, top = (w - size) // 2, (h - size) // 2
|
|
272
|
+
img = img.crop((left, top, left + size, top + size))
|
|
273
|
+
mask = Image.new('L', (size, size), 0)
|
|
274
|
+
ImageDraw.Draw(mask).ellipse([0, 0, size, size], fill=255)
|
|
275
|
+
img.putalpha(mask)
|
|
276
|
+
img.save(output_path, 'PNG')
|
|
277
|
+
|
|
278
|
+
# Resize (for oversized images that inflate HTML)
|
|
279
|
+
def resize_max(input_path, output_path, max_dim=1200):
|
|
280
|
+
img = Image.open(input_path)
|
|
281
|
+
img.thumbnail((max_dim, max_dim), Image.LANCZOS)
|
|
282
|
+
img.save(output_path, quality=85)
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
| Situation | Operation |
|
|
286
|
+
|-----------|-----------|
|
|
287
|
+
| Square logo on rounded aesthetic | `crop_circle()` |
|
|
288
|
+
| Image > 1MB | `resize_max(max_dim=1200)` |
|
|
289
|
+
| Wrong aspect ratio | Manual crop with `img.crop()` |
|
|
290
|
+
|
|
291
|
+
Save processed images with `_processed` suffix. Never overwrite originals.
|
|
292
|
+
|
|
293
|
+
### Image Placement
|
|
294
|
+
|
|
295
|
+
**Use direct file paths** (not base64) — presentations are viewed locally:
|
|
296
|
+
|
|
297
|
+
```html
|
|
298
|
+
<img src="assets/logo_round.png" alt="Logo" class="slide-image logo">
|
|
299
|
+
<img src="assets/screenshot.png" alt="Screenshot" class="slide-image screenshot">
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
```css
|
|
303
|
+
.slide-image {
|
|
304
|
+
max-width: 100%;
|
|
305
|
+
max-height: min(50vh, 400px);
|
|
306
|
+
object-fit: contain;
|
|
307
|
+
border-radius: 8px;
|
|
308
|
+
}
|
|
309
|
+
.slide-image.screenshot {
|
|
310
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
311
|
+
border-radius: 12px;
|
|
312
|
+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
|
|
313
|
+
}
|
|
314
|
+
.slide-image.logo {
|
|
315
|
+
max-height: min(30vh, 200px);
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**Adapt border/shadow colors to match the chosen style's accent.** Never repeat the same image on multiple slides (except logos on title + closing).
|
|
320
|
+
|
|
321
|
+
**Placement patterns:** Logo centered on title slide. Screenshots in two-column layouts with text. Full-bleed images as slide backgrounds with text overlay (use sparingly).
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Code Quality
|
|
326
|
+
|
|
327
|
+
**Comments:** Every section needs clear comments explaining what it does and how to modify it.
|
|
328
|
+
|
|
329
|
+
**Accessibility:**
|
|
330
|
+
- Semantic HTML (`<section>`, `<nav>`, `<main>`)
|
|
331
|
+
- Keyboard navigation works fully
|
|
332
|
+
- ARIA labels where needed
|
|
333
|
+
- `prefers-reduced-motion` support (included in viewport-base.css)
|
|
334
|
+
|
|
335
|
+
## File Structure
|
|
336
|
+
|
|
337
|
+
Single presentations:
|
|
338
|
+
```
|
|
339
|
+
presentation.html # Self-contained, all CSS/JS inline
|
|
340
|
+
assets/ # Images only, if any
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
Multiple presentations in one project:
|
|
344
|
+
```
|
|
345
|
+
[name].html
|
|
346
|
+
[name]-assets/
|
|
347
|
+
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from pptx import Presentation
|
|
3
|
+
from pptx.util import Inches, Pt
|
|
4
|
+
from pptx.enum.text import PP_ALIGN
|
|
5
|
+
|
|
6
|
+
def html_to_pptx(html_path, pptx_path):
|
|
7
|
+
with open(html_path, 'r', encoding='utf-8') as f:
|
|
8
|
+
html = f.read()
|
|
9
|
+
|
|
10
|
+
prs = Presentation()
|
|
11
|
+
|
|
12
|
+
# Extract slides
|
|
13
|
+
slides_raw = re.findall(r'<section class="slide.*?".*?>(.*?)</section>', html, re.DOTALL)
|
|
14
|
+
|
|
15
|
+
for slide_content in slides_raw:
|
|
16
|
+
# Create a blank slide
|
|
17
|
+
slide_layout = prs.slide_layouts[1] # Title and Content
|
|
18
|
+
slide = prs.slides.add_slide(slide_layout)
|
|
19
|
+
title_placeholder = slide.shapes.title
|
|
20
|
+
body_placeholder = slide.placeholders[1]
|
|
21
|
+
|
|
22
|
+
# Extract title (h1 or h2)
|
|
23
|
+
title_match = re.search(r'<h[12].*?>(.*?)</h[12]>', slide_content, re.DOTALL)
|
|
24
|
+
if title_match:
|
|
25
|
+
title_text = re.sub(r'<.*?>', '', title_match.group(1)).strip()
|
|
26
|
+
title_placeholder.text = title_text
|
|
27
|
+
|
|
28
|
+
# Extract body text (p and benefit-card content)
|
|
29
|
+
body_text = []
|
|
30
|
+
|
|
31
|
+
# Find paragraphs
|
|
32
|
+
paragraphs = re.findall(r'<p.*?>(.*?)</p>', slide_content, re.DOTALL)
|
|
33
|
+
for p in paragraphs:
|
|
34
|
+
text = re.sub(r'<.*?>', '', p).strip()
|
|
35
|
+
if text and not text.startswith('AI Automation'): # Skip footer
|
|
36
|
+
body_text.append(text)
|
|
37
|
+
|
|
38
|
+
# Find benefit cards or nodes
|
|
39
|
+
nodes = re.findall(r'<div class="(?:node-title|benefit-card).*?".*?>(.*?)</div>', slide_content, re.DOTALL)
|
|
40
|
+
for node in nodes:
|
|
41
|
+
text = re.sub(r'<.*?>', '', node).strip()
|
|
42
|
+
if text:
|
|
43
|
+
body_text.append(text)
|
|
44
|
+
|
|
45
|
+
# Fill body placeholder
|
|
46
|
+
if body_text:
|
|
47
|
+
tf = body_placeholder.text_frame
|
|
48
|
+
tf.text = body_text[0]
|
|
49
|
+
for i in range(1, len(body_text)):
|
|
50
|
+
p = tf.add_paragraph()
|
|
51
|
+
p.text = body_text[i]
|
|
52
|
+
p.level = 0
|
|
53
|
+
|
|
54
|
+
prs.save(pptx_path)
|
|
55
|
+
print(f"Successfully saved to {pptx_path}")
|
|
56
|
+
|
|
57
|
+
if __name__ == "__main__":
|
|
58
|
+
html_to_pptx('n8n-jupviec-automation.html', 'n8n-jupviec-automation.pptx')
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Extract all content from a PowerPoint file (.pptx).
|
|
4
|
+
Returns a JSON structure with slides, text, and images.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
python extract-pptx.py <input.pptx> [output_dir]
|
|
8
|
+
|
|
9
|
+
Requires: pip install python-pptx
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import os
|
|
14
|
+
import sys
|
|
15
|
+
from pptx import Presentation
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def extract_pptx(file_path, output_dir="."):
|
|
19
|
+
"""
|
|
20
|
+
Extract all content from a PowerPoint file.
|
|
21
|
+
Returns a list of slide data dicts with text, images, and notes.
|
|
22
|
+
"""
|
|
23
|
+
prs = Presentation(file_path)
|
|
24
|
+
slides_data = []
|
|
25
|
+
|
|
26
|
+
# Create assets directory for extracted images
|
|
27
|
+
assets_dir = os.path.join(output_dir, "assets")
|
|
28
|
+
os.makedirs(assets_dir, exist_ok=True)
|
|
29
|
+
|
|
30
|
+
for slide_num, slide in enumerate(prs.slides):
|
|
31
|
+
slide_data = {
|
|
32
|
+
"number": slide_num + 1,
|
|
33
|
+
"title": "",
|
|
34
|
+
"content": [],
|
|
35
|
+
"images": [],
|
|
36
|
+
"notes": "",
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
for shape in slide.shapes:
|
|
40
|
+
# Extract text content
|
|
41
|
+
if shape.has_text_frame:
|
|
42
|
+
if shape == slide.shapes.title:
|
|
43
|
+
slide_data["title"] = shape.text
|
|
44
|
+
else:
|
|
45
|
+
slide_data["content"].append(
|
|
46
|
+
{"type": "text", "content": shape.text}
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Extract images
|
|
50
|
+
if shape.shape_type == 13: # Picture type
|
|
51
|
+
image = shape.image
|
|
52
|
+
image_bytes = image.blob
|
|
53
|
+
image_ext = image.ext
|
|
54
|
+
image_name = f"slide{slide_num + 1}_img{len(slide_data['images']) + 1}.{image_ext}"
|
|
55
|
+
image_path = os.path.join(assets_dir, image_name)
|
|
56
|
+
|
|
57
|
+
with open(image_path, "wb") as f:
|
|
58
|
+
f.write(image_bytes)
|
|
59
|
+
|
|
60
|
+
slide_data["images"].append(
|
|
61
|
+
{
|
|
62
|
+
"path": f"assets/{image_name}",
|
|
63
|
+
"width": shape.width,
|
|
64
|
+
"height": shape.height,
|
|
65
|
+
}
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# Extract speaker notes
|
|
69
|
+
if slide.has_notes_slide:
|
|
70
|
+
notes_frame = slide.notes_slide.notes_text_frame
|
|
71
|
+
slide_data["notes"] = notes_frame.text
|
|
72
|
+
|
|
73
|
+
slides_data.append(slide_data)
|
|
74
|
+
|
|
75
|
+
return slides_data
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
if __name__ == "__main__":
|
|
79
|
+
if len(sys.argv) < 2:
|
|
80
|
+
print("Usage: python extract-pptx.py <input.pptx> [output_dir]")
|
|
81
|
+
sys.exit(1)
|
|
82
|
+
|
|
83
|
+
input_file = sys.argv[1]
|
|
84
|
+
output_dir = sys.argv[2] if len(sys.argv) > 2 else "."
|
|
85
|
+
|
|
86
|
+
slides = extract_pptx(input_file, output_dir)
|
|
87
|
+
|
|
88
|
+
# Write extracted data as JSON
|
|
89
|
+
output_path = os.path.join(output_dir, "extracted-slides.json")
|
|
90
|
+
with open(output_path, "w") as f:
|
|
91
|
+
json.dump(slides, f, indent=2)
|
|
92
|
+
|
|
93
|
+
print(f"Extracted {len(slides)} slides to {output_path}")
|
|
94
|
+
for s in slides:
|
|
95
|
+
img_count = len(s["images"])
|
|
96
|
+
print(f" Slide {s['number']}: {s['title'] or '(no title)'} — {img_count} image(s)")
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/* ===========================================
|
|
2
|
+
VIEWPORT FITTING: MANDATORY BASE STYLES
|
|
3
|
+
Include this ENTIRE file in every presentation.
|
|
4
|
+
These styles ensure slides fit exactly in the viewport.
|
|
5
|
+
=========================================== */
|
|
6
|
+
|
|
7
|
+
/* 1. Lock html/body to viewport */
|
|
8
|
+
html, body {
|
|
9
|
+
height: 100%;
|
|
10
|
+
overflow-x: hidden;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
html {
|
|
14
|
+
scroll-snap-type: y mandatory;
|
|
15
|
+
scroll-behavior: smooth;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* 2. Each slide = exact viewport height */
|
|
19
|
+
.slide {
|
|
20
|
+
width: 100vw;
|
|
21
|
+
height: 100vh;
|
|
22
|
+
height: 100dvh; /* Dynamic viewport height for mobile browsers */
|
|
23
|
+
overflow: hidden; /* CRITICAL: Prevent ANY overflow */
|
|
24
|
+
scroll-snap-align: start;
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
position: relative;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* 3. Content container with flex for centering */
|
|
31
|
+
.slide-content {
|
|
32
|
+
flex: 1;
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
justify-content: center;
|
|
36
|
+
max-height: 100%;
|
|
37
|
+
overflow: hidden; /* Double-protection against overflow */
|
|
38
|
+
padding: var(--slide-padding);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* 4. ALL typography uses clamp() for responsive scaling */
|
|
42
|
+
:root {
|
|
43
|
+
/* Titles scale from mobile to desktop */
|
|
44
|
+
--title-size: clamp(1.5rem, 5vw, 4rem);
|
|
45
|
+
--h2-size: clamp(1.25rem, 3.5vw, 2.5rem);
|
|
46
|
+
--h3-size: clamp(1rem, 2.5vw, 1.75rem);
|
|
47
|
+
|
|
48
|
+
/* Body text */
|
|
49
|
+
--body-size: clamp(0.75rem, 1.5vw, 1.125rem);
|
|
50
|
+
--small-size: clamp(0.65rem, 1vw, 0.875rem);
|
|
51
|
+
|
|
52
|
+
/* Spacing scales with viewport */
|
|
53
|
+
--slide-padding: clamp(1rem, 4vw, 4rem);
|
|
54
|
+
--content-gap: clamp(0.5rem, 2vw, 2rem);
|
|
55
|
+
--element-gap: clamp(0.25rem, 1vw, 1rem);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* 5. Cards/containers use viewport-relative max sizes */
|
|
59
|
+
.card, .container, .content-box {
|
|
60
|
+
max-width: min(90vw, 1000px);
|
|
61
|
+
max-height: min(80vh, 700px);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* 6. Lists auto-scale with viewport */
|
|
65
|
+
.feature-list, .bullet-list {
|
|
66
|
+
gap: clamp(0.4rem, 1vh, 1rem);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.feature-list li, .bullet-list li {
|
|
70
|
+
font-size: var(--body-size);
|
|
71
|
+
line-height: 1.4;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* 7. Grids adapt to available space */
|
|
75
|
+
.grid {
|
|
76
|
+
display: grid;
|
|
77
|
+
grid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr));
|
|
78
|
+
gap: clamp(0.5rem, 1.5vw, 1rem);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* 8. Images constrained to viewport */
|
|
82
|
+
img, .image-container {
|
|
83
|
+
max-width: 100%;
|
|
84
|
+
max-height: min(50vh, 400px);
|
|
85
|
+
object-fit: contain;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* ===========================================
|
|
89
|
+
RESPONSIVE BREAKPOINTS
|
|
90
|
+
Aggressive scaling for smaller viewports
|
|
91
|
+
=========================================== */
|
|
92
|
+
|
|
93
|
+
/* Short viewports (< 700px height) */
|
|
94
|
+
@media (max-height: 700px) {
|
|
95
|
+
:root {
|
|
96
|
+
--slide-padding: clamp(0.75rem, 3vw, 2rem);
|
|
97
|
+
--content-gap: clamp(0.4rem, 1.5vw, 1rem);
|
|
98
|
+
--title-size: clamp(1.25rem, 4.5vw, 2.5rem);
|
|
99
|
+
--h2-size: clamp(1rem, 3vw, 1.75rem);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Very short viewports (< 600px height) */
|
|
104
|
+
@media (max-height: 600px) {
|
|
105
|
+
:root {
|
|
106
|
+
--slide-padding: clamp(0.5rem, 2.5vw, 1.5rem);
|
|
107
|
+
--content-gap: clamp(0.3rem, 1vw, 0.75rem);
|
|
108
|
+
--title-size: clamp(1.1rem, 4vw, 2rem);
|
|
109
|
+
--body-size: clamp(0.7rem, 1.2vw, 0.95rem);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Hide non-essential elements */
|
|
113
|
+
.nav-dots, .keyboard-hint, .decorative {
|
|
114
|
+
display: none;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Extremely short (landscape phones, < 500px height) */
|
|
119
|
+
@media (max-height: 500px) {
|
|
120
|
+
:root {
|
|
121
|
+
--slide-padding: clamp(0.4rem, 2vw, 1rem);
|
|
122
|
+
--title-size: clamp(1rem, 3.5vw, 1.5rem);
|
|
123
|
+
--h2-size: clamp(0.9rem, 2.5vw, 1.25rem);
|
|
124
|
+
--body-size: clamp(0.65rem, 1vw, 0.85rem);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Narrow viewports (< 600px width) */
|
|
129
|
+
@media (max-width: 600px) {
|
|
130
|
+
:root {
|
|
131
|
+
--title-size: clamp(1.25rem, 7vw, 2.5rem);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* Stack grids vertically */
|
|
135
|
+
.grid {
|
|
136
|
+
grid-template-columns: 1fr;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* ===========================================
|
|
141
|
+
REDUCED MOTION
|
|
142
|
+
Respect user preferences
|
|
143
|
+
=========================================== */
|
|
144
|
+
@media (prefers-reduced-motion: reduce) {
|
|
145
|
+
*, *::before, *::after {
|
|
146
|
+
animation-duration: 0.01ms !important;
|
|
147
|
+
transition-duration: 0.2s !important;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
html {
|
|
151
|
+
scroll-behavior: auto;
|
|
152
|
+
}
|
|
153
|
+
}
|