News for hackers. Stuff that matters.
Re:If Web Components are so great, why am I not using them? by LorenzA on Thursday August 03, 2023 @05:34AM (#36983458)
Most of the time you have the tab and the panel to display the content of the tab a super simple demo implementation of something like this https://web.dev/components-howto-tabs/

In regards of slots, they are a nice way to allow a user of you webcomponent to overwrite/replace parts of your component with something else. This is most of the time a more advanced feature and I find it quite nice to build headless components

Re:If Web Components are so great, why am I not using them? by kerkeslager on Thursday August 03, 2023 @01:42PM (#36989143)
> Most of the time you have the tab and the panel to display the content of the tab a super simple demo implementation of something like this https://web.dev/components-howto-tabs/

That's exactly what I'm saying is bad. Why does the user of the howto-tabs have to type "slot='panel'" when that information is already communicated by the fact that it's a "howto-panel" inside a "howto-tabs"? This is a useless leaking of implementation details.

And that page just keeps going and going. Sure, some of that is because they're implementing a few neat features, but most of it is because slots are way overcomplicated for something that's actually easier to do without them.

Re:If Web Components are so great, why am I not using them? by LorenzA on Thursday August 03, 2023 @04:55PM (#36991745)
you can just have an unnamed slot. I'm probably missing something here haven't build a tabs thing in a long time. But just trying this out for a couple of minutes the thing you want seems to be possible. I didn't do any styling here and the code is just something I hacked down to test it. Where hn-tabs is your tab-area and hn-tab your tab-

   class HnTabs extends HTMLElement {
       constructor() {
           super();
           this._tabs = {}
           this.attachShadow({ mode: 'open' })
           const ul = document.createElement('ul')
           this.shadowRoot.appendChild(ul)
           const slot = document.createElement('slot')         
           this.shadowRoot.appendChild(slot)
           slot.addEventListener('slotchange', () => {
             ul.innerHTML = ''
             const tabs = Array.from(this.querySelectorAll('hn-
             if (!tabs.some((tab) => tab.hasAttribute('active')
               tabs[0].setAttribute('active', '')
             }
             tabs.forEach((tab) => {
               const li = document.createElement('li')
               li.innerText = tab.getAttribute('text')
               ul.appendChild(li)
               li.addEventListener('click', (e) => {
                 tabs.forEach((t) => t.removeAttribute('active'
                 tab.setAttribute('active', '')
               })
             })
           })
       }
   }
   customElements.define('hn-tabs', HnTabs);
   
   class HnTab extends HTMLElement {
       static get observedAttributes() {
         return ['active'];
       }
       constructor() {
           super()
           this.attachShadow({ mode: 'open' });
           this._slot = document.createElement('slot')         
           this.shadowRoot.appendChild(this._slot)
           this._slot.style.display = 'none'
           console.log(this.slot)
       }
       attributeChangedCallback() {
         this.#activeStatus()
       }
       connectedCallback() {
         this.#activeStatus()
       }
       #activeStatus(){
         const active = this.hasAttribute('active');
         this._slot.style.display = active ? 'block' : 'none'
       }
   }
   customElements.define('hn-tab', HnTab);
Re:If Web Components are so great, why am I not using them? by dannye on Friday August 04, 2023 @11:09AM (#37001078)
Unless you are still in the IE world (which is challenging when using WCs), use one `append` instead of multiple `appendChild`
Re:If Web Components are so great, why am I not using them? by kerkeslager on Saturday August 05, 2023 @11:39AM (#37013086)
When I have some time I'll play around with this: I'm certainly open to the idea that there's some stuff I don't know about slots. But I have a question: When you append the slot to the shadow root, doesn't that mean that you lose styling in the slot contents?
Re:If Web Components are so great, why am I not using them? by LorenzA on Saturday August 05, 2023 @01:23PM (#37014296)
no things inside slots keep the styling from the outside
Re:If Web Components are so great, why am I not using them? by kerkeslager on Saturday August 05, 2023 @09:49PM (#37018190)
Hm, I stand by my comment that slots are overcomplicated, but that might actually make it worth it.
Re:If Web Components are so great, why am I not using them? by kerkeslager on Sunday August 06, 2023 @10:53PM (#37029502)
Okay, I got around to trying this out, and that's cool. Thanks for explaining this.
Re:If Web Components are so great, why am I not using them? by LorenzA on Monday August 07, 2023 @01:22PM (#37037554)
you are welcome happy to help.
Re:If Web Components are so great, why am I not using them? by dannye on Friday August 04, 2023 @11:07AM (#37001046)
use: slotAssignment: 'manual'