UNPKG

@sc4rfurryx/proteusjs

Version:

The Modern Web Development Framework for Accessible, Responsive, and High-Performance Applications. Intelligent container queries, fluid typography, WCAG compliance, and performance optimization.

7 lines 251 kB
/*! * ProteusJS v2.0.0 * Shape-shifting responsive design that adapts like the sea god himself * (c) 2025 sc4rfurry * Released under the MIT License */ class e{constructor(e={}){this.levels={debug:0,info:1,warn:2,error:3,silent:4},this.config={level:"warn",prefix:"ProteusJS",enableInProduction:!1,enableTimestamps:!1,enableStackTrace:!1,...e}}static getInstance(t){return e.instance||(e.instance=new e(t)),e.instance}static configure(t){e.instance?e.instance.config={...e.instance.config,...t}:e.instance=new e(t)}shouldLog(e){return"production"!==process.env.NODE_ENV||this.config.enableInProduction?this.levels[e]>=this.levels[this.config.level]:"error"===e}formatMessage(e,t,...i){let s=t;if(this.config.prefix&&(s=`${this.config.prefix}: ${s}`),this.config.enableTimestamps){s=`[${(new Date).toISOString()}] ${s}`}return s=`[${e.toUpperCase().padEnd(5)}] ${s}`,[s,...i]}debug(e,...t){if(!this.shouldLog("debug"))return;const[i,...s]=this.formatMessage("debug",e,...t);this.config.enableStackTrace}info(e,...t){if(!this.shouldLog("info"))return;const[i,...s]=this.formatMessage("info",e,...t)}warn(e,...t){if(!this.shouldLog("warn"))return;const[i,...s]=this.formatMessage("warn",e,...t)}error(e,t,...i){if(!this.shouldLog("error"))return;const[s,...n]=this.formatMessage("error",e,...i);t instanceof Error&&this.config.enableStackTrace&&t.stack}group(e){this.shouldLog("info")}groupEnd(){this.shouldLog("info")}time(e){this.shouldLog("debug")}timeEnd(e){this.shouldLog("debug")}setLevel(e){this.config.level=e}getLevel(){return this.config.level}isEnabled(e){return this.shouldLog(e)}}const t=e.getInstance({level:"development"===process.env.NODE_ENV?"debug":"warn",prefix:"ProteusJS",enableInProduction:!1,enableTimestamps:"development"===process.env.NODE_ENV,enableStackTrace:!1});class i{constructor(){this.listeners=new Map,this.initialized=!1}init(){this.initialized||(this.initialized=!0)}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set);const i=this.listeners.get(e);return i.add(t),()=>{i.delete(t),0===i.size&&this.listeners.delete(e)}}once(e,t){const i=this.on(e,e=>{t(e),i()});return i}off(e,t){if(!t)return void this.listeners.delete(e);const i=this.listeners.get(e);i&&(i.delete(t),0===i.size&&this.listeners.delete(e))}emit(e,t,i){const s=this.listeners.get(e);if(!s||0===s.size)return;const n={type:e,target:i||document.documentElement,detail:t,timestamp:Date.now()};s.forEach(e=>{try{e(n)}catch(e){}})}getEventTypes(){return Array.from(this.listeners.keys())}getListenerCount(e){const t=this.listeners.get(e);return t?t.size:0}hasListeners(e){return this.getListenerCount(e)>0}clear(){this.listeners.clear()}destroy(){this.clear(),this.initialized=!1}getDebugInfo(){const e={};return this.listeners.forEach((t,i)=>{e[i]=t.size}),{initialized:this.initialized,totalEventTypes:this.listeners.size,listeners:e}}}class s{constructor(e){this.plugins=new Map,this.installedPlugins=new Set,this.initialized=!1,this.proteus=e}init(){this.initialized||(this.initialized=!0)}register(e){if(this.plugins.has(e.name))return this;if(!this.validatePlugin(e))throw new Error(`ProteusJS: Invalid plugin "${e.name}"`);return this.plugins.set(e.name,e),this}install(e){const t=this.plugins.get(e);if(!t)throw new Error(`ProteusJS: Plugin "${e}" not found`);if(this.installedPlugins.has(e))return this;if(t.dependencies)for(const i of t.dependencies)if(!this.installedPlugins.has(i))throw new Error(`ProteusJS: Plugin "${e}" requires dependency "${i}" to be installed first`);try{t.install(this.proteus),this.installedPlugins.add(e),this.proteus.getEventSystem().emit("pluginInstalled",{plugin:e,version:t.version})}catch(e){throw e}return this}uninstall(e){const t=this.plugins.get(e);if(!t)return this;if(!this.installedPlugins.has(e))return this;const i=this.getDependents(e);if(i.length>0)throw new Error(`ProteusJS: Cannot uninstall plugin "${e}" because it's required by: ${i.join(", ")}`);try{t.uninstall&&t.uninstall(this.proteus),this.installedPlugins.delete(e),this.proteus.getEventSystem().emit("pluginUninstalled",{plugin:e,version:t.version})}catch(e){throw e}return this}isInstalled(e){return this.installedPlugins.has(e)}getRegisteredPlugins(){return Array.from(this.plugins.keys())}getInstalledPlugins(){return Array.from(this.installedPlugins)}getPluginInfo(e){return this.plugins.get(e)}installMany(e){const t=this.sortByDependencies(e);for(const e of t)this.install(e);return this}destroy(){const e=Array.from(this.installedPlugins),t=this.sortByDependencies(e).reverse();for(const e of t)try{this.uninstall(e)}catch(e){}this.plugins.clear(),this.installedPlugins.clear(),this.initialized=!1}validatePlugin(e){return!(!e.name||"string"!=typeof e.name)&&(!(!e.version||"string"!=typeof e.version)&&!(!e.install||"function"!=typeof e.install))}getDependents(e){const t=[];for(const[i,s]of this.plugins)this.installedPlugins.has(i)&&s.dependencies?.includes(e)&&t.push(i);return t}sortByDependencies(e){const t=[],i=new Set,s=new Set,n=r=>{if(s.has(r))throw new Error(`ProteusJS: Circular dependency detected involving plugin "${r}"`);if(i.has(r))return;s.add(r);const o=this.plugins.get(r);if(o?.dependencies)for(const t of o.dependencies)e.includes(t)&&n(t);s.delete(r),i.add(r),t.push(r)};for(const t of e)n(t);return t}}class n{constructor(){this.resources=new Map,this.elementResources=new Map,this.mutationObserver=null,this.cleanupInterval=null,this.isMonitoring=!1,this.setupDOMObserver(),this.startPeriodicCleanup()}register(e){const t={...e,timestamp:Date.now()};return this.resources.set(e.id,t),e.element&&(this.elementResources.has(e.element)||this.elementResources.set(e.element,new Set),this.elementResources.get(e.element).add(e.id)),e.id}unregister(e){const t=this.resources.get(e);if(!t)return!1;try{t.cleanup()}catch(e){}if(this.resources.delete(e),t.element){const i=this.elementResources.get(t.element);i&&(i.delete(e),0===i.size&&this.elementResources.delete(t.element))}return!0}cleanupElement(e){const t=this.elementResources.get(e);if(!t)return 0;let i=0;return t.forEach(e=>{this.unregister(e)&&i++}),i}cleanupByType(e){let t=0;const i=[];return this.resources.forEach((t,s)=>{t.type===e&&i.push(s)}),i.forEach(e=>{this.unregister(e)&&t++}),t}cleanupOldResources(e=3e5){let t=0;const i=Date.now(),s=[];return this.resources.forEach((t,n)=>{i-t.timestamp>e&&s.push(n)}),s.forEach(e=>{this.unregister(e)&&t++}),t}forceGarbageCollection(){if("gc"in window&&"function"==typeof window.gc)try{window.gc()}catch(e){}}getMemoryInfo(){const e={managedResources:this.resources.size,trackedElements:this.elementResources.size,resourcesByType:{}};if(this.resources.forEach(t=>{e.resourcesByType[t.type]=(e.resourcesByType[t.type]||0)+1}),"memory"in performance){const t=performance.memory;e.browserMemory={usedJSHeapSize:t.usedJSHeapSize,totalJSHeapSize:t.totalJSHeapSize,jsHeapSizeLimit:t.jsHeapSizeLimit}}return e}detectLeaks(){const e=[],t=Date.now();this.resources.size>1e3&&e.push(`High number of managed resources: ${this.resources.size}`);let i=0;this.resources.forEach(e=>{t-e.timestamp>6e5&&i++}),i>50&&e.push(`Many old resources detected: ${i}`);let s=0;return this.elementResources.forEach((e,t)=>{document.contains(t)||(s+=e.size)}),s>0&&e.push(`Orphaned element resources detected: ${s}`),e}destroy(){Array.from(this.resources.keys()).forEach(e=>this.unregister(e)),this.stopMonitoring(),this.resources.clear(),this.elementResources.clear()}startMonitoring(){this.isMonitoring||(this.isMonitoring=!0)}stopMonitoring(){this.isMonitoring&&(this.isMonitoring=!1,this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=null))}setupDOMObserver(){"undefined"!=typeof MutationObserver&&(this.mutationObserver=new MutationObserver(e=>{e.forEach(e=>{"childList"===e.type&&e.removedNodes.forEach(e=>{e.nodeType===Node.ELEMENT_NODE&&this.handleElementRemoval(e)})})}),this.mutationObserver.observe(document.body,{childList:!0,subtree:!0}))}handleElementRemoval(e){this.cleanupElement(e);e.querySelectorAll("*").forEach(e=>{this.cleanupElement(e)})}startPeriodicCleanup(){this.cleanupInterval=window.setInterval(()=>{let e=0;this.elementResources.forEach((t,i)=>{document.contains(i)||(e+=this.cleanupElement(i))});this.cleanupOldResources(6e5)},6e4)}}class r{constructor(e){this.observedElements=new Map,this.rafId=null,this.isObserving=!1,this.callback=e}observe(e,t){if(this.observedElements.has(e))return;const i=e.getBoundingClientRect();this.observedElements.set(e,{lastWidth:i.width,lastHeight:i.height}),this.isObserving||this.startObserving()}unobserve(e){this.observedElements.delete(e),0===this.observedElements.size&&this.stopObserving()}disconnect(){this.observedElements.clear(),this.stopObserving()}startObserving(){this.isObserving||(this.isObserving=!0,this.checkForChanges())}stopObserving(){this.isObserving&&(this.isObserving=!1,this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null))}checkForChanges(){if(!this.isObserving)return;const e=[];if(this.observedElements.forEach((t,i)=>{if(!document.contains(i))return void this.observedElements.delete(i);const s=i.getBoundingClientRect(),n=s.width,r=s.height;if(n!==t.lastWidth||r!==t.lastHeight){this.observedElements.set(i,{lastWidth:n,lastHeight:r});const t={target:i,contentRect:this.createDOMRectReadOnly(s),contentBoxSize:[{inlineSize:n,blockSize:r}],borderBoxSize:[{inlineSize:n,blockSize:r}]};e.push(t)}}),e.length>0)try{this.callback(e)}catch(e){}this.isObserving&&(this.rafId=requestAnimationFrame(()=>this.checkForChanges()))}createDOMRectReadOnly(e){return{x:e.x,y:e.y,width:e.width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,toJSON:()=>({x:e.x,y:e.y,width:e.width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left})}}}r.isSupported=()=>"undefined"!=typeof ResizeObserver;class o{constructor(e,t){this.observedElements=new Map,this.rafId=null,this.isObserving=!1,this.callback=e,this.root=t?.root instanceof Element?t.root:null,this.rootMargin=t?.rootMargin||"0px",this.thresholds=this.normalizeThresholds(t?.threshold),this.parsedRootMargin=this.parseRootMargin(this.rootMargin)}observe(e){this.observedElements.has(e)||(this.observedElements.set(e,{lastRatio:0,wasIntersecting:!1}),this.isObserving||this.startObserving())}unobserve(e){this.observedElements.delete(e),0===this.observedElements.size&&this.stopObserving()}disconnect(){this.observedElements.clear(),this.stopObserving()}startObserving(){this.isObserving||(this.isObserving=!0,this.checkForIntersections())}stopObserving(){this.isObserving&&(this.isObserving=!1,this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null))}checkForIntersections(){if(!this.isObserving)return;const e=[],t=this.getRootBounds();if(this.observedElements.forEach((i,s)=>{if(!document.contains(s))return void this.observedElements.delete(s);const n=s.getBoundingClientRect(),r=this.calculateIntersection(n,t),o=this.calculateIntersectionRatio(n,r),a=o>0;if(this.shouldTriggerCallback(o,i.lastRatio,a,i.wasIntersecting)){this.observedElements.set(s,{lastRatio:o,wasIntersecting:a});const i={target:s,boundingClientRect:this.createDOMRectReadOnly(n),intersectionRect:this.createDOMRectReadOnly(r),rootBounds:t?this.createDOMRectReadOnly(t):null,intersectionRatio:o,isIntersecting:a,time:performance.now()};e.push(i)}}),e.length>0)try{this.callback(e)}catch(e){}this.isObserving&&(this.rafId=requestAnimationFrame(()=>this.checkForIntersections()))}getRootBounds(){const e=(this.root||document.documentElement).getBoundingClientRect();return new DOMRect(e.left-this.parsedRootMargin.left,e.top-this.parsedRootMargin.top,e.width+this.parsedRootMargin.left+this.parsedRootMargin.right,e.height+this.parsedRootMargin.top+this.parsedRootMargin.bottom)}calculateIntersection(e,t){const i=Math.max(e.left,t.left),s=Math.max(e.top,t.top),n=Math.min(e.right,t.right),r=Math.min(e.bottom,t.bottom),o=Math.max(0,n-i),a=Math.max(0,r-s);return new DOMRect(i,s,o,a)}calculateIntersectionRatio(e,t){const i=e.width*e.height;if(0===i)return 0;return t.width*t.height/i}shouldTriggerCallback(e,t,i,s){if(0===t&&!s)return!0;if(i!==s)return!0;for(const i of this.thresholds)if(t<i&&e>=i||t>i&&e<=i)return!0;return!1}normalizeThresholds(e){return void 0===e?[0]:"number"==typeof e?[e]:e.slice().sort((e,t)=>e-t)}parseRootMargin(e){const t=e.split(/\s+/).map(e=>{const t=parseFloat(e);return e.endsWith("%")?t/100*window.innerHeight:t});switch(t.length){case 1:return{top:t[0],right:t[0],bottom:t[0],left:t[0]};case 2:return{top:t[0],right:t[1],bottom:t[0],left:t[1]};case 3:return{top:t[0],right:t[1],bottom:t[2],left:t[1]};case 4:return{top:t[0],right:t[1],bottom:t[2],left:t[3]};default:return{top:0,right:0,bottom:0,left:0}}}createDOMRectReadOnly(e){return{x:e.x,y:e.y,width:e.width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,toJSON:()=>({x:e.x,y:e.y,width:e.width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left})}}}o.isSupported=()=>"undefined"!=typeof IntersectionObserver;class a{constructor(){this.resizeObservers=new Map,this.intersectionObservers=new Map,this.resizeEntries=new Map,this.intersectionEntries=new Map,this.isPolyfillMode=!1,this.checkPolyfillNeeds()}observeResize(e,t,i){const s=this.getResizeObserverKey(i);let n=this.resizeObservers.get(s);n||(n=this.createResizeObserver(i),this.resizeObservers.set(s,n));const r={element:e,callback:t,...i&&{options:i}};return this.resizeEntries.set(e,r),n.observe(e,i),()=>this.unobserveResize(e)}observeIntersection(e,t,i){const s=this.getIntersectionObserverKey(i);let n=this.intersectionObservers.get(s);n||(n=this.createIntersectionObserver(t,i),this.intersectionObservers.set(s,n));const r={element:e,callback:t,...i&&{options:i}};return this.intersectionEntries.set(e,r),n.observe(e),()=>this.unobserveIntersection(e)}unobserveResize(e){const t=this.resizeEntries.get(e);if(!t)return;const i=this.getResizeObserverKey(t.options),s=this.resizeObservers.get(i);s&&s.unobserve(e),this.resizeEntries.delete(e),this.cleanupResizeObserver(i)}unobserveIntersection(e){const t=this.intersectionEntries.get(e);if(!t)return;const i=this.getIntersectionObserverKey(t.options),s=this.intersectionObservers.get(i);s&&s.unobserve(e),this.intersectionEntries.delete(e),this.cleanupIntersectionObserver(i)}getObservedElementCount(){return this.resizeEntries.size+this.intersectionEntries.size}getObserverCount(){return this.resizeObservers.size+this.intersectionObservers.size}isObservingResize(e){return this.resizeEntries.has(e)}isObservingIntersection(e){return this.intersectionEntries.has(e)}destroy(){this.resizeObservers.forEach(e=>e.disconnect()),this.resizeObservers.clear(),this.resizeEntries.clear(),this.intersectionObservers.forEach(e=>e.disconnect()),this.intersectionObservers.clear(),this.intersectionEntries.clear()}getDebugInfo(){return{isPolyfillMode:this.isPolyfillMode,resizeObservers:this.resizeObservers.size,intersectionObservers:this.intersectionObservers.size,resizeEntries:this.resizeEntries.size,intersectionEntries:this.intersectionEntries.size,totalObservedElements:this.getObservedElementCount(),totalObservers:this.getObserverCount()}}checkPolyfillNeeds(){"undefined"==typeof ResizeObserver&&(this.setupResizeObserverPolyfill(),this.isPolyfillMode=!0),"undefined"==typeof IntersectionObserver&&(this.setupIntersectionObserverPolyfill(),this.isPolyfillMode=!0)}setupResizeObserverPolyfill(){globalThis.ResizeObserver=r}setupIntersectionObserverPolyfill(){globalThis.IntersectionObserver=o}createResizeObserver(e){return new ResizeObserver(e=>{e.forEach(e=>{const t=this.resizeEntries.get(e.target);t&&t.callback(e)})})}createIntersectionObserver(e,t){return new IntersectionObserver(e=>{e.forEach(e=>{const t=this.intersectionEntries.get(e.target);t&&t.callback(e)})},t)}getResizeObserverKey(e){return e?`box:${e.box||"content-box"}`:"default"}getIntersectionObserverKey(e){if(!e)return"default";return`${e.root?"custom":"viewport"}:${e.rootMargin||"0px"}:${Array.isArray(e.threshold)?e.threshold.join(","):(e.threshold||0).toString()}`}cleanupResizeObserver(e){if(!Array.from(this.resizeEntries.values()).some(t=>this.getResizeObserverKey(t.options)===e)){const t=this.resizeObservers.get(e);t&&(t.disconnect(),this.resizeObservers.delete(e))}}cleanupIntersectionObserver(e){if(!Array.from(this.intersectionEntries.values()).some(t=>this.getIntersectionObserverKey(t.options)===e)){const t=this.intersectionObservers.get(e);t&&(t.disconnect(),this.intersectionObservers.delete(e))}}}function c(e,t,i={}){const{leading:s=!1,trailing:n=!0,maxWait:r}=i;let o,a,c,l,h=null,u=0;function d(t){const i=a,s=c;return a=void 0,c=void 0,u=t,l=e.apply(s,i),l}function m(e){const i=e-o;return void 0===o||i>=t||i<0||void 0!==r&&e-u>=r}function p(){const e=Date.now();if(m(e))return g(e);h=window.setTimeout(p,function(e){const i=e-u,s=t-(e-o);return void 0!==r?Math.min(s,r-i):s}(e))}function g(e){return h=null,n&&a?d(e):(a=void 0,c=void 0,l)}function f(...e){const i=Date.now(),n=m(i);if(a=e,c=this,o=i,n){if(null===h)return function(e){return u=e,h=window.setTimeout(p,t),s?d(e):l}(o);if(void 0!==r)return h=window.setTimeout(p,t),d(o)}return null===h&&(h=window.setTimeout(p,t)),l}return f.cancel=function(){null!==h&&(clearTimeout(h),h=null),u=0,a=void 0,o=void 0,c=void 0},f.flush=function(){return null===h?l:g(Date.now())},f}const l=new class{constructor(e){this.marks=new Map,this.measurements=[],this.warningThreshold=.8,this.budget={responseTime:60,frameRate:60,memoryUsage:100,...e}}mark(e,t){const i={name:e,startTime:performance.now(),...t&&{metadata:t}};this.marks.set(e,i),"function"==typeof performance.mark&&performance.mark(`proteus-${e}-start`)}measure(e){const t=this.marks.get(e);if(!t)return null;const i=performance.now(),s=i-t.startTime,n={...t,endTime:i,duration:s};return this.measurements.push(n),this.marks.delete(e),"function"==typeof performance.mark&&"function"==typeof performance.measure&&(performance.mark(`proteus-${e}-end`),performance.measure(`proteus-${e}`,`proteus-${e}-start`,`proteus-${e}-end`)),this.checkBudget(n),n}getMeasurements(){return[...this.measurements]}getMeasurementsByPattern(e){return this.measurements.filter(t=>e.test(t.name))}getAverageDuration(e){const t=this.measurements.filter(t=>t.name===e&&void 0!==t.duration);if(0===t.length)return 0;return t.reduce((e,t)=>e+(t.duration||0),0)/t.length}getStats(){const e={totalMeasurements:this.measurements.length,activeMeasurements:this.marks.size,budget:this.budget,violations:this.getBudgetViolations()},t={};return this.measurements.forEach(e=>{void 0!==e.duration&&(t[e.name]||(t[e.name]={count:0,avgDuration:0,maxDuration:0}),t[e.name].count++,t[e.name].maxDuration=Math.max(t[e.name].maxDuration,e.duration))}),Object.keys(t).forEach(e=>{t[e].avgDuration=this.getAverageDuration(e)}),e.byName=t,e}clear(){this.measurements.length=0,this.marks.clear()}updateBudget(e){this.budget={...this.budget,...e}}checkBudget(e){if(void 0===e.duration)return;this.budget.responseTime,this.warningThreshold;const t=this.budget.responseTime;e.duration>t||e.duration}getBudgetViolations(){return this.measurements.filter(e=>void 0!==e.duration&&e.duration>this.budget.responseTime)}};class h{constructor(e,t={},i,s){this.unobserveResize=null,this.isActive=!1,this.liveRegion=null,this.element=e,this.observerManager=i,this.memoryManager=s,this.options={breakpoints:{},containerType:"auto",debounceMs:16,callbacks:{...t.callbacks?.resize&&{resize:t.callbacks.resize},...t.callbacks?.breakpointChange&&{breakpointChange:t.callbacks.breakpointChange}},cssClasses:!0,units:!0,announceChanges:!1,...t},this.state=this.createInitialState(),this.debouncedUpdate=c(this.updateState.bind(this),this.options.debounceMs,{leading:!0,trailing:!0}),"auto"===this.options.containerType&&(this.options.containerType=this.detectContainerType()),this.setupContainerQuery()}activate(){this.isActive||(l.mark("container-activate"),this.unobserveResize=this.observerManager.observeResize(this.element,this.handleResize.bind(this)),this.memoryManager.register({id:`container-${this.getElementId()}`,type:"observer",element:this.element,cleanup:()=>this.deactivate()}),this.isActive=!0,this.options.announceChanges&&this.setupAnnouncements(),this.updateState(),l.measure("container-activate"))}deactivate(){this.isActive&&(this.unobserveResize&&(this.unobserveResize(),this.unobserveResize=null),this.debouncedUpdate.cancel(),this.options.cssClasses&&this.removeCSSClasses(),this.liveRegion&&this.liveRegion.parentNode&&(this.liveRegion.parentNode.removeChild(this.liveRegion),this.liveRegion=null),this.isActive=!1)}getState(){return{...this.state}}getElement(){return this.element}updateBreakpoints(e){this.options.breakpoints={...e},this.updateState()}isBreakpointActive(e){return this.state.activeBreakpoints.includes(e)}getDimensions(){const{width:e,height:t}=this.state;return{px:{width:e,height:t},cw:{width:100,height:t/e*100},ch:{width:e/t*100,height:100},cmin:Math.min(e,t),cmax:Math.max(e,t)}}handleResize(e){this.debouncedUpdate()}updateState(){l.mark("container-update");const e=this.element.getBoundingClientRect(),t=e.width,i=e.height,s=i>0?t/i:0;if(Math.abs(t-this.state.width)<.5&&Math.abs(i-this.state.height)<.5)return void l.measure("container-update");const n=[...this.state.activeBreakpoints];this.state={width:t,height:i,aspectRatio:s,containerType:this.options.containerType,activeBreakpoints:this.calculateActiveBreakpoints(t,i),lastUpdate:Date.now()},this.options.cssClasses&&this.updateCSSClasses(n),this.options.units&&this.updateContainerUnits(),this.options.callbacks.resize&&this.options.callbacks.resize(this.state),this.options.callbacks.breakpointChange&&this.notifyBreakpointChanges(n,this.state.activeBreakpoints),this.options.announceChanges&&this.announce(`Layout changed to ${this.state.activeBreakpoints.join(", ")||"default"} view`),l.measure("container-update")}createInitialState(){const e=this.element.getBoundingClientRect();return{width:e.width,height:e.height,aspectRatio:e.height>0?e.width/e.height:0,containerType:"inline-size",activeBreakpoints:[],lastUpdate:Date.now()}}detectContainerType(){try{const e=getComputedStyle(this.element).contain;return e&&"string"==typeof e?e.includes("inline-size")?"inline-size":e.includes("size")?"size":e.includes("block-size")?"block-size":"inline-size":"inline-size"}catch(e){return t.warn("Failed to detect container type:",e),"inline-size"}}setupContainerQuery(){if("undefined"!=typeof CSS&&CSS.supports&&CSS.supports("container-type","inline-size")){const e=this.element;e.style.containerType="auto"===this.options.containerType?"inline-size":this.options.containerType;const t=this.generateContainerName();e.style.containerName=t}}calculateActiveBreakpoints(e,t){const i=[];return Object.entries(this.options.breakpoints).forEach(([s,n])=>{const r=this.parseBreakpointValue(n);this.getRelevantDimension(e,t)>=r&&i.push(s)}),i.sort((e,t)=>this.parseBreakpointValue(this.options.breakpoints[e])-this.parseBreakpointValue(this.options.breakpoints[t]))}getRelevantDimension(e,t){switch(this.options.containerType){case"inline-size":default:return e;case"block-size":return t;case"size":return Math.min(e,t)}}parseBreakpointValue(e){return"number"==typeof e?e:e.endsWith("px")?parseFloat(e):e.endsWith("em")||e.endsWith("rem")?16*parseFloat(e):parseFloat(e)||0}updateCSSClasses(e){const t=this.element,i=this.getClassPrefix();e.forEach(e=>{t.classList.remove(`${i}--${e}`)}),this.state.activeBreakpoints.forEach(e=>{t.classList.add(`${i}--${e}`)})}removeCSSClasses(){const e=this.element,t=this.getClassPrefix();this.state.activeBreakpoints.forEach(i=>{e.classList.remove(`${t}--${i}`)})}updateContainerUnits(){const e=this.element,{width:t,height:i}=this.state;e.style.setProperty("--cw",t/100+"px"),e.style.setProperty("--ch",i/100+"px"),e.style.setProperty("--cmin",Math.min(t,i)/100+"px"),e.style.setProperty("--cmax",Math.max(t,i)/100+"px"),e.style.setProperty("--cqi",t/100+"px"),e.style.setProperty("--cqb",i/100+"px")}notifyBreakpointChanges(e,t){const i=this.options.callbacks.breakpointChange;t.forEach(t=>{e.includes(t)||i(t,!0)}),e.forEach(e=>{t.includes(e)||i(e,!1)})}generateContainerName(){return`proteus-${this.getElementId()}`}getClassPrefix(){return this.element.className.split(" ")[0]||"proteus-container"}getElementId(){if(this.element.id)return this.element.id;const e=Array.from(document.querySelectorAll(this.element.tagName)).indexOf(this.element);return`${this.element.tagName.toLowerCase()}-${e}`}setupAnnouncements(){}announce(e){this.liveRegion||(this.liveRegion=document.createElement("div"),this.liveRegion.setAttribute("aria-live","polite"),this.liveRegion.setAttribute("aria-atomic","true"),this.liveRegion.style.cssText="position: absolute; left: -10000px; width: 1px; height: 1px; overflow: hidden;",document.body.appendChild(this.liveRegion)),this.liveRegion.textContent=e;try{const e=new Event("DOMSubtreeModified",{bubbles:!0});this.liveRegion.dispatchEvent(e)}catch(e){}try{const e=new Event("DOMNodeInserted",{bubbles:!0});this.liveRegion.dispatchEvent(e)}catch(e){}}announceBreakpointChanges(e,t){const i=t.filter(t=>!e.includes(t)),s=e.filter(e=>!t.includes(e));if(i.length>0){const e=`Layout changed to ${i.join(", ")} view`;return this.announce(e),!0}if(s.length>0&&t.length>0){const e=`Layout changed to ${t.join(", ")} view`;return this.announce(e),!0}return!1}}class u{constructor(e,t,i,s){this.containers=new Map,this.autoDetectionEnabled=!1,this.observerManager=t,this.memoryManager=i,this.eventSystem=s,this.config={autoDetect:!0,breakpoints:{sm:"300px",md:"500px",lg:"800px",xl:"1200px"},units:!0,isolation:!0,polyfill:!0,...e},this.config.autoDetect&&this.enableAutoDetection()}container(e,t={}){l.mark("container-create");const i=this.normalizeSelector(e),s=[];return i.forEach(e=>{let i=this.containers.get(e);if(i)t.breakpoints&&i.updateBreakpoints(t.breakpoints);else{const s={breakpoints:this.config.breakpoints,...t};i=new h(e,s,this.observerManager,this.memoryManager),this.containers.set(e,i),i.activate(),this.eventSystem.emit("containerCreated",{element:e,container:i,options:s})}s.push(i)}),l.measure("container-create"),1===i.length?s[0]:s}removeContainer(e){const t=this.normalizeSelector(e);let i=!1;return t.forEach(e=>{const t=this.containers.get(e);t&&(t.deactivate(),this.containers.delete(e),i=!0,this.eventSystem.emit("containerRemoved",{element:e,container:t}))}),i}getContainer(e){return this.containers.get(e)}getAllContainers(){return Array.from(this.containers.values())}getContainersByBreakpoint(e){return this.getAllContainers().filter(t=>t.isBreakpointActive(e))}updateGlobalBreakpoints(e){const t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,String(t)]));this.config.breakpoints={...this.config.breakpoints,...t},this.containers.forEach(e=>{e.updateBreakpoints(this.config.breakpoints)}),this.eventSystem.emit("breakpointsUpdated",{breakpoints:this.config.breakpoints})}enableAutoDetection(){this.autoDetectionEnabled||(this.autoDetectionEnabled=!0,this.scanForContainers(),this.setupMutationObserver())}disableAutoDetection(){this.autoDetectionEnabled=!1}scanForContainers(){if(!this.autoDetectionEnabled)return;l.mark("container-scan");this.findContainerCandidates().forEach(e=>{if(!this.containers.has(e)){const t=this.extractOptionsFromElement(e);this.container(e,t)}}),l.measure("container-scan")}getStats(){const e=this.getAllContainers(),t={totalContainers:e.length,activeContainers:e.filter(e=>e.getState().lastUpdate>0).length,autoDetectionEnabled:this.autoDetectionEnabled,breakpoints:Object.keys(this.config.breakpoints),containersByBreakpoint:{}};return Object.keys(this.config.breakpoints).forEach(e=>{t.containersByBreakpoint[e]=this.getContainersByBreakpoint(e).length}),t}destroy(){this.containers.forEach(e=>{e.deactivate()}),this.containers.clear(),this.autoDetectionEnabled=!1}normalizeSelector(e){return"string"==typeof e?Array.from(document.querySelectorAll(e)):e instanceof Element?[e]:Array.isArray(e)?e:[]}findContainerCandidates(){const e=[];if(e.push(...Array.from(document.querySelectorAll("[data-container]"))),e.push(...Array.from(document.querySelectorAll(".container, .card, .widget, .component"))),"undefined"!=typeof CSS&&CSS.supports&&CSS.supports("container-type","inline-size")){document.querySelectorAll("*").forEach(t=>{const i=getComputedStyle(t);i.containerType&&"normal"!==i.containerType&&e.push(t)})}return Array.from(new Set(e))}extractOptionsFromElement(e){const t={},i=e.getAttribute("data-container");if(i)try{const e=JSON.parse(i);Object.assign(t,e)}catch(e){}const s=e.getAttribute("data-breakpoints");if(s)try{t.breakpoints=JSON.parse(s)}catch(e){}const n=e.getAttribute("data-container-type");return n&&(t.containerType=n),t}setupMutationObserver(){if("undefined"==typeof MutationObserver)return;const e=new MutationObserver(e=>{let t=!1;e.forEach(e=>{"childList"===e.type?e.addedNodes.forEach(e=>{e.nodeType===Node.ELEMENT_NODE&&(t=!0)}):"attributes"===e.type&&(e.attributeName?.startsWith("data-container")||"class"===e.attributeName)&&(t=!0)}),t&&setTimeout(()=>this.scanForContainers(),100)});e.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-container","data-breakpoints","data-container-type","class"]}),this.memoryManager.register({id:"container-mutation-observer",type:"observer",cleanup:()=>e.disconnect()})}}class d{constructor(){this.supportsClamp=this.checkClampSupport(),this.supportsContainerUnits=this.checkContainerUnitSupport()}createScaling(e){const{minSize:t,maxSize:i,minContainer:s,maxContainer:n,unit:r,containerUnit:o,curve:a}=e,c=n-s;if(c<=0)return{clampValue:`${t}${r}`,fallbackValue:`${t}${r}`,currentSize:t,progress:0,isNative:!1};const l=(i-t)/c,h=t-l*s;let u,d;if(this.supportsClamp&&(this.supportsContainerUnits||"px"===o)){u=`clamp(${t}${r}, ${this.createPreferredValue(h,l,r,o,a,e)}, ${i}${r})`,d=`${t}${r}`}else u=`var(--proteus-font-size, ${t}${r})`,d=`${t}${r}`;return{clampValue:u,fallbackValue:d,currentSize:t,progress:0,isNative:this.supportsClamp}}calculateSize(e,t){const{minSize:i,maxSize:s,minContainer:n,maxContainer:r,curve:o,customCurve:a}=t,c=(Math.max(n,Math.min(r,e))-n)/(r-n),l=i+(s-i)*this.applyCurve(c,o,a);return Math.max(i,Math.min(s,l))}applyScaling(e,t,i){const s=e,n=this.createScaling(i);if(n.isNative)s.style.fontSize=n.clampValue;else{const e=this.calculateSize(t,i);s.style.setProperty("--proteus-font-size",`${e}${i.unit}`),s.style.fontSize=n.clampValue}}createMultiBreakpointScaling(e,t="rem",i="cw"){if(e.length<2)throw new Error("At least 2 breakpoints required for multi-breakpoint scaling");const s=[...e].sort((e,t)=>e.container-t.container),n=[];for(let e=0;e<s.length-1;e++){const r=s[e],o=s[e+1],a={minSize:r.size,maxSize:o.size,minContainer:r.container,maxContainer:o.container,unit:t,containerUnit:i,curve:"linear"},c=this.createScaling(a);n.push(c.clampValue)}return 1===n.length?n[0]:`max(${n.join(", ")})`}generateOptimalConfig(e,t,i,s={}){const{unit:n="rem",accessibility:r=!0,readability:o=!0}=s;let{small:a,large:c}=t;const{small:l,large:h}=i;if(r){const e="px"===n?16:1;a=Math.max(a,e);const t="px"===n?72:4.5;c=Math.min(c,t)}if(o){const e=2.5;c/a>e&&(c=a*e)}return{minSize:a,maxSize:c,minContainer:l,maxContainer:h,unit:n,containerUnit:"cw",curve:"ease-out"}}validateConfig(e){const t=[];e.minSize>=e.maxSize&&t.push("minSize must be less than maxSize"),e.minContainer>=e.maxContainer&&t.push("minContainer must be less than maxContainer"),e.minSize<=0&&t.push("minSize must be positive"),e.minContainer<=0&&t.push("minContainer must be positive");return e.maxSize/e.minSize>5&&t.push("Size ratio is very large (>5x), consider reducing for better readability"),{valid:0===t.length,errors:t}}createPreferredValue(e,t,i,s,n,r){if(!isFinite(e)||!isFinite(t))return`1${i}`;if("linear"===n){const n=t*("px"===s?1:100);return`${Number(e.toFixed(3))}${i} + ${Number(n.toFixed(3))}${s}`}return`${Number(e.toFixed(3))}${i} + ${Number((100*t).toFixed(3))}${s}`}applyCurve(e,t,i){switch(t){case"linear":default:return e;case"ease-in":return e*e;case"ease-out":return 1-Math.pow(1-e,2);case"ease-in-out":return e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2;case"custom":return i?i(e):e}}checkClampSupport(){return!("undefined"==typeof CSS||!CSS.supports)&&CSS.supports("font-size","clamp(1rem, 2vw, 2rem)")}checkContainerUnitSupport(){return!("undefined"==typeof CSS||!CSS.supports)&&CSS.supports("font-size","1cw")}}class m{generateScale(e){if(void 0!==e.steps)return this.generateSimpleScale({ratio:e.ratio,baseSize:e.baseSize,steps:e.steps});const t={...e,baseUnit:e.baseUnit||"px",levels:e.levels||5,direction:e.direction||"up",roundToGrid:e.roundToGrid||!1,gridSize:e.gridSize||4},i=this.parseRatio(t.ratio),s=this.calculateLevels(t,i),n=this.generateCustomProperties(s),r=this.generateCSSClasses(s);return{config:{...t,ratio:i},levels:s,cssCustomProperties:n,cssClasses:r}}generateSimpleScale(e){const t=this.parseRatio(e.ratio),i=[];for(let s=0;s<e.steps;s++){const n=e.baseSize*Math.pow(t,s);i.push(n)}return i}generateResponsiveScale(e,t,i={min:.8,max:1.2}){const s={...e,baseSize:e.baseSize*i.min},n={...e,baseSize:e.baseSize*i.max},r=this.generateScale(s),o=this.generateScale(n);return{small:r,large:o,fluidCSS:this.generateFluidCSS(r,o,t)}}getOptimalRatio(e){switch(e){case"body":default:return m.NAMED_RATIOS["minor-third"];case"display":return m.NAMED_RATIOS["perfect-fourth"];case"interface":return m.NAMED_RATIOS["major-second"];case"code":return m.NAMED_RATIOS["minor-second"]}}calculateOptimalBaseSize(e,t=66,i=.5){const s=e/(t*i);return Math.max(.875,Math.min(1.5,s/16))}validateScale(e){const t=[],i=this.parseRatio(e.ratio);i<=1&&t.push("Ratio must be greater than 1"),e.baseSize<=0&&t.push("Base size must be positive");const s=e.levels||e.steps||5;return s<1&&t.push("Must have at least 1 level"),s>20&&t.push("Too many levels (>20), consider reducing for better usability"),i>3&&t.push("Very large ratio (>3), may create poor readability"),{valid:0===t.length,errors:t}}getScaleStats(e){const t=e.levels.map(e=>e.size),i=e.levels.slice(1).map((t,i)=>t.size/e.levels[i].size);return{levelCount:e.levels.length,baseSize:e.config.baseSize,ratio:e.config.ratio,smallestSize:Math.min(...t),largestSize:Math.max(...t),sizeRange:Math.max(...t)/Math.min(...t),averageRatio:i.length>0?i.reduce((e,t)=>e+t,0)/i.length:0,unit:e.config.baseUnit}}parseRatio(e){if("number"==typeof e)return e;const t=m.NAMED_RATIOS[e];if(t)return t;const i=parseFloat(e);return isNaN(i)?m.NAMED_RATIOS["minor-third"]:i}calculateLevels(e,t){const i=[],{baseSize:s,baseUnit:n,direction:r,roundToGrid:o,gridSize:a=4}=e;if(i.push({level:0,size:s,ratio:1,cssValue:`${s}${n}`,name:m.LEVEL_NAMES[0]}),"up"===r||"both"===r){const r=e.levels||e.steps||5;for(let e=1;e<=r;e++){const r=s*Math.pow(t,e),c=o?this.roundToGrid(r,a):r;i.push({level:e,size:c,ratio:Math.pow(t,e),cssValue:`${c}${n}`,name:m.LEVEL_NAMES[e.toString()]})}}if("down"===r||"both"===r){const c=e.levels||e.steps||5,l="both"===r?Math.floor(c/2):c;for(let e=1;e<=l;e++){const r=s/Math.pow(t,e),c=o?this.roundToGrid(r,a):r;i.unshift({level:-e,size:c,ratio:1/Math.pow(t,e),cssValue:`${c}${n}`,name:m.LEVEL_NAMES[(-e).toString()]})}}return i.sort((e,t)=>e.level-t.level)}roundToGrid(e,t){return Math.round(e/t)*t}generateCustomProperties(e){const t={};return e.forEach(e=>{const i=e.name||`level-${e.level}`;t[`--font-size-${i}`]=e.cssValue}),t}generateCSSClasses(e){const t={};return e.forEach(e=>{const i=e.name||`level-${e.level}`;t[`.text-${i}`]=`font-size: var(--font-size-${i}, ${e.cssValue});`}),t}generateFluidCSS(e,t,i){const s={};return e.levels.forEach((n,r)=>{const o=t.levels[r];if(!o)return;const a=n.name||`level-${n.level}`,c=n.size,l=o.size,h=i.min,u=(l-c)/(i.max-h),d=c-u*h,m=e.config.baseUnit,p=`clamp(${c}${m}, ${d}${m} + ${100*u}cw, ${l}${m})`;s[`--font-size-${a}`]=p}),s}applyToElements(e,t){const i=[...this.generateScale(t).levels].sort((e,i)=>t.reverse?i.size-e.size:e.size-i.size);e.forEach((e,t)=>{const s=i[t%i.length];if(s){e.style.fontSize=s.cssValue,e.setAttribute("data-proteus-scale-level",s.level.toString()),e.setAttribute("data-proteus-font-size",s.cssValue),s.name&&e.setAttribute("data-proteus-scale-name",s.name)}})}destroy(){}}m.NAMED_RATIOS={"minor-second":1.067,"major-second":1.125,"minor-third":1.2,"major-third":1.25,"perfect-fourth":1.333,"augmented-fourth":1.414,"perfect-fifth":1.5,"golden-ratio":1.618,"major-sixth":1.667,"minor-seventh":1.778,"major-seventh":1.875,octave:2,"major-tenth":2.5,"major-eleventh":2.667,"major-twelfth":3,"double-octave":4},m.LEVEL_NAMES={"-3":"xs","-2":"sm","-1":"base-sm",0:"base",1:"lg",2:"xl",3:"2xl",4:"3xl",5:"4xl",6:"5xl",7:"6xl",8:"7xl",9:"8xl",10:"9xl"};class p{constructor(){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d")}fitText(e,t,i,s,n){const r=getComputedStyle(e);switch(n.mode){case"single-line":return this.fitSingleLine(t,i,n,r);case"multi-line":return this.fitMultiLine(t,i,s,n,r);case"overflow-aware":return this.fitOverflowAware(t,i,s,n,r);default:throw new Error(`Unknown fitting mode: ${n.mode}`)}}applyFitting(e,t,i){const s=e;s.style.fontSize=`${t.fontSize}${i.unit}`,s.style.lineHeight=t.lineHeight.toString(),"overflow-aware"===i.mode&&t.overflow&&(s.style.overflow=i.overflow||"hidden","ellipsis"===i.overflow&&(s.style.textOverflow="ellipsis",s.style.whiteSpace="nowrap"))}measureText(e,t,i,s="normal"){this.context.font=`${s} ${t}px ${i}`;return{width:this.context.measureText(e).width,height:1.2*t}}fitSingleLine(e,t,i,s){const n=s.fontFamily,r=s.fontWeight;let o=i.minSize,a=i.maxSize,c=0,l=o;for(;a-o>i.precision&&c<i.maxIterations;){const i=(o+a)/2;this.measureText(e,i,n,r).width<=t?(l=i,o=i):a=i,c++}const h=this.measureText(e,l,n,r);return{fontSize:l,lineHeight:i.lineHeight||1.2,actualLines:1,overflow:h.width>t,iterations:c,success:h.width<=t}}fitMultiLine(e,t,i,s,n){const r=n.fontFamily,o=n.fontWeight,a=s.lineHeight||1.4;let c=s.minSize,l=s.maxSize,h=0,u=c;for(;l-c>s.precision&&h<s.maxIterations;){const s=(c+l)/2;this.calculateLines(e,s,t,r,o)*s*a<=i?(u=s,c=s):l=s,h++}const d=this.calculateLines(e,u,t,r,o),m=d*u*a;return{fontSize:u,lineHeight:a,actualLines:d,overflow:m>i,iterations:h,success:m<=i}}fitOverflowAware(e,t,i,s,n){const r=this.fitMultiLine(e,t,i,s,n);if(r.success)return r;const o=this.fitSingleLine(e,t,s,n),a=s.lineHeight||1.4,c=Math.floor(i/(o.fontSize*a));return{fontSize:o.fontSize,lineHeight:a,actualLines:Math.min(c,1),overflow:!0,iterations:o.iterations,success:c>=1}}calculateLines(e,t,i,s,n){this.context.font=`${n} ${t}px ${s}`;const r=e.split(/\s+/);let o=1,a=0;for(const e of r){const t=this.context.measureText(`${e} `).width;a+t>i?(o++,a=t):a+=t}return o}static getOptimalConfig(e){switch(e){case"heading":return{mode:"single-line",minSize:18,maxSize:48,precision:.5,maxIterations:20,lineHeight:1.2};case"body":return{mode:"multi-line",minSize:14,maxSize:20,precision:.25,maxIterations:15,lineHeight:1.5};case"caption":return{mode:"overflow-aware",minSize:12,maxSize:16,precision:.25,maxIterations:10,lineHeight:1.3,overflow:"ellipsis"};case"button":return{mode:"single-line",minSize:14,maxSize:18,precision:.25,maxIterations:10,lineHeight:1,overflow:"ellipsis"};default:return{}}}createResponsiveFitting(e,t){const i=e,s=e.textContent||"",n=t.sort((e,t)=>e.containerSize-t.containerSize),r=new ResizeObserver(t=>{for(const i of t){const t=i.contentRect.width,r=i.contentRect.height;let o=n[0].config;for(const{containerSize:e,config:i}of n)t>=e&&(o=i);const a=this.fitText(e,s,t,r,o);this.applyFitting(e,a,o)}});r.observe(e),i._proteusTextFittingObserver=r}removeResponsiveFitting(e){const t=e,i=t._proteusTextFittingObserver;i&&(i.disconnect(),delete t._proteusTextFittingObserver)}}class g{calculateOptimalLineHeight(e,t,i,s){const n=[];let r=s.baseLineHeight;r=g.CONTENT_TYPE_RATIOS[s.contentType].optimal,n.push(`Base ratio for ${s.contentType}: ${r}`);const o=this.calculateSizeAdjustment(e,s.baseFontSize);r*=o,n.push(`Font size adjustment (${e}px): ×${o.toFixed(3)}`);const a=this.calculateLineLengthAdjustment(t,e);r*=a,n.push(`Line length adjustment (${t} chars): ×${a.toFixed(3)}`);const c=s.language?.split("-")[0]?.toLowerCase()||"en",l=g.LANGUAGE_ADJUSTMENTS[c]||g.LANGUAGE_ADJUSTMENTS.default;r*=l,1!==l&&n.push(`Language adjustment (${c}): ×${l}`);const h=g.DENSITY_MULTIPLIERS[s.density];r*=h,n.push(`Density adjustment (${s.density}): ×${h}`);const u=this.calculateWidthAdjustment(i,e);if(r*=u,1!==u&&n.push(`Container width adjustment: ×${u.toFixed(3)}`),s.accessibility){const e=this.calculateAccessibilityAdjustment(r,s);r=e.lineHeight,e.adjusted&&n.push(`Accessibility adjustment: ${e.reason}`)}const d=r;r=Math.max(s.minLineHeight,Math.min(s.maxLineHeight,r)),r!==d&&n.push(`Clamped to bounds: ${s.minLineHeight}-${s.maxLineHeight}`);const m=this.calculateAccessibilityMetrics(r,e,s);return{lineHeight:Math.round(1e3*r)/1e3,ratio:r,reasoning:n,accessibility:m}}applyOptimization(e,t,i){const s=e;s.style.lineHeight=t.lineHeight.toString(),i.accessibility&&(s.setAttribute("data-proteus-line-height",t.lineHeight.toString()),s.setAttribute("data-proteus-wcag-compliant",t.accessibility.wcagCompliant.toString()))}createResponsiveOptimization(e,t){const i=()=>{const i=getComputedStyle(e),s=parseFloat(i.fontSize),n=e.getBoundingClientRect().width,r=.5*s,o=Math.floor(n/r),a=this.calculateOptimalLineHeight(s,o,n,t);this.applyOptimization(e,a,t)};i();const s=new ResizeObserver(()=>{i()});return s.observe(e),()=>{s.disconnect()}}calculateSizeAdjustment(e,t){const i=e/t;return i<1?1+.2*(1-i):i>1?1-Math.min(.1*(i-1),.15):1}calculateLineLengthAdjustment(e,t){if(e<45)return.95;if(e>75){const t=e-75;return 1+Math.min(.002*t,.2)}return 1}calculateWidthAdjustment(e,t){const i=20*t;if(e<i){return 1+.1*(1-e/i)}return 1}calculateAccessibilityAdjustment(e,t){const i="body"===t.contentType?1.5:1.3;return e<i?{lineHeight:i,adjusted:!0,reason:`WCAG compliance requires minimum ${i}`}:{lineHeight:e,adjusted:!1,reason:""}}calculateAccessibilityMetrics(e,t,i){const s=e>=("body"===i.contentType?1.5:1.3);let n=50;const r=g.CONTENT_TYPE_RATIOS[i.contentType].optimal,o=Math.abs(e-r);return n+=Math.max(0,40-100*o),s&&(n+=10),n=Math.max(0,Math.min(100,n)),{wcagCompliant:s,readabilityScore:Math.round(n)}}static getOptimalConfig(e,t,i=!0){const s=this.CONTENT_TYPE_RATIOS[t];return{baseFontSize:16,baseLineHeight:s.optimal,minLineHeight:s.min,maxLineHeight:s.max,language:e,contentType:t,accessibility:i,density:"comfortable"}}}g.LANGUAGE_ADJUSTMENTS={en:1,zh:1.1,ja:1.1,ko:1.1,ar:1.05,hi:1.05,th:1.15,vi:1.05,de:.98,fr:1,es:1,it:1,pt:1,ru:1.02,default:1},g.CONTENT_TYPE_RATIOS={heading:{min:1,optimal:1.2,max:1.4},body:{min:1.3,optimal:1.5,max:1.8},caption:{min:1.2,optimal:1.4,max:1.6},code:{min:1.2,optimal:1.4,max:1.6},display:{min:.9,optimal:1.1,max:1.3}},g.DENSITY_MULTIPLIERS={compact:.9,comfortable:1,spacious:1.1};class f{constructor(e){this.config={baseFontSize:16,baseLineHeight:1.5,baselineUnit:24,scale:"minor-third",precision:.001,responsive:!0,containerAware:!1,...e},this.baselineGrid=this.config.baselineUnit}generateRhythm(e){this.config.containerAware&&e&&this.adjustBaselineForContainer(e);const t=this.generateSpacingScale(),i=this.generateLineHeights(),s=this.generateMargins(),n=this.generatePaddings();return{baselineGrid:this.baselineGrid,spacingScale:t,lineHeights:i,margins:s,paddings:n}}applyRhythm(e,t){const i=e;Object.entries(t.spacingScale).forEach(([e,t])=>{i.style.setProperty(`--rhythm-${e}`,`${t}px`)}),Object.entries(t.lineHeights).forEach(([e,t])=>{i.style.setProperty(`--line-height-${e}`,t.toString())}),Object.entries(t.margins).forEach(([e,t])=>{i.style.setProperty(`--margin-${e}`,`${t}px`)}),Object.entries(t.paddings).forEach(([e,t])=>{i.style.setProperty(`--padding-${e}`,`${t}px`)}),i.style.setProperty("--baseline-grid",`${t.baselineGrid}px`)}toBaseline(e){return Math.round(e/this.baselineGrid)*this.baselineGrid}calculateBaselineLineHeight(e){const t=e*this.config.baseLineHeight;return this.toBaseline(t)/e}generateResponsiveSpacing(e,t){const i={};return e.forEach((e,s)=>{const n=t[s]||1,r=this.baselineGrid*n;i[`container-${e}`]={xs:.25*r,sm:.5*r,md:r,lg:1.5*r,xl:2*r,xxl:3*r}}),i}generateCSS(e){let t=":root {\n";return t+=` --baseline-grid: ${e.baselineGrid}px;\n`,Object.entries(e.spacingScale).forEach(([e,i])=>{t+=` --rhythm-${e}: ${i}px;\n`}),Object.entries(e.lineHeights).forEach(([e,i])=>{t+=` --line-height-${e}: ${i};\n`}),Object.entries(e.margins).forEach(([e,i])=>{t+=` --margin-${e}: ${i}px;\n`}),Object.entries(e.paddings).forEach(([e,i])=>{t+=` --padding-${e}: ${i}px;\n`}),t+="}\n\n",t+=this.generateUtilityClasses(e),t}validateRhythm(e){const t=[];return Object.entries(e.spacingScale).forEach(([i,s])=>{s%e.baselineGrid!==0&&t.push(`Spacing ${i} (${s}px) doesn't align to baseline grid (${e.baselineGrid}px)`)}),Object.entries(e.margins).forEach(([i,s])=>{s%e.baselineGrid!==0&&t.push(`Margin ${i} (${s}px) doesn't align to baseline grid`)}),{valid:0===t.length,issues:t}}generateSpacingScale(){const e="number"==typeof this.config.scale?this.config.scale:f.SCALE_RATIOS[this.config.scale],t=this.baselineGrid;return{xs:this.toBaseline(t/(e*e)),sm:this.toBaseline(t/e),md:t,lg:this.toBaseline(t*e),xl:this.toBaseline(t*e*e),xxl:this.toBaseline(t*e*e*e)}}generateLineHeights(){return{tight:1.2,normal:1.5,relaxed:1.75,loose:2}}generateMargins(){const e=this.generateSpacingScale();return{none:0,xs:e.xs,sm:e.sm,md:e.md,lg:e.lg,xl:e.xl,auto:-1}}generatePaddings(){const e=this.generateSpacingScale();return{none:0,xs:e.xs,sm:e.sm,md:e.md,lg:e.lg,xl:e.xl}}adjustBaselineForContainer(e){const t=Math.max(.75,Math.min(1.5,e/800));this.baselineGrid=Math.round(this.config.baselineUnit*t)}generateUtilityClasses(e){let t="";return Object.entries(e.spacingScale).forEach(([e,i])=>{t+=`.m-${e} { margin: ${i}px; }\n`,t+=`.mt-${e} { margin-top: ${i}px; }\n`,t+=`.mr-${e} { margin-right: ${i}px; }\n`,t+=`.mb-${e} { margin-bottom: ${i}px; }\n`,t+=`.ml-${e} { margin-left: ${i}px; }\n`,t+=`.mx-${e} { margin-left: ${i}px; margin-right: ${i}px; }\n`,t+=`.my-${e} { margin-top: ${i}px; margin-bottom: ${i}px; }\n`,t+=`.p-${e} { padding: ${i}px; }\n`,t+=`.pt-${e} { padding-top: ${i}px; }\n`,t+=`.pr-${e} { padding-right: ${i}px; }\n`,t+=`.pb-${e} { padding-bottom: ${i}px; }\n`,t+=`.pl-${e} { padding-left: ${i}px; }\n`,t+=`.px-${e} { padding-left: ${i}px; padding-right: ${i}px; }\n`,t+=`.py-${e} { padding-top: ${i}px; padding-bottom: ${i}px; }\n`}),Object.entries(e.lineHeights).forEach(([e,i])=>{t+=`.leading-${e} { line-height: ${i}; }\n`}),t+=".baseline-align { ",t+=`background-image: linear-gradient(to bottom, transparent ${e.baselineGrid-1}px, rgba(255, 0, 0, 0.1) ${e.baselineGrid-1}px, rgba(255, 0, 0, 0.1) ${e.baselineGrid}px, transparent ${e.baselineGrid}px); `,t+=`background-size: 100% ${e.baselineGrid}px; `,t+="}\n",t}createResponsiveRhythm(e,t,i){const s=()=>{const s=e.getBoundingClientRect().width;for(let e=0;e<t.length;e++)s>=t[e]&&i[e];const n=this.generateRhythm(s);this.applyRhythm(e,n)};s();const n=new ResizeObserver(()=>{s()});return n.observe(e),()=>{n.disconnect()}}}f.SCALE_RATIOS={"minor-second":1.067,"major-second":1.125,"minor-third":1.2,"major-third":1.25,"perfect-fourth":1.333,"golden-ratio":1.618};class y{constructor(e,t={}){this.resizeObserver=null,this.mutationObserver=null,this.element=e,this.config={minColumnWidth:250,maxColumns:12,gap:16,aspectRatio:1,masonry:!1,autoFlow:"row",alignment:{justify:"stretch",align:"stretch"},responsive:!0,breakpoints:{},...t},this.state=this.createInitialState(),this.setupGrid()}activate(){this.updateGrid(),this.setupObservers()}deactivate(){this.cleanupObservers(),this.removeGridStyles()}updateConfig(e){this.config={...this.config,...e},this.updateGrid()}getState(){return{...this.state}}recalculate(){this.updateGrid()}addItems(e){const t=document.createDocumentFragment();e.forEach(e=>{this.prepareGridItem(e),t.appendChild(e)}),this.element.appendChild(t),this.updateGrid()}removeItems(e){e.forEach(e=>{e.parentNode===this.element&&this.element.removeChild(e)}),this.updateGrid()}calculateOptimalColumns(e){const t=e-this.getGapValue(),i=this.config.minColumnWidth,s=Math.floor((t+this.getGapValue())/(i+this.getGapValue()));return Math.min(s,this.config.maxColumns)}setupGrid(){this.element.style.display="grid",this.config.masonry?this.setupMasonryGrid():this.setupRegularGrid()}setupRegularGrid(){const e=this.element;e.style.gridAutoFlow=this.config.autoFlow,e.style.justifyContent=this.config.alignment.justify,e.style.alignContent=this.config.alignment.align,e.style.justifyItems=this.config.alignment.justify,e.style.alignItems=this.config.alignment.align}setupMasonryGrid(){const e=this.element;this.supportsMasonry()?e.style.gridTemplateRows="masonry":this.implementJavaScriptMasonry()}updateGrid(){const e=this.element.getBoundingClientRect(),t=e.width,i=e.height,s=this.getActiveConfig(t),n=this.calculateOptimalColumns(t),r=this.getGapValue(),o=(t-r*(n-1))/n,a=s.aspectRatio?o/s.aspectRatio:0;this.state={columns:n,rows:Math.ceil(this.getItemCount()/n),gap:r,itemWidth:o,itemHeight:a,containerWidth:t,containerHeight:i},this.applyGridStyles(),s.masonry&&!this.supportsMasonry()&&this.updateMasonryLayout()}applyGridStyles(){const e=this.element,{columns:t,gap:i,itemHeight:s}=this.state;e.style.gridTemplateColumns=`repeat(${t}, 1fr)`,e.style.gap=`${i}px`,e.style.gridAutoRows=s>0?`${s}px`:"auto",Array.from(this.element.children).forEach(e=>{this.prepareGridItem(e)})}prepareGridItem(e){const t=e;t.style.boxSizing="border-box",this.config.aspectRatio&&!this.config.masonry&&(t.style.aspectRatio=this.config.aspectRatio.toString()),t.classList.add("proteus-grid-item")}implementJavaScriptMasonry(){const e=Array.from(this.element.children),{columns:t,gap:i}=this.state,s=new Array(t).fill(0);e.forEach((e,t)=>{const n=s.indexOf(Math.min(...s)),r=n,o=Math.floor(s[n]/(this.state.itemHeight+i));e.style.gridColumnStart=(r+1).toString(),e.style.gridRowStart=(o+