fix(redesign): brand snap, event sentences, palette glass, full width
Round-up of feedback: - Brand: drop italic-gradient 'Bridge' wordmark + 'SERVICE NOTIFICATIONS' tag. Now plain 'Notify Bridge' bold sans + 'v0.5.2' mono — exactly what the Aurora mockup shows. - Event rows: replaced [collection_name] [event_tag] [count_tag] with a sentence form — bold provider, muted verb, bold count, gradient italic-feeling collection. Matches the mockup's 'Immich added 14 assets to «...»' pattern. Tracker → provider trail kept underneath. - SearchPalette: re-skinned to Aurora glass — solid surface (was using the now-translucent --color-card token and was nearly invisible), backdrop blur, hairline section headers with letterspaced mono labels, gradient active row, glass-bordered result icons + detail pills. - 'On watch' provider deck hidden when a global provider filter is active (deck would only show that one provider — redundant). Two-col grid collapses to single full-width column in that mode. - Layout: dropped the max-w-7xl cap on the topbar and the page container. Pages now stretch to full available width on wide displays. - Section labels in sidebar: dropped :global() wrapper since the element is in the same component. Added font-mono for tighter letterspacing match to the mockup. Build clean.
This commit is contained in:
@@ -367,16 +367,16 @@
|
||||
<!-- Header -->
|
||||
<div class="sidebar-header flex items-center {collapsed ? 'justify-center p-3' : 'justify-between px-5 py-5'}">
|
||||
{#if !collapsed}
|
||||
<div class="animate-fade-slide-in flex items-center gap-2.5">
|
||||
<div class="animate-fade-slide-in flex items-center gap-3">
|
||||
<div class="brand-orb"></div>
|
||||
<div>
|
||||
<h1 class="brand-mark">
|
||||
<div class="brand-text">
|
||||
<h1 class="brand-name">
|
||||
{#if globalProviderFilter.provider}
|
||||
<span class="brand-mark__icon" style="color: var(--color-primary);"><NavIcon name={providerDefaultIcon(globalProviderFilter.provider)} size={16} /></span>
|
||||
<span class="brand-mark__icon" style="color: var(--color-primary);"><NavIcon name={providerDefaultIcon(globalProviderFilter.provider)} size={14} /></span>
|
||||
{/if}
|
||||
<span class="brand-mark__notify">Notify</span> <em>Bridge</em>
|
||||
Notify Bridge
|
||||
</h1>
|
||||
<p class="brand-tag">{t('app.tagline')}</p>
|
||||
<p class="brand-version font-mono">v0.5.2</p>
|
||||
</div>
|
||||
</div>
|
||||
{:else}
|
||||
@@ -607,7 +607,7 @@
|
||||
style="padding-bottom: calc(4rem + env(safe-area-inset-bottom, 0px));">
|
||||
|
||||
<!-- Always-visible topbar — search + utilities + primary CTA -->
|
||||
<div class="topbar max-w-7xl mx-auto px-4 md:px-8 pt-4 md:pt-6">
|
||||
<div class="topbar px-4 md:px-8 pt-4 md:pt-6">
|
||||
<div class="topbar-glass">
|
||||
<button type="button" class="topbar-search" onclick={() => openSearch?.()}>
|
||||
<NavIcon name="mdiMagnify" size={16} />
|
||||
@@ -630,7 +630,7 @@
|
||||
</div>
|
||||
|
||||
{#key page.url.pathname}
|
||||
<div class="max-w-7xl mx-auto px-4 md:px-8 pb-4 md:pb-8 pt-4" in:fade={{ duration: 200, delay: 50 }}>
|
||||
<div class="px-4 md:px-8 pb-4 md:pb-8 pt-4" in:fade={{ duration: 200, delay: 50 }}>
|
||||
{@render children()}
|
||||
</div>
|
||||
{/key}
|
||||
@@ -717,41 +717,29 @@
|
||||
border-bottom: 1px solid var(--color-border);
|
||||
}
|
||||
|
||||
/* Brand mark — italic Newsreader serif */
|
||||
.brand-mark {
|
||||
font-family: var(--font-display);
|
||||
font-weight: 400;
|
||||
font-size: 1.15rem;
|
||||
letter-spacing: -0.02em;
|
||||
color: var(--color-foreground);
|
||||
margin: 0;
|
||||
line-height: 1;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 0.3rem;
|
||||
}
|
||||
.brand-mark__notify {
|
||||
/* Brand — snapped to Aurora mockup: bold sans wordmark + mono version */
|
||||
.brand-text { line-height: 1.1; min-width: 0; }
|
||||
.brand-name {
|
||||
font-family: var(--font-sans);
|
||||
font-weight: 600;
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
.brand-mark em {
|
||||
font-style: italic;
|
||||
background: linear-gradient(135deg, var(--color-orchid), var(--color-primary));
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
color: transparent;
|
||||
letter-spacing: -0.01em;
|
||||
color: var(--color-foreground);
|
||||
margin: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.35rem;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.brand-mark__icon {
|
||||
margin-right: 2px;
|
||||
align-self: center;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
}
|
||||
.brand-tag {
|
||||
font-size: 0.62rem;
|
||||
.brand-version {
|
||||
font-size: 0.65rem;
|
||||
color: var(--color-muted-foreground);
|
||||
margin-top: 3px;
|
||||
letter-spacing: 0.13em;
|
||||
text-transform: uppercase;
|
||||
margin: 3px 0 0;
|
||||
letter-spacing: 0.02em;
|
||||
font-weight: 500;
|
||||
}
|
||||
.brand-orb {
|
||||
@@ -898,7 +886,7 @@
|
||||
}
|
||||
|
||||
/* Section labels above each nav group */
|
||||
:global(.nav-section-label) {
|
||||
.nav-section-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.55rem;
|
||||
@@ -908,8 +896,9 @@
|
||||
text-transform: uppercase;
|
||||
color: var(--color-muted-foreground);
|
||||
padding: 0.85rem 0.85rem 0.4rem;
|
||||
font-family: var(--font-mono);
|
||||
}
|
||||
:global(.nav-section-label::after) {
|
||||
.nav-section-label::after {
|
||||
content: '';
|
||||
flex: 1;
|
||||
height: 1px;
|
||||
|
||||
@@ -453,7 +453,7 @@
|
||||
{@render statCards()}
|
||||
|
||||
<!-- ==================== TWO COL: stream + provider deck ==================== -->
|
||||
<div class="two-col">
|
||||
<div class="two-col" class:two-col--single={!!globalProviderFilter.id}>
|
||||
<!-- Signal stream -->
|
||||
<section class="panel">
|
||||
<header class="panel-head">
|
||||
@@ -532,20 +532,22 @@
|
||||
<MdiIcon name={eventIcons[event.event_type] || 'mdiBell'} size={18} />
|
||||
</div>
|
||||
<div class="signal-body min-w-0">
|
||||
<div class="signal-head">
|
||||
<span class="signal-verb truncate">{event.collection_name}</span>
|
||||
<span class="signal-tag">{t(eventLabels[event.event_type] || event.event_type)}</span>
|
||||
<div class="signal-sentence">
|
||||
{#if event.provider_name}<b class="signal-emph">{event.provider_name}</b>{/if}
|
||||
<span class="signal-verb">{t(eventLabels[event.event_type] || event.event_type)}</span>
|
||||
{#if event.assets_count > 0}
|
||||
<span class="signal-tag accent">{event.assets_count} {event.assets_count === 1 ? t('dashboard.asset') : t('dashboard.assets')}</span>
|
||||
<b class="signal-emph">{event.assets_count} {event.assets_count === 1 ? t('dashboard.asset') : t('dashboard.assets')}</b>
|
||||
{/if}
|
||||
{#if event.collection_name}
|
||||
<span class="signal-conn">·</span>
|
||||
<b class="signal-emph signal-emph--accent truncate">«{event.collection_name}»</b>
|
||||
{/if}
|
||||
</div>
|
||||
{#if event.provider_name || event.tracker_name}
|
||||
{#if event.tracker_name}
|
||||
<div class="signal-trail">
|
||||
{#if event.tracker_name}
|
||||
<span class="ch"><MdiIcon name="mdiRadar" size={11} />{event.tracker_name}</span>
|
||||
<span class="arrow">→</span>
|
||||
{/if}
|
||||
<span class="ch"><MdiIcon name="mdiRadar" size={11} />{event.tracker_name}</span>
|
||||
{#if event.provider_name}
|
||||
<span class="arrow">→</span>
|
||||
<span class="ch"><MdiIcon name="mdiServer" size={11} />{event.provider_name}</span>
|
||||
{/if}
|
||||
</div>
|
||||
@@ -565,7 +567,9 @@
|
||||
{/if}
|
||||
</section>
|
||||
|
||||
<!-- On watch — provider deck -->
|
||||
<!-- On watch — provider deck. Hidden when a global provider filter is
|
||||
active (the deck would only show that one provider — redundant). -->
|
||||
{#if !globalProviderFilter.id}
|
||||
<section class="panel">
|
||||
<header class="panel-head">
|
||||
<div>
|
||||
@@ -614,6 +618,7 @@
|
||||
</div>
|
||||
{/if}
|
||||
</section>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<!-- ==================== PULSE CHART ==================== -->
|
||||
@@ -899,6 +904,7 @@
|
||||
gap: 1.5rem;
|
||||
margin-top: 1.5rem;
|
||||
}
|
||||
.two-col.two-col--single { grid-template-columns: 1fr; }
|
||||
@media (max-width: 1100px) { .two-col { grid-template-columns: 1fr; } }
|
||||
|
||||
/* ============================================================
|
||||
@@ -1029,31 +1035,32 @@
|
||||
box-shadow: 0 4px 14px -4px var(--g1, var(--color-primary)), inset 0 1px 0 rgba(255,255,255,0.3);
|
||||
}
|
||||
.signal-body { min-width: 0; }
|
||||
.signal-head {
|
||||
display: flex; align-items: center; gap: 0.5rem;
|
||||
.signal-sentence {
|
||||
display: flex; align-items: baseline;
|
||||
gap: 0.4rem;
|
||||
font-size: 0.92rem;
|
||||
line-height: 1.45;
|
||||
color: var(--color-foreground);
|
||||
flex-wrap: wrap;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.signal-emph {
|
||||
font-weight: 600;
|
||||
color: var(--color-foreground);
|
||||
}
|
||||
.signal-verb { font-weight: 500; max-width: 26ch; }
|
||||
.signal-tag {
|
||||
display: inline-block;
|
||||
font-size: 0.62rem;
|
||||
font-weight: 500;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
padding: 0.13rem 0.5rem;
|
||||
border-radius: 999px;
|
||||
background: var(--color-glass-strong);
|
||||
color: var(--color-muted-foreground);
|
||||
white-space: nowrap;
|
||||
font-family: var(--font-mono);
|
||||
border: 1px solid var(--color-border);
|
||||
.signal-emph--accent {
|
||||
background: linear-gradient(135deg, var(--color-primary), var(--color-orchid));
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
color: transparent;
|
||||
font-weight: 600;
|
||||
max-width: 24ch;
|
||||
}
|
||||
.signal-tag.accent {
|
||||
background: rgba(184, 167, 255, 0.14);
|
||||
border-color: rgba(184, 167, 255, 0.3);
|
||||
color: var(--color-primary);
|
||||
.signal-verb {
|
||||
font-weight: 400;
|
||||
color: var(--color-muted-foreground);
|
||||
}
|
||||
.signal-conn {
|
||||
color: var(--color-rule-strong);
|
||||
}
|
||||
.signal-trail {
|
||||
display: flex; align-items: center; gap: 0.4rem;
|
||||
|
||||
Reference in New Issue
Block a user