material-inspired-component-library 3.0.0 → 3.0.1

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/docs/micl.js CHANGED
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.micl=t():e.micl=t()}(self,()=>(()=>{"use strict";var e={d:(t,n)=>{for(var i in n)e.o(n,i)&&!e.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:n[i]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};return(()=>{e.r(t),e.d(t,{default:()=>v});const n="dialog.micl-bottomsheet",i=(()=>{const e=e=>{let t=parseInt(e.dataset.miclfitheight||"0",10),n=parseInt(window.getComputedStyle(e).getPropertyValue("max-block-size"),10),i=(e.dataset.miclsnapheights||"").split(",").map(Number).filter(e=>!isNaN(e)&&e>=0&&e<=n);return t<1&&(t=Math.min(e.getBoundingClientRect().height,n),e.dataset.miclfitheight=`${t}`),[...new Set(i.concat([t]).sort())]},t=(t,n)=>{let i=t.getBoundingClientRect().height,o=e(t);return o.filter(e=>e>i+4)[0]||o[n?o.length-1:0]},i=(e,t)=>{t<1?(delete e.dataset.miclfitheight,e.style.removeProperty("--md-sys-bottomsheet-height"),e[e.popover?"hidePopover":"close"]()):e.style.setProperty("--md-sys-bottomsheet-height",`${t}px`)};return{initialize:o=>{if(!o.matches(n)||o.dataset.miclinitialized)return;o.dataset.miclinitialized="1";const r=o.querySelector(".micl-bottomsheet__headline");if(!r)return;const l=r.querySelector(".micl-bottomsheet__draghandle");l?.addEventListener("click",()=>{i(o,t(o,!1))});let a,s,c=!1,m=!1;function d(e){const t=e.clientY;c&&Math.abs(a-t)>4&&(c=!1,m=!0,o.classList.add("micl-bottomsheet--resizing")),m&&i(o,s+a-t)}function p(n){c=!1,o.classList.remove("micl-bottomsheet--resizing"),m&&(m=!1,n.clientY<a?i(o,t(o,!0)):o.getBoundingClientRect().height<48?i(o,0):i(o,(t=>{let n=t.getBoundingClientRect().height,i=e(t),o=i.filter(e=>e<n-4);return o[o.length-1]||i[0]})(o)),document.removeEventListener("mousemove",d),document.removeEventListener("mouseup",p))}r.addEventListener("mousedown",e=>{e.eventPhase===Event.AT_TARGET&&(c=!0,e.preventDefault(),a=e.clientY,s=o.getBoundingClientRect().height,document.addEventListener("mousemove",d),document.addEventListener("mouseup",p))})},cleanup:e=>{e.matches(n)&&(e.classList.remove("micl-bottomsheet--resizing"),delete e.dataset.miclinitialized,delete e.dataset.miclfitheight)}}})(),o="button[popovertarget],button.micl-button--toggle",r=(()=>{const e=e=>{e.target&&e.target instanceof HTMLButtonElement&&(e.target.popoverTargetElement instanceof HTMLDialogElement&&(e.target.popoverTargetElement.open?e.target.popoverTargetElement.close():e.target.popoverTargetElement.showModal()),e.target.classList.contains("micl-button--toggle")&&(e.target.classList.add("micl-button--toggled"),e.target.classList.toggle("micl-button--selected"),e.target.dataset.miclalt&&([e.target.textContent,e.target.dataset.miclalt]=[e.target.dataset.miclalt,e.target.textContent])))};return{initialize:t=>{t.matches("button[popovertarget],button.micl-button--toggle")&&!t.dataset.miclinitialized&&(t.dataset.miclinitialized="1",(t.popoverTargetElement instanceof HTMLDialogElement&&!t.popoverTargetElement.hasAttribute("popover")||t.classList.contains("micl-button--toggle"))&&t.addEventListener("click",e))},cleanup:t=>{t.matches("button[popovertarget],button.micl-button--toggle")&&(document.removeEventListener("click",e),delete t.dataset.miclinitialized)}}})(),l=".micl-list-item-one,.micl-list-item-two,.micl-list-item-three",a=(()=>{const e=e=>!!e&&e.classList.contains("micl-list-item--disabled");return{keydown:t=>{if(!(t instanceof KeyboardEvent&&t.target instanceof Element&&t.target.matches(".micl-list-item-one,.micl-list-item-two,.micl-list-item-three")))return;const n=t.target.parentElement;if(!n)return;let i=[];if(n instanceof HTMLDetailsElement?i=Array.from(n.parentElement?.children||[]).map(t=>{let n=t.querySelector(":scope > summary");return e(n)?null:n}).filter(e=>!!e):n instanceof HTMLUListElement&&(i=Array.from(n.children).map(t=>t instanceof HTMLLIElement&&!e(t)?t:null).filter(e=>!!e)),0===i.length)return;let o=i.findIndex(e=>(e=>!!e&&e.matches(":has(input[type=checkbox]:checked)"))(e)),r=i.findIndex(e=>0===e.tabIndex),l=r;switch(t.key){case"ArrowDown":l=(r+1)%i.length,t.preventDefault();break;case"ArrowUp":l=(r-1+i.length)%i.length,t.preventDefault();break;case"Tab":-1===o?0!==r&&(i[r].tabIndex=-1,i[0].tabIndex=0):o!==r&&(i[r].tabIndex=-1,i[o].tabIndex=0);break;case"Enter":case" ":const e=t.target.querySelector("input[type=checkbox]");e instanceof HTMLInputElement&&(e.checked=!e.checked)}if(l!==r){i[r].tabIndex=-1,i[l].tabIndex=0,i[l].focus();const e=i[l].querySelector(":scope > button");e?.dispatchEvent(new MouseEvent("mouseenter",{bubbles:!0,cancelable:!0,view:window}))}}}})(),s=".micl-menu[popover]",c=(()=>{const e=(e,t)=>{const n=e.getBoundingClientRect(),i=t.getBoundingClientRect();return(n.x>i.x?"right ":"left ")+(n.y>i.y?"bottom":"top")};return{initialize:t=>{if(!t.matches(".micl-menu[popover]")||t.dataset.miclinitialized)return;t.dataset.miclinitialized="1";const n=document.querySelector(`[popovertarget="${t.id}"]`);n&&t.addEventListener("beforetoggle",i=>{"open"===i.oldState&&(t.style.transformOrigin=e(n,t))}),n&&t.addEventListener("toggle",i=>{"closed"===i.oldState&&(t.style.transformOrigin=e(n,t))}),t.querySelectorAll(":scope > ul.micl-list > li > button[popovertarget]").forEach(e=>{if(e.popoverTargetElement?.matches(".micl-menu[popover]")){let t,n=`--${e.popoverTargetElement.id}`;e.popoverTargetElement instanceof HTMLElement&&(e.style.setProperty("anchor-name",n),e.popoverTargetElement.style.insetBlockStart=`anchor(${n} start)`,e.popoverTargetElement.style.insetInlineStart=`anchor(${n} end)`),e.addEventListener("mouseenter",()=>{e.popoverTargetElement instanceof HTMLElement&&e.popoverTargetElement.showPopover()}),e.addEventListener("mouseleave",()=>{t=setTimeout(()=>{e.popoverTargetElement instanceof HTMLElement&&!e.popoverTargetElement.matches(":hover")&&e.popoverTargetElement.hidePopover()},100)}),e.popoverTargetElement.addEventListener("mouseenter",()=>{clearTimeout(t)}),e.popoverTargetElement.addEventListener("mouseleave",()=>{e.popoverTargetElement instanceof HTMLElement&&e.popoverTargetElement.hidePopover()})}})}}})(),m=".micl-navigationrail__item[for]:not(.micl-navigationrail__item--disabled)",d={keydown:e=>{if(!(e instanceof KeyboardEvent&&e.target instanceof HTMLLabelElement&&e.target.matches(m)))return;const t=document.getElementById(e.target.htmlFor);if(t)switch(e.key){case"Enter":case" ":e.preventDefault(),t.checked||(t.checked=!t.checked)}}},p="input[type=range].micl-slider-xs,input[type=range].micl-slider-s,input[type=range].micl-slider-m,input[type=range].micl-slider-l,input[type=range].micl-slider-xl",u=(()=>{const e=String.fromCharCode(8226),t=String.fromCharCode(8201),n=e=>e.parentElement?.classList.contains("micl-slider__container")?e.parentElement:null,i=(e,t)=>{e.dataset.miclsliderticks=t},o=e=>{let t=JSON.stringify(e.value+""),i=n(e);i&&(i.style.setProperty("--md-sys-slider-value",e.value),i.style.setProperty("--md-sys-slider-tip",t)),e.style.setProperty("--md-sys-slider-value",e.value),e.style.setProperty("--md-sys-slider-tip",t)};return{initialize:r=>{if(!r.matches(p))return;(e=>{let t=e.max||"100";n(e)?.style.setProperty("--md-sys-slider-max",t),e.style.setProperty("--md-sys-slider-max",t)})(r),(e=>{let t=e.min||"0";n(e)?.style.setProperty("--md-sys-slider-min",t),e.style.setProperty("--md-sys-slider-min",t)})(r),o(r),(e=>{let t=n(e);if(t){const n=window.getComputedStyle(e);["--md-sys-slider-handle-height","--md-sys-slider-track-height"].forEach(e=>{t.style.setProperty(e,n.getPropertyValue(e))})}})(r);const l=parseFloat(r.max),a=parseFloat(r.min),s=r.getBoundingClientRect(),c=((e,t,n)=>{const i=[];return e.list&&t>n&&e.list.querySelectorAll("option[value]").forEach(e=>{let o=parseFloat(e.value);!isNaN(o)&&o>=n&&o<=t&&i.push(o)}),i})(r,l,a).sort((e,t)=>e-t).map(e=>Math.round(100*(e-a)/(l-a)));if(c.length>0){const n=document.createElement("canvas"),o=n.getContext("2d");if(o){o.font=window.getComputedStyle(r).getPropertyValue("font");let n=o.measureText(t).width,l=o.measureText(e).width,a=s.width-10,m=0,d="";c.forEach(i=>{let o=a*i/100,r=Math.round((o-m)/n)-1;for(let e=0;e<r;e++)d+=t,m+=n;d+=e,m+=l}),i(r,d)}n.remove()}else i(r,e)},input:e=>{e.target.matches(p)&&e.target instanceof HTMLInputElement&&!e.target.disabled&&o(e.target)}}})(),g=".micl-textfield-outlined > input,.micl-textfield-filled > input",f=".micl-textfield-outlined > select,.micl-textfield-filled > select",h=".micl-textfield-outlined > textarea,.micl-textfield-filled > textarea",y=(()=>{const e=".micl-textfield__character-counter";return{initialize:t=>{if(t.dataset.miclinitialized)return;if(t.dataset.miclinitialized="1",t.value&&(t.dataset.miclvalue="1"),t instanceof HTMLSelectElement||!t.maxLength)return;const n=t.parentElement?.querySelector(e);n&&(n.textContent=`${t.value.length}/${t.maxLength}`)},input:t=>{if(!t.target.matches(`${g},${f},${h}`)||!(t.target instanceof HTMLInputElement||t.target instanceof HTMLSelectElement||t.target instanceof HTMLTextAreaElement)||!t.target.dataset.miclinitialized||t.target.disabled)return;if(t.target.value?t.target.dataset.miclvalue="1":delete t.target.dataset.miclvalue,t.target instanceof HTMLSelectElement||!t.target.maxLength)return;const n=t.target.parentElement?.querySelector(e);n&&(n.textContent=`${t.target.value.length}/${t.target.maxLength}`)}}})(),v=(()=>{const e={[n]:{component:i,type:HTMLDialogElement},[o]:{component:r,type:HTMLButtonElement},[l]:{component:a,type:HTMLElement},[s]:{component:c,type:HTMLElement},[m]:{component:d,type:HTMLLabelElement},[f]:{component:y,type:HTMLSelectElement},[p]:{component:u,type:HTMLInputElement},[h]:{component:y,type:HTMLTextAreaElement},[g]:{component:y,type:HTMLInputElement}},t=Object.keys(e).join(","),v=t=>{for(const[n,{component:i,type:o}]of Object.entries(e))if(t.matches(n)&&t instanceof o&&"function"==typeof i.initialize)return void i.initialize(t)},E=e=>{e.querySelectorAll(t).forEach(v),e.querySelectorAll('[class*="micl-"]').forEach(e=>{"1"===window.getComputedStyle(e).getPropertyValue("--micl-ripple")&&e.addEventListener("pointerdown",t=>{if(t.currentTarget.classList.contains("micl-card--nonactionable"))return;t.stopPropagation();let n=e.getBoundingClientRect();e.style.setProperty("--micl-x",t.clientX-n.left+"px"),e.style.setProperty("--micl-y",t.clientY-n.top+"px")})})},b=t=>{for(const[n,{component:i,type:o}]of Object.entries(e))if(t.matches(n)&&t instanceof o&&"function"==typeof i.cleanup)return void i.cleanup(t)},L=e=>{e.querySelectorAll(t).forEach(b)},T=()=>{new MutationObserver(e=>{e.forEach(e=>{"childList"===e.type&&(e.addedNodes.forEach(e=>{e instanceof HTMLElement&&(e.matches(t)&&v(e),e.querySelectorAll(t).forEach(v))}),e.removedNodes.forEach(e=>{e instanceof HTMLElement&&(e.matches(t)&&b(e),L(e))}))})}).observe(document.body,{childList:!0,subtree:!0}),E(document),document.addEventListener("input",t=>{for(const[n,{component:i,type:o}]of Object.entries(e))if(t.target.matches(n)&&t.target instanceof o&&"function"==typeof i.input)return void i.input(t)}),document.addEventListener("keydown",t=>{for(const[n,{component:i,type:o}]of Object.entries(e))if(t.target.matches(n)&&t.target instanceof o&&"function"==typeof i.keydown)return void i.keydown(t)})},x=()=>{document.removeEventListener("DOMContentLoaded",x),T()};return"loading"!==document.readyState?T():document.addEventListener("DOMContentLoaded",x),{initialize:()=>E(document),cleanup:()=>L(document)}})()})(),t})());
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.micl=t():e.micl=t()}(self,()=>(()=>{"use strict";var e={d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};return(()=>{e.r(t),e.d(t,{default:()=>v});const n="dialog.micl-bottomsheet",o=(()=>{const e=e=>{let t=parseInt(e.dataset.miclfitheight||"0",10),n=parseInt(window.getComputedStyle(e).getPropertyValue("max-block-size"),10),o=(e.dataset.miclsnapheights||"").split(",").map(Number).filter(e=>!isNaN(e)&&e>=0&&e<=n);return t<1&&(t=Math.min(e.getBoundingClientRect().height,n),e.dataset.miclfitheight=`${t}`),[...new Set(o.concat([t]).sort())]},t=(t,n)=>{let o=t.getBoundingClientRect().height,i=e(t);return i.filter(e=>e>o+4)[0]||i[n?i.length-1:0]},o=(e,t)=>{t<1?(delete e.dataset.miclfitheight,e.style.removeProperty("--md-sys-bottomsheet-height"),e[e.popover?"hidePopover":"close"]()):e.style.setProperty("--md-sys-bottomsheet-height",`${t}px`)};return{initialize:i=>{if(!i.matches(n)||i.dataset.miclinitialized)return;i.dataset.miclinitialized="1";const r=i.querySelector(".micl-bottomsheet__headline");if(!r)return;const l=r.querySelector(".micl-bottomsheet__draghandle");l?.addEventListener("click",()=>{o(i,t(i,!1))});let a,s,c=!1,m=!1;function d(e){const t=e.clientY;c&&Math.abs(a-t)>4&&(c=!1,m=!0,i.classList.add("micl-bottomsheet--resizing")),m&&o(i,s+a-t)}function p(n){c=!1,i.classList.remove("micl-bottomsheet--resizing"),m&&(m=!1,n.clientY<a?o(i,t(i,!0)):i.getBoundingClientRect().height<48?o(i,0):o(i,(t=>{let n=t.getBoundingClientRect().height,o=e(t),i=o.filter(e=>e<n-4);return i[i.length-1]||o[0]})(i)),document.removeEventListener("mousemove",d),document.removeEventListener("mouseup",p))}r.addEventListener("mousedown",e=>{e.eventPhase===Event.AT_TARGET&&(c=!0,e.preventDefault(),a=e.clientY,s=i.getBoundingClientRect().height,document.addEventListener("mousemove",d),document.addEventListener("mouseup",p))})},cleanup:e=>{e.matches(n)&&(e.classList.remove("micl-bottomsheet--resizing"),delete e.dataset.miclinitialized,delete e.dataset.miclfitheight)}}})(),i="button[popovertarget],button.micl-button--toggle",r=(()=>{const e=e=>{e.target&&e.target instanceof HTMLButtonElement&&(e.target.popoverTargetElement instanceof HTMLDialogElement&&(e.target.popoverTargetElement.open?e.target.popoverTargetElement.close():e.target.popoverTargetElement.showModal()),e.target.classList.contains("micl-button--toggle")&&(e.target.classList.add("micl-button--toggled"),e.target.classList.toggle("micl-button--selected"),e.target.dataset.miclalt&&([e.target.textContent,e.target.dataset.miclalt]=[e.target.dataset.miclalt,e.target.textContent])))};return{initialize:t=>{t.matches("button[popovertarget],button.micl-button--toggle")&&!t.dataset.miclinitialized&&(t.dataset.miclinitialized="1",(t.popoverTargetElement instanceof HTMLDialogElement&&!t.popoverTargetElement.hasAttribute("popover")||t.classList.contains("micl-button--toggle"))&&t.addEventListener("click",e))},cleanup:t=>{t.matches("button[popovertarget],button.micl-button--toggle")&&(document.removeEventListener("click",e),delete t.dataset.miclinitialized)}}})(),l=".micl-list-item-one,.micl-list-item-two,.micl-list-item-three",a=(()=>{const e=e=>!!e&&e.classList.contains("micl-list-item--disabled");return{keydown:t=>{if(!(t instanceof KeyboardEvent&&t.target instanceof Element&&t.target.matches(".micl-list-item-one,.micl-list-item-two,.micl-list-item-three")))return;const n=t.target.parentElement;if(!n)return;let o=[];if(n instanceof HTMLDetailsElement?o=Array.from(n.parentElement?.children||[]).map(t=>{let n=t.querySelector(":scope > summary");return e(n)?null:n}).filter(e=>!!e):n instanceof HTMLUListElement&&(o=Array.from(n.children).map(t=>t instanceof HTMLLIElement&&!e(t)?t:null).filter(e=>!!e)),0===o.length)return;let i=o.findIndex(e=>(e=>!!e&&e.matches(":has(input[type=checkbox]:checked)"))(e)),r=o.findIndex(e=>0===e.tabIndex),l=r;switch(t.key){case"ArrowDown":l=(r+1)%o.length,t.preventDefault();break;case"ArrowUp":l=(r-1+o.length)%o.length,t.preventDefault();break;case"Tab":-1===i?0!==r&&(o[r].tabIndex=-1,o[0].tabIndex=0):i!==r&&(o[r].tabIndex=-1,o[i].tabIndex=0);break;case"Enter":case" ":const e=t.target.querySelector("input[type=checkbox]");e instanceof HTMLInputElement&&(e.checked=!e.checked)}if(l!==r){o[r].tabIndex=-1,o[l].tabIndex=0,o[l].focus();const e=o[l].querySelector(":scope > button");e?.dispatchEvent(new MouseEvent("mouseenter",{bubbles:!0,cancelable:!0,view:window}))}}}})(),s=".micl-menu[popover]",c=(()=>{const e=(e,t)=>{const n=e.getBoundingClientRect(),o=t.getBoundingClientRect();return(n.x>o.x?"right ":"left ")+(n.y>o.y?"bottom":"top")};return{initialize:t=>{if(!t.matches(".micl-menu[popover]")||t.dataset.miclinitialized)return;t.dataset.miclinitialized="1";const n=document.querySelector(`[popovertarget="${t.id}"]`);n&&t.addEventListener("beforetoggle",o=>{"open"===o.oldState&&(t.style.transformOrigin=e(n,t))}),n&&t.addEventListener("toggle",o=>{"closed"===o.oldState&&(t.style.transformOrigin=e(n,t))}),t.querySelectorAll(":scope > ul.micl-list > li > button[popovertarget]").forEach(e=>{if(e.popoverTargetElement?.matches(".micl-menu[popover]")){let t,n=`--${e.popoverTargetElement.id}`;e.popoverTargetElement instanceof HTMLElement&&(e.style.setProperty("anchor-name",n),e.popoverTargetElement.style.insetBlockStart=`anchor(${n} start)`,e.popoverTargetElement.style.insetInlineStart=`anchor(${n} end)`),e.addEventListener("mouseenter",()=>{e.popoverTargetElement instanceof HTMLElement&&e.popoverTargetElement.showPopover()}),e.addEventListener("mouseleave",()=>{t=setTimeout(()=>{e.popoverTargetElement instanceof HTMLElement&&!e.popoverTargetElement.matches(":hover")&&e.popoverTargetElement.hidePopover()},100)}),e.popoverTargetElement.addEventListener("mouseenter",()=>{clearTimeout(t)}),e.popoverTargetElement.addEventListener("mouseleave",()=>{e.popoverTargetElement instanceof HTMLElement&&e.popoverTargetElement.hidePopover()})}})}}})(),m=".micl-navigationrail__item[for]:not(.micl-navigationrail__item--disabled)",d={keydown:e=>{if(!(e instanceof KeyboardEvent&&e.target instanceof HTMLLabelElement&&e.target.matches(m)))return;const t=document.getElementById(e.target.htmlFor);if(t)switch(e.key){case"Enter":case" ":e.preventDefault(),t.checked||(t.checked=!t.checked)}}},p="input[type=range].micl-slider-xs,input[type=range].micl-slider-s,input[type=range].micl-slider-m,input[type=range].micl-slider-l,input[type=range].micl-slider-xl",u=(()=>{const e=String.fromCharCode(8226),t=String.fromCharCode(8201),n=e=>e.parentElement?.classList.contains("micl-slider__container")?e.parentElement:null,o=(e,t)=>{e.dataset.miclsliderticks=t},i=e=>{let t=JSON.stringify(e.value+""),o=n(e);o&&(o.style.setProperty("--md-sys-slider-value",e.value),o.style.setProperty("--md-sys-slider-tip",t)),e.style.setProperty("--md-sys-slider-value",e.value),e.style.setProperty("--md-sys-slider-tip",t)};return{initialize:r=>{if(!r.matches(p))return;(e=>{let t=e.max||"100";n(e)?.style.setProperty("--md-sys-slider-max",t),e.style.setProperty("--md-sys-slider-max",t)})(r),(e=>{let t=e.min||"0";n(e)?.style.setProperty("--md-sys-slider-min",t),e.style.setProperty("--md-sys-slider-min",t)})(r),i(r),(e=>{let t=n(e);if(t){const n=window.getComputedStyle(e);["--md-sys-slider-handle-height","--md-sys-slider-track-height"].forEach(e=>{t.style.setProperty(e,n.getPropertyValue(e))})}})(r);const l=parseFloat(r.max),a=parseFloat(r.min),s=r.getBoundingClientRect(),c=((e,t,n)=>{const o=[];return e.list&&t>n&&e.list.querySelectorAll("option[value]").forEach(e=>{let i=parseFloat(e.value);!isNaN(i)&&i>=n&&i<=t&&o.push(i)}),o})(r,l,a).sort((e,t)=>e-t).map(e=>Math.round(100*(e-a)/(l-a)));if(c.length>0){const n=document.createElement("canvas"),i=n.getContext("2d");if(i){i.font=window.getComputedStyle(r).getPropertyValue("font");let n=i.measureText(t).width,l=i.measureText(e).width,a=s.width-10,m=0,d="";c.forEach(o=>{let i=a*o/100,r=Math.round((i-m)/n)-1;for(let e=0;e<r;e++)d+=t,m+=n;d+=e,m+=l}),o(r,d)}n.remove()}else o(r,e)},input:e=>{e.target.matches(p)&&e.target instanceof HTMLInputElement&&!e.target.disabled&&i(e.target)}}})(),g=".micl-textfield-outlined > input,.micl-textfield-filled > input",f=".micl-textfield-outlined > textarea,.micl-textfield-filled > textarea",y=".micl-textfield-filled > select,.micl-textfield-outlined > select",h=(()=>{const e=e=>{if(!e.parentElement||e instanceof HTMLSelectElement||!e.maxLength)return;const t=e.parentElement.querySelector(".micl-textfield__character-counter");t&&(t.textContent=`${e.value.length}/${e.maxLength}`)};return{initialize:t=>{t.dataset.miclinitialized||(t.dataset.miclinitialized="1",t.value&&(t.dataset.miclvalue="1"),t instanceof HTMLSelectElement&&t.addEventListener("mousedown",e=>{const n=t.getBoundingClientRect(),o=n.top,i=window.innerHeight-n.bottom;!t.matches(":open")&&t.style.setProperty("--md-sys-select-picker-origin",o>i?"left bottom":"left top")}),e(t))},input:t=>{t.target.matches(`${g},${y},${f}`)&&(t.target instanceof HTMLInputElement||t.target instanceof HTMLSelectElement||t.target instanceof HTMLTextAreaElement)&&t.target.dataset.miclinitialized&&!t.target.disabled&&(t.target.value?t.target.dataset.miclvalue="1":delete t.target.dataset.miclvalue,e(t.target))}}})(),v=(()=>{const e={[n]:{component:o,type:HTMLDialogElement},[i]:{component:r,type:HTMLButtonElement},[l]:{component:a,type:HTMLElement},[s]:{component:c,type:HTMLElement},[m]:{component:d,type:HTMLLabelElement},[y]:{component:h,type:HTMLSelectElement},[p]:{component:u,type:HTMLInputElement},[f]:{component:h,type:HTMLTextAreaElement},[g]:{component:h,type:HTMLInputElement}},t=Object.keys(e).join(","),v=t=>{for(const[n,{component:o,type:i}]of Object.entries(e))if(t.matches(n)&&t instanceof i&&"function"==typeof o.initialize)return void o.initialize(t)},E=e=>{e.querySelectorAll(t).forEach(v),e.querySelectorAll('[class*="micl-"]').forEach(e=>{"1"===window.getComputedStyle(e).getPropertyValue("--micl-ripple")&&e.addEventListener("pointerdown",t=>{if(t.currentTarget.classList.contains("micl-card--nonactionable"))return;t.stopPropagation();let n=e.getBoundingClientRect();e.style.setProperty("--micl-x",t.clientX-n.left+"px"),e.style.setProperty("--micl-y",t.clientY-n.top+"px")})})},b=t=>{for(const[n,{component:o,type:i}]of Object.entries(e))if(t.matches(n)&&t instanceof i&&"function"==typeof o.cleanup)return void o.cleanup(t)},L=e=>{e.querySelectorAll(t).forEach(b)},T=()=>{new MutationObserver(e=>{e.forEach(e=>{"childList"===e.type&&(e.addedNodes.forEach(e=>{e instanceof HTMLElement&&(e.matches(t)&&v(e),e.querySelectorAll(t).forEach(v))}),e.removedNodes.forEach(e=>{e instanceof HTMLElement&&(e.matches(t)&&b(e),L(e))}))})}).observe(document.body,{childList:!0,subtree:!0}),E(document),document.addEventListener("input",t=>{for(const[n,{component:o,type:i}]of Object.entries(e))if(t.target.matches(n)&&t.target instanceof i&&"function"==typeof o.input)return void o.input(t)}),document.addEventListener("keydown",t=>{for(const[n,{component:o,type:i}]of Object.entries(e))if(t.target.matches(n)&&t.target instanceof i&&"function"==typeof o.keydown)return void o.keydown(t)})},x=()=>{document.removeEventListener("DOMContentLoaded",x),T()};return"loading"!==document.readyState?T():document.addEventListener("DOMContentLoaded",x),{initialize:()=>E(document),cleanup:()=>L(document)}})()})(),t})());
package/docs/radio.html CHANGED
@@ -16,10 +16,6 @@
16
16
  flex-direction: column;
17
17
  align-items: flex-end;
18
18
  }
19
- .radio {
20
- display: flex;
21
- align-items: center;
22
- }
23
19
  </style>
24
20
  </head>
25
21
  <body class="micl-window light">
@@ -40,19 +36,19 @@
40
36
  <div class="micl-pane__column">
41
37
  <div class="micl-card-elevated">
42
38
  <div class="micl-card__content">
43
- <div class="radio">
39
+ <div class="micl-flex--vcenter">
44
40
  <input type="radio" class="micl-radio" id="myradio1" name="choices" checked value="c1">
45
41
  <label for="myradio1" class="md-sys-typescale-body-medium">First Choice</label>
46
42
  </div>
47
- <div class="radio">
43
+ <div class="micl-flex--vcenter">
48
44
  <input type="radio" class="micl-radio" id="myradio2" name="choices" value="c2">
49
45
  <label for="myradio2" class="md-sys-typescale-body-medium">Second Choice</label>
50
46
  </div>
51
- <div class="radio">
47
+ <div class="micl-flex--vcenter">
52
48
  <input type="radio" class="micl-radio" id="myradio3" name="choices" value="c3">
53
49
  <label for="myradio3" class="md-sys-typescale-body-medium">Third Choice</label>
54
50
  </div>
55
- <div class="radio">
51
+ <div class="micl-flex--vcenter">
56
52
  <input type="radio" class="micl-radio" id="myradio4" name="choices" value="c4" disabled>
57
53
  <label for="myradio4" class="md-sys-typescale-body-medium">Fourth Choice (disabled)</label>
58
54
  </div>
@@ -60,19 +56,19 @@
60
56
  </div>
61
57
  <div class="micl-card-filled">
62
58
  <div class="micl-card__content">
63
- <div class="radio">
59
+ <div class="micl-flex--vcenter">
64
60
  <input type="radio" class="micl-radio" id="myradio11" name="alternatives" checked value="c1">
65
61
  <label for="myradio11" class="md-sys-typescale-body-medium">First Choice</label>
66
62
  </div>
67
- <div class="radio">
63
+ <div class="micl-flex--vcenter">
68
64
  <input type="radio" class="micl-radio" id="myradio12" name="alternatives" value="c2">
69
65
  <label for="myradio12" class="md-sys-typescale-body-medium">Second Choice</label>
70
66
  </div>
71
- <div class="radio">
67
+ <div class="micl-flex--vcenter">
72
68
  <input type="radio" class="micl-radio" id="myradio13" name="alternatives" value="c3">
73
69
  <label for="myradio13" class="md-sys-typescale-body-medium">Third Choice</label>
74
70
  </div>
75
- <div class="radio">
71
+ <div class="micl-flex--vcenter">
76
72
  <input type="radio" class="micl-radio" id="myradio14" name="alternatives" value="c4" disabled>
77
73
  <label for="myradio14" class="md-sys-typescale-body-medium">Fourth Choice (disabled)</label>
78
74
  </div>
@@ -82,19 +78,19 @@
82
78
  <div class="micl-pane__column">
83
79
  <div class="micl-card-outlined">
84
80
  <div class="micl-card__content">
85
- <div class="radio">
81
+ <div class="micl-flex--vcenter">
86
82
  <label for="myradio21" class="md-sys-typescale-body-medium">First Choice</label>
87
83
  <input type="radio" class="micl-radio" id="myradio21" name="selection" checked value="c1">
88
84
  </div>
89
- <div class="radio">
85
+ <div class="micl-flex--vcenter">
90
86
  <label for="myradio22" class="md-sys-typescale-body-medium">Second Choice</label>
91
87
  <input type="radio" class="micl-radio" id="myradio22" name="selection" value="c2">
92
88
  </div>
93
- <div class="radio">
89
+ <div class="micl-flex--vcenter">
94
90
  <label for="myradio23" class="md-sys-typescale-body-medium">Third Choice</label>
95
91
  <input type="radio" class="micl-radio" id="myradio23" name="selection" value="c3">
96
92
  </div>
97
- <div class="radio">
93
+ <div class="micl-flex--vcenter">
98
94
  <label for="myradio24" class="md-sys-typescale-body-medium">Fourth Choice (disabled)</label>
99
95
  <input type="radio" class="micl-radio" id="myradio24" name="selection" value="c4" disabled>
100
96
  </div>
package/docs/select.html CHANGED
@@ -20,6 +20,12 @@
20
20
  .micl-list-item__thumbnail {
21
21
  height: 56px;
22
22
  }
23
+ .bigdot {
24
+ width: 24px;
25
+ min-width: 24px;
26
+ height: 24px;
27
+ border-radius: 100%;
28
+ }
23
29
  </style>
24
30
  </head>
25
31
  <body class="micl-window light">
@@ -136,7 +142,8 @@
136
142
  <option class="micl-list-item-one" value="BR" disabled>
137
143
  <span class="micl-list-item__text">Brazil</span>
138
144
  </option>
139
- <option class="micl-list-item-one" value="CL">
145
+ <hr class="micl-divider">
146
+ <option class="micl-list-item-one" selected value="CL">
140
147
  <span class="micl-list-item__text">Chile</span>
141
148
  </option>
142
149
  <option class="micl-list-item-one" value="CO">
@@ -149,7 +156,39 @@
149
156
  </div>
150
157
  <div class="micl-textfield-filled">
151
158
  <label for="myselect5">Country</label>
152
- <select id="myselect5" disabled>
159
+ <select id="myselect5">
160
+ <option class="micl-list-item-one" value=""></option>
161
+ <option class="micl-list-item-one" value="AR">
162
+ <span class="micl-list-item__text">Argentina</span>
163
+ <span class="bigdot" style="background-color:teal"></span>
164
+ </option>
165
+ <option class="micl-list-item-one" value="BO">
166
+ <span class="micl-list-item__text">Bolivia</span>
167
+ <span class="bigdot" style="background-color:yellow"></span>
168
+ </option>
169
+ <option class="micl-list-item-one" value="BR">
170
+ <span class="micl-list-item__text">Brazil</span>
171
+ <span class="bigdot" style="background-color:burlywood"></span>
172
+ </option>
173
+ <hr class="micl-divider">
174
+ <option class="micl-list-item-one" value="CL">
175
+ <span class="micl-list-item__text">Chile</span>
176
+ <span class="bigdot" style="background-color:coral"></span>
177
+ </option>
178
+ <option class="micl-list-item-one" value="CO">
179
+ <span class="micl-list-item__text">Colombia</span>
180
+ <span class="bigdot" style="background-color:darkkhaki"></span>
181
+ </option>
182
+ <hr class="micl-divider">
183
+ <option class="micl-list-item-one" value="EC">
184
+ <span class="micl-list-item__text">Ecuador</span>
185
+ <span class="bigdot" style="background-color:darkviolet"></span>
186
+ </option>
187
+ </select>
188
+ </div>
189
+ <div class="micl-textfield-filled">
190
+ <label for="myselect6">Country</label>
191
+ <select id="myselect6" disabled>
153
192
  <option class="micl-list-item-one" value=""></option>
154
193
  <option class="micl-list-item-one" value="AR">
155
194
  <span class="micl-list-item__text">Argentina</span>
@@ -179,8 +218,8 @@
179
218
  </div>
180
219
  <div class="micl-dialog__content">
181
220
  <div class="micl-textfield-outlined" style="margin:8px">
182
- <label for="myselect5">Country</label>
183
- <select id="myselect5">
221
+ <label for="myselect7">Country</label>
222
+ <select id="myselect7">
184
223
  <option class="micl-list-item-two" value="AR">
185
224
  <span class="micl-list-item__text" aria-description="Country code: AR">Argentina</span>
186
225
  </option>
@@ -221,8 +260,8 @@
221
260
  <div class="micl-card__content docs-code">
222
261
  <pre><code>
223
262
  &lt;div class="micl-textfield-outlined"&gt;
224
- &lt;label for="myselect1"&gt;Country&lt;/label&gt;
225
- &lt;select id="myselect1"&gt;
263
+ &lt;label for="myselect"&gt;Country&lt;/label&gt;
264
+ &lt;select id="myselect"&gt;
226
265
  &lt;option class="micl-list-item-one" value=""&gt;&lt;/option&gt;
227
266
  &lt;option class="micl-list-item-one" value="AR"&gt;
228
267
  &lt;span class="micl-list-item__text"&gt;Argentina&lt;/span&gt;
@@ -230,6 +269,7 @@
230
269
  &lt;option class="micl-list-item-one" value="BO"&gt;
231
270
  &lt;span class="micl-list-item__text"&gt;Bolivia&lt;/span&gt;
232
271
  &lt;/option&gt;
272
+ &lt;hr class="micl-divider"&gt;
233
273
  &lt;option class="micl-list-item-one" value="BR" disabled&gt;
234
274
  &lt;span class="micl-list-item__text"&gt;Brazil&lt;/span&gt;
235
275
  &lt;/option&gt;
package/layout/index.scss CHANGED
@@ -19,7 +19,7 @@
19
19
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
20
  // SOFTWARE.
21
21
 
22
- @use '../components/iconbutton';
22
+ @use '../styles/shapes';
23
23
 
24
24
  $md-sys-window-compact-max: 599px;
25
25
  $md-sys-window-medium-min: 600px;
@@ -98,7 +98,7 @@ $md-sys-padding-xxl: 28px;
98
98
  block-size: inherit;
99
99
  min-block-size: inherit;
100
100
  margin: 0;
101
- padding-block-end: var(--md-sys-navigationrail-top-space);
101
+ padding-block-end: var(--md-sys-navigationrail-top-space, 0px);
102
102
  border-radius: var(--md-sys-layout-spatial-radius);
103
103
  }
104
104
  .micl-body {
@@ -166,18 +166,7 @@ $md-sys-padding-xxl: 28px;
166
166
  }
167
167
  }
168
168
 
169
- .micl-link {
170
- display: flex;
171
- align-items: center;
172
- justify-content: center;
173
- text-decoration: none;
174
- }
175
-
176
169
  @media (max-width: $md-sys-window-compact-max) {
177
- :root {
178
- --md-sys-layout-window-margin: #{$md-sys-window-margin-compact};
179
- }
180
-
181
170
  .micl-body.micl-body--stacked-to-medium,
182
171
  .micl-body.micl-body--stacked-to-expanded,
183
172
  .micl-body.micl-body--stacked-to-large,
@@ -198,10 +187,6 @@ $md-sys-padding-xxl: 28px;
198
187
  }
199
188
  }
200
189
  @media (min-width: $md-sys-window-medium-min) and (max-width: $md-sys-window-medium-max) {
201
- :root {
202
- --md-sys-layout-window-margin: #{$md-sys-window-margin-medium};
203
- }
204
-
205
190
  .micl-body.micl-body--stacked-to-expanded,
206
191
  .micl-body.micl-body--stacked-to-large,
207
192
  .micl-body.micl-body--stacked-to-extralarge {
@@ -219,10 +204,6 @@ $md-sys-padding-xxl: 28px;
219
204
  }
220
205
  }
221
206
  @media (min-width: $md-sys-window-expanded-min) and (max-width: $md-sys-window-expanded-max) {
222
- :root {
223
- --md-sys-layout-window-margin: #{$md-sys-window-margin-expanded};
224
- }
225
-
226
207
  .micl-body.micl-body--stacked-to-large,
227
208
  .micl-body.micl-body--stacked-to-extralarge {
228
209
  flex-direction: column;
@@ -237,10 +218,6 @@ $md-sys-padding-xxl: 28px;
237
218
  }
238
219
  }
239
220
  @media (min-width: $md-sys-window-large-min) and (max-width: $md-sys-window-large-max) {
240
- :root {
241
- --md-sys-layout-window-margin: #{$md-sys-window-margin-large};
242
- }
243
-
244
221
  .micl-body.micl-body--stacked-to-extralarge {
245
222
  flex-direction: column;
246
223
  }
@@ -251,8 +228,32 @@ $md-sys-padding-xxl: 28px;
251
228
  flex-direction: column;
252
229
  }
253
230
  }
254
- @media (min-width: $md-sys-window-extralarge-min) {
255
- :root {
256
- --md-sys-layout-window-margin: #{$md-sys-window-margin-extralarge};
257
- }
231
+
232
+ .micl-flex--vcenter {
233
+ display: flex;
234
+ flex-direction: row;
235
+ align-items: center;
236
+ }
237
+
238
+ .micl-grid-iconfield {
239
+ box-sizing: border-box;
240
+ display: grid;
241
+ grid-template-columns: 48px 1fr;
242
+ margin-block: 24px;
243
+ row-gap: 24px;
244
+ background-color: inherit;
245
+ }
246
+ .micl-grid-iconfield__icon {
247
+ grid-column: 1;
248
+ margin-block-start: 0.6rem;
249
+ }
250
+ .micl-grid-iconfield__field {
251
+ grid-column: 2;
252
+ }
253
+
254
+ .micl-link {
255
+ display: flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ text-decoration: none;
258
259
  }
package/micl.ts CHANGED
@@ -25,7 +25,7 @@ import _list, { listSelector } from './components/list';
25
25
  import _menu, { menuSelector } from './components/menu';
26
26
  import _navigationrail, { navigationrailSelector } from './components/navigationrail';
27
27
  import _slider, { sliderSelector } from './components/slider';
28
- import _textfield, { textfieldSelector, selectSelector, textareaSelector } from './components/textfield';
28
+ import _textfield, { textfieldSelector, textareaSelector, selectSelector } from './components/textfield';
29
29
 
30
30
  interface ComponentEntry<T extends HTMLElement> {
31
31
  component: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "material-inspired-component-library",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "description": "The Material-Inspired Component Library (MICL) offers a collection of beautifully crafted components leveraging native HTML markup, designed to align with the Material Design 3 guidelines.",
5
5
  "author": "MICL Hermana <micl.hermana@proton.me> (https://github.com/henkpb/micl)",
6
6
  "license": "MIT",
@@ -13,6 +13,7 @@
13
13
  "UX",
14
14
  "CSS",
15
15
  "accordion",
16
+ "app bar",
16
17
  "badge",
17
18
  "bottomsheet",
18
19
  "button",
@@ -21,10 +22,12 @@
21
22
  "dialog",
22
23
  "divider",
23
24
  "iconbutton",
25
+ "layout",
24
26
  "list",
25
27
  "menu",
26
28
  "navigation rail",
27
29
  "radio button",
30
+ "select",
28
31
  "sidesheet",
29
32
  "slider",
30
33
  "switch",
@@ -31,8 +31,6 @@ $md-sys-shape-corner-extra-extra-large: 48px;
31
31
  $md-sys-shape-corner-full: 50%;
32
32
 
33
33
  :root {
34
- --md-sys-target-size: 48px;
35
-
36
34
  --md-sys-shape-corner-none: #{$md-sys-shape-corner-none};
37
35
  --md-sys-shape-corner-extra-small: #{$md-sys-shape-corner-extra-small};
38
36
  --md-sys-shape-corner-small: #{$md-sys-shape-corner-small};
package/webpack.config.js CHANGED
@@ -5,7 +5,7 @@ const miniCss = require('mini-css-extract-plugin');
5
5
  const distDir = path.resolve(__dirname, 'dist');
6
6
  const docsDir = path.resolve(__dirname, 'docs');
7
7
 
8
- const scssFiles = glob.sync('./components/**/*.scss');
8
+ const scssFiles = glob.sync('{./layout/*.scss,./components/**/*.scss}');
9
9
  const scssEntries = scssFiles.reduce((entries, filePath) => {
10
10
  const componentName = path.dirname(filePath).split('\\').pop();
11
11
  entries[componentName] = './' + filePath;