@m0xoo/unstyle 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # UnStyle
2
+
3
+ An MCP (Model Context Protocol) server designed to help LLMs generate beautiful, non-generic, and consistent UI designs. Instead of default Tailwind styles, this tool provides strict aesthetic guidelines, inspiration, rules, and component specifications for specific design themes.
4
+
5
+ ## Example: Before & After
6
+ With the same prompt "Create a landing page":
7
+
8
+ **Before using UnStyle (Generic Tailwind)**
9
+ ![Before](screenshots/before.png)
10
+
11
+ **After using UnStyle (Brutal Theme)**
12
+ ![After](screenshots/after.png)
13
+
14
+ ## Available Themes
15
+ - `brutal`: Neo-Brutalism (raw, high contrast, thick borders)
16
+ - `pro`: Professional/Enterprise (Linear/Stripe aesthetic, muted, subtle)
17
+ - `fun`: Playful/Consumer (bouncy, rounded, colorful)
18
+ - `cyberpunk`: High-tech (neon, dark mode, glitchy)
19
+ - `minimal`: Bare minimum (whitespace, grayscale, typography focused)
20
+
21
+ ## Setup
22
+
23
+ 1. Install dependencies:
24
+ ```bash
25
+ cd c:\Users\Mokhles\ratemy\mcp-theme-generator
26
+ npm install
27
+ ```
28
+ 2. Build the project:
29
+ ```bash
30
+ npx tsc
31
+ ```
32
+
33
+ ## Usage
34
+
35
+ ### Testing locally with the MCP Inspector
36
+ You can test the server and its tools directly using the official MCP Inspector.
37
+ ```bash
38
+ npx @modelcontextprotocol/inspector node build/index.js
39
+ ```
40
+
41
+ ### Using with Cursor
42
+ To use this server in Cursor, you need to add it to your Agent config.
43
+
44
+ 1. Open Cursor Settings (`Cmd/Ctrl` + `,`)
45
+ 2. Navigate to **Features** -> **MCP Servers**
46
+ 3. Click **+ Add new MCP server**
47
+ 4. Configure as follows:
48
+ - **Name**: `unstyle` (or whatever you prefer)
49
+ - **Type**: `command`
50
+ - **Command**: `node`
51
+ - **Args**: `["c:/Users/Mokhles/ratemy/mcp-theme-generator/build/index.js"]` (Make sure to use the absolute path to your cloned/built directory)
52
+ 5. Save and ensure the status shows green/connected!
53
+
54
+ Now, when prompting Cursor's Composer or Agent, you can say:
55
+ > "Build a login page and use the get_theme_guidelines tool with the 'brutal' theme to style it."
56
+
57
+ ### Using with Claude Desktop or Antigravity
58
+ Add the following to your `mcp.json` or equivalent configuration file:
59
+
60
+ ```json
61
+ {
62
+ "mcpServers": {
63
+ "unstyle": {
64
+ "command": "node",
65
+ "args": ["c:/Users/Mokhles/ratemy/mcp-theme-generator/build/index.js"]
66
+ }
67
+ }
68
+ }
69
+ ```
@@ -0,0 +1 @@
1
+ export {};
package/build/index.js ADDED
@@ -0,0 +1,25 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { z } from "zod";
4
+ import { THEMES, THEME_KEYS } from "./themes/index.js";
5
+ const server = new McpServer({
6
+ name: "unstyle",
7
+ version: "1.1.0",
8
+ });
9
+ server.tool("get_theme_guidelines", "Provide UI design guidelines, rules, color palettes, typography, and component specifications based on a specific theme style to help an LLM generate non-generic, high-quality, beautiful UI code.", {
10
+ theme: z.enum(THEME_KEYS).describe("The target UI theme or aesthetic vibe."),
11
+ }, async ({ theme }) => {
12
+ const guidelines = THEMES[theme];
13
+ return {
14
+ content: [{ type: "text", text: JSON.stringify(guidelines, null, 2) }],
15
+ };
16
+ });
17
+ async function run() {
18
+ const transport = new StdioServerTransport();
19
+ await server.connect(transport);
20
+ console.error("UnStyle Server running on stdio");
21
+ }
22
+ run().catch((error) => {
23
+ console.error("Fatal error running server:", error);
24
+ process.exit(1);
25
+ });
@@ -0,0 +1,2 @@
1
+ import { ThemeGuidelines } from "../types.js";
2
+ export declare const brutal: ThemeGuidelines;
@@ -0,0 +1,31 @@
1
+ export const brutal = {
2
+ inspiration: "Brutalism focuses on raw, unpolished, and structural elements. It's an intentional departure from modern standard web design, emphasizing huge typography, high contrast, and a 'rough' feel.",
3
+ examples: ["neo-brutalism.com", "gumroad.com", "figma.com (brand pages)"],
4
+ rules: [
5
+ "No rounded corners on structural elements unless exaggerated (e.g., 9999px or 0px).",
6
+ "Thick, solid, black borders on almost everything.",
7
+ "Hard, offset shadow blocks instead of soft drop shadows.",
8
+ "Maximal contrast, jarring color combinations are acceptable."
9
+ ],
10
+ what_to_use: ["Monospaced fonts", "Huge sans-serif headers", "Solid colors", "Thick borders (border-4 or border-8)"],
11
+ what_not_to_use: ["Gradients", "Soft shadows", "Translucency/opacity", "Delicate, thin font weights"],
12
+ color_palette: {
13
+ primary: "#FF3366, #00C4FF, #FFE800",
14
+ background: "#FFFFFF, #EBEBEB",
15
+ text: "#000000",
16
+ accent: "#000000"
17
+ },
18
+ typography: {
19
+ headers: "Syncopate, Space Mono, or heavily weighted standard sans (Inter Black)",
20
+ body: "Space Mono, Courier New, or standard sans",
21
+ weights: "400 for regular, 800+ for headers"
22
+ },
23
+ component_guidelines: {
24
+ buttons: "border-4 border-black bg-yellow-400 text-black font-bold uppercase py-3 px-6 shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] active:translate-x-1 active:translate-y-1 active:shadow-none transition-all",
25
+ cards: "border-4 border-black bg-white p-6 shadow-[8px_8px_0px_0px_rgba(0,0,0,1)]",
26
+ inputs: "border-4 border-black bg-white p-3 focus:outline-none focus:bg-pink-200"
27
+ },
28
+ animation_specs: "instant, snappy, no easing. Use transform translations for click states.",
29
+ asset_recommendations: "Pixel art icons, solid stark SVGs with thick stroke widths.",
30
+ tailwind_config: `theme: { extend: { boxShadow: { 'brutal': '4px 4px 0px 0px rgba(0,0,0,1)', 'brutal-lg': '8px 8px 0px 0px rgba(0,0,0,1)' } } }`
31
+ };
@@ -0,0 +1,2 @@
1
+ import { ThemeGuidelines } from "../types.js";
2
+ export declare const cyberpunk: ThemeGuidelines;
@@ -0,0 +1,31 @@
1
+ export const cyberpunk = {
2
+ inspiration: "High-tech, low-life aesthetic. Dark modes dominated by neon glowing accents, grids, and terminal-inspired UI.",
3
+ examples: ["cyberpunk.net", "hackthebox.com"],
4
+ rules: [
5
+ "Pure black backgrounds (or very dark navy/purple).",
6
+ "Glowing elements (box-shadow or text-shadow).",
7
+ "Glitch effects or CRT scanlines.",
8
+ "Angled cuts or clipped corners (clip-path)."
9
+ ],
10
+ what_to_use: ["Neon colors (cyan, magenta, yellow)", "Monospace fonts", "CSS clip-path for structural shapes", "Dark/glass layered panels"],
11
+ what_not_to_use: ["White backgrounds", "Soft pastel colors", "Rounded buttons (pills)", "Friendly serif fonts"],
12
+ color_palette: {
13
+ primary: "#FCEE0A, #00FF41, #FF003C",
14
+ background: "#080808, #120458",
15
+ text: "#E0E0E0, #00FF41",
16
+ accent: "#00E5FF"
17
+ },
18
+ typography: {
19
+ headers: "Oxanium, Orbitron, VT323",
20
+ body: "Fira Code, JetBrains Mono, Roboto Mono",
21
+ weights: "400, 700"
22
+ },
23
+ component_guidelines: {
24
+ buttons: "clip-path-polygon-[10%_0,100%_0,100%_70%,90%_100%,0_100%,0_30%] bg-yellow-400 text-black font-bold uppercase px-8 py-3 hover:bg-yellow-300 hover:shadow-[0_0_15px_rgba(252,238,10,0.7)] transition-all",
25
+ cards: "bg-gray-900 border border-cyan-500/50 p-6 shadow-[0_0_10px_rgba(0,229,255,0.2)]",
26
+ inputs: "bg-black border border-pink-600 text-pink-500 px-4 py-2 font-mono focus:outline-none focus:shadow-[0_0_10px_rgba(255,0,60,0.5)]"
27
+ },
28
+ animation_specs: "Flickering opacities, fast sharp slide-ins, glitch keyframes on hover.",
29
+ asset_recommendations: "Tech/wireframe style SVGs, minimal thin lined icons with glow.",
30
+ tailwind_config: `theme: { extend: { colors: { 'neon-pink': '#FF003C', 'neon-cyan': '#00E5FF' } } }`
31
+ };
@@ -0,0 +1,2 @@
1
+ import { ThemeGuidelines } from "../types.js";
2
+ export declare const fun: ThemeGuidelines;
@@ -0,0 +1,31 @@
1
+ export const fun = {
2
+ inspiration: "Playful, friendly, inviting, and highly engaging. Often used for consumer apps, education, or modern startups that want to stand out from corporate sterility.",
3
+ examples: ["duolingo.com", "discord.com", "linear.app (marketing illustrations)"],
4
+ rules: [
5
+ "Large border radii everywhere (full pills or 16px+ rounded corners).",
6
+ "Soft, colorful, deep drop shadows.",
7
+ "Bouncy, spring-based animations.",
8
+ "Vibrant, saturated primary colors."
9
+ ],
10
+ what_to_use: ["Rounded sans-serif fonts", "Bright gradients", "Chunky, soft buttons", "Emojis and 3D illustrations"],
11
+ what_not_to_use: ["Sharp corners (0px radius)", "Monochrome palettes", "Thin, serious serif fonts", "Strict technical grid lines"],
12
+ color_palette: {
13
+ primary: "#FF4B4B, #20D5D2, #FFB020",
14
+ background: "#F9FAFB, #FFF8F0",
15
+ text: "#1F2937",
16
+ accent: "#8B5CF6"
17
+ },
18
+ typography: {
19
+ headers: "Nunito, Quicksand, or Fredoka One",
20
+ body: "Nunito, Inter, or system-ui",
21
+ weights: "600, 700, 800"
22
+ },
23
+ component_guidelines: {
24
+ buttons: "bg-violet-500 hover:bg-violet-600 text-white font-bold rounded-full px-6 py-3 shadow-[0_8px_0_rgb(109,40,217)] active:translate-y-[4px] active:shadow-[0_4px_0_rgb(109,40,217)] transition-all",
25
+ cards: "bg-white rounded-3xl p-8 shadow-xl shadow-violet-100",
26
+ inputs: "bg-gray-100 rounded-2xl px-4 py-3 border-2 border-transparent focus:border-violet-500 focus:bg-white transition-all outline-none"
27
+ },
28
+ animation_specs: "Bouncy CSS springs or Framer Motion (type: 'spring', stiffness: 400, damping: 10). Hover scales (scale: 1.05).",
29
+ asset_recommendations: "3D emojis, Phosphor icons (duotone or bold), custom whimsical illustrations.",
30
+ tailwind_config: `theme: { extend: { borderRadius: { 'xl': '1rem', '2xl': '1.5rem', '3xl': '2rem' } } }`
31
+ };
@@ -0,0 +1,3 @@
1
+ import { ThemeGuidelines } from "../types.js";
2
+ export declare const THEMES: Record<string, ThemeGuidelines>;
3
+ export declare const THEME_KEYS: [keyof typeof THEMES, ...Array<keyof typeof THEMES>];
@@ -0,0 +1,13 @@
1
+ import { brutal } from "./brutal.js";
2
+ import { pro } from "./pro.js";
3
+ import { fun } from "./fun.js";
4
+ import { cyberpunk } from "./cyberpunk.js";
5
+ import { minimal } from "./minimal.js";
6
+ export const THEMES = {
7
+ brutal,
8
+ pro,
9
+ fun,
10
+ cyberpunk,
11
+ minimal,
12
+ };
13
+ export const THEME_KEYS = Object.keys(THEMES);
@@ -0,0 +1,2 @@
1
+ import { ThemeGuidelines } from "../types.js";
2
+ export declare const minimal: ThemeGuidelines;
@@ -0,0 +1,31 @@
1
+ export const minimal = {
2
+ inspiration: "Less but better. Focuses purely on typography, whitespace, and essential content. The un-styled aesthetic.",
3
+ examples: ["read.cv", "apple.com", "notion.so"],
4
+ rules: [
5
+ "Maximum whitespace. Double the padding you think you need.",
6
+ "Extremely limited color palette (usually just black, white, and one muted accent).",
7
+ "No borders if whitespace can separate elements instead.",
8
+ "High typographic contrast (huge sizes vs tiny sizes, thin vs bold)."
9
+ ],
10
+ what_to_use: ["Premium sans or serif fonts", "Grayscale colors", "Massive margins", "Bare minimum structural elements"],
11
+ what_not_to_use: ["Drop shadows", "Background colors on cards", "Gradients", "Unnecessary rules or dividers"],
12
+ color_palette: {
13
+ primary: "#000000",
14
+ background: "#FFFFFF, #FAFAFA",
15
+ text: "#111111, #666666",
16
+ accent: "#E5E5E5"
17
+ },
18
+ typography: {
19
+ headers: "Newsreader, Playfair Display (Serif) or Helvetica Neue, Inter (Sans)",
20
+ body: "Inter, Helvetica Neue, or system strings",
21
+ weights: "300, 400 for structural, 600 for emphasis"
22
+ },
23
+ component_guidelines: {
24
+ buttons: "bg-black text-white px-6 py-2 rounded-md hover:bg-gray-800 transition-colors tracking-wide text-sm",
25
+ cards: "bg-transparent p-0 (use whitespace to define the card rather than backgrounds)",
26
+ inputs: "border-b border-gray-300 bg-transparent px-0 py-2 focus:border-black outline-none transition-colors rounded-none"
27
+ },
28
+ animation_specs: "Very slow, elegant fades (e.g. 300ms ease-in-out opacity).",
29
+ asset_recommendations: "Feather icons (very clean, 1px stroke), real high-quality photography, no illustrations.",
30
+ tailwind_config: `theme: { extend: { spacing: { '18': '4.5rem', '22': '5.5rem' } } }`
31
+ };
@@ -0,0 +1,2 @@
1
+ import { ThemeGuidelines } from "../types.js";
2
+ export declare const pro: ThemeGuidelines;
@@ -0,0 +1,33 @@
1
+ export const pro = {
2
+ inspiration: "Professional, enterprise-grade, highly polished 'dev-tool' aesthetic. It feels premium, understated, and incredibly fast.",
3
+ examples: ["linear.app", "stripe.com", "vercel.com"],
4
+ rules: [
5
+ "Extremely subtle borders (often just 1px with low opacity white/black).",
6
+ "Lots of dark mode variations with very subtle mesh gradients or noise backgrounds.",
7
+ "Muted text colors for secondary information (text-gray-400 or text-zinc-500).",
8
+ "Perfect alignment and tight, consistent spatial systems (4px/8px grid)."
9
+ ],
10
+ what_to_use: ["Inter or Geist typography", "Subtle inset shadows", "Glassmorphic overlays for modals/menus", "Framer motion for buttery smooth transitions"],
11
+ what_not_to_use: ["Bright, saturated backgrounds", "Thick borders", "Exaggerated corner radii", "Comic fonts"],
12
+ color_palette: {
13
+ primary: "#5E6AD2 (Linear purple) or #0070F3 (Vercel blue)",
14
+ background: "#000000, #0A0A0A, #111111",
15
+ surface: "#1A1A1A, #222222",
16
+ text: "#EDEDED, #A1A1AA",
17
+ border: "rgba(255,255,255,0.1)",
18
+ accent: "#FFFFFF"
19
+ },
20
+ typography: {
21
+ headers: "Inter, Geist, SF Pro Display",
22
+ body: "Inter, Geist, SF Pro Text",
23
+ weights: "400, 500, 600. Avoid 800+ unless very specific."
24
+ },
25
+ component_guidelines: {
26
+ buttons: "bg-white/10 hover:bg-white/20 text-white border border-white/10 rounded-md px-4 py-2 text-sm font-medium transition-colors ring-1 ring-inset ring-white/10",
27
+ cards: "bg-zinc-900/50 border border-zinc-800 rounded-xl p-6 backdrop-blur-md",
28
+ inputs: "bg-zinc-950 border border-zinc-800 rounded-md px-3 py-2 text-sm text-zinc-300 focus:outline-none focus:ring-1 focus:ring-purple-500"
29
+ },
30
+ animation_specs: "Subtle fade-ins, spring physics for modals (stiffness 300, damping 30), 150ms ease-out color transitions.",
31
+ asset_recommendations: "Lucide icons (1.5px stroke), Phosphor icons (light). Keep them small and subtle.",
32
+ tailwind_config: `theme: { extend: { colors: { border: 'hsl(var(--border))', background: 'hsl(var(--background))' }, borderRadius: { 'pro': '0.5rem' } } }`
33
+ };
@@ -0,0 +1,28 @@
1
+ export interface ThemeGuidelines {
2
+ inspiration: string;
3
+ examples: string[];
4
+ rules: string[];
5
+ what_to_use: string[];
6
+ what_not_to_use: string[];
7
+ color_palette: {
8
+ primary: string;
9
+ background: string;
10
+ text: string;
11
+ accent: string;
12
+ surface?: string;
13
+ border?: string;
14
+ };
15
+ typography: {
16
+ headers: string;
17
+ body: string;
18
+ weights: string;
19
+ };
20
+ component_guidelines: {
21
+ buttons: string;
22
+ cards: string;
23
+ inputs: string;
24
+ };
25
+ animation_specs: string;
26
+ asset_recommendations: string;
27
+ tailwind_config: string;
28
+ }
package/build/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,205 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Brutal Landing Page</title>
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link
12
+ href="https://fonts.googleapis.com/css2?family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&family=Syncopate:wght@400;700&display=swap"
13
+ rel="stylesheet">
14
+ <script>
15
+ tailwind.config = {
16
+ theme: {
17
+ extend: {
18
+ colors: {
19
+ 'brutal-pink': '#FF3366',
20
+ 'brutal-cyan': '#00C4FF',
21
+ 'brutal-yellow': '#FFE800',
22
+ 'brutal-bg': '#EBEBEB',
23
+ },
24
+ fontFamily: {
25
+ 'mono': ['"Space Mono"', 'monospace'],
26
+ 'display': ['"Syncopate"', 'sans-serif'],
27
+ },
28
+ boxShadow: {
29
+ 'brutal': '4px 4px 0px 0px rgba(0,0,0,1)',
30
+ 'brutal-lg': '8px 8px 0px 0px rgba(0,0,0,1)',
31
+ 'brutal-xl': '12px 12px 0px 0px rgba(0,0,0,1)',
32
+ }
33
+ }
34
+ }
35
+ }
36
+ </script>
37
+ <style>
38
+ body {
39
+ font-family: 'Space Mono', monospace;
40
+ background-color: #EBEBEB;
41
+ color: #000;
42
+ }
43
+
44
+ h1,
45
+ h2,
46
+ h3,
47
+ h4,
48
+ h5,
49
+ h6 {
50
+ font-family: 'Syncopate', sans-serif;
51
+ }
52
+
53
+ /* Brutalism specific shapes and selection */
54
+ ::selection {
55
+ background-color: #FF3366;
56
+ color: white;
57
+ }
58
+ </style>
59
+ </head>
60
+
61
+ <body class="min-h-screen border-8 border-black m-4 md:m-8 bg-brutal-bg flex flex-col relative overflow-x-hidden">
62
+
63
+ <!-- Top Navigation -->
64
+ <nav class="border-b-8 border-black bg-white flex justify-between items-center p-4 md:p-6 sticky top-0 z-50">
65
+ <div class="text-2xl font-display font-bold uppercase tracking-tighter">
66
+ Brut<span class="text-brutal-pink">.</span>
67
+ </div>
68
+ <div class="hidden md:flex gap-8 font-bold border-4 border-black p-2 bg-brutal-cyan shadow-brutal">
69
+ <a href="#features" class="hover:bg-black hover:text-white px-2 transition-colors">Features</a>
70
+ <a href="#pricing" class="hover:bg-black hover:text-white px-2 transition-colors">Pricing</a>
71
+ <a href="#about" class="hover:bg-black hover:text-white px-2 transition-colors">About</a>
72
+ </div>
73
+ <button
74
+ class="border-4 border-black bg-brutal-pink text-white font-bold uppercase py-2 px-6 shadow-brutal active:translate-x-1 active:translate-y-1 active:shadow-none transition-all">
75
+ Login
76
+ </button>
77
+ </nav>
78
+
79
+ <!-- Hero Section -->
80
+ <header class="flex-grow flex flex-col lg:flex-row border-b-8 border-black">
81
+ <div
82
+ class="flex-1 p-8 md:p-16 lg:p-24 flex flex-col justify-center border-b-8 lg:border-b-0 lg:border-r-8 border-black bg-white">
83
+ <div
84
+ class="inline-block border-4 border-black bg-brutal-yellow self-start px-4 py-2 font-bold mb-8 shadow-brutal transform -rotate-2">
85
+ NO FLUFF. JUST FUNCTION.
86
+ </div>
87
+ <h1 class="text-5xl md:text-7xl lg:text-8xl font-black mb-8 leading-tight tracking-tighter uppercase">
88
+ Raw Power. <br>
89
+ <span class="bg-black text-white px-4 pb-2 relative top-2">Unleashed.</span>
90
+ </h1>
91
+ <p class="text-xl md:text-2xl mb-12 max-w-2xl font-bold leading-relaxed">
92
+ Break the rules of modern web design. Build something that screams. Stop using boring rounded corners
93
+ and soft drop shadows.
94
+ </p>
95
+ <div class="flex flex-col sm:flex-row gap-6">
96
+ <button
97
+ class="border-4 border-black bg-brutal-yellow text-black text-xl font-bold uppercase py-4 px-8 shadow-brutal-lg active:translate-x-2 active:translate-y-2 active:shadow-none transition-all text-center">
98
+ Get Started NOW
99
+ </button>
100
+ <button
101
+ class="border-4 border-black bg-white text-black text-xl font-bold uppercase py-4 px-8 shadow-brutal-lg hover:bg-brutal-cyan active:translate-x-2 active:translate-y-2 active:shadow-none transition-all text-center">
102
+ Read the Docs
103
+ </button>
104
+ </div>
105
+ </div>
106
+ <div class="flex-1 bg-brutal-cyan relative overflow-hidden flex items-center justify-center p-8 min-h-[400px]">
107
+ <!-- Brutalist Abstract Art -->
108
+ <div
109
+ class="w-full max-w-md aspect-square bg-brutal-pink border-8 border-black shadow-brutal-xl transform rotate-6 flex items-center justify-center relative z-10 hover:rotate-12 transition-transform duration-300">
110
+ <div
111
+ class="w-2/3 h-2/3 bg-brutal-yellow border-8 border-black rounded-full shadow-brutal transform -rotate-12 flex items-center justify-center">
112
+ <div class="w-1/2 h-1/2 bg-white border-8 border-black transform rotate-45"></div>
113
+ </div>
114
+ </div>
115
+ <!-- Decorative grid -->
116
+ <div class="absolute inset-0 opacity-20 pointer-events-none"
117
+ style="background-image: radial-gradient(#000 2px, transparent 2px); background-size: 30px 30px;"></div>
118
+ </div>
119
+ </header>
120
+
121
+ <!-- Features Section -->
122
+ <section id="features" class="p-8 md:p-16 border-b-8 border-black bg-brutal-yellow">
123
+ <h2 class="text-4xl md:text-6xl font-black mb-16 text-center uppercase tracking-tighter uppercase break-words">
124
+ <span class="border-b-8 border-black pb-2">Why Brutal?</span>
125
+ </h2>
126
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-8 md:gap-12 max-w-7xl mx-auto">
127
+ <!-- Feature 1 -->
128
+ <div class="border-4 border-black bg-white p-8 shadow-brutal-lg hover:-translate-y-2 transition-transform">
129
+ <div
130
+ class="w-16 h-16 bg-brutal-pink border-4 border-black mb-6 shadow-brutal flex items-center justify-center text-white text-2xl font-black">
131
+ 01
132
+ </div>
133
+ <h3 class="text-2xl font-black mb-4 uppercase">Unapologetic</h3>
134
+ <p class="font-bold">Stand out from the sea of identical, clean, and boring modern websites. Make a
135
+ statement.</p>
136
+ </div>
137
+
138
+ <!-- Feature 2 -->
139
+ <div
140
+ class="border-4 border-black bg-brutal-cyan p-8 shadow-brutal-lg hover:-translate-y-2 transition-transform md:translate-y-8">
141
+ <div
142
+ class="w-16 h-16 bg-white border-4 border-black mb-6 shadow-brutal flex items-center justify-center text-black text-2xl font-black">
143
+ 02
144
+ </div>
145
+ <h3 class="text-2xl font-black mb-4 uppercase">High Contrast</h3>
146
+ <p class="font-bold">Maximum visibility. No subtle grays. Black and white pushed to the absolute limits.
147
+ </p>
148
+ </div>
149
+
150
+ <!-- Feature 3 -->
151
+ <div class="border-4 border-black bg-white p-8 shadow-brutal-lg hover:-translate-y-2 transition-transform">
152
+ <div
153
+ class="w-16 h-16 bg-brutal-yellow border-4 border-black mb-6 shadow-brutal flex items-center justify-center text-black text-2xl font-black">
154
+ 03
155
+ </div>
156
+ <h3 class="text-2xl font-black mb-4 uppercase">Structural</h3>
157
+ <p class="font-bold">Expose the grid. Let the boxes be boxes. Thick borders define the space explicitly.
158
+ </p>
159
+ </div>
160
+ </div>
161
+ </section>
162
+
163
+ <!-- Call to Action -->
164
+ <section
165
+ class="p-8 md:p-24 bg-white text-center flex flex-col items-center justify-center border-b-8 border-black relative overflow-hidden">
166
+ <div class="absolute inset-0 bg-brutal-pink opacity-10"
167
+ style="background-image: repeating-linear-gradient(45deg, #000 0, #000 2px, transparent 2px, transparent 10px);">
168
+ </div>
169
+ <div
170
+ class="relative z-10 max-w-3xl border-8 border-black bg-brutal-bg p-8 md:p-16 shadow-brutal-xl transform rotate-[-1deg]">
171
+ <h2 class="text-4xl md:text-6xl font-black mb-8 uppercase tracking-tighter">Ready to Break Things?</h2>
172
+ <p class="text-xl mb-10 font-bold">Join the brutalist revolution. Stop making things "pretty" and start
173
+ making them memorable.</p>
174
+ <form class="flex flex-col sm:flex-row gap-4 w-full">
175
+ <input type="email" placeholder="ENTER EMAIL ADDRESS"
176
+ class="flex-grow border-4 border-black bg-white p-4 font-bold focus:outline-none focus:bg-brutal-cyan transition-colors text-lg placeholder-black/50">
177
+ <button type="submit"
178
+ class="border-4 border-black bg-black text-white text-xl font-bold uppercase py-4 px-8 shadow-brutal hover:bg-brutal-pink hover:text-black transition-all">
179
+ Subscribe
180
+ </button>
181
+ </form>
182
+ </div>
183
+ </section>
184
+
185
+ <!-- Footer -->
186
+ <footer class="bg-black text-white p-8 md:p-12 flex flex-col md:flex-row justify-between items-center gap-8">
187
+ <div class="text-3xl font-display font-black tracking-tighter uppercase">
188
+ Brut<span class="text-brutal-yellow">.</span>
189
+ </div>
190
+ <div class="flex gap-6">
191
+ <a href="#"
192
+ class="hover:text-brutal-pink hover:-translate-y-1 transition-transform border-b-2 border-transparent hover:border-brutal-pink pb-1">Twitter</a>
193
+ <a href="#"
194
+ class="hover:text-brutal-cyan hover:-translate-y-1 transition-transform border-b-2 border-transparent hover:border-brutal-cyan pb-1">GitHub</a>
195
+ <a href="#"
196
+ class="hover:text-brutal-yellow hover:-translate-y-1 transition-transform border-b-2 border-transparent hover:border-brutal-yellow pb-1">Dribbble</a>
197
+ </div>
198
+ <div class="font-bold">
199
+ © 2026 BRUTALIST INC.
200
+ </div>
201
+ </footer>
202
+
203
+ </body>
204
+
205
+ </html>
@@ -0,0 +1,81 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Modern Landing Page</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ </head>
9
+ <body class="bg-gray-50 text-gray-800 font-sans">
10
+ <!-- Navbar -->
11
+ <nav class="bg-white shadow-sm p-4">
12
+ <div class="max-w-6xl mx-auto flex justify-between items-center">
13
+ <div class="text-xl font-bold text-blue-600">BrandLogo</div>
14
+ <div class="space-x-4 flex items-center">
15
+ <a href="#" class="text-gray-600 hover:text-blue-600 transition-colors">Features</a>
16
+ <a href="#" class="text-gray-600 hover:text-blue-600 transition-colors">Pricing</a>
17
+ <a href="#" class="bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 transition-colors font-medium">Sign Up</a>
18
+ </div>
19
+ </div>
20
+ </nav>
21
+
22
+ <!-- Hero Section -->
23
+ <header class="max-w-6xl mx-auto px-4 py-24 text-center">
24
+ <h1 class="text-5xl font-extrabold text-gray-900 mb-6 tracking-tight leading-tight">
25
+ Build Faster With Our Tools
26
+ </h1>
27
+ <p class="text-xl text-gray-600 mb-10 max-w-2xl mx-auto">
28
+ Streamline your workflow and increase productivity with our comprehensive suite of developer tools designed for the modern web.
29
+ </p>
30
+ <div class="flex justify-center space-x-4">
31
+ <a href="#" class="bg-blue-600 text-white px-8 py-3 rounded-lg text-lg font-semibold hover:bg-blue-700 shadow-md transition-all">Get Started</a>
32
+ <a href="#" class="bg-white text-blue-600 border border-blue-600 px-8 py-3 rounded-lg text-lg font-semibold hover:bg-blue-50 transition-all">Learn More</a>
33
+ </div>
34
+ </header>
35
+
36
+ <!-- Features Section -->
37
+ <section class="bg-white py-24 border-t border-gray-100">
38
+ <div class="max-w-6xl mx-auto px-4">
39
+ <h2 class="text-3xl font-bold text-center text-gray-900 mb-16">Why Choose Us?</h2>
40
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-8">
41
+ <!-- Feature 1 -->
42
+ <div class="p-8 bg-gray-50 rounded-xl shadow-sm border border-gray-100 text-center hover:shadow-md transition-shadow">
43
+ <div class="w-14 h-14 bg-blue-100 text-blue-600 rounded-full flex items-center justify-center mx-auto mb-6">
44
+ <svg class="w-7 h-7" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
45
+ </div>
46
+ <h3 class="text-xl font-bold mb-3 text-gray-900">Lightning Fast</h3>
47
+ <p class="text-gray-600 leading-relaxed">Optimized for speed and performance, ensuring your users get the best experience possible without any delays.</p>
48
+ </div>
49
+ <!-- Feature 2 -->
50
+ <div class="p-8 bg-gray-50 rounded-xl shadow-sm border border-gray-100 text-center hover:shadow-md transition-shadow">
51
+ <div class="w-14 h-14 bg-blue-100 text-blue-600 rounded-full flex items-center justify-center mx-auto mb-6">
52
+ <svg class="w-7 h-7" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"></path></svg>
53
+ </div>
54
+ <h3 class="text-xl font-bold mb-3 text-gray-900">Secure By Default</h3>
55
+ <p class="text-gray-600 leading-relaxed">Enterprise-grade security built directly into the core, keeping your data safe from modern vulnerabilities.</p>
56
+ </div>
57
+ <!-- Feature 3 -->
58
+ <div class="p-8 bg-gray-50 rounded-xl shadow-sm border border-gray-100 text-center hover:shadow-md transition-shadow">
59
+ <div class="w-14 h-14 bg-blue-100 text-blue-600 rounded-full flex items-center justify-center mx-auto mb-6">
60
+ <svg class="w-7 h-7" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"></path></svg>
61
+ </div>
62
+ <h3 class="text-xl font-bold mb-3 text-gray-900">Always Updated</h3>
63
+ <p class="text-gray-600 leading-relaxed">We continuously push updates and improvements, so you never have to worry about maintenance and legacy software.</p>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </section>
68
+
69
+ <!-- Footer -->
70
+ <footer class="bg-gray-900 text-gray-400 py-12 text-center text-sm border-t border-gray-800">
71
+ <div class="max-w-6xl mx-auto px-4 flex flex-col md:flex-row justify-between items-center">
72
+ <div class="font-bold text-gray-300 text-lg mb-4 md:mb-0">BrandLogo</div>
73
+ <p>&copy; 2026 BrandLogo. All rights reserved.</p>
74
+ <div class="space-x-4 mt-4 md:mt-0">
75
+ <a href="#" class="hover:text-white transition-colors">Privacy</a>
76
+ <a href="#" class="hover:text-white transition-colors">Terms</a>
77
+ </div>
78
+ </div>
79
+ </footer>
80
+ </body>
81
+ </html>
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@m0xoo/unstyle",
3
+ "version": "1.1.0",
4
+ "type": "module",
5
+ "main": "build/index.js",
6
+ "scripts": {
7
+ "build": "tsc",
8
+ "start": "node build/index.js",
9
+ "test": "echo \"Error: no test specified\" && exit 1"
10
+ },
11
+ "keywords": [],
12
+ "author": "",
13
+ "license": "ISC",
14
+ "description": "UnStyle: An MCP server for providing AI UI themes.",
15
+ "dependencies": {
16
+ "@modelcontextprotocol/sdk": "^1.0.0",
17
+ "zod": "^3.23.0"
18
+ },
19
+ "devDependencies": {
20
+ "@types/node": "^20.0.0",
21
+ "tsx": "^4.0.0",
22
+ "typescript": "^5.0.0"
23
+ }
24
+ }
Binary file
Binary file
package/src/index.ts ADDED
@@ -0,0 +1,35 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { z } from "zod";
4
+
5
+ import { THEMES, THEME_KEYS } from "./themes/index.js";
6
+
7
+ const server = new McpServer({
8
+ name: "unstyle",
9
+ version: "1.1.0",
10
+ });
11
+
12
+ server.tool(
13
+ "get_theme_guidelines",
14
+ "Provide UI design guidelines, rules, color palettes, typography, and component specifications based on a specific theme style to help an LLM generate non-generic, high-quality, beautiful UI code.",
15
+ {
16
+ theme: z.enum(THEME_KEYS).describe("The target UI theme or aesthetic vibe."),
17
+ },
18
+ async ({ theme }) => {
19
+ const guidelines = THEMES[theme as string];
20
+ return {
21
+ content: [{ type: "text", text: JSON.stringify(guidelines, null, 2) }],
22
+ };
23
+ }
24
+ );
25
+
26
+ async function run() {
27
+ const transport = new StdioServerTransport();
28
+ await server.connect(transport);
29
+ console.error("UnStyle Server running on stdio");
30
+ }
31
+
32
+ run().catch((error) => {
33
+ console.error("Fatal error running server:", error);
34
+ process.exit(1);
35
+ });
@@ -0,0 +1,33 @@
1
+ import { ThemeGuidelines } from "../types.js";
2
+
3
+ export const brutal: ThemeGuidelines = {
4
+ inspiration: "Brutalism focuses on raw, unpolished, and structural elements. It's an intentional departure from modern standard web design, emphasizing huge typography, high contrast, and a 'rough' feel.",
5
+ examples: ["neo-brutalism.com", "gumroad.com", "figma.com (brand pages)"],
6
+ rules: [
7
+ "No rounded corners on structural elements unless exaggerated (e.g., 9999px or 0px).",
8
+ "Thick, solid, black borders on almost everything.",
9
+ "Hard, offset shadow blocks instead of soft drop shadows.",
10
+ "Maximal contrast, jarring color combinations are acceptable."
11
+ ],
12
+ what_to_use: ["Monospaced fonts", "Huge sans-serif headers", "Solid colors", "Thick borders (border-4 or border-8)"],
13
+ what_not_to_use: ["Gradients", "Soft shadows", "Translucency/opacity", "Delicate, thin font weights"],
14
+ color_palette: {
15
+ primary: "#FF3366, #00C4FF, #FFE800",
16
+ background: "#FFFFFF, #EBEBEB",
17
+ text: "#000000",
18
+ accent: "#000000"
19
+ },
20
+ typography: {
21
+ headers: "Syncopate, Space Mono, or heavily weighted standard sans (Inter Black)",
22
+ body: "Space Mono, Courier New, or standard sans",
23
+ weights: "400 for regular, 800+ for headers"
24
+ },
25
+ component_guidelines: {
26
+ buttons: "border-4 border-black bg-yellow-400 text-black font-bold uppercase py-3 px-6 shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] active:translate-x-1 active:translate-y-1 active:shadow-none transition-all",
27
+ cards: "border-4 border-black bg-white p-6 shadow-[8px_8px_0px_0px_rgba(0,0,0,1)]",
28
+ inputs: "border-4 border-black bg-white p-3 focus:outline-none focus:bg-pink-200"
29
+ },
30
+ animation_specs: "instant, snappy, no easing. Use transform translations for click states.",
31
+ asset_recommendations: "Pixel art icons, solid stark SVGs with thick stroke widths.",
32
+ tailwind_config: `theme: { extend: { boxShadow: { 'brutal': '4px 4px 0px 0px rgba(0,0,0,1)', 'brutal-lg': '8px 8px 0px 0px rgba(0,0,0,1)' } } }`
33
+ };
@@ -0,0 +1,33 @@
1
+ import { ThemeGuidelines } from "../types.js";
2
+
3
+ export const cyberpunk: ThemeGuidelines = {
4
+ inspiration: "High-tech, low-life aesthetic. Dark modes dominated by neon glowing accents, grids, and terminal-inspired UI.",
5
+ examples: ["cyberpunk.net", "hackthebox.com"],
6
+ rules: [
7
+ "Pure black backgrounds (or very dark navy/purple).",
8
+ "Glowing elements (box-shadow or text-shadow).",
9
+ "Glitch effects or CRT scanlines.",
10
+ "Angled cuts or clipped corners (clip-path)."
11
+ ],
12
+ what_to_use: ["Neon colors (cyan, magenta, yellow)", "Monospace fonts", "CSS clip-path for structural shapes", "Dark/glass layered panels"],
13
+ what_not_to_use: ["White backgrounds", "Soft pastel colors", "Rounded buttons (pills)", "Friendly serif fonts"],
14
+ color_palette: {
15
+ primary: "#FCEE0A, #00FF41, #FF003C",
16
+ background: "#080808, #120458",
17
+ text: "#E0E0E0, #00FF41",
18
+ accent: "#00E5FF"
19
+ },
20
+ typography: {
21
+ headers: "Oxanium, Orbitron, VT323",
22
+ body: "Fira Code, JetBrains Mono, Roboto Mono",
23
+ weights: "400, 700"
24
+ },
25
+ component_guidelines: {
26
+ buttons: "clip-path-polygon-[10%_0,100%_0,100%_70%,90%_100%,0_100%,0_30%] bg-yellow-400 text-black font-bold uppercase px-8 py-3 hover:bg-yellow-300 hover:shadow-[0_0_15px_rgba(252,238,10,0.7)] transition-all",
27
+ cards: "bg-gray-900 border border-cyan-500/50 p-6 shadow-[0_0_10px_rgba(0,229,255,0.2)]",
28
+ inputs: "bg-black border border-pink-600 text-pink-500 px-4 py-2 font-mono focus:outline-none focus:shadow-[0_0_10px_rgba(255,0,60,0.5)]"
29
+ },
30
+ animation_specs: "Flickering opacities, fast sharp slide-ins, glitch keyframes on hover.",
31
+ asset_recommendations: "Tech/wireframe style SVGs, minimal thin lined icons with glow.",
32
+ tailwind_config: `theme: { extend: { colors: { 'neon-pink': '#FF003C', 'neon-cyan': '#00E5FF' } } }`
33
+ };
@@ -0,0 +1,33 @@
1
+ import { ThemeGuidelines } from "../types.js";
2
+
3
+ export const fun: ThemeGuidelines = {
4
+ inspiration: "Playful, friendly, inviting, and highly engaging. Often used for consumer apps, education, or modern startups that want to stand out from corporate sterility.",
5
+ examples: ["duolingo.com", "discord.com", "linear.app (marketing illustrations)"],
6
+ rules: [
7
+ "Large border radii everywhere (full pills or 16px+ rounded corners).",
8
+ "Soft, colorful, deep drop shadows.",
9
+ "Bouncy, spring-based animations.",
10
+ "Vibrant, saturated primary colors."
11
+ ],
12
+ what_to_use: ["Rounded sans-serif fonts", "Bright gradients", "Chunky, soft buttons", "Emojis and 3D illustrations"],
13
+ what_not_to_use: ["Sharp corners (0px radius)", "Monochrome palettes", "Thin, serious serif fonts", "Strict technical grid lines"],
14
+ color_palette: {
15
+ primary: "#FF4B4B, #20D5D2, #FFB020",
16
+ background: "#F9FAFB, #FFF8F0",
17
+ text: "#1F2937",
18
+ accent: "#8B5CF6"
19
+ },
20
+ typography: {
21
+ headers: "Nunito, Quicksand, or Fredoka One",
22
+ body: "Nunito, Inter, or system-ui",
23
+ weights: "600, 700, 800"
24
+ },
25
+ component_guidelines: {
26
+ buttons: "bg-violet-500 hover:bg-violet-600 text-white font-bold rounded-full px-6 py-3 shadow-[0_8px_0_rgb(109,40,217)] active:translate-y-[4px] active:shadow-[0_4px_0_rgb(109,40,217)] transition-all",
27
+ cards: "bg-white rounded-3xl p-8 shadow-xl shadow-violet-100",
28
+ inputs: "bg-gray-100 rounded-2xl px-4 py-3 border-2 border-transparent focus:border-violet-500 focus:bg-white transition-all outline-none"
29
+ },
30
+ animation_specs: "Bouncy CSS springs or Framer Motion (type: 'spring', stiffness: 400, damping: 10). Hover scales (scale: 1.05).",
31
+ asset_recommendations: "3D emojis, Phosphor icons (duotone or bold), custom whimsical illustrations.",
32
+ tailwind_config: `theme: { extend: { borderRadius: { 'xl': '1rem', '2xl': '1.5rem', '3xl': '2rem' } } }`
33
+ };
@@ -0,0 +1,16 @@
1
+ import { brutal } from "./brutal.js";
2
+ import { pro } from "./pro.js";
3
+ import { fun } from "./fun.js";
4
+ import { cyberpunk } from "./cyberpunk.js";
5
+ import { minimal } from "./minimal.js";
6
+ import { ThemeGuidelines } from "../types.js";
7
+
8
+ export const THEMES: Record<string, ThemeGuidelines> = {
9
+ brutal,
10
+ pro,
11
+ fun,
12
+ cyberpunk,
13
+ minimal,
14
+ };
15
+
16
+ export const THEME_KEYS = Object.keys(THEMES) as [keyof typeof THEMES, ...Array<keyof typeof THEMES>];
@@ -0,0 +1,33 @@
1
+ import { ThemeGuidelines } from "../types.js";
2
+
3
+ export const minimal: ThemeGuidelines = {
4
+ inspiration: "Less but better. Focuses purely on typography, whitespace, and essential content. The un-styled aesthetic.",
5
+ examples: ["read.cv", "apple.com", "notion.so"],
6
+ rules: [
7
+ "Maximum whitespace. Double the padding you think you need.",
8
+ "Extremely limited color palette (usually just black, white, and one muted accent).",
9
+ "No borders if whitespace can separate elements instead.",
10
+ "High typographic contrast (huge sizes vs tiny sizes, thin vs bold)."
11
+ ],
12
+ what_to_use: ["Premium sans or serif fonts", "Grayscale colors", "Massive margins", "Bare minimum structural elements"],
13
+ what_not_to_use: ["Drop shadows", "Background colors on cards", "Gradients", "Unnecessary rules or dividers"],
14
+ color_palette: {
15
+ primary: "#000000",
16
+ background: "#FFFFFF, #FAFAFA",
17
+ text: "#111111, #666666",
18
+ accent: "#E5E5E5"
19
+ },
20
+ typography: {
21
+ headers: "Newsreader, Playfair Display (Serif) or Helvetica Neue, Inter (Sans)",
22
+ body: "Inter, Helvetica Neue, or system strings",
23
+ weights: "300, 400 for structural, 600 for emphasis"
24
+ },
25
+ component_guidelines: {
26
+ buttons: "bg-black text-white px-6 py-2 rounded-md hover:bg-gray-800 transition-colors tracking-wide text-sm",
27
+ cards: "bg-transparent p-0 (use whitespace to define the card rather than backgrounds)",
28
+ inputs: "border-b border-gray-300 bg-transparent px-0 py-2 focus:border-black outline-none transition-colors rounded-none"
29
+ },
30
+ animation_specs: "Very slow, elegant fades (e.g. 300ms ease-in-out opacity).",
31
+ asset_recommendations: "Feather icons (very clean, 1px stroke), real high-quality photography, no illustrations.",
32
+ tailwind_config: `theme: { extend: { spacing: { '18': '4.5rem', '22': '5.5rem' } } }`
33
+ };
@@ -0,0 +1,35 @@
1
+ import { ThemeGuidelines } from "../types.js";
2
+
3
+ export const pro: ThemeGuidelines = {
4
+ inspiration: "Professional, enterprise-grade, highly polished 'dev-tool' aesthetic. It feels premium, understated, and incredibly fast.",
5
+ examples: ["linear.app", "stripe.com", "vercel.com"],
6
+ rules: [
7
+ "Extremely subtle borders (often just 1px with low opacity white/black).",
8
+ "Lots of dark mode variations with very subtle mesh gradients or noise backgrounds.",
9
+ "Muted text colors for secondary information (text-gray-400 or text-zinc-500).",
10
+ "Perfect alignment and tight, consistent spatial systems (4px/8px grid)."
11
+ ],
12
+ what_to_use: ["Inter or Geist typography", "Subtle inset shadows", "Glassmorphic overlays for modals/menus", "Framer motion for buttery smooth transitions"],
13
+ what_not_to_use: ["Bright, saturated backgrounds", "Thick borders", "Exaggerated corner radii", "Comic fonts"],
14
+ color_palette: {
15
+ primary: "#5E6AD2 (Linear purple) or #0070F3 (Vercel blue)",
16
+ background: "#000000, #0A0A0A, #111111",
17
+ surface: "#1A1A1A, #222222",
18
+ text: "#EDEDED, #A1A1AA",
19
+ border: "rgba(255,255,255,0.1)",
20
+ accent: "#FFFFFF"
21
+ },
22
+ typography: {
23
+ headers: "Inter, Geist, SF Pro Display",
24
+ body: "Inter, Geist, SF Pro Text",
25
+ weights: "400, 500, 600. Avoid 800+ unless very specific."
26
+ },
27
+ component_guidelines: {
28
+ buttons: "bg-white/10 hover:bg-white/20 text-white border border-white/10 rounded-md px-4 py-2 text-sm font-medium transition-colors ring-1 ring-inset ring-white/10",
29
+ cards: "bg-zinc-900/50 border border-zinc-800 rounded-xl p-6 backdrop-blur-md",
30
+ inputs: "bg-zinc-950 border border-zinc-800 rounded-md px-3 py-2 text-sm text-zinc-300 focus:outline-none focus:ring-1 focus:ring-purple-500"
31
+ },
32
+ animation_specs: "Subtle fade-ins, spring physics for modals (stiffness 300, damping 30), 150ms ease-out color transitions.",
33
+ asset_recommendations: "Lucide icons (1.5px stroke), Phosphor icons (light). Keep them small and subtle.",
34
+ tailwind_config: `theme: { extend: { colors: { border: 'hsl(var(--border))', background: 'hsl(var(--background))' }, borderRadius: { 'pro': '0.5rem' } } }`
35
+ };
package/src/types.ts ADDED
@@ -0,0 +1,28 @@
1
+ export interface ThemeGuidelines {
2
+ inspiration: string;
3
+ examples: string[];
4
+ rules: string[];
5
+ what_to_use: string[];
6
+ what_not_to_use: string[];
7
+ color_palette: {
8
+ primary: string;
9
+ background: string;
10
+ text: string;
11
+ accent: string;
12
+ surface?: string;
13
+ border?: string;
14
+ };
15
+ typography: {
16
+ headers: string;
17
+ body: string;
18
+ weights: string;
19
+ };
20
+ component_guidelines: {
21
+ buttons: string;
22
+ cards: string;
23
+ inputs: string;
24
+ };
25
+ animation_specs: string;
26
+ asset_recommendations: string;
27
+ tailwind_config: string;
28
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "rootDir": "./src",
7
+ "outDir": "./build",
8
+ "esModuleInterop": true,
9
+ "forceConsistentCasingInFileNames": true,
10
+ "strict": true,
11
+ "skipLibCheck": true,
12
+ "declaration": true
13
+ },
14
+ "include": [
15
+ "src/**/*"
16
+ ]
17
+ }