diff --git a/src/components/LibraryApp.tsx b/src/components/LibraryApp.tsx index 38d4053..681f665 100644 --- a/src/components/LibraryApp.tsx +++ b/src/components/LibraryApp.tsx @@ -112,11 +112,14 @@ function LibStyles() { .hidden{display:none;} .leer{padding:60px 24px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:10px;} .leer h3{margin:0;font-size:17px;}.leer p{margin:0;color:var(--soft);max-width:38ch;} - .galerie{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:14px;} - .kachel{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:9px;} + .galerie{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px;align-items:start;} + @media(min-width:768px){.galerie{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:14px;}} + .kachel{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:8px;} .kachel.gewaehlt{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent);} - .kachel-bild{position:relative;aspect-ratio:1;background:var(--paper);border-radius:2px;overflow:hidden;cursor:pointer;} - .kachel-bild img{width:100%;height:100%;object-fit:cover;display:block;} + .kachel-bild{position:relative;border-radius:3px;overflow:hidden;cursor:pointer; + background:repeating-conic-gradient(oklch(90% 0.006 95) 0% 25%, oklch(96% 0.004 95) 0% 50%) 50%/16px 16px;} + .kachel-bild img{width:100%;height:auto;display:block;transition:transform .12s;} + .kachel-bild:active img{transform:scale(.98);} .haken{position:absolute;top:6px;left:6px;width:21px;height:21px;border-radius:50%;border:1.5px solid #fff;background:rgba(22,21,15,.35);color:#fff;display:flex;align-items:center;justify-content:center;font-size:12px;} .kachel.gewaehlt .haken{background:var(--accent);} .name{margin-top:8px;width:100%;font-size:12.5px;padding:6px 8px;font-family:var(--font-mono);border:1px solid var(--line);border-radius:3px;background:#fff;} diff --git a/src/components/QueueApp.tsx b/src/components/QueueApp.tsx index 5f1305b..4cac8b0 100644 --- a/src/components/QueueApp.tsx +++ b/src/components/QueueApp.tsx @@ -110,8 +110,9 @@ function QStyles() { .fein.err{color:var(--err);} .items{display:flex;flex-direction:column;} .item{display:flex;align-items:center;gap:12px;padding:10px 16px;border-bottom:1px solid var(--line);} - .thumb{width:44px;height:44px;flex:none;background:var(--paper);border:1px solid var(--line);border-radius:3px;overflow:hidden;display:flex;align-items:center;justify-content:center;} - .thumb img{width:100%;height:100%;object-fit:cover;} + .thumb{width:46px;height:46px;flex:none;border:1px solid var(--line);border-radius:3px;overflow:hidden;display:flex;align-items:center;justify-content:center; + background:repeating-conic-gradient(oklch(90% 0.006 95) 0% 25%, oklch(96% 0.004 95) 0% 50%) 50%/12px 12px;} + .thumb img{width:100%;height:100%;object-fit:contain;} .itxt{flex:1;min-width:0;} .itxt b{font-size:13.5px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} .iact{flex:none;} diff --git a/src/components/StudioApp.tsx b/src/components/StudioApp.tsx index 1e57c8a..0e3d542 100644 --- a/src/components/StudioApp.tsx +++ b/src/components/StudioApp.tsx @@ -273,10 +273,11 @@ function StudioStyles() { .drop.drag{border-color:var(--accent);background:var(--accent-bg);} .drop p{margin:0;color:var(--soft);font-size:14px;line-height:1.55;} .kbd{font-family:var(--font-mono);font-size:12px;background:var(--paper);border:1px solid var(--line);border-radius:3px;padding:1px 6px;} - .mini-raster{display:grid;grid-template-columns:repeat(auto-fill,minmax(78px,1fr));gap:8px;width:100%;} - .mini-bild{position:relative;aspect-ratio:3/4;background:var(--paper);border:1px solid var(--line);border-radius:3px;overflow:hidden;} + .mini-raster{display:grid;grid-template-columns:repeat(auto-fill,minmax(84px,1fr));gap:8px;width:100%;} + .mini-bild{position:relative;aspect-ratio:1;border:1px solid var(--line);border-radius:3px;overflow:hidden; + background:repeating-conic-gradient(oklch(90% 0.006 95) 0% 25%, oklch(96% 0.004 95) 0% 50%) 50%/14px 14px;} .mini-bild.err{border-color:var(--err);} - .mini-bild img{width:100%;height:100%;object-fit:cover;display:block;} + .mini-bild img{width:100%;height:100%;object-fit:contain;display:block;} .mini-bild>button{position:absolute;top:3px;right:3px;width:20px;height:20px;border:none;border-radius:50%;background:rgba(22,21,15,.75);color:#fff;cursor:pointer;font-size:14px;line-height:1;} .mini-bild .badge{position:absolute;bottom:3px;left:3px;background:var(--err);color:#fff;width:18px;height:18px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;} .lade{position:absolute;inset:0;background:var(--paper);opacity:.6;} diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro index 71fe977..9e9130f 100644 --- a/src/layouts/Base.astro +++ b/src/layouts/Base.astro @@ -8,50 +8,114 @@ import '../styles/tokens.css'; interface Props { title?: string } const { title = 'Klarbild' } = Astro.props; const user = Astro.locals.user; +const path = Astro.url.pathname; +const active = (href: string) => href === '/' ? path === '/' : path.startsWith(href); + +const nav = [ + { href: '/', label: 'Studio', icon: 'studio' }, + { href: '/bibliothek', label: 'Bibliothek', icon: 'library' }, + { href: '/warteschlange', label: 'Warteschlange', icon: 'queue' }, + ...(user?.role === 'admin' ? [{ href: '/admin', label: 'Admin', icon: 'admin' }] : []), +]; + +const S = 'fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"'; +const ICONS: Record = { + studio: ``, + library: ``, + queue: ``, + admin: ``, +}; --- - + {title} {user && (
klarbild -
)} +
+ + {user && ( + + )} + diff --git a/src/styles/tokens.css b/src/styles/tokens.css index b0109cf..d836da6 100644 --- a/src/styles/tokens.css +++ b/src/styles/tokens.css @@ -56,6 +56,14 @@ a { color: var(--accent); } .regmark::before { left: 50%; top: 0; width: 1.5px; height: 100%; transform: translateX(-50%); } .regmark::after { top: 50%; left: 0; height: 1.5px; width: 100%; transform: translateY(-50%); } +/* Mobile-First: 16px-Felder gegen iOS-Zoom beim Fokus */ +@media (max-width: 767px) { + input, select, textarea { font-size: 16px !important; } +} +/* Taktiles Feedback auf allen Buttons */ +button { transition: transform 0.06s ease; } +button:active { transform: scale(0.97); } + @media (prefers-reduced-motion: reduce) { * { animation-duration: 0.001ms !important; transition-duration: 0.001ms !important; } }