Files
MelodyMuse/src/index.css
T
Jannik 81aefe0700 Modernize the UI and fix the equalizer sizing bug
Bug fix

- EqualizerIcon: the SVG was rendering at the wrong size (filling
  its parent) because it had no explicit width/height attributes.
  Now it accepts a size prop with a 24px default and the SVG element
  carries the size as width/height attributes, with the className
  on top. Can't accidentally balloon.

Design

- Stripped the light-mode CSS — the app is dark-only now, and the
  theme toggle was a no-op (clicking it just toggled a class that
  had no matching rules). ThemeToggle.tsx and lib/theme.ts are
  gone; initTheme() call removed from main.tsx.

- Reworked the input form:
    • brand row is now small + refined (icon + wordmark, no huge
      gradient title)
    • Options is a single subtle collapsible card with a chevron and
      a count badge showing how many options are non-default
    • Vocals is now a segmented pill (single rounded container, two
      flat segments) instead of two full-width grid buttons
    • Generate button is slightly smaller (py-3.5, text-sm) and
      uses a softer shadow (shadow-violet-900/20)

- Empty state in the results panel: dashed-border card, soft
  gradient blur behind the music icon, cleaner copy.

- Results header: smaller heading, the 'Regenerate All' and
  'Cancel' buttons are now tiny ghost-style pills in the top-right.

- Sticky ZIP bar: softer shadow, more refined copy.

- Result cards: smaller icon, single-line title, the Regenerate
  button is now an inline pill that fits next to Revert + Copy.

- Home page header now has a tiny equalizer icon + 'MelodyMuse'
  wordmark on the left (was just text). Settings page header has
  the back arrow on the left and the title, no theme toggle.

- Global CSS: added modern focus-visible ring, custom selection
  color, subtle scrollbar thumb, slightly tweaked the gradient
  text to a softer violet-300 → cyan-300 instead of the loud
  violet-400 → fuchsia-400 → cyan-400.
2026-06-03 10:49:58 +02:00

141 lines
3.6 KiB
CSS

@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
color-scheme: dark;
}
html,
body,
#root {
height: 100%;
}
body {
@apply bg-bg text-fg antialiased font-sans;
margin: 0;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-feature-settings: "cv11", "ss01", "ss03";
}
/* Subtle, modern focus ring — keyboard only */
:focus-visible {
outline: 2px solid theme("colors.accent.primary");
outline-offset: 2px;
border-radius: 4px;
}
/* Custom selection color */
::selection {
background: rgba(124, 58, 237, 0.3);
color: #f1f5f9;
}
}
@layer components {
.card {
@apply bg-bg-card border border-border rounded-2xl;
}
.card-hover {
@apply hover:bg-bg-hover transition-colors duration-150;
}
.btn-primary {
@apply inline-flex items-center justify-center gap-2 px-4 py-2 rounded-lg font-medium text-white
bg-accent-primary hover:bg-violet-500 active:bg-violet-700
transition-colors duration-150 disabled:opacity-50 disabled:cursor-not-allowed;
}
.btn-secondary {
@apply inline-flex items-center justify-center gap-2 px-4 py-2 rounded-lg font-medium
bg-bg-card border border-border text-fg hover:bg-bg-hover
transition-colors duration-150 disabled:opacity-50 disabled:cursor-not-allowed;
}
.btn-ghost {
@apply inline-flex items-center justify-center gap-1.5 px-2.5 py-1.5 rounded-md text-sm
text-fg-muted hover:text-fg hover:bg-bg-hover
transition-colors duration-150 disabled:opacity-50 disabled:cursor-not-allowed;
}
.input {
@apply w-full bg-bg-card border border-border rounded-lg px-3 py-2 text-[14px] text-fg
placeholder-fg-muted/70
focus:outline-none focus:border-accent-primary/60
focus:ring-1 focus:ring-accent-primary/20
transition-colors duration-150;
}
.textarea {
@apply input resize-y;
}
.chip {
@apply inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full border border-border
bg-bg-card text-sm font-medium text-fg hover:bg-bg-hover
transition-colors duration-150;
}
.gradient-text {
background: linear-gradient(135deg, #c4b5fd 0%, #67e8f9 100%);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.gradient-bg {
background: linear-gradient(135deg, #7c3aed 0%, #06b6d4 100%);
}
.gradient-bg-soft {
background: linear-gradient(
135deg,
rgba(124, 58, 237, 0.18) 0%,
rgba(6, 182, 212, 0.12) 50%,
rgba(8, 8, 16, 0) 100%
);
}
/* Stagger delays for the result cards' fade-up animation. */
.stagger-0 {
animation-delay: 0ms;
}
.stagger-1 {
animation-delay: 80ms;
}
.stagger-2 {
animation-delay: 160ms;
}
.stagger-3 {
animation-delay: 240ms;
}
.stagger-4 {
animation-delay: 320ms;
}
}
@layer utilities {
.scrollbar-thin {
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.08) transparent;
}
.scrollbar-thin::-webkit-scrollbar {
width: 8px;
height: 8px;
}
.scrollbar-thin::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.08);
border-radius: 4px;
}
.scrollbar-thin::-webkit-scrollbar-thumb:hover {
background-color: rgba(255, 255, 255, 0.15);
}
}