mirror of
https://github.com/hunvreus/basecoat.git
synced 2026-11-13 05:38:18 +00:00
220 lines
10 KiB
Plaintext
220 lines
10 KiB
Plaintext
---
|
|
layout: layouts/page.njk
|
|
title: Sidebar
|
|
description: A composable, themeable and customizable sidebar component.
|
|
toc:
|
|
- label: Usage
|
|
id: usage
|
|
children:
|
|
- label: HTML + JavaScript
|
|
id: usage-html-js
|
|
children:
|
|
- label: "Step 1: Include the JavaScript files"
|
|
id: usage-html-js-1
|
|
- label: "Step 2: Add your sidebar HTML"
|
|
id: usage-html-js-2
|
|
- label: HTML structure
|
|
id: usage-html-js-3
|
|
- label: JavaScript events
|
|
id: usage-html-js-4
|
|
- label: Jinja and Nunjucks
|
|
id: usage-macro
|
|
---
|
|
|
|
{% from "macros/code_block.njk" import code_block %}
|
|
{% from "sidebar.njk" import sidebar %}
|
|
|
|
<h2 id="usage"><a href="#usage">Usage</a></h2>
|
|
|
|
<h3 id="usage-html-js"><a href="#usage-html-js">HTML + JavaScript</a></h3>
|
|
|
|
<h4 id="usage-html-js-1"><a href="#usage-html-js-1">Step 1: Include the JavaScript files</a></h4>
|
|
|
|
<section class="prose">
|
|
<p>You can either <a href="/installation/#install-cdn-all">include the JavaScript file for all the components</a>, or just the one for this component by adding this to the <code><head></code> of your page:</p>
|
|
</section>
|
|
|
|
{% set code_script %}<script src="https://cdn.jsdelivr.net/npm/basecoat-css@{{ pkg.version }}/dist/js/basecoat.min.js" defer></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/basecoat-css@{{ pkg.version }}/dist/js/sidebar.min.js" defer></script>{% endset %}
|
|
{{ code_block(code_script | prettyHtml, "html") }}
|
|
|
|
<div class="flex flex-wrap gap-2 my-6">
|
|
<a class="badge-outline" href="/installation/#install-js">
|
|
Components with JavaScript
|
|
{% lucide "arrow-right" %}
|
|
</a>
|
|
<a class="badge-outline" href="/installation/#install-cli">
|
|
Use the CLI
|
|
{% lucide "arrow-right" %}
|
|
</a>
|
|
<a class="badge-outline" href="https://github.com/hunvreus/basecoat/blob/main/src/js/sidebar.js" target="_blank">
|
|
sidebar.js
|
|
{% lucide "arrow-right" %}
|
|
</a>
|
|
</div>
|
|
|
|
<h4 id="usage-html-js-2"><a href="#usage-html-js-2">Step 2: Add your sidebar HTML</a></h4>
|
|
|
|
{% set code_html %}
|
|
{% set icon_square_terminal %}{% lucide "square-terminal" %}{% endset %}
|
|
{% set icon_bot %}{% lucide "bot" %}{% endset %}
|
|
{% set icon_settings %}{% lucide "settings" %}{% endset %}
|
|
{% set menu = [
|
|
{ type: "group", label: "Getting started", items: [
|
|
{ label: "Playground", url: "#", icon: icon_square_terminal },
|
|
{ label: "Models", url: "#", icon: icon_bot },
|
|
{ label: "Settings", type: "submenu", icon: icon_settings, items: [
|
|
{ label: "General", url: "#" },
|
|
{ label: "Team", url: "#" },
|
|
{ label: "Billing", url: "#" },
|
|
{ label: "Limits", url: "#" }
|
|
] }
|
|
]}
|
|
] %}
|
|
{{ sidebar(
|
|
label="Sidebar navigation",
|
|
content_attrs={
|
|
"class": "scrollbar"
|
|
},
|
|
menu=menu
|
|
) }}
|
|
<main>
|
|
<button type="button" onclick="document.dispatchEvent(new CustomEvent('basecoat:sidebar'))">Toggle sidebar</button>
|
|
<h1>Content</h1>
|
|
</main>
|
|
{% endset %}
|
|
{{ code_block(code_html | prettyHtml, "html") }}
|
|
|
|
<h4 id="usage-html-js-3"><a href="#usage-html-js-3">HTML structure</a></h4>
|
|
|
|
<section class="prose">
|
|
<dl>
|
|
<dt><code class="highlight language-html"><aside class="sidebar" aria-hidden="false"></code></dt>
|
|
<dd>Wraps around the entire component. It can have the following attributes:
|
|
<ul>
|
|
<li><code>aria-hidden="true"</code>: controls the default state of the sidebar (hidden or visible).</li>
|
|
<li><code>data-side="left"</code>: specifies the side of the sidebar (<code>left</code> or <code>right</code>, defaults to <code>left</code>).</li>
|
|
</ul>
|
|
</dd>
|
|
<dl>
|
|
<dt><code class="highlight language-html"><nav></code></dt>
|
|
<dd>
|
|
<p>The navigation element that contains the sidebar's content. It can have the following attributes:</p>
|
|
<ul>
|
|
<li><code>id="{BUTTON_ID}"</code>: linked to by the <code>aria-labelledby</code> attribute of the listbox.</li>
|
|
<li><code>aria-haspopup="menu"</code>: indicates that the button opens a menu.</li>
|
|
<li><code>aria-controls="{ MENU_ID }"</code>: points to the menu's id.</li>
|
|
<li><code>aria-expanded="false"</code>: tracks the popover's state.</li>
|
|
</ul>
|
|
<dl>
|
|
<dt><code class="highlight language-html"><header></code> <span class="badge-secondary">Optional</span></dt>
|
|
<dd>The header of the sidebar.</dd>
|
|
<dt><code class="highlight language-html"><section></code></dt>
|
|
<dd>The main navigation list.
|
|
<dl>
|
|
<dt><code class="highlight language-html"><div role="group"></code></dt>
|
|
<dd>Group of options, can have a <code>aria-labelledby</code> attribute to link to a heading.</dd>
|
|
<dt><code class="highlight language-html"><span role="heading"></code></dt>
|
|
<dd>Group heading, must have an <code>id</code> attribute if you use the <code>aria-labelledby</code> attribute on the group.</dd>
|
|
<dt><code class="highlight language-html"><ul></code></dt>
|
|
<dd>List of links or buttons.
|
|
<dl>
|
|
<dt><code class="highlight language-html"><li></code></dt>
|
|
<dd>Individual item.
|
|
<dl>
|
|
<dt><code class="highlight language-html"><a></code></dt>
|
|
<dd>A link. By default, clicking on a link will close the sidebar on mobile unless the <code>data-keep-mobile-sidebar-open</code> attribute is present.</dd>
|
|
<dt><code class="highlight language-html"><button></code></dt>
|
|
<dd>A button. By default, clicking on a button will close the sidebar on mobile unless the <code>data-keep-mobile-sidebar-open</code> attribute is present.</dd>
|
|
<dt><code class="highlight language-html"><details></code></dt>
|
|
<dd>Collapsible section.
|
|
<dl>
|
|
<dt><code class="highlight language-html"><summary></code></dt>
|
|
<dd>Summary of the collapsible section.</dd>
|
|
<dt><code class="highlight language-html"><ul></code></dt>
|
|
<dd>List of links or buttons.</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
<dt><code class="highlight language-html"><footer></code> <span class="badge-secondary">Optional</span></dt>
|
|
<dd>The footer of the sidebar.</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
<dt><code class="highlight language-html"><main></code></dt>
|
|
<dd>A wrapper for the content of the page.</dd>
|
|
<dt><code class="highlight language-html"><button type="button" onclick="document.dispatchEvent(new CustomEvent('basecoat:sidebar'))"></code></dt>
|
|
<dd>A button to toggle the sidebar. If you want to use multiple sidebars you will need to add unique ids to the sidebars (i.e. <code><aside class="sidebar" id="{SIDEBAR_ID}"></code>) and refer to them in the event <code>detail</code> (i.e. <code>document.dispatchEvent(new CustomEvent('basecoat:sidebar', { detail: { id: '{SIDEBAR_ID}' } }));</code>).</dd>
|
|
</dl>
|
|
</section>
|
|
|
|
<h4 id="usage-html-js-4"><a href="#usage-html-js-4">JavaScript events</a></h4>
|
|
|
|
<section class="prose">
|
|
<dl>
|
|
<dt><code>basecoat:initialized</code></dt>
|
|
<dd>Once the component is fully initialized, it dispatches a custom (non-bubbling) <code>basecoat:initialized</code> event on itself.</dd>
|
|
<dt><code>basecoat:sidebar</code></dt>
|
|
<dd>
|
|
<p>Sidebars listen for this event on <code>document</code> to open, close or toggle themselves. By default, the event will toggle the sidebar, but can be used to open or close if you add an <code>action</code> to the detail. Additionally, if you have multiple sidebars on the page, you can target a specific sidebar by adding its <code>id</code> to the detail:</p>
|
|
{% set code_trigger %}<!-- Toggles the sidebar -->
|
|
<button type="button" onclick="document.dispatchEvent(new CustomEvent('basecoat:sidebar'));">Toggle sidebar</button>
|
|
<!-- Opens the `#main-navigation` sidebar -->
|
|
<button type="button" onclick="document.dispatchEvent(new CustomEvent('basecoat:sidebar', { detail: { id: 'main-navigation', action: 'open' } }));">Open sidebar</button>
|
|
<!-- Closes the sidebar -->
|
|
<button type="button" onclick="document.dispatchEvent(new CustomEvent('basecoat:sidebar', { detail: { action: 'close' } }));">Close sidebar</button>{% endset %}
|
|
{{ code_block(code_trigger | prettyHtml, "html") }}
|
|
</dd>
|
|
</dl>
|
|
</section>
|
|
|
|
<h3 id="usage-macro"><a href="#usage-macro">Jinja and Nunjucks</a></h3>
|
|
|
|
<div class="prose">
|
|
<p>You can use the <code class="relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-xs">sidebar()</code> Nunjucks or Jinja macro for this component.</p>
|
|
</div>
|
|
|
|
<div class="flex flex-wrap gap-2 my-6">
|
|
<a class="badge-outline" href="/installation/#install-macros" target="_blank">
|
|
Use Nunjucks or Jinja macros
|
|
{% lucide "arrow-right" %}
|
|
</a>
|
|
<a class="badge-outline" href="https://github.com/hunvreus/basecoat/blob/main/src/jinja/sidebar.html.jinja" target="_blank">
|
|
Jinja macro
|
|
{% lucide "arrow-right" %}
|
|
</a>
|
|
<a class="badge-outline" href="https://github.com/hunvreus/basecoat/blob/main/src/nunjucks/sidebar.njk" target="_blank">
|
|
Nunjucks macro
|
|
{% lucide "arrow-right" %}
|
|
</a>
|
|
</div>
|
|
|
|
{% set raw_code %}{% raw %}{% set menu = [
|
|
{ type: "group", label: "Getting started", items: [
|
|
{ label: "Playground", url: "#" },
|
|
{ label: "Models", url: "#" },
|
|
{ label: "Settings", type: "submenu", items: [
|
|
{ label: "General", url: "#" },
|
|
{ label: "Team", url: "#" },
|
|
{ label: "Billing", url: "#" },
|
|
{ label: "Limits", url: "#" }
|
|
] }
|
|
]}
|
|
] %}
|
|
|
|
{{ sidebar(
|
|
label="Sidebar navigation",
|
|
menu=menu
|
|
) }}
|
|
<main>
|
|
<h1>Content</h1>
|
|
</main>
|
|
{% endraw %}{% endset%}
|
|
{{ code_block(raw_code, "jinja") }}
|