Added tabs components and refactored stuff to work properly with composed / nested elements etc...
All checks were successful
Build, Test, and Publish (to Private NPM Registry) UI Components Library / publish (push) Successful in 58s

This commit is contained in:
Alan Bridgeman 2026-05-18 13:56:31 -05:00
parent 1c2d794a18
commit d2e99cc280
27 changed files with 1579 additions and 145 deletions

View file

@ -0,0 +1 @@
<h3>Tab 1 Filled</h3>

View file

@ -0,0 +1 @@
<h3>Tab 1 Underline</h3>

View file

@ -0,0 +1,2 @@
<h3>Tab 1</h3>
<p>This is the content of Tab 1.</p>

View file

@ -0,0 +1,35 @@
<h3>Tab 2 (Filled &amp; Underlined)</h3>
<div style="display: grid; grid-template-columns: 1fr 2fr 1fr; gap: 1rem; align-items: start;">
<div class="card" style="background-color: light-dark(#013f4f, #f0c0b0);">
<div class="card-header" style="color: #ffffff">
<h4>Card 1</h4>
</div>
<div class="card-body" style="padding: 1rem;background-color: light-dark(#f0c0b0, #013f4f);">
<p>This is the content of card 1 in Tab 2.</p>
</div>
</div>
<div class="card" style="background-color: light-dark(#4f013f, #f0b0c0);">
<div class="card-header" style="color: #ffffff">
<h4>Card 2</h4>
</div>
<div class="card-body" style="padding: 1rem;background-color: light-dark(#f0b0c0, #4f013f);">
<p>This is the content of card 2 in Tab 2.</p>
</div>
</div>
<div class="card" style="background-color: light-dark(#013f4f,#b0f0c0);">
<div class="card-header" style="color: #ffffff">
<h4>Card 3</h4>
</div>
<div class="card-body" style="padding: 1rem;background-color: light-dark(#b0f0c0, #013f4f);">
<p>This is the content of card 3 in Tab 2.</p>
</div>
</div>
<div class="card" style="background-color: light-dark(#4f013f, #c0b0f0);">
<div class="card-header" style="color: #ffffff">
<h4>Card 4</h4>
</div>
<div class="card-body" style="padding: 1rem;background-color: light-dark(#c0b0f0, #4f013f);">
<p>This is the content of card 4 in Tab 2.</p>
</div>
</div>
</div>

View file

@ -0,0 +1,2 @@
<h3>Tab 3 Filled</h3>
<%- include('./tab-3.partial.ejs') %>

View file

@ -0,0 +1,2 @@
<h3>Tab 3 Underline</h3>
<%- include('./tab-3.partial.ejs') %>

View file

@ -0,0 +1,11 @@
<article>
<header>
<h4>Subsection 1</h4>
</header>
<section>
<p>This is the content of Subsection 1 in Tab 3.</p>
</section>
<footer>
<p>Footer content for Tab 3.</p>
</footer>
</article>

View file

@ -0,0 +1,5 @@
<h3>Tab 4 (Togglable Tab)</h3>
<p>
This tab is conditionally rendered based on a predicate function.
Use the toggle link to show or hide this tab.
</p>

100
test-harness/views/tabs.ejs Normal file
View file

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tabs Test</title>
<link rel="stylesheet" type="text/css" href="<%= componentsStyleHref %>">
<script src="<%= componentsScriptSrc %>"></script>
</head>
<body>
<main style="margin-top:1rem;margin-left:1rem;">
<h1>Tabs Test</h1>
<section>
<h2>Tabs with Underlined Variant</h2>
<%- useComponent('tabs', {
tabs: [
{
title: 'Example Tab',
content: {
id: 'example-tab-1',
contentHTML: include('./tab-partials/tab-1-underline.partial.ejs')
},
active: true
},
{
title: 'A Second Tab',
icon: `<i class="fas fa-star" aria-hidden="true"></i>`,
content: {
id: 'example-tab-2',
contentHTML: include('./tab-partials/tab-2.partial.ejs')
}
},
{
title: 'Tab Three',
content: {
id: 'example-tab-3',
contentHTML: include('./tab-partials/tab-3-underline.partial.ejs')
}
},
{
title: 'Togglable Tab',
content: {
id: 'example-tab-4',
contentHTML: include('./tab-partials/tab-4.partial.ejs')
},
predicate: ({ toggleUnderline }) => toggleUnderline
}
],
tabsId: 'example-tabs',
tabsAriaLabel: 'Example Tabs',
tabsStyleClasses: ['underlined'],
toggleUnderline
}) %>
<a href="/test/tabs?toggleUnderline=<%= !toggleUnderline %>">Toggle Underline</a>
</section>
<section>
<h2>Tabs with Filled Variant</h2>
<%- useComponent('tabs', {
tabs: [
{
title: 'Example Tab',
content: {
id: 'example-tab-1',
contentHTML: include('./tab-partials/tab-1-filled.partial.ejs')
},
active: true
},
{
title: 'A Second Tab',
content: {
id: 'example-tab-2',
contentHTML: include('./tab-partials/tab-2.partial.ejs')
}
},
{
title: 'Tab Three',
content: {
id: 'example-tab-3',
contentHTML: include('./tab-partials/tab-3-filled.partial.ejs')
}
},
{
title: 'Togglable Tab',
content: {
id: 'example-tab-4',
contentHTML: include('./tab-partials/tab-4.partial.ejs')
},
predicate: ({ toggleFilled }) => toggleFilled
}
],
tabsId: 'example-tabs',
tabsAriaLabel: 'Example Tabs',
tabsStyleClasses: ['filled'],
toggleFilled
}) %>
<a href="/test/tabs?toggleFilled=<%= !toggleFilled %>">Toggle Filled</a>
</section>
</main>
</body>
</html>