Localize navigation and production UI
This commit is contained in:
@@ -22,15 +22,15 @@ export function Cities() {
|
||||
|
||||
return (
|
||||
<div class="aggregator pageWorkspace">
|
||||
<div class="pageHeading"><div><span class="eyebrow">Historical observations</span><h1>City analysis</h1><p>Choose stations and a calculation, then compare the resulting values.</p></div><div class="selectionCount">{getCities().size} cities selected</div></div>
|
||||
<div class="pageHeading"><div><span class="eyebrow">VĒSTURISKIE NOVĒROJUMI</span><h1>Kartes</h1><p>Izvēlies stacijas un aprēķinu, pēc tam salīdzini rezultātus vai sagatavo karti.</p></div><div class="selectionCount">{getCities().size === 1 ? "1 pilsēta izvēlēta" : `${getCities().size} pilsētas izvēlētas`}</div></div>
|
||||
<div class="cityWorkspace">
|
||||
<aside class="cityPanel workspaceRail">
|
||||
<h2>1. Choose cities</h2>
|
||||
<h2>1. Izvēlies pilsētas</h2>
|
||||
<SelectCity getCities={getCities} setCities={setCities} />
|
||||
</aside>
|
||||
<section class="analysisMain">
|
||||
<aside class="queryPanel workspaceToolbar">
|
||||
<h2>2. Configure query</h2>
|
||||
<h2>2. Iestati atlasi</h2>
|
||||
<div class="queryTimeRange">
|
||||
<SelectTimeRange
|
||||
getStart={getStart}
|
||||
@@ -41,7 +41,7 @@ export function Cities() {
|
||||
</div>
|
||||
<div class="queryOptions">
|
||||
<div class="queryField">
|
||||
<h4>Select field</h4>
|
||||
<h4>Datu lauks</h4>
|
||||
<SelectField getField={getField} setField={setField} />
|
||||
</div>
|
||||
<SelectKey getKey={getKey} setKey={setKey} />
|
||||
|
||||
@@ -3,13 +3,13 @@ import { Archive, BarChart3, CloudSun, Database, Map, RadioTower, Waves, Wind }
|
||||
import './home.css'
|
||||
|
||||
const tools = [
|
||||
{path:'/station', title:'Stations', description:'Recent measurements and station charts.', icon:RadioTower},
|
||||
{path:'/cities', title:'City analysis', description:'Compare values and prepare temperature maps.', icon:BarChart3},
|
||||
{path:'/faktiska', title:'Faktiskā', description:'Temperatures and weather symbols for daily production.', icon:CloudSun},
|
||||
{path:'/udens-temperatura', title:'Ūdens temperatūra', description:'Manuāli ūdens temperatūras diapazoni ētera kartei.', icon:Waves},
|
||||
{path:'/latvia', title:'Latvia overview', description:'Country-wide weather summaries.', icon:Map},
|
||||
{path:'/database', title:'Data archive', description:'Browse dates and stored observations.', icon:Archive},
|
||||
{path:'/harmonie', title:'HARMONIE', description:'Render locally stored forecast fields.', icon:Wind},
|
||||
{path:'/lvgmc-forecast', title:'LVĢMC forecast', description:'Prepared city forecasts and broadcast tables.', icon:Database},
|
||||
{path:'/station', title:'Stacijas', description:'Jaunākie novērojumi un staciju grafiki.', icon:RadioTower},
|
||||
{path:'/cities', title:'Kartes', description:'Vērtību salīdzināšana un temperatūras kartes.', icon:BarChart3},
|
||||
{path:'/faktiska', title:'Faktiskā', description:'Temperatūras, laikapstākļu simboli un vējš.', icon:CloudSun},
|
||||
{path:'/udens-temperatura', title:'Ūdens', description:'Ūdens temperatūru diapazoni ētera kartei.', icon:Waves},
|
||||
{path:'/latvia', title:'Apskats', description:'Latvijas laikapstākļu kopsavilkums.', icon:Map},
|
||||
{path:'/database', title:'Arhīvs', description:'Datumi un saglabātie novērojumi.', icon:Archive},
|
||||
{path:'/harmonie', title:'Harmonie', description:'Lokāli saglabāto prognožu lauku kartes.', icon:Wind},
|
||||
{path:'/lvgmc-forecast', title:'LVĢMC', description:'Pilsētu prognozes un ētera tabulas.', icon:Database},
|
||||
]
|
||||
export function Home() { return <section class="homePage"><div class="homeHero"><div><p class="eyebrow">Weather data and production tools</p><h1>Choose a workspace</h1><p class="heroCopy">Analysis, forecasts and newsroom graphics.</p></div><div class="environmentBadge"><span class="statusDot"/>Development dataset<small>Synthetic observations</small></div></div><div class="toolGrid">{tools.map(tool => <A class="toolCard" href={tool.path}><span class="toolIcon"><tool.icon size={64} strokeWidth={1.65}/></span><div class="toolCardCopy"><h2>{tool.title}</h2><p>{tool.description}</p></div><span class="cardArrow">→</span></A>)}</div></section> }
|
||||
export function Home() { return <section class="homePage"><div class="homeHero"><div><h1>Izvēlies sadaļu</h1><p class="heroCopy">Dati, prognozes un ētera grafikas.</p></div><div class="environmentBadge"><span class="statusDot"/>Testa dati<small>Sintētiskie novērojumi</small></div></div><div class="toolGrid">{tools.map(tool => <A class="toolCard" href={tool.path}><span class="toolIcon"><tool.icon size={64} strokeWidth={1.65}/></span><div class="toolCardCopy"><h2>{tool.title}</h2><p>{tool.description}</p></div><span class="cardArrow">→</span></A>)}</div></section> }
|
||||
|
||||
@@ -67,32 +67,32 @@ export function Faktiska() {
|
||||
|
||||
return <div class="mapGraphicsPage pageWorkspace faktiskaWorkspace">
|
||||
<div class="pageHeading">
|
||||
<div><span class="eyebrow">Daily newsroom production</span><h1>Faktiskā</h1><p>Current temperatures with manually prepared weather symbols and wind.</p></div>
|
||||
<div><span class="eyebrow">ĒTERA GRAFIKA</span><h1>Faktiskā</h1><p>Faktiskā temperatūra, laikapstākļu simboli un vējš.</p></div>
|
||||
<div class="productionSize">{productionSize().width} × {productionSize().height} PNG</div>
|
||||
</div>
|
||||
|
||||
<section class="faktiskaDataBand">
|
||||
<div class="faktiskaStatus">
|
||||
<div><span class="stepLabel">1. Latest temperatures</span><strong>{newestTimestamp() ? newestTimestamp()!.toLocaleString("lv-LV") : "Waiting for observations"}</strong><small>Newest available reading in the configured station set</small></div>
|
||||
<button class="secondary" disabled={latest.loading} onClick={() => refetch()}>Refresh data</button>
|
||||
<div><span class="stepLabel">1. Jaunākās temperatūras</span><strong>{newestTimestamp() ? newestTimestamp()!.toLocaleString("lv-LV") : "Gaida novērojumus"}</strong><small>Jaunākie pieejamie staciju novērojumi</small></div>
|
||||
<button class="secondary" disabled={latest.loading} onClick={() => refetch()}>Atjaunot datus</button>
|
||||
</div>
|
||||
<Show when={latest.loading}><LoadingSpinner text="Loading latest temperatures"/></Show>
|
||||
<Show when={latest.error}><div class="inlineNotice error"><strong>Could not load observations.</strong> Existing manual fields remain available.</div></Show>
|
||||
<Show when={latest.loading}><LoadingSpinner text="Ielādē jaunākās temperatūras"/></Show>
|
||||
<Show when={latest.error}><div class="inlineNotice error"><strong>Novērojumus neizdevās ielādēt.</strong> Manuālie lauki joprojām ir pieejami.</div></Show>
|
||||
<div class="temperatureEditor">
|
||||
<For each={faktiskaStations}>{city => {
|
||||
const observation = () => observationsByCity().get(city);
|
||||
return <label class="temperatureField" classList={{manual: overrides().has(city), stale: isStale(city), missing: observation()?.value == null}}>
|
||||
<span class="temperatureFieldHeading"><strong>{city}</strong><small>{overrides().has(city) ? "Manual" : isStale(city) ? "Older reading" : observation()?.observedAt ? new Date(observation()!.observedAt).toLocaleTimeString("lv-LV", {hour:"2-digit", minute:"2-digit"}) : "No data"}</small></span>
|
||||
<span class="temperatureInput"><input type="text" inputmode="decimal" value={values()[city]} onInput={event => updateValue(city, event.currentTarget.value)} aria-label={`${city} temperature`}/><span>°C</span></span>
|
||||
<button type="button" class="resetTemperature" disabled={!overrides().has(city)} onClick={() => resetValue(city)}>Reset</button>
|
||||
<span class="temperatureFieldHeading"><strong>{city}</strong><small>{overrides().has(city) ? "Manuāli" : isStale(city) ? "Vecāks novērojums" : observation()?.observedAt ? new Date(observation()!.observedAt).toLocaleTimeString("lv-LV", {hour:"2-digit", minute:"2-digit"}) : "Nav datu"}</small></span>
|
||||
<span class="temperatureInput"><input type="text" inputmode="decimal" value={values()[city]} onInput={event => updateValue(city, event.currentTarget.value)} aria-label={`${city} temperatūra`}/><span>°C</span></span>
|
||||
<button type="button" class="resetTemperature" disabled={!overrides().has(city)} onClick={() => resetValue(city)}>Atiestatīt</button>
|
||||
</label>;
|
||||
}}</For>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="mapProduction faktiskaProduction">
|
||||
<h2>2. Add weather symbols and wind, then export</h2>
|
||||
<div class="resolutionChoices faktiskaResolutionChoices" aria-label="Faktiskā export size">
|
||||
<h2>2. Pievieno laikapstākļu simbolus un vēju, tad eksportē</h2>
|
||||
<div class="resolutionChoices faktiskaResolutionChoices" aria-label="Faktiskā eksporta izmērs">
|
||||
<button classList={{ active: template() === "faktiska_1920x1080" }} onClick={() => setTemplate("faktiska_1920x1080")}>1920 × 1080</button>
|
||||
<button classList={{ active: template() === "faktiska_3840x1440" }} onClick={() => setTemplate("faktiska_3840x1440")}>3840 × 1440</button>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user