chore: release v0.26.1

This commit is contained in:
2026-08-21 01:43:14 +02:00
parent e3b7a35e2c
commit e6889caae9
17 changed files with 472 additions and 95 deletions
@@ -10,6 +10,7 @@ import {
} from '@/components/ui/select';
import { Separator } from '@/components/ui/separator';
import { cn } from '@/lib/utils';
import { QSO_BOX_FIELDS, QSO_FIELD_LABELS } from './qslTypes';
import type { CardTemplate, CardElement, QSOBox, QSLPresetInfo, StyleParams } from './qslTypes';
import type { CardSelection } from './CardPreview';
import { StylePresetPicker, NumberField } from './StylePresetPicker';
@@ -199,6 +200,26 @@ export function EditorPanel({ template, sel, presets, fontFamilies, onPatchEleme
<Input className="h-7 w-44 font-mono text-xs" value={box.title ?? ''}
onChange={(ev) => onPatchBox({ title: ev.target.value })} />
</div>
<div className="space-y-1">
<Label className="text-xs text-muted-foreground">Columns</Label>
{/* Rebuilt from the canonical order every time rather than
appended to: a box whose columns come out in the order they
were ticked reads as a bug, and the widths are tuned for this
order. */}
<div className="grid grid-cols-2 gap-x-2">
{QSO_BOX_FIELDS.map((f) => (
<label key={f} className="flex items-center gap-1.5 text-xs">
<Checkbox
checked={box.fields.includes(f)}
onCheckedChange={(v) => onPatchBox({
fields: QSO_BOX_FIELDS.filter((k) => (k === f ? v === true : box.fields.includes(k))),
})}
/>
{QSO_FIELD_LABELS[f] ?? f}
</label>
))}
</div>
</div>
<div className="flex items-center justify-between gap-2">
<Label className="text-xs text-muted-foreground">Footer</Label>
<Input className="h-7 w-44 font-mono text-xs" value={box.footer}