Aside
Side-panel used for small user interactions, such as selecting a date.
The Aside component must be created with a child component Panel.
<aside data-ts="Aside">
<div data-ts="Panel">
<p>Aside content.</p>
</div>
</aside>
You can create the Aside wherever you like, just make sure that it's positioned outside of the Main element when it opens.
<main data-ts="Main">
<p>Main content.</p>
</main>
<aside data-ts="Aside">
<div data-ts="Panel">
<p>Aside content.</p>
</div>
</aside>
Adding a header
The data-ts.title attribute configures the Aside with a nice header.
<aside data-ts="Aside" data-ts.title="Aside Header">
<div data-ts="Panel">
<p>Aside content.</p>
</div>
</aside>
You can color the header by assigning any of the classnames
ts-bg-blue,
ts-bg-green,
ts-bg-red and
ts-bg-purple
to the Aside element itself.
<aside data-ts="Aside" class="ts-bg-red">
<div data-ts="Panel"></div>
</aside>
Opening the aside
The data-ts.open attribute can be flipped to toggle the Aside.
<aside data-ts="Aside" data-ts.open="false" id="myaside">
<div data-ts="Panel">
<p>Aside content.</p>
</div>
</aside>
Let's try that with jQuery.
$('#myaside').attr('data-ts.open', true);
Adding some tabs
If an Aside contains more than one Panel,
we will automatically create a TabBar to switch between the panels like in this example.
<aside data-ts="Aside">
<div data-ts="Panel" data-ts.label="Tab 1">
<p>Aside content.</p>
</div>
<div data-ts="Panel" data-ts.label="Tab 2">
<p>Aside content.</p>
</div>
</aside>
The tabs can also be created programatically. In that case, the panel switching mechanism must be implemented manually somehow.
ts.ui.get('#aside3', aside => {
aside.tabs([
{label: 'Tab 1', onselect: function() {
console.log('Panel one');
}},
{label: 'Tab 2', onselect: function() {
console.log('Panel two');
}}
]).open();
});
You can also mix the two approaches to dynamically update tabs that were created with Panel elements. This will for example assign an onselect callback to the third tab.
ts.ui.get('#myaside', aside => {
var tabs = aside.tabs();
tabs[2].onselect = function() {
console.log('selected');
};
});
To remove all dynamically created tabs, you can simply clear the tab collection.
ts.ui.get('#myaside', aside => {
aside.tabs().clear();
});
Adding some buttons
It's common for Asides to show a group of buttons, usually following a set of form fields. To make sure that they always look the same, the certified way to add this group of buttons is via a Buttons menu.
<aside data-ts="Aside">
<div data-ts="Panel">
... form fields here ...
<menu data-ts="Buttons">
<li>
<button class="ts-primary">
<span>Submit Changes</span>
</button>
</li>
<li>
<button class="ts-secondary">
<span>Cancel Everything</span>
</button>
</li>
</menu>
</div>
</aside>
Showing the spinner
The data-ts.busy attribute can be set to show the spinner
<aside data-ts="Aside" data-ts.busy="Busy message!">
<div data-ts="Panel">
<p>Aside content.</p>
</div>
</aside>
Let's try that with jQuery.
var aside = $("#myaside");
aside.attr('data-ts.busy', 'Loading');
aside.attr('data-ts.open', true);
setTimeout(function() {
aside.attr('data-ts.busy', '');
setTimeout(function() {
aside.attr('data-ts.open', false);
}, 500);
}, 1500);
Tracking the state
You can setup inline callbacks to be invoked when the aside changes state using one of onopen,
onopened,
onclose and
onclosed.
You can also do this with event listeners if you like.
<aside data-ts="Aside"
ts.onopen="console.log('Will open')"
ts.onopened="console.log('Did open')"
ts.onclose="console.log('Will close')"
ts.onclosed="console.log('Did close')">
<div data-ts="Panel">
<p>Aside content.</p>
</div>
</aside>
Stacking Asides
Asides will automatically stack themselves whenever new asides open.
- The old Asides will slide elegantly to the right
- The new Aside will float the top of the z-index