Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
e3102cb
Improve design system output with Unicode borders, ANSI color swatche…
Mar 15, 2026
83692f7
Create python-package-conda.yml
amyragan3297 Mar 17, 2026
7faef3e
Merge pull request #191 from amyragan3297/amyragan3297-patch-1
mrgoonie Apr 3, 2026
b7e3af8
Merge pull request #184 from Jenser77/feat/design-system-visual-impro…
mrgoonie Apr 3, 2026
fdc0a45
fix: correct project name from 'Antigravity Kit' to 'UI UX Pro Max' i…
icaruszxk Jun 20, 2026
5e2c0a2
docs: add Troubleshooting section to README (closes #304 #318 #338) (…
Spinulosa1111 Jun 20, 2026
03e6afc
ci: add paths-ignore to python-package-conda workflow (#312)
roynaquin Jun 21, 2026
71d02ec
fix(meta): align marketplace.json and package-lock.json to v2.5.0 (#327)
alfredo-petri Jun 21, 2026
c522197
fix(cli): implement --force flag to protect existing skill files (#324)
alfredo-petri Jun 21, 2026
f32d6a6
Add openclaw to platforms list (#308)
yinhaoti Jun 21, 2026
9dea1bc
fix: remove unsubstituted template variable from slides/SKILL.md (#287)
xiaolai Jun 21, 2026
7538cfb
docs: add Windows Python compatibility note (#280)
jialanhu0915 Jun 21, 2026
10d6ca3
Fix 3 latent bugs in ui-ux-pro-max (css2 font URLs, 2-char search, pe…
OmexIT Jun 21, 2026
a3dea0d
fix: replace execSync template string with execFileSync array form (#…
xiaolai Jun 21, 2026
fb1fc58
feat(nuxt-ui): update stack data to v4 (#345)
Ray0907 Jun 21, 2026
53d670c
feat: add JavaFX enterprise stack guidance (#316)
youngledo Jun 22, 2026
c0fca2e
feat(release): add semantic release automation (#375)
mrgoonie Jun 22, 2026
cf96c6a
fix(release): run semantic-release command as multiline script
Jun 22, 2026
9a863a5
fix(release): avoid protected main writes
Jun 22, 2026
9bb646b
fix: validate plugin names in tailwind config generator to prevent co…
TemaDeveloper Jun 22, 2026
d457006
fix: HTML-escape all user data in slide generator to prevent XSS (#274)
TemaDeveloper Jun 22, 2026
1518fec
docs: add CONTRIBUTING.md guide for new contributors (#264)
bhasan26 Jun 23, 2026
a13b2a0
fix: bump skill.json version to 2.6.2 (#382)
shipengqi Jun 24, 2026
381f01d
fix: pin shadcn version instead of @latest
xiaolai Jun 24, 2026
bdf1179
fix: replace colon with hyphen in skill names (#383)
cmonty14 Jun 24, 2026
efa5137
feat(cli): add optional GitHub token support for higher API rate limi…
orbisai0security Jun 25, 2026
b4d33be
fix CLI asset sync (#355)
ia-abatista Jun 25, 2026
3ebb9c8
feat(release): publish uipro-cli to npm on release (#384)
ia-abatista Jun 25, 2026
57d9ba7
fix(cli): replace stale data/scripts pointer files on install (#386)
ia-abatista Jun 25, 2026
3a12b63
fix(scripts): guard persist_design_system against None project_name (…
ia-abatista Jun 25, 2026
4ab7038
fix(cli): make uipro update upgrade CLI via npm
ia-abatista Jun 25, 2026
232f201
fix(plugin): register all 7 skills in the Claude Code plugin (#385)
ia-abatista Jun 25, 2026
ef5f5ba
fix(cli): install all 7 skills via uipro init, not just the orchestra…
ia-abatista Jun 25, 2026
7d62cd0
fix(manifests): correct style/font-pairing/stack counts (#289) (#391)
ia-abatista Jun 25, 2026
d86f443
fix(scripts): force UTF-8 stdout/stderr in design_system.py on Window…
ia-abatista Jun 25, 2026
318e0b2
fix(cli): use npm-canonical bin path so the uipro command survives pu…
ia-abatista Jun 25, 2026
090a405
feat(stacks): add 5 .NET desktop stacks — WPF, WinUI 3, UWP, Avalonia…
jizc Jun 25, 2026
cc3d1be
fix(cli): publish under fallback npm package (#393)
mrgoonie Jun 26, 2026
e3a7f27
docs: make SKILL.md stack-neutral instead of React Native-only (#372)
heitrix Jun 26, 2026
9fd25fe
Fix codegen/validator bugs and a standalone-install break across four…
Pirate252 Jun 26, 2026
65e2319
Merge pull request #242 from jizc/feature/desktop-apps
clark-cant Jun 26, 2026
8a81ed6
Merge PR #223: Expand products database with 31 new product types and…
munir-abbasi Jun 28, 2026
3327f9d
feat: add three UI project examples (#174)
nhatvy142 Jun 29, 2026
782d4e7
docs: add Chinese README with bilingual support (#173)
fivvvvvv Jun 29, 2026
3effe97
Add Basic vs. Premium Version Comparison to README (#232)
mirtafon Jun 29, 2026
8e43c9d
docs: Add compatible agents section with AdaL (#142)
liyin2015 Jul 1, 2026
bd9329c
Add motion domain and design dials to design-system generator
Jul 1, 2026
4f341e2
Sync cli/assets with src (catch up pre-existing drift)
Jul 1, 2026
d7e37dd
docs: sync Chinese README with English version (#403)
fivvvvvv Jul 2, 2026
247bf48
docs: sync CLAUDE.md stack list with core.py STACK_CONFIG (#404)
Isi-blip Jul 2, 2026
6a61676
Rename motion domain to gsap to avoid collision with PR #296
Jul 2, 2026
bf5c3cf
Merge pull request #402 from Abraham040203/feat/motion-domain-design-…
clark-cant Jul 2, 2026
9ceab49
docs: fix Premium tier domain typo in README (uipm.cc -> uupm.cc) (#405)
saranp1 Jul 2, 2026
137597b
fix: validate design data and support node builds
mikeholownych Jul 3, 2026
4baa399
Merge pull request #407 from mikeholownych/fix/data-validation-and-bu…
clark-cant Jul 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
"name": "nextlevelbuilder"
},
"metadata": {
"description": "UI/UX design intelligence skill with 67 styles, 96 palettes, 57 font pairings, 25 charts, and 13 stack guidelines",
"version": "2.2.1"
"description": "UI/UX design intelligence skill with 84 styles, 161 palettes, 73 font pairings, 25 charts, and 17 stack guidelines",
"version": "2.6.2"
},
"plugins": [
{
"name": "ui-ux-pro-max",
"source": "./",
"description": "Professional UI/UX design intelligence for AI coding assistants. Includes searchable databases of styles, colors, typography, charts, and UX guidelines for React, Next.js, Astro, Vue, Nuxt.js, Nuxt UI, Svelte, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui, and Jetpack Compose.",
"version": "2.2.1",
"description": "Professional UI/UX design intelligence for AI coding assistants. Includes searchable databases of styles, colors, typography, charts, and UX guidelines for React, Next.js, Astro, Vue, Nuxt.js, Nuxt UI, Svelte, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui, Jetpack Compose, Angular, Laravel, JavaFX, and Three.js.",
"version": "2.6.2",
"author": {
"name": "nextlevelbuilder"
},
Expand Down
6 changes: 3 additions & 3 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"name": "ui-ux-pro-max",
"description": "UI/UX design intelligence. 67 styles, 161 palettes, 57 font pairings, 25 charts, 15 stacks (React, Next.js, Vue, Svelte, Astro, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui, Nuxt, Jetpack Compose). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient.",
"version": "2.5.0",
"description": "UI/UX design intelligence. 84 styles, 161 palettes, 73 font pairings, 25 charts, 17 stacks (React, Next.js, Vue, Nuxt.js, Nuxt UI, Svelte, Astro, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui, Jetpack Compose, Angular, Laravel, JavaFX, Three.js). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient.",
"version": "2.6.2",
"author": {
"name": "nextlevelbuilder"
},
"license": "MIT",
"keywords": ["ui", "ux", "design", "styles", "typography", "color-palette", "accessibility", "charts", "components"],
"skills": ["./.claude/skills/ui-ux-pro-max"]
"skills": "./.claude/skills/"
}
6 changes: 5 additions & 1 deletion .claude/skills/banner-design/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
name: ckm:banner-design
name: banner-design
description: "Design banners for social media, ads, website heroes, creative assets, and print. Multiple art direction options with AI-generated visuals. Actions: design, create, generate banner. Platforms: Facebook, Twitter/X, LinkedIn, YouTube, Instagram, Google Display, website hero, print. Styles: minimalist, gradient, bold typography, photo-based, illustrated, geometric, retro, glassmorphism, 3D, neon, duotone, editorial, collage. Uses ui-ux-pro-max, frontend-design, ai-artist, ai-multimodal skills."
argument-hint: "[platform] [style] [dimensions]"
license: MIT
Expand All @@ -21,6 +21,10 @@ Design banners across social, ads, web, and print formats. Generates multiple ar
- Event/print banner design
- Creative asset generation for campaigns

## Prerequisites

**Python:** This skill uses Python scripts. On Windows, use `python` instead of `python3` (e.g., `python scripts/search.py` instead of `python3 scripts/search.py`).

## Workflow

### Step 1: Gather Requirements (AskUserQuestion)
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/brand/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
name: ckm:brand
name: brand
description: Brand voice, visual identity, messaging frameworks, asset management, brand consistency. Activate for branded content, tone of voice, marketing assets, brand compliance, style guides.
argument-hint: "[update|review|create] [args]"
metadata:
Expand Down
124 changes: 53 additions & 71 deletions .claude/skills/brand/scripts/sync-brand-to-tokens.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const { execFileSync } = require('child_process');

// Paths
const BRAND_GUIDELINES = 'docs/brand-guidelines.md';
Expand All @@ -29,61 +29,47 @@ function extractColorsFromMarkdown(content) {
accent: { name: 'accent', shades: {} }
};

// Extract primary color name and hex from Quick Reference table
const quickRefMatch = content.match(/Primary Color\s*\|\s*#([A-Fa-f0-9]{6})\s*\(([^)]+)\)/);
if (quickRefMatch) {
colors.primary.name = quickRefMatch[2].toLowerCase().replace(/\s+/g, '-');
colors.primary.base = `#${quickRefMatch[1]}`;
}

const secondaryMatch = content.match(/Secondary Color\s*\|\s*#([A-Fa-f0-9]{6})\s*\(([^)]+)\)/);
if (secondaryMatch) {
colors.secondary.name = secondaryMatch[2].toLowerCase().replace(/\s+/g, '-');
colors.secondary.base = `#${secondaryMatch[1]}`;
}
// Match a "| Label | #hex |" markdown table row. Bold around the label
// (**Label**) is optional, so this handles both the bundled starter template
// ("| Primary Blue | #2563EB |") and bolded variants.
const rowRe = /\|\s*\*{0,2}([^*|]+?)\*{0,2}\s*\|\s*#([A-Fa-f0-9]{6})\b/g;

const accentMatch = content.match(/Accent Color\s*\|\s*#([A-Fa-f0-9]{6})\s*\(([^)]+)\)/);
if (accentMatch) {
colors.accent.name = accentMatch[2].toLowerCase().replace(/\s+/g, '-');
colors.accent.base = `#${accentMatch[1]}`;
}

// Extract all shades from Primary Colors table
const primarySection = content.match(/### Primary Colors[\s\S]*?\|[\s\S]*?(?=###|$)/i);
if (primarySection) {
const hexMatches = primarySection[0].matchAll(/\*\*([^*]+)\*\*\s*\|\s*#([A-Fa-f0-9]{6})/g);
for (const match of hexMatches) {
const name = match[1].trim().toLowerCase();
const hex = `#${match[2]}`;
if (name.includes('dark')) colors.primary.dark = hex;
else if (name.includes('light')) colors.primary.light = hex;
else colors.primary.base = hex;
}
// 1) Quick Reference table — hex only, no parenthesized name required.
const quickRef = {
primary: /Primary Color\s*\|\s*#([A-Fa-f0-9]{6})/i,
secondary: /Secondary Color\s*\|\s*#([A-Fa-f0-9]{6})/i,
accent: /Accent Color\s*\|\s*#([A-Fa-f0-9]{6})/i
};
for (const key of Object.keys(quickRef)) {
const m = content.match(quickRef[key]);
if (m) colors[key].base = `#${m[1]}`;
}

// Extract secondary shades
const secondarySection = content.match(/### Secondary Colors[\s\S]*?\|[\s\S]*?(?=###|$)/i);
if (secondarySection) {
const hexMatches = secondarySection[0].matchAll(/\*\*([^*]+)\*\*\s*\|\s*#([A-Fa-f0-9]{6})/g);
for (const match of hexMatches) {
const name = match[1].trim().toLowerCase();
const hex = `#${match[2]}`;
if (name.includes('dark')) colors.secondary.dark = hex;
else if (name.includes('light')) colors.secondary.light = hex;
else colors.secondary.base = hex;
// 2) Dedicated "### <Role> Colors" tables — assign base/dark/light by the
// row label keyword.
const assignFromSection = (heading, target) => {
const section = content.match(new RegExp(`### ${heading}[\\s\\S]*?(?=\\n###|$)`, 'i'));
if (!section) return;
for (const m of section[0].matchAll(rowRe)) {
const label = m[1].trim().toLowerCase();
const hex = `#${m[2]}`;
if (label.includes('dark')) target.dark = hex;
else if (label.includes('light')) target.light = hex;
else if (!target.base) target.base = hex;
}
}

// Extract accent shades
const accentSection = content.match(/### Accent Colors[\s\S]*?\|[\s\S]*?(?=###|$)/i);
if (accentSection) {
const hexMatches = accentSection[0].matchAll(/\*\*([^*]+)\*\*\s*\|\s*#([A-Fa-f0-9]{6})/g);
for (const match of hexMatches) {
const name = match[1].trim().toLowerCase();
const hex = `#${match[2]}`;
if (name.includes('dark')) colors.accent.dark = hex;
else if (name.includes('light')) colors.accent.light = hex;
else colors.accent.base = hex;
};
assignFromSection('Primary Colors', colors.primary);
assignFromSection('Secondary Colors', colors.secondary);
assignFromSection('Accent Colors', colors.accent);

// 3) Fallback: an accent swatch may live in another table (the starter
// lists "Accent Green" under Secondary Colors).
if (!colors.accent.base) {
for (const m of content.matchAll(rowRe)) {
if (m[1].trim().toLowerCase().includes('accent')) {
colors.accent.base = `#${m[2]}`;
break;
}
}
}

Expand Down Expand Up @@ -113,6 +99,7 @@ function generateColorScale(baseHex, darkHex, lightHex) {
* Adjust hex color brightness
*/
function adjustBrightness(hex, percent) {
if (typeof hex !== 'string') return '#000000';
const num = parseInt(hex.replace('#', ''), 16);
const r = Math.min(255, Math.max(0, (num >> 16) + Math.round(255 * percent)));
const g = Math.min(255, Math.max(0, ((num >> 8) & 0x00FF) + Math.round(255 * percent)));
Expand All @@ -129,29 +116,24 @@ function updateDesignTokens(tokens, colors) {
tokens.brand = brandName;

// Update primitive colors with new names
const primitiveColors = tokens.primitive?.color || {};
tokens.primitive = tokens.primitive || {};
const primitiveColors = tokens.primitive.color || {};

// Remove old color keys, add new ones
delete primitiveColors.coral;
delete primitiveColors.purple;
delete primitiveColors.mint;

// Add new named colors
primitiveColors[colors.primary.name] = generateColorScale(
colors.primary.base,
colors.primary.dark,
colors.primary.light
);
primitiveColors[colors.secondary.name] = generateColorScale(
colors.secondary.base,
colors.secondary.dark,
colors.secondary.light
);
primitiveColors[colors.accent.name] = generateColorScale(
colors.accent.base,
colors.accent.dark,
colors.accent.light
);
// Add new named colors. Skip any role with no base hex rather than crashing
// on an unexpected guidelines format.
for (const role of ['primary', 'secondary', 'accent']) {
const c = colors[role];
if (!c.base) {
console.warn(`⚠️ No base hex found for ${role} color — skipping its token scale.`);
continue;
}
primitiveColors[c.name] = generateColorScale(c.base, c.dark, c.light);
}

tokens.primitive.color = primitiveColors;

Expand Down Expand Up @@ -191,7 +173,7 @@ function updateDesignTokens(tokens, colors) {
}

// Update component references (button uses primary color with opacity)
if (tokens.component?.button?.secondary) {
if (tokens.component?.button?.secondary && colors.primary.base) {
const primaryBase = colors.primary.base;
tokens.component.button.secondary['bg-hover'] = {
"$value": `${primaryBase}1A`,
Expand Down Expand Up @@ -250,7 +232,7 @@ function main() {
const generateScript = path.resolve(process.cwd(), GENERATE_TOKENS_SCRIPT);
if (fs.existsSync(generateScript)) {
try {
execSync(`node ${generateScript} --config ${DESIGN_TOKENS_JSON} -o ${DESIGN_TOKENS_CSS}`, {
execFileSync('node', [generateScript, '--config', DESIGN_TOKENS_JSON, '-o', DESIGN_TOKENS_CSS], {
cwd: process.cwd(),
stdio: 'inherit'
});
Expand Down
52 changes: 52 additions & 0 deletions .claude/skills/brand/scripts/tests/test_sync_brand_to_tokens.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"""Regression test for sync-brand-to-tokens.cjs.

The color parser required a parenthesized name in the Quick Reference row
(`#2563EB (name)`) and a bolded label in the color tables (`**Primary Blue**`),
neither of which the bundled starter template uses. As a result the base hex
came back `undefined` and `adjustBrightness(undefined)` threw a TypeError —
i.e. the script crashed on its own documented happy path. This test runs the
sync against the bundled starter template and asserts it completes and writes
the expected base colors. It is pytest-based so the existing pytest CI runs it.
"""

import json
import shutil
import subprocess
from pathlib import Path

import pytest

SCRIPTS = Path(__file__).resolve().parent.parent
SCRIPT = SCRIPTS / "sync-brand-to-tokens.cjs"
BRAND_STARTER = SCRIPTS.parent / "templates" / "brand-guidelines-starter.md"
TOKENS_STARTER = (
SCRIPTS.parent.parent / "design-system" / "templates" / "design-tokens-starter.json"
)


def test_sync_parses_bundled_starter_template(tmp_path):
node = shutil.which("node")
if not node:
pytest.skip("node not available")

(tmp_path / "docs").mkdir()
(tmp_path / "assets").mkdir()
shutil.copy(BRAND_STARTER, tmp_path / "docs" / "brand-guidelines.md")
shutil.copy(TOKENS_STARTER, tmp_path / "assets" / "design-tokens.json")

result = subprocess.run(
[node, str(SCRIPT)],
cwd=tmp_path,
capture_output=True,
text=True,
)

# Must not crash (the bug raised an unhandled TypeError).
assert "TypeError" not in result.stderr, result.stderr
assert result.returncode == 0, result.stderr + result.stdout

tokens = json.loads((tmp_path / "assets" / "design-tokens.json").read_text())
primitive = tokens["primitive"]["color"]
assert primitive["primary"]["500"]["$value"] == "#2563EB"
assert primitive["secondary"]["500"]["$value"] == "#8B5CF6"
assert primitive["accent"]["500"]["$value"] == "#10B981"
2 changes: 1 addition & 1 deletion .claude/skills/design-system/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
name: ckm:design-system
name: design-system
description: Token architecture, component specifications, and slide generation. Three-layer tokens (primitive→semantic→component), CSS variables, spacing/typography scales, component specs, strategic slide creation. Use for design tokens, systematic design, brand-compliant presentations.
argument-hint: "[component or token]"
license: MIT
Expand Down
Loading