UNPKG

@meonode/ui

Version:

A structured approach to component composition, direct CSS-first prop styling, built-in theming, smart prop handling (including raw property pass-through), and dynamic children.

2 lines (1 loc) 3.41 kB
"use strict";var e=require("../helper/common.helper.cjs");const t=Symbol.for("@meonode/ui/serverActiveTheme"),r=Symbol.for("@meonode/ui/serverThemeVariables");function o(e){return`--meonode-theme-${e.replace(/[^\w.-]/g,"-").replace(/\./g,"-")}`}function s(){return e.getGlobalState(r,()=>({byName:new Map}))}const n=new WeakMap;exports.buildThemeVariablesCss=function(e){if(!e?.system||"object"!=typeof e.system)return"";const t=[],r=[{path:"",value:e.system}];for(;r.length>0;){const e=r.pop();if(!e||!e.value||"object"!=typeof e.value)continue;const s=e.value;for(const[n,l]of Object.entries(s)){const s=e.path?`${e.path}.${n}`:n;if(null!=l)if("string"!=typeof l&&"number"!=typeof l&&"boolean"!=typeof l){if("object"==typeof l){const e=l.default;"string"!=typeof e&&"number"!=typeof e&&"boolean"!=typeof e||t.push([o(s),String(e)]),r.push({path:s,value:l})}}else t.push([o(s),String(l)])}}return 0===t.length?"":`:root{${t.sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}:${t};`).join("")}}`},exports.consumeServerThemeVariablesCss=function(){const e=s();if(0===e.byName.size)return;const t=Array.from(e.byName.entries()).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}:${t};`).join("");return e.byName.clear(),t?{id:"theme-vars",cssText:`:root{${t}}`}:void 0},exports.getActiveServerTheme=function(){return e.getGlobalState(t,()=>({})).activeTheme},exports.registerServerThemeVariables=function(e){if(!e?.system||"object"!=typeof e.system)return;const t=s(),r=[{path:"",value:e.system}];for(;r.length>0;){const e=r.pop();if(!e||!e.value||"object"!=typeof e.value)continue;const s=e.value;for(const[n,l]of Object.entries(s)){const s=e.path?`${e.path}.${n}`:n;if(null!=l)if("string"!=typeof l&&"number"!=typeof l&&"boolean"!=typeof l){if("object"==typeof l){const e=l.default;"string"!=typeof e&&"number"!=typeof e&&"boolean"!=typeof e||t.byName.set(o(s),String(e)),r.push({path:s,value:l})}}else t.byName.set(o(s),String(l))}}},exports.replaceThemeTokensWithCssVars=function(e){const t=/theme\.([a-zA-Z0-9_.-]+)/g,r=e=>{if(!e.includes("theme."))return e;t.lastIndex=0;let r=!1;const s=e.replace(t,(e,t)=>(r=!0,`var(${o(t)})`));return r?s:e},s=e=>{if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype};if("string"==typeof e)return r(e);if(!s(e)&&!Array.isArray(e))return e;const l=n.get(e);if(void 0!==l)return l;const a=[{value:e,isProcessed:!1}],i=new Map,c=new Set;for(;a.length>0;){const e=a[a.length-1],t=e.value;if(s(t)||Array.isArray(t))if(i.has(t))a.pop();else if(e.isProcessed){a.pop(),c.delete(t);let e=t;if(Array.isArray(t)){let o=null;for(let e=0;e<t.length;e++){const n=t[e];let l=n;"string"==typeof n?l=r(n):(s(n)||Array.isArray(n))&&(l=i.get(n)??n),l!==n&&(null===o&&(o=[...t]),o[e]=l)}null!==o&&(e=o)}else{let o=null;const n=t;for(const e in n)if(Object.prototype.hasOwnProperty.call(n,e)){const t=n[e];let l=t;"string"==typeof t?l=r(t):(s(t)||Array.isArray(t))&&(l=i.get(t)??t),l!==t&&(null===o&&(o={...n}),o[e]=l)}null!==o&&(e=o)}i.set(t,e)}else{e.isProcessed=!0,c.add(t);const r=Array.isArray(t)?t:Object.values(t);for(let e=r.length-1;e>=0;e--){const t=r[e];!s(t)&&!Array.isArray(t)||c.has(t)||a.push({value:t,isProcessed:!1})}}else a.pop()}const p=i.get(e)??e;return n.set(e,p),p!==e&&"object"==typeof p&&null!==p&&n.set(p,p),p},exports.setActiveServerTheme=function(r){e.getGlobalState(t,()=>({})).activeTheme=r};