<panel-set>
<panel-set>
is a kind of experiment in 'something
different', based on some fundamental ideas and observation in design
systems and the accessibility tree, it aims to allow users to create
declarative tabsets and single select accordions (vertical tabsets, if you
prefer).
It is informed by a long history of other experiments and is a unique spin in how it sets about this by being remarkably 'hands off'.
First, it is a wrapper element. You wrap it around more or less
standard HTML pairs of heading and content with simple boolean attributes
identifying them as either x-title
or x-content
.
So, kinda like this
<panel-set>
<h2 x-title>Ingredients</h2>
<div x-content>
some content here that lists ingredients
</div>
<h2 x-title>Directions</h2>
<div x-content>
some content here describing the direction to prepare
</div>
<h2 x-title>Nutrition</h2>
<div x-content>
some content here about nutritional information
</div>
</panel-set>
Even without JavaScript at all, this is reasonable HTML content and has been since 1991.. It's not interactive, so no need to worry about lots of other kinds of problems. With nothing else, it looks like...
It is, of course, highly stylable, so your page can add some CSS like...
[x-title] {
color: teal;
margin: 0;
padding:0;
}
[x-content] {
margin-left: 1rem;
margin-bottom: 1rem;
}
Which renders, unsprisingly as...
What's really interesting here is that its main focus is
mixing in function and meaning for
accessibility rather than rendering. Basically, it's what people seem to
want from the is="..."
attribute, without the problems
inherent in that. It's a new element idea without the old problems that
frustrate us: Your DOM remains your DOM, in the light DOM. The
only thing that is provided is that which is fundamentally
necessary in order for it to retain some basic visual meaning - and the
rest is up to you to style, in your normal light DOM. Below you will
notice that it looks exactly the same as above, however now only one
content section is expanded and it is both interactive and meaningful as
vertical tabs, with full keyboard handling.
Cool. Simple enough: If you inspect the DOM you'll notice all of the aria
attributes and things have sprung to life, and you'll notice there is a an
attribute display="accordion"
. This is the default mode of
panelsets because it should be acceptable on the smallest of screens. You
can also change the display (even dynamically) to "tabs" and it will
render as...
You can combine this with a `ResizeObserver` or `window.matchMedia` to resposively switch the display mode with just a few lines, but that's up to you.
Now, I know what you're thinking: "Those... don't look much like tabs?"
and you're right. It does, of course, provide for something a little
better by letting you opt in via another attribute
theme="default"
. If you just add that, then you've got...
As you can see, your light DOM is still your light DOM, and sure you have a lot of flexibility in styling it -- but... To be honest, if history is any indication you very well might hit a wall....
If you do (and let's be honest, you will because we haven't managed to get this right yet), then rather than fiddling around with complex or custom ways to hide secrets and expose themes, and pieces and parts and properties you can just have very nearly full control.
So, basically --- that's the potentially interesting spin. What do you think? Want to try it? All you have to do is something like (the actual script is linked):
<script async type="module" src="panel-set-two.mjs"></script>
You can see this in action, with live switching of the type baesd on
matchMedia
and a little demo
You can also view and edit and remix all of the code in this explainer/demo @ https://glitch.com/edit/#!/panel-set