love-ui 1.2.22 → 1.2.23
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/dist/{chunk-L7XDZOUL.js → chunk-CH2CHRA7.js} +1 -1
- package/dist/index.js +4 -4
- package/dist/mcp-server.js +1 -1
- package/package.json +1 -1
- package/registry/default/blocks/404-2/components/not-found.tsx +1 -1
- package/registry/default/blocks/auth1/components/auth-page.tsx +0 -7
- package/registry/default/blocks/auth1/components/logo.tsx +3 -14
- package/registry/default/blocks/auth2/components/auth.tsx +1 -1
- package/registry/default/blocks/auth2/components/ui/decor-icon.tsx +49 -36
- package/registry/default/blocks/auth3/components/logo.tsx +3 -14
- package/registry/default/blocks/auth3/components/ui/decor-icon.tsx +49 -36
- package/registry/default/blocks/contact5/components/decor-icon.tsx +49 -36
- package/registry/default/blocks/cta-3/components/cta.tsx +1 -1
- package/registry/default/blocks/cta-3/components/decor-icon.tsx +49 -36
- package/registry/default/blocks/cta-5/components/cta.tsx +3 -9
- package/registry/default/blocks/faq-3/components/decor-icon.tsx +49 -36
- package/registry/default/blocks/features1/components/feature-section.tsx +1 -1
- package/registry/default/blocks/features2/components/decor-icon.tsx +49 -36
- package/registry/default/blocks/features2/components/feature-section.tsx +1 -1
- package/registry/default/blocks/features4/components/decor-icon.tsx +49 -36
- package/registry/default/blocks/features4/components/feature-section.tsx +0 -2
- package/registry/default/blocks/features5/components/feature-section.tsx +1 -1
- package/registry/default/blocks/features6/components/feature-section.tsx +5 -21
- package/registry/default/blocks/footer1/components/logo.tsx +3 -14
- package/registry/default/blocks/footer2/components/footer.tsx +1 -1
- package/registry/default/blocks/footer2/components/logo.tsx +3 -14
- package/registry/default/blocks/footer3/components/footer.tsx +2 -2
- package/registry/default/blocks/footer3/components/logo.tsx +3 -14
- package/registry/default/blocks/footer4/components/footer.tsx +1 -1
- package/registry/default/blocks/footer4/components/logo.tsx +3 -14
- package/registry/default/blocks/footer5/components/footer.tsx +27 -30
- package/registry/default/blocks/footer5/components/logo.tsx +3 -14
- package/registry/default/blocks/footer6/components/footer.tsx +3 -3
- package/registry/default/blocks/footer6/components/logo.tsx +3 -14
- package/registry/default/blocks/header1/components/logo.tsx +3 -14
- package/registry/default/blocks/header2/components/logo.tsx +3 -14
- package/registry/default/blocks/header3/components/logo.tsx +3 -14
- package/registry/default/blocks/hero1/components/hero.tsx +7 -7
- package/registry/default/blocks/hero1/components/logo.tsx +3 -14
- package/registry/default/blocks/hero2/components/decor-icon.tsx +49 -36
- package/registry/default/blocks/hero2/components/hero.tsx +4 -5
- package/registry/default/blocks/hero2/components/logo.tsx +3 -14
- package/registry/default/blocks/hero3/components/hero.tsx +2 -3
- package/registry/default/blocks/hero3/components/logo.tsx +3 -14
- package/registry/default/blocks/integrations1/components/integrations.tsx +7 -1
- package/registry/default/blocks/integrations2/components/decor-icon.tsx +49 -36
- package/registry/default/blocks/integrations2/components/integrations.tsx +7 -1
- package/registry/default/blocks/integrations3/components/integrations.tsx +25 -34
- package/registry/default/blocks/integrations4/components/integrations.tsx +2 -5
- package/registry/default/blocks/integrations5/components/integrations.tsx +8 -5
- package/registry/default/blocks/logo-cloud-2/components/decor-icon.tsx +49 -36
- package/registry/default/blocks/logo-cloud-3/app/page.tsx +2 -2
- package/registry/default/blocks/logo-cloud-3/components/logo-cloud.tsx +1 -1
- package/registry/default/blocks/logo-cloud-4/components/logo-cloud.tsx +1 -1
- package/registry/default/blocks/logo-cloud-4/components/progressive-blur.tsx +30 -36
- package/registry/default/blocks/pricing1/components/decor-icon.tsx +49 -36
- package/registry/default/blocks/stats10/components/stats.tsx +1 -9
- package/registry/default/blocks/testimonials1/components/logo.tsx +3 -14
- package/registry/default/blocks/testimonials1/components/testimonials.tsx +1 -1
- package/registry/default/blocks/testimonials2/components/testimonials.tsx +3 -3
- package/registry/default/blocks/testimonials3/components/decor-icon.tsx +49 -36
- package/registry/default/blocks/testimonials3/components/testimonials.tsx +0 -1
- package/registry/default/blocks/testimonials5/components/testimonials.tsx +1 -1
- package/registry/default/blocks/testimonials6/components/testimonials.tsx +1 -1
- package/registry/default/examples/preview-card-profile.tsx +3 -3
- package/registry/default/ui/button.tsx +1 -1
- package/registry/default/ui/toggle.tsx +2 -1
- package/registry/default/blocks/auth1/components/particles.tsx +0 -321
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{cyan as Xn,green as Qn,red as es,yellow as ts}from"kleur/colors";var k={error:es,warn:ts,info:Xn,success:Qn};var E={error(...e){console.log(k.error(e.join(" ")))},warn(...e){console.log(k.warn(e.join(" ")))},info(...e){console.log(k.info(e.join(" ")))},success(...e){console.log(k.success(e.join(" ")))},log(...e){console.log(e.join(" "))},break(){console.log("")}};var dr={name:"love-ui",version:"1.2.
|
|
1
|
+
import{cyan as Xn,green as Qn,red as es,yellow as ts}from"kleur/colors";var k={error:es,warn:ts,info:Xn,success:Qn};var E={error(...e){console.log(k.error(e.join(" ")))},warn(...e){console.log(k.warn(e.join(" ")))},info(...e){console.log(k.info(e.join(" ")))},success(...e){console.log(k.success(e.join(" ")))},log(...e){console.log(e.join(" "))},break(){console.log("")}};var dr={name:"love-ui",version:"1.2.23",private:!1,license:"MIT",type:"module",bin:{loveui:"dist/index.js","love-ui":"dist/index.js","loveui-mcp":"dist/mcp-server.js"},files:["dist","registry","skills"],main:"dist/index.js",exports:{".":{import:"./dist/index.js",require:"./dist/index.js"},"./icons":{types:"./registry/default/icons/dist/index.d.ts",import:"./registry/default/icons/dist/index.mjs",require:"./registry/default/icons/dist/index.cjs"},"./logos":{types:"./registry/default/logos/dist/index.d.ts",import:"./registry/default/logos/dist/index.mjs",require:"./registry/default/logos/dist/index.cjs"},"./vectors":{types:"./registry/default/vectors/dist/index.d.ts",import:"./registry/default/vectors/dist/index.mjs",require:"./registry/default/vectors/dist/index.cjs"},"./registry/*":"./registry/*","./package.json":"./package.json"},dependencies:{"@antfu/ni":"^24.4.0","@babel/core":"^7.28.5","@babel/parser":"^7.28.5","@babel/plugin-transform-typescript":"^7.28.5","@dotenvx/dotenvx":"^1.71.0","@modelcontextprotocol/sdk":"^1.18.1",clsx:"^2.1.1",commander:"^14.0.2",cosmiconfig:"^9.0.0",dedent:"^1.7.0",deepmerge:"^4.3.1",diff:"^8.0.2",execa:"^9.6.0","fast-glob":"^3.3.3","fs-extra":"^11.3.2",fuzzysort:"^3.1.0","https-proxy-agent":"^7.0.6",kleur:"^4.1.5","node-fetch":"^3.3.2",open:"^10.2.0",ora:"^9.0.0",postcss:"^8.5.6","postcss-nested":"^7.0.2","postcss-selector-parser":"^7.1.1",prompts:"^2.4.2",recast:"^0.23.11","stringify-object":"^5.0.0","tailwind-merge":"^3.6.0",tailwindcss:"^4.3.0","ts-morph":"^27.0.2","tsconfig-paths":"^4.2.0",zod:"^3.25.76","zod-to-json-schema":"^3.25.2"},scripts:{build:"tsup",postbuild:"node ./scripts/copy-registry.mjs",prepack:"npm run build","verify:registry":"node ./scripts/copy-registry.mjs",clean:"rimraf dist registry"},devDependencies:{"@types/diff":"^7.0.2","@types/fs-extra":"^11.0.4","@types/node":"^20.14.10","@types/prompts":"^2.4.9",msw:"^2.12.4",rimraf:"^6.0.1",tsup:"^8.5.0",vitest:"^4.0.15"}};var ge=process.env.REGISTRY_URL??"https://www.loveui.dev/r",O=ge.replace(/\/r\/?$/,""),re="@love-ui-pro",ns=process.env.LOVEUI_PRO_REGISTRY_URL??`${O}/pro/r/{name}.json`,rt=process.env.LOVEUI_PRO_CLI==="1"?re:"@love-ui",nt="new-york-v4",hr=[{name:"neutral",label:"Neutral"},{name:"zinc",label:"Zinc"},{name:"stone",label:"Stone"},{name:"mauve",label:"Mauve"},{name:"olive",label:"Olive"},{name:"mist",label:"Mist"},{name:"taupe",label:"Taupe"}],U={"@love-ui":`${ge}/{name}.json`,[re]:ns};var Sa=[{name:"toast",deprecatedBy:"sonner",message:"The toast component is deprecated. Use the sonner component instead."},{name:"toaster",deprecatedBy:"sonner",message:"The toaster component is deprecated. Use the sonner component instead."}];import{z as Mt}from"zod";var F={NETWORK_ERROR:"NETWORK_ERROR",NOT_FOUND:"NOT_FOUND",GONE:"GONE",UNAUTHORIZED:"UNAUTHORIZED",FORBIDDEN:"FORBIDDEN",FETCH_ERROR:"FETCH_ERROR",NOT_CONFIGURED:"NOT_CONFIGURED",INVALID_CONFIG:"INVALID_CONFIG",MISSING_ENV_VARS:"MISSING_ENV_VARS",LOCAL_FILE_ERROR:"LOCAL_FILE_ERROR",PARSE_ERROR:"PARSE_ERROR",VALIDATION_ERROR:"VALIDATION_ERROR",UNKNOWN_ERROR:"UNKNOWN_ERROR"},$=class extends Error{code;statusCode;context;suggestion;timestamp;cause;constructor(t,r={}){super(t),this.name="RegistryError",this.code=r.code||F.UNKNOWN_ERROR,this.statusCode=r.statusCode,this.cause=r.cause,this.context=r.context,this.suggestion=r.suggestion,this.timestamp=new Date,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}toJSON(){return{name:this.name,message:this.message,code:this.code,statusCode:this.statusCode,context:this.context,suggestion:this.suggestion,timestamp:this.timestamp,stack:this.stack}}},H=class extends ${constructor(r,n){let s=`The item at ${r} was not found. It may not exist at the registry.`;super(s,{code:F.NOT_FOUND,statusCode:404,cause:n,context:{url:r},suggestion:"Check if the item name is correct and the registry URL is accessible."});this.url=r;this.name="RegistryNotFoundError"}url},st=class extends ${constructor(r,n){let s=`The item at ${r} is no longer available. It may have been removed or expired.`;super(s,{code:F.GONE,statusCode:410,cause:n,context:{url:r},suggestion:"This resource was previously available but has been permanently removed. Check if a newer version exists or contact the registry maintainer."});this.url=r;this.name="RegistryGoneError"}url},je=class extends ${constructor(r,n){let s=`You are not authorized to access the item at ${r}. If this is a remote registry, you may need to authenticate.`;super(s,{code:F.UNAUTHORIZED,statusCode:401,cause:n,context:{url:r},suggestion:"Check your authentication credentials and environment variables."});this.url=r;this.name="RegistryUnauthorizedError"}url},Ae=class extends ${constructor(r,n){let s=`You are not authorized to access the item at ${r}. If this is a remote registry, you may need to authenticate.`;super(s,{code:F.FORBIDDEN,statusCode:403,cause:n,context:{url:r},suggestion:"Check your authentication credentials and environment variables."});this.url=r;this.name="RegistryForbiddenError"}url},Le=class extends ${constructor(r,n,s,i){let o=n?`Failed to fetch from registry (${n}): ${r}`:`Failed to fetch from registry: ${r}`,a=typeof i=="string"&&i?`${o} - ${i}`:o,l="Check your network connection and try again.";n===404?l="The requested resource was not found. Check the URL or item name.":n===500?l="The registry server encountered an error. Try again later.":n&&n>=400&&n<500&&(l="There was a client error. Check your request parameters.");super(a,{code:F.FETCH_ERROR,statusCode:n,cause:i,context:{url:r,responseBody:s},suggestion:l});this.url=r;this.responseBody=s;this.name="RegistryFetchError"}url;responseBody},ne=class extends ${constructor(r){let n=r?`Unknown registry "${r}". Make sure it is defined in components.json as follows:
|
|
2
2
|
{
|
|
3
3
|
"registries": {
|
|
4
4
|
"${r}": "[URL_TO_REGISTRY]"
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{$ as ae,A as Ot,Aa as tn,B as ze,Ba as $r,C as At,Ca as rn,D as Nt,Da as jm,E as Lt,Ea as Tm,F as _t,Fa as F,G as Vt,Ga as on,H as Lo,Ha as ct,I as Dt,Ia as Ke,J as Ut,Ja as nn,K as _o,Ka as sn,L as Mt,La as an,M as Bt,Ma as ln,N as Sr,Na as cn,O as Vo,P as Do,Q as Uo,R as Mo,S as q,T as Bo,U as Wt,V as Wo,W as zo,X as Jo,Y as Go,Z as Ho,_ as j,a as S,aa as Je,b as xo,ba as Ko,c as re,ca as Ir,d as Tt,da as je,e as d,ea as Ge,f as l,fa as L,g as M,ga as ne,h as B,ha as zt,i as W,ia as Yo,j as So,ja as Pr,k as Io,ka as qo,l as Po,la as le,m as Eo,ma as ce,n as $o,na as Zo,o as jo,oa as R,p as Ft,pa as Im,q as z,qa as ie,r as To,ra as Pm,s as lt,sa as Em,t as $e,ta as He,u as Fo,ua as Er,v as xr,va as Xo,w as Oo,wa as Qo,x as Ao,xa as Jt,y as No,ya as $m,z as b,za as en}from"./chunk-
|
|
2
|
+
import{$ as ae,A as Ot,Aa as tn,B as ze,Ba as $r,C as At,Ca as rn,D as Nt,Da as jm,E as Lt,Ea as Tm,F as _t,Fa as F,G as Vt,Ga as on,H as Lo,Ha as ct,I as Dt,Ia as Ke,J as Ut,Ja as nn,K as _o,Ka as sn,L as Mt,La as an,M as Bt,Ma as ln,N as Sr,Na as cn,O as Vo,P as Do,Q as Uo,R as Mo,S as q,T as Bo,U as Wt,V as Wo,W as zo,X as Jo,Y as Go,Z as Ho,_ as j,a as S,aa as Je,b as xo,ba as Ko,c as re,ca as Ir,d as Tt,da as je,e as d,ea as Ge,f as l,fa as L,g as M,ga as ne,h as B,ha as zt,i as W,ia as Yo,j as So,ja as Pr,k as Io,ka as qo,l as Po,la as le,m as Eo,ma as ce,n as $o,na as Zo,o as jo,oa as R,p as Ft,pa as Im,q as z,qa as ie,r as To,ra as Pm,s as lt,sa as Em,t as $e,ta as He,u as Fo,ua as Er,v as xr,va as Xo,w as Oo,wa as Qo,x as Ao,xa as Jt,y as No,ya as $m,z as b,za as en}from"./chunk-CH2CHRA7.js";import Pl from"path";import{promises as Ja}from"fs";import ue from"path";import mn from"path";import jr from"fs-extra";async function pn(e){let t={};if(!jr.existsSync(e.cwd)||!jr.existsSync(mn.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,projectInfo:null};let r=b("Preflight checks.",{silent:e.silent}).start();jr.existsSync(mn.resolve(e.cwd,"components.json"))&&!e.force&&(r?.fail(),l.break(),l.error(`A ${d.info("components.json")} file already exists at ${d.info(e.cwd)}.
|
|
3
3
|
To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),l.break(),process.exit(1)),r?.succeed();let o=b("Verifying framework.",{silent:e.silent}).start(),n=e.existingConfig?.tailwind,i=await F(e.cwd,{configCssFile:typeof n?.css=="string"?n.css:void 0});if(!i||i?.framework.name==="manual"){if(t["7"]=!0,o?.fail(),!e.monorepo&&await M(e.cwd)){let f=await B(e.cwd);f.length>0&&(W("init",f),process.exit(1))}l.break(),i?.framework.links.installation&&l.error(`We could not detect a supported framework at ${d.info(e.cwd)}.
|
|
4
4
|
Visit ${d.info(i?.framework.links.installation)} to manually configure your project.
|
|
5
|
-
Once configured, you can use the cli to add components.`),l.break(),process.exit(1)}o?.succeed(`Verifying framework. Found ${d.info(i.framework.label)}.`);let s="Validating Tailwind CSS.";i.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${d.info("v4")}.`);let c=b(s,{silent:e.silent}).start();i.tailwindVersion==="v3"&&(!i?.tailwindConfigFile||!i?.tailwindCssFile)?(t["5"]=!0,c?.fail()):i.tailwindVersion==="v4"&&!i?.tailwindCssFile?(t["5"]=!0,c?.fail()):i.tailwindVersion?c?.succeed():(t["5"]=!0,c?.fail());let a=b("Validating import alias.",{silent:e.silent}).start();return i?.aliasPrefix?a?.succeed():(t["6"]=!0,a?.fail()),Object.keys(t).length>0&&(t["5"]&&(l.break(),l.error(`No Tailwind CSS configuration found at ${d.info(e.cwd)}.`),l.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),l.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&l.error(`Visit ${d.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(l.break(),l.error(`Could not find valid path aliases or package imports for ${d.info("init")}.`),l.error(`Configure path aliases in ${d.info("tsconfig.json")} or imports in ${d.info("package.json")}, then run ${d.info("init")} again.`),l.error(`Learn more at ${d.info(`${S}/docs/installation/manual#configure-import-aliases`)}.`)),l.break(),process.exit(1)),{errors:t,projectInfo:i}}var Es=["
|
|
6
|
-
`,"utf-8"),p.succeed()}return{config:a,newRegistries:Object.keys(s)}}import _s from"open";import wn from"prompts";var Z={
|
|
5
|
+
Once configured, you can use the cli to add components.`),l.break(),process.exit(1)}o?.succeed(`Verifying framework. Found ${d.info(i.framework.label)}.`);let s="Validating Tailwind CSS.";i.tailwindVersion==="v4"&&(s=`Validating Tailwind CSS. Found ${d.info("v4")}.`);let c=b(s,{silent:e.silent}).start();i.tailwindVersion==="v3"&&(!i?.tailwindConfigFile||!i?.tailwindCssFile)?(t["5"]=!0,c?.fail()):i.tailwindVersion==="v4"&&!i?.tailwindCssFile?(t["5"]=!0,c?.fail()):i.tailwindVersion?c?.succeed():(t["5"]=!0,c?.fail());let a=b("Validating import alias.",{silent:e.silent}).start();return i?.aliasPrefix?a?.succeed():(t["6"]=!0,a?.fail()),Object.keys(t).length>0&&(t["5"]&&(l.break(),l.error(`No Tailwind CSS configuration found at ${d.info(e.cwd)}.`),l.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),l.error("Install Tailwind CSS then try again."),i?.framework.links.tailwind&&l.error(`Visit ${d.info(i?.framework.links.tailwind)} to get started.`)),t["6"]&&(l.break(),l.error(`Could not find valid path aliases or package imports for ${d.info("init")}.`),l.error(`Configure path aliases in ${d.info("tsconfig.json")} or imports in ${d.info("package.json")}, then run ${d.info("init")} again.`),l.error(`Learn more at ${d.info(`${S}/docs/installation/manual#configure-import-aliases`)}.`)),l.break(),process.exit(1)),{errors:t,projectInfo:i}}var Es=["default","crisp","mono","editorial"],Tr=["neutral","stone","zinc","gray","mauve","olive","mist","taupe"],Ht=["neutral","stone","zinc","gray","amber","blue","cyan","emerald","fuchsia","green","indigo","lime","orange","pink","purple","red","rose","sky","teal","violet","yellow","mauve","olive","mist","taupe"],$s=Ht,un={neutral:"blue",stone:"lime",zinc:"amber",mauve:"emerald",olive:"violet",mist:"rose",taupe:"cyan"},Fr=["lucide","hugeicons","tabler","phosphor","remixicon","love-ui/icons"],Kt=["inter","noto-sans","nunito-sans","figtree","roboto","raleway","dm-sans","public-sans","outfit","jetbrains-mono","geist","geist-mono","lora","merriweather","playfair-display","noto-serif","roboto-slab","oxanium","manrope","space-grotesk","montserrat","ibm-plex-sans","source-sans-3","instrument-sans","eb-garamond","instrument-serif"],Or=["inherit",...Kt],js=["default","none","small","medium","large"],Ar=["subtle","bold"],Nr=["default","inverted","default-translucent","inverted-translucent"],dn=[{key:"menuColor",values:Nr,bits:3},{key:"menuAccent",values:Ar,bits:3},{key:"radius",values:js,bits:4},{key:"font",values:Kt,bits:6},{key:"iconLibrary",values:Fr,bits:6},{key:"theme",values:Ht,bits:6},{key:"baseColor",values:Tr,bits:6},{key:"style",values:Es,bits:6}],Lr=[...dn,{key:"chartColor",values:$s,bits:6},{key:"fontHeading",values:Or,bits:5}],Ts=Object.fromEntries(Lr.map(e=>[e.key,e.values[0]])),_r="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Fs="b",gn=["a","b"];function Os(e){if(e===0)return"0";let t="",r=e;for(;r>0;)t=_r[r%62]+t,r=Math.floor(r/62);return t}function As(e){let t=0;for(let r=0;r<e.length;r++){let o=_r.indexOf(e[r]);if(o===-1)return-1;t=t*62+o}return t}function hn(e){let t={...Ts,...e},r=0,o=0;for(let n of Lr){let i=n.values.indexOf(t[n.key]);r+=(i===-1?0:i)*2**o,o+=n.bits}return Fs+Os(r)}function Ye(e){if(!e||e.length<2)return null;let t=e[0];if(!gn.includes(t))return null;let r=t==="a"?dn:Lr,o=As(e.slice(1));if(o<0)return null;let n={},i=0;for(let s of r){let c=Math.floor(o/2**i)%2**s.bits;n[s.key]=c<s.values.length?s.values[c]:s.values[0],i+=s.bits}return t==="a"&&(n.fontHeading="inherit"),n}function qe(e){if(!e||e.length<2||e.length>10||!gn.includes(e[0]))return!1;for(let t=1;t<e.length;t++)if(_r.indexOf(e[t])===-1)return!1;return!0}import Ns from"path";async function yn(e,t){let r=new Set,o=new Set,n=[...e];for(;n.length>0;){let i=n.shift();if(o.has(i))continue;o.add(i);let{registry:s}=Ft(i);s&&!re[s]&&r.add(s);try{let[c]=await qo([i],t,{useCache:!0});if(c?.registryDependencies)for(let a of c.registryDependencies){let{registry:f}=Ft(a);f&&!re[f]&&r.add(f),o.has(a)||n.push(a)}}catch(c){if(c instanceof jo){let{registry:a}=Ft(i);a&&!re[a]&&r.add(a);continue}continue}}return Array.from(r)}import Ls from"fs-extra";async function G(e,t,r={}){r={silent:!1,writeFile:!0,...r};let n=(await yn(e,t)).filter(f=>!t.registries?.[f]&&!Object.keys(re).includes(f));if(n.length===0)return{config:t,newRegistries:[]};let i=await rn({useCache:process.env.NODE_ENV!=="development"});if(!i)return{config:t,newRegistries:[]};let s={};for(let f of n)i[f]&&(s[f]=i[f]);if(Object.keys(s).length===0)return{config:t,newRegistries:[]};let c=Object.fromEntries(Object.entries(t.registries||{}).filter(([f])=>!Object.keys(re).includes(f))),a={...t,registries:{...c,...s}};if(r.writeFile){let{resolvedPaths:f,...m}=a,p=b("Updating components.json.",{silent:r.silent}).start(),u=z.parse(m);await Ls.writeFile(Ns.resolve(t.resolvedPaths.cwd,"components.json"),JSON.stringify(u,null,2)+`
|
|
6
|
+
`,"utf-8"),p.succeed()}return{config:a,newRegistries:Object.keys(s)}}import _s from"open";import wn from"prompts";var Z={default:{title:"Default",description:"Geist, balanced product UI",style:"default",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"love-ui/icons",font:"geist",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},crisp:{title:"Crisp",description:"Inter, sharp SaaS UI",style:"crisp",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"love-ui/icons",font:"inter",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},mono:{title:"Mono",description:"JetBrains Mono, technical UI",style:"mono",baseColor:"neutral",theme:"neutral",chartColor:"neutral",iconLibrary:"love-ui/icons",font:"jetbrains-mono",fontHeading:"inherit",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1},editorial:{title:"Editorial",description:"Noto Sans + Playfair Display",style:"editorial",baseColor:"taupe",theme:"taupe",chartColor:"taupe",iconLibrary:"love-ui/icons",font:"noto-sans",fontHeading:"playfair-display",menuAccent:"subtle",menuColor:"default",radius:"default",rtl:!1}};function Vr(e){let t=new URL(`${S}/create`),{rtl:r,pointer:o,...n}=e??{};for(let[i,s]of Object.entries(n))s!==void 0&&t.searchParams.set(i,String(s));return r&&t.searchParams.set("rtl","true"),o&&t.searchParams.set("pointer","true"),t.toString()}async function Dr(e){if(l.break(),l.log(` Build your custom preset on ${d.info(e.createUrl)}`),l.log(` ${e.followUp}`),l.break(),e.prompt===!1)return;let{proceed:t}=await wn({type:"confirm",name:"proceed",message:"Open in browser?",initial:!0});t&&await _s(e.createUrl)}function he(e,t){let r=new URLSearchParams({base:"base",style:e.style,baseColor:e.baseColor,theme:e.theme,iconLibrary:"love-ui/icons",font:e.font,rtl:String(e.rtl??!1),menuAccent:e.menuAccent,menuColor:e.menuColor,radius:e.radius});return e.chartColor&&e.chartColor!=="neutral"&&r.set("chartColor",e.chartColor),e.fontHeading&&e.fontHeading!=="inherit"&&r.set("fontHeading",e.fontHeading),t?.preset&&r.set("preset",t.preset),t?.template&&r.set("template",t.template),t?.only&&r.set("only",t.only),t?.pointer&&r.set("pointer","true"),r.set("track","1"),`${S}/init?${r.toString()}`}async function Ze(){return"base"}async function ft(e){let t=Object.entries(Z),{selectedPreset:r}=await wn({type:"select",name:"selectedPreset",message:`Which ${d.info("preset")} would you like to use?`,choices:[...t.map(([n,i])=>({title:i.title,description:i.description,value:n})),{title:"Custom",description:`Build your own at ${d.info(`${S}/create`)}`,value:"custom"}]});if(r||process.exit(1),r==="custom"){let n=Vr({command:"init",rtl:e.rtl,pointer:e.pointer,base:e.base,...e.template&&{template:e.template}});await Dr({createUrl:n,followUp:`Then ${d.info("copy and run the command")} from loveui.dev.`}),process.exit(0)}let o=Z[r];return o||process.exit(1),{url:he({...o,base:e.base,rtl:e.rtl},{template:e.template,pointer:e.pointer}),base:e.base}}async function Te(e,t,r){let o=L(Ge({resolvedPaths:{cwd:t},...r?.registries&&{registries:r.registries}})),{config:n}=await G([e],o,{silent:!0,writeFile:!1});o=n,Yo(e,o);let[i]=await ie([e],{config:o,useCache:!0}),s=i?.type==="registry:base"&&i.config?i.config:void 0,c=e;if(Vs(e)){let a=new URL(e);a.searchParams.delete("track"),c=a.toString()}return{registryBaseConfig:s,installStyleIndex:i?.extends!=="none",url:c}}function Vs(e){try{return new URL(e).pathname==="/init"&&e.startsWith(S)}catch{return!1}}import An from"dedent";import Ds from"os";import me from"path";import{execa as Fe}from"execa";import V from"fs-extra";var Us=process.env.LOVEUI_GITHUB_URL??"https://github.com/loveconnor/loveui.git";function X(e){return{...e,frameworks:e.frameworks??[],scaffold:e.scaffold??kn({title:e.title,templateDir:e.templateDir}),postInit:e.postInit??zs}}function Oe(e,{monorepo:t}){if(!t||!e.monorepo)return e;let r=e.monorepo,o={...e,templateDir:r.templateDir,defaultProjectName:r.defaultProjectName??r.templateDir,init:r.init??e.init,files:r.files??e.files};return o.scaffold=kn({title:e.title,templateDir:r.templateDir}),o}function Ms(e){switch(e){case"pnpm":return["--no-frozen-lockfile"];case"yarn":return["--no-immutable"];default:return[]}}async function Bs(e,t){if(t==="pnpm")return;let r=me.join(e,"pnpm-workspace.yaml"),o=me.join(e,"package.json"),n=me.join(e,"pnpm-lock.yaml");V.existsSync(n)&&await V.remove(n);let i=V.existsSync(r),s=i?So(await V.readFile(r,"utf8")):[],c=s.length>0;if(V.existsSync(o)){let a=await V.readFile(o,"utf8"),f=JSON.parse(a);c?f.packageManager=await Ws(t):delete f.packageManager,c&&(f.workspaces=s),await V.writeFile(o,JSON.stringify(f,null,2)+`
|
|
7
7
|
`)}i&&await V.remove(r),c&&t==="npm"&&await bn(e)}async function Ws(e){try{let{stdout:t}=await Fe(e,["--version"]);return`${e}@${t.trim()}`}catch{return`${e}@*`}}async function bn(e){let t=await V.readdir(e,{withFileTypes:!0});for(let r of t){if(r.name==="node_modules")continue;let o=me.join(e,r.name);if(r.isDirectory())await bn(o);else if(r.name==="package.json"){let n=await V.readFile(o,"utf8");if(!n.includes("workspace:"))continue;let i=JSON.parse(n),s=!1;for(let c of["dependencies","devDependencies","peerDependencies","optionalDependencies"]){let a=i[c];if(a)for(let[f,m]of Object.entries(a))typeof m=="string"&&m.startsWith("workspace:")&&(a[f]="*",s=!0)}s&&await V.writeFile(o,JSON.stringify(i,null,2)+`
|
|
8
8
|
`)}}}function kn({title:e,templateDir:t}){return async({projectPath:r,packageManager:o})=>{let n=b(`Creating a new ${e} project. This may take a few minutes.`).start();try{let i=process.env.LOVEUI_TEMPLATE_DIR;if(i){let f=me.resolve(i,t);await V.copy(f,r,{filter:m=>!m.includes("node_modules")})}else{let f=me.join(Ds.tmpdir(),`love-ui-template-${Date.now()}`);await Fe("git",["clone","--depth","1","--filter=blob:none","--sparse",Us,f]),await Fe("git",["-C",f,"sparse-checkout","set",`templates/${t}`]);let m=me.resolve(f,"templates",t);await V.move(m,r),await V.remove(f)}await Bs(r,o);let c=["install",...Ms(o)];await Fe(o,c,{cwd:r});let a=me.join(r,"package.json");if(V.existsSync(a)){let f=await V.readFile(a,"utf8"),m=JSON.parse(f);m.name=me.basename(r),await V.writeFile(a,JSON.stringify(m,null,2)+`
|
|
9
9
|
`)}n?.succeed(`Creating a new ${e} project.`)}catch(i){n?.fail(`Something went wrong creating a new ${e} project.`),R(i)}}}async function zs({projectPath:e}){try{await Fe("git",["init"],{cwd:e}),await Fe("git",["add","-A"],{cwd:e}),await Fe("git",["commit","-m","feat: initial commit"],{cwd:e})}catch{}}import Qt from"path";import ke from"path";var vn={"--font-heading":"cn-font-heading"};function Js(e){return e.startsWith("--")?e:`--${e}`}function Ae(e){let t=new Set;for(let r of e){for(let o of r.fonts??[]){let n=o.font?.variable;if(!n)continue;let i=vn[n];i&&t.add(i)}for(let o of Object.values(r.cssVars??{}))for(let n of Object.keys(o??{})){let i=vn[Js(n)];i&&t.add(i)}}return Array.from(t)}import Xe from"path";function Cn(e,t){if(e.includes("\0"))return!1;let r;try{r=e;let u="";for(;r!==u&&r.includes("%");)u=r,r=decodeURIComponent(r)}catch{return!1}let o=Xe.normalize(r.replace(/\\/g,"/")),n=Xe.normalize(t),i=u=>u.replace(/\[\.\.\..*?\]/g,"").includes("..");if(i(o)||i(r)||i(e))return!1;let s=u=>u.replace(/\[\.\.\..*?\]/g,""),c=s(e),a=s(r);if([/\.\.[\/\\]/,/[\/\\]\.\./,/\.\./,/\.\.%/,/\x00/,/[\x01-\x1f]/].some(u=>u.test(c)||u.test(a))||(e.includes("~")||r.includes("~"))&&(e.includes("../")||r.includes("../")))return!1;if(/^[a-zA-Z]:[\/\\]/.test(r))return process.platform==="win32"?r.toLowerCase().startsWith(t.toLowerCase()):!1;if(Xe.isAbsolute(o))return o.startsWith(n+Xe.sep);let p=Xe.resolve(n,o);return p.startsWith(n+Xe.sep)||p===n}import{promises as Pn}from"fs";import na from"path";import{promises as Rn}from"fs";import Gs from"path";import N from"postcss";import Hs from"postcss/lib/at-rule";import{z as ye}from"zod";async function Yt(e,t,r){if(!t.resolvedPaths.tailwindCss||!Object.keys(e??{}).length)return;r={cleanupDefaultNextStyles:!1,silent:!1,tailwindVersion:"v3",overwriteCssVars:!1,...r};let o=t.resolvedPaths.tailwindCss,n=Gs.relative(t.resolvedPaths.cwd,o),i=b(`Updating CSS variables in ${d.info(n)}`,{silent:r.silent}).start(),s=await Rn.readFile(o,"utf8"),c=await mt(s,e??{},t,{cleanupDefaultNextStyles:r.cleanupDefaultNextStyles,tailwindVersion:r.tailwindVersion,tailwindConfig:r.tailwindConfig,overwriteCssVars:r.overwriteCssVars});await Rn.writeFile(o,c,"utf8"),i.succeed()}async function mt(e,t,r,o={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1}){o={cleanupDefaultNextStyles:!1,tailwindVersion:"v3",tailwindConfig:void 0,overwriteCssVars:!1,...o};let n=[Ks(t)];o.cleanupDefaultNextStyles&&n.push(Sn()),o.tailwindVersion==="v4"&&(n=[],n.push(Xs({params:"dark (&:is(.dark *))"})),o.cleanupDefaultNextStyles&&n.push(Sn()),n.push(qs(t,{overwriteCssVars:o.overwriteCssVars})),n.push(Zs(t)),o.tailwindConfig&&(n.push(Qs(o.tailwindConfig)),n.push(ta(o.tailwindConfig)),n.push(ea(o.tailwindConfig))));let s=(await N(n).process(e,{from:void 0})).css;return s=s.replace(/\/\* ---break--- \*\//g,""),o.tailwindVersion==="v4"&&(s=s.replace(/(\n\s*\n)+/g,`
|
|
@@ -121,7 +121,7 @@ export function App() {
|
|
|
121
121
|
|
|
122
122
|
export default App;
|
|
123
123
|
`}]}});var Q={next:Dn,vite:Jn,start:Wn,"react-router":Mn,astro:Nn,laravel:Ln};function Qe(e){if(e){for(let[t,r]of Object.entries(Q))if(r.frameworks.includes(e))return t}}function Hn(e,t){let r=t?.lib??or(e,"lib");return{ui:t?.ui??or(e,"ui"),lib:r,hooks:t?.hooks??or(e,"hooks"),utils:t?.utils??or(e,"utils",r)}}function or(e,t,r){let o=e||Wt;if(t==="ui")return`${o}/ui`;if(t==="utils"){let n=r||Gn(o,"lib");return n?`${n}/utils`:Wo}return Gn(o,t)}function Gn(e,t){return e==="components"?t:e.endsWith("/components")?`${e.slice(0,-11)}/${t}`:e.endsWith("components")&&!e.includes("/")?`${e.slice(0,-10)}${t}`:""}import Kn from"path";import Wr from"fs-extra";import Ba from"prompts";async function nr(e){let t=e.template&&e.template in Q?e.template:"next",r=Oe(Q[t],{monorepo:e.monorepo}),o=e.name??r.defaultProjectName,n=e.components?.length===1&&!!e.components[0].match(/\/chat\/b\//);if(n&&(t="next"),!e.force){let{type:a,name:f}=await Ba([{type:e.template||n?null:"select",name:"type",message:`The path ${d.info(e.cwd)} does not contain a package.json file.
|
|
124
|
-
Would you like to start a new project?`,choices:Object.entries(Q).map(([m,p])=>({title:p.title,value:m,description:p.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:o,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":!0}]);t=a??t,o=f??o}let i=Oe(Q[t],{monorepo:e.monorepo}),s=await ce(e.cwd,{withFallback:!0}),c=Kn.join(e.cwd,o);try{await Wr.access(e.cwd,Wr.constants.W_OK)}catch{l.break(),l.error(`The path ${d.info(e.cwd)} is not writable.`),l.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),l.break(),process.exit(1)}return Wr.existsSync(Kn.resolve(e.cwd,o,"package.json"))&&(l.break(),l.error(`A project with the name ${d.info(o)} already exists.`),l.error("Please choose a different name and try again."),l.break(),process.exit(1)),await i.scaffold({projectPath:c,packageManager:s,cwd:e.cwd}),{projectPath:c,projectName:o,template:t}}import{existsSync as Wa}from"fs";import{join as za}from"path";async function ee(e=process.cwd()){try{let{config:t}=await import("@dotenvx/dotenvx"),r=[".env.local",".env.development.local",".env.development",".env"];for(let o of r){let n=za(e,o);Wa(n)&&t({path:n,overload:!1,quiet:!0})}}catch(t){l.warn("Failed to load env files:",t)}}import Le from"fs-extra";var rt=".bak",et=class extends Error{filePath;constructor(t){super(`Could not back up ${t}.`),this.name="FileBackupError",this.filePath=t}};function ht(e){if(!Le.existsSync(e))return null;let t=`${e}${rt}`;try{return Le.renameSync(e,t),t}catch{return null}}function tt(e){let t=`${e}${rt}`;if(!Le.existsSync(t))return!1;try{return Le.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),!1}}function yt(e){let t=`${e}${rt}`;if(!Le.existsSync(t))return!1;try{return Le.unlinkSync(t),!0}catch{return!1}}async function Yn(e,t){if(!Le.existsSync(e))return t();if(!ht(e))throw new et(e);let o=()=>tt(e);process.on("exit",o);try{let n=await t();return process.removeListener("exit",o),yt(e),n}catch(n){throw process.removeListener("exit",o),tt(e),n}}import{Command as Ga}from"commander";import Ha from"deepmerge";import de from"fs-extra";import _e from"prompts";import{z as T}from"zod";var Ka=T.object({cwd:T.string(),name:T.string().optional(),preset:T.union([T.boolean(),T.string()]).optional(),components:T.array(T.string()).optional(),yes:T.boolean(),defaults:T.boolean(),force:T.boolean(),reinstall:T.boolean().optional(),silent:T.boolean(),isNewProject:T.boolean().default(!1),cssVariables:T.boolean().default(!0),rtl:T.boolean().optional(),pointer:T.boolean().optional(),base:T.enum(["base"]).optional(),template:T.string().optional(),monorepo:T.boolean().optional(),existingConfig:T.record(T.unknown()).optional(),installStyleIndex:T.boolean().default(!0),registryBaseConfig:z.deepPartial().optional(),menuColor:T.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:T.enum(["subtle","bold"]).optional(),iconLibrary:T.string().optional()});function Ya(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===!1&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===!1&&e.searchParams.delete("pointer"),e}var qn=new Ga().name("init").alias("create").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, react-router, laravel, astro)").option("-b, --base <base>","the component library to use. (base)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",!0).option("-d, --defaults","use default configuration: --template=next --preset=base-
|
|
124
|
+
Would you like to start a new project?`,choices:Object.entries(Q).map(([m,p])=>({title:p.title,value:m,description:p.description})),initial:0},{type:e.name?null:"text",name:"name",message:"What is your project named?",initial:o,format:m=>m.trim(),validate:m=>m.length>128?"Name should be less than 128 characters.":!0}]);t=a??t,o=f??o}let i=Oe(Q[t],{monorepo:e.monorepo}),s=await ce(e.cwd,{withFallback:!0}),c=Kn.join(e.cwd,o);try{await Wr.access(e.cwd,Wr.constants.W_OK)}catch{l.break(),l.error(`The path ${d.info(e.cwd)} is not writable.`),l.error(`It is likely you do not have write permissions for this folder or the path ${d.info(e.cwd)} does not exist.`),l.break(),process.exit(1)}return Wr.existsSync(Kn.resolve(e.cwd,o,"package.json"))&&(l.break(),l.error(`A project with the name ${d.info(o)} already exists.`),l.error("Please choose a different name and try again."),l.break(),process.exit(1)),await i.scaffold({projectPath:c,packageManager:s,cwd:e.cwd}),{projectPath:c,projectName:o,template:t}}import{existsSync as Wa}from"fs";import{join as za}from"path";async function ee(e=process.cwd()){try{let{config:t}=await import("@dotenvx/dotenvx"),r=[".env.local",".env.development.local",".env.development",".env"];for(let o of r){let n=za(e,o);Wa(n)&&t({path:n,overload:!1,quiet:!0})}}catch(t){l.warn("Failed to load env files:",t)}}import Le from"fs-extra";var rt=".bak",et=class extends Error{filePath;constructor(t){super(`Could not back up ${t}.`),this.name="FileBackupError",this.filePath=t}};function ht(e){if(!Le.existsSync(e))return null;let t=`${e}${rt}`;try{return Le.renameSync(e,t),t}catch{return null}}function tt(e){let t=`${e}${rt}`;if(!Le.existsSync(t))return!1;try{return Le.renameSync(t,e),!0}catch(r){return console.error(`Warning: Could not restore backup file ${t}: ${r}`),!1}}function yt(e){let t=`${e}${rt}`;if(!Le.existsSync(t))return!1;try{return Le.unlinkSync(t),!0}catch{return!1}}async function Yn(e,t){if(!Le.existsSync(e))return t();if(!ht(e))throw new et(e);let o=()=>tt(e);process.on("exit",o);try{let n=await t();return process.removeListener("exit",o),yt(e),n}catch(n){throw process.removeListener("exit",o),tt(e),n}}import{Command as Ga}from"commander";import Ha from"deepmerge";import de from"fs-extra";import _e from"prompts";import{z as T}from"zod";var Ka=T.object({cwd:T.string(),name:T.string().optional(),preset:T.union([T.boolean(),T.string()]).optional(),components:T.array(T.string()).optional(),yes:T.boolean(),defaults:T.boolean(),force:T.boolean(),reinstall:T.boolean().optional(),silent:T.boolean(),isNewProject:T.boolean().default(!1),cssVariables:T.boolean().default(!0),rtl:T.boolean().optional(),pointer:T.boolean().optional(),base:T.enum(["base"]).optional(),template:T.string().optional(),monorepo:T.boolean().optional(),existingConfig:T.record(T.unknown()).optional(),installStyleIndex:T.boolean().default(!0),registryBaseConfig:z.deepPartial().optional(),menuColor:T.enum(["default","inverted","default-translucent","inverted-translucent"]).optional(),menuAccent:T.enum(["subtle","bold"]).optional(),iconLibrary:T.string().optional()});function Ya(e,t){return t.rtl?e.searchParams.set("rtl","true"):t.rtl===!1&&e.searchParams.delete("rtl"),t.pointer?e.searchParams.set("pointer","true"):t.pointer===!1&&e.searchParams.delete("pointer"),e}var qn=new Ga().name("init").alias("create").description("initialize your project and install dependencies").argument("[components...]","names, url or local path to component").option("-t, --template <template>","the template to use. (next, start, vite, react-router, laravel, astro)").option("-b, --base <base>","the component library to use. (base)").option("--monorepo","scaffold a monorepo project.").option("--no-monorepo","skip the monorepo prompt.").option("-p, --preset [name]","use a preset configuration").option("-y, --yes","skip confirmation prompt.",!0).option("-d, --defaults","use default configuration: --template=next --preset=base-default",!1).option("-f, --force","force overwrite of existing configuration.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-n, --name <name>","the name for the new project.").option("-s, --silent","mute output.",!1).option("--css-variables","use css variables for theming.",!0).option("--no-css-variables","do not use css variables for theming.").option("--rtl","enable RTL support.").option("--no-rtl","disable RTL support.").option("--pointer","enable pointer cursor for buttons.").option("--no-pointer","disable pointer cursor for buttons.").option("--reinstall","re-install existing UI components.").option("--no-reinstall","do not re-install existing UI components.").action(async(e,t)=>{let r,o=[],n=()=>{r&&tt(r.replace(rt,""))};process.on("exit",n);try{let i=Ka.parse({...t,reinstall:t.reinstall,cwd:ue.resolve(t.cwd)}),s=new Map(Object.entries(Z)),c;if(i.defaults&&(i.template=i.template||"next",i.base=i.base||"base",i.reinstall=i.reinstall??!1),i.template&&!(i.template in Q)&&(l.error(`Invalid template: ${d.info(i.template)}. Available templates: ${Object.keys(Q).map(u=>d.info(u)).join(", ")}.`),l.break(),process.exit(1)),typeof i.preset=="string"&&!q(i.preset)&&!qe(i.preset)){let u=Array.from(s.keys());s.has(i.preset)||(l.error(`Invalid preset: ${d.info(i.preset)}. Available presets: ${u.join(", ")}`),l.break(),process.exit(1))}let a=i.cwd,f=de.existsSync(ue.resolve(a,"components.json"));if(!i.monorepo&&!f&&await M(a)){let u=await F(a);if(!u||u.framework.name==="manual"){let h=await B(a);h.length>0&&(W("init",h),process.exit(1))}}if(f&&!i.force){let{overwrite:u}=await _e({type:"confirm",name:"overwrite",message:`A ${d.info("components.json")} file already exists. Would you like to overwrite it?`,initial:!1});u||(l.info(` To start over, remove the ${d.info("components.json")} file and run ${d.info("init")} again.`),l.break(),process.exit(1)),i.force=!0}let m;if(f){try{m=await de.readJson(ue.resolve(a,"components.json"))}catch{}m&&(i.existingConfig=m);let u=i.reinstall;if(u===void 0){let{reinstall:h}=await _e({type:"confirm",name:"reinstall",message:"Would you like to re-install existing UI components?",initial:!1});u=h}if(u&&(o=await Ke(a),o.length)){l.break(),l.log(" The following components will be re-installed and overwritten:");for(let h=0;h<o.length;h+=8)l.log(` - ${o.slice(h,h+8).join(", ")}`);l.break()}}if(i.preset===void 0&&e.length===0&&!i.defaults){let u=de.existsSync(ue.resolve(a,"package.json"));if(!i.template&&!u){let{template:h}=await _e({type:"select",name:"template",message:"Select a template",choices:Object.entries(Q).map(([g,y])=>({title:y.title,value:g,description:y.description,disabled:i.monorepo&&g==="laravel"}))});h||process.exit(1),i.template=h}if(!i.template&&u){let h=await F(a),g=Qe(h?.framework.name);g&&(i.template=g)}if(i.template==="laravel"&&!u&&(l.break(),l.log(` Please create a new app with ${d.info("laravel new --react")} first then run ${d.info("love-ui init")}.`),l.log(` See ${d.info(`${S}/docs/installation/laravel`)} for more information.`),l.break(),process.exit(0)),i.monorepo===void 0&&!u&&i.template&&Q[i.template]?.monorepo){let{monorepo:h}=await _e({type:"confirm",name:"monorepo",message:"Would you like to set up a monorepo?",initial:!1});i.monorepo=h}i.base||(i.base=await Ze()),i.preset=!0}if(i.preset!==void 0){let u=i.preset===!0?!0:i.preset;if(u===!0){let h=await ft({rtl:i.rtl??!1,template:i.template,base:i.base,pointer:i.pointer});e=[h.url,...e],c=h.base}if(typeof u=="string"){let h;if(q(u)){let g=new URL(u);Ya(g,i),g.pathname==="/init"&&u.startsWith(S)&&g.searchParams.set("track","1"),h=g.toString(),c=g.searchParams.get("base")??void 0}else if(qe(u)){let g=Ye(u);g||(l.error(`Invalid preset code: ${d.info(u)}`),l.break(),process.exit(1)),h=he({...g,base:"base",rtl:i.rtl??!1},{template:i.template,preset:u,pointer:i.pointer}),c=void 0}else{let g=s.get(u);if(!g)throw new Error(`Unknown preset: ${u}`);h=he({...g,base:"base",rtl:i.rtl??g.rtl},{template:i.template,pointer:i.pointer}),c=void 0}e=[h,...e]}}let p=i.base??c??(m?.style?"base":"");if(!p)if(e.length>0)p="base";else{let u=await Ze();p=u,i.base=u}if(i.defaults&&!e.some(q)&&(e=[he({...Z.default,base:p,rtl:i.rtl??!1},{template:i.template,pointer:i.pointer}),...e]),e.length>0&&q(e[0])){let u=new URL(e[0]);u.searchParams.set("base",p),e[0]=u.toString()}if(m?.style){let u=await Xa(m.style,p);if(u!==p&&(p=u,e.length>0&&q(e[0]))){let h=new URL(e[0]);h.searchParams.set("base",u),e[0]=h.toString()}}if(o.length&&(e=[...e,...o]),i.components=e,await ee(i.cwd),e.length>0){let u=ue.resolve(a,"components.json");f&&(r=ht(u)??void 0,r||l.warn(`Could not back up ${d.info("components.json")}.`));let{registryBaseConfig:h,installStyleIndex:g,url:y}=await Te(e[0],a,{registries:m?.registries});e[0]=y,g||(i.installStyleIndex=!1),h&&(i.registryBaseConfig=h)}await ot(i),l.break(),l.log(`Project initialization completed.
|
|
125
125
|
You may now add components.`),process.removeListener("exit",n),yt(ue.resolve(a,"components.json")),l.break()}catch(i){process.removeListener("exit",n),n(),l.break(),R(i)}finally{ne()}});async function ot(e){let t,r,o,n=e.template,i=n?Oe(Q[n],{monorepo:e.monorepo}):void 0;if(e.monorepo&&i?.init&&de.existsSync(ue.resolve(e.cwd,"package.json")))t=await F(e.cwd);else if(e.skipPreflight)t=await F(e.cwd);else{let C=await pn(e);if(C.errors["1"]){let{projectPath:E,template:U}=await nr(e);E||process.exit(1),e.cwd=E,e.isNewProject=!0,o=U,t=await F(e.cwd)}else t=C.projectInfo}r=await on(e.cwd,t);let c=o??n,a=c?Oe(Q[c],{monorepo:e.monorepo}):void 0,f=[...e.installStyleIndex?["index"]:[],...e.components??[],...a?["button"]:[]],m=o?a?.postInit:void 0;if(a?.init){let C=await a.init({projectPath:e.cwd,components:f,registryBaseConfig:e.registryBaseConfig,rtl:e.rtl??!1,menuColor:e.menuColor,menuAccent:e.menuAccent,iconLibrary:e.iconLibrary,silent:e.silent});return m&&await m({projectPath:e.cwd}),C}let p=r?await Za(r,e):await qa(await j(e.cwd));if(!e.yes){let{proceed:C}=await _e({type:"confirm",name:"proceed",message:`Write configuration to ${d.info("components.json")}. Proceed?`,initial:!0});C||process.exit(1)}let u=await ae(e.cwd,p),{config:h}=await G(f,u,{silent:!0});h.registries&&(p.registries=h.registries);let g=b("Writing components.json.").start(),y=ue.resolve(e.cwd,"components.json"),k=`${y}${rt}`,v=(C,E)=>{let{registries:U,...Y}=Ha(C,E);return{...Y,registries:U}};if(de.existsSync(k)){let C=await de.readJson(k);e.force?C.registries&&(p.registries={...C.registries,...p.registries||{}}):p=v(C,p)}e.registryBaseConfig&&(p=v(p,e.registryBaseConfig)),e.rtl!==void 0&&(p.rtl=e.rtl),p.registries=Object.fromEntries(Object.entries(p.registries||{}).filter(([C])=>!Object.keys(re).includes(C))),await Ja.writeFile(y,`${JSON.stringify(p,null,2)}
|
|
126
126
|
`,"utf8"),g.succeed();let I=await ae(e.cwd,p),x=await Je(I);if(x){let C={};if(p.menuColor&&(C.menuColor=p.menuColor),p.menuAccent&&(C.menuAccent=p.menuAccent),p.rtl!==void 0&&(C.rtl=p.rtl),p.iconLibrary&&(C.iconLibrary=p.iconLibrary),Object.keys(C).length>0)for(let E of Object.keys(x)){let U=x[E];if(U.resolvedPaths.cwd===I.resolvedPaths.cwd)continue;let Y=ue.resolve(U.resolvedPaths.cwd,"components.json");if(de.existsSync(Y)){let Pe=await de.readJson(Y);await de.writeJson(Y,{...Pe,...C},{spaces:2})}}}return Ho.clearCaches(),await pe(f,I,{overwrite:!0,overwriteCssVars:e.reinstall||void 0,silent:e.silent,isNewProject:e.isNewProject||t?.framework.name==="next-app"}),m&&await m({projectPath:e.cwd}),I}async function qa(e=null){let[t,r]=await Promise.all([Er(),Qo()]);l.info("");let o=await _e([{type:"toggle",name:"typescript",message:`Would you like to use ${d.info("TypeScript")} (recommended)?`,initial:e?.tsx??!0,active:"yes",inactive:"no"},{type:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:t.map(s=>({title:s.label,value:s.name}))},{type:"select",name:"tailwindBaseColor",message:`Which color would you like to use as the ${d.info("base color")}?`,choices:r.map(s=>({title:s.label,value:s.name}))},{type:"text",name:"tailwindCss",message:`Where is your ${d.info("global CSS")} file?`,initial:e?.tailwind.css??zo},{type:"toggle",name:"tailwindCssVariables",message:`Would you like to use ${d.info("CSS variables")} for theming?`,initial:e?.tailwind.cssVariables??!0,active:"yes",inactive:"no"},{type:"text",name:"tailwindPrefix",message:`Are you using a custom ${d.info("tailwind prefix eg. tw-")}? (Leave blank if not)`,initial:""},{type:"text",name:"tailwindConfig",message:`Where is your ${d.info("tailwind.config.js")} located?`,initial:e?.tailwind.config??Jo},{type:"text",name:"components",message:`Configure the import alias for ${d.info("components")}:`,initial:e?.aliases.components??Wt},{type:"toggle",name:"rsc",message:`Are you using ${d.info("React Server Components")}?`,initial:e?.rsc??!0,active:"yes",inactive:"no"}]);o.style||process.exit(1);let n=e&&e.aliases.components===o.components?e.aliases:void 0,i=Hn(o.components,n);return z.parse({$schema:"https://www.loveui.dev/schema.json",style:o.style,tailwind:{config:o.tailwindConfig,css:o.tailwindCss,baseColor:o.tailwindBaseColor,cssVariables:o.tailwindCssVariables,prefix:o.tailwindPrefix},rsc:o.rsc,tsx:o.typescript,aliases:{components:o.components,ui:i.ui,lib:i.lib,hooks:i.hooks,utils:i.utils}})}async function Za(e,t){let r=typeof t.registryBaseConfig?.style=="string"?t.registryBaseConfig.style:e.style,o=typeof t.registryBaseConfig?.tailwind?.baseColor=="string"?t.registryBaseConfig.tailwind.baseColor:"neutral",n=e.tailwind.cssVariables,i=Go;if(!t.defaults&&!t.registryBaseConfig?.style){let[s,c]=await Promise.all([Er(),ct(e)]);r=(await _e([{type:c==="v4"||r?null:"select",name:"style",message:`Which ${d.info("style")} would you like to use?`,choices:s.map(f=>({title:f.name==="new-york"?"New York (Recommended)":f.label,value:f.name})),initial:0}])).style??r??"new-york"}return n=t.cssVariables,z.parse({$schema:e?.$schema,style:r,tailwind:{...e?.tailwind,baseColor:o,cssVariables:n},rsc:e?.rsc,tsx:e?.tsx,iconLibrary:i,rtl:t.rtl??e?.rtl??!1,aliases:e?.aliases})}async function Xa(e,t){return e.startsWith("base-")?t:(l.warn(` Existing config uses ${d.info(e)}. Love UI now uses ${d.info("Base UI")} presets only.`),l.break(),"base")}import Zn from"path";import zr from"fs-extra";async function Xn(e){let t={};if(!zr.existsSync(e.cwd)||!zr.existsSync(Zn.resolve(e.cwd,"package.json")))return t["1"]=!0,{errors:t,config:null};if(!zr.existsSync(Zn.resolve(e.cwd,"components.json"))){if(await M(e.cwd)){let r=await B(e.cwd);r.length>0&&(W("add [component]",r),process.exit(1))}return t["3"]=!0,{errors:t,config:null}}try{let r=await j(e.cwd);return{errors:t,config:r}}catch{l.break(),l.error(`An invalid ${d.info("components.json")} file was found at ${d.info(e.cwd)}.
|
|
127
127
|
Before you can add components, you must create a valid ${d.info("components.json")} file by running the ${d.info("init")} command.`),l.error(`Learn more at ${d.info(`${S}/docs/components-json`)}.`),l.break(),process.exit(1)}}import{existsSync as Jr,promises as Qn}from"fs";import ir from"path";import{Project as Qa}from"ts-morph";import{loadConfig as el}from"tsconfig-paths";async function ei(e,t,r={}){let o={files:[],dependencies:[],devDependencies:[],css:null,envVars:null,fonts:[],docs:null};if(!e.length)return o;let n=await le(e,L(t));if(!n)throw new Error("Failed to fetch components from registry.");r.skipFonts||(n=await dt(n,t));let i=Ae([n]);return o.dependencies=Array.from(new Set(n.dependencies??[])),o.devDependencies=Array.from(new Set(n.devDependencies??[])),o.docs=n.docs??null,await tl(n,t,o,r,i),await rl(n,t,o,r),ol(n,t,o),r.skipFonts||nl(n,o),o}async function tl(e,t,r,o,n){let i=e.files;if(!i?.length)return;let[s,c]=await Promise.all([F(t.resolvedPaths.cwd),t.tailwind.baseColor?Jt(t.tailwind.baseColor):Promise.resolve(void 0)]),a;try{a=el(t.resolvedPaths.cwd)}catch{a={resultType:"failed"}}let f=new Qa({compilerOptions:{}}),m=Uo(i,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name});for(let p=0;p<i.length;p++){let u=i[p];if(!u.content)continue;let h=Vo(u,t,{isSrcDir:s?.isSrcDir,framework:s?.framework.name,commonRoot:Do(i.map(E=>E.path),u.path),fileIndex:p});if(!h)continue;t.tsx||(h=h.replace(/\.tsx?$/,E=>E===".tsx"?".jsx":".js"));let g=Jr(h),y=ir.relative(t.resolvedPaths.cwd,h),k=u.type==="registry:file"||u.type==="registry:item",v=xr(h)||k?u.content:await Ut({filename:u.path,raw:u.content,config:t,baseColor:c,transformJsx:!t.tsx,isRemote:!1,supportedFontMarkers:n},[Nt,Lt,Ot,Dt,At,Bt,_o,Vt,Mt,_t]),I=xr(h)||k?v:await Mo({config:t,content:v,filePaths:m,project:f,projectInfo:s,resolvedPath:h,tsConfig:a}),x="create",C;g&&(C=await Qn.readFile(h,"utf-8"),Fo(C,I)?x="skip":x="overwrite"),r.files.push({path:y,action:x,content:I,...x==="overwrite"&&{existingContent:C},type:u.type??"registry:ui"})}}async function rl(e,t,r,o){let n=e.css&&Object.keys(e.css).length>0,i=Object.keys(e.cssVars??{}).length>0;if(!t.resolvedPaths.tailwindCss||!n&&!i)return;let s=t.resolvedPaths.tailwindCss,c=Jr(s),a=ir.relative(t.resolvedPaths.cwd,s),f=c?await Qn.readFile(s,"utf8"):"",m=f;i&&(m=await mt(m,e.cssVars,t,{overwriteCssVars:o.overwriteCssVars})),n&&(m=await Ur(m,e.css));let p=0;if(e.cssVars)for(let u of Object.values(e.cssVars))u&&(p+=Object.keys(u).length);r.css={path:a,content:m,...c&&{existingContent:f},action:c?"update":"create",cssVarsCount:p}}function ol(e,t,r){if(!e.envVars||Object.keys(e.envVars).length===0)return;let o=ir.join(t.resolvedPaths.cwd,".env.local"),n=Jr(o),i=ir.relative(t.resolvedPaths.cwd,o);r.envVars={path:i,variables:e.envVars,action:n?"update":"create"}}function nl(e,t){if(e.fonts?.length)for(let r of e.fonts)t.fonts.push({name:r.font.family,provider:r.font.provider==="google"?"Google Fonts":r.font.provider})}import{diffWords as il,structuredPatch as sl}from"diff";import{bold as H,cyan as Gr,dim as w,green as K,red as Hr,yellow as nt}from"kleur/colors";var Ce=5,al=w("\u250C"+"\u2500".repeat(46)),ll=w("\u2514"+"\u2500".repeat(46)),cl={create:"+",overwrite:"~",skip:"="},fl={create:"create",overwrite:"overwrite",skip:"skip (identical)"};function wt(e){return e==="create"?K(e):e==="overwrite"||e==="update"?nt(e):w(e)}function bt(e){return`${H("\u250C")} ${H(`love-ui add ${e.join(", ")}`)} ${w("(dry run)")}`}function oi(e,t){return e===t||e.includes(t)||e.endsWith(t)}function Ve(e,t,r=o=>o){e.push(`${w("\u2502")} ${al}`);for(let o of t)e.push(`${w("\u2502")} ${w("\u2502")} ${r(o)}`);e.push(`${w("\u2502")} ${ll}`)}function ni(e,t,r={}){return r.diff?typeof r.diff=="string"?pl(e,t,r.diff):ul(e,t):r.view?typeof r.view=="string"?gl(e,t,r.view):dl(e,t):ml(e,t)}function ml(e,t){let r=[];r.push(bt(t)),r.push(w("\u2502")),hl(e,r),ti("Dependencies",e.dependencies,r),ti("Dev Dependencies",e.devDependencies,r),yl(e,r),wl(e,r),bl(e,r);let o=e.files.filter(i=>i.action==="overwrite").length;o>0&&(r.push(nt(`\u26A0 ${o} ${o===1?"file":"files"} will be overwritten.`)),r.push(w("\u2502")));let n=[];return e.files.length>0&&n.push(`${e.files.length} ${e.files.length===1?"file":"files"}`),e.dependencies.length>0&&n.push(`${e.dependencies.length} ${e.dependencies.length===1?"dep":"deps"}`),e.css?.cssVarsCount&&n.push(`${e.css.cssVarsCount} CSS vars`),n.length>0&&(r.push(`${w("\u2502")} ${w(n.join(", "))}`),r.push(w("\u2502"))),r.push(`${w("\u2502")} ${w("Run with --diff to view changes.")}`),r.push(`${w("\u2502")} ${w("Run with --view to view file contents.")}`),r.push(`${w("\u2514")} ${w("Run without --dry-run to apply.")}`),r.join(`
|
package/dist/mcp-server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Na as t,f as o,oa as n}from"./chunk-
|
|
2
|
+
import{Na as t,f as o,oa as n}from"./chunk-CH2CHRA7.js";import{StdioServerTransport as e}from"@modelcontextprotocol/sdk/server/stdio.js";async function a(){try{let r=new e;await t.connect(r)}catch(r){o.break(),n(r)}}a();
|
package/package.json
CHANGED
|
@@ -13,7 +13,7 @@ export function NotFoundPage() {
|
|
|
13
13
|
<div className="relative flex min-h-screen w-full items-center justify-center overflow-hidden">
|
|
14
14
|
<Empty>
|
|
15
15
|
<EmptyHeader>
|
|
16
|
-
<EmptyTitle className="
|
|
16
|
+
<EmptyTitle className=" font-extrabold text-9xl">
|
|
17
17
|
404
|
|
18
18
|
</EmptyTitle>
|
|
19
19
|
<EmptyDescription className="-mt-8 text-nowrap text-foreground/80">
|
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import { Github as GithubIcon, GoogleIcon } from "love-ui/logos";
|
|
2
2
|
import { Logo } from "./logo";
|
|
3
|
-
import { Particles } from "./particles";
|
|
4
3
|
import { Button } from "@/registry/default/ui/button";
|
|
5
4
|
import { ChevronLeft as ChevronLeftIcon } from "love-ui/icons";
|
|
6
5
|
|
|
7
6
|
export function AuthPage() {
|
|
8
7
|
return (
|
|
9
8
|
<div className="relative w-full md:h-screen md:overflow-hidden">
|
|
10
|
-
<Particles
|
|
11
|
-
className="absolute inset-0"
|
|
12
|
-
color="#666666"
|
|
13
|
-
ease={20}
|
|
14
|
-
quantity={120}
|
|
15
|
-
/>
|
|
16
9
|
<div className="relative mx-auto flex min-h-screen max-w-5xl flex-col justify-center px-8">
|
|
17
10
|
<Button asChild className="absolute top-4 left-4" variant="ghost">
|
|
18
11
|
<a href="#">
|
|
@@ -6,18 +6,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
|
|
|
6
6
|
fill="none"
|
|
7
7
|
xmlns="http://www.w3.org/2000/svg"
|
|
8
8
|
>
|
|
9
|
-
|
|
10
|
-
<linearGradient id="loveui-blue" x1="0" y1="0" x2="48" y2="48">
|
|
11
|
-
<stop stopColor="#38A3FF" />
|
|
12
|
-
<stop offset="0.55" stopColor="#1266F1" />
|
|
13
|
-
<stop offset="1" stopColor="#0B3FD8" />
|
|
14
|
-
</linearGradient>
|
|
15
|
-
|
|
16
|
-
<linearGradient id="loveui-shine" x1="0" y1="0" x2="1" y2="1">
|
|
17
|
-
<stop stopColor="#FFFFFF" stopOpacity="0.9" />
|
|
18
|
-
<stop offset="1" stopColor="#BBD8FF" stopOpacity="0.4" />
|
|
19
|
-
</linearGradient>
|
|
20
|
-
</defs>
|
|
9
|
+
|
|
21
10
|
|
|
22
11
|
<g transform="translate(0 0)">
|
|
23
12
|
<rect
|
|
@@ -26,7 +15,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
|
|
|
26
15
|
width="48"
|
|
27
16
|
height="48"
|
|
28
17
|
rx="12"
|
|
29
|
-
fill="
|
|
18
|
+
fill="#1266F1"
|
|
30
19
|
/>
|
|
31
20
|
|
|
32
21
|
<path
|
|
@@ -69,7 +58,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
|
|
|
69
58
|
H18
|
|
70
59
|
C19.7 29 21 27.7 21 25
|
|
71
60
|
Z"
|
|
72
|
-
fill="
|
|
61
|
+
fill="#BBD8FF"
|
|
73
62
|
opacity="0.5"
|
|
74
63
|
/>
|
|
75
64
|
</g>
|
|
@@ -16,7 +16,7 @@ export function AuthPage() {
|
|
|
16
16
|
<div
|
|
17
17
|
className={cn(
|
|
18
18
|
"relative flex w-full max-w-sm flex-col justify-between p-6 md:p-8",
|
|
19
|
-
"
|
|
19
|
+
""
|
|
20
20
|
)}
|
|
21
21
|
>
|
|
22
22
|
<div className="absolute -inset-y-6 -left-px w-px bg-border" />
|
|
@@ -2,44 +2,57 @@ import { cn } from "@/lib/utils";
|
|
|
2
2
|
import { cva, type VariantProps } from "class-variance-authority";
|
|
3
3
|
|
|
4
4
|
const DecorIconVariants = cva(
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
5
|
+
"pointer-events-none absolute z-1 size-4 shrink-0 stroke-1 stroke-muted-foreground transition-transform",
|
|
6
|
+
{
|
|
7
|
+
variants: {
|
|
8
|
+
position: {
|
|
9
|
+
// We also rotate the SVG inside the variant so the bracket always points inward
|
|
10
|
+
"top-left":
|
|
11
|
+
"top-0 left-0 -translate-x-1/2 -translate-y-1/2",
|
|
12
|
+
"top-right":
|
|
13
|
+
"top-0 right-0 translate-x-1/2 -translate-y-1/2 rotate-90",
|
|
14
|
+
"bottom-right":
|
|
15
|
+
"right-0 bottom-0 translate-x-1/2 translate-y-1/2 rotate-180",
|
|
16
|
+
"bottom-left":
|
|
17
|
+
"bottom-0 left-0 -translate-x-1/2 translate-y-1/2 -rotate-90",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: {
|
|
21
|
+
position: "top-left",
|
|
22
|
+
},
|
|
23
|
+
}
|
|
23
24
|
);
|
|
24
25
|
|
|
25
26
|
type DecorIconProps = React.ComponentProps<"svg"> &
|
|
26
|
-
|
|
27
|
+
VariantProps<typeof DecorIconVariants> & {
|
|
28
|
+
variant?: "bracket" | "dot" | "diagonal";
|
|
29
|
+
};
|
|
27
30
|
|
|
28
|
-
export function DecorIcon({ position, className, ...props }: DecorIconProps) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
31
|
+
export function DecorIcon({ position, variant = "bracket", className, ...props }: DecorIconProps) {
|
|
32
|
+
return (
|
|
33
|
+
<svg
|
|
34
|
+
aria-hidden="true"
|
|
35
|
+
className={cn(DecorIconVariants({ position, className }))}
|
|
36
|
+
fill="none"
|
|
37
|
+
stroke="currentColor"
|
|
38
|
+
viewBox="0 0 24 24"
|
|
39
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
40
|
+
{...props}
|
|
41
|
+
>
|
|
42
|
+
{/* OPTION 1: Corner Bracket (Default) */}
|
|
43
|
+
{variant === "bracket" && (
|
|
44
|
+
<path strokeLinecap="round" strokeLinejoin="round" d="M12 4H4v8" />
|
|
45
|
+
)}
|
|
46
|
+
|
|
47
|
+
{/* OPTION 2: Minimalist Dot (Change fill to currentColor in class if using this) */}
|
|
48
|
+
{variant === "dot" && (
|
|
49
|
+
<circle cx="12" cy="12" r="3" fill="currentColor" />
|
|
50
|
+
)}
|
|
51
|
+
|
|
52
|
+
{/* OPTION 3: Diagonal Accent Line */}
|
|
53
|
+
{variant === "diagonal" && (
|
|
54
|
+
<path strokeLinecap="round" d="M4 20L20 4" />
|
|
55
|
+
)}
|
|
56
|
+
</svg>
|
|
57
|
+
);
|
|
45
58
|
}
|
|
@@ -6,18 +6,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
|
|
|
6
6
|
fill="none"
|
|
7
7
|
xmlns="http://www.w3.org/2000/svg"
|
|
8
8
|
>
|
|
9
|
-
|
|
10
|
-
<linearGradient id="loveui-blue" x1="0" y1="0" x2="48" y2="48">
|
|
11
|
-
<stop stopColor="#38A3FF" />
|
|
12
|
-
<stop offset="0.55" stopColor="#1266F1" />
|
|
13
|
-
<stop offset="1" stopColor="#0B3FD8" />
|
|
14
|
-
</linearGradient>
|
|
15
|
-
|
|
16
|
-
<linearGradient id="loveui-shine" x1="0" y1="0" x2="1" y2="1">
|
|
17
|
-
<stop stopColor="#FFFFFF" stopOpacity="0.9" />
|
|
18
|
-
<stop offset="1" stopColor="#BBD8FF" stopOpacity="0.4" />
|
|
19
|
-
</linearGradient>
|
|
20
|
-
</defs>
|
|
9
|
+
|
|
21
10
|
|
|
22
11
|
<g transform="translate(0 0)">
|
|
23
12
|
<rect
|
|
@@ -26,7 +15,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
|
|
|
26
15
|
width="48"
|
|
27
16
|
height="48"
|
|
28
17
|
rx="12"
|
|
29
|
-
fill="
|
|
18
|
+
fill="#1266F1"
|
|
30
19
|
/>
|
|
31
20
|
|
|
32
21
|
<path
|
|
@@ -69,7 +58,7 @@ export const Logo = (props: React.ComponentProps<"svg">) => (
|
|
|
69
58
|
H18
|
|
70
59
|
C19.7 29 21 27.7 21 25
|
|
71
60
|
Z"
|
|
72
|
-
fill="
|
|
61
|
+
fill="#BBD8FF"
|
|
73
62
|
opacity="0.5"
|
|
74
63
|
/>
|
|
75
64
|
</g>
|
|
@@ -2,44 +2,57 @@ import { cn } from "@/lib/utils";
|
|
|
2
2
|
import { cva, type VariantProps } from "class-variance-authority";
|
|
3
3
|
|
|
4
4
|
const DecorIconVariants = cva(
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
5
|
+
"pointer-events-none absolute z-1 size-4 shrink-0 stroke-1 stroke-muted-foreground transition-transform",
|
|
6
|
+
{
|
|
7
|
+
variants: {
|
|
8
|
+
position: {
|
|
9
|
+
// We also rotate the SVG inside the variant so the bracket always points inward
|
|
10
|
+
"top-left":
|
|
11
|
+
"top-0 left-0 -translate-x-1/2 -translate-y-1/2",
|
|
12
|
+
"top-right":
|
|
13
|
+
"top-0 right-0 translate-x-1/2 -translate-y-1/2 rotate-90",
|
|
14
|
+
"bottom-right":
|
|
15
|
+
"right-0 bottom-0 translate-x-1/2 translate-y-1/2 rotate-180",
|
|
16
|
+
"bottom-left":
|
|
17
|
+
"bottom-0 left-0 -translate-x-1/2 translate-y-1/2 -rotate-90",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: {
|
|
21
|
+
position: "top-left",
|
|
22
|
+
},
|
|
23
|
+
}
|
|
23
24
|
);
|
|
24
25
|
|
|
25
26
|
type DecorIconProps = React.ComponentProps<"svg"> &
|
|
26
|
-
|
|
27
|
+
VariantProps<typeof DecorIconVariants> & {
|
|
28
|
+
variant?: "bracket" | "dot" | "diagonal";
|
|
29
|
+
};
|
|
27
30
|
|
|
28
|
-
export function DecorIcon({ position, className, ...props }: DecorIconProps) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
31
|
+
export function DecorIcon({ position, variant = "bracket", className, ...props }: DecorIconProps) {
|
|
32
|
+
return (
|
|
33
|
+
<svg
|
|
34
|
+
aria-hidden="true"
|
|
35
|
+
className={cn(DecorIconVariants({ position, className }))}
|
|
36
|
+
fill="none"
|
|
37
|
+
stroke="currentColor"
|
|
38
|
+
viewBox="0 0 24 24"
|
|
39
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
40
|
+
{...props}
|
|
41
|
+
>
|
|
42
|
+
{/* OPTION 1: Corner Bracket (Default) */}
|
|
43
|
+
{variant === "bracket" && (
|
|
44
|
+
<path strokeLinecap="round" strokeLinejoin="round" d="M12 4H4v8" />
|
|
45
|
+
)}
|
|
46
|
+
|
|
47
|
+
{/* OPTION 2: Minimalist Dot (Change fill to currentColor in class if using this) */}
|
|
48
|
+
{variant === "dot" && (
|
|
49
|
+
<circle cx="12" cy="12" r="3" fill="currentColor" />
|
|
50
|
+
)}
|
|
51
|
+
|
|
52
|
+
{/* OPTION 3: Diagonal Accent Line */}
|
|
53
|
+
{variant === "diagonal" && (
|
|
54
|
+
<path strokeLinecap="round" d="M4 20L20 4" />
|
|
55
|
+
)}
|
|
56
|
+
</svg>
|
|
57
|
+
);
|
|
45
58
|
}
|