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
|
|
@ -35,8 +35,15 @@
|
|||
letter-spacing: 0.08em;
|
||||
color: var(--subtext0);
|
||||
}
|
||||
.message { color: var(--fg); line-height: 1.45; }
|
||||
.checks { display: flex; flex-direction: column; gap: 0.4em; }
|
||||
.message {
|
||||
color: var(--fg);
|
||||
line-height: 1.45;
|
||||
}
|
||||
.checks {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.4em;
|
||||
}
|
||||
.checkrow {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
|
|
@ -46,15 +53,25 @@
|
|||
font-size: 0.92em;
|
||||
line-height: 1.35;
|
||||
}
|
||||
.checkrow .check { margin-top: 0.2em; flex: 0 0 auto; }
|
||||
.checkrow .check {
|
||||
margin-top: 0.2em;
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
.actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 0.6em;
|
||||
margin-top: 0.2em;
|
||||
}
|
||||
.promptfield { display: flex; flex-direction: column; gap: 0.4em; }
|
||||
.promptlabel { color: var(--subtext0); font-size: 0.9em; }
|
||||
.promptfield {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.4em;
|
||||
}
|
||||
.promptlabel {
|
||||
color: var(--subtext0);
|
||||
font-size: 0.9em;
|
||||
}
|
||||
.input {
|
||||
font-family: inherit;
|
||||
font-size: 1em;
|
||||
|
|
@ -65,7 +82,9 @@
|
|||
border: 1px solid var(--purple-dim);
|
||||
padding: 0.4em 0.6em;
|
||||
}
|
||||
.input:focus { outline: 1px solid var(--green); }
|
||||
.input:focus {
|
||||
outline: 1px solid var(--green);
|
||||
}
|
||||
.textarea {
|
||||
resize: vertical;
|
||||
min-height: 4.5em;
|
||||
|
|
|
|||
|
|
@ -14,17 +14,20 @@
|
|||
// Imports `../hive-btn/hive-btn.js` for its side effect (registers
|
||||
// `<hive-btn>`) since the dialog's own buttons are `<hive-btn>` elements.
|
||||
|
||||
import { el } from '../dom.js';
|
||||
import { attachShadowCss } from '../shadow-css.js';
|
||||
import '../hive-btn/hive-btn.js'; // registers <hive-btn> — side-effect import, no named export needed
|
||||
import dialogCss from './hive-dialog.css';
|
||||
import { el } from "../dom.js";
|
||||
import { attachShadowCss } from "../shadow-css.js";
|
||||
import "../hive-btn/hive-btn.js"; // registers <hive-btn> — side-effect import, no named export needed
|
||||
import dialogCss from "./hive-dialog.css";
|
||||
|
||||
class HiveDialog extends HTMLElement {
|
||||
connectedCallback() {
|
||||
const {
|
||||
title = '', message = '', content = null,
|
||||
buttons = [{ label: 'ok', value: true }],
|
||||
danger = false, dismissable = true,
|
||||
title = "",
|
||||
message = "",
|
||||
content = null,
|
||||
buttons = [{ label: "ok", value: true }],
|
||||
danger = false,
|
||||
dismissable = true,
|
||||
} = this._opts || {};
|
||||
|
||||
const root = attachShadowCss(this, dialogCss);
|
||||
|
|
@ -33,12 +36,14 @@ class HiveDialog extends HTMLElement {
|
|||
const done = (value) => {
|
||||
if (settled) return;
|
||||
settled = true;
|
||||
document.removeEventListener('keydown', onKey, true);
|
||||
this.dispatchEvent(new CustomEvent('hive-dialog-close', { detail: value }));
|
||||
document.removeEventListener("keydown", onKey, true);
|
||||
this.dispatchEvent(
|
||||
new CustomEvent("hive-dialog-close", { detail: value }),
|
||||
);
|
||||
this.remove();
|
||||
};
|
||||
const onKey = (e) => {
|
||||
if (dismissable && e.key === 'Escape') {
|
||||
if (dismissable && e.key === "Escape") {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
done(null);
|
||||
|
|
@ -50,12 +55,16 @@ class HiveDialog extends HTMLElement {
|
|||
// `b.class` names the variant ('cancel' | 'confirm'); `b.danger`
|
||||
// overrides it to the 'danger' look regardless (a destructive
|
||||
// confirm button reads as danger, not as a plain confirm).
|
||||
const variant = b.danger ? 'danger' : b.class;
|
||||
const btn = el('hive-btn', {
|
||||
type: 'button',
|
||||
...(variant ? { variant } : {}),
|
||||
}, b.label);
|
||||
btn.addEventListener('click', () => done(b.value));
|
||||
const variant = b.danger ? "danger" : b.class;
|
||||
const btn = el(
|
||||
"hive-btn",
|
||||
{
|
||||
type: "button",
|
||||
...(variant ? { variant } : {}),
|
||||
},
|
||||
b.label,
|
||||
);
|
||||
btn.addEventListener("click", () => done(b.value));
|
||||
return { spec: b, btn };
|
||||
});
|
||||
|
||||
|
|
@ -65,21 +74,30 @@ class HiveDialog extends HTMLElement {
|
|||
// this shadow root, so no cross-instance collision risk even without
|
||||
// the random suffix — kept anyway since it costs nothing and guards
|
||||
// against a future shared-DOM edge case (e.g. `::part()` piercing).
|
||||
const labelId = 'dlg-' + Math.random().toString(36).slice(2, 9);
|
||||
const titleEl = title ? el('div', { class: 'title', id: labelId }, title) : null;
|
||||
const messageEl = message
|
||||
? el('div', title ? { class: 'message' } : { class: 'message', id: labelId }, message)
|
||||
const labelId = "dlg-" + Math.random().toString(36).slice(2, 9);
|
||||
const titleEl = title
|
||||
? el("div", { class: "title", id: labelId }, title)
|
||||
: null;
|
||||
const boxAttrs = { class: 'box', role: 'dialog', 'aria-modal': 'true' };
|
||||
if (titleEl || messageEl) boxAttrs['aria-labelledby'] = labelId;
|
||||
const box = el('div', boxAttrs,
|
||||
const messageEl = message
|
||||
? el(
|
||||
"div",
|
||||
title ? { class: "message" } : { class: "message", id: labelId },
|
||||
message,
|
||||
)
|
||||
: null;
|
||||
const boxAttrs = { class: "box", role: "dialog", "aria-modal": "true" };
|
||||
if (titleEl || messageEl) boxAttrs["aria-labelledby"] = labelId;
|
||||
const box = el(
|
||||
"div",
|
||||
boxAttrs,
|
||||
titleEl,
|
||||
messageEl,
|
||||
content || null,
|
||||
el('div', { class: 'actions' }, ...btnEls.map((b) => b.btn)));
|
||||
el("div", { class: "actions" }, ...btnEls.map((b) => b.btn)),
|
||||
);
|
||||
root.append(box);
|
||||
|
||||
this.addEventListener('click', (e) => {
|
||||
this.addEventListener("click", (e) => {
|
||||
// `e.target` is retargeted to `this` (the host) for ANY click that
|
||||
// originated inside the shadow tree, once it bubbles out to a
|
||||
// listener attached on the host itself — per spec, retargeting
|
||||
|
|
@ -94,12 +112,13 @@ class HiveDialog extends HTMLElement {
|
|||
// tree was actually under the cursor, i.e. a real backdrop click.
|
||||
if (dismissable && e.composedPath()[0] === this) done(null);
|
||||
});
|
||||
document.addEventListener('keydown', onKey, true);
|
||||
document.addEventListener("keydown", onKey, true);
|
||||
|
||||
const focusTarget = btnEls.find((b) => b.spec.autofocus)
|
||||
|| (danger ? btnEls.find((b) => !b.spec.danger) : null)
|
||||
|| btnEls[btnEls.length - 1];
|
||||
const focusTarget =
|
||||
btnEls.find((b) => b.spec.autofocus) ||
|
||||
(danger ? btnEls.find((b) => !b.spec.danger) : null) ||
|
||||
btnEls[btnEls.length - 1];
|
||||
if (focusTarget) focusTarget.btn.focus();
|
||||
}
|
||||
}
|
||||
customElements.define('hive-dialog', HiveDialog);
|
||||
customElements.define("hive-dialog", HiveDialog);
|
||||
|
|
|
|||
Loading…
Reference in a new issue