@domphy/theme 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 domphy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # @domphy/theme
2
+
3
+ Context-aware color, size, and spacing for Domphy. WCAG 4.5:1 contrast is guaranteed by palette structure — no runtime contrast checks, no token memorization.
4
+
5
+ ```bash
6
+ npm install @domphy/theme
7
+ ```
8
+
9
+ ## Setup
10
+
11
+ Call once on mount. Injects CSS variables for all registered themes into `<head>`.
12
+
13
+ ```ts
14
+ import { themeApply } from "@domphy/theme"
15
+
16
+ themeApply()
17
+ ```
18
+
19
+ Then set `dataTheme` on any element. Children inherit it automatically — no providers needed.
20
+
21
+ ```ts
22
+ { div: [App], dataTheme: "light" } // or "dark" — both built in
23
+ ```
24
+
25
+ ## Color
26
+
27
+ `themeColor(listener, tone, color?)` resolves a color CSS variable from the element's DOM context. Any two tones 6 steps apart pass WCAG 4.5:1.
28
+
29
+ ```ts
30
+ import { themeColor } from "@domphy/theme"
31
+
32
+ style: {
33
+ backgroundColor: (l) => themeColor(l, "inherit", "primary"),
34
+ color: (l) => themeColor(l, "shift-6", "primary"), // guaranteed contrast
35
+ outline: (l) => `1px solid ${themeColor(l, "shift-3", "primary")}`,
36
+ "&:hover": {
37
+ backgroundColor: (l) => themeColor(l, "increase-1", "primary"),
38
+ },
39
+ }
40
+ ```
41
+
42
+ ## Spacing
43
+
44
+ `themeSpacing(n)` returns `n × (fontSize / 4)` in em — equivalent to the 4pt grid at standard size, scales automatically with font size.
45
+
46
+ ```ts
47
+ import { themeSpacing } from "@domphy/theme"
48
+
49
+ style: {
50
+ padding: `${themeSpacing(1)} ${themeSpacing(3)}`, // 4px 12px at 16px base
51
+ borderRadius: themeSpacing(2), // 8px
52
+ }
53
+ ```
54
+
55
+ ## Font Size
56
+
57
+ `themeSize(listener, key)` resolves a font size from the element's `dataSize` context. Set `dataSize` on a parent; all children scale automatically.
58
+
59
+ ```ts
60
+ import { themeSize } from "@domphy/theme"
61
+
62
+ style: {
63
+ fontSize: (l) => themeSize(l, "inherit"), // current context size
64
+ fontSize: (l) => themeSize(l, "increase-1"), // one step larger
65
+ }
66
+ ```
67
+
68
+ ## Custom theme
69
+
70
+ ```ts
71
+ import { setTheme, createDark, getTheme, themeApply } from "@domphy/theme"
72
+
73
+ setTheme("brand", {
74
+ colors: {
75
+ primary: ["#fff", "#eef2ff", "#c7d2fe", "#a5b4fc", "#818cf8",
76
+ "#6366f1", "#4f46e5", "#4338ca", "#3730a3", "#312e81", "#1e1b4b", "#000"],
77
+ },
78
+ baseTones: { primary: 5 }
79
+ })
80
+ setTheme("brand-dark", createDark(getTheme("brand")))
81
+ themeApply()
82
+ ```
83
+
84
+ ---
85
+
86
+ **[Full documentation →](https://domphy.dev/theme/)**
@@ -0,0 +1,5 @@
1
+ "use strict";var Domphy=(()=>{var ee=Object.defineProperty;var z=(e,t)=>{for(var s in t)ee(e,s,{get:t[s],enumerable:!0})};var j={};z(j,{AttributeList:()=>G,BooleanAttributes:()=>B,CamelAttributes:()=>V,ElementList:()=>q,ElementNode:()=>c,HtmlTags:()=>L,Notifier:()=>O,PrefixCSS:()=>y,State:()=>R,VoidTags:()=>he,hashString:()=>$,merge:()=>v,toState:()=>ie});var te=["onAbort","onAuxClick","onBeforeMatch","onBeforeToggle","onBlur","onCancel","onCanPlay","onCanPlayThrough","onChange","onClick","onClose","onContextLost","onContextMenu","onContextRestored","onCopy","onCueChange","onCut","onDblClick","onDrag","onDragEnd","onDragEnter","onDragLeave","onDragOver","onDragStart","onDrop","onDurationChange","onEmptied","onEnded","onError","onFocus","onFormData","onInput","onInvalid","onKeyDown","onKeyPress","onKeyUp","onLoad","onLoadedData","onLoadedMetadata","onLoadStart","onMouseDown","onMouseEnter","onMouseLeave","onMouseMove","onMouseOut","onMouseOver","onMouseUp","onPaste","onPause","onPlay","onPlaying","onProgress","onRateChange","onReset","onResize","onScroll","onScrollEnd","onSecurityPolicyViolation","onSeeked","onSeeking","onSelect","onSlotChange","onStalled","onSubmit","onSuspend","onTimeUpdate","onToggle","onVolumeChange","onWaiting","onWheel","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel","onPointerDown","onPointerMove","onPointerUp","onPointerCancel","onPointerEnter","onPointerLeave","onPointerOver","onPointerOut","onGotPointerCapture","onLostPointerCapture","onCompositionStart","onCompositionUpdate","onCompositionEnd","onTransitionEnd","onTransitionStart","onAnimationStart","onAnimationEnd","onAnimationIteration","onFullscreenChange","onFullscreenError","onFocusIn","onFocusOut"],se=te.reduce((e,t)=>{let s=t.slice(2).toLowerCase();return e[s]=t,e},{}),L=["a","abbr","address","article","aside","audio","b","base","blockquote","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","i","iframe","img","input","ins","kbd","label","legend","li","main","map","mark","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","slot","small","source","span","strong","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","bdi","bdo","math","menu","search","area","embed","hr","animate","animateMotion","animateTransform","circle","clipPath","cursor","defs","desc","ellipse","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence","filter","foreignObject","g","image","line","linearGradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","prefetch","radialGradient","rect","set","solidColor","stop","svg","switch","symbol","tbreak","text","textPath","tspan","use","view"],O=class{constructor(){this._listeners={}}_dispose(){if(this._listeners)for(let e in this._listeners)this._listeners[e].clear();this._listeners=null}addListener(e,t){if(!this._listeners)return()=>{};if(typeof e!="string"||typeof t!="function")throw new Error("Event name must be a string, listener must be a function");this._listeners[e]||(this._listeners[e]=new Set);let s=()=>this.removeListener(e,t);return this._listeners[e].has(t)||(this._listeners[e].add(t),typeof t.onSubscribe=="function"&&t.onSubscribe(s)),s}removeListener(e,t){if(!this._listeners)return;let s=this._listeners[e];s&&s.has(t)&&(s.delete(t),s.size===0&&delete this._listeners[e])}notify(e,...t){if(!this._listeners)return;let s=this._listeners[e];if(s)for(let i of[...s])try{i(...t)}catch(r){console.error(r)}}},R=class{constructor(e){this._notifier=new O,this.initialValue=e,this._value=e}get(e){return e&&this.onChange(e),this._value}set(e){this._notifier&&(this._value=e,this._notifier.notify("change",e))}reset(){this.set(this.initialValue)}onChange(e){return this._notifier?this._notifier.addListener("change",e):()=>{}}_dispose(){this._notifier&&(this._notifier._dispose(),this._notifier=null)}};function v(e={},t={}){let s=["animation","transition","boxShadow","textShadow","background","fontFamily"],i=["class","rel","transform","acceptCharset","sandbox"],r=["content"];Object.prototype.toString.call(t)==="[object Object]"&&Object.getPrototypeOf(t)===Object.prototype&&(t=g(t));for(let n in t){let o=t[n];if(!(o==null||o===""))if(typeof o=="object"&&!Array.isArray(o))typeof e[n]=="object"?e[n]=v(e[n],o):e[n]=o;else if(s.includes(n))if(typeof e[n]=="function"||typeof o=="function"){let l=e[n];e[n]=h=>{let a=typeof l=="function"?l(h):l,f=typeof o=="function"?o(h):o;return[a,f].filter(u=>u).join(", ")}}else e[n]=[e[n],o].filter(l=>l).join(", ");else if(r.includes(n))if(typeof e[n]=="function"||typeof o=="function"){let l=e[n];e[n]=h=>{let a=typeof l=="function"?l(h):l,f=typeof o=="function"?o(h):o;return[a,f].filter(u=>u).join("")}}else e[n]=[e[n],o].filter(l=>l).join("");else if(i.includes(n))if(typeof e[n]=="function"||typeof o=="function"){let l=e[n];e[n]=h=>{let a=typeof l=="function"?l(h):l,f=typeof o=="function"?o(h):o;return[a,f].filter(u=>u).join(" ")}}else e[n]=[e[n],o].filter(l=>l).join(" ");else if(n.startsWith("on")){let l=n.replace("on","").toLowerCase();re(e,l,o)}else if(n.startsWith("_on")){let l=n.replace("_on","");ne(e,l,o)}else e[n]=o}return e}function ie(e){return e instanceof R?e:new R(e)}function $(e=""){let t=2166136261;for(let s=0;s<e.length;s++)t^=e.charCodeAt(s),t=t*16777619>>>0;return String.fromCharCode(97+t%26)+t.toString(16)}function ne(e,t,s){let i=`_on${t}`,r=e[i];typeof r=="function"?e[i]=(...n)=>{r(...n),s(...n)}:e[i]=s}function re(e,t,s){let i=se[t];if(!i)throw Error(`invalid event name "${t}"`);let r=e[i];typeof r=="function"?e[i]=(n,o)=>{r(n,o),s(n,o)}:e[i]=s}function g(e,t=new WeakMap){if(e===null||typeof e!="object"||typeof e=="function")return e;if(t.has(e))return t.get(e);let s=Object.getPrototypeOf(e);if(s!==Object.prototype&&!Array.isArray(e))return e;let i;if(Array.isArray(e)){i=[],t.set(e,i);for(let r of e)i.push(g(r,t));return i}if(e instanceof Date)return new Date(e);if(e instanceof RegExp)return new RegExp(e);if(e instanceof Map){i=new Map,t.set(e,i);for(let[r,n]of e)i.set(g(r,t),g(n,t));return i}if(e instanceof Set){i=new Set,t.set(e,i);for(let r of e)i.add(g(r,t));return i}if(ArrayBuffer.isView(e))return new e.constructor(e);if(e instanceof ArrayBuffer)return e.slice(0);i=Object.create(s),t.set(e,i);for(let r of Reflect.ownKeys(e))i[r]=g(e[r],t);return i}function H(e,t=!1){if(Object.prototype.toString.call(e)!=="[object Object]")throw Error(`typeof ${e} is invalid DomphyElement`);let s=Object.keys(e);for(let i=0;i<s.length;i++){let r=s[i],n=e[r];if(i==0&&!L.includes(r)&&!r.includes("-")&&!t)throw Error(`key ${r} is not valid HTML tag name`);if(r=="style"&&n&&Object.prototype.toString.call(n)!=="[object Object]")throw Error('"style" must be a object');if(r=="$")e.$.forEach(o=>H(o,!0));else{if(r.startsWith("_on")&&typeof n!="function")throw Error(`hook ${r} value "${n}" must be a function `);if(r.startsWith("on")&&typeof n!="function")throw Error(`event ${r} value "${n}" must be a function `);if(r=="_portal"&&typeof n!="function")throw Error('"_portal" must be a function return HTMLElement');if(r=="_context"&&Object.prototype.toString.call(n)!=="[object Object]")throw Error('"_context" must be a object');if(r=="_metadata"&&Object.prototype.toString.call(n)!=="[object Object]")throw Error('"_metadata" must be a object');if(r=="_key"&&typeof n!="string"&&typeof n!="number")throw Error('"_key" must be a string or number')}}return!0}function oe(e){return/<([a-z][\w-]*)(\s[^>]*)?>.*<\/\1>|<([a-z][\w-]*)(\s[^>]*)?\/>/i.test(e.trim())}function U(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function le(e){return Object.keys(e).find(t=>L.includes(t))}function W(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function ae(e){if(e.indexOf("@")===0)return[e];for(var t=[],s=0,i=0,r="",n=0,o=e.length;n<o;n++){var l=e[n];if(l==="(")s+=1;else if(l===")")s-=1;else if(l==="[")i+=1;else if(l==="]")i-=1;else if(l===","&&!s&&!i){t.push(r.trim()),r="";continue}r+=l}return t.push(r.trim()),t}var F=e=>{if(Array.isArray(e.$)){let t={};return e.$.forEach(s=>v(t,F(s))),delete e.$,v(t,e),t}else return e},he=["area","base","br","col","embed","hr","img","input","link","meta","source","track","wbr"],B=["allowFullScreen","async","autoFocus","autoPlay","checked","compact","contentEditable","controls","declare","default","defer","disabled","formNoValidate","hidden","isMap","itemScope","loop","multiple","muted","noHref","noShade","noValidate","open","playsInline","readonly","required","reversed","scoped","selected","sortable","trueSpeed","typeMustMatch","wmode","autoCapitalize","translate","spellCheck","inert","download","noModule","paused","autoPictureInPicture"],y={transform:["webkit","ms"],transition:["webkit","ms"],animation:["webkit"],userSelect:["webkit","ms"],flexDirection:["webkit","ms"],flexWrap:["webkit","ms"],justifyContent:["webkit","ms"],alignItems:["webkit","ms"],alignSelf:["webkit","ms"],order:["webkit","ms"],flexGrow:["webkit","ms"],flexShrink:["webkit","ms"],flexBasis:["webkit","ms"],columns:["webkit"],columnCount:["webkit"],columnGap:["webkit"],columnRule:["webkit"],columnWidth:["webkit"],boxSizing:["webkit"],appearance:["webkit","moz"],filter:["webkit"],backdropFilter:["webkit"],clipPath:["webkit"],mask:["webkit"],maskImage:["webkit"],textSizeAdjust:["webkit","ms"],hyphens:["webkit","ms"],writingMode:["webkit","ms"],gridTemplateColumns:["ms"],gridTemplateRows:["ms"],gridAutoColumns:["ms"],gridAutoRows:["ms"],gridColumn:["ms"],gridRow:["ms"],marginInlineStart:["webkit"],marginInlineEnd:["webkit"],paddingInlineStart:["webkit"],paddingInlineEnd:["webkit"],minInlineSize:["webkit"],maxInlineSize:["webkit"],minBlockSize:["webkit"],maxBlockSize:["webkit"],inlineSize:["webkit"],blockSize:["webkit"],tabSize:["moz"],overscrollBehavior:["webkit","ms"],touchAction:["ms"],resize:["webkit"],printColorAdjust:["webkit"],backgroundClip:["webkit"],boxDecorationBreak:["webkit"],overflowScrolling:["webkit"]},V=["viewBox","preserveAspectRatio","gradientTransform","gradientUnits","spreadMethod","markerStart","markerMid","markerEnd","markerHeight","markerWidth","markerUnits","refX","refY","patternContentUnits","patternTransform","patternUnits","filterUnits","primitiveUnits","kernelUnitLength","clipPathUnits","maskContentUnits","maskUnits"],fe=class{constructor(e,t,s){this.parent=s,this.isBoolean=B.includes(e),V.includes(e)?this.name=e:this.name=W(e),this.value=void 0,this.set(t)}render(){if(!this.parent||!this.parent.domElement)return;let e=this.parent.domElement,t=["value"];this.isBoolean?this.value===!1||this.value==null?e.removeAttribute(this.name):e.setAttribute(this.name,this.value===!0?"":this.value):this.value==null?e.removeAttribute(this.name):t.includes(this.name)?e[this.name]=this.value:e.setAttribute(this.name,this.value)}set(e){if(e==null){this.value=null,this.render();return}if(typeof e=="string"&&/<\/?[a-z][\s\S]*>/i.test(e))this.value=U(e);else if(typeof e=="function"){let t=()=>{t&&(this.value=this.isBoolean?!!e():e(),this.render())};t.elementNode=this.parent,t.onSubscribe=s=>{this.parent&&this.parent.addHook("BeforeRemove",()=>{s(),t=null})},this.value=this.isBoolean?!!e(t):e(t)}else this.value=this.isBoolean?!!e:e;this.render()}remove(){this.parent&&this.parent.attributes&&this.parent.attributes.remove(this.name),this._dispose()}_dispose(){this.value=null,this.parent=null}generateHTML(){let{name:e,value:t}=this;if(this.isBoolean)return t?`${e}`:"";{let s=Array.isArray(t)?JSON.stringify(t):t;return`${e}="${U(String(s))}"`}}},G=class{constructor(e){this._notifier=new O,this.items={},this.parent=e}generateHTML(){if(!this.items)return"";let e=Object.values(this.items).map(t=>t.generateHTML()).join(" ");return e?` ${e}`:""}get(e){var t;if(this.items)return(t=this.items[e])==null?void 0:t.value}set(e,t){!this.items||!this.parent||(this.items[e]?(this.items[e].set(t),this.parent.domElement&&this._notifier.notify(e,this.items[e].value)):this.items[e]=new fe(e,t,this.parent))}onChange(e,t){var s;if(this.has(e)&&(s=this.parent)!=null&&s.domElement){let i=t;i.onSubscribe=r=>{var n;return(n=this.parent)==null?void 0:n.addHook("BeforeRemove",r)},this._notifier.addListener(e,i)}}has(e){return this.items?Object.prototype.hasOwnProperty.call(this.items,e):!1}remove(e){this.items&&(this.items[e]&&(this.items[e]._dispose(),delete this.items[e]),this.parent&&this.parent.domElement&&this.parent.domElement instanceof Element&&this.parent.domElement.removeAttribute(e))}_dispose(){if(this.items)for(let e in this.items)this.items[e]._dispose();this._notifier._dispose(),this.items=null,this.parent=null}toggle(e,t){if(!B.includes(e))throw Error(`${e} is not a boolean attribute`);t===!0?this.set(e,!0):t===!1?this.remove(e):this.has(e)?this.remove(e):this.set(e,!0)}addClass(e){if(!e||typeof e!="string")return;let t=(i,r)=>{let n=(i||"").split(" ").filter(o=>o);return!n.includes(r)&&n.push(e),n.join(" ")},s=this.get("class");typeof s=="function"?this.set("class",()=>t(s(),e)):this.set("class",t(s,e))}hasClass(e){return!e||typeof e!="string"?!1:(this.get("class")||"").split(" ").filter(t=>t).includes(e)}toggleClass(e){!e||typeof e!="string"||(this.hasClass(e)?this.removeClass(e):this.addClass(e))}removeClass(e){if(!e||typeof e!="string")return;let t=(this.get("class")||"").split(" ").filter(s=>s).filter(s=>s!==e);t.length>0?this.set("class",t.join(" ")):this.remove("class")}replaceClass(e,t){!e||!t||typeof e!="string"||typeof t!="string"||this.hasClass(e)&&(this.removeClass(e),this.addClass(t))}},ue=class{constructor(e,t){this.type="TextNode",this.parent=t,this.text=e===""?"\u200B":String(e)}_createDOMNode(){let e;if(oe(this.text)){let t=document.createElement("template");t.innerHTML=this.text.trim(),e=t.content.firstChild||document.createTextNode("")}else e=document.createTextNode(this.text);return this.domText=e,e}_dispose(){this.domText=void 0,this.text=""}generateHTML(){return this.text==="\u200B"?"&#8203;":this.text}render(e){let t=this._createDOMNode();e.appendChild(t)}},q=class{constructor(e){this.items=[],this.owner=e}_createNode(e,t=0){return typeof e=="object"&&e!==null?new c(e,this.owner,t):new ue(e==null?"":String(e),this.owner)}_moveDomElement(e,t){if(!this.owner||!this.owner.domElement)return;let s=this.owner.domElement,i=e instanceof c?e.domElement:e.domText;if(i){let r=s.childNodes[t]||null;i!==r&&s.insertBefore(i,r)}}_swapDomElement(e,t){if(!this.owner||!this.owner.domElement)return;let s=this.owner.domElement,i=e instanceof c?e.domElement:e.domText,r=t instanceof c?t.domElement:t.domText;if(!i||!r)return;let n=i.nextSibling,o=r.nextSibling;s.insertBefore(i,o),s.insertBefore(r,n)}update(e,t=!0,s=!1){var i,r,n,o;let l=this.items.slice(),h=new Map;for(let a of l)a instanceof c&&a.key!==null&&a.key!==void 0&&h.set(a.key,a);!s&&this.owner.domElement&&((r=(i=this.owner._hooks)==null?void 0:i.BeforeUpdate)==null||r.call(i,this.owner,e));for(let a=0;a<e.length;a++){let f=e[a],u=typeof f=="object"&&f!==null?f._key:void 0;if(u!==void 0){let m=h.get(u);if(m){h.delete(u);let S=this.items.indexOf(m);if(S!==a&&S>=0){let d=m instanceof c&&!!m._portal;this.move(S,a,d?!1:t,!0)}m.parent=this.owner;continue}}this.insert(f,a,t,!0)}for(;this.items.length>e.length;)this.remove(this.items[this.items.length-1],t,!0);h.forEach(a=>this.remove(a,t,!0)),s||(o=(n=this.owner._hooks)==null?void 0:n.Update)==null||o.call(n,this.owner)}insert(e,t,s=!0,i=!1){var r,n;let o=this.items.length,l=typeof t!="number"||isNaN(t)||t<0||t>o?o:t,h=this._createNode(e,l);if(this.items.splice(l,0,h),h instanceof c){h._hooks.Insert&&h._hooks.Insert(h);let a=this.owner.domElement;if(s&&a)if(h._portal){let f=h._portal(this.owner.getRoot());f&&h.render(f)}else{let f=h._createDOMNode(),u=(r=a.childNodes[l])!=null?r:null;a.insertBefore(f,u);let m=a.getRootNode(),S=(m instanceof ShadowRoot?m:document.head).querySelector("#domphy-style");h.styles.render(S),h._hooks.Mount&&h._hooks.Mount(h),h.children.items.forEach(d=>{if(d instanceof c&&d._portal){let D=d._portal(d.getRoot());D&&d.render(D)}else d.render(f)})}}else{let a=this.owner.domElement;if(s&&a){let f=h._createDOMNode(),u=(n=a.childNodes[l])!=null?n:null;a.insertBefore(f,u)}}return!i&&this.owner.domElement&&this.owner._hooks.Update&&this.owner._hooks.Update(this.owner),h}remove(e,t=!0,s=!1){let i=this.items.indexOf(e);if(!(i<0)){if(e instanceof c){let r=()=>{var n,o;let l=e.domElement;this.items.splice(i,1),t&&l&&l.remove(),(o=(n=e._hooks)==null?void 0:n.Remove)==null||o.call(n,e),e._dispose()};e._hooks&&e._hooks.BeforeRemove&&e.domElement?e._hooks.BeforeRemove(e,r):r()}else{let r=e.domText;this.items.splice(i,1),t&&r&&r.remove(),e._dispose()}!s&&this.owner.domElement&&this.owner._hooks.Update&&this.owner._hooks.Update(this.owner)}}clear(e=!0,t=!1){if(this.items.length===0)return;let s=this.items.slice();for(let i of s)this.remove(i,e,!0);!t&&this.owner.domElement&&this.owner._hooks.Update&&this.owner._hooks.Update(this.owner)}_dispose(){this.items=[]}swap(e,t,s=!0,i=!1){if(e<0||t<0||e>=this.items.length||t>=this.items.length||e===t)return;let r=this.items[e],n=this.items[t];this.items[e]=n,this.items[t]=r,s&&this._swapDomElement(r,n),!i&&this.owner.domElement&&this.owner._hooks.Update&&this.owner._hooks.Update(this.owner)}move(e,t,s=!0,i=!1){if(e<0||e>=this.items.length||t<0||t>=this.items.length||e===t)return;let r=this.items[e];this.items.splice(e,1),this.items.splice(t,0,r),s&&this._moveDomElement(r,t),!i&&this.owner.domElement&&this.owner._hooks.Update&&this.owner._hooks.Update(this.owner)}generateHTML(){let e="";for(let t of this.items)e+=t.generateHTML();return e}},me=class{constructor(e,t,s){this.value="",this.name=e,this.cssName=W(e),this.parentRule=s,this.set(t)}_domUpdate(){if(!this.parentRule)return;let e=this.parentRule.domRule;if(e&&e.style){let t=e.style;t.setProperty(this.cssName,String(this.value)),y[this.name]&&y[this.name].forEach(s=>{t.setProperty(`-${s}-${this.cssName}`,String(this.value))})}}_dispose(){this.value="",this.parentRule=null}set(e){if(typeof e=="function"){let t=()=>{t&&(this.value=e(t),this._domUpdate())};t.onSubscribe=s=>{var i;(i=this.parentRule.parentNode)==null||i.addHook("BeforeRemove",()=>{s(),t=null})},t.elementNode=this.parentRule.root,this.value=e(t)}else this.value=e;this._domUpdate()}remove(){if(this.parentRule){if(this.parentRule.domRule instanceof CSSStyleRule){let e=this.parentRule.domRule.style;e.removeProperty(this.cssName),y[this.name]&&y[this.name].forEach(t=>{e.removeProperty(`-${t}-${this.cssName}`)})}delete this.parentRule.styleBlock[this.name],this._dispose()}}cssText(){let e=`${this.cssName}: ${this.value}`;return y[this.name]&&y[this.name].forEach(t=>{e+=`; -${t}-${this.cssName}: ${this.value}`}),e}},p=class M{constructor(t,s){this.domRule=null,this.styleBlock={},this.selectorText=t,this.styleList=new K(this),this.parent=s}_dispose(){if(this.styleBlock)for(let t of Object.values(this.styleBlock))t._dispose();this.styleList&&this.styleList._dispose(),this.styleBlock=null,this.styleList=null,this.domRule=null,this.parent=null}get root(){let t=this.parent;for(;t instanceof M;)t=t.parent;return t}get parentNode(){let t=this.parent;for(;t&&t instanceof M;)t=t.parent;return t}insertStyle(t,s){this.styleBlock&&(this.styleBlock[t]?this.styleBlock[t].set(s):this.styleBlock[t]=new me(t,s,this))}removeStyle(t){this.styleBlock&&this.styleBlock[t]&&this.styleBlock[t].remove()}cssText(){if(!this.styleBlock||!this.styleList)return"";let t=Object.values(this.styleBlock).map(i=>i.cssText()).join(";"),s=this.styleList.cssText();return`${this.selectorText} { ${t} ${s} } `}mount(t){!t||!this.styleList||(this.domRule=t,"cssRules"in t&&this.styleList.mount(t.cssRules))}remove(){if(this.domRule&&this.domRule.parentStyleSheet){let t=this.domRule.parentStyleSheet,s=t.cssRules;for(let i=0;i<s.length;i++)if(s[i]===this.domRule){t.deleteRule(i);break}}this._dispose()}render(t){if(!this.styleBlock||!this.styleList)return;let s=Object.values(this.styleBlock).map(i=>i.cssText()).join(";");try{if(this.selectorText.startsWith("@")){if(/^@(media|supports|container|layer)\b/.test(this.selectorText)){let i=t.insertRule(`${this.selectorText} {}`,t.cssRules.length),r=t.cssRules[i];"cssRules"in r&&(this.mount(r),this.styleList.render(r))}else if(this.selectorText.startsWith("@keyframes")||this.selectorText.startsWith("@font-face")){let i=this.cssText(),r=t.insertRule(i,t.cssRules.length),n=t.cssRules[r];this.mount(n)}}else{let i=`${this.selectorText} { ${s} }`,r=t.insertRule(i,t.cssRules.length),n=t.cssRules[r];n&&"selectorText"in n&&this.mount(n)}}catch(i){console.warn("Failed to insert rule:",this.selectorText,i)}}},K=class{constructor(e){this.items=[],this.domStyle=null,this.parent=e}get parentNode(){let e=this.parent;for(;e&&e instanceof p;)e=e.parent;return e}addCSS(e,t=""){if(!this.items||!this.parent)return;let s={};function i(r,n){return r.startsWith("&")?`${n}${r.slice(1)}`:`${n} ${r}`}for(let r in e){let n=e[r],o=ae(r);for(let l of o){let h=i(l,t);if(/^@(container|layer|supports|media)\b/.test(l)){if(typeof n=="object"&&n!=null){let a=new p(l,this.parent);a.styleList.addCSS(n,t),this.items.push(a)}}else if(l.startsWith("@keyframes")){let a=new p(l,this.parent);a.styleList.addCSS(n,""),this.items.push(a)}else if(l.startsWith("@font-face")){let a=new p(l,this.parent);for(let f in n)a.insertStyle(f,n[f]);this.items.push(a)}else if(typeof n=="object"&&n!=null){let a=new p(h,this.parent);this.items.push(a);for(let[f,u]of Object.entries(n))if(typeof u=="object"&&u!=null){let m=i(f,h);f.startsWith("&")?this.addCSS(u,m):a.styleList.insertRule(m).styleList.addCSS(u,m)}else a.insertStyle(f,u)}else s[l]=n}}if(Object.keys(s).length){let r=new p(t,this.parent);for(let n in s)r.insertStyle(n,s[n]);this.items.push(r)}}cssText(){return this.items?this.items.map(e=>e.cssText()).join(""):""}insertRule(e){if(!this.items||!this.parent)return null;let t=this.items.find(s=>s.selectorText===e);return t||(t=new p(e,this.parent),this.items.push(t)),t}mount(e){if(!this.items)return;if(!e)throw Error("Require domRuleList argument");let t=0,s=i=>i.replace("(odd)","(2n+1)").replace("(even)","(2n)");this.items.forEach((i,r)=>{let n=r-t,o=e[n];o&&(i.selectorText.startsWith("@")&&o instanceof CSSKeyframesRule||"keyText"in o?i.mount(o):"selectorText"in o?o.selectorText!==s(i.selectorText)?t+=1:i.mount(o):"cssRules"in o&&i.mount(o))})}render(e){e instanceof HTMLStyleElement?(this.domStyle=e,this.items.forEach(t=>t.render(e.sheet))):e instanceof CSSGroupingRule&&this.items.forEach(t=>t.render(e))}_dispose(){if(this.items)for(let e=0;e<this.items.length;e++)this.items[e]._dispose();this.items=[],this.parent=null,this.domStyle=null}},c=class E{constructor(t,s=null,i=0){this.type="ElementNode",this.parent=null,this.children=new q(this),this.styles=new K(this),this.attributes=new G(this),this.domElement=null,this._hooks={},this._events=null,this._context={},this._metadata={},this.key=null;var r,n;t=g(t),H(t),t.style=t.style||{},this.parent=s,this.tagName=le(t),t=F(t),this.key=(r=t._key)!=null?r:null,this._context=t._context||{},this._metadata=t._metadata||{};let o=`${(n=this.parent)==null?void 0:n.getPath()}.${i}`,l=JSON.stringify(t.style||{},(a,f)=>typeof f=="function"?o:f);this.nodeId=$(o+l),this.attributes.addClass(`${this.tagName}_${this.nodeId}`),t._onSchedule&&t._onSchedule(this,t),this.merge(t);let h=t[this.tagName];if(h!=null&&h!=null)if(typeof h=="function"){let a=()=>{let f=h(a);this.children.update(Array.isArray(f)?f:[f])};a.elementNode=this,a.onSubscribe=f=>this.addHook("BeforeRemove",()=>{f(),a=null}),a&&a()}else this.children.update(Array.isArray(h)?h:[h]);this._hooks.Init&&this._hooks.Init(this)}_createDOMNode(){let t=["svg","circle","path","rect","ellipse","line","polyline","polygon","g","defs","use","symbol","linearGradient","radialGradient","stop","clipPath","mask","filter","text","tspan","textPath","image","pattern","marker","animate","animateTransform","animateMotion","feGaussianBlur","feComposite","feColorMatrix","feMerge","feMergeNode","feOffset","feFlood","feBlend","foreignObject"].includes(this.tagName)?document.createElementNS("http://www.w3.org/2000/svg",this.tagName):document.createElement(this.tagName);if(this.domElement=t,this._events)for(let s in this._events){let i=s,r=this._events[i],n=o=>r(o,this);t.addEventListener(i,n),this.addHook("BeforeRemove",o=>{o.domElement.removeEventListener(i,n),n=null})}return this.attributes&&Object.values(this.attributes.items).forEach(s=>s.render()),t}_dispose(){this.children&&this.children._dispose(),this.styles&&(this.styles.items.forEach(t=>t.remove()),this.styles._dispose()),this.attributes&&this.attributes._dispose(),this.domElement=null,this._hooks={},this._events=null,this._context={},this._metadata={},this.parent=null}get pathId(){return $(this.getPath())}merge(t){v(this._context,t._context),v(this._metadata,t._metadata);let s=Object.keys(t);for(let i=0;i<s.length;i++){let r=s[i],n=t[r];["$","_onSchedule","_key","_context","_metadata","style",this.tagName].includes(r)||(["_onInit","_onInsert","_onMount","_onBeforeUpdate","_onUpdate","_onBeforeRemove","_onRemove"].includes(r)?this.addHook(r.substring(3),n):r.startsWith("on")?this.addEvent(r.substring(2).toLowerCase(),n):r=="_portal"?this._portal=n:r=="class"&&typeof n=="string"?this.attributes.addClass(n):this.attributes.set(r,n))}t.style&&this.styles.addCSS(t.style||{},`.${`${this.tagName}_${this.nodeId}`}`)}getPath(){let t=[],s=this;for(;s&&s.parent;){let i=s.parent,r=i.children.items.indexOf(s);t.push(r),s=i}return t.reverse().join(".")}addEvent(t,s){this._events=this._events||{};let i=this._events[t];typeof i=="function"?this._events[t]=(r,n)=>{i(r,n),s(r,n)}:this._events[t]=s}addHook(t,s){let i=this._hooks[t];typeof i=="function"?this._hooks[t]=((...r)=>{i(...r),s(...r)}):this._hooks[t]=s}getRoot(){let t=this;for(;t&&t instanceof E&&t.parent;)t=t.parent;return t}getContext(t){let s=this;for(;s&&(!s._context||!Object.prototype.hasOwnProperty.call(s._context,t));)s=s.parent;return s&&s._context?s._context[t]:void 0}setContext(t,s){this._context=this._context||{},this._context[t]=s}getMetadata(t){return this._metadata?this._metadata[t]:void 0}setMetadata(t,s){this._metadata=this._metadata||{},this._metadata[t]=s}generateCSS(){if(!this.styles||!this.children)return"";let t=this.styles.cssText();return t+=this.children.items.map(s=>s instanceof E?s.generateCSS():"").join(""),t}generateHTML(){if(!this.children||!this.attributes)return"";let t=this.children.generateHTML(),s=this.attributes.generateHTML();return`<${this.tagName}${s}>${t}</${this.tagName}>`}mount(t,s){if(!t)throw new Error("Missing dom node on bind");if(this.domElement=t,this._events)for(let i in this._events){let r=i,n=this._events[r],o=l=>n(l,this);t.addEventListener(r,o),this.addHook("BeforeRemove",l=>{l.domElement.removeEventListener(r,o),o=null})}this.children&&this.children.items.forEach((i,r)=>{let n=t.childNodes[r];n instanceof Node&&i instanceof E&&i.mount(n,s)}),this._hooks.Mount&&this._hooks.Mount(this)}render(t,s=null){let i=this._createDOMNode();t.appendChild(i),this._hooks.Mount&&this._hooks.Mount(this),s||(s=this.getRoot().styles.domStyle);let r=t.getRootNode(),n=r instanceof ShadowRoot?r:document.head;return s||(s=n.querySelector("#domphy-style")),s||(s=document.createElement("style"),s.id="domphy-style",n.appendChild(s)),this.styles.render(s),this.children.items.forEach(o=>{if(o instanceof E&&o._portal){let l=o._portal(this.getRoot());l&&o.render(l)}else o.render(i)}),i}remove(){var t;this.parent?this.parent.children.remove(this):((t=this.domElement)==null||t.remove(),this._dispose())}};var P={};z(P,{contextColor:()=>Ee,createDark:()=>Q,getTheme:()=>w,setTheme:()=>ye,themeApply:()=>be,themeCSS:()=>A,themeColor:()=>xe,themeName:()=>T,themeSize:()=>we,themeSpacing:()=>ve,themeTokens:()=>ge,themeVars:()=>b});var ce={direction:"darken",colors:{highlight:["#ffffff","#fcf4d6","#fddc69","#f1c21b","#d2a106","#b28600","#8e6a00","#684e00","#483700","#302400","#1c1500","#000000"],warning:["#ffffff","#fff2e8","#ffd9be","#ffb784","#ff832b","#eb6200","#ba4e00","#8a3800","#5e2900","#3e1a00","#231000","#000000"],error:["#ffffff","#fff1f1","#ffd7d9","#ffb3b8","#ff8389","#fa4d56","#da1e28","#a2191f","#750e13","#520408","#2d0709","#000000"],danger:["#ffffff","#fff1f1","#ffd7d9","#ffb3b8","#ff8389","#fa4d56","#da1e28","#a2191f","#750e13","#520408","#2d0709","#000000"],secondary:["#ffffff","#fff0f7","#ffd6e8","#ffafd2","#ff7eb6","#ee5396","#d02670","#9f1853","#740937","#510224","#2a0a18","#000000"],primary:["#ffffff","#edf5ff","#d0e2ff","#a6c8ff","#78a9ff","#4589ff","#0f62fe","#0043ce","#002d9c","#001d6c","#001141","#000000"],info:["#ffffff","#e5f6ff","#bae6ff","#82cfff","#33b1ff","#1192e8","#0072c3","#00539a","#003a6d","#012749","#061727","#000000"],success:["#ffffff","#defbe6","#a7f0ba","#6fdc8c","#42be65","#24a148","#198038","#0e6027","#044317","#022d0d","#071908","#000000"],neutral:["#ffffff","#f4f4f4","#e0e0e0","#c6c6c6","#a8a8a8","#8d8d8d","#6f6f6f","#525252","#393939","#262626","#161616","#000000"]},baseTones:{highlight:3,warning:4,error:5,secondary:5,primary:6,info:5,success:5,neutral:5},fontSizes:["0.75rem","0.875rem","1rem","1.25rem","1.5625rem","1.9375rem","2.4375rem","3.0625rem"],custom:{}},x=ce;var k={light:JSON.parse(JSON.stringify(x)),dark:Q(x)};function de(e){for(let t in e)if(!Object.keys(x).includes(t))throw new Error(`Invalid key: ${t}`);if(e.fontSizes&&!Array.isArray(e.fontSizes))throw new Error("fontSize must be array of string");if("custom"in e){let t=e.custom;if(typeof t!="object"||t===null)throw new Error("Invalid custom property: must be an object")}}function J(e,t){var s;for(let i in t)t[i]&&typeof t[i]=="object"&&!Array.isArray(t[i])?((s=e[i])!=null||(e[i]={}),J(e[i],t[i])):e[i]=t[i]}function pe(e,t){let s={};for(let r in t){let n=t[r];if(r==="colors")for(let o in t.colors)[...Array(12).keys()].forEach(l=>s[`--${o}-${l}`]=t.colors[o][l]);else if(r==="fontSizes")[...Array(8).keys()].forEach(o=>s[`--fontSize-${o}`]=t.fontSizes[o]);else if(typeof n=="object"&&n!==null)for(let o in n)s[`--${r}-${o.replace("/","_")}`]=n[o]}let i="";for(let r in s)i+=` ${r}: ${s[r]};
2
+ `;return`[data-theme="${e}"] {
3
+ ${i}}`}function w(e){if(!k[e])throw Error(`Theme "${e}" not found`);return k[e]}function ye(e,t){de(t),k[e]||(k[e]=structuredClone(x)),J(k[e],t)}function Q(e){let t=structuredClone(e);t.direction="lighten";for(let s in t.colors)t.colors[s].reverse(),t.baseTones[s]=11-t.baseTones[s];return t}function ge(e){let t=w(e),s={};for(let i in t){let r=t[i];if(i==="colors")for(let n in t.colors){let o={};[...Array(12).keys()].forEach(l=>o[l]=t.colors[n][l]),s[n]=o}else if(i==="fontSizes")s.fontSizes=t.fontSizes;else if(s[i]={},typeof r=="object"&&r!==null)for(let n in r)s[i][n]=r[n]}return s}function b(){let e=w("light"),t={};for(let s in e){let i=s,r=e[s];if(s==="colors")for(let n in e.colors){let o={};[...Array(12).keys()].forEach(l=>o[l]=`var(--${n}-${l})`),t[n]=o}else if(s==="fontSizes")t.fontSizes=[...Array(8).keys()].map(n=>`var(--fontSize-${n})`);else if(t[i]={},typeof r=="object"&&r!==null)for(let n in r)t[i][n]=`var(--${i}-${n.replace("/","_")})`}return t}function A(){return Object.entries(k).map(([e,t])=>pe(e,t)).join(`
4
+ `)}function be(e){var t;if(typeof document!="undefined")if(e){e.textContent=A();return}else e=(t=document.getElementById("domphy-themes"))!=null?t:Object.assign(document.createElement("style"),{id:"domphy-themes"}),e.textContent=A(),document.head.appendChild(e)}function ve(e){return e/4+"em"}function T(e){let s=typeof e=="function"?e.elementNode:e;for(;s&&(!s.attributes||!s.attributes.get("dataTheme"));)s=s.parent;let i="light";return s.attributes&&s.attributes.has("dataTheme")&&(i=s.attributes.get("dataTheme"),typeof e=="function"&&s.attributes.onChange("dataTheme",e)),i}var I=["inherit"];[...Array(8).keys()].forEach(e=>{I.push(`decrease-${e}`),I.push(`increase-${e}`)});function X(e,t="inherit"){if(!I.includes(t))throw Error(`size name "${t}" invalid`);let s;if(t=="inherit")s=e;else if(t!=null&&t.startsWith("increase-")){let i=parseInt(t.replace("increase-",""),10);s=e+i}else if(t!=null&&t.startsWith("decrease-")){let i=parseInt(t.replace("decrease-",""),10);s=e-i}else s=e;return Math.max(0,Math.min(8,s))}function ke(e){if(!e)return 2;let s=typeof e=="function"?e.elementNode:e;for(;s&&(!s.attributes||!s.attributes.get("dataSize"));)s=s.parent;let i=2;return s&&s.attributes&&s.attributes.has("dataSize")&&(i=X(i,s.attributes.get("dataSize")),typeof e=="function"&&s.attributes.onChange("dataSize",e)),i}function we(e,t="inherit"){let s=X(ke(e),t);return b().fontSizes[s]}var _=12,C=["inherit","base"];[...Array(_).keys()].forEach(e=>{C.push(`decrease-${e}`),C.push(`increase-${e}`),C.push(`shift-${e}`)});function Y(e,t){if(e<0||e>_-1)return e;let s=e+t;return s=Math.max(0,Math.min(_-1,s)),s}function _e(e,t){if(e<0||e>_-1)return e;let s=e<=5?e+t:e-t;return s=s<0||s>_-1?-s:s,s=Math.max(0,Math.min(_-1,s)),s}function N(e,t="inherit"){if(typeof t=="number")return t;if(t=="inherit")return e;if(!C.includes(t))throw Error(`tone name "${t}" invalid`);if(t.startsWith("increase-")){let s=parseInt(t.replace("increase-",""),10);return Y(e,s)}else if(t.startsWith("decrease-")){let s=parseInt(t.replace("decrease-",""),10);return Y(e,-s)}else if(t.startsWith("shift-")){let s=parseInt(t.replace("shift-",""),10);return _e(e,s)}else return e}function Z(e){if(!e)return 0;let s=typeof e=="function"?e.elementNode:e;for(;s&&(!s.attributes||!s.attributes.get("dataTone"));)s=s.parent;let i=0;return s&&s.attributes&&s.attributes.has("dataTone")&&(i=N(i,s.attributes.get("dataTone")),typeof e=="function"&&s.attributes.onChange("dataTone",e)),i}function Se(e,t="inherit"){return N(Z(e),t)}function Ee(e,t="inherit",s="inherit"){let i=typeof e=="function"?e.elementNode:e,r=s=="inherit"?i.getContext("themeColor")||"neutral":s,n;return t=="base"?n=w(T(e)).baseTones[r]:n=N(Z(e),t),b()[r][n]}function xe(e,t="inherit",s="inherit"){let i=s=="inherit"?"neutral":s;if(!e)return b()[i][N(0,t)];let r;return t=="base"?r=w(T(e)).baseTones[i]:r=Se(e,t),b()[i][r]}globalThis.Domphy={core:j,theme:P};})();
5
+ //# sourceMappingURL=core-theme.global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../core/src/types/EventProperties.ts","../../core/src/constants/HtmlTags.ts","../../core/src/classes/Notifier.ts","../../core/src/classes/State.ts","../../core/src/utils.ts","../../core/src/helpers.ts","../../core/src/constants/VoidTags.ts","../../core/src/constants/BooleanAttributes.ts","../../core/src/constants/PrefixCSS.ts","../../core/src/constants/CamelAttributes.ts","../../core/src/classes/ElementAttribute.ts","../../core/src/classes/AttributeList.ts","../../core/src/classes/TextNode.ts","../../core/src/classes/ElementList.ts","../../core/src/classes/StyleProperty.ts","../../core/src/classes/StyleRule.ts","../../core/src/classes/StyleList.ts","../../core/src/classes/ElementNode.ts","../src/index.ts","../src/light.ts","../src/theme.ts","../src/size.ts","../src/tone.ts","../src/global.ts"],"sourcesContent":["export const EventProperties = [\n \"onAbort\",\n \"onAuxClick\",\n \"onBeforeMatch\",\n \"onBeforeToggle\",\n \"onBlur\",\n \"onCancel\",\n \"onCanPlay\",\n \"onCanPlayThrough\",\n \"onChange\",\n \"onClick\",\n \"onClose\",\n \"onContextLost\",\n \"onContextMenu\",\n \"onContextRestored\",\n \"onCopy\",\n \"onCueChange\",\n \"onCut\",\n \"onDblClick\",\n \"onDrag\",\n \"onDragEnd\",\n \"onDragEnter\",\n \"onDragLeave\",\n \"onDragOver\",\n \"onDragStart\",\n \"onDrop\",\n \"onDurationChange\",\n \"onEmptied\",\n \"onEnded\",\n \"onError\",\n \"onFocus\",\n \"onFormData\",\n \"onInput\",\n \"onInvalid\",\n \"onKeyDown\",\n \"onKeyPress\",\n \"onKeyUp\",\n \"onLoad\",\n \"onLoadedData\",\n \"onLoadedMetadata\",\n \"onLoadStart\",\n \"onMouseDown\",\n \"onMouseEnter\",\n \"onMouseLeave\",\n \"onMouseMove\",\n \"onMouseOut\",\n \"onMouseOver\",\n \"onMouseUp\",\n \"onPaste\",\n \"onPause\",\n \"onPlay\",\n \"onPlaying\",\n \"onProgress\",\n \"onRateChange\",\n \"onReset\",\n \"onResize\",\n \"onScroll\",\n \"onScrollEnd\",\n \"onSecurityPolicyViolation\",\n \"onSeeked\",\n \"onSeeking\",\n \"onSelect\",\n \"onSlotChange\",\n \"onStalled\",\n \"onSubmit\",\n \"onSuspend\",\n \"onTimeUpdate\",\n \"onToggle\",\n \"onVolumeChange\",\n \"onWaiting\",\n \"onWheel\",\n \"onTouchStart\",\n \"onTouchMove\",\n \"onTouchEnd\",\n \"onTouchCancel\",\n \"onPointerDown\",\n \"onPointerMove\",\n \"onPointerUp\",\n \"onPointerCancel\",\n \"onPointerEnter\",\n \"onPointerLeave\",\n \"onPointerOver\",\n \"onPointerOut\",\n \"onGotPointerCapture\",\n \"onLostPointerCapture\",\n \"onCompositionStart\",\n \"onCompositionUpdate\",\n \"onCompositionEnd\",\n \"onTransitionEnd\",\n \"onTransitionStart\",\n \"onAnimationStart\",\n \"onAnimationEnd\",\n \"onAnimationIteration\",\n \"onFullscreenChange\",\n \"onFullscreenError\",\n \"onFocusIn\",\n \"onFocusOut\",\n] as const\n\nexport const eventNameMap = EventProperties.reduce((acc, ev) => {\n const key = ev.slice(2).toLowerCase() as keyof HTMLElementEventMap\n acc[key] = ev;\n return acc;\n}, {} as Partial<Record<keyof HTMLElementEventMap, (typeof EventProperties)[number]>>);\n","export const HtmlTags = [\n \"a\",\n \"abbr\",\n \"address\",\n \"article\",\n \"aside\",\n \"audio\",\n \"b\",\n \"base\",\n \"blockquote\",\n \"br\",\n \"button\",\n \"canvas\",\n \"caption\",\n \"cite\",\n \"code\",\n \"col\",\n \"colgroup\",\n \"data\",\n \"datalist\",\n \"dd\",\n \"del\",\n \"details\",\n \"dfn\",\n \"dialog\",\n \"div\",\n \"dl\",\n \"dt\",\n \"em\",\n \"fieldset\",\n \"figcaption\",\n \"figure\",\n \"footer\",\n \"form\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"header\",\n \"hgroup\",\n \"i\",\n \"iframe\",\n \"img\",\n \"input\",\n \"ins\",\n \"kbd\",\n \"label\",\n \"legend\",\n \"li\",\n \"main\",\n \"map\",\n \"mark\",\n \"meta\",\n \"meter\",\n \"nav\",\n \"noscript\",\n \"object\",\n \"ol\",\n \"optgroup\",\n \"option\",\n \"output\",\n \"p\",\n \"param\",\n \"picture\",\n \"pre\",\n \"progress\",\n \"q\",\n \"rp\",\n \"rt\",\n \"ruby\",\n \"s\",\n \"samp\",\n \"section\",\n \"select\",\n \"slot\",\n \"small\",\n \"source\",\n \"span\",\n \"strong\",\n \"sub\",\n \"summary\",\n \"sup\",\n \"table\",\n \"tbody\",\n \"td\",\n \"template\",\n \"textarea\",\n \"tfoot\",\n \"th\",\n \"thead\",\n \"time\",\n \"title\",\n \"tr\",\n \"track\",\n \"u\",\n \"ul\",\n \"var\",\n \"video\",\n \"wbr\",\n \"bdi\",\n \"bdo\",\n \"math\",\n \"menu\",\n \"search\",\n \"area\",\n \"embed\",\n \"hr\",\n \"animate\",\n \"animateMotion\",\n \"animateTransform\",\n \"circle\",\n \"clipPath\",\n \"cursor\",\n \"defs\",\n \"desc\",\n \"ellipse\",\n \"feBlend\",\n \"feColorMatrix\",\n \"feComponentTransfer\",\n \"feComposite\",\n \"feConvolveMatrix\",\n \"feDiffuseLighting\",\n \"feDisplacementMap\",\n \"feDistantLight\",\n \"feDropShadow\",\n \"feFlood\",\n \"feFuncA\",\n \"feFuncB\",\n \"feFuncG\",\n \"feFuncR\",\n \"feGaussianBlur\",\n \"feImage\",\n \"feMerge\",\n \"feMergeNode\",\n \"feMorphology\",\n \"feOffset\",\n \"fePointLight\",\n \"feSpecularLighting\",\n \"feSpotLight\",\n \"feTile\",\n \"feTurbulence\",\n \"filter\",\n \"foreignObject\",\n \"g\",\n \"image\",\n \"line\",\n \"linearGradient\",\n \"marker\",\n \"mask\",\n \"metadata\",\n \"mpath\",\n \"path\",\n \"pattern\",\n \"polygon\",\n \"polyline\",\n \"prefetch\",\n \"radialGradient\",\n \"rect\",\n \"set\",\n \"solidColor\",\n \"stop\",\n \"svg\",\n \"switch\",\n \"symbol\",\n \"tbreak\",\n \"text\",\n \"textPath\",\n \"tspan\",\n \"use\",\n \"view\",\n];","import { Handler } from \"../types.js\"\r\n\r\nexport class Notifier {\r\n private _listeners: Record<string, Set<Handler>> | null = {};\r\n\r\n _dispose(): void {\r\n if (this._listeners) {\r\n for (const event in this._listeners) {\r\n this._listeners[event].clear();\r\n }\r\n }\r\n\r\n this._listeners = null;\r\n }\r\n addListener(event: string, listener: Handler): () => void {\r\n if (!this._listeners) return () => { };\r\n\r\n if (typeof event !== \"string\" || typeof listener !== \"function\") {\r\n throw new Error(\"Event name must be a string, listener must be a function\");\r\n }\r\n\r\n if (!this._listeners[event]) {\r\n this._listeners[event] = new Set();\r\n }\r\n\r\n const release = () => this.removeListener(event, listener);\r\n\r\n if (!this._listeners[event].has(listener)) {\r\n this._listeners[event].add(listener);\r\n if (typeof listener.onSubscribe === \"function\") {\r\n listener.onSubscribe(release);\r\n }\r\n }\r\n\r\n return release;\r\n }\r\n\r\n removeListener(event: string, listener: Handler): void {\r\n if (!this._listeners) return;\r\n\r\n const listeners = this._listeners[event];\r\n if (listeners && listeners.has(listener)) {\r\n listeners.delete(listener);\r\n if (listeners.size === 0) {\r\n delete this._listeners[event];\r\n }\r\n }\r\n }\r\n\r\n notify(event: string, ...args: unknown[]): void {\r\n if (!this._listeners) return;\r\n const listeners = this._listeners[event];\r\n if (listeners) {\r\n for (const listener of [...listeners]) {\r\n try {\r\n listener(...args);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n }\r\n }\r\n}","import { Notifier } from \"./Notifier.js\";\nimport { Handler } from \"../types.js\"\n\nexport type ValueListener<T> = ((_value: T) => void) & Handler\nexport type ValueOrState<T> = T | State<T>\nexport class State<T> {\n private _value: T;\n readonly initialValue: T;\n private _notifier: Notifier | null = new Notifier();\n\n constructor(initialValue: T) {\n this.initialValue = initialValue;\n this._value = initialValue;\n }\n\n get(listener?: ValueListener<T>): T {\n if (listener) this.onChange(listener);\n return this._value;\n }\n\n set(newValue: T): void {\n if (!this._notifier) return;\n this._value = newValue;\n this._notifier.notify(\"change\", newValue);\n }\n\n reset(): void {\n this.set(this.initialValue);\n }\n\n onChange(listener: ValueListener<T>): () => void {\n if (!this._notifier) return () => { };\n return this._notifier.addListener(\"change\", listener);\n }\n\n _dispose(): void {\n if (this._notifier) {\n this._notifier._dispose();\n this._notifier = null;\n }\n }\n}","import { DomphyElement, HookMap, EventName, Handler } from \"./types.js\";\r\nimport { State } from \"./classes/State.js\"\r\nimport { deepClone, addEvent, addHook } from \"./helpers.js\"\r\n\r\nexport function merge(source: Record<string, any> = {}, target: Record<string, any> = {}): Record<string, any> {\r\n const comma = [\"animation\", \"transition\", \"boxShadow\", \"textShadow\", \"background\", \"fontFamily\"]\r\n const space = [\"class\", \"rel\", \"transform\", \"acceptCharset\", \"sandbox\"]\r\n const adjacent = [\"content\"]\r\n if (Object.prototype.toString.call(target) === \"[object Object]\" && Object.getPrototypeOf(target) === Object.prototype) { // plainjs not class instance\r\n target = deepClone(target)\r\n }\r\n\r\n for (const key in target) {\r\n\r\n const value = target[key];\r\n if (value === undefined || value === null || value === \"\") continue;\r\n\r\n if (typeof value === \"object\" && !Array.isArray(value)) {\r\n if (typeof source[key] === \"object\") {\r\n source[key] = merge(source[key], value);\r\n } else {\r\n source[key] = value;\r\n }\r\n\r\n } else {\r\n if (comma.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\", \")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\", \")\r\n }\r\n\r\n } else if (adjacent.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\"\")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\"\")\r\n }\r\n } else if (space.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\" \")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\" \")\r\n }\r\n } else if (key.startsWith(\"on\")) {\r\n let name = key.replace(\"on\", \"\").toLowerCase() as EventName\r\n addEvent(source as DomphyElement, name, value)\r\n } else if (key.startsWith(\"_on\")) {\r\n let name = key.replace(\"_on\", \"\") as keyof HookMap\r\n addHook(source as DomphyElement, name, value)\r\n } else {\r\n source[key] = value;\r\n }\r\n }\r\n }\r\n return source;\r\n}\r\n\r\nexport function toState<T>(val: T | State<T>): State<T> {\r\n return val instanceof State ? val : new State<T>(val);\r\n}\r\n\r\nexport function hashString(str: string = \"\"): string {\r\n let hash = 0x811c9dc5; // FNV-1a 32-bit offset basis\r\n for (let i = 0; i < str.length; i++) {\r\n hash ^= str.charCodeAt(i);\r\n hash = (hash * 0x01000193) >>> 0; // FNV prime, keep 32-bit unsigned\r\n }\r\n return String.fromCharCode(97 + (hash % 26)) + hash.toString(16);\r\n}","import { DomphyElement, PartialElement, HookMap, EventName, Handler, TagName } from \"./types.js\";\r\nimport { ElementNode } from \"./classes/ElementNode.js\"\r\nimport { State } from \"./classes/State.js\"\r\nimport { eventNameMap } from \"./types/EventProperties.js\"\r\nimport { HtmlTags } from \"./constants/HtmlTags.js\"\r\nimport {merge} from \"./utils.js\"\r\n\r\nexport function addHook<K extends keyof HookMap>(partial: PartialElement, hookName: K, handler: HookMap[K]): void {\r\n const hookProperty = `_on${hookName}` as keyof PartialElement;\r\n let current = partial[hookProperty];\r\n\r\n if (typeof current === \"function\") {\r\n (partial as any)[hookProperty] = (...args: any[]) => {\r\n (current as Function)(...args);\r\n (handler as Function)(...args);\r\n };\r\n } else {\r\n (partial as any)[hookProperty] = handler;\r\n }\r\n}\r\n\r\nexport function addEvent<K extends keyof HTMLElementEventMap>(\r\n attributes: PartialElement,\r\n eventName: K,\r\n handler: (event: HTMLElementEventMap[K], node: ElementNode) => void\r\n): void {\r\n const eventProperty = eventNameMap[eventName];\r\n if (!eventProperty) {\r\n throw Error(`invalid event name \"${eventName}\"`);\r\n }\r\n const current = (attributes as any)[eventProperty]\r\n\r\n if (typeof current == \"function\") {\r\n (attributes as any)[eventProperty] = (event: HTMLElementEventMap[K], node: ElementNode) => {\r\n current(event, node)\r\n handler(event, node);\r\n };\r\n } else {\r\n (attributes as any)[eventProperty] = handler\r\n }\r\n}\r\n\r\nexport function deepClone(value: any, seen = new WeakMap()): any {\r\n if (value === null || typeof value !== \"object\") return value;\r\n if (typeof value === \"function\") return value;\r\n if (seen.has(value)) return seen.get(value);\r\n\r\n const proto = Object.getPrototypeOf(value);\r\n if (proto !== Object.prototype && !Array.isArray(value)) return value; // ignore class instance\r\n\r\n let clone: any;\r\n\r\n if (Array.isArray(value)) {\r\n clone = [];\r\n seen.set(value, clone);\r\n for (const v of value) clone.push(deepClone(v, seen));\r\n return clone;\r\n }\r\n\r\n if (value instanceof Date) return new Date(value);\r\n if (value instanceof RegExp) return new RegExp(value);\r\n if (value instanceof Map) {\r\n clone = new Map();\r\n seen.set(value, clone);\r\n for (const [k, v] of value) clone.set(deepClone(k, seen), deepClone(v, seen));\r\n return clone;\r\n }\r\n if (value instanceof Set) {\r\n clone = new Set();\r\n seen.set(value, clone);\r\n for (const v of value) clone.add(deepClone(v, seen));\r\n return clone;\r\n }\r\n if (ArrayBuffer.isView(value)) {\r\n return new (value as any).constructor(value);\r\n }\r\n if (value instanceof ArrayBuffer) {\r\n return value.slice(0);\r\n }\r\n\r\n clone = Object.create(proto);\r\n seen.set(value, clone);\r\n\r\n for (const key of Reflect.ownKeys(value)) {\r\n clone[key] = deepClone(value[key], seen);\r\n }\r\n\r\n return clone;\r\n}\r\n\r\nexport function validate(element: DomphyElement | PartialElement, asPartial = false): boolean {\r\n if (Object.prototype.toString.call(element) !== \"[object Object]\") {\r\n throw Error(`typeof ${element} is invalid DomphyElement`);\r\n }\r\n let keys = Object.keys(element);\r\n for (let i = 0; i < keys.length; i++) {\r\n let key = keys[i];\r\n let val = element[key as keyof typeof element]\r\n if (i == 0 && !HtmlTags.includes(key) && !key.includes(\"-\") && !asPartial) { // web-component\r\n throw Error(`key ${key} is not valid HTML tag name`);\r\n } else if (key == \"style\" && val && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"style\" must be a object`);\r\n } else if (key == \"$\") {\r\n element.$!.forEach(v => validate(v as PartialElement, true))\r\n } else if (key.startsWith(\"_on\") && typeof val != \"function\") {\r\n throw Error(`hook ${key} value \"${val}\" must be a function `)\r\n } else if (key.startsWith(\"on\") && typeof val != \"function\") {\r\n throw Error(`event ${key} value \"${val}\" must be a function `);\r\n } else if (key == \"_portal\" && typeof val !== \"function\") {\r\n throw Error(`\"_portal\" must be a function return HTMLElement`);\r\n } else if (key == \"_context\" && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"_context\" must be a object`);\r\n } else if (key == \"_metadata\" && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"_metadata\" must be a object`);\r\n } else if (key == \"_key\" && (typeof val !== \"string\" && typeof val !== \"number\")) {\r\n throw Error(`\"_key\" must be a string or number`);\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport function isValid(element: DomphyElement): boolean {\r\n\r\n if (Array.isArray(element)) return false;\r\n if (!element || typeof element !== \"object\") return false;\r\n\r\n let keys = Object.keys(element);\r\n for (let i = 0; i < keys.length; i++) {\r\n let key = keys[i];\r\n let val = element[key as keyof typeof element];\r\n if (i == 0 && !HtmlTags.includes(key)) return false\r\n if (key === \"style\" && (val == null || typeof val !== \"object\" || Array.isArray(val))) return false;\r\n if (key.startsWith(\"_on\") && typeof val !== \"function\") return false;\r\n if (key.startsWith(\"on\") && typeof val !== \"function\") return false;\r\n if (key === \"_portalChildren\" && !Array.isArray(val)) return false;\r\n if ((key === \"_context\" || key === \"_metadata\") && (val == null || typeof val !== \"object\" || Array.isArray(val))) return false;\r\n }\r\n return true;\r\n}\r\n\r\nexport function isHTML(str: string): boolean {\r\n return /<([a-z][\\w-]*)(\\s[^>]*)?>.*<\\/\\1>|<([a-z][\\w-]*)(\\s[^>]*)?\\/>/i.test(str.trim());\r\n}\r\n\r\nexport function escapeHTML(str: string): string {\r\n return str\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#39;\");\r\n}\r\n\r\nexport function addClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => String(reactive(listener)) + \" \" + className\r\n } else {\r\n let current = element.class || \"\"\r\n let split = String(current).split(\" \")\r\n split.push(className)\r\n element.class = split.filter(e => e).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function removeClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => {\r\n let split = String(reactive(listener)).split(\" \")\r\n return split.filter(e => e != className).join(\" \")\r\n }\r\n } else {\r\n let split = String(element.class).split(\" \")\r\n element.class ||= \"\"\r\n element.class = split.filter(e => e != className).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function toggleClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => {\r\n let split = String(reactive(listener)).split(\" \")\r\n return split.includes(className) ? split.filter(e => e != className).join(\" \") : split.concat([className]).join(\" \")\r\n }\r\n } else {\r\n let split = String(element.class).split(\" \")\r\n element.class ||= \"\"\r\n element.class = split.includes(className) ? split.filter(e => e != className).join(\" \") : split.concat([className]).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function getTagName(element: DomphyElement): TagName | undefined {\r\n return Object.keys(element).find(e => HtmlTags.includes(e)) as TagName | undefined\r\n}\r\n\r\n\r\nexport function camelToKebab(str: string): string {\r\n return str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\r\n}\r\n\r\nexport function selectorSplitter(selectors: string) {\r\n if (selectors.indexOf('@') === 0) {\r\n return [selectors];\r\n }\r\n var splitted = [];\r\n var parens = 0;\r\n var angulars = 0;\r\n var soFar = '';\r\n for (var i = 0, len = selectors.length; i < len; i++) {\r\n var char = selectors[i];\r\n if (char === '(') {\r\n parens += 1;\r\n } else if (char === ')') {\r\n parens -= 1;\r\n } else if (char === '[') {\r\n angulars += 1;\r\n } else if (char === ']') {\r\n angulars -= 1;\r\n } else if (char === ',') {\r\n if (!parens && !angulars) {\r\n splitted.push(soFar.trim());\r\n soFar = '';\r\n continue;\r\n }\r\n }\r\n soFar += char;\r\n }\r\n splitted.push(soFar.trim());\r\n return splitted;\r\n};\r\n\r\nexport const mergePartial = (partial: PartialElement | DomphyElement): typeof partial => {\r\n\r\n if (Array.isArray(partial.$)) {\r\n let part: typeof partial = {}\r\n partial.$.forEach(p => merge(part, mergePartial(p)))\r\n delete partial.$\r\n merge(part, partial) // native win\r\n\r\n return part\r\n } else {\r\n return partial\r\n }\r\n}","export const VoidTags = [\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"source\",\n \"track\",\n \"wbr\",\n] as const;\n\nexport type VoidTagName = (typeof VoidTags)[number];\n\n","export const BooleanAttributes = [\n \"allowFullScreen\",\n \"async\",\n \"autoFocus\",\n \"autoPlay\",\n \"checked\",\n \"compact\",\n \"contentEditable\",\n \"controls\",\n \"declare\",\n \"default\",\n \"defer\",\n \"disabled\",\n \"formNoValidate\",\n \"hidden\",\n \"isMap\",\n \"itemScope\",\n \"loop\",\n \"multiple\",\n \"muted\",\n \"noHref\",\n \"noShade\",\n \"noValidate\",\n \"open\",\n \"playsInline\",\n \"readonly\",\n \"required\",\n \"reversed\",\n \"scoped\",\n \"selected\",\n \"sortable\",\n \"trueSpeed\",\n \"typeMustMatch\",\n \"wmode\",\n \"autoCapitalize\",\n \"translate\",\n \"spellCheck\",\n \"inert\",\n \"download\",\n \"noModule\",\n \"paused\",\n \"autoPictureInPicture\",\n] as const;","//browserslist query \"> 0.1%, not dead\"\nexport const PrefixCSS: Record<string, string[]> = {\n transform: [\"webkit\", \"ms\"],\n transition: [\"webkit\", \"ms\"],\n animation: [\"webkit\"],\n userSelect: [\"webkit\", \"ms\"],\n flexDirection: [\"webkit\", \"ms\"],\n flexWrap: [\"webkit\", \"ms\"],\n justifyContent: [\"webkit\", \"ms\"],\n alignItems: [\"webkit\", \"ms\"],\n alignSelf: [\"webkit\", \"ms\"],\n order: [\"webkit\", \"ms\"],\n flexGrow: [\"webkit\", \"ms\"],\n flexShrink: [\"webkit\", \"ms\"],\n flexBasis: [\"webkit\", \"ms\"],\n columns: [\"webkit\"],\n columnCount: [\"webkit\"],\n columnGap: [\"webkit\"],\n columnRule: [\"webkit\"],\n columnWidth: [\"webkit\"],\n boxSizing: [\"webkit\"],\n appearance: [\"webkit\", \"moz\"],\n filter: [\"webkit\"],\n backdropFilter: [\"webkit\"],\n clipPath: [\"webkit\"],\n mask: [\"webkit\"],\n maskImage: [\"webkit\"],\n textSizeAdjust: [\"webkit\", \"ms\"],\n hyphens: [\"webkit\", \"ms\"],\n writingMode: [\"webkit\", \"ms\"],\n gridTemplateColumns: [\"ms\"],\n gridTemplateRows: [\"ms\"],\n gridAutoColumns: [\"ms\"],\n gridAutoRows: [\"ms\"],\n gridColumn: [\"ms\"],\n gridRow: [\"ms\"],\n marginInlineStart: [\"webkit\"],\n marginInlineEnd: [\"webkit\"],\n paddingInlineStart: [\"webkit\"],\n paddingInlineEnd: [\"webkit\"],\n minInlineSize: [\"webkit\"],\n maxInlineSize: [\"webkit\"],\n minBlockSize: [\"webkit\"],\n maxBlockSize: [\"webkit\"],\n inlineSize: [\"webkit\"],\n blockSize: [\"webkit\"],\n tabSize: [\"moz\"],\n overscrollBehavior: [\"webkit\", \"ms\"],\n touchAction: [\"ms\"],\n resize: [\"webkit\"],\n printColorAdjust: [\"webkit\"],\n backgroundClip: [\"webkit\"],\n boxDecorationBreak: [\"webkit\"],\n overflowScrolling: [\"webkit\"],\n};\n","export const CamelAttributes: string[] = [\r\n \"viewBox\",\r\n \"preserveAspectRatio\",\r\n \"gradientTransform\",\r\n \"gradientUnits\",\r\n \"spreadMethod\",\r\n \"markerStart\",\r\n \"markerMid\",\r\n \"markerEnd\",\r\n \"markerHeight\",\r\n \"markerWidth\",\r\n \"markerUnits\",\r\n \"refX\",\r\n \"refY\",\r\n \"patternContentUnits\",\r\n \"patternTransform\",\r\n \"patternUnits\",\r\n \"filterUnits\",\r\n \"primitiveUnits\",\r\n \"kernelUnitLength\",\r\n \"clipPathUnits\",\r\n \"maskContentUnits\",\r\n \"maskUnits\"\r\n] as const\r\n","import { escapeHTML, camelToKebab } from \"../helpers.js\";\nimport { BooleanAttributes, CamelAttributes } from \"../constants.js\";\nimport type { ElementNode } from \"./ElementNode.js\"\nimport { type AttributeValue } from \"../types.js\"\n\nexport class ElementAttribute {\n readonly name: string;\n readonly isBoolean: boolean;\n value: any;\n parent: ElementNode;\n constructor(name: string, value: any, parent: any) {\n this.parent = parent;\n this.isBoolean = (BooleanAttributes as readonly string[]).includes(name);\n if (CamelAttributes.includes(name)) {\n this.name = name\n } else {\n this.name = camelToKebab(name)\n }\n this.value = undefined;\n this.set(value);\n }\n\n render(): void {\n if (!this.parent || !this.parent.domElement) return;\n const domElement = this.parent.domElement;\n\n const mutateAttrs = [\"value\"];\n if (this.isBoolean) {\n if (this.value === false || this.value == null) {\n domElement.removeAttribute(this.name)\n } else {\n domElement.setAttribute(this.name, this.value === true ? \"\" : this.value)\n }\n } else if (this.value == null) {\n domElement.removeAttribute(this.name);\n } else if (mutateAttrs.includes(this.name)) {\n (domElement as any)[this.name] = this.value;\n } else {\n domElement.setAttribute(this.name, this.value);\n }\n }\n\n set(value: AttributeValue): void {\n if (value == null) {\n this.value = null;\n this.render();\n return;\n }\n if (typeof value === \"string\" && /<\\/?[a-z][\\s\\S]*>/i.test(value)) {\n this.value = escapeHTML(value);\n } else if (typeof value == \"function\") {\n let listener: any = () => {\n if (!listener) return;\n this.value = this.isBoolean ? Boolean((value as Function)()) : (value as Function)();\n this.render();\n };\n\n listener.elementNode = this.parent!;\n\n listener.onSubscribe = (release: () => void) => {\n if (this.parent) {\n this.parent.addHook(\"BeforeRemove\", () => {\n release();\n listener = null;\n });\n }\n };\n\n this.value = this.isBoolean ? Boolean(value(listener)) : value(listener);\n } else {\n this.value = this.isBoolean ? Boolean(value) : value;\n }\n\n this.render();\n }\n\n remove(): void {\n if (this.parent && this.parent.attributes) {\n this.parent.attributes.remove(this.name);\n }\n this._dispose();\n }\n\n _dispose(): void {\n this.value = null;\n this.parent = null as any\n }\n\n generateHTML(): string {\n const { name, value } = this;\n if (this.isBoolean) {\n return value ? `${name}` : \"\";\n } else {\n const val = Array.isArray(value) ? JSON.stringify(value) : value;\n return `${name}=\"${escapeHTML(String(val))}\"`;\n }\n }\n}","import type { ElementNode } from \"./ElementNode.js\";\nimport { ElementAttribute } from \"./ElementAttribute.js\";\nimport { BooleanAttributes } from \"../constants.js\";\nimport { Notifier } from \"./Notifier.js\"\nimport { AttributeValue } from \"../types.js\"\n\nexport class AttributeList {\n _notifier = new Notifier()\n\n items: Record<string, ElementAttribute> | null = {};\n parent: ElementNode | null;\n\n constructor(parent: ElementNode) {\n this.parent = parent;\n }\n\n generateHTML(): string {\n if (!this.items) return \"\";\n const str = Object.values(this.items)\n .map((attr) => attr.generateHTML())\n .join(\" \");\n return str ? ` ${str}` : \"\";\n }\n\n get(name: string): any {\n if (!this.items) return undefined;\n return this.items[name]?.value;\n }\n\n set(name: string, value: AttributeValue): void {\n if (!this.items || !this.parent) return;\n\n if (this.items[name]) {\n this.items[name].set(value);\n this.parent.domElement && this._notifier.notify(name, this.items[name].value)\n } else {\n this.items[name] = new ElementAttribute(name, value, this.parent);\n }\n }\n\n onChange(name: string, callback: (value: string | number) => void): void {\n if (this.has(name) && this.parent?.domElement) {\n const handler = callback as any\n handler.onSubscribe = (release: () => void) => this.parent?.addHook(\"BeforeRemove\", release);\n this._notifier.addListener(name, handler)\n }\n }\n\n has(name: string): boolean {\n if (!this.items) return false;\n return Object.prototype.hasOwnProperty.call(this.items, name);\n }\n\n remove(name: string): void {\n if (!this.items) return;\n\n if (this.items[name]) {\n this.items[name]._dispose();\n delete this.items[name];\n }\n\n if (this.parent && this.parent.domElement && this.parent.domElement instanceof Element) {\n this.parent.domElement.removeAttribute(name);\n }\n }\n\n _dispose(): void {\n\n if (this.items) {\n for (const key in this.items) {\n this.items[key]._dispose();\n }\n }\n this._notifier._dispose()\n this.items = null;\n this.parent = null;\n }\n\n toggle(name: string, force?: boolean): void {\n if (\n !BooleanAttributes.includes(name as (typeof BooleanAttributes)[number])\n ) {\n throw Error(`${name} is not a boolean attribute`);\n }\n if (force === true) {\n this.set(name, true);\n } else if (force === false) {\n this.remove(name);\n } else {\n this.has(name) ? this.remove(name) : this.set(name, true);\n }\n }\n\n addClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n\n const add = (classes: string, newClass: string) => {\n const list = (classes || \"\").split(\" \").filter((e: string) => e);\n !list.includes(newClass) && list.push(className)\n return list.join(\" \")\n }\n\n let current = this.get(\"class\");\n\n if (typeof current === \"function\") {\n this.set(\"class\", () => add(current(), className));\n } else {\n this.set(\"class\", add(current, className))\n }\n }\n\n hasClass(className: string): boolean {\n if (!className || typeof className !== \"string\") return false;\n const current = this.get(\"class\") || \"\";\n const list = current.split(\" \").filter((e: string) => e);\n return list.includes(className);\n }\n\n toggleClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n this.hasClass(className)\n ? this.removeClass(className)\n : this.addClass(className);\n }\n\n removeClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n const current = this.get(\"class\") || \"\";\n const list: string[] = current.split(\" \").filter((e: string) => e);\n const updated = list.filter((cls) => cls !== className);\n updated.length > 0\n ? this.set(\"class\", updated.join(\" \"))\n : this.remove(\"class\");\n }\n\n replaceClass(oldClass: string, newClass: string): void {\n if (\n !oldClass ||\n !newClass ||\n typeof oldClass !== \"string\" ||\n typeof newClass !== \"string\"\n )\n return;\n if (this.hasClass(oldClass)) {\n this.removeClass(oldClass);\n this.addClass(newClass);\n }\n }\n}","import { ElementNode } from \"./ElementNode.js\";\nimport { isHTML } from \"../helpers.js\";\n\nexport class TextNode {\n type = \"TextNode\"\n parent: ElementNode;\n text: string;\n domText?: ChildNode;\n\n constructor(textContent: string | number, parent: ElementNode) {\n this.parent = parent;\n this.text = textContent === \"\" ? \"\\u200B\" : String(textContent);\n }\n _createDOMNode() {\n let newNode: ChildNode;\n if (isHTML(this.text)) {\n const tpl = document.createElement(\"template\");\n tpl.innerHTML = this.text.trim();\n newNode = tpl.content.firstChild || document.createTextNode(\"\");\n } else {\n newNode = document.createTextNode(this.text);\n }\n this.domText = newNode;\n return newNode;\n }\n\n _dispose(): void {\n this.domText = undefined;\n this.text = \"\";\n }\n\n generateHTML(): string {\n return this.text === \"\\u200B\" ? \"&#8203;\" : this.text;\n }\n\n render(domText: ChildNode | DocumentFragment | HTMLElement): void {\n const newNode = this._createDOMNode();\n domText.appendChild(newNode);\n }\n}","import { TextNode } from \"./TextNode.js\";\nimport { ElementNode } from \"./ElementNode.js\";\nimport type { DomphyElement } from \"../types.js\";\n\ntype ElementInput = DomphyElement | null | undefined | number | string\ntype NodeItem = ElementNode | TextNode;\n\nexport class ElementList {\n items: NodeItem[] = [];\n owner: ElementNode;\n\n constructor(parent: ElementNode) {\n this.owner = parent;\n }\n\n _createNode(element: ElementInput | DomphyElement, index = 0): NodeItem {\n return (typeof element === \"object\" && element !== null)\n ? new ElementNode(element, this.owner, index)\n : new TextNode(element == null ? \"\" : String(element), this.owner);\n }\n\n _moveDomElement(node: NodeItem, index: number) {\n if (!this.owner || !this.owner.domElement) return;\n const dom = this.owner.domElement;\n\n const el = node instanceof ElementNode ? node.domElement : node.domText;\n if (el) {\n const currentRef = dom.childNodes[index] || null;\n if (el !== currentRef) {\n dom.insertBefore(el, currentRef);\n }\n }\n }\n\n _swapDomElement(aNode: NodeItem, bNode: NodeItem) {\n if (!this.owner || !this.owner.domElement) return;\n const parent = this.owner.domElement;\n\n const a = aNode instanceof ElementNode ? aNode.domElement : aNode.domText;\n const b = bNode instanceof ElementNode ? bNode.domElement : bNode.domText;\n if (!a || !b) return;\n\n const aNext = a.nextSibling;\n const bNext = b.nextSibling;\n\n parent.insertBefore(a, bNext);\n parent.insertBefore(b, aNext);\n }\n\n update(inputs: ElementInput[], updateDom = true, silent = false): void {\n\n const oldItems = this.items.slice(); // snapshot for cleanup\n\n // keyed lookup from old list\n const keyed = new Map<string | number, NodeItem>();\n for (const item of oldItems) {\n if (item instanceof ElementNode && item.key !== null && item.key !== undefined) {\n keyed.set(item.key, item);\n }\n }\n\n if (!silent && this.owner.domElement) this.owner._hooks?.BeforeUpdate?.(this.owner, inputs);\n // build target order using existing ops (mutating this.items)\n for (let i = 0; i < inputs.length; i++) {\n const input = inputs[i];\n const key =\n (typeof input === \"object\" && input !== null) ? (input as any)._key : undefined;\n\n if (key !== undefined) {\n const reused = keyed.get(key);\n if (reused) {\n keyed.delete(key);\n\n const cur = this.items.indexOf(reused);\n if (cur !== i && cur >= 0) {\n const isPortal = reused instanceof ElementNode && !!reused._portal;\n this.move(cur, i, isPortal ? false : updateDom, true);\n }\n reused.parent = this.owner as any;\n continue;\n }\n }\n\n this.insert(input, i, updateDom, true);\n }\n\n while (this.items.length > inputs.length) {\n this.remove(this.items[this.items.length - 1], updateDom, true);\n }\n keyed.forEach((node) => this.remove(node, updateDom, true));\n if (!silent) this.owner._hooks?.Update?.(this.owner);\n }\n\n insert(input: ElementInput, index?: number, updateDom = true, silent = false): NodeItem {\n\n let length = this.items.length;\n const finalIndex = (typeof index !== \"number\" || isNaN(index) || index < 0 || index > length)\n ? length\n : index;\n const item = this._createNode(input, finalIndex);\n this.items.splice(finalIndex, 0, item);\n\n if (item instanceof ElementNode) {\n //Parent always insert/mount before children\n item._hooks.Insert && item._hooks.Insert(item)\n\n let domElement = this.owner.domElement;\n if (updateDom && domElement) {\n\n\n if (item._portal) {\n let domElement = item._portal!(this.owner.getRoot())\n domElement && item.render(domElement)\n } else {\n let domNode = item._createDOMNode();\n const ref = domElement.childNodes[finalIndex] ?? null;\n domElement.insertBefore(domNode, ref);\n let root = domElement.getRootNode()\n const styleParent = root instanceof ShadowRoot ? root : document.head\n let domStyle = styleParent.querySelector(\"#domphy-style\") as HTMLStyleElement;\n item.styles.render(domStyle as HTMLStyleElement)\n item._hooks.Mount && item._hooks.Mount(item)\n item.children.items.forEach(child => {\n if (child instanceof ElementNode && child._portal) {\n let dom = child._portal!(child.getRoot())\n dom && child.render(dom)\n } else {\n child.render(domNode)\n }\n })\n }\n }\n\n\n\n } else {\n let domElement = this.owner.domElement;\n if (updateDom && domElement) {\n let domNode = item._createDOMNode();\n const ref = domElement.childNodes[finalIndex] ?? null;\n domElement.insertBefore(domNode, ref);\n }\n }\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\n return item;\n }\n\n remove(item: NodeItem, updateDom = true, silent = false): void {\n\n const index = this.items.indexOf(item);\n if (index < 0) return;\n\n if (item instanceof ElementNode) {\n const done = () => {\n const el = item.domElement\n this.items.splice(index, 1);\n updateDom && el && el.remove()\n item._hooks?.Remove?.(item)\n item._dispose();\n }\n if (item._hooks && item._hooks.BeforeRemove && item.domElement) {\n item._hooks.BeforeRemove(item, done)\n } else {\n done()\n }\n\n } else {\n const el = item.domText\n this.items.splice(index, 1);\n updateDom && el && el.remove()\n item._dispose();\n }\n\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\n }\n\n clear(updateDom = true, silent = false): void {\n if (this.items.length === 0) return;\n const snapshot = this.items.slice();\n\n for (const item of snapshot) {\n this.remove(item, updateDom, true);\n }\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\n }\n\n _dispose(): void {\n this.items = [];\n }\n\n swap(aIndex: number, bIndex: number, updateDom = true, silent = false) {\n if (aIndex < 0 || bIndex < 0 ||\n aIndex >= this.items.length || bIndex >= this.items.length ||\n aIndex === bIndex) return;\n\n const itemA = this.items[aIndex];\n const itemB = this.items[bIndex];\n\n this.items[aIndex] = itemB;\n this.items[bIndex] = itemA;\n\n if (updateDom) this._swapDomElement(itemA, itemB);\n\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\n }\n\n move(fromIndex: number, toIndex: number, updateDom = true, silent = false): void {\n if (fromIndex < 0 || fromIndex >= this.items.length ||\n toIndex < 0 || toIndex >= this.items.length || fromIndex === toIndex) return;\n\n const item = this.items[fromIndex];\n\n this.items.splice(fromIndex, 1);\n this.items.splice(toIndex, 0, item);\n\n if (updateDom) this._moveDomElement(item, toIndex);\n\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\n }\n\n generateHTML(): string {\n let html = \"\";\n for (const item of this.items) html += item.generateHTML();\n return html;\n }\n}","import type { StyleRule } from \"./StyleRule.js\";\nimport type { StyleValue } from \"../types.js\";\nimport { camelToKebab } from \"../helpers.js\";\nimport { PrefixCSS } from \"../constants.js\";\n\nexport class StyleProperty {\n name: string;\n cssName: string;\n value: StyleValue = \"\";\n parentRule: StyleRule;\n\n constructor(name: string, value: StyleValue, parentRule: StyleRule) {\n this.name = name;\n this.cssName = camelToKebab(name);\n this.parentRule = parentRule;\n this.set(value);\n }\n\n _domUpdate(): void {\n if (!this.parentRule) return;\n const domRule = this.parentRule.domRule;\n\n if (domRule && (domRule as CSSStyleRule).style) {\n let style: CSSStyleDeclaration = (domRule as CSSStyleRule).style;\n style.setProperty(this.cssName, String(this.value));\n\n if (PrefixCSS[this.name]) {\n PrefixCSS[this.name].forEach((prefix) => {\n style.setProperty(`-${prefix}-${this.cssName}`, String(this.value));\n });\n }\n }\n }\n _dispose(): void {\n this.value = \"\";\n this.parentRule = null as any;\n }\n\n set(value: StyleValue): void {\n\n if (typeof value === \"function\") {\n let Listener: any = () => {\n if (!Listener) return;\n this.value = value(Listener);\n this._domUpdate();\n }\n\n Listener.onSubscribe = (release: () => void) => {\n this.parentRule.parentNode?.addHook(\"BeforeRemove\", () => {\n release();\n Listener = null;\n });\n };\n\n Listener.elementNode = this.parentRule!.root;\n this.value = value(Listener);\n } else {\n this.value = value;\n }\n\n this._domUpdate();\n }\n\n remove(): void {\n if (!this.parentRule) return;\n\n if (this.parentRule.domRule instanceof CSSStyleRule) {\n const domStyle = this.parentRule.domRule.style;\n domStyle.removeProperty(this.cssName);\n\n if (PrefixCSS[this.name]) {\n PrefixCSS[this.name].forEach((prefix) => {\n domStyle.removeProperty(`-${prefix}-${this.cssName}`);\n });\n }\n }\n delete this.parentRule.styleBlock![this.name];\n this._dispose();\n }\n\n cssText(): string {\n let str = `${this.cssName}: ${this.value}`;\n if (PrefixCSS[this.name]) {\n PrefixCSS[this.name].forEach((prefix) => {\n str += `; -${prefix}-${this.cssName}: ${this.value}`;\n });\n }\n return str;\n }\n}","import { ElementNode } from \"./ElementNode.js\";\nimport { StyleProperty } from \"./StyleProperty.js\";\nimport { StyleList } from \"./StyleList.js\";\n\nexport class StyleRule {\n selectorText: string;\n domRule: CSSRule | CSSMediaRule | CSSKeyframesRule | null = null;\n styleList: StyleList | null;\n styleBlock: Record<string, StyleProperty> | null = {};\n parent: StyleRule | ElementNode | null;\n\n constructor(selectorText: string, parent: StyleRule | ElementNode) {\n this.selectorText = selectorText;\n this.styleList = new StyleList(this);\n this.parent = parent;\n }\n\n _dispose(): void {\n\n if (this.styleBlock) {\n for (const prop of Object.values(this.styleBlock)) {\n prop._dispose();\n }\n }\n\n if (this.styleList) {\n this.styleList._dispose();\n }\n\n this.styleBlock = null;\n this.styleList = null;\n this.domRule = null;\n this.parent = null;\n }\n\n get root() {\n let node = this.parent;\n while (node instanceof StyleRule) {\n node = node.parent;\n }\n return node;\n }\n\n get parentNode(): ElementNode | null {\n let root: any = this.parent;\n while (root && root instanceof StyleRule) {\n root = root.parent;\n }\n return root as ElementNode;\n }\n \n insertStyle(name: string, val: any): void {\n if (!this.styleBlock) return;\n if (this.styleBlock[name]) {\n this.styleBlock[name].set(val);\n } else {\n this.styleBlock[name] = new StyleProperty(name, val, this);\n }\n }\n\n removeStyle(name: string): void {\n if (!this.styleBlock) return;\n if (this.styleBlock[name]) {\n this.styleBlock[name].remove();\n }\n }\n\n cssText(): string {\n if (!this.styleBlock || !this.styleList) return \"\";\n const styleStr = Object.values(this.styleBlock).map(decl => decl.cssText()).join(\";\");\n const nested = this.styleList.cssText();\n return `${this.selectorText} { ${styleStr} ${nested} } `;\n }\n\n mount(domRule: CSSRule | CSSKeyframesRule): void {\n if (!domRule || !this.styleList) return;\n this.domRule = domRule;\n if (\"cssRules\" in domRule) {\n this.styleList.mount(domRule.cssRules as CSSRuleList);\n }\n }\n\n remove(): void {\n\n if (this.domRule && this.domRule.parentStyleSheet) {\n const sheet = this.domRule.parentStyleSheet;\n const rules = sheet.cssRules;\n for (let i = 0; i < rules.length; i++) {\n if (rules[i] === this.domRule) {\n sheet.deleteRule(i);\n break;\n }\n }\n }\n this._dispose();\n }\n\n render(domSheet: CSSStyleSheet | CSSGroupingRule) {\n if (!this.styleBlock || !this.styleList) return;\n const styleStr = Object.values(this.styleBlock).map(decl => decl.cssText()).join(\";\");\n try {\n if (!this.selectorText.startsWith(\"@\")) {\n const css = `${this.selectorText} { ${styleStr} }`;\n const index = domSheet.insertRule(css, domSheet.cssRules.length);\n const domRule = domSheet.cssRules[index];\n if (domRule && \"selectorText\" in domRule) {\n this.mount(domRule);\n }\n } else if (/^@(media|supports|container|layer)\\b/.test(this.selectorText)) {\n const index = domSheet.insertRule(`${this.selectorText} {}`, domSheet.cssRules.length);\n const domRule = domSheet.cssRules[index];\n if (\"cssRules\" in domRule) {\n this.mount(domRule as CSSGroupingRule);\n this.styleList.render(domRule as CSSGroupingRule);\n }\n } else if (this.selectorText.startsWith(\"@keyframes\") || this.selectorText.startsWith(\"@font-face\")) {\n const css = this.cssText();\n const index = domSheet.insertRule(css, domSheet.cssRules.length);\n const domRule = domSheet.cssRules[index];\n this.mount(domRule);\n }\n } catch (err) {\n console.warn(\"Failed to insert rule:\", this.selectorText, err);\n }\n }\n}","import { ElementNode } from \"./ElementNode.js\";\nimport { selectorSplitter } from \"../helpers.js\";\nimport { StyleRule } from \"./StyleRule.js\";\n\nexport class StyleList {\n parent: StyleRule | ElementNode | null;\n items: StyleRule[] = [];\n domStyle: HTMLStyleElement | null = null;\n\n constructor(parent: StyleRule | ElementNode) {\n this.parent = parent;\n }\n\n get parentNode(): ElementNode | null {\n let root: any = this.parent;\n while (root && root instanceof StyleRule) {\n root = root.parent;\n }\n return root as ElementNode;\n }\n\n addCSS(obj: Record<string, any>, parentSelector: string = \"\"): void {\n if (!this.items || !this.parent) return;\n const basic: Record<string, any> = {};\n\n function getSelector(selector: string, prev: string): string {\n return selector.startsWith(\"&\")\n ? `${prev}${selector.slice(1)}`\n : `${prev} ${selector}`;\n }\n\n for (const selector in obj) {\n const value = obj[selector];\n let splitKeys = selectorSplitter(selector);\n for (let key of splitKeys) {\n const currentSelector = getSelector(key, parentSelector);\n if (/^@(container|layer|supports|media)\\b/.test(key)) {\n if (typeof value === \"object\" && value != null) {\n const rule = new StyleRule(key, this.parent);\n rule.styleList!.addCSS(value, parentSelector);\n this.items.push(rule);\n }\n } else if (key.startsWith(\"@keyframes\")) {\n const rule = new StyleRule(key, this.parent);\n rule.styleList!.addCSS(value, \"\");\n this.items.push(rule);\n } else if (key.startsWith(\"@font-face\")) {\n const rule = new StyleRule(key, this.parent);\n for (const k in value) rule.insertStyle(k, value[k]);\n this.items.push(rule);\n } else if (typeof value === \"object\" && value != null) {\n const rule = new StyleRule(currentSelector, this.parent);\n this.items.push(rule);\n for (const [k, v] of Object.entries(value)) {\n if (typeof v === \"object\" && v != null) {\n let newSelector = getSelector(k, currentSelector);\n if (k.startsWith(\"&\")) {\n this.addCSS(v, newSelector);\n } else {\n const r = rule.styleList!.insertRule(newSelector);\n r.styleList!.addCSS(v, newSelector);\n }\n } else {\n rule.insertStyle(k, v);\n }\n }\n } else {\n basic[key] = value;\n }\n }\n }\n\n if (Object.keys(basic).length) {\n const rule = new StyleRule(parentSelector, this.parent);\n for (const key in basic) rule.insertStyle(key, basic[key]);\n this.items.push(rule);\n }\n }\n\n cssText(): string {\n if (!this.items) return \"\";\n return this.items.map((rule) => rule.cssText()).join(\"\");\n }\n\n insertRule(selector: string): StyleRule {\n if (!this.items || !this.parent) return null as any;\n let rule = this.items.find((rule) => rule.selectorText === selector);\n if (!rule) {\n rule = new StyleRule(selector, this.parent);\n this.items.push(rule);\n }\n return rule;\n }\n\n mount(domRuleList: CSSRuleList): void {\n if (!this.items) return;\n if (!domRuleList) throw Error(\"Require domRuleList argument\");\n let wrongCount = 0;\n const fixOddEven = (css: string) => css.replace(\"(odd)\", \"(2n+1)\").replace(\"(even)\", \"(2n)\");\n\n this.items.forEach((rule, i) => {\n const index = i - wrongCount;\n const domRule = domRuleList[index];\n if (!domRule) return;\n if (rule.selectorText.startsWith(\"@\") && domRule instanceof CSSKeyframesRule) {\n rule.mount(domRule);\n } else if (\"keyText\" in domRule) {\n rule.mount(domRule);\n } else if (\"selectorText\" in domRule) {\n if (domRule.selectorText !== fixOddEven(rule.selectorText)) {\n wrongCount += 1;\n } else {\n rule.mount(domRule);\n }\n } else if (\"cssRules\" in domRule) {\n rule.mount(domRule as CSSMediaRule);\n }\n });\n }\n\n render(dom: HTMLStyleElement | CSSGroupingRule) {\n if (dom instanceof HTMLStyleElement) {\n this.domStyle = dom\n this.items.forEach((rule) => rule.render(dom.sheet!));\n } else if (dom instanceof CSSGroupingRule) {\n this.items.forEach((rule) => rule.render(dom));\n }\n }\n\n _dispose(): void {\n\n if (this.items) {\n for (let i = 0; i < this.items.length; i++) {\n this.items[i]._dispose();\n }\n }\n\n this.items = [];\n this.parent = null;\n this.domStyle = null;\n }\n}\n","import type { DomphyElement, EventName, HookMap, TagName, PartialElement } from \"../types.js\";\nimport { AttributeList } from \"./AttributeList.js\";\nimport { ElementList } from \"./ElementList.js\";\nimport { StyleList } from \"./StyleList.js\";\nimport { validate, mergePartial, getTagName, deepClone } from \"../helpers.js\";\nimport { merge, hashString } from \"../utils.js\";\n\nexport class ElementNode {\n type = \"ElementNode\"\n parent: ElementNode | null = null;\n _portal?: (root: ElementNode) => HTMLElement;\n tagName: TagName;\n children = new ElementList(this);\n styles = new StyleList(this);\n attributes = new AttributeList(this);\n domElement?: HTMLElement | null = null;\n _hooks: HookMap = {};\n _events?: { [K in EventName]?: (event: Event, node: ElementNode) => void } | null = null;\n _context?: Record<string, any> = {};\n _metadata?: Record<string, any> = {};\n key?: string | number | null = null;\n nodeId: string\n\n constructor(domphyElement: DomphyElement, _parent: ElementNode | null = null, index = 0) {\n domphyElement = deepClone(domphyElement)\n validate(domphyElement)\n domphyElement.style = domphyElement.style || {}\n this.parent = _parent;\n this.tagName = getTagName(domphyElement) as TagName;\n domphyElement = mergePartial(domphyElement) as DomphyElement\n\n this.key = (domphyElement as any)._key ?? null;\n this._context = domphyElement._context || {}\n this._metadata = domphyElement._metadata || {}\n\n let tempPath = `${this.parent?.getPath()}.${index}`\n const str = JSON.stringify(domphyElement.style || {}, (k, v) => typeof v === \"function\" ? tempPath : v,);\n this.nodeId = hashString(tempPath + str)\n\n this.attributes!.addClass(`${this.tagName}_${this.nodeId}`);\n\n if (domphyElement._onSchedule) domphyElement._onSchedule(this, domphyElement)\n\n this.merge(domphyElement)\n\n const children = (domphyElement as any)[this.tagName];\n\n if (children != null && children != undefined) {\n if (typeof children === \"function\") {\n let listener: any = () => {\n let input = children(listener)\n this.children!.update(Array.isArray(input) ? input : [input])\n }\n listener!.elementNode = this;\n listener!.onSubscribe = (release: () => void) => this.addHook(\"BeforeRemove\", () => {\n release()\n listener = null\n });\n listener && listener();\n } else {\n this.children!.update(Array.isArray(children) ? children : [children])\n }\n }\n this._hooks.Init && this._hooks.Init(this)\n }\n\n _createDOMNode() {\n const svgNamespace = \"http://www.w3.org/2000/svg\"\n const svgTags = [\"svg\", \"circle\", \"path\", \"rect\", \"ellipse\",\n \"line\", \"polyline\", \"polygon\", \"g\", \"defs\",\n \"use\", \"symbol\", \"linearGradient\", \"radialGradient\",\n \"stop\", \"clipPath\", \"mask\", \"filter\", \"text\",\n \"tspan\", \"textPath\", \"image\", \"pattern\", \"marker\",\n \"animate\", \"animateTransform\", \"animateMotion\",\n \"feGaussianBlur\", \"feComposite\", \"feColorMatrix\",\n \"feMerge\", \"feMergeNode\", \"feOffset\", \"feFlood\",\n \"feBlend\", \"foreignObject\"]\n\n let node = svgTags.includes(this.tagName)\n ? document.createElementNS(svgNamespace, this.tagName)\n : document.createElement(this.tagName)\n\n this.domElement = node as HTMLElement\n\n if (this._events) {\n for (const key in this._events) {\n const eventName = key as EventName;\n const handler = this._events[eventName] as (event: Event, node: ElementNode) => void;\n let fn: any = (event: Event) => handler(event, this)\n node.addEventListener(eventName, fn)\n this.addHook(\"BeforeRemove\", (n) => {\n n.domElement!.removeEventListener(eventName, fn)\n fn = null\n })\n }\n }\n\n if (this.attributes) {\n Object.values(this.attributes.items!).forEach(attr => attr.render())\n }\n return node\n }\n\n _dispose(): void {\n\n if (this.children) {\n this.children._dispose();\n }\n\n if (this.styles) {\n this.styles.items!.forEach((rule) => rule.remove());\n this.styles._dispose();\n }\n\n if (this.attributes) {\n this.attributes._dispose();\n }\n\n this.domElement = null;\n this._hooks = {};\n this._events = null;\n this._context = {};\n this._metadata = {};\n this.parent = null;\n }\n get pathId(): string {\n return hashString(this.getPath())\n }\n merge(part: PartialElement) {\n merge(this._context, part._context)\n merge(this._metadata, part._metadata)\n\n const keys = Object.keys(part)\n for (let i = 0; i < keys.length; i++) {\n const originalKey = keys[i];\n const value = (part as any)[originalKey];\n if ([\"$\", \"_onSchedule\", \"_key\", \"_context\", \"_metadata\", \"style\", this.tagName].includes(originalKey)) {\n continue\n } else if ([\"_onInit\", \"_onInsert\", \"_onMount\", \"_onBeforeUpdate\", \"_onUpdate\", \"_onBeforeRemove\", \"_onRemove\"].includes(originalKey)) {\n this.addHook(originalKey.substring(3) as keyof HookMap, value);\n } else if (originalKey.startsWith(\"on\")) {\n this.addEvent(originalKey.substring(2).toLowerCase() as EventName, value);\n } else if (originalKey == \"_portal\") {\n this._portal = value\n } else if (originalKey == \"class\" && typeof value === \"string\") {\n this.attributes!.addClass(value);\n } else {\n this.attributes!.set(originalKey, value);\n }\n }\n if (part.style) {\n this.styles.addCSS(part.style || {}, `.${`${this.tagName}_${this.nodeId}`}`);\n }\n\n }\n getPath(): string {\n let path: number[] = []\n let node: ElementNode = this\n while (node && node.parent) {\n const parent = node.parent\n const index = parent.children!.items.indexOf(node)\n path.push(index)\n node = parent\n }\n return path.reverse().join(\".\")\n }\n\n addEvent(name: EventName, callback: (event: Event, node: ElementNode) => void): void {\n\n this._events = this._events || {}\n\n let current = this._events[name]\n if (typeof current == \"function\") {\n this._events[name] = (event: Event, node: ElementNode) => {\n current!(event, node)\n callback(event, node)\n }\n } else {\n this._events[name] = callback\n }\n }\n\n addHook<K extends keyof HookMap>(name: K, callback: HookMap[K]): void {\n const current = this._hooks[name];\n\n if (typeof current === \"function\") {\n this._hooks[name] = ((...args: any[]) => {\n (current as Function)(...args);\n (callback as Function)(...args);\n }) as HookMap[K];\n } else {\n this._hooks[name] = callback;\n }\n }\n getRoot(): ElementNode {\n let root: ElementNode = this;\n while (root && root instanceof ElementNode && root.parent) {\n root = root.parent;\n }\n return root\n }\n\n getContext(name: string): any {\n let node: ElementNode | null = this;\n while (node && (!node._context || !Object.prototype.hasOwnProperty.call(node._context, name))) {\n node = node.parent;\n }\n return node && node._context ? node._context[name] : undefined;\n }\n\n setContext(name: string, value: any) {\n this._context = this._context || {}\n this._context[name] = value;\n }\n\n getMetadata(name: string): any {\n return this._metadata ? this._metadata[name] : undefined;\n }\n\n setMetadata(key: string, value: any) {\n this._metadata = this._metadata || {}\n this._metadata[key] = value;\n\n }\n\n generateCSS(): string {\n if (!this.styles || !this.children) return \"\";\n let css = this.styles.cssText()\n css += this.children.items.map(child => child instanceof ElementNode ? child.generateCSS() : \"\").join(\"\")\n return css\n }\n\n generateHTML(): string {\n if (!this.children || !this.attributes) return \"\";\n let content = this.children.generateHTML();\n const attributes = this.attributes.generateHTML();\n return `<${this.tagName}${attributes}>${content}</${this.tagName}>`;\n }\n\n mount(domElement: HTMLElement, domStyle?: HTMLStyleElement): void {\n if (!domElement) throw new Error(\"Missing dom node on bind\");\n this.domElement = domElement;\n\n if (this._events) {\n for (const key in this._events) {\n const eventName = key as EventName;\n const handler = this._events[eventName] as (event: Event, node: ElementNode) => void;\n let fn: any = (event: Event) => handler(event, this)\n domElement.addEventListener(eventName, fn)\n this.addHook(\"BeforeRemove\", (n) => {\n n.domElement!.removeEventListener(eventName, fn)\n fn = null\n })\n }\n }\n\n if (this.children) {\n this.children.items.forEach((child, i) => {\n const childNode = domElement.childNodes[i];\n if (childNode instanceof Node && child instanceof ElementNode) {\n child.mount(childNode as HTMLElement, domStyle);\n }\n });\n }\n\n this._hooks.Mount && this._hooks.Mount(this)\n }\n\n render(domElement: HTMLElement | SVGElement | DocumentFragment, domStyle: HTMLStyleElement | null = null): HTMLElement | SVGElement {\n const newNode = this._createDOMNode();\n domElement.appendChild(newNode)\n this._hooks.Mount && this._hooks.Mount(this)\n domStyle ||= this.getRoot().styles.domStyle\n let root = domElement.getRootNode()\n const styleParent = root instanceof ShadowRoot ? root : document.head\n domStyle ||= styleParent.querySelector(\"#domphy-style\") as HTMLStyleElement;\n if (!domStyle) {\n domStyle = document.createElement(\"style\");\n domStyle.id = \"domphy-style\";\n styleParent.appendChild(domStyle);\n }\n this.styles.render(domStyle as HTMLStyleElement)\n this.children.items.forEach(child => {\n if (child instanceof ElementNode && child._portal) {\n let dom = child._portal!(this.getRoot())\n dom && child.render(dom)\n } else {\n child.render(newNode)\n }\n })\n return newNode;\n }\n\n remove() {\n if (this.parent) {\n this.parent.children.remove(this)\n\n } else {\n this.domElement?.remove()\n this._dispose();\n }\n }\n}\n","export * from \"./size.js\"\nexport * from \"./tone.js\"\nexport * from \"./theme.js\"","import { ThemeInput } from \"./types.js\";\r\n\r\nlet light: ThemeInput = {\r\n direction: \"darken\",\r\n colors: {\r\n highlight: [\"#ffffff\", \"#fcf4d6\", \"#fddc69\", \"#f1c21b\", \"#d2a106\", \"#b28600\", \"#8e6a00\", \"#684e00\", \"#483700\", \"#302400\", \"#1c1500\", \"#000000\"],\r\n warning: [\"#ffffff\", \"#fff2e8\", \"#ffd9be\", \"#ffb784\", \"#ff832b\", \"#eb6200\", \"#ba4e00\", \"#8a3800\", \"#5e2900\", \"#3e1a00\", \"#231000\", \"#000000\"],\r\n error: [\"#ffffff\", \"#fff1f1\", \"#ffd7d9\", \"#ffb3b8\", \"#ff8389\", \"#fa4d56\", \"#da1e28\", \"#a2191f\", \"#750e13\", \"#520408\", \"#2d0709\", \"#000000\"],\r\n danger: [\"#ffffff\", \"#fff1f1\", \"#ffd7d9\", \"#ffb3b8\", \"#ff8389\", \"#fa4d56\", \"#da1e28\", \"#a2191f\", \"#750e13\", \"#520408\", \"#2d0709\", \"#000000\"],\r\n secondary: [\"#ffffff\", \"#fff0f7\", \"#ffd6e8\", \"#ffafd2\", \"#ff7eb6\", \"#ee5396\", \"#d02670\", \"#9f1853\", \"#740937\", \"#510224\", \"#2a0a18\", \"#000000\"],\r\n primary: [\"#ffffff\", \"#edf5ff\", \"#d0e2ff\", \"#a6c8ff\", \"#78a9ff\", \"#4589ff\", \"#0f62fe\", \"#0043ce\", \"#002d9c\", \"#001d6c\", \"#001141\", \"#000000\"],\r\n info: [\"#ffffff\", \"#e5f6ff\", \"#bae6ff\", \"#82cfff\", \"#33b1ff\", \"#1192e8\", \"#0072c3\", \"#00539a\", \"#003a6d\", \"#012749\", \"#061727\", \"#000000\"],\r\n success: [\"#ffffff\", \"#defbe6\", \"#a7f0ba\", \"#6fdc8c\", \"#42be65\", \"#24a148\", \"#198038\", \"#0e6027\", \"#044317\", \"#022d0d\", \"#071908\", \"#000000\"],\r\n neutral: [\"#ffffff\", \"#f4f4f4\", \"#e0e0e0\", \"#c6c6c6\", \"#a8a8a8\", \"#8d8d8d\", \"#6f6f6f\", \"#525252\", \"#393939\", \"#262626\", \"#161616\", \"#000000\"],\r\n },\r\n baseTones: {\r\n highlight: 3,\r\n warning: 4,\r\n error: 5,\r\n secondary: 5,\r\n primary: 6,\r\n info: 5,\r\n success: 5,\r\n neutral: 5,\r\n },\r\n fontSizes: [\"0.75rem\", \"0.875rem\", \"1rem\", \"1.25rem\", \"1.5625rem\", \"1.9375rem\", \"2.4375rem\", \"3.0625rem\"],\r\n// pixels: 12 | 14 | 16 | 20 | 25 | 31 | 39 | 49\r\n custom: {},\r\n}\r\n\r\nexport default light\r\n","import { ElementNode, Listener } from \"@domphy/core\";\nimport { ThemeInput, ThemeVars } from \"./types.js\";\nimport light from \"./light.js\";\n\nconst themes: Record<string, ThemeInput> = {\n light: JSON.parse(JSON.stringify(light)),\n dark: createDark(light),\n};\n\n// --- Validation ---\n\nfunction validateTheme(partial: Partial<ThemeInput>): void {\n for (let key in partial) {\n if (!Object.keys(light).includes(key as keyof ThemeInput)) {\n throw new Error(`Invalid key: ${key}`);\n }\n }\n if (partial.fontSizes && !Array.isArray(partial.fontSizes)) {\n throw new Error(`fontSize must be array of string`);\n }\n if (\"custom\" in partial) {\n const custom = partial.custom!;\n if (typeof custom !== \"object\" || custom === null) {\n throw new Error(`Invalid custom property: must be an object`);\n }\n }\n}\n\n// --- Deep Merge ---\n\nfunction deepMerge(target: any, source: any): void {\n for (const key in source) {\n if (\n source[key] &&\n typeof source[key] === \"object\" &&\n !Array.isArray(source[key])\n ) {\n target[key] ??= {};\n deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n}\n\n// --- Builders (pure functions) ---\n\nfunction buildThemeCSS(name: string, input: ThemeInput): string {\n const styles: Record<string, string | number> = {};\n\n for (const key in input) {\n const value = input[key as keyof ThemeInput];\n\n if (key === \"colors\") {\n for (const colorName in input.colors) {\n [...Array(12).keys()].forEach(i =>\n styles[`--${colorName}-${i}`] = input.colors[colorName][i]\n );\n }\n } else if (key === \"fontSizes\") {\n [...Array(8).keys()].forEach(i =>\n styles[`--fontSize-${i}`] = input.fontSizes[i]\n );\n } else {\n if (typeof value === \"object\" && value !== null) {\n for (const k in value) {\n styles[`--${key}-${k.replace(\"/\", \"_\")}`] = (value as Record<string, string>)[k];\n }\n }\n }\n }\n\n let text = \"\";\n for (const prop in styles) {\n text += ` ${prop}: ${styles[prop]};\\n`;\n }\n return `[data-theme=\"${name}\"] {\\n${text}}`;\n}\n\n// --- Public API ---\n\nexport function getTheme(name: string): ThemeInput {\n if (!themes[name]) throw Error(`Theme \"${name}\" not found`);\n return themes[name];\n}\n\nexport function setTheme(name: string, input: Partial<ThemeInput>): void {\n validateTheme(input);\n if (!themes[name]) themes[name] = structuredClone(light);\n deepMerge(themes[name], input);\n}\n\nexport function createDark(source: ThemeInput): ThemeInput {\n let dark = structuredClone(source)\n dark.direction = \"lighten\"\n for (let name in dark.colors) {\n dark.colors[name].reverse()\n dark.baseTones[name] = 12 - 1 - dark.baseTones[name]\n }\n return dark\n}\n\nexport function themeTokens(name: string): Record<string, any> {\n let input = getTheme(name)\n let tokens: Record<string, any> = {};\n\n for (const key in input) {\n const value = input[key as keyof ThemeInput];\n\n if (key === \"colors\") {\n for (const name in input.colors) {\n let colorTones = {} as Partial<Record<number, string>>;\n [...Array(12).keys()].forEach(i => colorTones[i] = input.colors[name][i]);\n tokens[name] = colorTones as Record<number, string>;\n }\n } else if (key === \"fontSizes\") {\n tokens.fontSizes = input.fontSizes;\n } else {\n tokens[key] = {} as any;\n if (typeof value === \"object\" && value !== null) {\n for (const k in value) {\n tokens[key][k] = (value as Record<string, string>)[k];\n }\n }\n }\n }\n\n return tokens;\n}\n\nexport function themeVars(): ThemeVars {\n let input = getTheme(\"light\")\n let theme = {} as ThemeVars;\n\n for (const key in input) {\n const section = key as keyof ThemeVars;\n const value = input[key as keyof ThemeInput];\n\n if (key === \"colors\") {\n for (const name in input.colors) {\n let colorTones = {} as Partial<Record<number, string>>;\n [...Array(12).keys()].forEach(i => colorTones[i] = `var(--${name}-${i})`);\n theme[name] = colorTones as Record<number, string>;\n }\n } else if (key === \"fontSizes\") {\n theme.fontSizes = [...Array(8).keys()].map(i => `var(--fontSize-${i})`);\n } else {\n theme[section] = {} as ThemeVars[typeof section];\n if (typeof value === \"object\" && value !== null) {\n for (const k in value) {\n (theme[section] as Record<string, string>)[k] = `var(--${section as string}-${k.replace(\"/\", \"_\")})`;\n }\n }\n }\n }\n\n return theme;\n}\n\nexport function themeCSS(): string {\n return Object.entries(themes)\n .map(([name, input]) => buildThemeCSS(name, input))\n .join(\"\\n\")\n}\n\nexport function themeApply(el?: HTMLStyleElement): void {\n if (typeof document === \"undefined\") return\n if (el) {\n el.textContent = themeCSS()\n return\n } else {\n el = document.getElementById(\"domphy-themes\") as HTMLStyleElement\n ?? Object.assign(document.createElement(\"style\"), { id: \"domphy-themes\" })\n el.textContent = themeCSS()\n document.head.appendChild(el)\n }\n\n}\n\nexport function themeSpacing(n: number) {\n return n / 4 + \"em\"\n}\n\nexport function themeName(object: ElementNode | Listener) {\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\n let node: ElementNode = elementNode;\n while (node && (!node.attributes || !node.attributes.get(\"dataTheme\"))) {\n node = node.parent as ElementNode\n }\n\n let themeName = \"light\"\n\n if (node.attributes && node.attributes.has(\"dataTheme\")) {\n themeName = node.attributes.get(\"dataTheme\")\n typeof object == \"function\" && node.attributes.onChange(\"dataTheme\", object)\n }\n return themeName\n}\n\nexport type ThemeColor = keyof ThemeInput[\"colors\"]","import type { ElementNode, Listener } from \"@domphy/core\";\r\nimport { themeVars } from \"./theme.js\";\r\n\r\nconst ElementSizes = [\"inherit\"];\r\n\r\n[...Array(8).keys()].forEach(i =>{\r\n ElementSizes.push(`decrease-${i}`)\r\n ElementSizes.push(`increase-${i}`)\r\n})\r\n\r\nexport type ElementSize = typeof ElementSizes[number];\r\n\r\nfunction offsetSize(origin: number, size: ElementSize = \"inherit\"): number {\r\n\r\n if (!ElementSizes.includes(size!)) {\r\n throw Error(`size name \"${size}\" invalid`)\r\n }\r\n let resultSize: number\r\n if (size == \"inherit\") {\r\n resultSize = origin as number\r\n } else if (size?.startsWith(\"increase-\")) {\r\n let offset = parseInt(size.replace(\"increase-\", \"\"), 10)\r\n resultSize = origin + offset;\r\n } else if (size?.startsWith(\"decrease-\")) {\r\n let offset = parseInt(size.replace(\"decrease-\", \"\"), 10)\r\n resultSize = origin - offset;\r\n } else {\r\n resultSize = origin\r\n }\r\n return Math.max(0, Math.min(8, resultSize))\r\n}\r\n\r\nfunction contextSize(object: ElementNode | Listener | null): number {\r\n\r\n if (!object) return 2\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n let node: ElementNode = elementNode;\r\n while (node && (!node.attributes || !node.attributes.get(\"dataSize\"))) {\r\n node = node.parent as ElementNode\r\n }\r\n\r\n let size = 2\r\n\r\n if (node && node.attributes && node.attributes.has(\"dataSize\")) {\r\n size = offsetSize(size, node.attributes.get(\"dataSize\"))\r\n typeof object == \"function\" && node.attributes.onChange(\"dataSize\", object)\r\n }\r\n return size\r\n}\r\n\r\n\r\nexport function themeSize(object: ElementNode | Listener, size: ElementSize = \"inherit\"): string {\r\n let index = offsetSize(contextSize(object), size)\r\n return themeVars().fontSizes[index]\r\n}","import { themeVars, getTheme, themeName } from \"./theme.js\"\r\nimport type { Listener, ElementNode } from \"@domphy/core\";\r\n\r\nconst TONE_STEPS = 12\r\n\r\nconst ElementTones = [\"inherit\", \"base\"];\r\n\r\n[...Array(TONE_STEPS).keys()].forEach(i => {\r\n ElementTones.push(`decrease-${i}`)\r\n ElementTones.push(`increase-${i}`)\r\n ElementTones.push(`shift-${i}`)\r\n})\r\n\r\nexport type ElementTone = typeof ElementTones[number];\r\n\r\nfunction adjustTone(tone: number, level: number): number {\r\n if (tone < 0 || tone > TONE_STEPS - 1) return tone\r\n let newIndex = tone + level;\r\n newIndex = Math.max(0, Math.min(TONE_STEPS - 1, newIndex));\r\n return newIndex\r\n}\r\n\r\nfunction shiftTone(tone: number, level: number): number {\r\n if (tone < 0 || tone > TONE_STEPS - 1) return tone\r\n let newIndex = tone <= 5 ? tone + level : tone - level\r\n newIndex = newIndex < 0 || newIndex > TONE_STEPS - 1 ? - newIndex : newIndex\r\n newIndex = Math.max(0, Math.min(TONE_STEPS - 1, newIndex));\r\n return newIndex\r\n}\r\n\r\nfunction offsetTone(originTone: number, tone: ElementTone = \"inherit\"): number {\r\n\r\n if (typeof tone == \"number\") return tone\r\n\r\n if (tone == \"inherit\") return originTone\r\n\r\n if (!ElementTones.includes(tone!)) {\r\n throw Error(`tone name \"${tone}\" invalid`)\r\n }\r\n\r\n if (tone.startsWith(\"increase-\")) {\r\n let offset = parseInt(tone.replace(\"increase-\", \"\"), 10)\r\n return adjustTone(originTone, offset);\r\n\r\n } else if (tone.startsWith(\"decrease-\")) {\r\n let offset = parseInt(tone.replace(\"decrease-\", \"\"), 10)\r\n return adjustTone(originTone, - offset);\r\n\r\n } else if (tone.startsWith(\"shift-\")) {\r\n let offset = parseInt(tone.replace(\"shift-\", \"\"), 10)\r\n return shiftTone(originTone, offset);\r\n\r\n } else {\r\n return originTone\r\n }\r\n}\r\n\r\nfunction contextTone(object: ElementNode | Listener | null): number {\r\n\r\n if (!object) return 0\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n let node: ElementNode = elementNode;\r\n while (node && (!node.attributes || !node.attributes.get(\"dataTone\"))) {\r\n node = node.parent as ElementNode\r\n }\r\n\r\n let tone = 0\r\n\r\n if (node && node.attributes && node.attributes.has(\"dataTone\")) {\r\n tone = offsetTone(tone, node.attributes.get(\"dataTone\"))\r\n typeof object == \"function\" && node.attributes.onChange(\"dataTone\", object)\r\n }\r\n return tone\r\n}\r\n\r\nfunction themeTone(object: ElementNode | Listener, tone: ElementTone = \"inherit\"): number {\r\n\r\n return offsetTone(contextTone(object), tone)\r\n}\r\n\r\nexport function contextColor(object: ElementNode | Listener, tone: ElementTone = \"inherit\", color: string = \"inherit\"): string {\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n\r\n let themeColor = color == \"inherit\" ? elementNode.getContext(\"themeColor\") || \"neutral\" : color;\r\n\r\n let resultTone: number\r\n if (tone == \"base\") {\r\n resultTone = getTheme(themeName(object)).baseTones[themeColor]\r\n } else {\r\n resultTone = offsetTone(contextTone(object), tone)\r\n }\r\n let resultColor = themeVars()[themeColor][resultTone]\r\n\r\n return resultColor\r\n}\r\nexport function themeColor(object: ElementNode | Listener | null, tone: ElementTone = \"inherit\", color: string = \"inherit\"): string {\r\n\r\n let themeColor = color == \"inherit\" ? \"neutral\" : color;\r\n\r\n if (!object) {\r\n return themeVars()[themeColor][offsetTone(0, tone)]\r\n }\r\n\r\n let resultTone: number\r\n if (tone == \"base\") {\r\n resultTone = getTheme(themeName(object)).baseTones[themeColor]\r\n } else {\r\n resultTone = themeTone(object, tone)\r\n }\r\n let resultColor = themeVars()[themeColor][resultTone]\r\n\r\n return resultColor\r\n}\r\n","import * as core from \"@domphy/core\";\r\nimport * as theme from \"./index.js\";\r\n\r\n(globalThis as any).Domphy = {\r\n core,\r\n theme\r\n};"],"mappings":"0HAAO,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,EAAA,sBAAAC,EAAA,sCAAAC,EAAA,gBAAAC,EAAA,aAAAC,EAAA,aAAAC,EAAA,cAAAC,EAAA,UAAAC,EAAA,aAAAC,GAAA,eAAAC,EAAA,UAAAC,EAAA,YAAAC,KAAA,IAAMC,GAAkB,CAC7B,UACA,aACA,gBACA,iBACA,SACA,WACA,YACA,mBACA,WACA,UACA,UACA,gBACA,gBACA,oBACA,SACA,cACA,QACA,aACA,SACA,YACA,cACA,cACA,aACA,cACA,SACA,mBACA,YACA,UACA,UACA,UACA,aACA,UACA,YACA,YACA,aACA,UACA,SACA,eACA,mBACA,cACA,cACA,eACA,eACA,cACA,aACA,cACA,YACA,UACA,UACA,SACA,YACA,aACA,eACA,UACA,WACA,WACA,cACA,4BACA,WACA,YACA,WACA,eACA,YACA,WACA,YACA,eACA,WACA,iBACA,YACA,UACA,eACA,cACA,aACA,gBACA,gBACA,gBACA,cACA,kBACA,iBACA,iBACA,gBACA,eACA,sBACA,uBACA,qBACA,sBACA,mBACA,kBACA,oBACA,mBACA,iBACA,uBACA,qBACA,oBACA,YACA,YACF,EAEaC,GAAeD,GAAgB,OAAO,CAACE,EAAKC,IAAO,CAC9D,IAAMC,EAAMD,EAAG,MAAM,CAAC,EAAE,YAAY,EACpC,OAAAD,EAAIE,CAAG,EAAID,EACJD,CACT,EAAG,CAAC,CAAiF,ECvGxEG,EAAW,CACtB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,OACA,aACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,MACA,OACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,MACA,MACA,MACA,OACA,OACA,SACA,OACA,QACA,KACA,UACA,gBACA,mBACA,SACA,WACA,SACA,OACA,OACA,UACA,UACA,gBACA,sBACA,cACA,mBACA,oBACA,oBACA,iBACA,eACA,UACA,UACA,UACA,UACA,UACA,iBACA,UACA,UACA,cACA,eACA,WACA,eACA,qBACA,cACA,SACA,eACA,SACA,gBACA,IACA,QACA,OACA,iBACA,SACA,OACA,WACA,QACA,OACA,UACA,UACA,WACA,WACA,iBACA,OACA,MACA,aACA,OACA,MACA,SACA,SACA,SACA,OACA,WACA,QACA,MACA,MACF,EC1KaC,EAAN,KAAe,CAAf,aAAA,CACL,KAAQ,WAAkD,CAAC,CAAA,CAE3D,UAAiB,CACf,GAAI,KAAK,WACP,QAAWC,KAAS,KAAK,WACvB,KAAK,WAAWA,CAAK,EAAE,MAAM,EAIjC,KAAK,WAAa,IACpB,CACA,YAAYA,EAAeC,EAA+B,CACxD,GAAI,CAAC,KAAK,WAAY,MAAO,IAAM,CAAE,EAErC,GAAI,OAAOD,GAAU,UAAY,OAAOC,GAAa,WACnD,MAAM,IAAI,MAAM,0DAA0D,EAGvE,KAAK,WAAWD,CAAK,IACxB,KAAK,WAAWA,CAAK,EAAI,IAAI,KAG/B,IAAME,EAAU,IAAM,KAAK,eAAeF,EAAOC,CAAQ,EAEzD,OAAK,KAAK,WAAWD,CAAK,EAAE,IAAIC,CAAQ,IACtC,KAAK,WAAWD,CAAK,EAAE,IAAIC,CAAQ,EAC/B,OAAOA,EAAS,aAAgB,YAClCA,EAAS,YAAYC,CAAO,GAIzBA,CACT,CAEA,eAAeF,EAAeC,EAAyB,CACrD,GAAI,CAAC,KAAK,WAAY,OAEtB,IAAME,EAAY,KAAK,WAAWH,CAAK,EACnCG,GAAaA,EAAU,IAAIF,CAAQ,IACrCE,EAAU,OAAOF,CAAQ,EACrBE,EAAU,OAAS,GACr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","names":["dist_exports","__export","R","x","C","d","j","k","b","_","oe","H","g","Q","EventProperties","eventNameMap","acc","ev","key","HtmlTags","Notifier","event","listener","release","listeners","args","e","State","initialValue","newValue","merge","source","target","comma","space","adjacent","deepClone","value","old","val1","val2","name","addEvent","addHook","toState","val","hashString","str","hash","i","partial","hookName","handler","hookProperty","current","attributes","eventName","eventProperty","node","seen","proto","clone","v","validate","element","asPartial","keys","isHTML","escapeHTML","getTagName","camelToKebab","selectorSplitter","selectors","splitted","parens","angulars","soFar","len","char","mergePartial","part","p","VoidTags","BooleanAttributes","PrefixCSS","CamelAttributes","ElementAttribute","parent","domElement","mutateAttrs","AttributeList","attr","_a","callback","force","className","add","classes","newClass","list","updated","cls","oldClass","TextNode","textContent","newNode","tpl","domText","ElementList","index","ElementNode","dom","el","currentRef","aNode","bNode","a","aNext","bNext","inputs","updateDom","silent","_b","_c","_d","oldItems","keyed","item","input","reused","cur","isPortal","length","finalIndex","domNode","ref","root","domStyle","child","done","snapshot","aIndex","bIndex","itemA","itemB","fromIndex","toIndex","html","StyleProperty","parentRule","domRule","style","prefix","Listener","StyleRule","_StyleRule","selectorText","StyleList","prop","styleStr","decl","nested","sheet","rules","domSheet","css","err","obj","parentSelector","basic","getSelector","selector","prev","splitKeys","currentSelector","rule","newSelector","domRuleList","wrongCount","fixOddEven","_ElementNode","domphyElement","_parent","tempPath","children","fn","n","originalKey","path","content","childNode","styleParent","src_exports","__export","contextColor","createDark","getTheme","setTheme","themeApply","themeCSS","themeColor","themeName","themeSize","themeSpacing","themeTokens","themeVars","light","light_default","themes","light_default","createDark","validateTheme","partial","key","custom","deepMerge","target","source","_a","buildThemeCSS","name","input","styles","value","colorName","i","k","text","prop","getTheme","setTheme","dark","themeTokens","tokens","colorTones","themeVars","theme","section","themeCSS","themeApply","el","themeSpacing","n","themeName","object","node","ElementSizes","i","offsetSize","origin","size","resultSize","offset","contextSize","object","node","themeSize","index","themeVars","TONE_STEPS","ElementTones","i","adjustTone","tone","level","newIndex","shiftTone","offsetTone","originTone","offset","contextTone","object","node","themeTone","contextColor","color","elementNode","themeColor","resultTone","getTheme","themeName","themeVars","dist_exports","src_exports"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";var y=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var C=(e,t)=>{for(var r in t)y(e,r,{get:t[r],enumerable:!0})},w=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let f of I(t))!$.call(e,f)&&f!==r&&y(e,f,{get:()=>t[f],enumerable:!(n=k(t,f))||n.enumerable});return e};var v=e=>w(y({},"__esModule",{value:!0}),e);var D={};C(D,{contextColor:()=>J,createDark:()=>g,getTheme:()=>l,setTheme:()=>R,themeApply:()=>V,themeCSS:()=>b,themeColor:()=>B,themeName:()=>c,themeSize:()=>W,themeSpacing:()=>O,themeTokens:()=>M,themeVars:()=>a});module.exports=v(D);var z={direction:"darken",colors:{highlight:["#ffffff","#fcf4d6","#fddc69","#f1c21b","#d2a106","#b28600","#8e6a00","#684e00","#483700","#302400","#1c1500","#000000"],warning:["#ffffff","#fff2e8","#ffd9be","#ffb784","#ff832b","#eb6200","#ba4e00","#8a3800","#5e2900","#3e1a00","#231000","#000000"],error:["#ffffff","#fff1f1","#ffd7d9","#ffb3b8","#ff8389","#fa4d56","#da1e28","#a2191f","#750e13","#520408","#2d0709","#000000"],danger:["#ffffff","#fff1f1","#ffd7d9","#ffb3b8","#ff8389","#fa4d56","#da1e28","#a2191f","#750e13","#520408","#2d0709","#000000"],secondary:["#ffffff","#fff0f7","#ffd6e8","#ffafd2","#ff7eb6","#ee5396","#d02670","#9f1853","#740937","#510224","#2a0a18","#000000"],primary:["#ffffff","#edf5ff","#d0e2ff","#a6c8ff","#78a9ff","#4589ff","#0f62fe","#0043ce","#002d9c","#001d6c","#001141","#000000"],info:["#ffffff","#e5f6ff","#bae6ff","#82cfff","#33b1ff","#1192e8","#0072c3","#00539a","#003a6d","#012749","#061727","#000000"],success:["#ffffff","#defbe6","#a7f0ba","#6fdc8c","#42be65","#24a148","#198038","#0e6027","#044317","#022d0d","#071908","#000000"],neutral:["#ffffff","#f4f4f4","#e0e0e0","#c6c6c6","#a8a8a8","#8d8d8d","#6f6f6f","#525252","#393939","#262626","#161616","#000000"]},baseTones:{highlight:3,warning:4,error:5,secondary:5,primary:6,info:5,success:5,neutral:5},fontSizes:["0.75rem","0.875rem","1rem","1.25rem","1.5625rem","1.9375rem","2.4375rem","3.0625rem"],custom:{}},d=z;var m={light:JSON.parse(JSON.stringify(d)),dark:g(d)};function A(e){for(let t in e)if(!Object.keys(d).includes(t))throw new Error(`Invalid key: ${t}`);if(e.fontSizes&&!Array.isArray(e.fontSizes))throw new Error("fontSize must be array of string");if("custom"in e){let t=e.custom;if(typeof t!="object"||t===null)throw new Error("Invalid custom property: must be an object")}}function E(e,t){var r;for(let n in t)t[n]&&typeof t[n]=="object"&&!Array.isArray(t[n])?((r=e[n])!=null||(e[n]={}),E(e[n],t[n])):e[n]=t[n]}function L(e,t){let r={};for(let f in t){let o=t[f];if(f==="colors")for(let s in t.colors)[...Array(12).keys()].forEach(i=>r[`--${s}-${i}`]=t.colors[s][i]);else if(f==="fontSizes")[...Array(8).keys()].forEach(s=>r[`--fontSize-${s}`]=t.fontSizes[s]);else if(typeof o=="object"&&o!==null)for(let s in o)r[`--${f}-${s.replace("/","_")}`]=o[s]}let n="";for(let f in r)n+=` ${f}: ${r[f]};
2
+ `;return`[data-theme="${e}"] {
3
+ ${n}}`}function l(e){if(!m[e])throw Error(`Theme "${e}" not found`);return m[e]}function R(e,t){A(t),m[e]||(m[e]=structuredClone(d)),E(m[e],t)}function g(e){let t=structuredClone(e);t.direction="lighten";for(let r in t.colors)t.colors[r].reverse(),t.baseTones[r]=11-t.baseTones[r];return t}function M(e){let t=l(e),r={};for(let n in t){let f=t[n];if(n==="colors")for(let o in t.colors){let s={};[...Array(12).keys()].forEach(i=>s[i]=t.colors[o][i]),r[o]=s}else if(n==="fontSizes")r.fontSizes=t.fontSizes;else if(r[n]={},typeof f=="object"&&f!==null)for(let o in f)r[n][o]=f[o]}return r}function a(){let e=l("light"),t={};for(let r in e){let n=r,f=e[r];if(r==="colors")for(let o in e.colors){let s={};[...Array(12).keys()].forEach(i=>s[i]=`var(--${o}-${i})`),t[o]=s}else if(r==="fontSizes")t.fontSizes=[...Array(8).keys()].map(o=>`var(--fontSize-${o})`);else if(t[n]={},typeof f=="object"&&f!==null)for(let o in f)t[n][o]=`var(--${n}-${o.replace("/","_")})`}return t}function b(){return Object.entries(m).map(([e,t])=>L(e,t)).join(`
4
+ `)}function V(e){var t;if(typeof document!="undefined")if(e){e.textContent=b();return}else e=(t=document.getElementById("domphy-themes"))!=null?t:Object.assign(document.createElement("style"),{id:"domphy-themes"}),e.textContent=b(),document.head.appendChild(e)}function O(e){return e/4+"em"}function c(e){let r=typeof e=="function"?e.elementNode:e;for(;r&&(!r.attributes||!r.attributes.get("dataTheme"));)r=r.parent;let n="light";return r.attributes&&r.attributes.has("dataTheme")&&(n=r.attributes.get("dataTheme"),typeof e=="function"&&r.attributes.onChange("dataTheme",e)),n}var T=["inherit"];[...Array(8).keys()].forEach(e=>{T.push(`decrease-${e}`),T.push(`increase-${e}`)});function N(e,t="inherit"){if(!T.includes(t))throw Error(`size name "${t}" invalid`);let r;if(t=="inherit")r=e;else if(t!=null&&t.startsWith("increase-")){let n=parseInt(t.replace("increase-",""),10);r=e+n}else if(t!=null&&t.startsWith("decrease-")){let n=parseInt(t.replace("decrease-",""),10);r=e-n}else r=e;return Math.max(0,Math.min(8,r))}function P(e){if(!e)return 2;let r=typeof e=="function"?e.elementNode:e;for(;r&&(!r.attributes||!r.attributes.get("dataSize"));)r=r.parent;let n=2;return r&&r.attributes&&r.attributes.has("dataSize")&&(n=N(n,r.attributes.get("dataSize")),typeof e=="function"&&r.attributes.onChange("dataSize",e)),n}function W(e,t="inherit"){let r=N(P(e),t);return a().fontSizes[r]}var u=12,h=["inherit","base"];[...Array(u).keys()].forEach(e=>{h.push(`decrease-${e}`),h.push(`increase-${e}`),h.push(`shift-${e}`)});function S(e,t){if(e<0||e>u-1)return e;let r=e+t;return r=Math.max(0,Math.min(u-1,r)),r}function _(e,t){if(e<0||e>u-1)return e;let r=e<=5?e+t:e-t;return r=r<0||r>u-1?-r:r,r=Math.max(0,Math.min(u-1,r)),r}function p(e,t="inherit"){if(typeof t=="number")return t;if(t=="inherit")return e;if(!h.includes(t))throw Error(`tone name "${t}" invalid`);if(t.startsWith("increase-")){let r=parseInt(t.replace("increase-",""),10);return S(e,r)}else if(t.startsWith("decrease-")){let r=parseInt(t.replace("decrease-",""),10);return S(e,-r)}else if(t.startsWith("shift-")){let r=parseInt(t.replace("shift-",""),10);return _(e,r)}else return e}function x(e){if(!e)return 0;let r=typeof e=="function"?e.elementNode:e;for(;r&&(!r.attributes||!r.attributes.get("dataTone"));)r=r.parent;let n=0;return r&&r.attributes&&r.attributes.has("dataTone")&&(n=p(n,r.attributes.get("dataTone")),typeof e=="function"&&r.attributes.onChange("dataTone",e)),n}function H(e,t="inherit"){return p(x(e),t)}function J(e,t="inherit",r="inherit"){let n=typeof e=="function"?e.elementNode:e,f=r=="inherit"?n.getContext("themeColor")||"neutral":r,o;return t=="base"?o=l(c(e)).baseTones[f]:o=p(x(e),t),a()[f][o]}function B(e,t="inherit",r="inherit"){let n=r=="inherit"?"neutral":r;if(!e)return a()[n][p(0,t)];let f;return t=="base"?f=l(c(e)).baseTones[n]:f=H(e,t),a()[n][f]}0&&(module.exports={contextColor,createDark,getTheme,setTheme,themeApply,themeCSS,themeColor,themeName,themeSize,themeSpacing,themeTokens,themeVars});
5
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/light.ts","../src/theme.ts","../src/size.ts","../src/tone.ts"],"sourcesContent":["export * from \"./size.js\"\nexport * from \"./tone.js\"\nexport * from \"./theme.js\"","import { ThemeInput } from \"./types.js\";\r\n\r\nlet light: ThemeInput = {\r\n direction: \"darken\",\r\n colors: {\r\n highlight: [\"#ffffff\", \"#fcf4d6\", \"#fddc69\", \"#f1c21b\", \"#d2a106\", \"#b28600\", \"#8e6a00\", \"#684e00\", \"#483700\", \"#302400\", \"#1c1500\", \"#000000\"],\r\n warning: [\"#ffffff\", \"#fff2e8\", \"#ffd9be\", \"#ffb784\", \"#ff832b\", \"#eb6200\", \"#ba4e00\", \"#8a3800\", \"#5e2900\", \"#3e1a00\", \"#231000\", \"#000000\"],\r\n error: [\"#ffffff\", \"#fff1f1\", \"#ffd7d9\", \"#ffb3b8\", \"#ff8389\", \"#fa4d56\", \"#da1e28\", \"#a2191f\", \"#750e13\", \"#520408\", \"#2d0709\", \"#000000\"],\r\n danger: [\"#ffffff\", \"#fff1f1\", \"#ffd7d9\", \"#ffb3b8\", \"#ff8389\", \"#fa4d56\", \"#da1e28\", \"#a2191f\", \"#750e13\", \"#520408\", \"#2d0709\", \"#000000\"],\r\n secondary: [\"#ffffff\", \"#fff0f7\", \"#ffd6e8\", \"#ffafd2\", \"#ff7eb6\", \"#ee5396\", \"#d02670\", \"#9f1853\", \"#740937\", \"#510224\", \"#2a0a18\", \"#000000\"],\r\n primary: [\"#ffffff\", \"#edf5ff\", \"#d0e2ff\", \"#a6c8ff\", \"#78a9ff\", \"#4589ff\", \"#0f62fe\", \"#0043ce\", \"#002d9c\", \"#001d6c\", \"#001141\", \"#000000\"],\r\n info: [\"#ffffff\", \"#e5f6ff\", \"#bae6ff\", \"#82cfff\", \"#33b1ff\", \"#1192e8\", \"#0072c3\", \"#00539a\", \"#003a6d\", \"#012749\", \"#061727\", \"#000000\"],\r\n success: [\"#ffffff\", \"#defbe6\", \"#a7f0ba\", \"#6fdc8c\", \"#42be65\", \"#24a148\", \"#198038\", \"#0e6027\", \"#044317\", \"#022d0d\", \"#071908\", \"#000000\"],\r\n neutral: [\"#ffffff\", \"#f4f4f4\", \"#e0e0e0\", \"#c6c6c6\", \"#a8a8a8\", \"#8d8d8d\", \"#6f6f6f\", \"#525252\", \"#393939\", \"#262626\", \"#161616\", \"#000000\"],\r\n },\r\n baseTones: {\r\n highlight: 3,\r\n warning: 4,\r\n error: 5,\r\n secondary: 5,\r\n primary: 6,\r\n info: 5,\r\n success: 5,\r\n neutral: 5,\r\n },\r\n fontSizes: [\"0.75rem\", \"0.875rem\", \"1rem\", \"1.25rem\", \"1.5625rem\", \"1.9375rem\", \"2.4375rem\", \"3.0625rem\"],\r\n// pixels: 12 | 14 | 16 | 20 | 25 | 31 | 39 | 49\r\n custom: {},\r\n}\r\n\r\nexport default light\r\n","import { ElementNode, Listener } from \"@domphy/core\";\nimport { ThemeInput, ThemeVars } from \"./types.js\";\nimport light from \"./light.js\";\n\nconst themes: Record<string, ThemeInput> = {\n light: JSON.parse(JSON.stringify(light)),\n dark: createDark(light),\n};\n\n// --- Validation ---\n\nfunction validateTheme(partial: Partial<ThemeInput>): void {\n for (let key in partial) {\n if (!Object.keys(light).includes(key as keyof ThemeInput)) {\n throw new Error(`Invalid key: ${key}`);\n }\n }\n if (partial.fontSizes && !Array.isArray(partial.fontSizes)) {\n throw new Error(`fontSize must be array of string`);\n }\n if (\"custom\" in partial) {\n const custom = partial.custom!;\n if (typeof custom !== \"object\" || custom === null) {\n throw new Error(`Invalid custom property: must be an object`);\n }\n }\n}\n\n// --- Deep Merge ---\n\nfunction deepMerge(target: any, source: any): void {\n for (const key in source) {\n if (\n source[key] &&\n typeof source[key] === \"object\" &&\n !Array.isArray(source[key])\n ) {\n target[key] ??= {};\n deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n}\n\n// --- Builders (pure functions) ---\n\nfunction buildThemeCSS(name: string, input: ThemeInput): string {\n const styles: Record<string, string | number> = {};\n\n for (const key in input) {\n const value = input[key as keyof ThemeInput];\n\n if (key === \"colors\") {\n for (const colorName in input.colors) {\n [...Array(12).keys()].forEach(i =>\n styles[`--${colorName}-${i}`] = input.colors[colorName][i]\n );\n }\n } else if (key === \"fontSizes\") {\n [...Array(8).keys()].forEach(i =>\n styles[`--fontSize-${i}`] = input.fontSizes[i]\n );\n } else {\n if (typeof value === \"object\" && value !== null) {\n for (const k in value) {\n styles[`--${key}-${k.replace(\"/\", \"_\")}`] = (value as Record<string, string>)[k];\n }\n }\n }\n }\n\n let text = \"\";\n for (const prop in styles) {\n text += ` ${prop}: ${styles[prop]};\\n`;\n }\n return `[data-theme=\"${name}\"] {\\n${text}}`;\n}\n\n// --- Public API ---\n\nexport function getTheme(name: string): ThemeInput {\n if (!themes[name]) throw Error(`Theme \"${name}\" not found`);\n return themes[name];\n}\n\nexport function setTheme(name: string, input: Partial<ThemeInput>): void {\n validateTheme(input);\n if (!themes[name]) themes[name] = structuredClone(light);\n deepMerge(themes[name], input);\n}\n\nexport function createDark(source: ThemeInput): ThemeInput {\n let dark = structuredClone(source)\n dark.direction = \"lighten\"\n for (let name in dark.colors) {\n dark.colors[name].reverse()\n dark.baseTones[name] = 12 - 1 - dark.baseTones[name]\n }\n return dark\n}\n\nexport function themeTokens(name: string): Record<string, any> {\n let input = getTheme(name)\n let tokens: Record<string, any> = {};\n\n for (const key in input) {\n const value = input[key as keyof ThemeInput];\n\n if (key === \"colors\") {\n for (const name in input.colors) {\n let colorTones = {} as Partial<Record<number, string>>;\n [...Array(12).keys()].forEach(i => colorTones[i] = input.colors[name][i]);\n tokens[name] = colorTones as Record<number, string>;\n }\n } else if (key === \"fontSizes\") {\n tokens.fontSizes = input.fontSizes;\n } else {\n tokens[key] = {} as any;\n if (typeof value === \"object\" && value !== null) {\n for (const k in value) {\n tokens[key][k] = (value as Record<string, string>)[k];\n }\n }\n }\n }\n\n return tokens;\n}\n\nexport function themeVars(): ThemeVars {\n let input = getTheme(\"light\")\n let theme = {} as ThemeVars;\n\n for (const key in input) {\n const section = key as keyof ThemeVars;\n const value = input[key as keyof ThemeInput];\n\n if (key === \"colors\") {\n for (const name in input.colors) {\n let colorTones = {} as Partial<Record<number, string>>;\n [...Array(12).keys()].forEach(i => colorTones[i] = `var(--${name}-${i})`);\n theme[name] = colorTones as Record<number, string>;\n }\n } else if (key === \"fontSizes\") {\n theme.fontSizes = [...Array(8).keys()].map(i => `var(--fontSize-${i})`);\n } else {\n theme[section] = {} as ThemeVars[typeof section];\n if (typeof value === \"object\" && value !== null) {\n for (const k in value) {\n (theme[section] as Record<string, string>)[k] = `var(--${section as string}-${k.replace(\"/\", \"_\")})`;\n }\n }\n }\n }\n\n return theme;\n}\n\nexport function themeCSS(): string {\n return Object.entries(themes)\n .map(([name, input]) => buildThemeCSS(name, input))\n .join(\"\\n\")\n}\n\nexport function themeApply(el?: HTMLStyleElement): void {\n if (typeof document === \"undefined\") return\n if (el) {\n el.textContent = themeCSS()\n return\n } else {\n el = document.getElementById(\"domphy-themes\") as HTMLStyleElement\n ?? Object.assign(document.createElement(\"style\"), { id: \"domphy-themes\" })\n el.textContent = themeCSS()\n document.head.appendChild(el)\n }\n\n}\n\nexport function themeSpacing(n: number) {\n return n / 4 + \"em\"\n}\n\nexport function themeName(object: ElementNode | Listener) {\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\n let node: ElementNode = elementNode;\n while (node && (!node.attributes || !node.attributes.get(\"dataTheme\"))) {\n node = node.parent as ElementNode\n }\n\n let themeName = \"light\"\n\n if (node.attributes && node.attributes.has(\"dataTheme\")) {\n themeName = node.attributes.get(\"dataTheme\")\n typeof object == \"function\" && node.attributes.onChange(\"dataTheme\", object)\n }\n return themeName\n}\n\nexport type ThemeColor = keyof ThemeInput[\"colors\"]","import type { ElementNode, Listener } from \"@domphy/core\";\r\nimport { themeVars } from \"./theme.js\";\r\n\r\nconst ElementSizes = [\"inherit\"];\r\n\r\n[...Array(8).keys()].forEach(i =>{\r\n ElementSizes.push(`decrease-${i}`)\r\n ElementSizes.push(`increase-${i}`)\r\n})\r\n\r\nexport type ElementSize = typeof ElementSizes[number];\r\n\r\nfunction offsetSize(origin: number, size: ElementSize = \"inherit\"): number {\r\n\r\n if (!ElementSizes.includes(size!)) {\r\n throw Error(`size name \"${size}\" invalid`)\r\n }\r\n let resultSize: number\r\n if (size == \"inherit\") {\r\n resultSize = origin as number\r\n } else if (size?.startsWith(\"increase-\")) {\r\n let offset = parseInt(size.replace(\"increase-\", \"\"), 10)\r\n resultSize = origin + offset;\r\n } else if (size?.startsWith(\"decrease-\")) {\r\n let offset = parseInt(size.replace(\"decrease-\", \"\"), 10)\r\n resultSize = origin - offset;\r\n } else {\r\n resultSize = origin\r\n }\r\n return Math.max(0, Math.min(8, resultSize))\r\n}\r\n\r\nfunction contextSize(object: ElementNode | Listener | null): number {\r\n\r\n if (!object) return 2\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n let node: ElementNode = elementNode;\r\n while (node && (!node.attributes || !node.attributes.get(\"dataSize\"))) {\r\n node = node.parent as ElementNode\r\n }\r\n\r\n let size = 2\r\n\r\n if (node && node.attributes && node.attributes.has(\"dataSize\")) {\r\n size = offsetSize(size, node.attributes.get(\"dataSize\"))\r\n typeof object == \"function\" && node.attributes.onChange(\"dataSize\", object)\r\n }\r\n return size\r\n}\r\n\r\n\r\nexport function themeSize(object: ElementNode | Listener, size: ElementSize = \"inherit\"): string {\r\n let index = offsetSize(contextSize(object), size)\r\n return themeVars().fontSizes[index]\r\n}","import { themeVars, getTheme, themeName } from \"./theme.js\"\r\nimport type { Listener, ElementNode } from \"@domphy/core\";\r\n\r\nconst TONE_STEPS = 12\r\n\r\nconst ElementTones = [\"inherit\", \"base\"];\r\n\r\n[...Array(TONE_STEPS).keys()].forEach(i => {\r\n ElementTones.push(`decrease-${i}`)\r\n ElementTones.push(`increase-${i}`)\r\n ElementTones.push(`shift-${i}`)\r\n})\r\n\r\nexport type ElementTone = typeof ElementTones[number];\r\n\r\nfunction adjustTone(tone: number, level: number): number {\r\n if (tone < 0 || tone > TONE_STEPS - 1) return tone\r\n let newIndex = tone + level;\r\n newIndex = Math.max(0, Math.min(TONE_STEPS - 1, newIndex));\r\n return newIndex\r\n}\r\n\r\nfunction shiftTone(tone: number, level: number): number {\r\n if (tone < 0 || tone > TONE_STEPS - 1) return tone\r\n let newIndex = tone <= 5 ? tone + level : tone - level\r\n newIndex = newIndex < 0 || newIndex > TONE_STEPS - 1 ? - newIndex : newIndex\r\n newIndex = Math.max(0, Math.min(TONE_STEPS - 1, newIndex));\r\n return newIndex\r\n}\r\n\r\nfunction offsetTone(originTone: number, tone: ElementTone = \"inherit\"): number {\r\n\r\n if (typeof tone == \"number\") return tone\r\n\r\n if (tone == \"inherit\") return originTone\r\n\r\n if (!ElementTones.includes(tone!)) {\r\n throw Error(`tone name \"${tone}\" invalid`)\r\n }\r\n\r\n if (tone.startsWith(\"increase-\")) {\r\n let offset = parseInt(tone.replace(\"increase-\", \"\"), 10)\r\n return adjustTone(originTone, offset);\r\n\r\n } else if (tone.startsWith(\"decrease-\")) {\r\n let offset = parseInt(tone.replace(\"decrease-\", \"\"), 10)\r\n return adjustTone(originTone, - offset);\r\n\r\n } else if (tone.startsWith(\"shift-\")) {\r\n let offset = parseInt(tone.replace(\"shift-\", \"\"), 10)\r\n return shiftTone(originTone, offset);\r\n\r\n } else {\r\n return originTone\r\n }\r\n}\r\n\r\nfunction contextTone(object: ElementNode | Listener | null): number {\r\n\r\n if (!object) return 0\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n let node: ElementNode = elementNode;\r\n while (node && (!node.attributes || !node.attributes.get(\"dataTone\"))) {\r\n node = node.parent as ElementNode\r\n }\r\n\r\n let tone = 0\r\n\r\n if (node && node.attributes && node.attributes.has(\"dataTone\")) {\r\n tone = offsetTone(tone, node.attributes.get(\"dataTone\"))\r\n typeof object == \"function\" && node.attributes.onChange(\"dataTone\", object)\r\n }\r\n return tone\r\n}\r\n\r\nfunction themeTone(object: ElementNode | Listener, tone: ElementTone = \"inherit\"): number {\r\n\r\n return offsetTone(contextTone(object), tone)\r\n}\r\n\r\nexport function contextColor(object: ElementNode | Listener, tone: ElementTone = \"inherit\", color: string = \"inherit\"): string {\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n\r\n let themeColor = color == \"inherit\" ? elementNode.getContext(\"themeColor\") || \"neutral\" : color;\r\n\r\n let resultTone: number\r\n if (tone == \"base\") {\r\n resultTone = getTheme(themeName(object)).baseTones[themeColor]\r\n } else {\r\n resultTone = offsetTone(contextTone(object), tone)\r\n }\r\n let resultColor = themeVars()[themeColor][resultTone]\r\n\r\n return resultColor\r\n}\r\nexport function themeColor(object: ElementNode | Listener | null, tone: ElementTone = \"inherit\", color: string = \"inherit\"): string {\r\n\r\n let themeColor = color == \"inherit\" ? \"neutral\" : color;\r\n\r\n if (!object) {\r\n return themeVars()[themeColor][offsetTone(0, tone)]\r\n }\r\n\r\n let resultTone: number\r\n if (tone == \"base\") {\r\n resultTone = getTheme(themeName(object)).baseTones[themeColor]\r\n } else {\r\n resultTone = themeTone(object, tone)\r\n }\r\n let resultColor = themeVars()[themeColor][resultTone]\r\n\r\n return resultColor\r\n}\r\n"],"mappings":"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","names":["index_exports","__export","contextColor","createDark","getTheme","setTheme","themeApply","themeCSS","themeColor","themeName","themeSize","themeSpacing","themeTokens","themeVars","__toCommonJS","light","light_default","themes","light_default","createDark","validateTheme","partial","key","custom","deepMerge","target","source","_a","buildThemeCSS","name","input","styles","value","colorName","i","k","text","prop","getTheme","setTheme","dark","themeTokens","tokens","colorTones","themeVars","theme","section","themeCSS","themeApply","el","themeSpacing","n","themeName","object","node","ElementSizes","i","offsetSize","origin","size","resultSize","offset","contextSize","object","node","themeSize","index","themeVars","TONE_STEPS","ElementTones","i","adjustTone","tone","level","newIndex","shiftTone","offsetTone","originTone","offset","contextTone","object","node","themeTone","contextColor","color","elementNode","themeColor","resultTone","getTheme","themeName","themeVars"]}
@@ -0,0 +1,37 @@
1
+ import { ElementNode, Listener } from '@domphy/core';
2
+
3
+ declare const ElementSizes: string[];
4
+ type ElementSize = typeof ElementSizes[number];
5
+ declare function themeSize(object: ElementNode | Listener, size?: ElementSize): string;
6
+
7
+ declare const ElementTones: string[];
8
+ type ElementTone = typeof ElementTones[number];
9
+ declare function contextColor(object: ElementNode | Listener, tone?: ElementTone, color?: string): string;
10
+ declare function themeColor(object: ElementNode | Listener | null, tone?: ElementTone, color?: string): string;
11
+
12
+ type ThemeInput = {
13
+ direction: "lighten" | "darken";
14
+ colors: Record<string, string[]>;
15
+ baseTones: Record<string, number>;
16
+ fontSizes: string[];
17
+ custom: Record<string, string | number>;
18
+ };
19
+ type ThemeVars = {
20
+ [E in keyof ThemeInput["colors"]]: Record<number, string>;
21
+ } & {
22
+ fontSizes: string[];
23
+ custom: Record<string, string>;
24
+ };
25
+
26
+ declare function getTheme(name: string): ThemeInput;
27
+ declare function setTheme(name: string, input: Partial<ThemeInput>): void;
28
+ declare function createDark(source: ThemeInput): ThemeInput;
29
+ declare function themeTokens(name: string): Record<string, any>;
30
+ declare function themeVars(): ThemeVars;
31
+ declare function themeCSS(): string;
32
+ declare function themeApply(el?: HTMLStyleElement): void;
33
+ declare function themeSpacing(n: number): string;
34
+ declare function themeName(object: ElementNode | Listener): string;
35
+ type ThemeColor = keyof ThemeInput["colors"];
36
+
37
+ export { type ElementSize, type ElementTone, type ThemeColor, contextColor, createDark, getTheme, setTheme, themeApply, themeCSS, themeColor, themeName, themeSize, themeSpacing, themeTokens, themeVars };
@@ -0,0 +1,37 @@
1
+ import { ElementNode, Listener } from '@domphy/core';
2
+
3
+ declare const ElementSizes: string[];
4
+ type ElementSize = typeof ElementSizes[number];
5
+ declare function themeSize(object: ElementNode | Listener, size?: ElementSize): string;
6
+
7
+ declare const ElementTones: string[];
8
+ type ElementTone = typeof ElementTones[number];
9
+ declare function contextColor(object: ElementNode | Listener, tone?: ElementTone, color?: string): string;
10
+ declare function themeColor(object: ElementNode | Listener | null, tone?: ElementTone, color?: string): string;
11
+
12
+ type ThemeInput = {
13
+ direction: "lighten" | "darken";
14
+ colors: Record<string, string[]>;
15
+ baseTones: Record<string, number>;
16
+ fontSizes: string[];
17
+ custom: Record<string, string | number>;
18
+ };
19
+ type ThemeVars = {
20
+ [E in keyof ThemeInput["colors"]]: Record<number, string>;
21
+ } & {
22
+ fontSizes: string[];
23
+ custom: Record<string, string>;
24
+ };
25
+
26
+ declare function getTheme(name: string): ThemeInput;
27
+ declare function setTheme(name: string, input: Partial<ThemeInput>): void;
28
+ declare function createDark(source: ThemeInput): ThemeInput;
29
+ declare function themeTokens(name: string): Record<string, any>;
30
+ declare function themeVars(): ThemeVars;
31
+ declare function themeCSS(): string;
32
+ declare function themeApply(el?: HTMLStyleElement): void;
33
+ declare function themeSpacing(n: number): string;
34
+ declare function themeName(object: ElementNode | Listener): string;
35
+ type ThemeColor = keyof ThemeInput["colors"];
36
+
37
+ export { type ElementSize, type ElementTone, type ThemeColor, contextColor, createDark, getTheme, setTheme, themeApply, themeCSS, themeColor, themeName, themeSize, themeSpacing, themeTokens, themeVars };
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ var S={direction:"darken",colors:{highlight:["#ffffff","#fcf4d6","#fddc69","#f1c21b","#d2a106","#b28600","#8e6a00","#684e00","#483700","#302400","#1c1500","#000000"],warning:["#ffffff","#fff2e8","#ffd9be","#ffb784","#ff832b","#eb6200","#ba4e00","#8a3800","#5e2900","#3e1a00","#231000","#000000"],error:["#ffffff","#fff1f1","#ffd7d9","#ffb3b8","#ff8389","#fa4d56","#da1e28","#a2191f","#750e13","#520408","#2d0709","#000000"],danger:["#ffffff","#fff1f1","#ffd7d9","#ffb3b8","#ff8389","#fa4d56","#da1e28","#a2191f","#750e13","#520408","#2d0709","#000000"],secondary:["#ffffff","#fff0f7","#ffd6e8","#ffafd2","#ff7eb6","#ee5396","#d02670","#9f1853","#740937","#510224","#2a0a18","#000000"],primary:["#ffffff","#edf5ff","#d0e2ff","#a6c8ff","#78a9ff","#4589ff","#0f62fe","#0043ce","#002d9c","#001d6c","#001141","#000000"],info:["#ffffff","#e5f6ff","#bae6ff","#82cfff","#33b1ff","#1192e8","#0072c3","#00539a","#003a6d","#012749","#061727","#000000"],success:["#ffffff","#defbe6","#a7f0ba","#6fdc8c","#42be65","#24a148","#198038","#0e6027","#044317","#022d0d","#071908","#000000"],neutral:["#ffffff","#f4f4f4","#e0e0e0","#c6c6c6","#a8a8a8","#8d8d8d","#6f6f6f","#525252","#393939","#262626","#161616","#000000"]},baseTones:{highlight:3,warning:4,error:5,secondary:5,primary:6,info:5,success:5,neutral:5},fontSizes:["0.75rem","0.875rem","1rem","1.25rem","1.5625rem","1.9375rem","2.4375rem","3.0625rem"],custom:{}},u=S;var a={light:JSON.parse(JSON.stringify(u)),dark:I(u)};function x(e){for(let t in e)if(!Object.keys(u).includes(t))throw new Error(`Invalid key: ${t}`);if(e.fontSizes&&!Array.isArray(e.fontSizes))throw new Error("fontSize must be array of string");if("custom"in e){let t=e.custom;if(typeof t!="object"||t===null)throw new Error("Invalid custom property: must be an object")}}function T(e,t){var r;for(let n in t)t[n]&&typeof t[n]=="object"&&!Array.isArray(t[n])?((r=e[n])!=null||(e[n]={}),T(e[n],t[n])):e[n]=t[n]}function k(e,t){let r={};for(let f in t){let o=t[f];if(f==="colors")for(let s in t.colors)[...Array(12).keys()].forEach(i=>r[`--${s}-${i}`]=t.colors[s][i]);else if(f==="fontSizes")[...Array(8).keys()].forEach(s=>r[`--fontSize-${s}`]=t.fontSizes[s]);else if(typeof o=="object"&&o!==null)for(let s in o)r[`--${f}-${s.replace("/","_")}`]=o[s]}let n="";for(let f in r)n+=` ${f}: ${r[f]};
2
+ `;return`[data-theme="${e}"] {
3
+ ${n}}`}function d(e){if(!a[e])throw Error(`Theme "${e}" not found`);return a[e]}function A(e,t){x(t),a[e]||(a[e]=structuredClone(u)),T(a[e],t)}function I(e){let t=structuredClone(e);t.direction="lighten";for(let r in t.colors)t.colors[r].reverse(),t.baseTones[r]=11-t.baseTones[r];return t}function L(e){let t=d(e),r={};for(let n in t){let f=t[n];if(n==="colors")for(let o in t.colors){let s={};[...Array(12).keys()].forEach(i=>s[i]=t.colors[o][i]),r[o]=s}else if(n==="fontSizes")r.fontSizes=t.fontSizes;else if(r[n]={},typeof f=="object"&&f!==null)for(let o in f)r[n][o]=f[o]}return r}function m(){let e=d("light"),t={};for(let r in e){let n=r,f=e[r];if(r==="colors")for(let o in e.colors){let s={};[...Array(12).keys()].forEach(i=>s[i]=`var(--${o}-${i})`),t[o]=s}else if(r==="fontSizes")t.fontSizes=[...Array(8).keys()].map(o=>`var(--fontSize-${o})`);else if(t[n]={},typeof f=="object"&&f!==null)for(let o in f)t[n][o]=`var(--${n}-${o.replace("/","_")})`}return t}function b(){return Object.entries(a).map(([e,t])=>k(e,t)).join(`
4
+ `)}function R(e){var t;if(typeof document!="undefined")if(e){e.textContent=b();return}else e=(t=document.getElementById("domphy-themes"))!=null?t:Object.assign(document.createElement("style"),{id:"domphy-themes"}),e.textContent=b(),document.head.appendChild(e)}function M(e){return e/4+"em"}function p(e){let r=typeof e=="function"?e.elementNode:e;for(;r&&(!r.attributes||!r.attributes.get("dataTheme"));)r=r.parent;let n="light";return r.attributes&&r.attributes.has("dataTheme")&&(n=r.attributes.get("dataTheme"),typeof e=="function"&&r.attributes.onChange("dataTheme",e)),n}var y=["inherit"];[...Array(8).keys()].forEach(e=>{y.push(`decrease-${e}`),y.push(`increase-${e}`)});function E(e,t="inherit"){if(!y.includes(t))throw Error(`size name "${t}" invalid`);let r;if(t=="inherit")r=e;else if(t!=null&&t.startsWith("increase-")){let n=parseInt(t.replace("increase-",""),10);r=e+n}else if(t!=null&&t.startsWith("decrease-")){let n=parseInt(t.replace("decrease-",""),10);r=e-n}else r=e;return Math.max(0,Math.min(8,r))}function $(e){if(!e)return 2;let r=typeof e=="function"?e.elementNode:e;for(;r&&(!r.attributes||!r.attributes.get("dataSize"));)r=r.parent;let n=2;return r&&r.attributes&&r.attributes.has("dataSize")&&(n=E(n,r.attributes.get("dataSize")),typeof e=="function"&&r.attributes.onChange("dataSize",e)),n}function P(e,t="inherit"){let r=E($(e),t);return m().fontSizes[r]}var l=12,c=["inherit","base"];[...Array(l).keys()].forEach(e=>{c.push(`decrease-${e}`),c.push(`increase-${e}`),c.push(`shift-${e}`)});function g(e,t){if(e<0||e>l-1)return e;let r=e+t;return r=Math.max(0,Math.min(l-1,r)),r}function C(e,t){if(e<0||e>l-1)return e;let r=e<=5?e+t:e-t;return r=r<0||r>l-1?-r:r,r=Math.max(0,Math.min(l-1,r)),r}function h(e,t="inherit"){if(typeof t=="number")return t;if(t=="inherit")return e;if(!c.includes(t))throw Error(`tone name "${t}" invalid`);if(t.startsWith("increase-")){let r=parseInt(t.replace("increase-",""),10);return g(e,r)}else if(t.startsWith("decrease-")){let r=parseInt(t.replace("decrease-",""),10);return g(e,-r)}else if(t.startsWith("shift-")){let r=parseInt(t.replace("shift-",""),10);return C(e,r)}else return e}function N(e){if(!e)return 0;let r=typeof e=="function"?e.elementNode:e;for(;r&&(!r.attributes||!r.attributes.get("dataTone"));)r=r.parent;let n=0;return r&&r.attributes&&r.attributes.has("dataTone")&&(n=h(n,r.attributes.get("dataTone")),typeof e=="function"&&r.attributes.onChange("dataTone",e)),n}function w(e,t="inherit"){return h(N(e),t)}function H(e,t="inherit",r="inherit"){let n=typeof e=="function"?e.elementNode:e,f=r=="inherit"?n.getContext("themeColor")||"neutral":r,o;return t=="base"?o=d(p(e)).baseTones[f]:o=h(N(e),t),m()[f][o]}function J(e,t="inherit",r="inherit"){let n=r=="inherit"?"neutral":r;if(!e)return m()[n][h(0,t)];let f;return t=="base"?f=d(p(e)).baseTones[n]:f=w(e,t),m()[n][f]}export{H as contextColor,I as createDark,d as getTheme,A as setTheme,R as themeApply,b as themeCSS,J as themeColor,p as themeName,P as themeSize,M as themeSpacing,L as themeTokens,m as themeVars};
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/light.ts","../src/theme.ts","../src/size.ts","../src/tone.ts"],"sourcesContent":["import { ThemeInput } from \"./types.js\";\r\n\r\nlet light: ThemeInput = {\r\n direction: \"darken\",\r\n colors: {\r\n highlight: [\"#ffffff\", \"#fcf4d6\", \"#fddc69\", \"#f1c21b\", \"#d2a106\", \"#b28600\", \"#8e6a00\", \"#684e00\", \"#483700\", \"#302400\", \"#1c1500\", \"#000000\"],\r\n warning: [\"#ffffff\", \"#fff2e8\", \"#ffd9be\", \"#ffb784\", \"#ff832b\", \"#eb6200\", \"#ba4e00\", \"#8a3800\", \"#5e2900\", \"#3e1a00\", \"#231000\", \"#000000\"],\r\n error: [\"#ffffff\", \"#fff1f1\", \"#ffd7d9\", \"#ffb3b8\", \"#ff8389\", \"#fa4d56\", \"#da1e28\", \"#a2191f\", \"#750e13\", \"#520408\", \"#2d0709\", \"#000000\"],\r\n danger: [\"#ffffff\", \"#fff1f1\", \"#ffd7d9\", \"#ffb3b8\", \"#ff8389\", \"#fa4d56\", \"#da1e28\", \"#a2191f\", \"#750e13\", \"#520408\", \"#2d0709\", \"#000000\"],\r\n secondary: [\"#ffffff\", \"#fff0f7\", \"#ffd6e8\", \"#ffafd2\", \"#ff7eb6\", \"#ee5396\", \"#d02670\", \"#9f1853\", \"#740937\", \"#510224\", \"#2a0a18\", \"#000000\"],\r\n primary: [\"#ffffff\", \"#edf5ff\", \"#d0e2ff\", \"#a6c8ff\", \"#78a9ff\", \"#4589ff\", \"#0f62fe\", \"#0043ce\", \"#002d9c\", \"#001d6c\", \"#001141\", \"#000000\"],\r\n info: [\"#ffffff\", \"#e5f6ff\", \"#bae6ff\", \"#82cfff\", \"#33b1ff\", \"#1192e8\", \"#0072c3\", \"#00539a\", \"#003a6d\", \"#012749\", \"#061727\", \"#000000\"],\r\n success: [\"#ffffff\", \"#defbe6\", \"#a7f0ba\", \"#6fdc8c\", \"#42be65\", \"#24a148\", \"#198038\", \"#0e6027\", \"#044317\", \"#022d0d\", \"#071908\", \"#000000\"],\r\n neutral: [\"#ffffff\", \"#f4f4f4\", \"#e0e0e0\", \"#c6c6c6\", \"#a8a8a8\", \"#8d8d8d\", \"#6f6f6f\", \"#525252\", \"#393939\", \"#262626\", \"#161616\", \"#000000\"],\r\n },\r\n baseTones: {\r\n highlight: 3,\r\n warning: 4,\r\n error: 5,\r\n secondary: 5,\r\n primary: 6,\r\n info: 5,\r\n success: 5,\r\n neutral: 5,\r\n },\r\n fontSizes: [\"0.75rem\", \"0.875rem\", \"1rem\", \"1.25rem\", \"1.5625rem\", \"1.9375rem\", \"2.4375rem\", \"3.0625rem\"],\r\n// pixels: 12 | 14 | 16 | 20 | 25 | 31 | 39 | 49\r\n custom: {},\r\n}\r\n\r\nexport default light\r\n","import { ElementNode, Listener } from \"@domphy/core\";\nimport { ThemeInput, ThemeVars } from \"./types.js\";\nimport light from \"./light.js\";\n\nconst themes: Record<string, ThemeInput> = {\n light: JSON.parse(JSON.stringify(light)),\n dark: createDark(light),\n};\n\n// --- Validation ---\n\nfunction validateTheme(partial: Partial<ThemeInput>): void {\n for (let key in partial) {\n if (!Object.keys(light).includes(key as keyof ThemeInput)) {\n throw new Error(`Invalid key: ${key}`);\n }\n }\n if (partial.fontSizes && !Array.isArray(partial.fontSizes)) {\n throw new Error(`fontSize must be array of string`);\n }\n if (\"custom\" in partial) {\n const custom = partial.custom!;\n if (typeof custom !== \"object\" || custom === null) {\n throw new Error(`Invalid custom property: must be an object`);\n }\n }\n}\n\n// --- Deep Merge ---\n\nfunction deepMerge(target: any, source: any): void {\n for (const key in source) {\n if (\n source[key] &&\n typeof source[key] === \"object\" &&\n !Array.isArray(source[key])\n ) {\n target[key] ??= {};\n deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n }\n}\n\n// --- Builders (pure functions) ---\n\nfunction buildThemeCSS(name: string, input: ThemeInput): string {\n const styles: Record<string, string | number> = {};\n\n for (const key in input) {\n const value = input[key as keyof ThemeInput];\n\n if (key === \"colors\") {\n for (const colorName in input.colors) {\n [...Array(12).keys()].forEach(i =>\n styles[`--${colorName}-${i}`] = input.colors[colorName][i]\n );\n }\n } else if (key === \"fontSizes\") {\n [...Array(8).keys()].forEach(i =>\n styles[`--fontSize-${i}`] = input.fontSizes[i]\n );\n } else {\n if (typeof value === \"object\" && value !== null) {\n for (const k in value) {\n styles[`--${key}-${k.replace(\"/\", \"_\")}`] = (value as Record<string, string>)[k];\n }\n }\n }\n }\n\n let text = \"\";\n for (const prop in styles) {\n text += ` ${prop}: ${styles[prop]};\\n`;\n }\n return `[data-theme=\"${name}\"] {\\n${text}}`;\n}\n\n// --- Public API ---\n\nexport function getTheme(name: string): ThemeInput {\n if (!themes[name]) throw Error(`Theme \"${name}\" not found`);\n return themes[name];\n}\n\nexport function setTheme(name: string, input: Partial<ThemeInput>): void {\n validateTheme(input);\n if (!themes[name]) themes[name] = structuredClone(light);\n deepMerge(themes[name], input);\n}\n\nexport function createDark(source: ThemeInput): ThemeInput {\n let dark = structuredClone(source)\n dark.direction = \"lighten\"\n for (let name in dark.colors) {\n dark.colors[name].reverse()\n dark.baseTones[name] = 12 - 1 - dark.baseTones[name]\n }\n return dark\n}\n\nexport function themeTokens(name: string): Record<string, any> {\n let input = getTheme(name)\n let tokens: Record<string, any> = {};\n\n for (const key in input) {\n const value = input[key as keyof ThemeInput];\n\n if (key === \"colors\") {\n for (const name in input.colors) {\n let colorTones = {} as Partial<Record<number, string>>;\n [...Array(12).keys()].forEach(i => colorTones[i] = input.colors[name][i]);\n tokens[name] = colorTones as Record<number, string>;\n }\n } else if (key === \"fontSizes\") {\n tokens.fontSizes = input.fontSizes;\n } else {\n tokens[key] = {} as any;\n if (typeof value === \"object\" && value !== null) {\n for (const k in value) {\n tokens[key][k] = (value as Record<string, string>)[k];\n }\n }\n }\n }\n\n return tokens;\n}\n\nexport function themeVars(): ThemeVars {\n let input = getTheme(\"light\")\n let theme = {} as ThemeVars;\n\n for (const key in input) {\n const section = key as keyof ThemeVars;\n const value = input[key as keyof ThemeInput];\n\n if (key === \"colors\") {\n for (const name in input.colors) {\n let colorTones = {} as Partial<Record<number, string>>;\n [...Array(12).keys()].forEach(i => colorTones[i] = `var(--${name}-${i})`);\n theme[name] = colorTones as Record<number, string>;\n }\n } else if (key === \"fontSizes\") {\n theme.fontSizes = [...Array(8).keys()].map(i => `var(--fontSize-${i})`);\n } else {\n theme[section] = {} as ThemeVars[typeof section];\n if (typeof value === \"object\" && value !== null) {\n for (const k in value) {\n (theme[section] as Record<string, string>)[k] = `var(--${section as string}-${k.replace(\"/\", \"_\")})`;\n }\n }\n }\n }\n\n return theme;\n}\n\nexport function themeCSS(): string {\n return Object.entries(themes)\n .map(([name, input]) => buildThemeCSS(name, input))\n .join(\"\\n\")\n}\n\nexport function themeApply(el?: HTMLStyleElement): void {\n if (typeof document === \"undefined\") return\n if (el) {\n el.textContent = themeCSS()\n return\n } else {\n el = document.getElementById(\"domphy-themes\") as HTMLStyleElement\n ?? Object.assign(document.createElement(\"style\"), { id: \"domphy-themes\" })\n el.textContent = themeCSS()\n document.head.appendChild(el)\n }\n\n}\n\nexport function themeSpacing(n: number) {\n return n / 4 + \"em\"\n}\n\nexport function themeName(object: ElementNode | Listener) {\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\n let node: ElementNode = elementNode;\n while (node && (!node.attributes || !node.attributes.get(\"dataTheme\"))) {\n node = node.parent as ElementNode\n }\n\n let themeName = \"light\"\n\n if (node.attributes && node.attributes.has(\"dataTheme\")) {\n themeName = node.attributes.get(\"dataTheme\")\n typeof object == \"function\" && node.attributes.onChange(\"dataTheme\", object)\n }\n return themeName\n}\n\nexport type ThemeColor = keyof ThemeInput[\"colors\"]","import type { ElementNode, Listener } from \"@domphy/core\";\r\nimport { themeVars } from \"./theme.js\";\r\n\r\nconst ElementSizes = [\"inherit\"];\r\n\r\n[...Array(8).keys()].forEach(i =>{\r\n ElementSizes.push(`decrease-${i}`)\r\n ElementSizes.push(`increase-${i}`)\r\n})\r\n\r\nexport type ElementSize = typeof ElementSizes[number];\r\n\r\nfunction offsetSize(origin: number, size: ElementSize = \"inherit\"): number {\r\n\r\n if (!ElementSizes.includes(size!)) {\r\n throw Error(`size name \"${size}\" invalid`)\r\n }\r\n let resultSize: number\r\n if (size == \"inherit\") {\r\n resultSize = origin as number\r\n } else if (size?.startsWith(\"increase-\")) {\r\n let offset = parseInt(size.replace(\"increase-\", \"\"), 10)\r\n resultSize = origin + offset;\r\n } else if (size?.startsWith(\"decrease-\")) {\r\n let offset = parseInt(size.replace(\"decrease-\", \"\"), 10)\r\n resultSize = origin - offset;\r\n } else {\r\n resultSize = origin\r\n }\r\n return Math.max(0, Math.min(8, resultSize))\r\n}\r\n\r\nfunction contextSize(object: ElementNode | Listener | null): number {\r\n\r\n if (!object) return 2\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n let node: ElementNode = elementNode;\r\n while (node && (!node.attributes || !node.attributes.get(\"dataSize\"))) {\r\n node = node.parent as ElementNode\r\n }\r\n\r\n let size = 2\r\n\r\n if (node && node.attributes && node.attributes.has(\"dataSize\")) {\r\n size = offsetSize(size, node.attributes.get(\"dataSize\"))\r\n typeof object == \"function\" && node.attributes.onChange(\"dataSize\", object)\r\n }\r\n return size\r\n}\r\n\r\n\r\nexport function themeSize(object: ElementNode | Listener, size: ElementSize = \"inherit\"): string {\r\n let index = offsetSize(contextSize(object), size)\r\n return themeVars().fontSizes[index]\r\n}","import { themeVars, getTheme, themeName } from \"./theme.js\"\r\nimport type { Listener, ElementNode } from \"@domphy/core\";\r\n\r\nconst TONE_STEPS = 12\r\n\r\nconst ElementTones = [\"inherit\", \"base\"];\r\n\r\n[...Array(TONE_STEPS).keys()].forEach(i => {\r\n ElementTones.push(`decrease-${i}`)\r\n ElementTones.push(`increase-${i}`)\r\n ElementTones.push(`shift-${i}`)\r\n})\r\n\r\nexport type ElementTone = typeof ElementTones[number];\r\n\r\nfunction adjustTone(tone: number, level: number): number {\r\n if (tone < 0 || tone > TONE_STEPS - 1) return tone\r\n let newIndex = tone + level;\r\n newIndex = Math.max(0, Math.min(TONE_STEPS - 1, newIndex));\r\n return newIndex\r\n}\r\n\r\nfunction shiftTone(tone: number, level: number): number {\r\n if (tone < 0 || tone > TONE_STEPS - 1) return tone\r\n let newIndex = tone <= 5 ? tone + level : tone - level\r\n newIndex = newIndex < 0 || newIndex > TONE_STEPS - 1 ? - newIndex : newIndex\r\n newIndex = Math.max(0, Math.min(TONE_STEPS - 1, newIndex));\r\n return newIndex\r\n}\r\n\r\nfunction offsetTone(originTone: number, tone: ElementTone = \"inherit\"): number {\r\n\r\n if (typeof tone == \"number\") return tone\r\n\r\n if (tone == \"inherit\") return originTone\r\n\r\n if (!ElementTones.includes(tone!)) {\r\n throw Error(`tone name \"${tone}\" invalid`)\r\n }\r\n\r\n if (tone.startsWith(\"increase-\")) {\r\n let offset = parseInt(tone.replace(\"increase-\", \"\"), 10)\r\n return adjustTone(originTone, offset);\r\n\r\n } else if (tone.startsWith(\"decrease-\")) {\r\n let offset = parseInt(tone.replace(\"decrease-\", \"\"), 10)\r\n return adjustTone(originTone, - offset);\r\n\r\n } else if (tone.startsWith(\"shift-\")) {\r\n let offset = parseInt(tone.replace(\"shift-\", \"\"), 10)\r\n return shiftTone(originTone, offset);\r\n\r\n } else {\r\n return originTone\r\n }\r\n}\r\n\r\nfunction contextTone(object: ElementNode | Listener | null): number {\r\n\r\n if (!object) return 0\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n let node: ElementNode = elementNode;\r\n while (node && (!node.attributes || !node.attributes.get(\"dataTone\"))) {\r\n node = node.parent as ElementNode\r\n }\r\n\r\n let tone = 0\r\n\r\n if (node && node.attributes && node.attributes.has(\"dataTone\")) {\r\n tone = offsetTone(tone, node.attributes.get(\"dataTone\"))\r\n typeof object == \"function\" && node.attributes.onChange(\"dataTone\", object)\r\n }\r\n return tone\r\n}\r\n\r\nfunction themeTone(object: ElementNode | Listener, tone: ElementTone = \"inherit\"): number {\r\n\r\n return offsetTone(contextTone(object), tone)\r\n}\r\n\r\nexport function contextColor(object: ElementNode | Listener, tone: ElementTone = \"inherit\", color: string = \"inherit\"): string {\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n\r\n let themeColor = color == \"inherit\" ? elementNode.getContext(\"themeColor\") || \"neutral\" : color;\r\n\r\n let resultTone: number\r\n if (tone == \"base\") {\r\n resultTone = getTheme(themeName(object)).baseTones[themeColor]\r\n } else {\r\n resultTone = offsetTone(contextTone(object), tone)\r\n }\r\n let resultColor = themeVars()[themeColor][resultTone]\r\n\r\n return resultColor\r\n}\r\nexport function themeColor(object: ElementNode | Listener | null, tone: ElementTone = \"inherit\", color: string = \"inherit\"): string {\r\n\r\n let themeColor = color == \"inherit\" ? \"neutral\" : color;\r\n\r\n if (!object) {\r\n return themeVars()[themeColor][offsetTone(0, tone)]\r\n }\r\n\r\n let resultTone: number\r\n if (tone == \"base\") {\r\n resultTone = getTheme(themeName(object)).baseTones[themeColor]\r\n } else {\r\n resultTone = themeTone(object, tone)\r\n }\r\n let resultColor = themeVars()[themeColor][resultTone]\r\n\r\n return resultColor\r\n}\r\n"],"mappings":"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","names":["light","light_default","themes","light_default","createDark","validateTheme","partial","key","custom","deepMerge","target","source","_a","buildThemeCSS","name","input","styles","value","colorName","i","k","text","prop","getTheme","setTheme","dark","themeTokens","tokens","colorTones","themeVars","theme","section","themeCSS","themeApply","el","themeSpacing","n","themeName","object","node","ElementSizes","i","offsetSize","origin","size","resultSize","offset","contextSize","object","node","themeSize","index","themeVars","TONE_STEPS","ElementTones","i","adjustTone","tone","level","newIndex","shiftTone","offsetTone","originTone","offset","contextTone","object","node","themeTone","contextColor","color","elementNode","themeColor","resultTone","getTheme","themeName","themeVars"]}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@domphy/theme",
3
+ "version": "0.1.0",
4
+ "description": "Domphy Design System",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js",
10
+ "require": "./dist/index.cjs"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "build": "tsup",
15
+ "pack": "tsup && npm pack",
16
+ "prepublishOnly": "npm run build",
17
+ "test": "vitest run",
18
+ "test:watch": "vitest"
19
+ },
20
+ "keywords": [
21
+ "domphy"
22
+ ],
23
+ "author": "Huu Khanh Nguyen",
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/domphy/domphy.git",
28
+ "directory": "packages/theme"
29
+ },
30
+ "devDependencies": {
31
+ "tsup": "^8.5.0",
32
+ "typescript": "^5.8.3"
33
+ },
34
+ "dependencies": {
35
+ "@domphy/core": "workspace:*"
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "README.md"
40
+ ],
41
+ "unpkg": "dist/core-theme.global.js",
42
+ "jsdelivr": "dist/core-theme.global.js"
43
+ }