From 0b0509bb4bbbe5d7a6ca6c67228877cb206dedd0 Mon Sep 17 00:00:00 2001 From: sairaj mote Date: Mon, 24 Oct 2022 23:25:26 +0530 Subject: [PATCH] bug fixes --- components/dist/strip-select.js | 90 +++++++++++++++++------------ components/dist/strip-select.min.js | 2 +- components/index.html | 3 +- components/index.min.html | 3 +- components/test.html | 21 +++---- 5 files changed, 69 insertions(+), 50 deletions(-) diff --git a/components/dist/strip-select.js b/components/dist/strip-select.js index 36242c2..49b382a 100644 --- a/components/dist/strip-select.js +++ b/components/dist/strip-select.js @@ -9,20 +9,24 @@ stripSelect.innerHTML = ` } :host{ padding: 1rem 0; + max-width: 100%; } .hide{ - display: none !important; + opacity: 0; + pointer-events: none; } input[type="radio"]{ display: none; } .scrolling-container{ position: relative; - display: flex; - align-items: center; + display: grid; + grid-template-columns: min-content minmax(0,1fr) min-content; + grid-template-rows: 1fr; } .strip-select{ position: relative; + grid-area: 1/1/2/-1; } :host([multiline]) .strip-select{ display: flex; @@ -40,32 +44,42 @@ stripSelect.innerHTML = ` } .nav-button{ display: flex; - top: 50%; z-index: 2; border: none; padding: 0.3rem; cursor: pointer; - position: absolute; align-items: center; background: rgba(var(--background-color,(255,255,255)), 1); - transform: translateY(-50%); + transition: opacity 0.2s; + grid-row: 1; + } + .nav-button--left{ + grid-column: 1; + justify-self: start; } .nav-button--right{ - right: 0; + grid-column: 3; + justify-self: end; } .cover{ - position: absolute; z-index: 1; width: 5rem; height: 100%; pointer-events: none; + grid-row: 1; + } + .cover--left{ + grid-column: 1; + } + .cover--right{ + grid-column: 3; } .nav-button--right::before{ background-color: red; } .icon{ - height: 1.5rem; - width: 1.5rem; + height: 1.2rem; + width: 1.2rem; fill: rgba(var(--text-color,(17,17,17)), .8); } @media (hover: none){ @@ -165,11 +179,11 @@ customElements.define('strip-select', class extends HTMLElement { this._value = value; this.assignedElements.forEach(elem => { if (elem.value === value) { - elem.setAttribute('active', ''); + elem.setAttribute('selected', ''); elem.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "center" }); } else - elem.removeAttribute('active') + elem.removeAttribute('selected') }); } @@ -193,34 +207,36 @@ customElements.define('strip-select', class extends HTMLElement { const navButtonLeft = this.shadowRoot.querySelector('.nav-button--left'); const navButtonRight = this.shadowRoot.querySelector('.nav-button--right'); slot.addEventListener('slotchange', e => { - this.assignedElements = slot.assignedElements(); - this.assignedElements.forEach(elem => { - if (elem.hasAttribute('selected')) { - elem.setAttribute('active', ''); - this._value = elem.value; + // debounce to wait for all elements to be assigned + clearTimeout(this.slotChangeTimeout); + this.slotChangeTimeout = setTimeout(() => { + this.assignedElements = slot.assignedElements(); + this.assignedElements.forEach(elem => { + if (elem.hasAttribute('selected')) { + this._value = elem.value; + } + }); + if (!this.hasAttribute('multiline')) { + if (this.assignedElements.length > 0) { + firstOptionObserver.observe(this.assignedElements[0]); + lastOptionObserver.observe(this.assignedElements[this.assignedElements.length - 1]); + } + else { + navButtonLeft.classList.add('hide'); + navButtonRight.classList.add('hide'); + coverLeft.classList.add('hide'); + coverRight.classList.add('hide'); + firstOptionObserver.disconnect(); + lastOptionObserver.disconnect(); + } } - }); - if (!this.hasAttribute('multiline')) { - if (this.assignedElements.length > 0) { - firstOptionObserver.observe(this.assignedElements[0]); - lastOptionObserver.observe(this.assignedElements[this.assignedElements.length - 1]); - } - else { - navButtonLeft.classList.add('hide'); - navButtonRight.classList.add('hide'); - coverLeft.classList.add('hide'); - coverRight.classList.add('hide'); - firstOptionObserver.disconnect(); - lastOptionObserver.disconnect(); - } - } + }, 100); }); const resObs = new ResizeObserver(entries => { entries.forEach(entry => { if (entry.contentBoxSize) { // Firefox implements `contentBoxSize` as a single content rect, rather than an array const contentBoxSize = Array.isArray(entry.contentBoxSize) ? entry.contentBoxSize[0] : entry.contentBoxSize; - this.scrollDistance = contentBoxSize.inlineSize * 0.6; } else { this.scrollDistance = entry.contentRect.width * 0.6; @@ -295,9 +311,9 @@ stripOption.innerHTML = ` border-radius: var(--border-radius, 2rem); -webkit-tap-highlight-color: transparent; } - :host([active]) .strip-option{ - color: var(--active-option-color, rgba(var(--background-color,white))); - background-color: var(--active-background-color, var(--accent-color,teal)); + :host([selected]) .strip-option{ + color: var(--selected-option-color, rgba(var(--background-color,white))); + background-color: var(--selected-background-color, var(--accent-color,teal)); } :host(:focus-within){ outline: none; @@ -305,7 +321,7 @@ stripOption.innerHTML = ` :host(:focus-within) .strip-option{ box-shadow: 0 0 0 0.1rem var(--accent-color,teal) inset; } - :host(:hover:not([active])) .strip-option{ + :host(:hover:not([selected])) .strip-option{ background-color: rgba(var(--text-color,(17,17,17)), 0.06); } diff --git a/components/dist/strip-select.min.js b/components/dist/strip-select.min.js index 17fb80d..634a00a 100644 --- a/components/dist/strip-select.min.js +++ b/components/dist/strip-select.min.js @@ -1 +1 @@ -const stripSelect=document.createElement("template");stripSelect.innerHTML='\n\n
\n
\n \n
\n \n
\n \n
\n
\n\n',customElements.define("strip-select",class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}).append(stripSelect.content.cloneNode(!0)),this.stripSelect=this.shadowRoot.querySelector(".strip-select"),this.slottedOptions=void 0,this._value=void 0,this.scrollDistance=0,this.assignedElements=[],this.scrollLeft=this.scrollLeft.bind(this),this.scrollRight=this.scrollRight.bind(this),this.fireEvent=this.fireEvent.bind(this),this.setSelectedOption=this.setSelectedOption.bind(this)}get value(){return this._value}set value(t){this.setSelectedOption(t)}scrollLeft(){this.stripSelect.scrollBy({left:-this.scrollDistance,behavior:"smooth"})}scrollRight(){this.stripSelect.scrollBy({left:this.scrollDistance,behavior:"smooth"})}setSelectedOption(t){this._value!==t&&(this._value=t,this.assignedElements.forEach(e=>{e.value===t?(e.setAttribute("active",""),e.scrollIntoView({behavior:"smooth",block:"nearest",inline:"center"})):e.removeAttribute("active")}))}fireEvent(){this.dispatchEvent(new CustomEvent("change",{bubbles:!0,composed:!0,detail:{value:this._value}}))}connectedCallback(){this.setAttribute("role","listbox");const t=this.shadowRoot.querySelector("slot"),e=this.shadowRoot.querySelector(".cover--left"),n=this.shadowRoot.querySelector(".cover--right"),i=this.shadowRoot.querySelector(".nav-button--left"),s=this.shadowRoot.querySelector(".nav-button--right");t.addEventListener("slotchange",o=>{this.assignedElements=t.assignedElements(),this.assignedElements.forEach(t=>{t.hasAttribute("selected")&&(t.setAttribute("active",""),this._value=t.value)}),this.hasAttribute("multiline")||(this.assignedElements.length>0?(r.observe(this.assignedElements[0]),a.observe(this.assignedElements[this.assignedElements.length-1])):(i.classList.add("hide"),s.classList.add("hide"),e.classList.add("hide"),n.classList.add("hide"),r.disconnect(),a.disconnect()))});const o=new ResizeObserver(t=>{t.forEach(t=>{if(t.contentBoxSize){const e=Array.isArray(t.contentBoxSize)?t.contentBoxSize[0]:t.contentBoxSize;this.scrollDistance=.6*e.inlineSize}else this.scrollDistance=.6*t.contentRect.width})});o.observe(this),this.stripSelect.addEventListener("option-clicked",t=>{this._value!==t.target.value&&(this.setSelectedOption(t.target.value),this.fireEvent())});const r=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting?(i.classList.add("hide"),e.classList.add("hide")):(i.classList.remove("hide"),e.classList.remove("hide"))})},{threshold:.9,root:this}),a=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting?(s.classList.add("hide"),n.classList.add("hide")):(s.classList.remove("hide"),n.classList.remove("hide"))})},{threshold:.9,root:this});i.addEventListener("click",this.scrollLeft),s.addEventListener("click",this.scrollRight)}disconnectedCallback(){navButtonLeft.removeEventListener("click",this.scrollLeft),navButtonRight.removeEventListener("click",this.scrollRight)}});const stripOption=document.createElement("template");stripOption.innerHTML='\n\n\n',customElements.define("strip-option",class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}).append(stripOption.content.cloneNode(!0)),this._value=void 0,this.radioButton=this.shadowRoot.querySelector("input"),this.fireEvent=this.fireEvent.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}get value(){return this._value}fireEvent(){this.dispatchEvent(new CustomEvent("option-clicked",{bubbles:!0,composed:!0,detail:{value:this._value}}))}handleKeyDown(t){"Enter"!==t.key&&"Space"!==t.key||this.fireEvent()}connectedCallback(){this.setAttribute("role","option"),this.setAttribute("tabindex","0"),this._value=this.getAttribute("value"),this.addEventListener("click",this.fireEvent),this.addEventListener("keydown",this.handleKeyDown)}disconnectedCallback(){this.removeEventListener("click",this.fireEvent),this.removeEventListener("keydown",this.handleKeyDown)}}); \ No newline at end of file +const stripSelect=document.createElement("template");stripSelect.innerHTML='\n\n
\n
\n \n
\n \n
\n \n
\n
\n\n',customElements.define("strip-select",class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}).append(stripSelect.content.cloneNode(!0)),this.stripSelect=this.shadowRoot.querySelector(".strip-select"),this.slottedOptions=void 0,this._value=void 0,this.scrollDistance=0,this.assignedElements=[],this.scrollLeft=this.scrollLeft.bind(this),this.scrollRight=this.scrollRight.bind(this),this.fireEvent=this.fireEvent.bind(this),this.setSelectedOption=this.setSelectedOption.bind(this)}get value(){return this._value}set value(e){this.setSelectedOption(e)}scrollLeft(){this.stripSelect.scrollBy({left:-this.scrollDistance,behavior:"smooth"})}scrollRight(){this.stripSelect.scrollBy({left:this.scrollDistance,behavior:"smooth"})}setSelectedOption(e){this._value!==e&&(this._value=e,this.assignedElements.forEach(t=>{t.value===e?(t.setAttribute("selected",""),t.scrollIntoView({behavior:"smooth",block:"nearest",inline:"center"})):t.removeAttribute("selected")}))}fireEvent(){this.dispatchEvent(new CustomEvent("change",{bubbles:!0,composed:!0,detail:{value:this._value}}))}connectedCallback(){this.setAttribute("role","listbox");const e=this.shadowRoot.querySelector("slot"),t=this.shadowRoot.querySelector(".cover--left"),n=this.shadowRoot.querySelector(".cover--right"),i=this.shadowRoot.querySelector(".nav-button--left"),s=this.shadowRoot.querySelector(".nav-button--right");e.addEventListener("slotchange",o=>{clearTimeout(this.slotChangeTimeout),this.slotChangeTimeout=setTimeout(()=>{this.assignedElements=e.assignedElements(),this.assignedElements.forEach(e=>{e.hasAttribute("selected")&&(this._value=e.value)}),this.hasAttribute("multiline")||(this.assignedElements.length>0?(r.observe(this.assignedElements[0]),l.observe(this.assignedElements[this.assignedElements.length-1])):(i.classList.add("hide"),s.classList.add("hide"),t.classList.add("hide"),n.classList.add("hide"),r.disconnect(),l.disconnect()))},100)});const o=new ResizeObserver(e=>{e.forEach(e=>{if(e.contentBoxSize){const t=Array.isArray(e.contentBoxSize)?e.contentBoxSize[0]:e.contentBoxSize;this.scrollDistance=.6*t.inlineSize}else this.scrollDistance=.6*e.contentRect.width})});o.observe(this),this.stripSelect.addEventListener("option-clicked",e=>{this._value!==e.target.value&&(this.setSelectedOption(e.target.value),this.fireEvent())});const r=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting?(i.classList.add("hide"),t.classList.add("hide")):(i.classList.remove("hide"),t.classList.remove("hide"))})},{threshold:.9,root:this}),l=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting?(s.classList.add("hide"),n.classList.add("hide")):(s.classList.remove("hide"),n.classList.remove("hide"))})},{threshold:.9,root:this});i.addEventListener("click",this.scrollLeft),s.addEventListener("click",this.scrollRight)}disconnectedCallback(){navButtonLeft.removeEventListener("click",this.scrollLeft),navButtonRight.removeEventListener("click",this.scrollRight)}});const stripOption=document.createElement("template");stripOption.innerHTML='\n\n\n',customElements.define("strip-option",class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}).append(stripOption.content.cloneNode(!0)),this._value=void 0,this.radioButton=this.shadowRoot.querySelector("input"),this.fireEvent=this.fireEvent.bind(this),this.handleKeyDown=this.handleKeyDown.bind(this)}get value(){return this._value}fireEvent(){this.dispatchEvent(new CustomEvent("option-clicked",{bubbles:!0,composed:!0,detail:{value:this._value}}))}handleKeyDown(e){"Enter"!==e.key&&"Space"!==e.key||this.fireEvent()}connectedCallback(){this.setAttribute("role","option"),this.setAttribute("tabindex","0"),this._value=this.getAttribute("value"),this.addEventListener("click",this.fireEvent),this.addEventListener("keydown",this.handleKeyDown)}disconnectedCallback(){this.removeEventListener("click",this.fireEvent),this.removeEventListener("keydown",this.handleKeyDown)}}); \ No newline at end of file diff --git a/components/index.html b/components/index.html index 52678b5..0dfca5a 100644 --- a/components/index.html +++ b/components/index.html @@ -2394,10 +2394,11 @@ } function downloadJs(componentsArray, options = { minified: true }) { const { minified } = options + const selectedComponentsList = [...getRef('components_selection_list').querySelectorAll('sm-checkbox[checked]')].map(v => v.value) const extension = minified ? '.min.js' : '.js' const element = createElement('a', { attributes: { - 'href': 'data:application/javascript;charset=utf-8,' + encodeURIComponent(componentsArray.join("\n")), + 'href': 'data:application/javascript;charset=utf-8,' + encodeURIComponent(`// Components downloaded: ${selectedComponentsList.join(',')} \n ${componentsArray.join("\n")}`), 'download': `components${extension}`, 'style': 'display:none' } diff --git a/components/index.min.html b/components/index.min.html index 00fdfab..4019e41 100644 --- a/components/index.min.html +++ b/components/index.min.html @@ -780,10 +780,11 @@ } function downloadJs(componentsArray, options = { minified: true }) { const { minified } = options + const selectedComponentsList = [...getRef('components_selection_list').querySelectorAll('sm-checkbox[checked]')].map(v => v.value) const extension = minified ? '.min.js' : '.js' const element = createElement('a', { attributes: { - 'href': 'data:application/javascript;charset=utf-8,' + encodeURIComponent(componentsArray.join("\n")), + 'href': 'data:application/javascript;charset=utf-8,' + encodeURIComponent(`// Components downloaded: ${selectedComponentsList.join(',')} \n ${componentsArray.join("\n")}`), 'download': `components${extension}`, 'style': 'display:none' } diff --git a/components/test.html b/components/test.html index cbc9748..1a61149 100644 --- a/components/test.html +++ b/components/test.html @@ -18,6 +18,7 @@ +