/* ── Fonts & Reset ── */ @import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@300;400;500;600&family=DM+Serif+Display&display=swap'); *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { --cream: #F2EBE3; --warm-white: #FAF6F2; --soft-brown: #B8957A; --text-dark: #3D2B1F; --text-mid: #7A5C48; --text-light: #B09080; --border: #E0D0C4; --shadow: rgba(80, 50, 30, 0.1); --sage: #A8C5A0; --blush: #D4B8C5; --dusty-blue: #A0B8C5; --terracotta: #C5A0A0; --lavender: #B4A0C5; --warm-tan: #C5BBA0; --moss: #B4C5A0; --mauve: #C5A8B4; --radius: 12px; --radius-sm: 8px; } body { font-family: 'DM Sans', sans-serif; background: var(--cream); color: var(--text-dark); min-height: 100vh; } /* ── Nav ── */ nav { background: #EAE0D8; border-bottom: 1px solid var(--border); padding: 0.6rem 2rem 0; display: flex; flex-direction: column; align-items: center; position: sticky; top: 0; z-index: 100; } .nav-brand { font-family: 'DM Serif Display', serif; font-size: 1.15rem; color: var(--text-dark); letter-spacing: 0.01em; white-space: nowrap; padding-bottom: 0.4rem; } .nav-links { display: flex; gap: 0.25rem; overflow-x: auto; border-top: 1px solid var(--border); width: 100%; justify-content: center; padding: 0.3rem 0; } .nav-links::-webkit-scrollbar { display: none; } .nav-links a { text-decoration: none; color: var(--text-mid); font-size: 0.9rem; font-weight: 500; padding: 0.4rem 0.85rem; border-radius: var(--radius-sm); transition: background 0.15s, color 0.15s; } .nav-links a:hover { background: var(--cream); color: var(--text-dark); } /* ── Main ── */ main { max-width: 960px; margin: 0 auto; padding: 2rem 1.5rem 4rem; } /* ── Page header ── */ .page-header { display: flex; align-items: center; gap: 1rem; margin-bottom: 1.75rem; } .page-header h1 { font-family: 'DM Serif Display', serif; font-size: 1.9rem; font-weight: 400; color: var(--text-dark); } .badge { background: var(--blush); color: var(--text-dark); font-size: 0.8rem; font-weight: 600; padding: 0.25rem 0.75rem; border-radius: 999px; } /* ── Alert banner ── */ .alert-banner { background: #EDF4EC; border: 1px solid #C5DCC2; color: var(--text-dark); padding: 0.9rem 1.25rem; border-radius: var(--radius); display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-bottom: 1.5rem; flex-wrap: wrap; } .alert-error { background: #F4EDEC; border-color: #DCC2C5; } /* ── Cards ── */ .card-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin-bottom: 2rem; } .card { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem 1.5rem; box-shadow: 0 2px 8px var(--shadow); } .card-label { font-size: 0.8rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-light); margin-bottom: 0.4rem; } .card-value { font-family: 'DM Serif Display', serif; font-size: 2rem; color: var(--text-dark); } .card-wide { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); padding: 2rem; box-shadow: 0 2px 8px var(--shadow); margin-bottom: 1.5rem; } .card-wide h2 { font-family: 'DM Serif Display', serif; font-weight: 400; font-size: 1.4rem; margin-bottom: 0.5rem; } /* ── Sections ── */ .section { margin-bottom: 2.5rem; } .section h2 { font-family: 'DM Serif Display', serif; font-weight: 400; font-size: 1.4rem; margin-bottom: 1rem; color: var(--text-dark); } /* ── Category bars ── */ .category-bars { display: flex; flex-direction: column; gap: 0.6rem; } .category-bar-row { display: grid; grid-template-columns: 130px 1fr 80px; align-items: center; gap: 0.75rem; } .category-bar-label { font-size: 0.88rem; font-weight: 500; color: var(--text-mid); text-align: right; } .category-bar-track { background: var(--border); border-radius: 999px; height: 10px; overflow: hidden; } .category-bar-fill { height: 100%; border-radius: 999px; transition: width 0.4s ease; opacity: 0.85; } .category-bar-amount { font-size: 0.88rem; font-weight: 600; color: var(--text-dark); } /* ── Tables ── */ .txn-table { width: 100%; border-collapse: collapse; background: var(--warm-white); border-radius: var(--radius); overflow: hidden; box-shadow: 0 2px 8px var(--shadow); font-size: 0.9rem; } .txn-table th { background: var(--cream); text-align: left; padding: 0.75rem 1rem; font-size: 0.78rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.07em; color: var(--text-light); border-bottom: 1px solid var(--border); } .txn-table td { padding: 0.75rem 1rem; border-bottom: 1px solid var(--border); color: var(--text-dark); } .txn-table tr:last-child td { border-bottom: none; } .txn-table tr:hover td { background: #FDFAF7; } .amount { font-weight: 600; font-variant-numeric: tabular-nums; } .muted { color: var(--text-light); font-size: 0.85rem; } .edit-link { color: var(--text-mid); font-size: 0.85rem; text-decoration: none; } .edit-link:hover { color: var(--text-dark); text-decoration: underline; } /* ── Tags ── */ .tag { display: inline-block; padding: 0.2rem 0.6rem; border-radius: 999px; font-size: 0.78rem; font-weight: 600; color: #FAF6F2; opacity: 0.9; } /* ── Buttons ── */ .btn { display: inline-block; padding: 0.55rem 1.25rem; border-radius: var(--radius-sm); font-family: 'DM Sans', sans-serif; font-size: 0.9rem; font-weight: 600; cursor: pointer; border: none; text-decoration: none; transition: opacity 0.15s, transform 0.1s; } .btn:hover { opacity: 0.85; transform: translateY(-1px); } .btn:active { transform: translateY(0); } .btn-primary { background: #A8C5A0; color: #FAF6F2; } .btn-accept { background: #C5DCC2; color: #FAF6F2; padding: 0.3rem 0.85rem; font-size: 0.85rem; } .btn-ghost { background: transparent; color: var(--text-mid); border: 1px solid var(--border); } .btn-powder-blue { background: #B0CDD6; color: #FAF6F2; } .btn-dusty-rose { background: #D4B8C5; color: #FAF6F2; } .btn-moss { background: #8FB8A0; color: #FAF6F2; } .btn-large { padding: 0.75rem 2rem; font-size: 1rem; } /* ── Forms ── */ .form-group { margin-bottom: 1.25rem; } .form-group label { display: block; font-size: 0.85rem; font-weight: 600; color: var(--text-mid); margin-bottom: 0.4rem; } .optional { font-weight: 400; color: var(--text-light); } .form-group input[type="text"], .form-group select { width: 100%; padding: 0.6rem 0.9rem; border: 1px solid var(--border); border-radius: var(--radius-sm); font-family: 'DM Sans', sans-serif; font-size: 0.95rem; color: var(--text-dark); background: var(--cream); transition: border-color 0.15s; } .form-group input[type="text"]:focus, .form-group select:focus { outline: none; border-color: var(--sage); } .checkbox-group label { display: flex; align-items: center; gap: 0.5rem; font-size: 0.9rem; font-weight: 400; color: var(--text-mid); cursor: pointer; } .form-actions { display: flex; gap: 0.75rem; align-items: center; margin-top: 1.5rem; } .helper-text { color: var(--text-light); font-size: 0.875rem; margin-bottom: 1.5rem; } /* ── Import form ── */ .import-form { max-width: 480px; } .file-drop-area { border: 2px dashed var(--border); border-radius: var(--radius); padding: 2rem; text-align: center; background: var(--cream); cursor: pointer; transition: border-color 0.15s; } .file-drop-area:hover { border-color: var(--sage); } .file-drop-area input[type="file"] { display: block; margin: 0 auto 0.5rem; } .file-drop-area p { color: var(--text-light); font-size: 0.85rem; } .file-types { font-size: 0.78rem !important; margin-top: 0.25rem; } .tips { background: #FDFAF7; } .tips h3 { font-size: 1rem; font-weight: 600; margin-bottom: 0.75rem; color: var(--text-mid); } .tips ul { list-style: none; display: flex; flex-direction: column; gap: 0.4rem; } .tips li { font-size: 0.88rem; color: var(--text-mid); padding-left: 1rem; position: relative; } .tips li::before { content: "→"; position: absolute; left: 0; color: var(--text-light); } /* ── Review card ── */ .review-card { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); padding: 2rem; box-shadow: 0 2px 8px var(--shadow); max-width: 680px; } .review-meta { display: flex; gap: 1rem; margin-bottom: 0.5rem; } .review-date { color: var(--text-light); font-size: 0.9rem; } .review-account { color: var(--text-light); font-size: 0.9rem; } .review-description { font-size: 1.2rem; font-weight: 500; margin-bottom: 0.25rem; } .review-amount { font-family: 'DM Serif Display', serif; font-size: 2rem; color: var(--text-dark); margin-bottom: 1.5rem; } .suggestion-banner { background: #EDF4EC; border: 1px solid #C5DCC2; border-radius: var(--radius-sm); padding: 0.75rem 1rem; display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.5rem; font-size: 0.9rem; } /* ── Category grid ── */ .category-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); gap: 0.5rem; } .cat-option { cursor: pointer; display: block; } .cat-option input[type="radio"] { display: none; } .cat-option span { display: block; padding: 0.5rem 0.75rem; border-radius: var(--radius-sm); font-size: 0.85rem; font-weight: 500; text-align: center; background: var(--border); color: var(--text-mid); border: 2px solid transparent; transition: background 0.15s, border-color 0.15s; } .cat-option input:checked + span { background: var(--cat-color, var(--sage)); color: var(--text-dark); border-color: color-mix(in srgb, var(--cat-color, var(--sage)) 70%, #555); } .cat-option:hover span { background: color-mix(in srgb, var(--cat-color, var(--border)) 40%, white); } /* ── Summary grid ── */ .summary-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 1rem; } .summary-card { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem 1.5rem; box-shadow: 0 2px 8px var(--shadow); } .summary-cat-name { font-size: 0.8rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-light); margin-bottom: 0.25rem; } .summary-cat-total { font-family: 'DM Serif Display', serif; font-size: 1.6rem; margin-bottom: 0.75rem; } .subcat-list { list-style: none; display: flex; flex-direction: column; gap: 0.3rem; } .subcat-list li { display: flex; justify-content: space-between; font-size: 0.82rem; color: var(--text-mid); padding-bottom: 0.3rem; border-bottom: 1px solid var(--border); } .subcat-list li:last-child { border-bottom: none; } /* ── Empty state ── */ .empty-state { text-align: center; padding: 3rem 2rem; color: var(--text-light); } .empty-icon { font-size: 3rem; margin-bottom: 1rem; } .empty-state h2 { font-family: 'DM Serif Display', serif; font-weight: 400; font-size: 1.5rem; color: var(--text-mid); margin-bottom: 0.5rem; } .empty-state p { margin-bottom: 1.25rem; } .empty-state a { color: var(--text-dark); } /* ── Calendar ── */ .cal-wrap { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; box-shadow: 0 2px 8px var(--shadow); margin-bottom: 1.5rem; } .cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); } .cal-header { background: var(--cream); text-align: center; padding: 0.6rem; font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; color: var(--text-light); border-bottom: 1px solid var(--border); } .cal-cell { min-height: 100px; padding: 0.5rem; border-right: 1px solid var(--border); border-bottom: 1px solid var(--border); vertical-align: top; } .cal-cell:nth-child(7n) { border-right: none; } .cal-empty { background: #FDFAF7; } .cal-today { background: #F0F7EF; } .cal-day-num { font-size: 0.8rem; font-weight: 600; color: var(--text-light); margin-bottom: 0.35rem; } .cal-today .cal-day-num { color: var(--text-dark); font-weight: 700; } .cal-bill { border-radius: 4px; padding: 0.2rem 0.4rem; margin-bottom: 0.2rem; font-size: 0.72rem; line-height: 1.3; opacity: 0.88; } .cal-bill-name { display: block; font-weight: 600; color: #FAF6F2; } .cal-bill-amt { display: block; color: #FAF6F2; } .cal-legend { display: flex; flex-wrap: wrap; gap: 0.6rem 1.2rem; margin-bottom: 1.25rem; } .legend-item { display: flex; align-items: center; gap: 0.35rem; font-size: 0.8rem; color: var(--text-mid); } .legend-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; opacity: 0.85; } .cal-actions { display: flex; gap: 0.75rem; margin-bottom: 2rem; } .month-nav { display: flex; gap: 0.5rem; margin-left: auto; } /* ── Bills form ── */ .bill-form-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 0.75rem 1.25rem; margin-bottom: 1.25rem; } /* ── Weekly overview ── */ .week-tabs { display: flex; gap: 0.5rem; margin-bottom: 1.5rem; flex-wrap: wrap; } .week-tab { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.6rem 1.25rem; font-family: 'DM Sans', sans-serif; font-size: 0.85rem; font-weight: 600; color: var(--text-mid); cursor: pointer; text-align: center; line-height: 1.4; transition: background 0.15s, border-color 0.15s, color 0.15s; } .week-tab span { display: block; font-size: 0.75rem; font-weight: 400; color: var(--text-light); } .week-tab.active { background: var(--sage); border-color: var(--sage); color: var(--text-dark); } .week-panel { display: none; } .week-panel.active { display: block; } .budget-section { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); margin-bottom: 1.25rem; overflow: hidden; box-shadow: 0 2px 8px var(--shadow); } .budget-section-header { display: flex; align-items: center; gap: 0.75rem; padding: 0.85rem 1.25rem; border-bottom: 1px solid var(--border); border-left: 4px solid var(--sage); background: var(--cream); } .budget-section-header h3 { font-family: 'DM Serif Display', serif; font-weight: 400; font-size: 1.1rem; } .budget-table { width: 100%; border-collapse: collapse; font-size: 0.9rem; } .budget-table th { text-align: left; padding: 0.55rem 1rem; font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; color: var(--text-light); border-bottom: 1px solid var(--border); } .budget-table td { padding: 0.5rem 1rem; border-bottom: 1px solid var(--border); vertical-align: middle; } .budget-table tbody tr:last-child td { border-bottom: none; } .budget-table tfoot td { font-weight: 600; background: var(--cream); border-top: 1px solid var(--border); border-bottom: none; } .total-row td { font-weight: 600; } .budget-input { width: 100%; padding: 0.35rem 0.6rem 0.35rem 1.3rem; border: 1px solid transparent; border-radius: var(--radius-sm); font-family: 'DM Sans', sans-serif; font-size: 0.9rem; background: transparent; color: var(--text-dark); transition: border-color 0.15s, background 0.15s; } /* Dollar sign wrapper — added via JS for number inputs */ .dollar-wrap { position: relative; display: inline-flex; align-items: center; width: 100%; } .dollar-wrap::before { content: '$'; position: absolute; left: 0.45rem; color: var(--text-light); font-size: 0.88rem; pointer-events: none; z-index: 1; } .dollar-wrap .budget-input { padding-left: 1.3rem; } /* For non-wrapped inputs that are inline (not full-width) */ input[type="number"].budget-input:not(.no-dollar) { padding-left: 1.3rem; } .budget-input:hover { border-color: var(--border); } .budget-input:focus { outline: none; border-color: var(--sage); background: var(--cream); } .budget-input-name { color: var(--text-mid); } .leftover-bar { display: flex; justify-content: space-between; align-items: center; padding: 1rem 1.5rem; background: #EDF4EC; border: 1px solid #C5DCC2; border-radius: var(--radius); font-weight: 600; font-size: 1rem; margin-bottom: 2rem; } .leftover-negative { background: #F4EDEC; border-color: #DCC2C5; } .leftover-amount { font-family: 'DM Serif Display', serif; font-size: 1.5rem; } /* ── Toggle buttons ── */ .toggle-btn { padding: 0.25rem 0.7rem; border-radius: 999px; border: 1px solid var(--border); background: var(--cream); color: var(--text-light); font-size: 0.78rem; font-weight: 600; cursor: pointer; font-family: 'DM Sans', sans-serif; transition: background 0.15s, color 0.15s; } .toggle-btn.toggle-on { background: #C5DCC2; border-color: #A8C5A0; color: var(--text-dark); } /* ── Reminder bar ── */ .reminder-bar { display: flex; align-items: center; gap: 1rem; background: #F5F1EC; border: 1px solid var(--border); border-radius: var(--radius); padding: 0.9rem 1.25rem; margin-bottom: 1.5rem; font-size: 0.9rem; color: var(--text-mid); flex-wrap: wrap; } .reminder-result { font-size: 0.85rem; color: var(--text-mid); font-style: italic; } /* ── Income entry ── */ .income-friday-tag { display: inline-block; font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; background: #EDF4EC; color: #7A9E78; border-radius: 999px; padding: 0.1rem 0.5rem; margin-left: 0.4rem; vertical-align: middle; } .income-actual-wrap { display: flex; align-items: center; gap: 0.5rem; } .income-logged-badge { font-size: 0.75rem; font-weight: 700; color: #7A9E78; white-space: nowrap; } /* ── Income Stream Cards (dashboard) ── */ .income-stream-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 0.75rem; } .income-stream-card { background: var(--warm-white); border-radius: var(--radius-sm); padding: 0.85rem 1rem; border: 1px solid var(--border); } .income-stream-name { font-weight: 600; font-size: 0.88rem; margin-bottom: 0.2rem; } .income-stream-owner { font-size: 0.75rem; margin-bottom: 0.5rem; } .income-stream-amount { font-size: 1.1rem; font-weight: 700; color: var(--text-dark); } /* ── Debt Tracker ── */ .debt-grand-total { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin-bottom: 2rem; } .debt-grand-item { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.1rem 1.25rem; box-shadow: 0 2px 8px var(--shadow); } .debt-grand-label { font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-light); margin-bottom: 0.3rem; } .debt-grand-value { font-family: 'DM Serif Display', serif; font-size: 1.6rem; color: var(--text-dark); } .debt-grand-value.accent { color: #7A9E78; } .debt-cat-header { display: flex; align-items: baseline; justify-content: space-between; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1rem; } .debt-cat-header h2 { font-family: 'DM Serif Display', serif; font-weight: 400; font-size: 1.4rem; } .debt-cat-totals { display: flex; gap: 1.25rem; font-size: 0.85rem; color: var(--text-mid); flex-wrap: wrap; } .debt-cat-totals .accent { color: #7A9E78; } .debt-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1rem; margin-bottom: 1rem; } .debt-card { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; box-shadow: 0 2px 8px var(--shadow); } .debt-card-top { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 0.75rem; gap: 0.5rem; } .debt-card-name { font-weight: 600; font-size: 1rem; color: var(--text-dark); } .debt-card-notes { font-size: 0.78rem; color: var(--text-light); margin-top: 0.2rem; } .debt-card-badges { display: flex; gap: 0.4rem; flex-shrink: 0; flex-wrap: wrap; justify-content: flex-end; } .owner-tag { padding: 0.2rem 0.6rem; border-radius: 999px; font-size: 0.75rem; font-weight: 700; color: #FAF6F2; } .apr-tag { padding: 0.2rem 0.6rem; border-radius: 999px; font-size: 0.75rem; font-weight: 600; background: var(--border); color: var(--text-mid); } .debt-card-balance { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 0.5rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--border); } .debt-balance-label { font-size: 0.8rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.07em; color: var(--text-light); } .debt-balance-value { font-family: 'DM Serif Display', serif; font-size: 1.5rem; color: var(--text-dark); } .payoff-estimate { font-size: 0.8rem; color: #7A9E78; margin-bottom: 0.75rem; } .debt-month-table { width: 100%; border-collapse: collapse; font-size: 0.85rem; margin-bottom: 0.75rem; } .debt-month-table td { padding: 0.35rem 0; border-bottom: 1px solid var(--border); color: var(--text-mid); } .debt-month-table td:first-child { width: 60%; } .debt-month-table tr:last-child td { border-bottom: none; } .debt-extra-row td { font-weight: 600; color: var(--text-dark) !important; padding-top: 0.5rem; } .accent { color: #7A9E78; } .debt-delete-btn { background: none; border: none; font-size: 0.78rem; color: var(--text-light); cursor: pointer; padding: 0; font-family: 'DM Sans', sans-serif; } .debt-delete-btn:hover { color: #C5A0A0; } .add-debt-details summary { list-style: none; } .add-debt-details summary::-webkit-details-marker { display: none; } /* ── BNPL Progress ── */ .bnpl-progress-wrap { margin-bottom: 0.75rem; } .bnpl-progress-bar { background: var(--border); border-radius: 999px; height: 8px; overflow: hidden; margin-bottom: 0.3rem; } .bnpl-progress-fill { height: 100%; background: #A8C5A0; border-radius: 999px; transition: width 0.4s ease; } .bnpl-progress-label { font-size: 0.78rem; color: var(--text-light); } /* ── Strategy Page ── */ .strategy-compare { display: flex; align-items: center; gap: 1.5rem; margin-bottom: 1.25rem; flex-wrap: wrap; } .strategy-card { flex: 1; min-width: 220px; background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.5rem; box-shadow: 0 2px 8px var(--shadow); } .strategy-avalanche { border-top: 4px solid #A8C5A0; } .strategy-snowball { border-top: 4px solid #D4B8C5; } .strategy-label { font-family: 'DM Serif Display', serif; font-size: 1.2rem; margin-bottom: 0.2rem; } .strategy-subtitle { font-size: 0.82rem; color: var(--text-light); margin-bottom: 1rem; } .strategy-stat { display: flex; justify-content: space-between; align-items: baseline; font-size: 0.9rem; color: var(--text-mid); padding: 0.4rem 0; border-bottom: 1px solid var(--border); } .strategy-stat:last-of-type { border-bottom: none; } .strategy-stat strong { font-size: 1rem; color: var(--text-dark); } .strategy-badge { margin-top: 1rem; font-size: 0.78rem; font-weight: 600; color: var(--text-mid); text-transform: uppercase; letter-spacing: 0.07em; } .strategy-vs { font-family: 'DM Serif Display', serif; font-size: 1.4rem; color: var(--text-light); flex-shrink: 0; } .strategy-insight { display: flex; gap: 2rem; background: #EDF4EC; border: 1px solid #C5DCC2; border-radius: var(--radius); padding: 0.9rem 1.25rem; font-size: 0.9rem; color: var(--text-mid); margin-bottom: 1.5rem; flex-wrap: wrap; } .strategy-insight strong { color: var(--text-dark); } .strategy-tables { display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; } .strategy-table-wrap h3 { font-family: 'DM Serif Display', serif; font-weight: 400; font-size: 1.1rem; margin-bottom: 0.75rem; } /* ── Sinking Funds ── */ .sinking-total-bar { display: flex; justify-content: space-between; align-items: center; background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem 1.75rem; margin-bottom: 1.75rem; box-shadow: 0 2px 8px var(--shadow); flex-wrap: wrap; gap: 0.5rem; } .sinking-total-label { font-size: 0.78rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-light); margin-bottom: 0.25rem; } .sinking-total-amount { font-family: 'DM Serif Display', serif; font-size: 2rem; color: var(--text-dark); } .sinking-total-note { font-size: 0.85rem; color: var(--text-light); font-style: italic; } .sinking-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 1rem; } .sinking-card { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; box-shadow: 0 2px 8px var(--shadow); display: flex; flex-direction: column; gap: 0.6rem; } .sinking-add-card { border-top: 4px solid var(--border); background: #FDFAF7; } .sinking-card-header { display: flex; justify-content: space-between; align-items: center; } .sinking-card-name { font-weight: 600; font-size: 1rem; } .sinking-type-badge { font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; padding: 0.15rem 0.5rem; border-radius: 999px; background: var(--border); color: var(--text-light); } .badge-goal { background: #E8E0F0; color: #7A6A8A; } .sinking-notes { font-size: 0.78rem; color: var(--text-light); font-style: italic; } .sinking-balance { font-family: 'DM Serif Display', serif; font-size: 1.75rem; color: var(--text-dark); } .sinking-progress-wrap { margin: 0.25rem 0; } .sinking-progress-bar { background: var(--border); border-radius: 999px; height: 8px; overflow: hidden; margin-bottom: 0.3rem; } .sinking-progress-fill { height: 100%; border-radius: 999px; opacity: 0.85; transition: width 0.4s ease; } .sinking-progress-label { font-size: 0.78rem; color: var(--text-light); } .sinking-monthly-needed { font-size: 0.85rem; color: var(--text-mid); background: var(--cream); border-radius: var(--radius-sm); padding: 0.4rem 0.7rem; } .sinking-actions { display: flex; gap: 0.5rem; flex-wrap: wrap; margin-top: 0.25rem; } .sinking-action-form { display: flex; gap: 0.4rem; align-items: center; } .sinking-amount-input { width: 90px; padding: 0.35rem 0.6rem; border: 1px solid var(--border); border-radius: var(--radius-sm); font-family: 'DM Sans', sans-serif; font-size: 0.85rem; background: var(--cream); } .sinking-edit-details { margin-top: 0.25rem; } .sinking-edit-details summary { list-style: none; } .sinking-edit-details summary::-webkit-details-marker { display: none; } .sinking-edit-toggle { font-size: 0.78rem; color: var(--text-light); cursor: pointer; text-decoration: underline; text-underline-offset: 2px; } .sinking-edit-form { margin-top: 0.75rem; display: flex; flex-direction: column; gap: 0.5rem; padding-top: 0.75rem; border-top: 1px solid var(--border); } .sinking-edit-form .form-group { margin-bottom: 0; } /* ── Mortgage ── */ .mortgage-summary { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin-bottom: 2rem; } .mortgage-strategies { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 1rem; } .mortgage-strategy-card { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.4rem; box-shadow: 0 2px 8px var(--shadow); } .mortgage-strategy-empty { background: #FDFAF7; display: flex; flex-direction: column; justify-content: center; } .amortization-details { margin-top: 0.5rem; } .amortization-details summary { list-style: none; } .amortization-details summary::-webkit-details-marker { display: none; } .amortization-toggle { font-size: 1rem; font-weight: 600; color: var(--text-mid); cursor: pointer; padding: 0.75rem 0; display: flex; align-items: center; gap: 0.75rem; } .amortization-toggle:hover { color: var(--text-dark); } .amortization-wrap { max-height: 480px; overflow-y: auto; margin-top: 0.75rem; border-radius: var(--radius); border: 1px solid var(--border); } .amortization-table { margin: 0; } .amort-interest-heavy td { color: var(--text-mid); } .amort-interest { color: #C5A0A0; } /* ── Assets ── */ .asset-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1rem; } .asset-card { background: var(--warm-white); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; box-shadow: 0 2px 8px var(--shadow); display: flex; flex-direction: column; gap: 0.75rem; } .asset-flip-card { border-top: 4px solid #B0CDD6; } .asset-card-header { display: flex; justify-content: space-between; align-items: flex-start; } .asset-car-name { font-weight: 600; font-size: 1rem; color: var(--text-dark); } .asset-car-trim { font-size: 0.82rem; margin-top: 0.15rem; } .asset-stat-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.5rem; padding: 0.75rem 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); } .asset-stat { text-align: center; } .asset-stat-label { font-size: 0.68rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--text-light); margin-bottom: 0.2rem; } .asset-stat-value { font-weight: 600; font-size: 0.95rem; color: var(--text-dark); } .flip-badge { font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; padding: 0.2rem 0.6rem; border-radius: 999px; background: #B0CDD6; color: var(--text-dark); } .asset-details summary { list-style: none; } .asset-details summary::-webkit-details-marker { display: none; } .asset-details-toggle { font-size: 0.82rem; color: var(--text-light); cursor: pointer; text-decoration: underline; text-underline-offset: 2px; } .asset-details-toggle:hover { color: var(--text-dark); } .asset-log-form { margin-top: 0.75rem; padding-top: 0.75rem; border-top: 1px solid var(--border); } .asset-log-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 0.5rem 0.75rem; margin-bottom: 0.75rem; } .asset-log-grid .form-group { margin-bottom: 0; } .asset-log-section-label { font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; color: var(--text-light); margin: 0.5rem 0 0.25rem; } .asset-log-entry { display: flex; gap: 0.75rem; font-size: 0.82rem; padding: 0.3rem 0; border-bottom: 1px solid var(--border); flex-wrap: wrap; } .asset-log-entry:last-child { border-bottom: none; } .text-red { color: #C5A0A0; } .asset-subheading { font-size: 1rem; font-weight: 600; color: var(--text-mid); margin-bottom: 0.75rem; } .asset-type-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 0.75rem; } .asset-type-btn { display: block; background: var(--cream); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.75rem 1rem; font-size: 0.95rem; font-weight: 600; cursor: pointer; text-align: center; transition: background 0.15s; } .asset-type-btn:hover { background: var(--border); } /* ── Debt Summary Table ── */ .debt-summary-block { background: var(--surface, #fff); border: 1px solid var(--border); border-radius: var(--radius); margin-bottom: 1.5rem; overflow: hidden; } .debt-summary-table { width: 100%; border-collapse: collapse; font-size: 0.9rem; } .debt-summary-table th { background: var(--cream, #faf7f2); padding: 0.6rem 1rem; text-align: left; font-weight: 600; font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-light); border-bottom: 1px solid var(--border); } .debt-summary-table td { padding: 0.55rem 1rem; border-bottom: 1px solid var(--border); } .debt-summary-table tfoot tr td { background: var(--cream, #faf7f2); border-top: 2px solid var(--border); border-bottom: none; } .debt-collapse-arrow { font-size: 0.85rem; color: var(--text-light); transition: transform 0.15s; width: 1rem; display: inline-block; } /* ── Net Worth ── */ .net-worth-hero { text-align: center; padding: 2rem 1rem; border-radius: var(--radius); margin-bottom: 0.5rem; background: linear-gradient(135deg, #f0f7f0 0%, #e8f4e8 100%); border: 1px solid #b8d8b8; } .net-worth-hero.net-worth-negative { background: linear-gradient(135deg, #fdf0f0 0%, #f9e8e8 100%); border-color: #d8b8b8; } .net-worth-label { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-light); margin-bottom: 0.4rem; } .net-worth-number { font-family: 'DM Serif Display', serif; font-size: 2.8rem; color: #3a7a3a; margin-bottom: 0.5rem; } .net-worth-hero.net-worth-negative .net-worth-number { color: #a04040; } .net-worth-sub { font-size: 0.9rem; color: var(--text-light); } /* ── Responsive ── */ @media (max-width: 600px) { .card-grid { grid-template-columns: 1fr; } .category-bar-row { grid-template-columns: 90px 1fr 60px; } nav { padding: 0 1rem; } main { padding: 1.25rem 1rem 3rem; } .cal-cell { min-height: 60px; } .week-tabs { flex-direction: column; } }