material-inspired-component-library 1.0.3 → 1.1.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.
Files changed (80) hide show
  1. package/README.md +23 -20
  2. package/components/accordion/README.md +7 -9
  3. package/components/bottomsheet/README.md +7 -9
  4. package/components/bottomsheet/index.scss +3 -0
  5. package/components/button/README.md +7 -9
  6. package/components/button/index.scss +3 -0
  7. package/components/card/README.md +3 -3
  8. package/components/card/index.scss +3 -0
  9. package/components/checkbox/README.md +7 -9
  10. package/components/checkbox/index.scss +2 -0
  11. package/components/dialog/README.md +3 -3
  12. package/components/dialog/index.scss +3 -0
  13. package/components/divider/README.md +3 -3
  14. package/components/iconbutton/README.md +7 -9
  15. package/components/iconbutton/index.scss +3 -0
  16. package/components/list/README.md +7 -9
  17. package/components/list/index.scss +2 -0
  18. package/components/menu/README.md +8 -10
  19. package/components/menu/index.scss +3 -0
  20. package/components/radio/README.md +3 -3
  21. package/components/radio/index.scss +2 -0
  22. package/components/select/README.md +9 -11
  23. package/components/select/index.scss +2 -0
  24. package/components/sidesheet/README.md +3 -3
  25. package/components/sidesheet/index.scss +2 -0
  26. package/components/slider/README.md +7 -9
  27. package/components/slider/index.scss +13 -8
  28. package/components/switch/README.md +3 -3
  29. package/components/switch/index.scss +3 -0
  30. package/components/textfield/README.md +55 -26
  31. package/components/textfield/index.scss +100 -55
  32. package/components/textfield/index.ts +23 -16
  33. package/dist/bottomsheet.css +1 -1
  34. package/dist/bottomsheet.js +1 -0
  35. package/dist/button.css +1 -1
  36. package/dist/button.js +1 -0
  37. package/dist/card.css +1 -1
  38. package/dist/card.js +1 -0
  39. package/dist/checkbox.css +1 -1
  40. package/dist/checkbox.js +1 -0
  41. package/dist/components/bottomsheet/index.d.ts +6 -0
  42. package/dist/components/button/index.d.ts +6 -0
  43. package/dist/components/checkbox/index.d.ts +5 -0
  44. package/dist/components/iconbutton/index.d.ts +6 -0
  45. package/dist/components/list/index.d.ts +5 -0
  46. package/dist/components/menu/index.d.ts +16 -0
  47. package/dist/components/slider/index.d.ts +6 -0
  48. package/dist/components/textfield/index.d.ts +8 -0
  49. package/dist/dialog.css +1 -1
  50. package/dist/dialog.js +1 -0
  51. package/dist/divider.js +1 -0
  52. package/dist/iconbutton.css +1 -1
  53. package/dist/iconbutton.js +1 -0
  54. package/dist/list.css +1 -1
  55. package/dist/list.js +1 -0
  56. package/dist/menu.css +1 -1
  57. package/dist/menu.js +1 -0
  58. package/dist/micl.css +1 -1
  59. package/dist/micl.d.ts +5 -0
  60. package/dist/micl.js +1 -1
  61. package/dist/radio.css +1 -1
  62. package/dist/radio.js +1 -0
  63. package/dist/select.css +1 -1
  64. package/dist/select.js +1 -0
  65. package/dist/sidesheet.css +1 -1
  66. package/dist/sidesheet.js +1 -0
  67. package/dist/slider.css +1 -1
  68. package/dist/slider.js +1 -0
  69. package/dist/switch.css +1 -1
  70. package/dist/switch.js +1 -0
  71. package/dist/textfield.css +1 -1
  72. package/dist/textfield.js +1 -0
  73. package/docs/micl.css +1 -1
  74. package/docs/micl.js +1 -1
  75. package/docs/slider.html +1 -0
  76. package/docs/textfield.html +30 -17
  77. package/{components.ts → micl.ts} +75 -53
  78. package/package.json +5 -3
  79. package/tsconfig.json +11 -5
  80. package/webpack.config.js +7 -4
package/docs/micl.js CHANGED
@@ -1 +1 @@
1
- (()=>{"use strict";(()=>{const e="dialog.micl-bottomsheet",t=(()=>{var e=0;const t=t=>{let n=parseInt(window.getComputedStyle(t).getPropertyValue("max-height")),i=(t.dataset.snapheights||"").split(",").map(Number).filter(e=>!isNaN(e)&&e>0&&e<=n);return e||(e=t.getBoundingClientRect().height),[...new Set(i.concat([e,n]).sort())]},n=(e,n)=>{let i=e.getBoundingClientRect().height,o=t(e);return o.filter(e=>e>i+4)[0]||o[n?o.length-1:0]},i=(e,t)=>{e.style.setProperty("--md-sys-bottomsheet-height",`${t}px`)};return{initialize:e=>{if(!e.matches("dialog.micl-bottomsheet")||e.dataset.miclinitialized)return;e.dataset.miclinitialized="1";const o=e.querySelector(".micl-bottomsheet__headline");if(!o)return;const l=o.querySelector(".micl-bottomsheet__draghandle");l?.addEventListener("click",()=>{const t=n(e,!1);t>4&&i(e,t)});let a,r,s=!1,c=!1;function m(t){const n=t.clientY;s&&Math.abs(a-n)>4&&(s=!1,c=!0,e.classList.add("micl-bottomsheet--resizing")),c&&i(e,r+a-n)}function d(o){s=!1,e.classList.remove("micl-bottomsheet--resizing"),c&&(c=!1,o.clientY<a?i(e,n(e,!0)):e.getBoundingClientRect().height<48?(e.popover&&e.hidePopover(),i(e,r)):i(e,(e=>{let n=e.getBoundingClientRect().height,i=t(e),o=i.filter(e=>e<n-4);return o[o.length-1]||i[0]})(e)),document.removeEventListener("mousemove",m),document.removeEventListener("mouseup",d))}o.addEventListener("mousedown",t=>{t.eventPhase===Event.AT_TARGET&&(s=!0,t.preventDefault(),a=t.clientY,r=e.getBoundingClientRect().height,document.addEventListener("mousemove",m),document.addEventListener("mouseup",d))})},cleanup:e=>{e.matches("dialog.micl-bottomsheet")&&delete e.dataset.miclinitialized}}})(),n="button[popovertarget],button.micl-button--toggle",i=(()=>{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.toggle("micl-button--selected"))};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)}}})(),o=".micl-checkbox",l={keydown:e=>{if(e.target.matches(o)&&e instanceof KeyboardEvent&&e.target instanceof HTMLInputElement&&!e.target.disabled)switch(e.key){case"Enter":case" ":e.target.checked=!e.target.checked,e.preventDefault()}}},a=".micl-list-item-one,.micl-list-item-two,.micl-list-item-three",r=(()=>{const e=e=>!!e&&e.classList.contains("micl-list-item--disabled"),t=e=>!!e&&e.matches(":has(input[type=checkbox]:checked)");return{keydown:n=>{if(!(n instanceof KeyboardEvent&&n.target instanceof Element&&n.target.matches(".micl-list-item-one,.micl-list-item-two,.micl-list-item-three")))return;const i=n.target.parentElement;if(!i)return;let o=[];if(i instanceof HTMLDetailsElement?o=Array.from(i.parentElement?.children||[]).map(t=>{let n=t.querySelector(":scope > summary");return e(n)?null:n}).filter(e=>!!e):i instanceof HTMLUListElement&&(o=Array.from(i.children).map(t=>t instanceof HTMLLIElement&&!e(t)?t:null).filter(e=>!!e)),0===o.length)return;let l=o.findIndex(e=>t(e));-1===l&&(l=o.findIndex(e=>0===e.tabIndex)),-1===l&&(l=0);let a=l;switch(n.key){case"ArrowDown":a=(l+1)%o.length,n.preventDefault();break;case"ArrowUp":a=(l-1+o.length)%o.length,n.preventDefault();break;case"Tab":let e=o.findIndex(e=>t(e));-1===e?0!==l&&(o[l].tabIndex=-1,o[0].tabIndex=0):e!==l&&(o[l].tabIndex=-1,o[e].tabIndex=0);break;case"Enter":case" ":const i=n.target.querySelector("input[type=checkbox].micl-checkbox");i instanceof HTMLInputElement&&(i.checked=!i.checked)}a!==l&&(o[l].tabIndex=-1,o[a].tabIndex=0,o[a].focus())}}})(),s=".micl-menu[popover]",c=(()=>{const e=(e,t)=>{const n=e.getBoundingClientRect().y,i=t.getBoundingClientRect().y,o=window.getComputedStyle(t).getPropertyValue("transform-origin");return(n>i?"bottom ":"top ")+(parseInt(o)>0?"right":"left")};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))})}}})(),m="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",d=(()=>{const e=String.fromCharCode(8226),t=String.fromCharCode(8201);return{initialize:n=>{n.style.setProperty("--md-sys-slider-max",n.max||"100"),n.style.setProperty("--md-sys-slider-min",n.min||"0"),n.style.setProperty("--md-sys-slider-value",n.value),n.style.setProperty("--md-sys-slider-tip",JSON.stringify(n.value+""));const i=n.getBoundingClientRect(),o=document.elementFromPoint(Math.max(i.x-1,0),Math.max(i.y-1,0));o&&(n.style.color=window.getComputedStyle(o).getPropertyValue("background-color"));const l=parseFloat(n.max),a=parseFloat(n.min),r=(e=>{const t=[],n=parseFloat(e.max),i=parseFloat(e.min);return e.list&&!isNaN(n)&&!isNaN(i)&&n>i&&e.list.querySelectorAll("option[value]").forEach(e=>{let o=parseFloat(e.value);!isNaN(o)&&o>=i&&o<=n&&t.push(o)}),t})(n).sort((e,t)=>e-t).map(e=>Math.round(100*(e-a)/(l-a)));if(r.length>0){const o=document.createElement("canvas"),l=o.getContext("2d");if(l){l.font=window.getComputedStyle(n).getPropertyValue("font");let o=l.measureText(t).width,a=l.measureText(e).width,s=i.width-10,c=0,m="";r.forEach(n=>{let i=s*n/100,l=Math.round((i-c)/o)-1;for(let e=0;e<l;e++)m+=t,c+=o;m+=e,c+=a}),n.dataset.miclsliderticks=m}o.remove()}else n.dataset.miclsliderticks=e},input:e=>{e.target.matches(".micl-slider-xs,.micl-slider-s,.micl-slider-m,.micl-slider-l,.micl-slider-xl")&&e.target instanceof HTMLInputElement&&!e.target.disabled&&(e.target.style.setProperty("--md-sys-slider-value",e.target.value),e.target.style.setProperty("--md-sys-slider-tip",JSON.stringify(e.target.value+"")))}}})(),u=".micl-textfield-outlined > input,.micl-textfield-filled > input",p=".micl-textfield-outlined > select,.micl-textfield-filled > select",g=(()=>{const e=".micl-textfield-character-counter";return{initialize:t=>{if(!t.dataset.miclinitialized&&(t.dataset.miclinitialized="1",t.value&&(t.dataset.miclvalue="1"),t instanceof HTMLInputElement&&t.maxLength)){const n=t.parentElement?.querySelector(e);n&&(n.textContent=`${t.value.length}/${t.maxLength}`)}},input:t=>{if(t.target.matches(`${u},${p}`)&&(t.target instanceof HTMLInputElement||t.target instanceof HTMLSelectElement)&&t.target.dataset.miclinitialized&&!t.target.disabled&&(t.target.value?t.target.dataset.miclvalue="1":delete t.target.dataset.miclvalue,t.target instanceof HTMLInputElement&&t.target.maxLength)){const n=t.target.parentElement?.querySelector(e);n&&(n.textContent=`${t.target.value.length}/${t.target.maxLength}`)}}}})();(()=>{const h={[e]:{component:t,type:HTMLDialogElement},[n]:{component:i,type:HTMLButtonElement},[o]:{component:l,type:HTMLInputElement},[a]:{component:r,type:HTMLElement},[s]:{component:c,type:HTMLElement},[p]:{component:g,type:HTMLSelectElement},[m]:{component:d,type:HTMLInputElement},[u]:{component:g,type:HTMLInputElement}},f=Object.keys(h).join(","),y=e=>{for(const[t,{component:n,type:i}]of Object.entries(h))if(e.matches(t)&&e instanceof i&&"function"==typeof n.initialize)return void n.initialize(e)},v=e=>{for(const[t,{component:n,type:i}]of Object.entries(h))if(e.matches(t)&&e instanceof i&&"function"==typeof n.cleanup)return void n.cleanup(e)};new MutationObserver(e=>{e.forEach(e=>{"childList"===e.type&&(e.addedNodes.forEach(e=>{e instanceof HTMLElement&&(e.matches(f)&&y(e),e.querySelectorAll(f).forEach(y))}),e.removedNodes.forEach(e=>{e instanceof HTMLElement&&(e.matches(f)&&v(e),e.querySelectorAll(f).forEach(v))}))})}).observe(document.body,{childList:!0,subtree:!0}),document.querySelectorAll(f).forEach(y),document.querySelectorAll('[class*="micl-"]').forEach(e=>{window.getComputedStyle(e).getPropertyValue("--miclripple")&&e.addEventListener("pointerdown",t=>{if(t.currentTarget.classList.contains("micl-card--nonactionable"))return;const n=t.clientX,i=t.clientY,o=e.getBoundingClientRect(),l=2*Math.sqrt(Math.pow(o.width,2)+Math.pow(o.height,2));e.style.cssText="--s:0;--o:1;",e.offsetTop,e.style.cssText=`--t:1;--o:0;--d:${l};--x:${n-o.left};--y:${i-o.top}`})}),document.addEventListener("input",e=>{for(const[t,{component:n,type:i}]of Object.entries(h))if(e.target.matches(t)&&e.target instanceof i&&"function"==typeof n.input)return void n.input(e)}),document.addEventListener("keydown",e=>{for(const[t,{component:n,type:i}]of Object.entries(h))if(e.target.matches(t)&&e.target instanceof i&&"function"==typeof n.keydown)return void n.keydown(e)})})()})()})();
1
+ (()=>{"use strict";(()=>{const e="dialog.micl-bottomsheet",t=(()=>{var e=0;const t=t=>{let n=parseInt(window.getComputedStyle(t).getPropertyValue("max-height")),i=(t.dataset.snapheights||"").split(",").map(Number).filter(e=>!isNaN(e)&&e>0&&e<=n);return e||(e=t.getBoundingClientRect().height),[...new Set(i.concat([e,n]).sort())]},n=(e,n)=>{let i=e.getBoundingClientRect().height,o=t(e);return o.filter(e=>e>i+4)[0]||o[n?o.length-1:0]},i=(e,t)=>{e.style.setProperty("--md-sys-bottomsheet-height",`${t}px`)};return{initialize:e=>{if(!e.matches("dialog.micl-bottomsheet")||e.dataset.miclinitialized)return;e.dataset.miclinitialized="1";const o=e.querySelector(".micl-bottomsheet__headline");if(!o)return;const l=o.querySelector(".micl-bottomsheet__draghandle");l?.addEventListener("click",()=>{const t=n(e,!1);t>4&&i(e,t)});let r,a,c=!1,s=!1;function m(t){const n=t.clientY;c&&Math.abs(r-n)>4&&(c=!1,s=!0,e.classList.add("micl-bottomsheet--resizing")),s&&i(e,a+r-n)}function d(o){c=!1,e.classList.remove("micl-bottomsheet--resizing"),s&&(s=!1,o.clientY<r?i(e,n(e,!0)):e.getBoundingClientRect().height<48?(e.popover&&e.hidePopover(),i(e,a)):i(e,(e=>{let n=e.getBoundingClientRect().height,i=t(e),o=i.filter(e=>e<n-4);return o[o.length-1]||i[0]})(e)),document.removeEventListener("mousemove",m),document.removeEventListener("mouseup",d))}o.addEventListener("mousedown",t=>{t.eventPhase===Event.AT_TARGET&&(c=!0,t.preventDefault(),r=t.clientY,a=e.getBoundingClientRect().height,document.addEventListener("mousemove",m),document.addEventListener("mouseup",d))})},cleanup:e=>{e.matches("dialog.micl-bottomsheet")&&delete e.dataset.miclinitialized}}})(),n="button[popovertarget],button.micl-button--toggle",i=(()=>{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.toggle("micl-button--selected"))};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)}}})(),o=".micl-checkbox",l={keydown:e=>{if(e.target.matches(o)&&e instanceof KeyboardEvent&&e.target instanceof HTMLInputElement&&!e.target.disabled)switch(e.key){case"Enter":case" ":e.target.checked=!e.target.checked,e.preventDefault()}}},r=".micl-list-item-one,.micl-list-item-two,.micl-list-item-three",a=(()=>{const e=e=>!!e&&e.classList.contains("micl-list-item--disabled"),t=e=>!!e&&e.matches(":has(input[type=checkbox]:checked)");return{keydown:n=>{if(!(n instanceof KeyboardEvent&&n.target instanceof Element&&n.target.matches(".micl-list-item-one,.micl-list-item-two,.micl-list-item-three")))return;const i=n.target.parentElement;if(!i)return;let o=[];if(i instanceof HTMLDetailsElement?o=Array.from(i.parentElement?.children||[]).map(t=>{let n=t.querySelector(":scope > summary");return e(n)?null:n}).filter(e=>!!e):i instanceof HTMLUListElement&&(o=Array.from(i.children).map(t=>t instanceof HTMLLIElement&&!e(t)?t:null).filter(e=>!!e)),0===o.length)return;let l=o.findIndex(e=>t(e));-1===l&&(l=o.findIndex(e=>0===e.tabIndex)),-1===l&&(l=0);let r=l;switch(n.key){case"ArrowDown":r=(l+1)%o.length,n.preventDefault();break;case"ArrowUp":r=(l-1+o.length)%o.length,n.preventDefault();break;case"Tab":let e=o.findIndex(e=>t(e));-1===e?0!==l&&(o[l].tabIndex=-1,o[0].tabIndex=0):e!==l&&(o[l].tabIndex=-1,o[e].tabIndex=0);break;case"Enter":case" ":const i=n.target.querySelector("input[type=checkbox].micl-checkbox");i instanceof HTMLInputElement&&(i.checked=!i.checked)}r!==l&&(o[l].tabIndex=-1,o[r].tabIndex=0,o[r].focus())}}})(),c=".micl-menu[popover]",s=(()=>{const e=(e,t)=>{const n=e.getBoundingClientRect().y,i=t.getBoundingClientRect().y,o=window.getComputedStyle(t).getPropertyValue("transform-origin");return(n>i?"bottom ":"top ")+(parseInt(o)>0?"right":"left")};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))})}}})(),m="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",d=(()=>{const e=String.fromCharCode(8226),t=String.fromCharCode(8201);return{initialize:n=>{n.style.setProperty("--md-sys-slider-max",n.max||"100"),n.style.setProperty("--md-sys-slider-min",n.min||"0"),n.style.setProperty("--md-sys-slider-value",n.value),n.style.setProperty("--md-sys-slider-tip",JSON.stringify(n.value+""));const i=n.getBoundingClientRect(),o=document.elementFromPoint(Math.max(i.x-1,0),Math.max(i.y-1,0));o&&(n.style.color=window.getComputedStyle(o).getPropertyValue("background-color"));const l=parseFloat(n.max),r=parseFloat(n.min),a=(e=>{const t=[],n=parseFloat(e.max),i=parseFloat(e.min);return e.list&&!isNaN(n)&&!isNaN(i)&&n>i&&e.list.querySelectorAll("option[value]").forEach(e=>{let o=parseFloat(e.value);!isNaN(o)&&o>=i&&o<=n&&t.push(o)}),t})(n).sort((e,t)=>e-t).map(e=>Math.round(100*(e-r)/(l-r)));if(a.length>0){const o=document.createElement("canvas"),l=o.getContext("2d");if(l){l.font=window.getComputedStyle(n).getPropertyValue("font");let o=l.measureText(t).width,r=l.measureText(e).width,c=i.width-10,s=0,m="";a.forEach(n=>{let i=c*n/100,l=Math.round((i-s)/o)-1;for(let e=0;e<l;e++)m+=t,s+=o;m+=e,s+=r}),n.dataset.miclsliderticks=m}o.remove()}else n.dataset.miclsliderticks=e},input:e=>{e.target.matches(".micl-slider-xs,.micl-slider-s,.micl-slider-m,.micl-slider-l,.micl-slider-xl")&&e.target instanceof HTMLInputElement&&!e.target.disabled&&(e.target.style.setProperty("--md-sys-slider-value",e.target.value),e.target.style.setProperty("--md-sys-slider-tip",JSON.stringify(e.target.value+"")))}}})(),u=".micl-textfield-outlined > input,.micl-textfield-filled > input",p=".micl-textfield-outlined > select,.micl-textfield-filled > select",g=".micl-textfield-outlined > textarea,.micl-textfield-filled > textarea",f=(()=>{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(`${u},${p},${g}`)||!(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}`)}}})();(()=>{const h={[e]:{component:t,type:HTMLDialogElement},[n]:{component:i,type:HTMLButtonElement},[o]:{component:l,type:HTMLInputElement},[r]:{component:a,type:HTMLElement},[c]:{component:s,type:HTMLElement},[p]:{component:f,type:HTMLSelectElement},[m]:{component:d,type:HTMLInputElement},[g]:{component:f,type:HTMLTextAreaElement},[u]:{component:f,type:HTMLInputElement}},y=Object.keys(h).join(","),v=e=>{for(const[t,{component:n,type:i}]of Object.entries(h))if(e.matches(t)&&e instanceof i&&"function"==typeof n.initialize)return void n.initialize(e)},E=e=>{for(const[t,{component:n,type:i}]of Object.entries(h))if(e.matches(t)&&e instanceof i&&"function"==typeof n.cleanup)return void n.cleanup(e)};new MutationObserver(e=>{e.forEach(e=>{"childList"===e.type&&(e.addedNodes.forEach(e=>{e instanceof HTMLElement&&(e.matches(y)&&v(e),e.querySelectorAll(y).forEach(v))}),e.removedNodes.forEach(e=>{e instanceof HTMLElement&&(e.matches(y)&&E(e),e.querySelectorAll(y).forEach(E))}))})}).observe(document.body,{childList:!0,subtree:!0}),document.querySelectorAll(y).forEach(v),document.querySelectorAll('[class*="micl-"]').forEach(e=>{window.getComputedStyle(e).getPropertyValue("--miclripple")&&e.addEventListener("pointerdown",t=>{if(t.currentTarget.classList.contains("micl-card--nonactionable"))return;const n=t.clientX,i=t.clientY,o=e.getBoundingClientRect(),l=2*Math.sqrt(Math.pow(o.width,2)+Math.pow(o.height,2));e.style.cssText="--s:0;--o:1;",e.offsetTop,e.style.cssText=`--t:1;--o:0;--d:${l};--x:${n-o.left};--y:${i-o.top}`})}),document.addEventListener("input",e=>{for(const[t,{component:n,type:i}]of Object.entries(h))if(e.target.matches(t)&&e.target instanceof i&&"function"==typeof n.input)return void n.input(e)}),document.addEventListener("keydown",e=>{for(const[t,{component:n,type:i}]of Object.entries(h))if(e.target.matches(t)&&e.target instanceof i&&"function"==typeof n.keydown)return void n.keydown(e)})})()})()})();
package/docs/slider.html CHANGED
@@ -18,6 +18,7 @@
18
18
  }
19
19
  .range {
20
20
  margin: 64px 8px;
21
+ background-color: inherit;
21
22
  }
22
23
  .micl-card-elevated input[type=range] {
23
24
  width: 100%;
@@ -45,15 +45,19 @@
45
45
  <input type="text" id="mytextfield4" disabled value="Paris">
46
46
  <span class="micl-textfield__icon-trailing material-symbols-outlined">cancel</span>
47
47
  </div>
48
+ <div class="micl-textfield-outlined">
49
+ <label for="mytextfield5">Multiline text field</label>
50
+ <textarea id="mytextfield5"></textarea>
51
+ </div>
48
52
  <div class="micl-textfield-outlined micl-textfield--error">
49
53
  <span class="micl-textfield__icon-leading material-symbols-outlined">search</span>
50
- <label for="mytextfield5">Label text</label>
51
- <input type="text" id="mytextfield5">
54
+ <label for="mytextfield6">Label text</label>
55
+ <input type="text" id="mytextfield6">
52
56
  <span class="micl-textfield__icon-trailing material-symbols-outlined">cancel</span>
53
57
  </div>
54
58
  <div class="micl-textfield-outlined micl-textfield--error">
55
- <label for="mytextfield6">Password</label>
56
- <input type="password" id="mytextfield6" value="foobar">
59
+ <label for="mytextfield7">Password</label>
60
+ <input type="password" id="mytextfield7" value="foobar">
57
61
  <span class="micl-textfield__icon-trailing material-symbols-outlined" style="font-variation-settings:'FILL' 1">error</span>
58
62
  <span class="micl-textfield__supporting-text">Include an uppercase letter, a lowercase letter, and a numeric character</span>
59
63
  </div>
@@ -71,7 +75,7 @@
71
75
  <span class="micl-textfield__supporting-text">Supporting text</span>
72
76
  </div>
73
77
  <div class="micl-textfield-outlined">
74
- <span class="micl-textfield__prefix">€</span>
78
+ <span class="micl-textfield__prefix" aria-label="Euro">€</span>
75
79
  <label for="mytextfield13">Amount</label>
76
80
  <input type="text" id="mytextfield13" value="299.89">
77
81
  <span class="micl-textfield__icon-trailing material-symbols-outlined">credit_card</span>
@@ -83,16 +87,20 @@
83
87
  <span class="micl-textfield__icon-trailing material-symbols-outlined">cancel</span>
84
88
  <span class="micl-textfield__supporting-text">This input field is disabled</span>
85
89
  </div>
90
+ <div class="micl-textfield-outlined">
91
+ <label for="mytextfield15">Text area</label>
92
+ <textarea id="mytextfield15" rows="3">Text areas are taller than text fields and wrap overflow text onto a new line. They are a fixed height and scroll vertically when the cursor reaches the bottom of the field. </textarea>
93
+ </div>
86
94
  <div class="micl-textfield-outlined micl-textfield--error">
87
95
  <span class="micl-textfield__icon-leading material-symbols-outlined">search</span>
88
- <label for="mytextfield15">Label text</label>
89
- <input type="text" id="mytextfield15">
96
+ <label for="mytextfield16">Label text</label>
97
+ <input type="text" id="mytextfield16">
90
98
  <span class="micl-textfield__icon-trailing material-symbols-outlined">cancel</span>
91
99
  </div>
92
100
  <div class="micl-textfield-outlined micl-textfield--error">
93
- <label for="mytextfield16">Weight</label>
94
- <input type="number" id="mytextfield16" value="17800">
95
- <span class="micl-textfield__suffix">kg</span>
101
+ <label for="mytextfield17">Weight</label>
102
+ <input type="number" id="mytextfield17" value="17800">
103
+ <span class="micl-textfield__suffix" aria-label="Kilograms">kg</span>
96
104
  <span class="micl-textfield__icon-trailing material-symbols-outlined" style="font-variation-settings:'FILL' 1">error</span>
97
105
  <span class="micl-textfield__supporting-text">Too heavy</span>
98
106
  </div>
@@ -106,15 +114,15 @@
106
114
  </div>
107
115
  <div class="micl-textfield-filled" style="--md-sys-textfield-prefix-space:2.5em">
108
116
  <span class="micl-textfield__icon-leading material-symbols-outlined">search</span>
109
- <span class="micl-textfield__prefix">NOK</span>
117
+ <span class="micl-textfield__prefix" aria-label="Norwegian kroner">NOK</span>
110
118
  <label for="mytextfield22">Amount*</label>
111
119
  <input type="text" id="mytextfield22" required value="">
112
120
  <span class="micl-textfield__supporting-text">In Norwegian kroner</span>
113
121
  </div>
114
122
  <div class="micl-textfield-filled">
115
123
  <span class="micl-textfield__character-counter"></span>
116
- <span class="micl-textfield__supporting-text">Enter at least twelve characters</span>
117
- <span class="micl-textfield__prefix">€</span>
124
+ <span class="micl-textfield__supporting-text micl-textfield__supporting-text--focus">Enter at least twelve characters</span>
125
+ <span class="micl-textfield__prefix" aria-label="Euro">€</span>
118
126
  <span class="micl-textfield__icon-trailing material-symbols-outlined">cancel</span>
119
127
  <input type="text" id="mytextfield23" maxlength="24">
120
128
  <label for="mytextfield23">Label text</label>
@@ -127,16 +135,21 @@
127
135
  <span class="micl-textfield__icon-trailing material-symbols-outlined">cancel</span>
128
136
  <span class="micl-textfield__supporting-text">This input field is disabled</span>
129
137
  </div>
138
+ <div class="micl-textfield-filled">
139
+ <label for="mytextfield25">Multiline text field</label>
140
+ <textarea id="mytextfield25" maxlength="100">Lorem ipsum dolor sit amet consectetur adipiscing elit</textarea>
141
+ <span class="micl-textfield__character-counter"></span>
142
+ </div>
130
143
  <div class="micl-textfield-filled micl-textfield--error">
131
144
  <span class="micl-textfield__icon-leading material-symbols-outlined">search</span>
132
- <label for="mytextfield25">Label text</label>
133
- <input type="text" id="mytextfield25">
145
+ <label for="mytextfield26">Label text</label>
146
+ <input type="text" id="mytextfield26">
134
147
  <span class="micl-textfield__icon-trailing material-symbols-outlined" style="font-variation-settings:'FILL' 1">error</span>
135
148
  </div>
136
149
  <div class="micl-textfield-filled micl-textfield--error">
137
150
  <span class="micl-textfield__icon-leading material-symbols-outlined">search</span>
138
- <label for="mytextfield26">City</label>
139
- <input type="text" id="mytextfield26" maxlength="20" value="Amsterdaaam">
151
+ <label for="mytextfield27">City</label>
152
+ <input type="text" id="mytextfield27" maxlength="20" value="Amsterdaaam">
140
153
  <span class="micl-textfield__icon-trailing material-symbols-outlined" style="font-variation-settings:'FILL' 1">error</span>
141
154
  <span class="micl-textfield__supporting-text">Incorrect spelling</span>
142
155
  <span class="micl-textfield__character-counter"></span>
@@ -25,7 +25,7 @@ import _checkbox, { checkboxSelector } from './components/checkbox';
25
25
  import _list, { listSelector } from './components/list';
26
26
  import _menu, { menuSelector } from './components/menu';
27
27
  import _slider, { sliderSelector } from './components/slider';
28
- import _textfield, { textfieldSelector, selectSelector } from './components/textfield';
28
+ import _textfield, { textfieldSelector, selectSelector, textareaSelector } from './components/textfield';
29
29
 
30
30
  interface ComponentEntry<T extends HTMLElement> {
31
31
  component: {
@@ -47,6 +47,7 @@ export default (() =>
47
47
  [menuSelector] : { component: _menu, type: HTMLElement },
48
48
  [selectSelector] : { component: _textfield, type: HTMLSelectElement },
49
49
  [sliderSelector] : { component: _slider, type: HTMLInputElement },
50
+ [textareaSelector] : { component: _textfield, type: HTMLTextAreaElement },
50
51
  [textfieldSelector] : { component: _textfield, type: HTMLInputElement }
51
52
  };
52
53
 
@@ -66,11 +67,11 @@ export default (() =>
66
67
  }
67
68
  };
68
69
 
69
- const initializeComponents = () =>
70
+ const initializeComponents = (parent: HTMLDocument | HTMLElement): void =>
70
71
  {
71
- document.querySelectorAll<HTMLElement>(selector).forEach(initializeComponent);
72
+ parent.querySelectorAll<HTMLElement>(selector).forEach(initializeComponent);
72
73
 
73
- document.querySelectorAll<HTMLElement>('[class*="micl-"]').forEach(element => {
74
+ parent.querySelectorAll<HTMLElement>('[class*="micl-"]').forEach(element => {
74
75
  if (window.getComputedStyle(element).getPropertyValue('--miclripple')) {
75
76
  element.addEventListener('pointerdown', e => {
76
77
  if ((e.currentTarget as Element).classList.contains('micl-card--nonactionable')) {
@@ -103,67 +104,88 @@ export default (() =>
103
104
  }
104
105
  };
105
106
 
106
- const observer = new MutationObserver(mutations =>
107
+ const cleanupComponents = (parent: HTMLDocument | HTMLElement): void =>
107
108
  {
108
- mutations.forEach(mutation =>
109
+ parent.querySelectorAll<HTMLElement>(selector).forEach(cleanupComponent);
110
+ };
111
+
112
+ const activate = () =>
113
+ {
114
+ const observer = new MutationObserver(mutations =>
109
115
  {
110
- if (mutation.type !== 'childList') {
111
- return;
112
- }
113
- mutation.addedNodes.forEach(node =>
116
+ mutations.forEach(mutation =>
114
117
  {
115
- if (node instanceof HTMLElement) {
116
- if (node.matches(selector)) {
117
- initializeComponent(node);
118
- }
119
- node.querySelectorAll<HTMLElement>(selector).forEach(initializeComponent);
118
+ if (mutation.type !== 'childList') {
119
+ return;
120
120
  }
121
- });
122
- mutation.removedNodes.forEach(node =>
123
- {
124
- if (node instanceof HTMLElement) {
125
- if (node.matches(selector)) {
126
- cleanupComponent(node);
121
+ mutation.addedNodes.forEach(node =>
122
+ {
123
+ if (node instanceof HTMLElement) {
124
+ if (node.matches(selector)) {
125
+ initializeComponent(node);
126
+ }
127
+ node.querySelectorAll<HTMLElement>(selector).forEach(initializeComponent);
127
128
  }
128
- node.querySelectorAll<HTMLElement>(selector).forEach(cleanupComponent);
129
- }
129
+ });
130
+ mutation.removedNodes.forEach(node =>
131
+ {
132
+ if (node instanceof HTMLElement) {
133
+ if (node.matches(selector)) {
134
+ cleanupComponent(node);
135
+ }
136
+ cleanupComponents(node);
137
+ }
138
+ });
130
139
  });
131
140
  });
132
- });
133
- observer.observe(document.body, { childList: true, subtree: true });
141
+ observer.observe(document.body, { childList: true, subtree: true });
134
142
 
135
- initializeComponents();
143
+ initializeComponents(document);
136
144
 
137
- // Delegated Event Handlers
138
- document.addEventListener('input', event =>
139
- {
140
- for (const [selector, { component, type }] of Object.entries(componentMap)) {
141
- if (
142
- (event.target as Element).matches(selector)
143
- && event.target instanceof type
144
- && typeof component.input === 'function'
145
- ) {
146
- component.input(event);
147
- return;
145
+ // Delegated Event Handlers
146
+ document.addEventListener('input', event =>
147
+ {
148
+ for (const [selector, { component, type }] of Object.entries(componentMap)) {
149
+ if (
150
+ (event.target as Element).matches(selector)
151
+ && event.target instanceof type
152
+ && typeof component.input === 'function'
153
+ ) {
154
+ component.input(event);
155
+ return;
156
+ }
148
157
  }
149
- }
150
- });
151
- document.addEventListener('keydown', event =>
152
- {
153
- for (const [selector, { component, type }] of Object.entries(componentMap)) {
154
- if (
155
- (event.target as Element).matches(selector)
156
- && event.target instanceof type
157
- && typeof component.keydown === 'function'
158
- ) {
159
- component.keydown(event);
160
- return;
158
+ });
159
+ document.addEventListener('keydown', event =>
160
+ {
161
+ for (const [selector, { component, type }] of Object.entries(componentMap)) {
162
+ if (
163
+ (event.target as Element).matches(selector)
164
+ && event.target instanceof type
165
+ && typeof component.keydown === 'function'
166
+ ) {
167
+ component.keydown(event);
168
+ return;
169
+ }
161
170
  }
162
- }
163
- });
171
+ });
172
+ };
173
+
174
+ const loaded = () =>
175
+ {
176
+ document.removeEventListener('DOMContentLoaded', loaded);
177
+ activate();
178
+ };
179
+
180
+ if (document.readyState !== 'loading') {
181
+ activate();
182
+ }
183
+ else {
184
+ document.addEventListener('DOMContentLoaded', loaded);
185
+ }
164
186
 
165
187
  return {
166
- initialize: () => initializeComponents(),
167
- cleanup : () => document.querySelectorAll<HTMLElement>(selector).forEach(cleanupComponent)
188
+ initialize: () => initializeComponents(document),
189
+ cleanup : () => cleanupComponents(document)
168
190
  };
169
191
  })();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "material-inspired-component-library",
3
- "version": "1.0.3",
3
+ "version": "1.1.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",
@@ -33,14 +33,16 @@
33
33
  },
34
34
  "homepage": "https://github.com/henkpb/micl",
35
35
  "bugs": {
36
- "url": "https://github.com/henkpb/material-inspired-component-library/issues"
36
+ "url": "https://github.com/henkpb/micl/issues"
37
37
  },
38
- "main": "index.js",
38
+ "main": "dist/micl.js",
39
+ "types": "dist/micl.d.ts",
39
40
  "scripts": {
40
41
  "build": "webpack",
41
42
  "start": "echo 'No start script yet'",
42
43
  "test": "echo \"Error: no test specified\" && exit 1"
43
44
  },
45
+ "sideEffects": false,
44
46
  "devDependencies": {
45
47
  "autoprefixer": "^10.4.19",
46
48
  "css-loader": "^7.1.2",
package/tsconfig.json CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  /* Modules */
28
28
  "module": "es2022", /* Specify what module code is generated. */
29
- // "rootDir": "./", /* Specify the root folder within your source files. */
29
+ "rootDir": "./", /* Specify the root folder within your source files. */
30
30
  "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
31
31
  // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
32
32
  // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
@@ -50,14 +50,14 @@
50
50
  // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
51
51
 
52
52
  /* Emit */
53
- // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
53
+ "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
54
54
  // "declarationMap": true, /* Create sourcemaps for d.ts files. */
55
55
  // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
56
56
  // "sourceMap": true, /* Create source map files for emitted JavaScript files. */
57
57
  // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
58
58
  // "noEmit": true, /* Disable emitting files from a compilation. */
59
59
  // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
60
- // "outDir": "./", /* Specify an output folder for all emitted files. */
60
+ "outDir": "./dist", /* Specify an output folder for all emitted files. */
61
61
  // "removeComments": true, /* Disable emitting comments. */
62
62
  // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
63
63
  // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
@@ -70,7 +70,7 @@
70
70
  // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
71
71
  // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
72
72
  // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
73
- // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
73
+ "declarationDir": "./dist", /* Specify the output directory for generated declaration files. */
74
74
 
75
75
  /* Interop Constraints */
76
76
  // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
@@ -106,5 +106,11 @@
106
106
  /* Completeness */
107
107
  // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
108
108
  "skipLibCheck": true /* Skip type checking all .d.ts files. */
109
- }
109
+ },
110
+ "include": [
111
+ "./**/*"
112
+ ],
113
+ "exclude": [
114
+ "node_modules"
115
+ ]
110
116
  }
package/webpack.config.js CHANGED
@@ -15,7 +15,7 @@ module.exports = [{
15
15
  mode: 'production',
16
16
  entry: {
17
17
  ...scssEntries,
18
- micl: ['./styles.scss', './components.ts']
18
+ micl: ['./styles.scss', './micl.ts']
19
19
  },
20
20
  resolve: {
21
21
  extensions: ['.ts', '.tsx', '.js']
@@ -23,7 +23,11 @@ module.exports = [{
23
23
  output: {
24
24
  path: distDir,
25
25
  filename: '[name].js',
26
- clean: true
26
+ clean: true,
27
+ library: {
28
+ name: 'micl',
29
+ type: 'umd'
30
+ }
27
31
  },
28
32
  module: {
29
33
  rules: [{
@@ -34,8 +38,7 @@ module.exports = [{
34
38
  'postcss-loader',
35
39
  'sass-loader'
36
40
  ]
37
- },
38
- {
41
+ }, {
39
42
  test: /\.tsx?$/,
40
43
  use: 'ts-loader',
41
44
  exclude: /node_modules/