Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Design intelligence for professional web and mobile interfaces: styles, palettes, typography, UX checks, and design-system guidance.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
search.py
1#!/usr/bin/env python32# -*- coding: utf-8 -*-3"""4UI/UX Pro Max Search - BM25 search engine for UI/UX style guides5Usage: python search.py "<query>" [--domain <domain>] [--stack <stack>] [--max-results 3]6python search.py "<query>" --design-system [-p "Project Name"]7python search.py "<query>" --design-system --persist [-p "Project Name"] [--page "dashboard"]89Domains: style, prompt, color, chart, landing, product, ux, typography, google-fonts10Stacks: html-tailwind, react, nextjs1112Persistence (Master + Overrides pattern):13--persist Save design system to design-system/MASTER.md14--page Also create a page-specific override file in design-system/pages/15"""1617import argparse18import sys19import io20from core import CSV_CONFIG, AVAILABLE_STACKS, MAX_RESULTS, search, search_stack21from design_system import generate_design_system, persist_design_system2223# Force UTF-8 for stdout/stderr to handle emojis on Windows (cp1252 default)24if sys.stdout.encoding and sys.stdout.encoding.lower() != 'utf-8':25sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')26if sys.stderr.encoding and sys.stderr.encoding.lower() != 'utf-8':27sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')282930def format_output(result):31"""Format results for Claude consumption (token-optimized)"""32if "error" in result:33return f"Error: {result['error']}"3435output = []36if result.get("stack"):37output.append(f"## UI Pro Max Stack Guidelines")38output.append(f"**Stack:** {result['stack']} | **Query:** {result['query']}")39else:40output.append(f"## UI Pro Max Search Results")41output.append(f"**Domain:** {result['domain']} | **Query:** {result['query']}")42output.append(f"**Source:** {result['file']} | **Found:** {result['count']} results\n")4344for i, row in enumerate(result['results'], 1):45output.append(f"### Result {i}")46for key, value in row.items():47value_str = str(value)48if len(value_str) > 300:49value_str = value_str[:300] + "..."50output.append(f"- **{key}:** {value_str}")51output.append("")5253return "\n".join(output)545556if __name__ == "__main__":57parser = argparse.ArgumentParser(description="UI Pro Max Search")58parser.add_argument("query", help="Search query")59parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")60parser.add_argument("--stack", "-s", choices=AVAILABLE_STACKS, help="Stack-specific search (html-tailwind, react, nextjs)")61parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")62parser.add_argument("--json", action="store_true", help="Output as JSON")63# Design system generation64parser.add_argument("--design-system", "-ds", action="store_true", help="Generate complete design system recommendation")65parser.add_argument("--project-name", "-p", type=str, default=None, help="Project name for design system output")66parser.add_argument("--format", "-f", choices=["ascii", "markdown"], default="ascii", help="Output format for design system")67# Persistence (Master + Overrides pattern)68parser.add_argument("--persist", action="store_true", help="Save design system to design-system/MASTER.md (creates hierarchical structure)")69parser.add_argument("--page", type=str, default=None, help="Create page-specific override file in design-system/pages/")70parser.add_argument("--output-dir", "-o", type=str, default=None, help="Output directory for persisted files (default: current directory)")7172args = parser.parse_args()7374# Design system takes priority75if args.design_system:76result = generate_design_system(77args.query,78args.project_name,79args.format,80persist=args.persist,81page=args.page,82output_dir=args.output_dir83)84print(result)8586# Print persistence confirmation87if args.persist:88project_slug = args.project_name.lower().replace(' ', '-') if args.project_name else "default"89print("\n" + "=" * 60)90print(f"โ Design system persisted to design-system/{project_slug}/")91print(f" ๐ design-system/{project_slug}/MASTER.md (Global Source of Truth)")92if args.page:93page_filename = args.page.lower().replace(' ', '-')94print(f" ๐ design-system/{project_slug}/pages/{page_filename}.md (Page Overrides)")95print("")96print(f"๐ Usage: When building a page, check design-system/{project_slug}/pages/[page].md first.")97print(f" If exists, its rules override MASTER.md. Otherwise, use MASTER.md.")98print("=" * 60)99# Stack search100elif args.stack:101result = search_stack(args.query, args.stack, args.max_results)102if args.json:103import json104print(json.dumps(result, indent=2, ensure_ascii=False))105else:106print(format_output(result))107# Domain search108else:109result = search(args.query, args.domain, args.max_results)110if args.json:111import json112print(json.dumps(result, indent=2, ensure_ascii=False))113else:114print(format_output(result))115