function parse(content,novasheets=new novasheets_1.default){const r=String.raw,strim=str=>str.replace(/^\s*(.+?)\s*$/,"$1").replace(/\s+/g," "),escapeRegex=str=>str.replace(/[.*+?^/${}()|[\]\\]/g,"\\$&"),number=r`(?:\d*\.?\d+|\d+\.)`,basedNumber=r`(?:-?(?:0x[0-9a-f]*\.?[0-9a-f]+|0b[01]*\.?[01]+|0o[0-7]*\.?[0-7]+|${number}))`,numberUnit=r`\s*(?:em|rem|en|ex|px|pt|pc|ft|in|s|ms|cm|mm|m)\b`,mathChecker=(()=>{const o=r`\(\s*`,c=r`\s*\)`,numberValue=r`(?:-?${basedNumber}(?:${numberUnit})?)`,operators=r`(?:[-^*/+]+\s*(?=\d|\.))`,unbracketed=r`(?:(?:${`(?:${o}${numberValue}${c}|${numberValue})`}\s*${operators}\s*)+${numberValue})`;return r`\(\s*${unbracketed}\s*\)|${unbracketed}`})(),toNumber=val=>constants.KEEP_NAN?+val:isNaN(+val)?0:+val,parseFunction=(name,func,opts={})=>{if(RegExp(mathChecker).test(cssOutput))return;const match=Array.from(cssOutput.match(RegExp(r`\$\(\s*(?:${name})\b`))||[]);if(0===match.length)return;const searchString=cssOutput.substr(cssOutput.indexOf(match[0]));let segment="",brackets=0,hasBrackets=!1;for(let i=0;i0&&(hasBrackets=!0),"("===searchString[i]&&brackets++,")"===searchString[i]&&brackets--,!hasBrackets||0!==brackets);i++)if(i===searchString.length-1&&brackets>0)return;if(!segment.trim())return;const replacer=!1===opts.trim?/^\$\(|\)$/:/^\$\(\s*|\s*\)$/g,splitter=!1===opts.trim?"|":/\s*\|\s*/;let parts=segment.replace(replacer,"").split(splitter);for(let i=0;i0;i--)if(parts[+i]){parts=parts.slice(0,i+1);break}parts[0]=segment,cssOutput=cssOutput.replace(segment,func(...parts))};let styleContents=content.replace(/&/g,"&").replace(/>/g,">").replace(/</g,"<").replace(/(?_.startsWith("/*[")&&_.endsWith("]*/")?_.replace(/^\/\*\[(.+)\]\*\/$/,"/*$1*/"):_.startsWith("/*/")||_.endsWith("/*/")?_:(commentedContent.indexOf(a)<0&&commentedContent.push(a),"/*COMMENT#"+commentedContent.indexOf(a)+"*/"))).replace(/\/\*\/(.+?)\/\*\//gs,((_,a)=>(staticContent.indexOf(a)<0&&staticContent.push(a),"/*STATIC#"+staticContent.indexOf(a)+"*/")));let customVars={},cssBlocks={},constants={BUILTIN_FUNCTIONS:!0,DECIMAL_PLACES:!1,KEEP_NAN:!1,KEEP_UNPARSED:!1,MAX_ARGUMENTS:10,MAX_MATH_RECURSION:5,MAX_RECURSION:50};for(let i in lines){let matcher;if(lines[i].match(/^\s*@var\s/)){let varDeclParts=lines[i].replace(/^\s*@var\s/,"").split("="),linesAfter=lines.slice(+i),varEnding;for(let j in linesAfter)if(linesAfter[j].match(/^\s*@endvar\s*$|^\s*@var\s/)&&0!=+j){varEnding=+j;break}let varName=varDeclParts[0].trim().split("|")[0].trim();const inlineContent=varDeclParts.slice(1).join("=")||"",blockContent=linesAfter.slice(1,varEnding).join("\n"),variables=new RegExp(r`\$\(\s*${varName}\s*\)`,"g");let varContent=(inlineContent+blockContent).trim().replace(variables,customVars[varName]||"");customVars[varName]=varContent}else if(lines[i].match(matcher=/^\s*@option\s+/)){let[name,val]=lines[i].replace(matcher,"").split(/\s+/);const isNotFalse=val=>"0"!==val&&"false"!==val;switch(name.toUpperCase()){case"BUILTIN_FUNCTIONS":constants.BUILTIN_FUNCTIONS=isNotFalse(val);break;case"DECIMAL_PLACES":constants.DECIMAL_PLACES="false"!==val&&+val;break;case"KEEP_NAN":constants.KEEP_NAN=isNotFalse(val);break;case"KEEP_UNPARSED":constants.KEEP_UNPARSED=isNotFalse(val);break;case"MAX_ARGUMENTS":constants.MAX_ARGUMENTS=parseInt(val);break;case"MAX_MATH_RECURSION":constants.MAX_MATH_RECURSION=parseInt(val);break;case"MAX_RECURSION":constants.MAX_RECURSION=parseInt(val)}}}cssOutput.replace(/([^{}]+)({.+?})/gms,((_,selector,css)=>(selector.includes("$(")||selector.startsWith("@")||(cssBlocks[escapeRegex(selector.trim().replace(/>/g,":GT:"))]=css),"")));const hasNovaSheetsStyles=()=>cssOutput.includes("$(")||RegExp(mathChecker).test(cssOutput);for(let loop=0,lastCssOutput;(loop<1||loop")}\s*>`),cssBlocks[name]||"{}");cssOutput=cssOutput.replace(/\$<.+?>/g,"{}"),cssOutput=cssOutput.replace(RegExp(r`(?String(+a*10**+b)));for(let i=0;i{let matchesOnlyBrackets=!/[-+^*/]/.test(mathMatch),containsUnitList=mathMatch.match(RegExp(r`${numberUnit}\s-?${basedNumber}`));if(matchesOnlyBrackets||containsUnitList)return mathMatch;let numMatch=mathMatch.match(RegExp(numberUnit,"g"))||[],unit=numMatch.pop()||"",content=mathMatch.replace(RegExp(r`(${number})\s*(${numberUnit})`,"g"),((_,num,u)=>{switch(u){case"mm":case"ms":return unit=u[1],String((toNumber(num)||0)/1e3);case"cm":return unit="m",String((toNumber(num)||0)/100);case"in":return unit="m",String(.0254*(toNumber(num)||0));case"ft":return unit="m",String(.3048*(toNumber(num)||0));default:return _}})).replace(RegExp(numberUnit,"g"),"").replace(/--|\+\+/g,"+").replace(/\^/g,"**");try{return eval(content)+unit}catch(_a){return content+unit}}));for(let name in customVars)parseFunction(name,((_,...paramArgs)=>{let content=customVars[name];for(const i in paramArgs){if(!paramArgs[i])continue;const parts=paramArgs[i].split("="),param=parts[1]?strim(parts[0]):(+i+1).toString(),arg=parts[1]?strim(parts[1]):strim(parts[0]);content=content.replace(RegExp(r`\$\[${param}[^\]]*\]`,"g"),arg)}return content=content.replace(/\$\[.*?(?:\|([^\]]*))?\]/g,"$1"),content}));cssOutput=cssOutput.replace(/{([^{}]*?)}\s*<([^[\]]*?)>/gm,((_,css,item)=>{const statements=css.split(/\s*;\s*/);for(const statement of statements){const[attr,val]=statement.split(/\s*:\s*/);if(attr.trim()===item.trim())return val||""}return""})),cssOutput=cssOutput.replace(/{([^{}]*?)}\s*!/gm,((_,css)=>css));let allFunctions=[];constants.BUILTIN_FUNCTIONS&&allFunctions.push(...functions_1.default({constants:constants})),allFunctions.push(...(null==novasheets?void 0:novasheets.getFunctions())||[]);for(const obj of allFunctions)parseFunction(obj.name,obj.body);const tokenized=[{name:"Root",content:"",body:[]}];let content="",tokenTree=[tokenized[0]],selectorTree=[""];for(let i=0;istr.replace(stylesMatch,"")));let currentToken=tokenTree[tokenTree.length-1];if("{"===char){if(!content)continue;let selector=content.replace(stylesMatch,"").trim(),styles=content.replace(trailingSelectorMatch,"").trim();styles.trim()&¤tToken.body.push({name:"Style",content:styles,body:[]});const parentSelector=selectorTree[selectorTree.length-2]||"",explicitParent=selector.includes("&");selector=explicitParent?selector.replace(/&/g,parentSelector.trim()):parentSelector+" "+selector,selectorTree.push(selector);let newToken={name:"Block",content:selector,body:[]};currentToken.body.push(newToken),currentToken=newToken,tokenTree.push(currentToken),content=""}else if("}"===char){if(tokenTree.length<1||!content)continue;selectorTree.pop(),currentToken=tokenTree.pop(),content.trim()&¤tToken.body.push({name:"Style",content:content.trim(),body:[]}),content=""}else content+=char,selectorTree[selectorTree.length-1]=content}for(let regex=/[^{}]+{[^{}]*}/gs;regex.test(cssOutput);)cssOutput=cssOutput.replace(regex,"");let blocks=[];const flatten=obj=>{for(let o of null==obj?void 0:obj.body)"Style"===o.name?blocks.push({name:obj.name,content:obj.content,body:[o]}):flatten(o)};flatten(tokenTree[0]);let flattenedCssOutput=cssOutput;for(let block of blocks)flattenedCssOutput+=block.content+" {"+block.body[0].content+"}";const mediaRegex=r`@media[^{}]+(?:\([^()]+?\))+`;cssOutput=flattenedCssOutput.replace(RegExp(r`(${mediaRegex})\s*(?:{})?(?=\s*@media)`,"g"),"").replace(RegExp(r`(${mediaRegex})\s*([^{}]+){([^{}]+)}`,"g"),"$1 { $2 {$3} }"),cssOutput=cssOutput.replace(/([^{}]*?)\s*@\s*(?:(\d+px)(?:\s*\.{2,})?(\s*\d+px)?|(\d+px)?(?:\s*\.{2,})?(\s*\d+px))([^{}]*?){(.*?)}/gm,((_,sel,min1,max1,min2,max2,selAfter,block)=>{let[min,max]=[min1||min2,max1||max2],simpleBreakpoint=r`@\s*(\d+px)?\s*(?:\.{2,})?\s*(\d+px)?`,selMatch=selAfter.match(RegExp(simpleBreakpoint,"g"));selMatch&&([,min,max]=selMatch[selMatch.length-1].match(RegExp(simpleBreakpoint)));let query="only screen";return min&&(query+=` and (min-width: ${min})`),max&&(query+=` and (max-width: ${max}-1px)`),`@media ${query} { ${(sel+selAfter).replace(RegExp(simpleBreakpoint,"g"),"")} { ${block} } }`}))}if(!constants.KEEP_UNPARSED){cssOutput=cssOutput.replace(/@endvar/g,"");let unparsedContent=cssOutput.match(/\$[[(](.+?)[\])]/g);if(unparsedContent)for(let val of unparsedContent){let nssVarName=strim(val.replace(/\$[[(](.*?)(\|.*)?[\])]/,"$1"));cssOutput=cssOutput.replace(val,"");let type=val.includes("$(")?"variable":"argument";console.log(` Instances of unparsed ${type} '${nssVarName}' have been removed from the output.`)}}cssOutput=cssOutput.replace(/(\s*;)+/g,";").replace(/(?1e3*+n+"m"+u)).replace(/(?<=\d)0\s*mm/g,"cm").replace(/(?<=\d)(000\s*mm|00\s*cm)/g,"m").replace(/\.?0{10,}\d/g,"").replace(/((\d)\2{9,})\d/g,"$1").replace(/(\d+)([5-9])\2{10,}\d?(?=\D)/g,((_,a)=>String(+a+1))).replace(/\d*\.?\d+e-(?:7|8|9|\d{2,})/,"0").replace(RegExp(r`((\d)\.\d{0,${constants.DECIMAL_PLACES}})(\d?)\d*`),((_,val,pre,after)=>{const roundsUp=/[5-9]$/.test(after);return 0===constants.DECIMAL_PLACES?roundsUp?parseInt(pre)+1:pre:roundsUp?val.replace(/.$/,"")+(parseInt(val.substr(-1))+1):val}));for(let i in staticContent)cssOutput=cssOutput.replace(RegExp(r`\/\*STATIC#${i}\*\/`,"g"),strim(staticContent[i]));for(let i in commentedContent)cssOutput=cssOutput.replace(RegExp(r`\/\*COMMENT#${i}\*\/`,"g"),"/*"+commentedContent[i]+"*/");return cssOutput.trim()}function addBuiltInFunctions({constants:constants}){const novasheets=new("undefined"!=typeof require?require("./novasheets"):novasheets_1.default),escapeRegex=str=>str.replace(/[.*+?^/${}()|[\]\\]/g,"\\$&"),strim=str=>str.toString().replace(/^\s*(.+?)\s*$/,"$1").replace(/\s+/g," "),r=String.raw;novasheets.addFunction("@each",((_,a="",b="",c="",...rest)=>{let d=rest.join("|"),[items,splitter,joiner,content]=d?[a,b,c,d]:c?[a,b,b,c]:[a,",",",",b],arr=strim(items).split(strim(splitter)),output=[];for(let i in arr){let parsed=strim(content).replace(/\$i/gi,String(+i+1)).replace(/\$v\[([0-9]+)([-+*/][0-9]+)?\]/g,((_,a,b)=>arr[+a-1+(b||0)])).replace(/.?\s*undefined/g,"").replace(/\$v/gi,arr[i]);output.push(parsed)}return output.join(joiner)}),{trim:!1,allArgs:!0}),novasheets.addFunction("@repeat",((_,a,...b)=>{let[delim,content]=b[1]?[b[0],b.slice(1).join("|")]:["",b.join("|")],output="";for(let i=0;i<+a;i++)output+=(i>0?delim:"")+content.replace(/\$i/gi,(+i+1).toString());return output}),{trim:!1,allArgs:!0});const number=r`(?:[0-9]*\.?[0-9]+)`,basedNumber=r`(?:0x[0-9a-f]*\.?[0-9a-f]+|0b[01]*\.?[01]+|0o[0-7]*\.?[0-7]+|${number})`,toNum=val=>constants.KEEP_NAN?+val:Number.isNaN(val)?0:parseFloat(val+""),testNaN=(arg,def)=>{let test=!arg||arg===1/0||Number.isNaN(arg);return test&&constants.KEEP_NAN?"NaN":test&&!constants.KEEP_NAN?def||0:Math.abs(+arg)<=1e-7?0:+arg};novasheets.addFunction("@e",(()=>Math.E)),novasheets.addFunction("@pi",(()=>Math.PI)),novasheets.addFunction("@mod",((_,a,b)=>testNaN(toNum(a)%toNum(b),a))),novasheets.addFunction("@sin",((_,a)=>testNaN(Math.sin(toNum(a)),a))),novasheets.addFunction("@asin",((_,a)=>testNaN(Math.asin(toNum(a)),a))),novasheets.addFunction("@cos",((_,a)=>testNaN(Math.cos(toNum(a)),a))),novasheets.addFunction("@acos",((_,a)=>testNaN(Math.acos(toNum(a)),a))),novasheets.addFunction("@tan",((_,a)=>testNaN(Math.tan(toNum(a)),a))),novasheets.addFunction("@atan",((_,a)=>testNaN(Math.atan(toNum(a)),a))),novasheets.addFunction("@abs",((_,a)=>testNaN(Math.abs(toNum(a)),a))),novasheets.addFunction("@floor",((_,a)=>testNaN(Math.floor(toNum(a)),a))),novasheets.addFunction("@ceil",((_,a)=>testNaN(Math.ceil(toNum(a)),a))),novasheets.addFunction("@percent",((_,a)=>testNaN(100*toNum(a),a)+"%")),novasheets.addFunction("@log",((_,base,num)=>testNaN(Math.log(+num)/(base?Math.log(+base):1),num))),novasheets.addFunction("@root",((_,a,b)=>testNaN(Math.pow(toNum(b)?toNum(b):toNum(a),1/(toNum(b)?toNum(a):2)),b))),novasheets.addFunction("@round",((_,a,b)=>{let num=toNum(a)+Number.EPSILON,dp=Math.pow(10,toNum(b)||0);return testNaN(Math.round(num*dp)/dp,a)})),novasheets.addFunction("@min|@max",((_,...a)=>{let nums=[];for(let item of a)item&&nums.push(+item);let output=Math[_.includes("@min")?"min":"max"](...nums);return testNaN(output,"0")})),novasheets.addFunction("@clamp",((_,a,b,c)=>{let[val,min,max]=[toNum(a),toNum(b),toNum(c)];return max=max?max:val,a)})),novasheets.addFunction("@degrees|@radians|@gradians",((_,a)=>{let num=+a.replace(/[a-z]+/,""),type=a.replace(RegExp(number),""),output=toNum(a);return _.includes("@degrees")?output="grad"===type?.9*num:num/Math.PI*180:_.includes("@radians")?output="grad"===type?num*Math.PI/200:+num*Math.PI/180:_.includes("@gradians")&&(output="rad"===type?num/Math.PI*200:num/.9),testNaN(output,a)})),novasheets.addFunction("@lowercase",((_,a)=>a.toLowerCase())),novasheets.addFunction("@uppercase",((_,a)=>a.toUpperCase())),novasheets.addFunction("@titlecase",((_,a)=>a.replace(/\b\w/g,(a=>a.toUpperCase())))),novasheets.addFunction("@capitali[sz]e",((_,a)=>a[0].toUpperCase()+a.substr(1))),novasheets.addFunction("@uncapitali[sz]e",((_,a)=>a[0].toLowerCase()+a.substr(1))),novasheets.addFunction("@extract",((_,a,b,c)=>a.split(c?b:",")[Number(c||b)-1]||"")),novasheets.addFunction("@encode",((_,a)=>encodeURIComponent(a))),novasheets.addFunction("@length",((_,a)=>strim(a).length)),novasheets.addFunction("@replace",((_,...args)=>{var _a;args.length<3&&(args=[args[0],args[1]||"",args[2]||""]),args=args.slice(0,args.indexOf("")<=3?3:args.indexOf(""));let text=strim(args[0]),finder=strim(args.slice(1,-1).join("|")),replacer=strim(args.slice(-1)[0]),isRegex=finder.startsWith("/"),regexFinder=RegExp("");if(isRegex){let parts=(null===(_a=strim(finder).match(/\/(.+?)\/([gimusy]*)/))||void 0===_a?void 0:_a.slice(1))||[];regexFinder=RegExp(parts[0],parts[1]||"s")}return text.replace(isRegex?regexFinder:RegExp(escapeRegex(finder),"g"),replacer)}),{trim:!1,allArgs:!0});const toPercent=val=>Math.floor(+val/255*100),fromPercent=val=>Math.ceil(255*Number(val.replace("%",""))/100),toHex=val=>Number(val).toString(16).padStart(2,"0"),rgbFromHex=(hex,alpha)=>{let num=parseInt(hex.replace(/#?(.{0,8})$/,"$1"),16),r=num>>16&255,g=num>>8&255,b=255&num,a=alpha?toPercent(parseInt(alpha,16)):null;return null===a?`rgb(${r}, ${g}, ${b})`:`rgba(${r}, ${g}, ${b}, ${a})`},parseHex=val=>{let a=val.replace("#","");switch(a.length){case 0:return rgbFromHex("000000","00");case 1:return rgbFromHex(a.repeat(6));case 2:return rgbFromHex(a[0].repeat(6),a[1].repeat(2));case 3:return rgbFromHex(a[0]+a[0]+a[1]+a[1]+a[2]+a[2]);case 4:return rgbFromHex(a[0]+a[0]+a[1]+a[1]+a[2]+a[2],a[3]+a[3]);default:return rgbFromHex(a.substr(0,6).padEnd(6,"0"),a.substr(6,2)||void 0)}},getRawColorParts=col=>col.replace(/^\s*\w{3}a?\s*\(\s*|\s*\)$/g,"").split(/,\s*/),getColorParts=color=>{let parts=getRawColorParts(color.startsWith("#")?parseHex(color):color);for(let i in parts){let num=parts[i];parts[i]?parts[i].includes("%")?(num=num.replace("%",""),color.includes("hsl")?parts[i]=Math.round(+num/100*(0==+i?360:100)).toString():parts[i]=fromPercent(num).toString()):3==+i&&(parts[i]=Math.round(color.includes("rgb")?+num/255:+num/100).toString()):parts[i]="0"}return parts},hexFromRgb=rgb=>{let[r,g,b,a]=Array.isArray(rgb)?rgb:getColorParts(rgb);return"#"+toHex(r)+toHex(g)+toHex(b)+(toNum(a)>0?toHex(a):"")},blendColors=(color1,color2,amt)=>{var _a;if(!color2)return color1||"";let type=(null===(_a=color1.match(/^[a-z]{3}a?|^#/))||void 0===_a?void 0:_a.toString())||"",amount=amt.includes("%")?+amt.replace("%","")/100:+amt;amount=Math.min(Math.abs(amount),1);const blendVal=(a,b)=>Math.floor(toNum(a)*(1-amount)+toNum(b)*amount);let[[r1,g1,b1,a1],[r2,g2,b2,a2]]=[getColorParts(color1),getColorParts(color2)],[r,g,b,a]=[blendVal(r1,r2),blendVal(g1,g2),blendVal(b1,b2),blendVal(a1,a2)];switch(type){case"rgba":return`rgba(${r}, ${g}, ${b}, ${a})`;case"rgb":return`rgb(${r}, ${g}, ${b})`;case"hsla":return`hsla(${r%360}, ${g/100}%, ${b/100}%, ${a})`;case"hsl":return`hsla(${r%360}, ${g/100}%, ${b/100}%)`;case"#":return hexFromRgb([r,g,b,a]);default:return`${type}(${r}, ${g}, ${b})`}},blendGrayscaleHsl=(type,color1,color2,amt)=>{var _a;if(!color1.includes("hsl"))return blendColors(color1,color2,amt||"50%");let[h,s,l,a]=getColorParts(color1),amount=+amt.replace("%",""),lNew=+l+amount*("darken"===type?-1:1),sl="desat"===type?`${+s-amount}%, ${l}%`:`${s}%, ${lNew<0?0:lNew}%`;return`${(null===(_a=color1.match(/^hsla?/))||void 0===_a?void 0:_a.toString())||"hsl"}(${+h%360}, ${sl}${a?`, ${a}`:""})`};novasheets.addFunction("@colou?r",((_,type,a="0",b="0",c="0",d="")=>{switch(/#|rgba?|hsla?/i.test(a)?(a.includes("#")&&(a=parseHex(a)),/rgba?|hsla?/.test(a)&&([a,b,c,d]=getColorParts(a))):[a,b,c,d]=getColorParts(`${type}(${a}, ${b}, ${c}, ${d})`),type=type.toLowerCase()){case"#":case"hash":case"hex":case"hexadecimal":return"#"+toHex(a)+toHex(b)+toHex(c)+(d?toHex(fromPercent(d)):"");case"rgb":return`rgb(${a}, ${b}, ${c})`;case"rgba":return`rgba(${a}, ${b}, ${c}, ${d||0==+d?100:""}%)`;case"hsl":return`hsl(${toNum(a)%360}, ${b}%, ${c}%)`;case"hsla":return`hsla(${toNum(a)%360}, ${b}%, ${c}%, ${d||0==+d?100:""}%)`;default:return`${type}(${a} ${b} ${c}${d?` / ${d}`:""})`}})),novasheets.addFunction("@colou?rpart",((_,a="",b="")=>{let[part,color]=[a.toLowerCase(),b.toLowerCase()],parts=getColorParts(color);return{r:parts[0],h:parts[0],g:parts[1],s:parts[1],b:parts[2],l:parts[2],a:parts[3]}[part[0]]||color})),novasheets.addFunction("@spin",((_,color,amount)=>{let oldHue=color.replace(/^hsla?\s*\((\d+),\s*.+\s*\)\s*$/g,"$1"),newHue=((+oldHue+ +amount)%360).toString();return color.replace(oldHue,newHue)})),novasheets.addFunction("@blend",((_,color1,color2,amount)=>blendColors(color1,color2,amount||"50%"))),novasheets.addFunction("@tint|@lighten",((_,color,amount)=>blendGrayscaleHsl("lighten",color,"#fff",amount||"50%"))),novasheets.addFunction("@shade|@darken",((_,color,amount)=>blendGrayscaleHsl("darken",color,"#000",amount||"50%"))),novasheets.addFunction("@tone|@desaturate",((_,color,amount)=>blendGrayscaleHsl("desat",color,"#808080",amount||"50%")));const parseLuma=(arg,rgb)=>{if(!arg.startsWith("rgb")&&!arg.startsWith("#"))return+arg;let[r,g,b]=rgb?[...rgb]:getColorParts(arg);const getLuma=a=>a<=.03928?a/12.92:(a=>((a+.055)/1.055)**2.4)(a);return.2126*getLuma(+r/255)+.7152*getLuma(+g/255)+.0722*getLuma(toNum(b)/255)};novasheets.addFunction("@luma",((_,color)=>parseLuma(color))),novasheets.addFunction("@contrast",((_,color,light="",dark="")=>parseLuma(color)<.5?light:dark)),novasheets.addFunction("@gr[ae]yscale",((_,color)=>{if(color.startsWith("hsl"))return color.replace(/^(hsla?)\s*\(\s*(\d+),\s*(\d+)/,"$1($2, 0");let gray=Math.round(255*parseLuma(color)),newColor=`rgb(${Array(3).fill(gray).join(", ")})`;return color.startsWith("#")?hexFromRgb(newColor):newColor}));const bracketedNumber=r`(?:\(\s*${basedNumber}\s*\)|${basedNumber})`,logicRegex=arg=>RegExp(r`([+-]?${bracketedNumber})\s*(?:${arg})\s*([+-]?${bracketedNumber})`),parseLogic=arg=>{if(!/^([<>=!&|()-\d\s]|true|false|undefined|null|NaN|x?n?or|n?and)+$/.test(arg))return arg;for(let i=0;i|>=|==|!=|&|!|\|)/.test(arg)&&(arg=eval(arg)),["false","undefined","null","NaN",""].includes(arg)&&(arg="false"),arg};return novasheets.addFunction("@bitwise",((_,a)=>{let arg=a;for(let i=0;ieval("~"+toNum(a)))).replace(logicRegex("or|\\|"),((_,a,b)=>eval(`(${toNum(a)}) | (${toNum(b)})`))).replace(logicRegex("nor"),((_,a,b)=>eval(`~ (${toNum(a)}) | (${toNum(b)})`))).replace(logicRegex("and|&"),((_,a,b)=>eval(`(${toNum(a)}) & (${toNum(b)})`))).replace(logicRegex("nand"),((_,a,b)=>eval(`~ (${toNum(a)}) & (${toNum(b)})`))).replace(logicRegex("xor"),((_,a,b)=>eval(`(${toNum(a)}) ^ (${toNum(b)})`))).replace(logicRegex("xnor"),((_,a,b)=>eval(`~ (${toNum(a)}) ^ (${toNum(b)})`)));return arg})),novasheets.addFunction("@boolean",((_,...a)=>parseLogic(a.join("|")))),novasheets.addFunction("@if",((_,a,b="",c="")=>parseLogic(a)?b:c)),novasheets.addFunction("@breakpoint",((_,a="0",b="",c="",d="")=>{if(!a)return _;const makeQuery=(type,width,content)=>`@media (${type}-width: ${width.trim()}${"max"===type?"-1px":""}) { ${content}}`;let isBlock=(b+c).includes("{"),content=isBlock?[b,c]:[`${b} {${c}} `,`${b} {${d}} `],ltContent=(isBlock?b:c).trim()?makeQuery("max",a,content[0]):"",gtContent=(isBlock?c:d).trim()?makeQuery("min",a,content[1]):"";return ltContent+(ltContent&>Content?"\n":"")+gtContent}),{trim:!1}),novasheets.addFunction("@prefix",((_,a,b)=>`-webkit-${a}: ${b}; -moz-${a}: ${b}; -ms-${a}: ${b}; -o-${a}: ${b}; ${a}: ${b};`)),novasheets.getFunctions()}class NovaSheets{constructor(){this.functions=[]}static parse(rawInput="",novasheets=new NovaSheets){return parse_1.default(rawInput,novasheets)}static compile(input,output="",novasheets=new NovaSheets){return compile_1.default(input,output,novasheets)}addFunction(name,body,options={}){return this.functions.push({name:name,body:body,options:options}),this}getFunctions(){return this.functions}}function parseNovaSheets(rawInput="",novasheets){if(rawInput)return parse_1.default(rawInput,novasheets);const hashCode=(str,length=8)=>{let hash=0;for(let i=0;iparseNovaSheets()));