UNPKG

arto

Version:

Arto is a flexible and type-safe class name management library for building scalable UIs with variants, states, and conditional styling.

2 lines (1 loc) 9.59 kB
var arto=function(g){"use strict";var R=Object.defineProperty;var G=(g,C,h)=>C in g?R(g,C,{enumerable:!0,configurable:!0,writable:!0,value:h}):g[C]=h;var o=(g,C,h)=>G(g,typeof C!="symbol"?C+"":C,h);class C extends Error{constructor(s){super(`[Arto Error]: ${s}`),this.name="ArtoError"}}const h=e=>{throw new C(e)},p=(e,s)=>{const t=new Set,a=[e],i=new Set;for(;a.length>0;){const n=a.pop();if(n!=null)if(typeof n=="string")n.split(/\s+/).filter(Boolean).forEach(r=>t.add(r));else if(Array.isArray(n))for(let r=n.length-1;r>=0;r--)a.push(n[r]);else if(typeof n=="function"){if(i.has(n)){console.warn("Cyclic class function detected:",n);continue}i.add(n);try{const r=n(s);r&&a.push(r)}catch(r){r instanceof Error?h(`Error resolving class function: ${r.message}`):h(`Error resolving class function: ${String(r)}`)}}else process.env.NODE_ENV!=="production"&&console.warn("Unsupported class input type:",typeof n,"Value:",n)}return Array.from(t)};function B(e){return e?new Set(Object.entries(e).filter(([,s])=>s===!0).map(([s])=>s)):new Set}const S=e=>typeof e=="string"||Array.isArray(e)||typeof e=="function",j=(e,s={})=>{const t={...e};for(const a in s)s[a]!=null&&(t[a]=s[a]);return t};class b{constructor(){o(this,"plugins",[])}register(s){!s.id&&process.env.NODE_ENV!=="production"&&h("Plugin must have a non-empty id."),this.plugins.findIndex(a=>a.id===s.id)!==-1&&(console.debug(`Plugin with id '${s.id}' is being replaced.`),this.unregister(s.id)),this.plugins.push(s)}unregister(s){const t=this.plugins.findIndex(a=>a.id===s);t!==-1&&this.plugins.splice(t,1)}registerBatch(s){for(const t of s)this.register(t)}getPlugins(){return[...this.plugins]}getByStage(s){return this.plugins.filter(t=>t.stage===s)}clear(){this.plugins=[]}}const V=new b;class O{constructor(s=0){o(this,"id","arto/Internal/AddBaseClassesPlugin");o(this,"stage","core");o(this,"order");this.order=s}apply(s){const t=s.getArtoConfig(),a=s.getContext();if(t.className){const i=p(t.className,a);s.addBaseClasses(i)}}}const N=e=>typeof e=="object"&&e!==null&&"className"in e,k=e=>N(e)?e.className:S(e)?e:h("Invalid configuration for className. Expected ClassName or StateConfig."),A=(e,s,t)=>e?typeof e=="function"?e(s,t):e.every(a=>{var i;return typeof a=="string"?s.has(a):!((i=a.not)!=null&&i.some(n=>s.has(n)))}):!0;class I{constructor(s,t=0){o(this,"id","arto/Internal/ApplyStateClassesPlugin");o(this,"stage","core");o(this,"order");o(this,"stateConfigs");this.stateConfigs=s,this.order=t}apply(s){const t=s.getActiveStates(),a=s.getContext();for(const i of t){const n=this.stateConfigs[i];if(!n||N(n)&&!A(n.dependsOn,t,a))continue;const r=p(k(n),a);s.addGlobalStateClasses(i,r)}}}function E(e){if(typeof e!="object"||e===null)return!1;const s=e;return"className"in s||"states"in s}class D{constructor(s=0){o(this,"id","arto/Internal/ApplyVariantClassesPlugin");o(this,"stage","core");o(this,"order");this.order=s}apply(s){const t=s.getArtoConfig(),a=s.getSelectedVariants(),i=s.getContext();if(!t.variants)return;const n=Object.keys(t.variants);for(const r of n){const l=a[r];if(l==null)continue;const u=t.variants[r];if(!u)continue;const c=u[l];c||h(`Invalid value '${String(l)}' for variant '${String(r)}'.`);const f=this.processVariantConfig(r,c,s,i);s.addVariantClasses(r,f)}}processVariantConfig(s,t,a,i){if(S(t))return p(t,i);if(E(t)){const n=t.className?p(t.className,i):[];return t.states&&this.mergeVariantStates(s,t.states,a,i),n}return h("Invalid variant configuration item encountered."),[]}mergeVariantStates(s,t,a,i){const n=a.getActiveStates();for(const[r,l]of Object.entries(t)){if(!l)continue;const u=r;if(S(l)){const c=p(l,i);a.addVariantStateClasses(s,u,c)}else if(N(l)){if(!A(l.dependsOn,n,i))continue;const c=p(l.className,i);a.replaceVariantStateClasses(s,u,c)}else h(`Invalid state config for state '${r}' ...`)}}}function P(e,s){switch(s??"AND"){case"AND":return e.every(Boolean);case"OR":return e.some(Boolean);case"NOT":return e.every(a=>!a);case"XOR":return e.filter(Boolean).length===1;case"IMPLIES":return e.length<2?!0:!e[0]||e[1];default:return e.every(Boolean)}}function w(e,s,t){const{variants:a="AND",states:i="AND",combine:n="AND"}=t,r=a==="AND"?e.every(Boolean):e.some(Boolean),l=i==="AND"?s.every(Boolean):s.some(Boolean);return n==="AND"?r&&l:r||l}class x{constructor(s=0){o(this,"id","arto/Internal/RulesPlugin");o(this,"stage","core");o(this,"order");this.order=s}apply(s){const t=s.getArtoConfig();if(!t.rules)return;const a=s.getActiveStates(),i=s.getSelectedVariants(),n=s.getContext();for(const r of t.rules){const{when:l,remove:u,add:c}=r;if(this.doesRuleApply(l,i,a,n)&&(u&&this.removeStuff(s,u),c)){const f=p(c,n);s.addBaseClasses(f)}}}doesRuleApply(s,t,a,i){const n={};if(s.variants){const c=Object.keys(s.variants);for(const f of c){const v=s.variants[f];if(!v)continue;const y=t[f];n[f]=y!=null&&v.includes(y)}}const r={};if(s.states)for(const c of s.states)r[c]=a.has(c);const l=[...Object.values(n),...Object.values(r)];if(!s.logic)return P(l,"AND");if(typeof s.logic=="string")return P(l,s.logic);if(typeof s.logic=="object"){const c=Object.values(n),f=Object.values(r);return w(c,f,s.logic)}const u={variantMatches:n,stateMatches:r,selectedVariants:t,activeStates:a};return s.logic(u,i)}removeStuff(s,t){if(t.variants)for(const a of t.variants)s.clearVariantClasses(a);if(t.states){const a=t.statesScope??"all";for(const i of t.states)if((a==="all"||a==="global")&&s.clearGlobalStateClasses(i),a==="all"||a==="variant")for(const[n]of Object.entries(s.getSelectedVariants()))s.clearVariantStateClasses(n,i)}t.base&&s.clearBaseClasses()}}const d=class d{constructor(s,t,a,i,n){o(this,"baseClassNames",[]);o(this,"variantClassNames",{});o(this,"variantStateClassNames",{});o(this,"globalStateClassNames",{});o(this,"postCoreCallbacks",[]);o(this,"finalBuildCallbacks",[]);o(this,"allPlugins");this.artoConfig=s,this.selectedVariants=t,this.activeStates=a,this.context=i;const r=n??[];for(const l of r)l.stage||(l.stage="core"),typeof l.order!="number"&&(l.order=0);r.sort((l,u)=>{const c=d.stagePriority[l.stage]-d.stagePriority[u.stage];return c!==0?c:(l.order??0)-(u.order??0)}),this.allPlugins=r}build(){for(const t of this.allPlugins)t.stage==="before"&&t.apply(this);for(const t of this.allPlugins)t.stage==="core"&&t.apply(this);for(const t of this.postCoreCallbacks)t();for(const t of this.allPlugins)t.stage==="after"&&t.apply(this);for(const t of this.finalBuildCallbacks)t();const s=[];s.push(...this.baseClassNames);for(const t in this.variantClassNames)s.push(...this.variantClassNames[t]);for(const t in this.variantStateClassNames){const a=this.variantStateClassNames[t];if(a)for(const i of this.activeStates){const n=a[i];n&&s.push(...n)}}for(const t in this.globalStateClassNames)s.push(...this.globalStateClassNames[t]);return s}addPostCoreCallback(s){this.postCoreCallbacks.push(s)}addFinalBuildCallback(s){this.finalBuildCallbacks.push(s)}addBaseClasses(s){this.baseClassNames.push(...s)}clearBaseClasses(){this.baseClassNames=[]}getBaseClasses(){return[...this.baseClassNames]}addVariantClasses(s,t){this.variantClassNames[s]||(this.variantClassNames[s]=[]),this.variantClassNames[s].push(...t)}replaceVariantClasses(s,t){this.variantClassNames[s]=[...t]}clearVariantClasses(s){this.variantClassNames[s]=[]}getVariantClassMap(){const s={};for(const t in this.variantClassNames)s[t]=[...this.variantClassNames[t]??[]];return s}addGlobalStateClasses(s,t){this.globalStateClassNames[s]||(this.globalStateClassNames[s]=[]),this.globalStateClassNames[s].push(...t)}replaceGlobalStateClasses(s,t){this.globalStateClassNames[s]=[...t]}clearGlobalStateClasses(s){this.globalStateClassNames[s]=[]}getGlobalStateClassesFor(s){return[...this.globalStateClassNames[s]??[]]}addVariantStateClasses(s,t,a){this.variantStateClassNames[s]||(this.variantStateClassNames[s]={}),this.variantStateClassNames[s][t]||(this.variantStateClassNames[s][t]=[]),this.variantStateClassNames[s][t].push(...a)}replaceVariantStateClasses(s,t,a){this.variantStateClassNames[s]||(this.variantStateClassNames[s]={}),this.variantStateClassNames[s][t]=[...a]}clearVariantStateClasses(s,t){this.variantStateClassNames[s]&&(this.variantStateClassNames[s][t]=[])}getVariantStateClasses(s,t){var a;return(a=this.variantStateClassNames[s])!=null&&a[t]?[...this.variantStateClassNames[s][t]]:[]}getArtoConfig(){return this.artoConfig}getSelectedVariants(){return this.selectedVariants}setSelectedVariants(s){this.selectedVariants=s}getActiveStates(){return this.activeStates}setActiveStates(s){this.activeStates=s}getContext(){return this.context}getAllClasses(){const s=[];s.push(...this.baseClassNames);for(const t in this.variantClassNames)s.push(...this.variantClassNames[t]);for(const t of this.activeStates)s.push(...this.getGlobalStateClassesFor(t));for(const t of Object.keys(this.selectedVariants))for(const a of this.activeStates){const i=this.getVariantStateClasses(t,a);s.push(...i)}return s}};o(d,"stagePriority",{before:0,core:1,after:2});let m=d;const L=(e,s)=>((!e||typeof e!="object")&&h("Invalid config provided to arto."),t=>{const a=(t==null?void 0:t.variants)??{},i=e.defaultVariants??{},n=(t==null?void 0:t.states)??{},r=t==null?void 0:t.context,l=j(i,a),u=B(n),c=[...s||[],...V.getPlugins()],f=[];e.className&&f.push(new O),e.variants&&f.push(new D),e.states&&f.push(new I(e.states)),e.rules&&e.rules.length>0&&f.push(new x(3));const v=[...c,...f];return new m(e,l,u,r,v).build().join(" ")});return g.ClassNameBuilder=m,g.PluginRegistry=b,g.arto=L,g.normalizeClassName=p,g.pluginHub=V,Object.defineProperty(g,Symbol.toStringTag,{value:"Module"}),g}({});