diff --git a/frontend/src/app.css b/frontend/src/app.css
index 20ae13c..13bdbe8 100644
--- a/frontend/src/app.css
+++ b/frontend/src/app.css
@@ -1,16 +1,18 @@
-/* goodNews calm design system.
- Warm but crisp: cream surfaces, sage accent, a serif voice for headlines,
- strong readable contrast, generous space. No urgency colors (no red). */
+/* Upbeat Bytes calm design system.
+ Sand, sea, and sun: warm paper surfaces, a vivid-azure accent, gold highlight,
+ a serif voice for headlines, strong readable contrast, generous space.
+ No urgency colors (no red). Built around the logo's #0083ad azure. */
:root {
- --bg: #faf6ee;
+ --bg: #f7f4ec;
--surface: #fffdf8;
- --ink: #21281f;
- --muted: #616c60;
- --sage: #2f7d5b;
- --sage-deep: #235e44;
- --sage-soft: #e6efe6;
- --line: #e7e1d4;
- --gold: #a9802f;
+ --ink: #16263a;
+ --muted: #5d6b78;
+ --accent: #0083ad;
+ --accent-deep: #006b8e;
+ --accent-soft: #e0eef3;
+ --line: #e8e3d8;
+ --gold: #b3892b;
+ --gold-bright: #e6cd42;
--serif: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, "Times New Roman", serif;
--sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
@@ -42,7 +44,7 @@ h1, h2, h3 {
a { color: inherit; text-decoration: none; }
img { max-width: 100%; display: block; }
button { font-family: inherit; cursor: pointer; }
-::selection { background: var(--sage-soft); }
+::selection { background: var(--accent-soft); }
.container { max-width: var(--maxw); margin: 0 auto; padding: 0 20px; }
.muted { color: var(--muted); }
diff --git a/frontend/src/app.html b/frontend/src/app.html
index fe3ad42..2f44b24 100644
--- a/frontend/src/app.html
+++ b/frontend/src/app.html
@@ -5,7 +5,7 @@
-
+
Upbeat Bytes — calm, constructive news
%sveltekit.head%
diff --git a/frontend/src/lib/components/ArticleCard.svelte b/frontend/src/lib/components/ArticleCard.svelte
index 697c922..5ffcba8 100644
--- a/frontend/src/lib/components/ArticleCard.svelte
+++ b/frontend/src/lib/components/ArticleCard.svelte
@@ -81,16 +81,16 @@
.body { padding: 16px 18px 14px; display: flex; flex-direction: column; gap: 8px; flex: 1; }
.tags { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 0.74rem; }
.tag {
- background: var(--sage); color: #fff; border-radius: 999px;
+ background: var(--accent); color: #fff; border-radius: 999px;
padding: 2px 9px; font-weight: 600; text-transform: capitalize;
}
- .tag.soft { background: var(--sage-soft); color: var(--sage-deep); }
+ .tag.soft { background: var(--accent-soft); color: var(--accent-deep); }
/* Source on its own line below the tags, left-justified, for uniformity. */
.src { color: var(--muted); font-size: 0.78rem; margin: -2px 0 2px; }
h3 { font-size: 1.18rem; }
- h3 a:hover { color: var(--sage-deep); }
- .desc { margin: 2px 0 0; color: #3c463a; }
+ h3 a:hover { color: var(--accent-deep); }
+ .desc { margin: 2px 0 0; color: #3b4754; }
.paywall {
margin: 0; font-size: 0.78rem; color: var(--gold);
display: inline-flex; align-items: center; gap: 5px;
@@ -98,7 +98,7 @@
.paywall::before { content: '🔒'; font-size: 0.72rem; filter: grayscale(0.3); }
.why {
margin: 2px 0 0; font-style: italic; color: var(--muted);
- font-size: 0.9rem; padding-left: 12px; border-left: 2px solid var(--sage-soft);
+ font-size: 0.9rem; padding-left: 12px; border-left: 2px solid var(--accent-soft);
}
/* Keep heights even: clamp variable-length text on tiles. */
.tile h3, .why {
@@ -113,8 +113,8 @@
background: none; border: none; padding: 0; color: var(--muted);
font-size: 0.76rem; border-bottom: 1px dotted var(--line);
}
- .actions button:hover { color: var(--sage-deep); border-bottom-color: var(--sage); }
- .actions .replace { color: var(--sage-deep); border-bottom-color: var(--sage-soft); }
+ .actions button:hover { color: var(--accent-deep); border-bottom-color: var(--accent); }
+ .actions .replace { color: var(--accent-deep); border-bottom-color: var(--accent-soft); }
@media (hover: hover) {
.actions button:not(.replace) { opacity: 0; transition: opacity 0.16s ease; }
article:hover .actions button:not(.replace),
@@ -126,13 +126,13 @@
.tile .body { padding-top: 18px; }
.tile .body::before {
content: ''; display: block; width: 30px; height: 3px;
- background: var(--sage); border-radius: 2px; margin-bottom: 10px; opacity: 0.85;
+ background: var(--accent); border-radius: 2px; margin-bottom: 10px; opacity: 0.85;
}
.tile::after {
content: attr(data-topic);
position: absolute; right: 10px; bottom: -8px;
font-family: var(--serif); font-size: 3.4rem; line-height: 1;
- color: var(--sage); opacity: 0.05; text-transform: lowercase; letter-spacing: -0.02em;
+ color: var(--accent); opacity: 0.05; text-transform: lowercase; letter-spacing: -0.02em;
pointer-events: none; user-select: none;
}
.tile .tags, .tile .src, .tile h3, .tile .why, .tile .actions { position: relative; }
@@ -141,13 +141,13 @@
.hero { display: grid; grid-template-columns: 1.1fr 1fr; }
.hero .media {
position: relative; display: block; height: 100%; min-height: 300px;
- background: linear-gradient(135deg, var(--sage-soft), #f1ece0);
+ background: linear-gradient(135deg, var(--accent-soft), #f1ece0);
}
.hero .media img { width: 100%; height: 100%; object-fit: cover; }
/* Soft feed images read as atmospheric, not broken. */
.hero .media::after {
content: ''; position: absolute; inset: 0; pointer-events: none;
- background: linear-gradient(180deg, rgba(33, 40, 31, 0) 55%, rgba(33, 40, 31, 0.16));
+ background: linear-gradient(180deg, rgba(10, 22, 38, 0) 55%, rgba(10, 22, 38, 0.18));
}
.hero .body { padding: 30px 32px; justify-content: center; gap: 12px; }
.hero h3 { font-size: 1.95rem; }
@@ -156,14 +156,14 @@
.herotype {
position: relative; overflow: hidden;
background:
- radial-gradient(120% 140% at 100% 0%, var(--sage-soft) 0%, transparent 55%),
+ radial-gradient(120% 140% at 100% 0%, var(--accent-soft) 0%, transparent 55%),
var(--surface);
}
.herotype::after {
content: attr(data-topic);
position: absolute; right: 12px; bottom: -18px;
font-family: var(--serif); font-size: clamp(4rem, 12vw, 8rem); line-height: 1;
- color: var(--sage); opacity: 0.07; text-transform: lowercase; letter-spacing: -0.02em;
+ color: var(--accent); opacity: 0.07; text-transform: lowercase; letter-spacing: -0.02em;
pointer-events: none; user-select: none;
}
.herotype .body { position: relative; padding: 40px 36px; gap: 12px; }
diff --git a/frontend/src/lib/components/BottomNav.svelte b/frontend/src/lib/components/BottomNav.svelte
index 774ed47..8b5dc57 100644
--- a/frontend/src/lib/components/BottomNav.svelte
+++ b/frontend/src/lib/components/BottomNav.svelte
@@ -39,7 +39,7 @@
color: var(--muted); font-size: 0.7rem; letter-spacing: 0.02em;
}
.bottomnav button svg { width: 23px; height: 23px; }
- .bottomnav button.active { color: var(--sage-deep); }
- .bottomnav button.active svg { stroke: var(--sage); }
+ .bottomnav button.active { color: var(--accent-deep); }
+ .bottomnav button.active svg { stroke: var(--accent); }
}
diff --git a/frontend/src/lib/components/BoundariesPanel.svelte b/frontend/src/lib/components/BoundariesPanel.svelte
index 26cfc46..5e069c1 100644
--- a/frontend/src/lib/components/BoundariesPanel.svelte
+++ b/frontend/src/lib/components/BoundariesPanel.svelte
@@ -106,7 +106,7 @@
}
.head { display: flex; align-items: baseline; justify-content: space-between; }
.head h2 { font-size: 1.3rem; }
- .close { background: none; border: none; color: var(--sage-deep); font-size: 0.85rem; text-decoration: underline; }
+ .close { background: none; border: none; color: var(--accent-deep); font-size: 0.85rem; text-decoration: underline; }
.reassure { margin: 4px 0 16px; color: var(--muted); font-size: 0.85rem; }
.group { margin-bottom: 16px; }
.label {
@@ -118,16 +118,16 @@
flex: 1; border: 1px solid var(--line); border-radius: 9px; padding: 9px 12px;
font-size: 0.92rem; background: var(--bg);
}
- .addrow input:focus { outline: none; border-color: var(--sage); }
- .add { border: 1px solid var(--sage); background: var(--sage); color: #fff; border-radius: 9px; padding: 9px 16px; font-size: 0.88rem; }
+ .addrow input:focus { outline: none; border-color: var(--accent); }
+ .add { border: 1px solid var(--accent); background: var(--accent); color: #fff; border-radius: 9px; padding: 9px 16px; font-size: 0.88rem; }
.pills { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.pill {
display: inline-flex; align-items: center; gap: 4px;
- background: var(--sage-soft); color: var(--sage-deep);
+ background: var(--accent-soft); color: var(--accent-deep);
border-radius: 999px; padding: 4px 6px 4px 12px; font-size: 0.85rem;
}
.pill small { color: var(--muted); }
- .pill button { background: none; border: none; color: var(--sage-deep); font-size: 1.05rem; line-height: 1; cursor: pointer; padding: 0 4px; }
+ .pill button { background: none; border: none; color: var(--accent-deep); font-size: 1.05rem; line-height: 1; cursor: pointer; padding: 0 4px; }
.empty { margin: 0; color: var(--muted); font-size: 0.85rem; font-style: italic; }
.reset { background: none; border: none; color: var(--muted); font-size: 0.82rem; text-decoration: underline; margin-top: 4px; }
diff --git a/frontend/src/lib/components/Header.svelte b/frontend/src/lib/components/Header.svelte
index 691205f..09f717c 100644
--- a/frontend/src/lib/components/Header.svelte
+++ b/frontend/src/lib/components/Header.svelte
@@ -5,15 +5,7 @@
-
- UpbeatBytes
+