Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/changelog.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
[
{
"date": "2026-10-13",
"area": "Kiosk",
"title": "New kiosk wallpapers: eight landscapes in place of the old schematics",
"summary": "Kiosk mode's wallpapers are now drawn scenes: mountains at dusk (the new default), a moonlit forest, dawn at sea, a kelp forest with a whale, desert dusk, the northern lights, the Lascaux frieze on a torchlit cave wall, and plain graphite. They keep the horizon in view on any screen shape, the picker shows each wallpaper itself as its thumbnail, and desktop icon labels stay white and readable on every wallpaper and theme. A wallpaper you'd picked from the old set switches to the new default."
},
{
"date": "2026-10-13",
"area": "Agents",
Expand Down
377 changes: 377 additions & 0 deletions ui/scripts/wallpapers.py

Large diffs are not rendered by default.

23 changes: 22 additions & 1 deletion ui/src/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -4094,5 +4094,26 @@
"Asset Scout": "Éclaireur de ressources",
"Worlds & Cartography": "Mondes et cartographie",
"Marine Biology": "Biologie marine",
"Studio Architect": "Architecte du Studio"
"Studio Architect": "Architecte du Studio",
"Kiosk Desktop Wallpaper": "Fond d'écran du bureau kiosque",
"Choose a scene, or use an image of your own": "Choisissez une scène, ou une image à vous",
"Scenes": "Scènes",
"Custom Image URL": "URL d'image personnalisée",
"Wallpaper Overlay Dimming": "Assombrissement du fond d'écran",
"Darkens the wallpaper background to maximize contrast for desktop shortcuts and open windows.": "Assombrit le fond d'écran pour mieux faire ressortir les raccourcis du bureau et les fenêtres ouvertes.",
"Mountain ridges fading into a rose and violet dusk.": "Des crêtes de montagnes qui se fondent dans un crépuscule rose et violet.",
"Moonlit Forest": "Forêt au clair de lune",
"A clear night over pine hills, mist lying in the valleys.": "Une nuit claire sur des collines de pins, la brume couchée dans les vallées.",
"Dawn at Sea": "Aube en mer",
"The sun rising over a calm sea, a path of light on the water.": "Le soleil se lève sur une mer calme, un chemin de lumière sur l'eau.",
"Kelp Forest": "Forêt de varech",
"Sunbeams through blue water, kelp swaying and a whale passing far off.": "Des rayons de soleil dans l'eau bleue, le varech qui ondule et une baleine qui passe au loin.",
"Desert Dusk": "Crépuscule dans le désert",
"Sand dunes after sunset, the first star out.": "Des dunes de sable après le coucher du soleil, la première étoile levée.",
"Northern Lights": "Aurore boréale",
"An aurora over snowy hills and a line of pines.": "Une aurore au-dessus de collines enneigées et d’une rangée de pins.",
"Painted Cave": "Grotte ornée",
"Horses, aurochs and hands from Lascaux on a torchlit limestone wall.": "Chevaux, aurochs et mains de Lascaux sur une paroi calcaire éclairée à la torche.",
"Plain soft graphite with a little light from above.": "Un graphite doux et uni, avec un peu de lumière venue d'en haut.",
"Load any high-resolution wallpaper image via HTTP/HTTPS URL.": "Chargez n'importe quelle image haute résolution par une URL HTTP/HTTPS."
}
2 changes: 1 addition & 1 deletion ui/src/kiosk/DesktopIcons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ export function DesktopIcons({ onOpenApp, status }: Props) {
'text-[11px] font-medium tracking-tight mt-1.5 px-1.5 py-0.5 rounded max-w-[90px] truncate drop-shadow',
isSel
? 'bg-[var(--accent)] text-[var(--accent-fg)]'
: 'text-[var(--text-primary)] group-hover:text-white'
: 'text-white [text-shadow:0_1px_2px_rgba(0,0,0,0.9),0_0_8px_rgba(0,0,0,0.6)]'
)}
>
{t(app.label)}
Expand Down
30 changes: 14 additions & 16 deletions ui/src/kiosk/WallpaperModal.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { useState } from 'react';
import { Check, Image, Sliders, X, Sparkles, ExternalLink } from 'lucide-react';
import { t } from '../i18n';
import {
WALLPAPERS,
type WallpaperDef,
Expand Down Expand Up @@ -54,10 +55,10 @@ export function WallpaperModal({ open, onClose, onChanged }: Props) {
</div>
<div>
<h2 className="text-sm font-bold tracking-tight text-[var(--text-primary)]">
Kiosk Desktop Wallpaper
{t('Kiosk Desktop Wallpaper')}
</h2>
<p className="text-xs text-[var(--text-muted)]">
Choose a tactical schematic, ambient cosmic backdrop, or custom image URL
{t('Choose a scene, or use an image of your own')}
</p>
</div>
</div>
Expand All @@ -74,7 +75,7 @@ export function WallpaperModal({ open, onClose, onChanged }: Props) {
{/* Wallpapers Grid */}
<div className="space-y-3">
<label className="text-xs font-mono uppercase tracking-wider text-[var(--text-secondary)] font-semibold">
Preset Themes
{t('Scenes')}
</label>
<div className="grid grid-cols-2 sm:grid-cols-3 gap-3">
{WALLPAPERS.filter(w => w.id !== 'custom').map(w => {
Expand All @@ -91,26 +92,23 @@ export function WallpaperModal({ open, onClose, onChanged }: Props) {
>
{/* Thumbnail preview */}
<div
className="h-24 w-full relative overflow-hidden flex items-center justify-center"
style={{ background: w.previewGradient }}
className="aspect-[16/10] w-full relative overflow-hidden flex items-center justify-center"
style={{ background: w.preview }}
>
{isSelected && (
<div className="absolute top-2 right-2 w-5 h-5 rounded-full bg-[var(--accent)] text-[var(--accent-fg)] flex items-center justify-center shadow-lg">
<Check className="w-3 h-3 stroke-[3]" />
</div>
)}
<span className="text-[10px] font-mono tracking-widest uppercase opacity-40 font-bold text-white px-2 py-0.5 rounded bg-black/40">
{w.category}
</span>
</div>

{/* Metadata */}
<div className="p-3 flex-1 flex flex-col justify-between">
<div className="font-semibold text-xs text-[var(--text-primary)] group-hover:text-[var(--accent-soft)] transition">
{w.name}
{t(w.name)}
</div>
<div className="text-[10px] text-[var(--text-muted)] mt-1 line-clamp-2 leading-relaxed">
{w.description}
{t(w.description)}
</div>
</div>
</button>
Expand All @@ -124,11 +122,11 @@ export function WallpaperModal({ open, onClose, onChanged }: Props) {
<div className="flex items-center justify-between">
<label className="text-xs font-semibold text-[var(--text-primary)] flex items-center gap-1.5">
<ExternalLink className="w-3.5 h-3.5 text-[var(--accent)]" />
Custom Image URL
{t('Custom Image URL')}
</label>
{selectedId === 'custom' && (
<span className="text-[10px] font-mono text-[var(--accent-soft)] font-semibold uppercase">
Active
{t('Active')}
</span>
)}
</div>
Expand All @@ -145,7 +143,7 @@ export function WallpaperModal({ open, onClose, onChanged }: Props) {
disabled={!customUrl.trim()}
className="px-4 py-2 rounded-lg bg-[var(--accent)] text-[var(--accent-fg)] text-xs font-semibold hover:opacity-90 transition disabled:opacity-40"
>
Apply
{t('Apply')}
</button>
</div>
</div>
Expand All @@ -155,7 +153,7 @@ export function WallpaperModal({ open, onClose, onChanged }: Props) {
<div className="flex items-center justify-between">
<label className="text-xs font-semibold text-[var(--text-primary)] flex items-center gap-1.5">
<Sliders className="w-3.5 h-3.5 text-[var(--accent)]" />
Wallpaper Overlay Dimming
{t('Wallpaper Overlay Dimming')}
</label>
<span className="text-xs font-mono text-[var(--text-muted)]">{dim}%</span>
</div>
Expand All @@ -169,7 +167,7 @@ export function WallpaperModal({ open, onClose, onChanged }: Props) {
className="w-full h-1.5 bg-[var(--bg-secondary)] rounded-lg appearance-none cursor-pointer accent-[var(--accent)]"
/>
<p className="text-[11px] text-[var(--text-muted)] leading-relaxed">
Darkens the wallpaper background to maximize contrast for desktop shortcuts and open windows.
{t('Darkens the wallpaper background to maximize contrast for desktop shortcuts and open windows.')}
</p>
</div>
</div>
Expand All @@ -180,7 +178,7 @@ export function WallpaperModal({ open, onClose, onChanged }: Props) {
onClick={onClose}
className="px-4 py-1.5 rounded-lg text-xs font-semibold text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)] transition"
>
Done
{t('Done')}
</button>
</div>
</div>
Expand Down
Loading
Loading