feat(shared-ui): unify bottom-stack bars with shared Pill component

- Extract Pill.svelte as the single visual primitive (44px, icon+label,
  active/primary/danger variants) used by PillDropdownBar and TagStrip.
  PillNav keeps its own internal .pill class (36px, icon-only-oriented).
- Extract phosphor-icon-map.ts to deduplicate the icon lookup tables
  that previously lived inline in PillDropdownBar.
- Unify bar slot heights in (app)/+layout.svelte: 56px PillNav,
  64px for tags / quickinput / tabbar / dropdown-bar. Remove debug
  outlines. Collapse bottom-stack gap so bars sit flush below PillNav.
- SceneAppBar wrapped in 64px slot, scene-pill/app-tab 40px to match.
- Enforce single-bar policy: opening one bar closes the others.
- QuickInputBar strip-down: remove leading CheckSquare icon and trailing
  nav-toggle snippet; bar is pure search input now.
- Move user-menu (last PillNav pill) to bar-mode with short content:
  Einstellungen, Light/Dark/System segmented, Theme, Logout.
- Swap tabs nav icon from Columns to Cards for better readability.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-15 00:58:46 +02:00
parent ce646550cd
commit b03bbe132e
7 changed files with 467 additions and 460 deletions

View file

@ -30,7 +30,7 @@
}
import type { Snippet } from 'svelte';
import { ArrowRight, Check, CheckSquare, Heart, MagnifyingGlass, Plus } from '@mana/shared-icons';
import { ArrowRight, Heart, MagnifyingGlass, Plus } from '@mana/shared-icons';
interface Props {
onSearch: (query: string) => Promise<QuickInputItem[]>;
@ -508,15 +508,6 @@
</div>
{/if}
<div class="app-icon" class:success-icon={createSuccess}>
{#if createSuccess}
<!-- Checkmark icon -->
<Check size={20} />
{:else}
<CheckSquare size={20} />
{/if}
</div>
<div class="input-wrapper">
<!-- Highlight backdrop (shows colored keywords) -->
<div class="input-highlight-backdrop" aria-hidden="true">
@ -583,10 +574,10 @@
left: 0;
right: 0;
z-index: 90;
padding: 0.75rem 1rem;
padding: 0.3125rem 1rem;
pointer-events: none;
/* Fixed height to prevent layout shift when results appear */
height: 72px;
/* Matches tags/tabbar slot (see bottomChromeHeight in (app)/+layout.svelte). */
height: 64px;
transition: bottom 0.3s ease;
}
@ -599,13 +590,13 @@
/* Mobile: tighter padding, full-width input */
@media (max-width: 640px) {
.quick-input-bar {
padding: 0.5rem 0.5rem;
padding: 0.3125rem 0.5rem;
height: 64px;
}
.input-container {
padding: 0.5rem 1rem;
height: 48px;
height: 54px;
gap: 0.5rem;
}
}