diff --git a/changelog.json b/changelog.json index 2f96fb0..12b282b 100644 --- a/changelog.json +++ b/changelog.json @@ -8,7 +8,7 @@ "Two or three FT8 programs at once no longer fight over the callsign field. Click a station in MSHV and only MSHV has a DX Call; WSJT-X and JTDX beside it are idle and say so once a second each — and OpsLog was reading those as MSHV abandoning the station, so the entry emptied and refilled at 1 Hz and the map zoomed in and out with it. A cleared DX Call is now read per program, never across the listener; and the program that announces a station keeps the entry field until it clears its own call, is closed, or the QSO is logged.", "The FT decodes table sorts on SNR, frequency, distance, country and status — click the heading. Within each slot and never across them: the periods are what the panel is, and a list sorted end to end would mix three minutes of decodes into one column with no way to tell which window any of them came from. One click sorts the way that column is worth reading (strongest signal, furthest DX, lowest frequency, A to Z, most wanted first), the second reverses it, the third gives back the order the decoder heard them in. Stations with no grid, or no country resolved yet, sort to the end either way rather than pretending to a distance of zero.", "The cluster editor offers a list of known nodes. Setting up a telnet cluster is the step operators get stuck on: the address and the port are two pieces of information nobody has to hand, and a typo in either looks exactly like a node that is down. Pick one and the fields fill in — F4BPO, DXFun, F5LEN, F5MZN, KM3T, SOTA, POTA, and the two Reverse Beacon feeds, which are one network on two ports where 7000 carries CW and RTTY and 7001 carries FT8 and FT4. Everything stays editable, and a node typed in by hand works exactly the same. More will be added.", - "Preferences no longer lag behind the keyboard. Typing a cluster macro re-rendered the whole dialog on every keystroke and wrote a row into the database per character; the twenty-four boxes now stand on their own and the database write waits for the typing to stop.", + "Preferences no longer lag behind the keyboard. Two causes. Typing a cluster macro re-rendered the whole dialog on every keystroke and wrote a row into the database per character — the twenty-four boxes now stand on their own and the database write waits for the typing to stop. And every dialog sat on a blurred backdrop: a filter over the whole window, recomputed under every repaint, with an application behind it that never stops moving — CAT polling, spots arriving, meters sweeping. The dialogs you type in for minutes at a time now dim the background instead of blurring it.", "Station Control shows what commands the station, not only what it switches. The radio is there now — frequency, mode, band, and the split pair when there is one — with the CW keyer beside it (speed up and down, and Stop, because a message going to the wrong callsign has to end now) and the voice keyer with its recorded messages as buttons, so a CQ goes out without leaving the tab. The two keyers appear only when there is something behind them: a port configured, or a message actually recorded. All three move and reorder with the other cards." ], "fr": [ @@ -17,7 +17,7 @@ "Deux ou trois logiciels FT8 en même temps ne se disputent plus le champ indicatif. Cliquez une station dans MSHV et lui seul a un DX Call ; WSJT-X et JTDX à côté sont au repos et le disent une fois par seconde chacun — et OpsLog y lisait MSHV abandonnant la station : le champ se vidait et se remplissait à 1 Hz, la carte zoomant au même rythme. Un DX Call effacé est désormais lu par programme, jamais à l'échelle du port ; et le logiciel qui annonce une station garde le champ jusqu'à ce qu'il efface son propre indicatif, soit fermé, ou que le QSO soit enregistré.", "Le tableau des décodages FT se trie sur SNR, fréquence, distance, pays et statut — cliquez l'en-tête. À l'intérieur de chaque créneau et jamais au travers : les périodes sont la raison d'être du panneau, et un tri de bout en bout mélangerait trois minutes de décodages en une colonne sans plus savoir de quelle fenêtre chacun vient. Un clic trie dans le sens où la colonne se lit (signal le plus fort, DX le plus lointain, fréquence la plus basse, de A à Z, le plus recherché d'abord), un second inverse, un troisième rend l'ordre dans lequel le décodeur les a entendus. Les stations sans locator, ou dont le pays n'est pas encore résolu, se rangent à la fin dans les deux sens plutôt que de se faire passer pour une distance nulle.", "L'éditeur de cluster propose une liste de nœuds connus. La configuration d'un cluster telnet est l'étape où l'on se bloque : l'adresse et le port sont deux informations que personne n'a sous la main, et une faute de frappe dans l'une ou l'autre ressemble exactement à un nœud en panne. On en choisit un et les champs se remplissent — F4BPO, DXFun, F5LEN, F5MZN, KM3T, SOTA, POTA, et les deux flux Reverse Beacon, qui sont un même réseau sur deux ports où 7000 porte la CW et le RTTY et 7001 le FT8 et le FT4. Tout reste modifiable, et un nœud saisi à la main fonctionne exactement pareil. D'autres seront ajoutés.", - "Les Préférences ne traînent plus derrière le clavier. Saisir une macro de cluster redessinait tout le dialogue à chaque frappe et écrivait une ligne en base par caractère ; les vingt-quatre champs sont désormais indépendants et l'écriture en base attend la fin de la saisie.", + "Les Préférences ne traînent plus derrière le clavier. Deux causes. Saisir une macro de cluster redessinait tout le dialogue à chaque frappe et écrivait une ligne en base par caractère — les vingt-quatre champs sont désormais indépendants et l'écriture en base attend la fin de la saisie. Et chaque dialogue reposait sur un fond flouté : un filtre sur toute la fenêtre, recalculé sous chaque repaint, avec derrière lui une application qui ne s'arrête jamais de bouger — le CAT qui interroge, les spots qui arrivent, les vumètres qui balaient. Les dialogues dans lesquels on tape plusieurs minutes assombrissent désormais le fond au lieu de le flouter.", "Contrôle station montre ce qui commande la station, et plus seulement ce qui la commute. La radio y figure désormais — fréquence, mode, bande, et le couple split quand il y en a un — avec à côté le manipulateur CW (vitesse en plus ou en moins, et Stop, parce qu'un message parti vers le mauvais indicatif doit s'arrêter tout de suite) et le manipulateur vocal avec ses messages enregistrés en boutons, pour lancer un CQ sans quitter l'onglet. Les deux manipulateurs n'apparaissent que s'il y a quelque chose derrière : un port configuré, ou un message réellement enregistré. Les trois se déplacent et se réordonnent avec les autres cartes." ] }, diff --git a/frontend/src/components/AlertsModal.tsx b/frontend/src/components/AlertsModal.tsx index 7d17d81..f964b4c 100644 --- a/frontend/src/components/AlertsModal.tsx +++ b/frontend/src/components/AlertsModal.tsx @@ -141,7 +141,7 @@ export function AlertsModal({ onClose, bands, modes, countries }: { return ( { if (!o) onClose(); }}> - + {t('altm.title')} {t('altm.desc')} diff --git a/frontend/src/components/AwardEditor.tsx b/frontend/src/components/AwardEditor.tsx index 1a57869..17c8c78 100644 --- a/frontend/src/components/AwardEditor.tsx +++ b/frontend/src/components/AwardEditor.tsx @@ -403,7 +403,7 @@ export function AwardEditor({ open, onClose, onSaved }: Props) { return ( { if (!o) onClose(); }}> - + {t('awed.awardManagement')} diff --git a/frontend/src/components/BulkEditModal.tsx b/frontend/src/components/BulkEditModal.tsx index cf0a08f..0bd9b84 100644 --- a/frontend/src/components/BulkEditModal.tsx +++ b/frontend/src/components/BulkEditModal.tsx @@ -193,7 +193,7 @@ export function BulkEditModal({ open, ids, onClose, onApplied }: Props) { return ( { if (!o) onClose(); }}> - + {t('bulk.title')} diff --git a/frontend/src/components/QSOEditModal.tsx b/frontend/src/components/QSOEditModal.tsx index 1d44724..b0cd2dc 100644 --- a/frontend/src/components/QSOEditModal.tsx +++ b/frontend/src/components/QSOEditModal.tsx @@ -542,7 +542,7 @@ export function QSOEditModal({ qso, onSave, onDelete, onClose, countries = [], b return ( { if (!o) onClose(); }}> - + {t('qedit.title')} #{draft.id} — {draft.callsign} diff --git a/frontend/src/components/SettingsModal.tsx b/frontend/src/components/SettingsModal.tsx index ac15092..bef2556 100644 --- a/frontend/src/components/SettingsModal.tsx +++ b/frontend/src/components/SettingsModal.tsx @@ -8858,7 +8858,11 @@ function SettingsModalImpl({ onClose, onSaved, initialSection, onMainPaneChanged return ( { if (!o) onClose(); }}> - + {/* No backdrop blur. This dialog is open for minutes with the operator + typing in it, and the application behind it never stops repainting — + a full-window backdrop filter is then recomputed under every one of + those repaints, which is what the delay between key and letter was. */} + {t('settings.title')} Configure OpsLog modules — station, lookup, hardware… @@ -8971,7 +8975,10 @@ function ClusterServerEditor({ value, onCancel, onSave }: ClusterEditorProps) { (p) => p.host.toLowerCase() === (s.host ?? '').trim().toLowerCase() && p.port === s.port); return ( { if (!o) onCancel(); }}> - + {/* Opened from Preferences, so its overlay would be the SECOND + full-window backdrop filter stacked over a moving page — which is + where the typing delay was first noticed. */} + {s.id ? `Edit cluster · ${s.name || 'unnamed'}` : 'New cluster'} diff --git a/frontend/src/components/ui/dialog.tsx b/frontend/src/components/ui/dialog.tsx index 3aa61e1..28934e3 100644 --- a/frontend/src/components/ui/dialog.tsx +++ b/frontend/src/components/ui/dialog.tsx @@ -8,14 +8,23 @@ const DialogTrigger = DialogPrimitive.Trigger; const DialogPortal = DialogPrimitive.Portal; const DialogClose = DialogPrimitive.Close; +// blur=false drops the backdrop filter and dims harder instead. +// +// A backdrop-filter over the whole window is recomputed every time anything +// above it repaints — and underneath this one sits an application that never +// stops moving: CAT polls four times a second, spots arrive, meters sweep, maps +// redraw. On a long-lived dialog with text fields in it, that shows as a delay +// between the key and the letter. Ornament is not worth a keyboard that feels +// slow, so the dialogs an operator TYPES in for minutes at a time turn it off. const DialogOverlay = React.forwardRef< React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( + React.ComponentPropsWithoutRef & { blur?: boolean } +>(({ className, blur = true, ...props }, ref) => ( , - React.ComponentPropsWithoutRef & { hideClose?: boolean; hideOverlay?: boolean } ->(({ className, children, hideClose, hideOverlay, ...props }, ref) => ( + React.ComponentPropsWithoutRef & { hideClose?: boolean; hideOverlay?: boolean; overlayBlur?: boolean } +>(({ className, children, hideClose, hideOverlay, overlayBlur, ...props }, ref) => ( - {!hideOverlay && } + {!hideOverlay && }