feat(entry): narrower left column, and a State field

Name, Band, Mode and Country go from 300px to 210px, which moves QTH, Comment
and Note left by the same amount. The width is set in TWO places — the Name row
and the Band/Mode/Country stack below it — and they have to stay equal or the
two rows stop lining up, so both were changed together.

State goes between QTH and the locator: it is part of the same "where is this
station" reading, and it is what WAS and the US county work key off. Narrow,
since it holds two or three characters, and upper-cased on the way in like the
other coded fields.

The Name label in this layout was hardcoded English while its twin went through
t(); fixed while here.
This commit is contained in:
2026-08-13 10:56:52 +02:00
parent d0f06d9670
commit 741364bf99
3 changed files with 17 additions and 6 deletions
+4 -2
View File
@@ -5,12 +5,14 @@
"en": [
"Cluster: \"Hide worked\" no longer hides a spot that is a new prefix, county, grid or park in an entity already worked.",
"DX Cluster: a spot lifetime can be set — 5, 10, 15 minutes or your own value — after which spots leave the list and the band maps.",
"Call lookup: QRZ.com now fills Name with the first name only, and optionally with the operator nickname instead."
"Call lookup: QRZ.com now fills Name with the first name only, and optionally with the operator nickname instead.",
"Entry form: Name, Band, Mode and Country are narrower, and a State field sits between QTH and the locator."
],
"fr": [
"Cluster : « Masquer les contactés » ne masque plus un spot qui est un nouveau préfixe, comté, carré ou parc dans une contrée déjà faite.",
"Cluster DX : on peut fixer une durée de vie des spots — 5, 10, 15 minutes ou une valeur libre — au-delà de laquelle ils quittent la liste et les band maps.",
"Recherche d indicatif : QRZ.com remplit désormais Nom avec le seul prénom, et au choix avec le surnom de l opérateur."
"Recherche d indicatif : QRZ.com remplit désormais Nom avec le seul prénom, et au choix avec le surnom de l opérateur.",
"Saisie : Nom, Bande, Mode et Pays sont plus étroits, et un champ État s intercale entre QTH et le locator."
]
},
{
+11 -2
View File
@@ -4439,6 +4439,15 @@ export default function App() {
onBlur={() => setQth(titleCase)} />
</div>
);
// State sits between QTH and the locator: it is part of the same "where is
// this station" reading, and it is what several awards key off (WAS, the US
// county work). Narrow — it holds two or three characters.
const stateBlock = (
<div className="flex flex-col w-[70px] shrink-0"><Label className="mb-1 h-3.5">{t('field.state')}</Label>
<Input value={details.state ?? ''} className="font-mono"
onChange={(e) => setDetails((d) => ({ ...d, state: e.target.value.toUpperCase() }))} />
</div>
);
const gridBlock = (
<div className="flex flex-col w-[76px] shrink-0"><Label className="mb-1 h-3.5">{t('field.grid')}</Label>
<Input value={grid} placeholder="JN05" className="font-mono" onChange={(e) => { setGrid(e.target.value); markEdited('grid'); }} />
@@ -5886,7 +5895,7 @@ export default function App() {
to be pushed outside the entry panel and clipped. Wrapping drops
it to its own line instead, which stays readable. */}
<div className="flex gap-4 items-end flex-wrap">
<div className="flex flex-col w-[300px] shrink-0"><Label className="mb-1 h-3.5">Name</Label>
<div className="flex flex-col w-[210px] shrink-0"><Label className="mb-1 h-3.5">{t('field.name')}</Label>
<Input value={name} onChange={(e) => { setName(e.target.value); markEdited('name'); }}
onBlur={() => setName(titleCase)} />
</div>
@@ -5897,7 +5906,7 @@ export default function App() {
{/* Row 3: tight left detail column (Band/Mode/Country) and
single-line Comment/Note on the right. */}
<div className="flex gap-4 items-start">
<div className="flex flex-col gap-1.5 w-[300px] shrink-0">
<div className="flex flex-col gap-1.5 w-[210px] shrink-0">
{bandRow}
{modeRow}
{countryRow}
+2 -2
View File
@@ -54,7 +54,7 @@ const en: Dict = {
'tab.main': 'Main', 'main.splitTip': 'Drag to resize the panes — double-click to even them out', 'tab.recent': 'Recent QSOs', 'tab.cluster': 'Cluster', 'tab.worked': 'Worked before',
'tab.awards': 'Awards', 'tab.bandmap': 'Band Map', 'tab.contest': 'Contest', 'tab.net': 'Net',
// Entry form
'field.callsign': 'Callsign', 'field.name': 'Name', 'field.qth': 'QTH', 'field.grid': 'Grid',
'field.callsign': 'Callsign', 'field.name': 'Name', 'field.qth': 'QTH', 'field.state': 'State', 'field.grid': 'Grid',
'field.band': 'Band', 'field.mode': 'Mode', 'field.country': 'Country', 'field.comment': 'Comment',
'field.note': 'Note', 'field.rstTx': 'RST tx', 'field.rstRx': 'RST rx',
'field.txFreq': 'TX Freq (MHz)', 'field.freqTuneHint': 'Type a frequency and press Enter to tune the radio here.', 'field.freq': 'Freq (MHz)', 'field.rxFreq': 'RX Freq (MHz)', 'field.rxBand': 'RX Band',
@@ -482,7 +482,7 @@ const fr: Dict = {
'profileScope.saved': 'Enregistré pour le profil', 'profileScope.switch': "— change de profil pour éditer une autre identité.",
'tab.main': 'Principal', 'main.splitTip': 'Faites glisser pour redimensionner les volets — double-clic pour les égaliser', 'tab.recent': 'QSO récents', 'tab.cluster': 'Cluster', 'tab.worked': 'Déjà contacté',
'tab.awards': 'Diplômes', 'tab.bandmap': 'Carte de bande', 'tab.contest': 'Contest', 'tab.net': 'NET',
'field.callsign': 'Indicatif', 'field.name': 'Nom', 'field.qth': 'QTH', 'field.grid': 'Locator',
'field.callsign': 'Indicatif', 'field.name': 'Nom', 'field.qth': 'QTH', 'field.state': 'État', 'field.grid': 'Locator',
'field.band': 'Bande', 'field.mode': 'Mode', 'field.country': 'Pays', 'field.comment': 'Commentaire',
'field.note': 'Note', 'field.rstTx': 'RST tx', 'field.rstRx': 'RST rx',
'field.txFreq': 'Fréq TX (MHz)', 'field.freqTuneHint': 'Tape une fréquence et appuie sur Entrée pour y accorder la radio.', 'field.freq': 'Fréq (MHz)', 'field.rxFreq': 'Fréq RX (MHz)', 'field.rxBand': 'Bande RX',