@loke/design-system
Version:
A design system with individually importable components
2 lines (1 loc) • 2.25 kB
JavaScript
import{cn}from"@loke/design-system/cn";var breakpoints=["","sm:","md:","lg:"];function createResponsiveVariants(variants,props){let responsiveClasses=[],defaultClasses=variants({}).split(" "),variantParams=[],breakpointIndices=new Set;for(let[_,value]of Object.entries(props))if(Array.isArray(value))for(let i=0;i<breakpoints.length;i++)value[i]!==void 0&&breakpointIndices.add(i);else breakpointIndices.add(0);for(let index of breakpointIndices){let breakpointParams={};for(let[key,value]of Object.entries(props))if(Array.isArray(value)&&index<value.length&&value[index]!==void 0)breakpointParams[key]=value[index];else if(!Array.isArray(value)&&value!==void 0)breakpointParams[key]=value;if(Object.keys(breakpointParams).length>0)variantParams.push(breakpointParams)}for(let[index,params]of variantParams.entries()){if(index===0){responsiveClasses.push(...variants(params).split(" "));continue}let variantClasses=variants(params).split(" ");responsiveClasses.push(...variantClasses.map((cls)=>breakpoints[index]+cls))}let uniqueClasses=Array.from(new Set([...defaultClasses,...responsiveClasses]));return cleanClasses(uniqueClasses.join(" ").trim())}function cleanClasses(rawClassName){let classes=cn(rawClassName).split(" "),cleanedClasses=[];for(let cls of classes){let[prefix,className]=cls.split(":");if(!["sm","md","lg"].includes(prefix)){cleanedClasses.push(cls);continue}let hasSameBaseClass=(variant)=>{let base=`${variant??""}:${className.split("-").slice(0,-1).join("-")}`;return classes.some((c)=>c.startsWith(base))};switch(prefix){case"sm":if(classes.includes(className))continue;cleanedClasses.push(cls);break;case"md":if(classes.includes(`sm:${className}`))continue;if(classes.includes(className)&&!hasSameBaseClass("sm"))continue;cleanedClasses.push(cls);break;case"lg":if(classes.includes(`md:${className}`))continue;if(classes.includes(`sm:${className}`)&&!hasSameBaseClass("sm"))continue;if(classes.includes(className)&&!hasSameBaseClass("sm")&&!hasSameBaseClass("md"))continue;cleanedClasses.push(cls);break}}return cleanedClasses.join(" ").trim()}function createResponsiveComponent(variants){return{createResponsive:(props)=>createResponsiveVariants(variants,props)}}export{createResponsiveVariants,createResponsiveComponent};