:root {
    /* Color Palette */
    --bg-color: #FFFDF5;
    /* Warm Cream */
    --card-bg: #FFFFFF;
    --text-primary: #2D3436;
    /* Deep Charcoal */
    --text-secondary: #636E72;

    /* Accents */
    --accent-lavender: #E0D4FF;
    --accent-sage: #C1E1C1;
    --accent-coral: #FFB7B2;
    --accent-yellow: #FFF5BA;

    /* Divider Row Colors (category list section dividers) */
    --divider-monthly: #E3CE8C;
    /* Muted gold */
    --divider-yearly: #D69A85;
    /* Muted rust/coral */

    /* Functional */
    --border-color: #2D3436;
    /* Charcoal, not pure black */
    --border-width: 2px;
    --radius-l: 24px;
    --radius-m: 16px;
    --radius-s: 10px;

    /* Mappings to existing variables */
    --bg: var(--bg-color);
    --panel: var(--card-bg);
    --text: var(--text-primary);
    --muted: var(--text-secondary);
    --bg-input: #FFFFFF;
    --border-input: var(--border-color);
    --border: var(--border-color);

    /* Themeable brand accent. This is the single source of truth for the app's
       accent color -- every button, active nav/tab state, the Net row, focus
       rings, etc. read from --accent (or --accent-hover for the darker hover
       shade). Swap these two values (see html[data-accent-theme=...] below) to
       re-theme the whole app. Default is Lavender.
       NOTE: meaning-colors are intentionally NOT driven by this -- the tag
       palette (--tag-*), red/green paid/unpaid (--red/--green/--accent-sage),
       and the grey skipped/status styling stay fixed regardless of theme. */
    --accent: #E0D4FF;
    --accent-hover: #D1C4F0;
    --green: #4CAF50;
    /* Softer organic green */
    --red: #FF6B6B;
    /* Softer organic red */

    /* New specific vars */
    --shadow-solid: 4px 4px 0px 0px rgba(45, 52, 54, 0.2);
    --divider-dashed: 2px dashed rgba(45, 52, 54, 0.2);

    /* Fixed Calendar Vars */
    --bg-primary: var(--bg-color);
    --bg-secondary: #F0EFE9;
    /* Slightly darker than bg-color for contrast */
    --bg-tertiary: #E8E8E8;

    /* Tag Palette: fixed set of muted, brand-consistent colors that tags are assigned
       from (cycles/repeats once exhausted). Extends the existing cream/lavender/green set. */
    --tag-1: #E0D4FF;
    /* Lavender */
    --tag-2: #C1E1C1;
    /* Sage */
    --tag-3: #FFB7B2;
    /* Coral */
    --tag-4: #E3CE8C;
    /* Muted gold */
    --tag-5: #D69A85;
    /* Muted rust */
    --tag-6: #B8D4E3;
    /* Dusty blue */
    --tag-7: #D9B8C4;
    /* Mauve */
    --tag-8: #BFCDA0;
    /* Olive */
    --tag-9: #D8C8B8;
    /* Taupe */
    --tag-10: #F0DDA8;
    /* Warm cream-gold */
}

/* ===== Accent Themes =====
   The user picks an accent theme on the Settings page; the choice is stored in
   localStorage and applied by setting data-accent-theme on <html> (see base.html's
   head script, which runs before first paint to avoid a flash). Each theme only
   overrides --accent (the pastel fill) and --accent-hover (a slightly darker shade
   for hover). Everything branded reads from those two, so the whole app re-themes
   from here. Lavender is the default and matches the :root values above.
   Meaning-colors (tags, red/green paid/unpaid, grey skip/status) are never listed
   here and so stay identical across every theme. */
html[data-accent-theme="lavender"] {
    --accent: #E0D4FF;
    --accent-hover: #D1C4F0;
}

html[data-accent-theme="slate"] {
    --accent: #C3CEE8;
    --accent-hover: #AEBBDD;
}

html[data-accent-theme="orange"] {
    --accent: #F0BC97;
    --accent-hover: #E7A878;
}

html[data-accent-theme="charcoal"] {
    --accent: #CDD0D6;
    --accent-hover: #B9BDC5;
}

html[data-accent-theme="blush"] {
    --accent: #F6C7D2;
    --accent-hover: #EFB0BF;
}

* {
    box-sizing: border-box;
}

body {
    background-color: var(--bg-color);
    color: var(--text-primary);
    font-family: 'Plus Jakarta Sans', sans-serif;
    margin: 0;
    padding: 0;
    position: relative;
    line-height: 1.6;
}

/* Paper Grain Texture */
body::before {
    content: "";
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    pointer-events: none;
    z-index: -1;
    background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.05'/%3E%3C/svg%3E");
    opacity: 0.4;
}

/* ... existing nav styles ... */

/* ... existing category list styles ... */

input[type="number"],
.input-cell {
    background: transparent;
    border: none;
    color: var(--text-primary);
    padding: 0;
    width: 100%;
    /* Align left to be close to the $ sign */
    text-align: left;
    font-family: inherit;
    font-weight: 500;
    /* Matching Actual column visual weight */
    font-size: 1rem;
}

.input-cell:disabled {
    color: var(--text-secondary);
    cursor: not-allowed;
}

.currency-wrap {
    position: relative;
    /* max-width removed for auto-expand */
    display: flex;
    align-items: center;
    gap: 2px;
}

.currency-wrap span {
    color: #888;
    pointer-events: none;
    font-size: 0.9rem;
    font-weight: 500;
    /* Matching Actual column visual weight */
}

nav {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 1rem 2rem;
    margin: 1rem 2rem;
    background: #FFFFFF;
    border: 2px solid var(--border-color);
    border-radius: var(--radius-l);
    box-shadow: var(--shadow-solid);
    position: sticky;
    top: 1rem;
    z-index: 100;
}

/* Scalloped decorative element below nav */
nav::after {
    content: "";
    position: absolute;
    bottom: -12px;
    left: 16px;
    right: 16px;
    height: 12px;
    /* Scallop SVG: #2D3436 is %232D3436 */
    background-image: url("data:image/svg+xml,%3Csvg width='20' height='12' viewBox='0 0 20 12' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0,0 Q10,15 20,0' fill='none' stroke='%232D3436' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
    background-repeat: repeat-x;
    background-size: 20px 12px;
    opacity: 1;
    z-index: -1;
}

.logo {
    font-weight: 800;
    font-size: 1.4rem;
    letter-spacing: -0.02em;
    color: var(--text-primary);
    text-decoration: none;
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.badge {
    background: var(--accent-coral);
    color: var(--text-primary);
    padding: 0.2rem 0.6rem;
    border-radius: 50px;
    font-size: 0.75rem;
    border: 1px solid var(--border-color);
    font-weight: 700;
}

.nav-links a {
    margin-left: 0.5rem;
    color: var(--text-primary);
    text-decoration: none;
    padding: 0.5rem 1rem;
    border-radius: 50px;
    font-weight: 600;
    border: 2px solid transparent;
    transition: all 0.2s ease;
}

.nav-links a:hover {
    background: var(--accent);
    border-color: var(--border-color);
    box-shadow: 2px 2px 0px 0px rgba(45, 52, 54, 1);
    transform: translateY(-2px);
}

/* Current page stays highlighted so it's clear which page you're on,
   instead of the pill only showing while actively hovering. */
.nav-links a.active {
    background: var(--accent);
    border-color: var(--border-color);
    box-shadow: 2px 2px 0px 0px rgba(45, 52, 54, 1);
}

main {
    padding: 2rem;
    max-width: 1200px;
    margin: 0 auto;
}

.group-cards {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 1.5rem;
    margin-bottom: 2rem;
}

/* Month Header Bar */
.month-header-bar {
    display: flex;
    justify-content: flex-start;
    align-items: center;
    margin-bottom: 1.5rem;
}

.month-select-wrapper {
    display: flex;
    align-items: center;
}

.month-select-wrapper select,
.styled-select {
    flex: 0 1 320px;
    padding: 0.6rem 0.8rem;
    border: 2px solid var(--border-color);
    border-radius: var(--radius-m);
    background: #fff;
    color: var(--text-primary);
    font-family: inherit;
    font-weight: 700;
    font-size: 1rem;
}

.month-menu-wrapper {
    position: relative;
    margin-left: 0.75rem;
}

button.month-menu-trigger {
    width: 40px;
    height: 34px;
    /* Rounded rectangle (overrides .btn-icon-grey's 50% circle) */
    border-radius: 10px;
    font: inherit;
    font-size: 0;
    line-height: 0;
    letter-spacing: normal;
    padding: 0;
    margin: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}

.month-menu-popover {
    display: none;
    position: absolute;
    top: calc(100% + 6px);
    right: 0;
    min-width: 170px;
    background: var(--card-bg);
    border: 2px solid var(--border-color);
    border-radius: var(--radius-m);
    box-shadow: var(--shadow-solid);
    overflow: hidden;
    z-index: 50;
}

.month-menu-popover.open {
    display: flex;
    flex-direction: column;
}

.month-menu-item {
    background: none;
    border: none;
    text-align: left;
    padding: 0.7rem 1rem;
    font-weight: 600;
    font-size: 0.9rem;
    color: var(--text-primary);
    cursor: pointer;
    border-bottom: 1px solid rgba(45, 52, 54, 0.1);
}

.month-menu-item:last-child {
    border-bottom: none;
}

.month-menu-item:hover {
    background: color-mix(in srgb, var(--accent) 30%, transparent);
}

.month-menu-item.danger {
    color: var(--red);
}

.month-menu-item.danger:hover {
    background: rgba(255, 107, 107, 0.1);
}

/* Future Account withdrawal income badge -- solid lavender circle with a black
   W. Bordered in white so it still reads as a distinct badge when it sits on
   top of the calendar's lavender "received" pill. */
.badge-withdrawal {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 14px;
    height: 14px;
    margin-left: 0.4rem;
    border-radius: 50%;
    background: var(--accent);
    color: var(--text-primary);
    border: 1px solid #fff;
    font-size: 0.65rem;
    font-weight: 700;
    flex-shrink: 0;
    vertical-align: middle;
}

/* Larger variant for contexts with more room, e.g. the Manage Income modal,
   where the badge sits on a plain row background and needs to stand out next
   to the account name. */
.badge-withdrawal-lg {
    width: 20px;
    height: 20px;
    font-size: 0.75rem;
}

/* Skipped category indicators */
.skip-badge {
    display: inline-block;
    margin-left: 0.6rem;
    padding: 0.15rem 0.55rem;
    font-size: 0.65rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    border-radius: 50px;
    background: #E0E0E0;
    color: var(--text-secondary);
    vertical-align: middle;
}

.skip-prev-note {
    display: inline-block;
    margin-left: 0.6rem;
    font-size: 0.75rem;
    font-style: italic;
    color: var(--text-secondary);
    vertical-align: middle;
}

/* Review/Cancel-by reminder flag -- small flag shown to the right of a budget item's
   name. Red (the app's existing --red, same as unpaid bill dots) once the date has
   arrived/passed and is actionable; a muted grey .upcoming variant while the date is
   still in the future, so setting a date gives immediate feedback. The SVG fills with
   currentColor, so these two rules are the single control for its color. */
.review-flag {
    display: inline-flex;
    align-items: center;
    margin-left: 0.6rem;
    vertical-align: middle;
    line-height: 0;
    color: var(--red);
}

.review-flag.upcoming {
    color: var(--text-secondary);
    opacity: 0.7;
}

.review-flag svg {
    width: 12px;
    height: 12px;
    display: block;
}

.row.category-row.skipped-row {
    opacity: 0.55;
}

/* Income / Expenses / Net Summary Strip */
.summary-strip {
    background: var(--card-bg);
    border: 2px solid var(--border-color);
    border-radius: var(--radius-l);
    box-shadow: var(--shadow-solid);
    overflow: hidden;
    margin-bottom: 2rem;
}

.summary-row {
    display: grid;
    grid-template-columns: 1.2fr 1fr 1fr;
    padding: 0.9rem 1.5rem;
    align-items: center;
    border-bottom: var(--divider-dashed);
}

.summary-row:last-child {
    border-bottom: none;
}

.summary-header {
    background: #FFFFFF;
    font-weight: 700;
    color: var(--text-secondary);
    text-transform: uppercase;
    font-size: 0.8rem;
    letter-spacing: 0.05em;
    border-bottom: 2px solid var(--border-color);
}

.summary-label {
    font-weight: 700;
    display: flex;
    align-items: center;
    gap: 0.6rem;
}

button.btn-badge {
    padding: 0.35rem 0.7rem;
    font-size: 0.65rem;
    border-radius: 50px;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    box-shadow: none;
}

button.btn-badge:hover {
    transform: none;
    box-shadow: none;
}

.cat-group-badge {
    margin-left: 0.6rem;
    padding: 0.2rem 0.6rem;
    font-size: 0.7rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    border-radius: 50px;
    background: var(--accent);
    color: var(--text-primary);
    vertical-align: middle;
}

.summary-col {
    text-align: right;
    font-weight: 700;
}

.summary-net {
    background: var(--accent);
}

.summary-net .summary-label,
.summary-net .summary-col {
    font-weight: 800;
}

.card {
    background: var(--card-bg);
    padding: 2rem;
    border-radius: var(--radius-l);
    border: 2px solid var(--border-color);
    box-shadow: var(--shadow-solid);
}

.stat-row {
    display: flex;
    justify-content: space-between;
    margin-bottom: 0.8rem;
    align-items: center;
}

.stat-row .label {
    color: var(--text-secondary);
    font-weight: 600;
}

.stat-row .val {
    font-weight: 800;
    font-size: 1.1rem;
    color: var(--text-primary);
}

.category-list {
    background: var(--card-bg);
    border-radius: var(--radius-l);
    border: 2px solid var(--border-color);
    box-shadow: var(--shadow-solid);
    overflow: hidden;
    margin-bottom: 2rem;
}

.row {
    display: grid;
    grid-template-columns: 2fr 1fr 1fr 1fr 50px;
    padding: 1.2rem;
    border-bottom: var(--divider-dashed);
    align-items: center;
}

.row:last-child {
    border-bottom: none;
}

/* Zebra striping - very subtle warm tint of the accent */
.row:nth-child(even) {
    background-color: color-mix(in srgb, var(--accent) 5%, transparent);
}

.row.header {
    background: #FFFFFF;
    font-weight: 700;
    color: var(--text-secondary);
    border-bottom: 2px solid var(--border-color);
    text-transform: uppercase;
    font-size: 0.8rem;
    letter-spacing: 0.05em;
}

.row .name {
    font-weight: 600;
}

.remaining {
    font-weight: 500;
    color: var(--green);
}

.remaining.negative {
    color: var(--red);
}

/* Remove underline from clickable category names */
.name,
.name a,
.name a:visited,
.name a:hover,
.name a:active {
    text-decoration: none;
    color: var(--text-primary);
    cursor: pointer;
}

.btn-icon {
    background: var(--accent);
    color: var(--text-primary);
    border: 2px solid var(--border-color);
    width: 36px;
    height: 36px;
    border-radius: 50%;
    cursor: pointer;
    font-weight: bold;
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: 2px 2px 0px 0px rgba(45, 52, 54, 1);
    transition: all 0.1s;
}

.btn-icon:hover {
    transform: translateY(-2px);
    box-shadow: 3px 3px 0px 0px rgba(45, 52, 54, 1);
}

.btn-icon:active {
    transform: translateY(2px);
    box-shadow: 0px 0px 0px 0px rgba(45, 52, 54, 1);
}

/* Lock page scrolling behind any open modal. Every modal in the app opens by
   setting inline `style.display = 'flex'`, so this one selector covers them all
   without touching each open/close call site. Applied to html (the viewport's
   scrolling element), not body, so wheel and programmatic scrolls are blocked. */
html:has(.modal[style*="display: flex"]) {
    overflow: hidden;
}

.modal {
    display: none;
    position: fixed;
    /* Must render above the sticky nav header (z-index: 100), and the modal itself
       must stay pinned to the viewport (not scroll with the page) -- only the
       content inside a modal scrolls, via the inner max-height/overflow-y wrappers. */
    z-index: 1000;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    overflow: hidden;
    background-color: rgba(255, 253, 245, 0.9);
    backdrop-filter: blur(4px);
    align-items: center;
    justify-content: center;
}

/* Modal Content */
.modal-content {
    background-color: var(--card-bg);
    margin: 0;
    padding: 2rem;
    border: 2px solid var(--border-color);
    width: 450px;
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-solid);
    position: relative;
    color: var(--text-primary);
    max-height: 90vh;
}

.modal-content.large {
    width: fit-content;
    max-width: 95%;
    /* Do not set overflow/height here, or exit button gets clipped */
    /* max-height: 80vh; */
    /* overflow-y: auto; */
}


.cat-edit-row {
    display: flex;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
    align-items: center;
    width: 100%;
}

#catManagerList {
    width: fit-content;
}

.cat-edit-row input,
.cat-edit-row select,
.add-cat-form input,
.add-cat-form select,
.tx-edit-row input,
.tx-edit-row select {
    padding: 0.6rem;
    background: var(--bg-input);
    border: 2px solid var(--border-color);
    color: var(--text-primary);
    border-radius: var(--radius-m);
    font-family: inherit;
    font-size: 0.95rem;
    font-weight: 500;
}


/* Hide the number spin buttons on the forecast input so its full placeholder/value
   isn't squeezed by the browser's stepper arrows. */
#newCatForecast::-webkit-outer-spin-button,
#newCatForecast::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

#newCatForecast {
    -moz-appearance: textfield;
    appearance: textfield;
}

.edit-name {
    flex: 2;
}

.edit-group {
    width: 120px;
}

.edit-subgroup {
    flex: 1;
}

/* Small pill button for list-row actions (Edit/Save/Back in transaction lists).
   The brand button look at row scale; combine with .btn-danger for red delete
   buttons or .btn-plain for a neutral secondary action. */
.btn-small {
    background: var(--accent);
    color: var(--text-primary);
    border: 2px solid var(--border-color);
    padding: 0.3rem 0.75rem;
    border-radius: 50px;
    cursor: pointer;
    font-weight: 600;
    font-size: 0.8rem;
    font-family: inherit;
    box-shadow: 2px 2px 0px 0px rgba(45, 52, 54, 0.2);
    transition: all 0.1s ease;
}

.btn-small:hover {
    transform: translateY(-2px);
    box-shadow: 4px 4px 0px 0px rgba(45, 52, 54, 0.2);
}

.btn-small.btn-plain {
    background: #fff;
}

.btn-danger {
    background: var(--red);
    color: white;
    border: 2px solid var(--border-color);
    padding: 0.5rem 1rem;
    border-radius: 50px;
    cursor: pointer;
    font-weight: 600;
    box-shadow: 2px 2px 0px 0px rgba(0, 0, 0, 0.2);
    transition: all 0.1s ease;
}

.btn-danger:hover {
    transform: translateY(-2px);
    box-shadow: 6px 6px 0px 0px rgba(45, 52, 54, 0.2);
}

.add-cat-form {
    border-top: var(--divider-dashed);
    padding-top: 1.5rem;
    margin-top: 1.5rem;
    display: flex;
    flex-direction: column;
    gap: 1rem;
    align-items: stretch;
    width: auto;
}

.input-flat {
    background: transparent;
    border: none;
    border-bottom: 2px solid var(--border-color);
    color: var(--text-primary);
    width: 120px;
    text-align: right;
    padding: 0.2rem;
    font-family: inherit;
    font-weight: 600;
}

.alloc-inputs {
    display: flex;
    gap: 0.5rem;
}

.alloc-inputs input {
    width: 50px;
    text-align: center;
    border: 2px solid var(--border-color);
    border-radius: var(--radius-s);
    padding: 0.2rem;
}

.month-settings {
    display: flex;
    gap: 2rem;
    align-items: center;
    background: var(--card-bg);
    padding: 1rem 2rem;
    border-radius: var(--radius-l);
    margin-bottom: 2rem;
    border: 2px solid var(--border-color);
    box-shadow: var(--shadow-solid);
}

.setting-item {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

.setting-item label {
    font-size: 0.75rem;
    color: var(--text-secondary);
    text-transform: uppercase;
    font-weight: 700;
    letter-spacing: 0.05em;
}

.form-group {
    margin-bottom: 1.5rem;
}

.form-group label {
    display: block;
    margin-bottom: 0.5rem;
    color: var(--text-secondary);
    font-weight: 600;
}

.form-group input,
.form-group select,
.form-group textarea {
    width: 100%;
    padding: 0.8rem;
    background: var(--bg-input);
    border: 2px solid var(--border-color);
    color: var(--text-primary);
    border-radius: var(--radius-m);
    font-size: 1rem;
    font-family: inherit;
    transition: all 0.2s;
    box-shadow: 2px 2px 0px 0px rgba(45, 52, 54, 0.1);
}

.form-group textarea {
    resize: vertical;
    min-height: 4.5rem;
}

.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus,
.cat-edit-row input:focus,
.cat-edit-row select:focus,
.income-edit-row input:focus,
.tx-edit-row input:focus,
.tx-edit-row select:focus {
    outline: none;
    border-color: var(--accent);
    box-shadow: 0 0 0 4px var(--accent);
}

/* Same highlight while the dropdown popup is open (first click opens the picker
   without settling :focus, so without this the ring only shows on re-click).
   Kept as its own rule: browsers without :open support would otherwise drop the
   whole selector list, including the input:focus styling above. */
.form-group select:open,
.month-select-wrapper select:open,
.cat-edit-row select:open,
.tx-edit-row select:open {
    outline: none;
    border-color: var(--accent);
    box-shadow: 0 0 0 4px var(--accent);
}

/* Branded dropdown popups. Native select popups are OS-rendered (the generic
   dark list); Chromium's customizable-select opts the popup into CSS so it can
   match the app's popover look (see .legend-popover). Other browsers ignore
   this and at least get a light-mode native popup via color-scheme. */
.form-group select,
.add-cat-form select,
.month-select-wrapper select,
.cat-edit-row select,
.tx-edit-row select {
    color-scheme: light;
}

.form-group select,
.form-group select::picker(select),
.add-cat-form select,
.add-cat-form select::picker(select),
.month-select-wrapper select,
.month-select-wrapper select::picker(select),
.cat-edit-row select,
.cat-edit-row select::picker(select),
.tx-edit-row select,
.tx-edit-row select::picker(select) {
    appearance: base-select;
}

.form-group select::picker(select),
.add-cat-form select::picker(select),
.month-select-wrapper select::picker(select),
.cat-edit-row select::picker(select),
.tx-edit-row select::picker(select) {
    background: var(--card-bg);
    border: 2px solid var(--border-color);
    border-radius: var(--radius-m);
    box-shadow: var(--shadow-solid);
    padding: 6px;
    margin-top: 6px;
}

.form-group select option,
.add-cat-form select option,
.month-select-wrapper select option,
.cat-edit-row select option,
.tx-edit-row select option {
    padding: 0.5rem 0.75rem;
    border-radius: 10px;
    font-family: inherit;
    font-size: 0.95rem;
    color: var(--text-primary);
    background: transparent;
    cursor: pointer;
}

.form-group select option:hover,
.form-group select option:focus,
.add-cat-form select option:hover,
.add-cat-form select option:focus,
.month-select-wrapper select option:hover,
.month-select-wrapper select option:focus,
.cat-edit-row select option:hover,
.cat-edit-row select option:focus,
.tx-edit-row select option:hover,
.tx-edit-row select option:focus {
    background: var(--accent);
}

.form-group select option:checked,
.add-cat-form select option:checked,
.month-select-wrapper select option:checked,
.cat-edit-row select option:checked,
.tx-edit-row select option:checked {
    background: var(--accent);
    font-weight: 600;
}

.btn-primary {
    background: var(--accent);
    color: var(--text-primary);
    border: 2px solid var(--border-color);
    padding: 0.8rem 1.5rem;
    border-radius: 50px;
    cursor: pointer;
    font-weight: 800;
    box-shadow: var(--shadow-solid);
    transition: all 0.1s ease;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    font-size: 0.9rem;
    display: inline-block;
}

.btn-primary:hover {
    transform: translateY(-2px);
    box-shadow: 6px 6px 0px 0px rgba(45, 52, 54, 0.2);
    background: var(--accent-hover);
}

.btn-success {
    background: var(--accent-sage);
    /* Green */
    color: var(--text-primary);
    border: 2px solid var(--border-color);
    padding: 0.8rem 1.5rem;
    border-radius: 50px;
    cursor: pointer;
    font-weight: 800;
    box-shadow: var(--shadow-solid);
    transition: all 0.1s ease;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    font-size: 0.9rem;
    display: inline-block;
}

.btn-success:hover {
    transform: translateY(-2px);
    box-shadow: 6px 6px 0px 0px rgba(45, 52, 54, 0.2);
    background: #A8D5A8;
    /* Slightly darker sage for hover */
}

.btn-primary:active {
    transform: translateY(3px);
    box-shadow: 1px 1px 0px 0px rgba(45, 52, 54, 0.2);
}

.btn-icon-grey {
    background: #EEE;
    color: var(--text-secondary);
    width: 24px;
    height: 24px;
    border-radius: 50%;
    border: 1px solid var(--border-color);
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    font-weight: bold;
    font-size: 1.1rem;
    line-height: 1;
    padding: 0;
    transition: all 0.2s;
}

.btn-icon-grey:hover {
    background: #DDD;
    color: var(--text-primary);
    border-color: var(--text-primary);
}

/* Global Sort Popover */
.sort-popover-wrap {
    position: relative;
    display: inline-flex;
}

#globalSortBtn {
    width: auto;
    height: auto;
    min-height: 38px;
    border-radius: var(--radius-m);
    font-size: 0.9rem;
    padding: 8px 18px;
    font-weight: 600;
}

.sort-popover {
    position: absolute;
    top: calc(100% + 6px);
    right: 0;
    min-width: 210px;
    background: var(--card-bg);
    border: 2px solid var(--border-color);
    border-radius: var(--radius-m);
    box-shadow: var(--shadow-solid);
    overflow: hidden;
    z-index: 50;
    display: flex;
    flex-direction: column;
}

.sort-popover button {
    background: none;
    border: none;
    text-align: left;
    padding: 0.65rem 1rem;
    font-weight: 600;
    font-size: 0.9rem;
    color: var(--text-primary);
    cursor: pointer;
    border-bottom: 1px solid rgba(45, 52, 54, 0.1);
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    white-space: nowrap;
}

.sort-popover button:last-child {
    border-bottom: none;
}

.sort-popover button:hover {
    background: color-mix(in srgb, var(--accent) 30%, transparent);
}

.sort-check {
    width: 1em;
    display: inline-block;
    text-align: center;
}

/* Tag / Filter toolbar (floats between the Income summary and the category list) */
.tag-filter-toolbar {
    display: flex;
    justify-content: flex-end;
    align-items: center;
    gap: 8px;
    margin: 0 0 10px;
}

.legend-popover-wrap {
    position: relative;
    display: inline-flex;
}

#legendBtn {
    width: 38px;
    height: 38px;
}

#legendBtn svg {
    width: 20px;
    height: 20px;
    display: block;
}

#paymentMethodBtn {
    width: 38px;
    height: 38px;
}

#paymentMethodBtn svg {
    width: 22px;
    height: 22px;
    display: block;
}

/* Trips page: Trip Tag Legend + Filter toolbar buttons (same sizing as the
   Budget page's #legendBtn/#globalSortBtn, scoped to the separate trip tag list) */
#tripLegendBtn {
    width: 38px;
    height: 38px;
}

#tripLegendBtn svg {
    width: 20px;
    height: 20px;
    display: block;
}

#tripFilterBtn {
    width: auto;
    height: auto;
    min-height: 38px;
    border-radius: var(--radius-m);
    font-size: 0.9rem;
    padding: 8px 18px;
    font-weight: 600;
}

.legend-popover {
    position: absolute;
    top: calc(100% + 6px);
    right: 0;
    width: 240px;
    background: var(--card-bg);
    border: 2px solid var(--border-color);
    border-radius: var(--radius-m);
    box-shadow: var(--shadow-solid);
    z-index: 50;
    padding: 10px;
    overflow-x: hidden;
}

.legend-create-row {
    display: flex;
    gap: 6px;
    align-items: center;
    padding-bottom: 10px;
    margin-bottom: 10px;
    border-bottom: 1px solid rgba(45, 52, 54, 0.15);
}

.legend-create-row input[type="text"] {
    flex: 1;
    min-width: 0;
    font-size: 0.8rem;
    padding: 4px 6px;
    box-sizing: border-box;
}

.legend-create-row input[type="text"]:focus {
    outline: none;
    border-color: #CCCCCC;
    box-shadow: inset 0 0 0 2px #CCCCCC;
}

.tag-swatch-picker {
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    gap: 5px;
    margin: 8px 0;
}

.tag-swatch {
    width: 18px;
    height: 18px;
    border-radius: 50%;
    border: 1px solid rgba(45, 52, 54, 0.3);
    cursor: pointer;
    padding: 0;
    box-sizing: border-box;
}

.tag-swatch.selected {
    border: 2px solid var(--border-color);
    box-shadow: 0 0 0 2px var(--card-bg) inset;
}

.tag-swatch-dot {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    flex-shrink: 0;
    display: inline-block;
}

.legend-tag-list {
    display: flex;
    flex-direction: column;
    gap: 6px;
    max-height: 220px;
    overflow-y: auto;
    overflow-x: hidden;
}

.legend-tag-row {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 0.85rem;
    color: var(--text-primary);
    min-width: 0;
}

/* Shared drag handle look, matching the one used for reordering categories in the
   Manage Categories modal. */
.drag-handle {
    cursor: grab;
    padding: 0 5px;
    color: #aaa;
    font-size: 1.2rem;
    flex-shrink: 0;
}

.legend-tag-delete-btn {
    padding: 0.2rem 0.6rem;
    font-size: 0.75rem;
    flex-shrink: 0;
}

.legend-tag-name {
    cursor: pointer;
    border-radius: 4px;
    padding: 2px 4px;
    margin: -2px -4px;
}

.legend-tag-name:hover {
    background: color-mix(in srgb, var(--accent) 35%, transparent);
}

.legend-tag-name-input {
    font-size: 0.85rem;
    font-family: inherit;
    color: var(--text-primary);
    padding: 2px 4px;
    margin: -2px -4px;
    border: 1px solid var(--border-color);
    border-radius: 4px;
    background: var(--card-bg);
    min-width: 30px;
    max-width: 100%;
    flex: 0 1 auto;
    box-sizing: border-box;
}

.legend-tag-name-input:focus {
    outline: none;
    box-shadow: inset 0 0 0 2px #CCCCCC;
}

.legend-empty {
    font-size: 0.8rem;
    color: var(--text-secondary);
    padding: 4px 2px;
}

/* Tagged category rows get a colored left-edge strip, matching the calendar's
   paid/unpaid dot-as-left-accent convention. Color is the tag's exact stored hex, unmodified
   -- pixel-identical to the swatch shown in the Legend popover. Width is generous instead,
   since that's the visibility lever here rather than altering the color. */
.row.category-row {
    border-left: 12px solid transparent;
    transition: background-color 0.6s ease;
}

/* Brief flash for a budget item row that was just added, so it's easy to spot
   even deep in a long list. Cleared on the next click elsewhere on the page. */
.row.category-row.highlight-flash {
    background-color: var(--accent);
}

/* Group Headers & Totals */
.group-header-row {
    background-color: transparent;
    border-bottom: 2px solid var(--border-color);
    margin-top: 0;
    padding: 0.4rem 1.2rem;
    display: grid;
    grid-template-columns: 2fr 1fr 1fr 1fr 50px;
    align-items: center;
    position: relative;
    cursor: pointer;
}

.group-header-row .name {
    color: var(--text-primary);
    letter-spacing: -0.01em;
    display: flex;
    align-items: center;
    gap: 15px;
    font-size: 1.2rem;
    font-weight: 800;
}

.group-chevron {
    display: inline-block;
    font-size: 0.85rem;
    color: var(--text-secondary);
    transition: transform 0.15s ease;
    transform-origin: 50% 45%;
}

.group-manage-btn {
    font-size: 0.85rem;
    padding: 2px 8px;
}

/* The name/percentage/target text reads as one phrase -- keep it tight even though
   the chevron and pencil icon (siblings in .group-header-row .name) use a wider gap. */
.group-header-phrase {
    display: flex;
    align-items: center;
    gap: 5px;
}

.group-header-row.collapsed .group-chevron {
    transform: rotate(-90deg);
}

.group-total-row {
    background-color: transparent;
    border-top: 2px solid var(--border-color);
    border-bottom: 3px solid var(--text-primary);
    font-weight: 700;
    color: var(--text-primary);
    padding: 0.6rem 1.2rem;
}

.group-total-row .remaining {
    font-weight: 800;
    /* Force bold for the totals */
}

.group-total-row .name {
    text-align: right;
    padding-right: 1rem;
    color: var(--text-secondary);
    font-size: 0.9rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
}

/* Billing Frequency UI */

.mini-month-toggle {
    transition: background 0.1s;
    user-select: none;
    cursor: pointer;
}

.mini-month-toggle.selected {
    background: var(--accent-sage) !important;
    color: var(--text-primary) !important;
    font-weight: bold;
    border: 1px solid var(--border-color);
}

.month-grid div {
    display: flex;
    align-items: center;
    gap: 3px;
    background: #EEE;
    padding: 4px;
    border-radius: 4px;
}

.freq-controls {
    border: 1px solid var(--border-color);
    padding: 4px;
    border-radius: 8px;
    background: #fff;
}

/* Allocation Percent Inputs in Group Header */
.group-header-row .allocation-control input {
    background: var(--bg-input);
    border: 2px solid var(--border-color);
    color: var(--text-primary);
    text-align: center;
    border-radius: 8px;
    padding: 4px 8px;
    font-size: 1rem;
    font-weight: 700;
    width: 60px;
    /* Increased from 45px inline */
}


.group-header-row .allocation-control input:focus {
    border-color: var(--accent);
    outline: none;
    box-shadow: 0 0 0 3px var(--accent);
}

/* Specific alignment for Income Manager */
.income-table input[type="number"],
.add-income-form input[type="number"] {
    text-align: left;
}

/* Modal Inner Scrolling Containers */
.cat-manager-list,
.income-list-container,
.tx-list-container {
    max-height: 70vh;
    overflow-y: auto;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-m);
    padding: 1rem;
    background: #FAFAFA;
}

/* Modal Exit Button */
.btn-modal-exit {
    position: absolute;
    top: -15px;
    right: -15px;
    background: #EEE;
    color: var(--text-secondary);
    width: 32px;
    height: 32px;
    border-radius: 50%;
    border: 2px solid var(--border-color);
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    font-weight: 800;
    font-size: 1rem;
    box-shadow: 2px 2px 0px 0px rgba(45, 52, 54, 1);
    transition: all 0.2s;
    z-index: 100;
}

/* Add Budget Item / Add Transaction modals: placeholder text ("Spotify",
   "Walmart", "0.00") renders in the same color as select text ("No Parent",
   "No Trip") so every field in the form reads uniformly. */
#addCatModal .form-group input::placeholder,
#txModal .form-group input::placeholder {
    color: var(--text-primary);
    opacity: 1;
}

/* Date input's format hint (month/day/year) stays lowercase, matching the
   lowercase mm/dd/yyyy the browser renders by default. */
#txModal input[type="date"]::-webkit-datetime-edit {
    text-transform: lowercase;
}

.btn-modal-exit:hover {
    transform: translateY(-2px);
    background: #DDD;
    color: var(--text-primary);
    box-shadow: 3px 3px 0px 0px rgba(45, 52, 54, 1);
}

/* --- Calendar Page Styles --- */
.calendar-container {
    padding: 2rem;
    max-width: 1400px;
    margin: 0 auto;
}

.calendar-filters {
    display: flex;
    gap: 1.5rem;
    margin-bottom: 1.5rem;
    background: var(--bg-card);
    padding: 1rem 1.5rem;
    border-radius: var(--radius-m);
    box-shadow: var(--shadow-sm);
    align-items: center;
    border: 1px solid var(--border-color);
}

.filter-group {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.filter-group label {
    font-weight: 600;
    color: var(--text-secondary);
    font-size: 0.9rem;
}

.filter-group select {
    padding: 0.4rem 0.8rem;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-s);
    background: var(--bg-input);
    color: var(--text-primary);
}

.calendar-grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 1px;
    background: #E0E0E0;
    /* Lighter border color for grid lines */
    border: 1px solid #E0E0E0;
    border-radius: var(--radius-m);
    overflow: hidden;
    box-shadow: var(--shadow-solid);
}

.day-header {
    background: var(--bg-secondary);
    padding: 1rem;
    text-align: center;
    font-weight: 700;
    color: var(--text-secondary);
    text-transform: uppercase;
    font-size: 0.8rem;
    letter-spacing: 0.05em;
}

.calendar-day {
    background: var(--bg-card);
    min-height: 140px;
    padding: 0.5rem;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}

.calendar-day.empty {
    background: var(--bg-primary);
    /* Slightly different for empty days */
}

.day-number {
    font-weight: 700;
    color: var(--text-secondary);
    font-size: 0.9rem;
    margin-bottom: 0.25rem;
    text-align: right;
}

/* Calendar Items (Pills) */
.cal-item {
    font-size: 0.8rem;
    padding: 0.25rem 0.5rem;
    border-radius: 4px;
    background: #F4F4F4;
    /* Explicit light grey */
    border: 1px solid #E0E0E0;
    color: var(--text-primary);
    display: flex;
    align-items: center;
    gap: 0.4rem;
    border-left: 3px solid transparent;
    cursor: default;
    transition: transform 0.1s;
}

.cal-item:hover {
    transform: translateY(-1px);
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
}

/* Group Colors - OVERRIDDEN BY STATUS */
/* Default accent is Red (Due) */

/* Hide spin buttons for allocation percentage inputs */
.allocation-control input[type=number]::-webkit-inner-spin-button,
.allocation-control input[type=number]::-webkit-outer-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

.allocation-control input[type=number] {
    -moz-appearance: textfield;
}

/* Forecasted input focus state */
.input-cell:focus {
    border-color: var(--accent);
    box-shadow: 0 0 0 3px var(--accent);
    outline: none;
    background: #FFF;
    border-radius: 4px;
}

.cal-item {
    border-left-color: var(--red);
}

/* Paid accent is Green */
.cal-item.paid {
    border-left-color: var(--accent-sage);
}

/* Dots follow same logic */
.dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    flex-shrink: 0;
    background-color: var(--red);
}

.cal-item.paid .dot {
    background-color: var(--accent-sage);
}

/* Hide Group-specific classes if present */
/* We reset them to inherit or be overridden above, but let's be explicit if needed */
.cal-item.group-Fixed,
.cal-item.group-Fun,
.cal-item.group-Future {
    border-left-color: var(--red);
    /* Force Red default */
}

.cal-item.paid.group-Fixed,
.cal-item.paid.group-Fun,
.cal-item.paid.group-Future {
    border-left-color: var(--accent-sage);
}

.group-Fixed .dot,
.group-Fun .dot,
.group-Future .dot {
    background-color: var(--red);
}

.paid .dot {
    background-color: var(--accent-sage) !important;
}

/* Skipped State (per-month, overrides paid/group colors) */
.cal-item.skipped,
.cal-item.skipped.group-Fixed,
.cal-item.skipped.group-Fun,
.cal-item.skipped.group-Future {
    border-left-color: #B0B0B0;
    opacity: 0.55;
}

.cal-item.skipped .dot,
.skipped .dot {
    background-color: #B0B0B0 !important;
}

.cal-item.skipped .name {
    text-decoration: line-through;
    color: var(--text-secondary);
}

/* Bill Detail Popup (calendar) */
.bill-amount-due {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    padding: 0.85rem 0;
    border-top: 1px solid rgba(45, 52, 54, 0.1);
    border-bottom: 1px solid rgba(45, 52, 54, 0.1);
    margin-bottom: 1rem;
}

.bill-amount-label {
    font-size: 0.85rem;
    color: var(--text-secondary);
    font-weight: 600;
}

.bill-amount-value {
    font-size: 1.4rem;
    font-weight: 800;
    color: var(--text-primary);
}

.bill-skip-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    font-weight: 700;
}

/* Skip toggle switch */
.skip-switch {
    position: relative;
    display: inline-block;
    cursor: pointer;
}

.skip-switch input {
    position: absolute;
    opacity: 0;
    width: 0;
    height: 0;
}

.skip-switch-track {
    display: inline-block;
    width: 46px;
    height: 26px;
    border-radius: 999px;
    background: #E0E0E0;
    border: 2px solid var(--border-color);
    position: relative;
    transition: background-color 0.15s ease;
}

.skip-switch-thumb {
    position: absolute;
    top: 1px;
    left: 1px;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    background: #fff;
    border: 1px solid var(--border-color);
    transition: transform 0.15s ease;
}

.skip-switch input:checked+.skip-switch-track {
    background: var(--accent);
}

.skip-switch input:checked+.skip-switch-track .skip-switch-thumb {
    transform: translateX(20px);
}

/* Subgroup Dividers (e.g. Monthly/Yearly Subscriptions) */
.subgroup-divider-row {
    grid-column: 1 / -1;
    padding: 0;
    width: 100%;
}

.subgroup-divider {
    grid-column: 1 / -1;
    display: flex;
    align-items: center;
    width: 100%;
    padding: 0.5rem 1.2rem;
    margin: 0.5rem 0;
    border-radius: var(--radius-s);
    background: #EFEFEF;
    /* Neutral fallback if no preset color matches */
    color: var(--text-primary);
}

.subgroup-divider span {
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-weight: 700;
}

.subgroup-divider.divider-monthly {
    background: var(--divider-monthly);
}

.subgroup-divider.divider-yearly {
    background: var(--divider-yearly);
}

/* Two-way choice buttons (e.g. Debt payment structure, Settings preferences).
   Sits inside a .form-group; .active marks the selected option. */
.toggle-group {
    display: flex;
    gap: 6px;
}

.toggle-btn {
    flex: 1;
    font-family: inherit;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--text-primary);
    background: var(--bg-input);
    border: 2px solid var(--border-color);
    border-radius: var(--radius-m);
    padding: 0.8rem 1rem;
    cursor: pointer;
    box-shadow: 2px 2px 0px 0px rgba(45, 52, 54, 0.1);
    transition: all 0.1s ease;
}

.toggle-btn:hover {
    transform: translateY(-2px);
    box-shadow: 4px 4px 0px 0px rgba(45, 52, 54, 0.15);
}

.toggle-btn.active {
    background: var(--accent);
    /* Inset ring (not an outward spread) so the selected state can never
       poke past a card's rounded corner regardless of nearby spacing. */
    box-shadow: inset 0 0 0 3px var(--border-color);
}

/* Settings page: sectioned layout so future settings slot in as new sections
   without restructuring the page. */
.settings-section {
    margin-bottom: 2rem;
}

.settings-section-title {
    font-size: 0.75rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--text-secondary);
    margin: 0 0.25rem 0.75rem;
}

.settings-section .card {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
}

.settings-section .form-group {
    margin-bottom: 0;
}

.settings-section .form-group .hint {
    font-size: 0.8rem;
    color: var(--text-secondary);
    margin-top: 0.5rem;
}

/* Appearance section: accent theme picker. Each option is a pill showing the
   theme's accent swatch next to its name; the selected one gets the same inset
   ring as .toggle-btn.active. */
.theme-options {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 0.75rem;
}

.theme-option {
    display: flex;
    align-items: center;
    gap: 8px;
    font-family: inherit;
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--text-primary);
    background: var(--bg-input);
    border: 2px solid var(--border-color);
    border-radius: var(--radius-m);
    padding: 0.6rem 0.9rem;
    cursor: pointer;
    box-shadow: 2px 2px 0px 0px rgba(45, 52, 54, 0.1);
    transition: all 0.1s ease;
}

.theme-option:hover {
    transform: translateY(-2px);
    box-shadow: 4px 4px 0px 0px rgba(45, 52, 54, 0.15);
}

.theme-option.active {
    box-shadow: inset 0 0 0 3px var(--border-color);
}

.theme-swatch {
    width: 18px;
    height: 18px;
    border-radius: 50%;
    border: 2px solid var(--border-color);
    flex-shrink: 0;
}