treefmt: apply prettier
Pure `nix fmt` output from the commit before this one — no hand edits. 203 files: 52 md, 42 tsx, 32 js, 32 css, 21 ts, 13 html, 8 json, 3 mjs. Reproduce with `nix develop -c nix fmt` on the parent commit; the result should be byte-identical to this tree. None of the 13 `.prettierignore` entries appears here — verified by intersecting the changed-file list against the ignore file, with a control proving the intersection finds a match when one exists.
This commit is contained in:
parent
5d24bedd60
commit
39b95c2ede
203 changed files with 10090 additions and 6085 deletions
|
|
@ -27,29 +27,37 @@
|
|||
// call site keeps working unchanged. Call configure() exactly once per
|
||||
// element (throws if called twice), mirroring the old call sites.
|
||||
|
||||
import { el } from '../dom.js';
|
||||
import { createTabStrip } from './tabs.js';
|
||||
import { el } from "../dom.js";
|
||||
import { createTabStrip } from "./tabs.js";
|
||||
|
||||
class HiveTabStrip extends HTMLElement {
|
||||
configure({ tabs, defaultId, onShow }) {
|
||||
if (this._api) {
|
||||
throw new Error('hive-tab-strip: configure() called twice on the same element');
|
||||
throw new Error(
|
||||
"hive-tab-strip: configure() called twice on the same element",
|
||||
);
|
||||
}
|
||||
const prefix = this.getAttribute('prefix');
|
||||
const prefix = this.getAttribute("prefix");
|
||||
if (!prefix) {
|
||||
throw new Error('hive-tab-strip: missing required `prefix` attribute');
|
||||
throw new Error("hive-tab-strip: missing required `prefix` attribute");
|
||||
}
|
||||
for (const tab of tabs) {
|
||||
const a = el('a', {
|
||||
class: 'hive-tab',
|
||||
id: `${prefix}-tab-${tab.id}`,
|
||||
href: `#${tab.id}`,
|
||||
role: 'tab',
|
||||
'aria-controls': `${prefix}-pane-${tab.id}`,
|
||||
'data-tab': tab.id,
|
||||
}, tab.label);
|
||||
const a = el(
|
||||
"a",
|
||||
{
|
||||
class: "hive-tab",
|
||||
id: `${prefix}-tab-${tab.id}`,
|
||||
href: `#${tab.id}`,
|
||||
role: "tab",
|
||||
"aria-controls": `${prefix}-pane-${tab.id}`,
|
||||
"data-tab": tab.id,
|
||||
},
|
||||
tab.label,
|
||||
);
|
||||
if (tab.badgeId) {
|
||||
a.append(el('span', { class: 'tab-count', id: tab.badgeId, hidden: '' }));
|
||||
a.append(
|
||||
el("span", { class: "tab-count", id: tab.badgeId, hidden: "" }),
|
||||
);
|
||||
}
|
||||
this.append(a);
|
||||
}
|
||||
|
|
@ -57,4 +65,4 @@ class HiveTabStrip extends HTMLElement {
|
|||
return this._api;
|
||||
}
|
||||
}
|
||||
customElements.define('hive-tab-strip', HiveTabStrip);
|
||||
customElements.define("hive-tab-strip", HiveTabStrip);
|
||||
|
|
|
|||
|
|
@ -23,7 +23,9 @@
|
|||
font-size: 0.85em;
|
||||
letter-spacing: 0.05em;
|
||||
cursor: pointer;
|
||||
transition: background 100ms, color 100ms;
|
||||
transition:
|
||||
background 100ms,
|
||||
color 100ms;
|
||||
}
|
||||
|
||||
.hive-tab:hover {
|
||||
|
|
|
|||
|
|
@ -27,44 +27,44 @@ export function createTabStrip(tabbar, opts = {}) {
|
|||
if (!tabbar) {
|
||||
return { show() {}, active: () => null };
|
||||
}
|
||||
const tabs = Array.from(tabbar.querySelectorAll('[data-tab]'));
|
||||
const ids = tabs.map((t) => t.getAttribute('data-tab'));
|
||||
const tabs = Array.from(tabbar.querySelectorAll("[data-tab]"));
|
||||
const ids = tabs.map((t) => t.getAttribute("data-tab"));
|
||||
const fallback = defaultId && ids.includes(defaultId) ? defaultId : ids[0];
|
||||
|
||||
const paneFor = (id) => document.querySelector(`[data-tab-pane="${id}"]`);
|
||||
|
||||
const active = () => {
|
||||
const hash = location.hash.replace(/^#/, '');
|
||||
const hash = location.hash.replace(/^#/, "");
|
||||
return ids.includes(hash) ? hash : fallback;
|
||||
};
|
||||
|
||||
const show = (id) => {
|
||||
const target = ids.includes(id) ? id : fallback;
|
||||
for (const tab of tabs) {
|
||||
const tid = tab.getAttribute('data-tab');
|
||||
const tid = tab.getAttribute("data-tab");
|
||||
const on = tid === target;
|
||||
tab.classList.toggle('hive-tab--active', on);
|
||||
tab.setAttribute('aria-selected', String(on));
|
||||
tab.classList.toggle("hive-tab--active", on);
|
||||
tab.setAttribute("aria-selected", String(on));
|
||||
const pane = paneFor(tid);
|
||||
if (pane) pane.hidden = !on;
|
||||
}
|
||||
if (typeof onShow === 'function') onShow(target);
|
||||
if (typeof onShow === "function") onShow(target);
|
||||
};
|
||||
|
||||
// Drive every activation through the hash so deep-links + back/forward
|
||||
// stay authoritative; the hashchange listener does the actual showing.
|
||||
for (const tab of tabs) {
|
||||
tab.addEventListener('click', (e) => {
|
||||
tab.addEventListener("click", (e) => {
|
||||
e.preventDefault();
|
||||
const id = tab.getAttribute('data-tab');
|
||||
if (location.hash.replace(/^#/, '') === id) {
|
||||
const id = tab.getAttribute("data-tab");
|
||||
if (location.hash.replace(/^#/, "") === id) {
|
||||
show(id); // same hash → no hashchange, re-show directly
|
||||
} else {
|
||||
location.hash = id;
|
||||
}
|
||||
});
|
||||
}
|
||||
window.addEventListener('hashchange', () => show(active()));
|
||||
window.addEventListener("hashchange", () => show(active()));
|
||||
|
||||
show(active()); // initial render from the current hash
|
||||
return { show, active };
|
||||
|
|
|
|||
Loading…
Reference in a new issue