ui-ux-pro-max-cli 2.8.8
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 +99 -0
- package/assets/data/_sync_all.py +414 -0
- package/assets/data/app-interface.csv +31 -0
- package/assets/data/charts.csv +26 -0
- package/assets/data/colors.csv +162 -0
- package/assets/data/design.csv +1776 -0
- package/assets/data/draft.csv +1779 -0
- package/assets/data/google-fonts.csv +1924 -0
- package/assets/data/icons.csv +106 -0
- package/assets/data/landing.csv +35 -0
- package/assets/data/products.csv +162 -0
- package/assets/data/react-performance.csv +45 -0
- package/assets/data/stacks/angular.csv +51 -0
- package/assets/data/stacks/astro.csv +54 -0
- package/assets/data/stacks/flutter.csv +53 -0
- package/assets/data/stacks/html-tailwind.csv +56 -0
- package/assets/data/stacks/javafx.csv +76 -0
- package/assets/data/stacks/jetpack-compose.csv +53 -0
- package/assets/data/stacks/laravel.csv +51 -0
- package/assets/data/stacks/nextjs.csv +53 -0
- package/assets/data/stacks/nuxt-ui.csv +71 -0
- package/assets/data/stacks/nuxtjs.csv +59 -0
- package/assets/data/stacks/react-native.csv +52 -0
- package/assets/data/stacks/react.csv +54 -0
- package/assets/data/stacks/shadcn.csv +61 -0
- package/assets/data/stacks/svelte.csv +54 -0
- package/assets/data/stacks/swiftui.csv +51 -0
- package/assets/data/stacks/threejs.csv +54 -0
- package/assets/data/stacks/vue.csv +50 -0
- package/assets/data/styles.csv +85 -0
- package/assets/data/typography.csv +74 -0
- package/assets/data/ui-reasoning.csv +162 -0
- package/assets/data/ux-guidelines.csv +100 -0
- package/assets/scripts/core.py +263 -0
- package/assets/scripts/design_system.py +1157 -0
- package/assets/scripts/search.py +114 -0
- package/assets/skills/banner-design/SKILL.md +196 -0
- package/assets/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
- package/assets/skills/brand/SKILL.md +97 -0
- package/assets/skills/brand/references/approval-checklist.md +169 -0
- package/assets/skills/brand/references/asset-organization.md +157 -0
- package/assets/skills/brand/references/brand-guideline-template.md +140 -0
- package/assets/skills/brand/references/color-palette-management.md +186 -0
- package/assets/skills/brand/references/consistency-checklist.md +94 -0
- package/assets/skills/brand/references/logo-usage-rules.md +185 -0
- package/assets/skills/brand/references/messaging-framework.md +85 -0
- package/assets/skills/brand/references/typography-specifications.md +214 -0
- package/assets/skills/brand/references/update.md +118 -0
- package/assets/skills/brand/references/visual-identity.md +96 -0
- package/assets/skills/brand/references/voice-framework.md +88 -0
- package/assets/skills/brand/scripts/extract-colors.cjs +341 -0
- package/assets/skills/brand/scripts/inject-brand-context.cjs +349 -0
- package/assets/skills/brand/scripts/sync-brand-to-tokens.cjs +266 -0
- package/assets/skills/brand/scripts/validate-asset.cjs +387 -0
- package/assets/skills/brand/templates/brand-guidelines-starter.md +275 -0
- package/assets/skills/design/SKILL.md +313 -0
- package/assets/skills/design/data/cip/deliverables.csv +51 -0
- package/assets/skills/design/data/cip/industries.csv +21 -0
- package/assets/skills/design/data/cip/mockup-contexts.csv +21 -0
- package/assets/skills/design/data/cip/styles.csv +21 -0
- package/assets/skills/design/data/icon/styles.csv +16 -0
- package/assets/skills/design/data/logo/colors.csv +56 -0
- package/assets/skills/design/data/logo/industries.csv +56 -0
- package/assets/skills/design/data/logo/styles.csv +56 -0
- package/assets/skills/design/references/banner-sizes-and-styles.md +118 -0
- package/assets/skills/design/references/cip-deliverable-guide.md +95 -0
- package/assets/skills/design/references/cip-design.md +121 -0
- package/assets/skills/design/references/cip-prompt-engineering.md +84 -0
- package/assets/skills/design/references/cip-style-guide.md +68 -0
- package/assets/skills/design/references/design-routing.md +207 -0
- package/assets/skills/design/references/icon-design.md +122 -0
- package/assets/skills/design/references/logo-color-psychology.md +101 -0
- package/assets/skills/design/references/logo-design.md +92 -0
- package/assets/skills/design/references/logo-prompt-engineering.md +158 -0
- package/assets/skills/design/references/logo-style-guide.md +109 -0
- package/assets/skills/design/references/slides-copywriting-formulas.md +84 -0
- package/assets/skills/design/references/slides-create.md +4 -0
- package/assets/skills/design/references/slides-html-template.md +295 -0
- package/assets/skills/design/references/slides-layout-patterns.md +137 -0
- package/assets/skills/design/references/slides-strategies.md +94 -0
- package/assets/skills/design/references/slides.md +42 -0
- package/assets/skills/design/references/social-photos-design.md +329 -0
- package/assets/skills/design/scripts/cip/core.py +215 -0
- package/assets/skills/design/scripts/cip/generate.py +484 -0
- package/assets/skills/design/scripts/cip/render-html.py +424 -0
- package/assets/skills/design/scripts/cip/search.py +127 -0
- package/assets/skills/design/scripts/icon/generate.py +487 -0
- package/assets/skills/design/scripts/logo/core.py +175 -0
- package/assets/skills/design/scripts/logo/generate.py +362 -0
- package/assets/skills/design/scripts/logo/search.py +114 -0
- package/assets/skills/design-system/SKILL.md +244 -0
- package/assets/skills/design-system/data/slide-backgrounds.csv +11 -0
- package/assets/skills/design-system/data/slide-charts.csv +26 -0
- package/assets/skills/design-system/data/slide-color-logic.csv +14 -0
- package/assets/skills/design-system/data/slide-copy.csv +26 -0
- package/assets/skills/design-system/data/slide-layout-logic.csv +16 -0
- package/assets/skills/design-system/data/slide-layouts.csv +26 -0
- package/assets/skills/design-system/data/slide-strategies.csv +16 -0
- package/assets/skills/design-system/data/slide-typography.csv +15 -0
- package/assets/skills/design-system/references/component-specs.md +236 -0
- package/assets/skills/design-system/references/component-tokens.md +214 -0
- package/assets/skills/design-system/references/primitive-tokens.md +203 -0
- package/assets/skills/design-system/references/semantic-tokens.md +215 -0
- package/assets/skills/design-system/references/states-and-variants.md +241 -0
- package/assets/skills/design-system/references/tailwind-integration.md +251 -0
- package/assets/skills/design-system/references/token-architecture.md +224 -0
- package/assets/skills/design-system/scripts/embed-tokens.cjs +99 -0
- package/assets/skills/design-system/scripts/fetch-background.py +317 -0
- package/assets/skills/design-system/scripts/generate-slide.py +770 -0
- package/assets/skills/design-system/scripts/generate-tokens.cjs +205 -0
- package/assets/skills/design-system/scripts/html-token-validator.py +327 -0
- package/assets/skills/design-system/scripts/search-slides.py +218 -0
- package/assets/skills/design-system/scripts/slide-token-validator.py +35 -0
- package/assets/skills/design-system/scripts/slide_search_core.py +453 -0
- package/assets/skills/design-system/scripts/validate-tokens.cjs +251 -0
- package/assets/skills/design-system/templates/design-tokens-starter.json +143 -0
- package/assets/skills/slides/SKILL.md +40 -0
- package/assets/skills/slides/references/copywriting-formulas.md +84 -0
- package/assets/skills/slides/references/create.md +4 -0
- package/assets/skills/slides/references/html-template.md +295 -0
- package/assets/skills/slides/references/layout-patterns.md +137 -0
- package/assets/skills/slides/references/slide-strategies.md +94 -0
- package/assets/skills/ui-styling/LICENSE.txt +202 -0
- package/assets/skills/ui-styling/SKILL.md +324 -0
- package/assets/skills/ui-styling/references/canvas-design-system.md +320 -0
- package/assets/skills/ui-styling/references/shadcn-accessibility.md +471 -0
- package/assets/skills/ui-styling/references/shadcn-components.md +424 -0
- package/assets/skills/ui-styling/references/shadcn-theming.md +373 -0
- package/assets/skills/ui-styling/references/tailwind-customization.md +483 -0
- package/assets/skills/ui-styling/references/tailwind-responsive.md +382 -0
- package/assets/skills/ui-styling/references/tailwind-utilities.md +455 -0
- package/assets/skills/ui-styling/scripts/requirements.txt +17 -0
- package/assets/skills/ui-styling/scripts/shadcn_add.py +308 -0
- package/assets/skills/ui-styling/scripts/tailwind_config_gen.py +473 -0
- package/assets/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
- package/assets/skills/ui-styling/scripts/tests/requirements.txt +3 -0
- package/assets/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
- package/assets/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +336 -0
- package/assets/templates/base/quick-reference.md +297 -0
- package/assets/templates/base/skill-content.md +368 -0
- package/assets/templates/platforms/agent.json +21 -0
- package/assets/templates/platforms/augment.json +18 -0
- package/assets/templates/platforms/claude.json +21 -0
- package/assets/templates/platforms/codebuddy.json +21 -0
- package/assets/templates/platforms/codex.json +21 -0
- package/assets/templates/platforms/continue.json +21 -0
- package/assets/templates/platforms/copilot.json +21 -0
- package/assets/templates/platforms/cursor.json +21 -0
- package/assets/templates/platforms/droid.json +21 -0
- package/assets/templates/platforms/gemini.json +21 -0
- package/assets/templates/platforms/kilocode.json +21 -0
- package/assets/templates/platforms/kiro.json +21 -0
- package/assets/templates/platforms/opencode.json +21 -0
- package/assets/templates/platforms/qoder.json +21 -0
- package/assets/templates/platforms/roocode.json +21 -0
- package/assets/templates/platforms/trae.json +21 -0
- package/assets/templates/platforms/warp.json +18 -0
- package/assets/templates/platforms/windsurf.json +21 -0
- package/dist/index.js +10630 -0
- package/package.json +51 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Logo Generation Script using Gemini Nano Banana API
|
|
5
|
+
Uses Gemini 2.5 Flash Image and Gemini 3 Pro Image Preview models
|
|
6
|
+
|
|
7
|
+
Models:
|
|
8
|
+
- Nano Banana (default): gemini-2.5-flash-image - fast, high-volume, low-latency
|
|
9
|
+
- Nano Banana Pro (--pro): gemini-3-pro-image-preview - professional quality, advanced reasoning
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
python generate.py --prompt "tech startup logo minimalist blue"
|
|
13
|
+
python generate.py --prompt "coffee shop vintage badge" --style vintage --output logo.png
|
|
14
|
+
python generate.py --brand "TechFlow" --industry tech --style minimalist
|
|
15
|
+
python generate.py --brand "TechFlow" --pro # Use Nano Banana Pro model
|
|
16
|
+
|
|
17
|
+
Batch mode (generates multiple variants):
|
|
18
|
+
python generate.py --brand "Unikorn" --batch 9 --output-dir ./logos --pro
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import argparse
|
|
22
|
+
import os
|
|
23
|
+
import sys
|
|
24
|
+
import time
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from datetime import datetime
|
|
27
|
+
|
|
28
|
+
# Load environment variables
|
|
29
|
+
def load_env():
|
|
30
|
+
"""Load .env files in priority order"""
|
|
31
|
+
env_paths = [
|
|
32
|
+
Path(__file__).parent.parent.parent / ".env",
|
|
33
|
+
Path.home() / ".claude" / "skills" / ".env",
|
|
34
|
+
Path.home() / ".claude" / ".env"
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
for env_path in env_paths:
|
|
38
|
+
if env_path.exists():
|
|
39
|
+
with open(env_path) as f:
|
|
40
|
+
for line in f:
|
|
41
|
+
line = line.strip()
|
|
42
|
+
if line and not line.startswith('#') and '=' in line:
|
|
43
|
+
key, value = line.split('=', 1)
|
|
44
|
+
if key not in os.environ:
|
|
45
|
+
os.environ[key] = value.strip('"\'')
|
|
46
|
+
|
|
47
|
+
load_env()
|
|
48
|
+
|
|
49
|
+
try:
|
|
50
|
+
from google import genai
|
|
51
|
+
from google.genai import types
|
|
52
|
+
except ImportError:
|
|
53
|
+
print("Error: google-genai package not installed.")
|
|
54
|
+
print("Install with: pip install google-genai")
|
|
55
|
+
sys.exit(1)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# ============ CONFIGURATION ============
|
|
59
|
+
GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
|
|
60
|
+
|
|
61
|
+
# Gemini "Nano Banana" model configurations for image generation
|
|
62
|
+
GEMINI_FLASH = "gemini-2.5-flash-image" # Nano Banana: fast, high-volume, low-latency
|
|
63
|
+
GEMINI_PRO = "gemini-3-pro-image-preview" # Nano Banana Pro: professional quality, advanced reasoning
|
|
64
|
+
|
|
65
|
+
# Supported aspect ratios
|
|
66
|
+
ASPECT_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4"]
|
|
67
|
+
DEFAULT_ASPECT_RATIO = "1:1" # Square is ideal for logos
|
|
68
|
+
|
|
69
|
+
# Logo-specific prompt templates
|
|
70
|
+
LOGO_PROMPT_TEMPLATE = """Generate a professional logo image: {prompt}
|
|
71
|
+
|
|
72
|
+
Style requirements:
|
|
73
|
+
- Clean vector-style illustration suitable for a logo
|
|
74
|
+
- Simple, scalable design that works at any size
|
|
75
|
+
- Clear silhouette and recognizable shape
|
|
76
|
+
- Professional quality suitable for business use
|
|
77
|
+
- Centered composition on plain white or transparent background
|
|
78
|
+
- No text unless specifically requested
|
|
79
|
+
- High contrast and clear edges
|
|
80
|
+
- Square format, perfectly centered
|
|
81
|
+
- Output as a clean, high-quality logo image
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
STYLE_MODIFIERS = {
|
|
85
|
+
"minimalist": "minimalist, simple geometric shapes, clean lines, lots of white space, single color or limited palette",
|
|
86
|
+
"vintage": "vintage, retro, badge style, distressed texture, heritage feel, warm earth tones",
|
|
87
|
+
"modern": "modern, sleek, gradient colors, tech-forward, innovative feel",
|
|
88
|
+
"luxury": "luxury, elegant, gold accents, refined, premium feel, serif typography",
|
|
89
|
+
"playful": "playful, fun, colorful, friendly, approachable, rounded shapes",
|
|
90
|
+
"corporate": "corporate, professional, trustworthy, stable, conservative colors",
|
|
91
|
+
"organic": "organic, natural, flowing lines, earth tones, sustainable feel",
|
|
92
|
+
"geometric": "geometric, abstract, mathematical precision, symmetrical",
|
|
93
|
+
"hand-drawn": "hand-drawn, artisan, sketch-like, authentic, imperfect lines",
|
|
94
|
+
"3d": "3D, dimensional, depth, shadows, isometric perspective",
|
|
95
|
+
"abstract": "abstract mark, conceptual, symbolic, non-literal representation, artistic interpretation",
|
|
96
|
+
"lettermark": "lettermark, single letter or initials, typographic, monogram style, distinctive character",
|
|
97
|
+
"wordmark": "wordmark, logotype, custom typography, brand name as logo, distinctive lettering",
|
|
98
|
+
"emblem": "emblem, badge, crest style, enclosed design, traditional, authoritative feel",
|
|
99
|
+
"mascot": "mascot, character, friendly face, personified, memorable figure",
|
|
100
|
+
"gradient": "gradient, color transition, vibrant, modern digital feel, smooth color flow",
|
|
101
|
+
"lineart": "line art, single stroke, continuous line, elegant simplicity, wire-frame style",
|
|
102
|
+
"negative-space": "negative space, clever use of white space, hidden meaning, dual imagery, optical illusion"
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
INDUSTRY_PROMPTS = {
|
|
106
|
+
"tech": "technology company, digital, innovative, modern, circuit-like elements",
|
|
107
|
+
"healthcare": "healthcare, medical, caring, trust, cross or heart symbol",
|
|
108
|
+
"finance": "financial services, stable, trustworthy, growth, upward elements",
|
|
109
|
+
"food": "food and beverage, appetizing, warm colors, welcoming",
|
|
110
|
+
"fashion": "fashion brand, elegant, stylish, refined, artistic",
|
|
111
|
+
"fitness": "fitness and sports, dynamic, energetic, powerful, movement",
|
|
112
|
+
"eco": "eco-friendly, sustainable, natural, green, leaf or earth elements",
|
|
113
|
+
"education": "education, knowledge, growth, learning, book or cap symbol",
|
|
114
|
+
"real-estate": "real estate, property, home, roof or building silhouette",
|
|
115
|
+
"creative": "creative agency, artistic, unique, expressive, colorful"
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def enhance_prompt(base_prompt, style=None, industry=None, brand_name=None):
|
|
120
|
+
"""Enhance the logo prompt with style and industry modifiers"""
|
|
121
|
+
prompt_parts = [base_prompt]
|
|
122
|
+
|
|
123
|
+
if style and style in STYLE_MODIFIERS:
|
|
124
|
+
prompt_parts.append(STYLE_MODIFIERS[style])
|
|
125
|
+
|
|
126
|
+
if industry and industry in INDUSTRY_PROMPTS:
|
|
127
|
+
prompt_parts.append(INDUSTRY_PROMPTS[industry])
|
|
128
|
+
|
|
129
|
+
if brand_name:
|
|
130
|
+
prompt_parts.insert(0, f"Logo for '{brand_name}':")
|
|
131
|
+
|
|
132
|
+
combined = ", ".join(prompt_parts)
|
|
133
|
+
return LOGO_PROMPT_TEMPLATE.format(prompt=combined)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def generate_logo(prompt, style=None, industry=None, brand_name=None,
|
|
137
|
+
output_path=None, use_pro=False, aspect_ratio=None):
|
|
138
|
+
"""Generate a logo using Gemini models with image generation
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
aspect_ratio: Image aspect ratio. Options: "1:1", "16:9", "9:16", "4:3", "3:4"
|
|
142
|
+
Default is "1:1" (square) for logos.
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
if not GEMINI_API_KEY:
|
|
146
|
+
print("Error: GEMINI_API_KEY not set")
|
|
147
|
+
print("Set it with: export GEMINI_API_KEY='your-key'")
|
|
148
|
+
return None
|
|
149
|
+
|
|
150
|
+
# Initialize client
|
|
151
|
+
client = genai.Client(api_key=GEMINI_API_KEY)
|
|
152
|
+
|
|
153
|
+
# Enhance the prompt
|
|
154
|
+
full_prompt = enhance_prompt(prompt, style, industry, brand_name)
|
|
155
|
+
|
|
156
|
+
# Select model
|
|
157
|
+
model = GEMINI_PRO if use_pro else GEMINI_FLASH
|
|
158
|
+
model_label = "Nano Banana Pro (gemini-3-pro-image-preview)" if use_pro else "Nano Banana (gemini-2.5-flash-image)"
|
|
159
|
+
|
|
160
|
+
# Set aspect ratio (default to 1:1 for logos)
|
|
161
|
+
ratio = aspect_ratio if aspect_ratio in ASPECT_RATIOS else DEFAULT_ASPECT_RATIO
|
|
162
|
+
|
|
163
|
+
print(f"Generating logo with {model_label}...")
|
|
164
|
+
print(f"Aspect ratio: {ratio}")
|
|
165
|
+
print(f"Prompt: {full_prompt[:150]}...")
|
|
166
|
+
print()
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
# Generate image using Gemini with image generation capability
|
|
170
|
+
response = client.models.generate_content(
|
|
171
|
+
model=model,
|
|
172
|
+
contents=full_prompt,
|
|
173
|
+
config=types.GenerateContentConfig(
|
|
174
|
+
response_modalities=["IMAGE", "TEXT"],
|
|
175
|
+
image_config=types.ImageConfig(
|
|
176
|
+
aspect_ratio=ratio
|
|
177
|
+
),
|
|
178
|
+
safety_settings=[
|
|
179
|
+
types.SafetySetting(
|
|
180
|
+
category="HARM_CATEGORY_HATE_SPEECH",
|
|
181
|
+
threshold="BLOCK_LOW_AND_ABOVE"
|
|
182
|
+
),
|
|
183
|
+
types.SafetySetting(
|
|
184
|
+
category="HARM_CATEGORY_DANGEROUS_CONTENT",
|
|
185
|
+
threshold="BLOCK_LOW_AND_ABOVE"
|
|
186
|
+
),
|
|
187
|
+
types.SafetySetting(
|
|
188
|
+
category="HARM_CATEGORY_SEXUALLY_EXPLICIT",
|
|
189
|
+
threshold="BLOCK_LOW_AND_ABOVE"
|
|
190
|
+
),
|
|
191
|
+
types.SafetySetting(
|
|
192
|
+
category="HARM_CATEGORY_HARASSMENT",
|
|
193
|
+
threshold="BLOCK_LOW_AND_ABOVE"
|
|
194
|
+
),
|
|
195
|
+
]
|
|
196
|
+
)
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
# Extract image from response
|
|
200
|
+
image_data = None
|
|
201
|
+
for part in response.candidates[0].content.parts:
|
|
202
|
+
if hasattr(part, 'inline_data') and part.inline_data:
|
|
203
|
+
if part.inline_data.mime_type.startswith('image/'):
|
|
204
|
+
image_data = part.inline_data.data
|
|
205
|
+
break
|
|
206
|
+
|
|
207
|
+
if not image_data:
|
|
208
|
+
print("No image generated. The model may not have produced an image.")
|
|
209
|
+
print("Try a different prompt or check if the model supports image generation.")
|
|
210
|
+
return None
|
|
211
|
+
|
|
212
|
+
# Determine output path
|
|
213
|
+
if output_path is None:
|
|
214
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
215
|
+
brand_slug = brand_name.lower().replace(" ", "_") if brand_name else "logo"
|
|
216
|
+
output_path = f"{brand_slug}_{timestamp}.png"
|
|
217
|
+
|
|
218
|
+
# Save image
|
|
219
|
+
with open(output_path, "wb") as f:
|
|
220
|
+
f.write(image_data)
|
|
221
|
+
|
|
222
|
+
print(f"Logo saved to: {output_path}")
|
|
223
|
+
return output_path
|
|
224
|
+
|
|
225
|
+
except Exception as e:
|
|
226
|
+
print(f"Error generating logo: {e}")
|
|
227
|
+
return None
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def generate_batch(prompt, brand_name, count, output_dir, use_pro=False, brand_context=None, aspect_ratio=None):
|
|
231
|
+
"""Generate multiple logo variants with different styles"""
|
|
232
|
+
|
|
233
|
+
# Select appropriate styles for batch generation
|
|
234
|
+
batch_styles = [
|
|
235
|
+
("minimalist", "Clean, simple geometric shape with minimal details"),
|
|
236
|
+
("modern", "Sleek gradient with tech-forward aesthetic"),
|
|
237
|
+
("geometric", "Abstract geometric patterns, mathematical precision"),
|
|
238
|
+
("gradient", "Vibrant color transitions, modern digital feel"),
|
|
239
|
+
("abstract", "Conceptual symbolic representation"),
|
|
240
|
+
("lettermark", "Stylized letter 'U' as monogram"),
|
|
241
|
+
("negative-space", "Clever use of negative space, hidden meaning"),
|
|
242
|
+
("lineart", "Single stroke continuous line design"),
|
|
243
|
+
("3d", "Dimensional design with depth and shadows"),
|
|
244
|
+
]
|
|
245
|
+
|
|
246
|
+
# Ensure output directory exists
|
|
247
|
+
os.makedirs(output_dir, exist_ok=True)
|
|
248
|
+
|
|
249
|
+
results = []
|
|
250
|
+
model_label = "Pro" if use_pro else "Flash"
|
|
251
|
+
ratio = aspect_ratio if aspect_ratio in ASPECT_RATIOS else DEFAULT_ASPECT_RATIO
|
|
252
|
+
|
|
253
|
+
print(f"\n{'='*60}")
|
|
254
|
+
print(f" BATCH LOGO GENERATION: {brand_name}")
|
|
255
|
+
print(f" Model: Nano Banana {model_label}")
|
|
256
|
+
print(f" Aspect Ratio: {ratio}")
|
|
257
|
+
print(f" Variants: {count}")
|
|
258
|
+
print(f" Output: {output_dir}")
|
|
259
|
+
print(f"{'='*60}\n")
|
|
260
|
+
|
|
261
|
+
for i in range(min(count, len(batch_styles))):
|
|
262
|
+
style_key, style_desc = batch_styles[i]
|
|
263
|
+
|
|
264
|
+
# Build enhanced prompt with brand context
|
|
265
|
+
enhanced_prompt = f"{prompt}, {style_desc}"
|
|
266
|
+
if brand_context:
|
|
267
|
+
enhanced_prompt = f"{brand_context}, {enhanced_prompt}"
|
|
268
|
+
|
|
269
|
+
# Generate filename
|
|
270
|
+
filename = f"{brand_name.lower().replace(' ', '_')}_{style_key}_{i+1:02d}.png"
|
|
271
|
+
output_path = os.path.join(output_dir, filename)
|
|
272
|
+
|
|
273
|
+
print(f"[{i+1}/{count}] Generating {style_key} variant...")
|
|
274
|
+
|
|
275
|
+
result = generate_logo(
|
|
276
|
+
prompt=enhanced_prompt,
|
|
277
|
+
style=style_key,
|
|
278
|
+
industry="tech",
|
|
279
|
+
brand_name=brand_name,
|
|
280
|
+
output_path=output_path,
|
|
281
|
+
use_pro=use_pro,
|
|
282
|
+
aspect_ratio=aspect_ratio
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
if result:
|
|
286
|
+
results.append(result)
|
|
287
|
+
print(f" ✓ Saved: {filename}\n")
|
|
288
|
+
else:
|
|
289
|
+
print(f" ✗ Failed: {style_key}\n")
|
|
290
|
+
|
|
291
|
+
# Rate limiting between requests
|
|
292
|
+
if i < count - 1:
|
|
293
|
+
time.sleep(2)
|
|
294
|
+
|
|
295
|
+
print(f"\n{'='*60}")
|
|
296
|
+
print(f" BATCH COMPLETE: {len(results)}/{count} logos generated")
|
|
297
|
+
print(f"{'='*60}\n")
|
|
298
|
+
|
|
299
|
+
return results
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def main():
|
|
303
|
+
parser = argparse.ArgumentParser(description="Generate logos using Gemini Nano Banana models")
|
|
304
|
+
parser.add_argument("--prompt", "-p", type=str, help="Logo description prompt")
|
|
305
|
+
parser.add_argument("--brand", "-b", type=str, help="Brand name")
|
|
306
|
+
parser.add_argument("--style", "-s", choices=list(STYLE_MODIFIERS.keys()), help="Logo style")
|
|
307
|
+
parser.add_argument("--industry", "-i", choices=list(INDUSTRY_PROMPTS.keys()), help="Industry type")
|
|
308
|
+
parser.add_argument("--output", "-o", type=str, help="Output file path")
|
|
309
|
+
parser.add_argument("--output-dir", type=str, help="Output directory for batch generation")
|
|
310
|
+
parser.add_argument("--batch", type=int, help="Number of logo variants to generate (batch mode)")
|
|
311
|
+
parser.add_argument("--brand-context", type=str, help="Additional brand context for prompts")
|
|
312
|
+
parser.add_argument("--pro", action="store_true", help="Use Nano Banana Pro (gemini-3-pro-image-preview) for professional quality")
|
|
313
|
+
parser.add_argument("--aspect-ratio", "-r", choices=ASPECT_RATIOS, default=DEFAULT_ASPECT_RATIO,
|
|
314
|
+
help=f"Image aspect ratio (default: {DEFAULT_ASPECT_RATIO} for logos)")
|
|
315
|
+
parser.add_argument("--list-styles", action="store_true", help="List available styles")
|
|
316
|
+
parser.add_argument("--list-industries", action="store_true", help="List available industries")
|
|
317
|
+
|
|
318
|
+
args = parser.parse_args()
|
|
319
|
+
|
|
320
|
+
if args.list_styles:
|
|
321
|
+
print("Available styles:")
|
|
322
|
+
for style, desc in STYLE_MODIFIERS.items():
|
|
323
|
+
print(f" {style}: {desc[:60]}...")
|
|
324
|
+
return
|
|
325
|
+
|
|
326
|
+
if args.list_industries:
|
|
327
|
+
print("Available industries:")
|
|
328
|
+
for industry, desc in INDUSTRY_PROMPTS.items():
|
|
329
|
+
print(f" {industry}: {desc[:60]}...")
|
|
330
|
+
return
|
|
331
|
+
|
|
332
|
+
if not args.prompt and not args.brand:
|
|
333
|
+
parser.error("Either --prompt or --brand is required")
|
|
334
|
+
|
|
335
|
+
prompt = args.prompt or "professional logo"
|
|
336
|
+
|
|
337
|
+
# Batch mode
|
|
338
|
+
if args.batch:
|
|
339
|
+
output_dir = args.output_dir or f"./{args.brand.lower().replace(' ', '_')}_logos"
|
|
340
|
+
generate_batch(
|
|
341
|
+
prompt=prompt,
|
|
342
|
+
brand_name=args.brand or "Logo",
|
|
343
|
+
count=args.batch,
|
|
344
|
+
output_dir=output_dir,
|
|
345
|
+
use_pro=args.pro,
|
|
346
|
+
brand_context=args.brand_context,
|
|
347
|
+
aspect_ratio=args.aspect_ratio
|
|
348
|
+
)
|
|
349
|
+
else:
|
|
350
|
+
generate_logo(
|
|
351
|
+
prompt=prompt,
|
|
352
|
+
style=args.style,
|
|
353
|
+
industry=args.industry,
|
|
354
|
+
brand_name=args.brand,
|
|
355
|
+
output_path=args.output,
|
|
356
|
+
use_pro=args.pro,
|
|
357
|
+
aspect_ratio=args.aspect_ratio
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
if __name__ == "__main__":
|
|
362
|
+
main()
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Logo Design Search - CLI for searching logo design guidelines
|
|
5
|
+
Usage: python search.py "<query>" [--domain <domain>] [--max-results 3]
|
|
6
|
+
python search.py "<query>" --design-brief [-p "Brand Name"]
|
|
7
|
+
|
|
8
|
+
Domains: style, color, industry
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import argparse
|
|
12
|
+
from core import CSV_CONFIG, MAX_RESULTS, search, search_all
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def format_output(result):
|
|
16
|
+
"""Format results for Claude consumption (token-optimized)"""
|
|
17
|
+
if "error" in result:
|
|
18
|
+
return f"Error: {result['error']}"
|
|
19
|
+
|
|
20
|
+
output = []
|
|
21
|
+
output.append(f"## Logo Design Search Results")
|
|
22
|
+
output.append(f"**Domain:** {result['domain']} | **Query:** {result['query']}")
|
|
23
|
+
output.append(f"**Source:** {result['file']} | **Found:** {result['count']} results\n")
|
|
24
|
+
|
|
25
|
+
for i, row in enumerate(result['results'], 1):
|
|
26
|
+
output.append(f"### Result {i}")
|
|
27
|
+
for key, value in row.items():
|
|
28
|
+
value_str = str(value)
|
|
29
|
+
if len(value_str) > 300:
|
|
30
|
+
value_str = value_str[:300] + "..."
|
|
31
|
+
output.append(f"- **{key}:** {value_str}")
|
|
32
|
+
output.append("")
|
|
33
|
+
|
|
34
|
+
return "\n".join(output)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def generate_design_brief(query, brand_name=None):
|
|
38
|
+
"""Generate a comprehensive logo design brief based on query"""
|
|
39
|
+
results = search_all(query, max_results=2)
|
|
40
|
+
|
|
41
|
+
output = []
|
|
42
|
+
output.append("=" * 60)
|
|
43
|
+
if brand_name:
|
|
44
|
+
output.append(f" LOGO DESIGN BRIEF: {brand_name.upper()}")
|
|
45
|
+
else:
|
|
46
|
+
output.append(" LOGO DESIGN BRIEF")
|
|
47
|
+
output.append("=" * 60)
|
|
48
|
+
output.append(f" Query: {query}")
|
|
49
|
+
output.append("=" * 60)
|
|
50
|
+
output.append("")
|
|
51
|
+
|
|
52
|
+
# Industry recommendations
|
|
53
|
+
if "industry" in results:
|
|
54
|
+
output.append("## INDUSTRY ANALYSIS")
|
|
55
|
+
for r in results["industry"]:
|
|
56
|
+
output.append(f"**Industry:** {r.get('Industry', 'N/A')}")
|
|
57
|
+
output.append(f"- Recommended Styles: {r.get('Recommended Styles', 'N/A')}")
|
|
58
|
+
output.append(f"- Colors: {r.get('Primary Colors', 'N/A')}")
|
|
59
|
+
output.append(f"- Typography: {r.get('Typography', 'N/A')}")
|
|
60
|
+
output.append(f"- Symbols: {r.get('Common Symbols', 'N/A')}")
|
|
61
|
+
output.append(f"- Mood: {r.get('Mood', 'N/A')}")
|
|
62
|
+
output.append(f"- Best Practices: {r.get('Best Practices', 'N/A')}")
|
|
63
|
+
output.append(f"- Avoid: {r.get('Avoid', 'N/A')}")
|
|
64
|
+
output.append("")
|
|
65
|
+
|
|
66
|
+
# Style recommendations
|
|
67
|
+
if "style" in results:
|
|
68
|
+
output.append("## STYLE RECOMMENDATIONS")
|
|
69
|
+
for r in results["style"]:
|
|
70
|
+
output.append(f"**{r.get('Style Name', 'N/A')}** ({r.get('Category', 'N/A')})")
|
|
71
|
+
output.append(f"- Colors: {r.get('Primary Colors', 'N/A')} | {r.get('Secondary Colors', 'N/A')}")
|
|
72
|
+
output.append(f"- Typography: {r.get('Typography', 'N/A')}")
|
|
73
|
+
output.append(f"- Effects: {r.get('Effects', 'N/A')}")
|
|
74
|
+
output.append(f"- Best For: {r.get('Best For', 'N/A')}")
|
|
75
|
+
output.append(f"- Complexity: {r.get('Complexity', 'N/A')}")
|
|
76
|
+
output.append("")
|
|
77
|
+
|
|
78
|
+
# Color recommendations
|
|
79
|
+
if "color" in results:
|
|
80
|
+
output.append("## COLOR PALETTE OPTIONS")
|
|
81
|
+
for r in results["color"]:
|
|
82
|
+
output.append(f"**{r.get('Palette Name', 'N/A')}**")
|
|
83
|
+
output.append(f"- Primary: {r.get('Primary Hex', 'N/A')}")
|
|
84
|
+
output.append(f"- Secondary: {r.get('Secondary Hex', 'N/A')}")
|
|
85
|
+
output.append(f"- Accent: {r.get('Accent Hex', 'N/A')}")
|
|
86
|
+
output.append(f"- Background: {r.get('Background Hex', 'N/A')}")
|
|
87
|
+
output.append(f"- Psychology: {r.get('Psychology', 'N/A')}")
|
|
88
|
+
output.append("")
|
|
89
|
+
|
|
90
|
+
output.append("=" * 60)
|
|
91
|
+
return "\n".join(output)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
if __name__ == "__main__":
|
|
95
|
+
parser = argparse.ArgumentParser(description="Logo Design Search")
|
|
96
|
+
parser.add_argument("query", help="Search query")
|
|
97
|
+
parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")
|
|
98
|
+
parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")
|
|
99
|
+
parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
100
|
+
parser.add_argument("--design-brief", "-db", action="store_true", help="Generate comprehensive design brief")
|
|
101
|
+
parser.add_argument("--brand-name", "-p", type=str, default=None, help="Brand name for design brief")
|
|
102
|
+
|
|
103
|
+
args = parser.parse_args()
|
|
104
|
+
|
|
105
|
+
if args.design_brief:
|
|
106
|
+
result = generate_design_brief(args.query, args.brand_name)
|
|
107
|
+
print(result)
|
|
108
|
+
else:
|
|
109
|
+
result = search(args.query, args.domain, args.max_results)
|
|
110
|
+
if args.json:
|
|
111
|
+
import json
|
|
112
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
113
|
+
else:
|
|
114
|
+
print(format_output(result))
|