@nguyenphp/antigravity-marketing 1.0.16 → 1.0.18
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 +10 -5
- package/bin/index.js +4 -4
- package/package.json +1 -1
- 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/mcp-builder/SKILL.md +176 -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/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/typescript-expert/SKILL.md +429 -0
- package/templates/.agent/skills/ui-ux-pro-max/SKILL.md +585 -170
- 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/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/brainstorm.md +113 -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/status.md +86 -0
- package/templates/.agent/workflows/test.md +144 -0
- package/templates/.agent/workflows/ui-ux-pro-max.md +231 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* validate-asset.cjs
|
|
4
|
+
*
|
|
5
|
+
* Validates marketing assets against brand guidelines.
|
|
6
|
+
* Checks: file naming, dimensions, file size, metadata.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* node validate-asset.cjs <asset-path>
|
|
10
|
+
* node validate-asset.cjs <asset-path> --json
|
|
11
|
+
* node validate-asset.cjs <asset-path> --fix
|
|
12
|
+
*
|
|
13
|
+
* For color validation of images, use with extract-colors.cjs
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const fs = require("fs");
|
|
17
|
+
const path = require("path");
|
|
18
|
+
|
|
19
|
+
// Validation rules
|
|
20
|
+
const RULES = {
|
|
21
|
+
naming: {
|
|
22
|
+
pattern: /^[a-z]+_[a-z0-9-]+_[a-z0-9-]+_\d{8}(_[a-z0-9-]+)?\.[a-z]+$/,
|
|
23
|
+
description:
|
|
24
|
+
"{type}_{campaign}_{description}_{timestamp}_{variant}.{ext}",
|
|
25
|
+
examples: [
|
|
26
|
+
"banner_claude-launch_hero-image_20251209.png",
|
|
27
|
+
"logo_brand-refresh_horizontal_20251209_dark.svg",
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
dimensions: {
|
|
31
|
+
banner: { minWidth: 600, minHeight: 300 },
|
|
32
|
+
logo: { minWidth: 100, minHeight: 100 },
|
|
33
|
+
design: { minWidth: 800, minHeight: 600 },
|
|
34
|
+
video: { minWidth: 640, minHeight: 480 },
|
|
35
|
+
default: { minWidth: 100, minHeight: 100 },
|
|
36
|
+
},
|
|
37
|
+
fileSize: {
|
|
38
|
+
image: { max: 5 * 1024 * 1024, recommended: 1 * 1024 * 1024 },
|
|
39
|
+
video: { max: 100 * 1024 * 1024, recommended: 50 * 1024 * 1024 },
|
|
40
|
+
svg: { max: 500 * 1024, recommended: 100 * 1024 },
|
|
41
|
+
},
|
|
42
|
+
formats: {
|
|
43
|
+
image: ["png", "jpg", "jpeg", "webp", "gif"],
|
|
44
|
+
vector: ["svg"],
|
|
45
|
+
video: ["mp4", "mov", "webm"],
|
|
46
|
+
document: ["pdf", "psd", "ai", "fig"],
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Parse asset filename
|
|
52
|
+
*/
|
|
53
|
+
function parseFilename(filename) {
|
|
54
|
+
const parts = filename.replace(/\.[^.]+$/, "").split("_");
|
|
55
|
+
|
|
56
|
+
if (parts.length < 4) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
type: parts[0],
|
|
62
|
+
campaign: parts[1],
|
|
63
|
+
description: parts[2],
|
|
64
|
+
timestamp: parts[3],
|
|
65
|
+
variant: parts.length > 4 ? parts[4] : null,
|
|
66
|
+
extension: path.extname(filename).slice(1).toLowerCase(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Validate filename convention
|
|
72
|
+
*/
|
|
73
|
+
function validateFilename(filename) {
|
|
74
|
+
const issues = [];
|
|
75
|
+
const suggestions = [];
|
|
76
|
+
|
|
77
|
+
// Check pattern match
|
|
78
|
+
if (!RULES.naming.pattern.test(filename)) {
|
|
79
|
+
issues.push("Filename does not match naming convention");
|
|
80
|
+
suggestions.push(`Expected format: ${RULES.naming.description}`);
|
|
81
|
+
suggestions.push(`Examples: ${RULES.naming.examples.join(", ")}`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Parse and check components
|
|
85
|
+
const parsed = parseFilename(filename);
|
|
86
|
+
if (parsed) {
|
|
87
|
+
// Check timestamp format
|
|
88
|
+
if (!/^\d{8}$/.test(parsed.timestamp)) {
|
|
89
|
+
issues.push("Timestamp should be YYYYMMDD format");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Check kebab-case for campaign and description
|
|
93
|
+
if (parsed.campaign && !/^[a-z0-9-]+$/.test(parsed.campaign)) {
|
|
94
|
+
issues.push("Campaign name should be kebab-case");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (parsed.description && !/^[a-z0-9-]+$/.test(parsed.description)) {
|
|
98
|
+
issues.push("Description should be kebab-case");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Check valid type
|
|
102
|
+
const validTypes = [
|
|
103
|
+
"banner",
|
|
104
|
+
"logo",
|
|
105
|
+
"design",
|
|
106
|
+
"video",
|
|
107
|
+
"infographic",
|
|
108
|
+
"icon",
|
|
109
|
+
"photo",
|
|
110
|
+
];
|
|
111
|
+
if (!validTypes.includes(parsed.type)) {
|
|
112
|
+
suggestions.push(`Consider using type: ${validTypes.join(", ")}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return { valid: issues.length === 0, issues, suggestions, parsed };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Validate file size
|
|
121
|
+
*/
|
|
122
|
+
function validateFileSize(filepath, extension) {
|
|
123
|
+
const issues = [];
|
|
124
|
+
const warnings = [];
|
|
125
|
+
|
|
126
|
+
const stats = fs.statSync(filepath);
|
|
127
|
+
const size = stats.size;
|
|
128
|
+
|
|
129
|
+
let limits;
|
|
130
|
+
if (RULES.formats.video.includes(extension)) {
|
|
131
|
+
limits = RULES.fileSize.video;
|
|
132
|
+
} else if (extension === "svg") {
|
|
133
|
+
limits = RULES.fileSize.svg;
|
|
134
|
+
} else {
|
|
135
|
+
limits = RULES.fileSize.image;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (size > limits.max) {
|
|
139
|
+
issues.push(
|
|
140
|
+
`File size (${formatBytes(size)}) exceeds maximum (${formatBytes(
|
|
141
|
+
limits.max
|
|
142
|
+
)})`
|
|
143
|
+
);
|
|
144
|
+
} else if (size > limits.recommended) {
|
|
145
|
+
warnings.push(
|
|
146
|
+
`File size (${formatBytes(size)}) exceeds recommended (${formatBytes(
|
|
147
|
+
limits.recommended
|
|
148
|
+
)})`
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return { valid: issues.length === 0, issues, warnings, size };
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Validate file format
|
|
157
|
+
*/
|
|
158
|
+
function validateFormat(extension) {
|
|
159
|
+
const issues = [];
|
|
160
|
+
const info = { category: null };
|
|
161
|
+
|
|
162
|
+
const allFormats = [
|
|
163
|
+
...RULES.formats.image,
|
|
164
|
+
...RULES.formats.vector,
|
|
165
|
+
...RULES.formats.video,
|
|
166
|
+
...RULES.formats.document,
|
|
167
|
+
];
|
|
168
|
+
|
|
169
|
+
if (!allFormats.includes(extension)) {
|
|
170
|
+
issues.push(`Unsupported file format: .${extension}`);
|
|
171
|
+
return { valid: false, issues, info };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Determine category
|
|
175
|
+
if (RULES.formats.image.includes(extension)) info.category = "image";
|
|
176
|
+
else if (RULES.formats.vector.includes(extension)) info.category = "vector";
|
|
177
|
+
else if (RULES.formats.video.includes(extension)) info.category = "video";
|
|
178
|
+
else if (RULES.formats.document.includes(extension))
|
|
179
|
+
info.category = "document";
|
|
180
|
+
|
|
181
|
+
return { valid: true, issues, info };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Check if asset exists in manifest
|
|
186
|
+
*/
|
|
187
|
+
function checkManifest(filepath) {
|
|
188
|
+
const manifestPath = path.join(process.cwd(), ".assets", "manifest.json");
|
|
189
|
+
|
|
190
|
+
if (!fs.existsSync(manifestPath)) {
|
|
191
|
+
return { registered: false, message: "Manifest not found" };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
try {
|
|
195
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
196
|
+
const relativePath = path.relative(process.cwd(), filepath);
|
|
197
|
+
const found = manifest.assets?.find(
|
|
198
|
+
(a) => a.path === relativePath || a.path === filepath
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
return {
|
|
202
|
+
registered: !!found,
|
|
203
|
+
message: found ? "Asset registered in manifest" : "Asset not in manifest",
|
|
204
|
+
asset: found,
|
|
205
|
+
};
|
|
206
|
+
} catch {
|
|
207
|
+
return { registered: false, message: "Error reading manifest" };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Generate suggested filename
|
|
213
|
+
*/
|
|
214
|
+
function suggestFilename(original, parsed) {
|
|
215
|
+
if (!parsed) return null;
|
|
216
|
+
|
|
217
|
+
const today = new Date().toISOString().slice(0, 10).replace(/-/g, "");
|
|
218
|
+
const type = parsed.type || "asset";
|
|
219
|
+
const campaign = parsed.campaign || "general";
|
|
220
|
+
const description = parsed.description || "untitled";
|
|
221
|
+
const ext = parsed.extension || "png";
|
|
222
|
+
|
|
223
|
+
return `${type}_${campaign}_${description}_${today}.${ext}`;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Format bytes to human readable
|
|
228
|
+
*/
|
|
229
|
+
function formatBytes(bytes) {
|
|
230
|
+
if (bytes === 0) return "0 Bytes";
|
|
231
|
+
const k = 1024;
|
|
232
|
+
const sizes = ["Bytes", "KB", "MB", "GB"];
|
|
233
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
234
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Main validation function
|
|
239
|
+
*/
|
|
240
|
+
function validateAsset(assetPath) {
|
|
241
|
+
const results = {
|
|
242
|
+
path: assetPath,
|
|
243
|
+
filename: path.basename(assetPath),
|
|
244
|
+
valid: true,
|
|
245
|
+
issues: [],
|
|
246
|
+
warnings: [],
|
|
247
|
+
suggestions: [],
|
|
248
|
+
checks: {},
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
// Check file exists
|
|
252
|
+
if (!fs.existsSync(assetPath)) {
|
|
253
|
+
results.valid = false;
|
|
254
|
+
results.issues.push(`File not found: ${assetPath}`);
|
|
255
|
+
return results;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const filename = path.basename(assetPath);
|
|
259
|
+
const extension = path.extname(filename).slice(1).toLowerCase();
|
|
260
|
+
|
|
261
|
+
// 1. Validate filename
|
|
262
|
+
const filenameResult = validateFilename(filename);
|
|
263
|
+
results.checks.filename = filenameResult;
|
|
264
|
+
if (!filenameResult.valid) {
|
|
265
|
+
results.issues.push(...filenameResult.issues);
|
|
266
|
+
results.suggestions.push(...filenameResult.suggestions);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// 2. Validate format
|
|
270
|
+
const formatResult = validateFormat(extension);
|
|
271
|
+
results.checks.format = formatResult;
|
|
272
|
+
if (!formatResult.valid) {
|
|
273
|
+
results.issues.push(...formatResult.issues);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// 3. Validate file size
|
|
277
|
+
const sizeResult = validateFileSize(assetPath, extension);
|
|
278
|
+
results.checks.fileSize = sizeResult;
|
|
279
|
+
if (!sizeResult.valid) {
|
|
280
|
+
results.issues.push(...sizeResult.issues);
|
|
281
|
+
}
|
|
282
|
+
results.warnings.push(...sizeResult.warnings);
|
|
283
|
+
|
|
284
|
+
// 4. Check manifest registration
|
|
285
|
+
const manifestResult = checkManifest(assetPath);
|
|
286
|
+
results.checks.manifest = manifestResult;
|
|
287
|
+
if (!manifestResult.registered) {
|
|
288
|
+
results.warnings.push("Asset not registered in manifest.json");
|
|
289
|
+
results.suggestions.push(
|
|
290
|
+
"Register asset in .assets/manifest.json for tracking"
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// 5. Suggest corrected filename if needed
|
|
295
|
+
if (!filenameResult.valid && filenameResult.parsed) {
|
|
296
|
+
const suggested = suggestFilename(filename, filenameResult.parsed);
|
|
297
|
+
if (suggested) {
|
|
298
|
+
results.suggestions.push(`Suggested filename: ${suggested}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Overall validity
|
|
303
|
+
results.valid = results.issues.length === 0;
|
|
304
|
+
|
|
305
|
+
return results;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Format output for console
|
|
310
|
+
*/
|
|
311
|
+
function formatOutput(results) {
|
|
312
|
+
const lines = [];
|
|
313
|
+
|
|
314
|
+
lines.push("\n" + "=".repeat(60));
|
|
315
|
+
lines.push(`ASSET VALIDATION: ${results.filename}`);
|
|
316
|
+
lines.push("=".repeat(60));
|
|
317
|
+
|
|
318
|
+
lines.push(`\nStatus: ${results.valid ? "PASS" : "FAIL"}`);
|
|
319
|
+
lines.push(`Path: ${results.path}`);
|
|
320
|
+
|
|
321
|
+
if (results.issues.length > 0) {
|
|
322
|
+
lines.push("\nISSUES:");
|
|
323
|
+
results.issues.forEach((issue) => lines.push(` - ${issue}`));
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
if (results.warnings.length > 0) {
|
|
327
|
+
lines.push("\nWARNINGS:");
|
|
328
|
+
results.warnings.forEach((warning) => lines.push(` - ${warning}`));
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (results.suggestions.length > 0) {
|
|
332
|
+
lines.push("\nSUGGESTIONS:");
|
|
333
|
+
results.suggestions.forEach((suggestion) =>
|
|
334
|
+
lines.push(` - ${suggestion}`)
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// File size info
|
|
339
|
+
if (results.checks.fileSize?.size) {
|
|
340
|
+
lines.push(`\nFile Size: ${formatBytes(results.checks.fileSize.size)}`);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
lines.push("\n" + "=".repeat(60));
|
|
344
|
+
|
|
345
|
+
return lines.join("\n");
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Main
|
|
350
|
+
*/
|
|
351
|
+
function main() {
|
|
352
|
+
const args = process.argv.slice(2);
|
|
353
|
+
const jsonOutput = args.includes("--json");
|
|
354
|
+
const assetPath = args.find((a) => !a.startsWith("--"));
|
|
355
|
+
|
|
356
|
+
if (!assetPath) {
|
|
357
|
+
console.error("Usage: node validate-asset.cjs <asset-path> [--json]");
|
|
358
|
+
console.error("\nExamples:");
|
|
359
|
+
console.error(
|
|
360
|
+
" node validate-asset.cjs assets/banners/social-media/banner_launch_hero_20251209.png"
|
|
361
|
+
);
|
|
362
|
+
console.error(
|
|
363
|
+
" node validate-asset.cjs assets/logos/icon-only/logo-icon.svg --json"
|
|
364
|
+
);
|
|
365
|
+
process.exit(1);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Resolve path
|
|
369
|
+
const resolvedPath = path.isAbsolute(assetPath)
|
|
370
|
+
? assetPath
|
|
371
|
+
: path.join(process.cwd(), assetPath);
|
|
372
|
+
|
|
373
|
+
// Validate
|
|
374
|
+
const results = validateAsset(resolvedPath);
|
|
375
|
+
|
|
376
|
+
// Output
|
|
377
|
+
if (jsonOutput) {
|
|
378
|
+
console.log(JSON.stringify(results, null, 2));
|
|
379
|
+
} else {
|
|
380
|
+
console.log(formatOutput(results));
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Exit with appropriate code
|
|
384
|
+
process.exit(results.valid ? 0 : 1);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
main();
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
# Brand Guidelines v1.0
|
|
2
|
+
|
|
3
|
+
> Last updated: {DATE}
|
|
4
|
+
> Status: Draft
|
|
5
|
+
|
|
6
|
+
## Quick Reference
|
|
7
|
+
|
|
8
|
+
| Element | Value |
|
|
9
|
+
|---------|-------|
|
|
10
|
+
| Primary Color | #2563EB |
|
|
11
|
+
| Secondary Color | #8B5CF6 |
|
|
12
|
+
| Primary Font | Inter |
|
|
13
|
+
| Voice | Professional, Helpful, Clear |
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. Color Palette
|
|
18
|
+
|
|
19
|
+
### Primary Colors
|
|
20
|
+
|
|
21
|
+
| Name | Hex | RGB | Usage |
|
|
22
|
+
|------|-----|-----|-------|
|
|
23
|
+
| Primary Blue | #2563EB | rgb(37,99,235) | CTAs, headers, links |
|
|
24
|
+
| Primary Dark | #1D4ED8 | rgb(29,78,216) | Hover states, emphasis |
|
|
25
|
+
|
|
26
|
+
### Secondary Colors
|
|
27
|
+
|
|
28
|
+
| Name | Hex | RGB | Usage |
|
|
29
|
+
|------|-----|-----|-------|
|
|
30
|
+
| Secondary Purple | #8B5CF6 | rgb(139,92,246) | Accents, highlights |
|
|
31
|
+
| Accent Green | #10B981 | rgb(16,185,129) | Success, positive states |
|
|
32
|
+
|
|
33
|
+
### Neutral Palette
|
|
34
|
+
|
|
35
|
+
| Name | Hex | RGB | Usage |
|
|
36
|
+
|------|-----|-----|-------|
|
|
37
|
+
| Background | #FFFFFF | rgb(255,255,255) | Page backgrounds |
|
|
38
|
+
| Surface | #F9FAFB | rgb(249,250,251) | Cards, sections |
|
|
39
|
+
| Text Primary | #111827 | rgb(17,24,39) | Headings, body text |
|
|
40
|
+
| Text Secondary | #6B7280 | rgb(107,114,128) | Captions, muted text |
|
|
41
|
+
| Border | #E5E7EB | rgb(229,231,235) | Dividers, borders |
|
|
42
|
+
|
|
43
|
+
### Semantic Colors
|
|
44
|
+
|
|
45
|
+
| State | Hex | Usage |
|
|
46
|
+
|-------|-----|-------|
|
|
47
|
+
| Success | #22C55E | Positive actions, confirmations |
|
|
48
|
+
| Warning | #F59E0B | Cautions, pending states |
|
|
49
|
+
| Error | #EF4444 | Errors, destructive actions |
|
|
50
|
+
| Info | #3B82F6 | Informational messages |
|
|
51
|
+
|
|
52
|
+
### Accessibility
|
|
53
|
+
|
|
54
|
+
- Text on white background: 7.2:1 contrast ratio (AAA)
|
|
55
|
+
- Primary on white: 4.6:1 contrast ratio (AA)
|
|
56
|
+
- All interactive elements meet WCAG 2.1 AA standards
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 2. Typography
|
|
61
|
+
|
|
62
|
+
### Font Stack
|
|
63
|
+
|
|
64
|
+
```css
|
|
65
|
+
--font-heading: 'Inter', system-ui, -apple-system, sans-serif;
|
|
66
|
+
--font-body: 'Inter', system-ui, -apple-system, sans-serif;
|
|
67
|
+
--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Type Scale
|
|
71
|
+
|
|
72
|
+
| Element | Size (Desktop) | Size (Mobile) | Weight | Line Height |
|
|
73
|
+
|---------|----------------|---------------|--------|-------------|
|
|
74
|
+
| H1 | 48px | 32px | 700 | 1.2 |
|
|
75
|
+
| H2 | 36px | 28px | 600 | 1.25 |
|
|
76
|
+
| H3 | 28px | 24px | 600 | 1.3 |
|
|
77
|
+
| H4 | 24px | 20px | 600 | 1.35 |
|
|
78
|
+
| Body | 16px | 16px | 400 | 1.5 |
|
|
79
|
+
| Body Large | 18px | 18px | 400 | 1.6 |
|
|
80
|
+
| Small | 14px | 14px | 400 | 1.5 |
|
|
81
|
+
| Caption | 12px | 12px | 400 | 1.4 |
|
|
82
|
+
|
|
83
|
+
### Font Loading
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
87
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 3. Logo Usage
|
|
93
|
+
|
|
94
|
+
### Variants
|
|
95
|
+
|
|
96
|
+
| Variant | File | Use Case |
|
|
97
|
+
|---------|------|----------|
|
|
98
|
+
| Full Horizontal | logo-full-horizontal.svg | Headers, documents |
|
|
99
|
+
| Stacked | logo-stacked.svg | Square spaces |
|
|
100
|
+
| Icon Only | logo-icon.svg | Favicons, small spaces |
|
|
101
|
+
| Monochrome | logo-mono.svg | Limited color contexts |
|
|
102
|
+
|
|
103
|
+
### Clear Space
|
|
104
|
+
|
|
105
|
+
Minimum clear space = height of the logo icon (mark)
|
|
106
|
+
|
|
107
|
+
### Minimum Size
|
|
108
|
+
|
|
109
|
+
| Context | Minimum Width |
|
|
110
|
+
|---------|---------------|
|
|
111
|
+
| Digital - Full Logo | 120px |
|
|
112
|
+
| Digital - Icon | 24px |
|
|
113
|
+
| Print - Full Logo | 35mm |
|
|
114
|
+
| Print - Icon | 10mm |
|
|
115
|
+
|
|
116
|
+
### Don'ts
|
|
117
|
+
|
|
118
|
+
- Don't rotate or skew the logo
|
|
119
|
+
- Don't change colors outside approved palette
|
|
120
|
+
- Don't add shadows or effects
|
|
121
|
+
- Don't crop or modify proportions
|
|
122
|
+
- Don't place on busy backgrounds without sufficient contrast
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 4. Voice & Tone
|
|
127
|
+
|
|
128
|
+
### Brand Personality
|
|
129
|
+
|
|
130
|
+
| Trait | Description |
|
|
131
|
+
|-------|-------------|
|
|
132
|
+
| **Professional** | Expert knowledge, authoritative yet approachable |
|
|
133
|
+
| **Helpful** | Solution-focused, actionable guidance |
|
|
134
|
+
| **Clear** | Direct communication, jargon-free |
|
|
135
|
+
| **Confident** | Assured without being arrogant |
|
|
136
|
+
|
|
137
|
+
### Voice Chart
|
|
138
|
+
|
|
139
|
+
| Trait | We Are | We Are Not |
|
|
140
|
+
|-------|--------|------------|
|
|
141
|
+
| Professional | Expert, knowledgeable | Stuffy, corporate |
|
|
142
|
+
| Helpful | Supportive, empowering | Patronizing |
|
|
143
|
+
| Clear | Direct, concise | Vague, wordy |
|
|
144
|
+
| Confident | Assured, trustworthy | Arrogant, overselling |
|
|
145
|
+
|
|
146
|
+
### Tone by Context
|
|
147
|
+
|
|
148
|
+
| Context | Tone | Example |
|
|
149
|
+
|---------|------|---------|
|
|
150
|
+
| Marketing | Engaging, benefit-focused | "Create campaigns that convert." |
|
|
151
|
+
| Documentation | Clear, instructional | "Run the command to start." |
|
|
152
|
+
| Error messages | Calm, solution-focused | "Try refreshing the page." |
|
|
153
|
+
| Success | Brief, celebratory | "Campaign published!" |
|
|
154
|
+
|
|
155
|
+
### Prohibited Terms
|
|
156
|
+
|
|
157
|
+
| Avoid | Reason |
|
|
158
|
+
|-------|--------|
|
|
159
|
+
| Revolutionary | Overused |
|
|
160
|
+
| Best-in-class | Vague claim |
|
|
161
|
+
| Seamless | Overused |
|
|
162
|
+
| Synergy | Corporate jargon |
|
|
163
|
+
| Leverage | Use "use" instead |
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 5. Imagery Guidelines
|
|
168
|
+
|
|
169
|
+
### Photography Style
|
|
170
|
+
|
|
171
|
+
- **Lighting:** Natural, soft lighting preferred
|
|
172
|
+
- **Subjects:** Real people, authentic scenarios
|
|
173
|
+
- **Color treatment:** Maintain brand colors in post
|
|
174
|
+
- **Composition:** Clean, focused subjects
|
|
175
|
+
|
|
176
|
+
### Illustrations
|
|
177
|
+
|
|
178
|
+
- Style: Modern, flat design with subtle gradients
|
|
179
|
+
- Colors: Brand palette only
|
|
180
|
+
- Line weight: 2px consistent stroke
|
|
181
|
+
- Corners: 4px rounded
|
|
182
|
+
|
|
183
|
+
### Icons
|
|
184
|
+
|
|
185
|
+
- Style: Outlined, 24px base grid
|
|
186
|
+
- Stroke: 1.5px consistent
|
|
187
|
+
- Corner radius: 2px
|
|
188
|
+
- Fill: None (outline only)
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 6. Design Components
|
|
193
|
+
|
|
194
|
+
### Buttons
|
|
195
|
+
|
|
196
|
+
| Type | Background | Text | Border Radius |
|
|
197
|
+
|------|------------|------|---------------|
|
|
198
|
+
| Primary | #2563EB | #FFFFFF | 8px |
|
|
199
|
+
| Secondary | Transparent | #2563EB | 8px |
|
|
200
|
+
| Tertiary | Transparent | #6B7280 | 8px |
|
|
201
|
+
|
|
202
|
+
### Spacing Scale
|
|
203
|
+
|
|
204
|
+
| Token | Value | Usage |
|
|
205
|
+
|-------|-------|-------|
|
|
206
|
+
| xs | 4px | Tight spacing |
|
|
207
|
+
| sm | 8px | Compact elements |
|
|
208
|
+
| md | 16px | Standard spacing |
|
|
209
|
+
| lg | 24px | Section spacing |
|
|
210
|
+
| xl | 32px | Large gaps |
|
|
211
|
+
| 2xl | 48px | Section dividers |
|
|
212
|
+
|
|
213
|
+
### Border Radius
|
|
214
|
+
|
|
215
|
+
| Element | Radius |
|
|
216
|
+
|---------|--------|
|
|
217
|
+
| Buttons | 8px |
|
|
218
|
+
| Cards | 12px |
|
|
219
|
+
| Inputs | 8px |
|
|
220
|
+
| Modals | 16px |
|
|
221
|
+
| Pills/Tags | 9999px |
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## AI Image Generation
|
|
226
|
+
|
|
227
|
+
### Base Prompt Template
|
|
228
|
+
|
|
229
|
+
Always prepend to image generation prompts:
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
{DESCRIBE YOUR VISUAL STYLE HERE - mood, colors with hex codes, lighting, atmosphere}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Style Keywords
|
|
236
|
+
|
|
237
|
+
| Category | Keywords |
|
|
238
|
+
|----------|----------|
|
|
239
|
+
| **Lighting** | {e.g., soft lighting, dramatic, natural} |
|
|
240
|
+
| **Mood** | {e.g., professional, energetic, calm} |
|
|
241
|
+
| **Composition** | {e.g., centered, rule of thirds, minimal} |
|
|
242
|
+
| **Treatment** | {e.g., high contrast, muted, vibrant} |
|
|
243
|
+
| **Aesthetic** | {e.g., modern, vintage, minimalist} |
|
|
244
|
+
|
|
245
|
+
### Visual Mood Descriptors
|
|
246
|
+
|
|
247
|
+
- {Mood descriptor 1}
|
|
248
|
+
- {Mood descriptor 2}
|
|
249
|
+
- {Mood descriptor 3}
|
|
250
|
+
|
|
251
|
+
### Visual Don'ts
|
|
252
|
+
|
|
253
|
+
| Avoid | Reason |
|
|
254
|
+
|-------|--------|
|
|
255
|
+
| {Item to avoid} | {Why to avoid it} |
|
|
256
|
+
|
|
257
|
+
### Example Prompts
|
|
258
|
+
|
|
259
|
+
**Hero Banner:**
|
|
260
|
+
```
|
|
261
|
+
{Example prompt for hero banners}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**Social Media Post:**
|
|
265
|
+
```
|
|
266
|
+
{Example prompt for social graphics}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Changelog
|
|
272
|
+
|
|
273
|
+
| Version | Date | Changes |
|
|
274
|
+
|---------|------|---------|
|
|
275
|
+
| 1.0 | {DATE} | Initial guidelines |
|