chore: release v0.26.0

This commit is contained in:
2026-08-20 17:53:55 +02:00
parent 47992b5f03
commit 1e507225dd
44 changed files with 3197 additions and 240 deletions
+24 -3
View File
@@ -86,6 +86,13 @@ export function ExportFieldsDialog({ open, count, onExport, onClose }: {
return [...m.entries()];
}, [official]);
// Every tag the dialog can offer — the extras AND every group — so "select
// all" means what it says rather than "all the official ones".
const everyTag = useMemo(
() => [...extras, ...groups.flatMap(([, list]) => list.map((d) => d.name))],
[extras, groups],
);
const toggle = (name: string, on: boolean) =>
setSel((s) => { const n = new Set(s); if (on) n.add(name); else n.delete(name); return n; });
const setMany = (names: string[], on: boolean) =>
@@ -114,11 +121,25 @@ export function ExportFieldsDialog({ open, count, onExport, onClose }: {
<DialogDescription>{t('exf.desc')}</DialogDescription>
</DialogHeader>
{/* Whole-dialog select/clear, next to the count they change. Per-group
links alone meant clearing the selection was one click PER GROUP —
a dozen of them to get to "just the handful I want". */}
<div className="flex items-center gap-2 px-1 text-[11px] text-muted-foreground">
<span>{t('exf.chosen', { n: sel.size })}</span>
<Button variant="ghost" size="sm" className="ml-auto h-6 text-[11px]" onClick={() => setSel(defaultSet(official))}>
{t('exf.defaults')}
</Button>
<span className="ml-auto inline-flex items-center gap-1">
<Button variant="ghost" size="sm" className="h-6 text-[11px]"
onClick={() => setSel(new Set(everyTag))}>
{t('exf.selectAll')}
</Button>
<Button variant="ghost" size="sm" className="h-6 text-[11px]"
disabled={sel.size === 0}
onClick={() => setSel(new Set())}>
{t('exf.selectNone')}
</Button>
<Button variant="ghost" size="sm" className="h-6 text-[11px]" onClick={() => setSel(defaultSet(official))}>
{t('exf.defaults')}
</Button>
</span>
</div>
<div className="grid grid-cols-3 gap-3 max-h-[56vh] overflow-y-auto pr-1">