@uselets/ui 1.0.0 → 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 +16 -8
- package/dist/cli/uselets.mjs +2 -2
- package/dist/cli/uselets.mjs.map +1 -1
- package/dist/components/card.js +1 -1
- package/dist/components/card.js.map +1 -1
- package/dist/skills/uselets-ui/SKILL.md +2 -3
- package/dist/skills/uselets-ui/references/package-guide.md +8 -9
- package/dist/skills/uselets-ui/scripts/print-public-api.mjs +0 -1
- package/dist/styles/base.css +13 -0
- package/dist/styles/globals.css +8 -0
- package/dist/styles/gomax.css +202 -0
- package/dist/styles/max.css +203 -0
- package/dist/styles/theme.css +195 -0
- package/dist/themes/gomax.css +3 -2
- package/dist/themes/max.css +3 -2
- package/package.json +1 -2
- package/skills/uselets-ui/SKILL.md +2 -3
- package/skills/uselets-ui/references/package-guide.md +8 -9
- package/skills/uselets-ui/scripts/print-public-api.mjs +0 -1
- package/dist/styles.css +0 -2
package/README.md
CHANGED
|
@@ -76,24 +76,33 @@ npm install tailwindcss @tailwindcss/postcss
|
|
|
76
76
|
export { default } from '@uselets/ui/postcss.config'
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
3. Import Tailwind in your global stylesheet:
|
|
79
|
+
3. Import Tailwind, one package theme, and the Inter font in your global stylesheet:
|
|
80
80
|
|
|
81
81
|
```css
|
|
82
82
|
/* app.css */
|
|
83
83
|
@import 'tailwindcss';
|
|
84
|
+
@import '@uselets/ui/themes/max.css';
|
|
85
|
+
@import '@fontsource-variable/inter';
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Use `@uselets/ui/themes/gomax.css` instead for GoMax apps. If your app consumes `@uselets/ui` components, add a
|
|
89
|
+
source directive so Tailwind can generate classes used by the package:
|
|
90
|
+
|
|
91
|
+
```css
|
|
92
|
+
@source '../node_modules/@uselets/ui/dist';
|
|
84
93
|
```
|
|
85
94
|
|
|
86
95
|
## Quick start
|
|
87
96
|
|
|
88
|
-
1. Import one package theme once in your
|
|
97
|
+
1. Import one package theme once in your global stylesheet:
|
|
89
98
|
|
|
90
|
-
```
|
|
91
|
-
import '
|
|
92
|
-
import '@
|
|
99
|
+
```css
|
|
100
|
+
@import 'tailwindcss';
|
|
101
|
+
@import '@uselets/ui/themes/max.css';
|
|
102
|
+
@import '@fontsource-variable/inter';
|
|
93
103
|
```
|
|
94
104
|
|
|
95
|
-
For GoMax apps, import `@uselets/ui/themes/gomax.css` instead.
|
|
96
|
-
`@uselets/ui/styles.css` entrypoint is still available and is equivalent to the Max theme.
|
|
105
|
+
For GoMax apps, import `@uselets/ui/themes/gomax.css` instead.
|
|
97
106
|
|
|
98
107
|
2. Import components from the package root:
|
|
99
108
|
|
|
@@ -127,7 +136,6 @@ The package ships brand theme entrypoints:
|
|
|
127
136
|
- `@uselets/ui/themes/max.css`
|
|
128
137
|
- `@uselets/ui/themes/gomax.css`
|
|
129
138
|
|
|
130
|
-
The compatibility stylesheet (`@uselets/ui/styles.css`) uses the Max theme.
|
|
131
139
|
Max and GoMax are maintained from their respective Figma style guides. The Storybook
|
|
132
140
|
`Foundations/Themes` story reads the active stylesheet tokens, so it is the theme-backed
|
|
133
141
|
palette preview for both theme entrypoints.
|
package/dist/cli/uselets.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import{spawn as e}from"node:child_process";import t from"node:fs/promises";import n from"node:path";import r from"node:readline/promises";import{fileURLToPath as i}from"node:url";import{Command as a,Option as o}from"commander";const s=`uselets-ui`,c={codex:n.join(`.agents`,`skills`,s),claude:n.join(`.claude`,`skills`,s)},l=Object.keys(c);async function u(e){try{return await t.access(e),!0}catch{return!1}}async function d(e){return JSON.parse(await t.readFile(e,`utf8`))}async function f(){let e=i(new URL(`.`,import.meta.url));for(;;)try{return await t.access(n.join(e,`package.json`)),e}catch{let t=n.dirname(e);if(t===e)throw Error(`Unable to resolve @uselets/ui package root`);e=t}}function p(e){return e===`all`?l:[e]}function m(e,t){return!!(e.dependencies?.[t]||e.devDependencies?.[t]||e.peerDependencies?.[t]||e.optionalDependencies?.[t])}async function h(e,t){let r=t.packageManager?.split(`@`)[0];return r===`bun`||r===`pnpm`||r===`yarn`||r===`npm`?r:await u(n.join(e,`bun.lock`))?`bun`:await u(n.join(e,`pnpm-lock.yaml`))?`pnpm`:await u(n.join(e,`yarn.lock`))?`yarn`:(await u(n.join(e,`package-lock.json`)),`npm`)}function g(e,t,n){switch(e){case`bun`:return[`bun`,`add`,...n?[`-d`]:[],...t];case`pnpm`:return[`pnpm`,`add`,...n?[`-D`]:[],...t];case`yarn`:return[`yarn`,`add`,...n?[`-D`]:[],...t];case`npm`:return[`npm`,`install`,...n?[`-D`]:[],...t]}}async function _(t,n){let[r,...i]=t;if(!r)throw Error(`Missing command`);console.log(`Running: ${t.join(` `)}`),await new Promise((t,a)=>{let o=e(r,i,{cwd:n,stdio:`inherit`});o.on(`error`,a),o.on(`close`,e=>{if(e===0){t();return}a(Error(`${r} exited with code ${e}`))})})}function v(e,t){let n=e.dependencies?.[t]??e.devDependencies?.[t];if(!n)throw Error(`Unable to find ${t} version in @uselets/ui package metadata`);return n}async function y(e,t){let r=await f(),i=await d(n.join(r,`package.json`)),a=await h(e,t),o=[],s=[];if(!i.name||!i.version)throw Error(`Unable to resolve @uselets/ui package name and version`);m(t,i.name)||o.push(`${i.name}@${i.version}`),m(t,`@fontsource-variable/inter`)||o.push(`@fontsource-variable/inter@${v(i,`@fontsource-variable/inter`)}`),m(t,`tailwindcss`)||s.push(`tailwindcss@${v(i,`tailwindcss`)}`),m(t,`@tailwindcss/postcss`)||s.push(`@tailwindcss/postcss@${v(i,`@tailwindcss/postcss`)}`),o.length>0?await _(g(a,o,!1),e):console.log(`Runtime dependencies already declared.`),s.length>0?await _(g(a,s,!0),e):console.log(`Tailwind dependencies already declared.`)}async function b(e){let r=await f(),i=n.join(r,`skills`,s);try{await t.access(i)}catch{throw Error(`Bundled skill not found at ${i}`)}let a=[];for(let r of e){let e=n.join(process.cwd(),c[r]);await t.rm(e,{recursive:!0,force:!0}),await t.mkdir(n.dirname(e),{recursive:!0}),await t.cp(i,e,{recursive:!0}),a.push(e)}console.log(`Installed ${s} skill:`);for(let e of a)console.log(`- ${e}`)}async function x(){return r.createInterface({input:process.stdin,output:process.stdout})}async function S(e){if(!process.stdin.isTTY)return e;let t=await x();try{for(;;){let n=(await t.question(`Theme (max/gomax) [${e}]: `)).trim().toLowerCase();if(!n)return e;if(n===`max`||n===`gomax`)return n;console.log(`Please choose "max" or "gomax".`)}}finally{t.close()}}async function C(e){if(!process.stdin.isTTY)return e;let t=await x();try{return(await t.question(`Global CSS path [${e}]: `)).trim()||e}finally{t.close()}}async function w(){if(!process.stdin.isTTY)return!1;let e=await x();try{for(;;){let t=(await e.question(`Install agent skill? (y/N): `)).trim().toLowerCase();if(!t||t===`n`||t===`no`)return!1;if(t===`y`||t===`yes`)return!0;console.log(`Please answer "y" or "n".`)}}finally{e.close()}}async function T(e){let r=n.join(e,`postcss.config.mjs`);if(await u(r)){console.log(`Preserved existing postcss.config.mjs.`);return}await t.writeFile(r,`export { default } from '@uselets/ui/postcss.config'
|
|
3
|
-
`),console.log(`Created postcss.config.mjs.`)}function E(e,t){let
|
|
3
|
+
`),console.log(`Created postcss.config.mjs.`)}function E(e){let t=n.posix.dirname(e.replaceAll(n.sep,n.posix.sep)),r=n.posix.relative(t,`node_modules/@uselets/ui/dist`);return r.startsWith(`.`)?r:`./${r}`}function D(e,t,n){let r=[],i=/@import\s+['"]tailwindcss['"]/.test(e),a=/@import\s+['"]@uselets\/ui\/themes\/(?:max|gomax)\.css['"]/.test(e),o=/@import\s+['"]@fontsource-variable\/inter['"]/.test(e),s=/@source\s+['"][^'"]*@uselets\/ui\/dist['"]/.test(e);return i||r.push(`@import 'tailwindcss';`),a||r.push(`@import '@uselets/ui/themes/${t}.css';`),o||r.push(`@import '@fontsource-variable/inter';`),s||r.push(`@source '${E(n)}';`),{imports:r,hasTheme:a}}async function O(e,r,i){let a=n.resolve(e,r),o=await u(a)?await t.readFile(a,`utf8`):``,{imports:s,hasTheme:c}=D(o,i,r);if(c&&console.log(`Preserved existing @uselets/ui theme import.`),s.length===0){console.log(`Global CSS already configured at ${r}.`);return}let l=o.length>0&&!o.startsWith(`
|
|
4
4
|
`)?`
|
|
5
5
|
`:``,d=`${s.join(`
|
|
6
|
-
`)}${l}${o}`;await t.mkdir(n.dirname(a),{recursive:!0}),await t.writeFile(a,d),console.log(`Updated global CSS at ${r}.`)}async function
|
|
6
|
+
`)}${l}${o}`;await t.mkdir(n.dirname(a),{recursive:!0}),await t.writeFile(a,d),console.log(`Updated global CSS at ${r}.`)}async function k(e){let t=process.cwd(),r=n.join(t,`package.json`);if(!await u(r))throw Error(`No package.json found in the current directory. Run uselets init from your project root.`);let i=await d(r),a=e.theme??await S(`max`),o=e.css??await C(`src/styles/globals.css`),s=e.installSkill??await w();await y(t,i),await T(t),await O(t,o,a),s&&await b(l)}async function A(){let e=new a;if(e.name(`uselets`).description(`CLI for @uselets/ui`).showHelpAfterError(),e.command(`skill`).description(`Reinstall the ${s} agent skill`).addOption(new o(`--agent <agent>`,`Target agent directory`).choices([`codex`,`claude`,`all`]).default(`all`)).action(async e=>{await b(p(e.agent))}),e.command(`init`).description(`Set up @uselets/ui in this project`).addOption(new o(`--theme <theme>`,`Theme to import`).choices([`max`,`gomax`])).option(`--css <path>`,`Global CSS file path`).option(`--install-skill`,`Install the agent skill without prompting`).option(`--no-install-skill`,`Skip the agent skill prompt and installation`).action(async e=>{await k(e)}),process.argv.length<=2){e.outputHelp();return}await e.parseAsync()}A().catch(e=>{console.error(e instanceof Error?e.message:e),process.exitCode=1});export{};
|
|
7
7
|
//# sourceMappingURL=uselets.mjs.map
|
package/dist/cli/uselets.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uselets.mjs","names":[],"sources":["../../src/cli/uselets.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { spawn } from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport readline from 'node:readline/promises'\nimport { fileURLToPath } from 'node:url'\n\nimport { Command, Option } from 'commander'\n\nconst SKILL_NAME = 'uselets-ui'\nconst DEFAULT_CSS_PATH = 'src/styles/globals.css'\nconst POSTCSS_CONFIG = \"export { default } from '@uselets/ui/postcss.config'\\n\"\nconst AGENT_TARGETS = {\n codex: path.join('.agents', 'skills', SKILL_NAME),\n claude: path.join('.claude', 'skills', SKILL_NAME)\n} as const\n\ntype AgentTarget = keyof typeof AGENT_TARGETS\ntype AgentOption = AgentTarget | 'all'\ntype ThemeOption = 'max' | 'gomax'\ntype PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm'\ntype PackageJson = {\n name?: string\n version?: string\n packageManager?: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n optionalDependencies?: Record<string, string>\n}\ntype InitOptions = {\n theme?: ThemeOption\n css?: string\n installSkill?: boolean\n}\n\nconst ALL_AGENT_TARGETS = Object.keys(AGENT_TARGETS) as AgentTarget[]\n\nasync function pathExists(targetPath: string) {\n try {\n await fs.access(targetPath)\n return true\n } catch {\n return false\n }\n}\n\nasync function readJsonFile<T>(filePath: string) {\n return JSON.parse(await fs.readFile(filePath, 'utf8')) as T\n}\n\nasync function findPackageRoot() {\n let currentDir = fileURLToPath(new URL('.', import.meta.url))\n\n while (true) {\n try {\n await fs.access(path.join(currentDir, 'package.json'))\n return currentDir\n } catch {\n const parentDir = path.dirname(currentDir)\n\n if (parentDir === currentDir) {\n throw new Error('Unable to resolve @uselets/ui package root')\n }\n\n currentDir = parentDir\n }\n }\n}\n\nfunction resolveTargets(agent: AgentOption) {\n return agent === 'all' ? ALL_AGENT_TARGETS : [agent]\n}\n\nfunction hasDependency(packageJson: PackageJson, dependencyName: string) {\n return Boolean(\n packageJson.dependencies?.[dependencyName] ||\n packageJson.devDependencies?.[dependencyName] ||\n packageJson.peerDependencies?.[dependencyName] ||\n packageJson.optionalDependencies?.[dependencyName]\n )\n}\n\nasync function detectPackageManager(projectRoot: string, packageJson: PackageJson): Promise<PackageManager> {\n const declaredManager = packageJson.packageManager?.split('@')[0]\n\n if (\n declaredManager === 'bun' ||\n declaredManager === 'pnpm' ||\n declaredManager === 'yarn' ||\n declaredManager === 'npm'\n ) {\n return declaredManager\n }\n\n if (await pathExists(path.join(projectRoot, 'bun.lock'))) {\n return 'bun'\n }\n\n if (await pathExists(path.join(projectRoot, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n\n if (await pathExists(path.join(projectRoot, 'yarn.lock'))) {\n return 'yarn'\n }\n\n if (await pathExists(path.join(projectRoot, 'package-lock.json'))) {\n return 'npm'\n }\n\n return 'npm'\n}\n\nfunction buildAddCommand(packageManager: PackageManager, dependencies: string[], dev: boolean) {\n switch (packageManager) {\n case 'bun':\n return ['bun', 'add', ...(dev ? ['-d'] : []), ...dependencies]\n case 'pnpm':\n return ['pnpm', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n case 'yarn':\n return ['yarn', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n case 'npm':\n return ['npm', 'install', ...(dev ? ['-D'] : []), ...dependencies]\n }\n}\n\nasync function runCommand(commandParts: string[], cwd: string) {\n const [command, ...args] = commandParts\n\n if (!command) {\n throw new Error('Missing command')\n }\n\n console.log(`Running: ${commandParts.join(' ')}`)\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { cwd, stdio: 'inherit' })\n\n child.on('error', reject)\n child.on('close', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n\n reject(new Error(`${command} exited with code ${code}`))\n })\n })\n}\n\nfunction getPackageVersion(packageJson: PackageJson, dependencyName: string) {\n const version = packageJson.dependencies?.[dependencyName] ?? packageJson.devDependencies?.[dependencyName]\n\n if (!version) {\n throw new Error(`Unable to find ${dependencyName} version in @uselets/ui package metadata`)\n }\n\n return version\n}\n\nasync function installMissingDependencies(projectRoot: string, projectPackageJson: PackageJson) {\n const packageRoot = await findPackageRoot()\n const packageJson = await readJsonFile<PackageJson>(path.join(packageRoot, 'package.json'))\n const packageManager = await detectPackageManager(projectRoot, projectPackageJson)\n const runtimeDependencies = []\n const devDependencies = []\n\n if (!packageJson.name || !packageJson.version) {\n throw new Error('Unable to resolve @uselets/ui package name and version')\n }\n\n if (!hasDependency(projectPackageJson, packageJson.name)) {\n runtimeDependencies.push(`${packageJson.name}@${packageJson.version}`)\n }\n\n if (!hasDependency(projectPackageJson, '@fontsource-variable/inter')) {\n runtimeDependencies.push(\n `@fontsource-variable/inter@${getPackageVersion(packageJson, '@fontsource-variable/inter')}`\n )\n }\n\n if (!hasDependency(projectPackageJson, 'tailwindcss')) {\n devDependencies.push(`tailwindcss@${getPackageVersion(packageJson, 'tailwindcss')}`)\n }\n\n if (!hasDependency(projectPackageJson, '@tailwindcss/postcss')) {\n devDependencies.push(`@tailwindcss/postcss@${getPackageVersion(packageJson, '@tailwindcss/postcss')}`)\n }\n\n if (runtimeDependencies.length > 0) {\n await runCommand(buildAddCommand(packageManager, runtimeDependencies, false), projectRoot)\n } else {\n console.log('Runtime dependencies already declared.')\n }\n\n if (devDependencies.length > 0) {\n await runCommand(buildAddCommand(packageManager, devDependencies, true), projectRoot)\n } else {\n console.log('Tailwind dependencies already declared.')\n }\n}\n\nasync function installSkill(targets: AgentTarget[]) {\n const packageRoot = await findPackageRoot()\n const sourcePath = path.join(packageRoot, 'skills', SKILL_NAME)\n\n try {\n await fs.access(sourcePath)\n } catch {\n throw new Error(`Bundled skill not found at ${sourcePath}`)\n }\n\n const installedPaths = []\n\n for (const target of targets) {\n const targetPath = path.join(process.cwd(), AGENT_TARGETS[target])\n\n await fs.rm(targetPath, { recursive: true, force: true })\n await fs.mkdir(path.dirname(targetPath), { recursive: true })\n await fs.cp(sourcePath, targetPath, { recursive: true })\n\n installedPaths.push(targetPath)\n }\n\n console.log(`Installed ${SKILL_NAME} skill:`)\n\n for (const installedPath of installedPaths) {\n console.log(`- ${installedPath}`)\n }\n}\n\nasync function createPrompt() {\n return readline.createInterface({ input: process.stdin, output: process.stdout })\n}\n\nasync function promptTheme(defaultTheme: ThemeOption) {\n if (!process.stdin.isTTY) {\n return defaultTheme\n }\n\n const prompt = await createPrompt()\n\n try {\n while (true) {\n const answer = (await prompt.question(`Theme (max/gomax) [${defaultTheme}]: `)).trim().toLowerCase()\n\n if (!answer) {\n return defaultTheme\n }\n\n if (answer === 'max' || answer === 'gomax') {\n return answer\n }\n\n console.log('Please choose \"max\" or \"gomax\".')\n }\n } finally {\n prompt.close()\n }\n}\n\nasync function promptCssPath(defaultCssPath: string) {\n if (!process.stdin.isTTY) {\n return defaultCssPath\n }\n\n const prompt = await createPrompt()\n\n try {\n const answer = (await prompt.question(`Global CSS path [${defaultCssPath}]: `)).trim()\n return answer || defaultCssPath\n } finally {\n prompt.close()\n }\n}\n\nasync function promptInstallSkill() {\n if (!process.stdin.isTTY) {\n return false\n }\n\n const prompt = await createPrompt()\n\n try {\n while (true) {\n const answer = (await prompt.question('Install agent skill? (y/N): ')).trim().toLowerCase()\n\n if (!answer || answer === 'n' || answer === 'no') {\n return false\n }\n\n if (answer === 'y' || answer === 'yes') {\n return true\n }\n\n console.log('Please answer \"y\" or \"n\".')\n }\n } finally {\n prompt.close()\n }\n}\n\nasync function ensurePostcssConfig(projectRoot: string) {\n const postcssPath = path.join(projectRoot, 'postcss.config.mjs')\n\n if (await pathExists(postcssPath)) {\n console.log('Preserved existing postcss.config.mjs.')\n return\n }\n\n await fs.writeFile(postcssPath, POSTCSS_CONFIG)\n console.log('Created postcss.config.mjs.')\n}\n\nfunction buildCssImports(source: string, theme: ThemeOption) {\n const imports = []\n const hasTailwind = /@import\\s+['\"]tailwindcss['\"]/.test(source)\n const hasTheme = /@import\\s+['\"]@uselets\\/ui\\/themes\\/(?:max|gomax)\\.css['\"]/.test(source)\n const hasFont = /@import\\s+['\"]@fontsource-variable\\/inter['\"]/.test(source)\n\n if (!hasTailwind) {\n imports.push(\"@import 'tailwindcss';\")\n }\n\n if (!hasTheme) {\n imports.push(`@import '@uselets/ui/themes/${theme}.css';`)\n }\n\n if (!hasFont) {\n imports.push(\"@import '@fontsource-variable/inter';\")\n }\n\n return { imports, hasTheme }\n}\n\nasync function ensureGlobalCss(projectRoot: string, cssPath: string, theme: ThemeOption) {\n const absoluteCssPath = path.resolve(projectRoot, cssPath)\n const existingSource = (await pathExists(absoluteCssPath)) ? await fs.readFile(absoluteCssPath, 'utf8') : ''\n const { imports, hasTheme } = buildCssImports(existingSource, theme)\n\n if (hasTheme) {\n console.log('Preserved existing @uselets/ui theme import.')\n }\n\n if (imports.length === 0) {\n console.log(`Global CSS already configured at ${cssPath}.`)\n return\n }\n\n const separator = existingSource.length > 0 && !existingSource.startsWith('\\n') ? '\\n' : ''\n const updatedSource = `${imports.join('\\n')}${separator}${existingSource}`\n\n await fs.mkdir(path.dirname(absoluteCssPath), { recursive: true })\n await fs.writeFile(absoluteCssPath, updatedSource)\n console.log(`Updated global CSS at ${cssPath}.`)\n}\n\nasync function initProject(options: InitOptions) {\n const projectRoot = process.cwd()\n const packageJsonPath = path.join(projectRoot, 'package.json')\n\n if (!(await pathExists(packageJsonPath))) {\n throw new Error('No package.json found in the current directory. Run uselets init from your project root.')\n }\n\n const projectPackageJson = await readJsonFile<PackageJson>(packageJsonPath)\n const theme = options.theme ?? (await promptTheme('max'))\n const cssPath = options.css ?? (await promptCssPath(DEFAULT_CSS_PATH))\n const shouldInstallSkill = options.installSkill ?? (await promptInstallSkill())\n\n await installMissingDependencies(projectRoot, projectPackageJson)\n await ensurePostcssConfig(projectRoot)\n await ensureGlobalCss(projectRoot, cssPath, theme)\n\n if (shouldInstallSkill) {\n await installSkill(ALL_AGENT_TARGETS)\n }\n}\n\nasync function main() {\n const program = new Command()\n\n program.name('uselets').description('CLI for @uselets/ui').showHelpAfterError()\n\n program\n .command('skill')\n .description(`Reinstall the ${SKILL_NAME} agent skill`)\n .addOption(\n new Option('--agent <agent>', 'Target agent directory').choices(['codex', 'claude', 'all']).default('all')\n )\n .action(async (options: { agent: AgentOption }) => {\n await installSkill(resolveTargets(options.agent))\n })\n\n program\n .command('init')\n .description('Set up @uselets/ui in this project')\n .addOption(new Option('--theme <theme>', 'Theme to import').choices(['max', 'gomax']))\n .option('--css <path>', 'Global CSS file path')\n .option('--install-skill', 'Install the agent skill without prompting')\n .option('--no-install-skill', 'Skip the agent skill prompt and installation')\n .action(async (options: InitOptions) => {\n await initProject(options)\n })\n\n if (process.argv.length <= 2) {\n program.outputHelp()\n return\n }\n\n await program.parseAsync()\n}\n\nmain().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error)\n process.exitCode = 1\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uselets.mjs","names":[],"sources":["../../src/cli/uselets.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { spawn } from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport readline from 'node:readline/promises'\nimport { fileURLToPath } from 'node:url'\n\nimport { Command, Option } from 'commander'\n\nconst SKILL_NAME = 'uselets-ui'\nconst DEFAULT_CSS_PATH = 'src/styles/globals.css'\nconst POSTCSS_CONFIG = \"export { default } from '@uselets/ui/postcss.config'\\n\"\nconst AGENT_TARGETS = {\n codex: path.join('.agents', 'skills', SKILL_NAME),\n claude: path.join('.claude', 'skills', SKILL_NAME)\n} as const\n\ntype AgentTarget = keyof typeof AGENT_TARGETS\ntype AgentOption = AgentTarget | 'all'\ntype ThemeOption = 'max' | 'gomax'\ntype PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm'\ntype PackageJson = {\n name?: string\n version?: string\n packageManager?: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n optionalDependencies?: Record<string, string>\n}\ntype InitOptions = {\n theme?: ThemeOption\n css?: string\n installSkill?: boolean\n}\n\nconst ALL_AGENT_TARGETS = Object.keys(AGENT_TARGETS) as AgentTarget[]\n\nasync function pathExists(targetPath: string) {\n try {\n await fs.access(targetPath)\n return true\n } catch {\n return false\n }\n}\n\nasync function readJsonFile<T>(filePath: string) {\n return JSON.parse(await fs.readFile(filePath, 'utf8')) as T\n}\n\nasync function findPackageRoot() {\n let currentDir = fileURLToPath(new URL('.', import.meta.url))\n\n while (true) {\n try {\n await fs.access(path.join(currentDir, 'package.json'))\n return currentDir\n } catch {\n const parentDir = path.dirname(currentDir)\n\n if (parentDir === currentDir) {\n throw new Error('Unable to resolve @uselets/ui package root')\n }\n\n currentDir = parentDir\n }\n }\n}\n\nfunction resolveTargets(agent: AgentOption) {\n return agent === 'all' ? ALL_AGENT_TARGETS : [agent]\n}\n\nfunction hasDependency(packageJson: PackageJson, dependencyName: string) {\n return Boolean(\n packageJson.dependencies?.[dependencyName] ||\n packageJson.devDependencies?.[dependencyName] ||\n packageJson.peerDependencies?.[dependencyName] ||\n packageJson.optionalDependencies?.[dependencyName]\n )\n}\n\nasync function detectPackageManager(projectRoot: string, packageJson: PackageJson): Promise<PackageManager> {\n const declaredManager = packageJson.packageManager?.split('@')[0]\n\n if (\n declaredManager === 'bun' ||\n declaredManager === 'pnpm' ||\n declaredManager === 'yarn' ||\n declaredManager === 'npm'\n ) {\n return declaredManager\n }\n\n if (await pathExists(path.join(projectRoot, 'bun.lock'))) {\n return 'bun'\n }\n\n if (await pathExists(path.join(projectRoot, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n\n if (await pathExists(path.join(projectRoot, 'yarn.lock'))) {\n return 'yarn'\n }\n\n if (await pathExists(path.join(projectRoot, 'package-lock.json'))) {\n return 'npm'\n }\n\n return 'npm'\n}\n\nfunction buildAddCommand(packageManager: PackageManager, dependencies: string[], dev: boolean) {\n switch (packageManager) {\n case 'bun':\n return ['bun', 'add', ...(dev ? ['-d'] : []), ...dependencies]\n case 'pnpm':\n return ['pnpm', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n case 'yarn':\n return ['yarn', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n case 'npm':\n return ['npm', 'install', ...(dev ? ['-D'] : []), ...dependencies]\n }\n}\n\nasync function runCommand(commandParts: string[], cwd: string) {\n const [command, ...args] = commandParts\n\n if (!command) {\n throw new Error('Missing command')\n }\n\n console.log(`Running: ${commandParts.join(' ')}`)\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { cwd, stdio: 'inherit' })\n\n child.on('error', reject)\n child.on('close', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n\n reject(new Error(`${command} exited with code ${code}`))\n })\n })\n}\n\nfunction getPackageVersion(packageJson: PackageJson, dependencyName: string) {\n const version = packageJson.dependencies?.[dependencyName] ?? packageJson.devDependencies?.[dependencyName]\n\n if (!version) {\n throw new Error(`Unable to find ${dependencyName} version in @uselets/ui package metadata`)\n }\n\n return version\n}\n\nasync function installMissingDependencies(projectRoot: string, projectPackageJson: PackageJson) {\n const packageRoot = await findPackageRoot()\n const packageJson = await readJsonFile<PackageJson>(path.join(packageRoot, 'package.json'))\n const packageManager = await detectPackageManager(projectRoot, projectPackageJson)\n const runtimeDependencies = []\n const devDependencies = []\n\n if (!packageJson.name || !packageJson.version) {\n throw new Error('Unable to resolve @uselets/ui package name and version')\n }\n\n if (!hasDependency(projectPackageJson, packageJson.name)) {\n runtimeDependencies.push(`${packageJson.name}@${packageJson.version}`)\n }\n\n if (!hasDependency(projectPackageJson, '@fontsource-variable/inter')) {\n runtimeDependencies.push(\n `@fontsource-variable/inter@${getPackageVersion(packageJson, '@fontsource-variable/inter')}`\n )\n }\n\n if (!hasDependency(projectPackageJson, 'tailwindcss')) {\n devDependencies.push(`tailwindcss@${getPackageVersion(packageJson, 'tailwindcss')}`)\n }\n\n if (!hasDependency(projectPackageJson, '@tailwindcss/postcss')) {\n devDependencies.push(`@tailwindcss/postcss@${getPackageVersion(packageJson, '@tailwindcss/postcss')}`)\n }\n\n if (runtimeDependencies.length > 0) {\n await runCommand(buildAddCommand(packageManager, runtimeDependencies, false), projectRoot)\n } else {\n console.log('Runtime dependencies already declared.')\n }\n\n if (devDependencies.length > 0) {\n await runCommand(buildAddCommand(packageManager, devDependencies, true), projectRoot)\n } else {\n console.log('Tailwind dependencies already declared.')\n }\n}\n\nasync function installSkill(targets: AgentTarget[]) {\n const packageRoot = await findPackageRoot()\n const sourcePath = path.join(packageRoot, 'skills', SKILL_NAME)\n\n try {\n await fs.access(sourcePath)\n } catch {\n throw new Error(`Bundled skill not found at ${sourcePath}`)\n }\n\n const installedPaths = []\n\n for (const target of targets) {\n const targetPath = path.join(process.cwd(), AGENT_TARGETS[target])\n\n await fs.rm(targetPath, { recursive: true, force: true })\n await fs.mkdir(path.dirname(targetPath), { recursive: true })\n await fs.cp(sourcePath, targetPath, { recursive: true })\n\n installedPaths.push(targetPath)\n }\n\n console.log(`Installed ${SKILL_NAME} skill:`)\n\n for (const installedPath of installedPaths) {\n console.log(`- ${installedPath}`)\n }\n}\n\nasync function createPrompt() {\n return readline.createInterface({ input: process.stdin, output: process.stdout })\n}\n\nasync function promptTheme(defaultTheme: ThemeOption) {\n if (!process.stdin.isTTY) {\n return defaultTheme\n }\n\n const prompt = await createPrompt()\n\n try {\n while (true) {\n const answer = (await prompt.question(`Theme (max/gomax) [${defaultTheme}]: `)).trim().toLowerCase()\n\n if (!answer) {\n return defaultTheme\n }\n\n if (answer === 'max' || answer === 'gomax') {\n return answer\n }\n\n console.log('Please choose \"max\" or \"gomax\".')\n }\n } finally {\n prompt.close()\n }\n}\n\nasync function promptCssPath(defaultCssPath: string) {\n if (!process.stdin.isTTY) {\n return defaultCssPath\n }\n\n const prompt = await createPrompt()\n\n try {\n const answer = (await prompt.question(`Global CSS path [${defaultCssPath}]: `)).trim()\n return answer || defaultCssPath\n } finally {\n prompt.close()\n }\n}\n\nasync function promptInstallSkill() {\n if (!process.stdin.isTTY) {\n return false\n }\n\n const prompt = await createPrompt()\n\n try {\n while (true) {\n const answer = (await prompt.question('Install agent skill? (y/N): ')).trim().toLowerCase()\n\n if (!answer || answer === 'n' || answer === 'no') {\n return false\n }\n\n if (answer === 'y' || answer === 'yes') {\n return true\n }\n\n console.log('Please answer \"y\" or \"n\".')\n }\n } finally {\n prompt.close()\n }\n}\n\nasync function ensurePostcssConfig(projectRoot: string) {\n const postcssPath = path.join(projectRoot, 'postcss.config.mjs')\n\n if (await pathExists(postcssPath)) {\n console.log('Preserved existing postcss.config.mjs.')\n return\n }\n\n await fs.writeFile(postcssPath, POSTCSS_CONFIG)\n console.log('Created postcss.config.mjs.')\n}\n\nfunction buildPackageSource(cssPath: string) {\n const cssDir = path.posix.dirname(cssPath.replaceAll(path.sep, path.posix.sep))\n const relativeSource = path.posix.relative(cssDir, 'node_modules/@uselets/ui/dist')\n\n return relativeSource.startsWith('.') ? relativeSource : `./${relativeSource}`\n}\n\nfunction buildCssImports(source: string, theme: ThemeOption, cssPath: string) {\n const imports = []\n const hasTailwind = /@import\\s+['\"]tailwindcss['\"]/.test(source)\n const hasTheme = /@import\\s+['\"]@uselets\\/ui\\/themes\\/(?:max|gomax)\\.css['\"]/.test(source)\n const hasFont = /@import\\s+['\"]@fontsource-variable\\/inter['\"]/.test(source)\n const hasPackageSource = /@source\\s+['\"][^'\"]*@uselets\\/ui\\/dist['\"]/.test(source)\n\n if (!hasTailwind) {\n imports.push(\"@import 'tailwindcss';\")\n }\n\n if (!hasTheme) {\n imports.push(`@import '@uselets/ui/themes/${theme}.css';`)\n }\n\n if (!hasFont) {\n imports.push(\"@import '@fontsource-variable/inter';\")\n }\n\n if (!hasPackageSource) {\n imports.push(`@source '${buildPackageSource(cssPath)}';`)\n }\n\n return { imports, hasTheme }\n}\n\nasync function ensureGlobalCss(projectRoot: string, cssPath: string, theme: ThemeOption) {\n const absoluteCssPath = path.resolve(projectRoot, cssPath)\n const existingSource = (await pathExists(absoluteCssPath)) ? await fs.readFile(absoluteCssPath, 'utf8') : ''\n const { imports, hasTheme } = buildCssImports(existingSource, theme, cssPath)\n\n if (hasTheme) {\n console.log('Preserved existing @uselets/ui theme import.')\n }\n\n if (imports.length === 0) {\n console.log(`Global CSS already configured at ${cssPath}.`)\n return\n }\n\n const separator = existingSource.length > 0 && !existingSource.startsWith('\\n') ? '\\n' : ''\n const updatedSource = `${imports.join('\\n')}${separator}${existingSource}`\n\n await fs.mkdir(path.dirname(absoluteCssPath), { recursive: true })\n await fs.writeFile(absoluteCssPath, updatedSource)\n console.log(`Updated global CSS at ${cssPath}.`)\n}\n\nasync function initProject(options: InitOptions) {\n const projectRoot = process.cwd()\n const packageJsonPath = path.join(projectRoot, 'package.json')\n\n if (!(await pathExists(packageJsonPath))) {\n throw new Error('No package.json found in the current directory. Run uselets init from your project root.')\n }\n\n const projectPackageJson = await readJsonFile<PackageJson>(packageJsonPath)\n const theme = options.theme ?? (await promptTheme('max'))\n const cssPath = options.css ?? (await promptCssPath(DEFAULT_CSS_PATH))\n const shouldInstallSkill = options.installSkill ?? (await promptInstallSkill())\n\n await installMissingDependencies(projectRoot, projectPackageJson)\n await ensurePostcssConfig(projectRoot)\n await ensureGlobalCss(projectRoot, cssPath, theme)\n\n if (shouldInstallSkill) {\n await installSkill(ALL_AGENT_TARGETS)\n }\n}\n\nasync function main() {\n const program = new Command()\n\n program.name('uselets').description('CLI for @uselets/ui').showHelpAfterError()\n\n program\n .command('skill')\n .description(`Reinstall the ${SKILL_NAME} agent skill`)\n .addOption(\n new Option('--agent <agent>', 'Target agent directory').choices(['codex', 'claude', 'all']).default('all')\n )\n .action(async (options: { agent: AgentOption }) => {\n await installSkill(resolveTargets(options.agent))\n })\n\n program\n .command('init')\n .description('Set up @uselets/ui in this project')\n .addOption(new Option('--theme <theme>', 'Theme to import').choices(['max', 'gomax']))\n .option('--css <path>', 'Global CSS file path')\n .option('--install-skill', 'Install the agent skill without prompting')\n .option('--no-install-skill', 'Skip the agent skill prompt and installation')\n .action(async (options: InitOptions) => {\n await initProject(options)\n })\n\n if (process.argv.length <= 2) {\n program.outputHelp()\n return\n }\n\n await program.parseAsync()\n}\n\nmain().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error)\n process.exitCode = 1\n})\n"],"mappings":"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"}
|
package/dist/components/card.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{jsx as t}from"react/jsx-runtime";function Card({className:n,size:r=`md`,...i}){return t(`div`,{"data-slot":`card`,"data-size":r,className:e(`group/card flex flex-col gap-4 overflow-hidden rounded-xl py-4 text-sm bg-card text-card-foreground ring-foreground/10 ring-1`,`has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0`,`data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0`,`*:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl`,n),...i})}function CardHeader({className:n,...r}){return t(`div`,{"data-slot":`card-header`,className:e(`group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4`,`group-data-[size=sm]/card:px-3 [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3`,`has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]`,n),...r})}function CardTitle({className:n,...r}){return t(`div`,{"data-slot":`card-title`,className:e(`text-
|
|
1
|
+
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{jsx as t}from"react/jsx-runtime";function Card({className:n,size:r=`md`,...i}){return t(`div`,{"data-slot":`card`,"data-size":r,className:e(`group/card flex flex-col gap-4 overflow-hidden rounded-xl py-4 text-sm bg-card text-card-foreground ring-foreground/10 ring-1`,`has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0`,`data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0`,`*:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl`,n),...i})}function CardHeader({className:n,...r}){return t(`div`,{"data-slot":`card-header`,className:e(`group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4`,`group-data-[size=sm]/card:px-3 [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3`,`has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]`,n),...r})}function CardTitle({className:n,...r}){return t(`div`,{"data-slot":`card-title`,className:e(`text-lg leading-snug font-bold group-data-[size=sm]/card:text-sm`,n),...r})}function CardDescription({className:n,...r}){return t(`div`,{"data-slot":`card-description`,className:e(`text-muted-foreground text-sm`,n),...r})}function CardAction({className:n,...r}){return t(`div`,{"data-slot":`card-action`,className:e(`col-start-2 row-span-2 row-start-1 self-start justify-self-end`,n),...r})}function CardContent({className:n,...r}){return t(`div`,{"data-slot":`card-content`,className:e(`px-4 group-data-[size=sm]/card:px-3`,n),...r})}function CardFooter({className:n,...r}){return t(`div`,{"data-slot":`card-footer`,className:e(`bg-muted/50 flex items-center rounded-b-xl border-t p-4`,`group-data-[size=sm]/card:p-3`,n),...r})}export{Card,CardAction,CardContent,CardDescription,CardFooter,CardHeader,CardTitle};
|
|
2
2
|
//# sourceMappingURL=card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.js","names":[],"sources":["../../src/components/card.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nexport type CardProps = React.ComponentProps<'div'> & { size?: 'sm' | 'md' }\n\nexport type CardHeaderProps = React.ComponentProps<'div'>\n\nexport type CardTitleProps = React.ComponentProps<'div'>\n\nexport type CardDescriptionProps = React.ComponentProps<'div'>\n\nexport type CardActionProps = React.ComponentProps<'div'>\n\nexport type CardContentProps = React.ComponentProps<'div'>\n\nexport type CardFooterProps = React.ComponentProps<'div'>\n\nfunction Card({ className, size = 'md', ...props }: CardProps) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n 'group/card flex flex-col gap-4 overflow-hidden rounded-xl py-4 text-sm bg-card text-card-foreground ring-foreground/10 ring-1',\n 'has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0',\n 'data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0',\n '*:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: CardHeaderProps) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n 'group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4',\n 'group-data-[size=sm]/card:px-3 [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3',\n 'has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: CardTitleProps) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn('text-
|
|
1
|
+
{"version":3,"file":"card.js","names":[],"sources":["../../src/components/card.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nexport type CardProps = React.ComponentProps<'div'> & { size?: 'sm' | 'md' }\n\nexport type CardHeaderProps = React.ComponentProps<'div'>\n\nexport type CardTitleProps = React.ComponentProps<'div'>\n\nexport type CardDescriptionProps = React.ComponentProps<'div'>\n\nexport type CardActionProps = React.ComponentProps<'div'>\n\nexport type CardContentProps = React.ComponentProps<'div'>\n\nexport type CardFooterProps = React.ComponentProps<'div'>\n\nfunction Card({ className, size = 'md', ...props }: CardProps) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n 'group/card flex flex-col gap-4 overflow-hidden rounded-xl py-4 text-sm bg-card text-card-foreground ring-foreground/10 ring-1',\n 'has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0',\n 'data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0',\n '*:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: CardHeaderProps) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n 'group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4',\n 'group-data-[size=sm]/card:px-3 [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3',\n 'has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: CardTitleProps) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn('text-lg leading-snug font-bold group-data-[size=sm]/card:text-sm', className)}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: CardDescriptionProps) {\n return <div data-slot=\"card-description\" className={cn('text-muted-foreground text-sm', className)} {...props} />\n}\n\nfunction CardAction({ className, ...props }: CardActionProps) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', className)}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: CardContentProps) {\n return <div data-slot=\"card-content\" className={cn('px-4 group-data-[size=sm]/card:px-3', className)} {...props} />\n}\n\nfunction CardFooter({ className, ...props }: CardFooterProps) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n 'bg-muted/50 flex items-center rounded-b-xl border-t p-4',\n 'group-data-[size=sm]/card:p-3',\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }\n"],"mappings":"0GAkBA,SAAS,KAAK,CAAE,YAAW,OAAO,KAAM,GAAG,GAAoB,CAC7D,OACE,EAAC,MAAD,CACE,YAAU,OACV,YAAW,EACX,UAAW,EACT,gIACA,+DACA,2FACA,mEACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,WAAW,CAAE,YAAW,GAAG,GAA0B,CAC5D,OACE,EAAC,MAAD,CACE,YAAU,cACV,UAAW,EACT,kGACA,6FACA,0GACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,UAAU,CAAE,YAAW,GAAG,GAAyB,CAC1D,OACE,EAAC,MAAD,CACE,YAAU,aACV,UAAW,EAAG,mEAAoE,EAAU,CAC5F,GAAI,EACJ,CAAA,CAIN,SAAS,gBAAgB,CAAE,YAAW,GAAG,GAA+B,CACtE,OAAO,EAAC,MAAD,CAAK,YAAU,mBAAmB,UAAW,EAAG,gCAAiC,EAAU,CAAE,GAAI,EAAS,CAAA,CAGnH,SAAS,WAAW,CAAE,YAAW,GAAG,GAA0B,CAC5D,OACE,EAAC,MAAD,CACE,YAAU,cACV,UAAW,EAAG,iEAAkE,EAAU,CAC1F,GAAI,EACJ,CAAA,CAIN,SAAS,YAAY,CAAE,YAAW,GAAG,GAA2B,CAC9D,OAAO,EAAC,MAAD,CAAK,YAAU,eAAe,UAAW,EAAG,sCAAuC,EAAU,CAAE,GAAI,EAAS,CAAA,CAGrH,SAAS,WAAW,CAAE,YAAW,GAAG,GAA0B,CAC5D,OACE,EAAC,MAAD,CACE,YAAU,cACV,UAAW,EACT,0DACA,gCACA,EACD,CACD,GAAI,EACJ,CAAA"}
|
|
@@ -36,7 +36,6 @@ To set up a consumer project after installing `@uselets/ui`, run `bun uselets in
|
|
|
36
36
|
- `@uselets/ui/<module>`
|
|
37
37
|
- `@uselets/ui/hooks/<hook-module>`
|
|
38
38
|
- `@uselets/ui/utils`
|
|
39
|
-
- `@uselets/ui/styles.css`
|
|
40
39
|
- `@uselets/ui/themes/max.css`
|
|
41
40
|
- `@uselets/ui/themes/gomax.css`
|
|
42
41
|
- `@uselets/ui/postcss.config`
|
|
@@ -47,9 +46,9 @@ To set up a consumer project after installing `@uselets/ui`, run `bun uselets in
|
|
|
47
46
|
- Prefer barrel imports for common app usage and readability.
|
|
48
47
|
- Use module subpaths when you want a single module or when the user asks for the exact import path.
|
|
49
48
|
- Use `@uselets/ui/hooks/<hook-module>` for dedicated hook subpaths, not legacy `@uselets/ui/use-*` paths.
|
|
50
|
-
- Recommend importing one theme stylesheet once in the app
|
|
49
|
+
- Recommend importing Tailwind, one theme stylesheet, and Inter once in the app global CSS. Use `@uselets/ui/themes/max.css` for Max apps or `@uselets/ui/themes/gomax.css` for Gomax apps.
|
|
50
|
+
- Recommend `@source '../node_modules/@uselets/ui/dist';` when Tailwind needs to generate classes used by installed `@uselets/ui` components.
|
|
51
51
|
- Treat `@uselets/ui/themes/gomax.css` as the GoMax Figma-backed palette, exposed through the same public color families as the Max theme.
|
|
52
|
-
- Treat `@uselets/ui/styles.css` as a legacy compatibility alias for the Max theme.
|
|
53
52
|
- Recommend `@fontsource-variable/inter` when matching the package typography setup.
|
|
54
53
|
- Recommend `@uselets/ui/postcss.config` when the app needs the package PostCSS preset for Tailwind v4.
|
|
55
54
|
- For tooltip-heavy apps, wrap the app with `TooltipProvider`.
|
|
@@ -90,8 +90,6 @@ Use `bun uselets skill --agent codex` or `bun uselets skill --agent claude` to i
|
|
|
90
90
|
- utility helpers such as `cn` and `randomId`
|
|
91
91
|
- `@uselets/ui/lib/color`
|
|
92
92
|
- shared UI color list and type: `uiColors`, `UIColor`
|
|
93
|
-
- `@uselets/ui/styles.css`
|
|
94
|
-
- legacy compatibility stylesheet equivalent to the Max theme
|
|
95
93
|
- `@uselets/ui/themes/max.css`
|
|
96
94
|
- Max theme tokens and component styles
|
|
97
95
|
- `@uselets/ui/themes/gomax.css`
|
|
@@ -101,14 +99,15 @@ Use `bun uselets skill --agent codex` or `bun uselets skill --agent claude` to i
|
|
|
101
99
|
|
|
102
100
|
## Base setup
|
|
103
101
|
|
|
104
|
-
Import one package theme once
|
|
102
|
+
Import Tailwind, one package theme, and Inter once in the app global stylesheet:
|
|
105
103
|
|
|
106
|
-
```
|
|
107
|
-
import '
|
|
108
|
-
import '@
|
|
104
|
+
```css
|
|
105
|
+
@import 'tailwindcss';
|
|
106
|
+
@import '@uselets/ui/themes/max.css';
|
|
107
|
+
@import '@fontsource-variable/inter';
|
|
109
108
|
```
|
|
110
109
|
|
|
111
|
-
For GoMax apps, import `@uselets/ui/themes/gomax.css` instead.
|
|
110
|
+
For GoMax apps, import `@uselets/ui/themes/gomax.css` instead.
|
|
112
111
|
|
|
113
112
|
If the app needs Tailwind v4 PostCSS setup, reuse the package preset:
|
|
114
113
|
|
|
@@ -116,10 +115,10 @@ If the app needs Tailwind v4 PostCSS setup, reuse the package preset:
|
|
|
116
115
|
export { default } from '@uselets/ui/postcss.config'
|
|
117
116
|
```
|
|
118
117
|
|
|
119
|
-
|
|
118
|
+
When the app uses installed `@uselets/ui` components, add a Tailwind source directive so component classes from the package are generated:
|
|
120
119
|
|
|
121
120
|
```css
|
|
122
|
-
@
|
|
121
|
+
@source '../node_modules/@uselets/ui/dist';
|
|
123
122
|
```
|
|
124
123
|
|
|
125
124
|
## Typography scale
|
|
@@ -160,7 +160,6 @@ console.log('- barrel: `@uselets/ui`')
|
|
|
160
160
|
console.log('- component subpaths: `@uselets/ui/*`')
|
|
161
161
|
console.log('- hook subpaths: `@uselets/ui/hooks/*`')
|
|
162
162
|
console.log('- utility helpers: `@uselets/ui/utils`')
|
|
163
|
-
console.log('- styles: `@uselets/ui/styles.css` (legacy Max theme alias)')
|
|
164
163
|
console.log('- Max theme: `@uselets/ui/themes/max.css`')
|
|
165
164
|
console.log('- Gomax theme: `@uselets/ui/themes/gomax.css`')
|
|
166
165
|
console.log('- PostCSS preset: `@uselets/ui/postcss.config`')
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
/* palette tokens */
|
|
3
|
+
--primary-50: oklch(0.967 0.011 269.55); /* #F1F4FC */
|
|
4
|
+
--primary-100: oklch(0.934 0.021 268.428); /* #E3E9F8 */
|
|
5
|
+
--primary-200: oklch(0.859 0.043 270.875); /* #C6D0EE */
|
|
6
|
+
--primary-300: oklch(0.752 0.078 272.162); /* #9DACE1 */
|
|
7
|
+
--primary-400: oklch(0.647 0.104 271.342); /* #778ACE */
|
|
8
|
+
--primary-500: oklch(0.534 0.167 269.617); /* #4862CC */
|
|
9
|
+
--primary-600: oklch(0.423 0.174 269.851); /* #2C3EAB */
|
|
10
|
+
--primary-700: oklch(0.353 0.143 272.141); /* #252E84 */
|
|
11
|
+
--primary-800: oklch(0.286 0.111 274.807); /* #1D2060 */
|
|
12
|
+
--primary-900: oklch(0.23 0.08 278.141); /* #161641 */
|
|
13
|
+
--primary-950: oklch(0.192 0.053 281.835); /* #11102B */
|
|
14
|
+
|
|
15
|
+
--brand-50: oklch(0.974 0.01 9.532); /* #FDF4F5 */
|
|
16
|
+
--brand-100: oklch(0.931 0.032 29.76); /* #FDE1DC */
|
|
17
|
+
--brand-200: oklch(0.791 0.122 33.999); /* #FF9D86 */
|
|
18
|
+
--brand-300: oklch(0.734 0.166 34.994); /* #FF7D5D */
|
|
19
|
+
--brand-400: oklch(0.708 0.187 34.708); /* #FF6C49 */
|
|
20
|
+
--brand-500: oklch(0.686 0.205 34.607); /* #FF5C35 */
|
|
21
|
+
--brand-600: oklch(0.64 0.192 34.625); /* #E9532F */
|
|
22
|
+
--brand-700: oklch(0.585 0.175 34.659); /* #CE4929 */
|
|
23
|
+
--brand-800: oklch(0.537 0.163 34.517); /* #B93F22 */
|
|
24
|
+
--brand-900: oklch(0.471 0.141 34.467); /* #9A341C */
|
|
25
|
+
--brand-950: oklch(0.401 0.118 34.378); /* #7B2916 */
|
|
26
|
+
|
|
27
|
+
--gray-50: oklch(0.981 0.005 247.876); /* #F6F9FC */
|
|
28
|
+
--gray-100: oklch(0.952 0.01 247.935); /* #EAF0F6 */
|
|
29
|
+
--gray-200: oklch(0.915 0.016 247.999); /* #DBE4ED */
|
|
30
|
+
--gray-300: oklch(0.821 0.028 244.747); /* #B6C7D6 */
|
|
31
|
+
--gray-400: oklch(0.744 0.039 247.107); /* #99AFC4 */
|
|
32
|
+
--gray-500: oklch(0.646 0.052 249.575); /* #7691AD */
|
|
33
|
+
--gray-600: oklch(0.532 0.063 251.386); /* #516F90 */
|
|
34
|
+
--gray-700: oklch(0.454 0.055 249.121); /* #3E5974 */
|
|
35
|
+
--gray-800: oklch(0.313 0.037 246.164); /* #213343 */
|
|
36
|
+
--gray-900: oklch(0.266 0.03 245.1); /* #192733 */
|
|
37
|
+
--gray-950: oklch(0.216 0.021 243.075); /* #111B23 */
|
|
38
|
+
|
|
39
|
+
--zinc-50: oklch(0.979 0 0); /* #F8F8F8 */
|
|
40
|
+
--zinc-100: oklch(0.952 0 0); /* #EFEFEF */
|
|
41
|
+
--zinc-200: oklch(0.885 0 0); /* #D9D9D9 */
|
|
42
|
+
--zinc-300: oklch(0.798 0 0); /* #BDBDBD */
|
|
43
|
+
--zinc-400: oklch(0.68 0 0); /* #989898 */
|
|
44
|
+
--zinc-500: oklch(0.586 0 0); /* #7C7C7C */
|
|
45
|
+
--zinc-600: oklch(0.507 0 0); /* #656565 */
|
|
46
|
+
--zinc-700: oklch(0.394 0 0); /* #464646 */
|
|
47
|
+
--zinc-800: oklch(0.305 0.002 106.504); /* #2F2F2E */
|
|
48
|
+
--zinc-900: oklch(0.207 0.004 345.603); /* #191718 */
|
|
49
|
+
--zinc-950: oklch(0.155 0.003 67.627); /* #0D0C0B */
|
|
50
|
+
|
|
51
|
+
--red-50: oklch(0.968 0.013 5.8); /* #FDF1F3 */
|
|
52
|
+
--red-100: oklch(0.936 0.03 7.525); /* #FDE2E6 */
|
|
53
|
+
--red-200: oklch(0.862 0.071 9.896); /* #FCBFC7 */
|
|
54
|
+
--red-300: oklch(0.755 0.145 13.73); /* #FD8694 */
|
|
55
|
+
--red-400: oklch(0.673 0.211 19.364); /* #FD4D5F */
|
|
56
|
+
--red-500: oklch(0.615 0.224 22.558); /* #ED2D40 */
|
|
57
|
+
--red-600: oklch(0.538 0.21 26.258); /* #CC1420 */
|
|
58
|
+
--red-700: oklch(0.44 0.165 25.779); /* #99151B */
|
|
59
|
+
--red-800: oklch(0.349 0.122 24.328); /* #6C1317 */
|
|
60
|
+
--red-900: oklch(0.266 0.084 22.977); /* #460F11 */
|
|
61
|
+
--red-950: oklch(0.211 0.055 21.251); /* #2D0C0D */
|
|
62
|
+
|
|
63
|
+
--yellow-50: oklch(0.988 0.014 88.681); /* #FFFBF1 */
|
|
64
|
+
--yellow-100: oklch(0.974 0.029 89.569); /* #FEF6E1 */
|
|
65
|
+
--yellow-200: oklch(0.944 0.059 84.511); /* #FFEAC0 */
|
|
66
|
+
--yellow-300: oklch(0.885 0.104 78.009); /* #FFD189 */
|
|
67
|
+
--yellow-400: oklch(0.827 0.142 71.92); /* #FFB652 */
|
|
68
|
+
--yellow-500: oklch(0.798 0.158 67.669); /* #FFA736 */
|
|
69
|
+
--yellow-600: oklch(0.709 0.171 55.903); /* #EF7F0A */
|
|
70
|
+
--yellow-700: oklch(0.564 0.138 53.071); /* #B25A0E */
|
|
71
|
+
--yellow-800: oklch(0.433 0.1 52.359); /* #7A3E11 */
|
|
72
|
+
--yellow-900: oklch(0.324 0.069 50.591); /* #4F280F */
|
|
73
|
+
--yellow-950: oklch(0.249 0.046 47.281); /* #331A0D */
|
|
74
|
+
|
|
75
|
+
--green-50: oklch(0.98 0.003 145.55); /* #F7F9F7 */
|
|
76
|
+
--green-100: oklch(0.957 0.012 145.482); /* #ECF3EC */
|
|
77
|
+
--green-200: oklch(0.912 0.032 143.849); /* #D6E8D5 */
|
|
78
|
+
--green-300: oklch(0.838 0.073 143.695); /* #AED7AC */
|
|
79
|
+
--green-400: oklch(0.767 0.12 142.694); /* #85C780 */
|
|
80
|
+
--green-500: oklch(0.675 0.165 142.096); /* #52AF4A */
|
|
81
|
+
--green-600: oklch(0.567 0.13 141.644); /* #45893D */
|
|
82
|
+
--green-700: oklch(0.467 0.097 140.77); /* #396731 */
|
|
83
|
+
--green-800: oklch(0.366 0.066 140.101); /* #2B4725 */
|
|
84
|
+
--green-900: oklch(0.281 0.041 139.471); /* #1E2E1A */
|
|
85
|
+
--green-950: oklch(0.222 0.026 138.012); /* #151E12 */
|
|
86
|
+
|
|
87
|
+
--blue-50: oklch(0.976 0.002 247.839); /* #F6F7F8 */
|
|
88
|
+
--blue-100: oklch(0.948 0.006 255.476); /* #EBEEF2 */
|
|
89
|
+
--blue-200: oklch(0.891 0.018 240.018); /* #D1DDE6 */
|
|
90
|
+
--blue-300: oklch(0.8 0.044 240.87); /* #A5C2D8 */
|
|
91
|
+
--blue-400: oklch(0.715 0.077 240.176); /* #76AACF */
|
|
92
|
+
--blue-500: oklch(0.622 0.113 242.424); /* #408EC5 */
|
|
93
|
+
--blue-600: oklch(0.538 0.097 239.26); /* #2F75A0 */
|
|
94
|
+
--blue-700: oklch(0.452 0.072 234.642); /* #275C78 */
|
|
95
|
+
--blue-800: oklch(0.363 0.05 228.7); /* #1E4353 */
|
|
96
|
+
--blue-900: oklch(0.282 0.032 222.574); /* #162D35 */
|
|
97
|
+
--blue-950: oklch(0.224 0.021 217.756); /* #101E22 */
|
|
98
|
+
|
|
99
|
+
--indigo-50: oklch(0.966 0.012 301.287); /* #F5F2FB */
|
|
100
|
+
--indigo-100: oklch(0.929 0.028 299.539); /* #EAE4F8 */
|
|
101
|
+
--indigo-200: oklch(0.851 0.062 297.56); /* #D2C6F2 */
|
|
102
|
+
--indigo-300: oklch(0.743 0.087 295.69); /* #B0A1DD */
|
|
103
|
+
--indigo-400: oklch(0.611 0.153 291.363); /* #866FD7 */
|
|
104
|
+
--indigo-500: oklch(0.559 0.193 287.911); /* #7358DC */
|
|
105
|
+
--indigo-600: oklch(0.42 0.218 279.213); /* #4026BE */
|
|
106
|
+
--indigo-700: oklch(0.351 0.17 279.238); /* #30218F */
|
|
107
|
+
--indigo-800: oklch(0.286 0.122 280.262); /* #231B64 */
|
|
108
|
+
--indigo-900: oklch(0.229 0.079 281.288); /* #181540 */
|
|
109
|
+
--indigo-950: oklch(0.19 0.049 282.432); /* #111029 */
|
|
110
|
+
|
|
111
|
+
--pink-50: oklch(0.969 0.016 341.389); /* #FDF1F8 */
|
|
112
|
+
--pink-100: oklch(0.944 0.027 337.065); /* #F9E6F3 */
|
|
113
|
+
--pink-200: oklch(0.903 0.045 338.704); /* #F4D4E9 */
|
|
114
|
+
--pink-300: oklch(0.778 0.085 337.731); /* #DBA2CA */
|
|
115
|
+
--pink-400: oklch(0.68 0.145 338.806); /* #D172B6 */
|
|
116
|
+
--pink-500: oklch(0.624 0.191 340.354); /* #CE4EAA */
|
|
117
|
+
--pink-600: oklch(0.532 0.19 339.952); /* #AE2F8E */
|
|
118
|
+
--pink-700: oklch(0.436 0.148 337.368); /* #81276E */
|
|
119
|
+
--pink-800: oklch(0.345 0.103 335.104); /* #58204E */
|
|
120
|
+
--pink-900: oklch(0.266 0.065 332.23); /* #371833 */
|
|
121
|
+
--pink-950: oklch(0.211 0.036 331.312); /* #221220 */
|
|
122
|
+
|
|
123
|
+
/* gradient tokens */
|
|
124
|
+
--gradient-primary: linear-gradient(
|
|
125
|
+
87.14044870021029deg,
|
|
126
|
+
oklch(0.534 0.167 269.617) 0% /* #4862CC */,
|
|
127
|
+
oklch(0.71 0.167 13.3) 100% /* #F76F83 */
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
/* semantic tokens */
|
|
131
|
+
--background: var(--gray-50);
|
|
132
|
+
--foreground: var(--gray-900);
|
|
133
|
+
--card: oklch(1 0 0);
|
|
134
|
+
--card-foreground: var(--gray-900);
|
|
135
|
+
--popover: oklch(1 0 0);
|
|
136
|
+
--popover-foreground: var(--gray-900);
|
|
137
|
+
--primary: var(--primary-500);
|
|
138
|
+
--primary-foreground: oklch(1 0 0);
|
|
139
|
+
--brand: var(--brand-500);
|
|
140
|
+
--brand-foreground: oklch(1 0 0);
|
|
141
|
+
--secondary: var(--gray-100);
|
|
142
|
+
--secondary-foreground: var(--gray-900);
|
|
143
|
+
--muted: var(--gray-100);
|
|
144
|
+
--muted-foreground: var(--gray-600);
|
|
145
|
+
--accent: var(--gray-200);
|
|
146
|
+
--accent-foreground: var(--gray-900);
|
|
147
|
+
--destructive: var(--red-500);
|
|
148
|
+
--destructive-foreground: oklch(1 0 0);
|
|
149
|
+
--border: var(--gray-200);
|
|
150
|
+
--input: var(--gray-200);
|
|
151
|
+
--ring: var(--primary-300);
|
|
152
|
+
--chart-1: var(--primary-500);
|
|
153
|
+
--chart-2: var(--green-500);
|
|
154
|
+
--chart-3: var(--blue-500);
|
|
155
|
+
--chart-4: var(--indigo-500);
|
|
156
|
+
--chart-5: var(--pink-500);
|
|
157
|
+
--sidebar: var(--gray-100);
|
|
158
|
+
--sidebar-foreground: var(--gray-900);
|
|
159
|
+
--sidebar-primary: var(--primary-500);
|
|
160
|
+
--sidebar-primary-foreground: oklch(1 0 0);
|
|
161
|
+
--sidebar-accent: var(--gray-200);
|
|
162
|
+
--sidebar-accent-foreground: var(--gray-900);
|
|
163
|
+
--sidebar-border: var(--gray-200);
|
|
164
|
+
--sidebar-ring: var(--primary-300);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.dark {
|
|
168
|
+
--background: var(--zinc-950);
|
|
169
|
+
--foreground: var(--zinc-50);
|
|
170
|
+
--card: var(--zinc-900);
|
|
171
|
+
--card-foreground: var(--zinc-50);
|
|
172
|
+
--popover: var(--zinc-900);
|
|
173
|
+
--popover-foreground: var(--zinc-50);
|
|
174
|
+
--primary: var(--primary-400);
|
|
175
|
+
--primary-foreground: oklch(1 0 0);
|
|
176
|
+
--brand: var(--brand-400);
|
|
177
|
+
--brand-foreground: oklch(1 0 0);
|
|
178
|
+
--secondary: var(--zinc-800);
|
|
179
|
+
--secondary-foreground: var(--zinc-50);
|
|
180
|
+
--muted: var(--zinc-800);
|
|
181
|
+
--muted-foreground: var(--zinc-400);
|
|
182
|
+
--accent: var(--zinc-700);
|
|
183
|
+
--accent-foreground: var(--zinc-50);
|
|
184
|
+
--destructive: var(--red-400);
|
|
185
|
+
--destructive-foreground: oklch(1 0 0);
|
|
186
|
+
--border: var(--zinc-700);
|
|
187
|
+
--input: var(--zinc-600);
|
|
188
|
+
--ring: var(--primary-400);
|
|
189
|
+
--chart-1: var(--primary-400);
|
|
190
|
+
--chart-2: var(--green-400);
|
|
191
|
+
--chart-3: var(--blue-400);
|
|
192
|
+
--chart-4: var(--indigo-400);
|
|
193
|
+
--chart-5: var(--pink-300);
|
|
194
|
+
--sidebar: var(--zinc-900);
|
|
195
|
+
--sidebar-foreground: var(--zinc-50);
|
|
196
|
+
--sidebar-primary: var(--primary-400);
|
|
197
|
+
--sidebar-primary-foreground: oklch(1 0 0);
|
|
198
|
+
--sidebar-accent: var(--zinc-700);
|
|
199
|
+
--sidebar-accent-foreground: var(--zinc-50);
|
|
200
|
+
--sidebar-border: var(--zinc-700);
|
|
201
|
+
--sidebar-ring: var(--primary-400);
|
|
202
|
+
}
|