chore: release v0.26.1
This commit is contained in:
@@ -16,9 +16,16 @@ export type RowColorSettings = {
|
||||
style?: 'bar' | 'tint' | 'both';
|
||||
intensity?: number;
|
||||
bandmap_lotw?: boolean;
|
||||
recent_zebra?: string; // '' = alternate (default), 'off' = every row alike
|
||||
recent_zebra_color?: string; // '' = follow the theme
|
||||
rules: RowColorRule[];
|
||||
};
|
||||
|
||||
// The banding the grid theme applies on its own. Repeated here because turning
|
||||
// the option OFF means painting every row explicitly — the theme would
|
||||
// otherwise keep striping underneath whatever we do per row.
|
||||
const ZEBRA_DEFAULT = 'color-mix(in srgb, var(--muted) 40%, var(--card))';
|
||||
|
||||
export const CHANNELS = ['qsl', 'lotw', 'eqsl', 'qrz'] as const;
|
||||
|
||||
// The two QSO fields behind each channel. QRZ.com and Club Log call theirs an
|
||||
@@ -76,21 +83,43 @@ export function matchRowRule(q: any, cfg: RowColorSettings | null): RowColorRule
|
||||
// A log where nearly every contact has SOME QSL state ends up with every row
|
||||
// painted, and colour that is always present stops being information. The
|
||||
// default is a stripe down the left edge; a tint is offered at a chosen strength.
|
||||
export function rowStyleFor(q: any, cfg: RowColorSettings | null): Record<string, string> | undefined {
|
||||
if (!cfg?.enabled) return undefined;
|
||||
// rowIndex is optional: only the Recent QSOs grid bands its rows, and the other
|
||||
// callers have nothing to say about odd and even.
|
||||
export function rowStyleFor(q: any, cfg: RowColorSettings | null, rowIndex?: number): Record<string, string> | undefined {
|
||||
const out: Record<string, string> = {};
|
||||
// Banding first, and INDEPENDENT of cfg.enabled: it is legibility, not QSL
|
||||
// status, and an operator who wants plain rows should not have to turn the
|
||||
// status colours off to get them.
|
||||
if (typeof rowIndex === 'number') {
|
||||
if (cfg?.recent_zebra === 'off') {
|
||||
out.backgroundColor = 'var(--card)';
|
||||
} else if (rowIndex % 2 === 1) {
|
||||
out.backgroundColor = cfg?.recent_zebra_color || ZEBRA_DEFAULT;
|
||||
}
|
||||
}
|
||||
const empty = () => (Object.keys(out).length ? out : undefined);
|
||||
if (!cfg?.enabled) return empty();
|
||||
const rule = matchRowRule(q, cfg);
|
||||
if (!rule?.color) return undefined;
|
||||
if (!rule?.color) return empty();
|
||||
|
||||
const style = cfg.style ?? 'bar';
|
||||
const pct = Math.max(5, Math.min(45, cfg.intensity ?? 12));
|
||||
const out: Record<string, string> = {};
|
||||
if (style === 'tint' || style === 'both') {
|
||||
// Overrides the banding on purpose: the QSL colour is information, the
|
||||
// banding is only there to help the eye keep its line.
|
||||
out.backgroundColor = `color-mix(in srgb, ${rule.color} ${pct}%, transparent)`;
|
||||
}
|
||||
if (style === 'bar' || style === 'both') {
|
||||
// inset shadow rather than a border: a border would shift the cells three
|
||||
// pixels on coloured rows only, and the columns would stop lining up.
|
||||
out.boxShadow = `inset 3px 0 0 ${rule.color}`;
|
||||
// A background gradient, not a border and not a shadow.
|
||||
//
|
||||
// A border would shift the cells three pixels on coloured rows only, and
|
||||
// the columns would stop lining up. An inset box-shadow was the first fix
|
||||
// for that and drew the stripe correctly — but on the grid's transformed,
|
||||
// absolutely-positioned rows it also bled a hairline of the same colour
|
||||
// along the row edges, so every coloured row got a horizontal rule it was
|
||||
// never meant to have. A gradient paints inside the box and nothing else:
|
||||
// three pixels of colour, then transparent, and no edge to bleed from.
|
||||
out.backgroundImage = `linear-gradient(to right, ${rule.color} 0, ${rule.color} 3px, transparent 3px)`;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user